2014-12-02 58 views
0

我有這段代碼的問題:如何暫停一個循環內的動畫無延遲


Do While StopProgram = False 
     Do Until Count = v 
      Application.DoEvents() 
      Do While StopProgram = False 
       If DirectionNegative = False Then 
        Me.Refresh() 
        Count += 1 
        Angle += 1 
        RadianAngle = Angle * PlaceHolder 
        If Angle >= 51 Then 
         Angle = 49 
         DirectionNegative = True 
        End If 
       ElseIf DirectionNegative = True Then 
        Me.Refresh() 
        Count += 1 
        Angle -= 1 
        RadianAngle = Angle * PlaceHolder 
        If Angle <= -51 Then 
         Angle = -49 
         DirectionNegative = False 
        End If 
       End If 
      Loop 
     Loop 
      Count = 0 
     Loop 

的問題是,當我按我的表單上的按鈕,停止代碼(使用StopProgram = False),它會一直持續到Count = v我希望能夠在循環內停止它,我試圖在這裏做到這一點,但它創建了一個不幸的循環,它毀了程序。

+0

Do Until StopProgram or Count = v? – Jeremy 2014-12-02 15:17:54

+0

爲什麼你需要** 3 **循環?所有你需要的是一個帶退出條件的循環'If ... Then Exit Do' – ja72 2014-12-02 16:15:52

回答

0

這是錯誤方法您的問題,但改變:

Do While StopProgram = False 
    Do Until Count = v 
     Application.DoEvents() 
     Do While StopProgram = False 

要:

Do While StopProgram = False 
    Do Until Count = v 
     Do While StopProgram = False 
      Application.DoEvents() 
+0

當程序由於代碼通過'Do While StopProgram = False'而停止時,這會崩潰然後到'Do Until Count = v'因爲它永遠不會滿足,它將繼續循環,那麼它就不會做任何事情。 – 2014-12-03 08:54:18

+0

?...我所做的更改不會更改代碼的**邏輯**。如果它遇到這種變化,那麼它之前就陷入困境。將DoEvents移動到內部循環將簡單地允許StopProgram變量通過應用程序中的其他事件(可能是取消按鈕?)更新... – 2014-12-03 22:17:27

0

你可以只取出2個外環。
你永遠不會到達Do Until Count = v部分,除非StopProgram是真的。 你會留在內部Do While StopProgram = False循環。當您退出環路中間,所以如果你需要保留數量的值時StopProgram設置爲true,你應該刪除你可以刪除 內Do While StopProgram = False loop,改變 Do Until Count = vDo Until Count = v或者StopProgram = true

順便說一句你設置Count = 0Do While StopProgram = False loopCount = 0

Do Until Count = v Or StopProgram = True 
    Application.DoEvents() 
    If DirectionNegative = False Then 
     Me.Refresh() 
     Count += 1 
     Angle += 1 
     RadianAngle = Angle * PlaceHolder 
     If Angle >= 51 Then 
      Angle = 49 
      DirectionNegative = True 
     End If 
    ElseIf DirectionNegative = True Then 
     Me.Refresh() 
     Count += 1 
     Angle -= 1 
     RadianAngle = Angle * PlaceHolder 
     If Angle <= -51 Then 
      Angle = -49 
      DirectionNegative = False 
     End If 
    End If 
Loop 
+0

這最終給我一個無限循環,完全崩潰它。 – 2014-12-03 09:09:18

+0

這很奇怪。它基本上是具有較少循環的相同代碼,並且計數未被重置。你可以發佈你的代碼或項目文件的其餘部分,以便我可以更好地瞭解程序在做什麼? – gg1188 2014-12-04 14:40:46

0

這應該只是罰款。不需要所有這些循環。

Public Sub Refresh() 
    ' ... 
End Sub 

Public Property Get StopProgram() As Boolean 
    StopProgram = ' ... 
End Property 

Public Property Get Angle as Single 
'... 
Public Property Let Angle 
'... 

Public Property Get RadianAngle as Single 
    RadianAngle = Angle * PlaceHolder 
End Property 

Public Sub T() 

    Dim Step As Single   
    Step = 1! 
    Do 
     DoEvents 
     Me.Refresh 
     If StopProgram Then Exit Do 
     If Angle <= 0 Or Angle >= 50 Then 
      Step = -Step 
     End If 
     Count = Count + 1 
     Angle = Angle + Step 
    Loop 

End Sub