如何通过按钮单击在VFP(FoxPro)中打破while循环?

时间:2017-04-22 17:24:54

标签: loops events visual-foxpro

我正在尝试用两个按钮制作简单的FoxPro应用程序。第一个按钮启动while循环并正常工作。第二个按钮必须打破这个循环。但我找不到任何正确的解决方案。  有循环代码:

DO WHILE !thisForm.cancelpressed

IF thisForm.cancelpressed
    EXIT
ENDIF

randNum=VAL(TRIM(STR(ROUND( 3*RAND(), 1))))
&&oneVar=VAL("1")

IF randNum = VAL("1")
    ThisForm.shape1.BackColor = greenColor
    ThisForm.shape2.BackColor = orangeColor
    ThisForm.shape3.BackColor = redColor
ENDIF

cs = seconds()
IF abs(cs - seconds()) >= 15
    doevents
    cs = seconds()
ENDIF

IF thisForm.cancelpressed
    EXIT
ENDIF

DOEVENTS
WAIT TIMEOUT 1   
ENDDO

此代码位于第一个按钮Click方法中。表单对象具有用户定义的“cancelpressed”属性。在第二个按钮单击方法我把它:

thisForm.cancelpressed = .T.
Thisform.Release()
Clear Events

但它不起作用。循环启动时,它不想听任何命令和点击,它不会让关闭程序。如果可以,请帮助

2 个答案:

答案 0 :(得分:1)

您可以尝试设置

Application.AutoYield = .T.

根据https://msdn.microsoft.com/en-us/library/aa977324(v=vs.71).aspx

但是,如果这不起作用,那么我认为你被困在VFP不是一个真正的多线程应用程序。您可能能够根据http://fox.wikis.com/wc.dll?Wiki~TimerExample使用计时器对象或使用https://blogs.msdn.microsoft.com/calvin_hsia/2006/05/16/create-multiple-threads-from-within-your-application/中的多线程解决方法来解决问题,但您可能非常依赖自己。< / p>

我不得不说今天在VFP中启动一个新应用程序可能不是最好的主意。目前有很多替代品。

答案 1 :(得分:0)

问题在于您的等待窗口。去掉它。

Local greenColor, orangeColor, redColor
m.greenColor = 0x00FF00
m.orangeColor = 0x3060FF
m.redColor = 0xFF0000
Do While !Thisform.cancelpressed
    randNum=Val(Trim(Str(Round( 3*Rand(), 1))))

    If m.randNum = Val("1")
        Thisform.shape1.BackColor = m.greenColor
        Thisform.shape2.BackColor = m.orangeColor
        Thisform.shape3.BackColor = m.redColor
    Endif
    Doevents
Enddo

(我不明白为什么你这么奇怪的randNum设置和检查也没有反复设置相同颜色的目的,但这不是这个问题的重点)

通常你应该更喜欢使用带有这样代码的Timer。

而BTW这与VFP和其他语言的多线程无关。你只是做一个带取消标志检查的循环。使用相同的方法更新UI(例如在C#中)将不会更容易。