Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wo soll bitte das FindClose(SR) stehen (https://www.delphipraxis.net/201261-wo-soll-bitte-das-findclose-sr-stehen.html)

ter 5. Jul 2019 15:49

Wo soll bitte das FindClose(SR) stehen
 
Frage:
Wo sollte das "FindClose(SR)" stehen?
An Stelle (1) oder Stelle (2)?

Lese von einem Startverzeichnis "myDrivePath" alle gefundenen
Verzeichnisse und Dateien in eine ListBox "myListBox".
Delphi-Quellcode:
procedure TForm1._update(myDrivePath: s_250;
                         out myListBox: TListBox;
                         var retCntDirs,
                             retCntFiles : integer;
                         var retTotalBytes : cardinal);
{-} procedure _readDP(myDP: s_250);
    var SR : TSearchRec;
    begin
    if (FindFirst(myDP+'*.*', faANYFILE, SR) = 0) then begin
       repeat if ((SR.Attr and faDirectory) = faDirectory) then begin
                 {-found a dir, skip dirnames "." and ".."-}
                 if ((SR.Name = '.') or (SR.Name = '..')) then else begin
                    inc(retCntDirs);
                    myListBox.Items.Add(myDP+SR.Name+'\');
                    _readDP(myDP+SR.Name+'\');
                 end;
              end else begin
                 {-found a file-}
                 inc(retCntFiles);
                 retTotalBytes:=retTotalBytes+SR.Size;
                 myListBox.Items.Add(myDP+SR.Name);
              end;
       until (FindNext(SR) <> 0);
       {-1-} FindClose(SR);
    end;
    {-2-} FindClose(SR);
{-} end;
begin
myListBox.Items.Clear;
myListBox.Items.BeginUpdate;
if (AnsiLastChar(myDrivePath) <> '\') then myDrivePath:=myDrivePath+'\';
retCntDirs:=0; retCntFiles:=0; retTotalBytes:=0;
_readDP(myDrivePath);
myListBox.Items.EndUpdate;
end;
Gruss Terence

Schokohase 5. Jul 2019 16:04

AW: Wo soll bitte das FindClose(SR) stehen
 
Am besten so
Delphi-Quellcode:
var SR : TSearchRec;
begin
  if (FindFirst('*.*', faANYFILE, SR) = 0) then
  try
    repeat
      [...]
    until (FindNext(SR) <> 0);
  finally  
    FindClose(SR);
  end;
end;
Delphi-Quellcode:
FindFirst
kann diese Suche öffnen, und wenn diese Suche geöffnet wurde, dann muss diese auch wieder geschlossen werden.

dummzeuch 5. Jul 2019 16:16

AW: Wo soll bitte das FindClose(SR) stehen
 
Zitat:

Zitat von ter (Beitrag 1436100)
Frage:
Wo sollte das "FindClose(SR)" stehen?
An Stelle (1) oder Stelle (2)?
Delphi-Quellcode:
    if (FindFirst(myDP+'*.*', faANYFILE, SR) = 0) then begin
       repeat
       until (FindNext(SR) <> 0);
       {-1-} FindClose(SR);
    end;
    {-2-} FindClose(SR);

FindClose gibt die Ressourcen frei, die ein erfolgreiches FindFirst belegt hat. D.h. ein nicht erfolgreiches FindFirst belegt keine Ressourcen, die freigegeben werden muessen.

-> Stelle 1

Und wie Schokohase schon schreibt: Am besten mit Try .. Finally.

ter 6. Jul 2019 09:08

AW: Wo soll bitte das FindClose(SR) stehen
 
Genial, jetzt weis ich bescheid.
Das mit dem Try .. Finally werde
ich jetzt immer machen.
Mit freundlichen Gruessen,
Terence

Luckie 6. Jul 2019 09:35

AW: Wo soll bitte das FindClose(SR) stehen
 
Das nützt aber nur was, wenn die Routinen auch Exceptions werfen. API Funktionen tuen das zum Beispiel nicht. Die liefern nur einen Fehlercode, den man auswerten muss.

dummzeuch 6. Jul 2019 10:51

AW: Wo soll bitte das FindClose(SR) stehen
 
Zitat:

Zitat von Luckie (Beitrag 1436147)
Das nützt aber nur was, wenn die Routinen auch Exceptions werfen. API Funktionen tuen das zum Beispiel nicht. Die liefern nur einen Fehlercode, den man auswerten muss.

Das ist egal, denn der Finally-Block wird auch ausgeführt, wenn der Code ganz normal durchlaufen wird.

Luckie 6. Jul 2019 11:37

AW: Wo soll bitte das FindClose(SR) stehen
 
Iiiicks. Ich hatte einen reinen Except-Block im Kopf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz