按名称动态创建表单?

时间:2012-12-22 16:11:29

标签: delphi delphi-xe3 firemonkey-fm2

是否有办法仅通过名称动态创建表单; 这个概念是这样的。我有一个主窗体,通过一些用户选择,必须创建一些预定义的窗体并停靠在主窗体上的pagecontols上的tabitems上。 我知道表单的名称,我知道何时创建其中的每一个,但我想知道是否有更好的方法通过单个过程调用创建这些表单,并且我的代码中没有所有这些信息

它的Delphi XE3 firemonkey,获胜7。

提前感谢您提供任何帮助

2 个答案:

答案 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如果您需要将您的类分组。

Delphi.About.com has a VCL demonstration.