DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームLoad時のフォーム利用判断

環境/言語:[VB.NET]
分類:[.NET]

はじめまして

このたび初の.net開発となりました
よろしければご教授・ご意見をお願いします

疑問点:
フォームの呼び出し時に与えられたパラメータから詳細データを取得し、
データの状態によってそのフォームを利用できるかどうか
(利用できない→即時フォーム終了[できればチラリとも見せない])
という動きを行いたいのですが

フォームのLoadイベント内で詳細データの取得、判定を行い
同イベント内に「me.close」を記述するのは
一般的なものなのでしょうか?
「me.despose」でもフォームの終了はできるようですが…
※ 呼び出し元が複数となる可能性があるので、呼び出される側で
  データ判定をしたいと思っています

できるだけスマート&一般的な手順を踏みたいと思っております
「その動作をするなら、[xxxx]のメソッドを使え」のご指南を
いただけませんでしょうか

どうぞよろしくお願いします
おせわになります。

■No15333に返信(美晴@.net初心者さんの記事)
> 疑問点:
> フォームの呼び出し時に与えられたパラメータから詳細データを取得し、
> データの状態によってそのフォームを利用できるかどうか
> (利用できない→即時フォーム終了[できればチラリとも見せない])
> という動きを行いたいのですが
>
> フォームのLoadイベント内で詳細データの取得、判定を行い
> 同イベント内に「me.close」を記述するのは
> 一般的なものなのでしょうか?
> 「me.despose」でもフォームの終了はできるようですが…
> ※ 呼び出し元が複数となる可能性があるので、呼び出される側で
>   データ判定をしたいと思っています
>
> できるだけスマート&一般的な手順を踏みたいと思っております
> 「その動作をするなら、[xxxx]のメソッドを使え」のご指南を
> いただけませんでしょうか
>
> どうぞよろしくお願いします

一般的な手順はわかりませんが、やはり Load で判定するのはよくないと思います。
チラリとも見せないのであれば、なおさらでしょう。

複数のフォームから呼び出す可能性があるのであれば、
「その画面呼出し用クラス」みたいなのを用意し、
みんなが、その画面呼出し用クラス.画面Show() みたいなメソッドを介して
呼ぶのはいかがでしょう。
その 画面Show() メソッドの中で、データの状態を判定した後、表示するのであれば
画面表示、表示しないのであれば、それで終わり。

要は直接呼ばせないで、仲介役を用意すればよいのでは?
という提案です。
何故 Load イベントで判断する?
http://blogs.wankuma.com/jeanne/archive/2006/02/12/21205.aspx
オブジェクトは閉じられた世界です。自分のことしか知りません。

次について考えてみてください。
・ある機能において判断の結果の成果物がフォームである。その機能とはアプリケーションの仕様かはたまたフォームの仕様か?
・フォームは閉じられた世界、つまり「表示」を目的としたオブジェクトである。
・Loadは表示される(目に見える)直前に通知されるイベントである。>表示されるという事実がそこにある。
> ・Loadは表示される(目に見える)直前に通知されるイベントである。>表示されるという事実がそこにある。

