2017-04-22 64 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#中用相同的方法更新用戶界面並不會更容易。