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

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

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

Re[2]: コンストラクタとForm_Loadについて


(過去ログ 66 を表示中)

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

■38433 / inTopicNo.1)  コンストラクタとForm_Loadについて
  
□投稿者/ tetora (1回)-(2009/07/14(Tue) 15:47:22)

分類:[C#] 

コンストラクタとForm_Loadについて質問させてください。

C#でWindowsフォームを作るとコンストラクタはあるのに
Form1_Load はないですね

これは Form1_Load に書くようなことはコンストラクタに
書きなさい、ってことなのでしょうか?

たとえばデザイナで適当に並べたコントロールの位置を
Location でコードを書いて整列したいときなどは
コンストラクタか Form1_Loadか迷うのですが・・

こんな場合どう考えるのか、また分けて記述する事の
意義があれば教えていただきたいのですが

よろしくおねがいします。
引用返信 編集キー/
■38435 / inTopicNo.2)  Re[1]: コンストラクタとForm_Loadについて
□投稿者/ 囚人 (394回)-(2009/07/14(Tue) 16:14:40)
コンストラクタはインスタンスが作られるときに一回だけ呼ばれるモノです。
Load は Show か ShowDialog だったかどっちか忘れましたけど、表示する度に呼ばれるモノです(Show と ShowDialog で挙動が違ったはず)
なので、同じインスタンスを表示して隠して表示して、を繰り返すなら明らかに違いますよね。
引用返信 編集キー/
■38436 / inTopicNo.3)  Re[1]: コンストラクタとForm_Loadについて
□投稿者/ みきぬ (533回)-(2009/07/14(Tue) 16:27:23)
2009/07/14(Tue) 16:35:00 編集(投稿者)

No38435 (囚人 さん) に返信
> コンストラクタはインスタンスが作られるときに一回だけ呼ばれるモノです。
> Load は Show か ShowDialog だったかどっちか忘れましたけど、表示する度に呼ばれるモノです(Show と ShowDialog で挙動が違ったはず)

Show() は、1つのウインドウを見せたり隠したりしているだけなので、最初の1回だけ呼ばれます。
ShowDialog() はインスタンスとしては使い回しているように見えますが、内部的には毎回ウインドウハンドル? をこしらえているので、毎回呼ばれます。
…といったような話をどこかで見かけた記憶があります。

[補記]
↓ここでした。
http://d.hatena.ne.jp/Kazzz/20070913/p4
引用返信 編集キー/
■38437 / inTopicNo.4)  Re[2]: コンストラクタとForm_Loadについて
□投稿者/ aetos (183回)-(2009/07/14(Tue) 16:31:04)
aetos さんの Web サイト
No38435 (囚人 さん) に返信
> コンストラクタはインスタンスが作られるときに一回だけ呼ばれるモノです。
> Load は Show か ShowDialog だったかどっちか忘れましたけど、表示する度に呼ばれるモノです(Show と ShowDialog で挙動が違ったはず)
> なので、同じインスタンスを表示して隠して表示して、を繰り返すなら明らかに違いますよね。

ちょいと違うというか、誤解を招きかねないというか。

コンストラクタについては OK です。new した時に呼ばれるもの。

で、フォームを非表示にする方法は2つあります。
ひとつは Close、または×ボタン。
もうひとつは Hide。
「同じインスタンスを表示して隠して表示して」と言うと Hide を連想しますが、Hide と Show を何度繰り返しても、Load が発生するのは最初の Show の時だけです。

フォームを表示する方法も2つあります。
ひとつは Show、もうひとつは ShowDialog。
Show で表示したものを Close か×ボタンで閉じると、Dispose されます。そのため、同じインスタンスを再度表示することはできません。
ShowDialog で表示したものを Close か×ボタンで閉じると、Dispose されません。そのため、同じインスタンスを再度 Show できます。
ShowDialog、Close、再度 ShowDialog とやると、ShowDialog の都度、Load が発生します。
引用返信 編集キー/
■38438 / inTopicNo.5)  Re[1]: コンストラクタとForm_Loadについて
□投稿者/ よねKEN (373回)-(2009/07/14(Tue) 17:14:20)
2009/07/14(Tue) 17:15:22 編集(投稿者)

> C#でWindowsフォームを作るとコンストラクタはあるのに
> Form1_Load はないですね
>
> これは Form1_Load に書くようなことはコンストラクタに
> 書きなさい、ってことなのでしょうか?

そんな意図が込められたものではないと思います。
Buttonを配置したからといって、ButtonのClickイベント用のハンドラは自動作成されませんよね。
FormのLoadイベントのハンドラが自動作成されないのも同じようなものかと思います。

> たとえばデザイナで適当に並べたコントロールの位置を
> Location でコードを書いて整列したいときなどは
> コンストラクタか Form1_Loadか迷うのですが・・

私の場合ですが、Visual Studioで開発しているなら、Loadイベントで書く、
VSを使わずすべて手書きで書いているような場合は、
あえてLoadイベントを使う必要もないことが多いので、コンストラクタで書くことが多いかも。

> こんな場合どう考えるのか、また分けて記述する事の
> 意義があれば教えていただきたいのですが

コンストラクタの中だとまだ各コントロールのウインドウハンドルが生成されていないかもしれませんので、
判断に迷うならたいていはLoadイベントで書いておいて問題ないと思いますよ。
#もちろん他の方のご指摘にあるように1度しか呼ばれない場合や何度も呼ばれる場合
#など正しく動作を把握しておく必要はあるでしょうけど

引用返信 編集キー/
■38439 / inTopicNo.6)  Re[2]: コンストラクタとForm_Loadについて
□投稿者/ tetora (2回)-(2009/07/14(Tue) 17:42:45)
No38438 (よねKEN さん) に返信
> 2009/07/14(Tue) 17:15:22 編集(投稿者)

囚人さん、みきぬさん、aetosさん、よねKENさん
まとめレスですみません

コンストラクタは new した時だけ
Load1_Form については、みなさんのコメントと
みきぬさんの紹介してくださったリンク先が大変参考になりました。
奥が深いですね・・・

みなさんありがとうございました。m(_ _)m

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -