Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Beitrag von idefix »

Hallo!

Ich habe mehrere Proceduren, die im Prinzip dasselbe machen (bis auf die letzten 4 Zeilen). Warum also nicht eine Procedur Berechnung erstellen?

Ich bin nicht so fit in Pascal. Ich habe gerade versucht, mittels Einzelschrittmodus (F7 und F8) Beispiele aus zwei Tuts zu verstehen. Das klappt auch.

Was nicht klappt, ist das übertragen der Aufrufe auf meinen Code.

Code: Alles auswählen

procedure berechnung(var a,b : Integer; xschalter : Boolean; c : Real);
begin
  xschalter := false;
  if not (TryStrToInt(Edit1.Text,a)) then
  begin
    Label2.Caption:= Edit1.Text + ' ist keine Zahl';
    Label1.Caption:= '';
    xschalter := true;
  end;
  if not (TryStrToInt(Edit2.Text,b)) then
  begin
    Label3.Caption:= Edit2.Text + ' ist keine Zahl';
    Label1.Caption:= '';
    xschalter := true;
  end;
end; 
 
procedure TForm1.addierenClick(Sender: TObject);
var
  a,b : integer;
  xschalter : boolean;
  c : real;
begin
  berechnung(a,b,xschalter,c);
  if b <> 0 then
    if xschalter = false then
    begin
      c := a / b;
      Label1.Caption:= FloatToStr(c)
    end;
end;
Der Debugger sagt hier:

Code: Alles auswählen

Error: Identifiernot found "Edit1"

(Edit, Label. Edit) Und so weiter.

Gebe ich hier ein TForm1. in den Procedurenkopf:

Code: Alles auswählen

procedure TForm1.berechnung(var a,b : Integer; xschalter : Boolean; c : Real);
bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Error: function header does not match any method of this class "TForm1.berechnung(var LongInt, var LongInt, Boolean, Real);"
Wo liegt der Fehler?

Danke!


Gruß!
idefix

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Beitrag von Socke »

Du musst Methoden (so heißen Funktionen und Prozeduren, die zu einer Klasse gehören) auch in der Klassen-Definition aufnehmen. Ansonsten gehören die Funktionen nicht zu dem Formular und haben damit auch keinen Zugriff auf die Objekte auf deinem Formular.

Code: Alles auswählen

type
  TForm1 = class(TForm)
  // eine Liste aller Komponenten, die du auf deinem Formular hast
  // danach kommt eine Liste mit allen Methoden, die bei Klicks und so weiter reagieren
  // unter anderem auch:
  procedure addierenClick(Sender: TObject);
  // und hier trägst du deine Methode berechung() ein:
  procedure berechnung(var a,b: Integer; xschalter: Boolean; c: Real);
  // vielleicht kommt noch was, oder auch nicht.
  end;
 
implementation
// ...
 
// der Methoden-Kopf ist so richtig
procedure TForm1.berechnung(var a,b : Integer; xschalter : Boolean; c : Real);
// dein Code
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Beitrag von idefix »

Hallo!

Hat geklappt!

Ich hatte auch oben die Procedure eingetragen. Allerdings ohne (var a,b,c: Real; var xschalter: Boolean);
Alle anderen Proceduren sehen so aus:

Code: Alles auswählen

procedure subtrahierenClick(Sender: TObject);
Ich hatte ja auch noch mit der "TForm1" vor der Procedure zu kämpfen.
Allerdings war dann schnell klar, dass der Debugger die Edit's nur mit "TForm1" erkennt.

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm) 
    procedure subtrahierenClick(Sender: TObject);
    procedure berechnung(var a,b,c: Real; var xschalter: Boolean);
 
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{$R *.lfm}   
 
procedure TForm1.berechnung(var a,b,c : Real; var xschalter : Boolean);
begin
 
end;
 
procedure TForm1.addierenClick(Sender: TObject);
var
  a,b,c : Real;
  xschalter : boolean;
begin
  berechnung(a,b,c,xschalter);
end;
So sieht es dann richtig aus!

Danke!

Gruß!
idefix

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Beitrag von MAC »

Du kannst die Procedur entweder als Globale Procedure Deklarieren oder als Procedure der Klasse TForm1;
Wenn du sie als Procedure von TForm1 Deklarierst, dann kannst auf die Werte in den Edits zugreifen.

Bei Einer Globalen Funktion, bei der kein TForm1. oder ähnlisches davor steht, ist es nicht möglich direkt auf z.B. Edit1 zuzugreifen.
Denn Edit1 ist nicht global definiert, es steht in TForm1 , als teil einer Klasse Deklariert.
Trotzdem kannst du auch darauf zugreifen indem du bei deinem Quellcode ein Form1 vor jedes Element von Form1 gestellt hättest
z.b (da Form1 global definiert ist...)

Code: Alles auswählen

Form1.Edit1.Text
Form1.Label2.Caption
Deine jetzige Lösung ist richtig, ich wollte es nur einmal erwähnt haben.

Code: Alles auswählen

Signatur := nil;

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Aufruf einer Procedur klappt nicht. Übergabe der Variablen?

Beitrag von idefix »

Halo!
MAC hat geschrieben: Trotzdem kannst du auch darauf zugreifen indem du bei deinem Quellcode ein Form1 vor jedes Element von Form1 gestellt hättest
z.b (da Form1 global definiert ist...)

Code: Alles auswählen

Form1.Edit1.Text
Form1.Label2.Caption
Deine jetzige Lösung ist richtig, ich wollte es nur einmal erwähnt haben.
Immer man zu.
Mehr Input, mehr Input!

Danke!

Gruß!
idefix

Antworten