第九章 表单 ( form ) 和面向对象的程序设计
DESCRIPTION
第九章 表单 ( FORM ) 和面向对象的程序设计. 9.1 表单及表单设计. 9.2 应用程序的组装“模块”: VFP 类与对象. 9.3 表单对象的应用实例. 9.4 设置表单或表单集模板( Template). 第十章 表单( FORM )和面向对象的程序设计 本章将介绍:表单、表单集的设计及应用;面向对象的程序设计; VFP 中的类和对象。. 9.1 表单及表单设计. 表单又叫“窗体”,提供给用户一个对数据查看、输入的屏幕“界面”;提供了一个能适应用户事件和系统事件的强有力的对象集,使用户能方便地完成信息管理任务。. - PowerPoint PPT PresentationTRANSCRIPT
第九章 表单( FORM )和面向对象的程序设计
9.2 应用程序的组装“模块”: VFP 类与对象
9.1 表单及表单设计
9.3 表单对象的应用实例
9.4 设置表单或表单集模板( Template)
9.1 表单及表单设计
表单又叫“窗体”,提供给用户一个对数据查看、输入的屏幕“界面”;提供了一个能适应用户事件和系统事件的强有力的对象集,使用户能方便地完成信息管理任务。
一、表单的类型1 .从创建单文档和多文档界面来分表单类型
在 VFP 中有两种应用程序界面:
多文档界面 (MDI)
单文档界面 (SDI)
第十章 表单( FORM )和面向对象的程序设计本章将介绍:表单、表单集的设计及应用;面向对象的程序设计;VFP 中的类和对象。
多文档界面 (MDI) :由单一的主窗口组成,其它应用程序窗口在主窗口中或浮动在主窗口之上。 VFP 本身就是一个 MDI 的窗口,包含了命令窗口,编辑窗口和设计窗口等。
单文档界面 (SDI) :由一个或多个相互独立的窗口组成,这些窗口单独显示。
但也有一些应用程序综合了 SDI 和 MDI 的特性,需要将 SDI 和 MDI 混合使用。例如, VFP 将调试器显示为一 SDI 应用程序,而它本身又包含了自己的 MDI 窗口
为了支持这两种类型的界面, VFP 允许创建以下几种类型的表单:
子表单( Child Form) :用于创建 MDI 窗口中一个表单,子表单不可移至父表单 ( 主表单 ) 边界之外,当其最小化时将显示在 MDI窗口的底部。如主窗口最小化时,它也一同最小化。
浮动表单( Floating Form) :属于一主表单,但并不是包含在主表单中,它可以移至屏幕的任何位置,但不能在主窗口后台移动。最小化时,它将显示在桌面的底部。当 MDI 最小化,一同最小化。
顶层表单( Top-leve form) :没有父表单的独立表单,用于创建一个 SDI 应用程序,或用作 MDI 应用程序中其它子表单的父表单。顶层表单与其他 Windows 应用程序同级,可出现在其前台或后台,并且显示在 Windows 任务栏中。
表单类型 ShowWindow 属性 MDIForm Desktop
主表单 2- 作为顶层表单 .F. .F.
子表单 0- 在屏幕中 .T. 最大化时子表单和父表单相连 .F.
1- 在顶层表单中 .F. 最大化时子窗口为分开窗口
浮动表单 0- 在屏幕中 .F.
2- 作为顶层表单 .T.
设置表单的下同类型:
表单在新建立时方法都是一样的,只有通过更改表单的属性可以将表单设置为所需的类型
1 、 新建三个表单,其属性设置如下:
表单文件名 caption showwindows name MidForm Desktop
1 、 MdiForm.scx Mdi 表单 2- 作为顶层表单 frmMDI .F. .F.
2 、 ChilsForm.scx 子表单 1- 在顶层表单中 frmchlid .T. .F.
3 、 FloatForm.scx 浮动表单 0- 在屏幕中 frmfloat .F. .T.
2 、修改表单,在表单文件 MdiForm.scx 中添加二个命令按钮:其一 Caption 分别为“显示子菜单”,代码为 DO Form ChildForm.scx, 另一为“显示浮动菜单”,代码为 DO Form FloatForm.scx
三类表单演示操作
让我们进行演示 , 建立三个表单,分别为: MDIform. scx 、 Childform . scx 、 loatForm . scx
作为数据(库)表数据信息的输入、输出显示屏幕的界面
2 、从表单用途分类,主要有以下两类:
作为应用程序主屏幕(主采单)的界面
文档管理信息系统
输入 修改 检索 删除 打印、显示 退出
按分类号
按分类号
按文档名
按任意条件
按分类号
按任意条件
打印全部卡片
打印登记报表
显示全部卡片
表单设计主菜单
表单设计的各种界面
三个表单
二、创建表单及表单集
方法:
• 文件菜单笺—新建—表单—新文件(或向导)
• 顶目管理器—文档—表单—新建
即可进入表单设计器
常使用表单向导( Form Wizard )或表单设计器( Form Designer )来新建表单。
1 、在表单设计器中用户自已设计表单
2 、使用向导建立新表单
在表单向导对话框中,按提示(与使用其它向导一样)一步步选择完成。
3 、扩展表单为表单集
表单集是由一个或多个表单组成,可以作为一个整体单元操作,可以同时显示或隐蔽全部表单。建立了一个表单集便可以对它添加多个表单。
( 1 )建立表单集方法:先建立一个表单,然后在“表单” 菜单中选择“创建表单集” (Create Formset)即建立了一个表单集。
( 2 )添加和移除表单:可从“表单” (Form) 菜单选“添加新表单” (Add New Form) 。为从表单集去掉一个表单,可以在表单设计器底部的“表单” (Form)框选择表单,然后从“表单” (Form) 菜单选“移除表单” (Remove Form) 。
( 3 )移除一个表单集:可从表单 (Form) “菜单选 移除表单”集 (Remove Formset)。
四、创建表单集表单集是一个或多个表单的“父亲”容器。可对多个表单进
行统一管理和使用。
一、创建表单集
新建或打开一个已存在的表单,在主菜单笺“表单”中选”创建表单集”
二、添加、移除表单
在主菜单笺“表单”中选”添加表单”或“移除表单”
4 、设置数据环境
表单和表单集的数据源:表 (Tables) 和视图 (Views) ,以及表之间的关系,用数据环境设计器来添加。
在属性窗口中一般的数据环境属性设置如下:
属性 描述 缺省设置
AutoCloseTables 当表或表单集释放时,控制是否表和 真 (.T.)
视图被关闭
AutoOpenTables 当表单运行时,控制数据环境中的表 真 (.T.)
和视图是否打开
InitialSelectedAlias 当表单运行时,所选择的表或视图 在设计时,如果没有指定,则选定在运行时第一个加到数据环境的临时表
三、添加和操作表单对象
步骤每个表单都有相应的属性、事件、方法。常用表单控制
工具栏、调色板工具栏、布局工具栏、属性窗口、数据环境等进行设计。设计一个表单的步骤:
( 1 )创建表单并设置表单的属性
( 2 )给表单添加适当的容器、控件
( 3 )设置容器、控件的属性
( 4 )编写事件代码
选定对象
查看类
标签
文本框
编辑框
命令按钮
命令按钮组
选项按钮组
复选
框 组合框
列表
框 微调控件
表格 图象
计时器
页框
Active控件绑定控
件 线条形状容器
分隔符
超级链接
生成器锁定
按钮锁定
通过“表单控制工具栏”添加对象到一个表单,对象可是:
(1)容器 (Container) (2) 控件 (Controls)
(3) 用户自定义 类 (4)OLE对象
1 、添加 VFP容器到表单:命令按钮组 (Command button group)
表格 (Grid)
选项按钮组 (Option button group)
页框 (Page frame)
2 、添加 VFP控件到表单:
复选框 (Check box) 、组合框 (Combo box) 、命令按钮 (Command button) 、编辑框 (Edit box) 、图像 (Image) 、标签 (Label) 、线条 (Line) 、列表框 (List box) 、 OLE绑定 型控件 (OLE Bound Control) 、 OLE容器控件 (OLE Container Control) 、形状 (Shape) 、微调控件 (Spinner) 、文本框 (Text box) 、记时器 (Timer) 。
功能和所选控件对应关系
功能类型 应该选择的控件
提供给用户预先设定的选择 选择按钮组、列表框和下拉列表框、复选框
接受 不能预先设定的用户输入 文本框、编辑框、组合框
接受 有一定值范围 的输入 微调
执行具有一定时间间隔的特定任务 计时器
显示信息 图像、标签 、文本框、编辑框、形状
操作练习:向表单添加控件
1 、图像、标签 、文本框、编辑框、形状 。
2 、用生成器锁定控 件、按钮锁定控 件给表单添加控件。
3 、按钮组、列表框和下拉列表框、复选框
4 、微调、计时器
9.2 面向应用程序的组装“模块” : VFP 类与对象
在学习表单设计中,通过上机实践对面对象的程序设计已有了一定的认识,下面以表所示来小结:面向对象方法与结构程序设计方法之区别:
设方式方法
计方式
数据显示方式
处理方式
使用方式
处理顺序
结构程序 面向对象程序
过程性( Process ) 对向性( Object )
显示型 隐藏型
单一程序编码 对象模块化
一次使用 可以重用
定位方式 非定位方式
设计方式
指对问题处理的程序设计方式。
1 、过程性的设计思想中
• 是针对问题采用顺序性的程序处理决问题。
• 采用逻辑概念设计程序文件。
• 在解决问题的过程中,常发生调用子过程程序文件。
2 、面向对象程序设计方法,是采用“对象”为设计思想中心。
• 不采用顺序性处理方式,对问题采用了对象本身的属性与方法来解决问题。 • 在处理问题过程中,可以直接在对象中设计事件程序,直接触发问题 。
一、 Visual FoxPro 中的对象
1 、 什么是对象?
对象是 VFP 程序的基本构造块,对象具有属性( Properties )、方法( Mathod )以及键盘、鼠标或程序触发等的事件程序,通过属性、事件和方法等等所组合而成的具体抽象实体,就称为对象。
而通过属性、事件和方法,可以实现一个对象的功能。2 、对象的属性、事件和方法
“ 属性”( Properties)封装了数据,每个对象都具有“属性”。 “属性”值可以在设计时设置,也可以在运行时更改,但有的“属性”是只读属性,不可改变。
“ 事件” (Events) 是预先定义 的动作,由用户或者系统激活。VFP 中的事件通常包括了键盘“事件”和鼠标“事件”,如单击或双击鼠标,移动鼠标、按键盘等(见 P247 )。
“ 方法”( methods )是指对象为实现一定功 能而编写的代码, “方法”和对象相连。事件中的代码可以认为是基于事件的响应方法。但“方法”是可以独立于事件的单独代码,必要时可以由其它方法或程序代码进行显示的调用。
事件通常已经预先由系统定义好 了,不能随便的扩充,而方法和属性却可以无限的扩展,事件的发生具 有一定的顺序,
如: load 和 click , load 在执行表单时就激活了,而 click在执行表单后需单击命令按钮才激活。
如:下例:
FORM( 事件 ): load
代码: thisform.backcolor=rgb(255,0,0)
Command( 事件 ):click
代码: thisform.label2.caption="abcdefg"
执行表单文件,立即 form 的背景为红色。
当单击 command1 , label1 的值才显示出来。
二、 Visual FoxPro 中的类
Visual FoxPro 中的对象的概念和类的概念是密切相关的,但是有区别的,类作为一个对象的整体定义 而存在,它是对象的轮廓和蓝图。
对象和类的关系就如同一台机床和图纸的关系,图纸决定了某一种类型的机床的功能和外观,而一台具体的机床可以看作一个对象而存在。某种类型的,根据机床的初始设计图可以设计出一个系列的机床产品图,这就如同由一个父类派生出若干子类一样,属于某个系列的某一台具体的机床可以看作是一个具体的对象。
所有对象的属性、事件、方法在定义 类时都将被指定。
类的三大特性:封装性、继承性、再分类性(子类)。
( 1 )封装性如一台电话只需一根电话
线连接就可以拨号使用,而不必去了解电话内部的设置。你看到的是电话类的一个对象,其内部的接收 、转换、电子信号的处理等复杂 性(属性、事件、方法)被隐藏了。
通过对事务的抽象,由类定义 的对象可以将自己内部的复杂 性封装起来。
封装就是指将对象的方法、属性代码包装在一起。
图 1电话
如下图所示,“电话”种类可以有很多种,但都具有基类电话的基本属性。即可从父电话类派生出一系列的子电话类,这些子类的形状虽然 有改变或新增加了一些属性(功能),但仍继承了父类的基本属性、事件和方法。
图 2
( 2 )继承性
子类可以继承父类的所有的属性和方法,也可根据需要加入新的属性和方法。
( 3 )再分类( SubClass )
意义 要于类( Class )本身可以不受层次的限制,往下扩展更多的类,让子类继承上一层类的方法,并且有其本身的属性与方法定义 。这样使程序编码减至最低。甚至在修改时,只需要修改其中一层的类,其子类( SubClass )均自动调整。增加维护效率。
如:IC产生掌 上型扫描仪,又将掌上型扫描仪某一功能板装至桌
上型扫描仪,最后又将桌上型扫描仪某一元件装至投影片扫描仪 。
Class :掌上型扫描仪 SubClass :桌上型扫描仪、投影片扫描仪
图 3
存贮该 新建的命令子类,用于表单中实现“退出” 功能。其代码及 caption 的属性“退出”都被封装,看不到了。而且继承了命令按钮类(父类)的原已有的属性等。
2 、类的创建、修改及使用
创建类有二种方法:用类设计器创建、通过写代码创建。
下面用类设计器来创建类(同时对类的三大特性进一步了解)
命令按钮类,
子类:代码: thisform.release
由它创建
创建:新建文件 类 新文件 类设计器保存:文件类型为类
修改:打开 类 类文件名 进入类设计器可修改。
例 1 :
例 2 :创建“电子查看”类
方法:新建表单 文件 另存为类。
if this.parent.label1.left+this.parent.label1.width>0
this.parent.label1.left=this.parent.label1.left-20
else
this.parent.label1.left=this.parent.shape1.width
endif 自定义类演示
将整个表单另成为
“电子查看”类(自定义 类),类文件名为 JZ.vcx
将生成的自定义 类添加到类库
操作: 1 、新建表单集,拖放 JZ到表单集( bdj.scx) ,双击“计时器”,看不到代码,被封装。
2 、执行结果,文本内容显示。
3 、打开 JZ 类进行修改:删除文本“文档管理信息系统”,再打开表单集 (bdj.scx) ,可见其类 (JZ.v cx) 自动被修改。
4 、以 JZ.vcx 为父类,创建子类 jzz.vcx 。(方法与例 1 同)
(可用例 1 建的类,代码: thisformset.release )
5 、拖放到表单集( BDJ.SCX)form2 中,增加文本
执行
三、类的层次
如书 P248
1 、 VFP 的基类和层次
书 P249
2 、容器 (container) 类和控件 (Control) 类
VFP 的类有两种主要类型:容器类和控件类。
( 1 )容器类容器类包含其它对象,并且允许访问这些对象。见表 9-8 列出
了各容器类所能包含的对象。
( 2 )控件类控件类的封装比容器类更为严密 , 但因此损失了一些灵活性。
控件类没有“ Addobject” 方法程序。(”没有增加对象“)
四、对象的处理
1 、在容器层次中引用对象
为处理一个对象,需要知道它相对于容器层次的关系。例如,如果要在表单集中处理一个表单的控件,则需要引用表单集、表单和控件。在其容器层次中引用对象好比给 VFP 提供这个对象的地址。
( 1 )绝对引用
通过提供对象的完整容器层次来引用它:命令: frsFormSet.frmForm1.cmdButton1
例:为了让表格列 (grid column) 中的控件不起作用,需要提供下面的地址:Formset.Form.PageFrame.Page.Grid.column.Control.Enabled=.F.
( 2 )相对引用
在容器层次中引用对象时,例如在表单集合中表单命令按钮的Click( 单击 ) 事件,可以通过快捷键方式指明所要处理的对象。下表列出了一些属性和关键字,这些属性和关键字允许更方便地从对象层次中引用对象。
属性或关键字 引用
Parent 该对象的直接容 器。
THIS 该对象。
THISFORM 包含该对象的表单。
THISFORMSET 包含该对象的表单集。
应用:命令 何处包含此命令
THISFORMSET.frm1.cmd1.Caption=ˊABCˊ 在此表单集合的任何表单上任何控件的事件或 方法码中。
THISFORM.cmd1.Caption=ˊABCˊ 在 cmd1 所在同样的表单上任何 控件的事件或方 法代码中。
THIS.Caption=ˊABCˊ 在 需 要 改变标题 (caption) 的控件的事件或方法代码中。
THIS.Parent.Back Color=RGB(192,0,0) 在表单上一个控件的事件或方法代码中,此命 令改变表单的背景颜色为暗红色。
2 、设置属性
语法: Parent.Object.Property=Value ( 即:父 . 对象 . 属性=值 )
设置多个属性语法: WITH…ENDWITH
例如,在表单集的一个表单中,要设置表格列的多个属性,可以使用如下语法结构:
WITH frsFormSet1.frmForm1.grdGrid1.grcColumn1.width=5
.Resizable=.F.
.ForeColor=RGB(0,0,0)
.BackColor=RGB(255,255,255,)
.SelectOnEntry=.T.
ENDWITH
3 、调用方法
一旦对象被建立,就可以在应用程序的任何一个地方调用此对象的方法。调用方法的语法如下:
Parent.Object.Method (即:父 . 对象 . 方法 )
例:调用显示一个表单的方法:
frsFormset.frmForm1.Show4 、响应事件
当事件发生时,该事件的过程代码将被执行。
系统响应用户动作时,事件将被自动触发。例如,当用户单击一个控件时,系统自动执行为 Click 事件编写的代码。事件代码也能由系统事件触发,例如在计时器控件中的 Timer 事件。
1 .核心事件
下表列举 了 VFP 的核心事件集,并适用于多数控件:
事件 激发后动作
Load 表单或表单集被加载进内存。
Unload 表单或表单集从内存中释放。
Init 对象被创建。
Destroy 对象从内存中释放。
Click 用户用主鼠标按钮单击对象。
DblClick 用户用主鼠标按钮双击对象。
RightClick 用户用辅 (右 )鼠标按钮单击对象。
GotFocus 对象接收焦点 ,由用户动作 ( 如按 Tab键和单击 ) ,或者在代
码中使用 SetFocus 方法引起。
LostFocus 对象失去焦点,由用户动作 ( 如按 Tab键和单击 ) ,或者在代
码中使用 SetFocus 方法引起。
KeyPress 用户按下或释放一个键。
MouseDown 当鼠标指针停 在一个对象上时用户按下鼠标按钮。
MouseMove 用户在对象上移动鼠标。
MouseUp 当鼠标指针停 在一个对象上时用户释放鼠标按钮。
InteractiveChange 交互式改变对象值。
ProgrammaticChange 可编程地改变对象值。
2 . VFP 事件顺序
见 P254
3 、编写事件代码每个对象(控件)都可进行属性、事件、方法的设置,现在学习如何定义 事件、如何给控件写入方法代码。
例题 1 :设置表单 1 (背景练习):其中有三个命令按钮控件,作用分别为单击 COMMAND1 时,表单 1 的背景图改变,单击 COMMAND2 时,表单 1 的背景图又被改变,单击 COMMAND3 时 ,释放表单(关闭表单)。
方法代码
thisform.picture="c:\program files\microsoft visual studio\vfp98\fox.bmp"
thisform.picture="c:\program files\microsoft visual studio\vfp98\wizards\wizstone.bmp"
thisform.release
事件 :click背景练习
例题 2 :登录表单
If thisform.text1.value="12345".and.thisform.text2.value="abc"
do 文档管理信息系统 .scx
else
messagebox(" 口令或用户名有错,请重输入! ",0," 提示 ")
thisform.text1.setfocus
endif thisform.text1.value=" "
thisform.text2.value=" "
thisform.text1.setfocus
thisform.release登录表单演示
4 、面向对象程序语法 (OOP)
<object>.<Properties/Methed>=<Define/Result>
如: thisform.text1.value=“12345”.and.thisform.text2.value=
"abc"
thisform.picture="c:\program files\microsoft visual studio\vfp98\fox.bmp"
对象 对象的属性或方式 定义 或结果
5 、 信息窗口的送出使用了函数 MessageBox(), 其语法如下:
MESSAGEBOX (cMessageText [,nDialogBoxTyoe [,cTitleBarText]] )
第一个参数:为定义 信息窗口提示内容。
第二个参数:为定义 信息窗口按钮组合与图标( Icon) 样式的数据,一般为两个数字间以“ +”串联。第一个数字为信息窗口按钮组合,第二个为图标 Icon 类别。如 4+48 ,表示按钮组合为“是”以及“否”, 48 为警叹号。
第三个参数:为信息窗口标题 Caption内容定义 。例如: MESSAGEBOX ("请输入学号 ",4+48," 信息窗口 ")
运行例 2登录表单 , 按确定按钮后 ( 口令和登录姓名错 ) 的显示:Messagebox(" 口令或用户名有错,请重输入! ",0," 提
示 ")
Messagebox(" 口令或用户名有错,请重输入! ",2," 提示 ")
Messagebox(" 口令或用户名有错,请重输入! ",1," 提示 ")
表单( Form )或表单集( Formset) 对象常用语句:
Thisform.release 表单释放
Thisform.refresh 表单刷新
Thisform.hide 表单隐藏(对表单集中的一个表单)
thisform.parent.form1.show 表单显示(对表单集中的一个表单)
9.3 表单对象的应用实例
见 P264 大学生通用习题测试系统
9.4 设置表单或表单集模板( Template)
见 P274