Autor Beitrag
lambruco
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Win 2000/2000 Server/XP
D6 Prof.
BeitragVerfasst: Fr 13.06.03 12:07 
Moin Forum,
ich habe ein Tool geschrieben, um Dateien nach Datum und Uhrzeit zu
sortieren. Diese werden dann in ein StringGrid aufgelistet.
Läuft eigentlich recht gut, ist aber recht langsam. Als Newbie gehe ich
einfach mal davon aus, das es an folgender Procedure liegt.
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
Procedure TDataModule3.FindFiles (Path, FindMask: String;ResultPath,  
                            ResultDateTime,ResultFiles: tStrings);
Var
  FindRec: tSearchRec;
Begin

  If (Path = ''or (FindMask = ''or Not Assigned (ResultPath) Then
    Exit;
  If Path[Length (Path)] <> '\' Then
    Path := Path + '\';
  If FindFirst (Path + FindMask, faAnyFile, FindRec) = 0 Then
    Repeat 
      If (FindRec.Name <> '.'and (FindRec.Name <> '..'Then
        begin
          if not DirectoryExists(path+findrec.Name) then
            begin
              ResultPath.Add (Path);
              if fileage(path+findrec.Name) <> -1 then
                begin
                  ResultDateTime.add(DateTimeToStr(
                                      FileDateToDateTime(
                                      fileage(path+findrec.Name))));
                end;
              ResultFiles.add (FindRec.Name);
             end;
        end;
    Until FindNext (FindRec) <> 0

  FindClose (FindRec);

  If FindFirst (Path + '*.*', faAnyFile, FindRec) = 0 Then 
    Repeat 
      If (FindRec.Name <> '.'and (FindRec.Name <> '..'Then
         If Boolean (FindRec.Attr and faDirectory) Then
            FindFiles (Path + FindRec.Name, FindMask,ResultPath,
                       ResultDateTime,ResultFiles);
    Until FindNext (FindRec) <> 0;

   FindClose (FindRec); 
End;


Gibt es eine Möglichkeit, das durchsuchen der Verzeichnisse zu beschleunigen, oder liegt es garnicht an dieser Procedure.

Lars
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.06.03 13:33 
Ich habe schon lange nichts mehr mit einem StringGrid gemacht, aber es müsste eigentlich BeginUpdate und EndUpdate unterstützen (wie viele andere Win-Controls auch). Damit blockierst du quasi die Bildschirmausgabe, was auch ein bisschen mehr Speed bringt. Die Betonung liegt auf "bisschen", also erwarte bitte keine Wunder. :)
Empfehlenswert ist es aber in jedem Fall, denn gerade bei sehr langwierigen Prozeduren entfällt das unschöne "Aufbauen" der Liste. Stattdessen macht es am Schluss -schwupp!- und die Liste ist voll. Falls das Grid das nicht direkt unterstützt, probier´s mal direkt mit der API
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure BeginUpdate(const wnd: HWND; UpdateState: boolean);
begin
  SendMessage(wnd,WM_SETREDRAW,WPARAM(not UpdateState),0);
end;

Anzuwenden wie folgt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
BeginUpdate(StringGrid1.Handle,TRUE); // = BeginUpdate

{ ... die Grit (ab-)füllen :wink: }

BeginUpdate(StringGrid1.Handle,FALSE); // = EndUpdate

Ob´s was bringt, kann ich dir aber nicht garantieren.

Zu deiner FindFirst-Sache - Ich habe die Erfahrung gemacht, dass nur der allererste Durchlauf u.U. sehr lange dauert. Ich habe mal mit einer ähnlichen Funktion alle Ordner meiner C-Partition scannen lassen. Das dauerte beim ersten Mal auch recht lange. Aber schon der zweite Durchlauf beanspruchte nur noch einen Bruchteil der Zeit. Warum auch immer. :?
lambruco Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Win 2000/2000 Server/XP
D6 Prof.
BeitragVerfasst: Fr 13.06.03 14:29 
Erstmal Danke,
Stringgrid verfügt leider nicht über BeginUpdate/EndUpdate und ich
habe Probleme mit der Windows API. Habe damit noch nie gearbeitet und
der Debugger meldet nur unidentifier WM_SETREDRAW .

Etwas Hilfe wäre nett

LArs

_________________
Wer Rechtschreibfehler findet, kann Sie behalten
lambruco Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Win 2000/2000 Server/XP
D6 Prof.
BeitragVerfasst: Fr 13.06.03 14:50 
:D :D :D

Hab was ähnliches gefunden

ausblenden Delphi-Quelltext
1:
stringgrid1.Perform(WM_SETREDRAW, 00 );					


bzw.

ausblenden Delphi-Quelltext
1:
stringgrid1.Perform(WM_SETREDRAW, 10 );					



läuft aber nicht wesentlich schneller.
Vermutlich ist mein Sortieralgorhythmus einfach nur schlecht, aber
für kleine Verzeichnisse reicht es.

mfg
Lars

_________________
Wer Rechtschreibfehler findet, kann Sie behalten