代码之家  ›  专栏  ›  技术社区  ›  user3723727

跳过代码的行为非常奇怪

  •  -1
  • user3723727  · 技术社区  · 8 年前

    我在带有复选框的Word表单上获得了以下代码。当我选中一个框时,我想清除其他框。所以什么时候 R00 已经检查过了,我检查过了 R01 然后我就开始了 sub R01_CheckBox_Click() 它会跳到 sub R00_CheckBox_Click() 然后将单步执行几行,然后返回到 子R01_复选框_点击() .我把它改为 _afterupdate() 和工作正常。谁能解释一下为什么调试器在与 _click ?

    Private sub R00_CheckBox_Click()
       R00_CheckBox = true
       R01_CheckBox = false
       R02_CheckBox = false
       R03_CheckBox = false
       R04_CheckBox = false
    End sub
    
    Private sub R01_CheckBox_Click()
       R00_CheckBox = false
       R01_CheckBox = true
       R02_CheckBox = false
       R03_CheckBox = false
       R04_CheckBox = false
    End sub
    
    Private sub R02_CheckBox_Click()
       R00_CheckBox = false
       R01_CheckBox = false
       R02_CheckBox = true
       R03_CheckBox = false
       R04_CheckBox = false
    End sub
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   user3598756    8 年前

    编辑 加强解释

    因为有一个复选框 Click 只要您 改变 其状态(即 Value 属性),无论是在UI上还是通过代码执行。

    假设首先取消选中所有复选框,然后单击 R00_CheckBox 一个:

    它触发了它的 点击 事件处理程序,而不实际更改 状态 任何复选框,即 R00_复选框 刚刚检查(即设置为 True 点击 事件处理程序),而所有其他复选框都已设置为 False

    然后单击 R01_CheckBox :

    • 它触发了它的 点击 第一条语句为的事件 R00_CheckBox = False

      但是 R00_复选框 现在的 状态 真的 ,因此此触发器 R00_CheckBox_Click 事件

      那么你现在已经到了 暂停 事件处理和启动新的 R00_复选框_单击

      它的第一个声明是 R00_CheckBox=错误 但是 R00_复选框 现在的 状态 真的 ,因此您更改其 状态 错误 因此 当前事件处理程序处理并切换到 R00_复选框_单击

      他的第一句话是 R00_CheckBox = True ,然后再次更改其 状态 从…起 错误 真的 因此 暂停 现在的 R00_复选框_单击 事件处理和启动一个全新的

      现在的潮流 R00_复选框_单击 事件再次开始 R00_CheckBox=真 R00_复选框 状态 ,因此这一次它不会再次触发自身,并继续执行下一条语句,即 R01_CheckBox = False 状态 R01_复选框 因此 暂停 现在的 R00_复选框_单击 事件并开始新的 R01_CheckBox_Click

      现在的潮流 R01_复选框_单击 事件再次开始 R00_CheckBox=错误 ,发生了变化 R00_复选框 状态 R00_复选框_单击 暂停 它本身正在开始另一个全新的 R00_复选框_单击

      …然后,然后。。。

    你会的 更好地切换到 OptionButton 控件,其行为正是您想要的:选中其中一个控件时,其他所有控件都将自动取消选中。没有所有递归事件处理程序调用

    您可以通过查询其默认值来获取其状态 价值

    If Me.OptionButton1 Then ... '<--| check if OptionButton1 control is checked