Delphi GetClass

时间:2011-10-12 09:25:35

标签: delphi class delphi-7

我的问题是如何访问另一个单元中的类?举个例子:

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方法总是返回nil。 我知道有这样的问题,但他们没有帮助我。

提前致谢!

4 个答案:

答案 0 :(得分:5)

鉴于 d 定义为TData,您不能简单地使用d := TData.Create()吗?

无论如何,如果你想从它的名字创建一个类,你必须(看this link)在使用RegisterClass之前调用GetClass或者那个类将无法被识别,你得到一个nil

答案 1 :(得分:5)

如果您使用的是后来的Delphi版本之一,则可以使用RTTI单元。

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

在您的示例中,TIn不是内部类,但也可以像这样访问内部类:

R.FindType('Data.TData.TIn')

答案 2 :(得分:4)

您没有注册课程。您需要致电RegisterClass

  

如果我只有字符串中的名字,我如何注册课程?

通常,您会在声明该类的初始化部分单元中调用RegisterClass

当您来RegisterClass时,您会发现该课程需要来自TPersistent

procedure RegisterClass(AClass: TPersistentClass);

答案 3 :(得分:2)

请阅读GetClass documentation。它仅适用于已注册的持久类。因此,为了使用它,你必须改变的第一件事是来自TPersistent,即

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

然后你必须确保该类被注册,即你必须在单元的初始化部分调用RegisterClasses

initialization
  RegisterClasses([TData]);