No hay un evento "OnScroll" en estos controles pero sí reciben el mensaje WM_VSCROLL cuando ocurre un desplazamiento (vertical en este caso).
Para intercepatr este mensaje tendríamos que crear derivados de TMemo y TRichEdit y redefinir sus manejadores de ventanas (método protegido WndProc).
O bien, hacerlo
al vuelo como muestro en el siguiente ejemplo:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
private
Scrolling: Boolean;
MemoOldWndProc: TWndMethod;
RichEditOldWndProc: TWndMethod;
procedure MemoWndProc(Var Msg: TMessage);
procedure RichEditWndProc(Var Msg: TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Scrolling := false;
MemoOldWndProc := Memo1.WindowProc;
Memo1.WindowProc := MemoWndProc;
RichEditOldWndProc := RichEdit1.WindowProc;
RichEdit1.WindowProc := RichEditWndProc;
end;
procedure TForm1.MemoWndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_VSCROLL) and not Scrolling then
begin
Scrolling := true;
RichEdit1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam);
Scrolling := false;
end;
MemoOldWndProc(Msg);
end;
procedure TForm1.RichEditWndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_VSCROLL) and not Scrolling then
begin
Scrolling := true;
Memo1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam);
Scrolling := false;
end;
RichEditOldWndProc(Msg);
end;
end.
Pero hay que notar que no es perfecto, más que nada- supongo -porque los controles no dibujan exactamente igual su contenido. Por ejemplo, cargué un mismo texto en ambos controles con las mismas dimensiones, tipo de letra, etc, y tuve que aumentar unos pixeles a la altura del memo para que el contenido se viera igual. La sincronización funcionó bien si desplazaba dando click entre la flecha y el botón de la barra pero no sí se arrastraba el botón.
Pero bueno, creo que es un comienzo.
// Saludos