2015-04-06 3 views
3

Я хотел бы написать функцию, которая принимает имя класса и приводит к соответствующему TClass. Я заметил, что функция System.Classes.GetClass не работает, если имя класса не зарегистрировано.Получить класс по его имени в Delphi

Пример:

if(GetClass('TButton') = nil) 
then ShowMessage('TButton not found!') 
else ShowMessage('TButton found!'); 

Предыдущий код всегда показывает 'TButton не найден!'. Есть что-то не хватает? Надеюсь, кто-то может мне помочь. Спасибо!

ответ

5

Вы можете получить незарегистрированный класс, используемый в приложении 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; 
+0

Спасибо за ясный и полный ответ. Я полагаю, что нет обходного пути, чтобы избежать использования полностью квалифицированного класса. – Hwau

+0

Я добавил дополнительную функцию, которую вы можете использовать, не используя полное имя класса –

+0

Amazing! Я не умею использовать Rtti, я бы никогда не нашел решение! Спасибо вам большое! – Hwau

Смежные вопросы