比如鼠标点中了一个单元格,然后鼠标滚轴怎么拉,始终焦点都在原先那个单元格?不会随着拖动而改变?

解决方案 »

  1.   

    修改消息函数,截取滚动消息.直接msg.result :=1;
      

  2.   


    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids;type
      TForm2 = class(TForm)
        StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      protected
        oldproc :TWndMethod;
        procedure MyProWnd(var Message: TMessage);
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;procedure TForm2.FormCreate(Sender: TObject);
    begin
      oldproc := StringGrid1.WindowProc;
      StringGrid1.WindowProc := MyProWnd;
    end;procedure TForm2.FormDestroy(Sender: TObject);
    begin
      form2:= nil;
    end;procedure TForm2.MyProWnd(var Message: TMessage);
    begin
      if Message.Msg=WM_MOUSEWHEEL then
        Message.Result :=1
      else
        oldproc(Message);
    end;end.
      

  3.   

    以上代码在delphi2009下测试通过.
      

  4.   

    查不到对应的用什么消息,就记录log看看.
      

  5.   

    晕死,写了log了,动一下就2,3百个消息。。
    有没有哪里有资料查?其实就是右边和下边的滚动条的消息,有办法捕捉吗
      

  6.   

    WM_HSCROLL和WM_VSCROLL是滚动消息吧.
    但这个屏蔽掉就不能滚动了.
      

  7.   

    首先,谢谢你这两天来的指导。确实,这两个如果屏蔽掉就不能滚动了,那样也不行。我觉得在grid里如果鼠标滚轴或者滚动条动的时候是数据集里的相应数据的定位变动了,有没有办法就是让数据集不随着
    这些操作的变动而变动?
      

  8.   

    试了下,直接数据集定位的效果也和屏蔽消息一样的,导致了滚动条没办法动了,这样数据多的话下面的数据就没办法看到了有没有办法实现和excel那样的功能啊,就是滚动条还是可以动,怎么拖拉都可以,但是焦点始终停留在之前鼠标单击选中的单元格,只有鼠标再次单击其他单元格才会改变焦点?
      

  9.   

    怎么修改?我用的是grideh,请指教
      

  10.   

    学到了
    记住一句话 Excel是编程人员最大的敌人!!!