Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Fr 24.08.07 11:28 
Hallo,

ich habe folgendes Problem. Ich hab mir ein Programm geschrieben, bei dem ich mir einen Pfad auswähle mittels SelectDirectory und mir dann entweder alle Datein oder nur welche mit bestimmter Endung zählen lasse und mir den Pfad dieser dann merke. Dieser Teil funktioniert auch schon super. (Hab des halt über diese hier weit verbreitete Variante mit FindFirst gemacht).

Da ich aber auch sehr große Verzeichnisse durchsuchen muss/will, wollte ich mir ausgeben lassen wie viele Dateien er schon durchsucht, bzw. gefunden hat und in welchem Verzeichnis er gerade ist. Dazu hab ich mir Edit-Fenster gezeichnet in denen ich diese Werte anzeigen lassen will.

Hier schon mal der Code für die Suchroutine, gestarte wird diese über eine ButtonClick:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
var
  SR: TSearchRec;
begin
  if (ADirectory<>''and (ADirectory[length(ADirectory)]<>'\'then
    ADirectory:=ADirectory+'\';


  if (FindFirst(ADirectory+AMask,faAnyFile,SR)=0then begin
    repeat
      if (SR.Name<>'.'and (SR.Name<>'..'and (SR.Attr<>faDirectory) then
          AList.Add(ADirectory+SR.Name);
          Pfad.Text := ADirectory+SR.Name;
          Anzahl.Text := IntToStr(alist.Count);
    until FindNext(SR)<>0;
    FindClose(SR);


  end;


  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0then
    begin
      repeat
        if (SR.Name<>'.'and (SR.Name<>'..'then
          GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True);
     until FindNext(SR)<>0;
      FindClose(SR);
    end;
end;


Mit diesen Zeilen möchte ich diese Ausgabe machen.

ausblenden Delphi-Quelltext
1:
2:
Pfad.Text := ADirectory+SR.Name;
Anzahl.Text := IntToStr(alist.Count);


Jetzt hab ich aber das Problem das mir diese Felder nicht während des Suchvorgangs aktualisiert werden, sondern immer erst ganz zum Schluss. Was ja dann überflüssig wäre, da ich am Schluss ja sowieso das Ergebniss vorliegen hab.

Also hier die Frage ob es eine Möglichkeit gibt, sich diese Werte während des Suchvorgangs aktuell anzeigen zu lassen.

MfG Jack
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 24.08.07 11:31 
Moin!

Pack das mal da dran: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
Pfad.Text := ADirectory+SR.Name;
Anzahl.Text := IntToStr(alist.Count);
Application.ProcessMessages;

Ist aber eine "Bremse", weil die Ausgabe Zeit kostet. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Fr 24.08.07 11:53 
Noch besser wäre es die Suche in einem Thread auszulagern! ;-)

_________________
Ein Nutzer der Ecke ;-)
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Fr 24.08.07 12:40 
Wie würde das Funktioniern das in einen Thread auszulagern und was hätte ich davon für Vorteile, auch in hinsicht darauf, dass ich die gefundenen Datein auch verändern will.
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Fr 24.08.07 13:27 
und wie kann ich möglichst einfach dateien durchsuchen, die recht groß sind und die ich somit nicht komplett in eine stringlist laden möchte
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 24.08.07 13:41 
Ein wichtiger Tipp zu Threads wie auch Application.ProcessMessage: Du darfst nicht vergessen den Button "Suchen" usw. Enabled auf False zu schalten, sonst können sich leicht Laufzeitfehler ergeben.

einen Thread kannst du machen, indem du auf Datei > Neu gehst und dort Thread auswählst. Der läuft dann parallel zu deinem eigentlichen Programm (VCL-/Haupt-Thread). Aber wie das mit Threads genau geht liest du am besten erst mal in der Hilfe.

Übrigens könntest du glaube ich auch statt einem Thread oder Application.ProcessMessage die Methode Update oder Refresh (?) der Steuerelemente verwenden.