【发布时间】:2015-06-11 17:07:53
【问题描述】:
我的 From 上有一个 ListBox,里面有几个项目。当用户单击一个项目(OnClick 事件)时,用户状态将更改并通知 TCP 服务器。如果我使用键盘上的箭头键,则会调用相同的事件,例如 OnChange 事件。但是没有 OnChange 事件。
使用箭头键的问题是,如果用户快速移动多个项目,我的通知服务器方法会被调用多次。 (这样不好)
为了解决这个问题,我在 OnKeyPress 事件上放置了一个计时器。按下箭头键时 如果用户停止按下箭头键 2 秒,则调用通知服务器方法,通知服务器一次。 (理论上)
仍然调用 OnKeyPress 和 OnClick。
是否有足够熟悉 TListbox 的人向我解释为什么会发生这种情况,以及是否有更好的方法来思考这个问题?用户要求是使用列表框,并且不禁用箭头键。
【问题讨论】:
-
为此使用
OnClick事件是一个糟糕的选择。触发此事件的是LBN_SELCHANGE通知,因此此类事件的更好名称应为OnSelectionChanged。但是,列表框控件没有可以区分选择源的通知。 -
@TLama:控件在发出
LBN_SELCHANGING/LBN_SELCHANGE通知时可能无法区分选择源,但您可以使用它的OnKeyDown/Up事件来帮助您区分它。 -
@Remy,如果您按住箭头键并单击 :) 会怎样?
-
@TLama:为什么用户会尝试这样做?尝试同时使用两种不同的输入法更改 ListBox 选择是没有意义的,尤其是因为它可能需要用户同时使用双手。不是直觉的人类行为。但无论如何,在我描述的方法中,键盘将优先,因此服务器更新仍将延迟到 ListBox 停止通过箭头键更改选择之后。
-
@RemyLebeau 如果用户快速连续点击两次怎么办?
标签: delphi delphi-xe7