Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

Hallo,

ich bin gerade dabei mir Free Pascal -mit Lazarus- anzueignen und stehe schon vor meinem ersten Problem, das ich mit Logik und googeln nicht mehr lösen kann :(

ich bekomme folgende fehlermeldungen beim compilieren:

Hint: Start of reading config file C:\programs\lazarus\fpc\2.4.4\bin\i386-win32\fpc.cfg
Hint: End of reading config file C:\programs\lazarus\fpc\2.4.4\bin\i386-win32\fpc.cfg
Free Pascal Compiler version 2.4.4 [2011/10/24] for i386
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Win32 for i386
Compiling test_1.lpr
Compiling test.pas
test.pas(39,68) Error: Wrong number of parameters specified for call to "GetFilesInDirectory"
test.pas(24,17) Hint: Found declaration: TForm1.GetFilesInDirectory;
test.pas(88, stopping

der code ist folgender:

Code: Alles auswählen

unit test;
 
//{$mode objfpc}{$H+}
{$mode delphi}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
      procedure GetFilesInDirectory;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox.Clear;
 GetFilesInDirectory('T:\MTX\Log\', '*.log', ListBox.Items, False, False); //diese Zeile wird "angemeckert"
end;
 
procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);
 
procedure ScanDir(const Directory: string);
 var
   SR: TSearchRec;
 begin
   if FindFirstUTF8(Directory + Mask, faAnyFile and not faDirectory, SR) { *Converted from FindFirst*  } = 0 then try
     repeat
       List.Add(Directory + SR.Name)
     until FindNextUTF8(SR) { *Converted from FindNext*  } <> 0;
   finally
     FindCloseUTF8(SR); { *Converted from FindClose*  }
   end;
 
  if WithSubDirs then begin
     if FindFirstUTF8(Directory + '
*.*', faAnyFile, SR) { *Converted from FindFirst*  } = 0 then try
       repeat
         if ((SR.attr and faDirectory) = faDirectory) and
            (SR.Name <> '
.') and (SR.Name <> '..') then
           ScanDir(Directory + SR.Name + '
\');
       until FindNextUTF8(SR) { *Converted from FindNext*  } <> 0;
     finally
       FindCloseUTF8(SR); { *Converted from FindClose*  }
     end;
   end;
 end;
 
begin
   List.BeginUpdate;
   try
     if ClearList then
        List.Clear;
     if Directory = '
' then Exit;
     if Directory[Length(Directory)] <> '
\' then
       Directory := Directory + '
\';
     ScanDir(Directory);
   finally
     List.EndUpdate;
   end;
 end;
 
end.


Kann mir jemand den Fehler aufzeigen und ihn erklären??

Danke

mtbf40
Zuletzt geändert von mtbf40 am Do 10. Nov 2011, 15:18, insgesamt 2-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..."

Beitrag von mse »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox.Clear;
 GetFilesInDirectory('T:\MTX\Log', '*.log', ListBox.Items, False, False); //diese Zeile wird "angemeckert"

sucht zuerst in TForm1 und findet

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
    ListBox: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
      procedure GetFilesInDirectory;


Code: Alles auswählen

procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

ist nicht sichtbar.

Martin

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Compiler Fehler"Wrong Numbers..."

Beitrag von Socke »

Entweder du benennst die Methode in deinem Formular um, oder du sagst dem Compiler explizit, welche er aufrufen soll:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox.Clear;
 //einfach den Unit-Namen davor setzen
 FileUtil.GetFilesInDirectory('T:\MTX\Log', '*.log', ListBox.Items, False, False);
 // ...

Edit: Ich bin mir nicht sicher, ob FileUtil die richtige Unit ist.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..."

Beitrag von mtbf40 »

danke für Eure schnelle Hilfe... :D

habe jetzt folgende Änderungen gemacht

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
    ListBox: TListBox;
    procedure Button1Click(Sender: TObject);
>>    procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);<<


Code: Alles auswählen

procedure >>TForm1.<<GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);


1. an welcher Meldung kann man denn erkennen das eine Prozedur nicht bekannt ist?
... an dieser? >>test.pas(24,17) Hint: Found declaration: TForm1.GetFilesInDirectory;<<

2. liege ich da richtig mit folgenden Gedanken:
- die Variable TForm1 enhält die Klasse TForm und zusätzlich den Button, die Listbox und die beiden Prozeduren
- in der Prozedur GetFilesInDirectory kann ich jetzt auf die Objekte und Methoden der Klasse TForm zurückgreifen
- weil die Prozedur GetFilesInDirectory Teil von TForm1 ist, heißt sie zwangsläufig auch TForm1.GetFilesInDirectory

3. Wie hätte ich denn die Prozedur GetFilesInDirectory außerhalb von TForm1 aufrufen bzw. bekannt machen müssen?

mtbf40

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..."

Beitrag von mse »

mtbf40 hat geschrieben:1. an welcher Meldung kann man denn erkennen das eine Prozedur nicht bekannt ist?
... an dieser? >>test.pas(24,17) Hint: Found declaration: TForm1.GetFilesInDirectory;<<

Hmm, naja. Die Meldung ist ein Hinweis auf andere in Frage kommende Prozeduren.
2. liege ich da richtig mit folgenden Gedanken:
- die Variable TForm1 enhält die Klasse TForm und zusätzlich den Button, die Listbox und die beiden Prozeduren
- in der Prozedur GetFilesInDirectory kann ich jetzt auf die Objekte und Methoden der Klasse TForm zurückgreifen
- weil die Prozedur GetFilesInDirectory Teil von TForm1 ist, heißt sie zwangsläufig auch TForm1.GetFilesInDirectory

Ja.
3. Wie hätte ich denn die Prozedur GetFilesInDirectory außerhalb von TForm1 aufrufen bzw. bekannt machen müssen?

Code: Alles auswählen

unit test;
 
//{$mode objfpc}{$H+}
{$mode delphi}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
//      procedure GetFilesInDirectory; braucht es nicht
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);
 
procedure ScanDir(const Directory: string);
 var
   SR: TSearchRec;
 begin
   if FindFirstUTF8(Directory + Mask, faAnyFile and not faDirectory, SR) { *Converted from FindFirst*  } = 0 then try
     repeat
       List.Add(Directory + SR.Name)
     until FindNextUTF8(SR) { *Converted from FindNext*  } <> 0;
   finally
     FindCloseUTF8(SR); { *Converted from FindClose*  }
   end;
 
  if WithSubDirs then begin
     if FindFirstUTF8(Directory + '*.*', faAnyFile, SR) { *Converted from FindFirst*  } = 0 then try
       repeat
         if ((SR.attr and faDirectory) = faDirectory) and
            (SR.Name <> '.') and (SR.Name <> '..') then
           ScanDir(Directory + SR.Name + '\');
       until FindNextUTF8(SR) { *Converted from FindNext*  } <> 0;
     finally
       FindCloseUTF8(SR); { *Converted from FindClose*  }
     end;
   end;
 end;
 
begin
   List.BeginUpdate;
   try
     if ClearList then
        List.Clear;
     if Directory = '
' then Exit;
     if Directory[Length(Directory)] <> '
\' then
       Directory := Directory + '
\';
     ScanDir(Directory);
   finally
     List.EndUpdate;
   end;
 end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox.Clear;
 GetFilesInDirectory('
T:\MTX\Log', '*.log', ListBox.Items, False, False); //diese Zeile wird "angemeckert"
                                 //GetFilesInDirectory ist nun sichtbar da oberhalb definiert
end;
 
end.

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mtbf40 »

im unten stehenden Code möchte ich noch das Objekt GroupBox1 mit an die Prozerdur übergeben - der Compiler meckert aber rum!!??

Code: Alles auswählen

procedure TForm1.Scan_File(Sender: TObject);
begin
  GetFilesInDirectory('T:\MTX\Log',
           'log*.txt',
           ListBox1.Items,
           <GroupBox1,>
           False);
end;


was ich machen möchte ist folgendes:
die GroupBox hat eine Beschriftung (Caption) - diese möchte ich, nachdem die richtige Datei ausgewählt wurde, mit diesem Namen beschriften.
Was muss da mitgeben? GroupBox1.Caption oder ????

Gruß mtbf40

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mse »

mtbf40 hat geschrieben:im unten stehenden Code möchte ich noch das Objekt GroupBox1 mit an die Prozerdur übergeben - der Compiler meckert aber rum!!??

Was meckert er denn?

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mtbf40 »

Fehlermeldung:
swt_1.pas(67,31) Hint: Value parameter "GrpBox1" is assigned but never used

ich habe jetzt folgenden Konstrukt:

Code: Alles auswählen

procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                             GrpBox1: TCaption;
                             ClearList: Boolean);
                       .
                       .
                       .
       GrpBox1:=Directory + filename;

der nimmt GroupBox1 als normale Variable!!! ich will aber die Beschriftung ändern :evil:

Code: Alles auswählen

procedure TForm1.Scan_File(Sender: TObject);
begin
    GetFilesInDirectory('T:\MTX\Log',
    'log*.txt',
    ListBox1.Items,
   <GroupBox1.Caption,>
   False);
end;

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mse »

mtbf40 hat geschrieben:Fehlermeldung:
swt_1.pas(67,31) Hint: Value parameter "GrpBox1" is assigned but never used

Das ist keine Fehlermeldung, sondern ein Hinweis, dass der Parameter GrpBox1 verändert wurde und dass der veränderte Wert nicht verwendet wird.
ich habe jetzt folgenden Konstrukt:

Code: Alles auswählen

procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                             GrpBox1: TCaption;
                             ClearList: Boolean);
                       .
                       .
                       .
       GrpBox1:=Directory + filename;

der nimmt GroupBox1 als normale Variable!!! ich will aber die Beschriftung ändern

Das heisst, du möchtest über den Prozedurparameter GrpBox1 den Dateipfad ausgeben?

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mtbf40 »

nein ... das Widget GroupBox hat doch eine Beschriftung (Caption), das will ich im Nachgang ändern - es gibt eine initiale Beschriftung die später geändert werden soll - d.h. es geht hier um ein Widget...

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mse »

Du musst systematisch vorgehen und analysieren, was du dem Compiler in Auftrag gegeben hast.
Vermutlich möchtest du etwa das da:

Code: Alles auswählen

procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                             const aGrpBox: TGroupbox;
                             ClearList: Boolean);
                       .
                       .
                       .
       aGrpBox.caption:= Directory + filename;
 
procedure TForm1.Scan_File(Sender: TObject);
begin
    GetFilesInDirectory('T:\MTX\Log',
    'log*.txt',
    ListBox1.Items,
   GroupBox1,
   False);
end;

[rant]
Mein ..., wie ich diese verdammten Webforen hasse, warum benutzt heutzutage praktisch niemend mehr NNTP?
NNTP ist in der Bequemlichkeit wie Tag und Nacht verglichen mit Webforen...
[/rant]

Martin
Zuletzt geändert von mse am Di 8. Nov 2011, 19:28, insgesamt 1-mal geändert.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von creed steiger »

mse hat geschrieben:[rant]
Mein Gott, wie ich diese verdammten Webforen hasse, warum benutzt heutzutage praktisch niemend mehr NNTP?
NNTP ist in der Bequemlichkeit wie Tag und Nacht verglichen mit Webforen...
[/rant]

Martin

OT:
Kommt immer drauf an für was man´s nutzt. :)
Ich finde Webforen teilweise angenehmer zu lesen.
NNTP ist halt praktischer um einem Thema zu folgen

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

