怎么设置dbgrid的属性使得dbgrid能支持鼠标的滚轮功能呢???

解决方案 »

  1.   

    用DbGridEH吧,Delphi本身带的DBGrid不支持滚轮的
      

  2.   

    不然你就从TDBGrid的上一个类,可能是TCustomGrid上继承一个类自己实现鼠标滚轮
      

  3.   

    //先在form上加一个TApplicationEventsprocedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
     if (DBGrid1.Focused) And (Msg.message = WM_MOUSEWHEEL) then
        begin
          if Msg.wParam > 0 then
            SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_UP, 0)
          else
            SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_DOWN, 0);
          Handled := True;
        end;
    end;
      

  4.   


        
    判断Grid是否有滚动条?if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_VSCROLL) <> 0 thenShowMessage('Vertical scrollbar is visible!');if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_HSCROLL) <> 0 thenShowMessage('Horizontal scrollbar is visible!');
     
     
      

  5.   

    风三少的可以,另外STRINGGRID也是用这个就能解决。
      

  6.   

    to风三少, shiyl:
      这个过程(ApplicationEvents1Message)随便我的滚轮怎么动,它都不能被激发啊,是怎么回事呢?
      还需要在哪里设置什么呢??  btw: 而且我的滚轮上下滑动时,gbgrid能在上下行移动只是在当前页(),而不能上移或下到当前屏幕上看不到的那些记录上。
      

  7.   

    自己捕捉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;
    end;      
      

  8.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, ADODB, MyDbGrid;
    type
      TDBGrid= class(DBGrids.TDBGrid)
      public
        function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
      end;
    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        DBNavigator1: TDBNavigator;
        ADOQuery1: TADOQuery;
        DataSource2: TDataSource;
        ADOTable1: TADOTable;
      private
        { Private declarations }
      public    { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TDBGrid.DoMouseWheel(Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint): Boolean;
    begin
      if WheelDelta < 0 then
        Datasource.DataSet.Next;
      if wheelDelta > 0 then
        DataSource.DataSet.Prior;
    end;end.
      

  9.   

    konhon(优华无限) 方法可以用,但是最好的就是crossbow(【带三尺剑立不世之功】) 的啦,建议用
      

  10.   

    to风三少, shiyl:
      这个过程(ApplicationEvents1Message)随便我的滚轮怎么动,它都不能被激发啊,是怎么回事呢?
      还需要在哪里设置什么呢?? ……………………………………………………………………………………
    设置窗体的KeyPrevew := True,窗体比控件更先接受消息
      

  11.   

    用fengsx(风三笑) 的:
    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    var 
      i: SmallInt; 
    begin
      if TForm1.ActiveControl = DBGrid1 then
        if Msg.message = WM_MOUSEWHEEL then
        begin
          Msg.message := WM_KEYDOWN;
          Msg.lParam := 0;
          i := HiWord(Msg.wParam);
          if i > 0 then
             Msg.wParam := VK_UP
          else
             Msg.wParam := VK_DOWN;
          Handled := False;
        end;
    end;
      

  12.   

    to风三少, shiyl:
      这个过程(ApplicationEvents1Message)随便我的滚轮怎么动,它都不能被激发啊,是怎么回事呢?
      还需要在哪里设置什么呢??  btw: 而且我的滚轮上下滑动时,gbgrid能在上下行移动只是在当前页(),而不能上移或下到当前屏幕上看不到的那些记录上。---------------------------------------------------------你要把代码写再 TApplicationEvents控件(delphi自带)的OnMessage事件中阿。注意,是TApplicationEvents的OnMessage事件中,不时自己定义的过程。