Option Strict Off
Option Explicit On
Imports System.Windows.Forms
'------------------------------------ 2024/03/23 ------------------------------------
Public Class 五clsAppINI

#Region "使用方法のサンプル"

#Region "アプリの　Public.Bas　モジュールへ追加"
    ''▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    ''***************************************************************************
    'Public gggAppIniFile As 五clsAppINI  'アプリの　Public.Bas　モジュールで宣言する。
    ''***************************************************************************
    ''▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#End Region

#Region "アプリの　メインフォームへのみ追加"
    ''▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    ''---------------------------------------------------------------------------
    'Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '    '◆◆◆メインホームにのみ設定するコード◆◆◆　メインホームの  frmMain_Load  で、グローバルオブジェクトを作成する。
    ''    ...
    '    gggAppIniFile = New 五clsAppINI                                             'オブジェクトを作成する。
    '    gggint = gggAppIniFile.SetIniFileName(ⅩAppフォルダ名(), ⅩAppタイトル名())  'INI ファイル名を設定する。
    ''    ...
    '    '以下のいずれかのコードを使用する。
    '    Dim IniDataStr As String = ""
    '    gggint = zzAppIniFileOp(0, IniDataStr)      'INI ファイルが存在しない場合に、何もしないコード。
    '    If Not zzAppIniFileOp(0, IniDataStr) Then gggint = ⅩFormMove(gcoフォームをスクリーン中心に移動, Me)   'INI ファイルが存在しない場合に、このフォームを画面のセンターに表示するコード。
    ''    ...
    'End Sub
    ''---------------------------------------------------------------------------
    'Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    '    '◆◆◆メインホームにのみ設定するコード◆◆◆　メインホーム内からのみ呼び出します。
    ''    ...
    '    Dim IniDataStr As String = ""
    '    gggint = zzAppIniFileOp(1, IniDataStr)  '必ず呼び出します。
    ''    ...
    'End Sub
    ''---------------------------------------------------------------------------
    'Private Sub frmMain_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
    '    '◆◆◆メインホームにのみ設定するコード◆◆◆　メインホーム内からのみ呼び出します。
    '    gggint = zzAppIniFileOp(2, "")
    'End Sub
    'Private Sub frmMain_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move
    '    '◆◆◆メインホームにのみ設定するコード◆◆◆　メインホーム内からのみ呼び出します。
    '    gggint = zzAppIniFileOp(2, "")
    'End Sub
    ''---------------------------------------------------------------------------
    'Private Function zzAppIniFileOp(ByVal Load_0_QueryUnload_1_Resize_2_DoIniSave_3 As Integer, ByRef rwIniDataStr As String) As Boolean
    '    '◆◆◆メインホームにのみ設定するコード◆◆◆　メインホーム内からのみ呼び出します。
    '    '読出し時に　INI ファイルが存在しない場合は　False　を返します。
    '    If gggAppIniFile Is Nothing Then Return False
    '    Try
    '        Dim RETVAL As Boolean = False
    '        Dim Open0_Save1 As Integer, opcode As Integer
    '        Open0_Save1 = Load_0_QueryUnload_1_Resize_2_DoIniSave_3
    '        With gggAppIniFile
    '            Select Case Open0_Save1
    '                Case 0, 1
    '                    '******************************************************************************************************
    '                    '◆◆◆注意　以下のコード内では、全ての　◆ユーザー名◆　に異なる文字列を指定します。◆◆◆
    '                    '******************************************************************************************************
    '                    'アプリ内の各フォームと、そのフォーム内の多種類のコントロールの状態を、最大１度に１０個まで保存と復元ができます。
    '                    '以下のメソッドは ◆何回でも◆ 呼び出せます。
    '                    '複数回呼び出す場合には　初回以外では、フォームのプロパティ設定指示引数 　◆rOpCodeForm には必ず 0◆　を指定します。
    '                    '複数回呼び出す場合には　◆ユーザー名◆　には毎回異なる文字列を指定します。
    '                    opcode = 0    'or ... 追加できるコード  ---> 五clsAppINI.cAppIniCaption Or 五clsAppINI.cAppIniBackColor Or 五clsAppINI.cAppIniForeColor
    '                    RETVAL = gggAppIniFile.OpenSaveMain(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, 五clsAppINI.cAppIniFormPostSize Or opcode)  'or ... 追加できるコード  ---> , Text1, 五clsAppINI.cAppIniText Or 五clsAppINI.cAppIniTextSelSttLen Or 五clsAppINI.cAppIniFontName Or 五clsAppINI.cAppIniFontSize, List1, 五clsAppINI.cAppIniList Or 五clsAppINI.cAppIniListIndex, Check1, 五clsAppINI.cAppIniValue,  ETC ........)
    '                    '******************************************************************************************************
    '                    '◆通常以下の呼び出しは不要です◆　任意の文字列を、個別の文字列の場合は１度に１０個まで保存と復元ができます。文字列配列の場合はサイズに制限はありません。
    '                    '------------------------------------------------------------------------------------------------------
    '                    '以下のメソッドは ◆何回でも◆ 呼び出せます。
    '                    '複数回呼び出す場合には　◆ユーザー名◆　には毎回異なる文字列を指定します。
    '                    'gggint = gggAppIniFile.OpenSaveString(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, rwIniDataStr) 
    '                    'gggint = gggAppIniFile.OpenSaveString(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, str1, str2, str3, str4, ..... )   '個別の文字列のデーターを使用
    '                    'gggint = gggAppIniFile.OpenSaveStrAry(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, StrAry())                         '文字列配列のデーターを使用 ( 改行コードの混入も許可 )
    '                    '******************************************************************************************************
    '                Case 2
    '                    'それぞれのフォームで、位置とサイズのデーターを保存します。
    '                    RETVAL = gggAppIniFile.FormSizeDataSetOnReSize(Me)
    '            End Select
    '            '******************************************************************************************************
    '            'ユーザーアプリから明示的に INI ファイルを保存します。
    '            If Open0_Save1 = 1 Then
    '                gggint = gggAppIniFile.IniFileSaveDo
    '            End If
    '            '******************************************************************************************************
    '        End With
    '        Return RETVAL
    '    Catch
    '        MsgBox(ErrorToString)
    '    End Try
    '    Return False
    'End Function
    ''---------------------------------------------------------------------------
    ''▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#End Region

