[DUG] How do you free an Object Instance when you have an
InterfaceReference?
Struan Judd
struan.judd at ecargo.co.nz
Thu Sep 29 15:38:32 NZST 2005
Stacey Verner wrote:
> If you have an object the implements and interface, and you have a
> reference to the interface, how do you free the object using the
> reference to the interface?
>
> I have the following (simplified) interface and classes.
>
> interface
>
> type
>
> IMyMenuItem = interface
> function AddMenuItem(PCaption: String; POnClick: TNotifyEvent):
> IMyMenuItem; procedure MyFree;
> end;
>
> TMyMenuItem = class(TMenuItem, IMyMenuItem)
> public
> function AddMenuItem(PCaption: String; POnClick: TNotifyEvent):
> IMyMenuItem; procedure MyFree;
> end;
>
> TMyTBMenuItem = class(TTBItem, IMyMenuItem)
> public
> function AddMenuItem(PCaption: String; POnClick: TNotifyEvent):
> IMyMenuItem; procedure MyFree;
> end;
>
> implementation;
>
> function TMyMenuItem.AddMenuItem(PCaption: String; POnClick:
> TNotifyEvent): IMyMenuItem; var LMenuItem: TMyMenuItem;
> begin
> LMenuItem := TMyMenuItem.Create(PParent.Owner);
> LMenuItem.Caption := PCaption;
> LMenuItem.OnClick := POnClick;
> Result := LMenuItem;
> end;
>
> procedure TMyMenuItem.MyFree;
> begin
> Free;
> end;
>
> function TMyTBMenuItem.AddMenuItem(PCaption: String; POnClick:
> TNotifyEvent): IMyMenuItem; var LMenuItem: TMyTBMenuItem;
> begin
> LMenuItem := TMyTBMenuItem.Create(PParent.Owner);
> LMenuItem.Caption := PCaption;
> LMenuItem.OnClick := POnClick;
> Result := LMenuItem;
> end;
>
> procedure TMyTBMenuItem.MyFree;
> begin
> Free;
> end;
>
> The intention of this is to allow you to dynamically create menu
> items, but it doesn't matter if you have a normal menu (TMenuItem) or
> a Toolbar 2000 menu (TTBItem). You just deal with IMyMenuItem and the
> correct objects are created behind the scenes.
>
> This works pretty well except I have an intermittent access
> violations when freeing.
>
> MyMenuItem: IMyMenuItem;
>
> ... // Do some stuff.
>
> MyMenuItem := RootMenuItem.AddMenuItem('Hello World',
> HelloWorldClick);
>
> ... // Later on
>
> MMyMenuItem.MyFree; // Intermiitent access violation here!
>
> I don't actually like the fact that I have MyFree. It was the only
> way I could think of doing it at the time.
>
> Stacey
>
> Stacey Verner Ph: +64-9-4154790
> Software Developer Fax: +64-9-4154791
> DDI: +64-9-4154797
> CJN Technologies Ltd. Email: stacey at cjntech.co.nz
> <mailto:stacey at cjntech.co.nz>
> PO Box 302-278, North Harbour, Auckland 1330, New Zealand
> 12 Piermark Drive, North Harbour, Auckland, New Zealand Visit our
> website at http://www.cjntech.co.nz/ <http://www.cjntech.co.nz/>
I'd implement this as a "helper" object that delegates the properties,
methods and events to the actual obect:
Ie.
Type
TMyMenuItem = class(TObject)
public
procedure AddMenuItem(PCaption: String; POnClick: TNotifyEvent):
TMyMenuItem; virtual; abstract;
end;
TMyMenuItemStandard = class(TMyMenuItem)
private
FMenuItem: TMenuItem;
public
procedure AddMenuItem(PCaption: String; POnClick: TNotifyEvent):
TMyMenuItem; override;
destructor Destroy;
end;
.
.
.
And of course Destroy would Free the included Menu item (of whatever type)
Thus you're not having to mix the Interface variables desire to be reference
counted and the standard Delphi wilful destruction schemes.
TTFN
Struan Judd
Mailto:struan.judd at ecargo.co.nz Developer
Phone: +64 (9) 368 9368 eCargo
Fax: +64 (9) 368 9369 Visibility - Communication - Measurement
Mobile: +64 (21) 685 335 Private & Confidential
http://www.ecargo.co.nz
More information about the Delphi
mailing list