是否有办法仅通过名称动态创建表单; 这个概念是这样的。我有一个主窗体,通过一些用户选择,必须创建一些预定义的窗体并停靠在主窗体上的pagecontols上的tabitems上。 我知道表单的名称,我知道何时创建其中的每一个,但我想知道是否有更好的方法通过单个过程调用创建这些表单,并且我的代码中没有所有这些信息
它的Delphi XE3 firemonkey,获胜7。
提前感谢您提供任何帮助
答案 0 :(得分:5)
显然在Firemonkey上Delphi并不会自动注册表单类,因此你需要在包含表单类的单元末尾添加类似的内容:
unit Form10;
[ ... ]
// Right before the final "end."
initialization
RegisterFmxClasses([TForm10]);
end.
这将自动注册TForm10
,以便按名称提供。接下来,您可以使用此类代码在运行时通过其类名创建表单:
procedure TForm10.Button1Click(Sender: TObject);
var ObjClass: TFmxObjectClass;
NewForm: TCustomForm;
begin
ObjClass := TFmxObjectClass(GetClass(ClassName));
if ObjClass <> nil then
begin
NewForm := ObjClass.Create(Self) as TCustomForm;
if Assigned(NewForm) then
NewForm.Show;
end
end;
答案 1 :(得分:1)
只有拥有类引用时才能创建对象。要获取给定字符串名称的类的引用,请调用FindClass
。在结果上调用构造函数。在编译器允许您访问所需的构造函数之前,可能必须将结果类型转换为不同的元类。在VCL中,您可以使用TFormClass
,但是普通的TComponentClass
也可以使用,因为所有FireMonkey对象都是TComponent
的后代;重要的是你可以访问正确的构造函数,这就是你所需要的构造函数。
它仅适用于已注册的类。您的表单类应该由Delphi自动注册,但如果不是,您可以手动调用RegisterClasses
,或者RegisterFmxClasses
如果您需要将您的类分组。