#Region "アプリの　各ホームへ追加"
    ''▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    ''***************************************************************************
    ''◆◆◆以下のコードは、メインホーム以外の、全てのフォームで使用できます。　◆◆◆
    ''***************************************************************************

    '#Region "Form イベント"
    ' '' ''---------------------------------------------------------------------------
    '' ''Private Sub Form@@@@_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' '' ''    ...
    '' ''    '以下のいずれかのコードを使用する。
    '' ''    gggint = zzAppIniFileOp(0)      'INI ファイルが存在しない場合に、何もしないコード。
    '' ''    If Not zzAppIniFileOp(0) Then gggint = ⅩFormMove(gcoフォームをスクリーン中心に移動, Me)   'INI ファイルが存在しない場合に、このフォームを画面のセンターに表示するコード。
    '' ''    If Not zzAppIniFileOp(0) Then gggint = ⅩFormMove(gcoフォームを親フォームの中心に移動, Me, , , , , , , , rOwner)  'INI ファイルが存在しない場合に、このフォームを rOwner のセンターに表示するコード。
    ' '' ''    ...
    '' ''End Sub
    ' '' ''---------------------------------------------------------------------------
    '' ''Private Sub Form@@@@_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    '' ''    gggint = zzAppIniFileOp(1)  '必ず呼び出します。
    '' ''End Sub
    ' '' ''---------------------------------------------------------------------------
    '' ''Private Sub Form@@@@_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
    '' ''    gggint = zzAppIniFileOp(2)
    '' ''End Sub
    '' ''Private Sub Form@@@@_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move
    '' ''    gggint = zzAppIniFileOp(2)
    '' ''End Sub
    ' '' ''---------------------------------------------------------------------------
    '#End Region

    ''▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    ''フォームサイズと位置だけを保存する場合の、簡易_共通処理
    ''各フォームに記入する。
    'Private Function zzAppIniFileOp(ByVal Load_0_QueryUnload_1_Resize_2_DoIniSave_3 As Integer) As Boolean
    '    '読出し時に　INI ファイルが存在しない場合は　False　を返します。
    '    If gggAppIniFile Is Nothing Then Return False
    '    Return gggAppIniFile.aaAppIniFileOp_フォームサイズと位置だけ_共通処理(Load_0_QueryUnload_1_Resize_2_DoIniSave_3, Me, "固有の識別文")
    'End Function
    ''▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    ''---------------------------------------------------------------------------
    ''▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    ''フォームサイズと位置だけではなく、いろんなデーター保存する場合の処理
    ''各フォームに記入する。
    'Private Function zzAppIniFileOp(ByVal Load_0_QueryUnload_1_Resize_2_DoIniSave_3 As Integer) As Boolean
    '    '読出し時に　INI ファイルが存在しない場合は　False　を返します。
    '    If gggAppIniFile Is Nothing Then Return False
    '    Try
    '        Dim RETVAL As Boolean = False
    '        Dim Open0_Save1 As Integer, opcode As Integer, sstmp As String
    '        Open0_Save1 = Load_0_QueryUnload_1_Resize_2_DoIniSave_3
    '        With gggAppIniFile
    '            Select Case Open0_Save1
    '                Case 0, 1
    '                    '******************************************************************************************************
    '                    '◆◆◆注意　以下のコード内では、全ての　◆ユーザー名◆　に異なる文字列を指定します。◆◆◆
    '                    '******************************************************************************************************
    '                    'アプリ内の各フォームと、そのフォーム内の多種類のコントロールの状態を、最大１度に１０個まで保存と復元ができます。
    '                    '以下のメソッドは ◆何回でも◆ 呼び出せます。
    '                    '複数回呼び出す場合には　初回以外では、フォームのプロパティ設定指示引数 　◆rOpCodeForm には必ず 0◆　を指定します。
    '                    '複数回呼び出す場合には　◆ユーザー名◆　には毎回異なる文字列を指定します。
    '                    opcode = 0    'or ... 追加できるコード  ---> 五clsAppINI.cAppIniCaption Or 五clsAppINI.cAppIniBackColor Or 五clsAppINI.cAppIniForeColor
    '                    RETVAL = gggAppIniFile.OpenSaveMain(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, 五clsAppINI.cAppIniFormPostSize Or opcode)  'or ... 追加できるコード  ---> , Text1, 五clsAppINI.cAppIniText Or 五clsAppINI.cAppIniTextSelSttLen Or 五clsAppINI.cAppIniFontName Or 五clsAppINI.cAppIniFontSize, List1, 五clsAppINI.cAppIniList Or 五clsAppINI.cAppIniListIndex, Check1, 五clsAppINI.cAppIniValue,  ETC ........)
    '                    '******************************************************************************************************
    '                    '◆通常以下の呼び出しは不要です◆　任意の文字列を、個別の文字列の場合は１度に１０個まで保存と復元ができます。文字列配列の場合はサイズに制限はありません。
    '                    '------------------------------------------------------------------------------------------------------
    '                    '以下のメソッドは ◆何回でも◆ 呼び出せます。
    '                    '複数回呼び出す場合には　◆ユーザー名◆　には毎回異なる文字列を指定します。
    '                    'gggint = gggAppIniFile.OpenSaveString(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, str1, str2, str3, str4, ..... )   '個別の文字列のデーターを使用
    '                    'gggint = gggAppIniFile.OpenSaveStrAry(Open0_Save1, Me.Name & ◆ユーザー名◆, Me, StrAry())                         '文字列配列のデーターを使用 ( 改行コードの混入も許可 )
    '                    '******************************************************************************************************
    '                Case 2
    '                    'それぞれのフォームで、位置とサイズのデーターを保存します。
    '                    RETVAL = gggAppIniFile.FormSizeDataSetOnReSize(Me)
    '            End Select
    '        End With
    '        Return RETVAL
    '    Catch
    '        MsgBox(ErrorToString)
    '    End Try
    '    Return False
    'End Function
    ''***************************************************************************
    ''▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#End Region

#End Region

#Region "Private 定数と変数"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Const cAppIniCaption As Integer = &H1 'Caption プロパティの保存と復元                       フォーム、コントロール
    Public Const cAppIniVisible As Integer = &H2 'Visible プロパティの保存と復元                       フォーム、コントロール
    Public Const cAppIniEnabled As Integer = &H4 'Enabled プロパティの保存と復元                       フォーム、コントロール
    Public Const cAppIniBackColor As Integer = &H8 'BackColor プロパティの保存と復元                   フォーム、コントロール
    Public Const cAppIniForeColor As Integer = &H10 'ForeColor プロパティの保存と復元                  フォーム、コントロール
    Public Const cAppIniSize As Integer = &H20 'Left / Top / Width / Height プロパティの保存と復元     コントロール
    Public Const cAppIniFormPostSize As Integer = &H20 'Left / Top / Width / Height プロパティの保存と復元         フォーム
    Public Const cAppIniText As Integer = &H1000 'Text プロパティの保存と復元                          テキストボックス
    Public Const cAppIniTextSelSttLen As Integer = &H2000 'Text の SelStart / SelLength プロパティの保存と復元      テキストボックス
    Public Const cAppIniList As Integer = &H4000 'List 全体のプロパティの保存と復元                     リストボックス、コンボボックス
    Public Const cAppIniListIndex As Integer = &H8000 'ListIndex プロパティの保存と復元                 リストボックス、コンボボックス
    Public Const cAppIniListMultiSel As Integer = &H10000 '複数選択リスト のプロパティの保存と復元        リストボックス
    Public Const cAppIniValue As Integer = &H40000 'Value プロパティの保存と復元                         オプションボタン、水平スクロールバー、垂直スクロールバー
    '2023/07/13
    Public Const cAppIniFontSize As Integer = &H80000 'Font Size プロパティの保存と復元     

    '2025/05/03 追加 ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    Public Const cAppIniFontDataAll As Integer = &H100000 'Font Data すべてのプロパティの保存と復元     
    '2025/05/03 追加 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

    '-----------------------------------------------------------
    Private Const cIniFileExt As String = "AppIni"
    Private Const cIniFileHedStrDEF As String = "五clsAppINI が作成したアプリケーション INI ファイル Ver-2022-05"  'このクラス使用者が自由に設定できる　mIniFileHedStr = Property IniFileHedStr() As String の規定値。
    Private mIniFileHedStr As String = "", mIniFileFullPath As String = "", mAppFolderPath As String = ""
    '***********************************************************
    '2023/06/22 chg --------------------------------------------
    Private Const cChr7 As String = Chr(7)
    Private Const cCutChar1 As String = ":" & cChr7                           'データーブロック内の、最小要素の区切り記号
    Private Const cCutChar2 As String = ":" & cChr7 & cChr7                   'データーブロック内の、小要素の区切り記号
    Private Const cCutChar3 As String = ":" & cChr7 & cChr7 & cChr7           'データーブロック内の、中要素の区切り記号
    Private Const cCutChar4 As String = ":" & cChr7 & cChr7 & cChr7 & cChr7   'データーブロック内の、大要素の区切り記号
    '改行の入っているユーザーの文字配列データーに使用する
    Private Const cCutChar1310 As String = cCutChar1 & cCutChar2 & cCutChar3 & cCutChar4 & cCutChar4 & cCutChar3 & cCutChar2 & cCutChar1 & vbCrLf
    '-----------------------------------------------------------
    Private Const cCutEnd As String = ":" & cCutChar4 & vbCrLf & ":" & cCutChar4 & "◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆" & ":" & cCutChar4 & vbCrLf '各メソッド呼び出し単位での、データーブロックの末尾記号
    '2020/09/24 add --------------------------------------------
    Private Const cAppPath置換文字列oldver As String = "\||" & cChr7 & "\|" & "AppPath置換文字列" & "|\" & cChr7 & "||\"
    Public Const cAppPath置換文字列2022 As String = "■:AppPath:■"
    '-----------------------------------------------------------
    Private m置換文字列() As String = {""} '(1,2), (3,4), .... (アプリコード内の文字, ファイル内の文字) のペア
    '2023/06/22 chg --------------------------------------------
    '***********************************************************
    Private mIniData() As String = {""}
    Private mDataOpenDone As Boolean = False, mファイル保存済み As Boolean = False
    Private mWndOldSizeStr As String = ""
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "初期化"
    Public Sub New()
        '2023/06/22 chg --------------------------------------------
        IniFileHedStr = cIniFileHedStrDEF
        gggint = zzIniDataReset()
        mDataOpenDone = False
        mファイル保存済み = False
        'Debug.Print "Initialize"
    End Sub
    Protected Overrides Sub Finalize()
        ''qqqqq(mIniFileFullPath)
        ''gggint = zzIniFileSave()   '2023/11/04 ERROR 発見 ファイルを作らずに、空で使用した場合に、無限ルーフになりうる。
        MyBase.Finalize()
    End Sub
