Loops 如何通过点击按钮在VFP(FoxPro)中中断while循环?

Loops 如何通过点击按钮在VFP(FoxPro)中中断while循环?,loops,events,visual-foxpro,Loops,Events,Visual Foxpro,我正在尝试用两个按钮制作简单的FoxPro应用程序。第一个按钮在循环时启动并正常工作。第二个按钮必须打破这个循环。但我找不到任何正确的解决方案。 有以下循环代码: DO WHILE !thisForm.cancelpressed IF thisForm.cancelpressed EXIT ENDIF randNum=VAL(TRIM(STR(ROUND( 3*RAND(), 1)))) &&oneVar=VAL("1") IF randNum = VAL("1")

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

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
此代码位于第一个按钮单击方法中。表单对象具有用户定义的“cancelpressed”属性。在第二个按钮单击方法中,我放置了以下内容:

thisForm.cancelpressed = .T.
Thisform.Release()
Clear Events
但它不起作用。当循环开始时,它不想听到任何命令和点击,也不允许关闭程序。如果可以,请提供帮助

您可以尝试设置

Application.AutoYield = .T.
依照

但如果这不起作用,那么我认为您会被卡住,因为VFP不是真正的多线程应用程序。您可能可以使用计时器对象解决问题,或者使用多线程解决方法解决问题,但您将完全依靠自己


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

问题在于等待窗口。移除它

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设置和检查,也不明白一遍又一遍设置相同颜色的目的,但这不是问题的重点)

通常,您应该更喜欢使用带有如下代码的计时器


顺便说一句,这与VFP或其他语言中的多线程无关。您只需执行一个带有取消标志检查的循环。用同样的方法更新UI,比如用C#来更新UI,不会更容易

我的程序有两个按钮和几个形状。如果我的退出按钮的bind
thisForm.cancelpressed=.T.
MouseEnter
事件,那么它工作得很好。但它没有点击,它只是停留在我的退出按钮上