Is there a way to instantiate a class by its name in delphi?

Ricardo Acras picture Ricardo Acras · Mar 31, 2009 · Viewed 13.6k times · Source

I'd like to instantiate a class but I only have its name in a string. Is there a way?

Answer

Ralph M. Rickenbach picture Ralph M. Rickenbach · Mar 31, 2009

This is from Delphi help (Delphi 2006, but also available from at least Delphi 7):

Syntax function GetClass(const AClassName: string): TPersistentClass;

Description Call GetClass to obtain a class from a class name. This class can be used as a parameter to routines that require a class. The Class must be registered before GetClass can find it. Form classes and component classes that are referenced in a form declaration (instance variables) are automatically registered when the form is loaded. Other classes can be registered by calling RegisterClass or RegisterClasses .

Here some sample code. Works as such only because TButton is a TControl and therefore the typecast is valid.

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterClasses([TButton, TForm]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CRef : TPersistentClass;
  AControl : TControl;
begin
  CRef := GetClass('TButton');
  if CRef<>nil then
  begin
     AControl := TControl(TControlClass(CRef).Create(Self));
     with AControl do
     begin
        Parent := Self;
        Width := 50;
        Height := 30;
     end;
  end;
end;