代码之家  ›  专栏  ›  技术社区  ›  Cobus Kruger

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

  •  3
  • Cobus Kruger  · 技术社区  · 15 年前

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

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   mghie    15 年前

    只需从数据库中复制代码即可 TCustomGrid 类,该类将重写这两个 DoMouseWheelDown() DoMouseWheelUp() 一次只滚动一行。

        2
  •  2
  •   PA.    15 年前

    话虽如此,如果您真的认为multiscroll效应对于您想要驱动的组件类型是完全错误和误导的,那么您可以设想一种摆脱这种情况的方法。您可以尝试设置一些计时器并忽略在给定时间间隔内(毫秒范围内)发生的所有鼠标滚轮事件,但不包括其中一个。您应该做的一件事是在程序中设置一个配置选项,让用户关闭此行为。

        3
  •  0
  •   Allan Scofield    11 年前

    在我的例子中,我使用了JVDBGrid组件,但我认为这也适用于DbGrid。您可以覆盖以下功能:onmouseheeldown和onmouseheeldup。

    例如。:

    类型声明:

    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;