nächstes Hindernis... ich poste nur Hindernisse die ich seit Stunden oder Tagen nicht gelöst bekomme!!

die Procedure SplitRegExpr (const ARegExpr, AInputStr : string; APieces : TStrings); von TRegExpr erwartet ja die entsprechenden Parameter
wie splittet er mir folgendes:

Code: Alles auswählen

procedure Split (const Delemiter: char);
var
    tmp: string;
begin
    st := TStringList.Create;
     try st.Delimiter:=Delemiter;
       st.DelimitedText:=AStringList[n];
      if st.Count < 8 then Exit;
      if ExecRegExpr('LOT=\WZA.+?\W',st[3]) and ExecRegExpr('HOLD=\W\W',st[8]) then
             begin
                WriteLn('1> ', st[3]);
                WriteLn('2> ', st[8]);
           tmp := SplitRegExpr('\W',st[3],'=');
                 WriteLn('4> ',tmp);
           end;
    finally
       st.Free;
    end;
end;


in st[3] seht drin -> LOT="ZA149062"
rauskommen soll das (in Variable tmp-später in Spin-Widget) -> ZA149062

Fehlermeldung:

Code: Alles auswählen

test_prozess.lpr(29,46) Error: Incompatible type for arg no. 3: Got "Char", expected "TStrings"


mtbf40

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mse »

Na dann schau mal in die Datei test_prozess.lpr Zeile 29, Spalte 46, was steht denn da?

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

ja er bekommt ein char und erwartet ein TStrings...

ich hatte auch schon mal eine TStrings angelegt - bin aber auch nicht weiter gekommen... :cry:

Code: Alles auswählen

sign: TStrings;
   .
sign.Add('=');
   .
   .
tmp := SplitRegExpr('\W',st[3],sign[0]);

Antworten