2017-04-22 66 views
1

我试图用两个按钮来制作简单的FoxPro应用程序。第一个按钮启动while循环并正常工作。第二个按钮必须打破这个循环。但是我找不到任何正确工作的解决方案。 有循环代码:如何通过按钮点击打破VFP(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 

此代码在第一个按钮中单击方法。表单对象具有用户定义的'cancelpressed'属性。在第二个按钮点击方法我把这个:

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

但它不工作。当循环开始时,它不想听任何命令和点击,它不会让程序关闭。请但是帮助,如果你能

+0

我的程序有两个按钮和几个形状 – Operator

+0

如果将'thisForm.cancelpressed = .T.'绑定到我的退出按钮的'MouseEnter'事件,则效果不错。但它不会点击,它只是悬停在我的退出按钮上 – Operator

回答

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/的多线程解决方法,但是您可以自行完成。

我必须说,今天在VFP中开始一个新的应用程序可能不是最好的主意。有很多当前的选择。

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。

顺便说一句,这与多线程既不在VFP也不在另一种语言。你只是做一个带有取消标志检查的循环。在C#中用相同的方法更新用户界面并不会更容易。