截获消息wm_vscoll 下移以行的时候上移的时候 movenext  
在 moveperivous 是吧这么简单

解决方案 »

  1.   

    截获滚动条消息 
     type 
    {$IFDEF WIN32} 
    WParameter = LongInt; 
    {$ELSE} 
    WParameter = Word; 
    {$ENDIF} 
    LParameter = LongInt; {Declare a variable to hold the window procedure we are replacing} 
    var 
    OldWindowProc : Pointer; function NewWindowProc(WindowHandle : hWnd; 
    TheMessage : WParameter; 
    ParamW : WParameter; 
    ParamL : LParameter) : LongInt 
    {$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF} 
    var 
    TheRangeMin : integer; 
    TheRangeMax : integer; 
    TheRange : integer; 
    begin if TheMessage = WM_VSCROLL then begin 
    {Get the min and max range of the horizontal scroll box} 
    GetScrollRange(WindowHandle, 
    SB_HORZ, 
    TheRangeMin, 
    TheRangeMax); 
    {Get the vertical scroll box position} 
    TheRange := GetScrollPos(WindowHandle, 
    SB_VERT); 
    {Make sure we wont exceed the range} 
    if TheRange < TheRangeMin then 
    TheRange := TheRangeMin else 
    if TheRange > TheRangeMax then 
    TheRange := TheRangeMax; 
    {Set the horizontal scroll bar} 
    SetScrollPos(WindowHandle, 
    SB_HORZ, 
    TheRange, 
    true); 
    end; if TheMessage = WM_HSCROLL then begin 
    {Get the min and max range of the horizontal scroll box} 
    GetScrollRange(WindowHandle, 
    SB_VERT, 
    TheRangeMin, 
    TheRangeMax); 
    {Get the horizontal scroll box position} 
    TheRange := GetScrollPos(WindowHandle, 
    SB_HORZ); 
    {Make sure we wont exceed the range} 
    if TheRange < TheRangeMin then 
    TheRange := TheRangeMin else 
    if TheRange > TheRangeMax then 
    TheRange := TheRangeMax; 
    {Set the vertical scroll bar} 
    SetScrollPos(WindowHandle, 
    SB_VERT, 
    TheRange, 
    true); 
    end; { Call the old Window procedure to } 
    { allow processing of the message. } 
    NewWindowProc := CallWindowProc(OldWindowProc, 
    WindowHandle, 
    TheMessage, 
    ParamW, 
    ParamL); 
    end; 
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    { Set the new window procedure for the control } 
    { and remember the old window procedure. } 
    OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, 
    GWL_WNDPROC, 
    LongInt(@NewWindowProc))); 
    end; procedure TForm1.FormDestroy(Sender: TObject); 
    begin 
    { Set the window procedure back } 
    { to the old window procedure. } 
    SetWindowLong(ScrollBox1.Handle, 
    GWL_WNDPROC, 
    LongInt(OldWindowProc)); end;
      

  2.   

    //写一个listbox给你
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
      private    { Private declarations }
      public
        { Public declarations }
      end;  Tmylistbox = class(Tlistbox)
    privateprotected
    procedure wndproc(var message:Tmessage);override;
    public
    { Public declarations }
    published
    { Published declarations }
    end;
    var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
      a:Tmylistbox;
      i:integer;begin
      a:=Tmylistbox.Create (self);
      a.parent:=form1;
      a.Visible :=true;
      for i :=0 to 20 do
        a.Items.Add (inttostr(i));end;{ Tmylistbox }procedure Tmylistbox.wndproc(var message: Tmessage);
    begin
     if message.msg=WM_VSCroll then
      begin
         if message.WParam= SB_LINEDOWN then
           showmessage('ok');    exit;
      end;  inherited wndproc(message);end;end.
      

  3.   

    搞错没有,你们有没有明白我的问题,是关于DBGRId的问题。