午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

シリアライズ、クラス、オブジェクトの複数の設定の保存

昨日の

gogowaten.hatenablog.com

シリアライズ、クラス、オブジェクトの設定の保存 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
続きで今度は二つ(複数)の設定を保存して保存したものから読み込んで設定に反映できるかのテスト
この方法であっているのかは不明だけど目的は達成されたのでメモ

イメージ 1
動作は登録ボタンでコンボボックスに項目を登録
コンボボックスの項目を選択すると設定してある色で登録ボタンの背景色を変更
設定保存ボタンで設定をシリアライズしてバイナリ形式でファイルに保存
設定読み込みボタンでファイルを読み込んでデシリアライズしてコンボボックスに項目を登録
クリアボタンはコンボボックスの項目を消去

登録→コンボボックスの項目を変更で色が変化するか確認→設定保存→
アプリ終了→アプリ実行→設定読み込み→
コンボボックスの項目に登録されているか確認→
コンボボックスの項目を変更で色が変化するか確認



二つのクラスを作った
設定を記録するクラス、名前はmyFontにした
複数の設定を一つのリストにするクラス、名前はmyFontListにした
 
'設定を記録するクラス
<Serializable> Class myFont
    Private _fColor As Color
    Public Property fColor As Color '色
        Get
            Return _fColor
        End Get
        Set(value As Color)
            _fColor = value
        End Set
    End Property

    Private _fSize As Integer
    Public Property fSize As Integer '数値
        Get
            Return _fSize
        End Get
        Set(value As Integer)
            _fSize = value
        End Set
    End Property

    Private _fName As String
    Public Property fName As String '文字列
        Get
            Return _fName
        End Get
        Set(value As String)
            _fName = value
        End Set
    End Property
End Class
 
このmyFontクラスで記録できるのはColor(色)とInteger(整数値)とString(文字列)の三種類
このクラスはプロパティを3つ作っただけなのでこれであっていると思う
myFontとか名前を付けたけどフォントと関係なくなったw
 
 
 
'複数の設定をリストにするクラス
<Serializable> Class myFontList
    Private fList As New List(Of myFont) 'myFont型のリスト
    Private fName As New List(Of String) 'コンボボックスの項目用リスト

    Public Sub Add(value As myFont) 'myFontをリストに追加する
        fList.Add(value)
        fName.Add(value.fName)
    End Sub

    Public Function Name2Color(str As String) As Color '名前を受け取って色を返す
        Dim i As Integer = fName.IndexOf(str)
        'Dim col As Color = fList.Item(i).fColor
        Return fList.Item(i).fColor
    End Function

    Public Function Index2Color(i As Integer) As Color 'インデックスを受け取って色を返す
        Return fList.Item(i).fColor
    End Function

    Public Function NameList() As String() 'コンボボックスの項目用リストを返す
        Dim n(fName.Count - 1) As String
        For i As Integer = 0 To UBound(n)
            n(i) = fName(i)
        Next
        Return n

    End Function
End Class
 
このmyFontListクラスはメソッド(関数?)ばかり、クラスを作成する自体慣れていなくてその中でメソッドを使うのは初めて
fListの変数に受け取った設定をどんどん追加していく
なのでこれをシリアライズして保存すれば追加されたぶんだけいくつでも設定が保存できるってことになるはず
Addメソッドで受け取った設定(myFont)をfListに追加していく
 
myFontとmyFontList二つ作ったのはひとつに纏める方法がわからなかったから
そもそもひとつにまとめたほうがいいのかどうなのかもわかんない
 
