如何使用DoMouseWheel一次滚动一行?

时间:2009-11-05 08:15:41

标签: delphi mousewheel

我已经编写了一个网格控件,并希望为它添加对鼠标滚轮的支持。我认为它会像覆盖DoMouseWheel虚拟方法一样简单,但它有一点问题。

您可以在“控制面板”中设置一次滚动的行数,默认值为3。这在浏览文档或网页时非常有意义,但在网格上,我认为期望是一次滚动一行。但似乎Delphi的轮子支持将为我滚动的每个凹槽调用DoMouseWheel三次,这意味着我只能滚动到网格中的每个第三行(或任何全局设置)。

如何在鼠标滚轮每转一次滚动一行?

更新:这里的简短回答是在滚动后简单地将结果设置为True - 然后它不会滚动三次,而只会滚动一次。

3 个答案:

答案 0 :(得分:2)

只需复制TCustomGrid类中的代码,该代码会覆盖DoMouseWheelDown()DoMouseWheelUp(),以便一次只滚动一行。

答案 1 :(得分:2)

通常,与系统默认值和/或用户首选项进行对抗并不是一个好主意。在这种情况下意味着您应该尊重系统或用户决定在滚动时设置的任何内容。

话虽如此,如果你真的相信多重滚动效果是完全错误的并且误导了你想要驱动的那种组件,你可能会设想一种摆脱它的方法。您可以尝试设置一些计时器,并忽略除了一个在给定的时间内(毫秒范围内)发生的mouseWheel事件之外的所有事件。您应该做的一件事是在程序中设置配置选项,让用户关闭此行为。

答案 2 :(得分:0)

在我的情况下,我使用了JVDBGrid组件,但我认为这也适用于DbGrid。您可以覆盖以下函数:OnMouseWheelDown和OnMouseWheelUp。

E.g:

类型声明:

type
  TMyGrid = class(TJvExDBGrid);

实施

procedure TFExample.JvDBGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin

  Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(1) <> 0;

end;

procedure TFExample.JvDBGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin

  Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(-1) <> 0;

end;