在DBGRID中好像没有定义滚动条的相关事件,应该如何获取该事件现在手头有一个任务,需要开发多表头的编辑界面,现在的处理方法是上面是一个表头样式的控件,下面放一个DBGRID。
对于字段过多的DBGRID就要求下面DBGRID移动时上面的表头文件跟着进行相应的调整请问如何获取DBGRID的滚动条事件?
或者有没有更好的方法?或者有没有能够自定义多表头的DBGRID?

解决方案 »

  1.   

    implementation
    {$R *.dfm}
    //定义新的消息函数
    type  WParameter=Word;
      LParameter=LongInt;var
      OldWindowProc:Pointer;function NewWindowProc(WindowHandle:hWnd;
                            TheMessage:WParameter;
                            ParamW:WParameter;
                            ParamL:LParameter):LongInt
    {$IFDEF WIN32}stdcall;{$ELSE};export;{$ENDIF}
    begin
    //在这里处理您自己的消息  
    if TheMessage=WM_VSCROLL then begin
        showmess('垂直滚动条正在滚动!');
    end;
      NewWindowProc:=CallWindowProc(OldWindowProc,
                                    WindowHandle,
                                    TheMessage,
                                    ParamW,
                                    ParamL);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      //为控件指定新的窗口过程,并且记住老的窗口过程的地址
      OldWindowProc:=Pointer(SetWindowLong(Dbgrid1.Handle,
                                          GWL_WNDPROC,
                                          LongInt(@NewWindowProc)));
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      SetWindowLong(dbgrid1.Handle,
                    GWL_WNDPROC,
                    LongInt(OldWindowProc));
    end;我已经试过了,确实可行,不过麻烦点,不知道还有没有高手知道简单的用法?
      

  2.   

    你说的功能,DBGridEh都有,用DBGridEh来代替DBGrid来实现,搜一下Ehlib控件包
      

  3.   

    我重新封装了一下dbgrid添加了一个事件来处理的,通过截获wm_hScroll来处理的to szqs你的方法什么时候试试看:)我处理的方法和你差不多to weizi2000:
    dbgrideh....没有用过,找来看看先,还有它是免费的么?没有什么使用限制么?
      

  4.   

    本来我想用ApplicationEvents的onMessage事件,通过截获WM_VSCROLL来响应事件,
    如if Msg.message = WM_VSCROLL then
            showmessage('1');但是没有反应,我也不知道为什么?
      

  5.   

    增加一个 TApplicationEvent组件(在Additional页), 在它的消息 OnMessage 中添加如下的事件处理代码.procedure Tform1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);begin
      if (DBGrid.Focused) And (Msg.message = WM_MOUSEWHEEL) then
        begin
          if Msg.wParam > 0 then
            SendMessage(DBGrid.Handle, WM_KEYDOWN, VK_UP, 0)
          else
            SendMessage(DBGrid.Handle, WM_KEYDOWN, VK_DOWN, 0);
          Handled := True;
        end;
    end;
      

  6.   

    smiler007(笑一笑) ,你这个是滚动鼠标中键触发的事件,不是dbgrid右边滚动条触发的事件。
      

  7.   

    http://www.xiya.com.cn/xiangqin/awind/codes/ehlib32.rar这里是Ehlib控件包3.2版的下载地址,看其中readme.txt中有写怎么安装,其Demos你看一下,其用法很是完全
      

  8.   

    我用的方法如下似乎有些麻烦
    首先定义了一个组件,增加了自己的事件onhbarclickunit MYGrid;interface
    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs,
     DBGrid;
    Type
      TMYGrid = Class(TDBGrid)
        private
          FHBarClick : TNotifyEvent;
          { Private declarations }
          procedure WMHScroll(var Msg: TMessage); message WM_HSCROLL;
        protected
          { Protected declarations }
        public
          { Public declarations }
          Procedure DoList;
        published
          { Published declarations }
          Property OnHBarClick : TNotifyEvent read FHBarClick write FHBarClick;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TMYGrid]);
    end;procedure TMYGrid.WMHScroll(var Msg: TMessage);
    begin
      inherited;
      DoList;
    end;Procedure TMYGrid.DoList;
    Begin
      If Assigned(FHBarClick) Then
        FHBarClick(Self)
    end;
    end.
      

  9.   

    to weizi2000
    那个控件我看了一下,确实不错,但是被否了
    主要的问题是那样做的话是死的,如果需要录入的数据发生了变化
    字段改变了,程序就必须重做了,
    我们现在的方法,只用修改表头,数据库结构就行了,程序上不用改动阿
      

  10.   

    shepher(牧羊人) ,我的方法你试用了吗?
      

  11.   

    szqs 你的方法用过了
    谢谢了
    现在找到了更好的方法
    这几天好忙啊,问题多多多,不停的测试啊,找资料啊什么的
    痛苦啊