2010-5-20 Visual FoxPro 6.0程序设计 1
学习要点
1、过程化程序设计和面向对象程序设计的基
本概念及设计方法;
2、过程化程序设计的语言基础,程序设计基
本结构;
3、可视化程序设计的基本方法、类。
第 5章 VFP6程序设计基础
2010-5-20 Visual FoxPro 6.0程序设计 2
第 5章 VFP6程序设计基础
5.1 VFP6程序设计概念
5.2 VFP6的程序设计语言基础
5.3 VFP6程序设计步骤
5.4 面向对象的程序设计技术
小 结
返回 退出
2010-5-20 Visual FoxPro 6.0程序设计 3
5.1 VFP6程序设计概念
5.1.1 VFP6程序设计基本概念
5.1.2 VFP6程序设计基本操作
5.1.3 VFP程序设计编程方式
返 回 退 出
2010-5-20 Visual FoxPro 6.0程序设计 4
5.1.1 VFP6程序设计基本概念
VFP6支持过程化程序设计和面向对象程序设计两种程序设计与
开发的类型。
下面是一个完整的 VFP过程化程序,可以引出几个基本概念。
*功能说明:求圆形的面积。
*文件名,L501.PRG
CLEAR
CTALK=SET("TALK")
SET TALK OFF
INPUT "请输入圆的半径,半径 =" TO R
S=PI()*R*R
"半径为 "+ALLTRIM(STR(R))+"的圆,面积 =",S
SET TALK &CTALK
RETURN
2010-5-20 Visual FoxPro 6.0程序设计 5
1、从形式上看,VFP的程序是由若干有序的命令行组成,且
满足下列规则:
( 1) 一个命令行内只能写一条命令, 命令行的长度不得超过
2048个字符, 命令行以回车键结束 。
( 2), 一个命令行可以由若干个物理行组成, 即一条命令在一
个物理行内写不下时, 可以分成几行 。 换行的方法有两种:一种
是在物理行的末尾加符号, ;‖,表示下一行输入的内容是本行的
继续;另一种是系统自动换行, 即输入程序时, 只管逐条命令输
入, 无需考虑本条语句是否超过屏幕行宽的最大限度, 当输入的
语句超过屏幕的最大行宽时, 系统自动换行 。 输入时只需在一行
结束时按回车键, 通知系统本命令行输入完毕 。
( 3) 为便于阅读, 可以按一定的格式输入程序, 即一般程序结
构左对齐, 而控制结构内的语句序列比控制结构的语句缩进若干
格 。
2,从功能上看, 程序可以分为三个部分:
第一部分是程序的说明部分, 在本例程序中是前面的四行, 一
2010-5-20 Visual FoxPro 6.0程序设计 6
般用于说明程序的功能、文件名等需要说明的有关信息。
第二部分是进行数据处理的部分, 在本例程序中是从第五行开始
的三行 。 通常任何一个有意义的程序, 总是要有一些原始数据,
否则, 这个程序就没有处理对象 。 同样, 程序运行的结果也有必
要显示或打印出来, 否则, 用户将不知道程序干了一些什么 。 因
此, 第二部分程序常包括下列三个部分, 依次为:提供原始数据
部分, 数据处理部分, 输出结果部分 。
第三部分是程序的控制返回部分,在本例中就是最后二条命令。
它控制程序返回到调用该程序的调用处。
过程化程序设计与面向对象程序设计
过程化程序设计,它是采用结构化编程语句来编写的程序。
这类方法的特点是容易把一个复杂的程序分解为若干个较小的过
程,每个过程都可进行独立的调试。这类设计方法发展的总思想
是从程序员角度考虑使程序设计更简单,而较少从使用角度去考
虑。使用这类方法设计的程序流程完全由程序员控制,使用者只
能做由程序员预先安排好的事情。
2010-5-20 Visual FoxPro 6.0程序设计 7
面向对象程序设计,这类程序设计思想是面向对象,即设计
的重要任务在于描述对象。程序是由事件驱动的,因而,在执行
过程中,持续等待的是一个发生在对象上的事件。而发生什么事
件则要看使用者的操作,如单击、双击鼠标等。至于下一步的程
序流向,则要看驱动的是什么事件。这类程序设计的主要目的是
从任何方便与简化使用入手,由使用者控制程序流向,这在一定
程序上增加了编程的难度。
5.1.2 VFP6程序设计基本操作
1、过程化程序设计基本操作
( 1)建立过程文件。在 VFP中,一个过程文件就是一个 ASCII
文本文件,因而可用各类编辑工具来建立。在 VFP中有下面二
种简易方法来建立:
■在 【 文件 】 菜单下的 【 新建 】 菜单项中,选择“程序”可选
项 。■在命令窗口中使用 MODIFY COMMAND命令。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 8
格式,MODIFY COMMAND [<文件名 >/? ]
功能,打开文本编辑窗口,编写程序代码。
参数描述:
[<文件名 >],为可选项,指定打开或创建的程序文件名。若不指
定新建程序文件的扩展名,VFP自动指定,PRG为扩展名。
MODIFY COMMAND命令支持含有,*”和“?”通配符的文
件梗概。名称与这个梗概匹配的每一个文件都在编辑窗口中打开。
若省略文件名,将给打开的编辑窗口赋一个初始名称“程序
1.PRG‖。当关闭编辑窗口时,可以用另外的文件名保存该文件。
[? ],显示“打开”对话框。可以从中选择一个已有程序或输入
要创建的新程序名。
说明:
修改程序文件之后,更新过的文件将写到磁盘上。除非在配置
文件中用 TEDIT指定一个外部编辑器,否则,一般使用 VFP的内
置编辑器。
2010-5-20 Visual FoxPro 6.0程序设计 9
【 例 5-2】 用户通过 VFP6的命令窗口建立上例程序文件。
在 VFP6的命令窗口中输入下条命令后按回车键。
MODIFY COMMAND L501
打开程序编辑窗口
在程序编辑窗口
中输入程序代码
用 Ctrl+W存盘退出
编辑窗口,或单击
程序编辑窗口上的
【 关闭 】 按钮,在
弹出的对话窗口中
确定存盘,生成
L501.prg文件。
2010-5-20 Visual FoxPro 6.0程序设计 10
( 2)运行程序 下面的任一方法均可运行程序:
■选择 【 程序 】 菜单下的“运行”菜单,利用“运行”对话框选
择要运行的程序;
■在命令窗口中输入如下命令:
DO <程序文件名 >
系统就会运行这个程序。如果文件不加扩展名,系统会假定它具
有,PRG的扩展名,如果想运行一个具有其它扩展名的命令文件时,
在输入命令时必须给出这个命令文件的全名。
如:要运行上例中编辑的程序,可以在命令窗口中输入:
DO L501
然后按回车键执行。
2010-5-20 Visual FoxPro 6.0程序设计 11
2、事件驱动程序设计基本操作
VFP6提供了真正的无模式操作,使用户不仅能够轻松地进行多个
表单的自动协调,而且可以很容易地同时运行一个表单的多个实
例。 VFP6还提供了事件处理机制,可以给用户提供一个更为丰富
的交互环境。
事件驱动程序设计基本操作,关键是确定事件以及对事件发生时
应作出的反应。一个事件发生时,VFP6系统应作出的反应,仍可
通过一个过程来实现,即用过程化程序设计的方法来处理某一事
件发生时系统应作出的响应。
通常,VFP6程序设计时应考虑的事件有:
(1)核心事件 表 5-1是 VFP6中核心事件列表, 这些事件适用于大多
数的控件 。
(2)容器事件和对象事件 。
为控件编写事件代码时, 请注意以下两条规则:
■ 容器不处理与所包含的控件相关联的事件;
■ 若没有与某控件相关联的事件代码, 则 VFP在该控件所在类层
次结构中逐层向上检查是否有与该事件相关联的代码 。
2010-5-20 Visual FoxPro 6.0程序设计 12
表 5-1 VFP6核心事件
返 回 165
2010-5-20 Visual FoxPro 6.0程序设计 13
当用户以任意一种方式(使用 Tab键、单击鼠标等)与对象交互
时,对象事件被触发。每个对象独立接受自己的事件。
例如,在图 5-2中,尽管命令按钮位于表单上,当用户单击命令
按钮时,不会触发表单的 Click事件,只触发命令按钮的 Click事
件。若没有与命令按钮相关联的 Click事件代码,尽管有与表单相
关联的 Click事件代码,当用户单击按钮时,也不会执行与表单相
关联的 Click事件代码。
图 5-2容器、控件事件代码相对独立
这些规则也适用于表格控件。
表格事件包含列,列又包含
标头和控件。事件发生时,
只有与事件相关联的最底层
对象识别该事件,更高层的
容器不识别这个事件。图 5-
3演示了当用户在表格上移
动鼠标时,哪个对象处理这
个 MouseMove事件。
2010-5-20 Visual FoxPro 6.0程序设计 14
图 5-3 表格的 MouseMove事件
例如:在一个命令按钮上,按下鼠标左键并拖动鼠标指针离
开命令按钮,尽管鼠标指针可能已经在表单上,但这个命令
按钮的 MouseMove事件还在不断产生。当在表单上而不是在
命令按钮上释放鼠标时,发生的 MouseUp事件是与命令按钮
相关联的,而不是与表单的 MouseUp事件相关联。
2010-5-20 Visual FoxPro 6.0程序设计 15
( 3) VFP6中类和控件事件
若表单上的控件基于一个用户自定义的类,当一个事件发生时,
VFP首先在该控件中查看是否有与此事件相关联的代码,若找
到,则执行它;否则,VFP将在类层次中向上一层检查。无论
VFP在类层次的哪个地方找到该事件的代码,都执行它,如图 5-
4所示。
图 5-4 若没有与对象相关联的事件代码,则 VFP将检查父类
返 回
2010-5-20 Visual FoxPro 6.0程序设计 16
5.1.3 VFP程序设计编程方式
VFP程序由代码组成,代码包括以命令形式出现的指令、函数
和 VFP可以理解的任何操作。这些指令包含在“命令”窗口、程
序文件、表单设计器与类设计器的事件或方法程序代码窗口、菜
单设计器的过程代码窗口、报表设计器的过程代码窗口中。
使用“命令”窗口
可以在“命令”窗口中键入 VFP命令并按 Enter键执行。若要重
新执行该命令,还可以将光标移到此命令所在行并按 Enter键。
甚至可以在“命令”窗口中像独立程序一样执行多行代码。要
在“命令”窗口中运行多行代码,可以按下述方法执行:
( 1)选取代码行。
( 2)按 Enter键或右击并在快捷菜单中选择“运行所选区域”。
因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用
VFP提供的编辑工具。在“命令”窗口中可以修改、插入、删除、
剪切、复制和粘贴正文。
2010-5-20 Visual FoxPro 6.0程序设计 17
在“命令”窗口中执行命令的优点是:能够立即执行被键入的
命令,不需要将其保存为文件并用程序方式执行。此外,在菜
单或对话框中所作的选择可以马上转换成“命令”窗口中的命
令。用户可以将这些命令复制并粘贴到 VFP程序中,然后重复
执行这些程序。这样做可以很容易地重复执行成百上千条的命
令。
2、创建程序
VFP程序是包含一系列命令的文本文件。在 VFP中可以通过下
述途径创建程序:
( 1)在项目管理器中,选定“代码”选项卡中的“程序”项;
( 2)选择“新建”命令。
或者:
( 1)在 【 文件 】 菜单中选择 【 新建 】 命令;
( 2)在“新建”对话框中选择“程序”;
( 3)单击 【 新建文件 】 按钮。
或者在“命令”窗口中键入:
MODIFY COMMAND
2010-5-20 Visual FoxPro 6.0程序设计 18
3、保存程序
创建程序后,一定要注意保存程序。若要保存程序,可以从 【 文
件 】 菜单中选择 【 保存 】 命令。或者按 Ctrl+W组合键保存,若不
想保存对新建程序或已有程序所做的修改,也可以使用 Ctrl+Q组
合键,不存盘而退出编辑窗口。
若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户
是否保存已作的修改。
若保存了一个由项目管理器创建的程序,则该程序被加入到项目
中。
若保存一个尚未命名的程序,则会打开“另存为 …‖ 对话框,提
示用户可以在其中为程序指定程序名。程序保存后,可以运行或
修改它。
4、修改程序
程序保存后可以修改。首先,按以下四种方法之一打开想要修改
的程序文件:
■若程序包含在一个项目中,则在项目管理器中选定它并选择
2010-5-20 Visual FoxPro 6.0程序设计 19
修改命令。
■在 【 文件 】 菜单中选择 【 打开 】 命令,这时弹出一个包含文
件列表的对话框,在“文件类型”列表框中选择“程序”,然后
在文件列表中选定要修改的程序,单击 【 确定 】 按钮。
■在“命令”窗口中按如下方式键入要修改的程序名:
MODIFY COMMAND <程序文件名 >
■ 在“命令”窗口中输入:
MODIFY COMMAND?
然后从文件列表中选择要修改的程序,单击 【 打开 】 按钮。
打开文件之后便可进行修改,修改完成后就可以保存。
5、运行程序
程序创建之后便可以运行 。 若要运行程序, 有以下三种方法:
■ 若程序包含在一个项目中, 则可在项目管理器中选定它, 并选
择 【 运行 】 命令 。
2010-5-20 Visual FoxPro 6.0程序设计 20
■ 在 【 程序 】 菜单中选择 【 运行 】 菜单项,然后在程序列表中,
选择想要运行的程序,并单击 【 运行 】 按钮。
■ 在“命令”窗口中,按如下方式键入 DO以及要运行的程序
文件名:
DO <程序文件名 >
6、使用 VFP设计工具编写代码
借助表单设计器、类设计器和菜单设计器,用户可以很容易地
把程序代码与用户界面连接起来,这样应用程序便可响应用户的
输入并执行相应的代码。同样,报表设计器将程序代码与报表文
件联系起来,以定制结构复杂并且符合用户要求的报表。如果想
充分发挥 VFP的强大功能,应充分使用刚才提到的设计工具。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 21
5.2 VFP6的程序设计语言基础
5.2.1 VFP的交互式输入输出命令
5.2.2 VFP6程序设计的条件与循环
返 回 退 出
2010-5-20 Visual FoxPro 6.0程序设计 22
5.2.1 VFP的交互式输入输出命令
设计程序,就是用一系列命令存储数据并操作这些数据。程序
设计的原材料是数据和数据的存储容器,而处理这些原材料的工
具是命令、函数的操作符。
1、交互式输入命令
( 1)字符接收语句
格式,ACCEPT [<提示信息 >] TO <内存变量名 >
功能,将从键盘上接收的字符串数据存入指定的内存变量中。提
供此命令是为了向后兼容,在 VFP中可以用文本框控制命令代替。
参数描述:
[<提示信息 >],指定提示信息字符串,其后是数据输入区。在
VFP中,提示文本的字体与 VFP主窗口的字体相同。但输入的字
符数据用 9磅 FoxFont字体显示。
2010-5-20 Visual FoxPro 6.0程序设计 23
[<内存变量名 >],指定存储字符数据的内存变量或数组元素。
如果没有定义此内存变量,ACCEPT将自动创建。如果没有输入
数据就按 Enter键,内存变量或数组元素则为空字符串。
说明:
在 VFP中可用表单设计器或 DEFINE CLASS来创建文本框控制 。
ACCEPT命令允许直接向内存变量或数组元素输入字符数据, 输
入时不需要用引号将字符括起来 。
执行此语句时,先在屏幕上显示 <提示信息 >,光标紧随其后,
然后暂停程序运行,等待用户从键盘上输入信息。输入的信息可
以是任何可显示的 ASCII码字符串,并以回车键结束。系统将此
字符串信息存入指定的内存变量中,然后,继续运行暂停的程序。
【 例 5-3】 试编程完成下述功能:从键盘随机输入某个表的文件
名, 要求打开并显示此表的内容 。
在命令窗口输入下列命令:
MODIFY COMMAND L503 (文件名中的扩展名,PRG可省略, 以
后不再说明 )
2010-5-20 Visual FoxPro 6.0程序设计 24
屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用 Ctrl+ W
存盘,返回命令窗口。
CLEAR
SET TALK OFF
ACCEPT "请输入表文件名 " TO FileName
USE (FileName)
LIST
USE
RETURN
说明:程序中第四句使用了宏代换函数,这是由于 FileName本
身不是文件名,而其内容才是文件名。
( 2)通用数据接收命令
ACCEPT语句只能给字符型内存变量提供数据。如果用户想给
其它类型的内存变量提供数据,可以使用下列命令:
格式,INPUT[<提示信息 >] TO <内存变量名 >
2010-5-20 Visual FoxPro 6.0程序设计 25
功能,用于接收从键盘上输入的表达式,并将计算结果存入指定
的内存变量或数组元素中。包含此命令也是为了提供向后的兼容
性。在 VFP中,该命令也可以用文本框控制代替。
参数描述:
[<提示信息 >],提示信息,提示用户输入数据。
[<内存变量名 >],指定一个内存变量或数组元素,存储从键盘输
入的数据。如果指定的内存变量或数组元素不存在,VFP将自动
创建该内存变量或数组。
说明:
INPUT语句与 ACCEPT语句的执行过程相同,功能相似。
<内存变量名 >的数据类型取决于输入数据的类型。可以为数字型、
字符型、日期型和逻辑型。
INPUT语句与 ACCEPT语句的区别 是,ACCEPT命令只能接收
字符串,而 INPUT语句可以接收任意类型的 VFP表达式;如果输
入的是字符串,ACCEPT语句不要使用字符型定界符,而 INPUT
语句必须用定界符括起来。
2010-5-20 Visual FoxPro 6.0程序设计 26
【 例 5-4】 试编程完成下列功能。从键盘上随机输入一个正数,
以此数为半径,求圆面积和球体积,并输出结果。
程序如下:
*L504.PRG
CLEAR
CTALK=SET("TALK")
SET TALK OFF
INPUT "半径 =" TO R
S=PI()*R*R
V=4/3*PI()*R**3
"圆面积 =",S
"球体积 =",V
SET TALK &CTALK
RETURN
程序中的第一行为注释行,说明
此程序文件名;第四行的功能是
不显示命令处理信息,第十行的
功能是恢复显示命令处理信息。
在命令窗口中执行:
DO L504
屏幕显示
半径 =
输入 10后
按 Enter键10
显示结果
圆面积 = 314.16
球体积 = 4188.790205
2010-5-20 Visual FoxPro 6.0程序设计 27
( 3)输入一个字符语句
格式,WAIT[ <提示信息 >] [TO <内存变量名 >]
功能,暂停正在运行的程序,直到输入一个字符为止。
此语句与 ACCEPT语句的功能部分相似。若选择 TO <内存变量名
>子句,则将输入的单个字符存入指定的内存变量。若直接输入
回车键,则内存变量中存入空字符串。内存变量的类型为字符型。
若选择 <提示信息 >子句,执行此命令时,屏幕上将显示提示信息,
否则,屏幕上将显示“按任意键继续 …‖
WAIT语句主要用于下列两种情况。
■暂停程序的运行,以便观察程序的运行情况,检查程序运行的
中间结果。
■根据实际情况输入某个字符,以控制程序的执行流程。比如,
在某应用程序的,Y/ N‖选择中,常用此命令暂停程序的执行,
等待用户回答,Y‖或,N‖,由于这时只需输入单个字符,也不
用按回车键,操作简便,响应迅速。
2010-5-20 Visual FoxPro 6.0程序设计 28
2、格式化输出命令
前面的章节中在屏幕上显示信息时,使用的是非格式化输出命
令:,?‖或,‖,为了能按一定的要求来设计屏幕格式,使之美
观、方便,下面介绍一个屏幕显示格式控制命令。
格式,@ <行号,列号 > SAY <表达式 >
功能,从指定的行、列号开始输出表达式的值。
说明,① <表达式 >可以是常数、字段变量及由它们组成的表达式。
②定位输出时,一次只能输出一个表达式。
3、程序设计辅助命令
( 1)、中止程序运行
■在程序运行过程中,按 Esc键可以中止程序的运行,系统会显示
警告对话框让用户选择:
【 取消 】 中止程序运行,这是缺省选择;
【 挂起 】 暂停程序运行,返回命令窗口。当选择 【 程序 】 菜单下
的 【 继续执行 】 选项或在命令窗口中输入,Resume‖命令,系统
2010-5-20 Visual FoxPro 6.0程序设计 29
则从中止的地方继续程序的执行;
【 忽略 】 忽略所给的 Esc,继续程序的执行。
通常在程序的开始时加有命令:
SET ESCAPE OFF
执行该命令后,Esc键处于关闭状态,在程序运行过程中,用户
不能通过 Esc键来中止程序的运行,因为在应用程序中,不希望
中止它;而在程序调试阶段,通常不关闭这个键,让程序在运行
过程中,随时都可以中断执行,以检查程序中间的运行状况。
格式 一, CANCEL
功能,结束程序的运行,返回命令窗口,同时关闭所有打开
的文件。
格式二, SUSPEND
功能,暂时中止程序运行,返回命令窗口。当在菜单中选择
【 程序 】 |【 继续执行 】 时,或在命令窗口中输入 RESUME命令
时,系统再次从中止的地方继续执行程序。
2010-5-20 Visual FoxPro 6.0程序设计 30
( 2)、注释命令
格式一,NOTE/ * <注释字符串 >
格式二,&& <注释字符串 >
说明,上述命令不作任何操作,只是注释标记,用于说明程序
或命令的功能等。注释内容不需要用定界符定界,执行时也不显
示。注释信息如果在一行内没有写完,换行时也必须再写注释命
令。 NOTE或 *是用于整行注释的,因此,它必须写在每一个注释
行的开头;而 &&命令是用于注释一行的部分内容的,因此,它
可以写在行中(命令的尾部、注释信息的头部),这是程序中唯
一可以在一个逻辑行写二个语句的命令。
USE STUDENT &&打开 STUDENT表
( 3)文本显示命令
格式,TEXT
<文本字符串 >
ENDTEXT
功能,将 <文本字符串 >原样输出。
这条命令通常是用于程序中对用户
说明某些问题。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 31
5.2.2 VFP6程序设计的条件与循环
VFP的程序结构可以分为三种:顺序结构、分支结构、循环结构。
下面将以一个程序演示条件分支结构的循环结构,并对这些概
念详细说明。
【 例 5-5】 假设某单位有很多员工,并且要给月工资高于或等于
1000元的员工增加 5%的工资,给月工资低于 1000元的员工增加
10%的工资。
下面的示例程序将完成这一任务。此示例程序假定已在当前工作
区打开了员工工资表,表中有一个名为“月工资”的数值型字段。
*L505
CTALK=SET("TALK")
SET TALK OFF
SCAN
IF 月工资 >=1000
REPLACE 月工资 WITH 月工资 *1.05
2010-5-20 Visual FoxPro 6.0程序设计 32
ELSE
REPLACE 月工资 WITH 月工资 *1.1
ENDIF
ENDSCAN
SET TALK &CTALK
RETURN
在这一示例程序中用到了顺序结构、循环结构和条件分支结构。
1,条件语句
条件分支根据条件的计算结果执行不同的操作。
条件分支结构逻辑流程图,
入口
条件判断真 假
语句序列 1
出口
语句序列 2
VFP中有两条命令实现条件分支:
格式,IF <条件表达式 >
<语句序列 1>
[ELSE
<语句序列 2>]
ENDIF







