1、第 4 章 表 单,4.1 面向对象的程序设计 4.2 创建表单 4.3 表单的属性、事件和方法 4.4 表单应用举例,4.1 面向对象的程序设计,1. 概述 传统的结构化程序设计是自顶向下的功能设计。结构化程序设计通过顺序、条件分支和循环三种控制流程进行编程。面向对象(Object)的程序设计即OOP(Object Oriented Program)。它的设计方法是按照人们的习惯思维方式建立模型,模拟客观世界。客观世界是由一系列具有动作的对象构成,一个复杂的对象包含若干个简单的对象,每个对象都具有的一些性质、执行的一些操作和对应的一些动作。对象所具有的性质称为对象的属性;对象所执行的一些操作
2、称为对象的方法;对象所对应的动作称为对象的事件。对象之间通过消息进行联系。VFP是面向对象的数据库程序设计语言,VFP应用程序的用户界面一般由表单、菜单和控件等对象构成的,各个对象之间的联系完全取决于操作。程序的运行并没有固定的顺序。 VFP采用事件驱动的方式,通过编写“事件”的程序代码,为对象规定了被某个“事件”激活时对应的动作以及所要进行处理的具体内容,由各个对象编写的事件代码集合在一起,就构成了应用程序。,4.1 面向对象的程序设计,【例Ex_CricleA】 用户界面由一个表单、二个标签、二个文本框和一个命令按钮组成。单击“计算” 命令按钮,就产生了该命令按钮的Click事件, 它的C
3、lick事件中的程序被执行。具体的代码如下: R=THISFORM.TEXT1.VALUETHISFORM.TEXT2.VALUE=3.14159*R*R,4.1 面向对象的程序设计,2. 类、基类和子类类(Class)是对象外观和行为的模板,对象是类的一个实例。类是一个抽象的概念,对象是一个具体的东西。VFP中为了实现常用功能, 提供了一些类称为基类(BaseClass), 子类是在已有类的基础上进行修改而形成的类。子类所依托的类称为父类(ParentClass)。用户还可根据需要自定义类。提供的基类工具栏(图标)如图, 在打开表单设计界面时自动打开该工具栏。图4.2 基类工具栏,4.1 面
4、向对象的程序设计,系统提供的基类对应的基类名如表,表4.1基类名称,4.1 面向对象的程序设计,VFP中提供的基类可分为容器类和控件类两大类。(1) 容器类容器类是可以包含其他类的基类, 将容器类的对象加入表单后, 无论在设计时还是在运行时既可以将容器类的对象作为一个整体进行操作,也可分别对其容器中包含的对象进行处理。 表4.2容器类及其包含的对象,表4.2容器类及其包含的对象,4.1 面向对象的程序设计,(2) 控件类控件类是可以包含在容器类中的基类。控件类的封装比容器类更为严密,但也因此丧失了一些灵活性。控件类对象不能作为其他对象的父对象。在打开表单设计器时,表单控件工具栏同时打开,工具栏
5、中的控件就是系统提供的基类。用户选择控件放入自己的表单上,这个控件就变成了一个具体的对象。此后就可修改对象的属性,编写该对象所关注事件的代码。子类是对其他类(称为父类)经过修改而得到的类,它将继承任何对父类所作的修改。,4.1 面向对象的程序设计,3. 对象对象通过对象名引用对象。 对象名由该对象的Name属性指定,份创建对象时先赋给一个默认的对象名。由于容器可以包含容器类和控件类对象,就产生了一种层次结构。VFP在类层次结构中对象的引用是由上向下逐层引用,由下逐层向上查找事件代码。引用对象时要在引用的对象名前一层一层地冠以它所在的容器的对象名。引用对象有下列两种方法: (1) 绝对引用绝对引
6、用须从包含该对象的最外面的容器对象名开始,一层一层进行。格式:表单集名.表单名.容器对象名.对象名例如: Form1.txt编号.ValueFormSet1.Form1.PageFrame1.Page1.Grid1.Column1.Text1.Value同时包含多个表单的容器叫表单集。还有一个屏幕对象_SCREEN,_SCREEN对象的属性用于设置屏幕属性。_SCREEN的方法用于在屏幕上操作。,4.1 面向对象的程序设计,(1) 相对引用相对引用就好象定位文件时指定的相对路径一样,仅需从当前位置开始。例如: THIS.ValueTHIS.Parent.Text1.ValueTHISFORM.
7、txt编号.Value 下面是几种相对引用的方法:引用本身对象的属性、方法和事件用“THIS”;,使用与本身对象处于同一容器中的对象使用“THIS.Parent.引用对象名”; 引用当前表单中的对象用“THISFORM.容器对象名. 引用对象名”。应用程序对象(_VFP)的ActiveForm、ActiveControl属性允许在不知道表单名或控件名的情况下处理活动的表单或控件。例如,下列代码改变活动表单的背景颜色,而不考虑其所属的表单集。_VFP.ActiveForm.BackColor=RGB(255,255,255)用户只能在方法程序或事件代码中使用THIS、THISFORM和THISF
8、ORMSET。,表4.3 相对引用名,4.1 面向对象的程序设计,(3) 连续设置多个属性使用WITHENDWITH结构可以一次为对象设置多个属性。With 结构: 格式:With 对象语句块End With使用With结构可以对某个对象执行一系列的语句,而不用重复指出该对象的名称。例如,在表单中,要设置表格列的多个属性,在With结构中进行属性的赋值如下:WITH THISFORM.Grid1.Colormn1.Width=5.Resizable=.F.ForeColor=RGB(0,0,0).BackColor=RGB(255,255,255)SelectOnEntry=.T.ENDWIT
9、H当程序进入With块,对象就不能改变。不能用一个With语句来设置多个不同的对象,With块可以嵌套,4.1 面向对象的程序设计,4. 对象的属性属性是对象的数据,用来表示对象的状态。属性有属性值,改变对象的属性值就可以改变对象的状态。属性的设置可以设计时在“属性”窗口中完成,也可以在运行时由代码来实现。在运行时可设置的属性称为读写属性,只能读取的属性叫只读属性。对象属性引用方法格式如下。格式:对象引用.属性名VFP对象的常用 表4.5 容器对象的集合属性和计数属性,VFP所有容器对象都具有与之相关的集合属性和计数属性。集合属性是一个数组,可用它引用包含的对象。计数属性值表示它包含的对象的个
10、数。,4.1 面向对象的程序设计,5. 对象的方法对象的方法决定了对象要执行的操作,方法中的代码是不可见的,可以通过调用来使用对象的方法。对象方法的引用方法如下:格式:对象引用.方法属性名或 对象引用.方法属性名(参数名表)例如,调用THISFORM.Release方法用于释放当前执行的表单。有返回值的方法必须用圆括号结尾,传递给方法的参数必须将参数放在方法名后面的括号中。例如,下列方法在表单上画一条线。THISFORM.Line(n起点X, n起点Y, n 终点X, n终点Y)下列方法激活表格Grid1对象的nRow行和nCol列单元:THISFORM.Grid1.ActivateCell(
11、n行,n列)系统定义的方法用户也可以自行编写代码以取代原来的功能。,表4.6 对象的常用方法,4.1 面向对象的程序设计,6. 对象的事件VFP中对象的事件可通过用户操作、程序代码或系统触发。事件发生时,事件的程序才会运行。没有事件发生,则整个程序就处于停滞状态。 VFP编程的核心就是为每个要处理的事件编写响应事件的过程代码。对象的事件名在代码窗口的过程列表框中单击下拉箭头进行选择。对象能识别的事件很多,但用户一般只用到几个常用的事件,例如命令按钮(CommandButton)常用的就是单击(Click)事件。用户没有编写代码的事件系统会以默认的方式来处理。在程序中也可触发事件, 程序触发事件
12、相当于调用该事件的代码执行。格式:对象引用.事件名,4.1 面向对象的程序设计,l 当失去焦点时的事件触发顺序:Valid事件LostFocus事件DeActivate事件。l 表单释放时事件触发的顺序:表单(Form)的QueryUnload事件;表单集(FormSet)的Destry事件表单的Destry事件控件的 Destry事件;表单的UnLoad事件表单集的UnLoad事件;数据环境(Dataenvironment)AfterCloseTables事件;数据环境Destry事件数据环境临时表Destry事件。,4.1 面向对象的程序设计,4.2 创建表单,选择“文件”菜单新建选“表单
13、”显示图所示对话框。选“新建表单” 。在空白的表单上进行设计。选“表单向导”则一步一步询问数据库和表选择表单中显示的表字段选择控件显示的格式系统自动生成表单及控件对象。,图4.3 新建表单对话框,表单设计器用于交互创建表单。 也可使用“CREATE FORM 表单名”命令新建空白表单, 已经建立的表单用“MODIFY FORM 表单名”打开表单进行交互修改。,4.2 创建表单,表单设计器工具栏 表单设计器工具栏用于打开表单设计时需要用到的表单设计工具和功能。表单设计器工具栏从左到右的图形按钮功能如下:,(1) 设置Tab键的次序:(2) 数据环境:用于设置在表单中要用到的数据库和表。(3) 属
14、性窗口:用于设置对象的属性、选择对象的方法和事件。(4) 代码窗口:用于切换至对象的事件和方法的编辑代码窗口。,4.2 创建表单,(5) 表单控件工具栏:用于显示系统内部提供的表单控件。,(6) 调色板工具栏: 用于设置对象的背景色。先选择对象,再选择调色板工具栏的指定颜 (7) 布局工具栏: 用于以表单中的对象进行重新排列。先选择对象,再选择排列图形按钮 (8) 表单生成器:根据用户选择的表按当前默认的格式在当前表单中自动生成字段对象。,4.2 创建表单,2. 表单中控件的布局(1) 选择表单控件单击表单控件;按住Ctrl键不放再单击表单控件, 可同时选择多个控件。拖动鼠标,在表单上画一个区
15、域,该区域内的所有控件被选择。表单中包含多层容器对象时,右击选“编辑”菜单项可从外到内进入容器中,从而可选择容器中的对象。(2) 增加表单控件单击表单控件工具栏的控件, 单击或拖动鼠标画出该控件的大小后松开。(3) 移动表单控件单击要移动的控件不松开拖动到指定位置。或者单击控件用方向键移动。,(4) 改变表单控件大小鼠标指针放到控件的边缘和右下角处,待鼠标指针形状变化时进行拖动。或者单击控件, 按住Shift键不放用方向键移动。(5) 删除控件选择要删除的控件, 按Del键。(6) 从数据环境拖放对象设置数据环境, 打开数据环境, 从数据环境中拖动表的字段到表单中。(7) 控件布局 先选择对象
16、,然后选择排列图形按钮。,4.2 创建表单,3. 表单的数据环境(DataEnvironment)表单中的数据环境是一个容器,用于设置表单中使用的表和视图及表单要求的表之间的关系。这些表和视图及表之间的关系都是数据环境容器中的对象,可以设置它们的属性。在表单被执行时,数据环境中设置的表和视图自动被打开,表之间的关系自动被建立。当表单被释放时,数据环境中设置的表和视图自动被关闭。数据环境通过数据环境设计器进行设置,选“显示”选“数据环境”或在表单中按右键选“数据环境”即可打开数据环境设计器。如图4.8、图4.9所示。 (1) 向数据环境添加表或视图 在数据环境设计器中按右键选“添加”选表或视图。
17、(2) 数据环境移去表或视图在数据环境设计器中选中要移去表或视图按右键选“移去”。,4.2 创建表单,图4.8 菜单打开数据环境,图4.9右键打开数据环境,4.2 创建表单,(3) 在数据环境中设置关系如果加入数据环境的表具有在数据库中设置的永久关系,则这些关系自动带入到数据环境中。如果表中没有永久关系,则可在数据环境进行设置表之间的临时关系。若要在数据环境设计器中设置临时关系,可从主表中拖动字段到相关表中相匹配的索引标识上。在数据环境设计器中设置了一个关系后,在表之间就有一条连线指示这个关系(对象)。若要编辑这个关系的属性, 先选中这条连线, 按右键在快捷菜单中选“属性”这个菜单项即可。 数
18、据环境中设置的关系是临时关系,表单执行时建立,表单释放后不再存在。,4.10 编辑这个关系的属性,4.3 表单的属性、事件和方法,1. 表单的属性表单属性定义表单对象的特征或行为。表单及其包含的对象的属性通过“属性”窗口定义和修改。在“属性” 窗口包含对象列表框和页框,页框中包含5个选项卡。表单的所有属性分成数据、布局和其他三类,分别放入相应的选项卡中。同时表单的方法和事件放入方法程序选项卡中。表单的所有属性、方法和事件均放在“全部” 选项卡。所有项目按英文字母次序排列。 (1) 对象选项它是一个下拉列表框,采用分层方式显示表单及包含在表单中的所有对象。选择某个对象后,在属性列表框中所显示的均
19、是对应于该对象的各种属性及方法程序。 (2) 分类页 分类页的作用是按照分类的形式显示属性、事件和方法程序。每一页及其功能: l 全部: 用于显示所选表单或其他对象的所有属性、事件和方法程序。 l 数据: 用于显示有关对象如何显示或怎样操纵数据的属性。 l 方法程序: 用于显示有关对象的事件和方法程序。 l 布局: 用于显示所有的布局属性。 l 其他: 用于显示其他和用户自定义的属性。,4.3 表单的属性、事件和方法,(3) 属性设置部分 属性设置部分包括有对象属性的设置框和有3个命令按钮,它们分别是: l : 取消属性值的修改。 l : 确认属性值的修改。 l fx: 自动生成属性。 l 属
20、性值输入文本框。 属性值输入有下列情况: 出现输入文本框,在文本框直接输入属性值; 对可被设置为表达式的属性,则在文本框先输等号“=”标记,后面再写表达式,用表达式的值作为属性值。如果该属性值可通过浏览确定,则在该文本框后会有命令按钮,用户也可单击它通过浏览选择确定属性值。对于具有预定值的属性,会出现一个组合框,从右边下拉箭头进行选择,在属性列表中双击属性名可以遍历所有的可选项。,4.3 表单的属性、事件和方法,(4) 属性选项列表属性选项列表是一个包含两列的列表,它显示了所有可在设计时更改的属性和他们的当前值。在属性框中以斜体显示的属性值表明那些属性、事件和方法程序是只读的。需要某属性的系统
21、默认值。在“属性”窗口,右击,在属性快捷菜单中选择“重置为默认”命令即可。 2. 表单的事件,4.3 表单的属性、事件和方法,3. 表单的方法,4.3 表单的属性、事件和方法,4. 表单文件的执行和关闭(1) 在表单设计器中直接执行表单按右键,在快捷菜单中选择“执行表单”。或者在表单菜单选择“执行表单”菜单项。(2) 在程序中调用执行在表单设计器中直接执行表单用于系统开发阶段,组成系统时, 表单一般在程序中调用执行,调用命令如下。 格式: DO FORM 表单文件名| ? NAME 表单名 LINKEDWITH 参数表 TO 变量名 NOREADNAME表单名指定执行的表单的名字, 以后引用该
22、表单时使用这个名。LINKED可用来链接表单和相关联的变量,当变量超出作用域,释放表单。WITH 参数表用于向表单的INIT事件,代码传递参数。如果执行的是表单集,则表单集的WindowType为0(无模式)或1(模式), 参数表用于向表单集的INIT事件代码传递。 TO变量名接收表单UnLoad事件的RETURN的语句的返回值。但要求表单的WindowType为1(模式)。 NOREAD创建并显示表单集, 但在执行READ前不激活控制。但要求表单集的WindowType为2(读)。(3) 激活事件处理 格式: READ EVENTS只有执行了READ EVENTS命令, VFP才启动事件处理
23、。当执行CLEAR EVENTS命令后, 系统停止事件处理。(4) 关闭表单 格式: 表单引用名.RELEASE,4.3 表单的属性、事件和方法,5创建新属性和新方法(1) 创建新属性打开表单选“表单”菜单选“新建属性”菜单项系统显示下列“新建属性”对话框。,选Access项和Assign项, 则在新建表单属性的同时创建该属性对应的方法程序, 其中Access方法程序在查询该属性时被执行, Assign方法程序在修改该属性时被执行,4.3 表单的属性、事件和方法,(2) 创建新方法程序打开表单选“表单”菜单选“新建方法程序”菜单项系统显示下列“新建方法程序”对话框, 输入方法程序名称后选“添加
24、”即可。方法程序代码应在“属性”窗口的“方法程序”选项卡选择方法程序名双击, 在编辑器中编辑方法程序。新建方法程序的执行方法与系统提供的方法程序相同。,4.3 表单的属性、事件和方法,(3) 编辑属性/方法程序打开表单选“表单”菜单选“编辑属性/方法程序”菜单项, 可修改和移去新建属性和方法。 6. 创建单文档和多文档VFP允许创建单文档和多文档两种类型的应用程序界面。单文档界面由一个或多个独立的窗口组成,在桌面上独立显示。多文档界面由单一的主窗口组成, 应用程序窗口包含在主窗口中或浮动在主窗口的顶端。VFP本身就是一个多文档窗口,VFP主窗口中包含各种设计器窗口、编辑窗口、命令窗口等。VFP
25、通过设置表单的ShowWindow属性和Desktop属性实现单文档和多文档的功能。 表4.12 ShowWindow属性和Desktop属性,4.3 表单的属性、事件和方法,改变ShowWindow和Desktop属性, 可创建下列三种类型的表单: (1) 子表单。设置ShowWindow为0或,Desktop为.F.。该表单包含在父表单中, 子表单不能移出父表单。子表单不出现在Windows的任务栏中, 最小化时只出现在父表单的底部。父表单最小化时子表单同时最小化。(2) 浮动表单。设置ShowWindow为0或,Desktop为.T.。该表单属于父表单, 但可在整个桌面上移动。浮动表单最
26、小化时出现在屏幕底部。父表单最小化时浮动表单同时最小化。(3) 顶层表单。设置ShowWindow为2。既可作为单文档界面, 又可作为多文档界面中的父表单。 7. 表单的多个实例表单的多个实例是指同一个表单同时被执行了多次。这些表单虽基于同一个定义,但确可以独立地显示和操作。对于需拥有多个实例的表单,应将表单的DataSession属性设置为2, 系统自动为每个实例建立独立的数据环境。为了方便多个实例的表单的管理,启用表单时应使用数组作为表单对象的引用名,用下标区分不同实例。,4.4 表单应用举例,【例】在主程序Ex_Main1中调用表单Ex_EditGZ执行。在Ex_EditGZ表单的Destroy事件中加入THISFORM.ReleaseCLEAR EVENTS编辑Ex_main1.prg中程序, 代码如下:SET DEFAULT TO D:RY_MISDO FORM EX_EditGZREAD EVENTSCLEARCLOSE ALL执行Ex_Main1.PRG,