Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Организация плейлиста   Найти похожие ветки 

 
Илья Щукин   (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 вся ветка

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
15-1164874807
TohaNik
2006-11-30 11:20
2007.01.07
Вот, влетел на задачке для 5-го класса.


15-1166411867
Slider007
2006-12-18 06:17
2007.01.07
С днем рождения ! 16 декабря


15-1166390678
AntiUser
2006-12-18 00:24
2007.01.07
Системный администратор осужден на 8 лет


3-1161444236
dj0n
2006-10-21 19:23
2007.01.07
как в DBImage заставить понимать jpg?


15-1166434770
ArtemESC
2006-12-18 12:39
2007.01.07
Почему не происходит чтение следующего кода???