解决方案 »

  1.   


    type
      WParameter=Word;
      LParameter=LongInt;
    var
      OldWindowProc:Pointer;
      function NewWindowProc(WindowHandle:hWnd;TheMessage:WParameter;ParamW:WParameter;ParamL:LParameter):LongInt stdcall;
    var
      intScrollBarPos,intScrollBarPos2,intScrollBarPos2_old:integer;
      i:Integer;
    begin
      if TheMessage=WM_HSCROLL then
      begin
        intScrollBarPos := GetScrollPos(form1.dxdbgrd_1.Handle,SB_HORZ);
        intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_HORZ);    SetScrollPos(form1.dxdbgrd_2.Handle,SB_HORZ,intScrollBarPos,true);    intScrollBarPos2_old:=0;
        if intScrollBarPos2<intScrollBarPos then
        begin
          while intScrollBarPos2<=intScrollBarPos-1  do
          begin
            sendMessage(form1.dxdbgrd_2.Handle,WM_hSCROLL,SB_LINERIGHT,1);
            intScrollBarPos:= GetScrollPos(form1.dxdbgrd_1.Handle,SB_HORZ);
            intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_HORZ);
            if intScrollBarPos2_old=intScrollBarPos2 then
            begin
              break;
            end
            else
            begin
              intScrollBarPos2_old:=intScrollBarPos2;
            end;
          end;
        end
        else if intScrollBarPos2>intScrollBarPos then
        begin
          while intScrollBarPos2>=intScrollBarPos+1  do
          begin
            sendMessage(form1.dxdbgrd_2.Handle,WM_hSCROLL,SB_LINEleft,1);
            intScrollBarPos:= GetScrollPos(form1.dxdbgrd_1.Handle,SB_HORZ);
            intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_HORZ);
            if intScrollBarPos2_old=intScrollBarPos2 then
            begin
              break;
            end
            else
            begin
              intScrollBarPos2_old:=intScrollBarPos2;
            end;
          end;
        end;
      end
      else if TheMessage=WM_VSCROLL then
      begin
        intScrollBarPos := GetScrollPos(form1.dxdbgrd_1.Handle,SB_VERT);
        intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_VERT);    SetScrollPos(form1.dxdbgrd_2.Handle,SB_VERT,intScrollBarPos,true);    intScrollBarPos2_old:=0;
        if intScrollBarPos2<intScrollBarPos then
        begin
          while intScrollBarPos2<=intScrollBarPos-1  do
          begin
            sendMessage(form1.dxdbgrd_2.Handle,WM_VSCROLL,SB_LINEDOWN ,1);
            intScrollBarPos:=  GetScrollPos(form1.dxdbgrd_1.Handle,SB_VERT);
            intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_VERT);
            if intScrollBarPos2_old=intScrollBarPos2 then
            begin
              break;
            end
            else
            begin
              intScrollBarPos2_old:=intScrollBarPos2;
            end;
          end;
        end
        else if intScrollBarPos2>intScrollBarPos then
        begin
          while intScrollBarPos2>=intScrollBarPos+1  do
          begin
            sendMessage(form1.dxdbgrd_2.Handle,WM_vSCROLL,SB_LINEUP,1);
            intScrollBarPos:= GetScrollPos(form1.dxdbgrd_1.Handle,SB_VERT);
            intScrollBarPos2:= GetScrollPos(form1.dxdbgrd_2.Handle,SB_VERT);
            if intScrollBarPos2_old=intScrollBarPos2 then
            begin
              break;
            end
            else
            begin
              intScrollBarPos2_old:=intScrollBarPos2;
            end;
          end;
        end;
      end;
      NewWindowProc:=CallWindowProc(OldWindowProc,WindowHandle, TheMessage,ParamW,ParamL);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldWindowProc:=Pointer(SetWindowLong(dxdbgrd_1.Handle,GWL_WNDPROC,LongInt(@NewWindowProc)));
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      SetWindowLong(dbgrid1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));
    end;