最近我发现了一段代码,可以通过一个字符串创建TButton的实例:'TButton'被用作参数。
请参见"有没有办法在Delphi中按名称实例化类?" 我正在尝试将任何对象的已发布属性保存到XML文件中(这很好用),最近我想从XML文件中重新创建这些对象。在该文件中写入应该创建哪个类(例如TButton),然后是一个属性列表,应加载到此运行时创建的对象中。
上面的示例展示了如何执行此操作,但对于我自己的类不起作用。请参见下面的代码:
请参见"有没有办法在Delphi中按名称实例化类?" 我正在尝试将任何对象的已发布属性保存到XML文件中(这很好用),最近我想从XML文件中重新创建这些对象。在该文件中写入应该创建哪个类(例如TButton),然后是一个属性列表,应加载到此运行时创建的对象中。
上面的示例展示了如何执行此操作,但对于我自己的类不起作用。请参见下面的代码:
TTripple=class (TPersistent)
FFont:TFont;
public
constructor Create;
Destructor Destroy;override;
published
property Font:TFont read FFont write FFont;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TTripple.Create;
begin
inherited;
FFont:=TFont.Create;
end;
destructor TTripple.Destroy;
begin
FFont.Free;
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TButton, TForm, TTripple]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CRef : TPersistentClass;
APer : TPersistent;
begin
// CRef := GetClass('TButton');
CRef := GetClass('TTripple');
if CRef<>nil then
begin
APer := TPersistent(TPersistentClass(CRef).Create);
ShowMessage(APer.ClassName); // shows TTripple, what is correct
if APer is TTripple then (APer as TTripple).Font.Color:=90;
/// Here I get error message, because TTriple was not created... ?!?!?!
end;
end;
我无法通过。TTripple对象可能已经被创建,但其构造函数未被使用。