- PR -

1つのイベントを複数のプロシ−ジャで処理

投稿者投稿内容
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-09-18 17:30
こちらの会議室にはいつもお世話になっています。

現在、Visual Basic 2005でWindowsアプリケーションを作成しているのですが、
1つのイベントを複数のプロシ−ジャで処理することについて質問があります。

入力項目のTextBoxが30程度あるフォームにおいて、そのTextBoxの入力チェックを、
Validatingイベントで行っているのですが、その際に、
@全項目:入力桁数のチェック、入力禁則文字のチェック
A入力必須項目:入力必須チェック
B個々の項目:個別のチェックが必要なTextboxはチェック
という風にチェックをしています。

@は、TxtBox_Validating()というプロシージャ名にして、
全TextBoxのValidatingイベントをハンドルしています。
Aは、NotNullableTxtBox_Validating()というプロシージャ名にして、必須入力のTextBox
のイベントをハンドルしています。
Bで、個々の入力チェックが必要なTextBoxは、
(TextBoxの名前)_Validating()というプロシージャ名にして、一つのTextBoxのイベントをハンドルしています。

順序としては、@→A→Bの順で処理を流したいのですが、
Bのイベントが先に処理されてしまうようで、うまくいきません。
色々試したら、プロシージャの命名によって処理順序が異なることは
確認できたのですが、どのような規則性があるのかわからなくて、
投稿しました。
項目数が多いので、このようにイベント処理を実装したいのですが、
他によい方法があるでしょうか。

どうぞよろしくお願いします。

[ メッセージ編集済み 編集者: むーみん 編集日時 2007-09-18 17:40 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-18 17:59
引用:

むーみんさんの書き込み (2007-09-18 17:30) より:

入力項目のTextBoxが30程度あるフォームにおいて、そのTextBoxの入力チェックを、Validatingイベントで行っているのですが、


Validating イベントで行っているということは各プロシージャを明確に呼び出しているということにならないでしょうか? この前提で命名によって順序が異なるということはありえないと思います。 ひょっとして独自のイベントで実装しているのでしょうか? (それでもあまり考えられないですが)

引用:

順序としては、(1) -> (2) -> (3) の順で処理を流したいのですが、(3) のイベントが先に処理されてしまうようで、うまくいきません。色々試したら、プロシージャの命名によって処理順序が異なることは確認できたのですが、どのような規則性があるのかわからなくて、投稿しました。


これはどのように確認されたのでしょうか? そういった説明があるか、あるいはソースコードの提示があれば問題の推測はできたかもしれません。 申し訳ありませんが、今の情報では推測もままならないです。

引用:

項目数が多いので、このようにイベント処理を実装したいのですが、他によい方法があるでしょうか。


項目数が多いのであればインターフェイスからメソッドを呼び出すかして統一しますね。 最終チェックで一括で呼び出すことも容易で再利用性が高くなります。 また 「必須入力チェック」 についてはコンポーネント化などを検討しそうです。 個々の固有なチェックは Validating イベントに直接実装して ValidateChildren メソッドを利用することが多いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-09-18 18:09
ここにデリゲートの呼び出し順番に関する話題がありました。
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-38995.htm

TextBoxのイベントの実装内容は仕様で定義されていないと思いますが、もしそれがC#のadd,removeアクセッサを指定しない実装のように実装されていると仮定するなら、イベントにメソッドを追加(VBではAddHandler)した順番で呼び出されそうです。
実際にアセンブリを覗いて確認してみてもいいですが、パッチを当てたりしても同じように動く保証はありませんので、「現状として実際に動かしてみるとどうもそのように動くようだ」といった程度でよいならAddHandlerを使って順番にイベントに追加していくのが良いかと思います。実際AddHandlerの順番で呼び出されました。
仕様では決まっているわけではないので動作保証はできませんけどね。

WithEventsとHandlesを使った方では、VBコンパイラが見えないところでごにょごにょ(プロパティを作ったりしてるんでしたっけ)してますので分かりません。

多分、複数のイベントハンドラを使う以外の方法を考える方がかっこいいコードになるかと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-18 18:34
引用:

一郎さんの書き込み (2007-09-18 18:09) より:


ああ、なるほどです。 同じイベント (Validating) に対して 3 つのプロシージャを AddHandler もしくは Handles 句で紐付けをしている可能性を考えていませんでした... 後者の場合は命名と実装位置に影響されますので明らかにダメですね。

独自のイベントで順番を保証しているならばこういったことはありませんが、検証のタイミングを考えるとイベント以外の方法 (たとえば先の投稿の最後に書いたような方法) が望ましいですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-09-18 18:56
引用:

むーみんさんの書き込み (2007-09-18 17:30) より:

@は、TxtBox_Validating()というプロシージャ名にして、
全TextBoxのValidatingイベントをハンドルしています。


一つのイベントハンドラ内で、どのTextBoxからイベントが発生したのかをチェックして処理するTextBoxと処理しないTextBoxをSelect文やIf文で場合分けするようにすればよいのではないでしょうか。

もしくはオブジェクトを取得して、あとは別プロシージャにオブジェクトごと丸投げとか。
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-09-18 20:47
じゃんぬねっとさん、一郎さん、よっし〜。さん、返信どうもありがとうございます。

自分に知識と言葉が足りていなかったようでして、
一郎さんにずいぶんと補足していただきましてありがとうございます。

遅くなりましたが、エラーチェックの実装方法としては、以下のように考えていました。
フォーカスが移動するタイミングで、
Validatingイベントで個々のTextBoxのチェックを行い、
エラーがあれば、Errorプロバイダを表示し、
最終的には、一括チェックとして、
FormのValidateChildrenメソッドで全TextBoxのValidatingイベントをハンドルしている
メソッドを流そうと思っていました。

その際に、エラーチェック処理はいくつかのメソッドに分けて、
Handles句で必要なValidatingイベントをそのメソッドに追加していくという
方法をとりました。
複数のチェックが必要であれば、1つのTextBoxのValidatingイベントが
複数のメソッドにHandles句で追加されるという事態になっていました。

この、複数のメソッドの呼び出し順序、というものがあるならば
知りたかったというわけなのですが、、、

引用:

一郎さんの書き込み (2007-09-18 18:09) より:

WithEventsとHandlesを使った方では、VBコンパイラが見えないところでごにょごにょ(プロパティを作ったりしてるんでしたっけ)してますので分かりません。



私が実装しようとして悩んでいたことは、上記のことです。
実装方法として、だめだということが分かっただけでもありがたいです。

じゃんぬねっとさんがおっしゃったように実装したいのですが、
インターフェイスからメソッドを呼び出すという方法が、
現段階ではコーディング方法がわからないので、
このプログラムでの実装は、保留しておくことにしました。
でも、時間に余裕ができそうだったら、勉強して取り掛かろうと思います。

あまりかっこよくない&動作保証ができない、
ということでしたが、今回は
AddHandlerで実行したいメソッドを順番に追加していくことにしました。

折角いろいろとご指南いただいたのに、
今後に参考になるような解決方法にたどり着けずすみません。

どうもありがとうございました。

[ メッセージ編集済み 編集者: むーみん 編集日時 2007-09-18 20:58 ]

[ メッセージ編集済み 編集者: むーみん 編集日時 2007-09-18 20:59 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-09-19 07:03
1、2、3を別々のメソッドにして、
TextBox の Validating イベントから、必要なメソッドを必要な順番で呼べばいいんじゃない?
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-09-19 09:52
Jittaさん、

なるほど、シンプルで簡単にできますね。
そのやり方を思いつきませんでした。

どうもありがとうございます。

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