Hi, I need something like a dynamic array of objects, easy to manipulate each object and field. Is TStream and TCollection what I need, or maybe TList is enough, maybe another Type?
Thanks.

Mailing lists / fpc-pascal / 2003-05
3 messages · 3 people ·
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
Hi, I need something like a dynamic array of objects, easy to manipulate each object and field. Is TStream and TCollection what I need, or maybe TList is enough, maybe another Type?
Thanks.
jordi wroteHi, I need something like a dynamic array of objects, easy to manipulate each object and field. Is TStream and TCollection what I need, or maybe TList is enough, maybe another Type?
TCollection may be your best option.
Michael.
Hi, I need something like a dynamic array of objects, easy to manipulate each object and field. Is TStream and TCollection what I need, or maybe TList is enough, maybe another Type?
Jordi,
the unit called 'contnrs' has a TObjectList class. I would advocate it's use. The main reason is that you can construct a TObjectList like so:
MyObjectList := TObjectList.Create(True);and this then means that the TObjectList 'owns' all objects added to it, and it will free then when they are deleted without you having to do any work yourself...
MyObjectList.Delete( idx );
//same as
var
tmp: TObject;
begin
tmp := TObject ( MyList[idx] );
try
MyList.Delete(idx);
finally
tmp.free;
{ might also need the line 'MyList.Pack;'}
end;
end;You can extend it or wrap it to allow you classes to be accessed directly, but something like:
var
tmp: TMyClass;
idx: integer;
begin
tmp := TMyClass.Create;
tmp.SomeStringField := 'test';
idx := MyObjectList.Add(tmp);
//accessing the stored class...
writeln( TMyClass( MyObjectList.Objects[idx] ).SomeStringField );
//or with type checking
writeln( ( MyObjectList.Objects[idx] as TMyClass ).SomeStringField );
//verifying that the class is of type TMyClass or Descends from it
if ( MyObjectList.Objects[idx] is TMyClass ) then
writeln( 'it is a TMyClass and it''s actual class type is ',
TMyClass( MyObjectList.Objects[idx] ).ClassName );
//^^^ no need for 'as' because we know it *is* a TMyClass
// or descendent instance.
end;The one thing I do suggest is not mixing unrelated classes in the list. Classes that all descend from a base class are fine, but putting unrelated TObject descendents in the same list can make juggling the type casting a little more work. It's better to have a base class with common functionality that you override in the decendents than disparate classes. You may need to reengineer some things, or to use multiple lists, but it will work out better in the long run imho.
There is also a TComponentList and a TClassList and a TInterfaceList too. All with similar properties.
Hope that helps...
Matt
---------------------------------------------
This message was sent using Mistral WebMail.
http://www.mistral.co.uk/