2010-5-20 Visual FoxPro 6.0程序设计 1
学习要点
1、表单的基本设计方法,单表表单和多表表
单在设计上的不同点,表单关系;
2、向表单中添加控件的方法;
3、常用控件的功能和使用方法;
4、常用控件所具有的事件;
5、方法程序的编写;
6、使用表单解决数据输入和输出问题。
第 7章 VFP6表单设计
2010-5-20 Visual FoxPro 6.0程序设计 2
第 7章 VFP6表单设计
7.1 设计表单
7.2 向表单中添加对象
7.3 处理对象
7.4 管理表单
小 结
返回 退出
7.5 控件使用要点和技巧
2010-5-20 Visual FoxPro 6.0程序设计 3
7.1 设计表单
7.1.1 设置数据环境
7.1.2 创建单文档和多文档界面
7.1.3用表单集扩充表单
返回 退出
2010-5-20 Visual FoxPro 6.0程序设计 4
7.1 设计表单
表单又称为界面或窗体,是 VFP提供的一种功能强大的界面。
各种对话框和窗口都是表单的不同表现形式。它可以使用户在
简单明了的界面中查看数据或将数据记录输入到表中。在表单
设计器中可以处理下列内容:
■表单中不同类型的对象
■与表单相关联的数据
■顶层表单或子表单
■能一起操作的多个表单
■基于自定义模板的表单
表单和表单集是拥有自己的属性、事件和方法程序的对象,在
表单设计器中可以设置这些属性、事件和方法程序。表单集包
含了一个或多个表单,可以将它们作为一个整体来操作。例如,
如果一个表单集中有四个表单,可以在运行时用一个命令来显
示或隐藏它们。
可以通过表单向导、表单设计器和快速表单来创建表单。可以
2010-5-20 Visual FoxPro 6.0程序设计 5
用如下的三种方法之一新建一个表单:
■在“项目管理器”中选定“表单”,并选择 【 新建 】 按钮。
■在 【 文件 】 菜单中选择 【 新建 】 命令,再选定“表单”,再选
择 【 新建文件 】 按钮。
■使用 CREATE FORM命令。
通过项目管理器创建表单示例
1、选择
“文档”
选项卡
2、选择
“表单”
3、单击
【 新建 】
4、进入新建表单
程序,弹出“新
建表单”对话框
单击
“表单设计器”
窗口
新表单 在新表单 (Form1)
上可以可视化地
添加控件并进行
属性、方法程序
设计。
2010-5-20 Visual FoxPro 6.0程序设计 6
7.1.1 设置数据环境
每一个表单或表单集都包括一个数据环境( Data Environment)。
数据环境是一个对象,它包含与表单相互作用的表或视图,以及
表单所要求的表之间的关系。可以在“数据环境设计器”中直观
地设置数据环境,并与表单一起保存。
在表单运行时,数据环境可以自动打开、关闭表或视图。而且,
通过设置“属性”窗口中 ControlSource(指定与对象对立联系的
数据源)属性设置框,在这个属性框中列出了数据环境中的所有
字段,数据环境将帮助设置控件用的 ControlSource属性。
1、常用数据环境属性
2010-5-20 Visual FoxPro 6.0程序设计 7
单击打开图片
2、向数据环境设计器中添加表或视图
向数据环境设计器中添加表或视图时,可以看到属于表或视图的
字段或索引。若要向数据环境中添加表或视图,可以按如下步骤
来进行:
( 1)打开“数据环境设计器”,从“数据环境”菜单中选择
“添加”1、在表单上右击,
弹出表单的快捷
菜单
2、在快捷菜单中
单击“数据环境”
菜单项,打开
“数据环境设计
器”3、添加表或视图
的方法与建立查
询时添加表或视
图相同
4、在此框
中选择
Student后
单击 【 添
加 】
2010-5-20 Visual FoxPro 6.0程序设计 8
在关闭了“添加表或视图”对话框后,若还想向“数据环境”
中添加表或视图,可采用以下方法之一:
■在“数据环境设计器”中右击,打开数据环境的快捷菜单,
从中选择“添加”菜单项,将“添加表或视图”对话框再次打
开,添加方法与上述相同。
■ 在“数据不境设计器”处于激活状态时,系统菜单上会有
【 数据环境 】 菜单,可以单击 【 数据环境 】 |【 添加 】 将“添加
表或视图”对话框再次打开。
■将要添加的表或视图从打开的项目或“数据库设计器”拖
放到“数据环境设计器”中。
若已将“数据环境设计器”关闭了,要添加表或视图时,除
了用前文所介绍的在表单上右击打开表单的快捷菜单,用快捷
菜单操作以外,也可以在系统菜单上单击 【 显示 】 |【 数据环
境 】,将“数据环境设计器”打开,打开了“数据环境设计器”
后的添加方法与上相同。
当, 数据环境设计器, 处于活动状态时,, 属性, 窗口会显示
与数
2010-5-20 Visual FoxPro 6.0程序设计 9
单击打开动画
据环境相关的对象及属性。在“属性”窗口的“对象”框中,数
据环境的每个表或视图,表之间的每个关系,以及数据环境本身
均是各自独立的对象。
要打开“属
性”窗口,
可以在表单
或“数据环
境设计器”
中右击,在
快捷菜单上
选择 【 属性 】
菜单项
在“数据
环境设计
器”中右
击,打开
快捷菜单。 单击 【 属性 】
菜单项打开
“属性”窗
口。
选项卡
属性或方法
程序列表
属性值或
方法程序
属性及方
法程序功
能说明
单击
对象选择框
2010-5-20 Visual FoxPro 6.0程序设计 10
3、从数据环境设计器中移去表
当将表从数据环境中移去时,与这个表有关的所有的关系也随之
移去。若要将表和视图从数据环境设计器中移去,可以:
( 1)在“数据环境设计器”中选择要移去的表或视图。
( 2)在“数据环境”快捷菜单中选择 【 移去 】 命令。
在“数据
环境设计
器”中选
择要移去
的表或视
图。
在选定表或视
图上右击,打
开快捷菜单。
单击 【 移去 】
2010-5-20 Visual FoxPro 6.0程序设计 11
4、在数据环境设计器中设置关系
如果添加进数据环境设计器的表具有在数据库中设置的永久关系,
这些关系将自动地加到数据环境中。如果表中没有永久的关系,
可以在数据环境设计器中设置这些关系。
要在数据环境设计
器中设置这些关系,
可以将字段从主表
拖到相关表中的相
匹配的索引标识上。
也可以将字段从主
表拖到相关表中的
字段上。如果和主
表中的字段对应的
相关表中没有索引
标识,系统将提示
是否创建索引标识。
1、先向表单的“数据环境设计器”添加两个表,
如图按“学号”字段设置 Student表与 Grade表的一对多关系:
在“数据环境设计器”中的 Student表中选择“学号”字段
并将其拖到 Grade表的“学号”字段上。
右击表间的关系连接线打开快捷菜单
2010-5-20 Visual FoxPro 6.0程序设计 12
在快捷菜单中单击“属性”,打开属性窗口:
在属性选择列表中选择 OneToMany
单击“属性选择框”弹出属性值
选择,T.-真
表达式生
成器按钮
取消按钮
确定按钮
属性选择

将两表设
置为一对
多关系
父表别名
如果在建立关系前 Grade表没有按关
联字段(学号)建立索引,则在将
“学号”从 Student表中拖到 Grade表
时将弹出对话框:
单击 【 确定 】 时系统将先按“学号”
为 Grade表建立索引,然后才建立
两表间的关系。
2010-5-20 Visual FoxPro 6.0程序设计 13
5、在数据环境设计器中编辑关系
在数据环境设计器中设置了一个关系后,在表之间将有一条连线指出这个
关系。
若要编辑关系的属性, 可在, 属性, 窗口中从属性列表框选择要编辑的关系 。
关系的属性对应于 SET RELATION和 SET SKIP命令中的子句和关键字 。
RelationalExpr( 指定基于父表中的字段而又与子表中的索引相关的表达式 )
属性的默认设置为主表中主关键字字段的名称 。 如果相关表是以表达式作为
索引的, 就必须将 RelationalExpr属性设置为这个表达式 。 例如, 如果相关表
以 UPPER( cust_id) 作为索引, 就必须将 RelationalExpr属性设置为 UPPER
( cust_id) 。
如果关系不是一对多关系, 必须将 OneTOMany属性 ( 指定是否只有在子表中
遍历了所有相关记录之后才移动父表记录的记录指针 ) 设置为, 假, (,F.) 。
这对应于使用 SET RELATION命令时不发出 SET SKIP命令 。
将关系的 OneToMany属性设置为, 真, (,T.), 相当于发出 SET SKIP命令 。
当浏览父表时, 在记录指针浏览完子表中所有的相关记录之前, 记录指针一
直停留在同一父记录上 。
注意,如果在表单或表单集中想设置一对多关系,必须将 OneToMany属性
设置为“真”(,T.),甚至在数据库中已经建立了永久一对多关系时也必须
如此。
返回
2010-5-20 Visual FoxPro 6.0程序设计 14
7.1.2 创建单文档和多文档界面
VFP允许创建两种类型的应用程序:
■多文档界面( MDI)各个应用程序由单一的主窗口组成,且应
用程序的窗口包含在主 窗口中或浮动在主窗口顶端。 VFP基
本上是一个 MDI应用程序,带有包含于 VFP主窗口中的命令窗口、
编辑窗口和设计器窗口。
■单文档界面( SDI)应用程序由一个或多个独立窗口组成,这
些窗口均在 Windows桌面上单独显示。 Microsoft Exchange即是一
个 SDI应用程序的例子,在该软件中打开的每条消息均显示在自
己独立的窗口中。
由单个窗口组成的应用程序通常是一个 SDI应用程序,但也有一
些应用程序综合了 SDI和 MDI的特性。例如,VFP将调试器显示
为一个 SDI应用程序,而它本身又包含了自己的 MDI窗口。
为了支持这两种类型的界面,VFP允许创建以下几种类型的表单:
■子表单:包含在另一个窗口中,用于创建 MDI应用程序的表
2010-5-20 Visual FoxPro 6.0程序设计 15
表单。子表单不可移至父表单(主表单)边界之外,当其最小化
时将显示在父表单的底部。若父表单最小化,则子表单也一同最
小化。
■浮动表单:属于父表单(主表单)的一部分,但并不是包含在
父表单中。而且,浮动表单可以被移至屏幕的任何位置,但不能
在父窗口后台移动。若将浮动表单最小化时,它将显示在桌面的
底部。若父表单最小化,则浮动表单也一同最小化。浮动表单也
可用于创建 MDI应用程序。
■顶层表单:没有父表单的独立表单,用于创建一个 SDI应用程
序,或用作 MDI应用程序中其他子表单的父表单。顶层表单与其
他 Windows应用程序同级,可出现在其前台或后台,并且显示在
Windows任务栏中。
1,指定表单类型
创建各种类型表单的方法大体相同,但需设置特定属性以指出表
单应该如何工作。如果创建的是子表单,则不仅需要指定它应在
另外一个表单中显示,而且还需指定是否是 MDI类的子表单,
2010-5-20 Visual FoxPro 6.0程序设计 16
即指出表单最大化时是如何工作的。如果子表单是 MDI类的,它
会包含在父表单中,并共享父表单的标题栏、标题、菜单以及工
具栏。非 MDI类的子表单最大化时将占据父表单的全部用户区域,
但仍保留它本身的标题和标题栏。
若要建立一个子表单,可以:
■用“表单设计器”创建或编辑表单。
■可将表单的 ShowWindow属性设置为
下列值之一:
● 0-在屏幕中:子表单的父表单将为
VFP的主窗口。
● 1-在顶层表单中。当子窗口显示时,
子表单的父表单是活动的顶层表单。
如果希望子窗口出现在顶层表单窗口
内,而不是出现在 VFP主窗口内时。
可选用该项设置。
2010-5-20 Visual FoxPro 6.0程序设计 17
■ 如果希望子表单最大化时与父表单组合成一体,可设置表单的
MDIForm属性(指定表单是否为 MDI窗口)为“真” (.T.);如果
希望子表单最大化时仍保留为一独立的窗口,可设置表单的
MDIForm属性为“假” (.F.)。
浮动表单是由子表单变化而来。若要指定为浮动表单,可以:
■用“表单设计器”创建或编辑表单。
■可将表单的 ShowWindow属性设置为以下值之一:
● 0-在屏幕中。浮动表单的父表单将出现在 VFP主窗口。
● 1-在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是
活动的顶层表 单。
■将表单的 DeskTop属性(指定表单是否包含在 VFP主窗口中)
设置为“真” (.T.)。
若要指定顶层表单,可以:
■用“表单设计器”创建或编辑表单。
■将表单的 ShowWindow属性设置为,2-作为顶层表单”。
2010-5-20 Visual FoxPro 6.0程序设计 18
2、显示位于顶层表单中的子表单
如果所创建的子表单中的 ShowWindow属性设置为,1-在顶层表
单中”,则不需直接指定一顶层表单作为子表单的父表单。而是
在子窗口出现时,VFP指派成为该子表单的父表单。
若要显示位于顶层表单中的子表单,可以:
■创建顶层表单。
■在顶层表单的事件代码中包含 DO FORM命令,指定要显示的
子表单的名称。例如,在顶层表单中建立一个按钮,然后在按钮
的 Click事件代码中包含如下的命令,如图所示:
注意,在显示子表单时,顶
层表单必须是可视的、活动的。
因此,不能使用顶层表单的
Init事件来显示子表单,因为
此时顶层表单还未激活。
■激活顶层表单,如有必
要,触发用以显示表单的
事件。
2010-5-20 Visual FoxPro 6.0程序设计 19
3、隐藏 VFP主窗口
在运行顶层表单时,可能不希望 VFP主窗口是可视的。使用应用
程序对象的 Visible属性(指定对象是可见还是隐藏)按要求隐藏
或显示 VFP主窗口。
若要隐藏 VFP主窗口,可以:
■在表单的 Init事件中,包含下列代码行:
Appliction.Visible=.F.
■ 在表单的 Destroy事件中,包含下列代码行:
Appliction.Visible=.T.
在某些方法程序或事件中,可使用 THISFORM.Release命令关闭表
单。
注意:也可以在配置文件中包含以下行,用以隐藏 VFP主窗口:
SCREEN=OFF
4,在顶层表单中添加菜单
若要在顶层表单中添加菜单, 可以:
■ 创建顶层表单的菜单 。
返回
2010-5-20 Visual FoxPro 6.0程序设计 20
■ 将表单的 ShowWindow属性设置为,2-作为顶层表单”。
■在表单的 Init事件中,运行菜单程序并传递两个参数:
Do menuname.mpr WITH oForm,LAutoRename
其中,oForm是表单的对象引用。在表单的 Init事件中,THIS作
为第一个参数进行传递。 LAutoRename指定了是否为菜单取一
个新的唯一的名字。如果计划运行表单的多个实例,则将,T.传递
给 LAutoRename。
例如,可以使用下列代码调用名为 mySDImenu的菜单:
DO mySDImenu.mpr WITH THIS,.T.
7.1.3用表单集扩充表单
可以将多个表单包含在一个表单集中,作为一组处理。表单集有
以下优点:
■可同时显示或隐藏表单集中的全部表单。
■可以可视的调整多个表单以控制它们的相对位置。
■因为表单集中所有表单都是在单个,SCX文件中用单独的数据
2010-5-20 Visual FoxPro 6.0程序设计 21
环境定义的,可自动地同步改变多个表单中的记录指针。如果在
一个表单的父表中改变记录指针,另一个表单中子表的记录指针
则被更新和显示。
注意:运行表单集时,将加载表单集所有表单和表单的所有对象。
加载带着很多控件的多个表单会花几秒钟的时间。
1,创建表单集
表单集是一个包含有一个或多个表单的父层次的容器 。 可在, 表
单设计器, 中创建表单集, 若要创建表单集, 可从, 表单, 菜单
中, 选择, 创建表单集, 选项 。
如果不需要将多个表单处理为表单组, 则不必创建表单集 。 创建
表单集以后, 则可向其中添加表单 。
2,添加和删除表单
创建了表单集以后, 可添加新表单或删除表单 。 若要向表单集中
添加附加的表单, 可从, 表单, 菜单中选择, 添加新表单, 。
若要从表单集中删除表单, 可以:
■ 在, 表单设计器,,属性, 窗口的对象列表框中, 选择要删除

