Форум: "Media";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
ВнизОрганизация плейлиста Найти похожие ветки
← →
Илья Щукин (2006-05-14 10:40) [0]Здравствуйте. Нужен пример создания плейлиста, причем такой, чтобы файлы можно было бы добавлять по одному, и сколько выделил в Open диалоге. Мой плейлист к сожалению загружает полностью директорию. Сам пытался преодалеть этот барьер , но ни как не получается. Можете ли Вы мне подсказать примером решить данную задачу. Использую Dеlphi7.
Заранее благодарен.
← →
antonn © (2006-05-14 12:04) [1]а куда загружается?
//od - TOpenDialog
if od.Execute then
listbox.items.AddStrings(od.Files);
← →
Илья Щукин (2006-05-15 13:41) [2]Антон, я Вам сейчас приведу часть примера кода, будет легче понять.
// формирует список 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. Значит эта возможность должна использоваться на полную. Так же нет возможности удалять файл по моему выбору. Вот эти моменты мне и нужно реализовать. Примеров на эту тему я ни где не мог найти.
← →
Плохиш © (2006-05-15 14:01) [3]
> Илья Щукин (15.05.06 13:41) [2]
Читать [1] до полного просветления или менять специальность, т.к. на copy-past готовых примеров далеко не уедешь.
← →
Илья Щукин (2006-05-16 17:00) [4]Ну, насчет менять профессию, это Вы круто замахнулись. Дело в том, что я не профессионал, и профессия у меня совсем другая, а программирование это хобби. Иначе зачем мне Ваш форум. Мне нужно написать программу для себя и потом разместить её в одном приложении, которое будет иметь 3 экзешника. Один из них плеер. Поскольку в медиа я не спец, поэтому и прошу помощи. Ничего дурного в этом я не вижу. Извините если что не так. Буду очень признателен если Вы окажете помощь на профессиональном уровне, т.е. покажете пример.
← →
antonn © (2006-05-16 17:25) [5]Илья Щукин (16.05.06 17:00) [4]
т.е. покажете пример.
[1] - вставить в SpeedButton4Click
← →
Officeman (2006-05-17 10:32) [6]есть собственная разработка.
отпиши мне намыло zeram@hotmail.ru
вышлю свой проект. аналог winamp-а,
всёравно на полке пылится.
← →
Илья Щукин (2006-05-17 17:03) [7]Антон!
Необходима ещё ваша помощь. Спасибо за подсказку №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;
Строка сохранения выделена звездочками. Как выполнить чтение?
← →
antonn © (2006-05-18 09:50) [8]не стал даже вдумываться в код - не люблю ковырять в реестре. А что она должна была туда записать? путь до приложения?
Загрузка и сохранение ПЛ в файл формата 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-18 12:14) [9]Антон!
Интересное приложение получается. Часть настроек сохраняется в реестре, а часть в ini файле. Это вообще нормально?
Тем не менее за подсказку спасибо, скорее всего я ей воспользуюсь.
И ещё. Тут походу возникла маленькая проблемка. Если плеер находится в свёрнутом состоянии, то после проигрывания любого выделенного файла в списке плеер переходит к последнему, не важно где находится выделенный трек в процессе воспроизведения (вначале или всередине). Чем можно объяснить такое поведение. Можно ли это исправить. В качестве собственно плеера я использовал немецкие компоненты MMTools. Я думаю они вам должны быть известны.
← →
antonn © (2006-05-18 12:27) [10]Илья Щукин (18.05.06 12:14) [9]
Интересное приложение получается. Часть настроек сохраняется в реестре, а часть в ini файле. Это вообще нормально?
зависит от программы. Я храню только в ini, в реестр вообще стараюсь не лазить.
По переходу ничего сказать не могу - я же не знаю, как реализованы механизмы перемещения и структуру ПЛ. Для текущей строки лучше использовать listbox1.itemindex, он не должен сбрасываться.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c