- - PR -
WindowsFormの状態を保持するには?
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-01-09 11:34
モーダルで表示すると、DialogResultプロパティを設定してもフォームは“消え”ます。MSDNによると、
CloseメソッドがDisposeメソッドと全く同等の処理を行う必要はなく、モーダルの場合は「Closeは「非表示」という意味である」と解釈すれば、Closeメソッド内でモーダルかモードレスかを判別し、処理を振り分けてもガイドラインに沿っていることになると思います。先に参照したページでも、「Close何タラではなく、Disposeだ」と書かれているとおりではないでしょうか。 Disposeメソッドは複数回コールされることを前提にコーディングされるべきであり、なんど呼んでもそのことによる不都合はありません。 ### http://www.users.gr.jp/ml/archive/list.aspx?name=aspx&no=3301 この後、3320くらいからだったんだよなぁ | ||||||||||||
|
投稿日時: 2004-01-09 12:28
Jittaさん、こんにちは。
MSDN Library のリリースで微妙に違いますね。 2003年10月リリースでは ms-help://MS.VSCC/MS.MSDNQTR.2003OCT. 〜 でした。
ShowDialog で 表示したフォームは、 1)DialogResult プロパティが DialogResult.None 以外のボタンをクリックした場合 2)Hide() または Close() を呼び出した場合 3)フォームのVisibleプロパティに False を指定した場合 4)フォームの DialogResult プロパティに DialogResult.None 以外を指定した場合 5)×ボタンやAlt + F4 等を使用した場合 の全てで、同一の挙動を示すように設計されていたんですね。 # 当然といえば当然か...。 しかし、という事は何も悩む必要は無いわけですよねぇ。 元質問の
というのは、どこから聞いた話なんでしょうか...。 | ||||||||||||
|
投稿日時: 2004-01-09 20:20
外出先から戻ってきて、ようやくここを見ることが出来ました。
みなさんたくさんの返信ありがとうございます。
私も始めて知りました。てっきり処理が戻ってこないものだと・・・ しかし、ShowDialogした後にHideして、再びShowDialogするのはあまり良くないかもしれません。 再びShowDialogした後ですと、ToolTipやMouseHoverイベントが無効になってしまいます。(これも想定外の使い方??)
これはMicrosoftの方に聞きました。 このことを知らずにアプリケーションを作ってしまったばっかりにアプリケーションの制御構造を変更する必要に迫られてしまい、今回のスレッドを立てた次第です。 これって、Windowsプログラマの中では常識なのでしょうか? Closeした後にShowDialogしてはならないなら、Closeした後にはShowDialog出来ないようにするとか、ShowDialogすると例外を出すとか、そういう構造になっていてしかるべきだと思うのですが・・・。 | ||||||||||||
|
投稿日時: 2004-01-09 21:51
Hiroさん、こんばんは。
なんと! そんな制限(?)があったとは...。
どうなんでしょう。私は初めて聞きました。 というか、モーダルなフォームを Close しても破棄されないという事自体、知りませんでしたし。 という事で、 【方法1】 ShowDialog()から制御が戻った際に、データを受け取ってからDispose()する。再度表示する場合は新しいインスタンスを生成して、保持しているデータを元に内容を復元する。 【方法2】 以前の投稿で提案したように、ShowDialog()は使わずにイベントとかデリゲートとかで制御クラスに通知して画面の遷移を行う。 とかじゃないですかねぇ。 | ||||||||||||
|
投稿日時: 2004-01-10 00:46
諸農です。
スレッドとは直接関係ありません。すみません。
ですが、ウチはMSDN(最新の10月リリース分を入れています)と統合しているせいか、 VS2002の場合は ms-help://MS.VSCC/MS.MSDNQTR.2003OCT.1041/cpref/html/frlrfSystemWindowsFormsFormClassDialogResultTopic.htm VS2003の場合は ms-help://MS.VSCC.2003/MS.MSDNQTR.2003OCT.1041/cpref/html/frlrfSystemWindowsFormsFormClassDialogResultTopic.htm と言う感じで、OCTに変わっています。 あと、ドキュメントアップデートも行っています。 HELPからの引用は、FCL SDKのアドレスの方がいいのかもしれないですね。 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-10 01:02
こんな感じではいかがですか?
// Form1 ... [STAThread] static void Main() { Application.Run(new Form1()); } private Form2 _frmForm2 = null; private void btnNext_Click(object sender, System.EventArgs e) { if(_frmForm2 == null || _frmForm2.IsDisposed) { _frmForm2 = new Form2(); _frmForm2.Owner = this; } _frmForm2.Show(); this.Hide(); } ... // Form2 ... private Form3 _frmForm3 = null; private void btnNext_Click(object sender, System.EventArgs e) { if(_frmForm3 == null || _frmForm3.IsDisposed) { _frmForm3 = new Form3(); _frmForm3.Owner = this; } _frmForm3.Show(); this.Hide(); } private void btnBack_Click(object sender, System.EventArgs e) { this.Owner.Show(); this.Close(); } ... // Form3 ... private void btnBack_Click(object sender, System.EventArgs e) { this.Owner.Show(); this.Close(); } ... [ メッセージ編集済み 編集者: iStation 編集日時 2004-01-10 08:41 ] | ||||||||||||
|
投稿日時: 2004-01-12 18:29
このようなケースの場合は、私は方法1より方法2の方がいいと思うのですが、 ただ、デリゲートではなくクラスを使った"委譲"の方がいいのかな?と思いました。 一応、サンプルを。
このサンプルではパラメータを object 型で受け渡していますが、 できればパラメータ用のクラスを作ってそれを受け渡した方が良いかも知れません。 あと、パラメータを受け取ったら適切な型にキャストして使います。 ふと思ったのですが、方法2を使う場合、制御クラスを作るメリットが あまり感じられないのは私だけでしょうか? #直接フォームを表示してもいいような・・・。 | ||||||||||||
|
投稿日時: 2004-01-13 13:17
架空兎さん、こんにちは。
うーん、どうなんでしょう。 ビジネスロジックとかを制御クラスに集約して、各フォーム側は自身のUI制御のみに徹する作りにすれば、「見通しの良さ」が確保出来るかなぁ、とか、(汎用的なフォームなら)部品として外に出せるかなぁ、とか思いますけど。 ま、ケース・バイ・ケースでしょうか...。 | ||||||||||||
