[TuT] Eigenes Datei -Suchprogramm erstellen

11/18/2009 18:25 HardCore.1337#1
[TuT] Eigens Dateisuch System erstellen mit Delphi


Hi,
in meinem ersten Tutorial möchte ich euch erklären/zeigen wie ihr einen eigenen Suchdienst in Delphi proggen könnt. Dieser hat den mehrere Vor- und Nachteile

Pro:


- Ihr erlernt die Sprache und und deswegen machen wir das ja überhaupt erst
- Er geht meiner Meinung schneller als der Windows eigene Suchfunktion
- Sie sucht nur wirklich nur Dateien mit dem exakt angegebenen Namen (was vlt. Auch ein Nachteil sein könnte)
Contra


- Wie schon angesprochen sucht sie nur nach Dateiendungen oder dem exakten Namen
- Sonst fällt mir eigentlich gar nix ein.

Was brauchen wir?


- Delphi
- Menschenverstand ;)

Los geht’s…
Als erstes öffnet ihr nun Delphi. Ich benutze auf den Bildern Delphi 2010. Bitte nicht wundern. Es ist keine illegale Version. Bloß eine Demo, die ich über TimeShifter aufrecht erhalte.
Also, los geht’s, öffnet eine VCL Anwendung

[Only registered and activated users can see links. Click Here To Register...]

Wenn ihr das habt, bestückt euer Formular mit folgenden Komponenten:
- 2 Groupboxen
- 2 Buttons oder 2 BitBtn
- 1 Label
- Und 1 Edit Feld
Beschriftet die Komponenten anschließend wie auf dem bild

[Only registered and activated users can see links. Click Here To Register...]

Wechselt mit F12 in den Code Editor.
Schreibt nun unter folgenden Code die neue Prozedure:


[Only registered and activated users can see links. Click Here To Register...]

Code:
 Procedure FindFiles (aPath, aFindMask: String;  aResult: tStrings);
Var
  FindRec: tSearchRec;
Begin
  // Wenn unser Edit Feld nicht ausgefüllt wurde dann abbrechen
  If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then
    Exit;

  // Wenn der Pfad unvollständig, ein "\" eibfügen
  If aPath[Length (aPath)] <> '\' Then
    aPath := aPath + '\';

  // Im aktuellen Verzeichnis nach der Datei suchen
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // ...Ergebnis in die Stringlist einfügen
        aResult.Add (aPath + FindRec.Name);
    Until FindNext (FindRec) <> 0;

  FindClose (FindRec);

  // In Unterverzeichnissen weiter suchen
  If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // Feststellen, ob es sich um ein Verzeichnis handelt
        If Boolean (FindRec.Attr and faDirectory) Then
          // Im nächstes verzeichnis suchen  ;)
          FindFiles (aPath + FindRec.Name, aFindMask, aResult);
    Until FindNext (FindRec) <> 0;

   FindClose (FindRec);
End;
Puhh, sieht ja ziemlich kompiziert aus. Ich habe regelmäßig Kommentare eingefügt. Für alle die aber zu faul sind die sich raus zu suchen erkläre ich hier nochmal Grob. Die Prozedure fängt im Verzechnis C:\ an zu suchen, schreibt die gefunden Treffer/Datein in die ListBox und öffnet selber das nächste Verzeichnis. Dort wiederholt sie den Vorgang. Dieses Verfahren nennt sich „Rekursion“. Mehr dazu auf

[Only registered and activated users can see links. Click Here To Register...]

Wie gehts weiter?

So, den Code haben wir.. Nur er nützt uns noch nix. Um ihn aufzurufen doppelklicken wir auf den Button mit der Aufschrift "Datei(n) suchen".

Dort gehört folgender Code hinein:

Code:
 procedure TForm1.BitBtn1Click(Sender: TObject);
var Eingabe: String;
      Find: Integer;
begin
  Eingabe := String(Edit1.Text);  // (1)
  FindFiles ('C:\', PWideChar(Eingabe), ListBox1.Items);  // (2)
  Find := listbox1.items.count;  // (3)
  GroupBox1.Caption := 'Es wurden '  + (IntToStr(Find))+ ' ' + Eingabe + ' Datein gefunden';

end;
(1): Als erstes müssen wir im Edit Feld die zu suchende Datei eingeben. Diese wird in einen String umgewandelt .
(2): Ist der eigentliche Aufruf der Funktion. Start ist im laufwerk C:\. Unser zu suchendes Objekt wird nun von einem String in ein PChar umgewandelt. Anschließend wird es in der ListBox angezeigt.

(3): Als nächstes werden die Einträge in der ListBox gezählt

Kommt noch was?

Als kleines Extra habe ich mir gedacht, das man die Datei direkt öffnen kann.
Dazu verwenden wir die "ShellAPI". Diese bitte unbedingt voher einbinden.

Code:
uses ShellAPI;
Dann gehts auch schon los mit dem öffnen. Einfach einen Doppelklick auf
"Datei oder Programm öffnen" und folgenden Code einfügen.

Code:
var  s:string;
begin
  s := ListBox1.Items[ListBox1.ItemIndex]; // wählt einen entsprechenden Eintrag aus

  shellexecute(handle, 'open', PChar( s), nil, nil, sw_show);  // öftnet die Datei

end;
Jetzt könnt ihr eurer Programm mit F9 starten und euch über eurer Arbeit freuen.

Nachtrag

Ich hoffe euch hat mein erstes Tutorial gefallen. Wenn es gut ankommt, werde ich auch gerne weitere erstelln. ich hoffe auch das es sehr Anwenderfreundlich geschrieben wurde.

Hier nochmal der Komplette Code: :handsdown:
Außerdem kann alles nochmal gedownloaded werden.

Über ein Thanks würde ich mich auch sehr freuen :)

12/09/2009 17:55 HardCore.1337#2
Würde mich gerne über Feedback freuen ;)
12/13/2009 18:52 dpjeezy89#3
ich werds mal testn schaut gut aus und thx für die mühe!
12/16/2009 13:38 Scholzi#4
Sieht nach einem sehr guten Tut aus, habs nich probiert aber die Erklärungen im Quellcode sind auch recht nützlich, schön gemacht.
12/18/2009 15:18 HardCore.1337#5
Danke.

Soll ich mal ein neues erstellen?
12/24/2009 21:43 .MrBurns#6
Nice,,, ich bleibe aber lieber beim windows-suchsystem

trotzdem nice
12/24/2009 23:29 NoT_aVaIlAbLe#7
ich bleibe auch bei windows such system :D

Trotzdem schönes tut