我在窗体里加入了ApplicationEvents控件,然后在OnMessage事件里判断
procedure TForm1.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  if Msg.hwnd = StringGrid1.Handle then
  begin
    if Msg.message = WM_HSCROLL then
    begin
      Edit1.Text := 'abc';
    end;
  end;
end;但是这个做法不成功,请高手指点一下,谢谢。

解决方案 »

  1.   

    用ApplicationEvents控件貌似截获不了WM_HSCROLL,你参考一下这个截获滚动条消息的例子:
    http://www.zjmf.com/A06/A0607/A060703/200512/2973.html
      

  2.   

    type
      TForm1 = class(TForm)
       ...
      private
        oldProc: TWndMethod;
        procedure MyProc(var Message: TMessage);
    procedure TForm1.FormCreate(Sender: TObject);
    var
      mask: Word;
    begin
      OldProc := StringGrid1.WindowProc;
      StringGrid1.WindowProc := self.MyProc;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     StringGrid1.WindowProc := OldProc;
    end;procedure TForm1.MyProc(var Message: TMessage);
    begin
     if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or
     (Message.msg = WM_Mousewheel)) then  
       Memo1.Lines.Add(TimeToStr(now)); OldProc(Message);
    end;
      

  3.   

    谢谢老之和Ari老之的代码稍微复杂一些,之前在老之的其他帖子也看到类似代码,最后决定发帖看有没更简单的方法。Ari的代码我试过能用,不过有个小问题,当Form1也有滚动条的时候,MyProc也会触发,能不能在MyProc里面判断一下StringGrid1.Handle?TMessage怎么取得Handle?
      

  4.   

    阿日的方法不错的, 我在BDS2006下面在窗体上加了滚动条不会触发MyProc,
    怎么你的会呢?
      

  5.   

    是Form1自带的滚动条,你把窗体缩小,然后把StringGrid放大知道窗体出现滚动条,再试试?
    我在D7下面Form1和StringGrid1都触发MyProc
      

  6.   

    我试过不会的, 可能Delphi7与Delphi2006消息处理有些不一样.
    可以这样把窗体的消息给处理了
    TForm1 = class(TForm)
      private
        { Private declarations }
      protected
        procedure WndProc(var Message: TMessage); override;
        
      public
        { Public declarations }
      end;
    procedure TForm1.WndProc(var Message: TMessage);
    begin
      if (message.Msg = WM_HScroll) or (message.Msg = WM_VScroll)
        or (message.Msg = WM_MouseWheel) then  else
        inherited;
    end;
      

  7.   

    似乎不能从TMessage里面取得Handle的信息,晚点结帖