程序窗体Form1中picture1、picture2、comand1三个控件。
其中picture2包含在picture1中。Option Explicit
Private gX As Long, gY As Long
Dim nCopyed As LongPublic Sub UpdateControl(ctl As Control, _
        ByVal sngPercent As Single)
        nCopyed = nCopyed + 1
        Dim MoveWidth As Long
        MoveWidth = (ctl.Container.ScaleWidth - ctl.Width) * sngPercent
        ctl.Move MoveWidth, ctl.Top
        DoEvents
End SubPrivate Sub Command1_Click()
        Picture2.Move 0, Picture2.Top
        Dim i As Long        
        nCopyed = 0
        For i = 0 To 10000
            UpdateControl Picture2, nCopyed / 10000
        Next i
End Sub
程序的逻辑bug是:
连续双击command1控件,picture2要跑出picture1连续双击command1要实现的功能是:
当picture2在picture1中移动时,还没有移动到尾端时
再次点击command1要将picture2在picture1中从头移到尾一次!

解决方案 »

  1.   

    我在Command1_Click()加了一句代码。
    Private Sub Command1_Click()
            Picture2.Move 0, Picture2.Top
            Dim i As Long
            nCopyed = 0
            For i = 0 To 10000
                UpdateControl Picture2, nCopyed / 10000
                If nCopyed > 10000 Then Exit For     '这是添加的代码!
            Next i
    End Sub这样解决问题我很郁闷,nCopyed 为什么会大于10000?
    只有解决 nCopyed 不会大于10000,才是更本解决问题!
      

  2.   

    UpdateControl中傳的是single,而nCopyed 是 long ,可能是這里出的問題吧.
    有些事情,是不能用平常的眼光來看的.
      

  3.   

    呵呵  你把UpdateControl Picture2, nCopyed / 10000改为UpdateControl Picture2, i / 10000以后就知道问题的原因了当第二次按command1的时候,第一次按command1的循环还没有执行玩。做完第二次以后又接着做第一个剩余的循环了,函数调用就是这样,哈哈楼上瞎扯的根本不是那么回事:)
      

  4.   

    在command1的click事件中设置为picture2设置初始位值
    with picture2
        .top=...
        .left=....
    那么每次点击该按钮时,picture2的位置都还原!!!
    就不会跑出去了。。
      

  5.   

    真正的原因是DoEvents,去掉它看看(当然这样程序耗资源太大),nCopyed 最多为10001
    DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0。DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程,放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后,任务还是完全独立于应用程序,多任务及时间片由操作系统来处理。小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。