C++Builder之VCL窗体和控件是如何实例化成对象运行的?
VCL类库的窗体及每个控件都是一个类(比如TForm1、TButton),可以用类或者类的信息(元类,TMetaClass)来创建一个对象,这个对象就可以运行了。
C++Builder设计期新建的窗体及放置在窗体上的控件,IDE会通过RTTI机制自动创建窗体对象以及控件的对象,它们是在设计期运行的。
C++Builder编译的EXE,运行的时候会从EXE资源区段读取窗体的描述数据(就是.dfm文件里面描述的,编译时作为资源嵌入EXE)反系列化、实例化成窗体及控件对象(通过RTTI机制),窗口程序就可以显示、操作运行了,.dfm文件里面描述的就是设计期的窗体以及放置的控件。
程序代码也可以用new来动态创建控件的对象,和动态创建普通类的对象略有不同,因为动态创建的控件对象可以指定Owner,还可以设置它的Parent,VCL的机制保证它的Owner或者Parent析构的时候自动销毁它,所以它可以不用写代码手动delete,当然要手动delete也可以,但要注意delete顺序避免二次delete(一般先delete子控件后Parent控件),二次delete会造成Access Violation运行错误。