じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

不況すぎる件。

スポンサードリンク

運営サイト

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

書庫

なぜ Load イベントで判断する?

このような質問が後を絶ちません...

Load イベントで、表示するかどうかを判断して、表示する条件でない場合は Form を閉じたい。(表示しない)

待ってください、これは根本から間違っていると思います。表示することが決まっていないのであれば、Show メソッドを使わなければ良いですよね? 表示できる条件が整ったら Show メソッドを呼び出せばいいですよね?

Load されることを前提に考えるから、おかしくなるのだと思います。Load イベントは初めて表示される直前に発生するイベントです。表示されるかどうか決まっていないのですから、Load イベントではなく判断するためのメソッドを用意して、そのメソッド内で判断すべきです。

いや、アプリケーションの初期化も含まれるんですよ。

ならば、その Form に依存するものではないので、尚更におかしいでしょう。エントリ ポイントで検証メソッドを呼び出して、検証すれば良いじゃないですか? それとも、エントリ ポイントをご存知ないということでしょうか?

これも、Load されることを前提に考えるから、おかしくなるのです。前提が間違っていることに気付かないと、選択肢を狭めてしまいます。

今回は「2 例」を紹介したかったので、この形式になったのですが、実際のコミュニティでは、後者の質問は減少しています。後者は、エントリ ポイントの存在を気付かせれば、解決するからでしょう。

何も考えずに「これで実現できるからいいや」というノリで組むと、このような事態になります。できれば、コード レベルの仕様くらいは '考えてから' 組みましょう。

コード レベルの仕様 (構造とメソッドの実装場所など) はプログラマが決めるものです。これができないと「プログラマ」ではなく「コーダー」になってしまうでしょう。

ここで言う「コーダー」は、構文を理解し '仕様の実現はできる' 方々を指します。決して、打っているだけという「パンチャー」の意味合いはございません。

投稿日時 : 2006年2月12日 15:53

コメントを追加

# re: 何故 Load イベントで判断する? 2006/02/13 22:13 Jitta

 ああ、、、なんか、アホなことしているような気がしてきた orz

> エントリ ポイントで検証メソッドを呼び出して、検証すれば良いじゃないですか?
ですよね oTZ

# re: 何故 Load イベントで判断する? 2006/02/14 1:08 じゃんぬ

じ、Jitta さん?

# re: 何故 Load イベントで判断する? 2006/02/14 9:05 うなまな

>Load イベントではなく、メソッドに実装すべきものでしょう。

ですよね。(同じく。。。orz)

「Loadイベントで初期化」という考え方があるのは、私にも
責任があるような・・・
公開しているサンプルなどで、必ずと言っていいほど、Load
イベントで初期化の処理を実装しているからです。

まぁ、色々な所で公開されているサンプルなどは、あくまで
サンプルなので、短いコードで実装して、「見ている人に分かればいい」
的な考えなので、これを、そのまま見ている人が実装してしまうのも問題かな。。。

これからは気をつけます。。。

# re: 何故 Load イベントで判断する? 2006/02/14 9:11 福王寺聡明(FP!)

私は基本的に検証メソッドを作成します。でも、.net出始めの頃は結構Loadに突っ込んでいました。まぁ、適材適所ですから orz...

# re: 何故 Load イベントで判断する? 2006/02/14 9:39 じゃんぬ

>うなまな さん
確かにサンプルの場合は、コピペで動作可能にするためにそうすることがありますね。
この場合はメソッド化して Call する程度がいいんですかね?

>福王寺さん
構造化言語からのアレですよね。
検証というひとつの機能ですから。(^^)

# re: 何故 Load イベントで判断する? 2006/02/14 10:29 うなまな

>この場合はメソッド化して Call する程度がいいんですかね?
ちゃんと明示的に初期化処理を実装したものが理想なんですけどね。
この辺は、利用する側の方が、「初期化」をどう判断するかによると
思うので・・・

初期化処理が分かるようにコメントとして記載するのもありかな。

# re: 何故 Load イベントで判断する? 2006/02/14 12:27 じゃんぬ

Load イベントでは、Form に関する初期化は構わないのですから、
サンプル的には問題ないような気がします。(^^)

アプリケーション全体だと、そうですねー。
VB の場合はエントリ ポイントが勝手に作られないので、
最初に実行されるのが Load イベントだと誤解している方もいるので難しいですねー。

# re: 何故 Load イベントで判断する? 2006/02/14 12:28 じゃんぬ

といっても、初期化処理の結果で「やっぱり表示しない」は有無を言わさずダメですね。(^^)

Load させといて、何だよ! ってことです。
呼び出しておいて、待ち合わせ場所にいないのかよ! みたいな。

# re: 何故 Load イベントで判断する? 2006/02/14 16:53 特攻隊長まるるう

[VB6.0]時代から続く(←ゴメン、それ以前は触ったこと無いので知らんデス)
スタートアップの設定 Form1 、デザイン画面でフォームをダブルクリックして
書かれるデフォルトのイベントが Load イベントっていう、『ここに書け!』と
言わんばかりの仕様も問題かと思います。…が、初心者が適当に作って
なんとなく動いてしまう『VBらしさ』はこれで良いのかなぁ?と思ってみたりw

