• ベストアンサー

フォームの存在をチェックする方法

みなさんこんばんわです。よろしくお願いします。 VB.NET 2008で開発をしています。フォームについて、どうしてもわからない点がありますのでお伺いいたします。 Form1、Form2があるとします。 Form1.Visible = False とすれば、Form1のインスタンスは残ったまま、非表示なだけです。一方、 Form1.Close() Form1.Dispose() とすれば、Form1は完全にメモリ上から解放されています。つまり、Form1上のコントロールから値を取得しようとするとエラーになりますよね。 つまり、上記の二つのケースをForm2から判断したいのですが、そのコードが分からないんです。Form2のコードで、Form1のインスタンスが存在するかどうか、つまり、Form1上のコントロールの値を参照することができるかどうかを知りたいんです。 具体的には、実際のイメージはForm3まであって、Form1が不可視で生きていれば、Form1上のコントロールの値を参照し、Form2が不可視で生きていれば、Form1は無視してForm2上のコントロールの値を参照するという具合です。 ちなみに、 If Form1.Visible = False Then Debug.Print("生きてます") のコードでは、Form1のインスタンスがメモリ上にあってもなくても、不可視であれば、同じ値を返すことがわかり、役に立ちません。 ご存じの方がいらっしゃいましたら、たいへんお手数をおかけしますが、どうぞよろしくお願い申し上げます。 ありがとうございました。

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

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

NameSpace Myの中の Appliaction.OpenFormsで Closeしたかどうかが分かるようですよ Form2側のチェックイベントで if My.Appliaction.OpenForms("Form1") isnot Nothing then   Debug.Print("生きています") end if といった具合です

suiyoudoudesyou
質問者

お礼

ご回答ありがとうございます。 すごいです! こんな方法があったんですね! 実験してみると、見事に成功しました!! 望んだとおりの結果を得ることが出来、とても感謝しています。 ありがとうございました!!!

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

> Form1.Close() > Form1.Dispose() > とすれば、Form1は完全にメモリ上から解放されています。つまり、Form1上のコントロールから値を取得しようとするとエラーになりますよね。 VB2005で試してみましたがエラーは出ませんでした。 DisposeによってForm1が抱えるリソースは解放されますが、Form1の参照自体は削除されません。さらにVBの場合はDisposeしたForm1へ何らかのアクセスを試みたときに新しいインスタンスが自動的に作成されます。VB特有の「既定のインスタンス」による動作です。(2008で動作が異なるかどうかは不明) 既定のインスタンスを使わず、Formを変数で管理するのであれば、IsDisposedプロパティを調べることでDisposeされたかどうかを調べることが出来るのですが、既定のインスタンスでは上記の通りインスタンスを作り直してしまうので、IsDisposedは常にFalseを返します。 既定のインスタンスによるFormがDisposeされたかどうかを得るには、SharedなプロパティをForm1に持たせ、Disposeする時にフラグを立てれば大丈夫かと。 Class Form1 Friend Shared FormDisposed As Boolean = False Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed Form1.FormDisposed = True End Sub End Class

suiyoudoudesyou
質問者

お礼

ご回答ありがとうございます。 そうなんです! ロードしてないフォームを参照してエラーが出るなら、そのエラーをTry..Catch..Finallyでキャッチすることも考えましたが、実際やってみると、参照できるんです! すみません、実験もせずに投稿してしまいまして・・・・ 起動時にすべてのフォームがインスタンスとしてメモリ上に存在するのかと思いきや、そうなんですね、参照した際に勝手に作り直されるんですかー! なるほど、よくわかりました。公開変数でフラグを立てる方法は考えてはいたのですが、スマートじゃないなと思ってまして・・・ ありがとうございました!

すると、全ての回答が全文表示されます。

