AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Warum geht das eigentlich nicht?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum geht das eigentlich nicht?

Ein Thema von Mavarik · begonnen am 19. Jul 2014 · letzter Beitrag vom 20. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#1

Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:17
Hi!

Delphi-Quellcode:
type
  TFoo = class
    private
       FIMG : TImage;
    Property TheBitmap : TBitmap read FImg.Bitmap; // ???
  end;
Mavarik
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:26
Anderseits ist es ja auch kein großer Aufwand, einen einzeiligen Getter zu schreiben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:32
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:33
Anderseits ist es ja auch kein großer Aufwand, einen einzeiligen Getter zu schreiben.
Ich glaube, ihm geht es einfach um das 'warum'.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 18:40
Da kann ich auch nur raten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 19:36
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Jul 2014 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Warum geht das eigentlich nicht?

  Alt 19. Jul 2014, 21:46
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)
$2B or not $2B

Geändert von himitsu (19. Jul 2014 um 22:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Warum geht das eigentlich nicht?

  Alt 20. Jul 2014, 09:49
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Warum geht das eigentlich nicht?

  Alt 20. Jul 2014, 10:14
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.
$2B or not $2B

Geändert von himitsu (20. Jul 2014 um 10:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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