Entwickler-Ecke
Sonstiges (Delphi) - TPanel(Sender) = TLabel(Sender)?
galagher - Mo 06.06.16 20:29
Titel: TPanel(Sender) = TLabel(Sender)?
Hallo!
Ich habe ein Panel auf dem ein Label liegt. Beiden ist die Prozedur MouseEnter des Panels zugeordnet.
Folgender Code funktioniert auch, wenn man statt des Panels das Label benutzt:
Delphi-Quelltext
1: 2:
| Panel1.Tag := TPanel(Sender).Tag; Caption := TPanel(Sender).Name; |
Da das anstandslos funktioniert, ist das wohl normal so. Jedenfalls war ich überrascht, ich wusste das nicht!
Nersgatt - Mo 06.06.16 22:08
Uiuiui, das ist aber gefährlich...
Nimm lieber TControl(sender).name, das wäre der saubere Weg.
jaenicke - Di 07.06.16 04:14
Man sollte immer vorher mit is prüfen, ob es der passende Typ ist. Dann ist der Cast auch ungefährlich.
Oder man casten mit as, dann kommt zumindest der korrekte Fehler, dass die Typumwandlung nicht möglich ist.
Denn auch wenn es unsauber ist, kann man ja die Eventhandling-Methode auch manuell aufrufen. Wenn man dort dann einen anderen Typ übergibt...
Weshalb funktioniert es nun aber?
Das liegt daran, dass die Eigenschaften abgeleiteter Klassen immer hinter denen der Elternklasse eingefügt werden.
Bis zur Eigenschaft Tag sehen TLabel und TPanel daher gleich aus.
Würdest du eine Eigenschaft benutzen, die nicht mehr aus gemeinsamen Vorfahren stammt, würde es knallen.
jaenicke - Mi 08.06.16 06:31
galagher hat folgendes geschrieben : |
Dann gehe ich besser den sicheren, einfacheren Weg:
Nersgatt hat folgendes geschrieben : | Nimm lieber TControl(sender).name, das wäre der saubere Weg. |
|
Ich sehe das nicht so, dass das sauber ist. Denn wie gesagt, du kannst ja problemlos auch etwas anderes als Sender übergeben. Wenn du das dann später einmal machst, sei es absichtlich oder aus Versehen, knallt es...
Deshalb sehe ich solche harten Casts ohne Prüfung sehr kritisch, insbesondere wenn es so allgemeine Methoden wie Ereignisbehandlungen betrifft.
Nersgatt - Mi 08.06.16 09:05
Da muss ich Sebastian zustimmen, solchen harten Casts sollte man nur nach vorheriger Prüfung machen. Zumal es sonst durch Zufall mal funktionieren kann und beim Kunden knallt es dann.
Ich wollte allerdings ausdrücken, dass es sauberer ist, auf den gemeinsamen Vorfahren zu casten, als ein TLabel auf ein TPanel zu casten.
galagher - Mi 08.06.16 20:36
Nersgatt hat folgendes geschrieben : |
Ich wollte allerdings ausdrücken, dass es sauberer ist, auf den gemeinsamen Vorfahren zu casten, als ein TLabel auf ein TPanel zu casten. |
Dann werde ich mal versuchen, das zu machen!
Funktioniert sogar dann, wenn ich Form1 als Sender übergebe. Ich könnte natürlich auch einfach am Anfang der jeweiligen Prozedur prüfen, ob
Sender vom Typ
TPanel oder
TLabel ist. Aber um es wirklich korrekt zu machen, was anstelle von
TControl(Sender) muss ich angeben?
Nersgatt - Mi 08.06.16 21:12
Also bei mir sähe es ungefähr so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var c : TControl; begin if sender is TControl then begin c := TControl(sender); Panel1.Tag := c.Tag; Caption := c.Name; end; end; |
galagher - Fr 10.06.16 18:31
Nersgatt hat folgendes geschrieben : |
Also bei mir sähe es ungefähr so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var c : TControl; begin if sender is TControl then begin c := TControl(sender); Panel1.Tag := c.Tag; Caption := c.Name; end; end; | |
Ich wollte den Code zwar so knapp wie möglich halten, werde aber doch noch einiges entsprechend umbauen!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!