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

问题描述 投票:0回答:2

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;

控件网格现在滚动了,但它并没有改变数据集中的位置,而是将其内容移出客户端矩形,这看起来很丑陋。

如何在

TDBCtrlGrid
上启用鼠标滚轮滚动?

delphi datagrid scroll delphi-xe2 vcl
2个回答
4
投票

作为解决方法,您可以改为滚动数据集:

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;

2
投票

如果您的表单上也有一个隐藏的

DBGrid
,并且连接到相同的数据源,则有一种更简单的方法。 在
DBCtrlGrid
的点击事件中:

DBGrid.SetFocus;

DBGrid
好像只要被聚焦就可以接收到鼠标滚轮事件。
DBCtrlGrid
然后随着记录的变化很好地滚动。

© www.soinside.com 2019 - 2024. All rights reserved.