【问题标题】:Avoid blocking user interaction with form - Access VBA 2007避免阻止用户与表单交互 - Access VBA 2007
【发布时间】:2013-05-22 23:22:47
【问题描述】:

这在 VBA 中似乎是一件很奇怪的事情,但我很好奇,所以请听我说完。 我创建了一个程序,可以在单击图像时在屏幕上移动图像。这行得通,虽然没问题,但仍然 - 它行得通。

代码如下:

'Start primitive animation
Private Sub imgBean_Click()

    'Limit for movement to right
    Dim coordinates, limit As Integer
    coordinates = 0
    limit = Form.Width

    Do While coordinates < limit

        coordinates = coordinates + 5

        'Move the image
        Me.imgBean.Move coordinates

        'Needed to add this to see the image move - updates the form
        Form.Repaint

    Loop

    Debug.Print "Coordinates " & coordinates
    Debug.Print limit

    'Reset the limit
    limit = 0

End Sub

如前所述,代码有效 - 但是在图像移动时屏幕被冻结,即我无法关闭表单或与其他组件交互。 (这类似于在 Android 环境中阻塞 UI 线程——这是你永远不会做的事情!)

那么有没有办法避免这种情况?

谢谢

附:将焦点设置在表单上会使图像偶尔出现和消失。

【问题讨论】:

  • 老实说,Microsoft Access 的多任务处理能力并没有得到特别的认可。我的大多数 VBA 应用程序(无论是 Access、Excel 还是 Outlook)都有同样的问题。
  • @dnLL 我知道,但我想我会碰碰运气:P
  • excel不支持多线程
  • @mehow 我没有使用 Excel - 我知道它在 VBA 中不受支持,所以我正在研究其他方法 - 遇到了类似的东西(类似于多线程),它利用了 VBScript,但不确定如果它适合我​​想要的 - 似乎它更适合网络抓取和那种性质的东西
  • 您是否尝试在进入Do While 循环后立即添加DoEvents 语句?它通常用于在执行紧密循环时启用与“其他事物”的交互,但在这种情况下它也可能会放松一些事情。详细信息here,请务必阅读文章末尾附近的“与 DoEvents 相关的问题”部分。

标签: vba ms-access-2007


【解决方案1】:

事实证明,一旦动画开始,我就无法在视觉上阻止与 GUI 的交互。我说视觉是因为可以在动画运行时单击按钮并输入输入。

它涉及使用DoEvents 命令,该命令充当 MS Access 中的多任务处理方式。我在 Do-While 循环上方添加了命令(见下文):

'Essentially allow multitasking
DoEvents

Do While coordinates < limit

    coordinates = coordinates + 5

    'Move the image
    Me.imgBean.Move coordinates
    Form.Repaint

Loop

需要注意的是,当我将它放在 Do-While 循环中时它不起作用。因此,当我通过单击图像开始动画时,我仍然可以按其他按钮,因为我在一个字段中输入了一个值,然后单击一个按钮将其转换为另一个 - 在动画运行时。

唯一的问题是如何在视觉上做到这一点。

【讨论】:

  • 正如我上面所说的,DoEvents 并不可靠,所以在使用它时要小心,并确保应用程序在没有它的情况下仍然可以工作。如果你想给操作系统多一点时间,你可以循环DoEvents(如果它真的有帮助,因为在某些情况下它什么都不做)。
猜你喜欢
  • 2013-01-11
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2021-02-22
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多