Avatar billede skindbeni Nybegynder
23. marts 2008 - 14:30 Der er 5 kommentarer og
2 løsninger

Søge efter bestemte filtyper og liste dem i listbox

Findes der en mulighed for at søge efter alle de filer i et bibliotek, der har en bestemt endelse og liste deres filnavne i en listbox eller lignende?
Avatar billede kroning Nybegynder
23. marts 2008 - 14:57 #1
Alle mp3 filer fra mappen c:\hk\test1 til Listbox1

var
  fname : string;
begin
  fName:='c:\hk\test1\*.mp3';
  SendMessage(ListBox1.Handle, LB_DIR, DDL_ARCHIVE,LongInt(fName));
end;
Avatar billede hrc Mester
23. marts 2008 - 21:48 #2
kroning: Ret sødt, men også noget nørdet. Ved godt det fylder mere, men hvad med at bruge de indbyggede funktioner: FindFirst, FindNext og FindClose?

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  FindMP3s('c:\test',ListBox1.Items);
end;

procedure TfrmMain.FindMP3s(const aPath: string; aList: TStrings);
var
  Found: boolean;
  SearchSpec: string;
  SearchRec: TSearchRec;
begin
  SearchSpec := IncludeTrailingPathDelimiter(aPath) + '*.mp?';
  Found := FindFirst(SearchSpec,faArchive,SearchRec) = 0;
  aList.BeginUpdate;
  try
    aList.Clear;
    while Found do
    begin
      aList.Add(SearchRec.Name);
      Found := FindNext(SearchRec) = 0;
    end;
  finally
    aList.EndUpdate;
    FindClose(SearchRec);
  end;
end;
Avatar billede skindbeni Nybegynder
24. marts 2008 - 00:25 #3
Hej begge to. Selvfølgelig har I to begge et godt svar.

Jeg vil give jer begge point, men to ting hænger en smule.

1. Kan jeg undgå at liste fil-endelsen? (OK, jeg skal jo egentlig blot fjerne de sidste 4 tegn, og så har jeg den) ;o)
2. Jeg forstår ikke, hvad der sker i Haralds kode.
Avatar billede kroning Nybegynder
24. marts 2008 - 11:30 #4
Med hrc´s løsning skal du udskifte denne linie:
aList.Add(SearchRec.Name);
med denne:
aList.Add(ChangeFileExt(SearchRec.Name,''));

Med min løsning skal du benytte dette i stedet:
var
  fname : string;
  i : integer;
begin
  fName:='c:\hk\test1\*.mp3';
  SendMessage(ListBox1.Handle, LB_DIR, DDL_ARCHIVE,LongInt(fName));
  for i:=0 to ListBox1.Count-1 do
    ListBox1.Items[i]:=ChangeFileExt(ListBox1.Items[i],'');
end;

-----------------

ListBox er en windows control, dvs. at det ikke er en komponent som 100% er designet i Delphi, Delphi benytter blot nogle API kald for at få windows til at lave en ListBox. (tror jeg nok)
Windows har så mulighed for at man kan sende nogle kommandoer til Listboxen og til dette bruger man funktionen SendMessage.
Du kan se en beskrivelse af de enkelte parametre der skal benyttes til ListBox her:
http://msdn2.microsoft.com/en-us/library/bb775185(VS.85).aspx
Avatar billede kroning Nybegynder
24. marts 2008 - 11:42 #5
Mht. min løsning så kan det også gøres lidt kortere således, men det er så ikke en 100% sikker løsning.

var
  fname : string;
begin
  fName:='c:\hk\test1\*.mp3';
  SendMessage(ListBox1.Handle, LB_DIR, DDL_ARCHIVE,LongInt(fName));
  ListBox1.Items.Text:=StringReplace(ListBox1.Items.Text,'.mp3','',[rfReplaceAll, rfIgnoreCase]);
end;

Et problem opstår hvis du f.eks. har en fil der indeholder ".mp3" og det ikke er fil-endelsen, men det er nok ikke så sansynlig.
Avatar billede hrc Mester
24. marts 2008 - 12:37 #6
kroning: Jeg kan godt lide din løsning - dvs. indtil endelserne skal fjernes. Den er kort, lo-level og ret umulig at få til at fejle - men nu er jeg Object Pascal fan og så måtte jeg lave det. Skal tjekke dit link ud; har ikke arbejdet meget i at sende komponenterne "messages".
Avatar billede kroning Nybegynder
24. marts 2008 - 12:59 #7
Og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester