Вы можете получить незарегистрированный класс, используемый в приложении 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;
Спасибо за ясный и полный ответ. Я полагаю, что нет обходного пути, чтобы избежать использования полностью квалифицированного класса. – Hwau
Я добавил дополнительную функцию, которую вы можете использовать, не используя полное имя класса –
Amazing! Я не умею использовать Rtti, я бы никогда не нашел решение! Спасибо вам большое! – Hwau