C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: フォームの呼び元を判定したい


(過去ログ 45 を表示中)

[トピック内 26 記事 (1 - 20 表示)]  << 0 | 1 >>

■24459 / inTopicNo.1)  フォームの呼び元を判定したい
  
□投稿者/ ひろ (1回)-(2008/09/03(Wed) 13:16:39)

分類:[VB.NET/VB2005] 

VB.NET2003 です。

frmResult という名前の照会画面があります。
この画面は frmMenu というメニュー画面から呼ばれるパターンと
frmDetail という詳細画面から呼ばれる2パターンがあります。

frmResult のボタンを押した時の処理を、呼ばれた画面によって分岐させたいと思っています。
メニューから呼ぶ時も、詳細画面から呼ぶ時も、owner に自分を指定しているので、
If Me.Owner.Name.ToString = "frmMenu" Then って書き方で一応分岐はできています。
でも、これは本来の判定方法じゃないんだろうなと思っています。

こういった処理をする時に、一般的にはどのように判定させるものなんでしょうか?
宜しくお願いします。

引用返信 編集キー/
■24460 / inTopicNo.2)  Re[1]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1295回)-(2008/09/03(Wed) 13:23:29)
επιστημη さんの Web サイト
2008/09/03(Wed) 13:35:46 編集(投稿者)

> メニューから呼ぶ時も、詳細画面から呼ぶ時も、owner に自分を指定しているので、
> If Me.Owner.Name.ToString = "frmMenu" Then って書き方で一応分岐はできています。
> でも、これは本来の判定方法じゃないんだろうなと思っています。

なぜ?

# Ownerが気に入らんなら、 呼び出し元を Tag に押し込むてのはいかがでしょぉか
# あるいはコンストラクタの引数で教えてあげてもよくないかしら?

引用返信 編集キー/
■24463 / inTopicNo.3)  Re[2]: フォームの呼び元を判定したい
□投稿者/ もょもと (41回)-(2008/09/03(Wed) 13:36:54)
> frmResult のボタンを押した時の処理を、呼ばれた画面によって分岐させたいと思っています。
> メニューから呼ぶ時も、詳細画面から呼ぶ時も、owner に自分を指定しているので、
> If Me.Owner.Name.ToString = "frmMenu" Then って書き方で一応分岐はできています。

Formの名前が後で変更されたら修正がめんどい…ってことなんでしょうか?
それが嫌ならフラグで判定するのも有りかもしれませんね。
引用返信 編集キー/
■24464 / inTopicNo.4)  Re[3]: フォームの呼び元を判定したい
□投稿者/ オガシン (73回)-(2008/09/03(Wed) 13:39:53)
たしかに「なぜ?」と思います。
本来の判定方法じゃないって言うのであれば
>If Me.Owner.Name.ToString = "frmMenu" Then
If Me.Owner.Name = "frmMenu" Then

FormクラスのNameプロパティはString型ですよ、とか
しょーもない内容くらいじゃないでしょか^^;
あとは"frmMenu"を定数宣言にするとか?

俺ならこの方法で判定しますが。
引用返信 編集キー/
■24467 / inTopicNo.5)  Re[4]: フォームの呼び元を判定したい
□投稿者/ ひろ (2回)-(2008/09/03(Wed) 13:58:13)
アドバイス有難うございます。

本来の方法じゃないんだろうなと思った理由は、
文字で比較して判定するのではなく、型で比較して判定するのが一般的なんだろーなと予想していた為です。
なにか根拠のある予想ではなく、なんとなくイメージで・・・です。

今、書き込みながら試行錯誤していたのですが、
If TypeOf Me.Owner Is frmMenu Then
という書き方ができました。
自分が型で・・・とイメージしていたのは、こんな感じです。
正しく分岐できるかテストしてみます。
引用返信 編集キー/
■24472 / inTopicNo.6)  Re[5]: フォームの呼び元を判定したい
□投稿者/ なちゃ (167回)-(2008/09/03(Wed) 14:58:16)
どっちかっていうと、そっちの方が良くない気がします。
動作モード的なプロパティを設けて、画面ではなくモード設定で制御の方がややお薦めです。

