プログラミング入門 (桐s-2024LT:リボン編)


Chapter7:変数値の保存・読み込み
  改定版 /更新日:2024年10月3日

プロシージャ:[手続き]、[一般手続き]、[イベントハンドラ]のこと
0 変数値の保存についてですが
桐には "変数書き出し" , "変数読み込み" コマンドが準備されていますが次のような問題点があります。
 
a) 変数を保存しているファイル("*.vax")の数が増えてくると管理が大変。保存内容を確認するには最悪 変数保存の全ファイルを開くことになる。
b) 局所変数が保存できない。
  そこでここでは、変数を保存するための表を準備して、"変数名" と "変数値" を保存してみます。
 
1
事前準備:新たに次のような表を1つ準備します。

表ファイル名は "変数保存表.tbx" といったとことでしょうか。
項目数は 2つ以上あればよいですね。 使用する項目は2つで、名称は "変数名" , "変数値" とします。

 
2 変数値の保存
2-1 フォーム"郵便番号簿.wfx" を定義画面で開いて
"txt読み込みファイル名" の[オブジェクトの属性] → [イベント] → [ソース値更新] をダブルクリックしてください。
 
2-2 イベントファイル "郵便番号簿.kex" が起動してつぎのように表示されます

 
3 郵便番号を更新するためのファイルを選択した際に、その値を "変数保存表.tbx" に保存するソースを書いてみましょう。
3-1
名札 メイン で 基本的な設定をします。
  必ず編集対象表 ( ここでは "郵便番号簿.tbx" ) を一旦変数に代入して、その変数を使って編集対象表を設定します。
3 変数宣言 局所,文字列 { &m編集対象表 = #一括パス名 + "郵便番号簿.tbx" }  
4 オブジェクト操作 @フォーム.編集対象表 = &m編集対象表  
   
3-2 手続き定義開始 txt読み込みファイル名::ソース値更新()


   
36 変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }
  "名札 メイン" で設定した 変数 "&m編集対象表" からファイル名を取得します。
※桐のヘルプで "#ファイル名( str , f )" を確認してください(引数 2 はファイル名を取り出します)。
37 &STRbak = &STR
  &STR は 桐が標準で準備している組み込み変数です (共通変数なので注意が必要です)
&STR の値を 自動変数 &STRbak に退避しておいて、ここでの処理が完了したら元の値にもどします(行儀のよいプログラムということですね)
40 &STR = &ファイル名 + "," + "m読み込みファイル名"
  局所変数は使用するフォーム専用となるので、編集対象表名を付加して保存する変数の名称とします。
41 &変数値 = #ファイル名( &m読み込みファイル名 , 1 )
  ここでは "&STR" には "変数名"(局所変数の場合は、編集対象表名を付加して名称としています)、
"&変数値" には設定した読み込みファイルの "パス名とファイル名と拡張子" が値として代入されました。
※桐のヘルプで "#ファイル名( str , f )" を確認してください(引数 1 はパス名とファイル名と拡張子を取り出します)。
43 手続き実行 prc変数書出( &STR , &変数値 , &m変数保存表 )
  引数に "変数名" と "&変数値" 、そして保存ファイルを指定して、その値を "プロシージャ(手続き):prc変数書出()" に渡します。
※ここでは引数を [変数名称]、[変数の値]、[変数を保存する表]、の順に並べてみました
45 &STR = &STRbak
  "&STR" はここで使用する前の値に戻します(どんな値が代入されていたかは不明ですが)。