2010-5-20 Visual FoxPro 6.0程序设计 33
参数描述:
<条件表达式 >,指定要计算的逻辑表达式 。 如果 <条件表达式 >
的值为, 真,, 则执行 IF语句之后的 <语句序列 1>;如果 <条件
表达式 >的值为, 假,, 而且包含 ELSE语句和 <语句序列 2>,则
执行 <语句序列 2>;如果 <条件表达式 >的值为, 假,, 而且不包
含 ELSE语句和 <语句序列 2>,则程序忽略 IF语句和 ENDIF语句之
间的所有语句, 程序从 ENDIF语句后的第一条命令开始继续往下
执行其它程序 。
说明,一个 IF…ENDIF 语句块中可以嵌套另一个 IF…ENDIF 语
句块。
从 【 例 5-5】 所示的程序中可以看到:当当前记录中“月工资”
字段的值大于等于 1000元时,将使“月工资 >=1000‖这个条件表
达式的值为“真”,此时,程序控制执行 <语句序列
1>―REPLACE 月工资 WITH 月工资 *1.05‖,即将月工资高于或等
于 1000元的工资上调 5%。否则,即当当前记录中“月工资”字
段的值低于 1000
2010-5-20 Visual FoxPro 6.0程序设计 34
元时,将使“月工资 >=1000‖这个条件表达式的值为“假”,此
时,程序控制执行 <语句序列 2>―REPLACE 月工资 WITH 月工资
*1.1‖,即将月工资低于 1000元的工资上调 10%。
( 2)多条件选择语句
格式,DO CASE
CASE <条件表达式 1>
<语句序列 1>
[CASE <条件表达式 2>
<语句序列 2>

CASE <条件表达式 N>
<语句序列 N>]
[OTHERWISE
<语句序列 N+1>]
ENDCASE
参数描述:
CASE <条件表达式 1> <语
句序列 1> …, VFP在执行这
条多条件选择命令时,按命
令行中写出的条件表达式的
顺序逐条检查 <条件表达式 >,
当遇到第一个结果为“真”
的 <条件表达式 >时,就执行
它后面的语句序列。语句序
列中的命令逐条被执行,直
到遇到下一个 CASE或
OTHER-WISE或 ENDCASE,
然后,
2010-5-20 Visual FoxPro 6.0程序设计 35
再从 ENDCASE语句后的第一条命令开始继续执行其它命令。
如果一个 CASE <条件表达式 >的 <条件表达式 >为“假”,就
忽略它后面的语句序列。
【 例 5-6】 运行一个程序,随机输出一条信息:
CLEAR
AA=INT(RAND()*10) &&随机产生一个 10以内的整数
DO CASE
CASE AA=0
―这次产生的随机数是,0‖
CASE AA=1
―这次产生的随机数是,1‖
CASE AA=2
―这次产生的随机数是,2‖
CASE AA=3
―这次产生的随机数是,3‖
OTHERWISE
―这次产生的随机数是:大于 3!”
ENDCASE
2010-5-20 Visual FoxPro 6.0程序设计 36
2、循环语句
程序设计中的循环,是指在程序中从某处开始,有规律地反复执
行某一个程序块的现象。 VFP的循环命令有三类:基于条件的循
环、基于计数的循环和基于表的循环。
( 1)基于条件的循环,DO WHILE命令
格式,DO WHILE <条件表达式 >
[<语句序列 >]
[EXIT]
[LOOP]
ENDDO
参数描述:
<条件表达式 >,指定一个逻辑表达式,它的值决定是否执行 DO
WHILE和 ENDDO之间的命令集合。如果 <条件表达式 >的值为
“真”,就执行命令集。
[<语句序列 >],指定当 <条件表达式 >计算为“真”时要执行的
2010-5-20 Visual FoxPro 6.0程序设计 37
[LOOP],直接将程序控制返回到 DO WHILE语句,并重新计算
条件值。 LOOP可以放在 DO WHILE和 ENDDO之间的任何位置。
[EXIT],将程序控制从 DO WHILE和 ENDDO循环的内部转到
ENDDO后的第一条命令。 EXIT可以放在 DO WHILE和 ENDDO之
间的任何位置。
ENDDO,表明 DO WHILE语句的结束。
【 例 5-7】 计算连续自然数之和, 并且显示和刚大于 1000的最后
一个自然数 。
STORE 0 TO AA,BB
DO WHILE AA<=1000
BB=BB+1
AA=AA+BB
ENDDO
BB
结果显示为 45。
VFP命令集。
2010-5-20 Visual FoxPro 6.0程序设计 38
【 例 5-8】 求连续 N个不是 7的倍数的自然数之和,当和是 101的倍
数时显示最后的自然数和它们的和。
STORE 0 TO AA,BB &&定义二个变量,用以保存累加值和累加数
DO WHILE,T.
BB=BB+1
IF MOD(BB,7)=0 &&判断 BB是否为 7的倍数
LOOP &&如果 BB是 7的倍数则返回去将 BB再加 1
ENDIF
AA=AA+BB &&将 BB不是 7的倍数的连续自然数累加求和
IF MOD(AA,101)=0 &&判断 AA是否是 101的倍数
EXIT &&如果 AA是 101的倍数,则结束程序的循环
ENDIF
ENDDO
BB,AA
屏幕显示结果为 207和 18483。
2010-5-20 Visual FoxPro 6.0程序设计 39
( 2)基于计数的循环,FOR命令
格式,FOR <内存变量 >=<初始值 > TO <终值 > [STEP <步长 >]
<语句序列 >
[EXIT]
[LOOP]
ENDFOR/NEXT
参数描述:
<内存变量 >,指定作为计数器的内存变量或数组元素。在执行
FOR…ENDFOR 语句之前,此内存变量或数组元素不一定存在。
<初始值 > TO <终值 >,<初始值 >是计数器的初始值,而 <终值 >
是计数器的终止值。
[STEP <步长 >],是计数器递增或递减的步长。如果 <步长 >是负
值,则计数器递减;如果省略 STEP子句,计数器每次递增 1。
<语句序列 >,指定要执行的 VFP命令,它可以包含任意数量的命
令。
2010-5-20 Visual FoxPro 6.0程序设计 40
[EXIT],将控制权交给紧接在 ENDFOR后面的命令。可以在 FOR与
ENDFOR之间的任何地方放置 EXIT。
[LOOP],将控制权直接交给 FOR子句,不再执行 LOOP与 ENDFOR之
间的语句。计数器正常递增或递减,就像执行到 ENDFOR子句一样。
可以在 FOR与 ENDFOR之间的任何地方放置 LOOP。
说明:
可以用内存变量或数组元素作为计数器, 指定 FOR… ENDFOR循环中
VFP命令的执行次数 。 在遇到 ENDFOR或 NEXT之前, 始终执行 FOR后
面的 VFP命令 。 执行过程中, 每循环一次, 计数器都会产生一次计
数, 计数增量由 <步长 >值控制, 然后把计数器的值与 <终值 >进行
比较, 决定是否进行下一次循环 。
【 例 5-9】 求 1到 100中偶数的和
AA=0
FOR II=2 TO 100 STEP 2
AA=AA+II
ENDFOR
AA 屏幕显示为,2550
2010-5-20 Visual FoxPro 6.0程序设计 41
( 3)基于表的循环命令
格式,SCAN [<范围 >] [FOR <条件 >] [WHILE <条件 >]
[<语句序列 >]
[LOOP]
[EXIT]
ENDSCAN
参数描述:
[<范围 >],指定对当前表中记录扫描的范围。只有在范围之内的
记录才有可能扫描到。 SCAN命令的默认范围为 ALL。
[FOR <条件 >],只有条件表达式的计算结果为“真”的记录,才
能对其执行命令。包含 FOR子句可以筛选出不想扫描的记录。
[WHILE <条件 >],指定一个逻辑表达式作为执行命令的条件,
只要逻辑表达式计算为“真”,就对记录执行命令,直到遇到使
表达式不为“真”的记录为止。
[<语句序列 >],指定要执行的 VFP命令集。
2010-5-20 Visual FoxPro 6.0程序设计 42
[LOOP],把控制权直接交给 SCAN子句。 LOOP子句可以放在
SCAN和 ENDSCAN之间的任何地方。
[EXIT],把控制权力从 SCAN…ENDSCAN 循环语句交给
ENDSCAN下面的命令。 EXIT子句可以放在 SCAN和 ENDSCAN
之间的任何地方。
ENDSCAN,标志 SCAN过程的结束。
说明,SCAN命令自动将记录指针移到下一条满足条件的记录,
并执行相应的命令块。
【 例 5-10】 逐条显示 STUDENT表中男生的情况。
USE STUDENT
SCAN FOR 性别 =‖男”
DISP
WAIT
ENDSCAN
USE


