Ich poste vielleicht einfach mal ein bisschen Quellcode, um das Problem zu erläutern.
Ich habe eine Grund-Klasse, die im wesentlichen einfach nur das übergeordnete Objekt als Eigenschaft einführt.
Dann habe ich noch eine Master- und eine Detailklasse. Der Master enthält ein untergeordnetes Detailobjekt, das einen einfachen WideString als Eigenschaft besitzt.
Code:
type TXNComponent=class(TInterfacedObject, IXNComponent)
private
FOWner:IXNComponent;
public
function GetOwner:IXNComponent; stdcall;
constructor Create(AOwner:IXNComponent); virtual;
destructor Destroy; override;
function XNObjectName:WideString; stdcall;
end;
type TXNDetail=class(TXNComponent,IXNDetail)
private
FStr:WideString;
public
function GetStr:WideString; stdcall;
end;
type TXNMaster=class(TXNComponent,IXNMaster)
private
FDetail:IXNDetail;
public
constructor Create(AOwner:IXNComponent); override;
destructor Destroy; override;
function GetDetail:IXNDetail; stdcall;
end;
implementation
{ TXNComponent }
constructor TXNComponent.Create(AOwner:IXNComponent);
begin
inherited Create;
ShowMessage(XNObjectName+'.Create');
FOwner:=AOwner;
end;
destructor TXNComponent.Destroy;
begin
ShowMessage(XNObjectName+'.Destroy');
FOwner:=NIL;
inherited;
end;
function TXNComponent.GetOwner: IXNComponent;
begin
Result:=FOwner;
end;
function TXNComponent.XNObjectName: WideString;
begin
Result:='';
if FOwner<>NIL then
Result:=FOwner.XNObjectName+'\';
Result:=Result+Self.ClassName;
end;
{ TXNDetail }
function TXNDetail.GetStr:WideString;
begin
Result:=FStr;
end;
{ TXNMaster }
constructor TXNMaster.Create(AOwner:IXNComponent);
begin
inherited;
FDetail:=TXNDetail.Create(Self);
end;
destructor TXNMaster.Destroy;
begin
FDetail:=NIL;
inherited;
end;
function TXNMaster.GetDetail: IXNDetail;
begin
Result:=FDetail;
end;
Die Interfaces dazu:
Code:
type
IXNComponent=interface(IUnknown)
['{F0BB7952-1B45-42C7-9533-63B46AC10D9C}']
function XNObjectName:WideString; stdcall;
function GetOwner:IXNComponent; stdcall;
property Owner:IXNComponent read GetOwner;
end;
IXNDetail=interface(IXNComponent)
['{E0837319-EEE7-4AFC-B199-27F7C7D18373}']
function GetStr:WideString; stdcall;
property Str:WideString read GetStr;
end;
IXNMaster=interface(IXNComponent)
['{EA3940CD-0F38-4390-ADDF-4A034E5C6CB2}']
function GetDetail:IXNDetail; stdcall;
property Detail:IXNDetail read GetDetail;
end;
So, wenn du nun diese Struktur erstellst ...
Code:
var Master:IXNMaster;
begin
//Master erstellen
Master:=TXNMaster.Create(NIL);
//Master freigeben
Master:=NIL;
end;
...wirst du sie nicht so einfach wieder verwerfen können. Ich hatte auch schon eine Routine TXNComponent.DoDestroy, die einfach mal ein Free gemacht hat. Das brachte eben, wie schon gesagt, Exceptions...
Cu,
Udontknow