I have classnames in a stringlist. For example it could be 'TPlanEvent', 'TParcel', 'TCountry' etc.
Now I want to find out the sizes by looping the list.
It works to have:
Size := TCountry.InstanceSize;
But I want it like this:
for i := 0 to ClassList.Count - 1 do
Size := StringToClass(ClassList[i]).InstanceSize;
Obviously my question is what to write instead of method StringToClass to convert the string to a class.
Since you're using a stringlist you can store the classes there, too:
var
C: TClass;
StringList.AddObject(C.ClassName, TObject(C));
...
for I := 0 to StringList.Count - 1 do
Size := TClass(StringList.Objects[I]).InstanceSize;
...
If your classes derive from TPersistent you can use RegisterClass and FindClass or GetClass . Otherwise you could write some kind of registration mechanism yourself.
In Delphi 2010 you can use:
function StringToClass(AName: string): TClass;
var
LCtx: TRttiContext;
LTp: TRttiType;
begin
Result := nil;
try
LTp := LCtx.FindType(AClassName);
except
Exit;
end;
if (LTp <> nil) and (LTp is TRttiInstanceType) then
Result := TRttiInstanceType(LTp).Metaclass;
end;
One note. Since you only keep the class names in the list this method will not work because TRttiContext.FindType expects a fully qualified type name (ex. uMyUnit.TMyClass). The fix is to attach the unit where you store these classes in the loop or in the list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With