views:

319

answers:

4

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.

+1  A: 
  1. You have to use FindClass to find the class reference by its name. If class is not found, then the exception will be raised.
  2. Optionally, you have to call RegisterClass for your classes, if they are not referenced explicitly in the code.
da-soft
+7  A: 

If your classes derive from TPersistent you can use RegisterClass and FindClass or GetClass . Otherwise you could write some kind of registration mechanism yourself.

Ulrich Gerhardt
+4  A: 

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.

alex
Unfortunately I use Delphi 2007
Roland Bengtsson
+8  A: 

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;

...

TOndrej
+1. Simpler than the FindClass solution. :-)
Ulrich Gerhardt
this of course only works, if the OT fills the list himself, not if that list is for instance read from a file or something like that...
Oliver Giesen