Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-27 Thread Sven Barth via fpc-pascal
2017-05-27 18:10 GMT+02:00 Dennis Poon :
>
>
> Sven Barth via fpc-pascal wrote:
>>
>> The idea itself is valid, cause "(IMyInterfaceVar as TObject) as
>> IMyInterface = IMyInterfaceVar" is true if and only if IMyInterface is
>> a COM interface. If IMyInterface really is a CORBA interface as Dennis
>> wrote then the compiler should already have complained at the "aObj :=
>> aInt as TObject" line as this type of conversion is*not*  supported by
>> CORBA interfaces (cause they don't provide QueryInterface() which is
>> needed for this). At least for me the compiler*did*  complain (both
>> 3.0.2 and 3.1.1) when I tested this.
>> So the question is: is IMyInterface indeed a CORBA interface? If so
>> then why does the compiler not complain? If not then why doesn't it
>> work? For both cases a full example would be needed to investigate
>> this.
>>
>> Regards,
>> Sven
>
> Sorry, I got it wrong. The interface was in fact COM style instead of CORBA.
>
> In case of COM interface, why
>
> var
>aInt : IMyInterface;
>   aObj : TObject;
> begin
> 
> 
> ...
>aInt := MyList.Items[0];
>
>aObj := aInt as TObject;
>
> why sometimes (not always)   aInt  <>   (aObj as IMyInterface ) ?

Would you please provide a full, yet simple as possible example that
shows this? I can't reproduce it with merely code fragments as for me
it works.

Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-27 Thread Dennis Poon



Sven Barth via fpc-pascal wrote:

The idea itself is valid, cause "(IMyInterfaceVar as TObject) as
IMyInterface = IMyInterfaceVar" is true if and only if IMyInterface is
a COM interface. If IMyInterface really is a CORBA interface as Dennis
wrote then the compiler should already have complained at the "aObj :=
aInt as TObject" line as this type of conversion is*not*  supported by
CORBA interfaces (cause they don't provide QueryInterface() which is
needed for this). At least for me the compiler*did*  complain (both
3.0.2 and 3.1.1) when I tested this.
So the question is: is IMyInterface indeed a CORBA interface? If so
then why does the compiler not complain? If not then why doesn't it
work? For both cases a full example would be needed to investigate
this.

Regards,
Sven

Sorry, I got it wrong. The interface was in fact COM style instead of CORBA.

In case of COM interface, why

var
   aInt : IMyInterface;
  aObj : TObject;
begin


...
   aInt := MyList.Items[0];

   aObj := aInt as TObject;

why sometimes (not always)   aInt  <>   (aObj as IMyInterface ) ?

Dennis
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-26 Thread Sven Barth via fpc-pascal
2017-05-26 11:08 GMT+02:00 Michael Van Canneyt :
>
>
> On Fri, 26 May 2017, Dennis wrote:
>
>> I defined a generic TList //CORBA style interface
>>
>> var
>>aInt : IMyInterface;
>>   aObj : TObject;
>> begin
>>aInt :=  MyList.Items[0];
>>aObj := aInt as TObject;
>>
>>   writeln(  IntToHex(LongWord(aInt),4));
>>
>>   writeln(  IntToHex(LongWord(aObj),4)); //this will output a different
>> Hex value from previous writeln
>>
>>
>> //This is causing a problem to me because I later
>>
>>   MyList.Remove(aObj as IMyInterface);//will fail because it is not the
>> same as aInt and thus fail to locate the item to remove
>>
>>
>> Am I missing some fundamental understanding of interface reference?
>
>
> Why do you think the interface and the object are the same ? They are not.
> An interface is just a bunch of method pointers, and an object has instance
> data associated with it. Hardly the same thing, I would think ?

The idea itself is valid, cause "(IMyInterfaceVar as TObject) as
IMyInterface = IMyInterfaceVar" is true if and only if IMyInterface is
a COM interface. If IMyInterface really is a CORBA interface as Dennis
wrote then the compiler should already have complained at the "aObj :=
aInt as TObject" line as this type of conversion is *not* supported by
CORBA interfaces (cause they don't provide QueryInterface() which is
needed for this). At least for me the compiler *did* complain (both
3.0.2 and 3.1.1) when I tested this.
So the question is: is IMyInterface indeed a CORBA interface? If so
then why does the compiler not complain? If not then why doesn't it
work? For both cases a full example would be needed to investigate
this.

Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-26 Thread Graeme Geldenhuys

On 2017-05-26 10:06, Dennis wrote:

Am I missing some fundamental understanding of interface reference?


Bottom line is, NEVER mix Objects and Interfaces. Program for the one or 
the other.


Regards,
  Graeme

--
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://fpgui.sourceforge.net/

My public PGP key:  http://tinyurl.com/graeme-pgp
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-26 Thread Ryan Joseph

> On May 26, 2017, at 4:06 PM, Dennis  wrote:
> 
>  writeln(  IntToHex(LongWord(aInt),4));
> 
>  writeln(  IntToHex(LongWord(aObj),4)); //this will output a different Hex 
> value from previous writeln

I think an object and interface are indeed not the same memory and you need to 
use Supports() to get a reference to the interface from the object. The 
interface reference can be cached and used later or you need to call Supports 
every time which does a string compare and is slow.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why casting interface as Tobject will result in a different reference?

2017-05-26 Thread Michael Van Canneyt



On Fri, 26 May 2017, Dennis wrote:


I defined a generic TList //CORBA style interface

var
   aInt : IMyInterface;
  aObj : TObject;
begin
   aInt :=  MyList.Items[0];
   aObj := aInt as TObject;

  writeln(  IntToHex(LongWord(aInt),4));

  writeln(  IntToHex(LongWord(aObj),4)); //this will output a different 
Hex value from previous writeln



//This is causing a problem to me because I later

  MyList.Remove(aObj as IMyInterface);//will fail because it is not the 
same as aInt and thus fail to locate the item to remove



Am I missing some fundamental understanding of interface reference?


Why do you think the interface and the object are the same ? They are not.
An interface is just a bunch of method pointers, and an object has instance
data associated with it. Hardly the same thing, I would think ?

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal