1

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

它的 Delphi XE3 firemonkey,在 win 7 上。

提前感谢您的帮助

4

2 回答 2

6

显然在 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;
于 2012-12-23T11:47:28.600 回答
1

只有当您有一个类引用时,您才能创建对象。要获取给定字符串名称的某项的类引用,请调用FindClass. 在结果上调用构造函数。在编译器允许您访问所需的构造函数之前,您可能必须将结果类型转换为不同的元类。在 VCL 中,您可以使用TFormClass,但普通的 oldTComponentClass也可以,因为所有 FireMonkey 对象都是 ; 的后代TComponent。重要的部分是您可以访问正确的构造函数,这就是您需要的构造函数的介绍。

它仅适用于已注册的课程。您的表单类应该由 Delphi 自动注册,但如果没有,您可以RegisterClasses手动调用,或者RegisterFmxClasses如果您需要将类放在组中。

Delphi.About.com 有一个 VCL 演示。

于 2012-12-23T07:04:42.680 回答