Мне нужно отменить нажатие кнопки на пользовательской ленте, если код уже запущен.
Проблема: хотя я могу отключить кнопку, щелчки по-прежнему «регистрируются» и, даже если они отключены, соответствующий код запускается один раз для каждого нажатия кнопки.
Public Sub OnActionButton(control As IRibbonControl)
' The following approach fails to prevent code from running
If Not globalEnabled Then Exit Sub
' The following approach fails to prevent code from running
Dim goodToGo as Boolean
GetEnabled control, goodToGo
If Not goodToGo Then Exit Sub
' *********************************************************
' Code Below Here Should NOT Run If Button Was Clicked
' While globalEnabled = False (i.e. code already running)
' *********************************************************
' Disable the Ribbon
globalEnabled = False
RibbonInvalidate
Select Case control.id
Case "btnID"
' doSomething
End Select
' Re-enable the ribbon
globalEnabled = True
RibbonInvalidate
End Sub
Изменить: Для чего стоит, вот как я отключаю кнопку:
Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
' Called by RibbonInvalidate
Select Case control.id
Case "btnID"
enabled = globalEnabled
End Select
End Sub
Я могу себе представить, что первый щелчок запускается, как и ожидалось, второй щелчок (который выполняется во время выполнения кода, соответствующего первому щелчку) помещается в очередь до завершения первого щелчка. В то время globalEnabled снова имеет значение True, поэтому проверки неэффективны.
Полагаю, я мог бы скрыть пользовательскую вкладку ленты (или заменить ее фиктивной вкладкой) - но действительно ли это необходимо?
Есть ли элегантный способ отменить нажатие кнопки?
Редактировать:
Я мог бы добавить кучу doEvents к коду, но слишком сильно тормозит.
Редактировать2:
Если я отображаю окно сообщения во время выполнения кода, то почему-то кажется, что все работает как положено ...
На самом деле ... если я отображаю окно сообщения, то мне даже не нужна логика раннего выхода - так странно!