1、第8章 表单高级设计 2021-10-181 8.1 多表单应用程序 2021-10-182 一、应用程序界面一、应用程序界面 1 1、单文档界面与多文档界面、单文档界面与多文档界面 Microsoft WindowsMicrosoft Windows将应用程序界面分为应用程序窗口将应用程序界面分为应用程序窗口 和文档窗口两类,应用程序窗口含有菜单栏,而文档窗口和文档窗口两类,应用程序窗口含有菜单栏,而文档窗口 没有菜单栏,若文档窗口位于应用程序窗口内,允许它共没有菜单栏,若文档窗口位于应用程序窗口内,允许它共 享应用程序窗口的菜单栏。享应用程序窗口的菜单栏。 在在VFPVFP创建的应用程序中
2、,用户界面也可分为两类;单创建的应用程序中,用户界面也可分为两类;单 文档界面(文档界面(Single-Document InterfaceSingle-Document Interface,简称,简称SDISDI)和多)和多 文档界面(文档界面(Multiple-Document InterfaceMultiple-Document Interface,简称,简称MDIMDI)。)。 2021-10-183 SDI SDI是指应用程序窗口中仅能显示一个文档,此文是指应用程序窗口中仅能显示一个文档,此文 档直接显示在应用程序窗口内。档直接显示在应用程序窗口内。 Microsoft Window
3、sMicrosoft Windows的的 记事本是记事本是SDISDI界面的一个例子。在记事本中只能打开一界面的一个例子。在记事本中只能打开一 个文档,想要打开另一个文档时,必须先关上已打开的个文档,想要打开另一个文档时,必须先关上已打开的 文档。文档。 MDIMDI指应用程序窗口中能包含多个文档窗口。指应用程序窗口中能包含多个文档窗口。 Visual FoxProVisual FoxPro主窗口是一个主窗口是一个MDIMDI界面,在界面,在VFPVFP主窗口中主窗口中 可打开命令窗口,各种编辑窗口和设计器窗口等文档窗可打开命令窗口,各种编辑窗口和设计器窗口等文档窗 口。口。 采用哪种界面,需
4、要根据应用程序的目的而定。采用哪种界面,需要根据应用程序的目的而定。 2021-10-184 2 2、SDISDI与与MDlMDl的实现的实现 为了支持为了支持SDISDI与与MDIMDI两类界面,两类界面,VFPVFP允许创建允许创建顶层表单和子表单顶层表单和子表单。 (1 1)项层表单)项层表单 顶层表单适用于创建一个顶层表单适用于创建一个SDISDI应用程序,或用作应用程序,或用作MDIMDI应用程序应用程序 中的父表单。顶层表单没有父表单,它与其它中的父表单。顶层表单没有父表单,它与其它WindowsWindows应用程序一应用程序一 样显示在样显示在WindowsWindows桌面上
5、,也显示在桌面上,也显示在WindowsWindows任务栏中。任务栏中。 (2 2)子表单)子表单 子表单用于创建子表单用于创建MDIMDI应用程序的文档窗口,其又可以分为非浮应用程序的文档窗口,其又可以分为非浮 动表单和浮动表单两种。动表单和浮动表单两种。 (3 3)顶层表单或子表单的确定)顶层表单或子表单的确定 表单的表单的ShowwindowShowwindow属性用于指定该表单为顶层表单或子表单。属性用于指定该表单为顶层表单或子表单。 2021-10-185 2021-10-186 (4 4)子表单的操作)子表单的操作 (5 5)表单的显示与隐藏)表单的显示与隐藏 (4 4)MDIM
6、DI应用程序的运行应用程序的运行 (5 5)多表单程序的调试)多表单程序的调试 示例:示例:e8-1.scxe8-1.scx 2021-10-187 二、表单集(二、表单集(不要求不要求) 表单集是一个容器,其中可包含一个或多个表单。运行表单表单集是一个容器,其中可包含一个或多个表单。运行表单 集时,它所包含的所有表单就都放加载,于是在屏幕上开出了一集时,它所包含的所有表单就都放加载,于是在屏幕上开出了一 组多个窗口。组多个窗口。 表单集具有以下优点:表单集具有以下优点: (1 1)可显示或隐藏表单集中的表单。运行表单时,表单集中)可显示或隐藏表单集中的表单。运行表单时,表单集中 的表单能相互
7、切换。的表单能相互切换。 (2 2)能可视地调整各表单的相对位置。)能可视地调整各表单的相对位置。 (3 3)由于表单集及其所有的表单都存储在同一个)由于表单集及其所有的表单都存储在同一个. .scxscx文件中,文件中, 因而这些表单共享一个数据环境,只要经过适当关联,就能使不因而这些表单共享一个数据环境,只要经过适当关联,就能使不 同表单中的表做到记录指针同步移动。同表单中的表做到记录指针同步移动。 2021-10-188 1 1、表单集的创建、表单集的创建 表单菜单中的创建表单集命令专用于创建定单集,但表单菜单中的创建表单集命令专用于创建定单集,但 由于打开一个表单后由于打开一个表单后V
8、FPVFP菜单上才会出现表单菜单,因此创菜单上才会出现表单菜单,因此创 建表单集须分为两步:建表单集须分为两步: (1 1)打开某表单。)打开某表单。 (2 2)选定表单菜单的创建表单集命令。)选定表单菜单的创建表单集命令。 假定已打开表单的假定已打开表单的NameName属性为属性为FormlForml。选定表单菜单的。选定表单菜单的 创建表单集命令后,只要打开属性窗口的对象列表,就会创建表单集命令后,只要打开属性窗口的对象列表,就会 看到看到Formset1Formset1对象,它就是刚创建的表单集。并且还能看对象,它就是刚创建的表单集。并且还能看 出,出,FormlForml被列于被列于
9、FormsetFormset的下一层次,这表明表单集是容的下一层次,这表明表单集是容 器。器。 2021-10-189 创建表单集与创建其它容器的规则不同。表单集不创建表单集与创建其它容器的规则不同。表单集不 可直接创建,必须在确定一个对象的基础上才能创建,可直接创建,必须在确定一个对象的基础上才能创建, 这也提示了操作表单集须注意以下几点:这也提示了操作表单集须注意以下几点: (1 1)表单集及其所有表单都应存储在创建表单集)表单集及其所有表单都应存储在创建表单集 时的当前表单文件中。时的当前表单文件中。 (2 2)打开表单文件时,己创建的表单集将随之打)打开表单文件时,己创建的表单集将随之
10、打 开。开。 (3 3)添加到表单集中的表单也存储在该表单文件)添加到表单集中的表单也存储在该表单文件 中。中。 2021-10-1810 2 2、表单集的删除、表单集的删除 表单菜单中的移除表单集命令可用于删除表单集。仅当表单菜单中的移除表单集命令可用于删除表单集。仅当 表单集中只有一个表单时才可则除表单集,表单集删除后表表单集中只有一个表单时才可则除表单集,表单集删除后表 单还存在单还存在 3 3、表单集的释放、表单集的释放 释放不同于删除。释放表单集的方法有以下两种:释放不同于删除。释放表单集的方法有以下两种: (1 1)使用)使用RELEASE THISFORMSETRELEASE T
11、HISFORMSET命令来释放表单集,并命令来释放表单集,并 关闭其中所有的表单。关闭其中所有的表单。 (2 2)表单集随最后一个表单的释放而自动释放,此时)表单集随最后一个表单的释放而自动释放,此时 表单集的表单集的AutoReleaseAutoRelease属性为属性为T T。 2021-10-1811 4 4、表单集的编辑、表单集的编辑 (1 1)编辑表单集或其中的表单)编辑表单集或其中的表单 要编辑表单,可通过选定表单窗口,或在属性窗口的对象列要编辑表单,可通过选定表单窗口,或在属性窗口的对象列 表中选定某表单来打开它;但要编辑表单集,仅可在属性窗口的表中选定某表单来打开它;但要编辑表
12、单集,仅可在属性窗口的 对象列表中选定。对象列表中选定。 (2 2)添加表单)添加表单 表单集创建后。只要表单窗口已打开,就可利用表单菜单的表单集创建后。只要表单窗口已打开,就可利用表单菜单的 添加新表单命令来添加表单。但此时增入表单集中的只能是新表添加新表单命令来添加表单。但此时增入表单集中的只能是新表 单,不能将已存在的表单增入表单集。单,不能将已存在的表单增入表单集。 (3 3)移去表单)移去表单 使用表单菜单中选定使用表单菜单中选定“移去表单命令移去表单命令”。 示例:示例:e8-1-set.scxe8-1-set.scx 2021-10-1812 8.2 自定义属性与方法程序 用户定
13、义的属性类似于变量,用户定义的方法程序则相当于用户定义的属性类似于变量,用户定义的方法程序则相当于 过程。过程。 用户定义同性或方法程序的作用范围是整个表单文件:用户定义同性或方法程序的作用范围是整个表单文件: 对于存在表单集的表单文件而言,它们对表单集的所有表单对于存在表单集的表单文件而言,它们对表单集的所有表单 都有效;而对于单表单的表单文件,则仅在该表单内有效。都有效;而对于单表单的表单文件,则仅在该表单内有效。 用户定义的屑性和方法程序的用法与系统给出的属性、用户定义的屑性和方法程序的用法与系统给出的属性、 方法程序一致。方法程序一致。 2021-10-1813 2021-10-181
14、4 二、自定义方法程序二、自定义方法程序 2021-10-1815 8.3 类 一、基本概念一、基本概念 1 1、类(、类(classclass)与对象()与对象(ObjectObject) 在面向对象程序设计中,类与对象都是应用程序的组装模块。在面向对象程序设计中,类与对象都是应用程序的组装模块。 类是已经定义了的关于对象的特征、外观和行为的模板。类是已经定义了的关于对象的特征、外观和行为的模板。在表单在表单 控件工具拦中,每个控件按钮都代表一个类,用其中某个按钮在控件工具拦中,每个控件按钮都代表一个类,用其中某个按钮在 表单上创建的一个控件就是一个对象。从上可以看出:表单上创建的一个控件就
15、是一个对象。从上可以看出: (1 1)类是对象的定义。类规定并提供了对象具有的属性、事)类是对象的定义。类规定并提供了对象具有的属性、事 件和方法程序。件和方法程序。 (2 2)对象通过类来产生。)对象通过类来产生。 (3 3)对象是类的实例。)对象是类的实例。 2021-10-1816 2 2、基类(、基类(base classbase class) 基类是基类是VFPVFP预先定义的类,在预先定义的类,在“新建类新建类”对话框的对话框的“派生于派生于” 下拉列表中,包含了全部基类(,例如表单(下拉列表中,包含了全部基类(,例如表单(FormForm)、表单集)、表单集 (FormsetFo
16、rmset)等。初始的表单控件工具栏中包含的类(例如)等。初始的表单控件工具栏中包含的类(例如TextBoxTextBox, TimerTimer等)也是基类。等)也是基类。 基类可作为用户定义类的基础。用户可从基类来创建新类基类可作为用户定义类的基础。用户可从基类来创建新类. .并并 增添自己需要的新功能。增添自己需要的新功能。 3 3、子类(、子类(SubclassSubclass) 以某个类的定义为起点创建的新类称为子类,前者称为父类。以某个类的定义为起点创建的新类称为子类,前者称为父类。 例如从基类来创建新类时,基类是父类,新类是于类。例如从基类来创建新类时,基类是父类,新类是于类。
17、新类将继承父类的全部特征,包括对父类所做的任何修改。新类将继承父类的全部特征,包括对父类所做的任何修改。 2021-10-1817 2021-10-1818 基类和子类 4 4、用户定义类(、用户定义类(user-defined classuser-defined class) 用户可从基类派生出子类,这就是用户定义类;用户可从基类派生出子类,这就是用户定义类;VFPVFP 还允许从用户定义类派生出子类。因此用户定义类可以是还允许从用户定义类派生出子类。因此用户定义类可以是 子类,也可以作为父类。子类,也可以作为父类。 用户可为用户定义类设置属性、编写事件代码与方法用户可为用户定义类设置属性、
18、编写事件代码与方法 程序代码,也可创建新的属性和方法程序。程序代码,也可创建新的属性和方法程序。 用户定义类也可以添加到表单控件工具栏中。用户定义类也可以添加到表单控件工具栏中。 2021-10-1819 5 5、容器类(、容器类(container classescontainer classes)和控件类)和控件类 (control control cLassescLasses) 对象可分为容器和控件两种,实际上类也可分为容对象可分为容器和控件两种,实际上类也可分为容 器类和控件类两种。用户可以从基类派生出容器类,例器类和控件类两种。用户可以从基类派生出容器类,例 如从如从FormForm
19、类可派生出表单类。类可派生出表单类。 6 6、类库(、类库(class libraryclass library) 类库可用来存储以可视方式设计的类,其文件扩展类库可用来存储以可视方式设计的类,其文件扩展 名为名为.VCX.VCX,一个类库通常可以容纳多个子类,这些子类,一个类库通常可以容纳多个子类,这些子类 允许由不同的基类派生。允许由不同的基类派生。 2021-10-1820 7 7、类的特征、类的特征 类是模板,它规定了对象的属性、事件和方法程序。类是模板,它规定了对象的属性、事件和方法程序。 此外,类还具有封装(此外,类还具有封装(encapsulationencapsulation)
20、、子类、继承性)、子类、继承性 (inheritanceinheritance)等特征,这些特征有利于提高代码的可重)等特征,这些特征有利于提高代码的可重 用性和易维护性。用性和易维护性。 (1 1)封装特征)封装特征 封装指包含并隐藏对象信息,如内部数据结构、对象封装指包含并隐藏对象信息,如内部数据结构、对象 的方法程序和属性代码。封装隐藏了不必要的复杂性,例的方法程序和属性代码。封装隐藏了不必要的复杂性,例 如对一个命令按钮设置如对一个命令按钮设置captioncaption属性时,不必了解标题字符属性时,不必了解标题字符 串是如何存储的。串是如何存储的。 2021-10-1821 (2
21、2)子类特征)子类特征 一个子类可以拥有其父类的全部功能,但也可以增一个子类可以拥有其父类的全部功能,但也可以增 加自己的属性和方法,使它具有与父类不同的特殊性。加自己的属性和方法,使它具有与父类不同的特殊性。 如果创建一个合适的子类,并在多处创建它的实例,如果创建一个合适的子类,并在多处创建它的实例, 就能使代码得到重复使用,因此定义子类是减少代码的就能使代码得到重复使用,因此定义子类是减少代码的 途径之一。途径之一。 2021-10-1822 (3 3)继承性特征)继承性特征 继承性包括以下内容;对象能自动继承创建它的类的功继承性包括以下内容;对象能自动继承创建它的类的功 能;子类能自动继
22、承父类的功能;对一个类的改动能自动反能;子类能自动继承父类的功能;对一个类的改动能自动反 映到它的所有子类中。映到它的所有子类中。 继承性不只节省了用户的时间和精力,同时也减少了维继承性不只节省了用户的时间和精力,同时也减少了维 护代码的难度,所以继承性是合理地进行代码维护的重要措护代码的难度,所以继承性是合理地进行代码维护的重要措 施。施。 2021-10-1823 二、用户定义类二、用户定义类 支持创建在应用程序中可以重复使用的类是支持创建在应用程序中可以重复使用的类是VFPVFP最强大最强大 的功能之一,用户定义的类能添加到表单控件工具栏中。的功能之一,用户定义的类能添加到表单控件工具栏
23、中。 通常创建用户定义类有以下目的:通常创建用户定义类有以下目的: (1 1)封装通用功能:为通用功能创建控件类,以便将)封装通用功能:为通用功能创建控件类,以便将 它们的实例添加到表单中移动记录指针的命令按钮类、表单它们的实例添加到表单中移动记录指针的命令按钮类、表单 关闭按钮类、帮助按钮类等。关闭按钮类、帮助按钮类等。 (2 2)赋予应用程序统一的外观和风格:例如创建了具)赋予应用程序统一的外观和风格:例如创建了具 有自定义外观和动作的表单类,使可将它作为所有要创建的有自定义外观和动作的表单类,使可将它作为所有要创建的 表单的模板;创建了具有独特外观(如带阴影效果)的文本表单的模板;创建了
24、具有独特外观(如带阴影效果)的文本 框类,便可在应用程序所有需要文本框的地方都使用这个类。框类,便可在应用程序所有需要文本框的地方都使用这个类。 2021-10-1824 1 1、类的创建、类的创建 创建用户定义类的步骤为;创建用户定义类的步骤为; (1 1)新建类:选定文件菜单的新建命令,接着在)新建类:选定文件菜单的新建命令,接着在 弹出的新建对话框中选定弹出的新建对话框中选定“类类”选项按钮,然后选定新选项按钮,然后选定新 建文件按钮,使屏幕上出现新建类对话框(参阅图建文件按钮,使屏幕上出现新建类对话框(参阅图 8.78.7)。)。 (2 2)在新建类对话框中指定新建类所需的类库、)在新
25、建类对话框中指定新建类所需的类库、 基类与类名。基类与类名。 (3 3)类设计器的操作;类设计器的用户界面与表)类设计器的操作;类设计器的用户界面与表 单设计器相同,在属性窗口中可以查看和编辑类的属性,单设计器相同,在属性窗口中可以查看和编辑类的属性, 在代码编辑窗口中可以编写各种事件和方法程序的代码。在代码编辑窗口中可以编写各种事件和方法程序的代码。 2021-10-1825 2 2、将类添加到工具拦、将类添加到工具拦 要将可视类库中的用户定义类添加到表单控件工具要将可视类库中的用户定义类添加到表单控件工具 栏中栏中. .可以使用该工具栏中的可以使用该工具栏中的“查看类查看类”按钮。按钮。
26、3 3、类的编辑、类的编辑 (1 1)修改已定义的用户定义类)修改已定义的用户定义类 (2 2)删除类库中的一个类)删除类库中的一个类 (3 3)删除类库)删除类库 示例:示例:e8-7.vcxe8-7.vcx(类库文件)(类库文件) e8-7.scxe8-7.scx(表单文件)(表单文件) 2021-10-1826 三、三、 用户定义工具栏用户定义工具栏 用户定义工具栏其实也是一种用户定义类用户定义工具栏其实也是一种用户定义类. .只是工具栏与其它只是工具栏与其它 栏相比有点特殊,它必须在表单集中创建。其原因是自定义工具栏相比有点特殊,它必须在表单集中创建。其原因是自定义工具 栏本身就是一种
27、表单。栏本身就是一种表单。 创建自定义工具栏一般可分以下创建自定义工具栏一般可分以下3 3步来进行:步来进行: 1 1、从、从ToolBarToolBar基类创建一个自定义工具栏类,并为它设置功基类创建一个自定义工具栏类,并为它设置功 能。能。 2 2、在表单控件工具栏中添加一个代表该自定义工具栏的按钮。、在表单控件工具栏中添加一个代表该自定义工具栏的按钮。 3 3、在表单集中创建该自定义工具栏。、在表单集中创建该自定义工具栏。 示例:示例:e8-11.scxe8-11.scx 2021-10-1827 特别注意:特别注意: 除了以上方法以外,也可以使用代码的方式直接添加,示例除了以上方法以外
28、,也可以使用代码的方式直接添加,示例 如如e8-11-1.scxe8-11-1.scx。 主要代码如下:主要代码如下: SET CLASSLIB TO SET CLASSLIB TO 用户控件用户控件 additiveadditive thisform.tbrtoolsthisform.tbrtools= =createobjectcreateobject(工具栏工具栏) &) &创建工具条创建工具条 this.tbrtools.dock(0) &this.tbrtools.dock(0) &放置在屏幕顶端放置在屏幕顶端 this.tbrtools.Showthis.tbrtools.Show & &显示工具条显示工具条 其中,其中, tbrtoolstbrtools是事先给表单定义的一个属性(具体定义属是事先给表单定义的一个属性(具体定义属 性方法参见教材性方法参见教材P253P253),用它来存放有关工具栏的信息。),用它来存放有关工具栏的信息。 2021-10-1828