Выделка шкурок в домашних условиях 6th (6th@mail.ru) Спецвыпуск: Хакер, номер #053, стр. 053-080-4 procedure TfrMain.spOpenBtnClick(Sender: TObject); begin //добавляем выбранный файл в плейлист if spOpenDialog.Execute then spListBox.Items.Add(spOpenDialog.FileName); end; Теперь кидаем два spSkinLabel для отображения длины трека и текущего положения, а также spSkinTrackBar - для красоты. Каждый раз, когда в плейлисте будет выбираться новый файл, нужно будет выводить в лэйблы новые значения и сбрасывать trackbar в ноль. Чует мое сердце, эта последовательность встретится не раз, так что лучше вынести ее в отдельную процедуру: procedure TfrMain.PlayFile(Filename : String); begin //открываем указанный файл Player.FileName := Filename; Player.Open; //начинаем его проигрывать Player.Play; //настраиваем trackbar на длину трека в секундах //(TrackLength возвращает значение в миллисекундах) spTrackBar.MaxValue := Player.TrackLength[1] div 1000; //сбрасываем его в ноль spTrackBar.Value := 0; //выводим длину трека в удобоваримом виде spLenLabel.Caption := IntToStr(spTrackBar.MaxValue div 60) + ':' + IntToStr(spTrackBar.MaxValue - (spTrackBar.MaxValue div 60)*60); end; Осталось заставить все это работать в процессе воспроизведения музыки. Здесь все просто: помогут spTrackBar.Value и Player.Position (смотри полный исходник на диске). Теперь о плейлисте. Щелкнув по файлу в нем, нужно заставить этот файл проигрываться: procedure TfrMain.spListBoxListBoxClick(Sender: TObject); begin PlayFile(spListBox.Items[spListBox.ItemIndex]); end; Теперь нужно заставить нормально работать пять оставшихся кнопок: procedure TfrMain.spPlayBtnClick(Sender: TObject); begin Player.Play; end; //аналогично для Pause и Stop procedure TfrMain.spPrevBtnClick(Sender: TObject); begin //кнопка Previous должна переводить указатель на предыдущий //файл в плейлисте... spListBox.Selected[spListBox.ItemIndex-1] := True; //…и начинать его проигрывать PlayFile(spListBox.Items[spListBox.ItemIndex]); end; //аналогично для кнопки Next Что бы еще добавить? Весьма к месту пришлась бы возможность выбора положения в файле с помощью trackbar'а. Опять же достаточно немного поиграть с величинами Player.Position и spTrackBar.Value. Ну и, конечно, какой плеер без shuffle'а! Кидаем spSkinCheckRadioBox и правим код кнопки Next: procedure TfrMain.spNextBtnClick(Sender: TObject); begin //если shuffle включен if spShuffle.Checked then begin //перейдем на случайный трек Randomize; spListBox.Selected[Random(spListBox.Items.Count)] := True end //иначе все по-старому else spListBox.Selected[spListBox.ItemIndex+1] := True; PlayFile(spListBox.Items[spListBox.ItemIndex]); end; И наконец, еще две вещи: строка состояния в заголовке формы и прилипание к краю экрана. Строка состояния позволяет приблизиться на один шаг к великому и ужасному Winamp’у, ну а прилипание давно стало де-факто в мире MP3-плееров и не только. С первым все просто: const //массив возможных состояний плеера Modes: array[TMPModes] of string = ('Not ready', 'Stopped', 'Playing', 'Recording', 'Seeking', 'Paused', 'Open'); //OnNotify случается, когда режим работы TMediaPlayer изменяется |