#End Region

#Region "置換文字列群の操作"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function aa置換文字列群の初期設定(ByVal 置換文字列群 As String, ByVal cut As String) As Boolean
        '置換文字列群 = アプリコード内の文字 & cut & ファイル内の文字 & cut & アプリコード内の文字 & cut & ファイル内の文字 & cut & .................
        'Private m置換文字列() As String = {""}  '(1,2), (3,4), .... (アプリコード内の文字, ファイル内の文字) のペア
        ReDim m置換文字列(0)
        If 置換文字列群 = "" Or cut = "" Then Return False
        '---------------------------------------------------------------------------------
        Dim max As Integer = Ⅹ文をカットして配列にする(置換文字列群, cut, m置換文字列, False)
        If max Mod 2 = 0 Then
            Return True
        Else
            MsgBox("aa置換文字列群の初期設定() でエラーが発生しました。")
            Return False
        End If
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function aa置換文字を実行(ByVal ファイルopen1_ファイルsave2 As Integer, ByRef www As String) As Boolean
        'Private m置換文字列() As String = {""}  '(1,2), (3,4), .... (アプリコード内の文字, ファイル内の文字) のペア
        Dim 検索, 置換 As String, a, p, len検索, len置換 As Integer
        For a = 1 To UBound(m置換文字列) - 1 Step 2
            If ファイルopen1_ファイルsave2 = 1 Then
                検索 = m置換文字列(a + 1) : 置換 = m置換文字列(a)
            Else
                検索 = m置換文字列(a) : 置換 = m置換文字列(a + 1)
            End If
            len検索 = Len(検索)
            len置換 = Len(置換)
            p = 1
            Do While p < Len(www)
                p = InStr(p, www, 検索)
                If p > 0 Then
                    www = Left(www, p - 1) & 置換 & Mid(www, p + len検索)
                    p = p + len置換
                Else
                    Exit Do
                End If
            Loop
        Next
        Return True
    End Function
#End Region

