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


PROCEDURE <过程名 N>
<语句序列 N>
RETURN
说明,在一个过程文件中可以包含多个过程,在同一个过程文件中不允许出现相同的过程名,
如果有相同的过程名,则只有第一次出现的过程才有被调用的可能。一个过程文件中最多允许包含 128个过程。
2)过程文件的调用过程文件和表文件一样,都是在先打开后才能使用。
① 过程文件的打开命令格式,SET PROCEDURE TO <过程文件名 >
在主程序中应先打开过程文件,将过程文件中的所有过程都调入
2009-7-26 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)
2009-7-26 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
2009-7-26 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
2009-7-26 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 返 回
2009-7-26 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 将程序定义为过程或函数返 回
2009-7-26 Visual FoxPro 6.0程序设计 55
5.3.1 对任务进行说明开始解决问题之前,需要将其说明清楚。有时调整问题的说明方式会有助于问题的解决。假设从不同的数据源获得一批数据,其中大部分是数值型数据,但有些数据中,除包含数字字符外,还夹杂着一些虚线和空格。现在需要从字段中清除这些虚线和空格,
并将所得到的数字型数据加以保存。可以按如下方式说明需要这个程序达到的目的,而不是简单地立即着手从原始数据中除去空格和虚线。
目标 ——用新值替换字段中的原值,新值包含原值中除空格和虚线以外的所有内容。这种说明方式的优点在于避免在处理长字符串时遇到的困难。
5.3.2 分解问题因为最终是以操作、命令和函数的方式将具体的指令提供给
VFP6,所以需要将问题分解为多个独立的步骤。在本问题中,
最容易分离出来的方法是在字符串中逐个扫描字符,只有将单个字符分离出来才能解决是否应该保存它。 返 回
2009-7-26 Visual FoxPro 6.0程序设计 56
在扫描字符的时候,将检查它是否为虚线和空格。到了这一步也许想要更详细地说明这个问题,括号之后的数据应该如何提取,
货币符号、逗号和句号该如何消除等一系列问题将出现在大脑中。
代码越通用,为将来节省的时间就越多,问题在于如何做到事半而功倍。下面给出一个比从前适用范围更广的问题说明方式。
精炼的目标 ——用原始数据中的数值型字符更新字段值。
这便是在字符的层次上重新说明问题。如果字符是数值则保留,
否则将指针移向下一个字符。当用原始字符串中的数值重新构成一个只包含有数值元素的新串时,用这个新串替换掉原来的字符串。如此循环,直到将所有记录中的数据全部更新。
概括起来,全部问题可以分解成以下一些模块:
■逐个检查字符;
■判断该字符是否为数值;
■若是数值,则将其复制到新串中;
■检查完字符串的全部后,用只含数字的新串替换原串;
■重复上述步骤,直到表中的全部记录都被更新。
返 回
2009-7-26 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
2009-7-26 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.
2009-7-26 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 返 回
2009-7-26 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个字符。
2009-7-26 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
返 回
2009-7-26 Visual FoxPro 6.0程序设计 62
5.3.5 组装全部模块若要完善此程序,则要从表中读取数据。在对表进行操作时,
需要逐条扫描记录,针对表中记录的字段而不是变量进行操作。
为了说明此步骤,先将 STUDENT表中的“学号”字段的值进行修改后作为一个测试用表,修改后的 STUDENT表中数据如图 5-
9所示,
图 5-9 测试用数据在对字段中的字符串进行处理后,目的并不是要将结果保存在内存变量中,而是要将处理后的值用来替换原来字段中的值。
要对字段的值进行替换,前面已经讲过可以用 REPLACE命令:
2009-7-26 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 返 回
2009-7-26 Visual FoxPro 6.0程序设计 64
5.3.6 整体测试完成全部代码之后,在处理实际数据之前,必须用示例数据进行测试。运行此程序时,如果当前工作区中没有表打开,此程序将要求先打开一个表,如果先将 STUDENT表打开后再运行此程序,则此程序可正常运行。
程序运行后屏幕显示的结果如图 5-9所示:
图 5-10 运行程序测试后 STUDENT表中的部分数据到此,程序设计基本完成,但为了使程序更可靠,需要进行下面的改进工作。
返 回
2009-7-26 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‖ &&使输入的文件名带有扩展名
2009-7-26 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
2009-7-26 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
该程序最大的局限在于只能处理一个字段。若需要对一个字段名不是“学号”的字段进行同样的操作,就不得不从头开始检查程序,把全部的“学号”改为所要处理的字段名。
返 回
2009-7-26 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)
除了可以使用户在许多条件下使用这些代码之外,函数还提高了程序的可读性。如果要对一个已打开表的某个字段使用该功能,可以运行下列代码:
返 回
2009-7-26 Visual FoxPro 6.0程序设计 69
5.4 面向对象的程序设计技术
5.4.1 面向对象应用程序示例
5.4.2 类的概念
5.4.3 对象和方法
5.4.4 类的封装、继承和多态性退 出
5.4.5 类的操作方法返 回
2009-7-26 Visual FoxPro 6.0程序设计 70
5.4.1 面向对象应用程序示例设计一组记录定位按钮。使用定位按钮组来允许用户在表中移动记录指针,其中典型的便是在表中上移或下移一条记录,或者移向表的首记录或尾记录。
因为所有的应用程序中用到的定位按钮组都有一些共同的特点和动作,所以创建一个定位按钮类是一个好方法 。 在此之后,便可以很容易地从这些共同的外观和功能中派生出所需要的命令按钮组 。
在本实例中,首先进行构建定位按钮类的父类 ( NAVBUTTON
类 ),再创建子类定义四种定位按钮的特定功能和外观 。 这四个按钮为,NVATOP,NAVPRIOR,NAVNEXT和 NAVBOTTOM。
最后,创建 VCR容器类,每一种按钮都被加入到容器类中 。 如果该容器可以加到表单或工具栏中,就可以用来向表单提供表中记录的定位功能 。
第 1步,构建定位按钮父类 。 若要创建父类 NAVBUTTON,要
2009-7-26 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 &&也可以加入到工具栏,并具有同样的功能。
2009-7-26 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事件的方法程序代码。
2009-7-26 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
2009-7-26 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 &&定义按钮组中按钮的宽
2009-7-26 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的基础上创建子
2009-7-26 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定义为一个控件之后,
就可以将其加入到一个容器的定义中。
2009-7-26 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中定义了运行含有附加定位按钮的表单
2009-7-26 Visual FoxPro 6.0程序设计 78
所需要的所有类定义代码,如图 5-13所示:
图 5-13 定位按钮类定义程序在项目的主程序文件 MYMAIN.PRG中设定运行含定位按钮类表单的程序代码,
SET PROCEDURE TO NAVCLASS ADDITIVE
MYTEST=CREATEOBJECT("NAVFORM")
2009-7-26 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的类定义和对象的属性设置等多方面的问题,这些问题是在面向对象的程序设计中所必需要解决的。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 80
5.4.2 类的概念
VFP6的类是描述一个特定对象类型必备特征的模型。类是一种对象类型,而对象是类中的一个实例。例如,在 VFP6中表单中的命令按钮是一个对象。命令按钮类中指定了表单上命令按钮的属性,包括按钮的视觉效果属性(如形状是矩形还是正方形、颜色是红色还是白色、是透明的还是不透明的)、按钮所响应的事件(如单击或双击时各执行什么样的操作)等,这样决定的一个命令按钮对象是命令按钮类中的一个实例。
类又可以分为父类和子类。父类是可以用作其它类基础的类。子类则是以对应父类为起点建立的扩展类,它将继承父类的所有特征。例如,自然界中所有的动物都可以看成是生物的子类,因为它不仅继承了生物的所有特征,而且扩展了自己的新特征:
生物类具有共同的特征:有生命,生命有长短;能够进行新陈代谢;能够繁衍后代等。
而动物类除了具有上述共同的特征外,它还具有:能够活动;不能进行光合作用等。
2009-7-26 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)类等。
2009-7-26 Visual FoxPro 6.0程序设计 82
所有的基类都有如表 5-2所示的最小事件集:
表 5-2,VFP基类的最小事件集所有的 VFP基类都有如表 5-3所示的最小属性集:
表 5-3,VFP基类的最小属性集注意,如果对象从基类中派生而得,那么,基类对象的 ParentClass
属性值为空。
2009-7-26 Visual FoxPro 6.0程序设计 83
2、容器类和控件类
VFP的类有两大主要类型,因此 VFP对象也分为两大类型,
它们便是容器类和控件类。
VFP6中的对象可以分为容器和控件两种。层次结构如图 5-
15所示。
( 1)容器类,容器类是单一对象的集合。它可以包含其它对象,并且允许访问这些对象。
当创建一个对象容器后,无论是在设计时还是在运行时,都可以对其中任何一个对象进行操作。在 VFP6中有很多种容器,例如命令按钮组、容器、
控件、表单集、表单、表格列、
2009-7-26 Visual FoxPro 6.0程序设计 84
表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。
( 2)控件类,控件类是指单一的文本框、标签、命令框、列表框等。
多个控件对象可以当作一个整体类处理,但是组成控件对象的组件不能单独被修改和操作。
在 VFP6中,表以及控件是应用程序中的对象。在结构化程序设计中,数据和操作是分离的。但是为了更好地模拟对象特征,
在面向对象的程序设计中,数据和操作是统一的整体。由于对象中包括了数据和对数据的操作,所以具有很强的独立性,容易理解并维护。
对象具有以下一些特点:
■ 每个对象都具有对象标识符,用标识符来表示对象的唯一性 。
■ 对象必须属于一个对象类 。
5.4.3 对象和方法返 回
2009-7-26 Visual FoxPro 6.0程序设计 85
在 VFP中,表单、表单集以及所有控件都可以看成是应用程序中的对象,可以对它们设置属性、事件和方法。
对象的属性值是由对象所基于的类决定的。对象值的设置可以在设计时通过属性窗口设置,也可以直接编进程序代码在运行的过程中设置。例如,一个命令按钮控件的常用属性设置如表 5-4所示。
表 5-4、为命令按钮对象设置属性在 Windows的操作中,用户通常用下面的动作来运行应用程序:
单击鼠标、双击鼠标、拖动鼠标等,这些可以为系统所接受的动
2009-7-26 Visual FoxPro 6.0程序设计 86
作为事件。事件是一个对象可识别的动作,在 VFP中,可以编写相应的代码对此动作进行响应。除了用户动作可以产生事件外
(如单击鼠标或按下一个键),程序代码或系统(如计时器)也可以产生事件。
在 VFP中,每个对象的动作都可以对一个事件的动作进行识别和响应,并由用户或者系统激活该事件。在大多数情况下,事件是通过用户的交互操作产生的。表 5-5列出了一些 VFP的常用事件及其使用说明。
在 VFP中,方法程序是与对象相关联的过程,它是对象能够执行的一个操作。与一般的 VFP过程是不同的。例如,列表框的这样一些方法程序维护它的列表内容,AddItem,Remove- Item和
Clear。方法程序既可以与相应的事件相关联,也可以独立于事件而单独存在,如果是后一种情况则必须在程序代码中被显示地调用。
VFP中常用和方法程序如表 5-6所示。
2009-7-26 Visual FoxPro 6.0程序设计 87

