play\pause и Повтор
|
|
BM_GORA | Дата: Пятница, 29.06.2012, 17:58 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: 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
Статус: 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
Статус: Offline
| спс, все заработало )) Добавлено (05.07.2012, 13:02) --------------------------------------------- А что на счет повтора ? перерыл весь этот форум, так и не нашёл код для повтора, вроде все говорят про него а самого кода нет ( если не сложно помогите, или скажите в какой теме написано про повтор Добавлено (05.07.2012, 14:34) --------------------------------------------- и кстатии как сделать горячию клавишу "ПРОБЕЛ" на кнопку плей/пауза ?
|
|
| |
Filo$oF | Дата: Четверг, 05.07.2012, 20:21 | Сообщение # 4 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: 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) не доходит до конца, а возвращается в начало трека. У меня работает отлично
Рандом 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;
Куда именно думаю разберётесь
На счёт рандома. Данный способ позволяет избавиться от повтора одного и того же трека во время случайного воспроизведения. С массивом возможно было бы лучше, но я с ними плохо дружу
Сообщение отредактировал Filo$oF - Четверг, 05.07.2012, 20:22 |
|
| |
BM_GORA | Дата: Пятница, 06.07.2012, 01:54 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| спс за код повтора, но я спрашивал как сделать повтор на кнопку , а не на чек боксы , и чтоб при первом нажатии повторялся весь плей лист, а при втором нажатии только 1 трек, ну а при третьем нажатии - без повтора, за рендом спс, но я его пока не хочу реализововать )
|
|
| |
Filo$oF | Дата: Пятница, 06.07.2012, 08:15 | Сообщение # 6 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: 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
Статус: 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
Статус: 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
Статус: Offline
| xaramamburu
Ахах А я как раз сидел это обмозговывал в программе но у меня вышло коряво
|
|
| |
BM_GORA | Дата: Суббота, 07.07.2012, 10:20 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: 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
Статус: Offline
| BM_GORA, В процедуре bezPovtor; после else в место exit нужно добавить begin mode:=stop;exit;end; смотрите предыдущий мой пост, я эту процедуру там поправил.)))))))
|
|
| |
BM_GORA | Дата: Суббота, 29.09.2012, 10:40 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: 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
Статус: 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
Статус: Offline
| xaramamburu, Спасибо, все работает )))
Сообщение отредактировал BM_GORA - Вторник, 02.10.2012, 11:57 |
|
| |
xaramamburu | Дата: Вторник, 02.10.2012, 10:41 | Сообщение # 15 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Добавьте код из урока для кнопки Play в событие OnMouseDown для Image1, а код для Pause в событие OnMouseDown для Image3.))))))))))))
|
|
| |
|