• ベストアンサー
※ 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

  • フォームを画面のど真ん中に表示させたいのですが

    フォームを画面のど真ん中に表示させたいのですが、 http://dobon.net/vb/dotnet/form/startposition.html を見たのですがコードの書き方がよくわかりません。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim f As New Form1() 'フォームを画面の真ん中に表示する f.StartPosition = FormStartPosition.CenterScreenf.Show() End Sub End Class こうすると、「FormStartPosition.CenterScreenf」の部分に波線がひかれます。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.StartPosition = FormStartPosition.Manual Me.Location = New Point(0, 0) End Sub End Class これで左は時に表示する事は出来るのですが、真ん中に表示させるにはどうすればいいでしょうか?

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • VB2005で、フォームを初期化したいのですが、教えてください。

    VB2005で、フォームを初期化したいのですが、教えてください。 VB2005で、フォームにデータベース内容(ORACLE)を表示するプログラムを作っています。その際、F8キーを押すと画面内容(テキストボックスやDatagridviewの編集内容)を初期ロード状態に戻すようにしたいと思い、F8キー押下時のイベントに、以下のようにプログラムしました。 dim frm as form frm = new form1 me.close frm.show() としてみましたが、me.closeで、プログラムが終了してしまうようです。 どうするのが適切かお教えください。

  • 子フォームから開いたフォームと親子関係を結びたい(VB2003)

    子フォームから開いたフォームと親子関係を結びたい(VB2003) VB.NET2003についての質問です。 formMain のクラスに以下のコードを書いて実行させると、form1がformMainの子フォームとして開きます 下記は、「form1」を「formMain」の子フォームとして開くコードです。 (formMainクラス内のコードです)   ------------------------------   Dim f As New form1   Me.IsMdiContainer=True   f.MdiParent=Me   f.Show   ------------------------------ form1には、form2を開くボタンが用意されています。 質問内容は、このform2を、formMainの子フォームとして開くにはどうすればよいか、ということです。 ためしに、form1クラスに以下のコードを書いて実行させたところ、 「formMainは型であるため、式として利用することができない」というエラーメッセージが出てしまいました。   ------------------------------   Dim f As New form2   f.MdiParent = formMain   f.Show()   ------------------------------ 以上、よろしくお願い致します。

  • 【VB.net】フォーム間でのやり取りについて

    先日、同じような質問をさせて頂いたのですが、 解決に至らなかったため、もう少し質問内容を工夫しますので、再度質問させてください。 ・実行したいプログラム フォーム1のボタン1をクリックすると、フォーム2を開くと同時にフォーム2ボタン1がvisible=Trueになる。 フォーム1のボタン2をクリックすると、フォーム2を開くと同時にフォーム2のボタン1がvisible=Falseになり、ボタン2がvisible=Trueになる。 ・書いたコード ---------------- Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = True DirectCast(Me.Owner, Form2).Button2.Visible = False End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = False DirectCast(Me.Owner, Form2).Button2.Visible = True End Sub End class ---------------- ・問題点 「nullreferenceexceptionはハンドルされませんでした オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが発生します。 「DirectCast(Me.Owner, Form2).Button1.Visible = True」の部分のエラーです。 手書きで申し訳ありませんが、書きたいプログラムの参考画像も載せておきます。 数日前より調べては試し調べては試しと試行錯誤していますが、 正直手詰まりになっており、非常に困っております。 この他にも、フォーム間で命令を出しあいたい場面が多々あるのですが、 プロパティを変える程度のコードでつまずいていて、先に進めません。 手直しした簡単なサンプルコードを書いて頂けると非常に助かります。 以上、何卒よろしくお願い致します。

  • 最小化したフォームを元に戻す

    VB2005Expressにて開発を行っています。 最小化したフォームを元に戻せなくて困っています。 どなたかご存知の方がいらっしゃいましたらご教授願います。 下記の動作を実現したいと思っています。 ・Form1でボタンが押されたらForm2を表示する ・この際にForm1を最小化する ・Form2を閉じる ・この際にForm1を元に戻す(手前に表示する) 以下が作成したプログラムです。 ---モジュールにて下記を宣言 Module Module1 'オブジェクトの宣言 Public f1 As New Form1 Public f2 As New Form2 End Module ---Form1でForm2を開くボタンを押した場合の処理 Private Sub Button1_Click(ByVal sender~ 'Form2を表示 If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 End If f2.Show() 'Form1を最小化する Me.WindowState = FormWindowState.Minimized End Sub ---Form2にて閉じるボタンを押した場合 Private Sub Button4_Click(ByVal sender~ f1.WindowState = FormWindowState.Normal ↑コレで実現できるかと思ったのですが、最小化されたままです・・・ End Sub

  • Hideについて(.NET)

    Form1をHideで非表示にし、Form2を開いた後、再びForm1を表示したいのですがうまくいきません。 [form1のイベント] Dim frmForm2 as New Form2 frmForm2.Show Me.hide Sub End [form2のイベント] Dim frmForm1 as New Form1 frmForm1.Show Me.Close Sub End としてあります。 非表示されたフォームを再表示されずに、新しくフォームが開いてしまっていると考えられるんですが、どうしたらよいでしょうか? 

  • 特定のフォームだけ別フォームからの参照がされません

    VB 2005,Framework2.0を使用しています。 現在、サブフォームからダイアログフォームを表示し、ダイアログフォーム内の入力値等をサブフォームに渡す処理を行っています。 サブフォームは複数作成しており、特定のサブフォームだけダイアログフォームの入力値がサブフォームに渡されず原因が分からなくて困っています。 コードは以下のような形で書いています。 'サブフォーム Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Dialog1 f.StartPosition = FormStartPosition.CenterParent f.ShowDialog() End Sub End Class 'ダイアログフォーム Public Class Dialog1 Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click Form1.Label1.Text = Textbox1.text Me.Close() End Sub End Class 2005では、別フォームからの参照はVB6と同じようにインスタンスを作成しなくても参照できる様になったと聞いていますので、上記のコードでも参照方法として問題はないと思うのですが、うまく動作しない原因が分かる方が居られましたら宜しくお願いします。

  • クリックするたびに、フォームが複数表示される

    下記のコードだと Private Sub Button1_Click(・・・ Dim f2 As New Form2() f2.Show() End Sub ボタンをクリックするたびに、同じフォームが表示されます。 同じフォームが開かないようにしたいのですが、どうすればいいのでしょうか? バージョンは、Visual Basic .NETです。 よろしくお願いします。

  • フォーム2を出して フォーム1を閉じたい

    のですが、うまくできません。 何が間違っているのでしょうか Dim WithEvents Frm1 As Form1 Dim WithEvents Frm2 As Form2 ------------------- Frm2 = New Form2() Frm2.Show() Frm1 = New Form1() Frm1.Close() ------------------ net です。