引用返信 編集キー/
■24473 / inTopicNo.7)  Re[6]: フォームの呼び元を判定したい
□投稿者/ ひろ (4回)-(2008/09/03(Wed) 15:15:18)
そっちの手法の方が一般的じゃないよ。と書き込みがあるかもしれないと思って解決済みにするのを待っていました。
名前や型で判断するのではなく、プロパティを持てば済む話だったのですね。
完全に頭から抜けていました。今回はプロパティを持たせて作業を進める事にします。
アドバイスをくださった方、有難うございました。
解決済み
引用返信 編集キー/
■24475 / inTopicNo.8)  Re[6]: フォームの呼び元を判定したい
□投稿者/ みきぬ (58回)-(2008/09/03(Wed) 15:26:51)
プロパティ案を一押しというのは同意しますが、

No24472 (なちゃ さん) に返信
> どっちかっていうと、そっちの方が良くない気がします。
> 動作モード的なプロパティを設けて、画面ではなくモード設定で制御の方がややお薦めです。
>
Nameプロパティよりも型で判別したほうが確実じゃないですか?
なぜ良くないとされるのかわかりません。
解決済み
引用返信 編集キー/
■24478 / inTopicNo.9)  Re[7]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1299回)-(2008/09/03(Wed) 15:35:53)
επιστημη さんの Web サイト
>>どっちかっていうと、そっちの方が良くない気がします。
>>動作モード的なプロパティを設けて、画面ではなくモード設定で制御の方がややお薦めです。
>>
> Nameプロパティよりも型で判別したほうが確実じゃないですか?
> なぜ良くないとされるのかわかりません。

[1] どこから呼ばれたか
[2] どんな目的で呼ばれたか

どっちを意図しているか、じゃないすかね。
"動作モード的なプロパティ"は[2]ですわね。
こっちを使うとどこからどんな手段で呼ばれようが、
"何をしてほしいか"を指定できるってわけね。

解決済み
引用返信 編集キー/
■24483 / inTopicNo.10)  Re[8]: フォームの呼び元を判定したい
□投稿者/ みきぬ (59回)-(2008/09/03(Wed) 15:57:42)
No24478 (επιστημη さん) に返信
> >>どっちかっていうと、そっちの方が良くない気がします。
> >>動作モード的なプロパティを設けて、画面ではなくモード設定で制御の方がややお薦めです。
> >>
>>Nameプロパティよりも型で判別したほうが確実じゃないですか?
>>なぜ良くないとされるのかわかりません。
>
> [1] どこから呼ばれたか
> [2] どんな目的で呼ばれたか
>
この分類でいくと、Nameプロパティで比較する案も型で比較する案も[1]ですよね。
この2つを比べたときに、型で比較する方がNameプロパティで比較する方法よりよくないというのが
納得いかーん、ということなんですが。

# 元の質問も、Ownerプロパティの使用がキモチワルイという話ではなくて、
# Nameプロパティで比較することに違和感があっての質問だと思うし。

解決済み
引用返信 編集キー/
■24485 / inTopicNo.11)  Re[9]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1301回)-(2008/09/03(Wed) 16:03:00)
επιστημη さんの Web サイト
>>[1] どこから呼ばれたか
>>[2] どんな目的で呼ばれたか
>>
> この分類でいくと、Nameプロパティで比較する案も型で比較する案も[1]ですよね。
> この2つを比べたときに、型で比較する方がNameプロパティで比較する方法よりよくないというのが
> 納得いかーん、ということなんですが。

同じ型の複数のインスタンスがあり
それぞれが異なる目的で呼び出したとき区別がつかない、
ってこっちゃないでしょか。

Nameなら呼び出し元の名前を書き換えておくことができるけど
型だとどーしよーもないわけで。

# 憶測に過ぎんけど。

