有两个完全一样的DBGrid控件
如何托动一个DBGrid的滚动条来控制另一个DBGrid的滚动
使两个DBGrid同步显示想法是不是有些怪异
哪位仁兄指点一下
谢了

解决方案 »

  1.   

    呵呵,何必呢?
    不过DBGrid的数据源(DataSource)设置成同一个,就可以自动滚动了。
    比如:
      adsData: TADODataSet;
      dsData: TDataSource;
      dgData1: TDBGrid;
      dgData2: TDBGrid;  dsData.DataSet := adsData;
      dgData1.DataSource := dsData;
      dgData2.DataSource := dsData;最后,记录集打开后,在一个DBGrid拖动滚动条,另外一个也会跟着滚动。
      

  2.   

    那得看楼猪两个DBGrid中是不是用的一个源中的数据了,虽然没试,但是我想应该也可以吧。只要将当前记录定位到需要的行就是啊。
      

  3.   

    zt两个Grid的同步滚动   在实际制作一个项目当中,有时候需要几个grid一起同步滚动以减少用户的操作量。希望下面那段代码对您有一定的参考价值。{1.}unit SyncStringGrid;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, Grids;type
      TSyncKind = (skBoth, skVScroll, skHScroll);
      TSyncStringGrid = class(TStringGrid)private
      FInSync: Boolean;
      FsyncGrid: TSyncStringGrid;
      FSyncKind: TSyncKind;
    { Private declarations }
      procedure WMVScroll(var Msg: TMessage); message WM_VSCROLL;
      procedure WMHScroll(var Msg: TMessage); message WM_HSCROLL;protected
    { Protected declarations }public
    { Public declarations }
      procedure DoSync(Msg, wParam: Integer; lParam: Longint); virtual;published
    { Published declarations }
      property SyncGrid: TSyncStringGrid read FSyncGrid write FSyncGrid;
      property SyncKind: TSyncKind read FSyncKind write FSyncKind default skBoth;
    end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TSyncStringGrid]);
    end;procedure TSyncStringGrid.WMVScroll(var Msg: TMessage);
    begin
      if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skVScroll]) then
        FSyncGrid.DoSync(WM_VSCROLL, Msg.wParam, Msg.lParam);
      inherited;
    end;procedure TSyncStringGrid.WMHScroll(var Msg: TMessage);
    begin
      if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skHScroll]) then
        FSyncGrid.DoSync(WM_HSCROLL, Msg.wParam, Msg.lParam);
      inherited;
    end;procedure TSyncStringGrid.DoSync(Msg, wParam: Integer; lParam: Longint);
    begin
      FInSync := True;
      Perform(Msg, wParam, lParam);
      FinSync := False;
    end;end.{****************************************}{2.}
    private
      OldGridProc1, OldGridProc2: TWndMethod;
      procedure Grid1WindowProc(var Message: TMessage);
      procedure Grid2WindowProc(var Message: TMessage);public
    {...}procedure TForm1.Grid1WindowProc(var Message: TMessage);begin
      OldGridProc1(Message);
      if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or Message.msg = WM_Mousewheel)) then
      begin
        OldGridProc2(Message);
      end;
    end;procedure TForm1.Grid2WindowProc(var Message: TMessage);
    begin
      OldGridProc2(Message);
      if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or (Message.msg = WM_Mousewheel)) then
      begin
        OldGridProc1(Message);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldGridProc1 := StringGrid1.WindowProc;
      OldGridProc2 := StringGrid2.WindowProc;
      StringGrid1.WindowProc := Grid1WindowProc;
      StringGrid2.WindowProc := Grid2WindowProc;
    end;
      

  4.   

    To:wilowind(无风雪亦飘) 
      首先感谢你的答案。
      我试过了{2.}的代码,如果是两个StringGrid控件,结果是正确的
      但我换成DBGrid后,就没有任何效果了。
      是什么原因?
      

  5.   

    点击DBGrid的 滚动条 可以同步滚动。
    但不能实现鼠标滚轴同步滚动。 因为DBGrid不支持鼠标滚动。
      

  6.   

    接受答案
    再次感谢wilowind(无风雪亦飘)