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


Chapter8:ライブラリ
  改定版 /更新日:2024年10月4日

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

0 ライブラリに収録するプロシージャの選択は自由ですが、ここでは "住所録" と "郵便番号簿"に共通で使えるプロシージャを集めてみます。
単にイベント処理ファイルの行数を減らす目的でライブラリを利用する事はお勧めできません。
イベント処理ファイルとライブラリファイルを同時に編集するのは管理の手間を増やすだけです。
複数の[イベント処理ファイル]を利用して(一応システムと呼べる程度の規模)その中から標準化した[手続き]を集めて[ライブラリファイル]ができあがるといったところでしょうか。
(汎用性を追求して再利用可能なプログラム(手続き)を作成するのはとても難しいです)。
 
1 ライブラリ用のファイルを作成します(ここでは "Template.cmx" としてみました)
1-1 一括処理と同じ拡張子(CMX)のファイルを作成しますが、一括処理用のファイルではありません。
※この講座はイベント処理のみを作成します(一括処理、また一括処理とイベント処理が混在するプログラムのいずれもお勧めしません)。
 


※ "Template.CMX" が作成されています。
 
1-2 フォームのフッタ部分を表示するプロシージャ(手続き)を作成します。
"Template.CMX" の定義で次の手続きを作成してください。
  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 手続き定義終了

※ライブラリのプロシージャに接頭辞はつけないことを原則としておけば、プロシージャがライブラリにあると判別できます。
 
 

2 "郵便番号簿" に コマンドボタン[フッタ表示/非表示]をセットします。
2-1 フォーム"郵便番号簿wfx" を定義画面で開いて次のようにコマンドボタンをセットしてください。

  機能名:フォーカス移動(機能グループ:編集)
  機能パラメータリスト:枠内の右側(何も表示されていない部分)をマウスでクリックすると一覧が表示されます。
  ここでは [cmdフッタ表示非表示] を選択します(ボタンを押した際、痕跡が残るようになります)。
  また [フォーカス移動] は [手続き実行] の前に設定してもOKです。
 
2-2 "郵便番号簿.kex" には次のソースコードを追加してください(行番号は参考です)
  9 ライブラリ #一括パス名 + "Template.cmx"
   
12 手続き定義開始 cmdフッタ表示非表示Click()
13  手続き実行 フッタ部を表示( )
14 手続き定義終了
 
 
2-3 いかがですか、コマンドボタンを押すごとにフッタ部分の表示・非表示が切り替わるようになりましたか。

   

3 ライブラリ"Template.cmx"に変数書き出しと、読み込みのプロシージャ(手続き)をセットします。
3-1 "郵便番号簿.kex"のプログラムから、いくつかのプロシージャをライブラリ"Template.cmx"に移動します。
3-1-1 プロシージャ"変数書出"、"郵便番号簿.kex" 側です(行番号は参考です)。

※削除予定のプロシージャになりますが、一旦「 X 」 を付けておいて最終的に削除しましょう。
 
"Template.cmx" へ接頭辞を外して複写しました(ライブラリのプロシージに接頭辞は不要です)。

   
3-1-2 プロシージャ"変数値代入文字列"、"郵便番号簿.kex" 側です(行番号は参考です)。
 
※削除予定のプロシージャになりますが、一旦「 X 」 を付けておいて最終的に削除しましょう。
 
 
  "Template.cmx" へ接頭辞を外して複写しました(ライブラリのプロシージに接頭辞は不要です)。
   
3-1-3 プロシージャ"変数値代入数値"、"郵便番号簿.kex" 側です(行番号は参考です)。

※削除予定のプロシージャになりますが、一旦「 X 」 を付けておいて最終的に削除しましょう。
 
 
  "Template.cmx" へ接頭辞を外して複写しました(ライブラリのプロシージに接頭辞は不要です)。

   
3-1-4 整数用のプロシージは "Template.cmx" で新規作成しました。

 

4 "郵便番号簿.kex"のプロシージャをライブラリ対応に変更します(対応が必要なプロシージャは以下の2つです)。
4-1 プロシージャ:txt読み込みファイル名::ソース値更新()
変更は、赤の下線部分です。

4-2 プロシージャ:prc変数読込( 文字列 &変数保存表 )
  変更は、赤の下線部分です
   

5 "住所録" に トグルボタンを使った[フッタ表示/非表示]をセットします。
5-1 フォーム"住所録wfx" を定義画面で開いて次のようにトグルボタン(とラベル)をセットしてください。


"chkフッタ表示"の属性は "ボタンの種類:チェックボックス" 、" オンの値:1 " 、"オフの値:設定する、0 " です。見たままですね。
イベントは、[ソース値更新] にチェックを入れます。

5-2 イベントファイル"住所録.kex" 次の行を追加(3行目は修正ですね)してください。
  1 名札 メイン
  2  
  3  変数宣言 局所,文字列 { &m編集対象表 = #一括パス名 + "住所録.tbx" }
  4  オブジェクト操作 @フォーム.編集対象表 = &m編集対象表 /* 編集対象表は、メイン処理でのみ変更できます */
  5  
  6  変数宣言 局所,文字列 { &m変数保存表 = #一括パス名 + "変数保存表.tbx" }
   
10   変数宣言 局所,整数 { &mフッタ表示 = 1 }
11  
12  ライブラリ #一括パス名 + "Template.cmx"
13
14  
15 手続き定義開始 chkフッタ表示::ソース値更新()
16  手続き実行 フッタ部を表示( )
17  
18  変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }
19  変数宣言 自動,文字列 { &STRbak , &変数値 }
20  &STRbak = &STR
21  
22  &STR = &ファイル名 + "," + "mフッタ表示"
23  手続き実行 変数書出( &STR , #文字列 ( &mフッタ表示 ) , &m変数保存表 )
24  
25  &STR = &STRbak
26 手続き定義終了
 
   
5-3 フォーム"住所録.wfx" を編集画面で開いて、[フッタ表示] をクリックすると チェック表示と共にフッタ部分が表示・非表示されるか確かめましょう。

 


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

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

【Template.CMX】 (ライブラリ)
  *****  バージョンとか日付やタイトル等を付けておくとよいかもしれません *****
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   
20   表 &変数保存表        /* "変数保存表.tbx" を開く */
21   &exportTblNum = #IS表
22   検索 [変数名] { &変数名 } , 終了状態 = &検索結果
23   if ( &検索結果 = 1 )
24    行訂正 [変数値] = &変数値
25   else
26    行追加 [変数名] = &変数名 , [変数値] = &変数値
27   end
28   終了 表 &exportTblNum    /* "変数保存表.tbx" を閉じる */
29   編集表 &hwindow         /* 終了 表 とセットで使って 編集対象表を指定 */
30  手続き定義終了
31  
32  手続き定義開始 変数値代入文字列( 文字列 &変数名 , 参照 文字列 &変数値 )
33   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
34   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
35   変数宣言 自動,整数 { &検索結果 }
36   
37   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
38   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
39   &変数値 = #u
40   if ( &検索結果 = 1 )
41    &変数値 = [変数値]
42   end
43  手続き定義終了
44   
45  手続き定義開始 変数値代入数値 ( 文字列 &変数名 , 参照 数値 &変数値 )       /* 整数と数値でもデータ型は異なります */
46   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
47   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
48   変数宣言 自動,整数 { &検索結果 }
49   
50   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
51   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
52   &変数値 = #u
53   if ( &検索結果 = 1 )
54    &変数値 = #数値( [変数値] )
55   end
56  手続き定義終了
57   
58  手続き定義開始 変数値代入整数 ( 文字列 &変数名 , 参照 整数 &変数値 )       /* 整数と数値でもデータ型は異なります */
59   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
60   変数宣言 自動,文字列{ &表現式 }                       /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
61   変数宣言 自動,整数 { &検索結果 }
62   
63   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"                    /* 準備した &表現式に 式の値を代入しています */
64   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
65   &変数値 = #u
66   if ( &検索結果 = 1 )
67    &変数値 = #整数( [変数値] )
68   end
69  手続き定義終了


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

 【郵便番号簿.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 }
66   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
67   
68   表 &変数保存表        /* 変数保存表.tbx を開く */
69   &importTblNum = #IS表
70   
71   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 局所変数は使用するフォーム専用となるので編集対象表名も検索値の一部です。*/
72   手続き実行 変数値代入文字列( &STR , &m読み込みファイル名 )  /*  引数は 検索する値 , 値を代入する変数名 の順に並べてみました。 */
73   * 手続き実行 変数値代入数値( "固有変数の場合ファイル名を付加していない" , &g数値型の固有変数名 )
74   
75   終了 表 &importTblNum    /* 変数保存表.tbx を閉じる */
76   編集表 &hwindow         /* 終了 表 とセットで使って 編集対象表を指定 */
77   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
78   メソッド呼び出し @フォーム.変数変更()
79  手続き定義終了


  サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。※プロシージャごとに処理すれば作業がしやすいでしょう。
   
【住所録.kex】 (以下のソースコードは、Capter8で修正・追加があった"名札 メイン" と ”手続き定義開始 chkフッタ表示::ソース値更新()” の部分だけです)
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  手続き定義終了