引用返信 編集キー/
■24486 / inTopicNo.12)  Re[9]: フォームの呼び元を判定したい
□投稿者/ たくボン (9回)-(2008/09/03(Wed) 16:07:48)
2008/09/03(Wed) 16:08:27 編集(投稿者)

No24483 (みきぬ さん) に返信
> # 元の質問も、Ownerプロパティの使用がキモチワルイという話ではなくて、
> # Nameプロパティで比較することに違和感があっての質問だと思うし。

Nameに変更があった場合、文字列で比較する場合はコンパイラで検出されない。型ならば検出される。定数・Tagも然り。
キモチ悪い云々より、将来的なことも考えてコーディングすべき。
コンパイラ以上の処理でソースの解析ができるなら別でうが、プログラマは本来そんな所に労力を使うべきではないと思いますよ(^-^)v
引用返信 編集キー/
■24489 / inTopicNo.13)  Re[10]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1302回)-(2008/09/03(Wed) 16:13:01)
επιστημη さんの Web サイト
> Nameに変更があった場合、文字列で比較する場合はコンパイラで検出されない。型ならば検出される。定数・Tagも然り。
> キモチ悪い云々より、将来的なことも考えてコーディングすべき。

異議あり。てゆっか、意図が明確でない限り断言しちゃいかんと思う。

"[1]どこから呼ばれたか"を意図するならばその通りだけど、
"[2]どんな目的で呼ばれたか"を意図するなら、それはプログラマが明示するもの。

# 型で判定すると どこから呼ばれたか ではなく どんな奴から呼ばれたか になるけども。

引用返信 編集キー/
■24492 / inTopicNo.14)  Re[1]: フォームの呼び元を判定したい
□投稿者/ 渋木宏明(ひどり) (869回)-(2008/09/03(Wed) 16:23:33)
渋木宏明(ひどり) さんの Web サイト
誰も書いてないので、一応。

> frmResult のボタンを押した時の処理を、呼ばれた画面によって分岐させたいと思っています。

なんてしちゃ駄目だと思う。

そんなことしたら、子が親の実装に強く依存しちゃうから。

もうどうにも後戻りができないということなら、落としどころとしては

>動作モード的なプロパティを設けて、画面ではなくモード設定で制御の方がややお薦めです。

てことでしょう。

モードを識別する enum を定義して、それを子のコンストラクタやプロパティに与える、とか。

場合によっては、そんなモードを作らないで、子フォームを2枚用意したっていんじゃね?と思う。

「(見た目が)似てるから」なんて軽い気持ちで派生関係を作っても、大して得るものはないんじゃないかと。

引用返信 編集キー/
■24494 / inTopicNo.15)  Re[2]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1304回)-(2008/09/03(Wed) 16:28:17)
επιστημη さんの Web サイト
>>frmResult のボタンを押した時の処理を、呼ばれた画面によって分岐させたいと思っています。
> なんてしちゃ駄目だと思う。
> そんなことしたら、子が親の実装に強く依存しちゃうから。

同意。

"[1] どこから呼ばれたか"は画面デザイン次第でコロコロ変わり得る。
"[2]どんな目的で呼ばれたか"はデザインに拠らない。

引用返信 編集キー/
■24495 / inTopicNo.16)  Re[10]: フォームの呼び元を判定したい
□投稿者/ ひろ (5回)-(2008/09/03(Wed) 16:28:33)
皆さんの意見が凄く参考になっています。

今回の質問の意図ですが、みきぬさんが書いてくださった

># 元の質問も、Ownerプロパティの使用がキモチワルイという話ではなくて、
># Nameプロパティで比較することに違和感があっての質問だと思うし。

が近い感じがします。
OwnerのNameプロパティで比較することに違和感があって気持ち悪かったです。あれ?


επιστημηさんが書いてくださった

>"[1]どこから呼ばれたか"を意図するならばその通りだけど、
>"[2]どんな目的で呼ばれたか"を意図するなら、それはプログラマが明示するもの。

