我想实现在DBGrid上鼠标滚动时,DBGrid中的记录相应滚动功能,不知如何实现,请各位帮忙.

解决方案 »

  1.   

    要达到在DBGrid上滚动时像点击右边的滚动条一样的效果
      

  2.   

    拦截WM_MOUSEWHEEL
    SendMessage(DBGrid.Handle,WM_VSCROLL,SB_LINEDOWN,0)
    SendMessage(DBGrid.Handle,WM_VSCROLL,SB_LINEUP,0)查看procedure TControl.WMMouseWheel(var Message: TWMMouseWheel);
      

  3.   

    现在在DBGrid中滚动只能滚动当前窗口中的数据,且数据不能定位
      

  4.   

    http://search.csdn.net/Expert/topic/1236/1236355.xml?temp=.6456262
      

  5.   

    拦截WM_MOUSEWHEEL
    SendMessage(DBGrid.Handle,WM_VSCROLL,SB_LINEDOWN,0)
    SendMessage(DBGrid.Handle,WM_VSCROLL,SB_LINEUP,0)
      

  6.   

    3种方法:1:继承生成新类,直接继承!2:Application.OnMessage:=ApplicationMessage;procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if (Msg.message = WM_MOUSEWHEEL) and (Msg.hwnd = DBGrid1.Handle) then
      begin
        //处理程序
      end
      else
        inherited;
    end;3:窗体子类化
    function SubClassWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LResult;stdcall;
    begin
    if Msg = WM_MOUSEWHEEL then
    begin
      //处理程序
      Result := 0;
    end
    else
    begin
      Result := CallWindowProc(Pointer(i),Form1.Button1.handle,Msg,WParam,LParam);
    end;
    end;i:=GetWindowLong(Button1.Handle,GWL_WNDPROC);
    SetWindowLong(Button1.Handle,GWL_WNDPROC,Longint(@SubClassWndProc));SetWindowLong(Handle,GWL_WNDPROC,LongInt(Pointer(i)));//恢复至于向上还是向下,判断Msg.wParam
      

  7.   

    DBGrid不支持鼠标的上下移动的解决代码(感谢 wangxian11 提供)自己捕捉WM_MOUSEWHEEL消息处理
    private
      OldGridWnd : TWndMethod;
    procedure NewGridWnd (var Message : TMessage);
    publicprocedure TForm1.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;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldGridWnd := DBGrid1.WindowProc ;
      DBGrid1.WindowProc := NewGridWnd;
      

  8.   

    谢谢 yq3woaini(哈哈镜(初级代码工)(★★★)) ,可以了
      

  9.   

    yq3woaini(哈哈镜(初级代码工)(★★★)) 的代码比较好!