[DUG] How do you free an Object Instance when you have an
InterfaceReference?
Todd Martin
toddm at kol.co.nz
Thu Sep 29 15:36:19 NZST 2005
Hi Stacey
You should never "free" an interface.
Implement reference counting in TMenuItem (see TInterfacedObject). The object will be destroyed automatically, when all variables that reference it (eg MyMenuItem) go out of scope.
Todd.
----- Original Message -----
From: Stacey Verner
To: NZ Borland Developers Group - Delphi List
Sent: Thursday, September 29, 2005 3:06 PM
Subject: [DUG] How do you free an Object Instance when you have an InterfaceReference?
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
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/
------------------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
------------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.344 / Virus Database: 267.11.8/113 - Release Date: 27/09/2005
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ns3.123.co.nz/pipermail/delphi/attachments/20050929/13beef81/attachment.html
More information about the Delphi
mailing list