tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルFormClosing内でのButton1.PerformClick()について
記事No11231
投稿日: 2014/03/02(Sun) 18:13
投稿者OrientalMelody
いつもお世話になっております。

Windows7(32bit)上でVB2010により開発をしております。

FormオブジェクトのFormClosingイベント内でのButtonオブジェクトPerformClick()を
使用した場合の動作について、質問させていただきます。

以下のソースコードのように、画面を閉じるときに、

(A)入力があった場合m_bChangeFlg=Trueになっているので、cmdSave.PerformClick()を実行し、閉じる。
(B)入力がなかった場合はm_bChangeFlgはそのまま(=False)なので、そのまま何もせずに、閉じる。

のような処理をしようとしているのですが、
(A)の場合、cmdSave内のClickイベントが発生し、データをファイル保存後、
Form1モジュールレベル変数のm_bChangeFlg=Falseにセットし、FormClosingイベントにもどります。

その後、If m_bChangeFlg Then 内には入らずに FormClosingイベントが終わるのは良いのですが、
画面が閉じられません。

もちろん、e.Cancel=Falseのままです。

cmdSave.Clickイベント内のファイル保存ルーチンを外し、
単純に m_bChangeFlg=False だけにしても同じでした。

Private m_bChangeFlg as Boolean 'モジュール宣言部で宣言。

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If m_bChangeFlg Then
            Select Case MsgBox("データが変更されています。保存しますか?", vbYesNoCancel, Me.Text)
                Case vbYes
                    cmdSave.PerformClick()
                    If m_bChangeFlg Then
                        e.Cancel = True
                       Exit Sub
                    End If
                Case vbNo
                Case vbCancel
                    e.Cancel = True
                    Exit Sub
            End Select
        End If

    End Sub



FormClosingイベント内では、cmdSave.PerformClick()等のメソッドを使用するのは
問題があるのでしょうか?

宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: FormClosing内でのButton1.PerformClick()について
記事No11234
投稿日: 2014/03/03(Mon) 16:35
投稿者VBレスキュー(花ちゃん)
下記のような動作でよいのですよね。
問題がないように思うのですが?

Public Class Form1

Private m_bChangeFlg As Boolean

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   m_bChangeFlg = True
End Sub

Private Sub cmdSave_Click(sender As System.Object, e As System.EventArgs) Handles cmdSave.Click
    MessageBox.Show("保存しました")
   m_bChangeFlg = False
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
   If m_bChangeFlg Then
      Select Case MsgBox("データが変更されています。保存しますか?", vbYesNoCancel, Me.Text)
            Case vbYes
               cmdSave.PerformClick()
               If m_bChangeFlg Then
                  e.Cancel = True
                  Exit Sub
               End If
            Case vbNo
            Case vbCancel
               e.Cancel = True
               Exit Sub
      End Select
   End If
End Sub

End Class

[ツリー表示へ]
タイトルRe^2: FormClosing内でのButton1.PerformClick()について
記事No11238
投稿日: 2014/03/04(Tue) 11:52
投稿者OrientalMelody
VBレスキュー(花ちゃん)様

迅速なご回答、大変有難うございます。

確かに仰るとおり、Form1がスタートアップフォームでは、私の環境でも問題ないようです。

考えたら、実アプリでは、Menu画面から呼び出された画面で起こることに気がつきました。

Form2を追加し、以下のコード

Public Class Form2

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim Form1 As New Form1
        Form1.ShowDialog()
        Form1.Dispose()

    End Sub
End Class

を追加後、スタートアップフォームを Form2 にして頂いてから試してみていただけませんでしょうか?

こちらの環境では必ず再現いたします。

恐れ入りますが、宜しくお願いいたします。

> 下記のような動作でよいのですよね。
> 問題がないように思うのですが?
>
> Public Class Form1
>
> Private m_bChangeFlg As Boolean
>
> Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
>    m_bChangeFlg = True
> End Sub
>
> Private Sub cmdSave_Click(sender As System.Object, e As System.EventArgs) Handles cmdSave.Click
>     MessageBox.Show("保存しました")
>    m_bChangeFlg = False
> End Sub
>
> Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
>    If m_bChangeFlg Then
>       Select Case MsgBox("データが変更されています。保存しますか?", vbYesNoCancel, Me.Text)
>             Case vbYes
>                cmdSave.PerformClick()
>                If m_bChangeFlg Then
>                   e.Cancel = True
>                   Exit Sub
>                End If
>             Case vbNo
>             Case vbCancel
>                e.Cancel = True
>                Exit Sub
>       End Select
>    End If
> End Sub
>
> End Class

