回 帖 发 新 帖 刷新版面

主题:[讨论]vfp循環時,為何計時鐘不工作?

有一個疑問,就是為何在一個表單中運行循環時,另一個表單中的計時鐘都不起作用呢?

THIS.INTERVAL=500
IF EVT_BUSY=.F.
  THISFORM.RELEASE
ELSE  
  THISFORM.LABEL1.CAPTION=EVT_LABEL
  PP=THISFORM.LABEL1.WIDTH+86
  THISFORM.LockScreen=.T.
  WITH THISFORM
   .MAXWIDTH=PP
   .MINWIDTH=PP
   .WIDTH=PP
  ENDWITH
  THISFORM.LockScreen=.F.
  DO CASE
  CASE BUSY=1
    THISFORM.LABEL2.CAPTION="叫单."
  CASE BUSY=2
    THISFORM.LABEL2.CAPTION="叫单.."
  CASE BUSY=3
    THISFORM.LABEL2.CAPTION="叫单..."
  CASE BUSY=4
    THISFORM.LABEL2.CAPTION="叫单...."  
  CASE BUSY=5
    THISFORM.LABEL2.CAPTION="叫单....."
  CASE BUSY=6
    THISFORM.LABEL2.CAPTION="叫单......"  
  ENDC
  IF BUSY=6
    BUSY=1
  ELSE
    BUSY=BUSY+1
  ENDI    
ENDIF
THISFORM.REFRESH

&&以上代碼就是一個等待執行的程式,其目的就是讓用戶知道程序進程到哪了,但是主表單的循環沒有完成時,擁有此計時鐘的表單根本就不刷新!我在此段代碼后面不管加還是不加最后一句都是一樣的效果,我用MESSAGEBOX函數測試,此對話框也只會在主表單循環完成后顯示一次(EVT_LABEL為全局變量,會在主表單的循環中變化,我曾經將循環的時間用100000000次來測試,其等待的時間到少有2秒,可是還是不刷新表單!).

回复列表 (共4个回复)

沙发

"....我在此段代碼后面不管加還是不加最后一句都是一樣的效果,
....".
  我想你应该在循环中加.....此計時鐘的表單的REFRESH
刷新含循环的表單啊.

板凳

[quote]有一個疑問,就是為何在一個表單中運行循環時,另一個表單中的計時鐘都不起作用呢?[/quote]
回答是:計時鐘没有机会执行它的事件过程。

解决办法:在主表單的循環过程中使用DOEVENTS命令。

Step By Step:

1.创建一个表单form1.scx,添加一个按钮Command1。

Command1的Click事件代码:

LOCAL tempForm
DO FORM form2 NAME tempForm LINKED 
*以下模拟一个耗时的任务
FOR nI=1 TO 1000
   FOR nJ=1 TO 100
     FOR nK=1 TO 100
       DOEVENTS     &&该命令暂时中断循环,使系统执行其它任务 
       IF nI*nI+nJ*nJ=nK*nK
          nZ=nI+nJ+nK
       ENDIF
     ENDFOR
   ENDFOR
ENDFOR

2.创建一个表单form2.scx,添加一个标签Label1,一个计时器Timer1。

设置Label1的AutoSize属性为.T.,Caption属性清空。
设置Timer1的Interval属性为500。

Timer1的Init事件代码:

this.AddProperty('nTimes',0)

Timer1的Timer事件代码:

thisform.label1.Caption="执行中"+REPLICATE("_", this.nTimes)
this.nTimes = (this.nTimes + 1) % 6
this.nCounter = this.nCounter + 1

3.运行form1,单击按钮,观察结果。


3 楼


this.nCounter = this.nCounter + 1

这句去掉,呵呵,俺是从以前编的程序中复制的。

4 楼

[quote][quote]有一個疑問,就是為何在一個表單中運行循環時,另一個表單中的計時鐘都不起作用呢?[/quote]
回答是:計時鐘没有机会执行它的事件过程。

解决办法:在主表單的循環过程中使用DOEVENTS命令。

Step By Step:

1.创建一个表单form1.scx,添加一个按钮Command1。

Command1的Click事件代码:

LOCAL tempForm
DO FORM form2 NAME tempForm LINKED 
*以下模拟一个耗时的任务
FOR nI=1 TO 1000
   FOR nJ=1 TO 100
     FOR nK=1 TO 100
       DOEVENTS     &&该命令暂时中断循环,使系统执行其它任务 
       IF nI*nI+nJ*nJ=nK*nK
          nZ=nI+nJ+nK
       ENDIF
     ENDFOR
   ENDFOR
ENDFOR

2.创建一个表单form2.scx,添加一个标签Label1,一个计时器Timer1。

设置Label1的AutoSize属性为.T.,Caption属性清空。
设置Timer1的Interval属性为500。

Timer1的Init事件代码:

this.AddProperty('nTimes',0)

Timer1的Timer事件代码:

thisform.label1.Caption="执行中"+REPLICATE("_", this.nTimes)
this.nTimes = (this.nTimes + 1) % 6
this.nCounter = this.nCounter + 1

3.运行form1,单击按钮,观察结果。


[/quote]

不好意思,學得都是皮毛,有些語句我沒有看懂.不過我在每一次循環的時候都加上一個副表單的刷新語句,他還是可以了,只是計時鐘就是可有可無了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册