【问题标题】:Delphi GetClass德尔福GetClass
【发布时间】:2011-10-12 09:25:35
【问题描述】:

我的问题是如何访问其他单元中的课程?举个例子:

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。 我知道有这样的问题,但他们没有帮助我。

提前致谢!

【问题讨论】:

  • 那不是内部类。看来您需要改进您的问题。

标签: delphi class delphi-7


【解决方案1】:

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

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

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

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

【讨论】:

  • 您使用的是哪个版本的 Delphi? RTTI 单元是最接近您在 Delphi 中找到的 Java 反射的。
【解决方案2】:

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

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

【讨论】:

  • 是的,我可以,但问题是我必须从字符串中的类名创建一个实例。
  • 是的,我必须使用 RegisterClass 方法,但对于该类,我只有字符串中的名称。如果我只有字符串中的名称,如何注册课程?
  • @Jordan Borisov:David Heffernan 和 ain 回答了你的最后一个问题,看看
  • @Jordan Borisov:你没有 TData 类的源代码吗?或者你只是一个例子,你想创建任何用户给你的名字?
  • @Jordan Borisov:好的,但是如果你必须访问 any 类,那么你可以用 taht 类做什么? Beeing generic 你不知道它的属性和方法......如果你不使用 RTTI 得到它......那么,它的主要目标是什么?
【解决方案3】:

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

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

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

当你调用RegisterClass你会发现类需要从TPersistent派生:

procedure RegisterClass(AClass: TPersistentClass);

【讨论】:

  • 我知道问题是我只有字符串类型的类名!
  • @Jordan 如果您想使用GetClass,您需要致电RegisterClass。你为什么不这样做呢?
  • 我不明白为什么人们在没有评论您的答案有什么问题的情况下对您投了反对票...
  • 哦,相信我,我真的不知道!!我在问原因,但我找不到它......
  • +1 大卫,感谢您在Top delphi Answerers stackoverflow.com/tags/delphi/topusers 中获得第一名
【解决方案4】:

请阅读GetClass documentation。它仅适用于注册的持久类。所以为了使用它,你必须改变的第一件事是从 TPersistent 继承,即

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

然后您必须确保该类已注册,即您必须调用RegisterClasses,可能在单元的初始化部分中

initialization
  RegisterClasses([TData]);

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2011-10-04
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多