如何检测鼠标是否移动并按下按钮?

时间:2009-03-28 15:41:09

标签: delphi scrollbar onchange mousepress

在Delphi中,我在表单的右侧添加了一个Scrollbar组件(垂直方向)。

我添加了一个Scrollbar OnChange事件,因此当用户用鼠标点击UpArrow或DownArrow按钮时,我可以更改窗体的视图和滚动条拇指的位置,这样可以正常工作。

但是,当最初在箭头上按下鼠标按钮时,OnChange事件似乎才会被触发。

我注意到所有滚动条控件都重复命令并在鼠标按住箭头时继续滚动,我想实现此行为。

那么,当鼠标悬停在箭头上方时,如何轻松检测用户是否没有移动鼠标并继续按下鼠标按钮?


结论。不知何故,我的项目中的滚动条中的某些内容已损坏。删除ScrollBar并再次添加后,问题就消失了。

这是我花费大量时间解决的棘手问题之一。谢谢你的帮助。我正在结束这个问题。

3 个答案:

答案 0 :(得分:4)

使用 OnScroll 事件。

只要在滚动条箭头按钮上按住鼠标,以下代码就会将“xxx”添加到备忘录中。用Delphi 6测试。

procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
    Memo1.Lines.Add( 'xxx' );
end;

答案 1 :(得分:3)

处理自动重复的常用方法是启用 TTimer 并检查 OnTimer()事件处理程序是否需要再次执行操作,并且如果没有,则停用计时器。如果您需要示例代码,我似乎记得SynEdit控件在拖放操作中使用了类似的自动滚动技术。

答案 2 :(得分:0)

如果组件没有封装您正在寻找的行为,并且您无法使用可用方法轻松模拟行为,那么您应该将最接近的组件子类化为您需要的大部分内容,并添加缺少的行为。

我知道会涉及一些额外的工作,但这确实是更好的方法。现在使用Delphi,我似乎记得子类组件需要一些额外的工作,以便能够从IDE中用于表单设计,也许这已经从版本7开始发生了变化。