OK, my take.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TLinkMemo = class(TMemo)
private
FLinkedMemo: TLinkMemo;
procedure SyncLink;
protected
procedure WndProc(var Message: TMessage); override;
public
property LinkedMemo: TLinkMemo read FLinkedMemo write FLinkedMemo;
end;
TMemo = class(TLinkMemo);
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TLinkMemo.WndProc(var Message: TMessage);
begin
inherited;
if (LinkedMemo = nil)
or not LinkedMemo.HandleAllocated
then
Exit;
case Message.Msg of
WM_HSCROLL, WM_VSCROLL, WM_KEYDOWN, WM_MOUSEFIRST..WM_MOUSELAST: SyncLink;
end;
end;
procedure TLinkMemo.SyncLink;
procedure UpdateScrollBar(BarFlag: Integer; Msg: Cardinal);
var
scrollInfo: TScrollInfo;
begin
scrollInfo.cbSize := SizeOf(scrollInfo);
scrollInfo.fMask := SIF_POS;
if GetScrollInfo(Handle, BarFlag, scrollInfo) then
LinkedMemo.Perform(Msg, MAKEWPARAM(SB_THUMBPOSITION, scrollInfo.nPos), 0);
end;
var
savedLink: TLinkMemo;
begin
savedLink := LinkedMemo.LinkedMemo;
try
LinkedMemo.LinkedMemo := nil;
UpdateScrollBar(SB_HORZ, WM_HSCROLL);
UpdateScrollBar(SB_VERT, WM_VSCROLL);
finally
LinkedMemo.LinkedMemo := savedLink;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.LinkedMemo := Memo2;
Memo2.LinkedMemo := Memo1;
end;
end.