Как работать с плейлистом в delphi на библиотеке BASS.DLL?
|
|
Filo$oF | Дата: Среда, 30.05.2012, 22:20 | Сообщение # 46 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| Я так и делаю теперь, а если оставить Channel, то плейлист начинает сума сходить Но всё ровно 99. Code function TForm_player.KhzToStr: string; var H: Extended; bi: BASS_CHANNELINFO; Channel1:DWORD; begin BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); BASS_ChannelGetInfo(Channel1, bi); H := bi.freq / 1000; Result := IntToStr(Round(H)) + ' KHz'; BASS_StreamFree(Channel1); end;
|
|
| |
xaramamburu | Дата: Среда, 30.05.2012, 22:42 | Сообщение # 47 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, Вот кусок моей процедуры:
Пишем сразу после раздела uses перед type: Code type TTag = record len: string; Title: string; freq: string; end;
Это в разделе Type описания компонентов формы: Code function Tagi(filename1:string):Ttag;
Это сама процедура: Code function Tform2.Tagi(filename1:string):Ttag; var Channel1 : DWORD; H: Extended; bi: BASS_CHANNELINFO;
begin //освобаждаем канал BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //получаем время воспроизведения Tagi.len:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE))/(24*3600)); Tagi.Title:=ChannelGetTagTitle(Channel1); BASS_ChannelGetInfo(Channel1, bi); H := bi.freq / 1000; Tagi.freq := IntToStr(Round(H)) + ' KHz'; //освобаждаем канал BASS_StreamFree(Channel1); end;
Это добавляем в процедуру отрисовки: Code TextOut(Rect.Left + 10, Rect.Top, IntToStr(Index) + '. ' + form2.Tagi(form2.Listbox1.Items[index]).Title); TextOut(rect.right-50, rect.top, form2.Tagi(form2.Listbox1.Items[index]).freq);
|
|
| |
Filo$oF | Дата: Суббота, 02.06.2012, 12:37 | Сообщение # 48 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu
Работает, спсибо Добавлено (02.06.2012, 12:37) --------------------------------------------- Пытаюсь осуществить перемотку listboxa движением image1 по image2. как это было сделано со звуком и треком.
Code procedure TForm_player.scrollbMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var l:integer; begin if ssleft in shift then begin if (mouse.CursorPos.y-yn2>=scroll.Top) and ((mouse.CursorPos.y-yn2+scrollb.Top )<=(scroll.top+scroll.Height)) then scrollb.top:=mouse.CursorPos.y-yn2; l:=percent(y*2.5, scroll.Height ); List[number_list].ItemIndex:=Trunc(y * List[number_list].Items.Count / scroll.height); end; end;
procedure TForm_player.scrollbMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin yn2:=mouse.CursorPos.y-(scrollb.top); end;
listbox прокручивается, но вот картинка либо не двигается, либо движется до середины а дальше останавливается, но строки продолжают прокручиваться. Что тут не так?
|
|
| |
BM_GORA | Дата: Понедельник, 25.06.2012, 18:45 | Сообщение # 49 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| вставил код для создания m3U плейлиста , но при запуске выдает ошибки: [DCC Error] mp3.pas(493): E2003 Undeclared identifier: 'SaveList' [DCC Error] mp3.pas(497): E2003 Undeclared identifier: 'MinToSec' [DCC Error] mp3.pas(505): E2003 Undeclared identifier: 'tim' [DCC Error] mp3.pas(508): E2008 Incompatible types [DCC Error] mp3.pas(509): E2003 Undeclared identifier: 'result' [DCC Error] mp3.pas(512): E2003 Undeclared identifier: 'SaveList' [DCC Error] mp3.pas(519): E2003 Undeclared identifier: 'SaveFile' [DCC Error] mp3.pas(522): E2003 Undeclared identifier: 'ListBox1' [DCC Error] mp3.pas(525): E2003 Undeclared identifier: 'lentime' [DCC Error] mp3.pas(525): E2008 Incompatible types [DCC Error] mp3.pas(529): E2029 Declaration expected but identifier 'Closefile' found [DCC Error] mp3.pas(530): E2029 '.' expected but ';' found [DCC Error] mp3.pas(7): F2063 Could not compile used unit 'mp3'
а вот сам код:
Code procedure TForm_player.Button9Click(Sender: TObject); begin if SaveDialog1.Execute then begin if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u'); end; end;
function TForm_player.MinToSec(tim: string): string;
var n: integer; a: string; begin n := 1; a := ''; repeat a := a + tim[n]; Inc(n); until tim[n] = ':'; Delete(tim, 1, Length(a) + 1); result := IntToStr((StrToInt(a) * 60) + StrToInt(tim)); end;
procedure TForm_player.SaveList(SaveFile: string);
var List: TStringList; i: integer; s: string; F:TextFile; begin Assignfile(F,SaveFile); Rewrite(F); Writeln(F,'#EXTM3U'); for i := 0 to ListBox1.Items.Count - 1 do begin s:=''; s:=copy(lentime(Listbox1.Items[i]),4,5); Writeln(F,'#EXTINF:' + MinToSec(s)); Writeln(F,ListBox1.Items.Strings[i]); end; Closefile(F); end;
Добавлено (25.06.2012, 18:37) --------------------------------------------- вот я не пойму, Button9Click это клик по кнопке, а вот это что MinToSec, SaveList? на сколько я понял это не компоненты из Tool Palette так как я их там не нашол )
Добавлено (25.06.2012, 18:45) --------------------------------------------- и насколько я понял: 1 вариант - нужно эти процедуры прописать в разделе type (вот только что именно писать); 2 вариант - нужно обозначить их в разделе var (опять же что писать); 3 вариант - если не 1 и не 2 тогда я хз что это ))
|
|
| |
xaramamburu | Дата: Понедельник, 25.06.2012, 22:01 | Сообщение # 50 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Процедура MinToSec переводит минуты в секунды. Процедура SaveList сохраняет файл в формате M3U. В разделе type нужно прописывать заголовки процедур: function MinToSec(tim: string): string;, procedure .SaveList(SaveFile: string); . Вообщем советую вам почитать умную книжку по основам Delphi. Кстати, скачать несколько таких книжек можно в каталоге файлов на сайте.)))
|
|
| |
BM_GORA | Дата: Вторник, 26.06.2012, 00:07 | Сообщение # 51 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| ок, спасибо за совет, над будет как нить почитать, все таки на программиста учусь )))))) Добавлено (26.06.2012, 00:07) --------------------------------------------- а что делать с lentime ? вот попытался так function Lentime : string; не пашет, наверное надо как то так function Lentime(тут чето написать : string ) : string; если ошибаюсь пожалуйста поправте меня ))
|
|
| |
xaramamburu | Дата: Вторник, 26.06.2012, 09:09 | Сообщение # 52 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, lentime - функция вычисления времени проигрывания трека. Смотри сообщение №10 в этой ветке форума, там эта функция расписана.)))))
|
|
| |
BM_GORA | Дата: Вторник, 26.06.2012, 17:34 | Сообщение # 53 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| в общем вот что теперь выдает : [DCC Warning] mp3.pas(472): H2164 Variable 'List' is declared but never used in 'TForm_player.SaveList' [DCC Error] mp3.pas(80): E2065 Unsatisfied forward or external declaration: 'TForm_player.Lentime' [DCC Error] mp3.pas(7): F2063 Could not compile used unit 'mp3'
и красным светится вот это описание function Lentime(filename1:string):string;
Добавлено (26.06.2012, 17:34) --------------------------------------------- стоп! чето я совсем запутался. 1 - нужно запихнуть function Lentime(filename1:string):string; в раздел type ?, если да то почему ошибки 2 - или же нужно запихнуть вот это куда нибуть ? : Code function Tform_player.lentime(filename1:string):string; var TrackLen: Double; ValLen: Double; Channel1 : DWORD; begin //освобаждаем канал BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //получаем время воспроизведения TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE)); ValLen:=TrackLen / (24 * 3600); Lentime:=FormatDateTime('hh:mm:ss',ValLen); //освобаждаем канал BASS_StreamFree(Channel1); end;
Сообщение отредактировал BM_GORA - Вторник, 26.06.2012, 17:41 |
|
| |
xaramamburu | Дата: Вторник, 26.06.2012, 22:32 | Сообщение # 54 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, [DCC Warning] - это предупреждение. Не обращай на него внимания.
Unsatisfied forward or external declaration: 'TForm_player.Lentime' - данная ошибка скорее всего означает, что у вас функция Lentime расположена ниже процедуры которая ее вызывает и компилятор ее не видит. Т.е вам необходимо перенести эту функцию перед procedure TForm_player.SaveList(SaveFile: string); из которой она вызывается или в самое начало кода (после раздела implementation).))))
|
|
| |
BM_GORA | Дата: Вторник, 26.06.2012, 22:58 | Сообщение # 55 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| нет вы меня немного не поняли, этой процедуры у меня нет. я делаю кнопку сохранения m3u файла. итак , что есть у меня. у меня в разделе type прописано вот это function Lentime(filename1:string):string; а так же имеются процедуры, вот они: Code procedure TForm_player.Button9Click(Sender: TObject); begin if SaveDialog1.Execute then begin if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u'); end; end;
function TForm_player.MinToSec(tim: string): string;
var n: integer; a: string; begin n := 1; a := ''; repeat a := a + tim[n]; Inc(n); until tim[n] = ':'; Delete(tim, 1, Length(a) + 1); result := IntToStr((StrToInt(a) * 60) + StrToInt(tim)); end;
procedure TForm_player.SaveList(SaveFile: string);
var List: TStringList; i: integer; s: string; F:TextFile; begin Assignfile(F,SaveFile); Rewrite(F); Writeln(F,'#EXTM3U'); for i := 0 to ListBox1.Items.Count - 1 do begin s:=''; s:=copy(lentime(Listbox1.Items[i]),4,5); Writeln(F,'#EXTINF:' + MinToSec(s)); Writeln(F,ListBox1.Items.Strings[i]); end; Closefile(F); end;
и вот с этим и выдается эта ошибка )
|
|
| |
xaramamburu | Дата: Вторник, 26.06.2012, 23:03 | Сообщение # 56 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Поэтому и ругается. Добавьте эту функцию перед процедурой procedure TForm_player.SaveList(SaveFile: string); . Все должно заработать.)))
|
|
| |
BM_GORA | Дата: Среда, 27.06.2012, 08:06 | Сообщение # 57 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| кнопка заработала, но при нажатии на кнопку сохранить выдается вот это : First chance exception at $75C39617. Exception class EAccessViolation with message 'Access violation at address 00484055 in module 'GorPlayer.exe'. Read of address 00000000'. Process GorPlayer.exe (3160) вот процедуры: Code procedure TForm_player.Button9Click(Sender: TObject); begin if SaveDialog1.Execute then begin if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u'); end; end;
function TForm_player.MinToSec(tim: string): string;
var n: integer; a: string; begin n := 1; a := ''; repeat a := a + tim[n]; Inc(n); until tim[n] = ':'; Delete(tim, 1, Length(a) + 1); result := IntToStr((StrToInt(a) * 60) + StrToInt(tim)); end;
function lentime(filename1:string):string; begin end;
procedure TForm_player.SaveList(SaveFile: string);
var List: TStringList; i: integer; s: string; F:TextFile; begin Assignfile(F,SaveFile); Rewrite(F); Writeln(F,'#EXTM3U'); for i := 0 to ListBox1.Items.Count - 1 do begin s:=''; s:=copy(lentime(Listbox1.Items[i]),4,5); Writeln(F,'#EXTINF:' + MinToSec(s)); Writeln(F,ListBox1.Items.Strings[i]); end; Closefile(F); end;
|
|
| |
xaramamburu | Дата: Среда, 27.06.2012, 09:02 | Сообщение # 58 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, В место:Code function lentime(filename1:string):string; begin end; добавьте:Code function Tform_player.lentime(filename1:string):string; var TrackLen: Double; ValLen: Double; Channel1 : DWORD; begin //освобаждаем канал BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //получаем время воспроизведения TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE)); ValLen:=TrackLen / (24 * 3600); Lentime:=FormatDateTime('hh:mm:ss',ValLen); //освобаждаем канал BASS_StreamFree(Channel1); end; а вот это function lentime(filename1:string):string; добавьте в разделе Type.
Сообщение отредактировал xaramamburu - Среда, 27.06.2012, 09:04 |
|
| |
BM_GORA | Дата: Пятница, 29.06.2012, 17:13 | Сообщение # 59 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| теперь все норм ) спс большое )) Добавлено (29.06.2012, 17:13) --------------------------------------------- у меня снова вопрос)) у меня ListBox1 показывается время трека, так вот , если название трека слишком длинное то оно залазиет на само время и получается какая то белибирда, вот скрин: http://i42.fastpic.ru/big/2012/0629/84/1667f63941171e3dff8d853a0a585b84.jpg как это можно исправить ?
Сообщение отредактировал BM_GORA - Среда, 27.06.2012, 14:22 |
|
| |
Filo$oF | Дата: Воскресенье, 01.07.2012, 21:01 | Сообщение # 60 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| BM_GORA
Я думаю, проще было бы поставить их в отрисовке на разные уровни. Я реализовал это так: http://cs309729.userapi.com/v309729233/ca5/ciAAraLBXQk.jpg
|
|
| |
|