Пятница, 26.04.2024, 02:19
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Delphi » Создание mp3 плеера на Delphi » play\pause и Повтор
play\pause и Повтор
BM_GORAДата: Пятница, 29.06.2012, 17:58 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
Итак,
1. имеются 2 кнопки, плей и пауза, как из них сделать одну кнопку, чтоб при первом нажатии воспроизводился трек, при втором нажатии - пауза, при 3 снова плей. Пробовал так:
Code

procedure TForm_player.Button1Click(Sender: TObject);
begin
//Проверяем идет ли воспроизведение
if mode=play then
begin
  BASS_ChannelPause(Channel);//останавливаем воспроизведение - пауза
  mode:=paused;//устанавливаем playmode -> пауза
  else
begin
//Запускаем процедуру проигрывания
player;
  end;
  end;

выдает ошибку :
[DCC Error] mp3.pas(357): E2153 ';' not allowed before 'ELSE'
[DCC Error] mp3.pas(364): E2029 Statement expected but 'PROCEDURE' found
[DCC Error] mp3.pas(7): F2063 Could not compile used unit 'mp3'

2. как сделать кнопку повтора, только не просто повтора, а чтоб при первом нажатии был повтор всего плейлиста, при втором - одного трека, при третьем - без повтора, ну а при 4 снова повтор всего плейлиста ))
 
ThePro94Дата: Вторник, 03.07.2012, 18:54 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Code
begin
//Проверяем идет ли воспроизведение
if mode=play then
begin
  BASS_ChannelPause(Channel);//останавливаем воспроизведение - пауза
  mode:=paused;//устанавливаем playmode -> пауза
end
   else
  player;
end;

Вот так все работает


Сообщение отредактировал ThePro94 - Вторник, 03.07.2012, 18:58
 
BM_GORAДата: Четверг, 05.07.2012, 14:34 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
спс, все заработало ))

Добавлено (05.07.2012, 13:02)
---------------------------------------------
А что на счет повтора ? перерыл весь этот форум, так и не нашёл код для повтора, вроде все говорят про него а самого кода нет ( если не сложно помогите, или скажите в какой теме написано про повтор

Добавлено (05.07.2012, 14:34)
---------------------------------------------
и кстатии как сделать горячию клавишу "ПРОБЕЛ" на кнопку плей/пауза ?

 
Filo$oFДата: Четверг, 05.07.2012, 20:21 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
BM_GORA

В общем так.

Для начала создайте кнопку и на неё напишите это действие:

Code

procedure TForm_player.Button2Click(Sender: TObject);
begin
if CheckBox1.Checked = true then            //если галочка установлена в CheckBox1, то
begin
Povtor;                    // запускается процедура повтора которая не даёт перейти на другую строку в listbox, а возвращает ползунок в начало
Filename:=ListBox1.Items.Strings[i];         // и начинается
ListBox1ItemIndex:=i;                    // воспоризведение
mode:=stop;                    // файла
player;
end
else if CheckBox2.Checked = True then   // Если галочка установлена CheckBox2, то
Randm                    // Запускается процедура Random
else
begin                    //Если не в одном из checkbox'ов галочка не установлена, то происходит переход на следующий трек
if i<ListBox1.Items.Count-1 then                  
begin                     
inc(i);
Filename:=List[play_list].Items.Strings[i];
List[play_list].ItemIndex:=i;
mode:=stop;
player;
end else exit;
end;
end;


А после создайте две процедуры, которые встречаются в предыдущем куске кода:
Повтор
Code

procedure TForm_player.Povtor;                            //Повтор
begin
   if image2.left = image1.left+image2.width-10 then   
   image2.left:=image1.left;                    //Возвращаем ползунок в начало до того, как он дошёл до конца
   end;

В коде для повтора использованы image1 и imag2 - ими я заменил scrollbar, если поищите по форуму или в комментариях к урокам то найдёте, как заменить. Принцип таков, что когда используется данная процедура, то бегунок (image2) не доходит до конца, а возвращается в начало трека. У меня работает отлично smile

Рандом
Code

procedure TForm_player.Randm;                         //Рандом
var                     
old, new: integer;
begin
Randomize;                     
old:=ListBox1.ItemIndex;                    // и присваеваем переменной "old" номер этой строки
new:=random(ListBox1.Items.Count);                  //Присваеваем переменной номер случайно выбранной строки   
if new = old then begin                    // Проверяем, если обе переменные равны, то   
new:=random(ListBox1.Items.Count+1);              // Повторяем выбор строки
i:=new;                    // Присваиваем переменной "i" номер случайного трека
Filename:=ListBox1.Items.Strings[i];                  // Воспроизводим выбранный трек
ListBox1.ItemIndex:=i;
mode:=stop;
player;                 
end else begin                    //Если переменные "old" и "new" не равны   
i:= new;                     
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end;
end;


Ну а вместо перехода на следующий трек в процедуре OnTime таймера просто подставьте

Code
     
   if i<List[play_list].Items.Count-1 then begin
Button2Click(Button2);
end else exit;
end;


Куда именно думаю разберётесь smile

На счёт рандома. Данный способ позволяет избавиться от повтора одного и того же трека во время случайного воспроизведения. С массивом возможно было бы лучше, но я с ними плохо дружу smile


Сообщение отредактировал Filo$oF - Четверг, 05.07.2012, 20:22
 
BM_GORAДата: Пятница, 06.07.2012, 01:54 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
спс за код повтора, но я спрашивал как сделать повтор на кнопку , а не на чек боксы , и чтоб при первом нажатии повторялся весь плей лист, а при втором нажатии только 1 трек, ну а при третьем нажатии - без повтора, за рендом спс, но я его пока не хочу реализововать )
 