最後にいつものForm1
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class Form1
    Private myfl As New myFontList

    Private Sub Button登録_Click(sender As Object, e As EventArgs) Handles Button登録.Click
        '一個目の設定
        Dim myf As New myFont
        myf.fColor = Color.Red '色
        myf.fSize = 30 '数値
        myf.fName = "赤文字" '文字列
        myfl.Add(myf) 'リストに登録

        '二個目の設定
        myf = New myFont
        myf.fColor = Color.FromArgb(233, 145, 23, 123)
        myf.fSize = 23
        myf.fName = "適当な色"
        myfl.Add(myf) 'リストに登録

        ComboBox1.Items.AddRange(myfl.NameList) 'コンボボックスに項目を登録
    End Sub

    'シリアライズしてバイナリ形式で保存、バイナリ形式シリアライズ?
    Private Sub Button保存_Click(sender As Object, e As EventArgs) Handles Button設定保存.Click
        Dim fs As New FileStream("F:\png\data.bin", FileMode.Create)
        Dim bf As New BinaryFormatter
        bf.Serialize(fs, myfl)
        fs.Close()

    End Sub

    '保存した設定ファイルを読み込んでデシリアライズして読み込み
    Private Sub Button読み込み_Click(sender As Object, e As EventArgs) Handles Button設定読み込み.Click
        Dim fs As New FileStream("F:\png\data.bin", FileMode.Open)
        Dim bf As New BinaryFormatter
        myfl = DirectCast(bf.Deserialize(fs), myFontList) '変数myflにデシリアライズしたものを入れる
        fs.Close()
        Me.ComboBox1.Items.AddRange(myfl.NameList) '読み込んだ設定から文字列を取り出してコンボボックスに項目としてを登録

    End Sub
    'コンボボックスの項目をすべて削除

    Private Sub Buttonクリア_Click_1(sender As Object, e As EventArgs) Handles Buttonクリア.Click
        Me.ComboBox1.Items.Clear()
        Me.ComboBox1.Text = ""

    End Sub

    'コンボボックスの項目を変更した時、登録ボタンの背景色を変更
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        Dim i As Integer = Me.ComboBox1.SelectedIndex
        Dim s As String = Me.ComboBox1.SelectedItem
        Dim col As Color = myfl.Name2Color(s)
        'Dim col As Color = myfl.Index2Color(i)
        Me.Button登録.BackColor = col

    End Sub
End Class
一個目の設定は色が赤(255,255,0,0)、数値は30、文字列は「赤文字」
二個目の設定は色が(233,145,23,123)、数値は23、文字列は「適当な色」
設定を保存する場所はF:\png\data.bin
 

f:id:gogowaten:20191017120338p:plain

画像だとこう

f:id:gogowaten:20191017120351p:plain

デザイン画面はこう
コンボボックス一個とボタンが4つ
実行
イメージ 3
最初はコンボボックスには何も登録されていないのを確認
 
登録ボタンを押す
イメージ 4
項目が登録された
 
「赤文字」項目を選択
イメージ 5
登録ボタンの背景色が赤(255,255,0,0)になった

イメージ 6
同様に「適当な色」に設定した色(233, 145, 23, 123)もしっかり反映されている
 
これで設定は正しくされているので設定保存、ここからが大事

f:id:gogowaten:20191017120415p:plain

F:\pngを見てみるとdata.binが保存されているのでアプリを再起動する
 
イメージ 8
コンボボックスの項目が空なのを確認
 
設定読み込みボタンを押してからコンボボックスの項目を確認
イメージ 9
できたみたい
 
項目を選択

f:id:gogowaten:20191017120431p:plain

できた!
 
一個目の設定は色が赤(255,255,0,0)、数値は30、文字列は「赤文字」
二個目の設定は色が(233,145,23,123)、数値は23、文字列は「適当な色」
これの保存と復元ができた
数値はどうなのかローカルウィンドウで確認してみる
と思ったらローカルウィンドウではみれなかったので
ウォッチウィンドウで確認してみる
ウォッチウィンドウ開き方メモ

f:id:gogowaten:20191017120443p:plain

デバッグ→ウィンドウ→ウォッチ
 

f:id:gogowaten:20191017120457p:plain

設定を読み込んだ後に一時停止して確認したいので
ブレークポイントは42行目にして
アプリを実行して設定読み込みボタンを押す、一時停止するので
 

f:id:gogowaten:20191017120508p:plain

38行目で変数のmyflにファイルから読み込んだものを入れているので
myflを右クリックしてメニューからウォッチ式の追加で
ウォッチウィンドウに追加して中身を確認してみると
しっかり2つ分の設定が入っているのが確認できた
 
うーん、できたなあ
次はPixtack紫陽花の文字の描画の設定を複数記録できるようにしたい
テスト機能の文字の描画のタブには空き場所がないから新しいウィンドウを作る?タブを増やす?新しく作るクラスは二つ?