アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

Closeだとオブジェクトなくなっちゃいます。


Newして作り直ししなきゃならんです。

ベターな方法なら
Me.Hide()かしら
    • good
    • 0

フォームは閉じられると「破棄」されます。



そして、スタートフォームが閉じられるか、最後のフォームが閉じられると、アプリケーションが終了します(どちらでアプリ終了するかは、プロジェクトのオプション設定に拠る)

質問者さんは「フォームを移動するたびに、そのフォームだけ見せておきたい」と言う処理をしたいのですから「一旦、移動元のフォームを見えなくして、あとで見えなくなったフォームに戻って来る必要」がありますので、Close()メソッドだけでは処理出来ません。

何故なら「Close()すると破棄されてしまうので、もう戻れなくなる」からです。

Close()を使わず、Hideを使って下さい。
Me.Close()⇒Me.Hide

なお、Hideされて隠れたフォームが残ったまま、見えているフォームが[X]ボタン等で終了させられた場合、隠れたフォームを再表示できず閉じれなくなり、見えないフォームが残る場合があります。

その場合、アプリ終了条件が「最後のフォームが閉じらた時」だったり、見えずに残ったフォームがスタートフォームで、かつ、アプリ終了条件が「スタートフォームが閉じらた時」だった場合、そのアプリを終了させる事が出来なくなります。

Hideを使用する場合は「Hideされて見えなくなったフォームが取り残されて、アプリ終了が出来なくなる」と言う事が無いように「どれか1つのフォームが[X]ボタン等で閉じられそうになったら、閉じられる際に呼ばれるイベントプロシージャを利用して閉じられる事を検知し、他のすべてのフォームを明示的にClose()して、すべてのフォームを閉じてアプリを終了させる」などの処理が必要です。

この回答への補足

丁寧に回答していただきありがとうございます。

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

補足日時:2008/10/02 11:48
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/02 13:53

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

タイトルバーのアイコンも最大化、最小化のボタンも消えてしまっていいのなら


フォームの ControlBoxプロパティを Falseに設定するといった手もあります
FromClosingの処理は必要ですが …
    • good
    • 0

フォームの閉じるボタンを無効にする↓


http://dobon.net/vb/dotnet/form/disabledclosebut …

参考URL:http://dobon.net/vb/dotnet/form/disabledclosebut …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!