i := self.names.indexOf(name);
   val := Struct(self.values[i]);
raises "got untyped expected Struct". Sure, that's why I'm trying to cast... Without 
casting to Struct, the compiler indeed throws "got pointer expected Struct". I'm very 
surprised since I already did this.

in first place, you can omit self within the object's methods, as it's implicitly there.

second, the property Values[] expects a string inside "[]" and not a number, so you may want to use val := Values[name];

third, Values return a string (the rightmost part of the "=" if you read the items property (or directly l[n])), so you cannot cast it to "Struct".

I think you intend to do something like:

Var
MyStruct: Struct;
MyList: TStringList;
I: Integer;

(...)

MyList := TStringList.Create();

(...)

For I := 0 To 10 Do
Begin
  MyStruct := Struct.struct(I);
  MyList.AddObject(Format('struct no. %d', [I]), TObject(MyStruct));
End;

{cannot remember whether the casting to TObject is necessary or not, or any syntax error I might have done, because I'm typing it out of my mind, after a year or so I haven't written any pascal code... anyway, I suggest you derive your Struct from TObject. And for a matter of readability, I also suggest you name it TStruct instead of plainly Struct, but this is a matter of taste}

(...)

you can now retrieve the objects you added with:

For I := 0 To Pred(MyList.ItemsCount) Do
Begin
  MyStruct := Struct(MyList.Objects[I]);
  ...do whatever you like with your struct variable here...
End;

If you need to retrieve your objects using the "names" you need to do something like:

I := MyList.IndexOfName("struct no. 6");
If(I >= 0)
  MyStruct := Struct(MyList.Objects[I]);

or more rapidly, if you are sure the "name" exists, with

MyStruct := Struct(MyList.Objects[MyList.IndexOfName("struct no. 6")]);


bear in mind that free-ing MyList does not free the instances of Struct you have created and inserted; so you need to do it manually, in another for-cycle, for example...

For I := 0 To Pred(MyList.ItemsCount) Do
Begin
  MyStruct := Struct(MyList.Objects[I]);
  MyStruct.Free;
End;

If you intended to retrieve your objects directly with Names[] and Values[] then forget it. Unless you descend from TStrings and write the property accordingly (and all the other virtual methods, of course)

Or you can descend from TStringList (don't know if this is the best thing you could do, but...), and add a property ObjectValues, with a proper Getter and Setter expecting a string instead of an integer; like:

property ObjectValues[const AName:String]: TObject Read GetObjectValue write SetObjectValue;

Function TMyStringList.GetObjectValue(const AName:String):TObject;
Var I:Integer;
Begin
  Result := Nil;
  I := IndexOfName(AName);
  If (I >= 0) Then
    Result := Objects[I];
End;

Procedure TMyStringList.SetObjectValue(const AName:String; AObject:TObject);
Var I:Integer;
Begin
  I := IndexOfName(AName);
  If (I >= 0) Then
    Objects[I] := AObject;
End;


As I said, take all this with a grain of salt, as I may have written mistakes and/or forgot something.

Just my 2c, hope this helps.


Cheers, A.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to