Delphi 7
Windows XPで作っています。
2つのRichEditの同期をとるにはどうしたら良いですか??
判る方がいましたらご教授お願いしますm(__)m
この関数で比較して
function RichCompareText(RE1, RE2: TRichEdit): Boolean;
var
AStream, BStream: TMemoryStream;
begin
AStream := TMemoryStream.Create;
BStream := TMemoryStream.Create;
try
AStream.Clear;
RE1.Lines.SaveToStream(AStream);
BStream.Clear;
RE2.Lines.SaveToStream(BStream);
if AStream.Size <> BStream.Size then
Result := true
else
Result := false;
finally
AStream.Free;
BStream.Free;
end;
end;
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
Stream.Clear;
RichEdit1.Lines.SaveToStream(Stream);
RichEdit2.Lines.BeginUpdate;
Stream.Position := 0;
RichEdit2.Lines.LoadFromStream(Stream);
RichEdit2.Lines.EndUpdate;
finally
Stream.Free;
end;
end;
こんな処理で同期とってみてください。
Fusaさん同様,「同期をとる」の意味を
(1)RichEdit1に文字を入力
(2)同じ文字がRichEdit2に反映(入力)される
と解釈します.HDDの中から見つけて,一応動作確認しました.
( WindowsXP + Delphi5)
FormにRichEditを2つ,ボタンを2つ配置して以下のコードとして見て下さい.
動作は,RichEditのWindowProcプロパティを変更して,RichEdit1で発生
するメッセージを全てRichEdit2に送る,というものです.
全てが都合悪ければ適当に変更して下さい.
//=============================================================================
// スクロールバーを表示する場合は予め表示しておかないと,スクロールバーの表
// 示位置が乱れてしまうようだ(?).
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.HideScrollBars:=False;
RichEdit2.HideScrollBars:=False;
RichEdit1.ScrollBars :=ssVertical;
RichEdit2.ScrollBars :=ssVertical;
end;
//=============================================================================
// アプリ終了時
// RichEdit1のウィンドウプロシージャーを変更していたら元に戻す
//=============================================================================
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(OriginalProc) then begin
RichEdit1.WindowProc:=OriginalProc;
end;
end;
//=============================================================================
// [連動入力開始]
// RichEdit1のウィンドウプロシージャーをSubClassProcというメソッドに変更する
// RichEdit1の新しいWindowProc(SubClassProc)を定義してからSetFocusしてしまう
// と都合が悪い.
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.SetFocus;
OriginalProc:=RichEdit1.WindowProc;
RichEdit1.WindowProc:=SubClassProc;
end;
//=============================================================================
// [連動入力停止]
// RichEdit1のウィンドウプロシージャーを元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(OriginalProc) then begin
RichEdit1.WindowProc:=OriginalProc;
RichEdit1.SetFocus;
end;
end;
//=============================================================================
// RichEdit1の新しいウィンドウプロシージャー
// ここでは全てのメッセージをRichEdit2に送っている.
//=============================================================================
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OriginalProc(Msg);
SendMessage(RichEdit2.Handle,Msg.Msg ,Msg.WParam,Msg.LParam);
end;
//=============================================================================
// RichEdit2にフォーカスが移動したら連動入力を止める
// SubClassProc内で全てのメッセージを処理してしまっているので,RichEdit1の
// OnExitでは連動入力を停止することはできない.
//=============================================================================
procedure TForm1.RichEdit2Enter(Sender: TObject);
begin
if Assigned(OriginalProc) then begin
RichEdit1.WindowProc:=OriginalProc;
end;
end;
Fusa様、Mr.XRAY様、ご回答ありがとうございます。
只今、Mr.XRAY様のソースを確認し実行したところ、キー操作による
同期はとれましたが、スクロールをマウス操作したところ同期がと
れませんでした。
やはりスクロールの同期というのは難しいのでしょうか?
前のコードはおことわりした様に,文字入力の同期です.
スクロールの同期は,実際のコードをもっていませんので,
以下を参考にして下さい.
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=067295
ここも参考になるかも知れません.
http://homepage2.nifty.com/Mr_XRAY/Halbow/VCL03.html#VChap3-6