最近我发现了一段从字符串创建TButton实例的代码:'TButton'被用作参数。如何从提供类名称的字符串创建实例?
见"Is there a way to instantiate a class by its name in Delphi?"
我想任何对象的published属性保存到一个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对象可能已创建,但其构造函数未使用。
非常感谢,梅森。它现在的作品....非凡... :-) – lyborko 2009-12-08 14:13:37
很高兴能够帮助! – 2009-12-08 14:27:15