3.如何加入READ EVENTS

来源:互联网 发布:淘宝客网站搭建 编辑:程序博客网 时间:2024/04/29 21:05

3

如何加入READ EVENTS

难度系数 êê

人气指数 90%

问题详述

我的程序为什么在编译后会一闪而过,关闭程序时,为什么提示“不能退出FoxPro”?

专家解答

请注意在问题2介绍的主程序中,加入了3READ EVENTSREAD EVENTS的作用就是占用程序的进程,然后开始事务处理。许多的初学者问:为什么我的程序编译成EXE文件后一闪而过?其原因就是没有开始事务处理,所以程序就会一直向下执行。本节将逐一分析上面这个程序段的3READ 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控件的时间延迟操作方法,设置TimerInterval属性。

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程序会一闪而过是同样的道理。