Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Button herausfinden (https://www.delphipraxis.net/147214-button-herausfinden.html)

-Phantom- 3. Feb 2010 22:40


Button herausfinden
 
Ich bins mal wieder und mein nächstes Problem ist da.

Zum Problem: Durch mehere Buttons wird ein und die selbe Form gezeigt. Wie finde ich nun herauswelcher Button geklickt wurde?

jsheyer 3. Feb 2010 22:50

Re: Button herausfinden
 
Hallo Phantom,

durch sender: TObject im OnClick Event des Buttons, also z. B.


Delphi-Quellcode:
with sender as TButton do
begin
    ShowMessage(Caption);
end;
Anstatt Caption kann natürlich auch Name (Name des Buttons) verwenden.
TButton wäre der Standard Button von Delphi, z. B. der BitBtn dann ist es TBitBtn.


Gruß

Jörg

Astat 3. Feb 2010 22:52

Re: Button herausfinden
 
Zitat:

Zitat von -Phantom-
..Durch mehere Buttons wird ein und die selbe Form gezeigt. Wie finde ich nun herauswelcher Button geklickt wurde?

Hallo Phantom, versuch mal dass.

Delphi-Quellcode:

procedure TForm1.FormShow(Sender: TObject);
begin
  if (Sender is TButton) then
    showmessage((Sender as TButton).Name);
end;
EDIT: zu spät :drunken:

lg. Astat

-Phantom- 3. Feb 2010 23:16

Re: Button herausfinden
 
Danke euch beiden ...

Klappt wunderbar :spin2:

Codewalker 4. Feb 2010 07:56

Re: Button herausfinden
 
Wenn du je nach Button noch unterschiedliche Aktionen durchführen möchtest, kannst du auch die Tag-Eigenschaft der Buttons nutzen. Du gibst jedem Button in der Eigenschaft Tag eine andere Zahl (die kann man nämlich einfach per case unterscheiden). Das erste Assert stellt sicher, dass man nichs vergißt, wenn man einen Button nachträglich hinzufügt. Das zweite Assert ist Geschmackssache ob man es braucht, aber es hilft beim Entwickeln schon (jedenfalls mir :mrgreen: )

Delphi-Quellcode:
 if (Sender is TButton) then
   case (Sender as TButton).Tag of
    1: ShowMessage('Button 1 wurde geklickt');
    2:;
    3: Beep;
    4: Application.Terminate;
    else Assert(False,'Unbekannter Tag. Evtl. eine Änderung vergessen?');
   end else Assert(False,'Sender ist kein Button!');

uligerhardt 4. Feb 2010 08:51

Re: Button herausfinden
 
Zitat:

Zitat von Astat
Delphi-Quellcode:
  if (Sender is TButton) then
  showmessage((Sender as TButton).Name);

Aua. Wenn du mit "is" den Typ von Sender schon geprüft hast, musst du beim Casten nicht noch mal prüfen. Folgendes reicht vollkommen:
Delphi-Quellcode:
  if Sender is TButton then
  ShowMessage(TButton(Sender).Name);

Codewalker 4. Feb 2010 08:54

Re: Button herausfinden
 
Zitat:

Zitat von uligerhardt
Zitat:

Zitat von Astat
Delphi-Quellcode:
  if (Sender is TButton) then
  showmessage((Sender as TButton).Name);

reicht vollkommen:
Delphi-Quellcode:
  if Sender is TButton then
  ShowMessage(TButton(Sender).Name);

Wo ist denn da der Unterschied. Einmal mit "is" prüfen und dann casten. Ist es denn ein Unterschied ob ich mit TButton(Sender).Name caste oder mit "as" (Sender as TButton).Name ? Ist ja keine doppelte Überprüfung

Micha88 4. Feb 2010 08:59

Re: Button herausfinden
 
Kleine Frage:

Delphi-Quellcode:
case (Sender as TButton).Tag of
oder besser
Delphi-Quellcode:
case TButton(Sender).Tag of
:roll: :?:

himitsu 4. Feb 2010 09:04

Re: Button herausfinden
 
IS ist 'ne Funktion, welche den Typ prüft und gibt einen Boolean mit dem Ergebnis zurück.
AS ist 'ne Prozedur, welche ebenfalls prüft, aber diese lößt bei Nichtübereinstimmung eine Exception aus.

Also AS nach erfolgreichem IS ist eine unnötige Prüfung.

uligerhardt 4. Feb 2010 09:05

Re: Button herausfinden
 
Zitat:

Zitat von Codewalker
Wo ist denn da der Unterschied. Einmal mit "is" prüfen und dann casten. Ist es denn ein Unterschied ob ich mit TButton(Sender).Name caste oder mit "as" (Sender as TButton).Name ? Ist ja keine doppelte Überprüfung

Und ob.
Delphi-Quellcode:
s := (Sender as TButton).Name;
entspricht etwa
Delphi-Quellcode:
if Sender is TButton then
  s := TButton(Sender).Name
else
  raise EInvalidCast.Create;
- siehe _AsClass in Unit System. D.h. für "as" muss tatsächlich zur Laufzeit Code ausgeführt werden, während der "harte" Cast nur zur Beruhigung des Compilers dient, aber zur Laufzeit keine Auswirkungen mehr hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz