Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert classname as string to a class?

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.

like image 401
Roland Bengtsson Avatar asked Apr 28 '10 07:04

Roland Bengtsson


4 Answers

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;

...

like image 116
Ondrej Kelle Avatar answered Oct 12 '22 21:10

Ondrej Kelle


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

like image 34
Uli Gerhardt Avatar answered Oct 12 '22 22:10

Uli Gerhardt


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.

like image 32
alex Avatar answered Oct 12 '22 20:10

alex


  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.
like image 25
da-soft Avatar answered Oct 12 '22 22:10

da-soft