Can't you define something like
type
PMyItem = ^TMyItem;
TMyItem = record
item: IJanusDataSourceItem;
end;
function PMyItem MyItem(i: IJanusDataSourceItem)
var r: PMyItem;
begin
New(r);
r^.item := i;
Result := r;
end;
Now you can do something like list.addObject("ObjectName",
MyItem(SomeJanusDataSourceItem)).
Of couse you would have to provide a way to call Dispose on this items
at some point.
On Wed, Feb 11, 2009 at 1:06 PM, Grubb, Thomas G. (GSFC-583.0)
<Thomas.G.Grubb@...> wrote:
> Hi Ian,
> You are welcome. I like to monitor the group to keep my
> programming skills sharp (either learning something or being able to
> contribute). Good luck,
>
> Tom
>
>> -----Original Message-----
>> From: delphigames@yahoogroups.com
>> [mailto:delphigames@yahoogroups.com] On Behalf Of Ian Munro
>> Sent: Wednesday, February 11, 2009 3:57 AM
>> To: delphigames@yahoogroups.com
>> Subject: RE: [DelphiGames] Casting an object to an interface
>>
>> Hello,
>>
>> Thanks for your help in this matter. I've
>> been speaking to the programmer of the DLL and he thinks that
>> he may be able to sort the ref count in his code. If this
>> isn't possible I'll use your solution.
>>
>>
>>
>> Its good to see that there are still a couple
>> of people monitoring this group.
>>
>>
>>
>> Ian
>>
>>
>>
>> From: delphigames@yahoogroups.com [mailto:delphigames@yahoogroups.com]
>> On Behalf Of Grubb, Thomas G. (GSFC-583.0)
>> Sent: Tuesday, February 10, 2009 7:40 PM
>> To: delphigames@yahoogroups.com
>> Subject: RE: [DelphiGames] Casting an object to an interface
>>
>>
>>
>> Hi Ian,
>> Then you need to use _AddRef and _Release. This works great
>> but you need to make sure that you call _Release *before* the
>> listview deletes its items. Assuming you have a IVector
>> interface and TMyVector class, the code below works to fill a
>> listbox with interfaces and to be able to select an item and
>> display the interface somewhere else. When the form closes,
>> you will see a bunch of "Destroyed XXX" dialogs. If you
>> comment out the FormClose, the vectors don't get properly destroyed.
>>
>> Tom
>>
>> procedure TForm1.FormCreate(Sender: TObject); var
>> v: IVector;
>> i: Integer;
>> begin
>> for i := 0 to 5 - 1 do
>> begin
>> v := TMyVector.Create;
>> v.SetXYZ(Random(20)-10, Random(20)-10, Random(20)-10);
>> v._AddRef; ListBox1.Items.AddObject(v.ToCommaString,
>> TObject(v)); end; end;
>>
>> procedure TForm1.FormClose(Sender: TObject; var Action:
>> TCloseAction); var
>> I: Integer;
>> begin
>> for I := 0 to ListBox1.Items.Count - 1 do begin
>> IVector(Pointer(ListBox1.Items.Objects[i]))._Release;
>> end;
>> end;
>>
>> procedure TForm1.ListBox1Click(Sender: TObject); begin if
>> (Sender as TListBox).ItemIndex = -1 then Exit;
>> Memo1.Lines.Text :=
>> IVector(Pointer(TListBox(Sender).Items.Objects[TListBox(Sender
>> ).ItemInde
>> x])).ToCommaString;
>> end;
>>
>> { TMyVector }
>>
>> destructor TMyVector.Destroy;
>> begin
>> ShowMessage('Destroyed '+ToCommaString); inherited; end;
>>
>>
>> -----Original Message-----
>> From: delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> [mailto:delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com> ] On Behalf Of Ian Munro
>> Sent: Tuesday, February 10, 2009 10:26 AM
>> To: delphigames@yahoogroups.com <mailto:delphigames%40yahoogroups.com>
>> Subject: RE: [DelphiGames] Casting an object to an interface
>>
>> Hello,
>>
>> I should probably explain my problem in greater detail as
>> using an interface list will not work for me. I need to
>> populate a visible list of data (a listview or string grid)
>> that a user can select from. Each item comes from an
>> enumeration of IJanusDataSourceItem. I wanted to store each
>> interface reference with each item in a listview control so
>> that when the user presses a button I can easily grab the
>> appropriate interface which contains further details. The
>> data in the IJanusDataSourceItem's can change at runtime so
>> the listview will change with new data being added or removed
>> as well as the visual textual content being changed. I have
>> no control over the IJanusDataSourceItem as these come from a
>> C++ dll. If I use an interface list I then need to reference
>> that list in my listview, I would also need to maintain the
>> integrity between the two lists if data was added or removed.
>> I hope that explains my problem a little better. The key
>> point is that I need to show some data from the interface in
>> a listview or string grid but also to be able to maintain a
>> link between the visual content and the interface to update
>> changes to the interface content etc.
>>
>> Ian
>>
>> From: delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> [mailto:delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com> ] On Behalf Of Grubb,
>> Thomas G. (GSFC-583.0)
>> Sent: Tuesday, February 10, 2009 3:17 PM
>> To: delphigames@yahoogroups.com <mailto:delphigames%40yahoogroups.com>
>> Subject: RE: [DelphiGames] Casting an object to an interface
>>
>> BTW, the problem you were having below is that when you
>> shoved the interface into the Tlist, the reference count was
>> not incremented. So, at some point, the object behind the
>> interface got freed... And bang when you tried to get it
>> back. You could have hacked around this by call __AddRef and
>> all the other reference counting code but it would be a hack
>> and messy. Much cleaner to use the TinterfaceList (which also
>> has its own interface, IInterfaceList).
>>
>> Regards,
>> Tom
>>
>> -----Original Message-----
>> From: delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com>
>> [mailto:delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com> ] On Behalf Of Grubb, Thomas G.
>> (GSFC-583.0)
>> Sent: Tuesday, February 10, 2009 10:08 AM
>> To: delphigames@yahoogroups.com <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com>
>> Subject: RE: [DelphiGames] Casting an object to an interface
>>
>> Hi Ian Munro,
>> Use a TInterfaceList. That is a TList for interfaces.
>> Regards,
>> Tom
>>
>> -----Original Message-----
>> From: delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com>
>> [mailto:delphigames@yahoogroups.com
>> <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com> ] On Behalf Of Ian Munro
>> Sent: Tuesday, February 10, 2009 6:39 AM
>> To: delphigames@yahoogroups.com <mailto:delphigames%40yahoogroups.com>
>> <mailto:delphigames%40yahoogroups.com>
>> Subject: [DelphiGames] Casting an object to an interface
>>
>> Hello,
>>
>> I need to store references to interfaces in a list so that
>> when the user selects a list item I can easily access the
>> interface that relates to that item. I've been casting the
>> interface as a pointer and adding it as the list items
>> object. Now when I try to retrieve it I try to cast it back
>> and the compiler moans that you cant cast a TObject to an
>> interface. I tried casting it to a pointer first and then to
>> the interface type which the compiler likes (see code below).
>> The problem I have then is that when the code runs, when the
>> following line runs it throws an exception. My question is,
>> Is there a better way to do what I need to do and what is
>> causing the problem with this code. I must say that I'm not
>> 100% when it comes to interfaces.
>>
>> Item := IJanusDataSourceItem (pointer (ListItemObject)) ;
>>
>> This email is intended solely for the person to whom it is
>> addressed and may contain confidential or legally privileged
>> information. If you are not the intended recipient, be
>> advised that you have received this email in error and that
>> any use, dissemination, forwarding, printing or copying of
>> this email is strictly prohibited. Please notify the author
>> by replying to this email and destroying all copies of the
>> email and attachments. Access to this email by anyone else is
>> unauthorised.
>>
>> Email may be susceptible to data corruption, interception,
>> unauthorised amendment, viruses and delays or the
>> consequences thereof. Any views or opinions presented are
>> solely those of the author and do not necessarily represent
>> those of Grosvenor Technology Ltd.
>>
>> Grosvenor Technology Ltd. (incorp. Newmark Technology Ltd.)
>> is a company registered in England with company number 2412554.
>> The Grosvenor Technology Ltd. Registered Office address is
>> Millars Three, Southmill Road, Bishop's Stortford, Herts, CM23
>>
>> [Non-text portions of this message have been removed]
>>
>> ------------------------------------
>>
>> // *** Yahoo! Groups Info ***
>> begin
>> Yahoo! Group := DelphiGames;
>> HomePage := http://turbo.gamedev.net
>> Unsubscribe := delphigames-unsubscribe@yahoogroups.com
>> <mailto:delphigames-unsubscribe%40yahoogroups.com>
>> <mailto:delphigames-unsubscribe%40yahoogroups.com>
>> end.Yahoo! Groups Links
>>
>> ------------------------------------
>>
>> // *** Yahoo! Groups Info ***
>> begin
>> Yahoo! Group := DelphiGames;
>> HomePage := http://turbo.gamedev.net
>> Unsubscribe := delphigames-unsubscribe@yahoogroups.com
>> <mailto:delphigames-unsubscribe%40yahoogroups.com>
>> <mailto:delphigames-unsubscribe%40yahoogroups.com>
>> end.Yahoo! Groups Links
>>
>> This email is intended solely for the person to whom it is
>> addressed and may contain confidential or legally privileged
>> information. If you are not the intended recipient, be
>> advised that you have received this email in error and that
>> any use, dissemination, forwarding, printing or copying of
>> this email is strictly prohibited. Please notify the author
>> by replying to this email and destroying all copies of the
>> email and attachments. Access to this email by anyone else is
>> unauthorised.
>>
>> Email may be susceptible to data corruption, interception,
>> unauthorised amendment, viruses and delays or the
>> consequences thereof. Any views or opinions presented are
>> solely those of the author and do not necessarily represent
>> those of Grosvenor Technology Ltd.
>>
>> Grosvenor Technology Ltd. (incorp. Newmark Technology Ltd.)
>> is a company registered in England with company number 2412554.
>> The Grosvenor Technology Ltd. Registered Office address is
>> Millars Three, Southmill Road, Bishop's Stortford, Herts, CM23
>>
>> [Non-text portions of this message have been removed]
>>
>> ------------------------------------
>>
>> // *** Yahoo! Groups Info ***
>> begin
>> Yahoo! Group := DelphiGames;
>> HomePage := http://turbo.gamedev.net
>> Unsubscribe := delphigames-unsubscribe@yahoogroups.com
>> <mailto:delphigames-unsubscribe%40yahoogroups.com>
>> end.Yahoo! Groups Links
>>
>>
>>
>>
>> This email is intended solely for the person to whom it is
>> addressed and may contain confidential or legally privileged
>> information. If you are not the intended recipient, be
>> advised that you have received this email in error and that
>> any use, dissemination, forwarding, printing or copying of
>> this email is strictly prohibited. Please notify the author
>> by replying to this email and destroying all copies of the
>> email and attachments. Access to this email by anyone else is
>> unauthorised.
>>
>> Email may be susceptible to data corruption, interception,
>> unauthorised amendment, viruses and delays or the
>> consequences thereof. Any views or opinions presented are
>> solely those of the author and do not necessarily represent
>> those of Grosvenor Technology Ltd.
>>
>> Grosvenor Technology Ltd. (incorp. Newmark Technology Ltd.)
>> is a company registered in England with company number 2412554.
>> The Grosvenor Technology Ltd. Registered Office address is
>> Millars Three, Southmill Road, Bishop's Stortford, Herts, CM23
>>
>>
>> [Non-text portions of this message have been removed]
>>
>>
>>
>> ------------------------------------
>>
>> // *** Yahoo! Groups Info ***
>> begin
>> Yahoo! Group := DelphiGames;
>> HomePage := http://turbo.gamedev.net
>> Unsubscribe := delphigames-unsubscribe@yahoogroups.com
>> end.Yahoo! Groups Links
>>
>>
>>
>>
>
>
--
Pozdrav,
Igor Stojkovic mailto: stojkovic.igor@...