Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You are probably implementing the message override for both of the grids. GridX scrolls GridY, which in turn scrolls GridX, which in turn ... SO. You can protect the superficial scrolling code by surrounding the block with flags.</p> <pre><code>type TForm1 = class(TForm) [..] private FNoScrollGridX, FNoScrollGridY: Boolean; [..] procedure TForm1.GridXCustomWndProc( var Msg: TMessage ); begin Msg.Result := CallWindowProc(POldWndProc, gridX.Handle, Msg.Msg, Msg.wParam, Msg.lParam ); if ( Msg.Msg = WM_VSCROLL ) then begin if not FNoScrollGridX then begin FNoScrollGridX := True gridY.SetActiveRow( gridX.GetActiveRow ); gridY.Perform( Msg.Msg, Msg.wParam, Msg.lParam ); // SetScrollPos( gridY.Handle, SB_VERT, HIWORD( Msg.wParam ), True ); end; FNoScrollGridX := False; end; end; </code></pre> <p>Similiar code for the GridY. BTW, you shouln't need the SetScrollPos. <hr> <b>edit:</b></p> <pre><code>TForm1 = class(TForm) [..] private GridXWndProc, GridXSaveWndProc: Pointer; GridYWndProc, GridYSaveWndProc: Pointer; procedure GridXCustomWndProc(var Msg: TMessage); procedure GridYCustomWndProc(var Msg: TMessage); [..] procedure TForm1.FormCreate(Sender: TObject); begin [..] GridXWndProc := classes.MakeObjectInstance(GridXCustomWndProc); GridXSaveWndProc := Pointer(GetWindowLong(GridX.Handle, GWL_WNDPROC)); SetWindowLong(GridX.Handle, GWL_WNDPROC, LongInt(GridXWndProc)); GridYWndProc := classes.MakeObjectInstance(GridYCustomWndProc); GridYSaveWndProc := Pointer(GetWindowLong(GridY.Handle, GWL_WNDPROC)); SetWindowLong(GridY.Handle, GWL_WNDPROC, LongInt(GridYWndProc)); end; procedure TForm1.GridXCustomWndProc(var Msg: TMessage); begin Msg.Result := CallWindowProc(GridXSaveWndProc, GridX.Handle, Msg.Msg, Msg.WParam, Msg.LParam); case Msg.Msg of WM_KEYDOWN: begin case TWMKey(Msg).CharCode of VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT: GridY.Perform(Msg.Msg, Msg.WParam, Msg.LParam); end; end; WM_VSCROLL: GridY.Perform(Msg.Msg, Msg.WParam, Msg.LParam); WM_MOUSEWHEEL: begin ActiveControl := GridY; GridY.Perform(Msg.Msg, Msg.WParam, Msg.LParam); end; WM_DESTROY: begin SetWindowLong(GridX.Handle, GWL_WNDPROC, Longint(GridXSaveWndProc)); Classes.FreeObjectInstance(GridXWndProc); end; end; end; procedure TForm1.GridYCustomWndProc(var Msg: TMessage); begin Msg.Result := CallWindowProc(GridYSaveWndProc, GridY.Handle, Msg.Msg, Msg.WParam, Msg.LParam); case Msg.Msg of WM_KEYDOWN: begin case TWMKey(Msg).CharCode of VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT: GridX.Perform(Msg.Msg, Msg.WParam, Msg.LParam); end; end; WM_VSCROLL: GridX.Perform(Msg.Msg, Msg.WParam, Msg.LParam); WM_MOUSEWHEEL: begin ActiveControl := GridX; GridY.Perform(Msg.Msg, Msg.WParam, Msg.LParam); end; WM_DESTROY: begin SetWindowLong(GridY.Handle, GWL_WNDPROC, Longint(GridYSaveWndProc)); Classes.FreeObjectInstance(GridYWndProc); end; end; end; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload