第 10章 子程序及基本菜单的使用方法
第 10章 子程序及基本菜单的
使用方法
10.1 转子程序语句 DO和返回主程序语句
10.2 子程序调用的嵌
10.3 菜单的基本使用方法
10.4 程序设计举例
10.5 过程文件的使用方法 10.6 设置内存变量属性的语句
10.7 子程序调用中传递参数的语句
10.8 FoxPro 基本菜单
10.9 用户自定义函数
10.10 编译 FoxPro 的命令文件
第 10章 子程序及基本菜单的使用方法
10.1 转子程序语句 DO和返回主程序语句
—— RETURN,RETRY
1,转子程序语句 ——DO
转子程序即调用子程序,语句为 DO。
语句格式, DO〈 文件名 〉 [ WITH〈 参数清单 〉 ]
这个语句出现在要调用子程序的主程序中,其中文
件名指出的是一个子程序的文件名 。 WITH可选项用
于参数的传递,具体用法在本章 10.6 节中介绍 。
第 10章 子程序及基本菜单的使用方法
2,返回主程序语句 ——RETURN
在 FoxPro中,子程序与主程序一样,用同样的方法建
立,以同样的文件格式存在磁盘上,具有同样的扩展名 。
子程序与主程序惟一的不同点是, 子程序的最后一条语句
必须是返回主程序语句,即 RETURN。
语句常用格式, RETURN
若程序执行该语句就表明这个子程序已结束,应该回
到调用它的主程序,
语句继续执行 。 (若子程序中无 RETURN,则默认最后有
RETURN。 )
主程序调用子程序的过程可以形象地用一个如图 10--
1 所示的图形表示 。
第 10章 子程序及基本菜单的使用方法
主程序调用子程序的过程可以形象地用一个如图
10--1 所示的图形表示 。
例 在第 8章 8.6 节某个中学的学生成绩管理程序中,
内循环部分是一个功能相对独立的部分 。 把这一部分
作为子程序, 其余部分作为主程序, 重新编制此程序 。
第 10章 子程序及基本菜单的使用方法
图 10—1 子程序调用流程图
第 10章 子程序及基本菜单的使用方法
3,重复调用子程序语句 ——RETRY
命令格式,RETRY
与 RETURN语句不同,RETRY语句从子程序返回到
主程序中调用该子程序的语句 。 也即重新执行调用子
程序语句,重新进入该子程序 。
RETRY一般用在发现错误时,反复多次调用子程序,
直至错误消失,程序继续执行下去 。
第 10章 子程序及基本菜单的使用方法
10.2 子程序调用的嵌套
用第三个子程序,在系统允许的嵌套范围内这样一
个一个地调用下去,这种调用就称为子程序的嵌套 。
子程序的嵌套形式如图 10—2所示。图中所示为一
个主程序和三个子程序嵌套。
第 10章 子程序及基本菜单的使用方法
图 10—2 子程序的嵌套
第 10章 子程序及基本菜单的使用方法
10.3 菜单的基本使用方法
10.3.1 菜单的生成和选择
菜单的生成一般有两种方法,一种是使用 @...SAY命
令在指定的坐标位置上显示菜单内容以及它所对应的功
能号另一种方法是用显示命令?和引号在所要求的屏幕位
置上指出菜单内容和菜单功能号 。
生成菜单以前要用 CLEAR命令清理屏幕,以保证屏幕
上无其它内容 。
菜单一般都是一个程序的主程序部分,所以对菜单的
编辑和命令文件一样,用 MODIFYCOMMAND命令来建立 。
第 10章 子程序及基本菜单的使用方法
例 假设有一个旅馆服务数据库文件, LGFU.DBF”,
试设计一个主控程序提供以下功能,第一个是查询功能第
二个是登记功能第三个是清账功能第四个是结算功能 。
依题意,程序设计如下,
SET TALK OFF
CLEAR ALL
USEL GFU
DO WHILE.T.
GO TOP
CLEAR
第 10章 子程序及基本菜单的使用方法
SPACE(10)+“********旅馆服务主菜单 ********”
SPACE(10)+“*0—退出旅馆前台服务 *”
SPACE(10)+“*1—查询 *”
SPACE(10)+“*2—登记 *”
SPACE(10)+“*3—清账 *”
SPACE(10)+“*4—结算 *”
SPACE(10)+“***********************”
第 10章 子程序及基本菜单的使用方法
WAIT“请选择 0—4号菜单,”TO A1
DOCASE
CASEA1=“0”
EXIT
CASEA1=“1”
DOCX
CASEA1=“2”
DODJ
CASEA1=“3”
DOQZ
第 10章 子程序及基本菜单的使用方法
CASEA=1“4”
DO JS
ENDCASE
ENDDO
运行此程序 。 执行到 WAIT时, 程序暂停执行, 屏
********旅馆服务主菜单 ********
*0—退出旅馆前台服务 *
*1—查询 *
*2—登记 *
*3—清账 *
*4—结算 *
***********************请选择 0—4号菜单,
第 10章 子程序及基本菜单的使用方法
这时在光标处没有任何数字,只等用户输入 。 当用
户键入的数据是 0~4中的一个时,程序将从暂停处继续
执行情况语句 。 如果用户键入的数据为, 0”,则在执行
EXIT语句时,退出主控程序如果用户键入的数据是, 1”,
则调出子程序, CX.PRG”执行如果用户键入的数据为
,2”,则调子程序, DJ.PRG”执行,依此类推 。
第 10章 子程序及基本菜单的使用方法
10.3.2 多层菜单的连接
1.多层次菜单的框图
两层菜单的框图如图 10—3。
第 10章 子程序及基本菜单的使用方法
图 10—3 两层菜单框图
第 10章 子程序及基本菜单的使用方法
2,多层次菜单的连接
从两层菜单我们可以引申到多层菜单 。 从图 10—3
框图中可以看出,两层菜单和各模块之间都是通过主控
程序进行连接的,主控程序利用菜单的形式来进行程序
的分支处理,每个分支程序又可以通过继续设置菜单进
行下一层的分支处理 。
10.3.1节例中主控程序所调用的子程序, CX.PRG”,
程序清单如下,
第 10章 子程序及基本菜单的使用方法
TYPE CX.PRG
SET TALK OFF
DO WHILE.T.
CLEAR
@3,10SAY“请您输入查询方式,
@4,10SAY“0—退出查询,
@5,10SAY“1—按旅客姓名查询,
@6,10SAY“2—按旅客单位查询,
@7,10SAY“3—按旅客住的楼层查询,
WAIT“请选择 0—3号菜单,”TOB1
第 10章 子程序及基本菜单的使用方法
DOCASE
CASEB1=“0”
EXIT
CASEB1=“1”
DOCX1
CASEB1=“2”
DOCX2
CASEB1=“3”
DO CX3
ENDCASE
ENDDO
RETURN
第 10章 子程序及基本菜单的使用方法
用户如在主控菜单下选择了查询功能号 1,主控程
序则调用子程序, CX.PRG”。 系统执行, CX.PRG”后,
立刻又给用户在屏幕上显示出有关查询方式的菜单,供
用户选择 。 屏幕显示菜单如下,
请您输入查询方式
0—退出查询
1—按旅客姓名查询
2—按旅客单位查询
3—按旅客住的楼层查询
请选择 0—3号菜单,
第 10章 子程序及基本菜单的使用方法
为了使大家在菜单的应用上有个较为完整的概念,
下面给出子程序, CX1.PRG”的程序清单,CX1的功能
是供用户按旅客的姓名查询,清单如下,
SET TALK OFF
SET PRINTER ON
USEL GFU
INDE ON旅客姓名 TO LG1
DO WHILE.T.
CLEAR
XM1SPACE(8)
@5,10SAY“请输入姓名,”GETXM1
第 10章 子程序及基本菜单的使用方法
READ
SEEK XM1
IF FOUND()
DISP
ELSE
“查无此人,
ENDIF
WAIT“继续查询吗 (Y/N):”TOYN
IF UPPE(YN)<>, Y”
EXIT
ENDIF
ENDDO
SETPRINTEROFF
RETURN
第 10章 子程序及基本菜单的使用方法
10.4 程序设计举例
例 1 以数据库文件, 职工,DBF”为对象,设计数据库
日常维护程序 。
在数据库建成以后,随着时间的推移和条件的变化,
原有数据必然地要进行补充修改,以维持数据的完整和
有效,这就是数据库的日常维护 。 维护会有些什么内容?
很容易想到如下几条,
① 对数据库增添新的记录
② 删除不必要的记录
③ 更新数据 。
第 10章 子程序及基本菜单的使用方法
1,编制主控程序
首先,我们编制数据库日常维护程序的主控程序 (即
菜单程序 ),取文件名为, QWH,PRG” 。 下面,我们分
析该程序应包括的主要内容和主要功能 。
主控程序, QWH.PRG”应具有对各维护子程序的转
子控制作用 。 它一般应包括以下几个组成部分,
① 数据库维护功能菜单显示部分
② 菜单选择部分
③ 转子部分
④ 菜单选择出错后重复菜单以供用户再次输入 。
根据以上分析编制,QWH.PRG”程序流程图如图 10—4。
第 10章 子程序及基本菜单的使用方法
图 10—4 QWH.PRG程序流程图
第 10章 子程序及基本菜单的使用方法
主控程序, QWH.PRG”程序清单如下,
SET TALK OFF
CLEAR ALL
DO WHILE.T.
D1“”
CLEAR
SPACE(15)+“数据库日常维护系统,
SPACE(15)+“******主菜单 ******”
第 10章 子程序及基本菜单的使用方法
SPACE(15)+“0—返回,
SPACE(15)+“1—添加记录,
SPACE(15)+“2—删除记录,
SPACE(15)+“3—更新记录,
SPACE(15)+“***************”
@10,10SAY“请选择菜单,”GETD1
READ
DOCASE
CASED1=“0”
EXIT
CASED1=“1”
第 10章 子程序及基本菜单的使用方法
DOTJJL
CASED1=“2”
DOSCJL
CASED1=“3”
DOGXJL
OTHERWISE
CLEAR
“菜单选择输入有错,返回重选,”
WAIT“按任意键返回,”
ENDCASE
ENDDO
第 10章 子程序及基本菜单的使用方法
程序的菜单选择部分用了 @...SAY...GET...READ
语句 (GET后面的内存变量 D1必须是定义过的 。 在程序
的第 4句,我们给 D1赋值一个空字符 ),程序执行到这里,
暂停运行,等待用户选择菜单,根据用户选择的菜单调用
不同的子程序 。 如果用户选择了菜单之外的数据,屏幕
将显示, 菜单选择输入有错,返回重选 。, 并提示用户
,。, WAIT语句,使得出
错信息能在屏幕停留,等用户看清楚,按任意键快速返回

