Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SetLength löscht Array Inhalt (https://www.delphipraxis.net/36330-setlength-loescht-array-inhalt.html)

Luckie 18. Dez 2004 14:45


SetLength löscht Array Inhalt
 
Ich suche mit FindFirstFile Dateien auf der Festplatte und schreibe sie in ein dynamisches Array. Da es nicht sehr ressourcen schonend ist jedes mal das Array um eins zu vergrößern, habe ich mir folgendes gemacht:

Delphi-Quellcode:
Filename := RootFolder + string(wfd.cFileName);
if length(Files) = cnt then
SetLength(Files, length(Files)+100);
Files[cnt] := Filename;
Inc(cnt);
Files ist global, sobald aber der erste rekursive Aufruf kommt ist das Array aber wieder leer:

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);
var
  hFindFile   : THandle;
  wfd         : TWin32FindData;
  Filename    : string;
  cnt         : Integer;
begin
  cnt := 0;
  if RootFolder[length(RootFolder)] <> '\' then
    RootFolder := RootFolder + '\';
  ZeroMemory(@wfd, sizeof(wfd));
  wfd.dwFileAttributes := FILE_ATTRIBUTE_NORMAL;
  if Recurse then
  begin
    hFindFile := FindFirstFile(pointer(RootFolder + '\' + '*.*'), wfd);
    if hFindFile <> 0 then
    try
      repeat
        if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
          FILE_ATTRIBUTE_DIRECTORY then
          if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..')
            then
          begin
            FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
          end;
      until FindNextFile(hFindFile, wfd) = False;
    finally
      FindClose(hFindFile);
    end;
  end;
  hFindFile := FindFirstFile(pointer(RootFolder + '\' + '*.*'), wfd);
  if hFindFile <> 0 then
  try
    repeat
      if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
        FILE_ATTRIBUTE_DIRECTORY then
      begin
        Filename := RootFolder + string(wfd.cFileName);
        if length(Files) = cnt then
          SetLength(Files, length(Files)+100);
        Files[cnt] := Filename;
        Inc(cnt);
      end;
    until FindNextFile(hFindFile, wfd) = False;
  finally
    FindClose(hFindFile);
    setlength(Files, cnt);
  end;
end;
Und das verstehe ich nicht ganz. Ich wollte die Routine in einem nonVCL Programm nutzen, also ohne die Unit Classes auskommen.

Jelly 18. Dez 2004 15:05

Re: SetLength löscht Array Inhalt
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
        if length(Files) = cnt then
          SetLength(Files, length(Files)+100);
        Files[cnt] := Filename;

Dazu 1 Frage. Was ist denn Files... einfach nur
Delphi-Quellcode:
Files = array of string ;
Ich weiss nicht wie length(Files) arbeitet, ich nutzer eigentlich immer High(Files)+1. Vielleicht behebt das ja schon das Problem. Ich hatte mit Setlenght so noch nie das Problem, daß vorhandene Array-Einträge gelöscht wurden.

Luckie 18. Dez 2004 15:06

Re: SetLength löscht Array Inhalt
 
Jupp, ein dynamisches Array of String, entspricht TStringDynArray.

mirage228 18. Dez 2004 15:21

Re: SetLength löscht Array Inhalt
 
Hi,

was möchtest Du denn mit dem zweiten "setlength(Files, cnt);" in dem finally Abschnitt bewirken? Du setzt die länge doch bereits, oder nicht?

mfG
mirage228

nailor 18. Dez 2004 15:21

Re: SetLength löscht Array Inhalt
 
müll

rantanplan99 18. Dez 2004 15:30

Re: SetLength löscht Array Inhalt
 
vielleicht hilft es am anfang ein
Delphi-Quellcode:
setlength(files, 0);
einzufügen. ansonsten benutzte ich dynamische arrays genauso, und hab damit keine probleme.

rantanplan

Jelly 18. Dez 2004 15:35

Re: SetLength löscht Array Inhalt
 
Zitat:

Zitat von Luckie
Files ist global, sobald aber der erste rekursive Aufruf kommt ist das Array aber wieder leer

Sollte cnt nicht auch global sein, und nicht bei jedem Aufruf von FindAllFiles auf 0 gesetzt werden, sondern nur einmal auf 0 initialisiert werden?

Luckie 18. Dez 2004 15:41

Re: SetLength löscht Array Inhalt
 
Zitat:

Zitat von Jelly
Sollte cnt nicht auch global sein, und nicht bei jedem Aufruf von FindAllFiles auf 0 gesetzt werden, sondern nur einmal auf 0 initialisiert werden?

Unter wessen Schreibtisch darf ich mich verstecken. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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