関連するQ&A

  • 【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」の部分のエラーです。 手書きで申し訳ありませんが、書きたいプログラムの参考画像も載せておきます。 数日前より調べては試し調べては試しと試行錯誤していますが、 正直手詰まりになっており、非常に困っております。 この他にも、フォーム間で命令を出しあいたい場面が多々あるのですが、 プロパティを変える程度のコードでつまずいていて、先に進めません。 手直しした簡単なサンプルコードを書いて頂けると非常に助かります。 以上、何卒よろしくお願い致します。

  • フォームロードについて

    VB2008で、Form_Load()に Me.Visible = falseや Me.Close()としてもフォームの非表示やフォームを閉じたりしないのですが、なぜなのでしょうか? 最初に起動した場合に、Form_Loadで初期設定を行った後に、自動的に直ぐにフォームを非表示や閉じることをしたいです。

  • C#でのフォーム間のデータの受け渡しについて

    フォーム間のデータ(パラメータ等)の受け渡しについて教えてください。 現在Form1からForm2を起動させる場合、以下のようにForm2のインスタンスの生成時のパラメータを設定してもForm2のLoadイベントでは拾うことはできないのでしょうか? ↓実際のコード //Form1クラスのインスタンスを作成する //引数(a,b) Form2 f = new Form2(a,b); //Form1を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose(); また、上記の方法が違っていた場合、方法としてどのようなやり方があるのか教えてください。 よろしくお願いいたします。

  • Paintイベントを抑制する方法

    Paintイベントを抑制する方法  今晩は,質問させていただきます. どうぞよろしくお願いいたします. Form1.Visible = False   :   : '(この間、Form1上の変更は無し)   : Form1.Visible = True '(←ここで重くなります) とした時に、Form1上のコントロールのPaintイベントが 走るのを抑制したいのでございますが、そのような方法って あるのでございましょうか?  Form1上のコントロールが多く(30個くらいありますorz) これらのPaintイベントが一度に同時に 走ってしまうので、重くなってしまいます。。。 個々のコントロールを触ったときにだけ.Paintイベントが 走ってくれればよいのでございますが。。  何か良さそうな方法などございましたら、是非とも アドバイスいただきたくお願い申し上げます。

  • メモリリークが発生するのはどういうときですか?

    メモリが解放されずに残るケースというのは、どういうときがあるのでしょうか? ※asp.netでプログラムを書いています。 (1)どのクラスも、基本的にコンストラクタでメモリが確保され、 どのクラスも、その親のオブジェクトが解放されたら、自分自身のメモリも解放される。 よって、画面のCloseで、すべてのオブジェクトのメモリは解放される。と思っています。 (2)スタティックメソッドで、参照渡しの引数があるとき、何度そのメソッドを使っても、 オブジェクトのポイントが渡るだけだし、処理完了後は、そのポインタすらも解放すると思っています。 (3)画面右上の「×」のボタン以外で画面が閉じてしまったとしても、セッションタイムアウトになった時点で、その分のメモリは解放すると思っています。 ◆どうしてdisposeメソッドがあるのでしょうか? .自分は、プログラム内に1箇所もdisposeを書く必要がないと思っていますが、どのような時に使うべきなのでしょうか?

  • 【VB2008】2つのFormの上下を切り替える方法。。。

    【VB2008】2つのFormの上下を切り替える方法。。。  今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  2つの重なったFormを切り替えるときに今までは Form1.Visible = False Form2.Visible = True などといたしておりましたが、その度に膨大な量の .Paintイベントが走っていることに気づきましたゆえ、 常に重ねておいて上下を切り変えればよいかな?と考えました。  そこで、 Form2.Activate や Form2.Owner = Form1 などといたしましたが変化がございません。。 検索いたしましてもなかなか出てこないのですが、 他に何か方法はございますでしょうか??  もしお詳しい方がいらっしゃいましたら,是非ともアドバイス いただきたく、どうぞよろしくお願いいたします。

  • 【VB.net】

    フォーム1のボタンをクリックすると、フォーム2を開くと同時にフォーム2ボタンがvisible=Trueになる、というコードを書きましたが、エラーが発生します。 ---------------- Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = True ---------------- 「nullreferenceexceptionはハンドルされませんでした オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出ます。 ・Button1の(Name)は間違いない ・Button1のvisible初期設定をTrueにしてもFalseにしても同じエラーが発生した なぜエラーが発生してしまうのでしょうか。 以上、よろしくお願い致します。

  • VB2005 DataGridviewのチェックボックス制御について

    DataGridviewのチェックボックス列の個々のチェックボックスについて、 Enabledプロパティのような値を設定して、 使用可/不可を制御したいのですが、方法がわかりません。 教えていただけないでしょうか? 最初、DataGridViewCheckBoxCellのVisibleプロパティが 参照/設定できるとヘルプに書いてあったので、 ひとまずこれで代用しようと思ったのですが、 コードを打ち込んだら「参照のみ」といわれ、 仕方なく今はReadOnlyプロパティを使っています。 よろしくお願いいたします。

  • vbで似たようなフォームを作るとき

    ちょっと、今さらお聞きするのもはずかしいのですが、教えて下さい。 VB2010でWindowsアプリケーションを作っています。 既にあるForm1を使って別のフォームを作ろうとしているんですけど、内容はForm1と9割が同じものです。 これまでは、デザイナーですべてのコントロールをコピーペーストし、次にコードをコピーペーストしていたんですが、多分もっと別のやり方があるんだろうなあ、と思っていました。 「別名で保存」といったような機能もなく、やり方がわかりません。 どなたか教えて下さい。

  • 《 Delphi 》 動的なフォーム生成について

    プログラムをしていて疑問に思ったのですが、たとえば Form1 := Tform1.create(Application); として、Form1(設計済み)のインスタンスを作って表示させたとします。 ここで、更に Tform1.create を行った場合、Form1の参照先は新しく作ったほうになると思うのですが、古いほうのインスタンスはどうなるのでしょうか?Form1に属するメンバはやはりゴミとして残るのでしょうか。 また、Form1を消去して新たに作り直したい場合は、Form1.Releaseをしてから再度Createすれば問題はないのでしょうか。 実は、Releaseしてから再Createしたところ、Form自体はできたのですが、Form上のImageをCreateする段階でアクセス違反が起きて落ちてしまいまして・・・(Form1にはImageがひとつ乗っており、Form生成時にImageも生成されます)。 ソースを削って原因究明したところ、関係ない変数を代入すると発生したり収まったりして、もしやメモリを蝕んでいる!?とか思ったもので・・・。 思い当たる節がありましたら、ご教授いただければ嬉しいです。

このQ&Aのポイント
  • ノートパソコンにコピーしたエクセルを開くと読取専用になり、上書きできない問題が発生しています。
  • 読み取り専用のチェックを外してもエクセルが上書きできない問題が解決しません。
  • 外付けディスクのエクセルは問題なく上書きできるため、ノートパソコンの設定に問題がある可能性があります。
回答を見る

専門家に質問してみよう