C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[21]: VB2008 form2のみ閉じる方法 [1]


(過去ログ 79 を表示中)

[トピック内 31 記事 (21 - 31 表示)]  << 0 | 1 >>

■46560 / inTopicNo.21)  Re[15]: VB2008 form2のみ閉じる方法
  
□投稿者/ επιστημη (2444回)-(2010/02/05(Fri) 16:11:52)
επιστημη さんの Web サイト
> Button3には他の機能もつけているため、押せなくすることができないんです。

んじゃ、Form2が閉じたときに起こるイベントを捕まえ、

- Form2が閉じたら f = Nothing する。
- Button3が押されたとき、f が Nothing じゃなければ f.Close()

なんてな戦略でいかがでしょ。

引用返信 編集キー/
■46561 / inTopicNo.22)  Re[13]: VB2008 form2のみ閉じる方法
□投稿者/ 魔界の仮面弁士 (1473回)-(2010/02/05(Fri) 16:29:07)
No46555 (いむら さん) に返信
> Button1でForm2を一度開いた後に、Xボタンで消したり・そのままの状態でButton3を押したら正常に作動するのですが、

Button1 を複数回押したときに、どのように動作させるのかは決まっていますか?

(1) 押した回数だけ Form2 が複数開く。
(2) Button1 を押すたびに、Form2 が開いたり閉じたりする。
(3) Form2 は 1 つしか開かない。
(4) Button1 は 1 回しか押せないようにする。
(5) その他

> 一度もButton1を押さずに(一度もForm2を開かずに)Button3を押すとエラーになってしまいました。
ここでいう "Button3" とは、No46430 でいう "button2" と同じものですか?
>> form1上のbutton2を押すとform2が閉じるというプログラムを組みたいのですが


とりあえず、上記(1)案の実装と仮定して、これでどうでしょう。
Form2 がいくつ起動していても、まとめて閉じられます。
Form2 が起動していないなら何も起きません。

Public Class Form1
    Private Sub Button1_Click() Handles Button1.Click
        Dim F As New Form2()
        F.Show(Me)
    End Sub

    Private Sub Button2_Click() Handles Button2.Click
        For Each F In Application.OpenForms.OfType(Of Form2)().ToArray()
            F.Close()
        Next
    End Sub
End Class

引用返信 編集キー/
■46562 / inTopicNo.23)  Re[14]: VB2008 form2のみ閉じる方法
□投稿者/ 自作 (14回)-(2010/02/05(Fri) 16:33:20)
2010/02/05(Fri) 16:43:32 編集(投稿者)

No46555 (いむら さん) に返信
>確かに教えて教えて・・・と、ねだってばかりだったかもしれません。
まぁ、でも、インスタンスを生成した時に変数に何が格納されて、
破棄するとどうなってっていう判定については、知らない人は
全く知らないから教えてあげてもいいかなーって思うけどね。
# 最初の質問の方こそ自分で勉強できるレベルだと思ったけど。

フォームも含めて参照型の変数に、参照する実体(インスタンス)の
参照アドレスが格納されていない場合は、Nothing(空っぽ)
フォームを閉じる事で破棄されると、ゴミは残ってるけど使えない
状態になるので IsDisposed(破棄されたかどうか) ってフラグを
見ます。

コードで言えば、

If フォームの参照変数 Is Nothing OrElse フォームの参照変数.IsDisposed Then

…で、魔界の仮面弁士さんの手法は複数管理だけど、むしろ一つで良い場合は
以下のような設計が考えられます。
[DOBON.NET Tips > フォームが一つしか表示されないようにする/静的プロパティを使用する方法]
http://dobon.net/vb/dotnet/form/singleform.html#section3

> んじゃ、Form2が閉じたときに起こるイベントを捕まえ、
>
> - Form2が閉じたら f = Nothing する。
> - Button3が押されたとき、f が Nothing じゃなければ f.Close()
慣れている人なら問題ないけど、この質問者のレベルだと非表示のフォーム
残したりしそうで。。。質問者が完成コードまで確実に書き込むこと条件に
紹介したい手法ですね。。。本来、質問自体が全てそうあるべきだけど^^;
引用返信 編集キー/
■46563 / inTopicNo.24)  Re[15]: VB2008 form2のみ閉じる方法
□投稿者/ επιστημη (2445回)-(2010/02/05(Fri) 16:49:15)
επιστημη さんの Web サイト
>>- Form2が閉じたら f = Nothing する。
>>- Button3が押されたとき、f が Nothing じゃなければ f.Close()
> 慣れている人なら問題ないけど、この質問者のレベルだと非表示のフォーム
> 残したりしそうで。。。

あー。かといってそのレベルでは

> If フォームの参照変数 Is Nothing OrElse フォームの参照変数.IsDisposed Then

これもどーなのよ? みたいな。

なので:
[1] Form2が閉じたら f = Nothing する。
[2] Button3が押されたとき、f が Nothing じゃなければ f.Close()
[3] Button2が押されたとき、f が Nothing ならば
   f = new Form2() して
   fが閉じたら[1]をやれよ、と言いきかせて
   f.Show()
# [3] 忘れてた

とか考えたのねー

# そか、singletonか。しかしこれはこれでビギナには...^^;

