Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с кодом


Автор: kind_programmer 11.5.2007, 17:17
Всем доброго вечера...

Код

procedure ListFileDir(Path: string; FileList: TStrings);
 var
   SR: TSearchRec;
 begin
   if FindFirst(Path + '*.avi', faAnyFile, SR) = 0 then
   begin
     repeat
       if (SR.Attr <> faDirectory) then
       begin
         FileList.Add(SR.Name);
       end;
     until FindNext(SR) <> 0;
     FindClose(SR);
   end;
 end;

procedure TForm3.ListBox1DblClick(Sender: TObject);
var
i: integer;
begin
for i:=0 to ListBox1.items.Count - 1 do
if ListBox1.Selected[i] then begin
s:=listbox1.Items[i]
end;    s:='c:\avi\'+s;  edit1.Text:=s;
form4.MediaPlayer1.Open;
form4.MediaPlayer1.FileName:=s;
form4.MediaPlayer1.Play;
form4.Show;             
end;

procedure TForm3.BitBtn2Click(Sender: TObject);
begin
   ListFileDir('avi\', ListBox1.Items);
 end;


Действие в следующем....Ищем в avi/ все файлы *.avi
Весь список, отображаем в ListBox. 
DblClick на определенном пункте должен открывать другую форму с TMediaPlayer и воспроизводить этот файл.

Вот собственно код. Долго парился, но пока толком не получается. Что я не так делаю?
Помогите, пожалуйста...

Автор: AriX 11.5.2007, 17:23
Путь для FindFirst должен быть полным.

Автор: lukas 11.5.2007, 18:19
kind_programmer, 


а потому что FileList - это параметр функции должен быть переменной!!!

Код

procedure ListFileDir(const Path: string; var FileList: TStrings);
 var
   SR: TSearchRec;
 begin
   if FindFirst(Path + '*.avi', faAnyFile, SR) = 0 then
   begin
     repeat
       if (SR.Attr <> faDirectory) then
       begin
         FileList.Add(SR.Name);
       end;
     until FindNext(SR) <> 0;
     FindClose(SR);
   end;
 end;




Автор: _hunter 11.5.2007, 18:19
Цитата(kind_programmer @  11.5.2007,  17:17 Найти цитируемый пост)
Вот собственно код. Долго парился, но пока толком не получается. Что я не так делаю?

а что не получается то?

Автор: kind_programmer 12.5.2007, 06:15
_hunter, поиск файлов осуществляет..все они в ListBox появляются, но не удается по DblClick запусть воспроизведение на отдельной форме с   TMediaPlayer'ом. 

Автор: kind_programmer 12.5.2007, 14:03
И да...кое-что еще, у TMediaPlayer, что звук не придусмотрен?

Автор: lukas 12.5.2007, 16:11
Посмотри внимательно и найди 10 отличий...  smile 


Код


procedure TForm3.ListBox1DblClick(Sender: TObject);
var
i: integer;
begin
for i:=0 to ListBox1.items.Count - 1 do
if ListBox1.Selected[i] then begin
s:=listbox1.Items[i]
end;    s:='c:\avi\'+s;  edit1.Text:=s;
form4.MediaPlayer1.FileName:=s;
form4.MediaPlayer1.Open;
form4.MediaPlayer1.Play;
form4.Show;             
end;




шутка.... сначала нужно прописывать путь к файлу, а потом уже его открывать... 

Автор: kind_programmer 12.5.2007, 21:38
lukas, гениально  smile !!! Выпьем за это!!! Но эффект то же, форма открывается, но файл не проигрывается..

Автор: maniaks1 12.5.2007, 21:53
Код


Var TempPath : array[0..MAX_PATH] of char;
      FileName:String;
      s:TsearchRec;

//Открываем нужную папку
procedure TForm1.Button1Click(Sender: TObject);
var
TitleName : string;
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : array[0..MAX_PATH] of char;
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := Form1.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := 'Please specify a directory';
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then begin
SHGetPathFromIDList(lpItemID, TempPath);
GlobalFreePtr(lpItemID);
end;
if TempPath<>'' then
  begin
    ListBox1.Items.Clear;
    FindFirst(TempPath+'\*.mp3',faAnyFile,s);
    if s.Name<>'' then ListBox1.Items.Add(' '+s.Name);
    while FindNext(s)=0 do
    ListBox1.Items.Add(' '+s.Name);
    FindFirst(TempPath+'\*.wav',faAnyFile,s);
    if s.Name<>'' then ListBox1.Items.Add(' '+s.Name);
    while FindNext(s)=0 do
    ListBox1.Items.Add(' '+s.Name);
  end;
end;


//Теперь по клику:
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  MediaPlayer1.Close;
  MediaPlayer1.FileName:=String(TempPath)+'\'+ListBox1.Items.ValueFromIndex[ListBox1.ItemIndex];
  MediaPlayer1.Open;
  MediaPlayer1.Play;
  Play:=true;
  SpeedButton1.Enabled:=false;
  SpeedButton2.Enabled:=true;
  SpeedButton3.Enabled:=true;
end;


Взято из рабочего кода, так что всё лишнее можешь убрать.
P.S. При заполнении ListBox я добавляю пробелы, так как при снятии данных, у меня обрезаеться первый символ, если у тебя такой проблемы нет, то просто убери пробелы.

P.P.S.
Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, MPlayer,ShellAPI, ShlObj, Buttons; 

Если чего то не хватает, добавь.

Автор: kind_programmer 12.5.2007, 22:20
Всем огромное спасибо. На сегодня хватит, иначе я комп с болкона сброшу... smile 
maniaks1, особая благодарность. Заюзаю, посмотрим, что выйдет. При удаче отпишусь.

Автор: MetalFan 13.5.2007, 18:08
maniaks1, Код составления списка файлов содержит недочет, а именно - не происходит закрытие "сеанса" поиска функцией FindClose.
[quote=Delphi Help]Note:    FindFirst allocates resources (memory) which must be released by calling FindClose.[/url]
+ не анализируется вовзращаемое функцией FindFirst...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)