Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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:
ausblenden 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 08.06.16 21:12 
Also bei mir sähe es ungefähr so aus:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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:

ausblenden 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!