Für
dieses Projekt habe ich beide Varianten benutzt:
Für das OffScreenBitmap und andere untergeordnete Klassen hat die Ereignis-Variante genügt, zur Vereinfachung habe ich noch eine gemeinsame Basisklasse geschrieben:
Delphi-Quellcode:
TNotifyingPersistent = class(TPersistent)
private
FOnChange: TNotifyEvent;
protected
procedure Change; virtual;
public
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
[...]
{ TNotifyingPersistent }
procedure TNotifyingPersistent.Change;
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
Die Implementierung in die Basisklasse sah dann so aus:
Delphi-Quellcode:
TMathImage = class(TCustomControl)
private
[...]
FBit: TMathBitmap;
procedure SomeEventhandler(Sender: TObject);
published
[...]
property MathBitmap: TMathBitmap read FBit write SetBit;
end;
procedure TMathImage.SomeEventhandler(Sender: TObject);
begin
Redraw;
end;
constructor TMathImage.Create;
begin
inherited;
[...]
FBit := TMathBitmap.Create;
FBit.OnChange := SomeEventhandler;
end;
Für die View-Property habe ich aber Zugriff auf das Image gebraucht, deshalb muss hier zusätzlich zum Ereignis der Owner angegeben werden:
Delphi-Quellcode:
TMathImage = class; // Forward-Deklaration
TMathFloatRectClass = class(TNotifyingPersistent)
private
FOwner: TMathImage;
[...]
public
constructor Create(AOwner: TMathImage);
procedure NormalizeRect;
end;
{ TMathFloatRectClass }
constructor TMathFloatRectClass.Create;
begin
inherited Create;
FOwner := AOwner;
TestRect;
end;
procedure TMathFloatRectClass.NormalizeRect;
var
yRel, yCenter: MathFloat;
begin
// xAbs / yAbs = xRel / yRel
// yRel = yAbs / xAbs * xRel
if Assigned(FOwner) and (FOwner.Height <> 0) and (FOwner.Width <> 0) then
with FRect do
begin
yRel := FOwner.Height / FOwner.Width * (Right - Left);
yCenter := (Top + Bottom) / 2;
Top := yCenter + yRel / 2 * (Ord(Top > yCenter) * 2 - 1);
Bottom := yCenter + yRel / 2 * (Ord(Bottom > yCenter) * 2 - 1);
Change;
end;
end;
Der Zugriff ist also problemlos über FOwner möglich (wobei hier ein FOwner: TCustomControl ohne Forward-Deklaration gereicht hätte).
Endergebnis:
http://img388.imageshack.us/img388/9939/oi2ce.png