• ベストアンサー

複数フォームを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クリックで終了できるようにするためにはどうしたら良いでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>このページに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)

noname#22222
noname#22222
回答No.6

s_husky です。 配列を利用すればどうでしょうか? Access のデータベースを全て一つの変数に収め、1レコードに記録するという無茶なこともやっています。

noname#22222
noname#22222
回答No.4

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

yoshi004
質問者

補足

ありがとうございます。 一応ワンクリックでできましたが、 終了させて、コードを見ると改行の後が出ました。 これはフォームを閉じてる分改行が加わっているのでしょうか? また、キャンセルの場合、元のフォームが前面には出ませんでした。

noname#22222
noname#22222
回答No.3

横から失礼! <フォームを閉じる時の状況を記憶してオープン時に再現する> 1、ユーザ定義の構造体変数に情報を記録する。 2、ランダムファイルに1レコードで記録する。 3、ランダムファイルから1レコードを呼び込む。 私は、こんな手を使っています。 書き込みや呼び込みの手続きは、BLoad()、BSave() などの関数にすればいいと思います。

yoshi004
質問者

お礼

ありがとうございます。 標準モジュールで構造体を宣言すれば、どのフォームでも呼び出せますでしょうか? これはフォームにあるコントロールの数だけ、構造体に変数を用意しなければならないでしょうか? 例えばform1にテキストボックスが2つ、チェックボックスが1つ、form2にチェックボックスが4つあったとすると、 構造体には4つ分格納しておく変数が必要でしょうか?

yoshi004
質問者

補足

ありがとうございます。「構造体変数」「ランダムファイル」「レコード」などが分からないので調べてみます。 すみませんNo.3に記述しましたが、No.2の方に書いていただいたコードを使っても終了には開いたフォームの回数「OK]を押さなければ終了できませんでした。

回答No.2

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 ※ インデントのために全角スペース使用。

yoshi004
質問者

お礼

ありがとうございます。 できました。 コントロールで「終了」ボタンを作った際に クリックして同じことをさせたいのですが、 どのようにコードを作ればよろしいでしょうか?

yoshi004
質問者

補足

ありがとうございます。 さっそく試してみます。 フォームの中のコントロールのチェックやテキストボックスにかかれた数値などを一括して記憶できる変数や命令などはあるのでしょうか? 一旦unloadして、他のフォームにうつっても戻ってきた時にその変数や命令などを関数を呼び出せば元に戻せそうだと思ったのですが。 よろしくお願いします。

回答No.1

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 これだけでいいんじゃないのか?

yoshi004
質問者

お礼

ありがとうございます。言葉足らずですみません。 http://www.nurs.or.jp/~catty/vbasic/vbform.html このページにendは使わないほうがいいと書かれていたので、Endは避けておりました。

関連するQ&A