きれいなコードを書くにはやっぱりオブジェクトの扱い方とか、概念がしっかり
してこないとダメでしょ。…勉強してもらわないと。
>*「Load イベントで初期化して、失敗した時は Form を表示したくない」
逆にプログラマのレベルを知る素材となる言葉…と見切ってしまうのもアリかと。

# re: 何故 Load イベントで判断する? 2006/02/14 17:49 じゃんぬ

>特攻隊長まるるうさん

同感です。私も書いたように、

> > VB の場合はエントリ ポイントが勝手に作られないので、
> > 最初に実行されるのが Load イベントだと誤解している方もいるので難しいですねー。

これが問題かなぁって思います。

少なくともプログラマ職である方は素人ではないハズ (素人であってはいけない) ので、意識はして欲しいですね。
万人に求めてはいけないという点でも同意です。

# re: 何故 Load イベントで判断する? 2006/02/15 14:48 Moo

Form_Loadが500行なソースのレビューしたくない...

# re: 何故 Load イベントで判断する? 2006/02/15 22:23 オノデラ

 うちのサンプル全部直さないと…orz _O_

# re: 何故 Load イベントで判断する? 2006/02/16 20:23 がる

は~い。門外漢からの素朴な質問でっす。
今回の話とかって「こうやるのがスタンダードな手順」みないな記述とか推奨パターンとかってどこかで提示されていないものなんですか?
いあ、プログラムのエントリーポイントと初期化の問題って(そこから更に終了時のお掃除処理とか)、結構重要だと思ってるので。
# 特にデーモン作ってHUPシグナル捕捉タイミングとかkill系シグナル捕捉タイミングとかで(苦笑

# re: 何故 Load イベントで判断する? 2006/02/17 22:21 Jitta

> 2006/02/14 1:08 じゃんぬさん
 ブログのネタにするのでその時、と思っていたのですが、当分書けそうにないので。

 ライセンスのチェックをね、しようと思って。「ライセンスがない」という判断を、
* ライセンスファイルが書き換えられている(異常)
* 試用期間を過ぎている(異常)
* 試用期間内(正常)
で判断し、異常なときはメッセージウインドウを出して終了、したかったんですね。
 で、Load イベントで Activate イベントハンドラ登録して、Activate でハンドラ削除、その後にチェック、をしています。Form のインスタンスがなくても、MessageBox を表示することは出来ますね。。。
 しっかし、ちゃんと「コンストラクタで」って書いてあるじゃないか→参考にした記事
http://japan.internet.com/developer/20051011/29.html


> 「Loadイベントで初期化」という考え方があるのは、私にも
> 責任があるような・・・
 一番重いのはマイクロソフト。自動生成されるコードに「初期化するコードをここに書きます」と、コメントが入っている。。。

# re: 何故 Load イベントで判断する? 2006/02/19 14:30 じゃんぬ

> 自動生成されるコードに「初期化するコードをここに書きます」と、コメントが入っている。。。

クラスである以上、「このクラスのメンバを初期化するコード~」になるでしょうね。
私は脳内変換してそのように読み取っていましたが、そうでない人もいるのでしょう。
確かに「このクラスのメンバを」と表記して欲しいですね。

# re: 何故 Load イベントで判断する? 2006/09/06 21:53 おしょう

はじめまして。

私の理解ではフォームであろうが一つのクラスであり、本来
クラスインスタンスが生成(New)されたときに初期化するべき
処理を列挙していくというのがあるべきなのかと理解しており
ました。
 初期化処理も、フォームを表示した後に再度利用する場合を
考えれば、一つのメソッドとして記述することで簡単に再利用
できると思います。

 例:Form Load ↓
      Call (テキストボックスを初期化する処理)
       ・
       ・
   Bottun1 Click ↓
      Call(テキストボックスを初期化する処理)

ただ、入門書は結構Loadイベントで記述されているので
そういうものだと思いこんでましたね。

# re: 何故 Load イベントで判断する? 2006/09/06 21:58 中博俊

コンストラクタではやっちゃいかんのです。
#詳細は割愛
でLoadでやってもいいんです。
そのまま表示させたくないとかわがまま言わなければ。

MFCではフォーム系の前に初期処理をして音みたいに欠いてますが。(^^;;

#  [Form Load Event]で初期化する問題 2006/09/12 18:23 Ognacの雑感

[Form Load Event]で初期化する問題

# Form_Loadイベントに関する雑感 2006/09/22 1:08 ひよっこプログラミング

Form_Loadイベントに関する雑感

# re: なぜ Load イベントで判断する? 2007/03/06 13:13 biac

いまさら便乗 f(^^;
ASP.NET では、 「なぜ Load イベントで描画する? 」 って話も。
http://akari.kabe.co.jp/MagSite/Content.modf?id=20070306124808

# re: なぜ Load イベントで判断する? 2007/12/22 14:37 123

した不利かげてない

タイトル  
名前  
URL
コメント