![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация плейлиста [D7, WinXP]
Илья Щукин © (2006-05-14 10:40:00)Здравствуйте. Нужен пример создания плейлиста, причем такой, чтобы файлы можно было бы добавлять по одному, и сколько выделил в Open диалоге. Мой плейлист к сожалению загружает полностью директорию. Сам пытался преодалеть этот барьер , но ни как не получается. Можете ли Вы мне подсказать примером решить данную задачу. Использую Dеlphi7.
Заранее благодарен.
antonn (2006-05-18 12:27:00) [1]Илья Щукин (18.05.06 12:14) [9]
Интересное приложение получается. Часть настроек сохраняется в реестре, а часть в ini файле. Это вообще нормально?
зависит от программы. Я храню только в ini, в реестр вообще стараюсь не лазить.
По переходу ничего сказать не могу - я же не знаю, как реализованы механизмы перемещения и структуру ПЛ. Для текущей строки лучше использовать listbox1.itemindex, он не должен сбрасываться.
Илья Щукин (2006-05-18 12:14:00) [2]Антон!
Интересное приложение получается. Часть настроек сохраняется в реестре, а часть в ini файле. Это вообще нормально?
Тем не менее за подсказку спасибо, скорее всего я ей воспользуюсь.
И ещё. Тут походу возникла маленькая проблемка. Если плеер находится в свёрнутом состоянии, то после проигрывания любого выделенного файла в списке плеер переходит к последнему, не важно где находится выделенный трек в процессе воспроизведения (вначале или всередине). Чем можно объяснить такое поведение. Можно ли это исправить. В качестве собственно плеера я использовал немецкие компоненты MMTools. Я думаю они вам должны быть известны.
antonn (2006-05-18 09:50:00) [3]не стал даже вдумываться в код - не люблю ковырять в реестре. А что она должна была туда записать? путь до приложения?
Загрузка и сохранение ПЛ в файл формата PLS (это если в листбоксе хранятся пути до файлов):
uses inifiles;
procedure TF_PlayList.LoadPlayList_PLS(s:string);
var i:integer; inifile : TIniFile; temp_integer:integer;
begin
if fileexists(s) then begin
inifile := TIniFile.Create(s);
try
if strtoint(inifile.ReadString('playlist', 'NumberOfEntries', '0'))>0 then
for i:=1 to strtoint(inifile.ReadString('playlist','NumberOfEntries' , '1')) do
ListBox1.items.add(inifile.ReadString('playlist', 'File'+ inttostr(i) , ''));
finally
inifile.Free;
end;
end;
end;
procedure TF_PlayList.SavePlayList_PLS(Dir:string);
var i:integer; List_TMP:TStrings;
begin
List_TMP:=Tstringlist.Create;
try
List_TMP.Clear;
List_TMP.Add( '[playlist]' );
list_tmp.Add( 'Version=2' );
List_TMP.Add( 'NumberOfEntries='+inttostr( listbox1.Items.Count) );
for i:=0 to listbox1.Items.Count-1 do begin
PlayListItem:= pPlayListItem(listbox1.Items.Objects[ i ]);
List_TMP.Add( 'File'+ inttostr(i+1)+'='+ ListBox1.items.strings[i]);
end;
List_TMP.SaveToFile( Dir );
finally
List_TMP.Free;
end;
end;
Илья Щукин (2006-05-17 17:03:00) [4]Антон!
Необходима ещё ваша помощь. Спасибо за подсказку №1, всё действительно очень просто. Спервого раза я на неё внимания не обратил, а надо было.
Возникла необходимость сохранения выбранных файлов в реесте. Плей лист я не делал, пока. Наверное это не понадобится в ближайшее время. Сохранение в реесте я предусмотрел, а вот чтение не получается. Может это из-за того, что в приложении нет плейлиста. Хотя, какая разница реестру что хранить.
Пример сохранения //
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
WaveOut.Close;
try //сохранение настроек в реестре
RegTrack.RootKey:=HKEY_LOCAL_MACHINE;
if RegTrack.OpenKey('Software\Программа\MP3P',True) then
begin
if not RegTrack.KeyExists('Программа') then regtrack.CreateKey('Программа');
if regTrack.OpenKey('\SOFTWARE\Программа\MP3P',false) then begin
regTrack.WriteInteger('TrackBar1Position',Trackbar1.Position);
regTrack.WriteInteger('Slider1Position',Slider1.Position);
regTrack.WriteString('ListBox1Items',ParamStr(0));//***************
regTrack.CloseKey
end;
end;
finally
regTrack.Free;
end;
Except
on EAccessViolation do Exit;
end;
end;
Строка сохранения выделена звездочками. Как выполнить чтение?
Officeman (2006-05-17 10:32:00) [5]есть собственная разработка.
отпиши мне намыло zeram@hotmail.ru
вышлю свой проект. аналог winamp-а,
всёравно на полке пылится.
antonn (2006-05-16 17:25:00) [6]Илья Щукин (16.05.06 17:00) [4]
т.е. покажете пример.
[1] - вставить в SpeedButton4Click
Илья Щукин (2006-05-16 17:00:00) [7]Ну, насчет менять профессию, это Вы круто замахнулись. Дело в том, что я не профессионал, и профессия у меня совсем другая, а программирование это хобби. Иначе зачем мне Ваш форум. Мне нужно написать программу для себя и потом разместить её в одном приложении, которое будет иметь 3 экзешника. Один из них плеер. Поскольку в медиа я не спец, поэтому и прошу помощи. Ничего дурного в этом я не вижу. Извините если что не так. Буду очень признателен если Вы окажете помощь на профессиональном уровне, т.е. покажете пример.
Плохиш (2006-05-15 14:01:00) [8]
> Илья Щукин (15.05.06 13:41) [2]
Читать [1] до полного просветления или менять специальность, т.к. на copy-past готовых примеров далеко не уедешь.
Илья Щукин (2006-05-15 13:41:00) [9]Антон, я Вам сейчас приведу часть примера кода, будет легче понять.
// формирует список MP3/wav файлов для их загрузки в плейлист
procedure TForm1.PlayList(Path: string); //==================== список =====
var
lpBuf: PChar; // указатель на nul-terminated строку
sWinDir: string[255]; // обычная Паскаль строка
SearchRec: TSearchRec; // структура SearchRec содержит информацию
// о файле, удовлетворяющем условию поиска
begin
ListBox1.Clear;//сначала очищаем лист
// сформировать список mp3 файлов
if FindFirst(Path + '*.mp3', faAnyFile, SearchRec) =0 then
begin
// в каталоге есть файл с расширением MP3
// добавим имя этого файла в список
ListBox1.Items.Add(SearchRec.Name);
// пока в каталоге есть другие файлы с расширением MP3
while (FindNext(SearchRec) = 0) do
ListBox1.Items.Add(SearchRec.Name);
end;
end; //===================================
// Выбор папки, в которой находятся MP3/wav файлы
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
Root: string; // корневой каталог
pwRoot : PWideChar;
Dir: string;
begin
Try
Root := ''; // корневой каталог - папка Рабочий стол
GetMem(pwRoot, (Length(Root)+1) * 2);
pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
if not SelectDirectory('Выберите папку', pwRoot, Dir)
then Dir :=''
else Dir := Dir+'\';
// каталог, в котором находятся MP3 файлы выбран
SoundPath := Dir;
PlayList(SoundPath);
ListBox1.ItemIndex := 0;
Label1.Caption:=ListBox1.Items[ListBox1.itemIndex];
Except
on EStringListError do ShowMessage('Медиа файлы отсутствуют!');
end;
end; //====================
Файлы грузятся патчем,
это в том случае если использовать системное окно открытия директории.
Теперь вариант с OpenDialog:
//procedure TForm1.SpeedButton4Click(Sender: TObject); //выбор каталога
var
dir:string;
begin
if OpenDialog.Execute Then begin
//ListBox1.Clear;
SoundPath:=dir;
PlayList(SoundPath);
ListBox1.ItemIndex := 0;//установка индекса в начальную позицию
end;
end; //=======================================
Примеры сразу говорю не мои. Я их нашел и применил. Но!
И В том, и в другом случае используется патч. Но этот вариант меня не устраивает. Т.К. напрочь лишен возможности выбора файла в одиночном варианте (а не в множественном , как у меня), и отсутствует возможность загрузки файлов по моему выбору. В OpenDialog -е свойство multiselect установлено в true. Значит эта возможность должна использоваться на полную. Так же нет возможности удалять файл по моему выбору. Вот эти моменты мне и нужно реализовать. Примеров на эту тему я ни где не мог найти.
antonn (2006-05-14 12:04:00) [10]а куда загружается?
//od - TOpenDialog
if od.Execute then
listbox.items.AddStrings(od.Files);