[DUG] (no subject)

Conor Boyd Conor.Boyd at trimble.co.nz
Tue Jun 13 11:51:45 NZST 2006


Thanks for that Todd.
 
I'll go back and check my code, but I'm never referring to my list via
an interface, and it seems to be fine so far.
 
Cheers,
 
C.

________________________________

From: delphi-bounces at ns3.123.co.nz [mailto:delphi-bounces at ns3.123.co.nz]
On Behalf Of Todd Martin
Sent: Tuesday, 13 June 2006 11:37 a.m.
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] (no subject)


Ah. I'm sorry I disagree.
 
Firstly, Andrew wanted to add a TAOleCoordinate to his
TAOleCoordinateList. So the Add() method expected a TAOleCoordinate
parameter, NOT a TAOleCoordinateList parameter.
 
Secondly, there is no need to always reference TInterfaceList with an
interface.
So the declaration
 
TMyClass=class(TObject)
private
  FInterfaceList : TInterfaceList;
end;
 
is fine, provided you NEVER extract an interface reference to the list
object. The reference count in FInterfaceList starts at zero, when it is
created, and remains at zero, and is destroyed with
FInterfaceList.Free().
 
Conor, 
 
the reason you need to use _AddRef on your TInterfaceList, is that
somewhere in your code you are refering to the internal list with
something like this
 
procedure SomeMethod()
var
  LocalList : IInterfaceList; //interface variable
begin
  MyObject := TMyClass.Create();
  LocalList := MyObject.FInterfaceList;
//  LocalList.Add(AInterface);
....
end;
 
this extracts an interface reference to FInterfaceList and increases the
reference count to 1. As soon as LocalList goes out of scope, ie at the
end of SomeMethod(), the reference count drops back to zero and
FInterfaceList is destroyed!
 
 
Personally, to enforce encapsulation, I think FInterface should never be
accessed directly. You should add methods to your containing object
instead. Like so
 
TMyClass=class(TObject)
private
  FInterfaceList : TInterfaceList;
public
  function Add(AInterface : IInterface) : Integer;
  function Remove(AInterface : IInterface) : Integer;
end;
 
Which is what Andrew is doing.
 
Todd.
 
----- Original Message ----- 

	From: Phil Middlemiss <mailto:phil at tumonz.co.nz>  
	To: NZ Borland Developers Group - Delphi List
<mailto:delphi at ns3.123.co.nz>  
	Sent: Tuesday, June 13, 2006 9:42 AM
	Subject: Re: [DUG] (no subject)

	TInterfaceList is descended from TInterfacedObject, so it needs
to be referenced with an interface to keeps it's reference count above 0
- else it will be destroyed along with all the objects it contains.
	
	eg,
	
	TMyObject = class(TObject)
	private
	  FInterfaceList : IInterfaceList;
	public
	  constructor create;
	end;
	
	constructor TMyObject.create;
	begin
	  FInterfaceList := TInterfaceList; // automatic typecast to
IInterfaceList
	end;
	
	Conor Boyd wrote: 

		Can you clarify that for me?
		 
		Why does it *need* to be referenced with an
IInterfaceList?
		 
		I've just started using a  TInterfaceList to hold
references to interfaces, but I don't see why I have to use interfaces
WRT the list itself?
		 
		Having said that, I have an issue where I have to
explicitly call _AddRef on the interface I'm adding to my interfacelist
to keep it alive.  Could these two things be related?
		 
		Grateful for your thoughts...
		 
		C.

________________________________

		From: delphi-bounces at ns3.123.co.nz
[mailto:delphi-bounces at ns3.123.co.nz] On Behalf Of Phil Middlemiss
		 
		No, it wasn't a typo - he needs to *create* a
TInterfaceList - but that list needs to be *referenced* with an
IInterfaceList. It was intentional to force Thomas to look up how to end
up with a working IInterfaceList.
		
		Conor Boyd wrote: 

			I'm sure it was just a typo, but it should be a
TInterfaceList instead of a TList.
			 
			Cheers,
			 
			Conor

________________________________

			From: delphi-bounces at ns3.123.co.nz
[mailto:delphi-bounces at ns3.123.co.nz] On Behalf Of Phil Middlemiss
			 
			[snip] 
			 
			You should also be adding it to an
IInterfaceList instead of a TList.
			
			

			[snip] 

		
________________________________


		_______________________________________________
		Delphi mailing list
		Delphi at ns3.123.co.nz
		http://ns3.123.co.nz/mailman/listinfo/delphi
		  

	
________________________________


	

	_______________________________________________
	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 Free Edition.
	Version: 7.1.394 / Virus Database: 268.8.3/361 - Release Date:
11/06/2006
	

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ns3.123.co.nz/pipermail/delphi/attachments/20060613/9013db30/attachment-0001.html


More information about the Delphi mailing list