- PR -

サブ画面でのメッセージボックスの処理

投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2004-07-20 18:50
お世話さまです。

VB.NETで2つのフォーム(frmA,frmB)があります。
frmAで下記のようにしてfrmBをモーダルで表示しており、
frmBでの終了確認をメッセージボックスで行っています。

<frmAのコード>
frmB.ShowDialog(Me)
If frmB.DialogResult = DialogResult.Abort Then
  Me.Dispose()
Else
  If frmB.DialogResult = DialogResult.Ignore Then
    'ここで何らかの処理?
  End If
End If

<frmBのコード>
Select Case MessageBox.Show("システムを終了しますか?", _
      "終了確認", MessageBoxButtons.YesNo, _
      MessageBoxIcon.Question)
  Case DialogResult.Yes
    Me.Dispose()
    Application.Exit()
  Case DialogResult.No
    DialogResult = DialogResult.Ignore
    Exit Sub
End Select

で、問題はfrmBでのメッセージボックスで”いいえ”を選択した時に
frmBが閉じてfrmAも終了してしまいます。

希望する動作としましては、”いいえ”を選択した時には
当該メッセージボックスを閉じるだけでfrmAを表示したままにしたいのです。

どのようにすれば実装可能なのでしょうか?

ご教示頂けるとあり難いです。
宜しくお願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-07-21 06:17
諸農です。

普通に処理の流れを追えばうまくいくのではないでしょうか??

メインフォーム(frmA)の処理
1.サブフォーム(frmB)をShowDialog()で呼び出す。
  戻り値がDialogResult.Cancel以外であればClose()する。

サブフォーム(frmB)の処理
2.ダイアログをYesNoのボタン付きで呼び出す。
  戻り値がYesの場合は、サブフォームのDialogResultにダイアログの戻り値をセットする。
  サブフォームをClose()する。

C#ですけど。。。
コード:
//メインフォーム
private void button1_Click(object sender, System.EventArgs e)
{
    Form2 f = new Form2();
    if (DialogResult.Cancel != f.ShowDialog()) this.Close();
}

//サブフォーム
private void button1_Click(object sender, System.EventArgs e)
{
    DialogResult dr = MessageBox.Show("終了","終了",
                      MessageBoxButtons.YesNo,MessageBoxIcon.Question);
    if (dr == DialogResult.Yes)
    {
        this.DialogResult = dr;
    }
    this.Close();
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2004-07-21 10:14
===>諸農様

早速のレス、ありがとうございます。

ご教示頂いたC#のコードをもとに下記のようにVBで実装してみました。

frmAにて
If frmB.ShowDialog(Me) <> DialogResult.Cancel Then
  MsgBox("pass(1)")
  frmB.Close()
End If
MsgBox("pass(2)")

frmBにて
Select Case MessageBox.Show("システムを終了しますか?", _
    "終了確認", MessageBoxButtons.YesNo, _
    MessageBoxIcon.Question)
  Case DialogResult.Yes
    DialogResult = DialogResult.Abort
    End
  Case DialogResult.No
    DialogResult = DialogResult.Cancel
    MsgBox("pass(0)")
End Select

トレースのためにメッセージボックスを表示させてみましたところ、
モーダルで表示しているfrmBの終了確認ダイアログで”いいえ”
を押下した時にちゃんと"pass(0)"⇒"pass(2)"を通過しているのですが
やはりfrmBが閉じてしまいます。

うーん、なぜなんでしょうか…
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-21 10:30
引用:

moondogさんの書き込み (2004-07-21 10:14) より:
トレースのためにメッセージボックスを表示させてみましたところ、
モーダルで表示しているfrmBの終了確認ダイアログで”いいえ”
を押下した時にちゃんと"pass(0)"⇒"pass(2)"を通過しているのですが
やはりfrmBが閉じてしまいます。


ん?frmAが閉じてしまうんじゃなくて、frmBが閉じてしまうって話ですか?
※単なる書き間違えですかね?まあそうとして…

frmAの、frmBを表示しているメソッド全体はどうなっていますか?
単純に考えると、frmBを表示する以外の処理が問題になっているように思えるんですが。
クリス
会議室デビュー日: 2004/07/13
投稿数: 11
投稿日時: 2004-07-21 11:17
クリスです。

ちょっとどういう処理をしたいのか、いまいち分からないのですが
@frmAからfrmBをモーダルで開く
AfrmBは2択のダイアログを表示する
Bダイアログの片方の選択はアプリケーションの終了
Cもう片方の選択はダイアログだけを閉じる
という事をしたいのならこんな感じのコードでは駄目ですか?

コード:

'frmAのコード
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim frmB As New frmB
'frmBをモーダル表示
frmB.ShowDialog(Me)
'(以下はfrmBが×やAlt+F4で閉じられるまで処理されない)
MsgBox("frmB was closed")
End Sub

'frmBのコード
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Select Case MessageBox.Show("システムを終了しますか?", _
"終了確認", MessageBoxButtons.OKCancel, _
MessageBoxIcon.Question)
Case DialogResult.OK
'OKが押されたら全て終了
Application.Exit()
Case DialogResult.Cancel
'キャンセルを押されたときの処理
MsgBox("Cancel")
End Select
End Sub



的をはずした回答だったらごめんなさい。


#「の」が多かったので修正。

[ メッセージ編集済み 編集者: クリス 編集日時 2004-07-21 11:48 ]
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2004-07-21 11:40
===>なちゃ様

レス、ありがとうございます。

>frmAが閉じてしまうんじゃなくて、frmBが閉じてしまうって話ですか?
そうです。

>frmAの、frmBを表示しているメソッド全体はどうなっていますか?
下記のようになってます。

Module Main
  Sub Main()
    Dim frmA As New frmA
    Application.Run(frmA)
  End Sub
End Module

frmAにて
Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
  Dim frmB As New frmB
  If frmB.ShowDialog(Me) <> DialogResult.Cancel Then
      frmB.Close()
  End If
End Sub

frmBにて
Private Sub cmdEnd_Click(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles cmdEnd.Click
  Select Case MessageBox.Show("システムを終了しますか?", _
        "終了確認", MessageBoxButtons.YesNo, _
        MessageBoxIcon.Question)
    Case DialogResult.Yes
      Me.Dispose()
      Application.Exit()
    Case DialogResult.No
      DialogResult = DialogResult.Ignore
  End Select
End Sub
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2004-07-21 11:43
===>クリス様

レスありがとうございます。

つたない説明をご理解頂き恐縮です。
私のやりたいことはまさにご指摘の通りです。

申し訳ありませんが、私今から外出で今日は戻れませんので
明日、ご教示頂いた方法をテストしてみて
その結果をアップさせて頂きたく。

どうもありがとうございました。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-21 14:33
いろいろと認識に問題がありそうな気もしますが…

まず、ShowDialogで表示した場合、その後のコード部分には、表示したフォームが消えるまで戻ってきません。つまり、ShowDialog以降が実行されていてかつフォームが表示されたままというのはありえません。

例えば、
> モーダルで表示しているfrmBの終了確認ダイアログで”いいえ”
> を押下した時にちゃんと"pass(0)"⇒"pass(2)"を通過しているのですが
> やはりfrmBが閉じてしまいます。
という部分について、frmBが閉じずにpass(2)を通過することはありえないということです(かならずfrmBが閉じた後(もしくは消えた後)で通過します)。

frmBが閉じてしまうのが問題という話なら、単にDialogResultへの代入をやめればいいだけです。この場合は、当然ながらfrmBは閉じませんから、ShowDialogの後ろには戻ってきません(frmBを閉じるまでは)。

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