![]() |
Gemeinsame OnClick - Behandlung
Hi there,
Also, ich habe da min. zwei Gruppen von sagen wir mal, TButtons . BtnFirst1, BtnPrior1,BtnNext1... und BtnFirst2... Schön, natürlich könnte ich jetzt für jeden Button eine eigene OnClick-Routine schreiben, aber das artet ja aus, zumal BtnFirst1, BtnFirst2 etc. ja eigenlich das selbe tun. OK, ich kann über:
Delphi-Quellcode:
aber zB.
procedur NavBtnClick(Sender : TObject);
var name : String; id : Integer; begin name := (Sender AS TButton).name; id := name(length(name)); ...
Delphi-Quellcode:
erzeugt bei meinem Compiler höchstens ein hönisches Grinsen. :angle:
BtnFirst[id].enabled := True;
Ist das so überhaupt irgendwie machbar ? Thanks a lot Doc F Zitat:
|
Re: Gemeinsame OnClick - Behandlung
Ein Hallöle von
![]() also, es gibt verschiedene Möglichkeiten. Abfragen ob Sender ein bestimmtes Objekt ist:
Delphi-Quellcode:
Den Namen des Senders abfragen:
If Sender is Button1 Then ...
Delphi-Quellcode:
Der Eigenschaft TAG der verschiedenen Objekte verschiedene Werte zuweisen und diese abfragen:
If TButton(Sender).Name = 'Button1' Then ...
Delphi-Quellcode:
Direkt Sender was zuweisen:
Case TButton(Sender).Tag of
1: ... 2: ... ... End;
Delphi-Quellcode:
...
TButton(Sender).Enabled := True;
( "TButton(Sender)" und "(Sender as TButton)" kommt auf's Selbe raus ) http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Gemeinsame OnClick - Behandlung
Hallo,
wie Du schon an der Syntaxhervorhebung erkennen kannst, solltest Du lokale Variablen nie "name" nennen, das führt nur zu Verwechslungen mit TComponent.Name und dessen Nachfahren. Wenn Du allen Buttons den selben Eventhandler zuweist, kannst Du sie über die Eigenschaft "Tag" auseinanderhalten. Einfach für jeden Button einen anderen Tag einstellen.
Delphi-Quellcode:
mr2
procedure ButtonClick(Sender : TObject);
begin if (Sender is TButton) then begin case TButton(Sender).Tag of 1: ShowMessage('Erster Button!'); 2: ShowMessage('Zweiter Button!'); 3: ShowMessage('Dritter Button!'); 4: ShowMessage('Vierter Button!'); else ShowMessage('Anderer Button!'); end; end else ShowMessage('Kein Button!'); end; [edit]Da war mal wieder jemand schneller :lol: [/edit] |
Re: Gemeinsame OnClick - Behandlung
Wow, seid ihr aber schnell.
War nur gerade kurz was anderes am suchen, und schon... Ok, name war kein gutes Beispiel, zugegeben, aber 's ging ja eher ums Prinzip. Super, was die Buttons angeht, war ich ja doch ein wenig begriffsstutzig.
Delphi-Quellcode:
trifft's genau, autsch.
TButton(Sender).Enabled := True;
So weit, so gut. Wie aber nun, wenn nicht nur Buttons angesprochen werden müssen. Bin ich fies, wenn ich da auch noch zB. TTable reinmenge ? Ansonsten schon mal dankeschön, habt mir schon geholfen. Doc F Zitat:
|
Re: Gemeinsame OnClick - Behandlung
:oops: Ausverseh'n 'Edit' an statt 'Zitat'
(weiß aber nicht mehr genau was hier stand, dashalb nicht wundern) Vorher halt den Typ abfragen:
Delphi-Quellcode:
http://www.delphipraxis.net/images/common/divider.jpg
If Sender.ClassType = TButton Then Begin
TButton(Sender).Enabled := True; End Else If Sender.ClassType = TBitBtn Then Begin TBitBtn(Sender).Enabled := True; End Else If Sender.ClassType = TEdit Then Begin TEdit(Sender).Enabled := True; End Else If Sender.ClassType = TMemo Then Begin TMemo(Sender).Enabled := True; End; ![]() ![]() ![]() |
Re: Gemeinsame OnClick - Behandlung
Danke für die Hilfe,
Himitsu hat mich zum Schluss war falsch verstanden : Sender ist immer TButton, der diverse andere Sachen steuern soll. Trotzdem war die Lösung in euren Antworten enthalten. :love: Doc F |
Re: Gemeinsame OnClick - Behandlung
Moin,Moin
Zitat:
und führt im günstigesten Fall zu Schutzverletzungen, wenn die Annahme nicht stimmt. Hier ist alles erlaubt was dieselbe Grösse hat. d.h.
Delphi-Quellcode:
wird anstandlos kompiliert !
TButton(4).Caption := 'Bumm';
(Sender as TButton) ist dagegen ein sicherer Typecast und erzeugt eine Exception EInvalidCast, wenn die Annahme mal falsch war, weil man das Ereignis mal woanders angeklemmt hat. Ergo TButton(Sender) nur verwenden, wenn zumindest vorher mit is geprüft wurde (BTW is ist besser als xxx.ClassType= yyy, auch wenn es minimal anders arbeitet). Die Spagetti-if-else Geschichte :
Delphi-Quellcode:
kann man deutlich kürzen, wenn man sich auf den kleinsten gemeinsamen
If Sender.ClassType = TButton Then Begin
TButton(Sender).Enabled := True; End Else If Sender.ClassType = TBitBtn Then Begin TBitBtn(Sender).Enabled := True; End Else If Sender.ClassType = TEdit Then Begin TEdit(Sender).Enabled := True; End Else If Sender.ClassType = TMemo Then Begin TMemo(Sender).Enabled := True; End; Nenner der Klassen/Eigenschaften besinnt ( in diesem Fall TControl) und mit is statt ClassType arbeitet.
Delphi-Quellcode:
if Sender is TControl then
TControl(Sender).Enabled := false; else ... SCNR , Bernd |
Re: Gemeinsame OnClick - Behandlung
Das mit dem BOOM: Dafür ist natürlich der Programierer verantwortlich. (Wenn es knallt, ist er/sie halt selber Schuld)
OK, für Enabled ist das schon etwas übertrieben, aber bei Komponententypischen Eigenschaften (z.B.
Delphi-Quellcode:
) ist mit TControl(Sender).Caption nichts mehr los.
If Sender.ClassType = TButton Then Begin
TButton(Sender).Caption := 'Text'; ... http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Gemeinsame OnClick - Behandlung
Zitat:
bei selbstgeschriebenen Klassen mit Interfaces, für die "dreckige Lösung" mit RTTI und für den OO-Entwickler mit einem Visitor, lässt sich das Problem ohne n Fallunterscheidungen (die mit der Wahrscheinlichkeit p immer 0<m<=n Fehlerhaben, bei denen die Übersicht gegen 1/n^2 strebt und die Wartbeikeit bei n! liegt ;)) lösen. |
Re: Gemeinsame OnClick - Behandlung
2 mal Einspruch
Zitat:
Da ist für mich der Unterschied zwischen "rumcoden" und programmieren Zitat:
Mit dem man (TControl/TwinControl) im übrigen schon ne ganze Menge reissen kann. Mit Caption get es übrigens auch - zumindest wenn man zugegebenermassen etwas unsauber in den protected Bereich einbricht
Delphi-Quellcode:
type
TControlCracker = class(TControl); procedure TForm1.Button1Click(Sender: TObject); begin if Sender is TControl then TControlCracker(Sender).Caption := 'Geht nich - gibbs nich' else ShowMessage(sender.Classname); end; Bernd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz