Autor |
Beitrag |
galagher
Beiträge: 2523
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 06.06.16 20:29
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!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mo 06.06.16 22:08
Uiuiui, das ist aber gefährlich...
Nimm lieber TControl(sender).name, das wäre der saubere Weg.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: galagher
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2523
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 07.06.16 19:38
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 08.06.16 06:31
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
galagher
Beiträge: 2523
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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; |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2523
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 10.06.16 18:31
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|