2つの TRichEdit のスクロールを同期させる
|
2つのTMemo のスクロールを同期させるやり方が[Tips:321]にありますが、実は TRichEdit だと同じようにしてもうまく行きません。
解決方法は、やはり Halbow さんの[Delphi-ML:67313]にあります。
うまく行かないのは、TRichEdit では CN_COMMAND を通じたスクロール通知メッセージ EN_VSCROLL が発行されないためです。EM_SETEVENTMASK というメッセージを送って、LParam に ENM_SCROLL を設定すると、親に EN_VSCROLL を通知するようになります。
親にイベントを通知するかどうかをプログラムで設定するためのこのようなマスクについて、[Delphi-ML:67328]にさらに詳しい説明があります。
public
RichEdit1Proc:TWndMethod;
MKEY:WORD;
procedure RichEdit1SuclassProc(var Msg:TMessage);
procedure SyncVScroll;
procedure PageDown;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
richedit;
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1Proc := RichEdit1.WindowProc;
RichEdit1.WindowProc := RichEdit1SuclassProc;
end;
procedure TForm1.FormShow(Sender: TObject);
var
MASK:LPARAM;
begin
MASK := RichEdit1.Perform(EM_GETEVENTMASK,0,0);
RichEdit1.Perform(EM_SETEVENTMASK,0,MASK or ENM_SCROLL);
end;
procedure TForm1.RichEdit1SuclassProc(var Msg: TMessage);
begin
RichEdit1Proc(Msg);
case Msg.Msg of
WM_VSCROLL:RichEdit2.Dispatch(Msg);
CN_COMMAND:begin
if (Msg.WParamHi = EN_VSCROLL) then
case MKEY of
VK_DOWN,VK_UP,VK_PRIOR:SyncVScroll;
VK_NEXT:PageDown;
VK_HOME,VK_END:
if (GetAsyncKeyState(VK_CONTROL) and $8000) <> 0 then
SyncVScroll;
end;
end;
CN_KEYDOWN:MKEY := Msg.WParam;
end;
end;
procedure TForm1.SyncVScroll;
var
Msg:TWMScroll;
begin
Msg.Msg := WM_VSCROLL;
Msg.Pos := GetScrollPos(RichEdit1.Handle,SB_VERT);
Msg.ScrollBar := 0;
Msg.ScrollCode := SB_THUMBTRACK;
RichEdit2.Dispatch(Msg);
Msg.ScrollCode := SB_THUMBPOSITION;
RichEdit2.Dispatch(Msg);
Msg.ScrollCode := SB_ENDSCROLL;
RichEdit2.Dispatch(Msg);
end;
procedure TForm1.PageDown;
var
Msg:TWMScroll;
begin
Msg.Msg := WM_VSCROLL;
Msg.Pos := 0;
Msg.ScrollBar := 0;
Msg.ScrollCode := SB_PAGEDOWN;
RichEdit2.Dispatch(Msg);
end;
|
|