2017年1月23日月曜日

VB My.Settings の Version Up 問題回避 と Collection 格納

VB.net のプログラムで、 変数の設定値 や 動作状態 を保存して置くには、
My.Setting を利用するのが便利ですね。
でも、 ふたつ、気を付けた方が良い事があります。
それは、  Version Up の問題 と Collection の扱い です。


様々な対処方法があると思いますので、
以下に示すのは、 その一例とお考え下さい。

また、 Code は WPF で書いたものですが、
基本的に、 Form でも同じ考え方で OK です。



先ずは、 Version Up の問題。

ご存知の様に、 My.Setting は user.config ファイル ( XML 形式 ) として、所定の場所に保存されます。
ユーザー(個人)プロファイル の AppData 配下 になりますね。
これは、 バージョン毎に独立したフォルダ構成を取ります。
ですから、 基本的には、 プログラムの更新をして、 そのバージョン番号を繰り上げると、
また、別の フォルダが用意され、 そこにファイルが格納されます。
バージョンアップで、 一から新しく再スタート! と言うのは、非常に、限られたケースだと思います。
通常は、今迄の環境(変数の設定値 や 動作状態) を、 繰り越し したい のではないでしょうか。

そこで、 以下の方法で、 旧バージョンの My.Settimg を 繰り越して あげましょう。
この方法では、既に設定されている 変数 をそのまま保持 しますので、
Project に 途中から この バージョン更新対応 を取り入れる事が可能です。

こんなコード。  Project の Setting に 項目 UpdateRequired を追加の上。.
Class MainWindow
    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
       SetAppUpdate()      'user.config Upgrade For App Version Up
    End Sub

    Private Sub SetAppUpdate()
        'For user.config
        'UpdateRequired     Type:Boolean   DefaultValue:True
        If My.Settings.UpdateRequired Then
            My.Settings.Upgrade()
            My.Settings.UpdateRequired = False
            My.Settings.Save()
        End If
    End Sub
End Class


さて、 次は、 Collection の扱い。
XML シリアライズが必要ですから、
簡単に済ますなら、 System.Collections.Specialized.StringCollection を使います。  Visual Studio 2013 検証。.

これに、 初期値として、 何かしら( Code 中の例では 'Sample' ) を格納した状態にして置きます。
  Visual Studio の Project の Settings タブから作業します。 「 ... 」 ボタン で値を設定しましょう。
  初期値なしでも良いのですが、 .Count 等のロジック ( Nothing 対応 )が複雑になり易いので、
  未設定である旨が分かる値を事前に入れて置くのが簡単です。
  勿論、実行環境に左右されないものであれば、最初から、正規の値を代入して置いても良いのは当然です。 
プログラムを起動した、最初の段階で、 値をチェックし、
もし、その 何か ( 'Sample' ) ひとつ しか 入っていなければ、
これを削除し、 所定の値 群 を 順次 格納して行きます。

Collection を格納したい場合には、こんなコード。

  細かい値の操作用ロジックは省略していますが、
  単に、 Project 内で自由に使える 変数 として valuableXXX を設定し、
  これを My.Settings に登録するだけです。
  シリアライズ化を前提に用意された System.Collections.Specialized.StringCollection は、
  そのまま Collection として利用が可能です。.

Class MainWindow

    'Setting User Scope
    'Collection for user.config
    ' Type:System.Collections.Specialized.StringCollection
    'Please Set Default Value   ex. 'Sample'    (Handling on Program)

    Friend valuableXXX As New System.Collections.Specialized.StringCollection

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    End Sub

    Friend Sub ReadSetting()

    End Sub

    Friend Sub WriteSetting()

    End Sub
End Class


いや、 どうしても、valuableYYY は List(of String) じゃなけりゃ と言うのなら、
以下のコード。

   Settings の View Code から 以下の記述を追加します。  灰色の部分は Default 。 黒字のみ追加。.
   但し、一般的な項目、 String や Boolean の様に、 Settings タブ内で設定値を記述する事は出来ません。
   また、 このタブ内で、 変数 valuableYYY は登場しません。  登録してはいけません。.

    Partial Friend NotInheritable Class MySettings

        <Global.System.Configuration.UserScopedSettingAttribute()> _
        Public Property valuableYYY() As System.Collections.Generic.List(Of String)
            Get
                Return CType(Me("valuableYYY"), System.Collections.Generic.List(Of String))
            End Get
            Set(ByVal value As System.Collections.Generic.List(Of String))
                Me("valuableYYY") = value
            End Set
        End Property

    End Class


少し、端折って書いてしまいましたが、 何かの参考になれば幸いです。



0 件のコメント:

コメントを投稿