主页C++ Builder 资料C++ Builder 操作指南有多个窗口的程序使用另一个窗口
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
IDE外观和窗口布局方案
欢迎页面
创建和管理项目
创建和管理项目组
编译、运行和调试程序
项目的常用的重要配置
窗口画面编辑
有多个窗口的程序
 • 创建和管理窗口
 • 使用另一个窗口
程序的显示主题/切换皮肤
编辑程序代码
安装第三方控件/组件包
快捷键大全
IDE或编译器出错处理
C++ Builder 参考手册
网友留言/技术支持
在一个窗口里面使用另一个窗口 - 有多个窗口的程序
 • 使用向导在一个窗口里面添加使用另一个窗口
 • 直接写程序在一个窗口里面添加使用另一个窗口
 • 模态窗口和非模态窗口
 • 动态创建和自动销毁窗口

在一个窗口里面使用另一个窗口

在 Form1 里面,使用 Form2,即在 Unit1.cpp 里面使用 Unit2.cpp 和 Unit2.h 里面的内容:

使用向导在一个窗口里面添加使用另一个窗口

切换到 Form1 画面或者 Unit1.cpp 程序代码,然后选择菜单 File → Use Unit... 或者快捷键 Alt + F11

上面的表里面列出来除了 Form1 他自己之外的其他所有可用的程序单元,包括了 Form2 的 Unit2.cpp,如果要使用 Form2,就选择 Unit2.cpp

下面的 Add to:选择在哪里使用 Unit2.cpp,
 • Header: 在头文件里面,即在 Form1.h 里面使用,
 • Source: 在源程序里面,即在 Unit1.cpp 里面使用 Unit2.h。

如果加在了头文件 .h 里面,源程序 .cpp 里面也可以使用 Unit2;如果加在了源程序 .cpp 里面了,头文件 .h 里面就不能用 Unit2。如果不需要在 .h 里面使用,加在 .cpp 里面,会加快编译速度,在编译结果和运行速度上并没有什么区别。

例如,选择了 Unit2.cpp 和 Source,然后点击 OK 按钮,发现在 Unit1.cpp 里面多了一行程序 #include "Unit2.h":

如果,选择了 Unit2.cpp 和 Header,然后点击 OK 按钮,是在 Unit1.h 里面多了一行程序 #include "Unit2.h":

 

直接写程序在一个窗口里面添加使用另一个窗口

如果不使用向导,就可以直接在程序里面添加

#include "Unit2.h"

这行程序代码,加在 Unit1.h 或者 Unit1.cpp 里面,就和前面的截图一样的位置,起到同样的效果。

 

模态窗口和非模态窗口

模态窗口:
 • 打开模态窗口显示的时候,只有模态窗口可以操作,其他窗口全部被禁用,无法操作。
 • 程序停在了显示模态窗口的语句上,不继续往下执行,一直到关闭模态窗口,显示模态窗口的函数会返回关闭模态窗口时的 ModalResult,程序继续执行下一条语句。
 • 在显示模态窗口期间 Windows 消息并没有停止,例如还会产生定时器消息等,其他窗口对键盘和鼠标没有响应是因为其他窗口的操作被禁用了,此时只能操作模态窗口。

非模态窗口:
 • 打开非模态窗口显示的时候,所有的窗口都会保持原来的状态,不会被禁用。
 • 程序不会停下来,会继续执行显示非模态窗口的下一条语句。
 • 显示非模态窗口期间不会影响其他任何窗口的执行,只是相当于又多显示出来一个窗口。

例如:在 Form2 上放两个按钮:Button1 和 Button2
Button1 的 ModalResult 属性选择 mrOk,Caption 属性输入 “确定”。
Button2 的 ModalResult 属性选择 mrCancel,Caption 属性输入 “取消”。

在 Form1 上放两个按钮 Button1 和 Button2。
Button1 为打开模态窗口,Caption 属性输入 “打开模态窗口”。
Button2 为打开非模态窗口,Caption 属性输入 “打开非模态窗口”。

双击 Button1 进入程序代码编辑,会自动生成点击 Button1 执行的函数:Button1Click,在这个函数里面写:

双击 Button2 进入程序代码编辑,会自动生成点击 Button2 执行的函数:Button2Click,在这个函数里面写:

运行的效果:

点击 Button1 按钮,打开模态窗口,此时停留在 int r = Form2->ShowModal(); 这条语句上,没有继续往下执行,显示出 Form2 窗口。如果点击 “确定” 按钮,Form2 关闭,程序往下执行,判断 if(r==mrOk) 为真,执行显示提示:“你点击了确定按钮!”,如果点击了 “取消” 按钮,if(r==mrOk) 为假,不显示任何提示。

点击 Button2 按钮,打开非模态窗口 Form2,此时还能继续操作 Form1。点击非模态窗口 Form2 上的 “确定” 和 “取消” 按钮都没有反应,因为这两个按钮里面都没有写程序代码,他们只是选择了在模态窗口里面关闭窗口的属性 ModalResult,这个属性在非模态窗口里面没有作用。

 

动态创建和自动销毁窗口

动态创建

在 Project → Options 的 Forms (管理窗口) 里面,Available forms 里面的窗口,程序运行时并没有创建出来,必须动态创建。

动态创建模态窗口

动态创建非模态窗口

由于非模态窗口不知道用户什么时候关闭,也就不能立即销毁,如果销毁,窗口就消失了。

重复点击 Button4 按钮,会创建多个 Form2 显示出来。
默认情况,用户关闭窗口的时候,只是隐藏,而并没有销毁窗口,没有释放窗口占用的资源,这样重复点击 Button4 按钮,会创建出来很多 Form2 窗口,占用的资源也越来越多,产生了内存泄漏。

如果需要在用户关闭窗口的时候销毁,需要在事件里面进行 “自动销毁”。

自动销毁

 • 模态窗口不需要自动销毁,因为程序里面能够准确的判断需要销毁的位置。
 • 非模态窗口由于不知道创建之后,用户什么时候关闭窗口,所以需要在窗口的 OnClose 事件里面进行销毁。

事件页面里面,找到 OnClose 事件,

双击 OnClose 事件右面空白区域,如上图画圈的位置,会自动生成 FormClose 函数,此时那个位置显示 OnClose 事件关联的 FormClose 函数名,并且在源程序里面,定位到刚刚生成的 FormClose 函数里面。以后再双击事件页面里面的 OnClose 函数关联的 FormClose,即画圈的位置,也会定位到源程序的 FormClose 函数。生成的函数如下图所示。

在 OnClose 事件里面,Action 可以是以下表格里面的值。

caNone 忽略关闭动作,什么也不处理
caHide 隐藏窗口,这是 Action 的默认值
caFree 销毁窗口,释放窗口占用的资源
caMinimize 最小化窗口

不仅仅是在用户点击 “×” 关闭窗口,包括在程序里面调用 Form2->Close(); 都会产生 OnClose 事件,并且执行事件关联的函数 FormClose,对于关闭的处理,由上面表格里面的 Action 的值来确定。

◤上一页:创建和管理窗口

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号