这段时间在对照侯老师的《深入浅出MFC》学习Delphi,有一个问题提出来供大家讨论,也就是Delphi下对象的动态生成问题,即给定一个代表类名的字符串,希望生成该类的一个实例。
。VC下面对象的动态生成实现原理
大家都知道VC下面对象的动态生成实现原理,其核心有两点:
1、利用C++里面支持类的静态成员变量的特点,使每个支持实例动态生成的类都有一个包含该类CRunTimeClass指针和类名字符串的结构类型的静态成员变量;
2、利用C++结构类型里面定义结构或类类型的变量时自动调用该结构或类的构造函数的特点将该静态成员变量插入到一个全局范围的型别网中;
这样在要生成动态生成类实例的时候,只需要遍历该型别网,根据类名字符串找到该类的静态成员变量,根据其CRunTimeClass指针调用相应的函数就可生成类的实例。
。Delphi下面对象的动态生成的实现(以生成窗口为例)
1、需在project单元里面调用RegisterClass(窗口类名)函数对类进行注册;
2、在需要动态生成的地方调用以下代码:
function DynaCreateForm(szFormClass):TForm;
var
form:TForm;
pc:TPersistentClass;
begin
pc:=GetClass(szFormClass);
Application.CreateForm(TComponentClass(pc),form);
result:=form;
end;
。缺陷分析
C++里面对对象动态的支持在类类部就可实现,而在Delphi里面因为没有静态成员变量(虽然可以用全局变量代替,但从封装性方面考虑效果较差)以及要显式调用类的构造函数,因此虽可实现,但在封装性和便利性比起C++要差多了。
。VC下面对象的动态生成实现原理
大家都知道VC下面对象的动态生成实现原理,其核心有两点:
1、利用C++里面支持类的静态成员变量的特点,使每个支持实例动态生成的类都有一个包含该类CRunTimeClass指针和类名字符串的结构类型的静态成员变量;
2、利用C++结构类型里面定义结构或类类型的变量时自动调用该结构或类的构造函数的特点将该静态成员变量插入到一个全局范围的型别网中;
这样在要生成动态生成类实例的时候,只需要遍历该型别网,根据类名字符串找到该类的静态成员变量,根据其CRunTimeClass指针调用相应的函数就可生成类的实例。
。Delphi下面对象的动态生成的实现(以生成窗口为例)
1、需在project单元里面调用RegisterClass(窗口类名)函数对类进行注册;
2、在需要动态生成的地方调用以下代码:
function DynaCreateForm(szFormClass):TForm;
var
form:TForm;
pc:TPersistentClass;
begin
pc:=GetClass(szFormClass);
Application.CreateForm(TComponentClass(pc),form);
result:=form;
end;
。缺陷分析
C++里面对对象动态的支持在类类部就可实现,而在Delphi里面因为没有静态成员变量(虽然可以用全局变量代替,但从封装性方面考虑效果较差)以及要显式调用类的构造函数,因此虽可实现,但在封装性和便利性比起C++要差多了。
解决方案 »
- idftp如何匿名下载
- 如何把表中的当前记录添加到另一个相同结构的表中?
- 过年了,送分!!
- 图片加密
- 高手共商--控件的底层开发!
- 如何设置BDE连接到ORACLE 9I??请详尽一点,我这里客户端也安装了!
- 高分解决简单问题?为什么我用XMLBroker和InetXPageProducer做的Web程序不可以在IE中运行?
- 关于Access中日期的问题!
- type里面的 Button1: TButton;代表什么意思?他和TForm4 = class(TForm)是一个意思吗?
- 关于Delphi 6.0和ADO编程的一些注重事项能否告之。
- 材料出入库,如何建表最理想?(网络版)
- 请问delphi中有没有一种结构,象c语言中的联合(union)一样?
result:=form;可以用下面的语句代替:form := pc.Create(Application);
你说的是这个问题吧,如果是,现在解决了吧?
Result := pc.Create(nil);这样他就与Application无关了,不过这样你要自己处理对象的释放
type TMyClass = Class of TControl;function CreateControl(ControlClass:TMyClass;Const ControlName:string;x,y,w,h:integer):TControl;
begin
Result:=TMyClass.Create(Mainform);
with Result do
begin
Parent:=Mainform;
Name:=ControlName;
SetBounds(x,y,w,h);
Visible:=true;
end;
end;稍改一下,就可以不管是什么类的,因为创建什么类的对象的工作是在运行期决定的。
OK给分!