Autor Beitrag
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Do 25.10.07 10:35 
Hy,
der Titel ist eine wenig verwirrend. Darum erkläre ich hier nochmal mein Problem. Ich habe eine neue Klasse. In dieser Klasse definiere ich ein TImage. Nun möchte ich eine Eigenschaft deklarieren, mit der ich auf Image.Picture zugreifen kann. Wie muss ich da die property deklarieren?

MfG
Regan
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 25.10.07 10:56 
ausblenden Delphi-Quelltext
1:
property Picture: TPicture read FImage.Picture write FImage.Picture;					

_________________
Markus Kinzler.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 25.10.07 11:00 
user profile iconRegan hat folgendes geschrieben:
Hy,
der Titel ist eine wenig verwirrend. Darum erkläre ich hier nochmal mein Problem. Ich habe eine neue Klasse. In dieser Klasse definiere ich ein TImage. Nun möchte ich eine Eigenschaft deklarieren, mit der ich auf Image.Picture zugreifen kann. Wie muss ich da die property deklarieren?

MfG
Regan


Hallo,

zunächst wäre die Frage, muss es überhaupt Property sein? Du kannst ein TImage haben und 10 Methoden, die damit umgehen. Das Property-Konstrukt unterstützt dich ja nur bei Read- und Writezugriffen, indem du Getter und Setter schreiben kannst, und ev. kannst du das TIMage im Object Inspector verwalten, wenn du den nötigen Aufwand treibst. So oder so, du kannst natürlich in Get/Set ebenso wie in jeder anderen Methode auf fMyImage ebenso zugreifen wie auf fMyImage.Picture oder jede andere Eigenschaft. Eine Setter-Methode könnte also durchaus eine Datei laden, wenn der Pfad bekannt ist. Demgegenüber hat eine normale Methode den Vorteil, dass du den Pfad als Parameter übergeben kannst, was bei einem Write-Befehl nicht so einfach ist. Insbesondere kannst du mit mehreren Methoden Picture ganz verschieden laden, etwa von einem anderen Picture (das wäre das normale Write), von einer Datei oder aus der Zwischenablage.

Die Deklaration als Property hält dich natürlich nicht davon ab, zusätzliche Methoden zu schreiben, die auf TImage zugreifen, aber das halte ich nicht für sauberen Stil, etwa wenn es eine Setter-Methode für Write gibt und zusätzlich noch andere Methoden, die ebenfalls in TImage schreiben.

Gruss Reinhard
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 25.10.07 12:25 
user profile iconmkinzler hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
property Picture: TPicture read FImage.Picture write FImage.Picture;					
Das funktioniert so nicht! Wenn du auf einen Untertypen einer Klasse oder eines Records zugreifen möchtest benötigst du grundsätzlich immer eine Read und Write Methode.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private
  function GetPicture: TPicture;
  procedure SetPicture(const Value: TPicture);
public
  property Picture: TPicture read GetPicture write SetPicture;
end;


function TBlah.GetPicture: TPicture;
begin
  Result := FImage.Picture;
end;

procedure TBlah.SetPicture(const Value: TPicture);
begin
  FImage.Picture.Assign(Value);
end;


Regan: Auch wenn ich mir gerade nicht ganz sicher bin was Reinhard sagen wollte. In der Grundanregung stimme aber mit ihm überein. Du solltest dir überlegen was du tust. So wie es in der VCL gelöst ist finde ich es nicht unbedingt immer gut. Teilweise erzeugt man dadurch sehr leicht sehr verworrenen Code. Speziell das TImage ist ein sehr gutes Beispiel dafür wie man es eigentlich nicht hätte machen sollen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.