2009-07-23 8 views
0

私はWindowsフォームを使用して簡単なテキストエディタをコーディングしています。多くのエディタと同様に、テキストが変更されると、タイトルバーの横にアスタリスクが表示され、未保存の作業があることが示されます。ユーザーが保存すると、これは消えます。C#のテキストフィールドの以前の状態を検出する方法は?

ただし、問題があります。これは、メインテキストボックスの変更イベントで処理されます。しかし、ファイルを開いたり、ユーザーが "New file"を選択すると、エディタを開いてファイルを開くと、保存されていない変更があることが示されます。可能な解決策は何ですか?

アスタリスクをトリガすべきではない方法でテキストが変更されたかどうかを示すグローバル変数があると考えましたが、より良い方法が必要です。

答えて

1

は、変化

uxName.TextChanged -= uxName_TextChanged;  

uxName.Text = File.ReadAllText("something.txt"); 

uxName.TextChanged += uxName_TextChanged; 
0

C#にはグローバル変数はありません。あなたのフォームにインスタンス変数のような変数を持たなければなりません(フォームがビューであるモデルの方が良いでしょう)。

+0

これは本当に正確ではありません。静的クラスを作成し、静的変数をそのクラスに追加することができます。ブーム、グローバル変数。 – jasonh

+0

スタティック変数はグローバルではありません。彼らは静かです。私はこれが幾分賢明であることを知っていますが、私は用語を正確にすることが最良であると感じます。 –

+0

申し訳ありませんが、私はフォームのインスタンス変数を意味しました。しかし、私はまだこの解決策が嫌いです。 – Javier

1

これは恐ろしい解決策ですが、テキスト変更イベントが発生するたびにテキストボックスの値と変数を比較し、異なる場合は変数をテキストボックスに保存してアスタリスクを追加します。メソッドがNew Fileダイアログまたはテキストを変更していないそのようなイベントによって呼び出されると、アスタリスクは表示されません。

これは、中間のファイルでもメモリがすぐに使い果たされるため、実際のテキストエディタでは実行可能なソリューションではありません。テキストの "バージョン"を比較するために、テキストエディタが使用するフィンガーツリーまたは任意のデータ構造を使用することは、唯一本当の効率的な解決策ですが、前提は同じです。次の写真の下に

http://scienceblogs.com/goodmath/2009/05/finally_finger_trees.php

は、彼は非常に安いが、「元に戻す」機能を実装するには、テキストエディタでの指の木の使用に言及しているが、私はあなたにあなたの問題のために木の妥当性を見ることができると確信していますよくテキストボックスにデータをロードする前に

+0

犯罪も何もないが、これは私がやろうとしていることに対する過剰なもののようだ。 – Javier

+2

あなたは楽しいテキストエディタをコーディングしているようです。フィンガーツリーのようなクールなデータ構造を実装することは、かなりクールなIMOです。 – goldenratio

0

これは非常に単純で愚か解決するための第1のEventHandler関連付けを解除します。私はこれにMVPデザインパターンを使用しますが、ここでは最も速く簡単なソリューションを使用します:

//Declare a flag to block the processing of your event 
private bool isEventBlocked = false; 

private void OnTextChanged(object sender, EventArgs e) 
{ 
    if(!isEventBlocked) 
    { 
     //do your stuff 
    } 
} 

private void OnNewFile() //OR OnOpenFile() 
{ 
    try 
    { 
     isEventBlocked = true; 
     CreateFile(); 
    } 
    catch 
    { 
     //manage exception 
    } 
    finally 
    { 
     isEventBlocked = false; 
    } 
} 
関連する問題