Procedure TForm2.OnMouseWheel(Var Msg: TMsg;var Handled: Boolean);
begin
 if Msg.message=WM_MouseWheel then
 begin
  if Msg.wParam>0 then
  begin
   if DBGrid1.Focused then
   SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEUP,0);
  end
  else
  begin
   if DBGrid1.Focused then
   SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
  end;
  Handled:=True;
 end;
end;procedure TForm2.FormCreate(Sender: TObject);
begin
 Application.OnMessage:=OnMouseWheel;
end;
用上面的代码可以用鼠标滑轮实现在单窗口中DBGrid滚动条的滚动,但如果有多个子窗体存在且每个子窗体内都有DBGrid时就会出错,请问这个时候该怎么改才能实现每个子窗体中的DBGrid滚动条都可随着鼠标滑轮的滚动而滚动呢?

解决方案 »

  1.   

    private
        { Private declarations }
        OldGridWnd: TWndMethod;
        procedure NewGridWnd(var Message: TMessage);............procedure TForm.FormCreate(Sender: TObject);
    begin
      OldGridWnd := DBGrid1.WindowProc;
      DBGrid1.WindowProc := NewGridWnd;
    end;procedure TForm4.NewGridWnd(var Message: TMessage);
    var
      IsNeg: Boolean;
    begin
      if Message.Msg = WM_MOUSEWHEEL then
      begin
        IsNeg := Short(Message.WParamHi) < 0;
        if IsNeg then
          DBGrid1.DataSource.DataSet.MoveBy(1)
        else
          DBGrid1.DataSource.DataSet.MoveBy(-1);
       end
      else
        OldGridWnd(Message);
    end;