Получить класс по имени в Delphi
Я хотел бы написать функцию, которая принимает имя класса и приводит к соответствующему TClass. Я заметил, что функция System.Classes.GetClass не работает, если имя класса не зарегистрировано.
Пример:
if(GetClass('TButton') = nil)
then ShowMessage('TButton not found!')
else ShowMessage('TButton found!');
Предыдущий код всегда показывает "TButton not found!". Чего-то не хватает? Надеюсь, кто-нибудь может мне помочь. Спасибо!
1 ответ
Вы можете получить незарегистрированный класс, используемый в приложении Delphi, через расширенный RTTI. Но вы должны использовать полное имя класса, чтобы найти класс. TButton
не будет достаточно, вы должны искать Vcl.StdCtrls.TButton
uses
System.Classes,
System.RTTI;
var
c: TClass;
ctx: TRttiContext;
typ: TRttiType;
begin
ctx := TRttiContext.Create;
typ := ctx.FindType('Vcl.StdCtrls.TButton');
if (typ <> nil) and (typ.IsInstance) then c := typ.AsInstance.MetaClassType;
ctx.Free;
end;
Регистрация класса гарантирует, что класс будет скомпилирован в приложение Delphi. Если класс нигде не используется в коде и не зарегистрирован, он не будет присутствовать в приложении, и в этом случае будет полезен расширенный RTTI.
Дополнительная функция, которая будет возвращать любой класс (зарегистрированный или незарегистрированный) без использования полного имени класса:
uses
System.StrUtils,
System.Classes,
System.RTTI;
function FindAnyClass(const Name: string): TClass;
var
ctx: TRttiContext;
typ: TRttiType;
list: TArray<TRttiType>;
begin
Result := nil;
ctx := TRttiContext.Create;
list := ctx.GetTypes;
for typ in list do
begin
if typ.IsInstance and (EndsText(Name, typ.Name)) then
begin
Result := typ.AsInstance.MetaClassType;
break;
end;
end;
ctx.Free;
end;