Variable an Prozedur übergeben

Hallo,

unzwar habe ich folgendes Problem.

Ich habe eine Prozedur OnClick eines Buttons.

Nun wird in dieser Prozedur einer Variable „eins“ ein Wert zugewiesen bzw. errechnet. Die Variable möchte ich nun an eine weitere Prozedur OnClick eines Buttons übergeben.

Allerdings habe ich keine Ahnung, wie das gehen soll.

Ich bitte um Hilfe.

mfG

Thomas

Hallo,

Die OnClick-Methode ist eine einfache Notifikations-Methode und hat dementsprechend einen Parameter („Sender“ vom Typ TObject).

Diesen Parameter mußt Du verwenden, um deine Information zu übergeben. dazu gibt es zwei Möglichkeiten, die mir spontan einfallen:

Sei X der Name deiner Integer-Variablen, errechnet in der Methode .Button1Click. Aus dieser methode heraus willst Du die Methode .Button2Click aufrufen, die dann den Wert von X benutzen soll.

  1. Typecasting:

in .Button1Click rufst du auf: Button2Click(TObject(X));
in Button2Click greifst du auf den übergebenen Integerwert zurück mit X := Integer(Sender);

  1. Übergabe als Teil eines Objekts:

Statt einer lokalen Variablen (X) in der Methode .Button1Click verwendest Du ein Feld eines Objekts. Wenn Du das Objekt dann übergibst, kann der Empfänger (.Button2Click) auf das Feld zugreifen. Dazu muss dort aber auch der Typ angegeben werden.

Tipp: Wenn es um einen Interegrwert geht, kann man die Eigenschaft „Tag“ von Komponenten gut dazu „missbrauchen“. Dann braucht man auch keinen speizelolen Typ zu deklarieren. Also: In .Button1Clck wird X ausgerechnet und der Eigenschaft Tag des Buttons zugewiesen:

Button1.Tag := x;

Dann wird der Button als Sender-Objekt übergeben:

Button2Click(Button1);

und der Empfänger liegt Tag wieder aus:

x := TComponent(Sender).Tag;

Das klappt natürlich nur, wenn das Tag-Feld nicht schon anderweitig benutzt wird.

LG
Jochen

Erstmal vielen Dank für deine Antwort.

Den Tipp mit der Tag-Eigenschaft fand ich richtig genial. :wink:
Da war ich garnicht drauf gekommen.^^

1.) und 2.) verstehe ich leider nicht 100%.^^ Sry

Vll kannst du sie nocheinmal erläutern!? :smile:

Das mit dem Tag allerdings, werde ich direkt mal ausprobieren.

mfG

Thomas

Neues Problem^^
Hallo,

kann ich irgendwie ermitteln lassen, wie oft der Button gedrückt wurde?

Zu 1)

Die OnClick-Methode hat doch einen Parameter, der da heißt „Sender“. Da kannst du -normalerweise- eine Referenz auf ein TObjekt übergeben. Nun möchtest du aber einen Integerwert übergeben und kein TObject. Das kann man machen, allerdingt meckert Delphi dann, weil es ein TObject erwartet aber ein Integer bekommt. Mit

TObject(X)

gibst Du Delphi vor, es handele sich bei der Variablen X um ein TObject. Sowas nennt man type casting.

Zu 2)

Du könntest irgendein Objekt haben, meinetwegen ein Form oder ein selbst erstelltes Objekt, für irgendwas - ist egal. Diesem Objekt kannst du ein Feld spendieren, welches deinen interegewert aufnimmt, und dann kannst Du das via „Sender“ an die OnClick-Methode übergeben.

LG
jochen

Indem du mitzählst.

Du brauchst eine Zählvariable, die Du jedesmal inkrementierst, wenn der Button geklickt wurde.

LG
jochen

Ich habe, bevor ich deinen Post gelesen habe, mal folgendes probiert, was eig. genau das ist, was du meinst.

var kon : integer; // kon ist die Kontrollvariable
begin
kon := kon +1;
if (kon = 3) then (btn_wuerfel.Enabled := False);

end;

Nun wäre das Problem, dass kon bereits > 3 sein kann.
Aber was anderes fällt mir jetzt gerade nicht ein.
Und wenn ich kon am Anfang auf 0 setze, so wird kon immer am Anfang auf 0 gesetzt, wodurch die Zeilen sinnlos werden würden.

var kon : integer; // kon ist die Kontrollvariable
begin
kon := kon +1;
if (kon = 3) then (btn_wuerfel.Enabled := False);

end;

Dieser Code-Ausschnitt ist doch aus einer Methode, und diese Methode gehört doch zu einem Objekt (wohl zu einem TForm-Objekt). Deklariere die Variable doch in diesem TForm-Objekt. Sie wird dannbei Erstellung des Objektes automatisch mit Null initialisiert. In der Methode kannst Du dann genau wie Du’s gemacht hast, auf diese Variable zugreifen, nur musst Du die lokale Deklaration löschen.

type
 TForm1 = class(TForm)
 [...]
 kon: Integer;
 [...]
 procedure BtnClick(Sender:TObject);
 [...]
 end;

[...]

procedure TForm1.BtnClick(Sender:TObject);
begin
 inc(kon);
 if (kon = 3) then (btn\_wuerfel.Enabled := False);
 [...]
end;

LG
Jochen

Hallo,

bevor Du das TObject zu diesem Zweck vergewaltigst (es dient eigentlich zu was anderem, s.u.), deklarier lieber innerhalb der Form eine private Variable die den Integer-Wert aufnimmt und natürlich beiden Routinen bekannt ist.

Wenn du aber unbedingt über Parameter arbeiten willst, wäre noch empfehlenswert, den Code, der die Variable benötigt, auszulagern in eine eigene private Funktion. Die rufst Du dann an entsprechender Stelle in den Ereignisroutinen der TButtons auf.

Oder Du weist beiden Buttons die gleiche Ereignisbehandlungsroutine zu, da sie ja scheinbar Teile des Codes gemeinsam haben. Innerhalb der Routine fragst Du dann ab, welcher Knopf gedrückt wurde:

if Sender = Button1 then begin
 ... //Code für Button1
end
else begin
 ... //Code für Button2
end;
... //gemeinsamer Code

Das TObject für die Übergabe eines Integers zu verwenden ist die denkbar schlechteste Lösung. Auf diese Weise produziert man unleserlichen, unverständlichen Code. Wenn Du das machen willst, solltest Du sowieso besser C/C++ verwenden :smile:

Gruß, Niels