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

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

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

Re[2]: FormClosed・FormClosingでの入力内容保存


(過去ログ 127 を表示中)

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

■75625 / inTopicNo.1)  FormClosed・FormClosingでの入力内容保存
  
□投稿者/ 赤坂太郎 (1回)-(2015/04/16(Thu) 00:23:25)

分類:[VB.NET/VB2005 以降] 

Win8.1+VB2010+.NET Framework4.0を使用しています。

メインとなる画面(Form1)から設定画面(Form2)を呼び出し、プログラムの終了時に設定画面に入力された内容をテキストに保存する処理を行っています。
・ここではForm2にはTextBox1というテキスト欄が1つだけあります。
・設定画面は×印をクリックしても画面が終了しないようにしてあります。

Public Class Form1
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Call textout("FormClosed.txt", Form2.TextBox1.Text)
    End Sub
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Call textout("FormClosing.txt", Form2.TextBox1.Text)
    End Sub
    Private Sub textout(ByVal textnam As String, ByVal textval As String)
        Dim strDIR As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
        Dim objFS As System.IO.StreamWriter
        Try
            objFS = New System.IO.StreamWriter(strDIR & "\" & textnam, False)
            objFS.Write(textval)
            objFS.Close()
        Catch exERR As Exception
        End Try

    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Form2.Show(Me)
    End Sub
End Class

Public Class Form2
    Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Me.Visible Then
            e.Cancel = True
            Me.Hide()
        End If
    End Sub
End Class

メイン画面を×印をクリックして終了した場合、FormClosed.txtにもFormClosing.txtにもきちんと入力内容が保存されるのですが、
メイン画面を終了せずにOSを再起動した場合、FormClosing.txtにしか入力内容が保存されません。
(ただしテキストファイルの更新日時はどちらも更新されます)

https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.formclosed%28v=vs.110%29.aspx
では「フォームに入力された情報を保存したり」と、FormClosedイベントで保存することを推奨しているようですが、
これを気にせずFormClosingイベントで情報を保存するのが良いのでしょうか。

引用返信 編集キー/
■75626 / inTopicNo.2)  Re[1]: FormClosed・FormClosingでの入力内容保存
□投稿者/ daive (49回)-(2015/04/16(Thu) 08:48:43)
> https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.formclosed%28v=vs.110%29.aspx
> では「フォームに入力された情報を保存したり」と、FormClosedイベントで保存することを推奨しているようですが、
> これを気にせずFormClosingイベントで情報を保存するのが良いのでしょうか。
フォームがクローズされる原因は、
System.Windows.Forms.FormClosingEventArgs
で、通知されます。

私の理解では、
イベントは、あくまで結果の通知であって、
通知方法として、各イベントが存在する。
と認識しています。

フォームが閉じられる時その原因を知る
http://dobon.net/vb/dotnet/form/unloadmode.html
などで解説されているように、
e.CloseReason で取得できる、
終了原因によって、適切な処理を選択します。
引用返信 編集キー/
■75627 / inTopicNo.3)  Re[1]: FormClosed・FormClosingでの入力内容保存
□投稿者/ shu (731回)-(2015/04/16(Thu) 09:10:44)
No75625 (赤坂太郎 さん) に返信
> メイン画面を×印をクリックして終了した場合、FormClosed.txtにもFormClosing.txtにもきちんと入力内容が保存されるのですが、
> メイン画面を終了せずにOSを再起動した場合、FormClosing.txtにしか入力内容が保存されません。
> (ただしテキストファイルの更新日時はどちらも更新されます)
>
それならFormClosingで両方とも処理するようにすれば良いのではないでしょうか?
Cancelにならない場合に処理すればよいと思います。
引用返信 編集キー/
■75638 / inTopicNo.4)  Re[2]: FormClosed・FormClosingでの入力内容保存
□投稿者/ 赤坂太郎 (2回)-(2015/04/16(Thu) 20:09:15)
上記ではメイン画面(Form1)のFormClosedとFormClosingで設定を保存していましたが、
設定画面(Form2)のFormClosedとFormClosingで保存するようにするとFormClosed.txt
にもFormClosing.txtにもきちんと入力内容が保存されるようになりました。

ご相談に乗っていただきありがとうございました。

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Form2.Show(Me)
    End Sub
End Class
Public Class Form2
    Private Sub Form2_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Call textout("FormClosed.txt", TextBox1.Text)
    End Sub
    Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Me.Visible Then
            e.Cancel = True
            Me.Hide()
        End If
        Call textout("FormClosing.txt", TextBox1.Text)
    End Sub
    Private Sub textout(ByVal textnam As String, ByVal textval As String)
        Dim strDIR As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
        Dim objFS As System.IO.StreamWriter
        Try
            objFS = New System.IO.StreamWriter(strDIR & "\" & textnam, False)
            objFS.Write(textval)
            objFS.Close()
        Catch exERR As Exception
        End Try
    End Sub
End Class

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -