2012-12-22 81 views
1

有没有办法只根据名称来动态地创建表格; 这个概念是这样的。我有一个主窗体,并且通过一些用户选择,必须创建一些预定义窗体并停靠在主窗体上的页面控件上的Tabitems上。 我知道的形式的名字,我知道什么时候创建这些每个人,但我想知道如果一个过程调用创建这些形式,并没有在所有的这些信息的更好的方式我码。按名称动态创建表单?

其德尔福XE3 firemonkey,在Win 7

提前感谢所有帮助

回答

5

显然对Firemonkey德尔福不会自动注册表单类是可用的名字,所以你首先需要像这样添加一些能够改变你的窗体类单位的末尾:

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

,当你有这方面的类引用您只能创建对象。要获得给定字符串名称的类引用,请致电FindClass。在结果上调用构造函数。在编译器允许您访问所需的构造函数之前,您可能必须将结果键入到不同的元类中。在VCL,您可以使用TFormClass,但普通的老式​​会工作,也因为所有FireMonkey对象是TComponent后裔;最重要的部分是你可以访问正确的构造函数,这就是你需要的构造函数的介绍。

它仅适用于已类注册。你的表单类应该由Delphi自动注册,但如果他们没有,你可以打电话RegisterClasses手动或RegisterFmxClasses如果你需要把你的班级群。

Delphi.About.com has a VCL demonstration.

+0

谢谢你的帮助,但与firemonkey.There的一个问题是没有TFormClass获得类名,它在delph.about示例中。在findClass的程序,返回TPersistentClass类型,我不能强制转换它TForm的,我无法通过新的形式owner.Any想法? – ManosM

+1

不要输入到TForm;结果不是那种类型。类型转换为* metaclass *类型。 VCL和FMX之间的差异并不大。 –