我的问题是如何访问另一个单元中的类?举个例子:
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。 我知道有这样的问题,但他们没有帮助我。
提前致谢!
答案 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]);