Hallo,
Ik heb een object TTekstStijl die een simpele Decorator moet voorstellen.
En die maakt hoofdletters van een string en dat werkt goed
Ik geef een TTekst mee en die moet hij als hij klaar is verwijderen.
Maar in de aanroepende unit waar de TTekst gecreated is blijft de TTekst op Assigned staan.
Doe ik in de aanroepende unit FreeAndNil(oTekstMetStijl.FWrapped); Dan is hij wel weg.
Doe ik in de TTekstStijl class FreeAndNil(FWrapped); Dan blijft hij assigned en dat wil ik niet.
In de constructor wordt FWrapped gelijk gemaakt aan Wrapped, maar ze blijken toch niet helemaal hetzelfde.
Hoe krijg ik het voor elkaar dat ze wel hetzeflde zijn?
Zodat ik het Wrapped object kan wissen vanuit deze class.
Wat ik dus wil is dat de decorator het gedecoreerde object wist nadat hij het gebruikt heeft (Ik snap dat dit stom klinkt maar wil toch weten waarom het wissen niet lukt)
Interface:
Code:
TTekst = class(TObject)
public
function GeefTekst:string; virtual;
end;
TTekstStijl = class(TTekst)
public
FWrapped: TTekst;
public
constructor Create(Wrapped: TTekst); reintroduce;
destructor Destroy; override;
function GeefTekst:string; override;
function GeefTekstHL: string; virtual;
end;
Implementation:
Code:
function TTekst.GeefTekst: string;
begin
Result := 'Hallo';
end;
constructor TTekstStijl.Create(Wrapped: TTekst);
begin
inherited Create;
FWrapped := Wrapped; //<= Hier wordt FWrapped gelijk gemaakt aan Wrapped, maar ze zijn blijkbaar niet echt hetzelfde. Hoe krijg ik het voor elkaar dat ze wel hetzeflde zijn?
end; // Zodat ik het Wrapped object kan wissen vanuit deze class.
destructor TTekstStijl.Destroy;
begin
FreeAndNil(FWrapped); //<== Hier moet hij gefreed worden, maar hij blijft in de aanroepende unit gewoon op Assigned staan
inherited Destroy;
end;
function TTekstStijl.GeefTekst: string;
begin
Result := FWrapped.GeefTekst;
end;
function TTekstStijl.GeefTekstHL: string;
begin
Result := Geeftekst.ToUpper;
end;
Dit is de aanroepende code
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
oTekst: TTekst;
oTekstMetStijl: TTekstStijl;
begin
oTekst := TTekst.Create;
ShowMessage(oTekst.GeefTekst);
oTekstMetStijl := TTekstStijl.Create(oTekst);
ShowMessage(oTekstMetStijl.GeefTekstHL);
FreeAndNil(oTekstMetStijl);
// FreeAndNil(oTekstMetStijl.FWrapped); //<=Als ik dit doe dan is hij uiteraard wel echt weg, terwijl het om dezelfde variabele gaat.
if Assigned(oTekst) then
begin
ShowMessage('oTekst bestaat nog'); //<==oTekst mag niet meer bestaan op dit punt
end;
end;
Bookmarks