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;
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;