在写一个简单的数据库连接操作的时候,突然想起来用鼠标滚轮操作DBGrid的选中项
发现DBGrid不太好用后,改用DBGridEh。
DBGridEh中是支持鼠标滚轮翻页的,但是却没有鼠标滚轮响应事件。
自己用event添加后,在事件响应时取DBGridEh的选中项,发现全部都是事件响应“时”所在的位置,而鼠标滚轮滚动结束后已经大大偏离了那个位置。
求解

解决方案 »

  1.   

    “自己用event添加”,是怎样添加的?
      

  2.   


    添加ApplicationEvents控件,在事件拦截中Msg=VK_MOUSEWHEEL拦截事件
    在事件响应中直接调用Grid绑定的ADOQuery的Dataset.FieldByName('')取相应的字段
    取出来的却是MOUSEWHEEL发生时所选中的行,而不是MOUSEWHEEL结束时Dataset选中的行
      

  3.   

    想来丢个时钟上去实时刷新ADOQuery的选中行也是可行的而且也不用去考虑各个事件响应了但是总觉得不爽,VK_MOUSEWHEEL事件只能响应个模糊值么,没有MOUSEWHEEL结束事件么
      

  4.   

    procedure 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;
      

  5.   

    拜托先看问题好吗
    我说的就是用ApplicationEvents添加了event响应后发现响应的是mousewheel的开始而不是结束
      

  6.   

    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
    if (DBGrid1.Focused) And (Msg.message = WM_MOUSEWHEEL) then
      begin
      if Msg.wParam > 0 then
      begin
      SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_UP, 0);
      Adoquery.FieldByName('').as...;//在这里不就取到移动后的相应字段的值了?因为执行这句是在SendMessage语句之后,也就是数据集的指针移动之后
      end
      else
      begin
      SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_DOWN, 0);
      Adoquery.FieldByName('').as...;//
      end;
      Handled := True;
      end;
    end;
    说多了打击你
      

  7.   

    好吧,终于找到原因了DBGRIDEH自己拦截了鼠标mousewheel操作,然后send了上下箭头按键操作但是再次拦截的话,再次发送上下箭头message双份的message发出去了不发送的话,由于拦截的是窗口的message,在DBGridEh之前,拦截到的肯定比真实值少次wheel由于发的是上下按键,即少1。现在要考虑的是如何在使用DBGridEh的界面增强的情况下使wheel的确定行精准判断Wheel的方向少算一行是一种方法,直接改DBGridEh控件是一种方法有没有更简单的?