Visual FoxPro
1
i s u a l
F
V
o x P r o
Visual FoxPro
2
11.1 表单的建立与运行
11.2 表单的操作
11.3 常用表单控件
11.4 表单的应用
Visual FoxPro
3
11.1.1 用表单设计器建立表单
1.表单设计器窗口
方法 1:选择, 文件, 菜单中, 新建, 选项, 指定文
件类型为, 表单,, 然后单击, 新建文件, 按钮 。
方法 2:在, 项目管理器, 中选择, 文档, 选项卡中
的, 表单,, 然后单击, 新建, 按钮, 并在打开的
,新建表单, 对话框中选择, 新建表单, 。
方法 3:在命令窗口输入 CREATE RORM命令 。
11.1 表单的建立与运行
Visual FoxPro
4
不管采用上面哪种方法, 系统都将打开表单设计器窗
口 。 打开表单设计器窗口后, Visral FoxPro主窗口
上还将出现属性设置窗口, 表单控件工具栏, 表单
设计器工具栏以及, 表单, 菜单项 。
表单设计器窗口
Visual FoxPro
5
2.表单控件工具栏的初步认识
(1)怎样在表单中加入一个对象
在表单中加入对象的方法非常简单, 只要首先将鼠
标在控件工具框移动到所需要的控件, 并单击鼠标
主按钮, 然后到表单的相应位置拖放出一个图形,
就在表单中加入了一个继承了所选控件的全部属性
和方法程序的对象 。
Visual FoxPro
6
(2)
如果所需要的控件不在当前表单控件工具栏中, 就
要重新指定工具栏对应, 类库, 文件, 可以按下列
步骤选定所需要的类库文件 。
① 用鼠标指向表单控件工具栏中, 查看类, 的命令按
钮, 单击鼠标主按钮, 选择, 添加,, 在, 打开,
对话框中选择所需要的类文件 。
② 在上述第 ① 步中选择, 常用, 可以恢复标准控件
( 基类 ) 。
Visual FoxPro
7
(3)
常用控件就是 Visual FoxPro 为开发者提供的基类,
下面对这些控件进行一些介绍, 在 11.3节中还会对
标签控件 ( Label), 不能绑定数据, 只能起提示作
用 。
命令按钮 ( Command Button), 在应用系统中, 命
令按钮是交互的主要工具, 人们通过按钮向应用系
统发布操作命令, 按钮通过执行其方法程序响应人
们的命令 。
命令组 (CommandGroup),关于命令的容器,
选项按钮组 ( OptionGroup),选项按钮即一般所称的
单选按钮, 是构成交互式界面的有力工具 。
Visual FoxPro
8
文本框 ( TextBox),文本框是一种基本控件, 它可以
捆绑关系数据表的一个非备注型字段数据, 从而实
现通过文本框对象对数据表的字段增加和修改的目
的 。
编辑框 ( EditBox),编辑框可以绑定一个关系表中的
备注型字段数据 。
组合框 ( ComboBox),组合框兼有列表框和文本框的
功能 。 它有下拉组合框和下拉列表框两种形式 。 组
合框可以绑定数据表中的一个或多个字段 。
列表框 ( ListBox),与组合框类似 。
Visual FoxPro
9
复选框 ( CheckBox),复选框也是构成交互式操作界
面的有力工具 。 复选和选项按钮的的差别是:服选
按钮可以兼选, 而选项按钮只能单选 。
微调按钮 ( Spinner),用户可以使用微调按钮对对其
所绑定的整数型字段数据进行维护 。
表格 ( Grid),表单中一种功能强大的控件 。 可以绑定
指定的数据表, 从而实现通过表格对象对数据表的
进行维护的目的 。
计时器 ( Timer),可以定时执行某种操作 。
页框 (Page Frame):是一个容器控件, 可以构建含有
,选项卡, 的界面 。
Visual FoxPro
10
3.表单中的对象设计
(1)
① 把对象的, 父类, 加入到表单控件工具栏, 如果对
象的父类已在当前的表单工具栏中就省略这个步骤,
这个步骤的操作过程已在前面讲过, 此处从略 。
② 从表单控件工具栏中选定所需要的控件, 并将其派
生对象加入到表单中 。 加入表单后该对象将继承所
选择控件的全部特征, 名称以对象所属的, 基类,
( 不是, 父类, ) 名加上数字编号组成, 对象名称
可以重新设定 。 这一部分工作也已经讲述过, 不再
重复 。
Visual FoxPro
11
(2)
把鼠标移到要删除的对象上, 单击辅按钮, 选择
,剪切,, 即可删除这个对象 。 注意, 如果是由一
个容器控件 ( 如自定义的命令组子类 ) 派生而成的
一个容器对象, 则不能删除该容器对象中的某成员
对象, 只能删除容器整体 。
(3)
将鼠标移到要设置属性的对象上, 单击辅按钮, 选
择, 属性,, 就进入属性设置窗口, 后面的操作和
第十章中介绍的设置, 类, 的属性的方法完全相同 。
(4)
将鼠标移到要添加代码的对象上, 单击辅按钮, 选
择, 代码,, 出现代码设计窗口, 选择要设计代码
的事件, 然后在代码框中编写代码 。
Visual FoxPro
12
表单中对象的属性设置
Visual FoxPro
13
4.表单设计的基本步骤
( 1) 进行规划, 最好画一张草图, 在上面标出各对
象的位置, 标题, 所属父类, 对象的大致作用, 表
单中要使用的表, 表间的对应关系以及对象间的相
互协调与支持 。
( 2) 打开表单设计器窗口 。
( 3) 如果表单要使用到表, 需要首先为表单建立
,数据环境, 。 数据环境也是 Visual FoxPro 中的一
种对象 ( 不可视 ) 。
Visual FoxPro
14
建立数据环境的步骤是:
① 将鼠标移到表单的任一空白位置 ( 不能指向任何对
象 ), 单击辅按钮, 选择, 数据环境, 。
② 选择与表单对应的数据表, 单击, 添加, 按钮, 选
中的数据表会加入到数据环境设计器中 。 如果要加
入多个表, 应重复这一过程, 然后单击, 关闭, 按
钮退出数据表的加入操作 。
③ 在数据环境设计器中建立表间的关联关系 。
Visual FoxPro
15
(4) 在表单中加入其他对象并进行布局排列, 一般表
单的标题要放在整个表单的上方, 命令按钮放在下
面后右侧, 文本框对象要与其对应的标签对象放在
一起 。 布局的目的是为了美观, 清晰 。 表单中的对
象是可以用鼠标直接拖动的 。
(5) 建立对象与表的对应关系 。 可以与表字段进行联
系的对象有:表格 ( Grid), 文本框 ( TextBox),
编辑框 ( EditBox), 列表框 ( ListBox) 等等 。
Visual FoxPro
16
建立这类对象与数据表字段的关联的方法是:
① 文本框, 编辑框,
对于这些非容器类的对象, 设定其与数据表对应字段
的关联时, 只需要将其 ControlSource 属性设置为
数据表的对应字段名即可 。 在表单中加入了数据环
境对象后, 这些字段的 ControlSource 属性对应一
个下拉列表框, 从列表项选择一个字段与对象关联 。
②
表格是一种容器对象, 其成员对象是列, 默认的对象
名是 Column1,Column2 等, 而列也是一个容器对
象, 起成员对象是 Header和 Text。
Visual FoxPro
17
11.1.2 用表单向导建立表单
Visual FoxPro 中有两个个表单向导, 各种向导所建立
( 1) 表单向导:整个表单针对一个数据表进行诸如
查询, 修改, 插入, 删除等操作;
( 2) 一对多表单向导:整个表单针对两个数据表,
而且这两个数据表间存在一对多的关系 。
Visual FoxPro
18
11.1.3 表单的运行
有 3
(1) 直接使用命令 。 在命令窗口,
DO FORM <表单名 >
如果表单没有在当前目录中, 并且没有用 SET
PATH命令设定搜索路径, 则需要在表单名前冠上
目录路径 。
(2) 在表单设计器窗口, 选择, 表单, 菜单中的, 运
行, 命令, 或直接单击工具栏中的红色惊叹号 。
(3) 在项目管理器中, 选中, 文档, 选项卡并指定要
运行的表单, 单击, 运行, 按钮 。
Visual FoxPro
19
11.2.1 表单的属性
表单作为一个对象, 当然也和其他对象一样具
有属性, 可以识别的事件以及事件响应程序 。 可以
在实验中调整这些参数并观察表单发生的变化, 从
而理解这些属性的意义 。
11.2 表单的操作
Visual FoxPro
20
11.2.2 表单的事件与方法
表单可以响应 40多个事件和方法, 下面对这几
个常用事件和方法做一些说明:
1.Init 事件,创建表单时触发该事件, 从而执行为该
事件编写的代码 。 Init代码通常用来完成一些关于
表单的初始化工作 。
2.Destory事件,释放表单时触发该事件, 该方法代码
通常用来进行文件关闭, 释放内存变量等工作 。
3.Click事件,用氧标单击对象对触发该事件, 从而执
行为该事件编写的代码 。
Visual FoxPro
21
4.Show 和 Hide 是一对方法, Show 使表单可见,
而 Hide则是隐藏表单 。 注意, 如果使用 Show( )
格式调用该方法, 则只是显示一次表单, 要希
望表单显示并停留在屏幕上, 应该使用 Show
( 1) 格式调用该方法 。 另外, Hide方法只是
在屏幕上隐藏表单, 并没有从内存中释放表单,
隐藏后的表单依然可以通过调用 Show方法恢复
显示 。
Visual FoxPro
22
5.Release 方法从内存中释放表单。注意 Release
方法与 Destory 的区别,Destory 方法是由表
单释放事件而触发的方法,而 Release 方法则
是主动释放表单,可以说 Release是 Destory 的
触发器,由于 Release 方法的实行而导致表单
的释放,从而引发表单释放事件,并因此触发
Destory 方法的运行。
Visual FoxPro
23
6.Refresh 方法刷新表单数据 。 当表单中各种对象所对
应的数据发生改变时, 有时并不自动的反映在表单
界面上, 需要使用 Refresh 刷新, 才能显示最新数
据 。 如用一个文本框关联一个数据表字段, 当数据
表记录指针移动后, 新记录对应的数据需要刷新后
才能更新 。
Visual FoxPro
24
11.2.3 数据环境
每一个使用了数据表的表单都包括一个数据环境 。 数
据环境是一个容器对象, 它用来定义与表单相联系
的数据实体 ( 表, 视图 ) 的信息及其相互联系 。 数
据环境容器一般包含一到多个 Cursor类对象, 表单
中所含 Cursor类对象的个数与表单关联的数据实体
( 数据表, 视图 ) 的个数相同, 一个 Cursor类对象
与一个数据实体 ( 数据表, 视图 ) 对应, 如果一个
表单关联多个数据表, 在数据环境容器中还有一个
Relation类对象描述这些表之间的关系, 下面对数
据环境容器及其可能包含的对象分别进行说明 。
Visual FoxPro
25
1,游标 ( Cursor) 类对象
当存储在磁盘上的一个数据表文件被打开时, 系统会
在内存中建立一个该表的临时文件, 内存中的临时
文件实际上是磁盘文件的一个映象, 所有数据库的
操作修改命令都是针对这个映象进行的, 当发布数
据更新 TableUpdate( ) 命令或关闭数据文件的命
令后, 系统再把这个映象文件存入磁盘, 从而完成
对磁盘文件的修改 。 Cursor 类对象也称为游标对象,
它用来定义临时表的相关信息 。
Visual FoxPro
26
2.关系 ( Relation) 类对象
如果表单所关联的数据表多于一个, 数据环境容器中
有一个对象 Relation 用来定义这几个表 ( 视图 ) 间
的关系 。
3.数据环境 ( DataEnvirinment) 容器
数据环境是包括了 Cursor和 Relation 两类对象的一个
容器, 该容器和其所含对象一起定义了表单中的数
据源 。
Visual FoxPro
27
4.数据环境设计器
可以使用完全的编程方式建立数据环境, 但大多数
情况下都是用数据环境设计器来建立表单的数据环
境 。 第一节已经初步说明了数据环境设计器的用法,
下面通过一个例子再做进一步的说明 。
例 建立一个学生选课表单 。 表单中有 3个对象, 标签
对象显示这个表单的标题:, 学生选课情况查询,,
左侧的列表框对象中从, 学生, 表中选择学生的名
字, 右侧的表格对象显示被选中的学生的选课情况,
当重新选择一个学生时, 表格中的数据会自动变化 。
Visual FoxPro
28
学生选课表单
Visual FoxPro
29
(1)打开表单设计器窗口 。
(2)为空白表单加入第一个对象:数据环境 。
① 在表单空白处, 单击鼠标辅按钮, 选择, 数据环
境,, 出现一个数据环境设计器 。
② 在数据环境设计器中, 单击鼠标辅按钮, 选择, 添
加, ( 见图 11.16), 首先选择父表, 学生,, 单击
,添加,, 然后选择子表, 选课,, 单击, 添加,,
单击, 关闭,, 退出数据表添加过程, 按 Ctrl+W,
退出表单设计过程 。 数据环境设计器会自动修改其
Cursor和 Relation属性 。
(3)退出数据环境设置后, 为表单加入一个文本框对象,
一个列表框对象, 一个表格对象, 并用鼠标对 3个
对象进行大致布局 。
Visual FoxPro
30
图 11.16 数据环境设计器
Visual FoxPro
31
(4)使用生成器设置列表框和表格对象的属性, 前面已
经说明过表格生成器的用法, 下面只简要说明一下
列表框生成器的用法 。
把鼠标移到列表框对象上, 单击辅按钮, 选择, 生
成器,, 在生成器中选择对象所关联的字段, 然后
单击, 确定, 。
(5)直接修改标签对象的 Caption属性:, 学生选课情
况查询,, FontSize,22,ForeColor,0,0,255。
保持表单 。
本例中数据环境对象, 列表框对象及表格对象的属
性都是借助于生成器这种辅助工具完成的, 实际开
发过程中, 设计人员也往往是尽量采用生成器, 只
有生成器不能实现的功能才手工设置, 这样能有效
地减少错误, 提高工作效率 。
Visual FoxPro
32
11.2.4 表单对象的布局
前面已经讨论了为表单加入对象, 在表单中删除对
象, 为对象加入事件与方法代码以及对象属性的设
置等表单对象的操作问题 。 表单设计中还有一个问
题就是表单对象的布局:包括对象的大小, 对象的
位置设计 。 Visual FoxPro 还提供了一个, 表单布局
工具栏, ( 可以在 Visual FoxPro 菜单栏中, 选择
,显示, 中的, 工具栏, 再选择, 布局, 调出 ) 。
选定表单中的某个对象后 ( 即用鼠标单击某个对象,
被选中的对象边框和其他对象不同 ), 可以使用布
局工具栏中的相应按钮让其
Visual FoxPro
33
“水平居中”、“垂直居中”等操作;当同时选择
一个以上的对象时(选中一个对象后,把鼠标移到
其他对象,并按住 Shift键并单击某个对象)也可进
行同样的操作。还可以使用表单布局工具栏使所有
被选中的对象执行“左对齐”、“右对齐”、“顶
边对齐”、“底边对齐”、“相同高度”、“相同
宽度”、“相同大小”等操作。当鼠标移到工具栏
中的某个图标上时,会出现图标的名字,单击鼠标
主按钮,就会对选定对象执行某个操作,读者可以
自行逐个实验一次,以掌握该工具的用法。
Visual FoxPro
34
11.3.1 命令按钮控件
命令按钮是最简单也是最常见的一种控件, 由其派
生的命令按钮对象在表单中随处可见 。
11.3.2 命令按钮组控件
可以将命令按钮组成一组, 对组中的按钮即可单独
操作, 也可作为一个组来统一操作 。 设计者可以为
组中的每个按钮单独设计事件代码, 也可以为整个
按钮组设计一个事件代码, 当一个事件 ( 如 Click)
在组中的某个按钮上发生时, 命令按钮组的 Value
属性指明该事件发生在哪个按钮 。
11.3 常用表单控件
Visual FoxPro
35
11.3.3 文本框控件
文本框是用来在应用系统与用户之间进行数据交互的
一种常用工具, 它允许用户添加或编辑保存在表中
非备注字段中的数据 。
11.3.4 编辑框控件
编辑框也是用来输入用户的数据的 。 在编辑框中允许
用户编辑长字段或备注字段文本, 允许自动换行并
能用方向键, PageUp 和 PageDown 键以及滚动条
来浏览文本 。
11.3.5 复选框控件
复选框可以用来表示某些状态是否成立, 其值是一个
逻辑量 。 复选框也是一种经常使用的控件 。
Visual FoxPro
36
11.3.6 组合框控件
组合框兼有列表框和文本框的功能 。 有两种形式的组
合框, 即下拉组合框和下拉列表框, 通过更改控件
的 Style 属性可选择想要的形式 。
11.3.7 单选按钮控件
单选按钮组是包含单选按钮的容器 。 通常, 单选按钮
允组用来由用户指定对话框中几个操作选项中的一
个 。
11.3.8 微调控件
使用微调控件可以让用户通过, 微调, 尖头来选择所
需要的数据, 直接在微调框中直接键入所需要的数
Visual FoxPro
37
11.3.9 标签控件
标签通常被用做提示或标题 。 标签和文本框的不同之
处在于标签没有数据源, 不能编辑, 运行时不能被
选中 。
在程序中可以改变标签的 Caption 和 Visible 属性, 使
标签根据不同的状态显示不同的内容 。
11.3.10 列表框控件
列表框和下拉列表框 ( 即 Style 属性为 2 的组合框控
件 — 下拉列表 ) 为用户提供了包含一些选项和信
息的可滚动列表 。 列表框中, 任何时候都能看到多
个项;而在下拉列表中, 只能看到一个项, 用户可
单击向下按钮来显示可滚动的下拉列表框 。
Visual FoxPro
38
11.3.11 表格控件
在前面已经说明过, 表格是一种容器对象, 它包含了
若干个列, 而列由包含标头和文本 。
表格对象能在表单或页面中显示并操作 ( 编辑修改 )
表格中行和列中的数据 。 设计者常使用表格对象来
创建一对多表单, 例如学生选课情况查询表单 。
11.3.12 计时器控件
计时器控件与用户的操作独立 。 它只对时间作出反应,
以一定的间隔重复地执行某种操作 。
Visual FoxPro
39
注意, 计时器的 Enabled 属性和其他对象的 Enabled
属性不同 。 对大多数对象来说, Enabled 属性决定
对象是否能对用户引起的事件作出反应 。 对计时器
控件来说, 将 Enabled 属性设置为, 假, (.F.),会
挂起计时器的运行 。
当一个计时器的时间间隔 ( 由 Interval属性值规定 )
过去后, Visual FoxPro 将产生一个 Timer 事件 。
Visual FoxPro
40
例 设计一个电子钟, 要求不直接使用 TIME()
一个电子钟至少需要两个对象, 一个时钟信号发生器
和一个显示器, 可以使用一个文本框作为显示器,
而用计时器作为时钟信号发生器 。
1.建立一个新表单, 并在表单中加入一个文本框对象
和一个计时器对象 。
2.在表单的 Load
PUBLIC rh,rm,rs && 分别存放时间的时, 分,
3.将文本框的 FontSize 属性设置为 18,并在其 Init事件
This.Value=time() &&文本框建立时初始化为系统时间
4.将计时器的 Interval 属性设置为 1000,并为其设计
Timer事件代码 。
Visual FoxPro
41
时钟程序的运行
点击查看程序请
Visual FoxPro
42
11.3.13 页框控件
页框 是, 页面, 的一种容器, 而, 页面, 也是一
种容器, 可以放置任何控件, 容器和自定义对象, 一
个页面在运行时对应一个屏幕窗口 。
表单 的一个窗口幅面有限, 如果在一个应用中要
涉及到的对象很多, 在一个窗口不好布局时, 可以把
整个表单中的对象按联系的紧密程度进一步划分为小
的模块, 把一个模块中的对象在一个页面中进行布局,
这样, 整个窗口就显得简要, 清晰, 也不至于因为一
个窗口放置的对象太多而弄得眼花缭乱, 找不到所需
要的信息 。 页框就正是为了这样的目的而设计的一种
容器类, 是 Visual FoxPro 的一个基类 。 页框建立在
表单上, 页面建立在页框上, 经过页框的处理后, 一
个表单中的全部对象就分布到了多个窗口 。
Visual FoxPro
43
11.4.1 系统登录表单
每个应用系统都有自己的用户群, 在进入一个应用
系统前, 常有一个登录过程, 目的就是验明使用者
的身份, 防止未授权用户进入系统, 从而保证系统
安全 。 在登录界面的文本框输入登录者姓名, 下面
的文本框输入编号, 为保密, 这里输入的字符均显
示为星号 ( *) 。
11.4 表单的应用
Visual FoxPro
44
登陆表单示例
Visual FoxPro
45
1.与登录过程相关的数据表
登录过程实际上是对用户所输入的信息进行验证的过
程, 验证方法一般是在一个用户信息数据表中检索
用户输入的数据, 若检索到, 则容许用户登录, 否
则, 拒绝用户登录 。 为减少数据的描述过程, 这里
借用前面多次应用的, 教师, 表进行登录检查, 以
教师编号作为密码, 即假设系统只容许在, 教师,
表中注册过的教师才能登录, 登录时要输入自己的
姓名与教师编号 。
Visual FoxPro
46
2.表单各对象的属性设置
登录表单中共有 3个标签对象, 两个文本框对象和一
个命令按钮, 设置各对象的属性 。
3.数据环境设计
为表单中加入一个数据环境, 并在该环境中加入, 教
师, 数据表, 数据环境其他属性保持默认属性 。
Visual FoxPro
47
4.命令按钮代码
命令按钮中的 Click
SELECT
(ThisForm.DataEnvironment.Cursor1.Alias)
LOCATE FOR 姓名 =ThisForm.Text1.Value AND 教
师号 =ThisForm.Text2.Value JP
IF FOUND() THEN
=MessageBox(′祝贺你登录成功 ! ′)
ELSE
=MessageBox(′姓名或教师号不正确, 你可能还没
有注册 ′)
ENDIF
RETURN
Visual FoxPro
48
11.4.2 数据编辑表单
编辑 ( 修改, 插入, 删除 ) 数据表中的数据是表单的
一个重要应用方面 。 在教师数据表的编辑表单, 在
该表单中, 可以加入和修改教师数据, 也可以对应
每个教师修改其授课的情况 。
对于这样两个有一对多关系的表的操作问题, 表单向
导中的, 建立一对多表单, 就能给出较好的解决结
果, 这里就用向导来实现这个表单 。 本章第一节已
经详细的讲述了一对多表单向导的用法, 这里不再
详细讲述表单的实现过程 。 只要注意把, 教师, 选
为父表,, 授课, 选为子表, 并且将表单标题 ( 即
表单的 Caption属性 ) 设置为, 教师授课数据录入,,
其他均保持向导程序的默认设置 。
Visual FoxPro
49
数据编辑表单示例
Visual FoxPro
50
11.4.3 数据查询表单
数据查询表单与数据修改表单的差别不大,实际上,
很多时候把两种表单合并起来,在同一个表单中即
可实现数据的查询,也可进行数据的插入、删除、
修改等编辑工作。但是,把两种实现不同功能的表
单合而为一有两点不便:第一,用户可能只是希望
查询数据,但由于不小心而可能误改了数据,并且
无法还原(可能没有发现修改了数据,也可能没注
意数据的原来值),这将对数据的准确性造成很大
的潜在危险;第二,对一个系统的数据有查询权的
用户比有修改权的用户要多得多,为区分这两种不
同身份的用户的不同权限要求,一般需要把数据的
查询工具与修改工具进行分别设计,也就是要设计
两种不同的表单,在专门的数据查询表单中,不管
用户有意还是无意都无法修改数据。
Visual FoxPro
51
一个查询表单的运行界面
1
i s u a l
F
V
o x P r o
Visual FoxPro
2
11.1 表单的建立与运行
11.2 表单的操作
11.3 常用表单控件
11.4 表单的应用
Visual FoxPro
3
11.1.1 用表单设计器建立表单
1.表单设计器窗口
方法 1:选择, 文件, 菜单中, 新建, 选项, 指定文
件类型为, 表单,, 然后单击, 新建文件, 按钮 。
方法 2:在, 项目管理器, 中选择, 文档, 选项卡中
的, 表单,, 然后单击, 新建, 按钮, 并在打开的
,新建表单, 对话框中选择, 新建表单, 。
方法 3:在命令窗口输入 CREATE RORM命令 。
11.1 表单的建立与运行
Visual FoxPro
4
不管采用上面哪种方法, 系统都将打开表单设计器窗
口 。 打开表单设计器窗口后, Visral FoxPro主窗口
上还将出现属性设置窗口, 表单控件工具栏, 表单
设计器工具栏以及, 表单, 菜单项 。
表单设计器窗口
Visual FoxPro
5
2.表单控件工具栏的初步认识
(1)怎样在表单中加入一个对象
在表单中加入对象的方法非常简单, 只要首先将鼠
标在控件工具框移动到所需要的控件, 并单击鼠标
主按钮, 然后到表单的相应位置拖放出一个图形,
就在表单中加入了一个继承了所选控件的全部属性
和方法程序的对象 。
Visual FoxPro
6
(2)
如果所需要的控件不在当前表单控件工具栏中, 就
要重新指定工具栏对应, 类库, 文件, 可以按下列
步骤选定所需要的类库文件 。
① 用鼠标指向表单控件工具栏中, 查看类, 的命令按
钮, 单击鼠标主按钮, 选择, 添加,, 在, 打开,
对话框中选择所需要的类文件 。
② 在上述第 ① 步中选择, 常用, 可以恢复标准控件
( 基类 ) 。
Visual FoxPro
7
(3)
常用控件就是 Visual FoxPro 为开发者提供的基类,
下面对这些控件进行一些介绍, 在 11.3节中还会对
标签控件 ( Label), 不能绑定数据, 只能起提示作
用 。
命令按钮 ( Command Button), 在应用系统中, 命
令按钮是交互的主要工具, 人们通过按钮向应用系
统发布操作命令, 按钮通过执行其方法程序响应人
们的命令 。
命令组 (CommandGroup),关于命令的容器,
选项按钮组 ( OptionGroup),选项按钮即一般所称的
单选按钮, 是构成交互式界面的有力工具 。
Visual FoxPro
8
文本框 ( TextBox),文本框是一种基本控件, 它可以
捆绑关系数据表的一个非备注型字段数据, 从而实
现通过文本框对象对数据表的字段增加和修改的目
的 。
编辑框 ( EditBox),编辑框可以绑定一个关系表中的
备注型字段数据 。
组合框 ( ComboBox),组合框兼有列表框和文本框的
功能 。 它有下拉组合框和下拉列表框两种形式 。 组
合框可以绑定数据表中的一个或多个字段 。
列表框 ( ListBox),与组合框类似 。
Visual FoxPro
9
复选框 ( CheckBox),复选框也是构成交互式操作界
面的有力工具 。 复选和选项按钮的的差别是:服选
按钮可以兼选, 而选项按钮只能单选 。
微调按钮 ( Spinner),用户可以使用微调按钮对对其
所绑定的整数型字段数据进行维护 。
表格 ( Grid),表单中一种功能强大的控件 。 可以绑定
指定的数据表, 从而实现通过表格对象对数据表的
进行维护的目的 。
计时器 ( Timer),可以定时执行某种操作 。
页框 (Page Frame):是一个容器控件, 可以构建含有
,选项卡, 的界面 。
Visual FoxPro
10
3.表单中的对象设计
(1)
① 把对象的, 父类, 加入到表单控件工具栏, 如果对
象的父类已在当前的表单工具栏中就省略这个步骤,
这个步骤的操作过程已在前面讲过, 此处从略 。
② 从表单控件工具栏中选定所需要的控件, 并将其派
生对象加入到表单中 。 加入表单后该对象将继承所
选择控件的全部特征, 名称以对象所属的, 基类,
( 不是, 父类, ) 名加上数字编号组成, 对象名称
可以重新设定 。 这一部分工作也已经讲述过, 不再
重复 。
Visual FoxPro
11
(2)
把鼠标移到要删除的对象上, 单击辅按钮, 选择
,剪切,, 即可删除这个对象 。 注意, 如果是由一
个容器控件 ( 如自定义的命令组子类 ) 派生而成的
一个容器对象, 则不能删除该容器对象中的某成员
对象, 只能删除容器整体 。
(3)
将鼠标移到要设置属性的对象上, 单击辅按钮, 选
择, 属性,, 就进入属性设置窗口, 后面的操作和
第十章中介绍的设置, 类, 的属性的方法完全相同 。
(4)
将鼠标移到要添加代码的对象上, 单击辅按钮, 选
择, 代码,, 出现代码设计窗口, 选择要设计代码
的事件, 然后在代码框中编写代码 。
Visual FoxPro
12
表单中对象的属性设置
Visual FoxPro
13
4.表单设计的基本步骤
( 1) 进行规划, 最好画一张草图, 在上面标出各对
象的位置, 标题, 所属父类, 对象的大致作用, 表
单中要使用的表, 表间的对应关系以及对象间的相
互协调与支持 。
( 2) 打开表单设计器窗口 。
( 3) 如果表单要使用到表, 需要首先为表单建立
,数据环境, 。 数据环境也是 Visual FoxPro 中的一
种对象 ( 不可视 ) 。
Visual FoxPro
14
建立数据环境的步骤是:
① 将鼠标移到表单的任一空白位置 ( 不能指向任何对
象 ), 单击辅按钮, 选择, 数据环境, 。
② 选择与表单对应的数据表, 单击, 添加, 按钮, 选
中的数据表会加入到数据环境设计器中 。 如果要加
入多个表, 应重复这一过程, 然后单击, 关闭, 按
钮退出数据表的加入操作 。
③ 在数据环境设计器中建立表间的关联关系 。
Visual FoxPro
15
(4) 在表单中加入其他对象并进行布局排列, 一般表
单的标题要放在整个表单的上方, 命令按钮放在下
面后右侧, 文本框对象要与其对应的标签对象放在
一起 。 布局的目的是为了美观, 清晰 。 表单中的对
象是可以用鼠标直接拖动的 。
(5) 建立对象与表的对应关系 。 可以与表字段进行联
系的对象有:表格 ( Grid), 文本框 ( TextBox),
编辑框 ( EditBox), 列表框 ( ListBox) 等等 。
Visual FoxPro
16
建立这类对象与数据表字段的关联的方法是:
① 文本框, 编辑框,
对于这些非容器类的对象, 设定其与数据表对应字段
的关联时, 只需要将其 ControlSource 属性设置为
数据表的对应字段名即可 。 在表单中加入了数据环
境对象后, 这些字段的 ControlSource 属性对应一
个下拉列表框, 从列表项选择一个字段与对象关联 。
②
表格是一种容器对象, 其成员对象是列, 默认的对象
名是 Column1,Column2 等, 而列也是一个容器对
象, 起成员对象是 Header和 Text。
Visual FoxPro
17
11.1.2 用表单向导建立表单
Visual FoxPro 中有两个个表单向导, 各种向导所建立
( 1) 表单向导:整个表单针对一个数据表进行诸如
查询, 修改, 插入, 删除等操作;
( 2) 一对多表单向导:整个表单针对两个数据表,
而且这两个数据表间存在一对多的关系 。
Visual FoxPro
18
11.1.3 表单的运行
有 3
(1) 直接使用命令 。 在命令窗口,
DO FORM <表单名 >
如果表单没有在当前目录中, 并且没有用 SET
PATH命令设定搜索路径, 则需要在表单名前冠上
目录路径 。
(2) 在表单设计器窗口, 选择, 表单, 菜单中的, 运
行, 命令, 或直接单击工具栏中的红色惊叹号 。
(3) 在项目管理器中, 选中, 文档, 选项卡并指定要
运行的表单, 单击, 运行, 按钮 。
Visual FoxPro
19
11.2.1 表单的属性
表单作为一个对象, 当然也和其他对象一样具
有属性, 可以识别的事件以及事件响应程序 。 可以
在实验中调整这些参数并观察表单发生的变化, 从
而理解这些属性的意义 。
11.2 表单的操作
Visual FoxPro
20
11.2.2 表单的事件与方法
表单可以响应 40多个事件和方法, 下面对这几
个常用事件和方法做一些说明:
1.Init 事件,创建表单时触发该事件, 从而执行为该
事件编写的代码 。 Init代码通常用来完成一些关于
表单的初始化工作 。
2.Destory事件,释放表单时触发该事件, 该方法代码
通常用来进行文件关闭, 释放内存变量等工作 。
3.Click事件,用氧标单击对象对触发该事件, 从而执
行为该事件编写的代码 。
Visual FoxPro
21
4.Show 和 Hide 是一对方法, Show 使表单可见,
而 Hide则是隐藏表单 。 注意, 如果使用 Show( )
格式调用该方法, 则只是显示一次表单, 要希
望表单显示并停留在屏幕上, 应该使用 Show
( 1) 格式调用该方法 。 另外, Hide方法只是
在屏幕上隐藏表单, 并没有从内存中释放表单,
隐藏后的表单依然可以通过调用 Show方法恢复
显示 。
Visual FoxPro
22
5.Release 方法从内存中释放表单。注意 Release
方法与 Destory 的区别,Destory 方法是由表
单释放事件而触发的方法,而 Release 方法则
是主动释放表单,可以说 Release是 Destory 的
触发器,由于 Release 方法的实行而导致表单
的释放,从而引发表单释放事件,并因此触发
Destory 方法的运行。
Visual FoxPro
23
6.Refresh 方法刷新表单数据 。 当表单中各种对象所对
应的数据发生改变时, 有时并不自动的反映在表单
界面上, 需要使用 Refresh 刷新, 才能显示最新数
据 。 如用一个文本框关联一个数据表字段, 当数据
表记录指针移动后, 新记录对应的数据需要刷新后
才能更新 。
Visual FoxPro
24
11.2.3 数据环境
每一个使用了数据表的表单都包括一个数据环境 。 数
据环境是一个容器对象, 它用来定义与表单相联系
的数据实体 ( 表, 视图 ) 的信息及其相互联系 。 数
据环境容器一般包含一到多个 Cursor类对象, 表单
中所含 Cursor类对象的个数与表单关联的数据实体
( 数据表, 视图 ) 的个数相同, 一个 Cursor类对象
与一个数据实体 ( 数据表, 视图 ) 对应, 如果一个
表单关联多个数据表, 在数据环境容器中还有一个
Relation类对象描述这些表之间的关系, 下面对数
据环境容器及其可能包含的对象分别进行说明 。
Visual FoxPro
25
1,游标 ( Cursor) 类对象
当存储在磁盘上的一个数据表文件被打开时, 系统会
在内存中建立一个该表的临时文件, 内存中的临时
文件实际上是磁盘文件的一个映象, 所有数据库的
操作修改命令都是针对这个映象进行的, 当发布数
据更新 TableUpdate( ) 命令或关闭数据文件的命
令后, 系统再把这个映象文件存入磁盘, 从而完成
对磁盘文件的修改 。 Cursor 类对象也称为游标对象,
它用来定义临时表的相关信息 。
Visual FoxPro
26
2.关系 ( Relation) 类对象
如果表单所关联的数据表多于一个, 数据环境容器中
有一个对象 Relation 用来定义这几个表 ( 视图 ) 间
的关系 。
3.数据环境 ( DataEnvirinment) 容器
数据环境是包括了 Cursor和 Relation 两类对象的一个
容器, 该容器和其所含对象一起定义了表单中的数
据源 。
Visual FoxPro
27
4.数据环境设计器
可以使用完全的编程方式建立数据环境, 但大多数
情况下都是用数据环境设计器来建立表单的数据环
境 。 第一节已经初步说明了数据环境设计器的用法,
下面通过一个例子再做进一步的说明 。
例 建立一个学生选课表单 。 表单中有 3个对象, 标签
对象显示这个表单的标题:, 学生选课情况查询,,
左侧的列表框对象中从, 学生, 表中选择学生的名
字, 右侧的表格对象显示被选中的学生的选课情况,
当重新选择一个学生时, 表格中的数据会自动变化 。
Visual FoxPro
28
学生选课表单
Visual FoxPro
29
(1)打开表单设计器窗口 。
(2)为空白表单加入第一个对象:数据环境 。
① 在表单空白处, 单击鼠标辅按钮, 选择, 数据环
境,, 出现一个数据环境设计器 。
② 在数据环境设计器中, 单击鼠标辅按钮, 选择, 添
加, ( 见图 11.16), 首先选择父表, 学生,, 单击
,添加,, 然后选择子表, 选课,, 单击, 添加,,
单击, 关闭,, 退出数据表添加过程, 按 Ctrl+W,
退出表单设计过程 。 数据环境设计器会自动修改其
Cursor和 Relation属性 。
(3)退出数据环境设置后, 为表单加入一个文本框对象,
一个列表框对象, 一个表格对象, 并用鼠标对 3个
对象进行大致布局 。
Visual FoxPro
30
图 11.16 数据环境设计器
Visual FoxPro
31
(4)使用生成器设置列表框和表格对象的属性, 前面已
经说明过表格生成器的用法, 下面只简要说明一下
列表框生成器的用法 。
把鼠标移到列表框对象上, 单击辅按钮, 选择, 生
成器,, 在生成器中选择对象所关联的字段, 然后
单击, 确定, 。
(5)直接修改标签对象的 Caption属性:, 学生选课情
况查询,, FontSize,22,ForeColor,0,0,255。
保持表单 。
本例中数据环境对象, 列表框对象及表格对象的属
性都是借助于生成器这种辅助工具完成的, 实际开
发过程中, 设计人员也往往是尽量采用生成器, 只
有生成器不能实现的功能才手工设置, 这样能有效
地减少错误, 提高工作效率 。
Visual FoxPro
32
11.2.4 表单对象的布局
前面已经讨论了为表单加入对象, 在表单中删除对
象, 为对象加入事件与方法代码以及对象属性的设
置等表单对象的操作问题 。 表单设计中还有一个问
题就是表单对象的布局:包括对象的大小, 对象的
位置设计 。 Visual FoxPro 还提供了一个, 表单布局
工具栏, ( 可以在 Visual FoxPro 菜单栏中, 选择
,显示, 中的, 工具栏, 再选择, 布局, 调出 ) 。
选定表单中的某个对象后 ( 即用鼠标单击某个对象,
被选中的对象边框和其他对象不同 ), 可以使用布
局工具栏中的相应按钮让其
Visual FoxPro
33
“水平居中”、“垂直居中”等操作;当同时选择
一个以上的对象时(选中一个对象后,把鼠标移到
其他对象,并按住 Shift键并单击某个对象)也可进
行同样的操作。还可以使用表单布局工具栏使所有
被选中的对象执行“左对齐”、“右对齐”、“顶
边对齐”、“底边对齐”、“相同高度”、“相同
宽度”、“相同大小”等操作。当鼠标移到工具栏
中的某个图标上时,会出现图标的名字,单击鼠标
主按钮,就会对选定对象执行某个操作,读者可以
自行逐个实验一次,以掌握该工具的用法。
Visual FoxPro
34
11.3.1 命令按钮控件
命令按钮是最简单也是最常见的一种控件, 由其派
生的命令按钮对象在表单中随处可见 。
11.3.2 命令按钮组控件
可以将命令按钮组成一组, 对组中的按钮即可单独
操作, 也可作为一个组来统一操作 。 设计者可以为
组中的每个按钮单独设计事件代码, 也可以为整个
按钮组设计一个事件代码, 当一个事件 ( 如 Click)
在组中的某个按钮上发生时, 命令按钮组的 Value
属性指明该事件发生在哪个按钮 。
11.3 常用表单控件
Visual FoxPro
35
11.3.3 文本框控件
文本框是用来在应用系统与用户之间进行数据交互的
一种常用工具, 它允许用户添加或编辑保存在表中
非备注字段中的数据 。
11.3.4 编辑框控件
编辑框也是用来输入用户的数据的 。 在编辑框中允许
用户编辑长字段或备注字段文本, 允许自动换行并
能用方向键, PageUp 和 PageDown 键以及滚动条
来浏览文本 。
11.3.5 复选框控件
复选框可以用来表示某些状态是否成立, 其值是一个
逻辑量 。 复选框也是一种经常使用的控件 。
Visual FoxPro
36
11.3.6 组合框控件
组合框兼有列表框和文本框的功能 。 有两种形式的组
合框, 即下拉组合框和下拉列表框, 通过更改控件
的 Style 属性可选择想要的形式 。
11.3.7 单选按钮控件
单选按钮组是包含单选按钮的容器 。 通常, 单选按钮
允组用来由用户指定对话框中几个操作选项中的一
个 。
11.3.8 微调控件
使用微调控件可以让用户通过, 微调, 尖头来选择所
需要的数据, 直接在微调框中直接键入所需要的数
Visual FoxPro
37
11.3.9 标签控件
标签通常被用做提示或标题 。 标签和文本框的不同之
处在于标签没有数据源, 不能编辑, 运行时不能被
选中 。
在程序中可以改变标签的 Caption 和 Visible 属性, 使
标签根据不同的状态显示不同的内容 。
11.3.10 列表框控件
列表框和下拉列表框 ( 即 Style 属性为 2 的组合框控
件 — 下拉列表 ) 为用户提供了包含一些选项和信
息的可滚动列表 。 列表框中, 任何时候都能看到多
个项;而在下拉列表中, 只能看到一个项, 用户可
单击向下按钮来显示可滚动的下拉列表框 。
Visual FoxPro
38
11.3.11 表格控件
在前面已经说明过, 表格是一种容器对象, 它包含了
若干个列, 而列由包含标头和文本 。
表格对象能在表单或页面中显示并操作 ( 编辑修改 )
表格中行和列中的数据 。 设计者常使用表格对象来
创建一对多表单, 例如学生选课情况查询表单 。
11.3.12 计时器控件
计时器控件与用户的操作独立 。 它只对时间作出反应,
以一定的间隔重复地执行某种操作 。
Visual FoxPro
39
注意, 计时器的 Enabled 属性和其他对象的 Enabled
属性不同 。 对大多数对象来说, Enabled 属性决定
对象是否能对用户引起的事件作出反应 。 对计时器
控件来说, 将 Enabled 属性设置为, 假, (.F.),会
挂起计时器的运行 。
当一个计时器的时间间隔 ( 由 Interval属性值规定 )
过去后, Visual FoxPro 将产生一个 Timer 事件 。
Visual FoxPro
40
例 设计一个电子钟, 要求不直接使用 TIME()
一个电子钟至少需要两个对象, 一个时钟信号发生器
和一个显示器, 可以使用一个文本框作为显示器,
而用计时器作为时钟信号发生器 。
1.建立一个新表单, 并在表单中加入一个文本框对象
和一个计时器对象 。
2.在表单的 Load
PUBLIC rh,rm,rs && 分别存放时间的时, 分,
3.将文本框的 FontSize 属性设置为 18,并在其 Init事件
This.Value=time() &&文本框建立时初始化为系统时间
4.将计时器的 Interval 属性设置为 1000,并为其设计
Timer事件代码 。
Visual FoxPro
41
时钟程序的运行
点击查看程序请
Visual FoxPro
42
11.3.13 页框控件
页框 是, 页面, 的一种容器, 而, 页面, 也是一
种容器, 可以放置任何控件, 容器和自定义对象, 一
个页面在运行时对应一个屏幕窗口 。
表单 的一个窗口幅面有限, 如果在一个应用中要
涉及到的对象很多, 在一个窗口不好布局时, 可以把
整个表单中的对象按联系的紧密程度进一步划分为小
的模块, 把一个模块中的对象在一个页面中进行布局,
这样, 整个窗口就显得简要, 清晰, 也不至于因为一
个窗口放置的对象太多而弄得眼花缭乱, 找不到所需
要的信息 。 页框就正是为了这样的目的而设计的一种
容器类, 是 Visual FoxPro 的一个基类 。 页框建立在
表单上, 页面建立在页框上, 经过页框的处理后, 一
个表单中的全部对象就分布到了多个窗口 。
Visual FoxPro
43
11.4.1 系统登录表单
每个应用系统都有自己的用户群, 在进入一个应用
系统前, 常有一个登录过程, 目的就是验明使用者
的身份, 防止未授权用户进入系统, 从而保证系统
安全 。 在登录界面的文本框输入登录者姓名, 下面
的文本框输入编号, 为保密, 这里输入的字符均显
示为星号 ( *) 。
11.4 表单的应用
Visual FoxPro
44
登陆表单示例
Visual FoxPro
45
1.与登录过程相关的数据表
登录过程实际上是对用户所输入的信息进行验证的过
程, 验证方法一般是在一个用户信息数据表中检索
用户输入的数据, 若检索到, 则容许用户登录, 否
则, 拒绝用户登录 。 为减少数据的描述过程, 这里
借用前面多次应用的, 教师, 表进行登录检查, 以
教师编号作为密码, 即假设系统只容许在, 教师,
表中注册过的教师才能登录, 登录时要输入自己的
姓名与教师编号 。
Visual FoxPro
46
2.表单各对象的属性设置
登录表单中共有 3个标签对象, 两个文本框对象和一
个命令按钮, 设置各对象的属性 。
3.数据环境设计
为表单中加入一个数据环境, 并在该环境中加入, 教
师, 数据表, 数据环境其他属性保持默认属性 。
Visual FoxPro
47
4.命令按钮代码
命令按钮中的 Click
SELECT
(ThisForm.DataEnvironment.Cursor1.Alias)
LOCATE FOR 姓名 =ThisForm.Text1.Value AND 教
师号 =ThisForm.Text2.Value JP
IF FOUND() THEN
=MessageBox(′祝贺你登录成功 ! ′)
ELSE
=MessageBox(′姓名或教师号不正确, 你可能还没
有注册 ′)
ENDIF
RETURN
Visual FoxPro
48
11.4.2 数据编辑表单
编辑 ( 修改, 插入, 删除 ) 数据表中的数据是表单的
一个重要应用方面 。 在教师数据表的编辑表单, 在
该表单中, 可以加入和修改教师数据, 也可以对应
每个教师修改其授课的情况 。
对于这样两个有一对多关系的表的操作问题, 表单向
导中的, 建立一对多表单, 就能给出较好的解决结
果, 这里就用向导来实现这个表单 。 本章第一节已
经详细的讲述了一对多表单向导的用法, 这里不再
详细讲述表单的实现过程 。 只要注意把, 教师, 选
为父表,, 授课, 选为子表, 并且将表单标题 ( 即
表单的 Caption属性 ) 设置为, 教师授课数据录入,,
其他均保持向导程序的默认设置 。
Visual FoxPro
49
数据编辑表单示例
Visual FoxPro
50
11.4.3 数据查询表单
数据查询表单与数据修改表单的差别不大,实际上,
很多时候把两种表单合并起来,在同一个表单中即
可实现数据的查询,也可进行数据的插入、删除、
修改等编辑工作。但是,把两种实现不同功能的表
单合而为一有两点不便:第一,用户可能只是希望
查询数据,但由于不小心而可能误改了数据,并且
无法还原(可能没有发现修改了数据,也可能没注
意数据的原来值),这将对数据的准确性造成很大
的潜在危险;第二,对一个系统的数据有查询权的
用户比有修改权的用户要多得多,为区分这两种不
同身份的用户的不同权限要求,一般需要把数据的
查询工具与修改工具进行分别设计,也就是要设计
两种不同的表单,在专门的数据查询表单中,不管
用户有意还是无意都无法修改数据。
Visual FoxPro
51
一个查询表单的运行界面