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

ilmyapht  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(237)

TDBCtrlGrid对鼠标滚轮完全没有React。
我试过这个:

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中的位置,而是将其内容移出客户端rect,这看起来非常难看。
如何在TDBCtrlGrid上启用鼠标滚轮滚动?

brccelvz

brccelvz1#

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

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;
n3schb8v

n3schb8v2#

如果你的表单上还有一个隐藏的DBGrid,挂接到同一个数据源,有一个更简单的方法。在DBCtrlGrid的click事件中:

DBGrid.SetFocus;

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

相关问题