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

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

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

Formクラス生成のタイミングについて

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

■85472 / inTopicNo.1)  Formクラス生成のタイミングについて
  
□投稿者/ ごう (1回)-(2017/10/26(Thu) 17:30:25)

分類:[C#] 

C# (Visual Studio 2013)を使って
Form_LoadイベントでForm_Closeイベントをコールする実装を見つけました。

Loadイベント実行時は、Formの生成はされていないという認識なのですが
そうだと言い切れる資料を見つけることができていません。

参考
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.load(v=vs.110).aspx

Formクラス生成のタイミングについて客観的に説明ができる資料について教えていただけないでしょうか。
もしくはLoadイベント内で(生成されているかどうか分からない)Formクラスを閉じる実装は
おかしいという点について教えていただけないでしょうか。
引用返信 編集キー/
■85473 / inTopicNo.2)  Re[1]: Formクラス生成のタイミングについて
□投稿者/ WebSurfer (1327回)-(2017/10/26(Thu) 18:51:05)
No85472 (ごう さん) に返信
>
> Loadイベント実行時は、Formの生成はされていないという認識なのですが

その「生成」というのは具体的にどういう意味ですか? 質問者さんがどういう意味で使っているか教えて下さい。
引用返信 編集キー/
■85474 / inTopicNo.3)  Re[2]: Formクラス生成のタイミングについて
□投稿者/ 774RR (570回)-(2017/10/26(Thu) 19:11:38)
Win32 API でいうところの HWND が生成されたか否か (CreateWindowEx) ということであると解釈して

https://msdn.microsoft.com/ja-jp/library/86faxx0d.aspx
によると
・ハンドルが作られたら Control.HandleCreated イベントが発生 (このハンドルが HWND の意味と解釈し)
・最初に表示される直前に Form.Load が発生
なので Form.Load の時点ではフォーム(のための HWND)は生成済みと解釈すべきだろう。

MFC の CDialog とかだとコンストラクタの時点では HWND は無くて OnInitDialog 時点ではあるわけで
同じようなことだと思う。

Form.Load の時点で this.Close() するのはオイラもやったことあるしデバッガは文句言わなかったっす。
this.Close() を呼ぶことで .NET Framework 中から Form_Close イベントが発生するので
Form_Close イベントを「自分で呼ぶ」のは限りなく間違っていると思う。

引用返信 編集キー/
■85475 / inTopicNo.4)  Re[3]: Formクラス生成のタイミングについて
□投稿者/ PANG2 (193回)-(2017/10/26(Thu) 22:07:56)
>Formクラス生成のタイミングについて客観的に説明ができる資料について教えていただけないでしょうか。

Formのインスタンスが作成されるのは newしたとき(コンストラクタ)です。
ウインドウが生成されるタイミングは HandleCreated イベントでしょう。

--
Windows フォームのイベントの順序
https://msdn.microsoft.com/ja-jp/library/86faxx0d(v=vs.110).aspx

HandleCreated
BindingContextChanged
Load
VisibleChanged
Activated
Shown
--
System.Windows.Forms.Loadイベントは一度だけとは限らない
http://d.hatena.ne.jp/Kazzz/20070913/p4

Form1 frm1 = new Form1();
frm1.ShowDialog();
frm1.ShowDialog();
frm1.ShowDialog();

このコードを実行すると,ShowDialog のたびにウィンドウの生成の破棄が行われます.(実際 frm1.Handle をダンプしてみると一目瞭然)
引用返信 編集キー/
■85476 / inTopicNo.5)  Re[1]: Formクラス生成のタイミングについて
□投稿者/ shu (1062回)-(2017/10/27(Fri) 07:01:05)
No85472 (ごう さん) に返信
> C# (Visual Studio 2013)を使って
> Form_LoadイベントでForm_Closeイベントをコールする実装を見つけました。
>
> Loadイベント実行時は、Formの生成はされていないという認識なのですが
> そうだと言い切れる資料を見つけることができていません。
>
> 参考
> https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.load(v=vs.110).aspx
>
> Formクラス生成のタイミングについて客観的に説明ができる資料について教えていただけないでしょうか。
> もしくはLoadイベント内で(生成されているかどうか分からない)Formクラスを閉じる実装は
> おかしいという点について教えていただけないでしょうか。

目的はなんでしょうか?
フォームが画面に表示されるまえに条件判断とかして開くのをやめるなら
new

判定メソッド ─ ok → ShowまたはShowDialog
↓ NG
Dispose
でよいですよ



引用返信 編集キー/
■85477 / inTopicNo.6)  Re[1]: Formクラス生成のタイミングについて
□投稿者/ Jitta (330回)-(2017/10/27(Fri) 11:04:37)
No85472 (ごう さん) に返信
> C# (Visual Studio 2013)を使って
> Form_LoadイベントでForm_Closeイベントをコールする実装を見つけました。
>
>
> Formクラス生成のタイミングについて客観的に説明ができる資料について教えていただけないでしょうか。
> もしくはLoadイベント内で(生成されているかどうか分からない)Formクラス

他の人が書いたコードがおかしいと思うが、おかしい理由づけをしたい、
という意図と理解します。

イベントハンドラを、イベント発生機構以外から呼び出すのは、
ハンドラのobjectから外れます。
object oriented 設計をするのなら、
そのようなコーディングはするべきではありません。

とりあえず、メインフォーム以外で、
色々なハンドラやメソッド呼び出しをログしてみて下さい。
Loadイベント 、Showメソッド呼び出し前、Shownイベント、
Closingイベント、Closedイベントあたりかな。
要は、Showメソッド呼び出しとLoad イベント発生のどちらが先か、です。


引用返信 編集キー/
■85478 / inTopicNo.7)  Re[2]: Formクラス生成のタイミングについて
□投稿者/ ぶなっぷ (133回)-(2017/10/28(Sat) 15:10:17)
話が2方向に分かれている気がするので、ちょっとまとめてみます。

議題になっているのは以下の2点。
 1) Loadメッセージハンドラから、いきなりCloseしていいのか?
 2) いきなり、Closeメッセージハンドラを呼んで良いのか?

答えは、
 1)は全く問題ない。
 2)は結果として問題ない場合も多いだろうが、
   いつ問題が起きるか分からないので、やるべきではない。

なので、好ましいのは、
Form_Loadイベントハンドラから、Close()メソッドを呼ぶことにより
結果として、Form_Closeイベントハンドラが呼ばれる
という形です。

引用返信 編集キー/
■85479 / inTopicNo.8)  Re[3]: Formクラス生成のタイミングについて
□投稿者/ 774RR (571回)-(2017/10/28(Sat) 19:40:59)
Form_Load で「何を」扱おうとしているのか元発言にわかりやすく書かれていないのでブレるのは仕方ないかも。

自分自身、つまり this が指しているところの Form1 を扱おうとしているのか
別 Form2 を扱おうとしているのか
(今回の話では「閉じる」であるわけですが)

前者であるならぶなっぷ氏のまとめの通りっす

まあ厳密にいうと FormClose というイベントは無くて FormClosing と FormClosed があるわけですが。
FormClosed ハンドラを直接自分で呼んで後始末をしてしまうと
FormClosing で閉じるをキャンセルを実装したくなってもできない、ってことになりそうな気のせいがして
やっぱダメっしょ。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