使






USE STUDENT
SCAN
IF 性别 #‖男”
LOOP
ENDIF
DISP
WAIT
ENDSCAN
USE
2010-5-20 Visual FoxPro 6.0程序设计 43
3、使用过程和自定义函数
( 1)子程序和过程的调用
子程序或过程的编写和修改方式与一般的程序一样,不同的是过
程的最后一个语句必须是返回语句( RETURN),调用过程的程
序是主程序,过程可以嵌套,即一个子程序可以再调用其它子程
序,但不能形成循环嵌套。
子程序或过程的调用也是用 DO命令:
格式,DO <过程名 > [IN <程序文件名 >][WITH <参数表 >]
功能,执行过程名所指定的子程序。 WITH用于主程序和子程序
间参数的传递。
参数描述:
<过程名 >, 指定要执行的过程名称。 VFP首先在当前执行的程序
中查找此过程,如果在该程序中找不到此过程,VFP就在用 SET
PROCEDURE命令打开的过程文件中查找此过程,如果还未找到,
则以反向调 用顺序在当前打开的其它程序文件中查找此内
2010-5-20 Visual FoxPro 6.0程序设计 44
内部过程;若仍未找到,则在磁盘上检索以,FXP为扩展名的外部
过程;若还未找到,最后检索以,PRG扩展名的外部过程,并把它
编译为,FXP文件。
在执行一个可执行文件或应用程序中,多个过程可以有相同的过
程名。当使用 DO去启动一个可执行文件或一个应用程序的过程
时,VFP只在可执行文件或应用程序的主程序中搜索指定的过程。
IN <程序文件名 >, 执行 <程序文件名 > 指定的程序文件中的一个
过程。当找到该文件时就执行该过程。如果找不到该程序文件,
就会显示“文件不存在”的信息。如果找到了程序文件,但指定
的过程不存在,就会显示“找不到过程”的信息。
[WITH <参数表 >],指定要传递给程序或过程的参数。列在 <参
数表 >中的可以是表达式、内存变量、字母和数字、字段或用户
自定义函数。默认情况下,参数按引用传递给程序和过程,也可
以将参数放在括号中按值传递。传递给程序或过程的参数的最大
数目为 27。
2010-5-20 Visual FoxPro 6.0程序设计 45
( 2)子程序或过程的返回语句
格式,RETURN [<表达式 >/TO MASTER/TO <过程名 >]
功能,将程序控制权返回给调用程序。
参数描述:
[<表达式 >],指定返回给调用程序的表达式。如果省略 RETURN
命令或省略返回表达式,则自动将“真”返回给调用程序。
[TO MASTER],将控制权返回给最高层的调用程序。
[TO <过程名 >],将控制权返回给指定的过程。
说明:
RETURN终止程序、过程或函数的运行,并将控制权返回给调用
程序、最高次调用程序、另一个程序或窗口。当执行 RETURN命
令时,VFP释放 PRIVATE(专用)类型的内存变量。通常,
RETURN放在程序、过程或函数的末尾,用来将控制返回给高层
的程序。但是,如果省略 RETURN命令,一个隐含的 RETURN命
令也将被执行。
2010-5-20 Visual FoxPro 6.0程序设计 46
子程序或过程调用及返回示意图
【 例 5-11】 计算圆面积的主程序为 MYMAIN.PRG,子程序为
MYSUB.PRG
*MYMAIN.PRG
CTALK=SET("TALK")
SET TALK OFF
CLEAR
STORE 0 TO RR,AREA
2010-5-20 Visual FoxPro 6.0程序设计 47
DO WHILE,T.
INPUT " 请输入圆的半径," TO RR
DO MYSUB WITH RR,AREA
"圆的面积是,",AREA
WAIT "还要继续计算吗 ( Y/N)? " TO ANSWER
IF UPPER(ANSWER)="Y"
LOOP
ELSE
EXIT
ENDIF
ENDDO
SET TALK &CTALK
*MYSUB.PRG
PROCEDURE MYSUB
PARAMETERS R,S
S=PI()*R^2
RETURN
} 以一个独立的文件形式存在
2010-5-20 Visual FoxPro 6.0程序设计 48
( 3)过程文件的建立
在实际的程序设计中,需要调用的过程不是一个或二个,而是几
个、十几个甚至上百个,这就有可能使打开的文件数超过系统允
许打开的文件数,而且将导致磁盘目录过于庞大,使系统调用文
件的速度降低,程序执行速度也随之下降,因而有必要将若干个
过程按一定的规定放在一个大文件中,这个文件称为过程文件。
1)过程文件的建立
命令格式与建立程序文件一样:
格式,MODIFY COMMAND <过程文件名 >
过程文件的格式要求每个过程文件的开头必须用下列语句:
格式,PROCEDURE <过程名 >
功能,标明是一个过程。
参数描述:
<过程名 >,指定过程名称。命名方法与文件名的命名方法相同。
2010-5-20 Visual FoxPro 6.0程序设计 49
过程文件的内容如下:
PROCEDURE <过程名 1>
<语句序列 1>
RETURN
PROCEDURE <过程名 2>
<语句序列 2>
RETURN


PROCEDURE <过程名 N>
<语句序列 N>
RETURN
说明,在一个过程文件中可以
包含多个过程,在同一个过程文
件中不允许出现相同的过程名,
如果有相同的过程名,则只有第
一次出现的过程才有被调用的可
能。一个过程文件中最多允许包
含 128个过程。
2)过程文件的调用
过程文件和表文件一样,都是在
先打开后才能使用。
① 过程文件的打开命令
格式,SET PROCEDURE TO <过程文件名 >
在主程序中应先打开过程文件,将过程文件中的所有过程都调入
2010-5-20 Visual FoxPro 6.0程序设计 50
内存(打开一个过程文件只算打开了一个文件)
当过程文件不再用时应将其关闭,以节省内存空间。
系统允许打开一个过程文件,当打开另一个过程文件时,先已打
开的过程文件系统会自动将其关闭。
【 例 5-12】 程序中常用到计算圆面积、长方形面积、阶乘等,现
将它们编为三个过程,放在一个过程文件( MYPROCED.PRG)
中,被主程序 MYMAIN.PRG调用。
*MYMAIN
CLEAR
TEXT
这是一个计算圆面积、长方形面积、阶乘等的程序,先输入功能选择,1--计算圆面
积; 2--计算长方形面积; 3--计算阶乘; 4--退出。再输入参数:所有数据之间用逗号
","分隔。如计算长方形面积则在下面的提示信息后面输入 2,10,15。
ENDTEXT
CTALK=SET("TALK")
SET TALK OFF
SET PROCEDURE TO MYPROCED
DO WHILE,T.
ACCEPT "请输入您的功能选择及参数," TO SELECT
PROGNAME="PROGRAM"+SUBSTR(SELECT,1,1)
2010-5-20 Visual FoxPro 6.0程序设计 51
IF (SUBSTR(SELECT,1,1)="1".OR,SUBSTR(SELECT,1,1)="3").AND.OCCURS(",",SELECT)#1;
.OR.SUBSTR(SELECT,1,1)="2".AND.OCCURS(",",SELECT)#2.OR.SUBSTR(SELECT,1,1)>"4";
.OR.SUBSTR(SELECT,1,1)<"1"
WAIT WINDOW AT 15,20 "输入的参数错误,请重新输入! " NOWAIT
LOOP
ELSE
IF SUBSTR(SELECT,1,1)="4"
EXIT
ENDIF
ENDIF
IF OCCURS(",",SELECT)=1
POSITION=ATC(",",SELECT,1)
AA=VAL(SUBSTR(SELECT,POSITION+1,LEN(SELECT)-POSITION))
DO (PROGNAME) WITH AA
ELSE
POSITION1=ATC(",",SELECT,1)
POSITION2=ATC(",",SELECT,2)
AA=VAL(SUBSTR(SELECT,POSITION1+1,LEN(SELECT)-POSITION1))
BB= VAL(SUBSTR(SELECT,POSITION2+1,LEN(SELECT)-POSITION2))
DO (PROGNAME) WITH AA,BB
ENDIF
ENDDO
CLOSE PROCEDURE
SET TALK &CTALK
RETURN
2010-5-20 Visual FoxPro 6.0程序设计 52
*MYPROCED
PROCEDURE PROGRAM1
PARAMETERS R
S=PI()*R^2
"半径为 "+ALLTRIM(STR(R))+"的圆的面积为,",S
RETURN
PROCEDURE PROGRAM2
PARAMETERS LONG,WIDTH
S=LONG*WIDTH
"长为 "+ALLTRIM(STR(LONG))+"宽为 "+ALLTRIM(STR(WIDTH))+;
"的长方形的面积为,",S
RETURN
PROCEDURE PROGRAM3
PARAMETERS R
N=1
T=1
DO WHILE N<=R
T=T*N
N=N+1
ENDDO
"值为 "+ALLTRIM(STR(R))+"的阶乘为,",T
RETURN
2010-5-20 Visual FoxPro 6.0程序设计 53
③ 递归调用
在过程中不但可以调用另外一个过程,而且还可以调用自己,这
就叫递归调用。
【 例 5-13】 求一个 30以内的自然数的阶乘。
*MYMAIN.PRG
CTALK=SET("TALK")
SET TALK OFF
SET PROCEDURE TO MYSUB
INPUT ―请输入一个 30以内的正整数:” TO NUMBER
II=1
DO MYSUB WITH NUMBER,II
CLOSE PROCEDURE
SET TALK &CTALK
RETURN
*MYSUB.PRG
PROCEDURE MYSUB
PARAMETERS MM,NN
IF MM>1
DO MYSUB WITH MM-1,NN &&递归调用。请注意同下一句的次序
NN=NN*MM &&计算乘积。
ENDIF
STR(MM,2)+‖! =‖+STR(NN,10)
RETURN 返 回
2010-5-20 Visual FoxPro 6.0程序设计 54
5.3 VFP6程序设计步骤
5.3.1 对任务进行说明
退 出
5.3.2 分解问题
5.3.3 编制模块
5.3.4 测试模块
5.3.5 组装全部模块
5.3.6 整体测试
5.3.7 提高程序的可靠性
5.3.8 将程序定义为过程或函数
返 回
2010-5-20 Visual FoxPro 6.0程序设计 55
5.3.1 对任务进行说明
开始解决问题之前,需要将其说明清楚。有时调整问题的说明方
式会有助于问题的解决。假设从不同的数据源获得一批数据,其
中大部分是数值型数据,但有些数据中,除包含数字字符外,还
夹杂着一些虚线和空格。现在需要从字段中清除这些虚线和空格,
并将所得到的数字型数据加以保存。可以按如下方式说明需要这
个程序达到的目的,而不是简单地立即着手从原始数据中除去空
格和虚线。
目标 ——用新值替换字段中的原值,新值包含原值中除空格和虚
线以外的所有内容。这种说明方式的优点在于避免在处理长字符
串时遇到的困难。
5.3.2 分解问题
因为最终是以操作、命令和函数的方式将具体的指令提供给
VFP6,所以需要将问题分解为多个独立的步骤。在本问题中,
最容易分离出来的方法是在字符串中逐个扫描字符,只有将单
个字符分离出来才能解决是否应该保存它。 返 回
2010-5-20 Visual FoxPro 6.0程序设计 56
在扫描字符的时候,将检查它是否为虚线和空格。到了这一步也
许想要更详细地说明这个问题,括号之后的数据应该如何提取,
货币符号、逗号和句号该如何消除等一系列问题将出现在大脑中。
代码越通用,为将来节省的时间就越多,问题在于如何做到事半
而功倍。下面给出一个比从前适用范围更广的问题说明方式。
精炼的目标 ——用原始数据中的数值型字符更新字段值。
这便是在字符的层次上重新说明问题。如果字符是数值则保留,
否则将指针移向下一个字符。当用原始字符串中的数值重新构成
一个只包含有数值元素的新串时,用这个新串替换掉原来的字符
串。如此循环,直到将所有记录中的数据全部更新。
概括起来,全部问题可以分解成以下一些模块:
■逐个检查字符;
■判断该字符是否为数值;
■若是数值,则将其复制到新串中;
■检查完字符串的全部后,用只含数字的新串替换原串;
■重复上述步骤,直到表中的全部记录都被更新。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 57
5.3.3 编制模块
清楚了要达到的目标以后,便可以开始用 VFP6的命令、函数和
操作符构造各模块。
因为命令和函数是用来处理数据的,所以需要一些数据来测试其
功能。这些用于测试的数据应与实际数据尽量相近。
例如,在命令窗口中输入如下命令,将一个测试字符串赋值给变
量:
cTest=‖123_456_7 8 9_0‖
1、逐个检查字符
首先,用 SUBSTR()函数(子字符串截取函数)在字符串中逐个
字符截取检查。
Substr(cTest,1,1)
Substr(cTest,4,1)
Substr(cTest,10,1)
Substr(cTest,11,1)
输出结果:
1
-
(空格)
8
2010-5-20 Visual FoxPro 6.0程序设计 58
也可以使用循环结构多次重复执行相同的操作。因为用以测试
的字符串有固定的字符数( 15),即使在表的记录中这个字段的
长度不是定长,也能够使用 FOR循环命令。因为 FOR循环的计数
器每执行一遍增 1,因此,可以在 SUBSTR()函数中使用该计数器。
所以可以编写一个示例程序:
FOR II=1 TO 15
SUBSTR(cTest,II,1)
ENDFOR
将此程序保存为 L508.PRG后运行
运行结果 123_456_7 8 9_0
2、判断字符是否为数字
从字符串中分离出单个字符之后便可以判断它是否为数字。在命
令窗口中输入如下命令:
ISDIGIT(―2‖)
运行结果
.T.? ISDIGIT(―_‖)
ISDIGIT(SUBSTR(cTest,10,1))
.F.
.F.
2010-5-20 Visual FoxPro 6.0程序设计 59
3、若字符为数值,将它复制到新串中
既然可以逐一检查字符是否为数值,下面可以使用内存变量来保
存该数字。为了创建一个变量,需要给它赋一个初值 ——一个零
长度的字符串。
cNumbVar=‖‖
因为 FOR循环扫描整个字符串,所以最好用一个变量暂存每次分
离出来的字符以便处理。
cCharacter=SUBSTR(cTest,II,1)
提示:在计算、求值以及在函数中得到的结果,最好保存在内存
变量中,这样便于直接处理这些变量而不必重新计算或求值。
可以使用以下代码将每个被确认为数字的字符添加到新串中:
cNumbVar=cNumbVar+ cCharacter





