VB多文档窗体.docx

上传人:b****8 文档编号:9948210 上传时间:2023-02-07 格式:DOCX 页数:28 大小:288.55KB
下载 相关 举报
VB多文档窗体.docx_第1页
第1页 / 共28页
VB多文档窗体.docx_第2页
第2页 / 共28页
VB多文档窗体.docx_第3页
第3页 / 共28页
VB多文档窗体.docx_第4页
第4页 / 共28页
VB多文档窗体.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

VB多文档窗体.docx

《VB多文档窗体.docx》由会员分享,可在线阅读,更多相关《VB多文档窗体.docx(28页珍藏版)》请在冰豆网上搜索。

VB多文档窗体.docx

VB多文档窗体

第8章第8章                 多窗体和多文档界面

 

在前面已经学习的内容中,介绍了一些简单的vb程序编写,这些程序的设计、运行都是在一个窗体内完成的,这样的程序称为单窗体程序。

而在实际的工作、生活中,具有实用价值的一些程序一般都比较复杂,单窗体已经不能满足编程需要,这时就必须通过多窗体(Multi-Form)来实现。

多文档界面(multipledocumentinterface,MDI),与多窗体类似,其程序中由多个窗体组成,在这多个窗体中有一个父窗体(应用程序)和若干个子窗体(文档界面),子窗体间的信息可以在父窗体内同时浏览并交互使用。

8.1多窗体设计

多窗体程序必须具有两个以上的窗体,并且指定启动窗体(启动对象)。

每个窗体都有自己独特的功能,并且必须编写能控制其他窗体和本窗体状态(加载、卸载、显示、隐藏)的事件,这些事件使得各个窗体不再孤立,组成了一个完整、有联系的多窗体程序。

8.1.1与多窗体设计相关的语句和方法

单窗体程序只有一个窗体,不存在调用其他窗体的情况。

但是多窗体程序中需要在各个窗体间频繁的进行调用、切换,这时可以使用vb提供的一些语句和方法来加载、卸载、显示、隐藏窗体。

1.Load语句

格式:

Load窗体名称

Load语句是把一个窗体装入(加载)内存。

之所以要用到load语句,是因为多窗体程序在开始运行时,并不是所有的窗体都被加载的,而是只加载和显示启动窗体,其他的窗体要加载入内存,就必须执行load语句。

执行Load语句后,可以引用窗体中的控件以及各种属性,但此时窗体并不会在屏幕上显示出来。

“窗体名称”是窗体的Name属性。

2.Unload语句

格式:

Unload窗体名称

Unload语句与Load语句功能相反,其作用是清除(卸载)内存中指定的窗体。

一般在某个窗体暂时不会被使用时,用Unload清除窗体在内存中占用的空间,可以提高程序的运行速度。

3.Show方法

格式:

[窗体名称.]Show[模式]

Show方法用来显示一个窗体。

如果省略“窗体名称”,则显示当前窗体。

参数“模式“代表窗体的状态,有两种值:

0和1(注意不是False和True)。

当“模式”值为1(或常量vbModal)时,表示窗体是“模式型”。

在该模式下,鼠标无法移动到其他窗口进行操作,除非关闭该窗口。

当“模式”值为0(或常量vbModaless)时,表示窗体是“非模式型“,在该模式下,鼠标不用关闭该窗口也可以对其他窗口进行操作。

Show方法兼有装入和显示窗体两种功能。

即执行Show时,先把窗体装入内存,然后将窗体显示出来。

4.Hide方法

格式:

[窗体名称.]Hide

Hide方法用来隐藏一个窗体。

如果省略“窗体名称”,则隐藏当前窗体。

注意经过Hide的窗体,依然驻留在内存中,这与使用Unload语句的结果是不同的。

5.关键字Me

Me代表当前窗体。

如果当前窗体为Form1,则下列语句:

Form1.show和Me.show

是等价的。

8.1.2添加多个窗体

添加窗体有两种方法:

1.选择“工程”菜单下的“添加窗体”命令。

2.单击工具栏上的“添加窗体”按钮。

用以上两种方法,都会出现添加窗体对话框,该对话框有两个选项卡“新建”和“现存”。

点击“新建”选项卡中的“窗体”图标,将会添加一个新窗体;点击“现存”选项卡,可以选择一个属于其他工程的窗体添加到当前工程中。

使用“现存”来添加多窗体必须注意以下两个问题:

(1)添加的窗体的Name属性不能与该工程中的其他窗体相同,否则无法添加;

(2)对该窗体所做的改变将会影响到窗体所在的多个工程,这是因为添加的现存窗体在各个工程中是共享的。

8.1.3多窗体程序的建立

【例8.1】设计一个简单的商品销售程序,计算商品总价。

本例有三个窗体。

第一个窗体“mainfrm.frm”,用来输入密码验证身份;第二个窗体“inputfrm.frm”,用来输入商品的销售种类和数量;第三个窗体“outputfrm.frm”,用来计算并显示销售商品的总价。

下面逐步介绍该程序的设计过程:

1.建立窗体

(1)创建“mainfrm.frm”窗体

启动vb6.0,建立一个新的窗体mainfrm,其具体属性设置如表8.1.1所示:

表8.1.1mainfrm窗体的属性设置

属性

Name

Caption

Height

Width

Mainfrm

商品零售系统

5700

7900

窗体的属性设置完毕之后,接着在窗体上添加各种控件。

在这个窗体上,需要添加的控件有两个lable控件、一个文本框、两个按钮,它们的属性设置见表8.1.2,最终的设置效果如图8.1.1所示。

表8.1.2minafrm窗体各控件属性设置

控件

Name

Caption

Text

Passwordchar

Label1

Label1

商品零售系统

 

 

Label2

Label2

请输入密码

 

 

Text1

Text1

 

*

Command1

Command1

确定

 

 

Command2

Command2

关闭

 

 

图8.1.1mainfrm窗体

(2)添加“inputform”窗体

该窗体是用来输入商品的零售种类以及数量。

其具体的属性设置如表8.1.3所示

表8.1.3inputfrm窗体属性设置

属性

Name

Caption

Height

Width

Inputfrm

价格输入

3765

5220

在该窗体上,有如下的控件,它们的属性设置见表8.1.4,窗体的效果如图8.1.2所示:

表8.1.4inputfrm窗体各控件属性设置

控件

Name

Caption

Text

Locked

List

Label1

Label1

价格输入

 

 

 

Label2

Label2

选择商品类别

 

 

 

Label3

Label3

商品单价(元/斤)

 

 

 

Combobox

Combo1

 

 

 

苹果、梨子

Text1

Text1

 

True

 

Text2

Text2

 

Flase

 

 

图8.1.2inputform窗体

由于商品的单价是系统预先定义好的,只需要在商品类别的下拉框中选择商品类别,则text1中就会显示出相应商品的单价,此数据不能被改动,所以控件text1的locked属性值设置为True。

本例中只提供计算两种商品的价格,分别是“苹果”和“梨子”,可以在程序设计时在combobox控件中的list属性中添加,也可以在程序运行时用addItem来添加,本例中使用的是前者添加。

(3)添加“outputfrm”窗体

该窗体用来计算inputfrm窗体中输入的数据,并显示出来。

窗体的属性设置见表8.1.5

表8.1.5outputfrm窗体的属性设置

属性

Name

Caption

Height

Width

Outputfrm

总价计算

3765

5220

窗体上值需要有两种控件:

标签和按钮,它们的属性设置见表8.1.6,窗体的效果如图8.1.3所示:

表8.1.6outputfrm窗体各控件的属性设置

控件

Name

Caption

Label1

Label1

默认

Label2

Label2

默认

Command1

Command1

继续

Command2

Command2

返回首页

 

图8.1.3outputfrm窗体

这样,本例中的三个窗体就全部添加完毕,图8.1.4显示的是该多窗体程序的工程资源管理器窗口:

图8.1.4工程资源管理器窗口

2.编写程序代码

多窗体的编程与单窗体是相同的。

要编写某个窗体的代码,可先双击工程资源管理器窗口中相应的窗体文件,然后点击代码窗口按钮,就可以进行代码编写了。

(1)mainfrm窗体代码

PrivateSubCommand1_Click()

IfText1="1234"Then

inputfrm.Show

UnloadMe

Else

