Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unterschied bei Sender? (https://www.delphipraxis.net/34673-unterschied-bei-sender.html)

Igotcha 26. Nov 2004 13:09


Unterschied bei Sender?
 
Hallo zusammen,

mir ist letztens etwas aufgefallen und wollte mal hören was der Unterschied zwischen den beiden folgenden Anweisungen ist, z.B.

Delphi-Quellcode:
(Sender As TLabel).caption

TLabel(Sender).caption
Habe nur als Beispiel das ".caption" hinzugefügt. Mir geht es um den Weg, die Komponente über Sender zu identifizieren.

In meinem speziellen Fall ging an einer Stelle nur der zweite Weg - weiss aber leider nicht mehr, in welchem Zusammenhang.

Gruß Igotcha

dizzy 26. Nov 2004 13:26

Re: Unterschied bei Sender?
 
Bei der ersten Variante prüft Delphi vorher noch per is-Operator ob der Cast überhaupt zulässig ist, also Sender mit der Zielklasse abwärts verwandt oder identisch ist.

Bei der zweiten Variante fällt die Prüfung weg, und es wird einfach gecastet.

Gruss,
Fabian

\\edit: Variante 1 macht im Grunde das hier (pseudocodeish):
Delphi-Quellcode:
if (Sender is TLabel) then
  Rückgabe := TLabel(Sender);
else
  raise Exception....;

IngoD7 26. Nov 2004 13:28

Re: Unterschied bei Sender?
 
//Ursprungstext gelöscht//

--- Kommando zurück! ---

dizzy hat Recht.

Stevie 26. Nov 2004 15:03

Re: Unterschied bei Sender?
 
Interessant ist in diesem Zusammenhang folgendes:
Ist Sender z.B. vom Typ TButton und du machst:
Delphi-Quellcode:
TForm(Sender).Caption := 'Hallo Welt';
funktioniert das! :shock:
Dies ist so, weil sowohl TForm, als auch TButton über die Eigenschaft Caption verfügen. Dies geht sogar mit Methoden...

Igotcha 26. Nov 2004 15:13

Re: Unterschied bei Sender?
 
Zitat:

Zitat von Stevie
Interessant ist in diesem Zusammenhang folgendes:...

Ist mir auch schon aufgefallen und spielt bei einer aktuellen Fragestellung bei mir eine Rolle:

Ich erstelle dynamisch Komponenten auf einer Form per Mausklick (ähnlich wie in der Delphi-IDE). Dazu habe ich der Form (die auch dynamisch erstellt wird) ein OnMouseDown-Ereignis mitgegeben, das ungefähr wie folgt verfährt:

Code:
WENN TAG=1 ERSTELLE Label mit Parent TForm(SENDER)
WENN TAG=2 ERSTELLE DBEdit mit Parent TForm(SENDER)
Nun kann man auch z.B. ein Pagecontrol mittels dieses Ereignisses auf der Form erstellen. Aber wenn ich jetzt eine Komponente auf dem Pagecontrol erstellen möchte, ist der "Sender" ja nicht mehr vom Typ TForm, sondern vom Typ "TPageControl" bzw. "TTabSheet".

Ich stehe momentan vor dem Problem, dass ich deshalb jeder "Container"-Komponente ein eigenes OnMouseDown-Ereignis (analog oben) mitgeben müsste, wegen dem Cast bzgl. der Parent-Eigenschaft.

Kann man das evtl. auch noch "neutral" erstellen, so dass obiger Pseudocode unabhängig vom der Klasse funktioniert?

Gruß Igotcha

jim_raynor 26. Nov 2004 15:13

Re: Unterschied bei Sender?
 
Zitat:

Zitat von Stevie
Dies ist so, weil sowohl TForm, als auch TButton über die Eigenschaft Caption verfügen. Dies geht sogar mit Methoden...

Naja, ganz richtig ist das nicht. Auf jeden Fall sehr gefährlich, weil es nur funktioniert, wenn die Eigenschaft in einem gemeinsamen Vorfahren (hier TControl) definiert sind, weil dann die gleichen Offsets benutzt werden. Wenn du statt Caption zum Beispiel ModalResult benutzt, dürfte es ehrhebliche Probleme geben. Die Eigenschaften heissen zwar gleich, liegen aber bei den beiden Klassen an unterschiedlichen Adressen.

dizzy 26. Nov 2004 15:19

Re: Unterschied bei Sender?
 
Alle Klassen wie TForm oder TPanel etc. die als Container für weitere Komponenten dienen können sind imho von TComponent abgeleitet. (Oder doch von TWinControl? :gruebel: Müssteste mal nachschauen.)
Wenn du dann auf diesen gemeinsamen Vorfahren castest ist das sauber und möglich.

Gruss,
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz