我在程序中用两个listview控件显示数据(数据已经实现对齐),要求拖动左边的listview的滚动条时,右边的listview的也随着滚动,即,左右要记录保持对齐。
怎样才能实现呢?

解决方案 »

  1.   

    另一种方法,用一个Timer控件,每500ms检查一次保持同步.
      

  2.   

    借花献佛了,把laihecongxi(兴哥) 的代码修改一下即可:unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls,CommCtrl;type
      TForm3 = class(TForm)
        ListView1: TListView;
        ListView2: TListView;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        PLVEdWndProc, POldWndProc: Pointer;
       procedure LVEdWndProc(var Msg: TMessage);  public
        { Public declarations }
      end;var
      Form3: TForm3;
    implementation{$R *.dfm}procedure TForm3.FormCreate(Sender: TObject);
    begin
      PLVEdWndProc := MakeObjectInstance(LVEdWndProc);
      POldWndProc:= Pointer(SetWindowLong(listview1.Handle,GWL_WNDPROC, Integer(PLVEdWndProc)));
    end;procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if Assigned(PLVEdWndProc) then
     begin
       SetWindowLong(listview1.Handle,GWL_WNDPROC, Integer(POldWndProc));
       FreeObjectInstance(PLVEdWndProc);
     end;
    end;
    procedure TForm3.LVEdWndProc(var Msg: TMessage);
    var
      si: TScrollInfo;
    begin
     si.cbSize:=sizeof(si);
     si.fMask:=SIF_ALL;
     if (Msg.Msg = WM_VSCROLL) then
     begin
         if(Msg.WParamLo=SB_THUMBTRACK)or(Msg.WParamLo=SB_THUMBPOSITION) then
         begin
            repeat
                GetScrollInfo(listview2.Handle,SB_VERT,si);
                if(si.nPos<Msg.WParamHi) then
                    SendMessage(listview2.Handle,Msg.Msg,SB_LINEDOWN,Msg.LParam)
                else if (si.nPos>Msg.WParamHi) then
                    SendMessage(listview2.Handle,Msg.Msg,SB_LINEUP,Msg.LParam);
            until si.nPos=Msg.WParamHi;
         end
         else
            SendMessage(listview2.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
     end;
     Msg.Result := CallWindowProc(POldWndProc,listview1.Handle, Msg.Msg, Msg.WParam, Msg.LParam);
    end;
    end.