Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 12:30
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
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat