有没有办法仅通过名称动态创建表单?这个概念是这样的。我有一个主表单,并且通过一些用户选择,必须创建一些预定义的表单并将其停靠在主表单上的 pagecontols 上的 tabitems 上。我确实知道表单的名称,并且我确实知道何时创建每个表单,但我想知道是否有更好的方法通过单个过程调用来创建这些表单,并且在我的代码中没有所有这些信息.
它的 Delphi XE3 firemonkey,在 win 7 上。
提前感谢您的帮助
有没有办法仅通过名称动态创建表单?这个概念是这样的。我有一个主表单,并且通过一些用户选择,必须创建一些预定义的表单并将其停靠在主表单上的 pagecontols 上的 tabitems 上。我确实知道表单的名称,并且我确实知道何时创建每个表单,但我想知道是否有更好的方法通过单个过程调用来创建这些表单,并且在我的代码中没有所有这些信息.
它的 Delphi XE3 firemonkey,在 win 7 上。
提前感谢您的帮助
显然在 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;
只有当您有一个类引用时,您才能创建对象。要获取给定字符串名称的某项的类引用,请调用FindClass
. 在结果上调用构造函数。在编译器允许您访问所需的构造函数之前,您可能必须将结果类型转换为不同的元类。在 VCL 中,您可以使用TFormClass
,但普通的 oldTComponentClass
也可以,因为所有 FireMonkey 对象都是 ; 的后代TComponent
。重要的部分是您可以访问正确的构造函数,这就是您需要的构造函数的介绍。
它仅适用于已注册的课程。您的表单类应该由 Delphi 自动注册,但如果没有,您可以RegisterClasses
手动调用,或者RegisterFmxClasses
如果您需要将类放在组中。