4 【ヒント】
4-1 データ型
変数の値が文字列以外の場合には、#文字列( &文字列以外の変数値 )と文字列に変換して保存します。
 → 手続き実行 prc変数書出( &STR , #文字列( 文字列以外の値│変数もOKです ) , &m変数保存表 )
そして値を変数に代入する際には #数値( &文字列に変換された変数値 )といった具合に、本来のデータ型に変換します。
4-2 固有変数の場合、編集対象表名は不要
  固有変数の場合保存する変数名にファイル名を付け加える必要はありません(付け加えるとトラブルの原因になるかと思います)。
&STR = &ファイル名 + "," + "g読み込みファイル名" ではなく そのまま "g読み込みファイル名" とします
 → 手続き実行 prc変数書出( "g読み込みファイル名" , &変数値 , &m変数保存表 )
4-3 変数別の命名ルールを決めておくと、混乱を避ける(思考を節約する)ことができます。
 
局所変数 → 接頭辞に " m " を付ける ( 変数宣言 局所 , 文字列 { &m局所変数名 } ) : m はモジュールの頭文字
固有変数 → 接頭辞に " g " を付ける ( 変数宣言 固有 , 文字列 { &g固有変数名 } ) : g はグローバルの頭文字
共通変数 → 接頭辞に " p " を付ける ( 変数宣言 共通 , 文字列 { &p共通変数名 } ) : p はパブリックの頭文字
4-4 &STR
" &STR " は " &実行リターン " と共にフォーム間のデータをやり取りする際によく利用されているようです。
共に 桐の組み込み変数で、共通変数になります。代入した値が桐を終了するまで保持されるのでその対策を行って利用してください。

ここでは " &STRbak = &STR " とすることで " &STR " の値を "自動変数 &STRbak " に退避して使い終わったら元の値に戻しています。
※ 文字列操作の関数 " #対応文字列 " なども参照しておいてください。
 
5 手続き定義開始 prc変数書き出し( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表)
 
  ここでは、表 "変数保存表.tbx" の 項目名:[変数名] を "書き出す変数名" で検索して
一致するものがあれば、項目名: [変数値] の値を 更新します。
一致するものがなければ行を追加して "変数名" , "変数値" を新しく保存します。

55 表 &変数保存表
56 &importTblNum = #IS表
57 検索 [変数名] { &変数名 } , 終了状態 = &検索結果
 
58 if ( &検索結果 = 1 )
59  行訂正 [変数値] = &変数値
60 else
61  行追加 [変数名] = &変数名 , [変数値] = &変数値
62 end
63 終了 表 &exportTblNum
64 編集表 &hwindow
  "終了 表" と "編集表"の指定はセットで使いましょう(ここでは  編集表 &hwindow )
   
 
6 完成したらフォーム"郵便番号簿.wfx" を編集画面で開いて、所定のファイルを選択してみてください
6-1
6-2 "変数保存表.tbx" を開いて "変数名" と "変数値" が保存されているか確認してください。
 
 

7 変数値の読み込み
 
7-1 フォーム "郵便番号簿.wfx" を起動したときに、保存している変数の値を読み込みます。
7-1-1
"郵便番号簿.wfx"を定義画面で開いて、コマンドボタン [cmdStartup] をワークスペースに配置します。属性は以下の通りです。


7-1-2 [フォームの属性] → [オプション] → [実行コマンドの開始時]に 作成した [cmdStartup] ボタンを登録します。


7-2 ソースコードを書いていきます

7-2-1
フォーム起動時にコマンドボタン[cmdStartup]を実行します。


7-2-2 読み込む変数名を整えて(ファイル名+変数名)、保存している値を読み込むプロシージャ(手続き)に渡します。
 
88 メソッド呼び出し @フォーム.変数変更()
  処理の最後で、読み込んだ変数値をフォーム画面に反映させます
   
7-2-3 このプロシージャ(手続き)で、変数値が返されます。

 
92 変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
  &WQ の値は半角二重引用符 ( " ) となります。
   
96 &表現式 = "*" + &WQ + &変数名 + &WQ + "*"
  &表現式 = "*" + &WQ + &変数名 + &WQ + "*"  は "&表現式" を使わず
&変数名 = "*" + &WQ + &変数名 + &WQ + "*"  とも書けますが、変数の値が変わるとデバッグが難しくなります。

"プロシージャ:prc変数読込()" の最後の処理として
"メソッド呼び出し @フォーム.変数変更()" と記しておいて読み込んだ変数値をフォーム画面に反映させます。
 
8 【ヒント】
8-1 連続して変数値を代入するには
&STR = &ファイル名 + "," + "m読み込みファイル名"
手続き実行 prc変数値代入文字列( &STR , &m読み込みファイル名 ) 
  &STR = &ファイル名 + "," + "m変数名2"
手続き実行 prc変数値代入文字列( &STR , &m変数名2 ) 
  &STR = &ファイル名 + "," + "m変数名3"
手続き実行 prc変数値代入文字列( &STR , &m変数名3 ) 
といった具合に、ただ続けて記載するだけです。
8-2 固有変数の場合
  固有変数の場合、保存した変数名にファイル名は付加されていません。
  手続き実行 prc変数値代入文字列( "g変数名1" , &g変数名1 )
  手続き実行 prc変数値代入文字列( "g変数名2" , &g変数名2 )
  手続き実行 prc変数値代入文字列( "g変数名3" , &g変数名3 )

変数値を検索する プロシージャ に、局所変数と固有変数の区別はありません(不要です)
   
8-3 文字列以外の変数値を読み込む
  次のように 文字列用、数値用の プロシージャ また整数用の プロシージャ などと別々に作成して準備しておきます。



  データ型変換を組み込んだプロシージャを準備しておくことで、呼び出す側のプロシージャでは単純に羅列するだけで済みます。
  &STR = &ファイル名 + "," + "m変数名1"
手続き実行 prc変数値代入数値( &STR , &m変数名1 )
: &m変数名1 は数値型
  &STR = &ファイル名 + "," + "m変数名2"
手続き実行 prc変数値代入文字列( &STR , &m変数名2 ) 
: &m変数名2 は文字型
  &STR = &ファイル名 + "," + "m変数名3"
手続き実行 prc変数値代入数値( &STR , &m変数名3 )
: &m変数名3 は数値型
     
  手続き実行 prc変数値代入文字列( "g変数名1" , &g変数名1 )
: &g変数名1 は文字型
  手続き実行 prc変数値代入数値( "g変数名2" , &g変数名2 )
: &g変数名2 は数値型
  手続き実行 prc変数値代入文字列( "g変数名3" , &g変数名3 )
: &g変数名3 は文字型
といった具合ですね。
 

 


Chapter 7 終わり、お疲れ様でした (^_^)ノ
  Special Thanks ONnojiさん、AKさん

参考) ※行番号は参考としてください
  サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。※プロシージャごとに処理すれば作業がしやすいでしょう。

 
1  名札    メイン
2  
3   変数宣言 局所,文字列 { &m編集対象表 = #一括パス名 + "郵便番号簿.tbx" }
4   オブジェクト操作 @フォーム.編集対象表 = &m編集対象表            /* 編集対象表は、メイン処理でのみ変更できます */
5  
6   変数宣言 局所,文字列 { &m変数保存表 = #一括パス名 + "変数保存表.tbx" }
7   変数宣言 局所,文字列 { &m読み込みファイル名 }
8  *
9  
10  手続き定義開始 cmd郵便番号簿更新Click()
11   変数宣言 自動, 文字列 { &title, &msg }
12   変数宣言 自動, 数値 { &ans }
13   &title = "cmd郵便番号簿更新Click()"
14   &msg = &msg +   " << 郵便番号簿を更新します >>"
15   &msg = &msg + "\n"
16   &msg = &msg + "\n郵便番号ファイルから"
17   &msg = &msg + "\n郵便番号簿を更新します。"
18   &msg = &msg + "\n"
19   &msg = &msg + "\n郵便番号ファイルは"
20   &msg = &msg + "\n事前に郵便局のサイトからダウンロードして"
21   &msg = &msg + "\n展開しておいてください。"
22   &msg = &msg + "\n"
23   &msg = &msg + "\n必ず所定のファイルを指定してから実行してください。"
24   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = !,制御文字展開 = する,&ans
25    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
26   
27   if ( &ans = 1 )
28    解除 *                    /* データーが絞り込まれていたりを想定して、解除しておきます */
29    行削除 * , 圧縮
30    読み込み CSV,&m読み込みファイル名 , *
31    確認 完了しました。
32   end
33  手続き定義終了
34  
35  手続き定義開始 txt読み込みファイル名::ソース値更新()
36   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
37   変数宣言 自動,文字列 { &STRbak , &変数値 }
38   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
39   
40   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 保存変数名称:局所変数は使用するフォーム専用なので編集対象表名を付加。*/
41   * 固有変数の場合、編集対象表名を付加する必要はありません。付加するとトラブルの原因になると思います。
42   &変数値 = #ファイル名( &m読み込みファイル名 , 1 )    /* 1:パス名とファイル名と拡張子  */
43   
44   手続き実行 prc変数書出( &STR , &変数値 , &m変数保存表 )   /* 変数名称、変数の値、変数を保存する表、の順に並べてみました。*/
45   * 手続き実行 prc変数書出( &STR , #文字列( 文字列以外の変数値 ) , &m変数保存表 )
46   * 変数の値が文字列以外の場合には、#文字列( &文字列以外の変数値 )と文字列に変換して保存します。 \
47    そして値を変数に代入する際には #数値( &文字列以外の変数値 )といった具合に、本来のデータ型に変換します。
48   
49   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
50  手続き定義終了
51  
52  手続き定義開始 prc変数書出( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表 )
53   変数宣言 自動,整数  { &exportTblNum ,  &検索結果 }
54   
55   表 &変数保存表        /* "変数保存表.tbx" を開く */
56   &exportTblNum = #IS表
57   検索 [変数名] { &変数名 } , 終了状態 = &検索結果
58   if ( &検索結果 = 1 )
59    行訂正 [変数値] = &変数値
60   else
61    行追加 [変数名] = &変数名 , [変数値] = &変数値
62   end
63   終了 表 &exportTblNum    /* "変数保存表.tbx" を閉じる */
64   編集表 &hwindow         /* 終了 表 とセットで使って 編集対象表を指定 */
65  手続き定義終了
66  
67  手続き定義開始 cmdStartupClick( )
68   手続き実行 prc変数読込( &m変数保存表 )
69  手続き定義終了
70   
71  手続き定義開始 prc変数読込( 文字列 &変数保存表 )
72   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
73   変数宣言 自動,文字列 { &STRbak , &変数値 }
74   変数宣言 自動,整数  { &importTblNum }
75   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
76   
77   表 &変数保存表        /* 変数保存表.tbx を開く */
78   &importTblNum = #IS表
79   
80   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 局所変数は使用するフォーム専用となるので編集対象表名も検索値の一部です。*/
81   手続き実行 prc変数値代入文字列( &STR , &m読み込みファイル名 )  /*  引数は 検索する値 , 値を代入する変数名 の順に並べてみました。 */
82   * 手続き実行 prc変数値代入数値( "固有変数の場合ファイル名を付加していない" , &g数値型の固有変数名 )
83   
84   終了 表 &importTblNum    /* 変数保存表.tbx を閉じる */
85   編集表 &hwindow         /* 終了 表 とセットで使って 編集対象表を指定 */
86  
87   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
88   メソッド呼び出し @フォーム.変数変更()
89  手続き定義終了
90   
91  手続き定義開始 prc変数値代入文字列( 文字列 &変数名 , 参照 文字列 &変数値 )
92   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
93   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
94   変数宣言 自動,整数 { &検索結果 }
95   
96   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
97   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
98   &変数値 = #u
99   if ( &検索結果 = 1 )
100    &変数値 = [変数値]
101   end
102  手続き定義終了
103   
104  手続き定義開始 prc変数値代入数値 ( 文字列 &変数名 , 参照 数値 &変数値 )     /* 整数と数値でもデータ型は異なります */
105   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
106   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
107   変数宣言 自動,整数 { &検索結果 }
108   
109   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
110   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
111   &変数値 = #u
112   if ( &検索結果 = 1 )
113    &変数値 = #数値( [変数値] )
114   end
115  手続き定義終了