下面是我写的部分代码,一般情况下没问题,但是来回滚动几次之后差了几行了,找不出原因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;
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;