3

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

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

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

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

4

3 回答 3

2

只需从类中复制代码TCustomGrid,它会覆盖两者DoMouseWheelDown()DoMouseWheelUp()一次滚动一行。

于 2009-11-05T08:59:55.720 回答
2

一般来说,与系统默认值和/或用户偏好作斗争并不是一个好主意。在这种情况下,意味着您应该尊重系统或用户决定在滚动时间中设置的任何内容。

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

于 2009-11-05T09:00:46.620 回答
0

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

例如:

类型声明:

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;
于 2014-01-16T13:07:16.470 回答