#Region "関数"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function aaAppIniFileOp_フォームサイズと位置だけ_共通処理(ByVal Load_0_QueryUnload_1_Resize_2_DoIniSave_3 As Integer, ByVal rForm As Form, ByVal rKeStr As String) As Boolean
        If rForm Is Nothing Then Return False
        Try
            Dim RETVAL As Boolean = False
            Select Case Load_0_QueryUnload_1_Resize_2_DoIniSave_3
                Case 0, 1
                    RETVAL = OpenSaveMain(Load_0_QueryUnload_1_Resize_2_DoIniSave_3, rForm.Name & rKeStr, rForm, cAppIniFormPostSize)
                Case 2
                    RETVAL = FormSizeDataSetOnReSize(rForm)      'それぞれのフォームで、位置とサイズのデーターを保存します。
            End Select
            Return RETVAL
        Catch
            MsgBox(ErrorToString)
        End Try
        Return False
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public ReadOnly Property IniFileExt() As String
        'このコントロールが作成する INI ファイルの拡張子。 "AppIni"  変更できません。
        Get
            Return cIniFileExt
        End Get
    End Property
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public ReadOnly Property ErrorChar() As String
        'ファイル内で文字列カットに使用する Char でユーザーが使用できない文字  Chr(7)  変更できません。
        Get
            Return cCutChar1
        End Get
    End Property
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Property IniFileHedStr() As String
        'INI ファイルの正当性をチェックするために、ファイルの先頭に書き込み／読み出すキー文字列。最大２５０字まで。
        'このプロパティに、 Chr$(7), Chr$(10), Chr$(13)　は使用できません。
        Get
            Return mIniFileHedStr
        End Get
        Set(ByVal Value As String)
            If InStr(Value, vbLf) > 0 Or InStr(Value, vbCr) > 0 Or InStr(Value, ErrorChar) > 0 Then
                MsgBox("IniFileHedStr　プロパティに、 Chr$(7), Chr$(10), Chr$(13)　は使用できません。")
                Exit Property
            End If
            mIniFileHedStr = Left(Value, 250)
            '    PropertyChanged "IniFileHedStr"
        End Set
    End Property
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function SetIniFileName(ByRef rFolderPath As String, ByRef rFileTitle As String, Optional ByVal 置換文字列群 As String = "", Optional ByVal cut As String = "") As Boolean
        'このコントロールは、必ずアプリケーションのメインフォームに作成します。
        'メインフォームが表示される直前に、 INI ファイルのフルネーム名を、このコントロールに設定します。
        'INI ファイルの、フォルダのフルパス名を rFolderPath に、ファイルタイトル名を、rFileTitle に設定します。
        'INI ファイルの拡張子は　.AppIni　で変更できません。
        'これらの文字列の設定をしなければ、このコントロールは無効です。
        '------------------------------------------------------------------------------------------------------
        '通常以下のコードでメインフォームの　Form_Load　イベント内から ◆１回だけ◆ だけ呼び出します。
        'gggint = AppIniFile1.SetIniFileName(ⅩAppフォルダ名(), ⅩAppタイトル名())
        '------------------------------------------------------------------------------------------------------
        Dim www As String = "" : Dim tmp() As String = {""} : Dim a As Integer
        If mDataOpenDone = True Then Return True
        Try
            '------------------------------------------------------------------------------------------------------
            gggbol = aa置換文字列群の初期設定(置換文字列群, cut)
            '------------------------------------------------------------------------------------------------------
            If Ⅹフォルダは存在(rFolderPath) And ⅩFileNameCheck(rFileTitle) Then
                mAppFolderPath = rFolderPath
                mIniFileFullPath = Ⅹパスセパレータ付加(rFolderPath) & rFileTitle & "." & IniFileExt
                If ⅩFileTextOpenSave(1, 2, mIniFileFullPath, tmp, www) > 0 Then
                    '------------------------------------------------------------------------------------------------------
                    gggbol = aa置換文字を実行(1, www)
                    gggbol = zzアプリパス文字列を_置換(1, www)
                    '------------------------------------------------------------------------------------------------------
                    If Ⅹ文をカットして配列にする(www, cCutEnd, mIniData) > 0 Then
                        For a = 1 To UBound(mIniData) : gggint = ⅩStrHedCharDel(mIniData(a), vbCrLf) : Next
                        If mIniData(1) <> IniFileHedStr Then gggint = zzIniDataReset() 'もしこのアプリのファイルでなければ、データーは全て無効にしておく
                        mDataOpenDone = True
                        Return True
                    End If
                End If
            Else
                mIniFileFullPath = ""
            End If
            Return False
        Catch ex As Exception
            gggint = zzIniDataReset()
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function IniFileSaveDo() As Boolean
        'ユーザーアプリから明示的に INI ファイルを保存します。これを呼び出すと、AppIniFile1-Class_Terminate() での自動保存は実行されません。
        Return zzIniFileSave()
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzIniDataReset() As Boolean
        ReDim mIniData(1) : mIniData(1) = IniFileHedStr : Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzアプリパス文字列を_置換(ByVal open1_save2 As Integer, ByRef www As String) As Boolean
        'mAppPath置換文字列     = "\||" & chr7 & "\|" & "AppPath置換文字列" & "|\" & chr7 & "||\"
        'mAppPath置換文字列2022 = "■:AppPath:■"
        Dim sAppPath As String = mAppFolderPath
        Dim sAppPathUCASE As String = UCase(sAppPath)
        Dim sAppPathLEN As Integer = Len(sAppPath)
        '2022/10/21 change AppPath rep str
        Dim LEN置換文字列 As Integer = Len(cAppPath置換文字列oldver)
        Dim LEN置換文字列2022 As Integer = Len(cAppPath置換文字列2022)
        Dim p As Integer
        Try
            Select Case open1_save2
                Case 1
                    p = 1
                    Do While p < Len(www)
                        p = InStr(p, www, cAppPath置換文字列2022)
                        If p > 0 Then
                            www = Left(www, p - 1) & sAppPath & Mid(www, p + LEN置換文字列2022)
                            p = p + sAppPathLEN
                        Else
                            Exit Do
                        End If
                    Loop
                    'if old version ............................................
                    p = 1
                    Do While p < Len(www)
                        p = InStr(p, www, cAppPath置換文字列oldver)
                        If p > 0 Then
                            www = Left(www, p - 1) & sAppPath & Mid(www, p + LEN置換文字列)
                            p = p + sAppPathLEN
                        Else
                            Exit Do
                        End If
                    Loop

                Case Else
                    '2023/11/04 error ファイルを作らずに、空で使用した場合に、無限ルーフになりうる。
                    p = 1
                    Do While p < Len(www)
                        p = InStr(p, www, sAppPath)
                        If p > 0 Then
                            www = Left(www, p - 1) & cAppPath置換文字列2022 & Mid(www, p + sAppPathLEN)
                            p = p + LEN置換文字列2022
                        Else
                            Exit Do
                        End If
                    Loop
                    'if UCASE APP.PATH ............................................
                    p = 1
                    Do While p < Len(www)
                        p = InStr(p, www, sAppPathUCASE)
                        If p > 0 Then
                            www = Left(www, p - 1) & cAppPath置換文字列2022 & Mid(www, p + sAppPathLEN)
                            p = p + LEN置換文字列2022
                        Else
                            Exit Do
                        End If
                    Loop
            End Select
            Return True
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzIniFileSave() As Boolean
        If mIniFileFullPath = "" Then
            Return False
        End If
        If mファイル保存済み Then Return True
        Try
            Dim tmp() As String = {""}
            Dim www As String = Ⅹ文を配列から作成(mIniData, cCutEnd & vbCrLf)
            gggbol = zzアプリパス文字列を_置換(2, www)
            gggbol = aa置換文字を実行(2, www)
            mファイル保存済み = CBool(ⅩFileTextOpenSave(2, 2, mIniFileFullPath, tmp, www))
            Return mファイル保存済み
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function FormSizeDataSetOnReSize(ByRef rForm As Form) As Boolean
        'アプリケーションのそれぞれのフォームが、最大化、最小化されたまま、アンロードされた場合に、
        '次回表示時にフォームの位置とサイズが、最大化、最小化される前の状態に戻るように、
        'それぞれのフォームの　Form_Resize　イベント内から必ず呼び出します。
        '------------------------------------------------------------------------------------------------------
        '通常以下のコードでそれぞれのフォームの　Form_Resize　イベント内から呼び出します。
        'gggint = AppIniFile1.FormSizeDataSetOnReSize(Me)
        '------------------------------------------------------------------------------------------------------
        Try
            Dim fom As Form
            If TypeOf rForm Is Form Then fom = rForm Else Return False
            If fom.WindowState <> FormWindowState.Normal Then Return False
            mWndOldSizeStr = CStr(fom.Left) & cCutChar1 & CStr(fom.Top) & cCutChar1 & CStr(fom.Width) & cCutChar1 & CStr(fom.Height) & cCutChar1
            Return True
        Catch
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzGetAryIndex(ByRef Key As String) As Integer
        Dim a As Integer
        If Key <> "" Then
            For a = 2 To UBound(mIniData)
                If InStr(mIniData(a), Key) = 1 Then
                    Return a
                End If
            Next
        End If
        Return 0
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzDataSaveIn_mIniDataAry(ByRef rEntry As String, ByRef rData As String) As Boolean
        Dim a As Integer
        a = zzGetAryIndex(rEntry)
        If a = 0 Then
            a = UBound(mIniData) + 1 : ReDim Preserve mIniData(a)
        End If
        mIniData(a) = rData
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzChkFormObj_MakeHedKeyStr(ByRef rKeyStr As String, ByRef rForm As Form, ByRef rAddExStr As String, ByRef wHedentry As String) As Form
        Dim fom As Form
        If rKeyStr = "" Then Return Nothing
        If rForm Is Nothing Then Return Nothing
        fom = rForm
        wHedentry = ("■■■" & fom.Name) & IIf(rAddExStr <> "", "*" & rAddExStr, "") & ("-") & (rKeyStr) & ("■■■")
        Return rForm
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function OpenSaveStrAry(ByRef Open0_Save1 As Integer, ByRef rKeyStr As String, ByRef rForm As Form, ByRef StrAry() As String) As Boolean
        'アプリケーションの任意の文字列配列データーの、保存と復元をします。
        '------------------------------------------------------------------------------------------------------
        'Open0_Save1 As Integer     復元時 (Form_Load) には 0 を、保存時 (Form_QueryUnload) には 1 を指定します。
        'rKeyStr As String          このメソッドは同時に何回でも呼び出せるので、各呼び出しの区別をするための、それぞれの呼び出しの　rKeyStr　引数は呼出しごとに変更します。
        'rForm As Object            このメソッドを呼び出す親フォームを指定します。
        'StrAry() As String         ユーザーが読み書きに指定する文字列配列です。各要素の文字列内に改行コードも使用できます。ただし Chr$(7) だけは使用できません。
        '------------------------------------------------------------------------------------------------------
        '通常以下のコードでそれぞれのフォームの　Form_Load　と Form_QueryUnload　イベント内から ◆何回でも必要なだけ◆ 呼び出します。
        'Form_Load の OpenSaveStrAry(0, ...)　と Form_QueryUnload の OpenSaveStrAry(1, ...)　の対応する１セットの呼び出しの引数は、Open0_Save1 以外は必ず ◆全て同一◆ にします。
        '------------------------------------------------------------------------------------------------------
        'gggint = AppIniFile1.OpenSaveStrAry(Open0_Save1, @rKeyStr@, Me, StrAry())
        '------------------------------------------------------------------------------------------------------
        On Error GoTo errop
        Dim fom As Form : Dim Hedentry As String = "", sss As String : Dim a As Integer
        '-------------------------------------------------------------
        fom = zzChkFormObj_MakeHedKeyStr(rKeyStr, rForm, "", Hedentry)
        If fom Is Nothing Then Return False
        '-------------------------------------------------------------
        If Open0_Save1 = 0 Then
            ReDim StrAry(0)
            sss = mIniData(zzGetAryIndex(Hedentry))
            a = InStr(sss, cCutChar1310)
            If a = 0 Then Return False
            sss = Mid(sss, a + Len(cCutChar1310))
            Return Ⅹ文をカットして配列にする(sss, cCutChar1310, StrAry)
        Else
            Return zzDataSaveIn_mIniDataAry(Hedentry, Hedentry & cCutChar4 & cCutChar1310 & Ⅹ文を配列から作成(StrAry, cCutChar1310))
        End If
        Return False
        Exit Function
