Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Warum geht das eigentlich nicht? (https://www.delphipraxis.net/181152-warum-geht-das-eigentlich-nicht.html)

Mavarik 19. Jul 2014 17:17

Warum geht das eigentlich nicht?
 
Hi!

Delphi-Quellcode:
type
  TFoo = class
    private
       FIMG : TImage;
    Property TheBitmap : TBitmap read FImg.Bitmap; // ???
  end;
Mavarik

Dejan Vu 19. Jul 2014 17:22

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.

DeddyH 19. Jul 2014 17:26

AW: Warum geht das eigentlich nicht?
 
Anderseits ist es ja auch kein großer Aufwand, einen einzeiligen Getter zu schreiben.

himitsu 19. Jul 2014 17:32

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)

Dejan Vu 19. Jul 2014 17:33

AW: Warum geht das eigentlich nicht?
 
Zitat:

Zitat von DeddyH (Beitrag 1266037)
Anderseits ist es ja auch kein großer Aufwand, einen einzeiligen Getter zu schreiben.

Ich glaube, ihm geht es einfach um das 'warum'.

DeddyH 19. Jul 2014 17:40

AW: Warum geht das eigentlich nicht?
 
Da kann ich auch nur raten.

Sir Rufo 19. Jul 2014 18:36

AW: Warum geht das eigentlich nicht?
 
Ich vermute das dort impliziert eine Methode einkompiliert wird.

Delphi-Referenz durchsuchenGetPropInfo liefert einen Zeiger für die Getter-/Setter-Methode auch wenn es sich um so eine simple Eigenschaftsdeklaration handelt.

Ist aber eben nur eine Vermutung meinereinerseits ...

Laut Wikipedia soll das wohl auch so sein.

Könnte man also einfach ausprobieren, ob
Delphi-Quellcode:
TFoo = class
private
  FBar : integer;
public
  property Bar : integer read FBar write FBar;
end;
den gleichen Code erzeugt wie
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;

himitsu 19. Jul 2014 20:46

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)

Uwe Raabe 20. Jul 2014 08:49

AW: Warum geht das eigentlich nicht?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1266035)
Weil der backing store ein privates Feld sein muss und nicht die Property eines privaten Feldes.

Interessanterweise geht sowas aber mit einem Record, wenn man beim read wieder ein Feld des Records anspricht. Und mit privat oder nicht hat das auch nichts zu tun.

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.

himitsu 20. Jul 2014 09:14

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 09:56 Uhr.
Seite 1 von 2  1 2      

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