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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.85472 の関連記事表示

<< 0 >>
■85472  Formクラス生成のタイミングについて
□投稿者/ ごう -(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クラスを閉じる実装は
    おかしいという点について教えていただけないでしょうか。
親記事 /過去ログ146より / 関連記事表示
削除チェック/

■85473  Re[1]: Formクラス生成のタイミングについて
□投稿者/ WebSurfer -(2017/10/26(Thu) 18:51:05)
    No85472 (ごう さん) に返信
    >
    > Loadイベント実行時は、Formの生成はされていないという認識なのですが

    その「生成」というのは具体的にどういう意味ですか? 質問者さんがどういう意味で使っているか教えて下さい。
記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85474  Re[2]: Formクラス生成のタイミングについて
□投稿者/ 774RR -(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 イベントを「自分で呼ぶ」のは限りなく間違っていると思う。
記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85475  Re[3]: Formクラス生成のタイミングについて
□投稿者/ PANG2 -(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 をダンプしてみると一目瞭然)
記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85476  Re[1]: Formクラス生成のタイミングについて
□投稿者/ shu -(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
    でよいですよ


記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85477  Re[1]: Formクラス生成のタイミングについて
□投稿者/ Jitta -(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 イベント発生のどちらが先か、です。

記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85478  Re[2]: Formクラス生成のタイミングについて
□投稿者/ ぶなっぷ -(2017/10/28(Sat) 15:10:17)
    話が2方向に分かれている気がするので、ちょっとまとめてみます。
    
    議題になっているのは以下の2点。
     1) Loadメッセージハンドラから、いきなりCloseしていいのか?
     2) いきなり、Closeメッセージハンドラを呼んで良いのか?
    
    答えは、
     1)は全く問題ない。
     2)は結果として問題ない場合も多いだろうが、
       いつ問題が起きるか分からないので、やるべきではない。
    
    なので、好ましいのは、
    Form_Loadイベントハンドラから、Close()メソッドを呼ぶことにより
    結果として、Form_Closeイベントハンドラが呼ばれる
    という形です。
    
記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/

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

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

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

    まあ厳密にいうと FormClose というイベントは無くて FormClosing と FormClosed があるわけですが。
    FormClosed ハンドラを直接自分で呼んで後始末をしてしまうと
    FormClosing で閉じるをキャンセルを実装したくなってもできない、ってことになりそうな気のせいがして
    やっぱダメっしょ。
記事No.85472 のレス /過去ログ146より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -