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

Stacey Verner stacey at cjntech.co.nz
Thu Sep 29 15:30:01 NZST 2005


Thanks.
 
That works perfectly, although its a bit wordy.
 
Ine addition to this is that I had previously added _AddRef and _Release
methods which return -1 to try to solve this (prevents reference
counting, or something like that), your coe didn't work until I got rid
of the methods.
 
Stacey


________________________________

	From: delphi-bounces at ns3.123.co.nz
[mailto:delphi-bounces at ns3.123.co.nz] On Behalf Of David Brennan
	Sent: Thursday, 29 September 2005 15:24
	To: 'NZ Borland Developers Group - Delphi List'
	Subject: RE: [DUG] How do you free an Object Instance when you
have anInterfaceReference?
	
	

	Carefully ;-).

	 

	You need to make sure all interface references are out of scope
before you free the object. The best way I found was to implement an
interface method which returns the object as a TWinControl (in my case -
TObject would probably work too). Then do the following code:

	 

	      LWinControl := LInterface.WinControl;

	      LInterface:= nil;

	      // Now that the interface reference has been released we
can do free. 

	      LWinControl.Free;

	 

	Add try's as necessary for the level of memory protection/error
handling that you require.

	 

	David. 

	 

	
________________________________


	From: delphi-bounces at ns3.123.co.nz
[mailto:delphi-bounces at ns3.123.co.nz] On Behalf Of Stacey Verner
	Sent: Thursday, 29 September 2005 3:06 p.m.
	To: NZ Borland Developers Group - Delphi List
	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
<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/e6270bb8/attachment-0001.html


More information about the Delphi mailing list