有没有办法检测用户是否单击了禁用的按钮?

Is there a way to detect if user clicked a disabled button?

Hey, I have an UserForm into which an user inputs varius profile fields.

Once it's filled in, there is verification - if anything goes astray, the CommandButton, named save_button is disabled

我想要实现的是:如果用户点击按钮,当它处于禁用状态时,显示一个MsgBox说他需要更正填写错误的字段


出于演示目的,我不会在此处粘贴验证程序,所以让我们假设 save_button.Enabled = False 是从 getgo 设置的。产生相同的结果。

save_button.Enabled = False ' already ran before, pretend this executes it
Private Sub save_button_Click()
    If save_button.Enabled = False Then
        MsgBox "Clicked disabled button"
    End If
End Sub

问题是,一旦 CommandButton 被设置为 .Enabled = False 就不能再被正式点击(因此它甚至不能触发 Click() 过程)


我的下一个想法是使用 MouseUp 作为替代。问题是, 这会触发按钮上的任何微小移动,我不想用 MsgBoxes

轰炸用户

关于如何检测用户是否单击了禁用按钮,你能想出任何替代方案吗?

当控件被禁用时,单击事件会在树中向上冒泡。在您的情况下,我想用户表单将获得点击。如果您将保存按钮放在一个框架内,那么如果该按钮被禁用,它将获得点击。通过设置

使框架不可见相当容易
  • 标题为“”
  • BorderStyle 到 fmBorderStyleNone
  • 特殊效果到 fmSpecialEffectFlat

然后调整框架的大小,使其与按钮的大小相同。 代码很简单:

Private Sub YourNewFrame_Click()
    MsgBox "Save button disabled!"
End Sub

提示:如果绘制框架,剪切按钮并将其粘贴到新框架内,它会被正确放置。正确地,如在层次结构的右侧部分。在视觉上,您将不得不手动进行。

我想根据我对您问题的评论提供另一种方法。

在下面的 gif 中,您会看到 'Create Form' 在提供所有必要信息之前不会启用。你在 gif 中看不到太多,但每个需要验证的条目在代码中也有它。

该操作背后的基本代码是这样的:

Sub checkFields()

    Select Case True

        Case Len(Me.formTitleLine1) = 0, Len(Me.formPrefix) = 0, Len(Me.formNumber) = 0, Len(Me.formProduct) = 0, Len(Me.formEditionMonth) = 0, Len(Me.formEditionYear) = 0
            Me.createForm.Enabled = False
        Case Else
            Me.createForm.Enabled = True
    End Select

End Sub

它在每个相关框的 afterUpdate 事件中被调用:

Private Sub formEditionYear_AfterUpdate()

    checkFields

End Sub

只需对 checkFields 子项进行一点小改动,您就可以在正确填写所有内容后才能显示保存按钮。该更改将是:

Me.createForm.Visible

而不是

Me.createForm.Enabled