ですけど、
今回の照会画面の場合、
 ・メニューから呼ばれた時は「通常の照会を行う」
 ・詳細から呼ばれた時は「通常の照会を行う + 照会結果をコピーして詳細に戻れる」
みたいなニュアンスです。
[1]と[2]の、どちらにも該当するような気がしています。
引用返信 編集キー/
■24496 / inTopicNo.17)  Re[11]: フォームの呼び元を判定したい
□投稿者/ επιστημη (1305回)-(2008/09/03(Wed) 16:32:18)
επιστημη さんの Web サイト

> 今回の照会画面の場合、
>  ・メニューから呼ばれた時は「通常の照会を行う」
>  ・詳細から呼ばれた時は「通常の照会を行う + 照会結果をコピーして詳細に戻れる」
> みたいなニュアンスです。
> [1]と[2]の、どちらにも該当するような気がしています。

僕なら迷わず[2]。
デザインはお客の機嫌でコロコロ変わることを想定します。
# "呼び出しボタン"が追加されたらどうします? とかね。

引用返信 編集キー/
■24497 / inTopicNo.18)  Re[2]: フォームの呼び元を判定したい
□投稿者/ みきぬ (60回)-(2008/09/03(Wed) 16:32:42)
2008/09/03(Wed) 16:35:33 編集(投稿者)

No24459 (ひろ さん) に返信
> frmResult のボタンを押した時の処理を、呼ばれた画面によって分岐させたいと思っています。
>
思いつきですが、分岐させてやりたかった処理を親画面側に持たせちゃって、
子画面はその分岐処理に必要な情報をプロパティで公開するってのはどうでせうか。


-----
返信する先がおかしかった&解決済み入れちゃってたのを修正(。。;;
引用返信 編集キー/
■24498 / inTopicNo.19)  Re[11]: フォームの呼び元を判定したい
□投稿者/ よねKEN (185回)-(2008/09/03(Wed) 16:39:27)
2008/09/03(Wed) 16:40:58 編集(投稿者)

> >"[1]どこから呼ばれたか"を意図するならばその通りだけど、
> >"[2]どんな目的で呼ばれたか"を意図するなら、それはプログラマが明示するもの。
>
> ですけど、
> 今回の照会画面の場合、
>  ・メニューから呼ばれた時は「通常の照会を行う」
>  ・詳細から呼ばれた時は「通常の照会を行う + 照会結果をコピーして詳細に戻れる」
> みたいなニュアンスです。
> [1]と[2]の、どちらにも該当するような気がしています。

それならば[1]に該当するのでなく、[2]に該当すると思います。

メニューから呼ぶ場合は、"照会だけできればよい"という意図があり、
詳細から呼ばれた場合は、"照会ができるだけでなく、照会結果の一部を後で利用する"という意図がある、
ということですから、「結果を利用するかどうか?」という目的の違いに依存していますよね。

後の仕様変更で、
・メニューから呼ぶ場合も結果を利用したくなる、ということはないと言い切れますか?
・メニュー/詳細以外の別の画面からも"照会だけできればよい"あるいは"結果も必要な照会をしたい"
となる可能性はないですか?

引用返信 編集キー/
■24501 / inTopicNo.20)  Re[11]: フォームの呼び元を判定したい
 
□投稿者/ たくボン (11回)-(2008/09/03(Wed) 17:06:56)
No24489 (επιστημη さん) に返信
>>Nameに変更があった場合、文字列で比較する場合はコンパイラで検出されない。型ならば検出される。定数・Tagも然り。

確かに断言までは言いすぎでしたね。

> # 型で判定すると どこから呼ばれたか ではなく どんな奴から呼ばれたか になるけども。
比較は型ですが、通常実装する場合は

if (this.Owner is Form1)
{
    Form1 frm = (Form1)this.Owner;
    // hoge
}
こんな感じだと思うので、この場合は「どこ」から呼ばれたかも特定できると思う。
処理の分岐は本来、呼び出し側で実装すべきだとは思わないので多用は避けるべきかも。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -