[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