Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
8-1148034630
0bsid
2006-05-19 14:30
2007.01.07
Как взять кусок одного TImage и создать из него другой TImage?


1-1163631518
gosha73
2006-11-16 01:58
2007.01.07
Преобразование Untyped, что посоветуете?


15-1166173759
pavel_guzhanov
2006-12-15 12:09
2007.01.07
От книг Архангельского есть польза!!! :0))


1-1163576005
net_daemon
2006-11-15 10:33
2007.01.07
Алгоритмический вопрос по комбинаторике


2-1166364562
Max_2006
2006-12-17 17:09
2007.01.07
работа с SYSTEMTIME, FILETIME, прибавить любой промежуток времени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский