В этой части будет рассмотрен процесс создания программы по работе с плейлистами формата M3U. Плейлист представляет собой обычный текстовой файл, в котором в определенном порядке записаны пути аудиофайлов для воспроизведения.Шаг 6: разработка формы. Начнем с того, что создадим ещё одну форму, где пользователь мог бы создавать свои плейлисты самостоятельно и удобно, чтобы потом их прослушивать. Свойство Name = frmPlaylist. Теперь разместим на форме 4 кнопки с подписями Open (открыть), Save (сохранить), Delete (удалить), Add (добавить). Какие действия каждая должна выполнять и так понятно. Кроме их, размещаем объекты ComboBox (Name = Combo1) и CommondDialog (Name = CommonDialog1), и 2 Label для вывода вспомогательный информации: в одном текущее количество треков в плейлисте, а в другом общее время. И объявим в разделе деклараций следующие переменные:
Код Visual Basic | 1 2 3 | Dim Pesnj() As String, n As Integer Dim FilTime As String Dim FileMp3 As String, PlayList As String |
|
Шаг 7: процедура открытия плейлиста.Прежде всего сделаем процедуру открытия уже готового плейлиста.
Код Visual Basic | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ' если ошибка при открытии, то перейти к метке err On Error GoTo err ' локальные переменные Dim FileM3U As String, Disk As String intFn = FreeFile ' открытие плейлиста компонентом CommondDialog CommonDialog1.ShowOpen FileM3U = CommonDialog1.FileName ' добавляем в КомбоБокс его путь Combo1.AddItem FileM3U ' на каком диске находится - 3 символа слева, например C:/ Disk = Left(FileM3U, 3) ' открываем файл Open FileM3U For Input As intFn ' выполнять, пока не дошли до конца файла Do Until EOF(intFn) ' вывод строки Line Input #intFn, FileMp3 ' здесь выделяется имя записи If Left(FileMp3, 1) <> "#" And Left(FileMp3, 1) <> " " Then If Mid(FileMp3, 2, 2) <> ":\" Then FileMp3 = Disk & FileMp3 ' добавить имя записи Combo1.AddItem FileMp3 ' вызов процедуры по подсчету времени Player.Url = FileMp3 Call AllTime End If Loop Close #intFn ' закрыть файл Combo1.Text = Combo1.List(0) ' FileMp3 lblTrackCount.Caption = Combo1.ListCount ' выводим в Label число треков в плейлисте Exit Sub ' если ошибка (метка) err: MsgBox "Error: Can not read playlist!", vbCritical |
|
В будущем мы будем обходится без подробного описания алгоритма предложенного кода, поскольку он полностью закомментирован и читателю не составит особого труда изучить его самостоятельно, кроме отдельных моментов, на которые хотелось бы обратить внимание. Здесь обратите внимание на использование знакомого объекта Player, в который загружается текущий трек. Сделано это для последующего использования в процедуре AllTime его свойства currentMedia.durationString:
Код Visual Basic | 1 2 3 4 | Private Sub AllTime() FilTime = Player.currentMedia.durationString lblTotalTime.Caption = CDate(lblTotalTime.Caption) + CDate(FilTime) End Sub |
|
Поскольку свойство Caption у объекта Label, а также переменная FilTime имеют тип String (строковой), то при их сложении произойдёт склеивание. С помощью CDate мы даем компилятору понять, что это даты (формат ЧЧ:ММ:СС) и сложить их нужно соответствующим образом: часы с часами и т.д.
Шаг 8: процедура добавления пути файла в плейлист. Это уже код к командной кнопке Add, которая добавляет файл в плейлист:
Код Visual Basic | 1 2 3 4 5 6 7 8 | CommonDialog1.ShowOpen ' открываем окно выбора файла If FileMp3 = CommonDialog1.FileName Then Exit Sub ' нельзя добавить один файл два раза подряд FileMp3 = CommonDialog1.FileName Combo1.Text = FileMp3 ' текущий текст в КомбоБоксе - последний добавленный файл Combo1.AddItem FileMp3 ' добавить строку в КомбоБокс lblTrackCount.Caption = Combo1.ListCount ' считаем количество треков в плейлисте AllTime ' считаем общее время плейлиста If FileMp3 <> " " Then cmdOpen_Click ' если был открыт файл M3U |
|
Здесь всё просто - в КомбоБокс добавляется путь файла, выбранного пользователем в CommonDialog, а также увеличивается число треков. Идём дальше.
Шаг 9: процедура удаления содержимого ComboBox. Комментировать и объяснять, пожалуй, нечего:
Код Visual Basic | 1 2 3 | Combo1.Clear lblTrackCount.Caption = "0" lblTotalTime.Caption = "00:00:00" |
|
Шаг 10: процедура сохранения плейлиста.Эта процедура сохраняет созданный пользователем плейлист в файл:
Код Visual Basic | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Static num As Integer ' вспомогательная переменная num = num + 1 ' ввод имение плейлиста PlayList = InputBox("Please write here name of your playlist. It will be save in the folder with last track", "Save", "Playlist" & num) n = Combo1.ListCount ' количество треков ReDim Pesnj(n) ' объявляем строковой массив путей файлов ' заполняем массив циклом For i = 0 To n Pesnj(i) = Combo1.List(i) Next i PlayList = PlayList + ".m3u" ' формат нашего плейлиста - M3U intFH = FreeFile() ' записать в файл Open PlayList For Output As intFH For i = 0 To n Print #intFH, Pesnj(i) Next i Close #intFH Combo1.Clear ' отчистить плейлист |
|
Шаг 11: воспроизведение плейлиста.Теперь самый важный шаг - нужно реализовать возможность созданные нами плейлисты воспроизвести! Делается это уже в основной форме. Для этого нужно объявить ещё одну переменную - fromfile типа Boolean, значение True будет означать, что мы открываем файл, а False - плейлист. В этом случае внесем изменения в код нашей кнопки Open основной формы:
Код Visual Basic | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | If fromfile = True Then ' если из файла CDlg1.ShowOpen Player.url = CDlg1.FileName ' если плейлист ElseIf fromfile = False Then ' откроем форму для работы с плейлистами, но не будем её показывать frmPlaylist.Show frmPlaylist.Visible = False ' а это немного измененный фрагмент кнопки Open формы frmPlaylist ' здесь стоит frmPlaylist перед именами объектов ' это показывает, что объект на другой, не текущей форме On Error Resume Next Dim FileM3U As String, Disk As String, intFn intFn = FreeFile frmPlaylist.CommonDialog1.ShowOpen FileM3U = frmPlaylist.CommonDialog1.FileName frmPlaylist.Combo1.AddItem FileM3U Disk = Left(FileM3U, 3) Open FileM3U For Input As intFn Do Until EOF(intFn) Line Input #intFn, FileMp3 If Left(FileMp3, 1) <> "#" And Left(FileMp3, 1) <> " " Then If Mid(FileMp3, 2, 2) <> ":\" Then FileMp3 = Disk & FileMp3 frmPlaylist.Combo1.AddItem FileMp3 End If Loop Close #intFn frmPlaylist.Combo1.Text = frmPlaylist.Combo1.List(0) ' FileMp3 frmPlaylist.TrackCount.Caption = frmPlaylist.Combo1.ListCount Player.url = frmPlaylist.Combo1 ' вызов функции, которая получает путь трека из плейлиста ' нужно объявить переменную tracknumber (тип Integer) как глобальную tracknumber = 1 Call GetTrackFromPlaylist End If |
|
Зачем мы не поместили ту процедуру открытия плейлиста в модуль? Дело в том, что модули используются для разных программ и использовать имена объектов там нельзя, а значит нам бы пришлось делать более сложную процедуру с большим количеством входящих переменных - не будем усложнять себе этим жизнь, к тому же мы не гонимся за оптимизацией кода.
Зачем мы оставили строки заполнения КомбоБокса другой формы, которая всё равно не видна? Когда пользователь откроет форму создания плейлиста, перед ним уже будет открыт его плейлист.
Одна проблема - вызвать процедуру AllTime другой формы мы не можем (да и на главной форме есть процедура с таким именем!), чтобы посчитать общее время. Это легко решить, объявляем там глобальную переменную типа Boolean под именем NewPlaylist; True, если плейлист открывается там кнопкой Open, False, если он был открыт из основной формы при открытии плейлиста. С помощью конструкции if...elseif делаем следующим образом: если переменная имеет значение True, то выполняется тот код, что был у нас там до этого, если False, то уже часть кода кнопки Open (открытие и чтение файла, включая цикл do until...loop), но убираем всё лишнее (заполнение КомбоБокса, например), заменяем вызов процедуру AllTime на ту часть кода, что у нас под True (иначе будет рекурсия). Другими словами, нужно просмотреть каждую строчку файла, загрузить путь каждого файла в Player, суммировать их и Label. Для этого вполне можно использовать уже имеющийся код.
Вышеописанное изменение процедуры AllTime формы frmPlaylist нужно, чтобы предотвратить возникающий баг. Однако не забудьте изменить процедуру AllTime основной формы, ведь теперь её нужно тоже приспособить для плейлистов:
lblTotalTime.Caption = CDate(lblTotalTime.Caption) + CDate(Player.currentMedia.durationString)
Ну и чтобы не было ошибки в случае открытии обычного файла (значение Label будет равно "ничему", и его нельзя сложить!), в Form_Load главной формы добавим:
lblTotalTime.Caption = "00:00:00"
А теперь процедура GetTrackFromPlaylist (не забудьте объявить tracknumber (Integer) и track (String) как глобальные переменные!):
Код Visual Basic | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Private Sub GetTrackFromPlaylist () Dim FileNum As Byte ' файл Dim intCount As Integer ' счетчик FileNum = FreeFile ' открыть файл Open Player.url For Input As FileNum ' начнем с первой строки intCount = 1 ' просмотреть все строки Do While Not EOF(FileNum) ' загружаем нужную строку в переменную Line Input #FileNum, track If intCount = tracknumber Then Exit Sub ' переходим к следующей строке intCount = intCount + 1 Loop Close FileNum End Sub |
|
Открывается файл для вывода, идет поиск нужной строки и загрузка её пути в переменную. А используется эта процедура вот где ещё. Создадим две кнопки Next и Pervious, которыми будем переключаться между треками плейлиста, и пропишем к ним такой код:
Код Visual Basic | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Private Sub cmdNext_Click() Player.Controls.Next If fromfile = False Then tracknumber = tracknumber + 1 Call GetTrackFromPlaylist End If End Sub Private Sub cmdPervious_Click() Player.Controls.previous If fromfile = False Then If tracknumber = 1 Then Exit Sub tracknumber = tracknumber - 1 Call GetTrackFromPlaylist End If End Sub |
|
Инструкции Player.Controls.Next и Player.Controls.previous переключают текущий трек в плейлисте, а конструкция if..endif здесь используется для получения пути текущего файла в переменную track, которую мы ещё будем использовать в следующей части для чтения тегов файла.
На этом вторая часть статьи подходит к концу. Приведенные исходные коды отчасти универсальны, так как могут использоваться без компонента WMP в других программах с небольшим изменением.
|