- ベストアンサー
複数フォームを1ボタンクリックで終了させる方法
VB6.0 WindowsXP (症状) 複数フォームを1クリックで終了できずに困っています。 理由は他のフォームに移ったときにボタンの位置やテキストの内容を残しておきたい為にunloadさせずに、 Me.Hideだけでフォームを移動しているためだと思います。 終了のときは、下記のコードを用いて、終了させています。 標準モジュールに Public Sub sAllEnd() Dim myObject As Object For Each myObject In Forms Unload myObject Set myObject = Nothing Next End Sub をおいて、 各フォームには Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbCancel Then Cancel = True End If Call sAllEnd End Sub 終了メッセージのOKボタンを開いたフォームの枚数分だけクリックしないと終了できない状態です。 これを1クリックで終了できるようにするためにはどうしたら良いでしょうか? よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>このページにendは使わないほうがいいと書かれていたので、Endは避けておりました。 Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbOK Then Unload Form1 Else Cancel = True End If End Sub でしたらこのようにやればいいのではないかな。 Form1がメインウィンドウ
その他の回答 (5)
s_husky です。 配列を利用すればどうでしょうか? Access のデータベースを全て一つの変数に収め、1レコードに記録するという無茶なこともやっています。
s_husky です。 1行追加すれば、一応、全てが閉じます。 Private Sub Command2_Click() Dim myObject As Object For Each myObject In Forms SendKeys "{ENTER}", False Unload myObject Set myObject = Nothing Next End Sub
横から失礼! <フォームを閉じる時の状況を記憶してオープン時に再現する> 1、ユーザ定義の構造体変数に情報を記録する。 2、ランダムファイルに1レコードで記録する。 3、ランダムファイルから1レコードを呼び込む。 私は、こんな手を使っています。 書き込みや呼び込みの手続きは、BLoad()、BSave() などの関数にすればいいと思います。
お礼
ありがとうございます。 標準モジュールで構造体を宣言すれば、どのフォームでも呼び出せますでしょうか? これはフォームにあるコントロールの数だけ、構造体に変数を用意しなければならないでしょうか? 例えばform1にテキストボックスが2つ、チェックボックスが1つ、form2にチェックボックスが4つあったとすると、 構造体には4つ分格納しておく変数が必要でしょうか?
補足
ありがとうございます。「構造体変数」「ランダムファイル」「レコード」などが分からないので調べてみます。 すみませんNo.3に記述しましたが、No.2の方に書いていただいたコードを使っても終了には開いたフォームの回数「OK]を押さなければ終了できませんでした。
- Hayashi_Trek
- ベストアンサー率44% (366/818)
QueryUnloadイベントを使って、終了確認をするのは 「ユーザーが、フォームのコントロールメニューの [閉じる] をクリックした。」時だけにすれば良いのでは。 Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer) If unloadmode=vbFormControlMenu Then myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult <> vbOK Then Cancel = True Exit Sub End If Call sAllEnd End if End Sub ※ インデントのために全角スペース使用。
お礼
ありがとうございます。 できました。 コントロールで「終了」ボタンを作った際に クリックして同じことをさせたいのですが、 どのようにコードを作ればよろしいでしょうか?
補足
ありがとうございます。 さっそく試してみます。 フォームの中のコントロールのチェックやテキストボックスにかかれた数値などを一括して記憶できる変数や命令などはあるのでしょうか? 一旦unloadして、他のフォームにうつっても戻ってきた時にその変数や命令などを関数を呼び出せば元に戻せそうだと思ったのですが。 よろしくお願いします。
- dondon5959
- ベストアンサー率15% (36/229)
Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbOK Then End Else Cancel = True End If End Sub これだけでいいんじゃないのか?
お礼
ありがとうございます。言葉足らずですみません。 http://www.nurs.or.jp/~catty/vbasic/vbform.html このページにendは使わないほうがいいと書かれていたので、Endは避けておりました。
補足
ありがとうございます。 一応ワンクリックでできましたが、 終了させて、コードを見ると改行の後が出ました。 これはフォームを閉じてる分改行が加わっているのでしょうか? また、キャンセルの場合、元のフォームが前面には出ませんでした。