1. 掌握窗体对象的常用属性。
2. 掌握窗体对象的常用事件和方法。
3. 理解窗体的生命周期。
4. 了解在VB的一个工程中使用多个窗体的方法。
一、窗体及窗体生命周期演示程序
1. 设计目标
设计多窗体及窗体生命周期演示程序,学会在一个工程中使用多个窗体,理解窗体生命周期中的四个阶段,掌握常用的窗体对象的方法和事件。该程序的用户界面如图

在多窗体及窗体生命周期应用程序中,窗体模块共包含3个窗体:Form1、Form2、Form3,其中Form1是该工程中的启动窗体,其运行界面如图8-1所示。在Form1中包含14个命令按钮控件,其Caption属性分别如下:
Ø Command1的Caption属性为:“退出应用程序”
Ø Command2的Caption属性为:“测试窗体2创建”
Ø Command3的Caption属性为:“测试窗体2加载”
Ø Command4的Caption属性为:“测试窗体3创建”
Ø Command5的Caption属性为:“测试窗体3加载”
Ø Command6的Caption属性为:“Load Form2”
Ø Command7的Caption属性为:“Load Form3”
Ø Command8的Caption属性为:“Show Form2”
Ø Command9的Caption属性为:“Show Form3”
Ø Command10的Caption属性为:“Hide Form2”
Ø Command11的Caption属性为:“Hide Form3”
Ø Command12的Caption属性为:“卸载窗体2”
Ø Command13的Caption属性为:“卸载窗体3”
Ø Command14的Caption属性为:“卸载窗体1”
由于在程序运行后,屏幕上并没有出现窗体Form2和Form3,所以我们并不清楚这两个窗体到底处于窗体生命周期的哪个状态,所以我们想通过单击命令按钮Command1、Command2、Command3、Command4进行测试,并将测试结果显示在两个文本框中,这当然要通过运行一定的代码才能达到目的。另外,单击其他命令按钮所达到的功能,可通过该命令按钮上显示的内容看出。
2. 建立应用程序的用户界面并设置有关对象的属性
(1)根据图8-1所示,添加Form1上的有关对象并设置相关的属性,在Form1中共包含14个命令按钮控件、2个标签控件和2个文本框控件。
(2)在工程中添加Form2,并将该窗体的背景颜色设置为黄色。
(3)在工程中添加Form3,并将该窗体的背景颜色设置为青绿色。
3. 设计程序代码
根据需要,编写以下程序代码。
(1)单击命令按钮Command1,可退出应用程序。为实现该功能,应在以下事件中添加什么样的程序代码?
PrivateSub Command1_Click()
EndSub
(2)单击命令按钮Command2,应能测试出窗体Form2是否被创建。但怎样才能做到这一点呢?我们知道,当一个窗体经历了创建状态的话,则一定会引发Form_Initialize事件,若我们在窗体Form2的Form_Initialize事件中将某个变量设置为一个特定的值,则可根据该变量拥有什么样的值来确定窗体Form2是否被创建。不过需要注意的是,为了让Form2的Form_Initialize事件和Form1的Command2_Click事件能够共同使用一个变量,需要添加一个标准模块,并用Public进行声明。
在工程中添加一个标准模块,并在其中加入以下代码。
Publica As Integer '根据a的值判断窗体Form2是否被创建
Publicb As Integer '根据b的值判断窗体Form3是否被创建
Publicx As Integer '根据x的值判断窗体Form2是否被加载
Publicy As Integer '根据y的值判断窗体Form3是否被加载
在Form2的Form_Initialize事件加入以下代码。
PrivateSub Form_Initialize() 'Form2对象
a =1
EndSub
在Form1的Command2_Click事件中加入以下代码。
PrivateSub Command2_Click()
Ifa = 1 Then
Text1.Text = "Form2 被创建了!"
Else
Text1.Text = "Form2 还没有被创建!"
End If
EndSub
(3)根据前面的讨论,我们可以编写代码实现Command3命令按钮的功能,补充完整以下程序代码。
PrivateSub Form_Load() 'Form2对象
EndSub
PrivateSub Command3_Click()
Ifx = 1 Then
Text2.Text =
Else
Text2.Text =
End If
EndSub
(4)补充完整以下程序代码,实现Comamnd4命令按钮的功能。
PrivateSub Form_Initialize() 'Form3对象
EndSub
PrivateSub Command4_Click()
EndSub
(5)补充完整以下程序代码,实现Comamnd5命令按钮的功能。
PrivateSub Form_Load() 'Form3对象
EndSub
PrivateSub Command5_Click()
EndSub
(6)补充完整以下程序代码,实现Comamnd6命令按钮的功能。
PrivateSub Command6_Click()
EndSub
(7)补充完整以下程序代码,实现Comamnd7命令按钮的功能。
PrivateSub Command7_Click()
EndSub
(8)补充完整以下程序代码,实现Comamnd8命令按钮的功能。
PrivateSub Command8_Click()
EndSub
(9)补充完整以下程序代码,实现Comamnd9命令按钮的功能。
PrivateSub Command9_Click()
EndSub
(10)补充完整以下程序代码,实现Comamnd10命令按钮的功能。
PrivateSub Command10_Click()
EndSub
(11)补充完整以下程序代码,实现Comamnd11命令按钮的功能。
PrivateSub Command11_Click()
EndSub
(12)要卸载Form2,可在Command12_Click事件中使用Unload语句,但为了防止出现错误的操作,我们可利用Form2窗体的QueryUnload事件,提供一个停止卸载窗体Form2的机会,实现代码如下。
PrivateSub Command12_Click()
UnloadForm2
EndSub
PrivateSub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dimr As Integer
r = MsgBox("是否要卸载?",4 + 48, "卸载Form1")
If r = 7 Then
Cancel = 1
End If
EndSub
(13)补充完整以下代码,实现对Form3的卸载。
PrivateSub Command13_Click()
EndSub
PrivateSub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
EndSub
(14)补充完整以下代码,实现对Form1的卸载。
PrivateSub Command14_Click()
EndSub
PrivateSub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
EndSub
编写完成以上代码,并调试通过。
二、了解多窗体及窗体生命周期的特性
运行以上程序,并回答以下问题。
(1)当我们卸载窗体Form2后,再测试该窗体是否加载,会产生什么样的信息?应如何修改程序代码避免这种错误的发生?
(2)在没有加载窗体Form2之前,就卸载它,会出现什么情况?这时请测试该窗体是否创建和加载?根据程序显示的信息说明为什么会产生这种情况?
(3)当我们加载Form2并卸载它之后,再次加载Form2时,是否还会经历窗体的创建状态?自己设计程序代码,用来判断这个问题。
(4)总结窗体对象的常用属性、事件和方法。
(5)本次实验中,我们使用了什么语句用来加载和卸载一个窗体?