- PR -

Dirtyフラグの更新をイベントで行いたい場合の書き方で質問です

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-31 10:50
1画面1レコード編集の形式のフォームを作っています。
このフォームには3個(フィールド分)の各種コントロールがあります。
あるレコードを読込んで、これらのコントロールの持つ値が変更されたら Dirty フラグ
を立てます。
終了時や、保存ボタンを押すことで、Dirtyフラグを元に戻します。

と言うような処理を書く場合で、各種コントロールのイベント呼び出し先を同じメソッ
ドにするのはアリでしょうか?
ちなみに同じイベントで別の処理もさせています。

コード:
public class 壱画面壱行情報編集
{
    private bool dirty;
    public void 壱画面壱行情報編集(int 番号) {
        InitializeComponent();

        this.dirty = false;
        if (!this.データを読込む(番号)) {
            this.エラーメッセージを表示する();
            this.Close();
        }
        this.名称.TextChange += new EventHandler(this.DirtyFlagOn);
        this.単価.TextChange += new EventHandler(this.DirtyFlagOn);
        this.単価.TextChange += new EventHandler(this.UnitPriceChange);
        this.登録日.TextChange += new EventHandler(this.DirtyFlagOn);
    }

    private void DirtyFlagOn(object sender, EventArgs e) {
        this.dirty = true;
    }

    private void UnitPriceChange(object sender, EventArgs e) {
        this.単価が変更されたので諸々の処理をする();
    }
    
       :
    だらだら
       :



C# では上記の様に書くことができます。僕は今まで VB6 を使っていたので、一つのイベントには一つの処理が当たり前だったのです。

コード:
こんな感じ
        this.名称.TextChange += new EventHandler(this.名称_TextChange);
        this.単価.TextChange += new EventHandler(this.単価_TextChange);
        this.登録日.TextChange += new EventHandler(this.登録日_TextChange);



しかし、この例では、フィールドが3つの例ですが、大量のフィールドの場合は、前者
の方が簡潔に書けますよね。
初めて書くので、実際、このように書いて良いものかどうか不安なのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-31 11:12
引用:

R・田中一郎さんの書き込み (2006-03-31 10:50) より:

しかし、この例では、フィールドが3つの例ですが、大量のフィールドの場合は、前者
の方が簡潔に書けますよね。
初めて書くので、実際、このように書いて良いものかどうか不安なのです。


場合によりけりだと思います。
今回の場合は TextChanged というイベント名だから困惑しているのではないでしょうか?

TextChanged イベントに対し DirtyFlagOn という名前はタイミングがわかりにくいですよね。
対象名_イベント名 という形式が名前として相応しかろうと思います。

 例 : AllTextBox_TextChanged (これならば 対象もタイミングも明確にわかる)

引用:

あるレコードを読込んで、これらのコントロールの持つ値が変更されたら Dirty フラグ
を立てます。
終了時や、保存ボタンを押すことで、Dirtyフラグを元に戻します。


変更されたらという意味では TextChanged ではなく最後の方が良いでしょう。
TextChanged イベントが起きたものの、ユーザーが元の値に戻すかもしれません。
その場合は何らかの更新処理をする必要はないですよね?

最後に変更検知を実装するのであれば、初期値を格納する構造体、
またはクラスのインスタンスを持つようにすれば簡単に可能ですよね。
フィールドが増えても変更の手間は少ないです。

その中で、Compare メソッド (比較メソッド) を実装すると、田中さん好みなんじゃないですか? (w

引用:

僕は今まで VB6 を使っていたので、一つのイベントには一つの処理が当たり前だったのです。


VB6 でもクラス モジュール + WithEvents で複数 Combine できますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-31 11:50
引用:

じゃんぬねっとさんの書き込み (2006-03-31 11:12) より:

今回の場合は TextChanged というイベント名だから困惑しているのではないでしょうか?

TextChanged イベントに対し DirtyFlagOn という名前はタイミングがわかりにくいですよね。
対象名_イベント名 という形式が名前として相応しかろうと思います。



そうなんです。まさに「後でわかりにくいかもしれない。」という漠然とした不安で
質問にするに至ったのです。
イベントの処理は、何をするか?を主とするよりは、何をしたためにどういう処理を
するのか?という考え方が多かったためです。

引用:

じゃんぬねっとさんの書き込み (2006-03-31 11:12) より:

変更されたらという意味では TextChanged ではなく最後の方が良いでしょう。
TextChanged イベントが起きたものの、ユーザーが元の値に戻すかもしれません。
その場合は何らかの更新処理をする必要はないですよね?

最後に変更検知を実装するのであれば、初期値を格納する構造体、
またはクラスのインスタンスを持つようにすれば簡単に可能ですよね。
フィールドが増えても変更の手間は少ないです。



確かに、目から鱗な方法です。
何かのサンプルを参考に、この手の処理の定石として使ってきた方法だったのですが、
じゃんぬねっとさんの言うやり方の方が全然良いですね。

引用:

じゃんぬねっとさんの書き込み (2006-03-31 11:12) より:

その中で、Compare メソッド (比較メソッド) を実装すると、田中さん好みなんじゃないですか? (w



ああぅ、僕の好みまで知っているのですね。
以後「MVP for R.Tanaka.Ichiro.」と表記しても良いです。(逆に迷惑でしょうねw)

引用:

じゃんぬねっとさんの書き込み (2006-03-31 11:12) より:

VB6 でもクラス モジュール + WithEvents で複数 Combine できますよ。



知りませんでした。
もっと早く知っていたら、もう少し楽にコーディングできていたのに、もう後の祭りで
すね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-31 12:27
引用:

R・田中一郎さんの書き込み (2006-03-31 11:50) より:

確かに、目から鱗な方法です。
何かのサンプルを参考に、この手の処理の定石として使ってきた方法だったのですが、
じゃんぬねっとさんの言うやり方の方が全然良いですね。


そのサンプル、ちょっと変かもしれませんね。
そのレベルであれば Modified プロパティを素直に使うべきですからね。

引用:

ああぅ、僕の好みまで知っているのですね。
以後「MVP for R.Tanaka.Ichiro.」と表記しても良いです。(逆に迷惑でしょうねw)


迷惑じゃないです、しばらくの間ネタとして書きたいところです。
が、Open な場所なのでやめておきます。(Closed なところならw)

引用:

もっと早く知っていたら、もう少し楽にコーディングできていたのに、もう後の祭りで
すね。


VB のレベルですと、こういうのにしか使ってはいけませんけどね。

  フォーカスを取得した時にテキストを全選択状態にする

最後の方に実用例が書かれています。

ちょっと脱線気味ですが、主となる部分は十分伝わったようで嬉しいです。
完成したら是非こちらにフィードバックしてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-31 14:22
引用:

じゃんぬねっとさんの書き込み (2006-03-31 12:27) より:

そのサンプル、ちょっと変かもしれませんね。
そのレベルであれば Modified プロパティを素直に使うべきですからね。



VB4の頃に、何かの本で読んだものだった記憶があります。

引用:

じゃんぬねっとさんの書き込み (2006-03-31 12:27) より:

ちょっと脱線気味ですが、主となる部分は十分伝わったようで嬉しいです。
完成したら是非こちらにフィードバックしてください。



ありがとうございました。
外に出しても恥ずかしくない子に育てたら、是非フィードバックさせていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)