3 |
如何加入READ EVENTS |
难度系数 êê |
人气指数 90% |
我的程序为什么在编译后会一闪而过,关闭程序时,为什么提示“不能退出FoxPro”?
请注意在问题2介绍的主程序中,加入了3个READ EVENTS,READ EVENTS的作用就是占用程序的进程,然后开始事务处理。许多的初学者问:为什么我的程序编译成EXE文件后一闪而过?其原因就是没有开始事务处理,所以程序就会一直向下执行。本节将逐一分析上面这个程序段的3个READ EVENTS。
在第一个READ EVENTS前,打开的是Begin表单,显示版权画面,表单的设计如图1-3所示,请注意表单的Unload方法设计。
图1-3 制作版权画面
在表单中使用了一个Timer控件,是为了进行画面显示的自动延迟时间。下面这段代码是进行表单的属性设置:
Height = 275
Width = 395
Desktop = .F.
ShowWindow = 2
AutoCenter = .T.
Picture = Begin.jpg
BorderStyle = 1
Caption = ""
ControlBox = .F.
Closable = .F.
MaxButton = .F.
MinButton = .F.
Movable = .F.
WindowType = 1
AlwaysOnTop = .T.
Name = "Form1"
然后编写表单的Init事件过程,定义全局变量nCountTime来计算时间延迟。
PUBLIC nCountTime
nCountTime=0
编写表单的Click方法,如果捕获到表单的鼠标单击事件,直接关闭表单,不再延迟。
RELEASE Thisform
编写表单的Unload方法,表单卸载时,执行CLEAR EVENTS命令,结束事务处理。
RELEASE nCountTime &&清除计时变量
CLEAR EVENTS
下面是Timer控件的时间延迟操作方法,设置Timer的Interval属性。
Interval=50
编写Timer事件计算延迟,可以根据自己的实际情况,通过更改Interval的值或nCountTime的循环次数来设定自己的延迟时间。
nCountTime=nCountTime+1
IF nCountTime=45
RELEASE Thisform
ENDIF
编写产品使用权的Label2(用户名)的Init方法:
This.Caption="ALLTRIM(SUBSTR(SYS(0),AT([#],SYS(0))+1,15))"
编写产品使用权的Label3(机器名)的Init方法:
This.Caption="ALLTRIM(LEFT(SYS(0),AT([#],SYS(0))-1))"
通过上面的分析看出,在关闭表单的时候,在Unload方法中执行了一条CLEAR EVENTS命令,来停止事务处理。这样,按照程序中的语句顺序,Visual FoxPro会自动寻找下一个READ EVENTS来进行事务处理,自然就执行到了DO FORM Login这里,从而显示了登录画面。同样的道理,在关闭Login表单的时候也同样执行了一条CLEAR EVENTS命令,然后程序按照语句顺序继续向下执行。由以上的介绍可得出结论:想在哪里开始事务处理,就在哪里加入READ EVENTS!
还剩最后一个READ EVENTS,这一个需要在结束应用程序退出Visual FoxPro时使用CLEAR EVENTS来清除,结束事务处理。否则,Visual FoxPro会提示“不能退出FoxPro”。
在Visual FoxPro中使用READ EVENTS代替了READ命令,实际上二者的作用是十分相近的,READ命令用于激活控制,READ EVENTS用于开始事务处理,下列代码演示了READ命令的作用,对于理解READ EVRNTS会有所帮助。
cName=SPACE(20)
nPrice=0.00
nNumber=0.00
@1,1 SAY "货物名称" GET cName
@3,1 SAY "价 格" GET nPrice
@5,1 SAY "数 量" GET nNumber
READ &&激活控制,可以输入货物名称、价格和数量
上面的代码是在FoxPro 2.6中编写数据录入的代码,READ命令可以激活GET控制来允许用户录入数据,如果屏蔽掉READ命令,程序会自动向下继续运行,这与在Visual FoxPro中没有READ EVENTS程序会一闪而过是同样的道理。