2017-01-18 3 views
2

TMemo(および他の同様のコントロール)にはOnChangeイベントしかないという事実が、私はいつも盗聴されていました。私は、テキストがプログラムによって変更されたときではなく、ユーザーがテキストをいつ変更したかを知りたいと思います。あなたがプログラムでテキストを変更する前に= NIL:OnChangeイベント入れユーザーがいつTMemo/TEditのテキストを変更したかを知るには?

  1. は、私は2つの方法は、ユーザーがテキストとプログラムで変更テキストを変更を区別するために知っています。その後、OnChangeを復元します。これは、コードからテキストを変更するたびに(そしてメモ/編集でこの特別な処理を適用する必要がある)毎回行う必要があるため、エラーが発生しやすくなります。 OnChangeが呼び出されるたびに、コントロールがユーザーによって編集されたことがわかりました。

  2. OnKeyPress、MouseDownなどのイベントをキャプチャします。テキストが実際に変更されたかどうかを判断し、ユーザーがextを編集したときに呼び出される必要があるコードを手動で呼び出します。これは、既に大きなファイルに大きな量の手続きを追加する可能性があります。

もっとエレガントな方法がありますか?

+1

貼り付けによる変更はどうなりますか?またはオートメーションから?入力内容やアプリケーションコードだけではなく、コンテンツを変更できることがたくさんあります。 –

+5

これは質問を呼び起こす - それはなぜ重要なのでしょうか?多分あなたは間違った問題を解決しようとしています。 –

答えて

4

テキストを設定したときにOnChangeイベントが確実に発生しないようにするには、オプション1を実行するためのヘルパープロシージャを作成し、をフレームワーク内で使用します()。例えば:

type 
    TCustomEditAccess = class(TCustomEdit); 

procedure SetEditTextNoEvent(Edit: TCustomEdit; const AText: string); 
var 
    OldOnChange: TNotifyEvent; 
begin 
    with TCustomEditAccess(Edit) do 
    begin 
    OldOnChange := OnChange; 
    try 
     OnChange := nil; 
     Text := AText; 
    finally 
     OnChange := OldOnChange; 
    end; 
    end; 
end; 

TMemoもまたOnChangeをトリガーLines性質を持っているので、あなたがLines: TStrings引数を受け入れ、他の同様の手順を行うことができます。

関連する問題