![]() |
TPersistent in TComponent...
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @ all,
ich habe eine TPersistent (TBar) in einem TComponent (TFoo) untergebracht... Das TPersistent (TBar) ist per property im pulished Teil. Das doofe ist bloß, dass bei meinem Persistent (TBar), welches eine Unterinstanz von meinem TComponent (TFoo) ist und aus irgend einem Grund ich nicht den richtigen Life-Cycle einhalte. Was zur Folge hat, das bei dem TPersistent (TBar) die Loaded methode nicht aufgerufen wird. Somit auch keine Daten vom OI an die Application zur Runtime kommen. Hat da jemdand ne Idee für mich?
Delphi-Quellcode:
Ich lege mal das Projekt-Geflecht bei.
unit untFoo;
interface uses Classes, SysUtils; type TBar = class(TComponent) private FCaption : String; published property Caption : String read FCaption write FCaption; end; type TFoo = class(TComponent) private FBar : TBar; procedure setBar(const Value: TBar); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Bar : TBar read FBar write setBar; end; implementation { TFoo } constructor TFoo.Create(AOwner: TComponent); begin inherited; self.FBar := TBar.Create(Self); end; destructor TFoo.Destroy; begin if assigned(self.FBar) then FreeAndNil(self.FBar); inherited; end; procedure TFoo.setBar(const Value: TBar); begin self.FBar.Assign(Value); end; end. Danke für's Nachdenken im Voraus! cya Corelgott |
Re: TPersistent in TComponent...
Hi Corelgott,
1. Deine TBar ist TComponent und NICHT TPersistent. 2. In TPersistent waere Loaded ehedem nicht implementiert. 3. Deine SetBar benoetigt dringend eine ueberarbeitung. 4. Notification Methode fehlt... 5. ..sehr unsicher zwecks Speicher freigabe...
Delphi-Quellcode:
..ist mal so ins Blaue-Gehackt... sollte aber funzen...constructor TFoo.Create(AOwner: TComponent); begin inherited; FBar := TBar.Create(Self); // Hier TBar = Class(TComponent) !!! SetExternal := FALSE; end; . . destructor TFoo.Destroy; begin if (assigned(FBar) and not(SetExternal)) then FBar.Free; inherited; end; . . procedure TFoo.SetBar(ABar:TBar); begin if (FBar<>ABar) then begin if assigned(FBar) then begin if SetExternal then FBar.RemoveFreeNotification(Self) else FBar.Free; end; if assigned(ABar) then begin FBar := ABar FBar.FreeNotification(Self); SetExternal := TRUE; // SetExternal = Merker ob eine andere TBar gesetzt wurde als jene, die bei Create erzeugt wurde. end else FBar := NIL {= ABar}; end; end; . . procedure TFoo.Notification(AComponent: TComponent; Operation: TOperation); begin if (Operation=opRemove) then begin if (AComponent=FBar) and SetExternal then begin // Neue TBar erzeugen und setzen FBar := TBar.Create(Self); SetExternal := FALSE; end end; inherited; end; |
Re: TPersistent in TComponent...
Hi LoCrux,
erst mal danke für deine Antwort! Das TComponent nicht TPersistent sein soll wundert mich ziemlich... Ich hatte folgende Struktur im Kopf...
Delphi-Quellcode:
Und irgendwie steht ja in der Classes.pas
TObject
+- TPersistent +- TComponent +- TControl +- TGraphicControl +- TWinControl +- TCustomControl
Delphi-Quellcode:
Zeile (1289)
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
Dass bei meiner TFoo ne ganze menge Fehlt, wie z.B. ordentliche Behandlung von Notfication: Damit hast du völlig recht... Hatte das Bloß für dieses Beispiel ein bissel gespart. Also noch bin ich da nicht so ganz überzeugt, dass es daran liegt... Oder liegt das nur an der mangelden Notification (Dann verstehe ich den Life-Cycle wohl nicht richtig...) cya Corelgott |
Re: TPersistent in TComponent...
Zitat:
Aber deswegen ist TPeristent nicht gleich TComponent. Beschaeftige dich noch mal mit der Stuktur von Objektorientiertem Programmieren (empfehle smalltalk). |
Re: TPersistent in TComponent...
Hi LoCrux,
es wäre nett, wenn du mir vll einmal kurz erklären könntest, warum TComponent bitte nicht die funktionalität von TPersistent haben soll und weswegen dort bitte die Sreaming funktionalität bzw. das Laden der Daten des OI nicht mehr gehen soll. Deine generelle Aussage, nach dem Motto versteht erst mal was OOP ist, ist hier wenig hilfreich. Corelgott |
Re: TPersistent in TComponent...
Könnte Dir
![]() |
Re: TPersistent in TComponent...
Hi Stahli,
hervorragend! Danke! Genau das war es! Aller besten Dank! cya Corelgott |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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 by Thomas Breitkreuz