• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームを閉じる方法)

フォームを閉じる方法

このQ&Aのポイント
  • VB2005 Expressにて開発を行っております。ログインフォーム、メニューフォーム、各フォームと複数フォームを使用するアプリを作成中です。呼び出し元フォームを閉じてから呼び出し先フォームを開く方法を教えてください。
  • 再度「Form1からForm2を表示」を行うと破棄されたオブジェクトにアクセスできません。オブジェクト名 'Form2' です。エラーが発生してしまいます。どなたかご存知の方がいらっしゃいましたらご教授ください。
  • '標準モジュールで下記を宣言し、Form1からForm2を表示する場合は「F_Form2.Show()」を使用し、Form2を閉じてForm1を表示する場合は「F_Form1.Show()」を使用します。しかし、再度Form1からForm2を表示するとエラーが発生し、オブジェクトにアクセスできません。解決策をご教授ください。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

フォームは閉じられると「破棄」されます。 そして、スタートフォームが閉じられるか、最後のフォームが閉じられると、アプリケーションが終了します(どちらでアプリ終了するかは、プロジェクトのオプション設定に拠る) 質問者さんは「フォームを移動するたびに、そのフォームだけ見せておきたい」と言う処理をしたいのですから「一旦、移動元のフォームを見えなくして、あとで見えなくなったフォームに戻って来る必要」がありますので、Close()メソッドだけでは処理出来ません。 何故なら「Close()すると破棄されてしまうので、もう戻れなくなる」からです。 Close()を使わず、Hideを使って下さい。 Me.Close()⇒Me.Hide なお、Hideされて隠れたフォームが残ったまま、見えているフォームが[X]ボタン等で終了させられた場合、隠れたフォームを再表示できず閉じれなくなり、見えないフォームが残る場合があります。 その場合、アプリ終了条件が「最後のフォームが閉じらた時」だったり、見えずに残ったフォームがスタートフォームで、かつ、アプリ終了条件が「スタートフォームが閉じらた時」だった場合、そのアプリを終了させる事が出来なくなります。 Hideを使用する場合は「Hideされて見えなくなったフォームが取り残されて、アプリ終了が出来なくなる」と言う事が無いように「どれか1つのフォームが[X]ボタン等で閉じられそうになったら、閉じられる際に呼ばれるイベントプロシージャを利用して閉じられる事を検知し、他のすべてのフォームを明示的にClose()して、すべてのフォームを閉じてアプリを終了させる」などの処理が必要です。

madamadahiyoko
質問者

お礼

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()

madamadahiyoko
質問者

補足

丁寧に回答していただきありがとうございます。 フォームを複数表示しているとメモリーを食って動作が遅くなるのかな と思い、呼び出し元を閉じてから呼び出し先を表示する。としたいと 思って質問させていただきました。 Hide()だとメモリーに残ると思うのですが、これから教えていただいた 通りHide()を使って動作確認してみます。

その他の回答 (4)

回答No.5

フォームの閉じるボタンを無効にする↓ http://dobon.net/vb/dotnet/form/disabledclosebutton.html

参考URL:
http://dobon.net/vb/dotnet/form/disabledclosebutton.html
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

タイトルバーのアイコンも最大化、最小化のボタンも消えてしまっていいのなら フォームの ControlBoxプロパティを Falseに設定するといった手もあります FromClosingの処理は必要ですが …

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> 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メソッドなどにアプリケーションの初期化コードが書かれていると不具合が発生する可能性があります

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.1

Closeだとオブジェクトなくなっちゃいます。 Newして作り直ししなきゃならんです。 ベターな方法なら Me.Hide()かしら

関連するQ&A