フォームが表示・非表示されているのを判断するには?

解決


ゴロベエ  2004-11-17 09:27:00  No: 117646  IP: [192.*.*.*]

VB.NET2003  Windows2000環境です。

こちらの掲示板でお世話なっているゴロベエです。
早速質問なのですが、フォームが表示されている、されていないの判断はどのように行えばよろしいのでしょうか?
フォーム1のボタン1を押すとフォーム2が表示(モードレス)されるのですが、フォーム1のボタン1を押す限り、何個もフォーム2が出てきてしまいます。
フォーム2が表示されている時は、ボタン1を押してもフォームを表示させないようにしたいのですが、やり方がどうも分かりません。

回答よろしくお願いいたします。

編集 削除
特攻隊長まるるう  2004-11-17 10:00:19  No: 117647  IP: [192.*.*.*]

過去ロゴ検索『別フォーム』で引っ掛かる質問をいくつか読めば
理解できると思います。↓順に読んでいって応用して下さい。

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200405/04050010.txt

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200409/04090099.txt

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200410/04100060.txt

編集 削除
特攻隊長まるるう  2004-11-17 10:49:56  No: 117648  IP: [192.*.*.*]

…ああ、ちなみに
>フォームが表示されている、されていないの判断はどのように行えばよろしいのでしょうか?
を単語の意味通り解釈するとフォームの .Visible プロパティ を見る事になります。
実際は
>フォーム2が表示されている時は、ボタン1を押してもフォームを表示させないようにしたいのですが
という事で、フォームを新規にメモリにロードしないようなサンプルを紹介しました。
フォームは New した時点でメモリに実体化(インスタンスの生成)します。Show を実行しないと
画面に見えない(表示しない)状態で実体は存在する…という状態になります。Show した
フォームを破棄せずに Hide などをしても同じ状態になります。詳しくは New やオブジェクトの
インスタンス生成といった事について学んで下さい。

この2つは意味が違いますので、質問する場合も正確に区別できる単語を使えるように
して下さい。

編集 削除
ゴロベエ  2004-11-17 12:01:43  No: 117649  IP: [192.*.*.*]

特攻隊長まるるうさん返信ありがとうございます。
以下の方法で解決いたしました。

■■■Form1■■■
Public Class Form1
    Inherits System.Windows.Forms.Form
    
    Dim Form_2 As New Form2
    〜以下省略〜

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Form_2.Visible = False Then
            Form_2.Show()
            Form_2.Activate()
        Else
            Form_2.Activate()
        End If
    End Sub
End Class
■■■Form2■■■
    Private Sub Form2_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        e.Cancel = True
        Me.Hide()
    End Sub
常にメモリにForm2を持たせておいて、表示・非表示をただ行うという事で思っていたとおりには動きました。ただこれがやり方として一番ベストだということは分かりませんが・・・

特攻隊長まるるうさん本当にありがとうございました。

編集 削除
特攻隊長まるるう  2004-11-17 12:56:14  No: 117650  IP: [192.*.*.*]

かなり良いのではないでしょうか?(^^)

あとは Form2 を閉じようとするとキャンセルされ、
非表示のまま残りますので、Form1 が閉じる時に
明示的に破棄するコードも書いておくほうが良い
かもしれません。
[VB.NET]
■■■Form1■■■
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        Me.Form_2.Dispose()
        Me.Form_2 = Nothing
    End Sub

まあ、アプリケーションが終了すれば破棄されるみたいですが、
意識して自分で破棄したほうが良いでしょう。

編集 削除
ゴロベエ  2004-11-17 13:08:28  No: 117651  IP: [192.*.*.*]

特攻隊長まるるうさん返信ありがとうございます。
>意識して自分で破棄したほうが良いでしょう。
上記の事を考えてPGに埋め込み明示的に分かりやすくしました。
本当に助かりました。ありがとうございました!

編集 削除