引用返信 編集キー/
■46564 / inTopicNo.25)  Re[16]: VB2008 form2のみ閉じる方法
□投稿者/ いむら (9回)-(2010/02/05(Fri) 17:24:18)
皆さんアドバイスありがとうございます。
改めて今の自分の知識のなさと、無礼さを感じてしまいました。

皆さんの意見を聞くと他にも気づいたため以下のように変えてみました。


Public Class frm1
'インスタンス・メンバに昇格
Private f As frm2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
'frm2クラスのインスタンスを作成する
f = New frm2()
'frm2を表示する
'モーダルフォームとして表示する
f.ShowDialog()

End Sub



------------------------------------------------------------------------------------------------------------------

Public Class frm2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub
End Class



Form2をモーダルフォームにしました。
スレッドの質問の意味がなくなってしまい申し訳ありませんでした。
引用返信 編集キー/
■46565 / inTopicNo.26)  Re[17]: VB2008 form2のみ閉じる方法
□投稿者/ επιστημη (2446回)-(2010/02/05(Fri) 17:38:28)
επιστημη さんの Web サイト
> Form2をモーダルフォームにしました。

モーダルにしちゃったんなら、それが閉じるまで Form1.Button1 押せないっしょ。
押せないボタンは不要じゃなくて?

引用返信 編集キー/
■46566 / inTopicNo.27)  Re[18]: VB2008 form2のみ閉じる方法
□投稿者/ いむら (10回)-(2010/02/05(Fri) 17:49:34)
モーダルにして、先ほどのButton3は不要にしました。
いろいろとお手数おかけしてしまい申し訳ありませんでした。
引用返信 編集キー/
■46568 / inTopicNo.28)  Re[19]: VB2008 form2のみ閉じる方法
□投稿者/ 自作 (15回)-(2010/02/05(Fri) 18:19:14)
2010/02/05(Fri) 18:19:44 編集(投稿者)
No46566 (いむら さん) に返信
えーと。。。悪いけど、[VB2008]で試す限りだめっぽい。。。
まずは ShowDialog の使い方のヘルプ読んできて。
http://msdn.microsoft.com/ja-jp/library/c7ykbedk.aspx
>解説
>ダイアログ ボックスとして表示されているフォームは Close メソッドで
>閉じられることはないため、フォームがアプリケーションで不要になった場合は、
>そのフォームの Dispose メソッドを呼び出す必要があります。

↓だめな根拠テストコード
Public Class Form1

    'インスタンス・メンバに昇格
    Private f As Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'frm2クラスのインスタンスを作成する
        f = New Form2()
        'frm2を表示する
        'モーダルフォームとして表示する
        f.ShowDialog()

        Debug.Print(f.IsDisposed.ToString) 'ちゃんと破棄されたか確認→False(破棄されていない)出力
    End Sub

End Class
Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        Debug.Print(Now & "Form2_Disposed") ' ちゃんと破棄されたら出力される
    End Sub

End Class

↓もう、いいから、これにしといて(動作確認したら Debug.Print とかは消していいよ)のコード
Public Class Form1


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '関数内のみのスコープに降格
        Dim f As Form2
        'frm2クラスのインスタンスを作成する
        f = New Form2()
        'frm2を表示する
        'モーダルフォームとして表示する
        f.ShowDialog()
        '///////////////////////////////
        '/// 本来はここで f.DialogResult を確認したりごちゃごちゃする目的のために ShowDialog を使う
        '///////////////////////////////
        f.Dispose() '制御が戻ってきて、使わなくなったら明示的に破棄

        Debug.Print(f.IsDisposed.ToString) 'ちゃんと破棄されたか確認
    End Sub

End Class

Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        Debug.Print(Now & "Form2_Disposed")
    End Sub

End Class

引用返信 編集キー/
■46570 / inTopicNo.29)  Re[19]: VB2008 form2のみ閉じる方法
□投稿者/ 魔界の仮面弁士 (1475回)-(2010/02/05(Fri) 18:26:55)
No46566 (いむら さん) に返信
> モーダルにして、先ほどのButton3は不要にしました。
モーダル ダイアログにする場合には、
  Using f As New frm2()
     f.ShowDialog()
  End Using
のように、Using ブロックで囲むようにしましょう。

# 質問完了なら、再度、[解決済み]のチェックを付け直しを。

引用返信 編集キー/
■46571 / inTopicNo.30)  Re[20]: VB2008 form2のみ閉じる方法
□投稿者/ 自作 (16回)-(2010/02/05(Fri) 18:38:18)
2010/02/05(Fri) 18:42:11 編集(投稿者)
No46570 (魔界の仮面弁士 さん) に返信
>のように、Using ブロックで囲むようにしましょう。
うはっ!そうでした。。。
Using で破棄されるんでした。変数宣言も一体化されるし(’’;
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Using f As New Form2()
            f.ShowDialog()
            '/// ごちゃごちゃしたかったらしてもいいよ。
        End Using
    End Sub

End Class
Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        Debug.Print(Now & "Form2_Disposed")
    End Sub

End Class
恥ずかしーww

引用返信 編集キー/
■46604 / inTopicNo.31)  Re[21]: VB2008 form2のみ閉じる方法
□投稿者/ いむら (11回)-(2010/02/06(Sat) 10:59:39)
何度もアドバイスありがとうございます。
今回のことでいろいろと反省もしました。
その時の現状を把握した上で書き込みをしようと思います。
本当にありがとうございました。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -