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;  //Je nachdem Panel1 oder Label1


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.


galagher - Di 07.06.16 19:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 gehe ich besser den sicheren, einfacheren Weg:
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Nimm lieber TControl(sender).name, das wäre der saubere Weg.


jaenicke - Mi 08.06.16 06:31

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Dann gehe ich besser den sicheren, einfacheren Weg:
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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!