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()
No.2ベストアンサー
- 回答日時:
フォームは閉じられると「破棄」されます。
そして、スタートフォームが閉じられるか、最後のフォームが閉じられると、アプリケーションが終了します(どちらでアプリ終了するかは、プロジェクトのオプション設定に拠る)
質問者さんは「フォームを移動するたびに、そのフォームだけ見せておきたい」と言う処理をしたいのですから「一旦、移動元のフォームを見えなくして、あとで見えなくなったフォームに戻って来る必要」がありますので、Close()メソッドだけでは処理出来ません。
何故なら「Close()すると破棄されてしまうので、もう戻れなくなる」からです。
Close()を使わず、Hideを使って下さい。
Me.Close()⇒Me.Hide
なお、Hideされて隠れたフォームが残ったまま、見えているフォームが[X]ボタン等で終了させられた場合、隠れたフォームを再表示できず閉じれなくなり、見えないフォームが残る場合があります。
その場合、アプリ終了条件が「最後のフォームが閉じらた時」だったり、見えずに残ったフォームがスタートフォームで、かつ、アプリ終了条件が「スタートフォームが閉じらた時」だった場合、そのアプリを終了させる事が出来なくなります。
Hideを使用する場合は「Hideされて見えなくなったフォームが取り残されて、アプリ終了が出来なくなる」と言う事が無いように「どれか1つのフォームが[X]ボタン等で閉じられそうになったら、閉じられる際に呼ばれるイベントプロシージャを利用して閉じられる事を検知し、他のすべてのフォームを明示的にClose()して、すべてのフォームを閉じてアプリを終了させる」などの処理が必要です。
この回答への補足
丁寧に回答していただきありがとうございます。
フォームを複数表示しているとメモリーを食って動作が遅くなるのかな
と思い、呼び出し元を閉じてから呼び出し先を表示する。としたいと
思って質問させていただきました。
Hide()だとメモリーに残ると思うのですが、これから教えていただいた
通りHide()を使って動作確認してみます。
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()
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メソッドなどにアプリケーションの初期化コードが書かれていると不具合が発生する可能性があります
No.4
- 回答日時:
タイトルバーのアイコンも最大化、最小化のボタンも消えてしまっていいのなら
フォームの ControlBoxプロパティを Falseに設定するといった手もあります
FromClosingの処理は必要ですが …
No.5
- 回答日時:
フォームの閉じるボタンを無効にする↓
http://dobon.net/vb/dotnet/form/disabledclosebut …
参考URL:http://dobon.net/vb/dotnet/form/disabledclosebut …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームを表示中にシ...
-
Hideについて(.NET)
-
Form_Load と Form_Activate の...
-
エクセルVBAのフォームを最...
-
ユーザーフォーム上に現在日時...
-
【VBAユーザーフォームで閉じる...
-
ユーザーフォームのラベルに時...
-
MSGBOXのフォント大きさ変更
-
コントロールの存在確認
-
Microsoft Formsの「個人情報や...
-
VBAでユーザーフォームを再表示...
-
フォームのテキストボックスな...
-
ACCESSのフォーム、開くんです...
-
アクセス2013 フォームが...
-
エクセルのチェックボックスの...
-
ExcelVBAのユーザーフォームでe...
-
ユーザーフォームのテキストボ...
-
クリックイベントなのに、2回ク...
-
フォームのアクティブと非アク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
クリックイベントなのに、2回ク...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームのテキストボ...
-
Microsoft Formsの「個人情報や...
-
ユーザーフォーム上に現在日時...
-
Form_Load と Form_Activate の...
-
モーダルフォームとモードレス...
-
Excelにて、ユーザーフォームで...
-
VBAでユーザーフォームを再表示...
-
【VBAユーザーフォームで閉じる...
-
MSGBOXのフォント大きさ変更
-
VBA(エクセル)のユーザー...
-
Hideについて(.NET)
-
エクセルVBAのフォームを最...
-
コントロールの存在確認
-
ACCESSのフォーム、開くんです...
-
'ユーザーフォーム右上隅の[×...
-
フォームウィンドウを最前面に...
-
ユーザーフォームのラベルに時...
おすすめ情報