2014-12-02 63 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