Ich löse mit Button1, Button2 und Button3 bei einem Click das Ereignis „procedure TForm1.Button1(Sender: Tobject)“ auf. Ich weiss nicht wirklich wie ich mit dem Parameter „Sender“ hantieren kann.
Kann ich den gedrückten Button aus dem „Sender“ ausfindig machen?
Kann ich den Gedrücken Button einer Variable zuweisen, zB. „x“ die „x: TButton;“ deklariert wurde, zuweisen?
Oder kann ich sonst auf die Eigenschaften von geklickten Button zugreifen, wie Visible, Color, etc.?
(Sender as TButton).Name gibt den Namen des Buttons
zurück.
Geht leider nicht
denn Borland Studio ,meine Entwicklungsumgebung, gibt die Form von der ButtonClick-Methode vor…
und die ist: procedure TForm1.Button1Click(Sender: TObject)
(Sender as TButton).Name gibt den Namen des Buttons
zurück.
Geht leider nicht
Doch, geht.
denn Borland Studio ,meine Entwicklungsumgebung, gibt die Form
von der ButtonClick-Methode vor…
und die ist: procedure TForm1.Button1Click(Sender: TObject)
Im Object Inspector kannst Du unter Events für einen zweiten Button die onClick Procedure des ersten Buttons auswählen.
Und dann:
procedure TForm1.Button1Click(Sender: TObject
begin
if (Sender as TButton).Name = 'Button1' Then
begin
// mach was
end
else if (Sender as TButton).Name = 'Button2' Then
begin
// mach was anderes
end;
end;
noch ein kleiner Zusatz von mir. Schreibarbeit spart man wenn
man
(Sender as TButton).
durch
TButton(Sender).
ersetzt. Macht genau das selbe.
Hallo,
tut es nicht, jedenfalls nicht nach der Definition: bei „as“ wird geprüft, ob Sender auch wirklich TButton ist, sonst wird eine Exception auf den Tisch des Hauses geworfen - man weiss also Bescheid und kann den Fall auch behandeln. Bei einem einfachen TypeCast stürzt je nachdem das Programm einfach ab (es sei denn, der Compiler fügt hinterrücks eine solche Prüfung ein, aber davon habe ich noch nichts gehört oder gelesen).
Ich habe jetzt selber noch ein Link gefunden der einige schöne Beispiel fpr den Umgang mit den Komponenten hat.
Hier: http://www.dsdt.info/tipps/?kat=21
procedure TForm1.Button1Click(Sender: TObject
begin
if (Sender as TButton).Name = ‚Button1‘ Then
begin
// mach was
end
else if (Sender as TButton).Name = ‚Button2‘ Then
begin
// mach was anderes
end;
end;
Das funktioniert, aber trotzdem noch eine Variante für alle, die es gerne so einfach wie möglich machen:
procedure TForm1.Button1Click(Sender: TObject
begin
if (Sender=Button1) Then
begin
// mach was
end
else if (Sender=Button2) Then
begin
// mach was anderes
end;
end;
das hat nichts mit Schreibarbeit sparen zu tun und macht eben nicht das selbe.
(Sender as TButton).
ist ein so genannter „weicher“ Cast,
TButton(Sender).
ein „harter“.
Beim „weichen“ Cast wird vorher überprüft ob der Sender wirklich vom Typ TButton ist und wenn nicht, eine entsprechende Exception ausgelöst.
Beim „harten“ Cast wird dem Sender quasi der Typ TButton aufgedrückt.
Wäre aber Sender in diesem Fall nicht vom Typ TButton dann würde es zu Schutzverletzungen kommen.
Gruß
Frank
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]