【VB.NET】フォームの設定保存<TextBox59個CheckBox24個ComboBox21個分>

6軸力覚センサ用校正台を使いながら、SCP校正実験を始めてます。6分力センサを校正台上で、荷重ベクトルをSCPで管理しながら校正測定するのですが、従来より精度を上げたいので、試行錯誤しながら大変手間取ってます。その中で、16Ch分の測定設定を毎回やっていたら、実験がすすまないので、フォームの設定をファイルに保存して、読み込む機能を追加しました。

 

なにしろ、下図のように膨大な設定値があります。

■やり方は単純
フォームのSettingという機能があるらしいのですが、判りにくかったので、TEXTBOX59個とCheckBOX24個とComboBOX21個の設定値をファイル保存して新規に起動したときにダイアログから設定ファイルを選択読み込みできるようにしました。
①コントロールの配列定義
手間がかかるのは、コントロールを配列化して、値を代入する定義文です。(space)_(cr)で行をつないで、5階建てになりました。
MSの長いステートメントを分割する解説記事

”’*********************Control Object Array set****************************************************************************
Dim allTextBox() As TextBox
allTextBox = {Me.TextBox1, Me.TextBox2, Me.TextBox3, Me.TextBox4, Me.TextBox5, Me.TextBox6, Me.TextBox7, Me.TextBox8, Me.TextBox9, Me.TextBox10 _
, Me.TextBox11, Me.TextBox12, Me.TextBox13, Me.TextBox14, Me.TextBox15, Me.TextBox16, Me.TextBox17, Me.TextBox18, Me.TextBox19, Me.TextBox20 _
, Me.TextBox21, Me.TextBox22, Me.TextBox23, Me.TextBox24, Me.TextBox25, Me.TextBox26, Me.TextBox27, Me.TextBox28, Me.TextBox29, Me.TextBox30 _
, Me.TextBox31, Me.TextBox32, Me.TextBox33, Me.TextBox34, Me.TextBox35, Me.TextBox36, Me.TextBox37, Me.TextBox38, Me.TextBox39, Me.TextBox40 _
, Me.TextBox41, Me.TextBox42, Me.TextBox43, Me.TextBox44, Me.TextBox45, Me.TextBox46, Me.TextBox47, Me.TextBox48, Me.TextBox49, Me.TextBox50 _
, Me.TextBox51, Me.TextBox52, Me.TextBox53, Me.TextBox54, Me.TextBox55, Me.TextBox56, Me.TextBox57, Me.TextBox58, Me.TextBox59}Dim allcheckbox() As CheckBox
allcheckbox = {Me.CheckBox1, Me.CheckBox2, Me.CheckBox3, Me.CheckBox4, Me.CheckBox5, Me.CheckBox6, Me.CheckBox7, Me.CheckBox8, Me.CheckBox9, Me.CheckBox10 _
, Me.CheckBox11, Me.CheckBox12, Me.CheckBox13, Me.CheckBox14, Me.CheckBox15, Me.CheckBox16, Me.CheckBox17, Me.CheckBox18, Me.CheckBox19, Me.CheckBox20 _
, Me.CheckBox21, Me.CheckBox22, Me.CheckBox23, Me.CheckBox24}Dim allComboBox() As ComboBox
allComboBox = {Me.ComboBox1, Me.ComboBox2, Me.ComboBox3, Me.ComboBox4, Me.ComboBox5, Me.ComboBox6, Me.ComboBox7, Me.ComboBox8, Me.ComboBox9, Me.ComboBox10 _
, Me.ComboBox11, Me.ComboBox12, Me.ComboBox13, Me.ComboBox14, Me.ComboBox15, Me.ComboBox16, Me.ComboBox17, Me.ComboBox18, Me.ComboBox19, Me.ComboBox20 _
, Me.ComboBox21}
”******************************************************************************************************************

②ファイルの書き込み
日付名のファイルで保存します。

”***************************************File Name ******************************************************************
‘ If CheckBox8.Checked = True And fname = “” Then
fname2 = Format(Now, “yyyyMMdd_HHmmss”)
fname2 = “C:\vb_LOG\Set_” & fname2 & “.csv”
TextBox59.Text = fname2
‘—MS Example——————————
‘Dim file As System.IO.StreamWriter
‘file = My.Computer.FileSystem.OpenTextFileWriter(“c:\test.txt”, True)
‘file.WriteLine(“Here is the first string.”)
‘file.Close()
‘——————————————
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(“Shift_JIS”)
file2 = My.Computer.FileSystem.OpenTextFileWriter(fname2, False, enc)
‘ End If
‘=====TextBox Save========For cIndex = 0 To 58
textboxdata = allTextBox(cIndex).Text & “,”
file2.Write(textboxdata)
Next
file2.Write(vbCrLf)
For cIndex = 0 To 23
checkboxdata = allcheckbox(cIndex).Checked & “,”
file2.Write(checkboxdata)
Next
file2.Write(vbCrLf)
For cIndex = 0 To 20
comboboxdata = allComboBox(cIndex).SelectedIndex & “,”
file2.Write(comboboxdata)
Next
file2.Write(vbCrLf)
file2.Close()

③ファイルをダイアログ開いて読み込み

DOBON NET様のファイルダイアログサンプルをそのままもってきました。https://dobon.net/vb/dotnet/form/openfiledialog.html

ファイルの読み込みは、MSのサンプルをまるごとコピーしました。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/developing-apps/programming/drives-directories-files/how-to-read-from-comma-delimited-text-files

データは、下図も順番が決まっているので、読み込んだFIELD毎に順番に
TextBox配列().text=currentField
Cehckbox配列().checked=CType(currentField, Boolean)
ComboBox配列().selectedIndex=currentField
とかきこむだけです。

Using MyReader As New Microsoft.VisualBasic.
FileIO.TextFieldParser(ofd.FileName)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(“,”)
Dim currentRow As String()
cIndex = 0
While Not MyReader.EndOfDataTry
currentRow = MyReader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
‘MsgBox(currentField)
readata(cIndex) = currentField
Debug.Print(cIndex & “:” & readata(cIndex))
‘=====TextBox input=====
If cIndex < 59 Then
allTextBox(cIndex).Text = currentField
End If
If cIndex > 59 And cIndex < 84 Then
allcheckbox(cIndex – 60).Checked = CType(currentField, Boolean)
End If
If cIndex > 84 And cIndex < 106 Then
allComboBox(cIndex – 85).SelectedIndex = currentField
End IfcIndex = cIndex + 1
NextCatch ex As Microsoft.VisualBasic.
FileIO.MalformedLineException
MsgBox(“Line ” & ex.Message &
“is not valid and will be skipped.”)
End Try
End While
End Using

 ※全体のプログラムは、長くてごちゃごちゃしているので、お役にはたたないと思いますが、備忘録用にGISTにアップしおきます。rev074です。
https://gist.github.com/dj1711572002/86c009a75c775ce159a7d3b067ae6d05

●以後
 校正実験しながら、プログラムを改良していきます。手軽にいじれる点がVBの良さだと思います。
 つぎはぎだらけなので、ご本人でもわからないプログラムになってしまうので、備忘録をしっかり残しておきっます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です