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 -----
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.
I'm sure it was just a typo, but it
should be a TInterfaceList instead of a TList.
Cheers,
Conor
_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi
_______________________________________________
Delphi mailing
list
[email protected]
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
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.394 / Virus Database: 268.8.3/361 - Release Date: 11/06/2006
_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi