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


Chapter9:復習&補足 (^_^)v
  改定版 /更新日:2024年10月3日

プロシージャ:[手続き]、[一般手続き]、[イベントハンドラ]のこと

0 Capter1~8 まで学習してきましたが、視点を変えて学習内容を復習してみたいと思います。
1 フォームを起動する際に、自動的にプロシージャ(手続き)を実行する
<<コマンドボタン[cmdStartup]を準備しておいて、フォーム起動時に実行させます>>
1-1
フォームを起動する際に、『自動的に手続きを実行させたい』といったときには
a) コマンドボタンを準備しておいて、フォームの属性でオプションから開始時の実行コマンドを登録しておく方法。
b) [フォーム開始]イベントに登録しておく方法
があります。

ただ b) の[フォーム開始]イベント は実行させる内容によってはトラブルの原因になるようです。
『君子危うきに近寄らず』ということで、コマンドボタンを使用する方法がおススメです。
※またこのサイトで紹介している INF_Framework を適用する場合 [フォーム開始]イベント を使用するには別途手順があります。
1-1-1 フォーム"住所録.wfx"を定義で開いて、コマンドボタン [cmdStartup] をワークスペースに配置します。属性は以下の通りです。
 
   
1-1-2 [フォームの属性] → [オプション] → [実行コマンドの開始時]に 作成した [cmdStartup] ボタンを登録します。
1-2 ソースコードを書きます。
ここでは、フォーム起動時に保存した変数値を読込んで、その値でフッタ部分の表示/非表示を反映させます。
1-2-1 手続き定義開始 cmdStartupClick( )
保存した変数値を読込むプロシージャ(手続き)とフッタ部分の表示/非表示を反映させるプロシージャを呼び出しています。
230  手続き定義開始 cmdStartupClick( )
231   手続き実行 prc変数読込( &m変数保存表 )
232   手続き実行 prc起動時フッタ表示( )
233  手続き定義終了
 
 
1-2-2 手続き定義開始 prc変数読込( 文字列 &変数保存表 )
保存している変数値を読込む処理です。"郵便番号簿.kex"からコピーしてくると良いでしょう(対象となる変数名は変更してください)。
 
235  手続き定義開始 prc変数読込( 文字列 &変数保存表 )
236   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) } /* 2:ファイル名 */
237   変数宣言 自動,文字列 { &STRbak , &変数値 }
238   変数宣言 自動,整数  { &importTblNum }
239   &STRbak = &STR /* &STR の値を 自動変数 &STRbak に退避 */ 
240  
241   表 &変数保存表 /* 変数保存表.tbx を開く */
242   &importTblNum = #IS表
243  
244   &STR = &ファイル名 + "," + "mフッタ表示" /* 局所変数は使用するフォーム専用となるので編集対象表名も検索値の一部です。*/
245   手続き実行 変数値代入整数( &STR , &mフッタ表示 )
246  
247   終了 表 &importTblNum /* 変数保存表.tbx を閉じる */
248   編集表 &hwindow /* 確実にもとの編集対象表に戻しておきます */
249   &STR = &STRbak /* &STRbakの値を 組み込み変数 &STR に戻す */
250   メソッド呼び出し @フォーム.変数変更()
251  手続き定義終了
 
 
1-2-3 手続き定義開始 prc起動時フッタ表示( )
フッタ部分の表示/非表示を反映させます
 
253  手続き定義開始 prc起動時フッタ表示( )
254   if ( &mフッタ表示 = 1 )
255    * フォームを開いて変数を読み込んだ値が "1" の時は何もしません(フォーム起動時のデフォルトがフッタ表示状態です)。
256   else
257    手続き実行 フッタ部を表示( )
258   end
259  手続き定義終了
 
1-3 できあがりは次のような動作になります。
  フッタ表示の状態でフォームを閉じると、次に開いたときに フッタ表示状態になっています。


フッタを非表示の状態でフォームを閉じると、次に開いたときにフッタが非表示の状態となっています。
   