errop:
        Return False
        Exit Function
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function OpenSaveString(ByRef Open0_Save1 As Integer, ByRef rKeyStr As String, ByRef rForm As Form, _
                                    Optional ByRef Str1 As String = "", Optional ByRef Str2 As String = "", Optional ByRef str3 As String = "", Optional ByRef str4 As String = "", _
                                    Optional ByRef str5 As String = "", Optional ByRef str6 As String = "", Optional ByRef str7 As String = "", Optional ByRef str8 As String = "", _
                                    Optional ByRef str9 As String = "", Optional ByRef str10 As String = "") As Boolean
        'アプリケーションの任意の文字列データーを、最大１度に１０個まで保存と復元をします。
        '------------------------------------------------------------------------------------------------------
        'Open0_Save1 As Integer     復元時 (Form_Load) には 0 を、保存時 (Form_QueryUnload) には 1 を指定します。
        'rKeyStr As String          このメソッドは同時に何回でも呼び出せるので、各呼び出しの区別をするための、それぞれの呼び出しの　rKeyStr　引数は呼出しごとに変更します。
        'rForm As Object            このメソッドを呼び出す親フォームを指定します。
        '------------------------------------------------------------------------------------------------------
        '通常以下のコードでそれぞれのフォームの　Form_Load　と Form_QueryUnload　イベント内から ◆何回でも必要なだけ◆ 呼び出します。
        'Form_Load の OpenSaveString(0, ...)　と Form_QueryUnload の OpenSaveString(1, ...)　の対応する１セットの呼び出しの引数は、Open0_Save1 以外は必ず ◆全て同一◆ にします。
        '------------------------------------------------------------------------------------------------------
        'gggint = AppIniFile1.OpenSaveString(Open0_Save1, @rKeyStr@, Me, str1, str2, str3, str4, ..... )
        '------------------------------------------------------------------------------------------------------
        On Error GoTo errop
        Dim fom As Form : Dim ary() As String = {""} : Dim Hedentry As String = "" : Dim a As Integer
        '-------------------------------------------------------------
        fom = zzChkFormObj_MakeHedKeyStr(rKeyStr, rForm, "", Hedentry)
        If fom Is Nothing Then Return False
        '-------------------------------------------------------------
        If Open0_Save1 = 0 Then
            If 11 <> Ⅹ文をカットして配列にする(mIniData(zzGetAryIndex(Hedentry)), cCutChar4, ary) Then Return False
            a = 1
            a = a + 1 : Str1 = ary(a) : a = a + 1 : Str2 = ary(a) : a = a + 1 : str3 = ary(a) : a = a + 1 : str4 = ary(a) : a = a + 1 : str5 = ary(a)
            a = a + 1 : str6 = ary(a) : a = a + 1 : str7 = ary(a) : a = a + 1 : str8 = ary(a) : a = a + 1 : str9 = ary(a) : a = a + 1 : str10 = ary(a)
        Else
            gggint = zzDataSaveIn_mIniDataAry(Hedentry, Hedentry & cCutChar4 & Str1 & cCutChar4 & Str2 & cCutChar4 & str3 & cCutChar4 & str4 & cCutChar4 & str5 & cCutChar4 & str6 & cCutChar4 & str7 & cCutChar4 & str8 & cCutChar4 & str9 & cCutChar4 & str10 & cCutChar4)
        End If
        Return True
        Exit Function
errop:
        Return False
        Exit Function
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function OpenSaveMain(ByRef Open0_Save1 As Integer, ByRef rKeyStr As String, ByRef rwForm As Form, ByRef rOpCodeForm As Integer, _
                                Optional ByRef rwCont1 As Object = Nothing, Optional ByRef rOpCode1 As Integer = 0, Optional ByRef rwCont2 As Object = Nothing, Optional ByRef rOpCode2 As Integer = 0, _
                                Optional ByRef rwCont3 As Object = Nothing, Optional ByRef rOpCode3 As Integer = 0, Optional ByRef rwCont4 As Object = Nothing, Optional ByRef rOpCode4 As Integer = 0, _
                                Optional ByRef rwCont5 As Object = Nothing, Optional ByRef rOpCode5 As Integer = 0, Optional ByRef rwCont6 As Object = Nothing, Optional ByRef rOpCode6 As Integer = 0, _
                                Optional ByRef rwCont7 As Object = Nothing, Optional ByRef rOpCode7 As Integer = 0, Optional ByRef rwCont8 As Object = Nothing, Optional ByRef rOpCode8 As Integer = 0, _
                                Optional ByRef rwCont9 As Object = Nothing, Optional ByRef rOpCode9 As Integer = 0, Optional ByRef rwCont10 As Object = Nothing, Optional ByRef rOpCode10 As Integer = 0) As Boolean
        'アプリケーションのフォームと、コントロール群のプロパティ群を、最大１度に１０個まで保存と復元をします。
        '------------------------------------------------------------------------------------------------------
        'Open0_Save1 As Integer     復元時 (Form_Load) には 0 を、保存時 (Form_QueryUnload) には 1 を指定します。
        'rKeyStr As String          このメソッドは同時に何回でも呼び出せるので、各呼び出しの区別をするための、それぞれの呼び出しの　rKeyStr　引数は呼出しごとに変更します。
        'rwForm As Object           コントロール群の親フォームを指定します。
        'rOpCodeForm As Integer     親フォームで、保存と復元をするプロパティ群を、Integerの定数群から、必要なものだけを Or 結合して指定します。何もしない場合は 0 を指定します。
        'wCont1 - 10 As Object      プロパティ群の保存と復元をする、コントロール群を指定します。
        'rOpCode1 - 10 As Integer   wCont1 - 10　コントロール群に、保存と復元をするプロパティ群を、Integerの定数群から、必要なものだけを Or 結合して指定します。
        '------------------------------------------------------------------------------------------------------
        '通常以下のコードでそれぞれのフォームの　Form_Load　と Form_QueryUnload　イベント内から ◆何回でも必要なだけ◆ 呼び出します。
        'ただし複数回呼び出す場合は、フォームの設定がダブるので、２回目以降の呼び出しでは、rOpCodeForm = 0 を指定します。　また、rKeyStr　引数は呼出しごとに変更します。
        'Form_Load の OpenSaveMain(0, ...)　と Form_QueryUnload の OpenSaveMain(1, ...)　の対応する１セットの呼び出しの引数は、Open0_Save1 As Integer 以外は必ず ◆全て同一◆ にします。
        '------------------------------------------------------------------------------------------------------
        'gggint = AppIniFile1.OpenSaveMain(Open0_Save1, @rKeyStr@, Me, AppIniFormPostSize, Label1, AppIniCaption Or AppIniEnabled, Text1, AppIniText Or AppIniTextSelSttLen, ..... )
        '------------------------------------------------------------------------------------------------------
        On Error GoTo errop
        'Open0_Save1 = 0  フォームとコントロールにプロパ設定  /  Open0_Save1 = 1  フォームとコントロールのプロパ保存
        Dim fom As Form
        Dim ary() As String = {""} : Dim sss() As String = {""} : Dim NewDataStr As String = "", Hedentry As String = ""
        '-------------------------------------------------------------
        fom = zzChkFormObj_MakeHedKeyStr(rKeyStr, rwForm, "", Hedentry)
        If fom Is Nothing Then Return False
        '-------------------------------------------------------------
        NewDataStr = zzDataOpenSaveForm(Open0_Save1, Hedentry, fom, rOpCodeForm, ary)
        If NewDataStr = "" Then Return False
        '-------------------------------------------------------------
        On Error Resume Next
        '-------------------------------------------------------------
        If 2 <> zzStdRW(Open0_Save1, fom, rwCont1, rOpCode1, ary, NewDataStr) Then
            If 2 <> zzStdRW(Open0_Save1, fom, rwCont2, rOpCode2, ary, NewDataStr) Then
                If 2 <> zzStdRW(Open0_Save1, fom, rwCont3, rOpCode3, ary, NewDataStr) Then
                    If 2 <> zzStdRW(Open0_Save1, fom, rwCont4, rOpCode4, ary, NewDataStr) Then
                        If 2 <> zzStdRW(Open0_Save1, fom, rwCont5, rOpCode5, ary, NewDataStr) Then
                            If 2 <> zzStdRW(Open0_Save1, fom, rwCont6, rOpCode6, ary, NewDataStr) Then
                                If 2 <> zzStdRW(Open0_Save1, fom, rwCont7, rOpCode7, ary, NewDataStr) Then
                                    If 2 <> zzStdRW(Open0_Save1, fom, rwCont8, rOpCode8, ary, NewDataStr) Then
                                        If 2 <> zzStdRW(Open0_Save1, fom, rwCont9, rOpCode9, ary, NewDataStr) Then
                                            If 2 <> zzStdRW(Open0_Save1, fom, rwCont10, rOpCode10, ary, NewDataStr) Then
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
        '-------------------------------------------------------------
        If Open0_Save1 = 1 Then gggint = zzDataSaveIn_mIniDataAry(Hedentry, NewDataStr)
        '-------------------------------------------------------------
        Return True
        Exit Function