第 10章 子程序及基本菜单的使用方法
2,编制主菜单选择项 1:添加记录子程序
添加记录子程序, TJJL.PRG”,它的主要功能是实
现用户对数据库记录的增添,一般应包括如下内容,
① 为了使输入格式清晰,较符合平时编制表格的习
惯,应首先建立一个屏幕输入格式文件 。
② 建立子程序, TJJL.PRG”。 在子程序中,应首先
打开数据库文件, 职工,DBF”,再打开屏幕格式文件,然
后追加记录 。
第 10章 子程序及基本菜单的使用方法
子程序, TJJL.PRG”程序清单如下,
USE 职工
SET FORMAT TO PMGS.FMT
APPEND
USE
CLOSEFORMAT
RETURN
第 10章 子程序及基本菜单的使用方法
程序第 2句是打开屏幕格式文件 PMGS.FMT,第 5句是
将屏幕格式文件关闭 。
3,编制主菜单选择项 2:删除记录子程序
删除记录子程序, SCJL.PRG”的主要功能是帮助用
户删除库文件中不必要的记录 。 这一工作一般应包括,
① 为慎重起见,在用户输入要删除的职工姓名后,应在
屏幕询问所输入的姓名是否正确 。
② 在库文件中查询对应记录,找到,则删除否则,应提
醒用户查无此人 。
③ 执行一次程序,为用户提供删除多个记录的机会 。
设计程序流程图如图 10—5。
第 10章 子程序及基本菜单的使用方法
图 10—5 SCJL.PRG程序流程图
第 10章 子程序及基本菜单的使用方法
子程序, SCJL.PRG”程序清单如下,
USE 职工
DO WHILE.T.
CLEAR
A21SPACE(8)
@5,10SAY“请输入要删除的职工姓名,”GETA21
READ
“删除记录的职工姓名,”+A21
WAIT“输入姓名是否正确 (Y/N):”TOA22
第 10章 子程序及基本菜单的使用方法
IF UPPE(A22)“N”
LOOP
ENDIF
LOCA FOR姓名 A21
IF.NOT.FOUND()
WAIT“查无此人,重新输入吗 (Y/N):”TOA23
IF UPPE(A23)“N”
EXIT
ENDIF
LOOP
ENDIF
DELETE
WAIT“继续删除其它记录吗 (Y/N):”TOA24
第 10章 子程序及基本菜单的使用方法
IF UPPE(A24)“N”
EXIT
ENDIF
ENDDO
PACK
RETU
第 10章 子程序及基本菜单的使用方法
在子程序, SCJL.PRG”中,首先是打开数据库文件
,职工,DBF”,然后进入一个循环,这个循环采用无限次
循环控制方式,循环条件为真 。
第 5句要求用户输入要删除的职工姓名,并将其存入
内存变量 A21中 。
第 12~19句,在数据库文件, 职工,DBF”中查找其姓
名与用户键入的姓名相等的记录 。
第 20句将该记录打上删除标记 。
第 21~24句,提示用户是否还要删除其它记录 。
第 26句将打上删除标记的记录真正删除 。
第 27句执行 RETURN语句,返回主程序 。
第 10章 子程序及基本菜单的使用方法
4,编制主菜单选择项 3:更新记录子程序
更新记录子程序, GXJL.PRG”主要用于实现数据
更新修改功能 。 我们设想要更新数据库中的数据时,会
有什么样的过程 。
① 在数据管理系统中,为了防止数据的混乱,一般更
新修改数据的操作均由个别的操作人员来进行 。 因此
应在程序中设置口令,并且仅为有关人员掌握 。 如果口
令字输入不对,则禁止更新数据,返回主程序如果口令正
确,则打开库文件 。
第 10章 子程序及基本菜单的使用方法
② 要求操作人员输入要修改的记录号并对该记录
进行修改操作 。
③ 更新完一个记录数据,如果还要更新其它记录,则
重复步骤 ② 中的操作;否则,返回主程序 。
GXJL.PRG设计程序流程图如图 10—6。
第 10章 子程序及基本菜单的使用方法
图 10—6GXJL.PRG程序流程图
第 10章 子程序及基本菜单的使用方法
子程序, GXJL.PRG”程序清单如下,
SET TALK OFF
CLEAR
@10,10SAT,请输入更新修改口令,”
SET CONSOL OFF
ACCE TO KL
SET CONSOL ON
IF KL<>, HHH”
@12,10SAY,口令不对,禁止更新数据 !”
第 10章 子程序及基本菜单的使用方法
WAIT“按任意键返回,”
RETU
ENDIF
USE职工
DOWHILE.T.
A330
CLEAR
@5,10SAY,请输入被修改记录号,”GETA33
READ
GOA33
CLEAR
第 10章 子程序及基本菜单的使用方法
@1,10SAY“职工号,”GET职工号
@2,10SAY“职工姓名,”GET姓名
@3,10SAY“姓别,”GET姓别
@4,10SAY“出生日期,”GET出生日期
@5,10SAY“婚否 (T/F):”GET婚否
@6,10SAY“工资,”GET工资
@7,10SAY“职称,”GET职称
@8,10SAY“工作部门,”GET部门
READ
WAIT“继续修改其它数据吗 (Y/N):”TOA34
IFUPPE(A34)“N”
第 10章 子程序及基本菜单的使用方法
EXIT
ENDIF
ENDDO
RETU
程序中,首先设置初始状态,清屏 。
第 3~6句要求用户输入口令 。 其中, 第 3句在屏幕上显
示, 请输入更新修改口令,”。
第 4句 SETCONSOLOFF语句的功能是控制输出的信息
在屏幕上不显示 。 第 5句暂停程序执行,等待用户输入口令 。
用户输入完口令,打了回车键后,程序即从第 6句继续执行 。
第 10章 子程序及基本菜单的使用方法
第 6句用 SETCONSOLON命令恢复输出信息在屏幕
上显示的功能 。
第 7~11句,程序判断用户输入的口令是否正确 。 如
果口令不正确,则显示, 口令不对,禁止更新数据,,且提
示用户, 按任意键返回,,程序执行返回主菜单命令
RETURN如果口令正确,则打开数据库文件,从第 13句开
始进行更新数据的操作 。
从第 16~28句,请用户输入要更新数据的记录的记录
号,且用 @...SAY...GET..,READ
据进行更新 。
第 10章 子程序及基本菜单的使用方法
例 2 数据库的查询举例 。
数据库的查询是数据库操作中最为频繁的一项操作 。
下面,我们试举一个职工查询的例子,对于数据库文件, 职
工,DBF”,我们希望能够按照姓名,职称,工作部门等不同
属性来查询职工 。 我们给这个文件取名为, ZGGL.PRG”。
根据项目的要求,我们设想这个程序应包括如下内容,
① 为用户提供查询选择菜单 。
② 根据用户的选择,查询职工情况 。
③ 如果用户还要选择菜单,则重新显示主菜单,供用户
选择查询,直到用户决定不再查询为止 。
,ZGGL.PRG”程序流程图如图 10—7。
第 10章 子程序及基本菜单的使用方法
图 10—7 例 2的 ZGGL.PRG程序流程图
第 10章 子程序及基本菜单的使用方法
“ZGGL.PRG”程序清单如下,
SET TALK OFF
CLEAR ALL
USE职工
STORESPACE(8)TOB11,XM1,ZC1,BM1
DOWHILE.T.
CLEAR
@3,10SAY“职工管理系统主菜单,
@4,10SAY“0—返回,
@5,10SAY“1—按姓名查询,
@6,10SAY“2—按职称查询,
@7,10SAY“3—按工作部门查询,
@8,10SAY“请选择菜单,”GETB11
第 10章 子程序及基本菜单的使用方法
READ
DOCASE
CASEB11=“0”
“再见 !”
CANCEL
CASEB11=“1”
CLEAR
@10,10SAY“请输入职工姓名,”GETXM1
READ
DISPALLFOR姓名 XM1
CASEB11“2”
CLEAR
第 10章 子程序及基本菜单的使用方法
@10,10SAY“请输入待查职工的职称,”GETZC1
READ
DISPALLFOR职称 ZC1
CASEB11=“3”
CLEAR
@10,10SAY“请输入待查职工的工作部门,”TOBM1
READ
DISPALLFOR部门 BM1
ENDCASE
WAIT“要继续查询吗 (Y/N):”TOB12
IF UPPE(B12)=“N”
EXIT
第 10章 子程序及基本菜单的使用方法
ENDIF
ENDDO
RETU
“ZGGL.PRG”程序因为执行语句较简单,没有用子
程序调用,仅用了一个循环语句,循环中嵌套了情况语句 。
结合流程图,读者对这个程序是不难理解的 。
第 10章 子程序及基本菜单的使用方法
10.5 过程文件的使用方法
建立过程文件是解决这些问题的好方法 。
1.过程文件
过程文件是一个子程序集 。 在一个过程文件中,可
以包含某主程序所调用的全部子程序 。 打开一个过程
文件就打开了它所包含的所有子程序 。 以后,调用子程
序时,不必再去打开一个文件,而是直接在此过程文件中
寻找并执行子程序 。 显然,这种方式既可节省打开文件
的时间,又方便了管理 。
第 10章 子程序及基本菜单的使用方法
2,建立过程文件
过程文件的建立方法与一般命令文件一样,用
MODIFYCOMMAND命令建立,默认的扩展名为,PRG。
各个子程序需重新写进过程文件,并在各个子程序
的前面增加一条 PROCEDURE 。
语句格式,PROCEDURE〈 该子程序名 〉
一个子程序进入到一个过程文件后,也成为过程文
件中的一个过程 。
第 10章 子程序及基本菜单的使用方法
3,在应用系统中使用过程文件
要使用过程文件,首先应在主程序的开始用
SETPROCEDURE 。
语句格式,SETPROCEDURETO〈 过程文件名 〉
SETPROCEDURE语句一般放在主程序的前面,且
必须放在主程序循环语句的前面,因为它只执行一次 。
打开过程文件后,用户就可用 DO〈 子程序名 〉 来
调用该过程文件中所包含的过程了 。
第 10章 子程序及基本菜单的使用方法
4,关闭过程文件
① 用 SETPROCEDURE〈 过程文件名 〉 打开一个过
程文件时,原已在内存中打开的过程文件即被关闭 。
可见,内存中最多只能存在一个过程文件 。
② 在主程序末尾应关闭过程文件 。 下列两条命令
都可关闭之,
CLOSE PROCEDURE
SET PROCEDURETO &&无任选项
第 10章 子程序及基本菜单的使用方法
10.6 设置内存变量属性的语句
10.6.1 内存变量的固有性质 ——局部性
① 在一个程序中所定义的内存变量,如果未加说明,
则在定义它的程序执行完后,将被系统消除 。
② 如果定义它的程序还要调用其它子程序,那么它
还可以在子程序中使用 。
③ 在子程序执行的过程中,如果改变了该内存变量
的值,则在从子程序返回主程序时,该变量仍然保留它在
子程序中被改变了的值,主程序在此基础上可继续使用 。
第 10章 子程序及基本菜单的使用方法
从内存变量的固有性质可知,在多重子程序嵌套的
情况下,较高一级的程序中生成的变量可以供较低一级
使用,而反之则不行, 这就是内存变量的局限性 。
例 由键盘输入一个梯形的上底,下底和高的值,在
主程序中定义它们,然后在子程序中求这个梯形的面积,
分别看看这些变量在主程序与子程序中的情况 。
第 10章 子程序及基本菜单的使用方法
主程序, L812.PRG”程序清单如下,
SET TALK OFF
CLEARALL
STORE 0 TO A1,B1,H1,面积
@5,10SAY“输入上底值, GETA1
@7,10SAY“输入下底值, GETB1
@9,10SAY“输入梯形高值, GETH1
READ
“内存变量在主程序中定义的情况,”
LISTMEMO
DOBBB
第 10章 子程序及基本菜单的使用方法
“内存变量由子程序返回主程序后的情况,”
LIST MEMO
子程序, BBB.PRG”清单如下,
.TYPE BBB.PRG
“内存变量由主程序进入子程序时的情况,”
LISTMEMO
AR=(A1+B1)*H1/2
面积 =AR
“子程序中定义变量且改变主程序中变量值的情况,”
LIST MEMO
RETU
第 10章 子程序及基本菜单的使用方法
这个程序运行的结果如下,
DOL812
输入上底值,4
输入下底值,8
输入梯形高值,7
第 10章 子程序及基本菜单的使用方法
10.6.2 设置全局性内存变量语句 —— PUBLIC
在程序设计中,对有些子程序中定义的内存变量,我们
希望在主程序中仍能使用,或者希望它在整个的程序中均
能使用,这时,应该使用全局性的内存变量 。 全局性内存变
量定义格式如下,
格式 1:PUBLIC〈 内存变量清单 〉
格式 2,PUBLIC[ ARRAY] 〈 内存变量 〉 (〈 数字表
达式 1〉 [,〈 数字表达式 2〉 ] )[,..]
格式 1用来对 〈 内存变量清单 〉 中的内存变量进行全
局性说明,这个命令必须放在定义这些变量的语句之前 。
格式 2定义一些全局性数组变量 。
第 10章 子程序及基本菜单的使用方法
全局性内存变量的性质,
① 用 PUBLIC语句声明过的内存变量可以在整个的
程序以及各子程序中使用 。
② 当整个程序结束后,用 PUBLIC语句声明过的内存
变量依然存在,若要清除它们,必须借助于 RELEASE命令 。
在 FoxPro命令窗口下建立的内存变量都是全局性内
存变量 。
在程序中,内存变量用 PUBLIC命令说明为全局性变
量之后,由定义值决定变量的类型 。 但在定义它之前,变
量的值为逻辑非 (.F.)。
第 10章 子程序及基本菜单的使用方法
10.6.3 隐蔽内存变量语句 —— PRIVATE
语句格式,PRIVATE[ ALL[ LIKE/EXCEPT〈 通配
符 〉 ]] [ 〈 内存变量清单 〉 ]
这个语句中,内存变量清单任选项列出了要说明为隐
蔽型的内存变量名 。 前一任选项则是与它互相排斥的,不
会同时存在否则,系统将指出语法错误 。 前一任选项可以
有以下三种选择,
(1)ALL:此时将所有的内存变量均说明为是隐蔽型的 。
(2)ALLLIKE〈 通配符 〉,此时内存中所有变量名能
与通配符相匹配的内存变量将被说明为是隐蔽型的 。
第 10章 子程序及基本菜单的使用方法
(3)ALLEXCEPT〈 通配符 〉,此时内存中除了变量
名能与通配符相匹配的内存变量,其余的均被说明为是
隐蔽型的 。
PRIVATE并不产生新的变量 。 它只是把主程序中
定义的内存变量隐蔽起来,不再使用 。
PRIVATE语句的使用,使得子程序中的变量与上层
程序中的变量同名而不同值成为可能 。
第 10章 子程序及基本菜单的使用方法
10.7 子程序调用中传递参数的语句
1,提供参数语句
语句格式,DO〈 子程序文件名 〉 WITH〈 参数清单 〉
这条语句用在主程序或嵌套级别较高的程序模块
中,其功能是给子程序或嵌套级别较低的程序模块提供
所需的参数 。 这些参数可以是具体的数值,或是表达式,
或是定义过的内存变量名 。
第 10章 子程序及基本菜单的使用方法
2,接收参数语句
语句格式,PARAMETERS〈 参数清单 〉
这条语句用在子程序或嵌套级别较低的程序模块
中,其功能是接收较高一级的程序中传递过来的参数 。
这两条语句必须搭配使用,不能单独使用,且参数清
单必须一一对应 。 系 统 在 执 行 子 程 序 时,用
PARAMETERS语句中的参数代换 DO语句的参数 。
PARAMETERS语句中的参数一般情况下是内存变量 。
第 10章 子程序及基本菜单的使用方法
例 有一个程序,定义了三个内存变量 。 主程序传递
给子程序三个参数:一个是数值,一个是表达式,另一个
是变量 。 主程序两次调用子程序 。 试从这个程序的运
行结果去体会各种参数传递的规律 。
列主程序, L815.PRG”清单如下,
TYPE L815.PRG
SET TALK OFF
A=5
B=5
C=5
第 10章 子程序及基本菜单的使用方法
“主程序中变量定义情况,”
LIST MEMO
DOKK WITH10,A+B,C
“返回主程序时变量情况,”
LIST MEMO
DOKKWITH10,A+B,C
“第二次返回主程序时变量情况,”
LISTMEMO
列子程序, KK.PRG”清单如下,
TYPEKK.PRG
PARAMETERSX,Y,Z
第 10章 子程序及基本菜单的使用方法
XX+3
AY+3
ZB+3
“?“子程序中各参数的情况,”
LIST MEMO
RETU
在这个程序中,主程序将数值 10传递给子程序中的
变量 X,将表达式传递给变量 Y,将变量 C传递给变量 Z。
在子程序中,对各变量进行了简单的赋值运算,然后分别
在子程序和主程序中列出各变量的情况 。
第 10章 子程序及基本菜单的使用方法
通过对本例中结果的分析,可以看到在参数的传递中
有这样一些规律,
① 如果在 DO语句中被传递的参数是一个常数,那么
这个常数在接受数据的子程序中将作为 PARAMETERS
给出的变量的值而被使用 。
② 如果在 DO语句中被传递的参数是一个表达式,那
么该表达式先被求值,然 后 再 将求 出 的 值 传 递 给
PARAMETERS给出的变量 。
③ 如果在 DO语句中,被传递的参数是一个内存变量,
那么系统先用 PARAMETERS给出的变量代换 DO的变量,
然后将 DO语句的变量隐藏起来,被隐藏 (hidden)的内存变
量在子程序中不能使用 。
第 10章 子程序及基本菜单的使用方法
10.8 FoxPro 基本菜单
10.8.1下拉菜单
基本的下拉菜单是两层菜单,其特点是把两层菜单同
时显示出来,用户一次就可同时选中两层菜单的有关项 。
例 有一个两层菜单,主菜单有 3个选择项,维护,查询和
退出 。 对于维护项,其子菜单为,添加,删除和更新对于查
询项,子菜单为,按姓名,按单位对于退出,子菜单为,退出循
环,返回 DOS。
第 10章 子程序及基本菜单的使用方法
采用下拉菜单时,屏幕显示为,
维护 查询 退出
添加 按姓名 退出循环
删除 按单位 返回 DOS
更新
用户可移动屏幕上的亮条到所需项上,一次性选择
两层菜单 。 例如,若亮条在, 按姓名, 位置时,被用户选
中,则同时选中主菜单的, 查询, 及其子菜单的, 按姓
名, 。
另外,根据亮条所在位置,在屏幕指定行上可同时出
现一些提示信息 。
第 10章 子程序及基本菜单的使用方法
1,建立下拉菜单
要使用基本的下拉菜单,必须预先定义一个主菜单数组,
并为每个子菜单定义一个子菜单数组 。
(1)
① 首先, 用 DIMENSION语句定义一个主菜单数组 。 它
是一个 M行,2列的二维数组 。 其中,M为主菜单中选择项个数 。
② 为主菜单数组赋值 。 数组第一列各项中存储主菜单各
选择项名,第二列存储各选择项对应的提示信息 。
③ 显示主菜单命令 ——MENUBAR
命令格式, MENUBAR〈 主菜单数组名 〉,〈 主菜单行数 〉
第 10章 子程序及基本菜单的使用方法
该命令把主菜单数组第一列各项顺序在屏幕顶行
依次平行显示 。
④ 显示主菜单提示信息命令 ——SETMESSAGETO
命令格式 1,SETMESSAGETO[ 〈 数字表达式 〉
[ LEFT/CENTER/RIGHT]]
命令格式 2:SETMESSAGEWINDON[ 〈 窗口名 〉 ]
命令格式 3:SETMESSAGETO[ 〈 字符表达式 〉 ]
对于格式 2,提示信息在 〈 窗口名 〉 中显示 。
对于格式 3,提示信息改为 〈 字符表达式 〉 。
第 10章 子程序及基本菜单的使用方法
(2)
① 首先, 为每个子菜单定义一个一维子菜单数组,
其中各项即为该子菜单的各个选择项 。 若某项以, \”
开头,则该项不能选若包含, \-”,。
② 显示子菜单命令 ——MENU
命令格式,MENU〈 表达式 1〉,〈 主菜单数组名 〉,
〈 表达式 2〉,[ 〈 表达式 3〉 ] 三个表达式都是数字表
达式 。
第 10章 子程序及基本菜单的使用方法
2,选择下拉菜单命令 ——READ MENU BAR
命令格式,READMENUBARTO〈 变量 1〉,
〈 变量 2〉 [ SAVE]
命令格式中,〈 变量 1〉 和 〈 变量 2〉 应事先赋数字
型初值 。
执行此命令后,在 〈 变量 1〉 指定的主菜单项下,
〈 变量 2〉 指定的子菜单项上形成一个亮条 。
若 〈 变量 1〉 和 〈 变量 2〉 的初始值不能与菜单结
构相匹配,则两值自动变为 1。
第 10章 子程序及基本菜单的使用方法
3.选中某菜单项的方法
当亮条在某菜单项时,键入回车键即表示选中了该
项 (同时也选中顶端的主菜单项 )。 这时 〈 变量 1〉 和
〈 变量 2〉 的值就为下面的程序提供了转向依据 。
4.下拉菜单编程举例
SET TALK OFF
CLEAR
SET MESSAGE TO 20
DIMENSION A(3,2),A1(3),A2(2),A3(2)
第 10章 子程序及基本菜单的使用方法
A(1,1)“维护,
A(2,1)“查询,
A(3,1)“退出,
A(1,2)“维护方式选择,
A(2,2)“查询方式选择,
A(3,2)“退出方式选择,
A1(1)“添加,
A1(2)“删除,
A1(3)“更新,
A2(1)“按姓名查询,
A2(2)“按单位查询,
A3(1)“退出循环,
A3(2)“返回 DOS”
第 10章 子程序及基本菜单的使用方法
MENUBARA,3
MENU1,A1,3,3
MENU2,A2,2,2
MENU3,A3,2,2
FFF1
GGG1
READMENUBARTOFFF,GGGSAVE
DOCASE
第 10章 子程序及基本菜单的使用方法
CASEFFF=1.AND.GGG=1
DO TJ
CASEFFF=1.AND.GGG=2
DO SC
CASEFFF=1.AND.GGG=3
DO GX
CASEFFF=2.AND.GGG=1
DO AXMC
第 10章 子程序及基本菜单的使用方法
CASEFFF=2.AND.GGG=2
DO ADWC
CASEFFF=3.AND.GGG=1
EXIT
CASEFFF=3.AND.GGG=2
QUIT
ENDCASE
第 10章 子程序及基本菜单的使用方法
10.8.2 上弹菜单
1.建立上弹菜单数组
要使用上弹菜单,必须首先建立一个一维字符型菜单
数组 。 其中, 菜单各选择项预先存入 。
2,显示上弹菜单命令 ——@...MENU
命令格式,[ZK(]@〈 行,列 〉 MENU〈 菜单数组名 〉,
〈 表达式 1〉 [,〈 表达式 2〉 ] [ TITLE〈 字符表达
式 〉 ] [ SHADOW] 〈 行,列 〉 规定该列菜单左上角坐标 。
〈 表达式 1〉 是数字型的,给出菜单项数 。
〈 表达式 2〉 是数字型的,规定同时显示的菜单项数 。
第 10章 子程序及基本菜单的使用方法
若 〈 表达式 1〉 的值大于 〈 表达式 2〉 的值,用户可使
菜单项滚动,弹出后续选择项 。
TITLE〈 字符表达式 〉 给出菜单标题,置于菜单顶部 。
SHADOW规定菜单的背景为阴影 (但内容可看清 )。
无此项时,菜单无阴影 。
3.选择上弹菜单命令 ——READ MENU
命令格式,READMENUTO〈 变量名 〉
命令格式中,〈 变量名 〉 为内存变量或下标变量,且必
须已赋数字型初值 。 (它不能大于菜单项数 。 )
执行此命令后,将在 〈 变量名 〉 指定选择项上形成一
亮条 。 用户可移动亮条 。
第 10章 子程序及基本菜单的使用方法
(〈 变量名 〉 值始终与亮条所处选择项的项数相等 。 )
[ SAVE] 项的含义同前 。
4,选中某菜单项法
按回车键即选中亮条所在菜单项 。 此时的 〈 变量
名 〉 值为下面程序提供了转向依据 。
第 10章 子程序及基本菜单的使用方法
10.8.3 亮条菜单
1,显示亮条菜单命令 ——@...PROMPT
格式, @〈 行,列 〉 PROMPT〈 字符表达式 1〉
[ MESSAGE〈 字符表达式 2〉 ]
该命令将在规定位置开始,显示 〈 表达式 1〉 的值
(菜单项 )。 〈 表达式 2〉 为提示信息 。
@...PROMPT命令生成一个菜单 。
2.选择亮条菜单命令 ——MENU TO
格式,MENUTO〈 变量名 〉
该命令将在 〈 变量名 〉 规定的菜单项上生成一个
亮条 。 用户可移动亮条 (〈 变量名 〉 值也相应变化 )。
第 10章 子程序及基本菜单的使用方法
3.选中某菜单项的方法
有两种选择亮条菜单项的方法 。
① 不论亮条在哪里,只要键入所需菜单项的第一个
字符,即选中该项 。 系统首先使 〈 变量名 〉 值变为选中
菜单项的序号,然后退出菜单 。 (首字符为汉字时,不能
用此法 。 )
② 当亮条在希望选择的菜单项上时,按回车键,即选
中该项 。 选中后,〈 变量名 〉 的值即被后面程序使用 。
第 10章 子程序及基本菜单的使用方法
10.9 用户自定义函数
1,独立自定义函数
一个独立自定义函数实际上是一个子程序 。 惟一
的差别在于 RETURN语句行带有一表达式,
RETURN〈 表达式 〉
独立自定义函数作为函数使用时,其函数名就是该
子程序名 (后加一对圆括号 )。
独立自定义函数的函数值,首先运行该子程序,直至
遇到 RETURN语句然后,求出 RETURN语句所带表达式
的值 。 此值即为该独立自定义函数的函数值 。
第 10章 子程序及基本菜单的使用方法
例 1 子程序, TR.PRG”内容如下,
PARAMETERN
RETURNN*N*N
主程序, ZT.PRG”内容如下,
X=3
STORETR(X) TO A
A
运行 ZT程序,输出 A的值为 27。
第 10章 子程序及基本菜单的使用方法
2,依附自定义函数
依附自定义函数不能作为一个文件独立存在 。 它
以 FUNCTION〈 函数名 〉 开头,可存放在某程序的后面,
某过程文件中 。
FUNCTION〈 函数名 〉 等价于 PROCEDURE〈 函
数名 〉,其余部分与独立自定义函数相同 。
第 10章 子程序及基本菜单的使用方法
例 程序, ZTR.PRG”内容如下,
X=3
STORETR(X) TO A
A
FUNCTIONTR
PARAMETERN
RETURNN*N*N
执行上述程序,得 A的值为 27。
对于用户自定义函数来说,若 RETURN语句缺省
〈 表达式 〉,则返回,T.。
第 10章 子程序及基本菜单的使用方法
10.10 编译 FoxPro 的命令文件
编译命令 ——COMPILE
格式, COMPILE〈 文件名 〉 /〈 通 配 符 〉
[ ENCRYPT] [ NODEBUG]
本命令把 〈 文件名 〉 或符合 〈 通配符 〉 的一组文
件,一个个地编译成对应目标文件 。
第 10章 子程序及基本菜单的使用方法
其实,FoxPro只执行目标文件 。 若用户执行一非编
译的程序,系统首先自动对它进行编译,然后再执行编译
生成的目标文件 。
ENCRYPT:包含本选择项后,经过编译的程序将被
加密,源程序将不能访问 。
NODEBUG:包含本选择项后,被编译程序中,每行将
减少两个字节。