2 フォームを閉じる際に、自動的にプロシージャ(手続き)を実行する
<<フォーム終了時実行コマンドボタンを登録しておきます。※応用方法がいくつか考えられます>>
a) コマンドボタンを準備しておいて、フォームの属性でオプションから終了時の実行コマンドを登録しておく方法。
b) [フォーム終了]イベントに登録しておく方法
があります。

ただ b) の[フォーム終了]イベント は実行させる内容によってはトラブルの原因になるようです。
『君子危うきに近寄らず』ということで、コマンドボタンを使用する方法がおススメです。
※またこのサイトで紹介している INF_Framework を適用する場合 [フォーム終了]イベント を使用するには別途手順があります。
2-1 フォーム右上の [ X ] (閉じる)ボタンを押すと、登録している終了時実行コマンドが起動します。
重要)別途コマンドボタン等でフォームを閉じた場合には、終了時実行コマンドは起動しません(実行されません)。

2-1-1 次のサンプルでは、終了時実行コマンドに [cmdMainMenu]を登録しています。
このフォームでは [cmdMainMenu] はフォームを終了するためのコマンドボタンにもなっているので、最適なボタンを登録していることになりますね。


2-2 応用例としてフォーム終了時のプロシージャ(手続き)を準備しておいて、
[X](閉じる)ボタンを押した際に自動実行させる。またその他のボタンを押した際には、終了時のプロシージャを実行するという方法が考えられます。
2-2-1
   
2-2-2
2-2-3 フォーム終了時に押すコマンドボタンには、終了時に実行するプロシージャを登録しておきます。

3 多重化して処理をおこなう
ここまでの学習でも、多重化した処理をご紹介してきました。補足として次の例をご案内します。
   
3-1 変数値を保存している表ファイル"変数保存表.tbx" ですが、何らかの理由でファイルが開かれている場合にはエラーが発生します。

そこで次のように "変数保存表.tbx" がすでに開かれているときには、多重化して開きます。
※ "変数保存表.tbx" は実際の作業時にユーザーが開く表ではないので本来は不要な処理ですね(ここでは学習の為ということです)。
   
3-1-1 "郵便番号簿.kex" を定義で開いて "プロシージャ prc変数読込( 文字列 &変数保存表 )" を次のように変更します。
※"住所録.kex" も同様に変更します。
3-1-2
68 &openTblNum = #表番号取得 ( &変数保存表 )
"変数保存表.tbx"が開いている場合、&openTblNum に 1 以上の値が代入されます
69 if ( 0 < &openTblNum )
70  編集表 &openTblNum
71  多重化
72  &importTblNum = #IS表
&openTblNum が "1" 以上の場合、編集対象表にして多重化します。
多重化した表番号を &importTblNum に代入します。
73 else
74  表 &変数保存表
75  &importTblNum = #IS表
76 end

&openTblNum が "0" の場合、"変数保存表.tbx"を通常通り開いて
表番号を  &importTblNum に代入します。

以上の処理で、"変数保存表.tbx" を通常通り開いても多重化して開いても、同じ変数名 "&importTblNum" に表番号を代入できます。

 
3-2-1 ライブラリ "Template.CMX" は次のように変更します。
   
3-2-2
21 if ( 0 < &openTblNum )
22  編集表 &openTblNum
23  * メソッド呼び出し ハンドル = &openTblNum,@フォーム.更新モード設定( 0 )
24  多重化
25  &exportTblNum= #IS表
&openTblNum が "1" 以上の場合、編集対象表にして多重化します。
多重化した表番号を &exportTblNumに代入します。
26 else
27  表 &変数保存表
28  &exportTblNum= #IS表
29 end
&openTblNum が "0" の場合、"変数保存表.tbx"を通常通り開いて
表番号を  &exportTblNumに代入します。

以上の処理で、"変数保存表.tbx" を通常通り開いても多重化して開いても、同じ変数名 "&exportTblNum" に表番号を代入できます。
   
3-2-3
23  * メソッド呼び出し ハンドル = &openTblNum,@フォーム.更新モード設定( 0 )
表が編集モードの際には多重化することができません。表 "変数保存表.tbx" にはフォームがセットされていないので表を直接 表示モードに切り替えます。
ここではコメント行にしています。特に必要な状況になった時には有効にしてください。
※フォームウィンドウのハンドルと編集対象表の表番号は同値になります。

4 その他(Tips)
 
4-1 フォーム"郵便番号簿.wfx"を定義画面で開いて、テキストボックス "txt読み込みファイル名表示" を作成してください。
属性のソースは #ファイル名( &m読み込みファイル名 , 2 ) とします。

最後に ファイル選択の為の入力支援ボタンが付いている オブジェクト"txt読み込みファイル名"の上に重ねます。
※出来上がったら、フォームを開いてその効果を確かめてください。
 
3-1-2
   

以上で、この講座は終了です。お役に立てれば幸いです。


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

参考)  ※行番号は参考としてください
  サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。

【住所録.kex】
1  名札    メイン
2  
3   変数宣言 局所,文字列 { &m編集対象表 = #一括パス名 + "住所録.tbx" }
4   オブジェクト操作 @フォーム.編集対象表 = &m編集対象表            /* 編集対象表は、メイン処理でのみ変更できます */
5  
6   変数宣言 局所,文字列 { &m変数保存表 = #一括パス名 + "変数保存表.tbx" }
7  
8   変数宣言 局所, 文字列 { &m入力前値 , &m入力後値 }
9   変数宣言 局所,文字列 { &m郵便番号 }
10   変数宣言 局所,整数  { &mフッタ表示 = 1 }  /* 初期値を設定しています */
11   
12   ライブラリ #一括パス名 + "Template.cmx"
13  *
14  
15  手続き定義開始 chkフッタ表示::ソース値更新()
16   手続き実行 フッタ部を表示( )
17   
18   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
19   変数宣言 自動,文字列 { &STRbak , &変数値 }
20   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
21   
22   &STR = &ファイル名 + "," + "mフッタ表示"   /* 保存変数名称:局所変数は使用するフォーム専用なので編集対象表名を付加。*/
23   手続き実行 変数書出( &STR , #文字列 ( &mフッタ表示 ) , &m変数保存表 )
24   
25   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
26  手続き定義終了
27  
28  手続き定義開始 t郵便番号::入力前(参照 文字列 &編集文字列)
29   &m入力前値 = &編集文字列                /* 既存入力値を取得します。半角 です。 */
30  手続き定義終了
31  
32  手続き定義開始 t郵便番号::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
33   &編集文字列 = #半角 ( &編集文字列 )           /* 全角入力された場合には半角にします。 */
34   &編集文字列 = #TRIM ( &編集文字列 , 4 )         /* 空白を取り除きます。 */
35   &m入力後値 = &編集文字列                /* 半角にして空白を取り除いた値になります */
36   &m郵便番号 = #文字置換( &編集文字列 , "-" , "" )    /* "-" が入力されている場合は、削除して &m郵便番号 に代入します。 */
37  
38   if ( #文字数( &m郵便番号 ) = 7 )       /* 郵便番号は "-"がなければ7桁です */
39    &編集文字列 = #部分列( &m郵便番号 , 1 , 3 ) + "-" + #右側文字列( &m郵便番号 ,4 )
40    * 最初から3文字取り出した値と、4文字目から取り出した値を組み合わせ正しい位置に "-" を入力します。
41   else
42    if ( &m入力後値 = #未定義 )
43     * 未定義の場合何もしません。郵便番号を削除した場合に未定義になります。
44    else
45     &編集文字列 = &m入力前値
46     &入力継続 = 1
47     * 入力した値が "-" を除いて7桁でない場合には、元の値に戻して入力を継続します( &入力継続 = 1 についてはイベントリファレンスを参照してください)。
48    end
49   end
50  
51   * ここまでの処理で \
52    &m入力前値:元々入力されていた値。&m入力後値:半角、空白を取り除いた値。 \
53    &m郵便番号:"-" を除いた値。 &編集文字列(このイベント処理の引数):"-" を追加した値、※#文字数( &m郵便番号 ) = 7 の場合。 \
54    となります。
55  手続き定義終了
56  
57  手続き定義開始 t郵便番号::編集開始()
58   メソッド呼び出し &this.編集選択位置設定( 1 ,-1 )     /* &this は、イベントが発生したオブジェクトの名前が格納されている定数です。*/
59  手続き定義終了
60  
61  手続き定義開始 t郵便番号::ソース値更新()
62   if ( &m入力後値 = &m入力前値 .or &m入力後値 = #未定義 )
63    * 入力前と値が同じ場合、また入力値が削除された場合には何もしません。
64   else
65    手続き実行 prc住所検索()
66   end
67  
68   メソッド呼び出し @t住所2.フォーカス設定()
69  手続き定義終了
70  
71  手続き定義開始 prc住所検索()
72   変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
73   変数宣言 自動,文字列 { &住所1 , &住所2 }
74   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
75  
76   表 "郵便番号簿.tbx"
77   &lookupTblNum = #IS表
78  
79   手続き実行 prc郵便番号簿検索( &lookupTblNum , &m郵便番号 , &住所1 , &住所2 )
80  
81   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
82  
83   編集表 &myTblNum     /* 住所録の編集対象に戻る */
84  
85   変数宣言 自動,長整数{&更新モード}
86   メソッド呼び出し @フォーム.更新モード取得(&更新モード)
87   if ( &更新モード = 0 )
88    行訂正 [都道府県] = &住所1 , [住所1] = &住所2
89   else
90    項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
91   end
92  手続き定義終了
93  
94  手続き定義開始 cmdテストデータ読み込みClick()
95   変数宣言 自動,整数  { &myTblNum , &importTblNum }
96   &myTblNum = &hwindow   /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
97   解除 * 
98   行削除 * , 圧縮
99   
100   表 "郵便番号簿.tbx"
101   &importTblNum = #IS表
102   絞り込み [住所1]{*"東京都"*}
103   絞り込み [住所2]{*"千代田区"*}
104  
105   編集表 &myTblNum     /* 住所録に戻る */
106   読み込み 表,"郵便番号簿.tbx",{[郵便番号][郵便番号]}
107   
108   終了 表 &importTblNum    /* 郵便番号簿を閉じる */
109   確認 "完了しました"     /* 終わりの目印ですね */
110  手続き定義終了
111  
112  手続き定義開始 cmd住所一括更新Click()
113   変数宣言 自動, 数値 { &ans }
114  
115   手続き実行 prc実行確認( "cmd住所一括更新Click()" , &ans )
116   if ( &ans = 1 )
117    手続き実行 prc住所一括更新実行()
118    確認 "完了しました"
119   end
120  手続き定義終了
121   
122  手続き定義開始 prc住所一括更新実行()
123   変数宣言 自動,整数  { &myTblNum }
124   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
125   手続き実行 prc住所一括検索( &myTblNum )
126   編集表 &myTblNum         /* 住所録の編集対象に戻る */
127   ジャンプ 行番号 = 先頭      /* 処理が完了したら、先頭行に移動します */
128  手続き定義終了
129   
130  手続き定義開始 cmd住所多重化更新Click()
131   変数宣言 自動, 数値 { &ans }
132   
133   手続き実行 prc実行確認( "cmd住所多重化更新Click()" , &ans )
134   if ( &ans = 1 )
135    手続き実行 prc住所多重化更新実行()
136    確認 "完了しました"
137   end
138  手続き定義終了
139   
140  手続き定義開始 prc住所多重化更新実行()
141   変数宣言 自動,整数  { &multiTblNum }
142   編集表 &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
143   多重化 
144   &multiTblNum = #is表       /* 多重化した住所録の表番号を取得 */
145   手続き実行 prc住所一括検索( &multiTblNum )
146   終了 表 &multiTblNum     /* 多重化した表を閉じる */
147   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
148   ジャンプ 行番号 = 先頭
149  手続き定義終了
150  
151  手続き定義開始 prc郵便番号簿検索( 整数 &TblNum , 文字列 &郵便番号 , 参照 文字列 &住所1 , 参照 文字列 &住所2 )
152   &住所1 = #u , &住所2 = #u               /* 初期化します。 */
153   編集表 &TblNum                     /* 郵便番号簿に切り替えます */
154   検索 [郵便番号]{ &郵便番号 }
155   * &住所1 = #u , &住所2 = #u               /* 検索する前に変数値を初期化します。 */
156   if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
157    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
158   * else
159   *  &住所1 = #u , &住所2 = #u              /* 検索値がない場合、変数の値を初期化します。 */
160   end  
161  手続き定義終了
162   
163  手続き定義開始 prc実行確認( 文字列 &title , 参照 数値 &ans )
164   &ans = 0                        /* 参照値の初期化 */
165   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
166   変数宣言 自動, 文字列 { &msg }
167   * 変数宣言 自動, 文字列 { &title, &msg }        /* &title は、引数ですでに宣言済みです */
168   * 変数宣言 自動, 数値 { &ans }             /* 引数ですでに宣言済みです */
169   * &title = ""                      /* &title の値は引数で受け取り済みです */
170   &msg = &msg +   "  << 住所を更新します >>"
171   &msg = &msg + "\n"
172   &msg = &msg + "\n郵便番号から"
173   &msg = &msg + "\n都道府県と住所1を更新します。"
174   &msg = &msg + "\n"
175   &msg = &msg + "\n郵便番号の " + &WQ + "-" + &WQ +" を一旦取り除いて"
176   &msg = &msg + "\n郵便番号簿の住所で更新します。"
177   &msg = &msg + "\nその後新たに " + &WQ + "-" + &WQ +" を付け直します。"
178   &msg = &msg + "\n"
179   &msg = &msg + "\n実行しますか?"
180   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = ?,制御文字展開 = する,&ans
181    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
182  手続き定義終了
183  
184  手続き定義開始 prc住所一括検索( 整数 &currentTblNum )
185   変数宣言 自動,整数  { &lookupTblNum }
186   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
187   
188   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
189   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
190   
191   編集表 &currentTblNum      /* 使用する表を 住所録 に切り替える */
192   解除 *
193   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
194   
195   繰り返し ( .not #eof)     /* 終端行でなければ。 */
196    &郵便番号 = [郵便番号]
197    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
198   
199    手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )
200   
201    編集表 &currentTblNum     /* 住所録の編集対象に戻る */
202    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
203    変数宣言 自動,長整数{&更新モード}
204    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
205    if ( &更新モード = 0 )
206     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
207    else
208     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
209    end
210   
211    ジャンプ 行番号 = 次行
212   繰り返し終了  
213   
214   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
215  手続き定義終了
216  
217  手続き定義開始 cmd住所併合更新Click()
218   変数宣言 自動, 数値 { &ans }
219   
220   手続き実行 prc実行確認( "cmd住所併合更新Click()" , &ans )
221   if ( &ans = 1 )
222    解除 *
223    置換 [郵便番号] = #文字置換( [郵便番号] , "-" , "" )
224    併合 "郵便番号簿.tbx" , 置換 , {[郵便番号]照合[郵便番号],[都道府県]複写[住所1],[住所1]複写[住所2],[住所1]連結[住所3]}
225    置換 [郵便番号] = #部分列( [郵便番号] , 1 , 3 ) + "-" + #右側文字列( [郵便番号] ,4 )
226    確認 "完了しました"
227   end
228  手続き定義終了
229  
230  手続き定義開始 cmdStartupClick( )
231   手続き実行 prc変数読込( &m変数保存表 )
232   手続き実行 prc起動時フッタ表示( )
233  手続き定義終了
234   
235  手続き定義開始 prc変数読込( 文字列 &変数保存表 )
236   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
237   変数宣言 自動,文字列 { &STRbak , &変数値 }
238   変数宣言 自動,整数  { &importTblNum , &openTblNum }
239   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
240   
241   &openTblNum = #表番号取得 ( &変数保存表 )
242   if ( 0 < &openTblNum )
243    編集表 &openTblNum
244    多重化
245    &importTblNum = #IS表
246   else
247    表 &変数保存表        /* 変数保存表.tbx を開く */
248    &importTblNum = #IS表
249   end
250   
251   &STR = &ファイル名 + "," + "mフッタ表示"   /* 局所変数は使用するフォーム専用となるので編集対象表名も検索値の一部です。*/
252   手続き実行 変数値代入整数( &STR , &mフッタ表示 )
253   
254   終了 表 &importTblNum    /* 変数保存表.tbx を閉じる */
255   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
256  
257   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
258   メソッド呼び出し @フォーム.変数変更()
259  手続き定義終了
260   
261  手続き定義開始 prc起動時フッタ表示( )
262   if ( &mフッタ表示 = 1 )
263    * フォームを開いて変数を読み込んだ値が "1" の時は何もしません(フォーム起動時のデフォルトがフッタ表示状態です)。
264   else
265    手続き実行 フッタ部を表示( )
266   end
267  手続き定義終了
268   
269  手続き定義開始 cmdExitClick()
270   手続き実行 prcClose()
271  手続き定義終了
272   
273  手続き定義開始 cmdMainMenuClick()
274   手続き実行 prcClose()
275  手続き定義終了
276   
277  手続き定義開始 prcClose()
278   * フォーム終了時に実行するコマンドを書きましょう。
279  手続き定義終了


参考) ※行番号は参考としてください 
  サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。

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


参考) ※行番号は参考としてください
サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。

【Template.CMX】 (ライブラリ)
  *****  バージョンとか日付やタイトル等を付けておくとよいかもしれません *****
1  * 2024年10月4日更新
2  
3  手続き定義開始 フッタ部を表示( )
4   変数宣言 自動,文字列{ &sectionName }
5   変数宣言 自動,整数 { &isSection, &visible }
6  
7   &sectionName = "フォームフッタ部"
8   メソッド呼び出し @フォーム.オブジェクト検査( &sectionName, &isSection )
9  
10   if ( &isSection )
11    オブジェクト操作 @フォームフッタ部{ &visible = 画面表示 }
12    &visible = .not &visible
13    オブジェクト操作 @フォームフッタ部{ 画面表示 = &visible }
14   end
15  手続き定義終了
16  
17  手続き定義開始 変数書出( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表 )
18   変数宣言 自動,整数  { &exportTblNum ,  &検索結果 }
19   変数宣言 自動, 整数 { &openTblNum = #表番号取得 ( &変数保存表 ) }
20  
21   if ( 0 < &openTblNum )
22    編集表 &openTblNum
23    * メソッド呼び出し ハンドル = &openTblNum,@フォーム.更新モード設定( 0 )   /* <編集対象表があるフォーム>ではハンドルと表番号は同値です。*/
24    多重化                                  /* フォームが編集モードの場合、多重化できません。 */
25    &exportTblNum = #IS表
26   else
27    表 &変数保存表
28    &exportTblNum = #IS表
29   end
30   
31   検索 [変数名] { &変数名 } , 終了状態 = &検索結果
32   if ( &検索結果 = 1 )
33    行訂正 [変数値] = &変数値
34   else
35    行追加 [変数名] = &変数名 , [変数値] = &変数値
36   end
37   終了 表 &exportTblNum    /* "変数保存表.tbx" を閉じる */
38  
39   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
40  手続き定義終了
41  
42  手続き定義開始 変数値代入文字列( 文字列 &変数名 , 参照 文字列 &変数値 )
43   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
44   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
45   変数宣言 自動,整数 { &検索結果 }
46   
47   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
48   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
49   &変数値 = #u
50   if ( &検索結果 = 1 )
51    &変数値 = [変数値]
52   end
53  手続き定義終了
54  
55  手続き定義開始 変数値代入数値( 文字列 &変数名 , 参照 数値 &変数値 )
56   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
57   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
58   変数宣言 自動,整数 { &検索結果 }
59   
60   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
61   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
62   &変数値 = #u
63   if ( &検索結果 = 1 )
64    &変数値 = #数値([変数値])
65   end
66  手続き定義終了
67  
68  手続き定義開始 変数値代入整数( 文字列 &変数名 , 参照 整数 &変数値 )
69   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
70   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
71   変数宣言 自動,整数 { &検索結果 }
72   
73   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
74   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
75   &変数値 = #u
76   if ( &検索結果 = 1 )
77    &変数値 = #整数 ( [変数値] )
78   end
79  手続き定義終了