Вероятно, есть более простой способ сделать это. Кажется, я помню, что нашел встроенный объект TClassList, который обрабатывал это, но в этот момент у меня уже была эта работа. TClassList не имеет способа поиска сохраненных объектов по имени строки, но он все еще может быть полезен.
В основном, чтобы это работало, вам нужно зарегистрировать ваши классы с глобальным объектом. Таким образом, он может принять строковый ввод для имени класса, найти это имя в списке, чтобы найти правильный объект класса.
В моем случае я использовал TStringList для хранения зарегистрированных классов, и я использую имя класса в качестве идентификатора класса. Чтобы добавить класс в член «object» списка строк, мне нужно было обернуть класс в реальный объект. Я признаю, что я действительно не понимаю «класс», так что это может не понадобиться, если вы разыгрываете все правильно.
// Needed to put "Class" in the Object member of the
// TStringList class
TClassWrapper = class(TObject)
private
FGuiPluginClass: TAgCustomPluginClass;
public
property GuiPluginClass: TAgCustomPluginClass read FGuiPluginClass;
constructor Create(GuiPluginClass: TAgCustomPluginClass);
end;
У меня есть глобальный объект "PluginManager". Здесь классы регистрируются и создаются. Метод «AddClass» помещает класс в TStringList, чтобы я мог посмотреть его позже.
procedure TAgPluginManager.AddClass(GuiPluginClass: TAgCustomPluginClass);
begin
FClassList.AddObject(GuiPluginClass.ClassName,
TClassWrapper.Create(GuiPluginClass));
end;
В каждом создаваемом классе я добавляю его в список классов в разделе «Инициализация».
initialization;
AgPluginManager.AddClass(TMyPluginObject);
Затем, когда придет время создать класс, я смогу найти имя в списке строк, найти класс и создать его. В моей действительной функции я проверяю, чтобы убедиться, что запись существует и имеет дело с ошибками и т. Д. Я также передаю дополнительные данные в конструктор класса. В моем случае я создаю формы, поэтому я на самом деле не возвращаю объект обратно вызывающей стороне (я отслеживаю их в своем PluginManager), но это будет легко сделать при необходимости.
procedure TAgPluginManager.Execute(PluginName: string);
var
ClassIndex: integer;
NewPluginWrapper: TClassWrapper;
begin
ClassIndex := FClassList.IndexOf(PluginName);
if ClassIndex > -1 then
begin
NewPluginWrapper := TClassWrapper(FClassList.Objects[ClassIndex]);
FActivePlugin := NewPluginWrapper.GuiPluginClass.Create();
end;
end;
Поскольку я впервые написал это, мне не нужно было трогать код. Я просто добавляю свои новые классы в список в разделе их инициализации, и все работает.
Чтобы создать объект, я просто вызываю
PluginManger.Execute('TMyPluginObject');