errop:
        Return False
        Exit Function
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzDataOpenSaveForm(ByRef Open0_Save1 As Integer, ByRef Hedentry As String, ByRef rwForm As Form, ByRef rOpCodeForm As Integer, ByRef ary() As String) As String
        On Error GoTo errop
        'Open0_Save1 = 0  フォームにプロパ設定  /  Open0_Save1 = 1  フォームのプロパ保存
        Dim oldmax, max As Integer
        Dim sss() As String = {""} : Dim NewDataStr As String = "" : Dim WndState, Subentry, w, WndSize As String
        '-------------------------------------------------------------
        If rwForm Is Nothing Then Return ""
        gggint = FormSizeDataSetOnReSize(rwForm)
        '-------------------------------------------------------------
        'rwForm の保存と復元、もし rOpCodeForm で指示されていれば
        If Open0_Save1 = 0 Then 'Open
            If 0 = Ⅹ文をカットして配列にする(mIniData(zzGetAryIndex(Hedentry)), cCutChar4, ary) Then Return ""
            If ⅩBitsAnd(rOpCodeForm, cAppIniFormPostSize) Then
                If 4 = Ⅹ文をカットして配列にする(ary(3), cCutChar1, sss) Then gggint = ⅩFormMove(gcoフォームのサイズと位置を設定, rwForm, False, Val(ary(2)), Val(sss(1)), Val(sss(2)), Val(sss(3)), Val(sss(4)), True)
                gggint = FormSizeDataSetOnReSize(rwForm)
            End If
        Else 'Save
            WndState = CStr(rwForm.WindowState)
            WndSize = IIf(rwForm.WindowState = FormWindowState.Normal, CStr((rwForm.Left)) & cCutChar1 & CStr((rwForm.Top)) & cCutChar1 & CStr((rwForm.Width)) & cCutChar1 & CStr((rwForm.Height)) & cCutChar1, mWndOldSizeStr)
            ReDim ary(20)
            NewDataStr = Hedentry & cCutChar4 & WndState & cCutChar4 & WndSize & cCutChar4
        End If
        '-------------------------------------------------------------
        Subentry = "■" & rwForm.Name & "■"
        If Open0_Save1 = 0 Then
            oldmax = Val(zzSubAryRW(Open0_Save1, ary, Subentry, cCutChar3, sss))
        Else
            ReDim sss(1000) : max = 0
        End If
        '-------------------------------------------------------------
        On Error Resume Next
        '-------------------------------------------------------------
        gggint = zzStdPropRW(Open0_Save1, rOpCodeForm, cAppIniCaption, rwForm, Nothing, sss, max) 'rwForm の Caption   の保存と復元、もし rOpCodeForm で指示されていれば
        gggint = zzStdPropRW(Open0_Save1, rOpCodeForm, cAppIniBackColor, rwForm, Nothing, sss, max) 'rwForm の BackColor の保存と復元、もし rOpCodeForm で指示されていれば
        gggint = zzStdPropRW(Open0_Save1, rOpCodeForm, cAppIniForeColor, rwForm, Nothing, sss, max) 'rwForm の ForeColor の保存と復元、もし rOpCodeForm で指示されていれば
        'gggint = zzFontRW(Open0_Save1, rOpCodeForm, rwForm.Font, sss, max) 'rwForm の フォント  の保存と復元、もし rOpCodeForm で指示されていれば
        '-------------------------------------------------------------
        On Error GoTo errop
        If Open0_Save1 = 1 Then
            ReDim Preserve sss(max)
            w = zzSubAryRW(Open0_Save1, ary, Subentry, cCutChar3, sss)
            If w <> "" Then NewDataStr = NewDataStr & w & cCutChar4
        Else
            NewDataStr = "OK"
        End If
        Return NewDataStr
        Exit Function
