Есть ли способ создать класс по имени в delphi?

Я хотел бы создать экземпляр класса, но у меня есть только его имя в строке. Есть ли способ?

Ответ 1

Это из справки Delphi (Delphi 2006, но также доступно, по крайней мере, с Delphi 7):

Синтаксис function GetClass (const AClassName: string): TPersistentClass;

Описание Вызовите GetClass, чтобы получить класс из имени класса. Этот класс может использоваться как параметр для подпрограмм, требующих класса. Класс должен быть зарегистрирован до того, как GetClass сможет его найти. Классы форм и классы компонентов, на которые ссылаются в объявлении формы (переменные экземпляра), автоматически регистрируются при загрузке формы. Другие классы могут быть зарегистрированы путем вызова RegisterClass или RegisterClasses.

Вот пример кода. Работает как таковая только потому, что TButton является TControl, и поэтому действительный тип действителен.

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;

Ответ 2

Когда мне нужно было это сделать, я создал свой собственный объект Factory, который использует специально подклассу TStringList, в настоящее время я использую Delphi 7, поэтому класс списка строк поддерживает только прикрепление объекта к строке, а затем я получил подкласс TStringList, чтобы он также мог обрабатывать типы классов, поэтому теперь я могу создать экземпляр объекта, просто передав его имени класса в factory. Работает так:

1st - загрузить объект Singleton Factory;
2-й - зарегистрировать любой объект в factory, может быть в разделе инициализации устройства;

Основными методами Factory могут быть: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;

Таким образом, я могу создать экземпляр любого объекта или использовать предыдущий экземпляр объекта или даже его подмножество.

Я скорее использую тип Enumerated вместо строки для идентификации класса.

Примечания: Это очень, очень краткий пример, полностью функциональный код более сложный, но, верьте мне, не слишком много.