[DUG] How do you free an Object Instance when you have an Interface Reference?

Stacey Verner stacey at cjntech.co.nz
Thu Sep 29 15:06:02 NZST 2005


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/>  
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ns3.123.co.nz/pipermail/delphi/attachments/20050929/f011729b/attachment.html


More information about the Delphi mailing list