errop:
        Return ""
        Exit Function
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzStdRW(ByRef Open0_Save1 As Integer, ByRef rForm As Form, ByRef rwCont As Object, ByRef rOpCode As Integer, ByRef ary() As String, ByRef NewDataStr As String) As Integer
        '-------------------------------------------------------------
        Dim RETVAL As Integer = 2 'If No Object or Error return 2  /  If OK return 1
        '-------------------------------------------------------------
        Dim cnt As Object        'Dim cnt As Control
        Dim cntx As Object        'Dim cntx As Control
        Dim w, Subentry As String : Dim curstr As String = ""
        Dim oldsubmax, max As Integer
        Dim sss() As String = {""}
        Dim eee() As String = {""}
        Dim c, a, cnttype As Integer
        Dim NotMenu As Boolean
        Dim nms, ids As String
        '-------------------------------------------------------------
        If rForm Is Nothing Then Return RETVAL
        If rwCont Is Nothing Then Return RETVAL
        If TypeOf rwCont Is Control Then cnt = rwCont Else Return RETVAL
        If TypeOf cnt Is ToolStripMenuItem Then NotMenu = False Else NotMenu = True
        '-------------------------------------------------------------
        Subentry = "■" & ⅩControlNameStr(cnt) & "■"
        If Open0_Save1 = 0 Then
            oldsubmax = Val(zzSubAryRW(Open0_Save1, ary, Subentry, cCutChar3, sss))
        Else
            ReDim sss(1000) : max = 0
        End If
        '---------------------------------------------
        On Error Resume Next
        '---------------------------------------------
        gggint = zzStdPropRW(Open0_Save1, rOpCode, cAppIniCaption, Nothing, cnt, sss, max) 'Caption   の保存と復元、もし rOpCode で指示されていれば
        gggint = zzStdPropRW(Open0_Save1, rOpCode, cAppIniVisible, Nothing, cnt, sss, max) 'Visible   の保存と復元、もし rOpCode で指示されていれば
        gggint = zzStdPropRW(Open0_Save1, rOpCode, cAppIniEnabled, Nothing, cnt, sss, max) 'Enabled   の保存と復元、もし rOpCode で指示されていれば
        If NotMenu Then
            gggint = zzStdPropRW(Open0_Save1, rOpCode, cAppIniBackColor, Nothing, cnt, sss, max) 'BackColor の保存と復元、もし rOpCode で指示されていれば
            gggint = zzStdPropRW(Open0_Save1, rOpCode, cAppIniForeColor, Nothing, cnt, sss, max) 'ForeColor の保存と復元、もし rOpCode で指示されていれば
            gggint = zzSizePropRW(Open0_Save1, rOpCode, cnt, sss, max) 'ウインドウサイズ の保存と復元、もし rOpCode で指示されていれば

            '2025/05/03 追加 ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
            If ⅩBitsAnd(rOpCode, cAppIniFontDataAll) Then gggbol = zzStdFontDataAllOp(Open0_Save1, rOpCode, cnt, sss, max) 'Font Data すべてのプロパティの保存と復元 
            '2025/05/03 追加 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

        End If
        '---------------------------------------------
        On Error GoTo errop
        '---------------------------------------------
        With cnt
            'フォーム内のすべてのコントロールの
            '---------------------------------------------
            'メニュー  の設定／保存  
            If (TypeOf cnt Is ToolStripMenuItem) Then
                'no op
                '---------------------------------------------
                '2023/07/12 chg new ラベル  の保存と復元
            ElseIf TypeOf cnt Is Label Then
                Dim cntNOW As Control = cnt
                If ⅩBitsAnd(rOpCode, cAppIniFontSize) Then gggbol = zzStdFontSizeSet(Open0_Save1, rOpCode, cntNOW, sss, max)
                If ⅩBitsAnd(rOpCode, cAppIniText) Then zzStdTextSet(Open0_Save1, rOpCode, cntNOW, sss, max)
                '---------------------------------------------
            ElseIf (TypeOf cnt Is CheckBox) Then 'チェックボックス
                Dim cntNOW As CheckBox = cnt
                With cntNOW
                    If ⅩBitsAnd(rOpCode, cAppIniValue) Then
                        w = zzData(Open0_Save1, cAppIniValue, sss, IIf(Open0_Save1 = 1, IIf(.Checked, "1", "0"), ""))
                        If Open0_Save1 = 0 Then
                            If w <> "" Then .Checked = (w = "1")
                        Else
                            max = max + 1 : sss(max) = Left(w, 30000)
                        End If
                    End If
                End With
                '---------------------------------------------
            ElseIf (TypeOf cnt Is RadioButton) Then 'オプションボタン
                Dim cntNOW As RadioButton = cnt
                With cntNOW
                    If ⅩBitsAnd(rOpCode, cAppIniValue) Then
                        w = zzData(Open0_Save1, cAppIniValue, sss, IIf(Open0_Save1 = 1, IIf(.Checked, "1", "0"), ""))
                        If Open0_Save1 = 0 Then
                            If w <> "" Then .Checked = (w = "1")
                        Else
                            max = max + 1 : sss(max) = Left(w, 30000)
                        End If
                    End If
                End With
                '---------------------------------------------
                '2023/07/12 chg new テキストボックス  の保存と復元
            ElseIf TypeOf cnt Is TextBox Then
                Dim cntNOW As TextBox = cnt
                With cntNOW
                    If ⅩBitsAnd(rOpCode, cAppIniFontSize) Then gggbol = zzStdFontSizeSet(Open0_Save1, rOpCode, cntNOW, sss, max)
                    If ⅩBitsAnd(rOpCode, cAppIniText) Then zzStdTextSet(Open0_Save1, rOpCode, cntNOW, sss, max)
                    If ⅩBitsAnd(rOpCode, cAppIniTextSelSttLen) Then
                        curstr = IIf(Open0_Save1 = 1, CStr(.SelectionStart) & cCutChar1 & CStr(.SelectionLength) & cCutChar1, "")
                        w = zzData(Open0_Save1, cAppIniTextSelSttLen, sss, curstr)
                        If Open0_Save1 = 0 Then
                            If w <> cCutChar1 Then
                                If 2 = Ⅹ文をカットして配列にする(w, cCutChar1, eee) Then
                                    .SelectionStart = Math.Max(0, Val(eee(1)))
                                    .SelectionLength = Math.Max(0, Val(eee(2)))
                                End If
                            End If
                        Else
                            max = max + 1 : sss(max) = w
                        End If
                    End If
                End With
                '---------------------------------------------
                '2023/07/12 chg new リストボックス  の保存と復元
            ElseIf (TypeOf cnt Is ListBox) Then
                Dim cntNOW As ListBox = cnt
                With cntNOW
                    If ⅩBitsAnd(rOpCode, cAppIniFontSize) Then gggbol = zzStdFontSizeSet(Open0_Save1, rOpCode, cntNOW, sss, max)
                    If ⅩBitsAnd(rOpCode, cAppIniList) Then
                        If Open0_Save1 = 1 Then
                            ReDim eee(.Items.Count)
                            For a = 0 To .Items.Count - 1 : eee(a + 1) = .Items(a) : Next
                            curstr = Ⅹ文を配列から作成(eee, cCutChar1, 1)
                        Else
                            curstr = ""
                        End If
                        w = zzData(Open0_Save1, cAppIniList, sss, curstr)
                        If Open0_Save1 = 0 Then
                            If w <> cCutChar1 Then
                                If 0 <> Ⅹ文をカットして配列にする(w, cCutChar1, eee) Then
                                    .Items.Clear()
                                    For a = 1 To UBound(eee) : .Items.Add(eee(a)) : Next
                                End If
                            End If
                        Else
                            max = max + 1 : sss(max) = w
                        End If
                    End If
                    If ⅩBitsAnd(rOpCode, cAppIniListIndex) Then
                        If Open0_Save1 = 1 Then curstr = CStr(.SelectedIndex) Else curstr = ""
                        w = zzData(Open0_Save1, cAppIniListIndex, sss, curstr)
                        If Open0_Save1 = 0 Then
                            If w <> cCutChar1 Then .SelectedIndex = IIf(.Items.Count = 0, -1, Ⅹ数値範囲Int(-1, .Items.Count - 1, Val(w)))
                        Else
                            max = max + 1 : sss(max) = w
                        End If
                    End If
                    '複数選択リストの場合()
                    Dim sm As SelectionMode = .SelectionMode
                    If (sm = SelectionMode.MultiExtended Or sm = SelectionMode.MultiSimple) And ⅩBitsAnd(rOpCode, cAppIniListMultiSel) Then
                        If Open0_Save1 = 1 Then
                            Dim コレクション As ListBox.SelectedIndexCollection = .SelectedIndices
                            ReDim eee(コレクション.Count)
                            For a = 1 To コレクション.Count
                                eee(a) = CStr(コレクション(a - 1))
                            Next
                            curstr = Ⅹ文を配列から作成(eee, cCutChar1, 1)
                        Else
                            curstr = ""
                        End If
                        w = zzData(Open0_Save1, cAppIniListMultiSel, sss, curstr)
                        If Open0_Save1 = 0 Then
                            If w <> cCutChar1 Then
                                If 0 <> Ⅹ文をカットして配列にする(w, cCutChar1, eee) Then
                                    For a = 1 To UBound(eee)
                                        .SetSelected(Val(eee(a)), True)
                                    Next
                                End If
                            End If
                        Else
                            max = max + 1 : sss(max) = w
                        End If
                    End If
                End With
                '---------------------------------------------
                '????? 水平スクロールバー  の保存と復元   '垂直スクロールバー  の保存と復元
            ElseIf (TypeOf cnt Is HScrollBar) Or (TypeOf cnt Is VScrollBar) Then
                If ⅩBitsAnd(rOpCode, cAppIniValue) Then
                    w = zzData(Open0_Save1, cAppIniValue, sss, IIf(Open0_Save1 = 1, CStr(cnt.Value), ""))
                    If Open0_Save1 = 0 Then
                        If w <> cCutChar1 Then .Value = Ⅹ数値範囲Int(.min, .max, Val(w))
                    Else
                        max = max + 1 : sss(max) = w
                    End If
                End If
                '---------------------------------------------
            End If
        End With
        '-------------------------------------------------------------
        If Open0_Save1 = 1 Then
            ReDim Preserve sss(max)
            w = zzSubAryRW(Open0_Save1, ary, Subentry, cCutChar3, sss)
            If w <> "" Then NewDataStr = NewDataStr & w & cCutChar4
        End If
        '-------------------------------------------------------------
        RETVAL = 1 : Return RETVAL  'OK
        Exit Function
