Search the web
Sign In
New User? Sign Up
delphigames · Discussion of game programming in the Delphi development environment.
? Already a member? Sign in to Yahoo!

Yahoo! Groups Tips

Did you know...
Message search is now enhanced, find messages faster. Take it for a spin.

Best of Y! Groups

   Check them out and nominate your group.
Having problems with message search? Fill out this form to ensure your group is one of the first to be migrated to the new message search system.

Messages

  Messages Help
Advanced
Steve Beaulieu is out of the office until Jan 5th   Message List  
Reply | Forward Message #7601 of 7611 |
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]




Wed Feb 11, 2009 8:57 am

ianathome12345
Offline Offline
Send Email Send Email

Forward
Message #7601 of 7611 |
Expand Messages Author Sort by Date

I will be out of the office starting 12/18/2008 and will not return until 01/05/2009....
steve.beaulieu@...
Send Email
Dec 24, 2008
3:02 pm

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...
Ian Munro
ianathome12345
Offline Send Email
Feb 10, 2009
11:39 am

Hi Ian Munro, Use a TInterfaceList. That is a TList for interfaces. Regards, Tom ... From: delphigames@yahoogroups.com [mailto:delphigames@yahoogroups.com] On...
Grubb, Thomas G. (GSF...
tom_grubb
Offline Send Email
Feb 10, 2009
3:09 pm

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...
Grubb, Thomas G. (GSF...
tom_grubb
Offline Send Email
Feb 10, 2009
3:17 pm

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...
Ian Munro
ianathome12345
Offline Send Email
Feb 10, 2009
3:26 pm

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....
Grubb, Thomas G. (GSF...
tom_grubb
Offline Send Email
Feb 10, 2009
7:40 pm

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...
Ian Munro
ianathome12345
Offline Send Email
Feb 11, 2009
8:57 am

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, ...
Grubb, Thomas G. (GSF...
tom_grubb
Offline Send Email
Feb 11, 2009
12:07 pm

Can't you define something like type PMyItem = ^TMyItem; TMyItem = record item: IJanusDataSourceItem; end; function PMyItem MyItem(i: IJanusDataSourceItem) var...
Igor Stojkovic
jimyiigor
Offline Send Email
Feb 11, 2009
4:33 pm
Advanced

Copyright © 2009 Yahoo! Inc. All rights reserved.
Privacy Policy - Terms of Service - Guidelines - Help