cNumbVar=‖‖
FOR II=1 TO 15
cCharacter=SUBSTR(cTest,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR 返 回
2010-5-20 Visual FoxPro 6.0程序设计 60
5.3.4 测试模块
如果将两行用于输出字符串的命令加到程序末尾并运行程序,
就可以看出程序如何对测试字符进行操作。
cNumbVar=‖‖
FOR II=1 TO 15
cCharacter=SUBSTR(cTest,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR
cTest
cNumbVar
程序运行结果
输出似乎是正确的,但在测试模块过程中改变被测试字符串
将出现问题。如在命令窗口中执行下一条命令后再运行这部分
代码将出现问题:
cTest=‖123_456_7 8 9ab0‖ 程序运行结果
123_456_7 8 9ab0
123456789
123_456_7 8 9_0
1234567890
因为 FOR循环只执行 15次,而被测试字符串的长度有 16个字符。
2010-5-20 Visual FoxPro 6.0程序设计 61
对于可变长字符串需要用另外的办法。能否有一种方法,让
FOR循环知道被测试字符串的长度?循环次数由被测试字符串
的长度来决定?事实上 VFP提供了一个函数 LEN()可以检测字符
串的长度。如果将它放在 FOR循环命令中,那么程序在上述两
种情况下都能很好地运行。
cNumbVar=‖‖
FOR II=1 TO LEN(cTest)
cCharacter=SUBSTR(cTest,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR
cTest
cNumbVar
程序运行结果 123_456_7 8 9ab0
1234567890
在命令窗口中执行下一条命令后再运行这部分代码
cTest="123_456_7 8 9ab0cd1e2 3"
程序运行结果 123_456_7 8 9ab0cd1e2 31234567890123
返 回
2010-5-20 Visual FoxPro 6.0程序设计 62
5.3.5 组装全部模块
若要完善此程序,则要从表中读取数据。在对表进行操作时,
需要逐条扫描记录,针对表中记录的字段而不是变量进行操作。
为了说明此步骤,先将 STUDENT表中的“学号”字段的值进行
修改后作为一个测试用表,修改后的 STUDENT表中数据如图 5-
9所示,
图 5-9 测试用数据
在对字段中的字符串进行处理后,目的并不是要将结果保存在
内存变量中,而是要将处理后的值用来替换原来字段中的值。
要对字段的值进行替换,前面已经讲过可以用 REPLACE命令:
2010-5-20 Visual FoxPro 6.0程序设计 63
REPLACE 学号 WITH cNumbVar
在将此条语句加入到程序中后,因为这个程序的功能目前还只是
对当前一条记录的“学号”字段进行处理,而不是对表中所有记
录同时进行处理,这离要求还差一步。通过前面讲到的要对表中
的记录进行全部或部分记录进行处理时,可以使用基于表的循环
命令 SCAN…ENDSCAN 命令。将这些进行组装时要注意,因为
前面的程序是基于内存变量编写的,现在是要将这些代码用于对
表中记录进行处理,为此要将原字符串变量名 cTest改为表中的
字段名“学号”,最后的程序如下:
SCAN
cNumbVar=‖‖
FOR II=1 TO LEN(学号 )
cCharacter=SUBSTR(学号,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR
REPLACE 学号 WITH cNumbVar
ENDSCAN 返 回
2010-5-20 Visual FoxPro 6.0程序设计 64
5.3.6 整体测试
完成全部代码之后,在处理实际数据之前,必须用示例数据进
行测试。运行此程序时,如果当前工作区中没有表打开,此程
序将要求先打开一个表,如果先将 STUDENT表打开后再运行此
程序,则此程序可正常运行。
程序运行后屏幕显示的结果如图 5-9所示:
图 5-10 运行程序测试后 STUDENT表中的部分数据
到此,程序设计基本完成,但为了使程序更可靠,需要进行下
面的改进工作。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 65
5.3.7 提高程序的可靠性
所谓可靠的程序是指一个程序不仅能够完成设计的功能,还可以
预料到可能发生的错误并进行排错处理。上面的程序包含有二个
假设,只有满足了这两个条件,程序才能正常运行。这两个假设
是:在当前目录中有 STUDENT表,或者有一个打开的表;同时,
STUDENT表中有“学号”字段,或者当前工作区中打开的表中
有“学号”字段。如果事先指定打开表,就会限制程序的使用范
围,最好的办法是在运行程序时,由用户根据情况决定打开哪个
表。
下面是改进后的程序,它具备了预料并排除错误的功能:
ACCEPT ―请输入要处理的表文件名” TO TABNAMESR
LtableOK=.F,&&此变量确定程序正常运行的条件之一是否成立。
&&初始值为,F.,假设条件不成立。
LfieldOK=.F,&&此变量确定程序正常运行的另一条件是否成立。
TABNAME=‖‖ &&定义一个变量用于保存表文件名
IF AT(―.‖,TABNAMESR)=0
TABNAME=TABNAMESR+‖.DBF‖ &&使输入的文件名带有扩展名
2010-5-20 Visual FoxPro 6.0程序设计 66
ENDIF
DO WHILE,T.
IF FILE(TABNAME) &&判断所输入的文件名是否存在。
USE (TABNAME) &&打开所输入的表文件
LtableOK=.T,&&将表的标志置为,.T.‖
EXIT &&跳出循环体
ELSE
=MESSAGEBOX(―当前目录中没有所输入的表文件!”,64,‖表名错误!” )
USE? &&显示“打开”对话框,重新选择表
IF USED() &&判断是否将一个表打开
EXIT &&若有表打开也跳出循环体
ENDIF
ENDIF
ENDDO
*这部分代码检查当前表的每一个字段,直到发现有一个名为“学号”的字段,
*发现该字段存在后,设置 LfieldOK为,T.,同时执行 EXIT命令跳出循环体,
*否则 LfieldOK变量仍为,F.。
FOR II=1 TO FCOUNT()
IF FIELD(II)=‖学号”,AND.TYPE(―学号” )=‖C‖
LfieldOK=.T.
EXIT
2010-5-20 Visual FoxPro 6.0程序设计 67
ENDIF
ENDFOR
IF LtableOK.AND,LfieldOK
SCAN
cNumbVar=‖‖
FOR II=1 TO LEN(学号 )
cCharacter=SUBSTR(学号,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR
REPLACE 学号 WITH cNumbVar
ENDSCAN
ENDIF
该程序最大的局限在于只能处理一个字段。若需要对一个字段
名不是“学号”的字段进行同样的操作,就不得不从头开始检查
程序,把全部的“学号”改为所要处理的字段名。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 68
5.3.8 将程序定义为过程或函数
可以将删除字符串中非数字字符的程序代码转换成为函数,使其
运行更可靠。所建立的函数返回字符串中的所有数字字符。
【 例 5-15】 删除字符串中非数字字符示例过程:
FUNCTION NUMBERONLY(CMIXEDVAL)
cNumbVar=‖‖
FOR II=1 TO LEN(CMIXEDVAL)
cCharacter=SUBSTR(CMIXEDVAL,II,1)
IF ISDIGIT(cCharacter)
cNumbVar=cNumbVar+ ccharacter
ENDIF
ENDFOR
RETURN cNumbVar
ENDFUNC
SCAN
REPLACE FIELDNAME WITH NUMBERONLY(FIELDNAME)
ENDSCAN
或者,可以更简单地写为:
REPLACE ALL FIELDNAME WITH NUMBERONLY(FIELDNAME)
除了可以使用户在许多条件下使用这些代码之外,函
数还提高了程序的可读性。如果要对一个已打开表的某
个字段使用该功能,可以运行下列代码:
返 回
2010-5-20 Visual FoxPro 6.0程序设计 69
5.4 面向对象的程序设计技术
5.4.1 面向对象应用程序示例
5.4.2 类的概念
5.4.3 对象和方法
5.4.4 类的封装、继承和多态性
退 出
5.4.5 类的操作方法
返 回
2010-5-20 Visual FoxPro 6.0程序设计 70
5.4.1 面向对象应用程序示例
设计一组记录定位按钮。使用定位按钮组来允许用户在表中移
动记录指针,其中典型的便是在表中上移或下移一条记录,或者
移向表的首记录或尾记录。
因为所有的应用程序中用到的定位按钮组都有一些共同的特点和
动作, 所以创建一个定位按钮类是一个好方法 。 在此之后, 便可
以很容易地从这些共同的外观和功能中派生出所需要的命令按钮
组 。
在本实例中, 首先进行构建定位按钮类的父类 ( NAVBUTTON
类 ), 再创建子类定义四种定位按钮的特定功能和外观 。 这四个
按钮为,NVATOP,NAVPRIOR,NAVNEXT和 NAVBOTTOM。
最后, 创建 VCR容器类, 每一种按钮都被加入到容器类中 。 如果
该容器可以加到表单或工具栏中, 就可以用来向表单提供表中记
录的定位功能 。
第 1步, 构建定位按钮父类 。 若要创建父类 NAVBUTTON,要
2010-5-20 Visual FoxPro 6.0程序设计 71
将如下六个类定义( NAV_BUTTON,NAVTOP,NAVPRIOR、
NAVTEXT,NAVBOTTOM和 VCR)保存到一个程序文件中。
*通用定位按钮父类的定义
DEFINE CLASS NAVBUTTON AS COMMANDBUTTON &&定义定位按钮的父类
HEIGHT=25 &&给类设置大小属性
WIDTH=75
TABLEALIAS=‖‖ &&使用 TableAlias自定义属性来保存需要进行定位操作的表别名。
&&若设置了 TableAlias,父类过程在子类定位代码执行以前选择有该别名的表。
&&否则,将假定用户需要对当前工作区中的表进行定位
PROCEDURE CLICK
IF,NOT.EMPTY(THIS.TABLEALIAS)
SELECT(THIS.TABLEALIAS)
ENDIF
ENDPROC
PROCEDURE REFRESHFORM
_SCREEN.ACTIVEFORM.REFRESH &&使用 _SCREEN.ActiveForm.Refresh代替
ENDPROC &&Thisform.Refresh。使得该类即可以加入到表单
ENDDEFINE &&也可以加入到工具栏,并具有同样的功能。
2010-5-20 Visual FoxPro 6.0程序设计 72
第 2步、定义四个定位按钮类。所有特定的定位按钮都基于
NAVBUTTON类,下面的代码定义了定位按钮组中的 TOP(第一
条)按钮,并给出比较详细的注释,其它的三类定位按钮与第一
类相似,注释简略。
*TOP定位按钮类定义
DEFINE CLASS NAVTOP AS NAVBUTTON &&定义 Top定位按钮类
CAPTION=‖第一条” &&设置 Caption(按钮名)属性
PROCEDURE CLICK &&创建控件发生点击事件所执行的方法程序代码
DODEFAULT() &&调用父类 Navbutton的 Click事件代码,
&&以便当 TableAlias属性设置之后,可以选择适当的别名。
GO TOP &&包含将记录指针移向首记录的代码,Go Top
THIS.REFRESHFORM
ENDPROC &&点击过程结束。
ENDDEFINE &&类定义结束。
说明,调用父类的 RefreshForm方法程序,没有必要使用域操作
符(,:)、因为在子类中没有与父类中此方法程序重名的方法程
序,但父类和子类中都有 Click事件的方法程序代码。
2010-5-20 Visual FoxPro 6.0程序设计 73
*NEXT定位按钮类的定义
DEFINE CLASS NAVNEXT AS NAVBUTTON &&定义 Next定位按钮类
CAPTION=‖下一条” &&设置 Caption属性
PROCEDURE CLICK &&定义 Click事件代码
DODEFAULT() &&执行父类的 Click事件代码
SKIP 1 &&记录指针下移一条记录
IF EOF() &&判断指针是否已从表尾溢出
GO BOTTOM &&若是,则定位到最后一条记录
ENDIF
THIS.REFRESHFORM &&刷新表单或工具栏
ENDPROC &&Click事件代码定义结束
ENDDEFINE &&Next类定义结束
*PRIOR定位按钮类的定义
DEFINE CLASS NAVPRIOR AS NAVBUTTON
CAPTION=‖前一条”
PROCEDURE CLICK
DODEFAULT()
SKIP –1
IF BOF()
GO TOP
ENDIF
2010-5-20 Visual FoxPro 6.0程序设计 74
THIS.REFRESHFORM
ENDPROC
ENDDEFINE
*BOTTOM定位按钮类的定义
DEFINE CLASS NAVBOTTOM AS NAVBUTTON
CAPTION=‖最后一条”
PROCEDURE CLICK
DODEFAULT()
GO BOTTOM
THIS.REFRESHFORM
ENDPROC
ENDDEFINE
第 3步、表定位控件类的定义。下面的类定义了四个定位按钮,
使它们可以作为一个整体加入到表单中。该类也包含了设置按钮
TableAlias属性的方法程序。
*表定位控件类的定义
DEFINE CLASS VCR AS CONTAINER &&类定义开始,从容器控件类派生
HEIGHT=25 &&定义按钮组中按钮的高
WIDTH=200 &&定义按钮组中按钮的宽
2010-5-20 Visual FoxPro 6.0程序设计 75
LEFT=3 &&定义按钮组在容器中的左边距
TOP=3 &&定义按钮组在容器中的右边距
ADD OBJECT CMDTOP AS NAVTOP WITH LEFT=0
&&将 CmdTop定位按钮加入按钮组
ADD OBJECT CMDPRIOR AS NAVPRIOR WITH LEFT=50
ADD OBJECT CMDNEXT AS NAVNEXT WITH LEFT=100
ADD OBJECT CMDBOTTOM AS NAVBOTTOM WITH LEFT=150
PROCEDURE SETTABLE(CTABLEALIAS)
&&此方法程序用于设置按钮的 TableAlias属性,TableAlias
IF TYPE(―CTABLEALIAS‖)=‖C‖
THIS.CMDTOP.TABLEALIAS=CTABLEALIAS
&&属性在父类 NavButton中定义
THIS.CMDPRIOR.TABLEALIAS=CTABLEALIAS
THIS.CMDNEXT.TABLEALIAS=CTABLEALIAS
THIS.CMDBOTTOM.TABLEALIAS=CTABLEALIAS
ENDIF
ENDPROC
ENDDEFINE
在定义类之后,就可以设计其子类或将此类加入到表单中。
第 4步、定位按钮子类的创建。用户可以在 VCR的基础上创建子
2010-5-20 Visual FoxPro 6.0程序设计 76
类,这些子类可以拥有像“搜索”、“编辑”、“保存”、
“退出”这样的附加按钮。如图 5-11所示,VCR包含了一个
“退出”按钮:
图 5-11 含有“退出”按钮的一组表定位按钮
*表定位控件子类的定义
DEFINE CLASS MYVCR AS VCR &&在 Vcr的基础上定义一个新类。
ADD OBJECT CMDQUIT AS COMMANDBUTTON WITH ;
&&加入一个命令按钮。
CAPTION=‖退出”,; &&按钮名为“退出”
HEIGHT=25,; &&按钮高度定义
WIDTH=50 &&按钮宽度定义
WIDTH=THIS.WIDTH+THIS.CMDQUIT.WIDTH
CMDQUIT.LEFT=THIS.WIDTH-THIS.CMDQUIT.WIDTH &&按钮左边距定义
PROCEDURE CMDQUIT.CLICK &&当单击事件发生时,将释放表单。
RELEASE THISFORM
ENDPROC &&Click事件代码定义结束。
ENDDEFINE &&类定义结束。
第 5步、将 VCR类加到容器中。将 VCR定义为一个控件之后,
就可以将其加入到一个容器的定义中。
2010-5-20 Visual FoxPro 6.0程序设计 77
DEFINE CLASS NAVFORM AS FORM
ADD OBJECT OVCR AS VCR
ENDDEFINE
第 6步、运行含 VCR的表单。本示例通过一个项目“定位按钮”
如图 5-12来运行含 MYVCR类的表单。
图 5-12 执行含 MYVCR类表单的项目
下面的 NAVCLASS.PRG中定义了运行含有附加定位按钮的表单
2010-5-20 Visual FoxPro 6.0程序设计 78
所需要的所有类定义代码,如图 5-13所示:
图 5-13 定位按钮类定义程序
在项目的主程序文件 MYMAIN.PRG中设定运行含定位按钮类
表单的程序代码,
SET PROCEDURE TO NAVCLASS ADDITIVE
MYTEST=CREATEOBJECT("NAVFORM")
2010-5-20 Visual FoxPro 6.0程序设计 79
MYTEST.SHOW
MYTEST.OVER.SETTABLE("STUDENT")
READ EVENT
第 7步、通过运行 NAVCLASS.PRG程序,可以发现存在的问题,
针对出现的问题,对类定义进行修改和补充。如果需要修改和补
充,可以利用类的继承性这一特点,通过父类对子类进行修改。
所有对父类进行的修改都将反映到其全部的子类中。例如,可以
通过对在 NAVNEXT.CLICK中修改 IF EOF()语句,在点击事件发
生时给出一个提示信息“已达到表的尾记录”,修改如下:
IF EOF()
GO BOTTOM
=MESSAGEBOX("已达到表的尾记录! ",64,"Click事件 ")
ENDIF
如果在 NAVNEXT中做如上修改, 那么, VCR和 MYVCR的相应
按钮将作出改变 。
以上代码和步骤是建立一个命令按钮组的过程示例,这里涉及到
了 VFP6的类定义和对象的属性设置等多方面的问题,这些问题
是在面向对象的程序设计中所必需要解决的。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 80
5.4.2 类的概念
VFP6的类是描述一个特定对象类型必备特征的模型。类是一种
对象类型,而对象是类中的一个实例。例如,在 VFP6中表单中
的命令按钮是一个对象。命令按钮类中指定了表单上命令按钮的
属性,包括按钮的视觉效果属性(如形状是矩形还是正方形、颜
色是红色还是白色、是透明的还是不透明的)、按钮所响应的事
件(如单击或双击时各执行什么样的操作)等,这样决定的一个
命令按钮对象是命令按钮类中的一个实例。
类又可以分为父类和子类。父类是可以用作其它类基础的类。子
类则是以对应父类为起点建立的扩展类,它将继承父类的所有特
征。例如,自然界中所有的动物都可以看成是生物的子类,因为
它不仅继承了生物的所有特征,而且扩展了自己的新特征:
生物类具有共同的特征:有生命,生命有长短;能够进行新陈代
谢;能够繁衍后代等。
而动物类除了具有上述共同的特征外,它还具有:能够活动;不
能进行光合作用等。
2010-5-20 Visual FoxPro 6.0程序设计 81
1、基类
从基类中可以派生出子类或创建对象。 VFP6的基类,是 VFP6系
统定义的最基本的类。
在 VFP6中,基类可以分为四种类型:复选框( CheckBox)、编
辑框( EditBox)、列表框( ListBox)、形状( Shape)四种类型。
在复选框中包括列( Column)、命令按钮( Command- Button)、
命令组( CommandGroup)、组合框( ComboBox)、容器
( Container)、控件( Control)和自定义( Custom)类等。在
编辑框中包括表单( Form)、表单集( FormSet)、表格
( Grid)、标头( Header)、标签( Label)、图像( Image)、
线条( Line)等类。表列框中包括 OLE绑定型控件
( OLEBoundControl),OLE容器控件( OLEContainerControl)、
各选项按钮( OptionButton)、选项组( OptionGroup)、页面
( Page)、页框( PageFrame)和分隔符( Separator)类等。形
状包括微调控件( Spinner)、文本框( TextBox)、计时器
( Timer)和工具栏( ToolBar)类等。
2010-5-20 Visual FoxPro 6.0程序设计 82
所有的基类都有如表 5-2所示的最小事件集:
表 5-2,VFP基类的最小事件集
所有的 VFP基类都有如表 5-3所示的最小属性集:
表 5-3,VFP基类的最小属性集
注意,如果对象从基类中派生而得,那么,基类对象的 ParentClass
属性值为空。
2010-5-20 Visual FoxPro 6.0程序设计 83
2、容器类和控件类
VFP的类有两大主要类型,因
此 VFP对象也分为两大类型,
它们便是容器类和控件类。
VFP6中的对象可以分为容器
和控件两种。层次结构如图 5-
15所示。
( 1)容器类,容器类是单一
对象的集合。它可以包含其它
对象,并且允许访问这些对象。
当创建一个对象容器后,无论
是在设计时还是在运行时,都
可以对其中任何一个对象进行
操作。在 VFP6中有很多种容
器,例如命令按钮组、容器、
控件、表单集、表单、表格列、
2010-5-20 Visual FoxPro 6.0程序设计 84
表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可
以包含多种对象。
( 2)控件类,控件类是指单一的文本框、标签、命令框、列表框
等。
多个控件对象可以当作一个整体类处理,但是组成控件对象的组
件不能单独被修改和操作。
在 VFP6中,表以及控件是应用程序中的对象。在结构化程序
设计中,数据和操作是分离的。但是为了更好地模拟对象特征,
在面向对象的程序设计中,数据和操作是统一的整体。由于对象
中包括了数据和对数据的操作,所以具有很强的独立性,容易理
解并维护。
对象具有以下一些特点:
■ 每个对象都具有对象标识符, 用标识符来表示对象的唯一性 。
■ 对象必须属于一个对象类 。
5.4.3 对象和方法
返 回
2010-5-20 Visual FoxPro 6.0程序设计 85
在 VFP中,表单、表单集以及所有控件都可以看成是应用程序中
的对象,可以对它们设置属性、事件和方法。
对象的属性值是由对象所基于的类决定的。对象值的设置可以在
设计时通过属性窗口设置,也可以直接编进程序代码在运行的过
程中设置。例如,一个命令按钮控件的常用属性设置如表 5-4所示。
表 5-4、为命令按钮对象设置属性
在 Windows的操作中,用户通常用下面的动作来运行应用程序:
单击鼠标、双击鼠标、拖动鼠标等,这些可以为系统所接受的动
2010-5-20 Visual FoxPro 6.0程序设计 86
作为事件。事件是一个对象可识别的动作,在 VFP中,可以编写
相应的代码对此动作进行响应。除了用户动作可以产生事件外
(如单击鼠标或按下一个键),程序代码或系统(如计时器)也
可以产生事件。
在 VFP中,每个对象的动作都可以对一个事件的动作进行识别
和响应,并由用户或者系统激活该事件。在大多数情况下,事件
是通过用户的交互操作产生的。表 5-5列出了一些 VFP的常用事
件及其使用说明。
在 VFP中,方法程序是与对象相关联的过程,它是对象能够执
行的一个操作。与一般的 VFP过程是不同的。例如,列表框的这
样一些方法程序维护它的列表内容,AddItem,Remove- Item和
Clear。方法程序既可以与相应的事件相关联,也可以独立于事
件而单独存在,如果是后一种情况则必须在程序代码中被显示地
调用。
VFP中常用和方法程序如表 5-6所示。
2010-5-20 Visual FoxPro 6.0程序设计 87

5-
5
、VF
P







使



2010-5-20 Visual FoxPro 6.0程序设计 88
表 5-6,VFP中常用和方法程序
其中,有的方法程序的使用需要在后面添加参数,例如 Circle:
Object.Circle(nRadius [,nXCoord,nYCoord [,nAspect]])
其中,参数 nRadius用于指定圆的半径; nXCoord和 nYCoord 用以设定圆心的坐标值,如
果要画椭圆,需要参数 nAspect指定椭圆的长轴与短轴比。
有的方法程序不需要添加任何参数而直接调用,例如,Release方法用于退出表单或者
表单集,其使用方法为:
Object.Release
对于其它需要添加参数的方法程序的使用,可以查阅 VFP的帮助文件。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 89
5.4.4 类的封装、继承和多态性
面向对象的程序设计为三种概念提供支持:封装、继承和多态性。下面简单
介绍一下这些术语。
封装意味着对象的信息(属性)和对象执行的处理(方法)都包含在对象的
定义中。比如举现实世界中对象的一个实例 ——自行车。可以用属性来描述
自行车,如黑色的男式 26车,每个特征:颜色、式样、大小,都可以算是自
行车的属性。至于方法,是自行车响应事件时所做的事情,例如,当按动自
行车的车闸时自行车响应一个减速事件。
继承意味着一个对象可以基于另一个对象的描述。对于一辆自行车,可以定
义它有两个轮子、车闸以及车座,然后定义一辆跑车,它除了具有自行车的
基本属性外,还可以加入新的属性:可调速。但是,不用为跑车重新定义自
行车的属性。那么,跑车就可以算是继承了自行车的属性。除了属性,对象
也可以从其它对象继承方法和事件。
多态性意味着许多对象具有相同的方法,对象调用方法时会采取正确的动作。
例如,在程序中向屏幕显示文本和向打印机输出文本。每个这样的对象(屏
幕和打印机)都可以有打印或显示的方法,它们告诉对象将文本定位于确定
的位置,根据调用方法的对象,方法知道做什么。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 90
5.4.5 类的操作方法
1、创建新类
在类设计器中,可以设计并修改类。例如希望创建工具条:
可按下述方法进行:
第 1步、执行 【 文件 】 |【 新建 】 命令,在打开的对话框中选择
“类”,并单击 【 新建文件 】 按钮;或在项目管理器中选择“类”
选项卡,然后单击 【 新建 】 。
第 2步、在弹出的对话框中,输入新建类的名称和基类如图 5-
17所示。
2010-5-20 Visual FoxPro 6.0程序设计 91
在“类名”框中输入 NewToolBar,在“派生于”框中选择
ToolBar,然后在“存储于”框中输入
,c:\gxglxt\libs\gxglxt_app.vcx‖。
第 3步、单击 【 确定 】 按钮进入“类设计器”窗口 。
在“表单控件”工具栏上单击“组合框”按钮和“命令锁定”按钮。
2010-5-20 Visual FoxPro 6.0程序设计 92
再在“类设计器”中的自定义工具栏上单击,添加组合框控件,
按顺序单击三次,添加三个组合框控件。
再在“表单控件”工具栏上单击“命令按钮”按钮。
2010-5-20 Visual FoxPro 6.0程序设计 93
再在“类设计器”中的自定义工具栏上单击,添加组合命令按
钮控件,按顺序单击三次,添加三个命令按钮控件。
再在“表单控件”工具栏上单击“分隔符”按钮。
再在“类设计器”中的自定义工具栏上单击,添加分隔符控件,
按顺序单击五次,添加五个分隔符控件。
2010-5-20 Visual FoxPro 6.0程序设计 94
第 4步、对 NewToolBar类进行属性设置。对象属性设置在图 5-
19所示的属性设置对话框进行。
图 5-19 对象属性设置对话框
单击图 5-19中的对象选择下拉列表框,选择,NewToolBar‖对
象,然后选择属性名,Caption‖(单击),在属性输入文本框中
输入显示时该对象的名称。现在输入“格式”。
2010-5-20 Visual FoxPro 6.0程序设计 95
按上述方法,设置三个按钮的基本属性:对第一个按钮,在对象
选择下拉列表框中,选择,Command1‖对象,然后选择属性名
,Caption‖,在属性输入文本框中输入,B‖,再选择,FontBold‖
属性,将显示字体设置为粗体(将属性值设置,T.—真);对第二
个按钮,在对象选择下拉列表框中,选择,Command2‖对象,然
后选择属性名,Caption‖,在属性输入文本框中输入,I‖,再选
择,FontBold‖属性,将属性值设置,.T.—真”,再选择
,FontItalic‖属性,将属性值设置为,.T.—真”(将显示时的格
式设置为粗体、斜体);对第三个按钮,在对象选择下拉列表框
中,选择,Command3‖对象,然后选择属性名,Caption‖,在属
性输入文本框中输入,U‖,再选择,FontBold‖属性,将属性值
设置,.T.—真”,再选择,FontUnderLine‖属性,将属性值设置
为,.T.—真”(将显示时的格式设置为粗体、下划线)。
最后对列表框的属性设置:选择对象 Combo1右击选择 【 属性 】 |
【 数据 】 选项卡,再选择 RowSourceType,在属性值输入文本框
中选择,1—值”;再选择 RowSource属性,单击按钮,在弹出的

2010-5-20 Visual FoxPro 6.0程序设计 96
达式生成器对话框中的表达式文本框中输入将要用到的几种文本
格式,如正文、标题 1、标题 2、表格等,每种格式中间用逗号分
隔;再选择 Value属性,设置其值为“正文”;再选择
ControlSource属性,将值设置为 Value。其它两个列表框也可采用
同样方式进行属性设置。
第 5步、为添加的控件添加事件及方法程序,并设计表单的初
始化代码。在类设计器中用双击控件,也可以进入该控件的代码
编辑窗口。
1、在属性窗口中选择“方法程序”选项卡,在“对象选择列
表”框中选择 Combo2,然后再在“属性名”窗口中双击 Click
Event。
方法程序
编辑窗口
2010-5-20 Visual FoxPro 6.0程序设计 97
在方法程序编辑窗口中输入下列代码:
THISFORMSET.ActiveForm.ActiveControl.FontName=THIS.VALUE
2、设置 Combo3的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontSize=;
VAL(ALLTRIM(THIS.VALUE))
3、设置 Command1的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontBold=;
!THISFORMSET.ActiveForm.ActiveControl.FontBold
THIS.FontBold=THISFORMSET.ActiveForm.ActiveControl.FontBold
4、设置 Command2的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontItalic=;
!THISFORMSET.ActiveForm.ActiveControl.FontItalic
THIS.FontItalic=THISFORMSET.ActiveForm.ActiveControl.FontItalic
5、设置 Command3的 Click Event代码:
THISFORMSET.ActiveForm.ActiveControl.FontUnderline=;
!THISFORMSET.ActiveForm.ActiveControl.FontUnderline
THIS.FontUnderline=THISFORMSET.ActiveForm.ActiveControl.FontUnderline
6,Combo1的 Click Event代码没写,因为在 VFP中没有排版格式。
2010-5-20 Visual FoxPro 6.0程序设计 98
2、使用类浏览器
当建立新类后,如果希望查看该类的结果并对其进行修改,
可以在类浏览器中打开该类。使用 【 工具 】 |【 类浏览器 】,弹
出类浏览器对话框。
单击“打开”按钮并选择创建的新类名称,打开该类 。
―查看类代码”按钮
―新类”按钮
―重命名”按钮
―重定义”按钮
2010-5-20 Visual FoxPro 6.0程序设计 99
在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类
的事件及方法程序代码。单击“新类”按钮可以打开“新建类”
对话框,以建立一个新类。
使用“重命名”按钮可以更改类的名称、属性或方法程序。但
必须注意,如果重命名一个类,有可能会使浏览器窗口中当前
没有显示的表单或类失效。可以使用“重定义”按钮更改类的
父类。
返 回
2010-5-20 Visual FoxPro 6.0程序设计 100
小 结
1,VFP6程序设计分为过程化程序设计和面向对象的程序设计二种,面向对
象的程序设计是可视的。面向对象的程序设计中也包含过程化程序设计。
2、过程化程序设计使用 Modify Command命令创建命令集,用以完成程序员
指定的任务;面向对象的程序设计,是设计事件的方法程序。
3、可以在命令窗口中执行一个代码块,也可以通过 Do命令调用一个程序文
件,可通过操作触发一个事件,执行某一程序块。
4、在过程化程序设计可面向对象程序设计中,都要用到条件选择和循环命
令。这些命令包括 If…Endif, Docase…Endcase, Do While…Enddo, Scan…
Endscan,For…Endfor 。
5、程序设计通常要用到 7~ 8步,即:对任务进行说明,分解问题,编制模
块,测试模块,组装全部模块,整体测试,提高程序的可靠性,将程序定
义为过程或函数并不是所有程序都需要做的。
6、面向对象的程序设计是可视化的,产生事件的控件都可由相应的工具栏
提供的可视类库中得到。面向对象程序设计的主要任务是设置必要的控件和
为设置的控件编写事件的方法程序。
7、类是一种对象类型,而对象是类中的一个实例。
返 回