[ツリー表示へ]
タイトルRe^3: FormClosing内でのButton1.PerformClick()について
記事No11240
投稿日: 2014/03/04(Tue) 13:43
投稿者OrientalMelody
> Form2を追加し、以下のコード
ですが、正確には、「Form2を追加、ボタンオブジェクトButton1を追加し、以下のコード」
でした。失礼いたしました。

> VBレスキュー(花ちゃん)様
>
> 迅速なご回答、大変有難うございます。
>
> 確かに仰るとおり、Form1がスタートアップフォームでは、私の環境でも問題ないようです。
>
> 考えたら、実アプリでは、Menu画面から呼び出された画面で起こることに気がつきました。
>
> Form2を追加し、以下のコード
>
> Public Class Form2
>
>     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>         Dim Form1 As New Form1
>         Form1.ShowDialog()
>         Form1.Dispose()
>
>     End Sub
> End Class
>
> を追加後、スタートアップフォームを Form2 にして頂いてから試してみていただけませんでしょうか?
>
> こちらの環境では必ず再現いたします。
>
> 恐れ入りますが、宜しくお願いいたします。
>
> > 下記のような動作でよいのですよね。
> > 問題がないように思うのですが?
> >
> > Public Class Form1
> >
> > Private m_bChangeFlg As Boolean
> >
> > Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
> >    m_bChangeFlg = True
> > End Sub
> >
> > Private Sub cmdSave_Click(sender As System.Object, e As System.EventArgs) Handles cmdSave.Click
> >     MessageBox.Show("保存しました")
> >    m_bChangeFlg = False
> > End Sub
> >
> > Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
> >    If m_bChangeFlg Then
> >       Select Case MsgBox("データが変更されています。保存しますか?", vbYesNoCancel, Me.Text)
> >             Case vbYes
> >                cmdSave.PerformClick()
> >                If m_bChangeFlg Then
> >                   e.Cancel = True
> >                   Exit Sub
> >                End If
> >             Case vbNo
> >             Case vbCancel
> >                e.Cancel = True
> >                Exit Sub
> >       End Select
> >    End If
> > End Sub
> >
> > End Class

[ツリー表示へ]
タイトルRe^4: FormClosing内でのButton1.PerformClick()について
記事No11241
投稿日: 2014/03/04(Tue) 13:53
投稿者VBレスキュー(花ちゃん)
不要な引用は避けて下さい。
レンタルサーバーでディスクの制限もありますし、見苦しいので。

コードを投稿される場合は、事象が再現できるコードを投稿するようにして下さい。

元々、cmdSave.PerformClick() のようなコードは好ましくありません。
多分、イベント中に他のイベントを実行したので、FormClosing 処理がキャンセルされたのでは
ないでしょうか?
Form が1個しか起動していない時は問題が発生しなくても、複数起動していると...。

cmdSave.PerformClick 内の保存処理をサブプロシージャに作成して保存が必要な時に
そのサブプロシージャを呼ぶように変えて見て下さい。それなら閉じるはずです。

Private Sub FileSave()
   MessageBox.Show("保存しました")
   m_bChangeFlg = False
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
   If m_bChangeFlg Then
      Select Case MsgBox("データが変更されています。保存しますか?", vbYesNoCancel, Me.Text)
            Case vbYes
               Me.FileSave()

[ツリー表示へ]
タイトルRe^5: FormClosing内でのButton1.PerformClick()について
記事No11242
投稿日: 2014/03/04(Tue) 14:33
投稿者OrientalMelody
VBレスキュー(花ちゃん)様

有難うございます。

> 不要な引用は避けて下さい。
> レンタルサーバーでディスクの制限もありますし、見苦しいので。
> コードを投稿される場合は、事象が再現できるコードを投稿するようにして下さい。
失礼いたしました。今後は気をつけます。

> cmdSave.PerformClick 内の保存処理をサブプロシージャに作成して保存が必要な時に
> そのサブプロシージャを呼ぶように変えて見て下さい。それなら閉じるはずです。
サブプロシージャにより、確かに閉じることができました。
cmdSave.PerformClick()呼び出しは、やはりあまり好ましくないのですね。
VB6でいつも cmdSave_Click() を呼んでいたので、ついその癖が出てしまいました。

この方法で対応しようと思います。
有難うございました。

[ツリー表示へ]