2010-5-20 Visual FoxPro 6.0程序设计 22
表单。
■从“表单”菜单中选择“移除表单”。
如果表单集中只有一个表单,可删除表单集而只剩下表单。若要
删除表单集,可从“表单”菜单中选择“移除表单集”。
表单以表的格式存储在,SCX后缀的文件中。创建表单时,.SCX表
包含了一个表单的记录,一个数据环境的记录,和两个内部使用
记录。为每个添加到表单或数据环境中的对象添加一个记录。如
果创建了表单集,则为表单集及每个新表单添加一个附加的记录。
每个表单的父容器为表单集,每个控件的父容器为其所在的表单。
注意:当运行表单时,若不想在表单集中的所有表单的初始时就
设置为可视的,可以在表单集运行时,将不准备显示的表单的
Visible属性设置为“假”(,F.)。要显示的表单的 Visib1e属性设
置为“真”(,T.)。
返回
2010-5-20 Visual FoxPro 6.0程序设计 23
7.2 向表单中添加对象
7.1.1 设置数据环境
返回 退出
7.2.2 向表单中添加 VFP控件
7.2.3 向表单中添加数据绑定型控件
7.2.4 向表单中添加用户自定义对象
7.2.5 确定表单中的控件数目
7.2.6在表单中添加属性和方法程序
7.2.7 包含预定义常量
2010-5-20 Visual FoxPro 6.0程序设计 24
7.2.1 向表单中添加 VFP容器
除表单集和表单外,VFP还提供了四个基本容器类:命令按钮组、
选项按钮组、表格和页框。
若要在表单中添加容器对象,可从“表单控件”工具栏上选择所
需的容器对象的按钮(表格、页框或按钮组),并在表单中拖动,
调整到所需要的大小。
文本框 选项按钮组 微调控件 页框 形状 生成器锁定
标签 命令按钮组 列表框 计时器 线条 超级连接
查看类 命令按钮 组合框 图象 ActiveX绑定控件 分隔符
选定对象 编辑框 复选框 表 格 ActiveX控件 容 器 命令锁
基本容器控件
2010-5-20 Visual FoxPro 6.0程序设计 25
在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两
个按钮。在表单中添加页框时,页框默认包含两个页面,将
ButtonCount属性(指定一个命令按钮组或选项按钮组中按钮的
数目)或 PageCount属性(指定页框对象中所含有的页数)设置
为需要的数目,可以包含更多的按钮或页面。
向表单中添加表格时,ColumnCount属性(指定表格、组合框或
列表框中列对象的数目)的默认值为- 1,表示处于 AutoFill状
态。这样,在运行时表格将显示与 RecordSource属性(指定与表
格控件建立联系的数据源)中指定的表具有同样字段数量的列。
如果不想处于,AutoFill”状态,可以设置表格的 ColumnCou-nt
属性为指定列的数目。
VFP中的所有容器对象都有与它们相关联的记数属性和收集属
性。收集属性是引用其每个被包含对象的数组,记数属性是指
示其包含的对象数的数值属性。
每个容器的收集和记数属性根据包含在容器中的对象类型来命
名,下表列出了容器及其相应的收集和记数属性。
2010-5-20 Visual FoxPro 6.0程序设计 26
【 例 7-1】 建立一个只含一个表格(列数由提供数据的表的字段
数确定)和一个命令按钮的表单,运行表单时,表格中显示的
内容底色红绿交替。
2010-5-20 Visual FoxPro 6.0程序设计 27
第 2步、单击表单控件工具栏上
的(表格)按钮;
第 1步、在项目
管理器中选择
“表单”,再
单击 【 新建 】
单击 【 新建表单 】
在系统菜单上
单击 【 显示 】 |
【 表单控件工
具栏 】
第 2步、单
击表单控件
工具栏上的
(表格)按
钮;
第 3步、在表单上按住鼠标左键拖出一个
矩形框,释放鼠标。
在表单上
单击右键,
选择 【 数
据环境 】
选择 Student表后单击 【 添加 】
单击 【 关闭 】 关闭
“数据
环境设
计器”
第 5步、选择表单
上的表格对象,
在“属性”对话
框中选择“数据”
选项卡,在属性区域选择RecordSource属性,
在属性值框中
选择 Student表
对象框中选择 Form1
选择“方法程序”
双击 Activate Evento=THISFORM.Grid1FOR I=1 TO o.ColumnCount
IF I%2=0
o.Columns(i).BackColor=RGB(0,255,0)
ELSE
o.Columns(i).BackColor=RGB(255,0,0)
ENDIF
ENDFOR
要实现此功能,可采取如下步骤:
第 1步、选择 【 文件 】 |【 新建 】 菜单,然后选择“表单”,再选择 【 新建文
件 】 或在项目管理器中选择“表单”,再单击 【 新建 】,再在对话框中选择
【 新建文件 】 ;
第 5步、选择表单上的表格对象,在“属性”对话框中选择“数据”选项卡,
在属性区域找到 RecordSource属性,在属性值输入文本框中选择,Student”表。
第 3步、在表单上按住鼠标左键
拖出一个矩形框,释放鼠标。
第 4步、在表单上单击右键,选
择 【 数据环境 】,在弹出的“数
据环境设计器”中单击右键,选
择 【 添加 】,再在弹出的“添加
表或视图”对话框中选择
,Student”再按 【 添加 】 按钮,
再按 【 关闭 】 按钮,然后关闭
“数据环境设计器”。
第 6步、选择表单,再选择“属性”上的“方法程序”选项卡,双击,Activate
Event”属性,在方法程序编辑框中输入代码。
2010-5-20 Visual FoxPro 6.0程序设计 28
第 7步、采用相似的方法建立一个命令按钮,将 Caption属性(指定对象文本
标题)值设置为“退出” 。
单击“命
令按钮”
按钮
在表单上单击,
添加“命令”按

