【问题标题】:How to enable mouse wheel scrolling on a TDBCtrlGrid?如何在 TDBCtrlGrid 上启用鼠标滚轮滚动?
【发布时间】:2014-07-28 16:05:40
【问题描述】:

TDBCtrlGrid 对鼠标滚轮完全没有反应。

我试过了:

procedure TForm1.FormMouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
begin
  if DBCtrlGrid1.ClientRect.Contains(DBCtrlGrid1.ScreenToClient(MousePos)) then
  begin
    DBCtrlGrid1.ScrollBy(0, WheelDelta);
    Handled := True;
  end;
end;

控件网格现在滚动,但它不会改变 DataSet 中的位置,而是将其内容移出客户端矩形,这看起来很丑陋。

如何在TDBCtrlGrid 上启用鼠标滚轮滚动?

【问题讨论】:

    标签: delphi datagrid scroll delphi-xe2 vcl


    【解决方案1】:

    作为一种解决方法,您可以改为滚动 DataSet:

    procedure TForm1.FormMouseWheel(Sender: TObject;
      Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
      var Handled: Boolean);
    var
      I: Integer;
      Grid: TDBCtrlGrid;
      DataSet: TDataSet;
    begin
      Grid := DBCtrlGrid1;
      if not Grid.ClientRect.Contains(Grid.ScreenToClient(MousePos)) then
        Exit;
      if not Assigned(Grid.DataSource) then
        Exit;
      DataSet := Grid.DataSource.DataSet;
      if DataSet = nil then
        Exit;
      for I := 0 to Abs(WheelDelta div 256) - 1 do 
      begin
        if WheelDelta > 0 then
          DataSet.Prior
        else
          DataSet.Next;
      end;
      Handled := True;
    end;
    

    【讨论】:

    • 别忘了说你已经Handled 留言了。
    • @TLama 我现在已将其添加到答案中。
    【解决方案2】:

    如果您的表单上还有一个隐藏的 DBGrid,连接到同一个数据源,则有一种更简单的方法。 在 DBCtrlGrid 的点击事件中:

    DBCtrlGrid.setfocus;

    只要 DBGrid 获得焦点,它似乎就会接收到鼠标滚轮事件。 DBCtrlGrid 然后随着记录的变化很好地滚动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多