[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