关闭表单控
件工具栏
将 Caption属
性值设置为
“退出”
在此处更
改并输入
单击
注意:二处的
值被修改!
双击“退出”按钮输入事件代码
THISFORM.RELEASE 关闭“属性”窗口
和事件代码编辑窗
口并单击常用工具
栏上的运行按钮。
表单运行结果:
单击表单上的 【 退出 】 按钮可以将表单关闭。
返回
2010-5-20 Visual FoxPro 6.0程序设计 29
7.2.2 向表单中添加 VFP控件
控件工具栏能使用户很方便地在表单中添加任何一种标准的
VFP控件,常用的 VFP控件如下所示:
复选框 图像 OLE绑定型控件 文本框
组合框 标签 OLE容器控件 计时器
命令按钮 线条 形状
编辑框 列表框 微调
若要在表单中添加控件,可在“表单控件”工具栏中选择所需
的控件按钮 (单击 ),在表单中单击或拖动按钮,把它调整到想要
的大小。
如在上例中向表单添加了一个“表格”控件和一个“命令按钮”
控件。
返回
2010-5-20 Visual FoxPro 6.0程序设计 30
7.2.3 向表单中添加数据绑定型控件
通过给控件的 ControlSource属性设置字段或给表格的
RecordSource属性设置表或视图,可使控件与表、视图、表的
字段、或视图的字段中的数据相联系。但也可通过直接将表和
视图从下列位置拖到表单中,以创建数据绑定型控件:
■“项目管理器”
■“数据库设计器”
■“数据环境设计器”
“表设计器”中“属性”选项卡的,FieldMapping”设置或“选
项”对话框的,FieldMapping”选项卡的设置,是这种方法创建
控件类的基础。
上例中将表格的 RecordSource属性设置为 Student,即是将表格
的数据源与表 Student建立联系。
返回
2010-5-20 Visual FoxPro 6.0程序设计 31
7.2.4 向表单中添加用户自定义对象
VFP最强大的功能之一就是能创建在应用程序不同部分都可以使
用和重复使用的类。如果创建了类,就能将它们添加到表单中。
若要基于自定义类上添加对象,可在“项目管理器”中,将类拖
动到容器中,当给工具栏添加类时,也可直接从“表单控件”工
具栏中添加。
1、在控件工具栏上添加类库
类库必须在注册后才能在“表单控件”工具栏中显示出来。若要
注册类库,可以:
①从“工具”菜单中选择“选项”打开“选项”对话框。
②在“选项”对话框中选择“控件”选项卡。
③选择“添加”按钮。
④在“打开”对话框中,选择一个要加到“选定”列表中的类库,
并选择“打开”按钮。
⑤重复步骤③和④。
“选定”列表中列出了类库中的类,在“表单设计器”中可以和
2010-5-20 Visual FoxPro 6.0程序设计 32
VFP基类一样方便地使用这些类。
注意:如果要在每次运行 VFP时“表单控件”工具栏中的类库都
有效,可在“选项”对话框中,选择“设置为默认值”。
此外,也可以在“表单设计器”中直接注册类库。若要在表单设
计器中注册一个类库,可以:
①在“表单控件”工具栏中选择“查看类”按钮。
②从子菜单中选择“添加”。
③在“打开”对话框中选择要添加到“表单控件”工具栏上的类
库,然后选择“打开”按钮。
2,从类库中添加对象到表单
如果从, 选项, 对话框的, 类, 选项卡或从, 查看类, 子菜单添
加类库, 就能在, 表单设计器, 中访问它们 。
若要从, 表单控件, 工具栏添加自定义对象, 可以:
① 在, 表单控件, 工具栏中, 选择, 查看类, 按钮 。
② 从已注册类库的列表中选择一个类库, 它包含了要加到表单中
的控件 。
返回
2010-5-20 Visual FoxPro 6.0程序设计 33
③ 单击所需要的控件,并在表单中拖动到合适大小。
注意:如果想从“查看类”工具栏中移去一个可视类库,可以在
“选项”对话框的“控件”选项卡中,选择“选定”列表中列出
的一个可视的类库,然后选择“移去”按钮。
当向不是基于 VFP基类的表单添加对象时,类库的相对路径
(,vcx文件)存储在表单的,scx文件中。如果要将表单或类库移
到另一个位置,在运行表单时 VFP显示一个对话框,可以人工寻
找类库。
7.2.5 确定表单中的控件数目
使用 ControlCount属性可以确定表单中究竟有多少个控件,而
Controls[n]属性允许引用表单上的任何一个控件。下面的程序用
于打印出当前活动表单上所有控件的 Name属性:
ACTIVATE SCREEN &&将输出打印到 VFP主窗口
FOR nCnt=1 TO Application.ActiveForm.ControlCount
Application,ActiveForm.Controls[nCnt].Name
ENDFOR
上述程序中的 Application也可以用 _Screen替换。
返回
2010-5-20 Visual FoxPro 6.0程序设计 34
7.2.6在表单中添加属性和方法程序
可以添加许多个新的属性和方法程序到一个表单。属性拥有一个
值,方法程序具有调用它时被运行的过程代码。新建的属性和方
法程序与其它属性与方法程序的引用一样。
1、建立一个新属性
如果有一个表单集,则在“表单设计器”中添加的属性和方法程
序就属于此表单集。如果没有建立表单集,则属性和方法程序属
于表单。
若要向表单或表单集中添加新属性,可以:
①从“表单”菜单中选择“新建属性”( New Property)命令。
②在“新建属性”对话框中,键入属性名。还可以加入关于这个
属性的说明,它将显示在“属性”窗口的底部的属性描述中。
2、建立一个数组属性
一个数组属性可以像其他属性一样都属于表单或表单集,但不同
的是数组属性可用 VFP的数组命令和函数处理它。若要创建一个
数组属性,可以:
2010-5-20 Visual FoxPro 6.0程序设计 35
① 添加新属性到表单。
②在“新建属性”对话框的“属性名”框中键入数组属性称,并
包括数组的大小和维数。
例如,可在“新建属性”对话框的“名称”框中输入
myarray(10,5),去创建一个 10行 5列的二维数组,若要同时对该属
性加以说明,则还可以在下部的“说明”框中输入需要对该属性
进行说明的内容,如“自定义数组”等。当添加数组属性到表单
时,属性作为只读显示在属性窗口中。可以在运行时管理数组,
重新设置数组的维数,也可对数组属性的元素赋值。
3,创建新方法程序
也可向表单中添加方法程序, 并且可以用调用表单类方法程序的
方式调用它 。 若要在表单或表单集中创建一个新方法程序, 可以:
① 从, 表单, 菜单中选择, 新方法程序, 。
② 在, 新方法程序, 对话框中, 输入方法程序的名称 。 还可以包
含有关这个方法程序的
2010-5-20 Visual FoxPro 6.0程序设计 36
说明,这是可选的。调用用户自定义方法程序和调用基类方法程
序一样,都使用下面的语法:
ObjectName.MethodName
建立的方法程序同样可以接受参数并返回值,这种情况下,可以
使用赋值语句来调用方法程序:
cVariable= ObjectName.MethodName( cParameter,nParameter)
7.2.7 包含预定义常量
为了在方法程序中使用预定义常量,可在表单或表单集中用#
INCLUDE命令包含一个头文件。头文件一般包含由# DEFINE
预处理器伪指令定义的编译时的常数。
若要在表单中包含文件,可以:
①从“表单”菜单中选择“包含文件”。
②在“包含文件”对话框的“包含文件”文本框中指定文件,
或者选择对话框按钮以打开“包含”对话框并选定文件。
③选择“确定”。
返回
2010-5-20 Visual FoxPro 6.0程序设计 37
7.3 处理对象
7.3.1 在设计时设置属性
返回 退出
7.3.2 定义表单行为
7.3.3 编辑事件代码和方法程序代码
7.3.4 将表单和控件保存为类
7.3.5 运行表单
7.3.6 在运行时设置属性
2010-5-20 Visual FoxPro 6.0程序设计 38
7.3.1 在设计时设置属性
打开属性窗口会显示选定对象的属性或事件。如果选择了多个对
象,这些对象共有的属性将显示在“属性”窗口中。要编辑另一
个对象的属性或事件,可在“对象”框中选择这个对象,或者直
接从表单中选择这个控件。
若要设置属性,可首先在“属性”窗口中,从“属性和事件”列
表中选择一个属性。然后在“属性设置”框中,为选中的属性键
入或选择需要的设置。
注意:那些在设计时为只读的属性,例如对象的 Class属性,在属
性窗口的“属性和事件”列表框中以斜体显示。
如果属性要求输入字符值,不必用引号将这个值括起来。例如,
要将一个表单的标题设为 Student,只需在“属性设置”框中键入
Student;若想让表单的标题是,Student”,即想让引号也出现在
窗口的标题上,在“属性设置”框中键入,Student”。
通过属性窗口可以将属性设置为表达式或函数的结果。若要用表
达式设置属性,可以:
2010-5-20 Visual FoxPro 6.0程序设计 39
■ 在“属性”窗口中,选择“函数”按钮来打开“表达式生成
器”。
■在“属性设置”框中键入,=”号,并在后面键入表达式。
例如, 如果想设置表单的 Caption属性, 使它在运行表单时能够指
示当前的活动表, 可在, 属性设置, 框中键入,=Alias()。
在属性窗口中设置一个属性表达式, 并在运行时刻或设计时刻初
始化对象时, 才对这个属性表达式进行求值 。
如果将属性设置为用户自定义函数的结果, 那么当设置或修改这
个属性, 以及运行表单时, 对这个函数进行求值 。 如果用户自定
义函数出现错误, 有可能打不开这个表单 。 此外, 也可以在对象
的 Init事件中将属性设置为用户自定义函数, 如下例所示 。
This.Caption= myfunction()
其中 myfunction()为自定义函数名
如果用户自定义函数出现错误, 就不能运行表单, 但可以修改它 。
如果要指定表单的图标,将表单的 Icon属性设置为一个,ico文件的
文件名。
返回
2010-5-20 Visual FoxPro 6.0程序设计 40
7.3.2 定义表单行为
当在“表单设计器”中设计表单时,表单是“可视”的。除非
Visible(指定对象是可见还是隐藏)属性设置为“假”(,F.),
对表单的外观和行为的修改将立刻在表单上反映出来。
如果将 WindowState(指定表单窗口在运行时是最大化、最小
化还是采用普通大小)属性设置为 0(普通),1(最小化)或 2
(最大化),表单设计器中的表单会立即体现这一设置。
如果将 Movable属性(指定在运行时刻用户能否移动对象)设
置为“假”(,F.),那么不但用户在运行时不能移动表单,即使
在设计时也不能移动它。
因此应该在设置那些决定表单行为的属性之前,先完成表单的
功能设计,并添加所有需要的控件。
表 7-3列出了在设计时常用的表单属性,它们定义了表单的外
观和行为。
2010-5-20 Visual FoxPro 6.0程序设计 41返回
2010-5-20 Visual FoxPro 6.0程序设计 42
7.3.3 编辑事件代码和方法程序代码
事件是用户的行为,如单击鼠标或鼠标的移动,也可以是系统行为,如系统
时钟的进程。方法程序是和对象相联系的过程,只能通过程序以特定的方式
激活。当触发事件或激活方法程序时,可以指定要执行的代码。若要编辑事
件或方法程序代码,可以:
①从“显示”菜单中选择“代码”命令。
②在“过程”框中选择事件或方法程序。
③在编辑窗口中键入代码,在触发事件或激活方法程序时将执行这些代码。
例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的
Click事件中可包括这样一行代码:
THISFORM.Release
注意:若要在编辑窗口中查看不同过程,请按 【 PageDown】 或 【 PageUp】 键。
当用户单击这个命令按钮时,表单被从屏幕和内存中删除。如果不想从内存
中删除表单,可以在 Click事件代码中以下一行代码来代替上一行代码:
THISFORM.hide &&将表单隐藏起来
注意:如果表单集、表单或表单集中任何表单上任何对象的 Init事件代码返回
“假”(,F.),就不能创建这个表单或表单集。
返回
2010-5-20 Visual FoxPro 6.0程序设计 43
7.3.4 将表单和控件保存为类
也可以将表单或表单上的控件子集保存为类定义。如果您打算
创建基于表单的子类,或在其他表单中重新使用这些控件,可
将表单作为类定义来保存。若要将表单或选定的控件保存为类
定义,可以:
①从“文件”菜单中选择“另存为类”。
②在“另存为类”对话框中选择“当前表单”或“选定控件”。
③在“类名”框中输入类的名称。
④在“文件”框中输入保存类的文件名。
⑤选择“确定”按钮。
如果没有给出文件扩展名,保存文件时会加上默认的,vcx扩展名,
如果将表单保存为类定义,就可以用 MODIFY CLASS命令对它
进行修改。
返回
2010-5-20 Visual FoxPro 6.0程序设计 44
7.3.5 运行表单
可以从界面直接运行表单,或在程序代码中运行表单。
1、交互地运行表单
有几种方法运行设计好的表单。如果在“表单设计器”中工作,
可通过单击“表单设计器”工具栏中的“运行”按钮测试表单。
如果想在“表单设计器”重新打开表单,可在工具栏中选择 【 修
改表单 】 按钮。也可以从项目中运行表单,或者以编程方式运行
它。若要以交互方式运行表单,可在“项目管理器”中,选择要
运行的表单,再选择“运行”按钮。或者在“命令”窗口中,使
用 DO FORM命令运行表单。也可以从 【 程序 】 菜单中选择 【 运
行 】 来运行菜单,在“文件类型”框中选择“表单”,选定一个
表单再选定 【 运行 】 按钮。
2、从程序中运行表单
若想在程序中运行表单,需要在与事件相关联的代码、方法程序
代码或在程序或过程中包含 DO FORM命令。
2010-5-20 Visual FoxPro 6.0程序设计 45
3、命名表单对象
默认情况下,当使用 DO FORM命令时,表单对象的名称与,scx
文件名称一样。例如,下面的一行代码运行 Student.scx表单。
VFP自动为这个表单创建一个名为 Student的对象变量:
DO FORM Student
若要命名表单对象,请使用 DO FORM命令的 NAME子句。例如,
下面的命令运行一个表单,同时创建两个表单对象变量名:
DO FORM Student NAME mystud1
DO FORM Student NAME mystud2
4,处理表单对象
如果在, 命令, 窗口发出 DO FORM命令, 表单对象就和一个公
共变量相关联, 可以通过这个变量名来访问表单对象 。 例如, 在
,命令, 窗口发出下面的命令, 打开一个名为 Student的表单并
改变它的标题 。
DO FORM Student
Student.Caption=”学生情况登记,
2010-5-20 Visual FoxPro 6.0程序设计 46
如果在“命令”窗口发出下面的命令,在活动的输出窗口中将显
示 O,表明 Student是一个对象:
TYPE(“Student”)
如果在程序中发出 DO FORM命令,表单对象作用范围限于这个
程序,如果程序或过程运行结束,会移去对象,但表单仍然可见。
例如可以运行下面这个程序:
*formtest.prg
DO FORM Student
在运行完程序后,表单仍然可见,表单上的所有控件仍然处于活
动状态,但 TYPE(“Student”)返回 U表明 Student是没有定义的变量,
因此在“命令”窗口中发出下面的命令将产生错误:
Student.Caption=”学生情况登记”
但还可以使用应用程序对象的 ActiveForm,Forms和 FormCount属
性访问表单。
5,将表单链接到表单对象变量
DO FORM命令中的 LINKED关键字允许将表单和表单对象变量
2010-5-20 Visual FoxPro 6.0程序设计 47
链接起来,如果包含了 LINKED关键字,当与表单对象相关联的
变量超出范围时,表单将被释放。例如,下面命令创建一个链接
到对象变量 mystud2的表单:
DO FORM Student NAME mystud2 LINKED
当释放 mystud2时,表单也关闭。
6、关闭活动的表单
若想允许用户通过双击控件框,或选择表单“控件”菜单中的
“关闭”来关闭活动的表单,则需要设置表单的 Closable属性。
若要允许用户关闭活动表单,可以:
①在“属性”窗口中,将 Closable属性设置为“真”(,T.)。
②使用 RELEASE命令。
例如,可以通过在“命令”窗口或程序中发出下面的命令来关闭
和释放表单 Student:
RELEASE Student
也可以在一个控件,如标题为“退出”的命令按钮的 Click事
件代码中包含下面的命令,它允许用户关闭和释放表单:
2010-5-20 Visual FoxPro 6.0程序设计 48
THISFORM.Release
可以在与表单的对象相关联的代码中使用 RELEASE命令,但
在 RELEASE方法程序中却不会执行包含的任何代码。
注意,当释放表单时,同时也从内存中释放了为这个表单创
建的对象变量。每一个表单集有一个单独的变量,因此不释放表
单集就不能释放表单集中的表单。如果想要释放表单集,可使用
RELEASE.THISFORMSET命令。如果想将一个表单从屏幕移去,
不再让用户看见或使用它,可以使用 THISFORM.Hide命令。
返回
2010-5-20 Visual FoxPro 6.0程序设计 49
7.3.6 在运行时设置属性
表单由控件等对象组成。每个对象都有自己的属性,对象的属
性是独立存在的,可以分别定义每个对象的属性。打开属性窗
口会显示选定对象的属性或事件。如果选择了多个对象,这些
对象共有的属性会显示在“属性”窗口中。要编辑另一个对象
的属性或事件。可以在“对象”框中选择这个对象,或者直接
从表单中选择这个控件。 VFP中对象的属性除了能在设计时确
定以外,还能在运行时对属性进行充分的控制。
1、在对象层次上引用对象
若想操作一个对象,需要确定它和容器层次的关系。在容器层
次的最高级(表单集或表单)需要引用对象变量。除非使用 DO
FORM命令中的 NAME子句,否则对象变量和,scx文件有相同的
名称。通过引用由点号(.)分隔的对象变量、控件和属性可
以处理属性,如下所示:
Objectvariable,[form.]control.property=setting
2010-5-20 Visual FoxPro 6.0程序设计 50
对象属性设置的一般格式说明:
., =
对象变量,包含
包含对象的容器
及对象等。容器
和对象间也要用
逗点分隔。
















