Procedure über mehrere Buttons starten

Hi Leute. Schon wieder eine Frage von mir.

Eine Procedure soll durch das klicken mehrerer Buttons gestartet werden. Zum Test hier ein kleiner Quellcode. Im Prinzio besteht das Form aus einem Memofeld und zwei Buttons. Beim Drücken eines der beiden Buttons soll eine eigene Procedure gestartet werden. Was mache ich falsch?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i:integer;

procedure Action(i:integer);

implementation

{$R *.dfm}

procedure Action(i:integer);
begin
Form1.Memo1.Lines.Add(InttoStr(i));
i:=i+1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Action;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Action;
end;

end.

Hallo,

eigentlich ist der Fehler offensichtlich. Ich denke, Dir machen die Gültigkeitsbereiche von Variablen noch etwas Probleme.

Du deklarierst die Variable i zweimal. Einmal unitweit

var 
 i: Integer;

(Das ist ganz schlecht, führt bei umfangreicheren Programmen zu schlecht lokalisierbaren Mehrdeutigkeiten.)

und einmal als Prozedurparameter

procedure Action(i:integer);

Die Variable i wird ausschließlich in der Prozedur benötigt. Also deklarier sie bitte auch nur dort.
Merke: Variablen immer so lokal wie möglich deklarieren.

Dein eigentlicher Fehler ist aber, dass Du die Prozedur Action ohne Integerparameter aufrufst, obwohl sie mit einem solchen Parameter deklariert wurde.

Gruß, Niels

Ergänzung
noch was:

Wenn 2 Knöpfe das gleiche Ereignis auslösen sollen, dann verknüpfe beide mit der gleichen Ereignisbehandlung. Das Ereignis Button1Click kann im Objektinspektor auch für Button2 verwendet werden. Dafür sind die Comboboxen da, die bei den Ereignissen stehen (da, wo Du normalerweise doppelklickst, um das Ereignis anzulegen). In der Combobox stehen alle Prozeduren, die zu dem Ereignis passen (die passende Parameter besitzen).

Wenn Du das so machst, brauchst Du nur eine Prozedur statt drei.

Gruß, Niels

Danke Niels. In der Tat ist der Aufbau und die Dekleration mein größtes Problem. Bin von Turbo Pascal umgestiegen. Das Programm läuft zwar jetzt, aber i wird nicht geschrieben. Hier die verbesserte Variante: Vielleicht kannst du die korrigieren?

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

procedure Action(i:integer);

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Action(i:integer);
begin
Form1.Memo1.Lines.Append(InttoStr(i));
i:=i+1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Action;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Action;
end;

end.

1 Like

Das hat sogar auf anhieb geklappt! Supertipp.
Aber wenn ich nicht Buttons habe sondern durch andere Objekte oder gar in anderen Procedures eine andere Procedure auslösen lassen möchte erscheint die meine erster Versuch als übersichtlicher.

1 Like

Hallo Klabauter,

sei mir nicht böse, aber vielleicht solltest Du Dich erst einmal hiermit befassen: http://de.wikibooks.org/wiki/Programmierkurs:_Delphi

Manfred

Das dürfte mir viele Fragen beantworten. Danke Manfred.

1 Like

Noch ein Tip
Hallo Klabauter,

auch wenn es so aussieht, aber deine Procedure Action wird nie aufgerufen. Klick mal mit gedrückter Strg Taste auf Action in der Procedure Button1Click, und Du wirst staunen und wissen, warum nix ins Memo geschrieben wird.

Deine Procedure Action erwartet ein Argument als Integer, welches Du nicht übergibst. Hier musst Du tatsächlich eine globale Variable erstellen.

Schreib mal ein TForm1 vor Action also:

procedure TForm1.Action(i:integer);
begin
 Form1.Memo1.Lines.Append(InttoStr(i));
 i:=i+1;
end;

(aber nicht bei der Deklaration weiter oben!)
dann erhälst Du Fehler.

Man sollte keine reservierten Wörter für Variablen, Funktionen und Procedures verwenden. Es gibt zwar manchmal keine Fehler (wie Du siehst), aber … (siehe oben)

Manfred