Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Tatsächliche und formale Var-Parameter stimmen nicht überein


pascalsv - Sa 05.08.06 14:38
Titel: Tatsächliche und formale Var-Parameter stimmen nicht überein
Hallo zusammen,

ich habe hier folgenden Such-Thread, bei dessen Kompilierung der Fehler: "Tatsächliche und formale Var-Parameter müssen überein stimmen" auftaucht. Ich weiß aber nicht, warum und was ich ändern muss.


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:
unit uSuchThread;

...

implementation


procedure TSuchThread.execute;
begin
 while not Terminated do begin
  FileSearch('C:\Dokumente und Einstellungen\Pascal\Desktop\ABBA\''*.mp3');
 end;

end;

procedure TSuchThread.FileSearch(const Path, FileName : string);
var Rec  : TSearchRec;
begin
  if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then  //hier tritt der Fehler auf!!!
    try
      repeat
        mp3Liste.Items.Add(Path + Rec.Name);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
      bStartButton.Enabled := true;
    end;
end;

end.


Weiß jemand Rat, bitte?

Danke & Gruß,

Pascal


Moderiert von user profile iconGausi: Topic aus Sonstiges (Delphi) verschoben am Sa 05.08.2006 um 14:57


mkinzler - Sa 05.08.06 14:44

Versuchs mal mit:

Delphi-Quelltext
1:
2:
pfad := Path + FileName;
if FindFirst ( pfad, ...


pascalsv - Sa 05.08.06 14:47

Hallo mKinzler, leider nicht, das hatte ich auch schon probiert. Habe sogar das "- faDirectory" versuchshalber weggelassen...

:(

Pascal


Martok - Sa 05.08.06 14:52

Ich würde mal sagen, Der Compiler nimmt das FindFirst aus Windows.pas. Gib mal explizit SysUtils.Findfrst(...) an.

Du könntest auch mal deine Uses-Klausel sortieren. Windows sollte vor SysUtils stehen, da ja von hinten abgearbeitet wird.


mkinzler - Sa 05.08.06 14:55

Komisch, sollte eigentlich funktionieren.

BTW. es müßte faAnyFile + faDirectory heißen.


Gausi - Sa 05.08.06 14:56

FindFirst hat als ersten Parameter ein PChar, keinen String. Wenn man nur etwas wie 'meinstring' hat, dann akzeptiert der Compiler das meistens, aber sobald man mit Variablen und + arbeitet, muss man explizit eine Typumwandlung angeben:

Delphi-Quelltext
1:
FindFirst (Pchar(Path + FileName), faAnyFile - faDirectory, Rec) = 0                    


mkinzler - Sa 05.08.06 15:01

Bei mir nicht
Delphi-Hilfe hat folgendes geschrieben:
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

[Edit es gibt 2 verschiedene Implementation von diese Funktion, wie Martok schon erwähnt hat, eine in Windows und eine in SysUtils. Es scheint so als ob Borland die 2. eingeführt hat, um das manuelle Casten nach PChar zu umgehen.


pascalsv - Sa 05.08.06 15:38

Hallo zusammen,

ist das kompliziert...

Ich habe das Problem gefunden. Es lag an meiner Definition von TSearchRec. Ich hatte diese Definition vor implementation eingefügt, aber das geht wohl nicht so...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
TSearchRec = record
  Time: Integer;
  Size: Integer;
  Attr: Integer;
  Name: TFileName;
  ExcludeAttr: Integer;
  FindHandle: THandle;
  FindData: TWin32FindData;
end;

implementation


Pascal


Delete - Sa 05.08.06 15:54

nicht getestet, aber schreib doch mal "faAnyFile - [faDirectory]", so weit ich mich erinnere ist dies eine mengenoperation, hab aber damit schon ewig nichts mehr gemacht.


mkinzler - Sa 05.08.06 15:58

user profile iconGrenzgaenger hat folgendes geschrieben:
nicht getestet, aber schreib doch mal "faAnyFile - [faDirectory]", so weit ich mich erinnere ist dies eine mengenoperation, hab aber damit schon ewig nichts mehr gemacht.
Nein es ist ein Integer und deshlab muß die muß man die Konstanten addieren addieren. Aber user profile iconpascalsv hat seinen Fehler ja jetzt gefunden ;-)


pascalsv - Sa 05.08.06 16:05

Hallo zusammen.

Vielen Dank für Eure Hilfe!! Da programmiert man für einige Jahre nicht und schon ist das alte Wissen weg... :roll:

Pascal