Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 042

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Я как-то задавал подобный вопрос уже - но ответа не получил - а только кучу критики - и теперь понимаю, что не зря. Вообщем у меня остался всего один не разрешенный вопрос - а именно как с помощью одного компонента TMediaPlayer поигрывать по очереди песни -т. е. при нажатии на баттон MediaPlayer1 проигрывал сначала первый трек, закончил второй и т. д.! Желательно не через StringList - ато это я вообще не понимаю - если это возможно окнечно... Огромное спасибо! Ато очень хочу разобраться - но не выходи никак...

Приложение:
  1.  
  2.  
  3. procedure TForm1.PNGButton1Click(Sender: TObject);
  4. begin
  5. MediaPlayer1.FileName := ExtractFilePath(Application.ExeName)+'Sound1.mp3';
  6. MediaPlayer1.Open;
  7. MediaPlayer1.Play;
  8. end;
  9.  
  10. procedure TForm1.PNGButton2Click(Sender: TObject);
  11. begin
  12. MediaPlayer1.FileName := ExtractFilePath(Application.ExeName)+'Sound2.mp3';
  13. MediaPlayer1.Open;
  14. MediaPlayer1.Play;
  15. end;
  16.  
  17.  


Вечперик Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Вечперик (статус: Посетитель)
Вопрос отправлен: 4 ноября 2008, 11:10
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Вечперик!
У TMediaPlayer есть событие OnNotify. С помощью его вы можете определить, что проигрывание песни окончено. Вот тогда и берите следующую, какую вам нужно.
Пример:

procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.Notify   := True;
  MediaPlayer1.OnNotify := NotifyProc;
end;
 
procedure TForm1.NotifyProc(Sender: TObject);
begin
  with Sender as TMediaPlayer do
   begin
    case Mode of
      mpStopped: 
// Проигрывание остановлено, значит берем следующий трек
      end;
//must set to true to enable next-time notification 
   Notify := True;
  end;
end;
Что тут не понятного ? В чем у вас сложности ?

P.S. Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 4 ноября 2008, 11:37
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Надо использовать событие TMediaPlayer.OnNotify. Оно генерируется при возникновении любого события, связанного с воспроизведением: (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step, Stop), причём свойство TMediaPlayer.Notify должно быть установлено в True. Имей в виду ещё, что это свойство сбрасывается в False при каждом вызове OnNotify и его в обработчике этого события надо снова ставить в True, чтобы следующее событие OnNotify вызвало его обработчик.

Чтобы отловить момент окончания воспроизведения очередного файла, нужно написать что-то типа:

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if MediaPlayer1.Mode = mpStopped
    then begin
           MediaPlayer1.Close();
           MediaPlayer1.FileName:= 'Следующее_имя_файла.mp3';
           MediaPlayer1.Open();
           MediaPlayer1.Play();
         end;
 
  Notify:= True; // Чтобы вызвалось следующее событие
end;

Цитата:


Желательно не через StringList - ато это я вообще не понимаю - если это возможно окнечно... Огромное спасибо! Ато очень хочу разобраться - но не выходи никак...


Это, конечно, возможно, но рекомендуется только мазохистам. :))
Относительно большие куски кода мне вставлять не разрешают, поэтому смотри приложение.

З.Ы. Никак не вкурю, что такого СТРАШНОГО в TStringList? Обясни на форуме, плиз.

Приложение:
  1. var
  2. FileIndex: Integer = 1;
  3.  
  4. procedure TForm1.PNGButton1Click(Sender: TObject);
  5. begin
  6. MediaPlayer1.FileName := ExtractFilePath(Application.ExeName) + 'Sound' + IntToStr(FileIndex) + '.mp3';
  7. MediaPlayer1.Open;
  8. MediaPlayer1.Play;
  9. end;
  10.  
  11. procedure TForm1.MediaPlayer1Notify(Sender: TObject);
  12. var
  13. FileName: string;
  14. begin
  15. if MediaPlayer1.Mode = mpStopped
  16. then begin
  17. MediaPlayer1.Close();
  18.  
  19. Inc(FileIndex);
  20. FileName:= 'Sound' + IntToStr(FileIndex) + '.mp3';
  21.  
  22. if FileExists(FileName)
  23. then begin
  24. MediaPlayer1.FileName:= FileName;
  25. MediaPlayer1.Open();
  26. MediaPlayer1.Play();
  27. end
  28.  
  29.  
  30. mb_Ok + mb_IconError);
  31. end;
  32.  
  33.  
  34. end;
  35.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 4 ноября 2008, 12:06
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 4 ноября 2008, 12:16; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 4 ноября 2008, 11:26 [#1]:

Ну так я вроде писал, что у медиаплеера есть такое событие, как "песня кончилась". Так вот, берём по списку новую и запускаем. В чём проблема?
Галочка "подтверждения прочтения" - вселенское зло.
Вечперик

Вечперик (статус: Посетитель), 4 ноября 2008, 12:01 [#2]:

Feniks, большое спасибо... но не понял полностью я пока... а.. если честно, вообще не понял, какэ то мне помжет - получается тем кодом, что Вы написали я эту функцию разграничить треки ввел - а как ее применять и где пока не понимаю...

Вадим К, может и писали - но я не видел...
>Так вот, берём по списку новую и запускаем
вот с этим и проблема.. что-то не могу понять где...
Вадим К

Вадим К (статус: Академик), 4 ноября 2008, 12:05 [#3]:

Ну вот, пока не поймёте, как это работает, пока в Вашей голове не сложиться всё это, все наши ответы и рекомендации пойдут на смарку.
А список = это ведь обычный плейлист, который может быть представлен банальным массивом или Memo (StringList) с списком треков.
Галочка "подтверждения прочтения" - вселенское зло.
Вечперик

Вечперик (статус: Посетитель), 4 ноября 2008, 12:16 [#4]:

min@y™, огромное спасибо - попробую разобраться....

Вадим К, поэтому сейчас иду разбирать... былагодаря постам Feniks и min@y™ думаю пойму наконец весь приницип...

Всем еще раз большое спасибо - пошел разбирать))

31 января 2011, 19:32: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.03 сек.