でも、これを言ってしまうと、FormClosingイベントでCancel = trueの立場がないような気がする。(^^;;;
■No15340に返信(trapemiyaさんの記事)
> でも、これを言ってしまうと、FormClosingイベントでCancel = trueの立場がないような気がする。(^^;;;

えーと、

> > 表示されるという事実がそこにある。

だけで見ちゃうとそういう見方ができてしまうのでフォローです。

'新たに' 作成するコストと、消滅することをキャンセルするのとではコストが全然違います。

消滅はいずれされることですし、キャンセルすることでコストはかかりません。
新たに作成する場合はコストが生じます。

作成することへの 'キャンセル' をしているわけではなく、
作っておいて破棄しているわけですから「ムダ」にコストがかかっています。
最初から作らないでください論は正しいと言えるでしょう。
(「良い冗長」と「ムダ」は非なるものです)

という意味で、書いた方が良いのでしょうけど、簡潔にかける事柄じゃないですね。(^^)
>>でも、これを言ってしまうと、FormClosingイベントでCancel = trueの立場がないような気がする。(^^;;;

> '新たに' 作成するコストと、消滅することをキャンセルするのとではコストが全然違います。

違う言い方をすれば、
一連のイベントが終わり入力待機状態後で完全に関係が切れてますから、
立場というより目的が違うということですね。
なおこ(・∀・) 様
じゃんぬねっと様
まどか様
trapemiya様

当方の疑問にお答えいただきありがとうございました

やはりLoadでフォームを消すのはヨロシクナイ行動(コード)なのですね(^^;)
表示判定専用のクラスを用意して、そちらでデータを判定後に
フォームを表示するようなかたちで作成することにしました

ご意見・ご指摘・参照情報をいただきありがとうございました

P.S.
一度返信文を書き、送信したら同じ記事がぞろぞろ投稿されてしまいました
ダブっている投稿を削除したら全部消えました…
この掲示板はそんな仕様なのでしょうか(汗)
解決済み!
■> P.S.
> 一度返信文を書き、送信したら同じ記事がぞろぞろ投稿されてしまいました
> ダブっている投稿を削除したら全部消えました…
> この掲示板はそんな仕様なのでしょうか(汗)

たまにそういうことがあるようです。大変申し訳ありませんが、現状では、同じ番号の記事が複数表示された場合は、削除しない方がいいというアドバイスしかできません。(ログを直接編集し、直しておきました。)修正をしたいのですが、この掲示板は私が作ったものではなく、しかもどのような状況でこのような現象が起こるのかわからないため、修正はかなり困難で、時間がかかりそうです。ご迷惑をおかけして、申し訳ありません。
解決済み!
> やはりLoadでフォームを消すのはヨロシクナイ行動(コード)なのですね(^^;)

今まで説明があったように、一般的にそのようなコードは書きません。ただ、純粋に、Loadイベントの中でCloseを呼び出すことは技術的によくないのか?ということが私もはっきりわかりませんでした。海外の掲示板でMSFTの方が、問題なく動くよというコメントを見つけましたが、それが技術的に裏づけされているかどうかはわかりませんでした。

今回、判定用のクラスを別に作成されたようですが、じゃんぬさんが言われるようにフォームにメソッドを作成して、その中で判断してShowするかどうかを決定する方法もあります。今回のケースは、オブジェクトの振る舞いはそのオブジェクト自身に判断させるという方法論が適しているように思います。

コストを求めてプログラミングすることも大事ですが、保守性を犠牲にしても良いわけではありません。要は、バランスです。人間が気にならないほどのコスト差であれば、保守性を一般には優先するでしょう。
でも、はじめからあまり細かいことを気にしていたらプログラム書けないんで、とりあえず動いているなら先に進みましょう。
いずれ、自分の書いたプログラムを振り返ってみて、ぽっとはずかしくなることはみなさんが経験していることですから。私ももちろん、例外じゃありません。(^^;
解決済み!
>ただ、純粋に、Loadイベントの中でCloseを呼び出すことは技術的によくないのか?ということが私もはっきりわかりませんでした。

Form.Load は「ウィンドウとしての実体化が完了したこと」を示すイベントなので、イベントハンドラ内で Close() するのは問題ないと思います。

>オブジェクトの振る舞いはそのオブジェクト自身に判断させるという方法論が適しているように思います。

ある Form についてだけの判断だったり、その Form だけで判断が完結する場合は「判断」のロジックを Form に実装してもいいと思います。

が、複数の Form 実装に対して横断的に判断する場合や、判断がその Form クラス内だけで完結しないような場合は、無理くり Form に収めるよりは外出しした方が自然ですね。
> Form.Load は「ウィンドウとしての実体化が完了したこと」を示すイベントなので、イベントハンドラ内で Close() するのは問題ないと思います。

#実際の実装がどうなっているかはわかりませんが、、、
「表示される直前」の解釈からすると、イベントの呼び出し側は
Private Sub XXX()
RaiseEvent Load()
Me.Visible = True ※1
End Sub
というイメージがわきます。
このことからすると、Load内でのMe.Close→※1という流れになるので
私的には違和感を感じています。
旧VB6ではLoadでSetFocusをするとエラーになりました。
私はこのエラーの印象が強烈ですので自然に先の違和感に通じてしまいます。
#以上、反論ではありません。
解決済み!
> Form.Load は「ウィンドウとしての実体化が完了したこと」を示すイベントなので、イベントハンドラ内で Close() するのは問題ないと思います。

私もテストした結果などを踏まえた上で、問題ないだろうとは思っています。でも、ひどりさんに言われると心強いです。(^^
解決済み!
■No15369に返信(まどかさんの記事)
> 私はこのエラーの印象が強烈ですので自然に先の違和感に通じてしまいます。
> #以上、反論ではありません。

私もLoadイベントでCloseするのは何となく違和感があります。それで技術的にどうなんだろうと純粋に疑問に思ったわけです。技術的に問題なければ、自分の違和感という感覚を修正しなきゃいけないなと思いました。
いや、LoadイベントでCloseを推薦しているわけではありません。(^^;
解決済み!
2006/04/20(Thu) 11:07:04 編集(投稿者)

> 私もLoadイベントでCloseするのは何となく違和感があります。

違和感と言うべきなのかどうか分かりませんが、「Load イベント内で Close すること」が必要なシナリオが考え付きません。

どなたかが既に書いていたような気もしますが、Load イベント内で Close するくらいなら、はじめから Show しなければいいのでは?と思います。
■No15335に返信(じゃんぬねっとさんの記事)
> 何故 Load イベントで判断する?
> http://blogs.wankuma.com/jeanne/archive/2006/02/12/21205.aspx
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板