VB2005 Expressにて開発を行っております。
ログインフォーム、メニューフォーム、各フォームと複数フォームを使用
するアプリを作成中です。
そこで質問させて下さい。呼び出し元フォームを閉じてから呼び出し先
フォームを開くとするにはどのように行ったらいいのでしょうか。
下記が作成中のPGMですが、「Form1からForm2を表示」「Form2からForm1を表示」は正常に動作しますが、再度「Form1からForm2を表示」を行うと
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'Form2' です。
が表示されて「f2.Show()」でエラーになってしまいます。
どなたかご存知の方がいらっしゃいましたらご教授下さい。
よろしくお願いします。
'標準モジュールで下記を宣言
Public f1 As New Form1 'ログイン画面
Public f2 As New Form2 'メニュー画面
Public f3 As New Form3 'メニュー1
Public f4 As New Form4 'メニュー2
'Form1からForm2を表示
F_Form2.StartPosition = FormStartPosition.CenterScreen
F_Form2.Show()
Me.Close()
'Form2を閉じてForm1を表示
F_Form1.StartPosition = FormStartPosition.CenterScreen
F_Form1.Show()
Me.Close()
Hide()を使用して、アプリの終了時に全フォームを閉じたところ上手く
いきました。
ただ、各フォームの×ボタンで終了させたくないため、下記チェックを
追加したところフォームは閉じるのですが、アプリは終了されません。
×ボタンで終了させない処理は使用しないほうがいいのでしょうか。
何度もすいません。
Private blNoClose As Boolean 'フォームの閉じるボタン制御用
'処理内容:閉じるボタン以外で画面を閉じないよう制御
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If e.CloseReason = CloseReason.ApplicationExitCall Then
e.Cancel = True
Else
If blNoClose = False Then
MessageBox.Show("終了ボタンから終了して下さい。", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
e.Cancel = True
End If
End If
End Sub
'Form1を閉じる処理
Form2.Close()
Form3.Close()
Form4.Close()
Application.Exit()
blNoClose = True
Me.Close()
> Public f1 As New Form1 'ログイン画面
> Public f2 As New Form2 'メニュー画面
> Public f3 As New Form3 'メニュー1
> Public f4 As New Form4 'メニュー2
の部分が VB2005なら冗長です
VB2005以降の場合 My.Formsオブジェクトにプロジェクトにあるフォームがメンバーとして登録されます
アプリの各フォームから互いのフォームは
Form2.StartPosition = FormStartPosition.CenterScreen
Form2.Show()
Me.Close()
といった具合に使えます
ただしCloseで閉じてしまうと次回Form1を起動する際に再度Form1が内部で作成しなおされます
Form1のNewメソッドなどにアプリケーションの初期化コードが書かれていると不具合が発生する可能性があります
お礼
Hide()を使用して、アプリの終了時に全フォームを閉じたところ上手く いきました。 ただ、各フォームの×ボタンで終了させたくないため、下記チェックを 追加したところフォームは閉じるのですが、アプリは終了されません。 ×ボタンで終了させない処理は使用しないほうがいいのでしょうか。 何度もすいません。 Private blNoClose As Boolean 'フォームの閉じるボタン制御用 '処理内容:閉じるボタン以外で画面を閉じないよう制御 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If e.CloseReason = CloseReason.ApplicationExitCall Then e.Cancel = True Else If blNoClose = False Then MessageBox.Show("終了ボタンから終了して下さい。", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) e.Cancel = True End If End If End Sub 'Form1を閉じる処理 Form2.Close() Form3.Close() Form4.Close() Application.Exit() blNoClose = True Me.Close()
補足
丁寧に回答していただきありがとうございます。 フォームを複数表示しているとメモリーを食って動作が遅くなるのかな と思い、呼び出し元を閉じてから呼び出し先を表示する。としたいと 思って質問させていただきました。 Hide()だとメモリーに残ると思うのですが、これから教えていただいた 通りHide()を使って動作確認してみます。