Matthew,
 
I'm not exactly sure what VarInterface is but it looks like a local variable (if it isn't then you may be able to ignore most of this email).
 
If so it looks like you are reusing it, populating it with the correct values and always returning it. This is unusual and you will have to really be on your toes with how you use the result to ensure things behave as you expect them to. For example:
 
if Items[i] = Items[i + 1] then begin
 
the if statement will always succeed as the Items property always returns the same object so the comparison always returns true.
 
Furthermore if you do:
 
LInterfaceOne := Items[i];
LInterfaceTwo := Items[i + 1];
 
then both LInterfaceOne and LInterfaceTwo now point the same object in memory (ie the i + 1th object).
 
If I am right then the specific problem you are experiencing is a symptom of this. You are doing:
 
Items[i].MyProp:= ‘MyValue’;
 
This translates into
 
VarInterface.MyProp := 'MyValue';
 
Now unless you specifically write code to copy the contents of VarInterface back into Items[i] then your change will never reach Items[i].
 
Basically if I am right then your Get_Items function needs to be completely rethought.
 
Hope that makes sense,
David.
 
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]On Behalf Of Matthew Evans
Sent: Tuesday, 28 January 2003 1:40 PM
To: Multiple recipients of list delphi
Subject: RE: RE: RE: RE: RE: [DUG]: Interface question

Its creating a new interface object yes, but I’m not using IInterfaceList

The Get_items is as follows :

 

function TDataSightVariableList.Get_Items(

    Index: Integer): IDataSightVariable;

begin

    with FVariableList,VarInterface do begin

        Description := Items[Index].Description;

        DisplayName := Items[Index].DisplayName;

        FieldName := Items[Index].FieldName;

        FieldID := Items[Index].FieldID;

        Units := Items[Index].Units;

        FieldFormat := Items[Index].FieldFormat;

        FieldType := integer(Items[Index].FieldType);

        Fixed := Items[Index].Fixed;

        MarkedForDelete := Items[Index].MarkedForDelete;

        MarkedForSave := Items[Index].MarkedForSave;

        Size := Items[Index].Size;

    end;

    Result := VarInterface;

end;

 

-----Original Message-----
From: Kyley Harris [mailto:[EMAIL PROTECTED]]
Sent:
Tuesday, 28 January 2003 11:54 a.m.
To: Multiple recipients of list delphi
Subject: RE: RE: RE: RE: [DUG]: Interface question

 

interesting.

 

is your Get_Items(i) creating a new interface object each time it is accessed by mistake? i would assume that in the background

you are using an IInterfaceList to contain a set of interfaces so that each subsequent call returns the same object which includes the

modified property value.

 

Get_Items(i);

begin

result := FList.Items[i] as IDisp.....

end;

 

if you use Set_Items you will lose reference to one, and gain reference to the new

-----Original Message-----
From: Matthew Evans [mailto:[EMAIL PROTECTED]]
Sent:
Tuesday, 28 January 2003 11:30 a.m.
To: Multiple recipients of list delphi
Subject: RE: RE: RE: [DUG]: Interface question

Ok this is what is happening:

Items[i].MyProp:= ‘MyValue’;

So first Get_items is called , this returns the interface with all the properties set from Fitems[i]

After the interface is returned,

Set_MyProp is called and assigned the value ‘MyValue’.

So now the interface has the new value but this interface is not returned to Items[i]

 

Not sure if this helps clear up what my problem is but I’m hoping so.

 

-----Original Message-----
From: Kyley Harris [mailto:[EMAIL PROTECTED]]
Sent:
Tuesday, 28 January 2003 10:38 a.m.
To: Multiple recipients of list delphi
Subject: RE: RE: [DUG]: Interface question

 

He isn't trying to write 'MyValue' into Set_Items in that example set_items is never called.

 

items[i].MyProp calls Get_Items(i) returning an interface. then it is trying to assign 'MyValue' to MyProp

-----Original Message-----
From: Conor Boyd [mailto:[EMAIL PROTECTED]]
Sent:
Tuesday, 28 January 2003 10:24 a.m.
To: Multiple recipients of list delphi
Subject: RE: [DUG]: Interface question

Hi Matthew,

 

Your Set_Items method is expecting a reference to an interface (IDataSightVariable).  You're passing it a string ('MyValue') in the example you gave.  The example you gave about creating an interface and setting the property values is therefore the expected behaviour.

 

Do you want to give a bit more code for us to have a look at?

 

Cheers,

 

Conor

   

-----Original Message-----
From: Matthew Evans [mailto:[EMAIL PROTECTED]]
 

Here's my problem, I have a property that returns an interface. The interface has several properties. I can read these properties fine showmessage(Items[i].MyProp); for example. However if I want to set said interface property I can't. Items[i].MyProp:= 'MyValue'; will not call the set method. So the only way I can set Interface values is first create an interface set the property values then assign it to the items list items[i]:= MyInterface;

Only been playing with these for a small amount of time and wondering how I should be going about this so I can read and write the interface properties right off the list? Any takers.

 

function Get_Items(Index: Integer): IDataSightVariable; safecall;

procedure Set_Items(Index: Integer; const Value: IDataSightVariable); safecall;

property Items[Index: Integer]: IDataSightVariable read Get_Items write Set_Items;

Reply via email to