i=MsgBox("密码错误,要重新输入吗?

",vbRetryCancel,"密码错误")

Ifi=vbRetryThen

Text1=""

Text1.SetFocus

Else

End

EndIf

EndIf

EndSub

 

PrivateSubCommand2_Click()

End

EndSub

PrivateSubForm_Load()

Text1=""

EndSub

(2)inputfrm窗体代码

PrivateSubCombo1_Click()

SelectCaseCombo1.ListIndex

Case0

Text1="1.8"

Case1

Text1="2.5"

CaseElse

Text1=""

EndSelect

EndSub

PrivateSubCommand1_Click()

Me.Hide

outputfrm.Show

EndSub

PrivateSubCommand2_Click()

Me.Hide

mainfrm.Show

EndSub

(3)outputfrm窗体代码

PrivateSubCommand1_Click()

UnloadMe

inputfrm.Show

EndSub

PrivateSubCommand2_Click()

UnloadMe

mainfrm.Show

EndSub

PrivateSubForm_Load()

Label1.Caption="您购买的商品是:

"&inputfrm.Combo1.Text‘调用inputfrm窗体中combo1控件的值

Label2.Caption="总价为:

"&Str(Val(inputfrm.Text1)*Val(inputfrm.Text2))&"元"‘调用inpufrm窗体中text文本框中的值

Unloadinputfrm

EndSub

请注意outputfrm窗体中调用inputfrm窗体数据的语句的书写。

在多窗体程序中,跨窗体调用参数值是经常使用到的操作,要调用form1窗体中的某控件的值的书写格式是:

窗体名称.控件名称.属性

具体应用请参照outputfrm窗体中的语句。

8.1.4多窗体程序的执行与保存

1.指定启动窗体

多窗体程序由多个窗体组成,在程序开始运行时只能运行一个窗体,这个窗体就是启动窗体。

启动窗体可以通过设置来指定,如果不设置则系统把设计时的第一个窗体作为启动窗体。

如要指定启动窗体,可以通过“工程”菜单的“工程属性”对话框来设置。

在“工程属性”对话框中的“通用”选项卡下,在启动对象的下拉列表框中选择启动窗体的名称即可。

如图8.1.5所示

图8.1.5“工程属性”对话框中设置启动窗体

2.多窗体程序的保存

方法与单窗体程序的保存相同,点击“文件“菜单的“保存窗体”命令,每个窗体都将进行保存操作,并且每个窗体都应以不同的窗体名进行保存。

8.2VisualBasic工程结构

VB不同于传统的程序设计语言,没有清晰的程序执行顺序,但从总体上来说,每个VB程序都是由若干个模块(Module)组成的,所以,分析VB的工程结构可从VB中的各类模块着手。

在Vb中主要有三种模块,即窗体模块、标准模块和类模块。

下面主要介绍标准模块和窗体模块。

8.2.1标准模块

标准模块也称全局模块,由全局变量声明、模块层声明和通用过程等几部分构成。

其中全局变量声明放在标准模块的首部,并且在程序启动时执行。

模块层声明包括在标准模块中使用的变量和常量。

当需要声明的全局变量较多时,可以把全局声明放在一个单独的标准模块中,这样的模块只含有全局声明而不含过程,它在所有的基本指令开始之前处理。

在标准模块中,全局变量用Public声明,模块层变量用Dim或Private声明。

在一些简单的程序中,标准模块并不是必须的,如单窗体程序中就不一定要使用标准模块。

标准模块的添加可以通过“工程”菜单中的“添加模块”命令或者工具栏上的“添加模块”按钮来建立或打开。

方法与添加窗体类似。

一个工程文件可以包含多个标准模块,但是各个模块中的过程不能重名。

VB通常从启动窗体指令开始执行,除非窗体在执行时需要调用标准模块中的Sub或Function,否则标准模块将不被调用。

在标准模块中,包括一个特殊的过程,即SubMain,将在8.2.3节介绍。

8.2.2窗体模块

窗体模块包括三个部分:

声明、通用过程、事件过程。

声明部分放在窗体的最前面,用Dim语句声明变量,这个变量的作用域是整个窗体模块。

在声明部分执行完毕之后,VB会首先查找是否存在SubForm_load过程,如果存在则首先执行该过程,如不存在则等待该窗体中存在的其他事件过程被激活并执行。

通用过程可以被本模块或窗体其它的事件过程调用。

在窗体模块中,可以调用标准模块中的过程,也可以调用其他窗体模块中的过程,被调用的过程必须用Public定义为公用过程。

标准模块中的过程可以直接调用(当过程名唯一时),而如果要调用其他窗体模块中的过程,则必须加上过程所在的窗体的名字,其格式为:

窗体名.过程名[参数列表]

8.2.3SubMain过程

SubMain过程存在于标准模块中的一个特殊的过程,它主要应用在多窗体的工程中。

SubMain过程的作用主要是在多窗体运行之前对一些条件进行初始化,并在“工程属性”对话框中将“启动对象”设置为“SubMain”(如图8.2.1),这样,多窗体程序启动时将首先执行SubMain过程完成初始化条件,然后运行多窗体程序。

图8.2.1设置SubMain为启动对象

例如,对例题8.1商品零售系统进行修改,添加SubMain过程,使得多窗体程序从第二个窗体(outputfrm.frm)开始显示。

方法如下:

1.创建标准模块

选择“工程”菜单下的“添加模块”命令,在工程组中添加标准模块,如图8.2.2所示

图8.2.2添加标准模块

2.编写SubMain过程

双击工程资源管理窗口中的模块,打开代码窗口,写入如下代码:

Submain()

inputfrm.Show

EndSub

 

然后在“工程属性”中将“启动对象”设置为“SubMain”,这样,在多窗体程序启动的时候第一个显示的是inputfrm.frm,而不是mainfrm.frm了。

8.3闲置循环与DoEvents语句

VisualBasic语言具有事件驱动的特点,即某事件发生时才执行相应的程序。

如果程序在运行中,没有任何事件发生,则应用程序处于“闲置”(Idle)状态。

另一方面,当VisaulBasic正在执行某一过程(即“忙碌”状态)时,将停止对其他事件的处理(如不再接受鼠标、键盘事件),直至这一过程处理完毕。

为了改变这种执行顺序,VB提供了闲置循环(IdleLoop)和DoEvents语句。

所谓闲置循环,就是当应用程序处于闲置状态时,用一个循环来执行其他操作。

当执行闲置循环时将占用全部CPU时间,不允许执行其他事件过程,使系统处于无限循环中,没有任何反应。

为此,VB提供了一个DoEvents语句,使得当执行闲置循环时,可以通过该语句把控制权交给周围环境使用,然后回到原程序继续执行。

DoEvents既可以作为语句,也可以作为函数使用,一般格式为:

[窗体号=]DoEvents[()]

当作为函数使用时,DoEvents返回当前装入VB应用程序工作区的窗体号,也可将该返回值赋予已定义的变量,如I=DoEvents()

下面给出一个简单的例题帮助理解闲置循环和DoEvents概念。

【例8.3.1】在窗体上创建一命令按钮,编写如下事件过程:

PrivateSubCommand1_Click()

Fori=1To20000

x=DoEvents

Forj=1To1000

Nextj

Cls

Printi

Nexti

EndSub

运行上面的程序,单击命令按钮,将在窗体的左上角显示I的值。

当加入了“x=DoEvents”语句后,则在程序运行中,可以执行其他的操作(比如移动窗体位置、改变窗体大小);而如果没有该语句,则除非I的值显示至”20000”为止,否则不能进行其他的操作。

8.4多文档界面

多文档界面(MultipleDocumentInterface,简称MDI),是windows应用程序的典型结构,。

它由“父窗口”和“子窗口”(或文档窗口)组成,一个父窗口内可以包括若干个子窗口,各个子窗口都具有相同的功能,类似MicrosoftWord的程序结构。

要注意的是,多文档界面与多窗体是不同的概念。

多窗体程序中的各个窗体是彼此独立的,MDI虽然也可以含有多个窗体,但它有一个父窗体,其他窗体(子窗体)都在父窗体内。

8.4.1MDI窗体

1.MDI窗体的建立

两种方法可以建立MDI窗体,第一种方法是选择“工程”菜单中的“添加MDI窗体”命令,第二种方法是点击工具栏的“添加MDI窗体”按钮。

建立后将会在工程资源管理器窗口出现一个默认名为MDIForm1的MDI窗体图标。

2.MDI窗体的保存

与保存单窗体一样,选择“文件”菜单下的“保存窗体”命令进行保存。

8.4.2MDI子窗体

1.MDI子窗体的建立

首先,用添加窗体的方法添加一个新窗体form1;

其次,将该窗体的MDIChild属性设置为“True”

这样,就建立了一个“form1”的子窗体,在工程资源管理器窗口中可以看到该窗体的图标。

MDI窗体与MDI子窗体在外观上看与普通的窗体相同,它们的区别可以在工程资源管理器窗口中的图标看出来,如图8.4.1所示

图8.4.1MDI子窗体、标准窗体、MDI窗体图标

2.MDI子窗体的特性

(1)所有的子窗体都在MDI窗体的内部显示,可以移动,但是不能超越MDI窗体的工作区。

(2)当最小化子窗体时,它的图标将显示在MDI窗体上,而不是在任务栏中。

当最小化MDI窗体时,所有的MDI子窗体也被最小化,只有MDI窗体的图标出现在任务栏中。

(3)当最大化一个子窗体时,它的标题与MDI窗体的标题一起显示在MDI窗体的标题栏上。

(4)通过设定Autoshowchildren属性,可以使子窗体在装入时自动显示(True)或自动隐藏(False)

(5)如果活动子窗体有菜单,则菜单将显示在MDI窗体的菜单栏中,而不是显示在子窗体中。

8.4.3引例

【例8.4.1】建立一个简单的多文档界面,实现文本书写器的功能。

这里要建立的文本书写器类似于Windows中的Notepad应用程序,但文本书写器程序使用的是MDI,而Notepad使用的是SDI(单文档界面)。

在该程序中,菜单栏上有一个“文件”菜单,菜单中有“新建”命令,用来创建新的子窗体。

下面逐步来实现该功能

1.运行VisualBasic6.0,新建一个工程,点击“工程”菜单中的“添加MDI窗体”命令,添加一个MDI窗体,将其“name”属性设置为MDIFrm。

这时工程中有两个窗体Form1和MDIFrm。

2.将Form1窗体的“MDIChild”属性设置为“True”,Name属性设置为“MDIChildFrm”。

3.在MDIChildFrm窗体上创建一个文本框(text1),任意大小。

具体设置见表8.4.1

 

表8.4.1MDI窗体、MDIChild窗体和文本框的属性设置

对象

属性

设置值

MDIFrm

Caption

文档书写器

MDIChildFrm

Caption

[无标题文档1]

Text1

Multiline

True

Text

(空)

设置好的效果图如图8.4.2所示

图8.4.2MDIChildFrm窗体

4.调用“工具”菜单下的“菜单编辑器”,在MDI窗体MDIFrm上建立“文件”菜单,“文件”菜单下有“新建”命令。

属性设置见表8.4.2,菜单编辑器的使用如图8.4.3所示,设置完毕后MDIFrm窗体的效果如图8.4.4所示

表8.4.2文件菜单属性设置

标题

名称

类别

文件(&F)

MnuFile

主菜单

新建(&N)

MnuFileNew

子菜单

图8.4.3菜单编辑器

图8.4.4MDIFrm窗体效果图

5.将下列代码加入到MDIFrm的通用过程中

DimnoAsInteger

再将下列代码加入到PrivateSubMnuFileNew_click()事件过程中

PrivateSubMnuFileNew_Click()

'建立MDIChildFrm的一个新实例,名为NewDoc

DimNewDocAsNewMDIChildFrm

Ifno=0Thenno=1

no=no+1

NewDoc.Caption="[无标题文档"&Trim(Str(no))&"]"

'显示NewDoc窗体

NewDoc.Show

EndSub

这段代码的作用是当鼠标单击“文件”菜单的“新建”命令时,将通过Dim语句建立一个MDIChildFrm的一个新实例,名为NewDoc,并且把它显示出来。

下面简单介绍Dim语句在MDI中的应用。

在MDI程序中,Dim语句可以用来增加子窗体,其具体格式为:

Dim对象变量[([对象变量1to]对象变量2)]As[New]对象名称或对象类型

在本例中,MDIChildFrm是一个窗体类,增加的NewDoc则是属于此类的一个子窗体,它具有一切MDIChildFrm窗体的控件以及属性。

创建的NewDoc开始并不会被加载、显示,只有在执行了LoadNewDoc或NewDoc.show指令后才会被加载、显示。

6.将下列代码加入到MDIChildFrm的PrivateSubForm_Resize()过程中

PrivateSubForm_Resize()

Text1.Top=0

Text1.Left=0

Text1.Height=ScaleHeight

Text1.Width=ScaleWidth

EndSub

这段代码的作用是使程序运行时,MDIChildFrm上的Text1控件充满子窗体的内部区域。

这样,整个的程序就建立完毕,运行效果如图8.4.5所示

图8.4.5MDI文档书写器效果图

8.4.4Arrange方法

Arrange方法用来以不同的方式排列MDI窗体内的多个子窗体。

其格式为:

MDI窗体.Arrange方式

其中“方式”可以取四个值:

0、1、2、3

0vbCascade,层叠式排列所有非最小化MDI子窗体

1vbTileHorizontal,水平平铺式排列所有非最小化MDI子

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1