Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在TDBCtrlGrid上启用鼠标滚轮滚动?_Delphi_Datagrid_Scroll_Delphi Xe2_Vcl - Fatal编程技术网

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

Delphi 如何在TDBCtrlGrid上启用鼠标滚轮滚动?,delphi,datagrid,scroll,delphi-xe2,vcl,Delphi,Datagrid,Scroll,Delphi Xe2,Vcl,TDBCtrlGrid对鼠标滚轮完全没有反应 我试过这个: procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin if DBCtrlGrid1.ClientRect.Contains(DBCtrlGrid1.ScreenToClient(MousePos)) then

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;
控制网格现在可以滚动,但它不会更改数据集中的位置,而是将其内容移出看起来非常难看的客户机rect


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

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

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;

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

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;

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

DBCtrlGrid.setfocus


DBGrid似乎只要聚焦就可以接收鼠标滚轮事件。然后,DBCtrlGrid会随着记录的更改而很好地滚动。

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

DBCtrlGrid.setfocus


DBGrid似乎只要聚焦就可以接收鼠标滚轮事件。DBCtrlGrid随后会随着记录的更改而很好地滚动。

不要忘记说您已经处理了消息。@TLama我现在已经将其添加到了答案中。不要忘记说您已经处理了消息。@TLama我现在已经将其添加到了答案中。