控件。其中包
含有包含控件
的容器,容器
和控件也要用
逗点分隔。
需要设置值的
属于指定控件
的一个属性。
所赋的值
在 【 例 7-1】 中使用表单的 Activate Event事件中使用了下列代码:
o= THISFORM.Grid1
o,Columns(i).BackColor=RGB(0,255,0)
这两条命令相当于一条命令:
THISFORM.Grid1.Columns(i).BackColor=RGB(0,255,0)
对象变量 控件 属性 值
2010-5-20 Visual FoxPro 6.0程序设计 51
可在表单或表单集中使用
THIS,THISFORM和
THISFORMSET引用对象。
例如,要想在单击命令按钮
时改变它的标题,可在命令
按钮的 Click事件代码中包含
下面的命令:
THIS.Caption=“保存”
2010-5-20 Visual FoxPro 6.0程序设计 52
对象引用示例:
在第 5章中的面向对象程序设计中曾用到下述命令:
设置 Combo2(字体设置 )的 Click Event事件代码 (工具栏不能属于
一个表单,只能属于表单集 )
THISFORMSET.ActiveForm.ActiveControl.FontName=THIS.VALUE
指定表单集 指定属于指
定表单集的
一个表单
指定属于指
定表单的一
个控件
指定属于指
定控件的一
个属性
为指定属性设置值
设置 Combo3(字号设置 )的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontSize=;
VAL(ALLTRIM(THIS.VALUE))
设置 Command1的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontBold=;
!THISFORMSET.ActiveForm.ActiveControl.FontBold
THIS.FontBold=THISFORMSET.ActiveForm.ActiveControl.FontBold
说明,赋值时所赋的值既可以是指定值,也可是变量。
2010-5-20 Visual FoxPro 6.0程序设计 53
2、在运行时使用表达式设置属性
在运行时也可以使用表达式或函数来设置属性。若要在运行时将
属性设置为表达式,可为属性指定一个表达式,或者为属性指定
一个用户自定义函数的结果。例如,建立一个“属性设置示例”
表单,根据一个变量的不同值,可以将一个按钮的标题设置为
“添加”或“保存”,另一个按钮的标题设置为“编辑”或“还
原”。 首先在创建表单对象时中声
明这个变量并设置表单的名
称和“退出按钮”的名称:
即在表单的 Init Event方法程序中写入如下代码 (也可在 Activate Event事件中 ):
PUBLIC glediting &&定义变量
Glediting=.F,&&为变量赋初始值
THISFORM.CAPTION="属性示例 " &&设置表单名称
THISFORM.COMMAND3.CAPTION="退出 " &&将 Command3按钮名设为“退出”
然后在第一个和第二个命令按钮的 Click Event事件中, 分别添加如下代码:
glediting=IIF(glediting=.F.,.T.,.F.) &&当点击事件发生时, 变量值发生变化
THISFORM.Refresh &&调用表单的刷新方法程序
2010-5-20 Visual FoxPro 6.0程序设计 54
最后在表单的 Refresh方法程序中添加如下代码:
THISFORM.COMMAND1.CAPTION =IIF(glediting=.F.,"添加 ","保存 ")
THISFORM.COMMAND2.CAPTION =IIF(glediting=.F.,"编辑 ","还原 ")
dodefault()
第 1,2行命令是根据 glediting的值设置命令按钮名称。
Caption设置中使用了一个 IIF()表达式。 IIF()是一个函数。
IIF()的功能是,该函数计算一个逻辑表达式的值,然后根据计算结果,返回
两个表达式中的一个。如果逻辑表达式的值为“真”,则返回第一个表达式;
如果值为“假”,则返回第二个表达式。
第 3条命令的作用是 调用父类中的 方法程序。在此处是调用表单父类中的
Refresh方法程序。
在表单中单击 【 添加 】 或
【 编辑 】 按钮时,按钮名
改变。
当再次在表单中单击 【 添
加 】 或 【 编辑 】 按钮时,
按钮名再次改变。如此循
环改变。
2010-5-20 Visual FoxPro 6.0程序设计 55
3、设置多个属性
用户可以同时为一个表单的多个对象设置多个属性,此时可使
用 WITH…ENDWITH 结构。例如,对于上面例子中的两个命令
按钮,在标题名称变化时还要使它们的宽度、字体、字体风格、
背景颜色变化,可在表单的 Refresh方法程序代码中包含下面的语
句:
IF glediting=.F.
WITH THISFORM.COMMAND1
.Caption="添加 "
.Width=100
.FontName="黑体 "
.FontBold=.T.
.ForeColor=RGB(0,128,255)
ENDWITH
WITH THISFORM.COMMAND2
.Caption="编辑 "
.Width=100
.FontName="黑体 "
.FontBold=.T.
.ForeColor=RGB(0,128,255)
ENDWITH
ELSE
WITH THISFORM.COMMAND1
.Caption="保存 "
.Width=75
.FontName="宋体 "
.FontBold=.F.
.ForeColor=RGB(0,0,0)
ENDWITH
WITH THISFORM.COMMAND2
.Caption="还原 "
2010-5-20 Visual FoxPro 6.0程序设计 56
.Width=75
.FontName="黑体 "
.FontBold=.F.
.ForeColor=RGB(0,0,0)
ENDWITH
ENDIF
DODEFAULT()
表单运行后的结果如图
返回
2010-5-20 Visual FoxPro 6.0程序设计 57
7.4 管理表单
7.4.1 隐藏和释放表单
7.4.2 将参数传递到表单
7.4.3 从表单返回值
7.4.4 在表单中使用本地和远程数据
退 出返 回
2010-5-20 Visual FoxPro 6.0程序设计 58
7.4.1 隐藏和释放表单
用户可以隐藏一个表单,使它不可见。在隐藏表单后,用户不能
访问表单上的控件,但仍可以用程序完全控制它们。
若要隐藏表单,可使用 Hide方法程序。例如,在与命令按钮的
Click事件相关的代码中,可以包含下面一行代码:
THISFORM.Hide
当用户单击命令按钮时,表单仍在内存中,但不可见。
当用户完成对表单的操作后,就可以让用户释放表单。在释放表
单后,用户就不能再访问表单的属性和方法程序了。
若要释放表单,可以使用 RELEASEE命令。例如,在与“退出”
命令按钮的 Click事件相关的代码中包含下面一行代码:
THISFORM.Release
当用户单击“退出”命令按钮时,表单被关闭。
返回
2010-5-20 Visual FoxPro 6.0程序设计 59
7.4.2 将参数传递到表单
在运行表单时,为设置属性值或者指定操作的默认值,有时需要
将参数传递到表单。若要将参数传递到表单,可以:
①创建容纳参数的表单属性,如 ItemName和 ItemQuantity
② 在表单的 Init事件代码中,包含 PARAMETERS语句:
PARAMETERS cString,nNumber
③ 在表单的 Init事件代码中,将参数分配给属性:
THIS.ItemName=cString
THIS.ItemQuantity=nNumber
例如,现通过向表单传递参数,设置“属性设置示例”表单中二个命令按钮
的 FontName和 FontSize属性,在运行表单时改变其字体和字号。可在表单的
Refresh方法程序中的 DODEFAULT()命令行前再写入如下代码:
THISFORM.COMMAND1.FontName=THIS.ItemName
THISFORM.COMMAND2.FontName=THIS.ItemName
THISFORM.COMMAND1.FontSize=THIS.ItemQuantity
THISFORM.COMMAND2.FontSize=THIS.ItemQuantity
④ 当运行表单时,在 DO FORM命令中包括一个 WITH子句:
DO FORM 属性设置示例 WITH,隶书”,12
返回
2010-5-20 Visual FoxPro 6.0程序设计 60
7.4.3 从表单返回值
在整个应用程序中都可以使用表单,让用户指定值。若要从表单
返回值,可以:
①将表单的 WindowType属性设置为 1,使表单成为模式表单。
②在与表单的 UnLoad事件相关的代码中,包含一个带返回值的
RETURN命令。
③在运行表单的程序或方法程序中,在 DO FORM命令中包含 TO
关键字。
例如,对“属性设置示例”表单在运行时向其传递参数设置命令
按钮的字体和字号,在结束表单的运行时,要求表单将命令按钮
最后的状态通过变量返回到一个变量 Sign中:
向表单传递参数同前,再进行如下设置:先将表单的 Window-
Type属性设置为,1-模式”;再在表单的 UnLoad事件中加入如
下代码:
RETURN Glediting
然后执行下列命令:
DO FORM属性设置示例 WITH "隶书 ",12 TO Sign 返回
2010-5-20 Visual FoxPro 6.0程序设计 61
7.4.4 在表单中使用本地和远程数据
可以创建这样的表单,它可以很容易地在使用本地数据和远程数
据(例如,存储在数据服务器上)之间切换。这样就可以使用本
地或测试数据来创建应用程序的原型,然后切换到远程或实际的
数据上,而不对表单做实质性的修改。
能够在本地和远程数据库之间切换的关键在于使用的是视图而不
是直接将表单(及其控件)与表链接。若要访问远程数据,则必
须在任何事件中使用视图。因此为了方便本地数据与远程数据的
切换,也需为本地数据创建视图。创建表单时,将这两个视图都
添加到它的数据环境中,根据需要进行切换。
若要创建可在本地和远程数据间切换的表单,可以:
①创建数据的两个视图,一个指向远程数据,另一个指向本地数
据。
②在表单的“数据环境”中添加这两个视图。
③在“数据环境” 的“属性”中,为两个视图设置同样的 Alias
属性,并将“数据环境”的 OpenViews属性设置为 1,Local Only
或 2:
2010-5-20 Visual FoxPro 6.0程序设计 62
Remote Only(取决于表单运行时使用哪个视图 )。
注意:由于两个视图使用同样的别名,不要选择默认的 0,Local
和 Remote。
④在表单中,添加需要的控件,将 ControlSource属性设置为视图
的相应字段。由于两个视图使用同样的别名,表单运行时控件将
自动对那个活动的视图作出反应。
创建表单后,通过改变“数据环境”的 OpenView属性切换视图
的别名。可以在使用“表单设计器”时在“数据环境”中做此工
作,如果要在运行时切换视图,还可以写出代码并将其附加到某
个事件中。例如,可将这些代码放入 Activate Enevt事件中:
THISFORM.DataEnvironment.OpenViews= 2 &&使用远程视图
如果要创建一个可在本地和远程数据间切换的表单,还必须设计
定位代码用以容纳两个视图,尤其是设计具有一对多关系的表单。
例如,如果表单只访问本地表或视图,可在 Next命令按钮中使用
下列代码,用来移动指针到临时表的下一个记录:
SKIP 1
THISFORM.Refresh()
2010-5-20 Visual FoxPro 6.0程序设计 63
但是,当在远程视图中定位时,此代码无效。因为代码假设临时
表包含了表单需要的所有数据。通常情况下,希望从远程数据源
上下载的数据越少越好。
解决的办法是使用带参数的视图。例如,用来编辑客户信息的视
图定义如下代码:
SELECT * FORM CUSTOMERS WHERE CUSTOMERS.COMPANY_NAME =?
PCompanyName
表单运行时,会在对话框中提示用户输入客户名或允许用户在文
本框中输入一个名称。“显示”按钮的代码可能与以下代码相似:
pCompanyName=THISFORM.txt pCompanyName.Value
REQUERY(“Customer”)
THISFORM.refresh()
返回
2010-5-20 Visual FoxPro 6.0程序设计 64
7.5 控件使用要点和技巧
7.5.1 根据任务选择合适的控件
退 出
7.5.2 使用命令按钮和命令按钮组控件
7.5.3 用于显示文字、图形或图片的控件
7.5.4 使用表格控件
7.5.5 使用 OLE绑定型控件
7.5.6 设置控件的 Tab键次序
7.5.7 允许用户拖放
7.5.8 启用和废止控件
返 回
2010-5-20 Visual FoxPro 6.0程序设计 65
7.5.1 根据任务选择合适的控件
VFP的控件具有良好的灵活性和通用性。虽然可以用多种控件
来完成某个特定的任务,但最好保持控件的使用方法的一致性。
这样,当用户一看到所提供的界面,就知道自己能做什么。例
如,标签和命令按钮都具有 Click事件,但熟悉图形界面的用户
更习惯单击命令按钮来执行指令。
表单的绝大部分功能可以归为下列几类:
■为用户提供一组预先设定的选择
■接受不能预先设定的用户输入
■在给定范围内接受用户输入
■允许用户执行特定的命令
■在给定的时间间隔内执行特定的命令
■显示信息
1,预先设定选择的控件
确保数据库数据有效性的最直接方法之一,就是为用户提供一
组预先设定的选项。控制用户的选择,可以保证在数据库中
2010-5-20 Visual FoxPro 6.0程序设计 66
不存储无效数据。可以用下列控件为用户提供一组预先设定的选
择:选项组、列表框、下拉列表和复选框。
( 1) 使用选项组
选项组是包含选项按钮的容器 。 通常, 选项按钮允许用户指定对
话框中几个操作选项中的一个, 而不是输入数据 。 例如, 选项按
钮可以指定是向文件或打印机输出结果还是进行打印预览 。
■ 设置选项组中的选项按钮数目
在表单中创建一个选项组时, 它默认包含两个选项按钮, 改变
ButtonCount属性可以设置选项组中的选项按钮数目 。 例如, 要
想使一个选项组包含六个选项按钮, 可将这个选项组的
ButtonCount属性设置为 6。
选项组的 Value属性表明用户选定了哪一个按钮。例如,选项组
有六个选项按钮,如果用户选择了第四个选项,选项组的 Value
属性就是 4。如果选项组的 ControlSource属性是一个字符型字段,
或者如果在运行表单之前将 Value属性设置为一个字符值,则选
项组的 Value属性就是被选中的选项按钮的标题。
2010-5-20 Visual FoxPro 6.0程序设计 67
■ 设置选项按钮的属性
要想在“表单设计器”中人工调整选项组或命令按钮组的单个组
件,可从在“属性”窗口中设置单个按钮的属性,也可以在运行
时通过指定选项按钮的名称和属性值来设置这些属性。如,在表
单某一控件的某一方法程序中有如下一行代码,设置
OptionGroup1选项组中 Option4按钮的标题:
THISFORM.OptionGroup1.Option4.Caption=”按学号分类”
还可以在运行时使用 Buttons属性,并指定选项按钮在组中的索引
号来设置这些属性。例如,如果 Option4是组中的第四个按钮,下
面一行代码同样完成对 Option4标题的设置:
THISFORM.OptionGroup1.Buttons(4)Caption=”按学号分类”
若要设置组中所有按钮的属性,可使用组的 SetAll方法程序。下
面一行代码将表单中 OptionGroup1选项组的所有按钮设置为无效:
THISFORM.OptionGroup1.SetAll(“Enabled”,”.F.”,”OptionButton”)
SetAll方法程序的功能是为容器对象中的所有控件或某类控件指
定一个属性值。其语法格式为:
Container.SetAll(<属性名 >,<属性值 >[,<基类 >])
2010-5-20 Visual FoxPro 6.0程序设计 68
■ 启用或废止组中的按钮
前面的示例表明了如何通过编程方式废止组中的所有选项按钮。
当废止了选项按钮时,它们使用选项按钮的 DisabledForeColor和
DisabledBackColor属性指定的颜色显示。也可以将选项组的
Visible属性设置为“假”(,F.),这样用户就不会看到任何迹象。
■判断当前选定的按钮
根据选项组的 Value属性可以判断用户选定了哪个按钮。如果按
钮的控件源为数值型,且组中有五个按钮,如果选定了第三个按
钮,则选项组的 Value属性值为 3。如果没有选定选项按钮,选项
组的 Value属性为 0。
使用组的 Value和 Buttons属性,也可以确定选定选项按钮的标题。
例如,下面一行代码将选定选项的 Caption属性保存到名为
cSelected的变量中:
*下面的程序代码添加在表单的 OptionGroup1选项组的 Click事件方法程序中
oGroup=THISFORM.OptionGroup1
cSelected=oGroup.Buttons(oGroup.Value).Caption
THISFORM.Refresh
2010-5-20 Visual FoxPro 6.0程序设计 69
在表单的 Init Event事件方法程序中添加下面一行代码:
PUBLIC cSelected
在表单中加入一个文本框,将其 ControlSource属性设为 cSelected
当此表单运行后,当点击 OptionGroup1选项组时,被选中的选项的
标题会在表单上的文本框中显示出来。
表单设计完成后如图:
当运行表单并在选项
组中单击 Option4时的
表单结果如图:
■ 用选项按钮筛选列表
对一个表单的数据源如
果需要有少数几种数据
过滤方式,可以使用
2010-5-20 Visual FoxPro 6.0程序设计 70
选项按钮允许用户在过滤器之间切换。在下面的示例中,假定有
一个包含三个选项按钮的选项组和一个表格控件的表单,表格控
件的属性设置如下:
对 象 属 性 设 置
GRID1
GRID1
RecordSourceType
RecordSource
1 —别名
Student
筛选条件是在选项按钮的 Click事件代码中设置的,当用户选择选
项按钮时,对表格中数据进行筛选的事件代码如下:
2010-5-20 Visual FoxPro 6.0程序设计 71
请不要忘记在关闭按钮的 Click事件中或 Destroy事件中包含 SET
FILTER TO命令,以便当用户关闭表单时重置筛选条件。
注意:当表格的数据源已经更改时,为刷新表格中的数据,可使
用 Refresh方法程序。
按此方法建立表单且运行后的结果如所示。
■ 使用选项按钮将用户的选择存储到表中
在少数情况下,可以通过选项按钮获得用户信息,并通过保存
Caption属性将这些信息保存在表中。例如,在一个标准化考试
2010-5-20 Visual FoxPro 6.0程序设计 72
的应用程序中,可以使用选项按钮,使用户在多项选择 A,B,C、
D中进行选择。还可以用选项按钮在学生表中指明性别等。若要
将一个选项按钮的 Caption属性保存到表中,可以:
① 将选项组的 Value属性设置为 空字符串 。
② 将选项组的 ControlSource属性设置为表中的一个字符型字段 。
③ 在选项组的 Click事件代码中加入如下代码:
THISFORM.Refresh
例如, 在 Student表中加入, 新生类别, 字符型字段, 将选项组中
选项按钮的标题分别设置为, 城应,,, 农应,,, 城往, 和
,农往,, 并且选项组的 ControlSource属性设置为, 新生类别,,
那么当用户选择标题为, 城应, 的选择项时,, 城应, 将被保存
在表 Student的, 新生类别, 字段中 。
( 2) 使用列表框和下拉列表框
列表框和下拉列表框 ( 即 style属性为 2的组合框控件 —下拉列表 )
为用户提供了包含一些选项和信息的可滚动列表 。 列表框中, 任
何时候都能看到多个项;而在下拉列表中, 只能看到一个项, 用
户可单击向下按钮来显示可滚动的下拉列表框 。
2010-5-20 Visual FoxPro 6.0程序设计 73
■ 常用的列表属性和方法程序
■ 填充列表框或组合框
通过设置 RowSourceType和 RowSource属性,可以用不同数据源
中的项填充列表框。 RowSourceType属性决定列表框或组合框
2010-5-20 Visual FoxPro 6.0程序设计 74
的数据源类型,如数组或表,设置好 RowSourceType后,设置
RowSource属性可指定列表项的数据源。 RowSourceType共有十种
类型,0-无,表示没有,由程序向列表中添加项; 1-值; 2-别名;
3-SQL语句; 4-查询; 5-数组; 6-字段; 7-文件; 8-结构; 9-弹出
式菜单。
■ 创建具有多列的列表框
虽然列表框默认为一列, 但 VFP中的列表框可以包含任意列 。 多
列列表框和表格的区别在于, 在多列列表框中用户一次选择一行,
而在表格中用户可以选择每个单元, 另外不能直接编辑列表中的
数据 。
若要在列表框中显示多列, 可以:
① 将 ColumnCount属性设置为所需的列数 。
② 设置 ColunWidths属性 。 例如, 如果列表框中有三列, 下面的命
令将各列宽度分别设置为 60,45和 80。
THISFORM.LIST1.ColumnWidths=”60,45,80”
③ 将 RowSourceType属性设置为, 6-字段, 。
2010-5-20 Visual FoxPro 6.0程序设计 75
■ 允许用户选择列表框中的多项
默认情况下, 一次只能选定一个列表项, 但也可以允许用户选择
列表中的多个列表项 。 若要选择列表中的多项, 可将列表的
MultiSelect属性设置为, 真, 。
为了处理选定的项, 例如把它们复制到一个数组或在应用程序的
其他地方使用它们, 可以循环遍历各列表项, 处理 Selected属性为
,真, 的项 。 下面的代码包含在列表框的 InteractiveChange事件
中, 在 comboselected组合框中显示这个列表框中的选定项, 并且
在 txtNoSelected文本框中显示选定项的数目:
nNumberSelect=0 &&跟踪数目的变量
THISFORM.Combo1.Clear &&清除组合框
FOR nCnt=1 TO THIS.ListCount
IF THIS.Selected(nCnt)
nNumberSelect=nNumberSelect+1
THISFORM.Combo1.Additem(THIS.List(nCnt))
ENDIF
ENDFOR
THISFORM.Text1.Value=nNumberSelect
THISFORM.Refresh
2010-5-20 Visual FoxPro 6.0程序设计 76
■ 允许用户在列表框中添加项
除了让用户从列表框中选择项外,还允许用户交互地向列表中添
加项。若要以交互方式向列表添加项,可使用 AddItem方法程序。
在下面示例中,当用户按 Enter键时,文本框 KeyPress的事件中的
代码将文本框中的文本添加到一个列表框中,并且清除文本框中
的文本。
LPARAMETERS nKeyCode,nShiftAltCtrl
IF nKeyCode=13
THISFORM.List1.AddItem(THIS.Value)
THIS.Value=""
ENDIF
■ 根据列表值刷新一对多显示
当用户通过选择列表中的一个值来转到某个记录时,可能需要一
个一对多关系反映父表中记录指针的变化。利用本地表以及本地
视图或远程视图都可以实现这一功能。
●本地表:列表的 RowSourceType属性如果为 2-别名或 6-字段,
2010-5-20 Visual FoxPro 6.0程序设计 77
并且 RowSource属性是本地表,该本地表在表单的数据环境中具
有关系设置,则当用户选择新值时,可使用 InteractiveChange事
件中的 THISFORM.Refresh方法程序。一对多关系中的“多”方
只自动显示与关系中父表的表达式相匹配的记录。
● 视图:如果列表框的属性是一个本地视图或远程视图, 则对一
对多显示的刷新就有 一些不同 。 下面的示例说明了使用列表
框和表格创建一个表单, 列表框显示了 Student表的, 学号, 字
段的值, 表格显示了与在列表框中选择的, 学号, 字段相关的学
生的成绩 。
首先, 在, 视图设计器, 中创建一个 Stud_grad参数化视图 。 当
在, 视图设计器, 中创建该视图时, 一定要将外部关键字的选择
标准设置到一个变量中 。 在本例中, 该变量称为 Stud_ID。 即在
,视图设计器, 中首先添加一个表 Grade,再选 【 查询 】 |【 视图参
数 】, 在弹出的, 视图参数, 对话框中定义一个变量 Stud_ID,
然后在, 视图设计器, 中选择 【 字段 】 选项卡中单击 【 全部添加 】
按钮, 再选择 【 筛选 】 选项卡, 在, 字段名, 下的下拉选择框中
选择, Grade.
2010-5-20 Visual FoxPro 6.0程序设计 78
学号”,在“实例”下的文本框中输入?Stud_ID参数。
然后, 当设计表单时采用下列过程和步骤 。 请注意, 该视图需要
一个参数值, 该参数在加载表单时是不可用的 。 通过将视图临时
表对象的 NoDataOnload 属性设置为, 真,, 则只有在调用
REQUERY()函数时才运行视图, 这时用户可能已经为参数化视图
中使用的变量选择了一个值 。
若要按本地视图或远程视图设计一个一对多列表, 可按如下步骤进行:
① 向, 数据环境, 添加表 Student和带有参数的视图 Stud_grad。
② 对于, 数据环境, 中的视图临时表对象, 在其, 属性, 窗口中将
NoDataOnload属性设置为, 真, 。
③ 将列表的 RowSourceType属性设置为, 6-字段,, 并且将列表的 RowSource属
性设置为在视图的参数中引用为外部关键字的字段 。 在示例中设置为 Student.
学号 。
④ 将表格的 RecordSource属性设置为原先创建的视图的名称 Stud_grad。
⑤ 在列表的 InterActiveChange事件代码中, 将列表的值保存在变量中, 然后重
新查询视图, 如下例所示:
Stud_id=THIS.Value
=Requery("Stud_grad")
2010-5-20 Visual FoxPro 6.0程序设计 79
2、预先不能确定输入的控件
( 1)使用文本框
文本框是一类基本控件,它允许用户添加或编辑保存在表中非备
注字段中的数据。若要在程序中引用或更改文本框中显示的文本,
则要设置或引用 Value属性。
如果设置了文本框的 ControlSource属性,则显示在文本框中的值
将保存在文本框的 Value属性中,同时保存在 ControlSource属性指
定的变量或字段中。
■常用文本框属性
2010-5-20 Visual FoxPro 6.0程序设计 80
2010-5-20 Visual FoxPro 6.0程序设计 81
■ 检验文本框中的数据是否有效
若要检验文本框中的值,可在与 Valid事件(控件失去焦点前发生)
相关的方法程序中写进相应代码。如果值无效,则返回“假” 或
0。如果返回“假”,就显示一条“无效输入”信息。如果要显
示自己的信息,则可在 Valid事件代码中包含 MESSAGEBOX()函
数并且返回 0值。
例如, 建立一个对 Student表输入数据的表单, 其中的字符型字段
可以接收任何字符的输入, 数字型字段如果不加以限制也可以接
收任何数字, 而对 Student表来说, 这是可以的 。 但事实上为了保
证表中数据的正确性, 在数据输入时往往要对数据进行校验, 如
对, 年龄, 字段, 通常不会超过如 25岁, 为了保证输入的数据不
超过这个限制, 可以通过在文本框的 Valid事件代码中包含下面代
码:
IF THIS.Value>25
=MESSAGEBOX(“输入的年龄超过上限 !,,64,”年龄输入错误, )
RETURN 0
ENDIF
2010-5-20 Visual FoxPro 6.0程序设计 82
■ 对文本框中的文本进行格式编排
InputMask属性决定在文本框中可以键入的值,而 Format属性则决
定在文本框中值的显示方式。
例如,将 InputMask属性设置为 999,999.99可限制用户只能输入具
有两位小数并小于 1,000,000的数值。在用户输入任何值之前,逗
点和句点就显示在文本框中。如果用户按一个字符键,则这个字
符不能显示在文本框中。如果有逻辑字段,并且想让用户能键入
,Y”或,N”而不是,T”或,F”,应将 InputMask属性设置为,Y”。
■在文本框中接收用户密码
在应用程序中,经常需要获得某些安全信息,如密码。这时可以
用文本框来接收这一信息,而在屏幕上并不显示。如希望接收用
户输入同时不显示实际输入值,可将文本框的 PasswordChar属性
(指定文本控件内是显示用户输入的字符还是显示占位符,该属
性如果输入值则为指定占位符)设置为,*”或其他的一般字符。
如果属性设置为除空字符串的任何字符,文本框的 Value和 Text属
性将保存用户的实际输入,而对用户所按的每一个键都用设定的
一般字符来显示。
2010-5-20 Visual FoxPro 6.0程序设计 83
( 2)使用编辑框
在编辑框中允许用户编辑长字段或备注字段文本,允许自动换行
并能用方向键。 PageUp和 PageDown键以及滚动条来浏览文本。
■在编辑框中编辑备注字段
如果用户想在编辑框中编辑备注字段,只需将编辑框的 Control
Source属性设置为该备注字段。
■在编辑框中对选定文本进行处理
编辑框和文本框有三个属性可以用于对选定文件进行操作:
SelLength,SelStart和 SelText。利用 SelStart和 SelLength和 SelText
属性可以从程序中选定文件。
注意,当改变 SelStart属性时,编辑框就会滚动,显示新的
SelStart值。如果在一个循环中改变 SelStart值,例如查找文本时,
如果在执行这个过程之前包含 THISFORM.LockScreen =.T.,在执
行这个过程之后包含 THISFORM.LockScreen =.F.,则代码可以执
行得更快。
2010-5-20 Visual FoxPro 6.0程序设计 84
( 3)使用组合框
■将用户项添加到下拉组合框的列表中
要将新的用户值添加到下拉组合框, 可在与组合框的 Valid事件相
关的方法程序中使用下面一行代码:
THIS.AddItem(THIS.Text)
但是, 在添加一项之前, 最好检查保证在下拉组合框中没有该值 。
LItemExists=.F.
FOR ii=1 TO THIS.ListCount
IF THIS.List(ii)=THIS.Text
LItemExists=.T.
EXIT
ENDIF
ENDFOR
IF,NOT.lItemExists
THIS.AddItem(THIS.Text)
ENDIF
返回
2010-5-20 Visual FoxPro 6.0程序设计 85
7.5.2 使用命令按钮和命令按钮组控件
为了让用户完成一些和操作值无关的特定动作,例如,让用户关
闭一个表单、打开另一个表单、在表中浏览、保存或取消编辑、
运行报表或查询以及其他的操作。此时可借助命令按钮或命令按
钮组控件来进行。命令按钮和命令按钮组的特定操作代码通常放
置在命令按钮的 Click事件中。
1、使命令按钮成为默认选择
将命令按钮的 Default属性设置为“真”(,T.),可使该命令按钮
成为默认选择。默认选择的按钮比其他命令按钮多一个粗的边框。
如果一个命令按钮是默认选择,那么按 Enter键后,将执行这个命
令按钮的 Click事件。
注意:如果选定的表单对象是编辑框或表格,当按 Enter时,不会
执行默认选择按钮的 Click事件代码。在编辑框中按 Enter键,将
在编辑框中的值加入一个回车和换行符;在表格中按 Enter,将选
择一个相邻的区域。若要执行默认按钮的 Click事件,则要按
Ctrl+Enter。
2010-5-20 Visual FoxPro 6.0程序设计 86
2、常用命令按钮属性
还可以将命令按钮组成一组,这样即可单独操作,也可作为一个
组统一操作。
3、通过组来管理命令按钮的选择
要让组中所有命令按钮的 Click事件代码都用同一个方法程序过程,
可将代码加入命令按钮组的 Click事件代码中。命令组的 Value属
性指明单击了哪个按钮。
例如,建立一个“命令按钮示例”表单如图
2010-5-20 Visual FoxPro 6.0程序设计 87
IF !EOF()
SKIP
ENDIF
CASE THIS.VALUE=3
THISFORM.RELEASE
ENDCASE
THISFORM.REFRESH
在该表单中添加了一
个命令按钮组,其中
有三个命令按钮,分
别是 【 上一条记录 】,
【 下一条记录 】 和
【 退出 】,前二个命
令按钮用来对当前表
中的记录进行定位。
现要求这三个命令按
钮采用同一个方法程序来实现各自的功能,可在表单的 Comman-
dGroup1容器的 Click事件中加入如下代码:
DO CASE
CASE THIS.VALUE=1
IF !BOF()
SKIP -1
ENDIF
CASE THIS.VALUE=2
2010-5-20 Visual FoxPro 6.0程序设计 88
为了控制当记录指针从表的顶部溢出后,不再执行 【 上一条记录 】
的命令和当记录指针从当前表的底部溢出后不再执行 【 下一条记
录 】 的命令,可在 CommandGroup1容器的 Refresh方法程序中添
加如下代码:
IF BOF()
THIS.COMMAND1.ENABLED=.F.
THIS.COMMAND2.ENABLED=.T.
ELSE
IF EOF()
THIS.COMMAND1.ENABLED=.T.
THIS.COMMAND2.ENABLED=.F.
ELSE
THIS.COMMAND1.ENABLED=.T.
THIS.COMMAND2.ENABLED=.T.
ENDIF
ENDIF
如果为组中的某个命令按钮的 Click事件编写了代码,当选择这
个按钮时,将执行为该按钮编写的程序代码而不执行组的 Click
事件代码。 返回
2010-5-20 Visual FoxPro 6.0程序设计 89
7.5.3 用于显示文字、图形或图片的控件
1、使用图像控件
图像控件允许在表单中添加图片(,BMP)文件。图像控件和
其他控件一样,具有一整套的属性、事件和方法程序。因此,在
运行时可以动态地更改它。用户可以用单击、双击和其他方式来
交互地使用图像。
2、使用标签
标签和文本框的不同之处在于标签没有数据源、不能直接编辑
和不能用 Tab键选择,在程序中可以改变标签的 Caption和 Visible
属性,让标签更好地显示不同的内容。
2010-5-20 Visual FoxPro 6.0程序设计 90
3、使用文本框和编辑框显示信息
设置文本框和编辑框的 ReadOnly属性为“真”,可以显示那
些只能查看而不能修改的信息。如果编辑框无效用户就不能滚动
文本。
4,使用表单图形显示信息
返回
2010-5-20 Visual FoxPro 6.0程序设计 91
7.5.4 使用表格控件
1、设置表格列数
首先需要设置的表格控件属性是列数。若要设置表格中的列数,
可在“属性和方法程序”列表中选择 ColumnCount属性,然后在
“属性”框中,键入需要的列数。如果 ColumnCount属性设置为
1-(默认值),在运行时,表格将包含与其链接的表中字段同样
数量的列。
2、在设计时人工调整表格的显示
在表格中加入列后将改变列的宽度和行的高度。可以在“属性”
窗口中人工设置列和行对象的高度和宽度属性,也可以在设计表
格时可视地设置这些属性。若要切换到表格设计方式,可从表格
的快捷菜单中选择“编辑”命令,然后在“属性”窗口的“对象”
框中选择表格的一列。在表格设计方式下,表格周围将显示一个
粗框。要切换出表格设计方式,只需选择表单或其他控件。若要
调整表格中列的宽度,可以:
①在表格设计方式下,将鼠标指针置于表格列的标头之间,这
2010-5-20 Visual FoxPro 6.0程序设计 92
时指针变为带有向左和向右箭头的条。
②将列拖动到需要的宽度,或者在“属性”窗口中设置列的 Width
属性。
若要调整表格中行的高度,可以:
①在表格设计方式下,将鼠标指针置于“表格”控件左侧的第一
个按钮和第二个按钮之间,这时指针将变成带有向上和向下箭头
的条。
②将行拖动到需要的高度,或者在“属性”窗口中设置列的
Height属性。
注意,将 AllowRowSizing设置为“假”(,F.),可以防止用户在
运行时改变表格行的高度。
3,设置表格中显示的数据源
可以为整个表格设置数据源, 也可以为每个列单独设置数据源 。
若要为整个表格设置数据源, 可以:
①选择表格,然后单击“属性”窗口的 RecordSourceType属性。
如果让 VFP打开表,可将 RecordSourceType属性设置为,0-表”;
如果
2010-5-20 Visual FoxPro 6.0程序设计 93
想在表格中放入打开表的字段,则将 RecordSourceType属性设置
为,1-别名”。
② 单击, 属性, 窗口中的 RecordSource属性 。 选择或输入作为表
格数据源的别名或表名 。
如果想在特定的列中显示一个特定字段, 也可以为列设置数据源 。
若要设置列的数据源, 可以:选择列, 然后单击, 属性, 窗口的
ControlSource属性 。 选择或输入作为列的数据源的别名, 表名或
字段名 。
4,向表格添加记录
将表格的 AlIowAddNew属性设置为, 真, (,T.), 可以允许用户
向表格中显示的表中添加新的记录 。 如果将 AlIowAddNew属性设
置为真, 当用户选中了最后一个记录, 并且按下光标 【 ↓】 键时,
就向表中添加新记录 。
如果还想进一步控制用户什么时候向表中添加新记录, 可以将
AlIowAddNew属性设置为默认的, 假, (,F.), 并使用 APPEND
BLANK或 INSERT命令添加新记录 。
2010-5-20 Visual FoxPro 6.0程序设计 94
5、使用表格控件创建一对多表单
表格最常见的用途之一是当文本框显示父记录数据时,表格显示
子表的记录;当用户在父表中浏览记录时,表格记录显示相应变
化。如果表单的数据环境包含两表之间的一对多关系,那么要在
表单中显示这个一对多关系非常容易。若要设置具有数据环境的
一对多表单,可以先将需要的字段从“数据环境”中的父表拖动
到表单中,再从“数据环境”中将相关的表拖动到表单中。在大
多数情况下,都要为表单或表单集创建一个数据环境,但是即使
不用“数据环境”,创建一对多表单也并不复杂。
若要创建没有数据环境的一对多表单,可以先将文本框添加到表
单中,显示主表中需要的字段;再设置文本框的 ControlSource属
性为主表;然后再在表单中添加一个表格;将表格的
RecordSource属性设置为相关表的名称;设置表格的 LinkMaster
属性为主表名称;设置表格的 Childorder属性为相关表中索引标
识的名称,索引标识和主表中的关系表达式相对应;将表格的
RelationalExpr属性设置为联接相关表和主表的表达式。
2010-5-20 Visual FoxPro 6.0程序设计 95
6、在表格列中显示控件
除了在表格中显示字段数据,还可以在表格的列中嵌入控件,这
样就为用户提供了嵌入文本框、复选框、下拉列表框、微调按钮
和其他控件的方法。例如,如果表中有一个逻辑字段,当运行该
表单时,通过辨认复选框可以判定哪个记录值是“真”和哪个记
录值是“假”。修改这些值只需设置或清除复选框即可。
可以在“表单设计器”中交互地向表格列中添加控件,也可以通
过编写代码在运行时添加控件。若要交互地在表格列中添加控件,
可以在属性窗口中先后执行下述操作步骤:
■在表单中添加一个表格,并打开其“属性”窗口,在属性窗口
中将表格的 ColumnCount属性设置为需要列数,如果要求表格显
示四列,则可以将 ColumnCount属性设置为 4。
■在“属性”窗口中的“对象选择”下拉列表框中为控件选择父
列。例如,要选择第四列来添加控件,可以在“属性”窗口中的
“对象”框中选择 Column4对象,这时表单上表格的边框发生了
变化,表明正在编辑一个包含的对象。
2010-5-20 Visual FoxPro 6.0程序设计 96
■ 在“表单控件”工具栏中选择所要的控件,这里单击 (复选框 ),
然后在表单的第四列中的任意位置单击,新控件将被加入到表格
中。新加入的控件不在表格的列中显示,但在“属性”窗口的
“对象”框中可以看到已经加入了一个在 Column4对象下的
Ckeck1对象,该对象在运行时才显示。
■将新加入的复选框的 Caption属性设置为“无”,并将列
Column4的 Sparse属性(指定 CurrentControl属性是影响 Column对
象中的所有单元格,还是只影响活动单元格)设置为“假”。
■将父列 Column4的 ControlSource属性设置为所需要的表字段,
并将 CurrentControl属性(指定列对象中的控件哪一个被用来显
示活动单格的值)设置为新加入的控件,这里选择 Check1。设
定后,在表单的第四列中将显示一个复选框标记。
若要移去表格列中的控件, 可以采取以下步骤:
■ 在, 属性, 窗口的对象框中选择要移去的控件 。
■ 激活, 表单设计器, 。 如果属性窗口可见, 控件的名称将显示
在对象框中 。
■ 按 Delete键 。 返回
2010-5-20 Visual FoxPro 6.0程序设计 97
7.5.5 使用 OLE绑定型控件
单击,OLE绑定型控件”按钮,并在“表单”窗口中拖动至所期
望的大小,可以在表单中创建一个绑定型 OLE控件对象。在创建
这个对象后,可以将它和表中的通用字段链接,然后可以用这个
对象显示字段中的内容。
若要创建一个绑定型 OLE对象,可以:
①创建或打开表单。
②在“表单控件”工具栏中选择,OLE绑定型控件”按钮,并在
表单中将它拖动到所期望的大小。
③设置对象 ControlSource属性,将 OLE对象和通用字段链接。
7.5.6 设置控件的 Tab键次序
表单控件的默认 Tab键次序是控件添加到表单时的次序, 但通过
设置控件的 Tab键次序可以使用户按照逻辑顺序在控件之间移动 。
若要改变控件的 Tab键次序, 可以:
① 在, 表单设计器, 工具栏中选择, 设置 Tab键次序, 。
② 双击控件旁边的框, 这个控件将在表单打开时具有最初焦点 。
返回
2010-5-20 Visual FoxPro 6.0程序设计 98
③ 按需要的 Tab键次序依次单击框。
④单击控件外的任何地方,完成设置。
也可以根据“选项”对话框的“表单”选项卡中的设置,按列
表为表单中的对象设置 Tab键次序。
可以在一个控件组中设置选项按钮和命令按钮的选择顺序。要
想使用键盘移动到一个控件组,用户需要按 Tab键移动到控件组
的第一个按钮,然后使用箭头键选择该组中其他按钮。 若要
更改一个控件组中按钮的选择顺序,可以:
①在“属性”窗口中,在“对象”列表里选择控件组。一条粗
的边框表明该组处于编辑状态。
②选择“表单设计器”窗口。
③从“显示”菜单中选择,Tab键次序”命令。
④选择合适的 Tab键次序。
返回
2010-5-20 Visual FoxPro 6.0程序设计 99
7.5.7 允许用户拖放
拖放功能可以扩展到多表单操作。用户能将控件拖动到屏幕上的
任何位置,包括其他表单。只要拖到的目的区域在应用程序中,
就可以对拖动操作作出响应。当用户拖动控件时,VFP提供了和
对象相同尺寸的灰色外框,并和鼠标指针一起移动。可以为控件
的 DragIcon属性指定一个光标文件(,CUR)来覆盖默认方式。
注意,在运行时拖动控件并不改变控件的位置,但可以按照本
章稍后的“在拖放操作中
引起控件移动”一节中的说明,编写重新定位的程序,改变控件
位置。通常拖动只是用于指示执行某些操作,当用户释放鼠标按
钮后,控件仍将保留在原来的位置。
使用表 7-18列出的拖放属性、事件和方法程序,可以指定拖动
操作的含义,也可以指定控件拖动的方式。所有可视的控件在运
行时都可以拖动,并且所有控件都拥有表 7-18中列出的属性。表
单能识别 DragDrop和 DragOver事件,但不具备 DragMode和
DragIcon属性。
2010-5-20 Visual FoxPro 6.0程序设计 100
1、启用自动拖动方式
如果允许用户无论何时单击控件时都能拖动控件,可将 Drag-
Mode属性设置为 1,这能启用控件的自动拖动方式。当拖动设置
为“自动”时,拖动功能总是打开的。
注意,在自动拖动方式下被拖动的控件不识别其他的鼠标事件。
2、在用户停放对象时的响应
拖动控件之后释放鼠标按钮时,VFP产生一个 DragDrop事件,对
这一事件有多种响应方法。可将控件重新定位在新的位置(由灰
色外框的最后位置来指明)。记住,控件不会自动移到新的位置。
当释放鼠标时,如果鼠标指针处于一个控件边框内,这个控件就
2010-5-20 Visual FoxPro 6.0程序设计 101
成了目标(用户将控件拖到其上的对象,该对象可以是一个能识
别 DragDrop事件的表单或控件)。如果指针处在表单的空白部
分,表单将成为目标。
DragDrop事件接受三个参数,oSource,nXCoord和 nYCoord。
oSource参数是对拖放到目标上控件的引用, nXCoord和 nYCoord
参数分别包含了鼠标指针在目标中的水平和垂直坐标 。 因为
oSource是一个对象, 所以可以像使用控件那样使用它, 可以引
用它的属性或调用它的方法程序 。 例如, 下面列出的是与
DragDrop事件相关的代码中的语句, 检查用户是否已将一个控
件停放到自己上面 。
LPARAMETERS oSource,nXCoord,nYCoord
IF oSource.Name#THIS.Name
*执行某些动作
ELSE
*控件在自己上面停放
*执行其它动作
ENDIF
2010-5-20 Visual FoxPro 6.0程序设计 102
oSource的所有可能控件类型都有 Visible属性。因此,当把控件拖
放到表单中某一部分或另一个控件上时,可以让控件变为不可见。
下面几行是一个 Image控件的 DragDrop事件的相关代码,它使一
个拖动控件在拖放到图像上时变为不可见。
LPARAMETERS oSource,nXCoord,nYCoord
OSource.Visible=.F.
3、指示停放的有效区
当启用拖放功能时,可以提示用户哪些地方可以停放控件,哪些
地方不能停放控件。完成这个功能最好的方法是在 DragOver事件
的相关代码中改变数据源的 DragIcon属性。
LPARAMETERS oSource,nXCoord,nYCoord,nState
DO CASE
CASE nState=0 &&进入
THISFORM.ItemName=oSource.DragIcon
oSource.DragIcon=”NODROP01.CUR”
CASE nState=1 &&离开
oSource.DragIcon=THISFORM.ItemName
ENDCASE
这个例子中的
ItemName是用
户自定义的表
单属性。
2010-5-20 Visual FoxPro 6.0程序设计 103
4、在拖放操作中引起控件移动
有时用户在释放鼠标按钮后,需要改变源控件的位置。要让控件
移动到新的鼠标位置,可使用 Move方法程序。例如,下面列出
的表单的 DragDrop事件代码就将被拖动的控件移动到停放位置。
LPARAMETERS oSource,nXCoord,nYCoord
oSource.Move(nXCoord,nYCoord)
因为是控件的左上角置于鼠标的位置上,这些代码也许不能达到
想要的精确效果。下面的代码将控件中心置于鼠标的位置上。
LPARAMETERS oSource,nXCoord,nYCoord
oSource.Move((nXCoord-oSource.Width/2),(nYCoord-oSource.Height/2))
只有将 DragDorp属性设置为非默认值(灰色矩形框)时,上述代
码才能获得最好的效果。如果使用的是灰色矩形框,用户通常根
据灰色矩形框的最后位置来精确确定控件的位置。要做到这点,
应记录下鼠标在源控件中的最初位置,然后用这个位置作为控件
移动的偏移量。
若要记录最初的鼠标位置,可以:
①指定控件为人工拖动方式。
2010-5-20 Visual FoxPro 6.0程序设计 104
② 声明两个表单级的变量,nDragX和 nDragY。
③当 MouseDown事件发生时启用拖动,同时在这个事件中将
nXCoord和 nYCoord值保存在表单级变量中。
④当 MouseUp事件发生时废止拖动。
7.5.8 启用和废止控件
在某种给定情况下, 如果不能使用某个控件, 可将该控件的
Enabled属性设置为, 假, 。 将每个按钮的 Enabled属性设置为
,真, 或, 假,, 可以启用或废止组中单个选项按钮或命令按
钮 。 也可通过设置组的 Enabled属性来启用或废止组中全部按钮 。
在选项组或命令组的 Enabled属性设置为, 假, 时, 组中所有按
钮都废止, 但不会显示出废止的前景色和背景色 。 设置组的
Enabld属性不会影响组中单个按钮的 Enabled属性, 这就允许废
止有按钮失效的组 。 当重新启用该组时, 原来失效的按钮仍然失
效 。 如果让组中的所有按钮废止, 显示出废止的外观, 并且不保
留组中按钮哪些有效, 哪些失效的信息, 可使用组的 SetAll方法
程序, 如下所示:
THISFORM.COMMANDGROUP1.SetAll(“Enabled”,.F.)
返回
2010-5-20 Visual FoxPro 6.0程序设计 105
小 结
表单是 VFP6人机交互的主要工具,表单设计器是 VFP6中功能最
强大的设计器。
本章从不同的角度来说明了如何设计表单的问题。设计一个表
单,第一步是如何选择数据源,也就是数据环境的问题,第二
步是向表单或表单集中添加对象,第三步是对表单或表单集中
的对象进行处理,最后是管理表单的问题。设计表单时可以使
用表单向导或表单设计器,重点是使用表单设计器,对于表单
设计器的使用本章没有具体讲,但设计方法与前几章中的各种
向导很类似。
设计表单最重要的是掌握几种常用表单控件的使用方法,如标
签、文本框、组合框、列表框、表格、命令按钮、命令按钮组、
选项按钮组、复选框等。具体使用什么控件,要根据任务选择
合适的控件,在本章中介绍了使用命令按钮和命令按钮组控件、
使用表格控件等的技巧。同时还介绍了管理表单时要用到的几
种技术。
返回
2010-5-20 Visual FoxPro 6.0程序设计 106
选择 【 数据环境 】
在系统菜单上增加了 【 数据环境 】 菜单,
同时打开了“数据环境设计器”。
单击 【 数据环境 】 菜单并选择 【 添加 】,
打开“添加表或视图”对话框。
在“添加表或视图”对话框中从“数据库中的表”下选择 Student表,再单
击 【 添加 】,然后单击 【 关闭 】,即可将 Student表添加到“数据环境设计器”
中。若要添加视图,可在“选定”选项组中先选择“视图”,再进行上述操
作。添加后表或视图后关闭“数据环境设计器”。
2010-5-20 Visual FoxPro 6.0程序设计 107
第 2步:为报表添加标题。
选择菜单上的 【 报表 】 |
【 标题 /总结 】,弹出的
【 标题 /总结 】 对话框。
选中“标题带区”
再单击 【 确定 】 按

在“报表设计器”中增加了标题带区
欲在标题带区中加入标签“学生报表”的操作步
骤:先单击“报表控件”工具栏上的(标签)按
钮;
在标题带区中单击
出现闪烁的光标。
在光标处开始输入标题名“学生报表”;
学生报表
字号设置:先选中“学生报表”标签,再在系统菜单中选择 【 格式 】 |【 字
体 】,在弹出的“字体”对话框中选择所需要的字体和字号以及字体样式。
如选择“黑体”、“规则”、“二号”。
接着再进行版面设置,选择 【 格式 】 |【 对齐 】 |【 水平居中 】 。
2010-5-20 Visual FoxPro 6.0程序设计 108
第 3步,设置报表的页标头。设置报表的页标头与上面设置标
题的方法相同。
系部代号 班级代号 学号 姓名 性别 出生日期 班级 宿舍 电话 年龄 新生类别
1、在页标头中分别添加标签“系部代号”、“班级代号”、“学号”、“姓名”等。
2、按住 Shift键后分别单击每一个标签,将其全部选中。
3、用与设置标题相同的方法将页标头的字体设为,黑体”,“规则”,“五号”
4、标签布局调整。选中单个标签后用光标键可调整其位置,也可选中一批后
使用光标键调整位置。
2010-5-20 Visual FoxPro 6.0程序设计 109
第 4步:设置细节。
在第 3步设计完成后,可以将“数据环境设计器”打开。
将要列在报表中的字段从“数据环境设计器”中
逐个拖到细节带区。
设置字体字号及调整布局:方法同页标题。使用
报表默认的字体和字号。
控件对齐:选中细节中的全部域控件,然后在系统菜单中选择 【 格式 】 |【 对
齐 】 |【 顶边对齐 】 。
2010-5-20 Visual FoxPro 6.0程序设计 110
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中
多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在
报表上单击时系统将打开“报表表达式”生成器。
“表达式生成器”按钮,格式”按钮
单击“表达式生成器”按钮
从“字段”列表框中选择一个字段双击
单击 【 确定 】
2010-5-20 Visual FoxPro 6.0程序设计 111
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中
多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在
报表上单击时系统将打开“报表表达式”生成器。
“表达式生成器”按钮,格式”按钮
单击 【 确定 】
2010-5-20 Visual FoxPro 6.0程序设计 112
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中
多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在
报表上单击时系统将打开“报表表达式”生成器。
采用同样的方法添加其它域控件并调整域控件到合适的大小。
调整域控件大小:每个域控件都有 8个控制柄,按住控制柄拖动鼠标可以调整
域控件的大小。现将“系代号”域控件宽度缩短。
控制柄
2010-5-20 Visual FoxPro 6.0程序设计 113
第 5步:在页注脚中设置报表页码。
方法基本同上一步,只不过在“表达式生成器”对话框中不是从
“字段”列表框中选择,而是从“变量”列表框中选择
,_pageno”。
在此报表中,数据之间没有分隔线,若要求要有网格线,也可以
用同上的基本方法,在“页标头”中的字段名上加上方框线,在
“细节”中的域控件上加分隔线。
先选中页标头中的所有标签,并将其移到页标头带区的顶部,然
后对细节带区中的所有域 控件进行同样的处理。
再将鼠标移到页标头分隔带上,按住左键向上移动,调整页标头
带区的宽度,用同样的方法调整细节带区的宽度。若要精确设置
宽度,可以双击分隔带弹出对话框。
在高度微调框
中调整高度。
再单 【 确定 】
2010-5-20 Visual FoxPro 6.0程序设计 114
第 5步:在页注脚中设置报表页码。
方法基本同上一步,只不过在“表达式生成器”对话框中不是从
“字段”列表框中选择,而是从“变量”列表框中选择
,_pageno”。
在此报表中,数据之间没有分隔线,若要求要有网格线,也可以
用同上的基本方法,在“页标头”中的字段名上加上方框线,在
“细节”中的域控件上加分隔线。
在工具栏上单击“矩形”按钮,然后在“页标题”带区划一个矩形框。
再单击工具栏上的“线条”按钮,然后在标签间划竖向分隔线。然后再在细
节带区域控件的下部划一条水平线,再在域控件的中间及前后划竖向分隔线。
2010-5-20 Visual FoxPro 6.0程序设计 115
报表设计完成后,可以先单击系统菜单“常用”工具栏上的打
印预览按钮,查看报表设计的效果,如果不满意还可以用上述方
法进行修改,如果满意则可以结束“报表设计器”的设计工作,
将报表保存到预定的目录中。 预览结果如下:
2010-5-20 Visual FoxPro 6.0程序设计 116
3、修改报表文件
要修改已生成的报表文件,应先将它打开。 在项目管理器的
“文档”选项卡中选择“报表”,并在展开的报表列表中选择要
修改的报表,然后单击项目管理器上的 【 修改 】 按钮。如对刚建
立的 Student报表。
在“报表设计器”中可以用建立报表的方法修改已存在的报表。
2010-5-20 Visual FoxPro 6.0程序设计 117
4、规划数据位置
下图说明了报表中可能出现的各类带区以及每个带区应放置的
数据等典型内容。
2010-5-20 Visual FoxPro 6.0程序设计 118
用“报表设计器”设计报表时,报表中要用的数据以及各数据在
报表中什么位置显示和打印,均要在设计时加以考虑,这就是对
报表布局的规划。通过规划报表布局,可以设计和修改数据在报
表页面上的位置。将数据对象放在报表中的不同的带区,将有不
同的显示结果,例如,如果将数据对象放在报表的“标题”带区
中,则此数据在报表中只显示或打印一次,但如果将表的字段对
象放在报表的“细节”带区中,则可以每条记录显示或打印一次。
可以用下表决定所要使用的带区以及在带区中应放入何种控件。
返回
2010-5-20 Visual FoxPro 6.0程序设计 119
8.2 报表与标签的布局和数据
8.2.1 重定义页面布局
8.2.2 在域控件中使用表达式和函数
返回 退出
8.2.3 定义报表变量
8.2.4 域控件的格式化
2010-5-20 Visual FoxPro 6.0程序设计 120
8.2.1 重定义页面布局
在报表中,可以定义多个列,也可以改变页面中的带区的高度,
从而重新设计页面布局。
1、在页面上定义多个列
若要定义多个列的报表,可以:
( 1)在 【 文件 】
菜单上选择 【 页面
设置 】,打开“页
面设置”对话框,
如图。
输入页面所需的数目,该
数目就是一页上将要排列
显示和打印的记录列数。
输入列的宽度值。
输入所需要的列间
距,若在“列数”
框中只设 1列,则
“间隔”框为不可
选。
输入报表的左页边
距值。 按钮用于设置报
表中多列显示时
数据打印的顺序
( 2)根据要求在
对话框中进行设置,
最后选择 【 确定 】,
“报表设计器”将
反映出设置的改变。
2010-5-20 Visual FoxPro 6.0程序设计 121
2、设置报表带区高度
在设计报表时,可以改变报表带区的高度。报表带区的高度是指
一个报表带区可用的页面空间(在页边距的范围内)。例如:如
果“标题”带区设置为 2英寸,则“标题”将在顶部页边距下 2英
寸区域内显示和打印。“细节”带区指定每个要显示的记录所需
要的区域。对于“组标头”和“页注脚”带区,还可以设置附加
的参数。
若要精确设置带区的高度,可以通过先双击相应带区的条形栏,
在出现的一个与该带区对应的对话框中的“高度”框中输入所需
要的高度值,然后再单击 【 确定 】 。
带区高度设置在前文已作说明。
返回
2010-5-20 Visual FoxPro 6.0程序设计 122
8.2.2 在域控件中使用表达式和函数
在报表或者标签中,可以包含域控件来显示一些表达式。例如,
表或视图的字段、内存变量,以及它们之间的运算的值等。
1、添加域控件
用户可以使用几种方法向报表中添加域控件,在上一节的报表设
计中介绍了二种方法。一是直接使用工具栏上的域 控件按钮向报
表中添加域 控件;二是从“数据环境设计器”中添加表的字段作
为域控件。
2、插入字段连接构成的域控件
把表的字段添加到报表之后,在预览时可能会看到这些字段没有
按照在页面上所希望的方式显示。有时想要将几个字段连在一起
显示,这时可以将这些字段连成一个域表达式,同时删除多余的
空格。每个控件所对应的值所需的空间可能不同,这时可以适当
调整控件。若要将几个字段连接成为一个域表达式,可以按以下
步骤进行:
2010-5-20 Visual FoxPro 6.0程序设计 123
( 1)选择“报表控件”工具栏中的“域控件”,在报表中插入
一个域控件。将域控件的大小设为表达式求值后所必须的最小值。
也可以先双击一个选中的域控件,然后在“报表表达式”对话框
中的“溢出时伸展”前的复选框中做上选中标记,使它能够在表
达式求值后需要更多的空间时自动伸展;若所需空间较小,则控
件不会缩小,但控件的所占的空间不会比在设计时设定的更小。
在带区的最上一个域控件可
设置为“相对带区顶端固定”
和“溢出时伸展”。







