Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: FoxPro中的陷阱技术及应用
发信站: 哈工大紫丁香 (2000年12月30日18:43:20 星期六), 转信
FoxPro中的陷阱技术及应用
甘肃省自考办(730030)马尚玮
甘肃社会主义学院(730046)杨凤
陷阱技术是系统开发中为加强系统的安全性、可靠性,提高系统的容错能力而发展
起来 的,它是一项集技术性、技巧性为一体的工作。在编制软件时,合理、恰当地
使用陷阱技术 ,能使编制的软件性能可靠,操作方便、灵活。作为面向过程的关系
型数据库语言,FoxPro是 目前较为广泛流行的数据库语言,和一般Xbase关系型数据
库语言一样。FoxPro下应用系统 程序的设计仍采用程序顺序调用的"串行"方式,程
序在实际运行的过程中经常会出现错误或中途中断,对诸如此类的突发事件,如果能
合理设置陷阱进行处理,就可防止系统运行瘫痪, 这样设计的程序就具备了对突发
事件进行"并行"处理的能力。
FoxPro 2.5允许用户设置各类陷阱,以捕获可能发生的某些随机事件。它提供了4类
命 令,可以为错误处理,响应按键,打印处理、非正常退出等提供陷阱(中断)服务。
在程序设计 中,使用该技术的方法是,首先编好可能发生的随机事件的服务子程序
,然后在主程序的开头 加上一条陷阱设置语句,指出陷阱服务程序的入口。程序运
行过程中,每执行完一条语句,系 统就自动检查一下所期待的中断事件是否发生,如
已发生则控制转向该事件的服务程序,服 务程序执行完毕后,返回被中断的程序继
续执行。
一、出错陷阱的设置
这类陷阱包括程序运行出错陷阱和输入陷阱,有两条命令ON ERROR和ON READERROR
用于 设置这类陷阱。
1.ON ERROR[]
该命令的功能是自动捕获命令或程序执行过程中的各类错误,然后执行<命令>。
<命令 >可以是一条命令,也可以是一段程序。通常是执行一个带有关错误参数的
陷阱处理服务子 程序。错误的参数可通过以下函数获得:
SYS(16,1)当前出错主程序名
PROGRAM()当前出错程序名
LINENO()当前出错程序行号
MESSAGE(1)出错程序源代码
ERROR()错误代码
MESSAGE()错误信息
注意:以上函数使用时只能以参数的形式传递给出错陷阱处理服务子程序,不能在程
序 中直接调用,以免得到错误信息。
下列程序ERROR1.PRG是一个出错陷阱处理程序,其使用方法是在主程序的开始执行
一条 命令:
ON ERROR DO ERROR1 WITH SYS(16,1),PROGRAM(),LINENO(),MESSAGE(1),
ERROR(),ME SSAGE()
这样在整个程序执行过程中,只要出现错误,系统就自动执行ERROR1.PRG程序。
SET TALK OFF
ON ERROR DO ERROR1 WITH SYS(16,1),PROGRAM(),LINENO(),MESSAGE(1),
ERROR(),M ESSAGE()
……
PROCEDURE ERROR1
PARAMETERS MPROG,PROG,LIEN,SCODE,ERR,ERRMESS
DEFINE WINDOW WIN1 FROM 5,10 TO 14,70
ACTIVATE WINDOW WIN1
ON ERROR *关闭出错陷阱
@0,5 SAY ‘当前出错主程序名:`+MPROG
@1,5 SAY ‘当前出错程序名:`+PROG
@2,5 SAY ‘当前出错行号:`+LINE
@3,5 SAY ‘出错程序源代码:`+SCODE
@4,5 SAY ‘错误代码:`+ERR
@5,5 SAY ‘错误信息:`+ERRMESS
WAIT `请修改程序,然后再运行,按任意键退出`
DEACTIVATE WINDOW WIN1
RETURN
在一个程序中可以有多个ON ERROR命令,但任一时刻,只有最后一次执行的ON
ERROR命 令有效。执行不带参数的ON ERROR命令可关闭出错陷阱。
2.ON READERROR[]
该命令为数据输入错误设置陷阱。这里数据输入错误是指在@…SAY/GET语句中输入
超 出RANGE的范围或不满足VALID的条件或其它非法数据。使用该陷阱设置的主要
目的是尽量 在数据输入时进行正确性校验,提示出错内容,保证数据输入的正确。
在READ命令执行期间 ,当出现输入错误时,陷阱被触发,控制转移并执行<命令>(
或语句)。请看下面的程序示例, 其中子程序ERROR2用于输入出错处理。
(1)STORE ‘ `TO YEAR,MONTH,JOB
(2)@10,30 SAY ‘请输入考生出生年/月和职业代码`
(3)ON READERROR DO ERROR2 WITH
(4)@11,36 SAY ‘年份`GET YEAR RANGE ‘80`,‘96`
(5)READ
(6)ON READERROR DO ERROR2 WITH
(7)@12,36 SAY‘月份`GET MONTH RANGE ‘01`,‘12`
(8)READ
(9)ON READERROR DO ERROR2 WITH
(10)@13,36 SAY ‘职业` GET JOB RANGE ‘01`,‘20`
(11)READ
(12)ON READERROR
(13)RETURN
(14)PROCEDURE ERROR2
(15)PARAMETERS
(16)DEFINE WINDOW WIN2 FROM 8,10 TO 15,70 `出错显示窗口`
(17)ACTIVATE WINDOW WIN2
(18)?IIF(P=1,‘输入年的范围在:80-96`,IIF(P=2,‘输入月的范围在:01-12`,
‘输入职业范围在:01-20`))
(19)WAIT ‘按任意键重新输入`
(20)DEACTIVATE WINDOW WIN2
(21)RETURN
注意:如果以上程序取消第5句和第8句READ命令,只保留第11句READ命令,则在出现
输入 错误时,提示信息总是"职业"的输入内容,而非实际所需年份或月份的内容。
这是因为每一 时刻只有一条ON READERROR命令有效,因此在每一条ON READERROR命
令之后必须跟READ命令 ,方可使每条@…SAY/GET命令所对应的ON READ-ERROR命令
有效。
二、按键陷阱的设置
FoxPro提供的按键陷阱语句有ON ESCAPE,ON KEY,ON KEY=,ON KEY LABEL四类,主要
用 于响应按键后的中断服务。
1.ON KEY[]
该命令的功能是捕获程序运行过程中用户按下的任意键,在程序运行过程中,当有任
意 一键被按下时,陷阱即被触发,控制转移执行ON KEY指定的[<命令>]。例如在
一些软件封面 (画面或音乐)演奏过程中,使用该命令,当按下任意键时,停止演奏,
继续往下执行。
2.ON KEY=[]
该命令的功能是捕获执行READ命令期间用户按下的某一特定键。在READ命令执行期
间 ,若<键值>所指定的键被按下,系统控制转移执行<命令>;如不设置该命令,
则在READ命令执 行期间,即使按下该键,系统也不作任何响应。
应该注意,当用该命令定义的键为可打印字符时,<键值>必须是被定义键的ASCII
码值; 而定义象F1、END、↑、ALT+F3、CTRL+F1、ALT+Q等功能键、光标键、组合
键时,<键值>必 须是被定义的扩展ASCII码值加上256。
同ON ERROR命令一样,在一个程序中只有最后一次定义的ON KEY(或ON KEY=[<键值
><命 令>])命令效。取消其作用的方法是定义一个不
带参数的ON KEY命令。
程序示例INPUTTIME.PRG
SET TALK OFF
ON KEY=315 DO HELP WITH VARREAD() *定义F1键为帮助键
USE 时间库
STORE ‘ ` TO A1, B1, C1
@6,30 SAY ‘请输入年/月/日,按F1帮助`
@8,34 SAY ‘年` GET A1 RANGE ‘80` , ‘96`
@9,34 SAY ‘月` GET B1 RANGE ‘01` , ‘112`
@10,34 SAY ‘日` GET C1 RANGE ‘01` , ‘31`
READ
RETURN
PROCEDURE HELP
PARAMETERS fdname
DEFINE WINDDW help_me
@0,0 SAY IIF(FDNAME=‘A1`,‘年范围应在:80-96`,IIF(FDNAME=‘B1`,
‘月范围应在 :01-12`,‘日范围应在:01-31`))
WAIT ‘
DEACTIVATE help_me
RETURN
3.ON ESCAPE[]
该命令为FoxPro提供的中断陷阱。其功能是当<ESC>键被按下时陷阱即被触发,控
制转 移并执行<命令>。该命令一经运行就一直有效,直至遇到另外一个ON
ESCAPE命令为止。不 带参数的ON ES-CAPE命令,将取消中断陷阱作用。当环境设置
SET ESCAPE OFF时,该命令不 起作用,一般在程序设计中,为保持程序的完整性,避
免按ESC键后导致程序非正常退出,一般 将ESC键设为OFF,故该命令不常用。
4.多键和鼠标陷阱设置
这类陷阱设置语句为:
ON KEY [LABEL<键标><命令>]
其功能为指定的多个键或鼠标按钮设置陷阱。当任一指定的键或鼠标按钮被按下时
,陷 阱即被触发,控制转移并执行<命令>。有关<键标>可查阅Foxpro2.5提供的
ON KEY LABEL命 令键码表。
ON KEY LABEL命令的用途比较广泛,使用该命令可以捕获READ BROW、EDIT、
CHANGE等 命令和用户自定义菜单或弹出式菜单状态下所按的指定键。与ON KEY命
令不同,在任何时候 可以有多个ON KEY LABLE命令同时有效。取消某一键或鼠标的
陷阱设置,可执行命令ON LA BLE<键标>。
例如把F1键定义为执行求助程序,把F2键定义为对当前工作区打开的数据库进行浏
览, 可用如下语句:
ON KEY LABLE F1 DO helpfile
ON KEY LABLE F2 BROW
5.按键陷阱设置中热键的重复使用
当在一个程序和其子程序中欲重复设置某一键,但两次设置的功能完全不同,例如
F1键 在主程序中进行了设置,当执行其子程序时F1键被子程序使用,并重新设置。
而当从子程序 返回时必须恢复F1在主程序中的用途,这时可以使用按键的堆栈解决
问题。当进入一个子程 序后,在未进行F1键设置之前,首先使用PUSH KEY [CLEAR]
命令将F1的当前定义压栈,再定义 自己的F1键用途,返回主程序前,再用POP KEY
[ALL]命令恢复主程序中的热键设置。在程序 的不同部分F1键重复使用,也可以用
此法解决。
三、打印陷阱设置
在数据库程序的设计中,中止打印过程一般有三种处理方法:一是打印指定记录后,
中止 打印;二是打印指定行内容后,中止打印;三是在任意时刻按某键,中止打印。
第一种方法。由于和数据库记录数有关,利用RECNO(),RECCOUNT( )两函数设计中止
程 序较为简单;第三种方法利用INKEY( )函数扫描键值,设计中止程序也较为容易
。
第二种方法不仅和数据库记录数有关,还与打印内容的表头、表尾有关,在以前的系
统 里较难实现。FoxPro新增ON PAGE[AT LINK<数值><命令>]陷阱命令后,使得
按行中止打印程 序的设计变得十分简便,只需在以上命令中加入中止行数,即可在
打印输出到该行时自动中 止打印。
以下程序是按行打印中止程序的简单例子。
SET TALK OFF
SET PRINT ON
ON PAGE AT LINE 20 DO EJE
USE MAMESS
DO WHILE ·NOT· EOF()
?CODE
??MESN
SKIP
ENDDO
SET PRINT OFF
USE
RETURN
PROCEDURE EJE
SET PRINT OFF
WAIT
SET PRINT ON
RETURN
四、异常退出FoxPro的陷阱设置
当用户非正常退出FoxPro时,可以使用FoxPro提供的ON SHUTDOWN陷阱命令解决这个
问 题。该命令可以捕获以下动作:一是在左上角控制菜单双击鼠标;二是单击控制
菜单,选择C lose退出;三是在Comand窗口键入Quit命令退出。我们可以使用ON
SHUTDOWN DO FILENAME 命令,用名为FILENAME的程序取代Fox-Pro本身提供的系统
信息。FILENAME程序向用户提供 提示信息,让用户确认是否真的要退出FoxPro,若
不退出,使用RETRY命令返回程序,否则,使 用QUIT命令退出FoxPro。
返回首页
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.798毫秒