- PR -

フォームの閉じ方

投稿者投稿内容
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-01-18 19:10
引用:

シルバさんの書き込み (2007-01-18 18:54) より:
どのフォームの[×]ボタンを押してもプログラムを終了するようにしたいんです。


すでにダッチさんが書かれていますが・・
引用:

ダッチさんの書き込み (2007-01-18 17:53) より:
FORM2 のキャンセルボタンを選択したときに、独自のキャンセル状態を設定しておきます。FORM1 は FORM2 が×ボタンでキャンセルされたのか、キャンセルボタンでキャンセルされたのかを判断できるようにすればいいと思います。


ではダメですか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-18 19:14
ShowDialog メソッドを使用しているのであれば、戻り値で判断できるのでは?
あとは、最初のメイン フォームまで随時、DialogResult に同じ値を伝播させていくだけですよね。
最後にメイン フォームが Close されれば、すべてのウィンドウは閉じられ、アプリケーションは正しく終了します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
シルバ
会議室デビュー日: 2006/09/22
投稿数: 19
投稿日時: 2007-01-18 20:07
とりあえずこんな感じで作っています。

FORM2_Loadイベントで
blnClose = False

CANCEL_Clickイベントで
'キャンセルボタンを押した場合
blnClose = True
Me.Close()

FORM2_FormClosingイベントで
If gblnClose = False Then
[プログラムを終了させる命令文]
End If

ここの命令文がわかりません。初歩的な質問ですみません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-18 20:48
ダイアログ リザルト
ちげー
ダイアログって、もうなし?

メインフォーム差し替え

2007-01-16 11:51 を見ると、Form2 を開くときに Form1 は Hide しているので、[×]でアプリケーションを終了しても、特に違和感はなさそう。
(あくまで、Hide しているから)

 例えば、インストーラを考えますが、[次へ]で進んでいくと、一瞬ウインドウが消えることがあります。このとき、別のウインドウ オブジェクトに変わっていると考えられます。しかし、このウインドウを[キャンセル]なり[×]なりすると、インストーラというアプリケーション全体が終了します。

 こんな感じで、メインウインドウを差し替えるとか。
http://blogs.wankuma.com/jitta/archive/2007/01/12/55937.aspx
「VB なんです」なんていう前に、リンク先も見てね。


 ただ、この場合、前後のウインドウが対等な関連であるため、違和感がないだけです。Form2 や Form3 を開くトリガが、「詳細表示」や「条件指定」といった従属関係のあるタスクを実行するためであるなら、違和感があります。


[ メッセージ編集済み 編集者: Jitta 編集日時 2007-01-18 22:02 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-18 21:12
シルバさん、こんばんは。

引用:

シルバさんの書き込み (2007-01-16 11:51) より:
Me.Visible = False
FORM2.ShowDialog(Me)
Me.Visible = True



引用:

シルバさんの書き込み (2007-01-18 16:00) より:
FORM1からFORM2を開き、(更にFORM2からFORM3を開く)
(1)FORM2のキャンセルボタンを押したらFORM1に戻る(FORM3の場合はFORM2に戻る)
(2)ウィンドウの×ボタンが押されるとプログラムを終了



つまり、form1 〜 form3 のうち、常にどれか一つのフォームだけが表示されるようにして、行きつ戻りつが可能で、どのフォームからでもアプリケーションを終了可能にしたい、という事ですよね?
#例えばウィザード形式のアプリケーションみたいな。

こういった場合、フォーム同士の関係は親・子・孫…ではなく兄弟にして、表示の切り替え等の制御は全て、親にやらせることでスッキリします。
子供たちは「ボタンが押された」とか「X で閉じられた」とかを親に報告するだけにして、兄弟同士での勝手なやり取りなどは行わないようにします。

以下のサンプルでは、「アプリケーション フレームワークを有効にする」のチェックを外し、「スタートアップオブジェクト」に Sub Main を指定しています(つまり「親」はフォームではない)。

コード:
' フォーム
Public Class SampleForm
    Public Event OpenButtonClicked As EventHandler
    Public Event CancelButtonClicked As EventHandler

    Private Sub OpenButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles OpenButton.Click
        RaiseEvent OpenButtonClicked(Me, e)
    End Sub

    Private Sub CancelButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles CancelButton.Click
        RaiseEvent CancelButtonClicked(Me, e)
    End Sub
End Class

' 親クラス
Public Class Class1
    Private WithEvents Form1 As SampleForm = New SampleForm
    Private WithEvents Form2 As SampleForm = New SampleForm
    Private WithEvents Form3 As SampleForm = New SampleForm

    Public Shared Sub Main()
        Dim c1 As Class1 = New Class1
        c1.Start()
    End Sub

    Private Sub Start()
        Application.EnableVisualStyles()
        Form1.Text = "Form1"
        Form2.Text = "Form2"
        Form3.Text = "Form3"
        Form3.OpenButton.Visible = False
        Form1.Show()
        Application.Run()
    End Sub

    Private Sub [Exit]()
        Form1.Dispose()
        Form2.Dispose()
        Form3.Dispose()
        Application.Exit()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
    Handles Form1.FormClosing, Form2.FormClosing, Form3.FormClosing
        If e.CloseReason.Equals(CloseReason.UserClosing) Then
            Me.Exit()
        End If
    End Sub

    Private Sub Form1_OpenButtonClicked(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Form1.OpenButtonClicked, Form2.OpenButtonClicked, Form3.OpenButtonClicked
        If sender Is Form1 Then
            Form1.Hide()
            Form2.Show()
        ElseIf sender Is Form2 Then
            Form2.Hide()
            Form3.Show()
        End If
    End Sub

    Private Sub Form1_CancelButtonClicked(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Form1.CancelButtonClicked, Form2.CancelButtonClicked, Form3.CancelButtonClicked
        If sender Is Form1 Then
            Me.Exit()
        ElseIf sender Is Form2 Then
            Form2.Hide()
            Form1.Show()
        ElseIf sender Is Form3 Then
            Form3.Hide()
            Form2.Show()
        End If
    End Sub
End Class


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-18 21:26
引用:

きくちゃんさんの書き込み (2007-01-18 21:12) より:

つまり、form1 〜 form3 のうち、常にどれか一つのフォームだけが表示されるようにして、行きつ戻りつが可能で、どのフォームからでもアプリケーションを終了可能にしたい、という事ですよね?
#例えばウィザード形式のアプリケーションみたいな。


ウィザード形式の場合は、ユーザーコントロールを張り替えることで、対応すべきだと思います。
余計なリソースと、チラツキを抑えることができます。(Delphi 的な考え?)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-18 22:27
じゃんぬさん、こんばんは。

引用:

引用:

#例えばウィザード形式のアプリケーションみたいな。


ウィザード形式の場合は、ユーザーコントロールを張り替えることで、対応すべきだと思います。


うぅ…他に良い喩えが思いつかなかったんです…。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-01-18 22:44
#思わず反応(余計なことと思いつつ・・
引用:

じゃんぬねっとさんの書き込み (2007-01-18 21:26) より:
ウィザード形式の場合は、ユーザーコントロールを張り替えることで、対応すべきだと思います。
余計なリソースと、チラツキを抑えることができます。(Delphi 的な考え?)


私はこの方が馴染んでますね(いまだにWin32でDelphiを使うことがことが多い・・)。

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