- PR -

フォームの破棄について

1
投稿者投稿内容
武装キョンシー
ベテラン
会議室デビュー日: 2006/04/07
投稿数: 57
投稿日時: 2006-10-21 23:01
武装キョンシーです。
よろしくお願いします。
参照設定に別プロジェクトのメインフォームを設定しています。
マイプロジェクトで作成したフォームをメインから呼び出され終了ボタンを押したらチェック機能終了後にメインに戻るといった動作を目的に勉強しています。
頻繁に使用するとされるメインは移動後はHyde()メソッドで隠しておいたほうがいいとおもわれますが、呼び出された側のほうは作業完了後は画面を閉じてしまいたいのですがCloseで問題はないのでしょうか?(クローズだと単体でデバックしてテストすると
フォームが消えてしまいメインが残らなかった)

closeとdisposeでの違いなどをご教授、アドバイスお願いします。

Option Strict On

imports System
imports System.Date
imports System.Windows.form
imports text
imports Design


Public Class Form
 [ Windows フォーム デザイナで生成されたコード ]

#Region " Form2 を表示するボタン "

Private Sub btn_Click(...) Handles btn.Click
Dim mainform As mainclass.mform
mainform = New mainclass.mform
'チェックをする機能
if チェック判定 = true then
mainform.show
      Me.close()
else
msgbox("やり直しです。")
exit sub
end if
End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-21 23:52
引用:

武装キョンシーさんの書き込み (2006-10-21 23:01) より:

マイプロジェクトで作成したフォームをメインから呼び出され終了ボタンを押したらチェック機能終了後にメインに戻るといった動作


ちょっと意味がわかりにくいです。
以下のようなイメージで受けとめました。

あるプロジェクトで作成したフォーム (FormA とする) があります。
この FormA を含むアセンブリは、メインとなるアセンブリから参照設定されております。
FormA は、メインとなるアセンブリから表示されます。('何で' 呼び出されるのかが不明ですが)
表示された後、FormA にある [終了] ボタンを押下するとある検証を行います。
検証を行ったあとは、FormA を閉じ、メインとなる実行ファイルに制御を戻します。

引用:

頻繁に使用するとされるメインは移動後はHyde()メソッドで隠しておいたほうがいいとおもわれますが、


それは、L'Arc ~ en ~ Ciel の方ですね。
正しくは Hide メソッドです。

引用:

呼び出された側のほうは作業完了後は画面を閉じてしまいたいのですがCloseで問題はないのでしょうか?


何を使って、呼び出しているかによります。
メインとなるアセンブリから Show メソッドで呼び出しているのであれば、Close メソッドだけで良いです。

引用:

(クローズだと単体でデバックしてテストするとフォームが消えてしまいメインが残らなかった)


ごめんなさい、ここの意味がわかりませんでした。

引用:

closeとdisposeでの違いなどをご教授、アドバイスお願いします。


ShowDialog メソッドで Form を呼び出しているのであれば、
呼び出している側で、Dispose メソッドが必要になります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
武装キョンシー
ベテラン
会議室デビュー日: 2006/04/07
投稿数: 57
投稿日時: 2006-10-22 23:26
分かりにくく申し訳ありません。
参照設定はメインフォームのあるプロジェクト、マイプロジェクトの両方で
設定しています。
メインからはFormをshowメソッドで呼び出しています。
このとき、メインは何回も使用されるベースとなるためhide()でメインのあるクラスは処理を終えています。
Public Class Form にあるPrivate Sub btn_Click(...) Handles btn.Click
は呼び出される側のフォームにあるクラスです。
とりあえずとして、動作のテストとしてこの呼び出される側からデバックしてボタンイベントでメインのフォームを呼び出してclose()してみたところメインも閉じてしまったためメインフォームはのこしたままで呼びだされるフォームのみ閉じるといった動作を実現するにはやりかたがまちがっているのかがわからなかったのでこちらで質問させていただきました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-23 10:32
引用:

武装キョンシーさんの書き込み (2006-10-22 23:26) より:

分かりにくく申し訳ありません。
参照設定はメインフォームのあるプロジェクト、マイプロジェクトの両方で設定しています。メインからはFormをshowメソッドで呼び出しています。
このとき、メインは何回も使用されるベースとなるためhide()でメインのあるクラスは処理を終えています。
Public Class Form にあるPrivate Sub btn_Click(...) Handles btn.Click は呼び出される側のフォームにあるクラスです。
とりあえずとして、動作のテストとしてこの呼び出される側からデバックしてボタンイベントでメインのフォームを呼び出してclose()してみたところメインも閉じてしまったためメインフォームはのこしたままで呼びだされるフォームのみ閉じるといった動作を実現するにはやりかたがまちがっているのかがわからなかったのでこちらで質問させていただきました。


ごめんなさい、未だに意味が理解できないでいますが、

コード:

    ' Form1 クラス
    Public Class Form1 : Inherits System.Windows.Forms.Form

        ' Windows フォーム デザイナで生成されたコードは省略

        ' メイン エントリ ポイント
        Public Shared Sub Main()
            Application.Run(New Form1)
        End Sub

        ' Form2 を開く (参照設定されている前提)
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Visible = False

            Dim frm2 As Form2

            Try
                frm2 = New Form2()

                If frm2.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
                    Me.Visible = True
                    MessageBox.Show("検証 OK")
                Else
                    Me.Visible = True
                    MessageBox.Show("検証 NG")
                End If
            Finally
                If Not frm2 Is Nothing Then
                    frm2.Dispose()
                End If
            End Try
        End Sub

    End Class

コード:

    ' Form2 クラス
    Public Class Form2 : Inherits System.Windows.Forms.Form 

        ' Windows フォーム デザイナで生成されたコードは省略

        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            If MessageBox.Show("検証の結果は?", "確認", MessageBoxButtons.OKCancel) = System.Windows.Forms.DialogResult.OK Then
                Me.DialogResult = System.Windows.Forms.DialogResult.OK
            Else
                Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
            End If
        End Sub

    End Class


このようなイメージで良いでしょうか...?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-08 21:56
なんか、よくある問題のような気がする。

アプリケーションの、エントリポイントを探してください。
そこで、Application.Run(New MainForm) とかって、書いてあると思います。
ここで、アプリケーションを動作させるためのオブジェクトである MainForm のインスタンスを閉じると、この Run メソッドから抜けるため、アプリケーションが終了します。

どうしたらいいかは、どうしたいのかよくわからないので答えられない。
_________________
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2006-11-08 23:51
saki1208です。

引用:

武装キョンシーさんの書き込み (2006-10-21 23:01) より:

closeとdisposeでの違いなどをご教授、アドバイスお願いします。

Option Strict On

imports System
imports System.Date
imports System.Windows.form
imports text
imports Design


Public Class Form
 [ Windows フォーム デザイナで生成されたコード ]

#Region " Form2 を表示するボタン "

Private Sub btn_Click(...) Handles btn.Click
Dim mainform As mainclass.mform
mainform = New mainclass.mform
'チェックをする機能
if チェック判定 = true then
mainform.show
      Me.close()
else
msgbox("やり直しです。")
exit sub
end if
End Sub




ここで言われている、「マイプロジェクト」のスタートアップフォームに
Form2を指定されているのであれば、Close()した場合には、プログラムが
終了してしまうのではないでしょうか?
※この場合は、多分Hide()でも同じじゃないですかねぇ?

スタートアップを「Sub Main」などとして、プログラムを終了して良い条
件になるまでループして、ShowDialogし続ける必要があるのでは?
(本格的には.Netでものづくりをしたことがないので間違っている可能性
は大ですが...)
※試してみたら... DOS窓が表示されるじゃないか

よく見たら... 全然勘違いしてる気がする...

[ メッセージ編集済み 編集者: saki1208 編集日時 2006-11-08 23:58 ]
1

スキルアップ/キャリアアップ(JOB@IT)