[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
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
Wechselt mit F12 in den Code Editor.
Schreibt nun unter folgenden Code die neue Prozedure:
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
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.
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:

Außerdem kann alles nochmal gedownloaded werden.
Über ein Thanks würde ich mich auch sehr freuen
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
ShellAPI, Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
ListBox1: TListBox;
GroupBox2: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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;
procedure TForm1.BitBtn1Click(Sender: TObject);
var Eingabe: String;
Find: Integer;
begin
Eingabe := String(Edit1.Text);
FindFiles ('C:\', PWideChar(Eingabe), ListBox1.Items);
Find := listbox1.items.count;
GroupBox1.Caption := 'Es wurden ' + (IntToStr(Find))+ ' ' + Eingabe + ' Datein gefunden';
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var s:string;
begin
s := ListBox1.Items[ListBox1.ItemIndex]; // wählt einen entsprechenden Eintrag aus
shellexecute(handle, 'open', PChar( s), nil, nil, sw_show); // öffnet die Datei
end;
end.