Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Организация плейлиста [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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо