Как заставить процесс работать, пока кнопка нажата? - PullRequest
0 голосов
/ 15 февраля 2019

Я использую:
- Win 7x64;
- Доступ - 2016;

Я пытаюсь решить мою проблему с помощью следующего кода.
Form1

Option Compare Database
Option Explicit

Public statusBool As Boolean
Public numProc As Integer

' `Button pressed`.
Private Sub btnStart_Click()
        numProc = 0
        statusBool = True

        Call Process(statusBool, numProc)

End Sub

' Process
Public Sub Process(statusBool As Boolean, numProc As Integer)
        If statusBool = True Then

           Me.txtProcessFrm = "ProcessNum - " & numProc + 1
            Call SleepFor(1000)  '1 seconds delay

           Call Process(statusBool, numProc)
        End If

End Sub

'
Private Sub btnStart_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    statusBool = False
    numProc = 0
    Call Process(statusBool, numProc)
End Sub


Public Sub SleepFor(ByVal MilliSeconds As Long)
    Sleep MilliSeconds
End Sub

Module1

Option Compare Database
Option Explicit

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Вопрос
Будет ли мое решение правильным для этой задачи или есть более простые способы решения этой проблемы?

enter image description here

Update_1
Код не запускается.
Я получаю ошибку Sub or Function not defined.enter image description here

Update_2
Модуль Module1.
Заменено Private на Public.
Было
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Стало
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Проблема.
При нажатии на кнопку btnStart_Click файл зависает

Update_3
Модифицированный процесс (statusBool As Boolean, numProc As Integer)
Он стал.

 ' Process
    Public Sub Process(statusBool As Boolean, numProc As Integer)
            If statusBool = True Then
                Do
                        Sleep 1000
                        DoEvents
                Loop Until Me.txtProcessFrm = "ProcessNum - " & numProc + 1

               Call Process(statusBool, numProc)
            End If

    End Sub

Проблема.
Кажется, пауза работает, но сама логика не работает.
Другими словами, текстовое поле не заполнено текстом.
Если вы отпустите кнопку, цикл продолжит работать.

1 Ответ

0 голосов
/ 17 февраля 2019

Цепочка событий для нажатия кнопки выглядит следующим образом.

MouseDown → MouseUp → Click → DblClick → Click

В вашем коде цикл никогда не остановится, потому что ваш statusBool всегда будет истинным, вызывая бесконечный цикл, и, вероятно, поэтому он зависает дажеесли вы отпустите mosue.

вы можете, однако, попробовать эту мышь вниз => mouse up:

Private Sub btnStart_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    statusBool = True
    Call Process(0)
End Sub

Private Sub btnStart_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    statusBool = False
End Sub

Public Sub Process(numProc As Integer)
    If statusBool Then
        numProc = numProc + 1
        Me.txtProcessFrm = "ProcessNum - " & numProc
        Sleep 1000
        DoEvents

        Call Process(numProc)
    End If
End Sub

больше здесь: https://docs.microsoft.com/en-us/office/vba/api/access.commandbutton.click

...