是否可以通过调用方法在运行时根据类型创建对象.
我想要实现的是
var
lForm1 : TForm;
lForm2 : TForm;
begin
CreateObjects([lForm1, lForm2]);
// After this call I have the variables initialized and I can use them.
end;
Run Code Online (Sandbox Code Playgroud)
问题中的信息不足.
表单对象(在问题中)的"类型"来自何处?它只是一个类型名称?CreateObjects()如何发现每个对象所需的类型?
它不能来自传入的对象引用的"类型",因为这可能(并且几乎肯定会在您的示例中)仅仅是一个基本类型,所需的具体类型最终将从该类型派生.
如果没有关于您的具体实施目标和约束的更详细信息,则无法获得完整,具体的答案.
但是,一般而言,您可以通过虚拟构造函数和VCL提供的RegisterClass/FindClass基础结构的组合来实现.
简单来说,你将有一个基类,它引入了用于实例化类的公共构造函数[对于TComponent派生类,它已经以Create(Owner:TComponent)构造函数的形式存在].
然后,您可以在运行时使用FindClass('TClassName')获取对任何(已注册)类的引用.这将返回一个类引用,然后您可以使用它来调用相应的虚拟构造函数:
type
TFoo = class ....
TFooClass = class of TFoo;
// etc
var
someClass: TFooClass;
someObj: TFoo;
begin
someClass := TFooClass(FindClass('TFooDerivedClass'));
someObj := someClass.Create(nil);
:
Run Code Online (Sandbox Code Playgroud)
注意在上面的那TFooDerivedClass是最终从派生的类TFooClass(并且假设为简单起见,以依次从派生TComponent和实例化与NIL在这种情况下所有者).可以使用FindClass()找到已在类型系统中注册的类.这包括应用程序中某些DFM引用的任何控件或组件类.可以使用RegisterClass()显式注册需要注册的任何其他类.
您的特定应用程序如何识别所涉及的对象类型以及任何类型名称到其他任意标识系统的映射是您必须要处理的实现细节.
| 归档时间: |
|
| 查看次数: |
6038 次 |
| 最近记录: |