errop:
        MsgBox(ErrorToString())
        RETVAL = 2 : Return RETVAL  'ERROR
    End Function

    '2025/05/03 追加 ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzStdFontDataAllOp(ByVal Open0_Save1 As Integer, ByVal rOpCode As Integer, ByVal cont As Control, ByRef sss() As String, ByRef max As Integer) As Boolean
        '2025/0503 new 'Font Data すべてのプロパティの保存と復元 
        Try
            Dim n As Integer = cont.Font.Size 'Font プロパティのないコントロールが、間違って指定された場合の対策 ---> If Error Return False
        Catch
            Return False
        End Try
        '--------------------------------------------------------------
        Try
            Dim c As String = "*" : Dim curstr As String = ""
            If Open0_Save1 = 1 Then
                Dim fs1 As String = ""
                If aaggFontStrChange(1, cont, fs1, 8, 256) Then curstr = fs1
            Else
                curstr = ""
            End If
            Dim w As String = zzData(Open0_Save1, cAppIniFontSize, sss, curstr)
            If Open0_Save1 = 0 Then
                If w <> cCutChar1 Then
                    gggbol = aaggFontStrChange(0, cont, w, 8, 256)
                End If
            Else
                max = max + 1 : sss(max) = w
            End If
        Catch ex As Exception
            qqqqq("ERROR in 五clsAppINI.zzStdFontDataAllOp()")
        End Try
        Return True
    End Function
    '2025/05/03 追加 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzStdFontSizeSet(ByVal Open0_Save1 As Integer, ByVal rOpCode As Integer, ByVal cont As Control, ByRef sss() As String, ByRef max As Integer) As Boolean
        Try
            With cont
                Dim curstr As String
                If Open0_Save1 = 1 Then curstr = CStr(cont.Font.Size) Else curstr = ""
                Dim w As String = zzData(Open0_Save1, cAppIniFontSize, sss, curstr)
                If Open0_Save1 = 0 Then
                    If w <> cCutChar1 Then ⅩFontSizeChange(cont, Val(w))
                Else
                    max = max + 1 : sss(max) = w
                End If
            End With
        Catch ex As Exception
        End Try
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzStdTextSet(ByVal Open0_Save1 As Integer, ByVal rOpCode As Integer, ByVal cont As Control, ByRef sss() As String, ByRef max As Integer) As Boolean
        Try
            With cont
                Dim w As String = zzData(Open0_Save1, cAppIniText, sss, IIf(Open0_Save1 = 1, .Text, ""))
                If Open0_Save1 = 0 Then
                    If w <> cCutChar1 Then .Text = w
                Else
                    max = max + 1 : sss(max) = Left(w, 30000)
                End If
            End With
        Catch ex As Exception
        End Try
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzStdPropRW(ByRef Open0_Save1 As Integer, ByRef rOpCode As Integer, ByRef rOpCodeCur As Integer, ByRef fom As Form, ByRef cnt As Control, ByRef sss() As String, ByRef max As Integer) As Boolean
        'Caption の設定／保存    'Visible の保存と復元    'Enabled の保存と復元    'BackColor の保存と復元    'ForeColor の保存と復元
        On Error GoTo errop
        zzStdPropRW = False
        Dim w, curstr As String
        If fom Is Nothing And cnt Is Nothing Then Return False
        If Not ⅩBitsAnd(rOpCode, rOpCodeCur) Then Return False
        '----------------------------------------------
        Select Case rOpCodeCur
            Case cAppIniCaption : If Not fom Is Nothing Then curstr = fom.Text Else curstr = cnt.Text
            Case cAppIniVisible : If Not fom Is Nothing Then curstr = CStr(fom.Visible) Else curstr = CStr(cnt.Visible)
            Case cAppIniEnabled : If Not fom Is Nothing Then curstr = CStr(fom.Enabled) Else curstr = CStr(cnt.Enabled)
            Case cAppIniBackColor
                If Not fom Is Nothing Then
                    curstr = CStr(ⅩColor構造体_to_色値(fom.BackColor))
                Else
                    curstr = CStr(ⅩColor構造体_to_色値(cnt.BackColor))
                End If
            Case cAppIniForeColor
                If Not fom Is Nothing Then
                    curstr = CStr(ⅩColor構造体_to_色値(fom.ForeColor))
                Else
                    curstr = CStr(ⅩColor構造体_to_色値(cnt.ForeColor))
                End If
            Case Else
                Return False
        End Select
        '----------------------------------------------
        w = zzData(Open0_Save1, rOpCodeCur, sss, curstr)
        '----------------------------------------------
        If Open0_Save1 = 0 Then
            If w <> cCutChar1 Then
                Select Case rOpCodeCur
                    Case cAppIniCaption : If Not fom Is Nothing Then fom.Text = w Else cnt.Text = w
                    Case cAppIniVisible : If Not fom Is Nothing Then fom.Visible = CBool(w) Else cnt.Visible = CBool(w)
                    Case cAppIniEnabled : If Not fom Is Nothing Then fom.Enabled = CBool(w) Else cnt.Enabled = CBool(w)
                    Case cAppIniBackColor : If Not fom Is Nothing Then fom.BackColor = ⅩColor構造体_from_色値(Ⅹ色の値の検査修正値(Val(w))) Else cnt.BackColor = ⅩColor構造体_from_色値(Ⅹ色の値の検査修正値(Val(w)))
                    Case cAppIniForeColor : If Not fom Is Nothing Then fom.ForeColor = ⅩColor構造体_from_色値(Ⅹ色の値の検査修正値(Val(w))) Else cnt.ForeColor = ⅩColor構造体_from_色値(Ⅹ色の値の検査修正値(Val(w)))
                End Select
            End If
        Else
            max = max + 1 : sss(max) = w
        End If
        Return True
        Exit Function
errop:
        Return False
        Exit Function
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzSizePropRW(ByRef Open0_Save1 As Integer, ByRef rOpCode As Integer, ByRef cnt As Control, ByRef sss() As String, ByRef max As Integer) As Boolean
        'ウインドウサイズ の保存と復元
        Dim a As Integer : Dim w, curstr As String
        Dim eee() As String = {""}
        If Not ⅩBitsAnd(rOpCode, cAppIniSize) Then Return False
        With cnt
            '---------------------------------------------
            Try
                a = .Left 'このプロパティのないコントロールが、間違って指定された場合の対策 ---> If Error Return False
                a = .Top 'このプロパティのないコントロールが、間違って指定された場合の対策 ---> If Error Return False
                a = .Width 'このプロパティのないコントロールが、間違って指定された場合の対策 ---> If Error Return False
                a = .Height 'このプロパティのないコントロールが、間違って指定された場合の対策 ---> If Error Return False
            Catch
                Return False
            End Try
            '---------------------------------------------
            curstr = IIf(Open0_Save1 = 1, CStr(.Left) & cCutChar1 & CStr(.Top) & cCutChar1 & CStr(.Width) & cCutChar1 & CStr(.Height) & cCutChar1, "")
            w = zzData(Open0_Save1, cAppIniSize, sss, curstr)
            If Open0_Save1 = 0 Then
                If w <> cCutChar1 Then
                    If 4 = Ⅹ文をカットして配列にする(w, cCutChar1, eee) Then
                        .Left = Ⅹ数値範囲Int(0, (Screen.PrimaryScreen.Bounds.Width), Val(eee(1))) : .Top = (Ⅹ数値範囲Int(0, (Screen.PrimaryScreen.Bounds.Height), Val(eee(2))))
                        .Width = Ⅹ数値範囲Int(30, (Screen.PrimaryScreen.Bounds.Width), Val(eee(3))) : .Height = (Ⅹ数値範囲Int(30, (Screen.PrimaryScreen.Bounds.Height), Val(eee(4))))
                    End If
                End If
            Else
                max = max + 1 : sss(max) = w
            End If
        End With
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzSubAryRW(ByRef Open0_Save1 As Integer, ByRef ary() As String, ByRef Subentry As String, ByRef scut As String, ByRef sss() As String) As String
        Dim a As Integer
        If Open0_Save1 = 0 Then
            ReDim sss(0)
            a = Ⅹ文を先頭に持つ文を配列から探す(ary, Subentry)
            If a > 0 Then Return CStr(Ⅹ文をカットして配列にする(Mid(ary(a), Len(Subentry) + 1), scut, sss))
        Else
            If UBound(sss) < 1 Then Return ""
            Return Subentry & Ⅹ文を配列から作成(sss, scut)
        End If
        Return ""
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Private Function zzData(ByRef Open0_Save1 As Integer, ByRef rOpEnumConst As Integer, ByRef sss() As String, ByRef rCurData As String) As String
        Dim a As Integer
        Dim hed As String
        hed = "<" & Hex(rOpEnumConst) & ">"
        If Open0_Save1 = 0 Then
            a = Ⅹ文を先頭に持つ文を配列から探す(sss, hed)
            If a > 0 Then Return Mid(sss(a), Len(hed) + 1) Else Return cCutChar1 'エントリーが存在しない場合のリターン値
        Else
            Return hed & rCurData
        End If
        Return ""
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

End Class


