Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung bei "FindFirst()" (https://www.delphipraxis.net/90833-fehlermeldung-bei-findfirst.html)

Bastler 24. Apr 2007 16:09


Fehlermeldung bei "FindFirst()"
 
Ich habe folgenden Code:
Delphi-Quellcode:
type TSearchRec = record
      Time: Integer;   // Zeitstempel der Datei.
      Size: Integer;   // Größe der Datei in Byte.
      Attr: Integer;   // Dateiattribute der Datei.
      Name: TFileName;   // DOS-Dateiname und -Dateinamenserweiterung
      ExcludeAttr: Integer;
      FindHandle: THandle;
      FindData: TWin32FindData;
      end;
var
  Form1: TForm1;
  pfad:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var SuchRec:TSearchRec;
begin
SelectDirectory('Wähle den Ordner', '', pfad);

FindFirst('c:\programme\*.*', faAnyFile, SuchRec); //*
if ExtractFileExt(Suchrec.name) = 'log' then
Combobox1.Items.Add(Suchrec.Name);
if FindNext(SuchRec) = 0 then //*
Combobox1.Items.Add(SuchRec.Name)
else
FindClose(SuchRec); //*

end;
Bei den mit //* makierten Zeilen gibt er mit immer folgende Fehlermeldung aus:
Zitat:

[Fehler] Unit1.pas(51): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Aber meiner Meinung nach stimmen die Parameter überein... (vor allem, weil es das gleiche Record ist, wie es in der Hilfe angegeben ist)

Luckie 24. Apr 2007 16:20

Re: Fehlermeldung bei "FindFirst()"
 
Es muss ein Zeiger auf die TSearchRect Struktur sein. Also muss es @SuchRec heißen. Aber warum hast du die Struktur noch mal selber deklariert? Die wird doch schon von Delphi selber deklariert in der Unit Windows.pas oder so.

Schaedel 24. Apr 2007 16:24

Re: Fehlermeldung bei "FindFirst()"
 
Warum erstellst du den Searchrect überhaupt neu?
Edit:Naja Luckie war schneller :)

Also bei mir funktioniert es so auf jeden fall.

Delphi-Quellcode:
procedure xy.xxxx;
var
  Search : TSearchRec;
begin
  if FindFirst (Directory+'\*.*' , faAnyFile-faSysFile, Search) = 0 then begin
    repeat
      fiExt := uppercase(ExtractFileExt(search.name));
....

Bastler 24. Apr 2007 16:27

Re: Fehlermeldung bei "FindFirst()"
 
Naja... danke für den Tipp, dass es in der Windows.pas deklariert ist, damit hast du mir indirekt geholfen, da es nämlich kein Pointer sein muss, aber meine doppelte Deklaration Probleme gemacht hat... :thumb:

CCRDude 24. Apr 2007 16:28

Re: Fehlermeldung bei "FindFirst()"
 
Zitat:

Zitat von Luckie
Es muss ein Zeiger auf die TSearchRect Struktur sein. Also muss es @SuchRec heißen.

Ist doch var, FindFirst braucht keinen Zeiger. Hab gerade mal in meinen Code geschaut, dutzende von Aufrufen ohne Zeiger ;)

Luckie 24. Apr 2007 23:37

Re: Fehlermeldung bei "FindFirst()"
 
War ehrlich gesagt auch nur etwas ins Blaue geraten. Ich war zu faul in der Hilfe zu gucken. ;)

Christian Seehase 25. Apr 2007 00:13

Re: Fehlermeldung bei "FindFirst()"
 
Moin Bastler,

Du solltest Dir übrigens angewöhnen bei Funktionen, deren Rückgabewert einen Fehler signalisiert, diesen auch auszuwerten, so wie Schaedel es in seinem Beitrag gezeigt hat.
Ausserdem gehört bei Funktionen die im Erfolgsfalle Resourcen belegen, wie auch FindFirst, ein try/finally-Block dazu, der sicherstellt, dass die Resourcen auch wieder freigegeben werden.

Was Du aber nicht wie Schaedel machen solltest: ;-)
Delphi-Quellcode:
faAnyFile-faSysFile
Bei Flags, die intern Bitfelder darstellen, sollte man diese mit and not aus der Maske entfernen, und mit or hinzufügen, da man sonst leicht ungültige Werte erhalten kann.
Das obige Beispiel sollte also besser
Delphi-Quellcode:
faAnyFile and not faSysFile
lauten.

Auch wenn es in diesem speziellen Falle mit - funktionier.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

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