在一个窗口里面使用另一个窗口
在 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":
直接写程序在一个窗口里面添加使用另一个窗口
如果不使用向导,就可以直接在程序里面添加
这行程序代码,加在 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 的值来确定。
|