2つのRichEditの同期をとるには?


みみ  2005-04-29 00:00:06  No: 14545  IP: [192.*.*.*]

Delphi 7
Windows XPで作っています。

2つのRichEditの同期をとるにはどうしたら良いですか??

判る方がいましたらご教授お願いしますm(__)m

編集    削除
Fusa  2005-04-30 08:08:20  No: 14546  IP: [192.*.*.*]

この関数で比較して

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;

こんな処理で同期とってみてください。

編集    削除
Mr.XRAY  URL  2005-04-30 08:38:46  No: 14547  IP: [192.*.*.*]

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;

編集    削除
みみ  2005-04-30 19:35:33  No: 14548  IP: [192.*.*.*]

Fusa様、Mr.XRAY様、ご回答ありがとうございます。

只今、Mr.XRAY様のソースを確認し実行したところ、キー操作による
同期はとれましたが、スクロールをマウス操作したところ同期がと
れませんでした。

やはりスクロールの同期というのは難しいのでしょうか?

編集    削除
Mr.XRAY  URL  2005-04-30 20:16:53  No: 14549  IP: [192.*.*.*]

前のコードはおことわりした様に,文字入力の同期です.
スクロールの同期は,実際のコードをもっていませんので,
以下を参考にして下さい.

http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=067295

編集    削除
Mr.XRAY  URL  2005-04-30 20:36:33  No: 14550  IP: [192.*.*.*]

ここも参考になるかも知れません.

http://homepage2.nifty.com/Mr_XRAY/Halbow/VCL03.html#VChap3-6

編集    削除