5-
5
、VF
P
的常用事件及其使用说明
2009-7-26 Visual FoxPro 6.0程序设计 88
表 5-6,VFP中常用和方法程序其中,有的方法程序的使用需要在后面添加参数,例如 Circle:
Object.Circle(nRadius [,nXCoord,nYCoord [,nAspect]])
其中,参数 nRadius用于指定圆的半径; nXCoord和 nYCoord 用以设定圆心的坐标值,如果要画椭圆,需要参数 nAspect指定椭圆的长轴与短轴比。
有的方法程序不需要添加任何参数而直接调用,例如,Release方法用于退出表单或者表单集,其使用方法为:
Object.Release
对于其它需要添加参数的方法程序的使用,可以查阅 VFP的帮助文件。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 89
5.4.4 类的封装、继承和多态性面向对象的程序设计为三种概念提供支持:封装、继承和多态性。下面简单介绍一下这些术语。
封装意味着对象的信息(属性)和对象执行的处理(方法)都包含在对象的定义中。比如举现实世界中对象的一个实例 ——自行车。可以用属性来描述自行车,如黑色的男式 26车,每个特征:颜色、式样、大小,都可以算是自行车的属性。至于方法,是自行车响应事件时所做的事情,例如,当按动自行车的车闸时自行车响应一个减速事件。
继承意味着一个对象可以基于另一个对象的描述。对于一辆自行车,可以定义它有两个轮子、车闸以及车座,然后定义一辆跑车,它除了具有自行车的基本属性外,还可以加入新的属性:可调速。但是,不用为跑车重新定义自行车的属性。那么,跑车就可以算是继承了自行车的属性。除了属性,对象也可以从其它对象继承方法和事件。
多态性意味着许多对象具有相同的方法,对象调用方法时会采取正确的动作。
例如,在程序中向屏幕显示文本和向打印机输出文本。每个这样的对象(屏幕和打印机)都可以有打印或显示的方法,它们告诉对象将文本定位于确定的位置,根据调用方法的对象,方法知道做什么。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 90
5.4.5 类的操作方法
1、创建新类在类设计器中,可以设计并修改类。例如希望创建工具条:
可按下述方法进行:
第 1步、执行 【 文件 】 |【 新建 】 命令,在打开的对话框中选择
“类”,并单击 【 新建文件 】 按钮;或在项目管理器中选择“类”
选项卡,然后单击 【 新建 】 。
第 2步、在弹出的对话框中,输入新建类的名称和基类如图 5-
17所示。
2009-7-26 Visual FoxPro 6.0程序设计 91
在“类名”框中输入 NewToolBar,在“派生于”框中选择
ToolBar,然后在“存储于”框中输入
,c:\gxglxt\libs\gxglxt_app.vcx‖。
第 3步、单击 【 确定 】 按钮进入“类设计器”窗口 。
在“表单控件”工具栏上单击“组合框”按钮和“命令锁定”按钮。
2009-7-26 Visual FoxPro 6.0程序设计 92
再在“类设计器”中的自定义工具栏上单击,添加组合框控件,
按顺序单击三次,添加三个组合框控件。
再在“表单控件”工具栏上单击“命令按钮”按钮。
2009-7-26 Visual FoxPro 6.0程序设计 93
再在“类设计器”中的自定义工具栏上单击,添加组合命令按钮控件,按顺序单击三次,添加三个命令按钮控件。
再在“表单控件”工具栏上单击“分隔符”按钮。
再在“类设计器”中的自定义工具栏上单击,添加分隔符控件,
按顺序单击五次,添加五个分隔符控件。
2009-7-26 Visual FoxPro 6.0程序设计 94
第 4步、对 NewToolBar类进行属性设置。对象属性设置在图 5-
19所示的属性设置对话框进行。
图 5-19 对象属性设置对话框单击图 5-19中的对象选择下拉列表框,选择,NewToolBar‖对象,然后选择属性名,Caption‖(单击),在属性输入文本框中输入显示时该对象的名称。现在输入“格式”。
2009-7-26 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属性,单击按钮,在弹出的表
2009-7-26 Visual FoxPro 6.0程序设计 96
达式生成器对话框中的表达式文本框中输入将要用到的几种文本格式,如正文、标题 1、标题 2、表格等,每种格式中间用逗号分隔;再选择 Value属性,设置其值为“正文”;再选择
ControlSource属性,将值设置为 Value。其它两个列表框也可采用同样方式进行属性设置。
第 5步、为添加的控件添加事件及方法程序,并设计表单的初始化代码。在类设计器中用双击控件,也可以进入该控件的代码编辑窗口。
1、在属性窗口中选择“方法程序”选项卡,在“对象选择列表”框中选择 Combo2,然后再在“属性名”窗口中双击 Click
Event。
方法程序编辑窗口
2009-7-26 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中没有排版格式。
2009-7-26 Visual FoxPro 6.0程序设计 98
2、使用类浏览器当建立新类后,如果希望查看该类的结果并对其进行修改,
可以在类浏览器中打开该类。使用 【 工具 】 |【 类浏览器 】,弹出类浏览器对话框。
单击“打开”按钮并选择创建的新类名称,打开该类 。
―查看类代码”按钮
―新类”按钮
―重命名”按钮
―重定义”按钮
2009-7-26 Visual FoxPro 6.0程序设计 99
在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”
对话框,以建立一个新类。
使用“重命名”按钮可以更改类的名称、属性或方法程序。但必须注意,如果重命名一个类,有可能会使浏览器窗口中当前没有显示的表单或类失效。可以使用“重定义”按钮更改类的父类。
返 回
2009-7-26 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、类是一种对象类型,而对象是类中的一个实例。
返 回