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

アプリケーションの終了

環境/言語:[XP]
分類:[.NET]

こんにちは。いつも参考にさせていただいております。
1,2ヶ月前からVB.NETでアプリケーションの作成をしています。
そこでひとつ躓いてしまったのでアドバイスをいただきたく書き込みをしました。

複数のフォームで構成されているアプリケーションなのですが、すべてのフォームを閉じてもアプリケーションが終了しません。
Application.exitを使いたいと思うのですが、どこに入れたらよいのかもわかりません。どなたかアドバイスをお願いします。
FORM1→ FORM2→ FORM3→ FORM4→ FORM5 とフォームが移動をしています。
FORM5のボタンをクリックするとアプリケーションが終了するようにしようと思っています。次のフォームを表示するときはshow()を使っています。
よろしくおねがいします。
> FORM1→ FORM2→ FORM3→ FORM4→ FORM5 とフォームが移動をしています。
> FORM5のボタンをクリックするとアプリケーションが終了するようにしようと思っています。次のフォームを表示するときはshow()を使っています。
> よろしくおねがいします。

nobinobiさん、こんにちわ。

FORM1を閉じれば、アプリケーションは終わると思うのですが・・・
ちなみに、すべてのフォームをどのように閉じられていますか??
あと、アプリケーションが終了しないっていうのは、
どういう状態でしょうか??
SHさん 早速のレスありがとうございます。

form2〜form5 までは me.close で閉じています。
form1からform2へ移動するときは form1 を me.hide として非表示にしています。
form5 でボタンをクリックしたら f1.close で form1 を閉じています。コーディングをしてデバックして動かしてみると、form1も閉じられるのですが、[実行]、[読み取り専用]が終了しません。読み取り専用が取れないとアプリケーションが終了していないと判断してよかったでしょうか。

わかりにくくてすみません。
はじめまして、なおやと申します。

状況がよく分からないでの発言失礼します。
nobinobiさん、もしかしてForm1のインスタンスを新たに作成したりしていませんか?
f1 as new form1 のようにForm5で新規に宣言した物に対して
f1.closeを行っているとか、、。

見当違いな発言だったらすいません。
form5で閉じているf1は、どこで生成していますか?
form5内で生成していませんか?

form5で閉じているf1と、
一番最初に立ち上がるform1が別物のような気がしますが・・・

もしそうだとすると、
hideされた最初のform1が終了していないんだと思いますよ。

ためしに、me.hideをコメントにしてみてはいかがでしょうか?

ちなみに、Application.Exit()をform5のcloseに書けば、
アプリは終了すると思います。
なおや さん、SHさん レスありがとうございます。
超初心者な私にこんなにも親切にしてくださり、とても感謝です。

なおやさんの言うとおりForm5で新規に宣言をしていました。
これではいけないとすると、どこで宣言をして Form1 を閉じればよいのでしょうか。

SHさんのアドバイスのようにMe.Hide をコメントにしたら案の定最初のForm1が
閉じられていないことがわかりました。
application.exit() を Form5 のどこに記述すればよいのでしょうか?
クリックイベント内に書いて実行するとエラーが出てしまいました。


よろしくおねがいします。
nobinobiさん、こんにちわ。

> なおやさんの言うとおりForm5で新規に宣言をしていました。
> これではいけないとすると、どこで宣言をして Form1 を閉じればよいのでしょうか。

一番最初のForm1をForm5から閉じるには、
そのForm1のインスタンスをForm5に渡さないといけません。

> SHさんのアドバイスのようにMe.Hide をコメントにしたら案の定最初のForm1が
> 閉じられていないことがわかりました。
> application.exit() を Form5 のどこに記述すればよいのでしょうか?
> クリックイベント内に書いて実行するとエラーが出てしまいました。

Form5のCloseの後に書けばいけると思うのですが・・・
どんなエラーが出ますか??
SHさん こんにちは ありがとうございます。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
Application.Exit()
End Sub


このような記述でいいのでしょうか?実行すると以下のようなメッセージが出てきました。

System.Security.SecurityException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 種類 System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 のアクセス許可の要求に失敗しました。
エントリポイント以外で、Application.Exit()メソッドは
使わないようにしましょう。

Disposeなどが正常に行われず、例外が発生します。
Formを終了させる時は、Close()メソッドでやりましょう。
java.lang.Nullpo こんにちは
レスありがとうございます。

.NET をはじめたばかりでわからないことだらけです。

アプリケーションの終了方法がうまくいかなくて書き込みをしました。
FORM5からFORM1を閉じてアプリケーションを終了する方法がありましたら、詳しく教えてください。よろしくお願いします。
今開発環境が手元にないので、詳しく&正確にアドバイスできないのですが、、。
SHさんのおっしゃるように
>一番最初のForm1をForm5から閉じるには、
>そのForm1のインスタンスをForm5に渡さないといけません。
です。
Form1〜Form5の親子関係が分からないのですが。
(あ、でも各FormのOwnerは指定していない風ですね^^;)
インスタンスを渡す、っていうのは
(めちゃめちゃ適当な作り方になりますが)例えば
それぞれのFormに「親分フォーム(oyabun)」プロパティを作成し(object型)、
新しいフォームを作るごとに
*Form1内のソース*
form2.oyabun=me
*From2内のソース*
form5.oyabun=me.oyabun
といった感じで記述してやれば、
Form5のソース内にて
ctype(me.oyabun,form).close
と、最初に起動したForm1のクローズメソッドを指定することができます。

>なおやさんの言うとおりForm5で新規に宣言をしていました。
>これではいけないとすると、どこで宣言をして Form1 を閉じれば〜
との発言がありましたが、新しく宣言してしまうと(dim newf1 as form1)
そこで作成したnewf1オブジェクトは全く新しいオブジェクトなのです。

インスタンス等の考え方は、以下のページが参考になりました。
http://www.atmarkit.co.jp/fjava/rensai2/javaent02/javaent02.html
javaについての解説なんですが、
変数の宣言?インスタンス?という疑問について、私は
とても納得することができました。
みなさん、こんにちわ。

なおやさんの仰るように、Formの親子関係がはっきりしていれば、
もうちょっと良いやり方があるのかもしれません。

手っ取り早く実装しようと思うと、
ShowDalogで引数を渡せるようにしちゃうやり方があります。
それでForm1のインスタンスをForm5に渡せばOKです。

'' 2〜5の各フォームで、Form1の型の宣言をしておきます。
private oya as form1

'' ShowDialogにForm1を引数として指定するようにします。

Public Shadows Sub ShowDialog(ByVal f1 As Form1)
Me.oya = f1
MyBase.ShowDialog(Me.oya)
End Sub

''今showになってるとこをShowDialogに変えます。
'' ボタンクリックの部分。
f?.ShowDialog(Me.oya)

これで、Form5のCloseのとこに、
Me.oya.close()
とか書けばOKだと思います。

適当な説明で申し訳ありませんm(__)m
みなさん こんにちは。
SHさん レスありがとうございます。

SHさんのアドバイスどおりForm2〜Form5に以下の分を追加して

> private oya as form1
>
> Public Shadows Sub ShowDialog(ByVal f1 As Form1)
> Me.oya = f1
> MyBase.ShowDialog(Me.oya)
> End Sub
>
form1のshowdialog(me)にしてほかはアドバイスどおりに変更しました。

> f?.ShowDialog(Me.oya)
>
> これで、Form5のCloseのとこに、
> Me.oya.close()

そうしたら最後まで残っていたFORM1が閉じられて実行が終了しました。
ありがとうございました。涙が出そうです。
何もわかっていなくて問題点がうまく説明のできない私に親切にアドバイスをしてくださり、とても感謝しています。
本当にありがとうございました。
解決済み!

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