类似于文本比较工具
我自己写的实现方式来回滚动几次后,滚动条的位置就有一点差异了,请教高手好的实现方式

解决方案 »

  1.   

    就是发消息,发 WM_VScroll或WM_HScroll消息
      

  2.   

    下面是我写的部分代码,一般情况下没问题,但是来回滚动几次之后差了几行了,找不出原因procedure TfrmPcfCompare.FormCreate(Sender: TObject);
    begin
      PRichEdWndProc_Before := MakeObjectInstance(RichEdWndProc_Before);
      POldWndProc_Before := Pointer(SetWindowLong(RedtBeforeModify.Handle, GWL_WNDPROC,
        Integer(PRichEdWndProc_Before)));  PRichEdWndProc_After := MakeObjectInstance(RichEdWndProc_After);
      POldWndProc_After := Pointer(SetWindowLong(RedtAfterModify.Handle, GWL_WNDPROC,
        Integer(PRichEdWndProc_After)));  RedtBeforeModify.Perform(EM_SCROLLCARET,0,0);
      RedtAfterModify.Perform(EM_SCROLLCARET,0,0);
    end;procedure TfrmPcfCompare.RichEdWndProc_Before(var Msg: TMessage);
    begin
      Msg.Result:=CallWindowProc(POldWndProc_Before,RedtBeforeModify.Handle,Msg.Msg,Msg.wParam,Msg.lParam);
      if(Msg.Msg = WM_VSCROLL)and(LOWORD(Msg.wParam)=SB_THUMBTRACK) then
      begin
        RedtAfterModify.Perform(Msg.Msg,Msg.wParam,Msg.lParam);
        SetScrollPos(RedtAfterModify.Handle,SB_VERT,HIWORD(Msg.wParam),True);
      end;
      if(Msg.Msg=WM_HSCROLL)and(LOWORD(Msg.WParam)=SB_THUMBTRACK) then
      begin
        RedtAfterModify.Perform(Msg.Msg,Msg.wParam,Msg.lParam);
        SetScrollPos(RedtAfterModify.Handle,SB_HORZ,HIWORD(Msg.wParam),True);
      end;
      if (Msg.Msg=WM_MOUSEWHEEL) and RedtBeforeModify.Focused then
        SendMessage(RedtAfterModify.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
    end;procedure TfrmPcfCompare.RichEdWndProc_After(var Msg: TMessage);
    begin
      Msg.Result:=CallWindowProc(POldWndProc_After,RedtAfterModify.Handle,Msg.Msg,Msg.wParam,Msg.lParam);
      if(Msg.Msg = WM_VSCROLL)and(LOWORD(Msg.wParam)=SB_THUMBTRACK) then
      begin
        RedtBeforeModify.Perform(Msg.Msg,Msg.wParam,Msg.lParam);
        SetScrollPos(RedtBeforeModify.Handle,SB_VERT,HIWORD(Msg.wParam),True);
      end;
      if(Msg.Msg=WM_HSCROLL)and(LOWORD(Msg.WParam)=SB_THUMBTRACK) then
      begin
        RedtBeforeModify.Perform(Msg.Msg,Msg.wParam,Msg.lParam);
        SetScrollPos(RedtBeforeModify.Handle,SB_HORZ,HIWORD(Msg.wParam),True);
      end;
      if(Msg.Msg=WM_MOUSEWHEEL) and RedtAfterModify.Focused then
        SendMessage(RedtBeforeModify.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
    end;