2009-7-26 Visual FoxPro 6.0程序设计 1
学习要点
1、表单的基本设计方法,单表表单和多表表单在设计上的不同点,表单关系;
2、向表单中添加控件的方法;
3、常用控件的功能和使用方法;
4、常用控件所具有的事件;
5、方法程序的编写;
6、使用表单解决数据输入和输出问题。
第 7章 VFP6表单设计
2009-7-26 Visual FoxPro 6.0程序设计 2
第 7章 VFP6表单设计
7.1 设计表单
7.2 向表单中添加对象
7.3 处理对象
7.4 管理表单小 结返回 退出
7.5 控件使用要点和技巧
2009-7-26 Visual FoxPro 6.0程序设计 3
7.1 设计表单
7.1.1 设置数据环境
7.1.2 创建单文档和多文档界面
7.1.3用表单集扩充表单返回 退出
2009-7-26 Visual FoxPro 6.0程序设计 4
7.1 设计表单表单又称为界面或窗体,是 VFP提供的一种功能强大的界面。
各种对话框和窗口都是表单的不同表现形式。它可以使用户在简单明了的界面中查看数据或将数据记录输入到表中。在表单设计器中可以处理下列内容:
■表单中不同类型的对象
■与表单相关联的数据
■顶层表单或子表单
■能一起操作的多个表单
■基于自定义模板的表单表单和表单集是拥有自己的属性、事件和方法程序的对象,在表单设计器中可以设置这些属性、事件和方法程序。表单集包含了一个或多个表单,可以将它们作为一个整体来操作。例如,
如果一个表单集中有四个表单,可以在运行时用一个命令来显示或隐藏它们。
可以通过表单向导、表单设计器和快速表单来创建表单。可以
2009-7-26 Visual FoxPro 6.0程序设计 5
用如下的三种方法之一新建一个表单:
■在“项目管理器”中选定“表单”,并选择 【 新建 】 按钮。
■在 【 文件 】 菜单中选择 【 新建 】 命令,再选定“表单”,再选择 【 新建文件 】 按钮。
■使用 CREATE FORM命令。
通过项目管理器创建表单示例
1、选择
“文档”
选项卡
2、选择
“表单”
3、单击
【 新建 】
4、进入新建表单程序,弹出“新建表单”对话框单击
“表单设计器”
窗口新表单 在新表单 (Form1)
上可以可视化地添加控件并进行属性、方法程序设计。
2009-7-26 Visual FoxPro 6.0程序设计 6
7.1.1 设置数据环境每一个表单或表单集都包括一个数据环境( Data Environment)。
数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。
在表单运行时,数据环境可以自动打开、关闭表或视图。而且,
通过设置“属性”窗口中 ControlSource(指定与对象对立联系的数据源)属性设置框,在这个属性框中列出了数据环境中的所有字段,数据环境将帮助设置控件用的 ControlSource属性。
1、常用数据环境属性
2009-7-26 Visual FoxPro 6.0程序设计 7
单击打开图片
2、向数据环境设计器中添加表或视图向数据环境设计器中添加表或视图时,可以看到属于表或视图的字段或索引。若要向数据环境中添加表或视图,可以按如下步骤来进行:
( 1)打开“数据环境设计器”,从“数据环境”菜单中选择
“添加”1、在表单上右击,
弹出表单的快捷菜单
2、在快捷菜单中单击“数据环境”
菜单项,打开
“数据环境设计器”3、添加表或视图的方法与建立查询时添加表或视图相同
4、在此框中选择
Student后单击 【 添加 】
2009-7-26 Visual FoxPro 6.0程序设计 8
在关闭了“添加表或视图”对话框后,若还想向“数据环境”
中添加表或视图,可采用以下方法之一:
■在“数据环境设计器”中右击,打开数据环境的快捷菜单,
从中选择“添加”菜单项,将“添加表或视图”对话框再次打开,添加方法与上述相同。
■ 在“数据不境设计器”处于激活状态时,系统菜单上会有
【 数据环境 】 菜单,可以单击 【 数据环境 】 |【 添加 】 将“添加表或视图”对话框再次打开。
■将要添加的表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。
若已将“数据环境设计器”关闭了,要添加表或视图时,除了用前文所介绍的在表单上右击打开表单的快捷菜单,用快捷菜单操作以外,也可以在系统菜单上单击 【 显示 】 |【 数据环境 】,将“数据环境设计器”打开,打开了“数据环境设计器”
后的添加方法与上相同。
当,数据环境设计器,处于活动状态时,,属性,窗口会显示与数
2009-7-26 Visual FoxPro 6.0程序设计 9
单击打开动画据环境相关的对象及属性。在“属性”窗口的“对象”框中,数据环境的每个表或视图,表之间的每个关系,以及数据环境本身均是各自独立的对象。
要打开“属性”窗口,
可以在表单或“数据环境设计器”
中右击,在快捷菜单上选择 【 属性 】
菜单项在“数据环境设计器”中右击,打开快捷菜单。 单击 【 属性 】
菜单项打开
“属性”窗口。
选项卡属性或方法程序列表属性值或方法程序属性及方法程序功能说明单击对象选择框
2009-7-26 Visual FoxPro 6.0程序设计 10
3、从数据环境设计器中移去表当将表从数据环境中移去时,与这个表有关的所有的关系也随之移去。若要将表和视图从数据环境设计器中移去,可以:
( 1)在“数据环境设计器”中选择要移去的表或视图。
( 2)在“数据环境”快捷菜单中选择 【 移去 】 命令。
在“数据环境设计器”中选择要移去的表或视图。
在选定表或视图上右击,打开快捷菜单。
单击 【 移去 】
2009-7-26 Visual FoxPro 6.0程序设计 11
4、在数据环境设计器中设置关系如果添加进数据环境设计器的表具有在数据库中设置的永久关系,
这些关系将自动地加到数据环境中。如果表中没有永久的关系,
可以在数据环境设计器中设置这些关系。
要在数据环境设计器中设置这些关系,
可以将字段从主表拖到相关表中的相匹配的索引标识上。
也可以将字段从主表拖到相关表中的字段上。如果和主表中的字段对应的相关表中没有索引标识,系统将提示是否创建索引标识。
1、先向表单的“数据环境设计器”添加两个表,
如图按“学号”字段设置 Student表与 Grade表的一对多关系:
在“数据环境设计器”中的 Student表中选择“学号”字段并将其拖到 Grade表的“学号”字段上。
右击表间的关系连接线打开快捷菜单
2009-7-26 Visual FoxPro 6.0程序设计 12
在快捷菜单中单击“属性”,打开属性窗口:
在属性选择列表中选择 OneToMany
单击“属性选择框”弹出属性值选择,T.-真表达式生成器按钮取消按钮确定按钮属性选择框将两表设置为一对多关系父表别名如果在建立关系前 Grade表没有按关联字段(学号)建立索引,则在将
“学号”从 Student表中拖到 Grade表时将弹出对话框:
单击 【 确定 】 时系统将先按“学号”
为 Grade表建立索引,然后才建立两表间的关系。
2009-7-26 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.),甚至在数据库中已经建立了永久一对多关系时也必须如此。
返回
2009-7-26 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应用程序的表
2009-7-26 Visual FoxPro 6.0程序设计 15
表单。子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。
■浮动表单:属于父表单(主表单)的一部分,但并不是包含在父表单中。而且,浮动表单可以被移至屏幕的任何位置,但不能在父窗口后台移动。若将浮动表单最小化时,它将显示在桌面的底部。若父表单最小化,则浮动表单也一同最小化。浮动表单也可用于创建 MDI应用程序。
■顶层表单:没有父表单的独立表单,用于创建一个 SDI应用程序,或用作 MDI应用程序中其他子表单的父表单。顶层表单与其他 Windows应用程序同级,可出现在其前台或后台,并且显示在
Windows任务栏中。
1,指定表单类型创建各种类型表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且还需指定是否是 MDI类的子表单,
2009-7-26 Visual FoxPro 6.0程序设计 16
即指出表单最大化时是如何工作的。如果子表单是 MDI类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单以及工具栏。非 MDI类的子表单最大化时将占据父表单的全部用户区域,
但仍保留它本身的标题和标题栏。
若要建立一个子表单,可以:
■用“表单设计器”创建或编辑表单。
■可将表单的 ShowWindow属性设置为下列值之一:
● 0-在屏幕中:子表单的父表单将为
VFP的主窗口。
● 1-在顶层表单中。当子窗口显示时,
子表单的父表单是活动的顶层表单。
如果希望子窗口出现在顶层表单窗口内,而不是出现在 VFP主窗口内时。
可选用该项设置。
2009-7-26 Visual FoxPro 6.0程序设计 17
■ 如果希望子表单最大化时与父表单组合成一体,可设置表单的
MDIForm属性(指定表单是否为 MDI窗口)为“真” (.T.);如果希望子表单最大化时仍保留为一独立的窗口,可设置表单的
MDIForm属性为“假” (.F.)。
浮动表单是由子表单变化而来。若要指定为浮动表单,可以:
■用“表单设计器”创建或编辑表单。
■可将表单的 ShowWindow属性设置为以下值之一:
● 0-在屏幕中。浮动表单的父表单将出现在 VFP主窗口。
● 1-在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表 单。
■将表单的 DeskTop属性(指定表单是否包含在 VFP主窗口中)
设置为“真” (.T.)。
若要指定顶层表单,可以:
■用“表单设计器”创建或编辑表单。
■将表单的 ShowWindow属性设置为,2-作为顶层表单”。
2009-7-26 Visual FoxPro 6.0程序设计 18
2、显示位于顶层表单中的子表单如果所创建的子表单中的 ShowWindow属性设置为,1-在顶层表单中”,则不需直接指定一顶层表单作为子表单的父表单。而是在子窗口出现时,VFP指派成为该子表单的父表单。
若要显示位于顶层表单中的子表单,可以:
■创建顶层表单。
■在顶层表单的事件代码中包含 DO FORM命令,指定要显示的子表单的名称。例如,在顶层表单中建立一个按钮,然后在按钮的 Click事件代码中包含如下的命令,如图所示:
注意,在显示子表单时,顶层表单必须是可视的、活动的。
因此,不能使用顶层表单的
Init事件来显示子表单,因为此时顶层表单还未激活。
■激活顶层表单,如有必要,触发用以显示表单的事件。
2009-7-26 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,在顶层表单中添加菜单若要在顶层表单中添加菜单,可以:
■ 创建顶层表单的菜单 。
返回
2009-7-26 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文件中用单独的数据
2009-7-26 Visual FoxPro 6.0程序设计 21
环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录指针则被更新和显示。
注意:运行表单集时,将加载表单集所有表单和表单的所有对象。
加载带着很多控件的多个表单会花几秒钟的时间。
1,创建表单集表单集是一个包含有一个或多个表单的父层次的容器 。 可在,表单设计器,中创建表单集,若要创建表单集,可从,表单,菜单中,选择,创建表单集,选项 。
如果不需要将多个表单处理为表单组,则不必创建表单集 。 创建表单集以后,则可向其中添加表单 。
2,添加和删除表单创建了表单集以后,可添加新表单或删除表单 。 若要向表单集中添加附加的表单,可从,表单,菜单中选择,添加新表单,。
若要从表单集中删除表单,可以:
■ 在,表单设计器,,属性,窗口的对象列表框中,选择要删除的
2009-7-26 Visual FoxPro 6.0程序设计 22
表单。
■从“表单”菜单中选择“移除表单”。
如果表单集中只有一个表单,可删除表单集而只剩下表单。若要删除表单集,可从“表单”菜单中选择“移除表单集”。
表单以表的格式存储在,SCX后缀的文件中。创建表单时,.SCX表包含了一个表单的记录,一个数据环境的记录,和两个内部使用记录。为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集及每个新表单添加一个附加的记录。
每个表单的父容器为表单集,每个控件的父容器为其所在的表单。
注意:当运行表单时,若不想在表单集中的所有表单的初始时就设置为可视的,可以在表单集运行时,将不准备显示的表单的
Visible属性设置为“假”(,F.)。要显示的表单的 Visib1e属性设置为“真”(,T.)。
返回
2009-7-26 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 包含预定义常量
2009-7-26 Visual FoxPro 6.0程序设计 24
7.2.1 向表单中添加 VFP容器除表单集和表单外,VFP还提供了四个基本容器类:命令按钮组、
选项按钮组、表格和页框。
若要在表单中添加容器对象,可从“表单控件”工具栏上选择所需的容器对象的按钮(表格、页框或按钮组),并在表单中拖动,
调整到所需要的大小。
文本框 选项按钮组 微调控件 页框 形状 生成器锁定标签 命令按钮组 列表框 计时器 线条 超级连接查看类 命令按钮 组合框 图象 ActiveX绑定控件 分隔符选定对象 编辑框 复选框 表 格 ActiveX控件 容 器 命令锁基本容器控件
2009-7-26 Visual FoxPro 6.0程序设计 25
在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。在表单中添加页框时,页框默认包含两个页面,将
ButtonCount属性(指定一个命令按钮组或选项按钮组中按钮的数目)或 PageCount属性(指定页框对象中所含有的页数)设置为需要的数目,可以包含更多的按钮或页面。
向表单中添加表格时,ColumnCount属性(指定表格、组合框或列表框中列对象的数目)的默认值为- 1,表示处于 AutoFill状态。这样,在运行时表格将显示与 RecordSource属性(指定与表格控件建立联系的数据源)中指定的表具有同样字段数量的列。
如果不想处于,AutoFill”状态,可以设置表格的 ColumnCou-nt
属性为指定列的数目。
VFP中的所有容器对象都有与它们相关联的记数属性和收集属性。收集属性是引用其每个被包含对象的数组,记数属性是指示其包含的对象数的数值属性。
每个容器的收集和记数属性根据包含在容器中的对象类型来命名,下表列出了容器及其相应的收集和记数属性。
2009-7-26 Visual FoxPro 6.0程序设计 26
【 例 7-1】 建立一个只含一个表格(列数由提供数据的表的字段数确定)和一个命令按钮的表单,运行表单时,表格中显示的内容底色红绿交替。
2009-7-26 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”属性,在方法程序编辑框中输入代码。
2009-7-26 Visual FoxPro 6.0程序设计 28
第 7步、采用相似的方法建立一个命令按钮,将 Caption属性(指定对象文本标题)值设置为“退出” 。
单击“命令按钮”
按钮在表单上单击,
添加“命令”按钮关闭表单控件工具栏将 Caption属性值设置为
“退出”
在此处更改并输入单击注意:二处的值被修改!
双击“退出”按钮输入事件代码
THISFORM.RELEASE 关闭“属性”窗口和事件代码编辑窗口并单击常用工具栏上的运行按钮。
表单运行结果:
单击表单上的 【 退出 】 按钮可以将表单关闭。
返回
2009-7-26 Visual FoxPro 6.0程序设计 29
7.2.2 向表单中添加 VFP控件控件工具栏能使用户很方便地在表单中添加任何一种标准的
VFP控件,常用的 VFP控件如下所示:
复选框 图像 OLE绑定型控件 文本框组合框 标签 OLE容器控件 计时器命令按钮 线条 形状编辑框 列表框 微调若要在表单中添加控件,可在“表单控件”工具栏中选择所需的控件按钮 (单击 ),在表单中单击或拖动按钮,把它调整到想要的大小。
如在上例中向表单添加了一个“表格”控件和一个“命令按钮”
控件。
返回
2009-7-26 Visual FoxPro 6.0程序设计 30
7.2.3 向表单中添加数据绑定型控件通过给控件的 ControlSource属性设置字段或给表格的
RecordSource属性设置表或视图,可使控件与表、视图、表的字段、或视图的字段中的数据相联系。但也可通过直接将表和视图从下列位置拖到表单中,以创建数据绑定型控件:
■“项目管理器”
■“数据库设计器”
■“数据环境设计器”
“表设计器”中“属性”选项卡的,FieldMapping”设置或“选项”对话框的,FieldMapping”选项卡的设置,是这种方法创建控件类的基础。
上例中将表格的 RecordSource属性设置为 Student,即是将表格的数据源与表 Student建立联系。
返回
2009-7-26 Visual FoxPro 6.0程序设计 31
7.2.4 向表单中添加用户自定义对象
VFP最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。如果创建了类,就能将它们添加到表单中。
若要基于自定义类上添加对象,可在“项目管理器”中,将类拖动到容器中,当给工具栏添加类时,也可直接从“表单控件”工具栏中添加。
1、在控件工具栏上添加类库类库必须在注册后才能在“表单控件”工具栏中显示出来。若要注册类库,可以:
①从“工具”菜单中选择“选项”打开“选项”对话框。
②在“选项”对话框中选择“控件”选项卡。
③选择“添加”按钮。
④在“打开”对话框中,选择一个要加到“选定”列表中的类库,
并选择“打开”按钮。
⑤重复步骤③和④。
“选定”列表中列出了类库中的类,在“表单设计器”中可以和
2009-7-26 Visual FoxPro 6.0程序设计 32
VFP基类一样方便地使用这些类。
注意:如果要在每次运行 VFP时“表单控件”工具栏中的类库都有效,可在“选项”对话框中,选择“设置为默认值”。
此外,也可以在“表单设计器”中直接注册类库。若要在表单设计器中注册一个类库,可以:
①在“表单控件”工具栏中选择“查看类”按钮。
②从子菜单中选择“添加”。
③在“打开”对话框中选择要添加到“表单控件”工具栏上的类库,然后选择“打开”按钮。
2,从类库中添加对象到表单如果从,选项,对话框的,类,选项卡或从,查看类,子菜单添加类库,就能在,表单设计器,中访问它们 。
若要从,表单控件,工具栏添加自定义对象,可以:
① 在,表单控件,工具栏中,选择,查看类,按钮 。
② 从已注册类库的列表中选择一个类库,它包含了要加到表单中的控件 。
返回
2009-7-26 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替换。
返回
2009-7-26 Visual FoxPro 6.0程序设计 34
7.2.6在表单中添加属性和方法程序可以添加许多个新的属性和方法程序到一个表单。属性拥有一个值,方法程序具有调用它时被运行的过程代码。新建的属性和方法程序与其它属性与方法程序的引用一样。
1、建立一个新属性如果有一个表单集,则在“表单设计器”中添加的属性和方法程序就属于此表单集。如果没有建立表单集,则属性和方法程序属于表单。
若要向表单或表单集中添加新属性,可以:
①从“表单”菜单中选择“新建属性”( New Property)命令。
②在“新建属性”对话框中,键入属性名。还可以加入关于这个属性的说明,它将显示在“属性”窗口的底部的属性描述中。
2、建立一个数组属性一个数组属性可以像其他属性一样都属于表单或表单集,但不同的是数组属性可用 VFP的数组命令和函数处理它。若要创建一个数组属性,可以:
2009-7-26 Visual FoxPro 6.0程序设计 35
① 添加新属性到表单。
②在“新建属性”对话框的“属性名”框中键入数组属性称,并包括数组的大小和维数。
例如,可在“新建属性”对话框的“名称”框中输入
myarray(10,5),去创建一个 10行 5列的二维数组,若要同时对该属性加以说明,则还可以在下部的“说明”框中输入需要对该属性进行说明的内容,如“自定义数组”等。当添加数组属性到表单时,属性作为只读显示在属性窗口中。可以在运行时管理数组,
重新设置数组的维数,也可对数组属性的元素赋值。
3,创建新方法程序也可向表单中添加方法程序,并且可以用调用表单类方法程序的方式调用它 。 若要在表单或表单集中创建一个新方法程序,可以:
① 从,表单,菜单中选择,新方法程序,。
② 在,新方法程序,对话框中,输入方法程序的名称 。 还可以包含有关这个方法程序的
2009-7-26 Visual FoxPro 6.0程序设计 36
说明,这是可选的。调用用户自定义方法程序和调用基类方法程序一样,都使用下面的语法:
ObjectName.MethodName
建立的方法程序同样可以接受参数并返回值,这种情况下,可以使用赋值语句来调用方法程序:
cVariable= ObjectName.MethodName( cParameter,nParameter)
7.2.7 包含预定义常量为了在方法程序中使用预定义常量,可在表单或表单集中用#
INCLUDE命令包含一个头文件。头文件一般包含由# DEFINE
预处理器伪指令定义的编译时的常数。
若要在表单中包含文件,可以:
①从“表单”菜单中选择“包含文件”。
②在“包含文件”对话框的“包含文件”文本框中指定文件,
或者选择对话框按钮以打开“包含”对话框并选定文件。
③选择“确定”。
返回
2009-7-26 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 在运行时设置属性
2009-7-26 Visual FoxPro 6.0程序设计 38
7.3.1 在设计时设置属性打开属性窗口会显示选定对象的属性或事件。如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。
若要设置属性,可首先在“属性”窗口中,从“属性和事件”列表中选择一个属性。然后在“属性设置”框中,为选中的属性键入或选择需要的设置。
注意:那些在设计时为只读的属性,例如对象的 Class属性,在属性窗口的“属性和事件”列表框中以斜体显示。
如果属性要求输入字符值,不必用引号将这个值括起来。例如,
要将一个表单的标题设为 Student,只需在“属性设置”框中键入
Student;若想让表单的标题是,Student”,即想让引号也出现在窗口的标题上,在“属性设置”框中键入,Student”。
通过属性窗口可以将属性设置为表达式或函数的结果。若要用表达式设置属性,可以:
2009-7-26 Visual FoxPro 6.0程序设计 39
■ 在“属性”窗口中,选择“函数”按钮来打开“表达式生成器”。
■在“属性设置”框中键入,=”号,并在后面键入表达式。
例如,如果想设置表单的 Caption属性,使它在运行表单时能够指示当前的活动表,可在,属性设置,框中键入,=Alias()。
在属性窗口中设置一个属性表达式,并在运行时刻或设计时刻初始化对象时,才对这个属性表达式进行求值 。
如果将属性设置为用户自定义函数的结果,那么当设置或修改这个属性,以及运行表单时,对这个函数进行求值 。 如果用户自定义函数出现错误,有可能打不开这个表单 。 此外,也可以在对象的 Init事件中将属性设置为用户自定义函数,如下例所示 。
This.Caption= myfunction()
其中 myfunction()为自定义函数名如果用户自定义函数出现错误,就不能运行表单,但可以修改它 。
如果要指定表单的图标,将表单的 Icon属性设置为一个,ico文件的文件名。
返回
2009-7-26 Visual FoxPro 6.0程序设计 40
7.3.2 定义表单行为当在“表单设计器”中设计表单时,表单是“可视”的。除非
Visible(指定对象是可见还是隐藏)属性设置为“假”(,F.),
对表单的外观和行为的修改将立刻在表单上反映出来。
如果将 WindowState(指定表单窗口在运行时是最大化、最小化还是采用普通大小)属性设置为 0(普通),1(最小化)或 2
(最大化),表单设计器中的表单会立即体现这一设置。
如果将 Movable属性(指定在运行时刻用户能否移动对象)设置为“假”(,F.),那么不但用户在运行时不能移动表单,即使在设计时也不能移动它。
因此应该在设置那些决定表单行为的属性之前,先完成表单的功能设计,并添加所有需要的控件。
表 7-3列出了在设计时常用的表单属性,它们定义了表单的外观和行为。
2009-7-26 Visual FoxPro 6.0程序设计 41返回
2009-7-26 Visual FoxPro 6.0程序设计 42
7.3.3 编辑事件代码和方法程序代码事件是用户的行为,如单击鼠标或鼠标的移动,也可以是系统行为,如系统时钟的进程。方法程序是和对象相联系的过程,只能通过程序以特定的方式激活。当触发事件或激活方法程序时,可以指定要执行的代码。若要编辑事件或方法程序代码,可以:
①从“显示”菜单中选择“代码”命令。
②在“过程”框中选择事件或方法程序。
③在编辑窗口中键入代码,在触发事件或激活方法程序时将执行这些代码。
例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的
Click事件中可包括这样一行代码:
THISFORM.Release
注意:若要在编辑窗口中查看不同过程,请按 【 PageDown】 或 【 PageUp】 键。
当用户单击这个命令按钮时,表单被从屏幕和内存中删除。如果不想从内存中删除表单,可以在 Click事件代码中以下一行代码来代替上一行代码:
THISFORM.hide &&将表单隐藏起来注意:如果表单集、表单或表单集中任何表单上任何对象的 Init事件代码返回
“假”(,F.),就不能创建这个表单或表单集。
返回
2009-7-26 Visual FoxPro 6.0程序设计 43
7.3.4 将表单和控件保存为类也可以将表单或表单上的控件子集保存为类定义。如果您打算创建基于表单的子类,或在其他表单中重新使用这些控件,可将表单作为类定义来保存。若要将表单或选定的控件保存为类定义,可以:
①从“文件”菜单中选择“另存为类”。
②在“另存为类”对话框中选择“当前表单”或“选定控件”。
③在“类名”框中输入类的名称。
④在“文件”框中输入保存类的文件名。
⑤选择“确定”按钮。
如果没有给出文件扩展名,保存文件时会加上默认的,vcx扩展名,
如果将表单保存为类定义,就可以用 MODIFY CLASS命令对它进行修改。
返回
2009-7-26 Visual FoxPro 6.0程序设计 44
7.3.5 运行表单可以从界面直接运行表单,或在程序代码中运行表单。
1、交互地运行表单有几种方法运行设计好的表单。如果在“表单设计器”中工作,
可通过单击“表单设计器”工具栏中的“运行”按钮测试表单。
如果想在“表单设计器”重新打开表单,可在工具栏中选择 【 修改表单 】 按钮。也可以从项目中运行表单,或者以编程方式运行它。若要以交互方式运行表单,可在“项目管理器”中,选择要运行的表单,再选择“运行”按钮。或者在“命令”窗口中,使用 DO FORM命令运行表单。也可以从 【 程序 】 菜单中选择 【 运行 】 来运行菜单,在“文件类型”框中选择“表单”,选定一个表单再选定 【 运行 】 按钮。
2、从程序中运行表单若想在程序中运行表单,需要在与事件相关联的代码、方法程序代码或在程序或过程中包含 DO FORM命令。
2009-7-26 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=”学生情况登记,
2009-7-26 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关键字允许将表单和表单对象变量
2009-7-26 Visual FoxPro 6.0程序设计 47
链接起来,如果包含了 LINKED关键字,当与表单对象相关联的变量超出范围时,表单将被释放。例如,下面命令创建一个链接到对象变量 mystud2的表单:
DO FORM Student NAME mystud2 LINKED
当释放 mystud2时,表单也关闭。
6、关闭活动的表单若想允许用户通过双击控件框,或选择表单“控件”菜单中的
“关闭”来关闭活动的表单,则需要设置表单的 Closable属性。
若要允许用户关闭活动表单,可以:
①在“属性”窗口中,将 Closable属性设置为“真”(,T.)。
②使用 RELEASE命令。
例如,可以通过在“命令”窗口或程序中发出下面的命令来关闭和释放表单 Student:
RELEASE Student
也可以在一个控件,如标题为“退出”的命令按钮的 Click事件代码中包含下面的命令,它允许用户关闭和释放表单:
2009-7-26 Visual FoxPro 6.0程序设计 48
THISFORM.Release
可以在与表单的对象相关联的代码中使用 RELEASE命令,但在 RELEASE方法程序中却不会执行包含的任何代码。
注意,当释放表单时,同时也从内存中释放了为这个表单创建的对象变量。每一个表单集有一个单独的变量,因此不释放表单集就不能释放表单集中的表单。如果想要释放表单集,可使用
RELEASE.THISFORMSET命令。如果想将一个表单从屏幕移去,
不再让用户看见或使用它,可以使用 THISFORM.Hide命令。
返回
2009-7-26 Visual FoxPro 6.0程序设计 49
7.3.6 在运行时设置属性表单由控件等对象组成。每个对象都有自己的属性,对象的属性是独立存在的,可以分别定义每个对象的属性。打开属性窗口会显示选定对象的属性或事件。如果选择了多个对象,这些对象共有的属性会显示在“属性”窗口中。要编辑另一个对象的属性或事件。可以在“对象”框中选择这个对象,或者直接从表单中选择这个控件。 VFP中对象的属性除了能在设计时确定以外,还能在运行时对属性进行充分的控制。
1、在对象层次上引用对象若想操作一个对象,需要确定它和容器层次的关系。在容器层次的最高级(表单集或表单)需要引用对象变量。除非使用 DO
FORM命令中的 NAME子句,否则对象变量和,scx文件有相同的名称。通过引用由点号(.)分隔的对象变量、控件和属性可以处理属性,如下所示:
Objectvariable,[form.]control.property=setting
2009-7-26 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)
对象变量 控件 属性 值
2009-7-26 Visual FoxPro 6.0程序设计 51
可在表单或表单集中使用
THIS,THISFORM和
THISFORMSET引用对象。
例如,要想在单击命令按钮时改变它的标题,可在命令按钮的 Click事件代码中包含下面的命令:
THIS.Caption=“保存”
2009-7-26 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
说明,赋值时所赋的值既可以是指定值,也可是变量。
2009-7-26 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 &&调用表单的刷新方法程序
2009-7-26 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方法程序。
在表单中单击 【 添加 】 或
【 编辑 】 按钮时,按钮名改变。
当再次在表单中单击 【 添加 】 或 【 编辑 】 按钮时,
按钮名再次改变。如此循环改变。
2009-7-26 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="还原 "
2009-7-26 Visual FoxPro 6.0程序设计 56
.Width=75
.FontName="黑体 "
.FontBold=.F.
.ForeColor=RGB(0,0,0)
ENDWITH
ENDIF
DODEFAULT()
表单运行后的结果如图返回
2009-7-26 Visual FoxPro 6.0程序设计 57
7.4 管理表单
7.4.1 隐藏和释放表单
7.4.2 将参数传递到表单
7.4.3 从表单返回值
7.4.4 在表单中使用本地和远程数据退 出返 回
2009-7-26 Visual FoxPro 6.0程序设计 58
7.4.1 隐藏和释放表单用户可以隐藏一个表单,使它不可见。在隐藏表单后,用户不能访问表单上的控件,但仍可以用程序完全控制它们。
若要隐藏表单,可使用 Hide方法程序。例如,在与命令按钮的
Click事件相关的代码中,可以包含下面一行代码:
THISFORM.Hide
当用户单击命令按钮时,表单仍在内存中,但不可见。
当用户完成对表单的操作后,就可以让用户释放表单。在释放表单后,用户就不能再访问表单的属性和方法程序了。
若要释放表单,可以使用 RELEASEE命令。例如,在与“退出”
命令按钮的 Click事件相关的代码中包含下面一行代码:
THISFORM.Release
当用户单击“退出”命令按钮时,表单被关闭。
返回
2009-7-26 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
返回
2009-7-26 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 返回
2009-7-26 Visual FoxPro 6.0程序设计 61
7.4.4 在表单中使用本地和远程数据可以创建这样的表单,它可以很容易地在使用本地数据和远程数据(例如,存储在数据服务器上)之间切换。这样就可以使用本地或测试数据来创建应用程序的原型,然后切换到远程或实际的数据上,而不对表单做实质性的修改。
能够在本地和远程数据库之间切换的关键在于使用的是视图而不是直接将表单(及其控件)与表链接。若要访问远程数据,则必须在任何事件中使用视图。因此为了方便本地数据与远程数据的切换,也需为本地数据创建视图。创建表单时,将这两个视图都添加到它的数据环境中,根据需要进行切换。
若要创建可在本地和远程数据间切换的表单,可以:
①创建数据的两个视图,一个指向远程数据,另一个指向本地数据。
②在表单的“数据环境”中添加这两个视图。
③在“数据环境” 的“属性”中,为两个视图设置同样的 Alias
属性,并将“数据环境”的 OpenViews属性设置为 1,Local Only
或 2:
2009-7-26 Visual FoxPro 6.0程序设计 62
Remote Only(取决于表单运行时使用哪个视图 )。
注意:由于两个视图使用同样的别名,不要选择默认的 0,Local
和 Remote。
④在表单中,添加需要的控件,将 ControlSource属性设置为视图的相应字段。由于两个视图使用同样的别名,表单运行时控件将自动对那个活动的视图作出反应。
创建表单后,通过改变“数据环境”的 OpenView属性切换视图的别名。可以在使用“表单设计器”时在“数据环境”中做此工作,如果要在运行时切换视图,还可以写出代码并将其附加到某个事件中。例如,可将这些代码放入 Activate Enevt事件中:
THISFORM.DataEnvironment.OpenViews= 2 &&使用远程视图如果要创建一个可在本地和远程数据间切换的表单,还必须设计定位代码用以容纳两个视图,尤其是设计具有一对多关系的表单。
例如,如果表单只访问本地表或视图,可在 Next命令按钮中使用下列代码,用来移动指针到临时表的下一个记录:
SKIP 1
THISFORM.Refresh()
2009-7-26 Visual FoxPro 6.0程序设计 63
但是,当在远程视图中定位时,此代码无效。因为代码假设临时表包含了表单需要的所有数据。通常情况下,希望从远程数据源上下载的数据越少越好。
解决的办法是使用带参数的视图。例如,用来编辑客户信息的视图定义如下代码:
SELECT * FORM CUSTOMERS WHERE CUSTOMERS.COMPANY_NAME =?
PCompanyName
表单运行时,会在对话框中提示用户输入客户名或允许用户在文本框中输入一个名称。“显示”按钮的代码可能与以下代码相似:
pCompanyName=THISFORM.txt pCompanyName.Value
REQUERY(“Customer”)
THISFORM.refresh()
返回
2009-7-26 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 启用和废止控件返 回
2009-7-26 Visual FoxPro 6.0程序设计 65
7.5.1 根据任务选择合适的控件
VFP的控件具有良好的灵活性和通用性。虽然可以用多种控件来完成某个特定的任务,但最好保持控件的使用方法的一致性。
这样,当用户一看到所提供的界面,就知道自己能做什么。例如,标签和命令按钮都具有 Click事件,但熟悉图形界面的用户更习惯单击命令按钮来执行指令。
表单的绝大部分功能可以归为下列几类:
■为用户提供一组预先设定的选择
■接受不能预先设定的用户输入
■在给定范围内接受用户输入
■允许用户执行特定的命令
■在给定的时间间隔内执行特定的命令
■显示信息
1,预先设定选择的控件确保数据库数据有效性的最直接方法之一,就是为用户提供一组预先设定的选项。控制用户的选择,可以保证在数据库中
2009-7-26 Visual FoxPro 6.0程序设计 66
不存储无效数据。可以用下列控件为用户提供一组预先设定的选择:选项组、列表框、下拉列表和复选框。
( 1) 使用选项组选项组是包含选项按钮的容器 。 通常,选项按钮允许用户指定对话框中几个操作选项中的一个,而不是输入数据 。 例如,选项按钮可以指定是向文件或打印机输出结果还是进行打印预览 。
■ 设置选项组中的选项按钮数目在表单中创建一个选项组时,它默认包含两个选项按钮,改变
ButtonCount属性可以设置选项组中的选项按钮数目 。 例如,要想使一个选项组包含六个选项按钮,可将这个选项组的
ButtonCount属性设置为 6。
选项组的 Value属性表明用户选定了哪一个按钮。例如,选项组有六个选项按钮,如果用户选择了第四个选项,选项组的 Value
属性就是 4。如果选项组的 ControlSource属性是一个字符型字段,
或者如果在运行表单之前将 Value属性设置为一个字符值,则选项组的 Value属性就是被选中的选项按钮的标题。
2009-7-26 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(<属性名 >,<属性值 >[,<基类 >])
2009-7-26 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
2009-7-26 Visual FoxPro 6.0程序设计 69
在表单的 Init Event事件方法程序中添加下面一行代码:
PUBLIC cSelected
在表单中加入一个文本框,将其 ControlSource属性设为 cSelected
当此表单运行后,当点击 OptionGroup1选项组时,被选中的选项的标题会在表单上的文本框中显示出来。
表单设计完成后如图:
当运行表单并在选项组中单击 Option4时的表单结果如图:
■ 用选项按钮筛选列表对一个表单的数据源如果需要有少数几种数据过滤方式,可以使用
2009-7-26 Visual FoxPro 6.0程序设计 70
选项按钮允许用户在过滤器之间切换。在下面的示例中,假定有一个包含三个选项按钮的选项组和一个表格控件的表单,表格控件的属性设置如下:
对 象 属 性 设 置
GRID1
GRID1
RecordSourceType
RecordSource
1 —别名
Student
筛选条件是在选项按钮的 Click事件代码中设置的,当用户选择选项按钮时,对表格中数据进行筛选的事件代码如下:
2009-7-26 Visual FoxPro 6.0程序设计 71
请不要忘记在关闭按钮的 Click事件中或 Destroy事件中包含 SET
FILTER TO命令,以便当用户关闭表单时重置筛选条件。
注意:当表格的数据源已经更改时,为刷新表格中的数据,可使用 Refresh方法程序。
按此方法建立表单且运行后的结果如所示。
■ 使用选项按钮将用户的选择存储到表中在少数情况下,可以通过选项按钮获得用户信息,并通过保存
Caption属性将这些信息保存在表中。例如,在一个标准化考试
2009-7-26 Visual FoxPro 6.0程序设计 72
的应用程序中,可以使用选项按钮,使用户在多项选择 A,B,C、
D中进行选择。还可以用选项按钮在学生表中指明性别等。若要将一个选项按钮的 Caption属性保存到表中,可以:
① 将选项组的 Value属性设置为 空字符串 。
② 将选项组的 ControlSource属性设置为表中的一个字符型字段 。
③ 在选项组的 Click事件代码中加入如下代码:
THISFORM.Refresh
例如,在 Student表中加入,新生类别,字符型字段,将选项组中选项按钮的标题分别设置为,城应,,,农应,,,城往,和
,农往,,并且选项组的 ControlSource属性设置为,新生类别,,
那么当用户选择标题为,城应,的选择项时,,城应,将被保存在表 Student的,新生类别,字段中 。
( 2) 使用列表框和下拉列表框列表框和下拉列表框 ( 即 style属性为 2的组合框控件 —下拉列表 )
为用户提供了包含一些选项和信息的可滚动列表 。 列表框中,任何时候都能看到多个项;而在下拉列表中,只能看到一个项,用户可单击向下按钮来显示可滚动的下拉列表框 。
2009-7-26 Visual FoxPro 6.0程序设计 73
■ 常用的列表属性和方法程序
■ 填充列表框或组合框通过设置 RowSourceType和 RowSource属性,可以用不同数据源中的项填充列表框。 RowSourceType属性决定列表框或组合框
2009-7-26 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-字段,。
2009-7-26 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
2009-7-26 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-字段,
2009-7-26 Visual FoxPro 6.0程序设计 77
并且 RowSource属性是本地表,该本地表在表单的数据环境中具有关系设置,则当用户选择新值时,可使用 InteractiveChange事件中的 THISFORM.Refresh方法程序。一对多关系中的“多”方只自动显示与关系中父表的表达式相匹配的记录。
● 视图:如果列表框的属性是一个本地视图或远程视图,则对一对多显示的刷新就有 一些不同 。 下面的示例说明了使用列表框和表格创建一个表单,列表框显示了 Student表的,学号,字段的值,表格显示了与在列表框中选择的,学号,字段相关的学生的成绩 。
首先,在,视图设计器,中创建一个 Stud_grad参数化视图 。 当在,视图设计器,中创建该视图时,一定要将外部关键字的选择标准设置到一个变量中 。 在本例中,该变量称为 Stud_ID。 即在
,视图设计器,中首先添加一个表 Grade,再选 【 查询 】 |【 视图参数 】,在弹出的,视图参数,对话框中定义一个变量 Stud_ID,
然后在,视图设计器,中选择 【 字段 】 选项卡中单击 【 全部添加 】
按钮,再选择 【 筛选 】 选项卡,在,字段名,下的下拉选择框中选择,Grade.
2009-7-26 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")
2009-7-26 Visual FoxPro 6.0程序设计 79
2、预先不能确定输入的控件
( 1)使用文本框文本框是一类基本控件,它允许用户添加或编辑保存在表中非备注字段中的数据。若要在程序中引用或更改文本框中显示的文本,
则要设置或引用 Value属性。
如果设置了文本框的 ControlSource属性,则显示在文本框中的值将保存在文本框的 Value属性中,同时保存在 ControlSource属性指定的变量或字段中。
■常用文本框属性
2009-7-26 Visual FoxPro 6.0程序设计 80
2009-7-26 Visual FoxPro 6.0程序设计 81
■ 检验文本框中的数据是否有效若要检验文本框中的值,可在与 Valid事件(控件失去焦点前发生)
相关的方法程序中写进相应代码。如果值无效,则返回“假” 或
0。如果返回“假”,就显示一条“无效输入”信息。如果要显示自己的信息,则可在 Valid事件代码中包含 MESSAGEBOX()函数并且返回 0值。
例如,建立一个对 Student表输入数据的表单,其中的字符型字段可以接收任何字符的输入,数字型字段如果不加以限制也可以接收任何数字,而对 Student表来说,这是可以的 。 但事实上为了保证表中数据的正确性,在数据输入时往往要对数据进行校验,如对,年龄,字段,通常不会超过如 25岁,为了保证输入的数据不超过这个限制,可以通过在文本框的 Valid事件代码中包含下面代码:
IF THIS.Value>25
=MESSAGEBOX(“输入的年龄超过上限 !,,64,”年龄输入错误,)
RETURN 0
ENDIF
2009-7-26 Visual FoxPro 6.0程序设计 82
■ 对文本框中的文本进行格式编排
InputMask属性决定在文本框中可以键入的值,而 Format属性则决定在文本框中值的显示方式。
例如,将 InputMask属性设置为 999,999.99可限制用户只能输入具有两位小数并小于 1,000,000的数值。在用户输入任何值之前,逗点和句点就显示在文本框中。如果用户按一个字符键,则这个字符不能显示在文本框中。如果有逻辑字段,并且想让用户能键入
,Y”或,N”而不是,T”或,F”,应将 InputMask属性设置为,Y”。
■在文本框中接收用户密码在应用程序中,经常需要获得某些安全信息,如密码。这时可以用文本框来接收这一信息,而在屏幕上并不显示。如希望接收用户输入同时不显示实际输入值,可将文本框的 PasswordChar属性
(指定文本控件内是显示用户输入的字符还是显示占位符,该属性如果输入值则为指定占位符)设置为,*”或其他的一般字符。
如果属性设置为除空字符串的任何字符,文本框的 Value和 Text属性将保存用户的实际输入,而对用户所按的每一个键都用设定的一般字符来显示。
2009-7-26 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.,则代码可以执行得更快。
2009-7-26 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
返回
2009-7-26 Visual FoxPro 6.0程序设计 85
7.5.2 使用命令按钮和命令按钮组控件为了让用户完成一些和操作值无关的特定动作,例如,让用户关闭一个表单、打开另一个表单、在表中浏览、保存或取消编辑、
运行报表或查询以及其他的操作。此时可借助命令按钮或命令按钮组控件来进行。命令按钮和命令按钮组的特定操作代码通常放置在命令按钮的 Click事件中。
1、使命令按钮成为默认选择将命令按钮的 Default属性设置为“真”(,T.),可使该命令按钮成为默认选择。默认选择的按钮比其他命令按钮多一个粗的边框。
如果一个命令按钮是默认选择,那么按 Enter键后,将执行这个命令按钮的 Click事件。
注意:如果选定的表单对象是编辑框或表格,当按 Enter时,不会执行默认选择按钮的 Click事件代码。在编辑框中按 Enter键,将在编辑框中的值加入一个回车和换行符;在表格中按 Enter,将选择一个相邻的区域。若要执行默认按钮的 Click事件,则要按
Ctrl+Enter。
2009-7-26 Visual FoxPro 6.0程序设计 86
2、常用命令按钮属性还可以将命令按钮组成一组,这样即可单独操作,也可作为一个组统一操作。
3、通过组来管理命令按钮的选择要让组中所有命令按钮的 Click事件代码都用同一个方法程序过程,
可将代码加入命令按钮组的 Click事件代码中。命令组的 Value属性指明单击了哪个按钮。
例如,建立一个“命令按钮示例”表单如图
2009-7-26 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
2009-7-26 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
事件代码。 返回
2009-7-26 Visual FoxPro 6.0程序设计 89
7.5.3 用于显示文字、图形或图片的控件
1、使用图像控件图像控件允许在表单中添加图片(,BMP)文件。图像控件和其他控件一样,具有一整套的属性、事件和方法程序。因此,在运行时可以动态地更改它。用户可以用单击、双击和其他方式来交互地使用图像。
2、使用标签标签和文本框的不同之处在于标签没有数据源、不能直接编辑和不能用 Tab键选择,在程序中可以改变标签的 Caption和 Visible
属性,让标签更好地显示不同的内容。
2009-7-26 Visual FoxPro 6.0程序设计 90
3、使用文本框和编辑框显示信息设置文本框和编辑框的 ReadOnly属性为“真”,可以显示那些只能查看而不能修改的信息。如果编辑框无效用户就不能滚动文本。
4,使用表单图形显示信息返回
2009-7-26 Visual FoxPro 6.0程序设计 91
7.5.4 使用表格控件
1、设置表格列数首先需要设置的表格控件属性是列数。若要设置表格中的列数,
可在“属性和方法程序”列表中选择 ColumnCount属性,然后在
“属性”框中,键入需要的列数。如果 ColumnCount属性设置为
1-(默认值),在运行时,表格将包含与其链接的表中字段同样数量的列。
2、在设计时人工调整表格的显示在表格中加入列后将改变列的宽度和行的高度。可以在“属性”
窗口中人工设置列和行对象的高度和宽度属性,也可以在设计表格时可视地设置这些属性。若要切换到表格设计方式,可从表格的快捷菜单中选择“编辑”命令,然后在“属性”窗口的“对象”
框中选择表格的一列。在表格设计方式下,表格周围将显示一个粗框。要切换出表格设计方式,只需选择表单或其他控件。若要调整表格中列的宽度,可以:
①在表格设计方式下,将鼠标指针置于表格列的标头之间,这
2009-7-26 Visual FoxPro 6.0程序设计 92
时指针变为带有向左和向右箭头的条。
②将列拖动到需要的宽度,或者在“属性”窗口中设置列的 Width
属性。
若要调整表格中行的高度,可以:
①在表格设计方式下,将鼠标指针置于“表格”控件左侧的第一个按钮和第二个按钮之间,这时指针将变成带有向上和向下箭头的条。
②将行拖动到需要的高度,或者在“属性”窗口中设置列的
Height属性。
注意,将 AllowRowSizing设置为“假”(,F.),可以防止用户在运行时改变表格行的高度。
3,设置表格中显示的数据源可以为整个表格设置数据源,也可以为每个列单独设置数据源 。
若要为整个表格设置数据源,可以:
①选择表格,然后单击“属性”窗口的 RecordSourceType属性。
如果让 VFP打开表,可将 RecordSourceType属性设置为,0-表”;
如果
2009-7-26 Visual FoxPro 6.0程序设计 93
想在表格中放入打开表的字段,则将 RecordSourceType属性设置为,1-别名”。
② 单击,属性,窗口中的 RecordSource属性 。 选择或输入作为表格数据源的别名或表名 。
如果想在特定的列中显示一个特定字段,也可以为列设置数据源 。
若要设置列的数据源,可以:选择列,然后单击,属性,窗口的
ControlSource属性 。 选择或输入作为列的数据源的别名,表名或字段名 。
4,向表格添加记录将表格的 AlIowAddNew属性设置为,真,(,T.),可以允许用户向表格中显示的表中添加新的记录 。 如果将 AlIowAddNew属性设置为真,当用户选中了最后一个记录,并且按下光标 【 ↓】 键时,
就向表中添加新记录 。
如果还想进一步控制用户什么时候向表中添加新记录,可以将
AlIowAddNew属性设置为默认的,假,(,F.),并使用 APPEND
BLANK或 INSERT命令添加新记录 。
2009-7-26 Visual FoxPro 6.0程序设计 94
5、使用表格控件创建一对多表单表格最常见的用途之一是当文本框显示父记录数据时,表格显示子表的记录;当用户在父表中浏览记录时,表格记录显示相应变化。如果表单的数据环境包含两表之间的一对多关系,那么要在表单中显示这个一对多关系非常容易。若要设置具有数据环境的一对多表单,可以先将需要的字段从“数据环境”中的父表拖动到表单中,再从“数据环境”中将相关的表拖动到表单中。在大多数情况下,都要为表单或表单集创建一个数据环境,但是即使不用“数据环境”,创建一对多表单也并不复杂。
若要创建没有数据环境的一对多表单,可以先将文本框添加到表单中,显示主表中需要的字段;再设置文本框的 ControlSource属性为主表;然后再在表单中添加一个表格;将表格的
RecordSource属性设置为相关表的名称;设置表格的 LinkMaster
属性为主表名称;设置表格的 Childorder属性为相关表中索引标识的名称,索引标识和主表中的关系表达式相对应;将表格的
RelationalExpr属性设置为联接相关表和主表的表达式。
2009-7-26 Visual FoxPro 6.0程序设计 95
6、在表格列中显示控件除了在表格中显示字段数据,还可以在表格的列中嵌入控件,这样就为用户提供了嵌入文本框、复选框、下拉列表框、微调按钮和其他控件的方法。例如,如果表中有一个逻辑字段,当运行该表单时,通过辨认复选框可以判定哪个记录值是“真”和哪个记录值是“假”。修改这些值只需设置或清除复选框即可。
可以在“表单设计器”中交互地向表格列中添加控件,也可以通过编写代码在运行时添加控件。若要交互地在表格列中添加控件,
可以在属性窗口中先后执行下述操作步骤:
■在表单中添加一个表格,并打开其“属性”窗口,在属性窗口中将表格的 ColumnCount属性设置为需要列数,如果要求表格显示四列,则可以将 ColumnCount属性设置为 4。
■在“属性”窗口中的“对象选择”下拉列表框中为控件选择父列。例如,要选择第四列来添加控件,可以在“属性”窗口中的
“对象”框中选择 Column4对象,这时表单上表格的边框发生了变化,表明正在编辑一个包含的对象。
2009-7-26 Visual FoxPro 6.0程序设计 96
■ 在“表单控件”工具栏中选择所要的控件,这里单击 (复选框 ),
然后在表单的第四列中的任意位置单击,新控件将被加入到表格中。新加入的控件不在表格的列中显示,但在“属性”窗口的
“对象”框中可以看到已经加入了一个在 Column4对象下的
Ckeck1对象,该对象在运行时才显示。
■将新加入的复选框的 Caption属性设置为“无”,并将列
Column4的 Sparse属性(指定 CurrentControl属性是影响 Column对象中的所有单元格,还是只影响活动单元格)设置为“假”。
■将父列 Column4的 ControlSource属性设置为所需要的表字段,
并将 CurrentControl属性(指定列对象中的控件哪一个被用来显示活动单格的值)设置为新加入的控件,这里选择 Check1。设定后,在表单的第四列中将显示一个复选框标记。
若要移去表格列中的控件,可以采取以下步骤:
■ 在,属性,窗口的对象框中选择要移去的控件 。
■ 激活,表单设计器,。 如果属性窗口可见,控件的名称将显示在对象框中 。
■ 按 Delete键 。 返回
2009-7-26 Visual FoxPro 6.0程序设计 97
7.5.5 使用 OLE绑定型控件单击,OLE绑定型控件”按钮,并在“表单”窗口中拖动至所期望的大小,可以在表单中创建一个绑定型 OLE控件对象。在创建这个对象后,可以将它和表中的通用字段链接,然后可以用这个对象显示字段中的内容。
若要创建一个绑定型 OLE对象,可以:
①创建或打开表单。
②在“表单控件”工具栏中选择,OLE绑定型控件”按钮,并在表单中将它拖动到所期望的大小。
③设置对象 ControlSource属性,将 OLE对象和通用字段链接。
7.5.6 设置控件的 Tab键次序表单控件的默认 Tab键次序是控件添加到表单时的次序,但通过设置控件的 Tab键次序可以使用户按照逻辑顺序在控件之间移动 。
若要改变控件的 Tab键次序,可以:
① 在,表单设计器,工具栏中选择,设置 Tab键次序,。
② 双击控件旁边的框,这个控件将在表单打开时具有最初焦点 。
返回
2009-7-26 Visual FoxPro 6.0程序设计 98
③ 按需要的 Tab键次序依次单击框。
④单击控件外的任何地方,完成设置。
也可以根据“选项”对话框的“表单”选项卡中的设置,按列表为表单中的对象设置 Tab键次序。
可以在一个控件组中设置选项按钮和命令按钮的选择顺序。要想使用键盘移动到一个控件组,用户需要按 Tab键移动到控件组的第一个按钮,然后使用箭头键选择该组中其他按钮。 若要更改一个控件组中按钮的选择顺序,可以:
①在“属性”窗口中,在“对象”列表里选择控件组。一条粗的边框表明该组处于编辑状态。
②选择“表单设计器”窗口。
③从“显示”菜单中选择,Tab键次序”命令。
④选择合适的 Tab键次序。
返回
2009-7-26 Visual FoxPro 6.0程序设计 99
7.5.7 允许用户拖放拖放功能可以扩展到多表单操作。用户能将控件拖动到屏幕上的任何位置,包括其他表单。只要拖到的目的区域在应用程序中,
就可以对拖动操作作出响应。当用户拖动控件时,VFP提供了和对象相同尺寸的灰色外框,并和鼠标指针一起移动。可以为控件的 DragIcon属性指定一个光标文件(,CUR)来覆盖默认方式。
注意,在运行时拖动控件并不改变控件的位置,但可以按照本章稍后的“在拖放操作中引起控件移动”一节中的说明,编写重新定位的程序,改变控件位置。通常拖动只是用于指示执行某些操作,当用户释放鼠标按钮后,控件仍将保留在原来的位置。
使用表 7-18列出的拖放属性、事件和方法程序,可以指定拖动操作的含义,也可以指定控件拖动的方式。所有可视的控件在运行时都可以拖动,并且所有控件都拥有表 7-18中列出的属性。表单能识别 DragDrop和 DragOver事件,但不具备 DragMode和
DragIcon属性。
2009-7-26 Visual FoxPro 6.0程序设计 100
1、启用自动拖动方式如果允许用户无论何时单击控件时都能拖动控件,可将 Drag-
Mode属性设置为 1,这能启用控件的自动拖动方式。当拖动设置为“自动”时,拖动功能总是打开的。
注意,在自动拖动方式下被拖动的控件不识别其他的鼠标事件。
2、在用户停放对象时的响应拖动控件之后释放鼠标按钮时,VFP产生一个 DragDrop事件,对这一事件有多种响应方法。可将控件重新定位在新的位置(由灰色外框的最后位置来指明)。记住,控件不会自动移到新的位置。
当释放鼠标时,如果鼠标指针处于一个控件边框内,这个控件就
2009-7-26 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
2009-7-26 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是用户自定义的表单属性。
2009-7-26 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属性设置为非默认值(灰色矩形框)时,上述代码才能获得最好的效果。如果使用的是灰色矩形框,用户通常根据灰色矩形框的最后位置来精确确定控件的位置。要做到这点,
应记录下鼠标在源控件中的最初位置,然后用这个位置作为控件移动的偏移量。
若要记录最初的鼠标位置,可以:
①指定控件为人工拖动方式。
2009-7-26 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.)
返回
2009-7-26 Visual FoxPro 6.0程序设计 105
小 结表单是 VFP6人机交互的主要工具,表单设计器是 VFP6中功能最强大的设计器。
本章从不同的角度来说明了如何设计表单的问题。设计一个表单,第一步是如何选择数据源,也就是数据环境的问题,第二步是向表单或表单集中添加对象,第三步是对表单或表单集中的对象进行处理,最后是管理表单的问题。设计表单时可以使用表单向导或表单设计器,重点是使用表单设计器,对于表单设计器的使用本章没有具体讲,但设计方法与前几章中的各种向导很类似。
设计表单最重要的是掌握几种常用表单控件的使用方法,如标签、文本框、组合框、列表框、表格、命令按钮、命令按钮组、
选项按钮组、复选框等。具体使用什么控件,要根据任务选择合适的控件,在本章中介绍了使用命令按钮和命令按钮组控件、
使用表格控件等的技巧。同时还介绍了管理表单时要用到的几种技术。
返回
2009-7-26 Visual FoxPro 6.0程序设计 106
选择 【 数据环境 】
在系统菜单上增加了 【 数据环境 】 菜单,
同时打开了“数据环境设计器”。
单击 【 数据环境 】 菜单并选择 【 添加 】,
打开“添加表或视图”对话框。
在“添加表或视图”对话框中从“数据库中的表”下选择 Student表,再单击 【 添加 】,然后单击 【 关闭 】,即可将 Student表添加到“数据环境设计器”
中。若要添加视图,可在“选定”选项组中先选择“视图”,再进行上述操作。添加后表或视图后关闭“数据环境设计器”。
2009-7-26 Visual FoxPro 6.0程序设计 107
第 2步:为报表添加标题。
选择菜单上的 【 报表 】 |
【 标题 /总结 】,弹出的
【 标题 /总结 】 对话框。
选中“标题带区”
再单击 【 确定 】 按钮在“报表设计器”中增加了标题带区欲在标题带区中加入标签“学生报表”的操作步骤:先单击“报表控件”工具栏上的(标签)按钮;
在标题带区中单击出现闪烁的光标。
在光标处开始输入标题名“学生报表”;
学生报表字号设置:先选中“学生报表”标签,再在系统菜单中选择 【 格式 】 |【 字体 】,在弹出的“字体”对话框中选择所需要的字体和字号以及字体样式。
如选择“黑体”、“规则”、“二号”。
接着再进行版面设置,选择 【 格式 】 |【 对齐 】 |【 水平居中 】 。
2009-7-26 Visual FoxPro 6.0程序设计 108
第 3步,设置报表的页标头。设置报表的页标头与上面设置标题的方法相同。
系部代号 班级代号 学号 姓名 性别 出生日期 班级 宿舍 电话 年龄 新生类别
1、在页标头中分别添加标签“系部代号”、“班级代号”、“学号”、“姓名”等。
2、按住 Shift键后分别单击每一个标签,将其全部选中。
3、用与设置标题相同的方法将页标头的字体设为,黑体”,“规则”,“五号”
4、标签布局调整。选中单个标签后用光标键可调整其位置,也可选中一批后使用光标键调整位置。
2009-7-26 Visual FoxPro 6.0程序设计 109
第 4步:设置细节。
在第 3步设计完成后,可以将“数据环境设计器”打开。
将要列在报表中的字段从“数据环境设计器”中逐个拖到细节带区。
设置字体字号及调整布局:方法同页标题。使用报表默认的字体和字号。
控件对齐:选中细节中的全部域控件,然后在系统菜单中选择 【 格式 】 |【 对齐 】 |【 顶边对齐 】 。
2009-7-26 Visual FoxPro 6.0程序设计 110
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在报表上单击时系统将打开“报表表达式”生成器。
“表达式生成器”按钮,格式”按钮单击“表达式生成器”按钮从“字段”列表框中选择一个字段双击单击 【 确定 】
2009-7-26 Visual FoxPro 6.0程序设计 111
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在报表上单击时系统将打开“报表表达式”生成器。
“表达式生成器”按钮,格式”按钮单击 【 确定 】
2009-7-26 Visual FoxPro 6.0程序设计 112
设置细节时也可以不从“数据环境设计器”中将字段拖到细节,
而使用 报表控件工具栏。
单击工具栏上的“域控件”按钮,再单击“按钮锁定”按钮,可以向报表中多次添加域控件。然后在“细节”带区合适的位置单击添加一个域 控件。在报表上单击时系统将打开“报表表达式”生成器。
采用同样的方法添加其它域控件并调整域控件到合适的大小。
调整域控件大小:每个域控件都有 8个控制柄,按住控制柄拖动鼠标可以调整域控件的大小。现将“系代号”域控件宽度缩短。
控制柄
2009-7-26 Visual FoxPro 6.0程序设计 113
第 5步:在页注脚中设置报表页码。
方法基本同上一步,只不过在“表达式生成器”对话框中不是从
“字段”列表框中选择,而是从“变量”列表框中选择
,_pageno”。
在此报表中,数据之间没有分隔线,若要求要有网格线,也可以用同上的基本方法,在“页标头”中的字段名上加上方框线,在
“细节”中的域控件上加分隔线。
先选中页标头中的所有标签,并将其移到页标头带区的顶部,然后对细节带区中的所有域 控件进行同样的处理。
再将鼠标移到页标头分隔带上,按住左键向上移动,调整页标头带区的宽度,用同样的方法调整细节带区的宽度。若要精确设置宽度,可以双击分隔带弹出对话框。
在高度微调框中调整高度。
再单 【 确定 】
2009-7-26 Visual FoxPro 6.0程序设计 114
第 5步:在页注脚中设置报表页码。
方法基本同上一步,只不过在“表达式生成器”对话框中不是从
“字段”列表框中选择,而是从“变量”列表框中选择
,_pageno”。
在此报表中,数据之间没有分隔线,若要求要有网格线,也可以用同上的基本方法,在“页标头”中的字段名上加上方框线,在
“细节”中的域控件上加分隔线。
在工具栏上单击“矩形”按钮,然后在“页标题”带区划一个矩形框。
再单击工具栏上的“线条”按钮,然后在标签间划竖向分隔线。然后再在细节带区域控件的下部划一条水平线,再在域控件的中间及前后划竖向分隔线。
2009-7-26 Visual FoxPro 6.0程序设计 115
报表设计完成后,可以先单击系统菜单“常用”工具栏上的打印预览按钮,查看报表设计的效果,如果不满意还可以用上述方法进行修改,如果满意则可以结束“报表设计器”的设计工作,
将报表保存到预定的目录中。 预览结果如下:
2009-7-26 Visual FoxPro 6.0程序设计 116
3、修改报表文件要修改已生成的报表文件,应先将它打开。 在项目管理器的
“文档”选项卡中选择“报表”,并在展开的报表列表中选择要修改的报表,然后单击项目管理器上的 【 修改 】 按钮。如对刚建立的 Student报表。
在“报表设计器”中可以用建立报表的方法修改已存在的报表。
2009-7-26 Visual FoxPro 6.0程序设计 117
4、规划数据位置下图说明了报表中可能出现的各类带区以及每个带区应放置的数据等典型内容。
2009-7-26 Visual FoxPro 6.0程序设计 118
用“报表设计器”设计报表时,报表中要用的数据以及各数据在报表中什么位置显示和打印,均要在设计时加以考虑,这就是对报表布局的规划。通过规划报表布局,可以设计和修改数据在报表页面上的位置。将数据对象放在报表中的不同的带区,将有不同的显示结果,例如,如果将数据对象放在报表的“标题”带区中,则此数据在报表中只显示或打印一次,但如果将表的字段对象放在报表的“细节”带区中,则可以每条记录显示或打印一次。
可以用下表决定所要使用的带区以及在带区中应放入何种控件。
返回
2009-7-26 Visual FoxPro 6.0程序设计 119
8.2 报表与标签的布局和数据
8.2.1 重定义页面布局
8.2.2 在域控件中使用表达式和函数返回 退出
8.2.3 定义报表变量
8.2.4 域控件的格式化
2009-7-26 Visual FoxPro 6.0程序设计 120
8.2.1 重定义页面布局在报表中,可以定义多个列,也可以改变页面中的带区的高度,
从而重新设计页面布局。
1、在页面上定义多个列若要定义多个列的报表,可以:
( 1)在 【 文件 】
菜单上选择 【 页面设置 】,打开“页面设置”对话框,
如图。
输入页面所需的数目,该数目就是一页上将要排列显示和打印的记录列数。
输入列的宽度值。
输入所需要的列间距,若在“列数”
框中只设 1列,则
“间隔”框为不可选。
输入报表的左页边距值。 按钮用于设置报表中多列显示时数据打印的顺序
( 2)根据要求在对话框中进行设置,
最后选择 【 确定 】,
“报表设计器”将反映出设置的改变。
2009-7-26 Visual FoxPro 6.0程序设计 121
2、设置报表带区高度在设计报表时,可以改变报表带区的高度。报表带区的高度是指一个报表带区可用的页面空间(在页边距的范围内)。例如:如果“标题”带区设置为 2英寸,则“标题”将在顶部页边距下 2英寸区域内显示和打印。“细节”带区指定每个要显示的记录所需要的区域。对于“组标头”和“页注脚”带区,还可以设置附加的参数。
若要精确设置带区的高度,可以通过先双击相应带区的条形栏,
在出现的一个与该带区对应的对话框中的“高度”框中输入所需要的高度值,然后再单击 【 确定 】 。
带区高度设置在前文已作说明。
返回
2009-7-26 Visual FoxPro 6.0程序设计 122
8.2.2 在域控件中使用表达式和函数在报表或者标签中,可以包含域控件来显示一些表达式。例如,
表或视图的字段、内存变量,以及它们之间的运算的值等。
1、添加域控件用户可以使用几种方法向报表中添加域控件,在上一节的报表设计中介绍了二种方法。一是直接使用工具栏上的域 控件按钮向报表中添加域 控件;二是从“数据环境设计器”中添加表的字段作为域控件。
2、插入字段连接构成的域控件把表的字段添加到报表之后,在预览时可能会看到这些字段没有按照在页面上所希望的方式显示。有时想要将几个字段连在一起显示,这时可以将这些字段连成一个域表达式,同时删除多余的空格。每个控件所对应的值所需的空间可能不同,这时可以适当调整控件。若要将几个字段连接成为一个域表达式,可以按以下步骤进行:
2009-7-26 Visual FoxPro 6.0程序设计 123
( 1)选择“报表控件”工具栏中的“域控件”,在报表中插入一个域控件。将域控件的大小设为表达式求值后所必须的最小值。
也可以先双击一个选中的域控件,然后在“报表表达式”对话框中的“溢出时伸展”前的复选框中做上选中标记,使它能够在表达式求值后需要更多的空间时自动伸展;若所需空间较小,则控件不会缩小,但控件的所占的空间不会比在设计时设定的更小。
在带区的最上一个域控件可设置为“相对带区顶端固定”
和“溢出时伸展”。
溢出时伸展浮动在带区最上一个域 控件下面的其它域控件要设为浮动。
2009-7-26 Visual FoxPro 6.0程序设计 124
( 2)在“报表表达式”对话框中,选择“表达式生成器”按钮。
( 3)在弹出的“表达式生成器”中,从“字符串”框中选择
Alltrim(expC)函数。该字符串出现在“报表字段的表达式”框中,
同时选定了 expC。
( 4)在“字段”列表框中双击想要在控件中显示的第一个字段名。该字段名将代替“报表字段表达式”框中的 expC。在字段名后输入一个,+”号也可以从“字符串”函数框中选择一个,+”号。
( 5)重复上面的第三步和第四步来处理其它字段,直至完成表达式,再选择 【 确定 】 。
( 6)在“报表表达式”对话框中选择“溢出时伸展”。在显示报表时,若设计时设定的控件大小不能包含其中的表达式的值,
则控件自动向后伸展,直至完全能够显示整个值。
为了将几个字段合为一个表达式,对每个字段名前使用
ALLTRIM()函数,要注意,此函数只能用于字符型字段,若字段为非字符型字段,则还要使用转换函数,将非字符型值转换为字符型的值。而每个表达式元素之间用,+”号连接。
返回
2009-7-26 Visual FoxPro 6.0程序设计 125
若要在报表中操作数据或显示计算结果,则需要用到报表变量。
使用报表变量可以计算与报表数据环境中提供的数据有关的各种值,并且可以用这些值来计算其它一些值。
如果要使用报表变量,
则必须在使用前先定义。
1、定义报表变量若要定义报表变量可以使用下述方法:
( 1)若已经建立了报表,
则先将报表打开;若还没有建立报表,则创建一个新报表。
( 2)从系统菜单中选择
【 报表 】 |【 变量 】,将弹出图示的“报表变量”对话框。
( 3)输入一个变量名
( 4)输入一个变量名或一个其它的表达式,也可以单击后面的按钮,再在弹出的“表达式生成器”中用前面已经介绍过的方法创建一个表达式。
( 5)如果需要,还可以从
“计算”
列出的七种计算方式中任选一种作为该表达式的计算选项。系统默认值为
“不计算”。
( 6)如果需要,也可以定义一个初始值或初始值的表达式。
( 7)重复操作定义完成后单击
8.2.3 定义报表变量
2009-7-26 Visual FoxPro 6.0程序设计 126
定义一个报表变量 nCount,用存保存表中一个班级的人数第 1步:在项目管理器中选择“文档”选项卡中的 Student报表后单击 【 打开 】 。
第 2步:从系统菜单中选择 【 报表 】 |
【 变量 】,打开“报表变量”对话框。
第 3步:输入报表变量名 nCount。 nCount
第 4步:输入一个变量名或一个其它的表达式 第 5步:选择总和作为变量的计算方式第 6步:初始值取系统默认值 0。
第 7步:单击 【 确定 】
结束变量定义第 8步:在报表的页注脚区域添加一个域控件,该域控件的表达式选择变量中已定义的变量 nCount。
2009-7-26 Visual FoxPro 6.0程序设计 127
2、重新排序报表变量报表变量是根据它们出现的先后顺序来计算的,并且影响引用这些报表变量的表达式的值。例如,如果定义一个变量时,用到了另外一个变量,那么被引用的报表变量应该在引用之前先出现(先被定义)。
若要更改报表变量的顺序,
可以先从“报表”菜单中选择
“变量”,打开“报表变量”
对话框。 在“报表变量”对话框中的
“变量”列表框中拖动其左边的“移动”按钮,便可以重新调整所定义的报表变量的顺序。
调整完成后按 【 确定 】 按钮。
返回
2009-7-26 Visual FoxPro 6.0程序设计 128
8.2.4 域控件的格式化在插入一个域控件后,可以改变控件的数据类型和显示格式。数据类型可为:字符型、数值型或日期型。每个数据类型都有自己的格式选项,其中包括用户建立自己格式模板的选项。当打印报表或标签时,格式可以控制字段的显示。
可以在“报表表达式”对话框的“表达式”框中直接输入格式函数,也可以在“格式”对话框中进行选择。下面列出一些可能遇到的典型情况:可能需要将所有的输出字母转化为大写,
也可能需要用逗号或小数点分隔数值输出,或用货币格式显示数值输出,将日期类型的输出转化为其他格式等等。
2009-7-26 Visual FoxPro 6.0程序设计 129
1、报表控件的格式化选项在域控件中,可以对每种数据类型设置不同的格式选项。若要将一个域控件格式化,可以先双击“域控件”,然后在“报表表达式”对话框中,选择“格式”对话框后的按钮,为该字段选择数据类型:“字符型”、“数值型”或“日期型”,“编辑选项”
区域将会显示该数据类型下的各种格式选项。如图 8-18所示。最后选择对齐方式和所需的格式选项。
域控件
1、双击“域 控件”,如“学号”
2、单击“格式”按钮字段为字符型则自动选定为“字符型”
3、取消“左对齐”格式 再选择“居中对齐”
4、单击 【 确定 】
2009-7-26 Visual FoxPro 6.0程序设计 130
1、报表控件的格式化选项在域控件中,可以对每种数据类型设置不同的格式选项。若要将一个域控件格式化,可以先双击“域控件”,然后在“报表表达式”对话框中,选择“格式”对话框后的按钮,为该字段选择数据类型:“字符型”、“数值型”或“日期型”,“编辑选项”
区域将会显示该数据类型下的各种格式选项。如图 8-18所示。最后选择对齐方式和所需的格式选项。
1、双击“域 控件”,如“学号”
表示居中对齐单击 【 确定 】
返回到报表后,在域控件看不到所定义的格式,格式只在显示或打开时有效。
2009-7-26 Visual FoxPro 6.0程序设计 131
2、在域中对齐文本在域控件中对齐文本不会改变控件在报表上的位置,只是在控件内对其内容进行格式调整。有两种方法可以调整控件中内容的位置。要直接在域控件中调整文本对齐,可以:①选择要操作的控件。②在 VFP系统菜单上选择 【 格式 】 |【 文本对齐方式 】 。③
从该子菜单中选择合适的选项。
要在域中调整文本对齐,可以按上例的方法在
“格式”选项中调整文本对齐方式。
2009-7-26 Visual FoxPro 6.0程序设计 132
3、定义域格式模板格式模板允许自己定义域中数据的格式。在“报表表达式”对话框的“格式”
框或者“格式”对话框里输入一系列普通字符或代码,就可以建立各种打印格式。所输入的普通字符将与域中的值一同出现在域中,而输入的代码则用来确定字段输出的外观。例如,如果为一个十位数的数值字段指定如 (999)
999-9999所示的格式模板,那么,像括号、空格和破折号这样的字符将和数值型数据一起打印。
4、改变字体对于每个域控件或标签控件,可以改变字体和文本的大小,还可改变整个报表的默认字体。要在一个报表中改变字体和字号,可以:
①选择控件。
②从系统菜单中选择 【 格式 】 |【 字体 】,这时出现“字体”对话框。
③选择合适的字体和大小,然后单击 【 确定 】 。
若要改变默认的字体,可以:
①从系统菜单中选择 【 报表 】 |【 默认字体 】 。
②在“字体”对话框中,选择需要作为默认值的合适字体和大小,然后单击
【 确定 】 。只有在改变默认的字体后插入的控件才反映出新的字体设置。对于已存在的对象,须将它们全部选定,然后再使用 【 格式 】 菜单上的 【 字体 】
选项修改设置。
返回
2009-7-26 Visual FoxPro 6.0程序设计 133
8.3 集成查询和报表
8.3.1 集成查询的报表
8.3.2 用查询收集用户输入返回 退出
2009-7-26 Visual FoxPro 6.0程序设计 134
8.3.1 集成查询的报表在创建好了应用程序的各个组件之后,就可以将它们集成起来。
下图显示了将查询和报表添加到应用程序的一些方法。
2009-7-26 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要用实际要打开的视图文件替换)
2009-7-26 Visual FoxPro 6.0程序设计 136
若将报表加入到应用程序时,有以下几种选择:
■如果只是想让用户简单地启动报表并得到打印结果,可以把
REPORT命令添加到表单控件、菜单命令或工具栏按钮中。
■如果报表中用到的某些变量允许用户输入,则可以像参数化查询那样从用户那里获得变量的值,或从表单中某些文本框获得变量值等。
■如果想让用户创建自定义报表,可以向用户提供使用报表设计器创建新报表或修改已有报表的能力。
若要运行报表和标签,则要使用 REPORT或 LABEL命令 。
1,REPORT命令格式,REPORT FORM <报表文件名 >/<? > [<范围 >] [FOR <条件 >] [WHILE <条件 >] [HEADING <标题文本 >] [PREVIEW
[WIINDOW <窗口名 >]] [TO PRINTER [PROMPT]]/[TO FILE <
文件名 > [ASCII]] [SUMMARY]
功能,根据报表定义文件显示或打印报表。
2009-7-26 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
2009-7-26 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]]
返回
2009-7-26 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命令执行的结果将会在浏览窗口中显示。
2009-7-26 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
2009-7-26 Visual FoxPro 6.0程序设计 141
要注意:建立的 Student报表要将其中数据环境中的表移去,即在报表的数据环境中不含有任何表。
对于本例,也可以不用 SQL查询语句而直接使用 REPORT命令,
即将 SELECE命令删除,在 REPORT语句中增加下列可选项:
FOR 班级 =THISFORM.COMBO1.VALUE
其中,THISFORM.COMBO1.VALUE是对用户选择的引用。即通过 REPORT命令的条件子句,对表中的记录进行筛选,从而达到按用户选择的班级输出报表的目的。
返回
2009-7-26 Visual FoxPro 6.0程序设计 142
8.4 报表和标签的输出
8.4.1 为控件设置打印选项
8.4.2 为组设置打印选项返回 退出
8.4.3 控制报表和标签的输出
2009-7-26 Visual FoxPro 6.0程序设计 143
8.4.1 为控件设置打印选项总的来说,控件的位置和它所处的带区的位置决定了它打印时的位置和时间。除此之外,还可以为每个控件设置特定的打印选项。
每个控件都有一个默认的尺寸,该尺寸或是由它的值(对于字段或标签来说)决定,或是在创建该控件的时候确定(对于线条、
矩形或者图形来说)。控件在页面上的长度指定了该控件的显示宽度。由于有些控件的值根据记录的不同而不同,可将控件的高度设置为可向下伸展,以显示整个的值,否则,有些数据将在显示的时候被截断。除了标签控件之外,所有的控件的大小均可变。
1、打印变长度值的控件为了使控件尽可能少的占用报表的地方,可将其设置为可伸展的。
例如,一个表达式的值可能依记录的不同而不同,这时,最好不要在报表上为这个控件分配一个固定的可容最长记录值的空间,
而应将控件设置为可伸展,即可容纳所有的数值。对于该控件下方的控件,可将其设置为可向下浮动的。
2009-7-26 Visual FoxPro 6.0程序设计 144
注意,在如下情况下,某些数据在打印时会被覆盖:
( 1)将一个域设置为相对于带区底端固定,同时在这个域的下面还有一个域,设置为相对于带区顶端固定并且选择了溢出时伸展选项;
设置为相对带区底端固定高度就被固定了带区向下浮动时没有空间
( 2)将一个域设置为相对于带区顶端固定,同时在这个域的上面还有一个域,设置为相对于带区顶端固定并且选择了溢出时伸展选项。
设置为相对带区底端固定带区高度被固定没有溢出时伸展的空间
2009-7-26 Visual FoxPro 6.0程序设计 145
2、不输出重复值对于域控件,可以不输出连续记录的重复值。也就是说,如果某域中的同一个值在连续的记录中重复出现,则只须在第一次出现时打印该值,在后面的记录中不打印该值,直至数值发生改变。
若要不输出重复值,可以先双击该控件,在显示控件的对话框中选择“打印条件”以显示“打印条件”对话框,在该对话框中的
“打印重复值”区域,选择“否”,然后选择 【 确定 】 。
1、双击域 控件如“系部代号”
2、单击 【 打印条件 】
6、在“文本”对话框中单击 【 确定 】
7、预览显示报表数据
3、选择“否”
5、单击 【 确定 】4、选择“在新页 /列的第一个完整信息带内打开”和“当细节区数据溢出到新页 /列时打印”
2009-7-26 Visual FoxPro 6.0程序设计 146
系部代号与上一条记录相同不打印选择“在新页/列的第一个完整信息带内打印”指定换页(或列)
后,遇到第一个新记录时,打印重复值。
选择“当细节区数据溢出到新页/列时打印”指定当细节带区内容溢出到新页(或列)中时,输出重复值。
3、建立打印表达式可以为控件设置表达式,该表达式在打印之前被计算出来。如果表达式的值为“假”,则不打印该字段。添加表达式之后,在
“打印条件”对话框中除了“若是空白行则删除”选项外,其他选项全部
2009-7-26 Visual FoxPro 6.0程序设计 147
无效。若要添加一个打印表达式,可以先双击该控件,再选择
“打印条件”,然后在“仅当下列表达式为真时打印”框中,输入一个表达式。或者单击对话按钮,使用“表达式生成器”建立一个表达式,最后选择 【 确定 】 。
4、不打印空行对于报表中的某些域控件,记录中往往会没有数值。默认情况下,
VFP将为那些空的域保留区域。可以将这些空白的区域清除,使所显示的信息更为理想、更为连续。
若要不打印空行,可以先双击在报表中可能会引起空行的控件,
再选择“打印条件”,然后选择“若是空白行则删除”,最后选择 【 确定 】 。
如果一行中所有域的值经计算后都为空,则 VFP从报表中删除此行。如果不打印该域,或者域中的值为空,VFP将会检查该行的其他控件:找不到的话,此行被删除。如果没有选择该选项,而且该行中没有其他的控件,那么会打印一个空行。
返回
2009-7-26 Visual FoxPro 6.0程序设计 148
8.4.2 为组设置打印选项在报表中,可以对组的打印方式进行控制。有时可能希望同一个组中的内容不要跨页显示;有时可能希望控制是否打印组标头。
1、设置组的分页及组标头选项
(1)在系统菜单中选择 【 报表 】 |【 数据分组 】
在“数据分组”对话框中,除了可选择
(或输入)用于分组的域或表达式外,还可以对组的分页选项进行设置 。如:
Left(学号,2)
对组(及其标头)
的显示可能有特别的要求。比如,
可能希望一个组不要横跨两列
(对于多列的报表);不要纵跨两页;或者每一组的页码都从 1
开始重编。
该对话框提供了四个选项来完成这些任务。
2009-7-26 Visual FoxPro 6.0程序设计 149
2、防止出现孤立的组标头设置合适的值,可以 防止出现孤立的组标头如果标头和底部的相对位置比所规定的尺寸(用英寸或厘米表示)要小,
VFP会将标头移到新的一页中打印。
注意:为了给孤立控件确定一个比较理想的值,可以将组标头带区的高度扩大到细节带区高度的一至三倍。
在组纵跨两页时,
可能需要在新的一页中重复打印组标头,将其显示在连续信息的顶部。如果报表中存在嵌套的多个数据组,那么在连续页中,标头应是嵌套结构中最内层的组的标头。
所以,应该将所有组标头中要打印的控件放置在最内层的组标头带区中。
3、重复输出组标头选择“每页都打印组标题”,可以重复输出组标头返回
2009-7-26 Visual FoxPro 6.0程序设计 150
8.4.3 控制报表和标签的输出使用 REPORT或 LABEL命令的下列某一关键字,可以控制报表和标签输出到什么地方,PRINT,PREVIEW或 FILE,如果不使用任何关键字,报表将输出到屏幕或活动窗口。
PRINT——输出到打印机;
PREVIEW——在系统默认窗口显示;
FILE——输出到文件。
1,选择要打印的记录在打印一个报表时,若要限制在报表中出现的记录,可以使用筛选条件:
■ 指定一定数量或者范围内的记录 。
■ 使用 FOR表达式,选择满足条件的记录 。
■ 使用 WHILE表达式选择记录,直到找到一个不满足条件的记录 。
可以任意组合使用上述方法,使用 WHILE表达式将忽略其他的条件 。
2009-7-26 Visual FoxPro 6.0程序设计 151
(1)打印一定数量或者范围内的记录限制记录数目的一种方法是指定一定数量或者一定范围内的记录。
使用“范围”选项,可以在文件中选择单个记录或者一组连续存放的记录。
注意:活动的索引或者当前记录的指针会影响 [<范围 >]子句中
Next和 Rest选项,但 Record选项不会受影响,这是因为当表被设置索引之后,表中每个记录号并不会变化。
若要选择一定数目的记录,
可以从选择 【 文件 】 |【 打印 】
单击 【 选项 】
单击 【 选项 】
设置“作用范围”可以打印一定数量或者范围内的记录
(2)打印满足某个条件的记录在此设置条件
ALLTRIM(班级 )="99电子 "
2009-7-26 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
返回
2009-7-26 Visual FoxPro 6.0程序设计 153
小 结
1、利用报表向导设计报表和标签。
2、利用报表设计器设计报表,报表工具栏中各控件的作用及使用。
3、重定义报表的页面布局。
4、报表中的域控件的使用方法,域控件的溢出伸展设置方法。
5、定义报表变量及报表变量在报表中的作用。
6、将报表集成到应用程序中,使用表单收集用户的输入信息。
7、报表的输出命令,REPORT。
8、为控件设置打印选项及控制报表的输出。
返回