在带区最上一个域 控件下面
的其它域控件要设为浮动。
2010-5-20 Visual FoxPro 6.0程序设计 124
( 2)在“报表表达式”对话框中,选择“表达式生成器”按钮。
( 3)在弹出的“表达式生成器”中,从“字符串”框中选择
Alltrim(expC)函数。该字符串出现在“报表字段的表达式”框中,
同时选定了 expC。
( 4)在“字段”列表框中双击想要在控件中显示的第一个字段
名。该字段名将代替“报表字段表达式”框中的 expC。在字段名
后输入一个,+”号也可以从“字符串”函数框中选择一个,+”号。
( 5)重复上面的第三步和第四步来处理其它字段,直至完成表
达式,再选择 【 确定 】 。
( 6)在“报表表达式”对话框中选择“溢出时伸展”。在显示
报表时,若设计时设定的控件大小不能包含其中的表达式的值,
则控件自动向后伸展,直至完全能够显示整个值。
为了将几个字段合为一个表达式,对每个字段名前使用
ALLTRIM()函数,要注意,此函数只能用于字符型字段,若字段
为非字符型字段,则还要使用转换函数,将非字符型值转换为字
符型的值。而每个表达式元素之间用,+”号连接。
返回
2010-5-20 Visual FoxPro 6.0程序设计 125
若要在报表中操作数据或显示计算结果,则需要用到报表变量。
使用报表变量可以计算与报表数据环境中提供的数据有关的各种
值,并且可以用这些值
来计算其它一些值。
如果要使用报表变量,
则必须在使用前先定
义。
1、定义报表变量
若要定义报表变量可以使
用下述方法:
( 1)若已经建立了报表,
则先将报表打开;若还没
有建立报表,则创建一个
新报表。
( 2)从系统菜单中选择
【 报表 】 |【 变量 】,将弹
出图示的“报表变量”对
话框。
( 3)输入一个变量名
( 4)输入一个变量名或一个其它的
表达式,也可以单击后面的按钮,再
在弹出的“表达式生成器”中用前面
已经介绍过的方法创建一个表达式。
( 5)如果
需要,还
可以从
“计算”
列出的七
种计算方
式中任选
一种作为
该表达式
的计算选
项。系统
默认值为
“不计
算”。
( 6)如果需要,也可
以定义一个初始值或
初始值的表达式。
( 7)重复操作
定义完成后单击
8.2.3 定义报表变量
2010-5-20 Visual FoxPro 6.0程序设计 126
定义一个报表变量 nCount,用存保存表中一个班级的人数
第 1步:在项目管理器中选择“文档”选项卡中的 Student报表后单击 【 打开 】 。
第 2步:从系统菜单中选择 【 报表 】 |
【 变量 】,打开“报表变量”对话
框。
第 3步:输入报表变量名 nCount。 nCount
第 4步:输入一个变量名或一个其它的表达式 第 5步:选择总和作
为变量的计算方式
第 6步:初始值取系统默认值 0。
第 7步:单击 【 确定 】
结束变量定义
第 8步:在报表的页注脚区域添加一
个域控件,该域控件的表达式选择
变量中已定义的变量 nCount。
2010-5-20 Visual FoxPro 6.0程序设计 127
2、重新排序报表变量
报表变量是根据它们出现的先后顺序来计算的,并且影响引用
这些报表变量的表达式的值。例如,如果定义一个变量时,用
到了另外一个变量,那么被引
用的报表变量应该在引用之前
先出现(先被定义)。
若要更改报表变量的顺序,
可以先从“报表”菜单中选择
“变量”,打开“报表变量”
对话框。 在“报表变量”对话框中的
“变量”列表框中拖动其左边
的“移动”按钮,便可以重新
调整所定义的报表变量的顺序。
调整完成后按 【 确定 】 按钮。
返回
2010-5-20 Visual FoxPro 6.0程序设计 128
8.2.4 域控件的格式化
在插入一个域控件后,可以改变控件的数据类型和显示格式。数
据类型可为:字符型、数值型或日期型。每个数据类型都有自己
的格式选项,其中包括用户建立自己格式模板的选项。当打印报
表或标签时,格式可以控制字段的显示。
可以在“报表表达式”对话框的“表达式”框中直接输入格式函
数,也可以在“格式”对话
框中进行选择。下面列
出一些可能遇到的典型
情况:可能需要将所有
的输出字母转化为大写,
也可能需要用逗号或小
数点分隔数值输出,或
用货币格式显示数值输
出,将日期类型的输出
转化为其他格式等等。
2010-5-20 Visual FoxPro 6.0程序设计 129
1、报表控件的格式化选项
在域控件中,可以对每种数据类型设置不同的格式选项。若要将
一个域控件格式化,可以先双击“域控件”,然后在“报表表达
式”对话框中,选择“格式”对话框后的按钮,为该字段选择数
据类型:“字符型”、“数值型”或“日期型”,“编辑选项”
区域将会显示该数据类型下的各种格式选项。如图 8-18所示。最
后选择对齐方式和所需的格式选项。
域控件
1、双击“域 控
件”,如“学号”
2、单击“格式”按钮
字段为字符型则自
动选定为“字符型”
3、取消“左对齐”格式 再选择“居中对齐”
4、单击 【 确定 】
2010-5-20 Visual FoxPro 6.0程序设计 130
1、报表控件的格式化选项
在域控件中,可以对每种数据类型设置不同的格式选项。若要将
一个域控件格式化,可以先双击“域控件”,然后在“报表表达
式”对话框中,选择“格式”对话框后的按钮,为该字段选择数
据类型:“字符型”、“数值型”或“日期型”,“编辑选项”
区域将会显示该数据类型下的各种格式选项。如图 8-18所示。最
后选择对齐方式和所需的格式选项。
1、双击“域 控
件”,如“学号”
表示居中对齐
单击 【 确定 】
返回到报表后,在
域控件看不到所定
义的格式,格式只
在显示或打开时有
效。
2010-5-20 Visual FoxPro 6.0程序设计 131
2、在域中对齐文本
在域控件中对齐文本不会改变控件在报表上的位置,只是在控件
内对其内容进行格式调整。有两种方法可以调整控件中内容的位
置。要直接在域控件中调整文本对齐,可以:①选择要操作的控
件。②在 VFP系统菜单上选择 【 格式 】 |【 文本对齐方式 】 。③
从该子菜单中选择合适的选项。
要在域中调整
文本对齐,可以
按上例的方法在
“格式”选项中
调整文本对齐方
式。
2010-5-20 Visual FoxPro 6.0程序设计 132
3、定义域格式模板
格式模板允许自己定义域中数据的格式。在“报表表达式”对话框的“格式”
框或者“格式”对话框里输入一系列普通字符或代码,就可以建立各种打印
格式。所输入的普通字符将与域中的值一同出现在域中,而输入的代码则用
来确定字段输出的外观。例如,如果为一个十位数的数值字段指定如 (999)
999-9999所示的格式模板,那么,像括号、空格和破折号这样的字符将和数
值型数据一起打印。
4、改变字体
对于每个域控件或标签控件,可以改变字体和文本的大小,还可改变整个报
表的默认字体。要在一个报表中改变字体和字号,可以:
①选择控件。
②从系统菜单中选择 【 格式 】 |【 字体 】,这时出现“字体”对话框。
③选择合适的字体和大小,然后单击 【 确定 】 。
若要改变默认的字体,可以:
①从系统菜单中选择 【 报表 】 |【 默认字体 】 。
②在“字体”对话框中,选择需要作为默认值的合适字体和大小,然后单击
【 确定 】 。只有在改变默认的字体后插入的控件才反映出新的字体设置。对
于已存在的对象,须将它们全部选定,然后再使用 【 格式 】 菜单上的 【 字体 】
选项修改设置。
返回
2010-5-20 Visual FoxPro 6.0程序设计 133
8.3 集成查询和报表
8.3.1 集成查询的报表
8.3.2 用查询收集用户输入
返回 退出
2010-5-20 Visual FoxPro 6.0程序设计 134
8.3.1 集成查询的报表
在创建好了应用程序的各个组件之后,就可以将它们集成起来。
下图显示了将查询和报表添加到应用程序的一些方法。
2010-5-20 Visual FoxPro 6.0程序设计 135
8.3.1 集成查询的报表
VFP中的报表在一般情况下总是和其它应用程序一同使用的,对
于利用 VFP开发的应用系统而言更是如此。提供给用户的是一些
简单、明了、易操作的表单界面,只是由用户根据自己要达到的
目的在表单上选择不同的对象达到各种要求。这就要求应用程序
设计人员将报表和标签功能有机地集成到其它应用程序中。
为了达到上述要求,可以将执行查询或报表的代码添加到应用程
序的表单按钮、菜单上的一个选项或工具栏上的一个按钮等对象
中。若要添加查询、视图或程序,可将 DO或 USE等命令添加到
表单命令按钮、工具栏按钮或菜单项的相关代码中。例如,如果
想在一个表单中由用户通过单击表单上的按钮来运行一个查询、
程序或打开一个视图,则可以建立如图所示的表单:
在 Click事件代码
中添加 DO Myqu-
ery.qpr( Myquer-
y.qpr用实际要运行
的查询文件替
换) 。
在 Click事件代码中添加 DO
MyProgram( MyProgram要用
实际要运行的程序文件替换)
Click事件代码中添加 USE
MyView( Myview要用实
际要打开的视图文件替换)
2010-5-20 Visual FoxPro 6.0程序设计 136
若将报表加入到应用程序时,有以下几种选择:
■如果只是想让用户简单地启动报表并得到打印结果,可以把
REPORT命令添加到表单控件、菜单命令或工具栏按钮中。
■如果报表中用到的某些变量允许用户输入,则可以像参数化查
询那样从用户那里获得变量的值,或从表单中某些文本框获得变
量值等。
■如果想让用户创建自定义报表,可以向用户提供使用报表设计
器创建新报表或修改已有报表的能力。
若要运行报表和标签, 则要使用 REPORT或 LABEL命令 。
1,REPORT命令
格式,REPORT FORM <报表文件名 >/<? > [<范围 >] [FOR <条
件 >] [WHILE <条件 >] [HEADING <标题文本 >] [PREVIEW
[WIINDOW <窗口名 >]] [TO PRINTER [PROMPT]]/[TO FILE <
文件名 > [ASCII]] [SUMMARY]
功能,根据报表定义文件显示或打印报表。
2010-5-20 Visual FoxPro 6.0程序设计 137
参数描述,
<报表文件名 >,指定报表定义文件的名称。
<?>,显示“打开”对话框,从中可以选择报表文件。
[HEADING <标题文本 >],指定放在报表每页上的附加标题文本。
PREVIEW [WIINDOW <窗口名 >],以页面预览方式显示报表,
而不把报表送到打印机中打印。
TO PRINTER [PROMPT],把报表送到打印机打印。包含
PROMPT子句在打印前显示设置打印机的对话框。可调整的打
印设置取决于当前安装的打印机驱动程序。
TO FILE <文件名 > [ASCII],指定报表要送往的文本文件。包
含 ASCII子句可用报表定义文件创建一个 ASCII文本文件。
SUMMARY,不打印细节行,只打印总计和分类总计信息。
例如,要将当前目录中的 Student报表送到打印机打印出来,可
使用下面的命令:
REPORT FORM Student TO PRINTER PROMPT
2010-5-20 Visual FoxPro 6.0程序设计 138
功能,根据表文件和标签文件打印标签 。
参数描述:
FORM <标签文件名 >,指定要打印的标签所对应的标签定义文
件名 。 若标签定义文件不在当前目录中, 则必须指定目录 。
FORM <? >,显示, 打开, 对话框, 从中可以选择一个已经定
义了的标签定义文件 。
PREVIEW <NOWAIT>:在预览窗口中显示标签而不打印 。 若
包含可选项 NOWAIT,则在运行时 VFP将不等待关闭, 页面预览,
窗口, 而是在该窗口打开的情况下继续往下执行 。
SAMPLE,显示并打开一个样本来检验标签的对齐方式 。
TO PRINTER [PROMPT],把标签送到打印机打印 。 包含
PROMPT子句在打印前显示设置打印机的对话框 。
2,LABEL命令
格式,LABEL [FORM <标签文件名 >/FORM <? >] [<范围 >]
[FOR <条件 >] [WHILE <条件 >] [PREVIEW <NOWAIT>]
[SAMPLE] [TO PRINTER [PROMPT]]
返回
2010-5-20 Visual FoxPro 6.0程序设计 139
8.3.2 用查询收集用户输入
以打印学生情况报表为例,说明用查询收集用户输入的方法。
在 Student.dbf表中如果有很多的记录,而在打印报表时又不想一
次将所有记录打印出来,而只想以班级为单位有选择性的打印,
则可以先建立表单如图所示。
在 Combo1组合框中,将 RowSourceType属性设置为 3-SQL语句,将 RowSo-
urce属性设置为:
SELECT DISTINCT 班级 FROM STUDENT INTO CURSOR BJCX
通过 SQL查询语句,将 Student表中所有的班级在 Combo1组合框中列出来供
用户操作时进行选择。其中 BJCX为保存查询结果的临时表文件名,若省略
INTO CURSOR BJCX子句,则在执行表单时,SELECT命令执行的结果将会
在浏览窗口中显示。
2010-5-20 Visual FoxPro 6.0程序设计 140
在 【 打印 】 按钮的 Click事件中添加如下代码:
SELECT * FROM STUDENT WHERE STUDENT.班级 =THISFORM.COMBO1.VALUE;
INTO CURSOR CURSOR_BJ &&用查询收集用户的输入
*****以下程序是由用户选择是预览报表还是要打印报表 *****
MM=MESSAGEBOX('想要预览, STUDENT”报表吗? ',35,"打印 Student报表 ")
IF MM=6
REPORT FORM D:\XSGLXT\REPORTS\STUDENT PREVIEW
ELSE
IF MM=2
RETURN
ENDIF
ENDIF
MM=MESSAGEBOX('想要打印, STUDENT”报表吗? ',33,"打印 Student报表 ")
IF MM=1
REPORT FORM D:\XSGLXT\REPORTS\STUDENT TO PRINTER PROMPT
*****上一行命令中加下划线的部分是指定要运行的报表文件名,若
不在当前 *****目录下,则要加上路径 。
ELSE
RETURN
ENDIF
2010-5-20 Visual FoxPro 6.0程序设计 141
要注意:建立的 Student报表要将其中数据环境中的表移去,即在
报表的数据环境中不含有任何表。
对于本例,也可以不用 SQL查询语句而直接使用 REPORT命令,
即将 SELECE命令删除,在 REPORT语句中增加下列可选项:
FOR 班级 =THISFORM.COMBO1.VALUE
其中,THISFORM.COMBO1.VALUE是对用户选择的引用。即通
过 REPORT命令的条件子句,对表中的记录进行筛选,从而达到
按用户选择的班级输出报表的目的。
返回
2010-5-20 Visual FoxPro 6.0程序设计 142
8.4 报表和标签的输出
8.4.1 为控件设置打印选项
8.4.2 为组设置打印选项
返回 退出
8.4.3 控制报表和标签的输出
2010-5-20 Visual FoxPro 6.0程序设计 143
8.4.1 为控件设置打印选项
总的来说,控件的位置和它所处的带区的位置决定了它打印时的
位置和时间。除此之外,还可以为每个控件设置特定的打印选项。
每个控件都有一个默认的尺寸,该尺寸或是由它的值(对于字段
或标签来说)决定,或是在创建该控件的时候确定(对于线条、
矩形或者图形来说)。控件在页面上的长度指定了该控件的显示
宽度。由于有些控件的值根据记录的不同而不同,可将控件的高
度设置为可向下伸展,以显示整个的值,否则,有些数据将在显
示的时候被截断。除了标签控件之外,所有的控件的大小均可变。
1、打印变长度值的控件
为了使控件尽可能少的占用报表的地方,可将其设置为可伸展的。
例如,一个表达式的值可能依记录的不同而不同,这时,最好不
要在报表上为这个控件分配一个固定的可容最长记录值的空间,
而应将控件设置为可伸展,即可容纳所有的数值。对于该控件下
方的控件,可将其设置为可向下浮动的。
2010-5-20 Visual FoxPro 6.0程序设计 144
注意,在如下情况下,某些数据在打印时会被覆盖:
( 1)将一个域设置为相对于带区底端固定,同时在这个域的下
面还有一个域,设置为相对于带区顶端固定并且选择了溢出时伸
展选项;
设置为相对带区底端固定
高度就被固定了
带区
向下浮动时没有空间
( 2)将一个域设置为相对于带区顶端固定,同时在这个域的上面
还有一个域,设置为相对于带区顶端固定并且选择了溢出时伸展选
项。
设置为相
对带区底
端固定
带区
高度被
固定
没有溢出时伸展的空间
2010-5-20 Visual FoxPro 6.0程序设计 145
2、不输出重复值
对于域控件,可以不输出连续记录的重复值。也就是说,如果某
域中的同一个值在连续的记录中重复出现,则只须在第一次出现
时打印该值,在后面的记录中不打印该值,直至数值发生改变。
若要不输出重复值,可以先双击该控件,在显示控件的对话框中
选择“打印条件”以显示“打印条件”对话框,在该对话框中的
“打印重复值”区域,选择“否”,然后选择 【 确定 】 。
1、双击域 控件如“系
部代号”
2、单击 【 打印条件 】
6、在“文本”对话框
中单击 【 确定 】
7、预览显示报表数据
3、选择“否”
5、单击 【 确定 】4、选择“在新页 /列的第一个完整信息带内打
开”和“当细节区数据
溢出到新页 /列时打印”
2010-5-20 Visual FoxPro 6.0程序设计 146
系部代号与上一条
记录相同不打印
选择“在新页/列的第一个完整信息带内打印”指定换页(或列)
后,遇到第一个新记录时,打印重复值。
选择“当细节区数据溢出到新页/列时打印”指定当细节带区内
容溢出到新页(或列)中时,输出重复值。
3、建立打印表达式
可以为控件设置表达式,该表达式在打印之前被计算出来。如果
表达式的值为“假”,则不打印该字段。添加表达式之后,在
“打印条件”对话框中除了“若是空白行则删除”选项外,其他
选项全部
2010-5-20 Visual FoxPro 6.0程序设计 147
无效。若要添加一个打印表达式,可以先双击该控件,再选择
“打印条件”,然后在“仅当下列表达式为真时打印”框中,输
入一个表达式。或者单击对话按钮,使用“表达式生成器”建立
一个表达式,最后选择 【 确定 】 。
4、不打印空行
对于报表中的某些域控件,记录中往往会没有数值。默认情况下,
VFP将为那些空的域保留区域。可以将这些空白的区域清除,使
所显示的信息更为理想、更为连续。
若要不打印空行,可以先双击在报表中可能会引起空行的控件,
再选择“打印条件”,然后选择“若是空白行则删除”,最后选
择 【 确定 】 。
如果一行中所有域的值经计算后都为空,则 VFP从报表中删除此
行。如果不打印该域,或者域中的值为空,VFP将会检查该行的
其他控件:找不到的话,此行被删除。如果没有选择该选项,而
且该行中没有其他的控件,那么会打印一个空行。
返回
2010-5-20 Visual FoxPro 6.0程序设计 148
8.4.2 为组设置打印选项
在报表中,可以对组的打印方式进行控制。有时可能希望同一个
组中的内容不要跨页显示;有时可能希望控制是否打印组标头。
1、设置组的分页及组标头选项
(1)在系统菜单中选择 【 报表 】 |【 数据分组 】
在“数据分组”对话
框中,除了可选择
(或输入)用于分组
的域或表达式外,还
可以对组的分页选项
进行设置 。如:
Left(学号,2)
对组(及其标头)
的显示可能有特
别的要求。比如,
可能希望一个组
不要横跨两列
(对于多列的报
表);不要纵跨
两页;或者每一
组的页码都从 1
开始重编。
该对话框提供了
四个选项来完成
这些任务。
2010-5-20 Visual FoxPro 6.0程序设计 149
2、防止出现孤立的组标头
设置合适的值,可
以 防止出现孤立的
组标头
如果标头和底部的
相对位置比所规定
的尺寸(用英寸或
厘米表示)要小,
VFP会将标头移到
新的一页中打印。
注意:为了给孤立
控件确定一个比较
理想的值,可以将
组标头带区的高度
扩大到细节带区高
度的一至三倍。
在组纵跨两页时,
可能需要在新的一
页中重复打印组标
头,将其显示在连
续信息的顶部。如
果报表中存在嵌套
的多个数据组,那
么在连续页中,标
头应是嵌套结构中
最内层的组的标头。
所以,应该将所有
组标头中要打印的
控件放置在最内层
的组标头带区中。
3、重复输出组
标头
选择“每页都打印组标题”,可以
重复输出组标头
返回
2010-5-20 Visual FoxPro 6.0程序设计 150
8.4.3 控制报表和标签的输出
使用 REPORT或 LABEL命令的下列某一关键字,可以控制报表
和标签输出到什么地方,PRINT,PREVIEW或 FILE,如果不使
用任何关键字,报表将输出到屏幕或活动窗口。
PRINT——输出到打印机;
PREVIEW——在系统默认窗口显示;
FILE——输出到文件。
1,选择要打印的记录
在打印一个报表时, 若要限制在报表中出现的记录, 可以使用筛
选条件:
■ 指定一定数量或者范围内的记录 。
■ 使用 FOR表达式, 选择满足条件的记录 。
■ 使用 WHILE表达式选择记录, 直到找到一个不满足条件的记录 。
可以任意组合使用上述方法, 使用 WHILE表达式将忽略其他的条
件 。
2010-5-20 Visual FoxPro 6.0程序设计 151
(1)打印一定数量或者范围内的记录
限制记录数目的一种方法是指定一定数量或者一定范围内的记录。
使用“范围”选项,可以在文件中选择单个记录或者一组连续存
放的记录。
注意:活动的索引或者当前记录的指针会影响 [<范围 >]子句中
Next和 Rest选项,但 Record选项不会受影响,这是因为当表被设
置索引之后,表中每个记录号并不会变化。
若要选择一定数目的记录,
可以从选择 【 文件 】 |【 打印 】
单击 【 选项 】
单击 【 选项 】
设置“作用范围”可以打印
一定数量或者范围内的记录
(2)打印满足某个条件的
记录
在此设置条件
ALLTRIM(班级 )="99电子 "
2010-5-20 Visual FoxPro 6.0程序设计 152
2、打印报表和标签
若要把报表送到打印机,可以直接将它输出到打印机,也可以先显示“打
印设置”对话框。若要将报表送到打印机,可以 REPORT命令或 LABEL命令
中使用 TO PRINTER关键字。
REPORT FORM C:\GXGLXT\STUDENT TO PRINTER PROMPT
如果想在指定的窗口中预览结果, 可以使用 WINDOW子句指定这个窗口, 该
窗口或是一个表单, 或是一个用 DEFINE WINDOW命令建立的窗口 。 例如下
面的命令将报表输出到自定义的窗口 MYPREVIEWWINDOW中预览 。
REPORT FORM D:\XSGLXT\REPORTS\STUDENT PREVIEW WINDOW ;
MYPREVIEWWINDOW
若要创建一个报表的电子版本,可以将它发送到一个打印机格式的文件中,
或者发送到一个 ASCII文件中。把报表发送到文件中,可以方便以后用打印
机成批打印。
若要创建 ASCII文件, 可以创建一个仅包含文本, 虚线和加号以代表线条和
形状的文件, 但文件中不包含对字体和颜色的设置 。 此外, 还可以指定每行
的字符数和每页的行数 。 将报表打印到 ASCII文件中, 可以在 REPORT命令中
使用 FILE和 ASCII关键字 。 如:
REPORT FORM D:\XSGLXT\REPORTS\STUDENT TO FILE MYTILE ASCII
返回
2010-5-20 Visual FoxPro 6.0程序设计 153
小 结
1、利用报表向导设计报表和标签。
2、利用报表设计器设计报表,报表工具栏中各控件的作用及使
用。
3、重定义报表的页面布局。
4、报表中的域控件的使用方法,域控件的溢出伸展设置方法。
5、定义报表变量及报表变量在报表中的作用。
6、将报表集成到应用程序中,使用表单收集用户的输入信息。
7、报表的输出命令,REPORT。
8、为控件设置打印选项及控制报表的输出。
返回