Delphi GetClass - PullRequest
       6

Delphi GetClass

1 голос
/ 12 октября 2011

Мой вопрос: как получить доступ к классу, который находится в другом модуле? Для примера:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes,
  System,
  StrUtils,
  Math,
  TypInfo,
  Data in 'Data.pas';

var
  Str, name, value                      : string;
  List, tmpList                         : TStringList;
  i                                     : Integer;
  Obj                                   : TObject;
  CRef                                  : TPersistentClass;
  d                                     : TData;
begin
  d := TData(GetClass('Data.TData').Create);
  Writeln(Format('%s', [d.Name]));
  Readln;
  Readln;
end.

И блок данных:

unit Data;

interface
 uses
  SysUtils,
  Classes;
type
  TData = class(TObject)
    FName : string;
  published
    property Name : string read FName write FName;
  end;
type
  TIn = class(TObject)
    FName : string;
  published
    property Name : string read FName write FName;
  end;
implementation

end.

Проблема в том, что метод GetClass возвращает мне всегда ноль. Я знаю, что есть такие вопросы, но они не помогли мне.

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 12 октября 2011

Если вы используете одну из более поздних версий Delphi, вы можете использовать модуль RTTI.

uses RTTI;
..
  var
    R : TRttiContext;
  begin
    R.FindType('Data.TData')
...

В вашем примере TIn не является внутренним классом, но к внутренним классам также можно получить доступ следующим образом:

R.FindType('Data.TData.TIn')
5 голосов
/ 12 октября 2011

Учитывая, что d определяется как TData, вы не можете просто использовать d := TData.Create()?

В любом случае, если вы хотите создать класс из его имени, вы должны (посмотрите эту ссылку ) вызвать RegisterClass, прежде чем использовать GetClass, иначе этот класс не будет распознан, и выполучите nil.

4 голосов
/ 12 октября 2011

Вы не зарегистрировали класс. Вам нужно позвонить RegisterClass.

Как я могу зарегистрировать класс, если у меня есть только имя в строке?

Обычно вы вызываете RegisterClass в блоке секции инициализации, который объявляет класс.

Когда вы позвоните RegisterClass, вы обнаружите, что класс должен быть получен из TPersistent:

procedure RegisterClass(AClass: TPersistentClass);
2 голосов
/ 12 октября 2011

Пожалуйста, прочитайте документацию GetClass . Работает только с зарегистрированными постоянными классами . Итак, первое, что вы должны изменить для того, чтобы использовать его, это спуск с TPersistent, т.е.

type
  TData = class(TPersistent)
    FName : string;
  published
    property Name : string read FName write FName;
  end;

и затем вы должны убедиться, что класс зарегистрирован, т.е. вы должны вызвать RegisterClasses , возможно, в разделе инициализации модуля

initialization
  RegisterClasses([TData]);
...