【问题标题】:Detect mouse down event on dynamic objects in a userform在用户窗体中检测动态对象上的鼠标按下事件
【发布时间】:2019-05-01 08:42:38
【问题描述】:

我在用户窗体的框架内有一个动态范围的选项按钮。 OptionButton 的数量根据表格中的列数而有所不同。每个按钮都根据列标签进行标记。当一个人选择一个选项时,我需要一个 ListBox 来填充在该表列中找到的项目。 填充选项按钮和 ListBox 很容易。我知道如何检测已知 Userformobjects 上的鼠标按下事件。但是按钮仅通过编码存在并且变化。如何在实际不存在的对象上检测 MouseDown? 我已经尝试过为 Frame 创建 MouseDown 类的代码

【问题讨论】:

  • 创建一个类来处理运行时创建的对象上的事件是正确的方法,但你说你已经尝试过了。向我们展示该代码
  • 我清楚地记得不久前写过一个关于处理动态控件事件的答案,但我找不到它:(
  • 我使用了这个线程stackoverflow.com/questions/7466376/…的代码

标签: excel vba userform mousedown


【解决方案1】:

您需要将您的控件包装在一个类模块中 - 例如,DynamicOptionButton

Option Explicit
Private WithEvents ControlEvents As MSForms.OptionButton

Public Sub Initialize(ByVal ctrl As MSForms.OptionButton)
    If Not ControlEvents Is Nothing Then ThrowAlreadyInitialized
    Set ControlEvents = ctrl
End Property

Private Property Get AsControl() As MSForms.Control
    Set AsControl = ControlEvents
End Property

Private Sub ThrowAlreadyInitialized()
    Err.Raise 5, TypeName(Me), "Invalid Operation: This control is already initialized."
End Sub

Private Sub ControlEvents_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim parentForm As UserForm1 'todo: use your actual UserForm subtype
    Set parentForm = AsControl.Parent 
    'handle mousedown here.
End Sub

创建动态控件时,您需要一个模块级 Collection 来保存DynamicOptionButton 实例 - 否则它们将超出范围 当到达End Sub 时,您将永远无法处理他们的任何事件。

Private DynamicControls As Collection

Private Sub Class_Initialize()
    Set DynamicControls = New Collection
    'todo invoke CreateOptionButton
End Sub

Private Sub CreateOptionButton() 'todo parameterize
    Dim ctrl As MSForms.OptionButton
    Set ctrl = Me.Controls.Add(...)

    Dim wrapper As DynamicOptionButton
    Set wrapper = New DynamicOptionButton
    wrapper.Initialize ctrl

    DynamicControls.Add wrapper
End Sub

【讨论】:

  • 您的代码描述中缺少的是 ControlEvents 的标签用于标识 ControlEvents.Caption 和 ControlEvents.Value 等对象。在解决这个问题之前,虽然代码可以正常工作,但它并没有告诉我选择了哪个 OptionButton。但现在一切都很好,而且效果很好。非常感谢
  • 您也可以将其转换为 MSForms.Control 并使用 Tag 属性来保存像 ID 这样的元数据 - 这样逻辑就不会依赖于标题,在其他情况下可能需要本地化:避免使用仅 UI 的内容(如标题),如元数据(例如唯一 ID),有助于分离关注点并使整体更加健壮。干杯!
猜你喜欢
  • 2017-06-20
  • 1970-01-01
  • 2011-11-19
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多