![]() |
Warum geht das eigentlich nicht?
Hi!
Delphi-Quellcode:
Mavarik
type
TFoo = class private FIMG : TImage; Property TheBitmap : TBitmap read FImg.Bitmap; // ??? end; |
AW: Warum geht das eigentlich nicht?
Weil der backing store ein privates Feld sein muss und nicht die Property eines privaten Feldes. Vermutlich, vielleicht, keine Ahnung wird bei einem backing store direkt die Adresse im Getter/Setter einkompiliert. Stevie und andere Spezialisten können darüber bestimmt mehr sagen.
|
AW: Warum geht das eigentlich nicht?
Anderseits ist es ja auch kein großer Aufwand, einen einzeiligen Getter zu schreiben.
|
AW: Warum geht das eigentlich nicht?
Die Frage ist eher: Was macht eine visuelle TImage versteckt in einer Komponente?
Oder wird die auch irgendwo angezeigt? > TPicture oder TGraphit (wenn man den Typ kennt) |
AW: Warum geht das eigentlich nicht?
Zitat:
|
AW: Warum geht das eigentlich nicht?
Da kann ich auch nur raten.
|
AW: Warum geht das eigentlich nicht?
Ich vermute das dort impliziert eine Methode einkompiliert wird.
![]() Ist aber eben nur eine Vermutung meinereinerseits ... Laut ![]() Könnte man also einfach ausprobieren, ob
Delphi-Quellcode:
den gleichen Code erzeugt wie
TFoo = class
private FBar : integer; public property Bar : integer read FBar write FBar; end;
Delphi-Quellcode:
TFoo = class
private FBar : integer; procedure SetBar( const Value : integer ); function GetBar : integer; public property Bar : integer read FBar write FBar; end; procedure TFoo.SetBar( const Value : integer ); begin FBar := Value; end; function TFoo.GetBar : integer; begin Result := FBar; end; |
AW: Warum geht das eigentlich nicht?
Nein, Delphi erzeugt da keine implizite Methoden.
In der RTTI ist in diesem Integer codiert, ob es sich um einen Zeiger (Offset) auf ein Feld handelt oder um eine Referenz auf eine Methode (Getter/Setter). Es ist vielmehr so, daß der Delphi-Compiler ohne Getter/Setter intern oftmals den Code so erzeigt, als wenn man direkt auf das Feld zugreift. (zumindest im Windows ... k.A. wie das beim neuen Compiler aussieht) |
AW: Warum geht das eigentlich nicht?
Zitat:
Offenbar möchte der Compiler das direkt auslösen können. Das ist bei einer Klasseninstanz, die ja erst zur Laufzeit erzeugt wird, aber nicht möglich. |
AW: Warum geht das eigentlich nicht?
Die RTTI nutzt, wie erwähnt, einen Offset.
Im compilierten Code wäre es praktisch kein Problem, aber es wird auch alles nochmal in der RTTI hinterlegt. Bei einem Record ist immer alles direkt in dem Record und kann somit auch direkt angesprochen werden. Bei einer Klasse werden praktisch zwei Adressen verschachtelt, was eben nicht "direkt" geht, vorallem da es auch noch eine Mischung aus direktem Feldzugriff und Getter/Setter sein kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz