こんにちは、ENGかぴです。
VB.NET(Visual Basic 2022)でダイアログを使用するとファイルを名前付けてデータを保存することができます。テキストボックスに表示したイベントのログをダイヤログを使用して保存する方法と読み込む方法をまとめました。
ファイルを作成して保存する方法を下記記事にまとめています。この方法はアプリを管理するフォルダの固定した場所にログを保存する方法です。
VB.NET(VB2022)でファイルを作成してログを保存する方法
本記事ではログをダイアログを使用して任意の場所に名前を付けて保存します。
Windowsフォームアプリケーション(.NETFramework)を対象としています。以下はVisual Basic 2022をVB2022とします。
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
ファイルの保存を確認するアプリ
ボタンのクリックなどのイベントを動作履歴(ログ)をTextBox1に表示し、ダイアログを使用してファイルの名前を付けて任意の場所にCSVファイル(テキストファイル)で保存できるようにします。
ログはイベントの内容、ComboBox1及びListBox1の選択項目を1イベント1行で表示します。表示するイベントは以下の通りです。
- ComboBox1の選択項目を変更
- ListBox1の選択項目を変更
- ボタン1~ボタン3をクリック
- アプリが起動した(フォームを読み込んだ)時
「CSV保存(エクスポート)」をクリックすると保存用のダイヤログが表示します。ファイルの名前と保存先を指定するとTextBox1に表示しているログのファイルを生成して保存(書き込み)します。
「CSV保存(インポート)」をクリックすると読み込み用のダイヤログを表示します。CSVファイル(テキストファイル)を選択するとTextBox1に読み込んだデータを表示します。
「クリア」をクリックするとTextBox1の表示をクリアします。
コントロールの実装
Form1.vb[デザイン]にGroupBox、ComboBox、ListBox、TextBox、Buttonのコントロールを追加します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。
コントロールはツールボックスのすべてのWindowsフォームまたはカテゴリを選択して追加します。GroupBoxはコンテナーのカテゴリに含まれており、ComboBox、ListBox、TextBox、Buttonはコモンコントロールのカテゴリに含まれています。
最初にGroupBoxを配置します。ツールボックスのGroupBoxを選択するとForm1内でマウスのポインタがGroupBoxのアイコンなります。この状態で左クリックするとGroupBoxが配置できます。また左クリックを維持したままマウスのポインタを操作することでサイズを調整しながら配置することができます。
左クリックである程度のサイズで配置しプロパティを指定して微調整すると効率よく配置できます。
同様にしてGroupBox内にComboBox1、ListBox1、TextBox1、Button1~6を配置します。
GroupBox1のTextプロパティを「操作盤」に変更します。Button1~6のTextプロパティを「CSV保存(エクスポート)」「CSV保存(インポート)」「ボタン1」「ボタン2」「ボタン3」「クリア」に変更します。
PR:スキマ時間を有効に!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!
ダイヤログでファイルを生成する
Private Sub FileExport()
Dim exFile As New SaveFileDialog
Dim f_write As IO.StreamWriter
exFile.Filter = "CSVファイル(*.csv)|*.csv|テキストファイル (*.txt)|*.txt"
If exFile.ShowDialog() = DialogResult.OK Then
Try
Dim stream = exFile.OpenFile()
f_write = New System.IO.StreamWriter(stream, System.Text.Encoding.UTF8)
f_write.Write(TextBox1.Text)
f_write.Close()
exFile.Dispose()
Catch ex As Exception
End Try
End If
End Sub
ファイル保存のダイヤログを使用するためSystem.Windows.Forms.SaveFileDialogクラスを使用します。Newを使用して上記のクラスを初期化してインスタンス化(exFileオブジェクト)します。
ダイヤログで保存するファイルの種別に制限を入れるためFilterプロパティを指定します。Filterプロパティの書式は[ファイルの説明]または[種別]を垂直(|)で区切って指定します。
例ではCSVファイルを生成するために[ファイルの説明]に「CSVファイル(*.csv)」区切りとして「|」,[種別]に「*.csv」を指定しています。同様にテキストファイルを生成するために[ファイルの説明]に「テキストファイル(*.txt)」区切りとして「|」,[種別]に「*.txt」を指定しています。
exFileオフジェクトのShowDialog()メソッドでダイヤログを開くとファイルの保存先、ファイル名、ファイルの種類が選択できます。それぞれの項目を指定して「保存(S)」をクリックするとダイヤログからOK(保存(s))の応答がセットされるので戻り値を確認してファイルの生成に進みます。「キャンセル」をクリックすると処理せずダイヤログを閉じます。
exFileオフジェクトのOpenFile()メソッドでファイルを開きます。System.IOクラスで管理するファイルの情報が戻り値にセットされます。
ファイルにデータを書き込むためSystem.IOのStreamWriterクラスを使用します。StreamWriterクラスの初期化で引数を指定してインスタンス化します。インスタンス化したf_writeオブジェクトを使用してファイルを操作します。
第1引数にファイルを指定します。例ではダイヤログで指定したファイル情報を格納しているstreamを指定しています。
第2引数は保存するテキストのエンコード(文字コード)を指定します。例ではUTF-8を指定しています。Shift-JISを指定したい場合はSystem.TextのEncodingクラスのGetEncoding()メソッドで”shift_jis”を指定します。
f_writeオブジェクトのWrite()メソッドの引数に書き込む文字列や数値を指定します。例ではTextBox1のTextプロパティ(表示している文字列)を指定しています。
最後にClose()メソッドをf_openオブジェクトで開いているファイルを閉じます。またダイヤログを閉じるためexFileオブジェクトのDispose()メソッドで開いたファイルなどのリソースを開放します。
広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール
ダイヤログでファイルを読み込む
Private Sub LoadFile()
Dim imFileAs New OpenFileDialog
Dim f_open As IO.StreamReader
Dim str As String
imFile.Filter = "CSVファイル(*.csv)|*.csv|テキストファイル (*.txt)|*.txt"
If imFile.ShowDialog() = DialogResult.OK Then
Try
Dim stream = imFile.OpenFile()
f_open = New System.IO.StreamReader(stream, System.Text.Encoding.UTF8)
Do Until f_open.EndOfStream
str = f_open.ReadLine() & vbCrLf
TextBox1.Text &= str
Loop
f_open.Close()
imFile.Dispose()
Catch ex As Exception
MsgBox("読み込みに失敗しました。", MsgBoxStyle.OkOnly)
End Try
End If
End Sub
ファイル読み込みのダイヤログを使用するためSystem.Windows.Forms.OpenFileDialogクラスを使用します。Newを使用して上記のクラスを初期化してインスタンス化(imFileオブジェクト)します。
Filterプロパティでファイルの種別に制限をかけますが、ダイヤログでファイルを生成すると同様です。
imFileオフジェクトのShowDialog()メソッドでダイヤログを開くと開くファイルの場所、ファイル名、ファイルの種類が選択できます。
それぞれの項目を指定して「開く(O)」をクリックするとダイヤログからOK(開く(O))の応答がセットされるので戻り値を確認してファイルの読み込みに進みます。「キャンセル」をクリックすると処理せずダイヤログを閉じます。
exFileオフジェクトのOpenFile()メソッドでファイルを開きます。System.IOクラスで管理するファイルの情報が戻り値にセットされます。
ファイルからデータを読み込むためSystem.IOのStreamReaderクラスを使用します。StreamReaderクラスの初期化で引数を指定してインスタンス化します。f_openオブジェクトを使用してファイルを操作します。
第1引数にファイルを指定します。例ではダイヤログで指定したファイル情報を格納しているstreamを指定しています。
第2引数は保存するテキストのエンコード(文字コード)を指定します。ファイルを保存した時と同様のエンコードを指定します。例ではUTF-8を指定しています。
StreamReaderクラスのEndOfStreamプロパティはファイルの文末を判断します。文字列が存在する場合はFalseになるのでDo Until~Loopで文末になるまでループさせます。(ループさせるのが目的なのでWhileやDo whileなどでもよいです)
While f_open.EndOfStream = False
str = f_open.ReadLine()
TextBox1.Text &= str & vbCrLf
End While
Whileで読み込む場合はDo Until~Loopと条件が反対になるためEndOfStreamプロパティがFalseであればループするようにします。
ファイルの内容はRead()メソッドで読み出すことができます。Readline()メソッドを使用すると改行コードまでの文字列を読み込むことができます。
ログのデータは改行コードを入れて1行になるように保存(書き込んでいる)のでReadline()メソッドで1件のログが取得できます。取得した文字列をTextBox1のTextプロパティに指定して表示します。
ファイルの読み込みが終わったら、Close()メソッドでファイルを閉じます。またダイヤログを閉じるためimFileオブジェクトのDispose()メソッドで開いたファイルなどのリソースを開放します。
ファイルをコピーして保存する(参考)
Private Sub ExFile()
Dim exFile As New SaveFileDialog
Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile\save.txt"
exFile.Filter = "CSVファイル(*.csv)|*.csv|テキストファイル (*.txt)|*.txt"
If exFile.ShowDialog() = DialogResult.OK Then
Try
IO.File.Copy(FileName, exFile.FileName, True)
exFile.Dispose()
Catch ex As Exception
End Try
End If
End Sub
参考として固定した場所に保存しているのファイルをダイヤログで取得する方法を説明します。
VB.NET(VB2022)でファイルを作成してログを保存する方法
上記記事ではログのファイルを固定した場所に保存しているためフォルダの階層を下ってファイルを探す必要があります。固定した場所のファイルをダイヤログで指定した場所とファイル名で生成したファイルにコピーして取得します。
System.IO.FileクラスのCopy()メソッドでファイルをコピーします。第1引数にコピー元のファイルを指定します。第2引数にコピー先のファイルを指定します。コピー先のファイルはダイヤログで指定したファイルになります。第3引数は同じファイル名のファイルが存在する場合にコピーを許可するかの指定です。例ではコピーを許可するためTrueを指定しています。
ファイルのコピーが完了したらダイヤログで使用したリソースをDispose()メソッドで解放します。
動作確認(デバッグ)
デバッグは実際のアプリケーションの動作を模擬して実行するものです。デバッグの開始はエディタ上部の「▶開始」をクリックすると開始します。
イベントの情報がログとしてTextBox1に表示されることを確認します。ログを確認した後でダイヤログからファイルが生成できることを確認します。
デバッグを開始すると「アプリを起動しました。」のログを表示します。ComboBox1を変更すると「ComboBoxが選択されました。」の表示を残します。ListBox1を変更すると「ListBoxが選択されました。」の表示を残します。
「ボタン1」をクリックすると「Button1がクリックされました。」の表示ログを残します。ボタン2、ボタン3もButton番号以外は同様のログを残します。
「CSV保存(エクスポート)」をクリックするとダイヤログを開きます。
ダイヤログでファイルを保存する場所を選択します。動作確認のためデスクトップにログテストのフォルダーを生成してテキストファイルの形式で保存します。例ではファイル名に「test」を指定して保存しています。
保存したtest.txtを開くとTextBox1に表示されていたログと同様のデータが保存されていることが確認できます。
「クリア」をクリックするとTextBox1の表示をクリアすることができます。TextBox1をクリアした後で「CSV保存(インポート)」をクリックして表示される読み込み用のダイヤログからtest.txtを選択するとTextBox1にtext.txtの内容を表示することが確認できます。
コードのデバッグを行う場合は、コードエディタでブレークポイントを置くことで一時的にプログラムを停止させることができます。
ブレークポイントはコードエディターの最左部分をクリックして●マークが表示されれば設置できています。例ではButton1がクリックされた時に発生したイベントの先頭部分にブレークポイントを置いています。この状態でButton1をクリックするとブレークポイントでプログラムが一時停止します。
F11を押すとステップ実行になるため1行ずつ内容を確認しながらデバッグを行うことができます。上部の「▶続行(C)」をクリックするとブレークポイント状態から通常の動作に復帰します。
PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))
ソースコード全体
以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。
Public Class Form1
Dim fname As String = "\save.txt"
Dim initflg As Boolean = True
Enum HIST
HIST_BUTTON1 = 0
HIST_BUTTON2
HIST_BUTTON3
HIST_COMBOBOX1
HIST_LISTBOX
HIST_START
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FileExport()
End Sub
Private Sub FileExport()
Dim exFile As New SaveFileDialog
Dim f_write As IO.StreamWriter
exFile.Filter = "CSVファイル(*.csv)|*.csv|テキストファイル (*.txt)|*.txt"
If exFile.ShowDialog() = DialogResult.OK Then
Try
Dim stream = exFile.OpenFile()
f_write = New System.IO.StreamWriter(stream, System.Text.Encoding.UTF8)
f_write.Write(TextBox1.Text)
f_write.Close()
exFile.Dispose()
Catch ex As Exception
End Try
End If
End Sub
Private Sub SaveFile(no As HIST)
Dim str As String
str = Date.Now & ","
Select Case no
Case HIST.HIST_BUTTON1
str &= "Button1がクリックされました。"
Case HIST.HIST_BUTTON2
str &= "Button2がクリックされました。"
Case HIST.HIST_BUTTON3
str &= "Button1がクリックされました。"
Case HIST.HIST_COMBOBOX1
str &= "ConboBoxが選択されました。"
Case HIST.HIST_LISTBOX
str &= "ListBoxが選択されました。"
Case HIST.HIST_START
str &= "アプリを起動しました。"
Case Else
str &= "範囲外"
End Select
str &= ","
str &= ComboBox1.Text & ","
str &= ListBox1.Text & vbCrLf
TextBox1.Text &= str
End Sub
Private Sub LoadFile()
Dim imFile As New OpenFileDialog
Dim f_open As IO.StreamReader
Dim str As String
imFile.Filter = "CSVファイル(*.csv)|*.csv|テキストファイル (*.txt)|*.txt"
If imFile.ShowDialog() = DialogResult.OK Then
Try
Dim stream = imFile.OpenFile()
f_open = New System.IO.StreamReader(stream, System.Text.Encoding.UTF8)
Do Until f_open.EndOfStream
str = f_open.ReadLine()
TextBox1.Text &= str & vbCrLf
Loop
f_open.Close()
imFile.Dispose()
Catch ex As Exception
MsgBox("読み込みに失敗しました。", MsgBoxStyle.OkOnly)
End Try
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ControlInit()
SaveFile(HIST.HIST_START)
Timer1.Enabled = True
End Sub
Private Sub ControlInit()
ListBox1.Items.Add("選択肢1")
ListBox1.Items.Add("選択肢2")
ListBox1.Items.Add("選択肢3")
ListBox1.Items.Add("選択肢4")
ListBox1.SelectedIndex = 2
ComboBox1.Items.Add("Test1")
ComboBox1.Items.Add("Test2")
ComboBox1.Items.Add("Test3")
ComboBox1.Items.Add("Test4")
ComboBox1.Text = "Test1"
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
LoadFile()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
SaveFile(HIST.HIST_BUTTON1)
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
SaveFile(HIST.HIST_BUTTON2)
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
SaveFile(HIST.HIST_BUTTON3)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If initflg = False Then
SaveFile(HIST.HIST_COMBOBOX1)
End If
End Sub
Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
If initflg = False Then
SaveFile(HIST.HIST_LISTBOX)
End If
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
TextBox1.Clear()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Enabled = False
initflg = False
End Sub
End Class
コントロールの番号やイベントハンドラーなどのプロパティ名などを変更している場合はソースコードのイベントハンドラーをお使いのイベントハンドラーに置き換えてください。
Timer1は初期化時にComboBox1とListBox1のSelectedIndexChangedイベントによるログの保存を防止するために使用しています。Timerの使用方法は下記記事を参考にしてください。
VB.NET(VB2022)のタイマーの実装とイベントの追加方法
関連リンク
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
マイクロソフトはVisual Studio以外にもVSCodeという便利なエディターを提供しています。下記リンクではVSCodeのインストールの仕方からC言語開発環境の作り方までをまとめています。
PR:無料トライアル実施中【PC専用】AIスライド資料作成ツールの利用:イルシル
最後まで、読んでいただきありがとうございました。
csvファイルを生成しても同様の結果になりましたが、csvファイルを開くためにエクセルが必要になります。