Есть ли способ создать экземпляр класса по его имени в Delphi? - PullRequest
11 голосов
/ 31 марта 2009

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

Ответы [ 2 ]

29 голосов
/ 31 марта 2009

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

Синтаксис Функция 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 голосов
/ 22 июня 2009

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

1-й - загрузка фабрики одноэлементных объектов;
2-й - Зарегистрировать любой объект на заводе, может быть в разделе инициализации устройства;

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

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

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

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

...