DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FormLoadでFormCloseを行いたい

環境/言語:[XP, VB.NET, NET Framework1.1]
分類:[.NET]

いつもお世話になっています。

FormLoadのイベントで自分自身のFormをCloseさせることができないのですが
可能なのでしょうか?
もし良い方法がございましたら教えてください。
よろしくお願いいたします。
2004/08/20(Fri) 16:49:56 編集(投稿者)

こんにちわ、うにゃさん。

■No5704に返信(うにゃさんの記事)
> いつもお世話になっています。
>
> FormLoadのイベントで自分自身のFormをCloseさせることができないのですが
> 可能なのでしょうか?
> もし良い方法がございましたら教えてください。
> よろしくお願いいたします。

どっちかで出来ますが?

 ・Me.Close()
 ・MyClass.Close()

# ただし、TopMost時やOwnerFormの状況次第で例外が発生することがあるので注意。
# もしかして、何か例外が発生しちゃってるから困っていますか?

>  ・Me.Close()
>  ・MyClass.Close()
>
> # ただし、TopMost時やOwnerFormの状況次第で例外が発生することがあるので注意。
> # もしかして、何か例外が発生しちゃってるから困っていますか?

早速のご回答ありがとうございます。
上記の二つを試しましたがだめでした。
例外は発生していないです。
FormLoadのイベントで処理を行い。
処理が終了したらそのFormをCloseしたいのですが
Closeせずに画面が残ってしまいます。
(処理条件が満たない場合は画面を残す仕様です)
仕様上「ShowDialog」にてFormを表示させています。

う〜ん。。。試行錯誤してがんばってみます。
ありがとうございました。
うにゃさん、こんばんわ。

まずは、本当にme.Close()の処理が行われているか確認したほうが良いと思いますよ。

それと、もう少し詳しく全体の動きがわかるような説明があると、
答える側もアドバイスしやすいのでは??と思います。

可能ならばソースコードを載せると指摘しやすいとも思いますが・・・
■No5710に返信(うにゃさんの記事)
> 早速のご回答ありがとうございます。
> 上記の二つを試しましたがだめでした。
> 例外は発生していないです。

例外が発生していないのにCloseされないのはおかしいですね。


> FormLoadのイベントで処理を行い。

ここで、何をやってますか?
多分ここが原因だと思います。
実際試したところやはり、Loadイベント直後のClose()は有効でした。


# 適当なところでブレイクして、1ラインずつ実行して確認してみてください。
java.lang.Nullpoさん、SHさんありがとうございます。

Form1からForm2を呼び出す処理です。
ShowDialogで呼び出したFormはCloseできない模様です。

■Form1のボタンClickにて
  Dim fm As New Form2()
  fm.ShowDialog(Me)
  fm.Dispose()

■Form2のFormLoadにて
  Me.Close()...終了せずに画面が残ります。

※fm.Showで開く場合はCloseしてくれます。
 仕様上「fm.ShowDialog(Me)」で開きたいのですがこれだとCloseされないです。
 
対応としてForm2でCloseボタンをClick(手動)するようにしました。
できれば自動でCloseさせたかったのですが。。。
2004/08/23(Mon) 10:09:48 編集(投稿者)

■No5736に返信(うにゃさんの記事)
> java.lang.Nullpoさん、SHさんありがとうございます。
>
> Form1からForm2を呼び出す処理です。
> ShowDialogで呼び出したFormはCloseできない模様です。
>
> ■Form1のボタンClickにて
>   Dim fm As New Form2()
>   fm.ShowDialog(Me)
>   fm.Dispose()
>
> ■Form2のFormLoadにて
>   Me.Close()...終了せずに画面が残ります。
>
> ※fm.Showで開く場合はCloseしてくれます。
>  仕様上「fm.ShowDialog(Me)」で開きたいのですがこれだとCloseされないです。
>  
> 対応としてForm2でCloseボタンをClick(手動)するようにしました。
> できれば自動でCloseさせたかったのですが。。。

ShowDialog()で呼び出して、Form1側でClose()するなら、
Form2側でHide()した後で良いような気がします。
というか、Form1の呼び出し先でForm2のインスタンスは寿命終えてるし...

私の端末だと正常にClose()してしまうので何とも言えませんが、
スコープをもっと外に出すとどうなるでしょうか?

# いや、うちの新人も同じ様なことになって、
# スコープを外に出したら直ったとか言ってたので...。


または、Loadイベントでやるのではなく、
Form内の公開されたメソッドでやってみてはどうでしょうか?
というより、その方が可読性にも寄与するでしょう。
また、ビジネスロジック(GUI処理以外)はForm内に書くのではなく、
クラスモジュールまたは標準モジュールに書いた方が独立性が良くなります。
# まあ、Form2に属するコントロールに何かを吐くのなら、話は別ですけど。
うにゃさん、おはようございます。
ShowDialogで呼び出すなら、

Public Shadows Sub ShowDialog()
End Sub

として、この中で条件分岐させてみてはどうでしょうか?

条件がOKならme.close,
NGならShowDialogにすれば表示されないと思います。
ご教授大変感謝致します。

Form2のClose条件がForm2のコントロールを使用しているのと
Form2から呼び出されるスレッド処理にてClose判断を行っています。
これらの処理結果がNGならForm2をCloseせずにエラーを促し、ユーザがForm2の内容を修正し、再度Form2の条件処理を実行させるようなイメージになっています。
OKになればForm2をCloseして呼び出しもとのForm1に戻ります。

Form2はもともと単体で処理するものであったのが、仕様変更にてこのような使い方になってしまいました。

今回の件でいろいろ身についたことがあり感謝しています。
視野を広げて最初から仕様変更にも対応できるような作りをしていきたいと思います。
ありがとうございました。
解決済み!
2004/08/23(Mon) 13:12:32 編集(投稿者)

おはようございます。
スレ全体を読み返して思ったことを…
>FormLoadのイベントで自分自身のFormをClose…
つまり、me.closeですよね?このメソッドを実行した段階では、フォームはクローズしません。
「MyBase.Closing」イベントが発生している訳です。
もしかして、Closingイベントに処理を施していませんか?
例えば、「MyBase.Closing」イベント内で「e.Cancel = True」なんてのをしていませんか?
よく業務用アプリで行う処理として、
If MessageBox.Show("終了しますか?", "確認" _
 , MessageBoxButtons.YesNo, MessageBoxIcon.Question _
 , MessageBoxDefaultButton.Button2) = DialogResult.Yes Then

  Me.Dispose()
Else
  e.Cancel = True
End If
こんな事をしていますよね?上記の例では正しく終了しますが、条件が反対になっているなど確かめてみてはいかがでしょうか?

Dim fm As New Form2()
fm.ShowDialog(Me)
fm.Dispose()
また、fm.ShowDialog(Me)しているので有れば、fmがcloseされるまで、fm.Dispose()の処理は実行されません。「fm.Dispose()」の部分でデバッグしてみたら解るはずです。
もしかして、fm.Show()とfm.Showdialog(me)、fm.showdialog()をどこかで混同させていませんか?
モーダルダイアログとモーダレスダイアログの違いを初心に帰って理解し直して見てはいかかでしょうか?
(fm.Show()とfm.Showdialog(me)、fm.showdialog()の3つの違いが理解できているなら、必ず解決するはずです。)
結構、初心に帰ると解決する事ってあるんですよねぇ・・・

(生意気な事言ってすいません。)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板