Filo$oFДата: Пятница, 06.07.2012, 08:15 | Сообщение # 6
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
BM_GORA

Так а что мешает привязать checbox к кнопке?
Просто же.
Да и повтор плейлиста можно сделать, как не отключаемую функцию.

Ну а в общем будет так, думаю. Переделал код выложенный выше, но не проверял.

Создайте кнопку, как и в первом моём варианте.

Code

procedure TForm_player.Button2Click(Sender: TObject);  
  begin  
  if CheckBox1.Checked = true then            //если галочка установлена в CheckBox1, то  
  begin  
  PovtorTrek;              // запускается процедура повтора которая не даёт перейти на другую строку в listbox, а возвращает ползунок в начало   
  end  
  else if CheckBox2.Checked = True then   // Если галочка установлена CheckBox2, то  
  ListPovtor                    // Запускается процедура повтора плейлиста
  else  
  begin                    //Если не в одном из checkbox'ов галочка не установлена, то происходит переход на следующий трек  
  if i<ListBox1.Items.Count-1 then                   
  begin                      
  inc(i);  
  Filename:=List[play_list].Items.Strings[i];  
  List[play_list].ItemIndex:=i;  
  mode:=stop;  
  player;  
  end else exit;  
  end;  
  end;


Процедура повтора будет такой
Code

procedure TForm_player.PovtorTrek;                    //Повтор  
  begin  
    if image2.left = image1.left+image2.width-10 then    
    image2.left:=image1.left;                    //Возвращаем ползунок в начало до того, как он дошёл до конца  
    end;


И повтор

Code

procedure TForm_player.PovtorList;     
begin
if i<ListBox1.Items.Count-1 then begin
inc(i);
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end else begin
  i:=0;
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end;
end;


Ну а дальше вместо перехода на следующий трек в процедуре OnTime таймера просто подставьте
Code

    if i<List[play_list].Items.Count-1 then begin  
  Button2Click(Button2);  
  end else exit;  
  end;


Код не проверял, если что подправите. Там всё просто.
С привязкой checkbox'ов к кнопке думаю разберётесь сами.
 
BM_GORAДата: Пятница, 06.07.2012, 11:37 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
На счет привязки, перерыл весь инет, ничего путного не нашел , кроме громадных программных кодов которые совершенно мне не подходят, неужели нельзя привязать как нибудь более легким путем, там через свойство например ну и т.д.

Добавлено (06.07.2012, 11:37)
---------------------------------------------
К сожелению в шараге нас учили работать с компонентами по отдельности, а насчет привязывания и слова небыло сказано, но лично мне в головову щас лезит только вот это :
Code

procedure TForm_player.Button2Click(Sender: TObject);
begin
CheckBox1.Checked = true

ну а дальше как вы писали :
Code

begin
if CheckBox1.Checked = true then //если галочка установлена в CheckBox1, то
begin
PovtorTrek; // запускается процедура повтора которая не даёт перейти на другую строку в listbox, а возвращает ползунок в начало
end
else if CheckBox2.Checked = True then // Если галочка установлена CheckBox2, то
ListPovtor // Запускается процедура повтора плейлиста
else
begin //Если не в одном из checkbox'ов галочка не установлена, то происходит переход на следующий трек
if i<ListBox1.Items.Count-1 then
begin
inc(i);
Filename:=List[play_list].Items.Strings[i];
List[play_list].ItemIndex:=i;
mode:=stop;
player;
end else exit;
end;
end;


Сообщение отредактировал BM_GORA - Пятница, 06.07.2012, 11:37
 
xaramamburuДата: Пятница, 06.07.2012, 12:19 | Сообщение # 8
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Сделай так:
В Var n:integer=1;

На кнопку вешаешь код:
Код
procedure TForm_player.Button1Click(Sender: TObject);
begin
if n<3 then  n:=n+1 else n:=1;
       case n of
      1: Button1.Caption:='Повтор трека';
      2: Button1.Caption:='Повтор листа';
      3: Button1.Caption:='Без повтора';
      end;
end;

Далее описываешь свои процедуры:
Код
procedure TForm_player.ListPovtor;
begin
      if i<ListBox1.Items.Count-1 then
        begin
         inc(i);
      ListBox1.ItemIndex:=i;
      Filename:=ListBox1.Items.Strings[i];[/i]
         mode:=stop;
         player;
        end
//если лист закончился - переходим на первый трек
        else
          begin
            i:=0;
            ListBox1.ItemIndex:=i;
            Filename:=ListBox1.Items.Strings;
            mode:=stop;
            player;
          end;
end;
procedure TForm_player.PovtorTrek;
begin
         mode:=stop;
         player;
end;

procedure TForm_player.bezPovtor;
begin
if i<ListBox1.Items.Count-1 then
        begin
         inc(i);
      ListBox1.ItemIndex:=i;
      Filename:=ListBox1.Items.Strings;
        
         mode:=stop;
         player;
        end
//если лист закончился - выходим
        else begin mode:=stop;exit;end;
end;
Процедуры должны быть описаны перед процедурой таймера. Не забудь описать заголовки процедур в [b]Type[/b]:
   procedure ListPovtor;
         procedure PovtorTrek;
         procedure bezPovtor;
Ну а вместо перехода на следующий трек в процедуре OnTime таймера просто подставьте:
//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
// в место этого if  BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// лучше сделать так:
if  BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED   then
        begin
//то выбираем следующую песню из плейлиста
      case n of
      1: PovtorTrek;
      2: ListPovtor;
      3: bezPovtor;
      end;

должно работать, хотя может чего то и упустил, доделаете сами.))))))))
 
Filo$oFДата: Пятница, 06.07.2012, 12:25 | Сообщение # 9
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu

Ахах smile
А я как раз сидел это обмозговывал в программе smile но у меня вышло коряво smile
 
BM_GORAДата: Суббота, 07.07.2012, 10:20 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
спс ) вечером проверю)

Добавлено (07.07.2012, 10:20)
---------------------------------------------
проверил, все ок, но вот есть проблемка,
Если стоит без повтора, то когда заканчивается весь плейлист выдается вот эта ошибка :
First chance exception at $75829617. Exception class EInvalidOp with message 'Invalid floating point operation'. Process GorPlayer.exe (5092)


Сообщение отредактировал BM_GORA - Суббота, 07.07.2012, 10:36
 
xaramamburuДата: Воскресенье, 08.07.2012, 18:53 | Сообщение # 11
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
В процедуре bezPovtor; после else в место exit нужно добавить begin mode:=stop;exit;end; смотрите предыдущий мой пост, я эту процедуру там поправил.)))))))
 
BM_GORAДата: Суббота, 29.09.2012, 10:40 | Сообщение # 12
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
спс ) все нормально теперь ))

Добавлено (29.09.2012, 10:40)
---------------------------------------------
и снова здравствуйте )такие вот вопросики появились ).
1. у меня есть : image1, image2, image3, image4 где image1 это плей, image2 это вдавленный плей, image3 пауза, image4 вдавленная пауза. Так вот как сделать вместо кнопки Play\Pause вот эти картинки, а именно, сначало видно image1, при нажатии на image1 было видно image2, далее при поднятии кнопки мыши было видно image3, при нажатии на image3 было видно image4, ну при отпускании снова image1 )) ну вообщем так же как это реализованно например в виндовс медиа плеер )
2. так же имеются картинки для повтора, image1, image2, image3, где image1 без повтора, image2 повтор плейлиста, image3 повтор трека, надо сделать чтоб при клике на image1 появлялась image2, при клике по image2 - image3, и при клике по image3 - снова image1 )

Зарание спасибо ))


Сообщение отредактировал BM_GORA - Суббота, 29.09.2012, 10:45
 
xaramamburuДата: Понедельник, 01.10.2012, 09:42 | Сообщение # 13
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Обрабатывайте события OnMouseUp и OnMouseDown для первой и третьей картинки.
Как то так:
Code

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
image2.Visible:=True;
image1.Visible:=false;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
image2.Visible:=false;
image3.Visible:=True;
end;

procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
   image3.Visible:=false;
image4.Visible:=True;
end;

procedure TForm1.Image3MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
    image4.Visible:=false;
image1.Visible:=True;
end;


Вторая, третья и четвертая картинка свойство Visible-> False;
)))))))))))
 
BM_GORAДата: Вторник, 02.10.2012, 10:26 | Сообщение # 14
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
xaramamburu,
Спасибо, все работает )))


Сообщение отредактировал BM_GORA - Вторник, 02.10.2012, 11:57
 
xaramamburuДата: Вторник, 02.10.2012, 10:41 | Сообщение # 15
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Добавьте код из урока для кнопки Play в событие OnMouseDown для Image1, а код для Pause в событие OnMouseDown для Image3.))))))))))))
 
Форум » Delphi » Создание mp3 плеера на Delphi » play\pause и Повтор
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz