![]() |
class(TPersistent) - Zugriff auf "höhere" Prozedur
Hi
Ich habe eine eigene Komponente, welche eine Hauptklasse beinhaltet (abgeleitet von TPaintbox) und mehrere Unterklassen (abgeleitet von TPersistent), die zum Teil wiederum einige Unterklassen, abgeleitet von Tpersistent, beinhalten. Dies dient dazu im Objektinspektor eine Art "Treeview" darzustellen. [Vielleicht blöd ausgedrückt ^^], also wie "Font". Jetzt möchte ich bei einer Änderung einer Property bzw. Subproperty eine Procedure / Function der Hauptklasse aufrufen. Das Problem ist nur das die Unterklasse, wo die Änderung geschieht, nichts von der Hauptklasse und deren Procedures weiss. (Es kann sein, dass die Änderung zum Beispiel in der 5. Unterklasse einer Hauptklasse geschieht.) Wie kann ich also von einer Unterklasse die Procedures und Functions der Hauptklasse aufrufen (Beweggrund: die Hauptklasse kennt alle Variablen die in der Komponente/Hauptklasse vorkommen, was zum Zeichnen der Kopmonente wichtig ist) ??? |
Re: class(TPersistent) - Zugriff auf "höhere" Proz
Ich würde in den Unterklassen ein Event auslösen und dieses in der Hauptklasse dann verarbeiten. Das hat den Vorteil, dass die Unterklasse keine Informationen von der übergeordneten Klasse benötigt.
|
Re: class(TPersistent) - Zugriff auf "höhere" Proz
und wie würde das dann aussehen. Quelltext technisch :-D
|
Re: class(TPersistent) - Zugriff auf "höhere" Proz
wenn du beim Create der unterclassen (TComponent) den Owner angegeben hast könntest du dich anhand dessen nach oben durchhangeln.
|
Re: class(TPersistent) - Zugriff auf "höhere" Proz
funktioniert das auch wenn die Unterklassen von TPersistent abgeleitet sind ???
|
Re: class(TPersistent) - Zugriff auf "höhere" Proz
1. Wie würde der Constructor dann aussehen ??
2. Kann ich mich über "Owner" hochangeln ?? |
Re: class(TPersistent) - Zugriff auf "höhere" Proz
Für
![]() 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:
Die Implementierung in die Basisklasse sah dann so aus:
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;
Delphi-Quellcode:
Für die View-Property habe ich aber Zugriff auf das Image gebraucht, deshalb muss hier zusätzlich zum Ereignis der Owner angegeben werden:
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;
Delphi-Quellcode:
Der Zugriff ist also problemlos über FOwner möglich (wobei hier ein FOwner: TCustomControl ohne Forward-Deklaration gereicht hätte).
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; Endergebnis: ![]() |
Re: class(TPersistent) - Zugriff auf "höhere" Proz
ich hab das jetzt so versucht zu lösen, indem ich den Owner bei Create übergebe und in einer Variable speichere.
Jetzt weiss ich nur nicht von welchem Typ der Owner sein muss ?? Das Problem ist, wenn der Owner den Typ der Hauptklasse hat, muss diese vorher deklariert sein. Dann kann aber die Hauptklasse keine Variable vom Typ der Unterklasse haben, weil diese noch nicht bekannt ist. |
Re: class(TPersistent) - Zugriff auf "höhere" Proz
Zitat:
Auf die Art kann man die Klassen auch schön entkoppeln, da nicht zwangsläufig eine Dorfstraßen-Kommune entstehen muss, in der jede Klasse jede andere kennt. :) |
Re: class(TPersistent) - Zugriff auf "höhere" Proz
Zitat:
Delphi-Quellcode:
//EDIT: bisschen nachgebessert...
type
TX = class; //<-- das ist die "forward" Deklaration TY = class(...) private FOwner: TX; public constructor Create(AOwner: TX); property Owner: TX read FOwner; end; TX = class(...) private FChild: TY; public property Child: TY read FChild; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz