Chapter 8:ライブラリ


ライブラリはいくつかのタイプがありますが、ここでは "住所録" と "郵便番号簿"に共通で使える手続きを集めて(作って?)みたいと思います。
・ 作成したアプリケーション専用のライブラリから初めて、将来は汎用性がある手続きを集めたライブラリができたらよいですね。
・ また様々な形で提供されているライブラリを組み込むことで、桐に欲しかった機能が簡単に使えたりします。
 *このサイトで解説している INF_Framework はそのライブラリの一つです。オートINF_Framework から使ってみてください。


ライブラリ用のファイルを作成します(ここでは "Yubinjyusho.CMX" としてみました(安直な名称ですね (;^_^A アセアセ・・・)

一括処理と同じ拡張子(CMX)のファイルを作成しますが、一括処理用のファイルではありません。
*この講座はイベント処理のみを作成します(一括処理、また一括処理とイベント処理が混在するプログラムのいずれもお勧めしません)。

ライブラリ用ファイル作成

早速  "Yubinjyusho.CMX" を定義画面で開いて次の手続きを作成してください。コピペしてください(この手続きは ONnoji さん提供そのままです)。

手続き定義開始 フッタ部を表示( )
 変数宣言 自動,文字列{ &sectionName }
 変数宣言 自動,整数 { &isSection, &visible }

 &sectionName = "フォームフッタ部"
 メソッド呼び出し @フォーム.オブジェクト検査( &sectionName, &isSection )

 if ( &isSection )
  オブジェクト操作 @フォームフッタ部{ &visible = 画面表示 }
  &visible = .not &visible
  オブジェクト操作 @フォームフッタ部{ 画面表示 = &visible }
 end
手続き定義終了

フッタ部の表示


"郵便番号簿"フォームを定義画面で開いて次のようにコマンドボタンをセットしてください。

* 機能名:フォーカス移動 の 機能グループは "編集" です。
選択できるオブジェクトは 機能パラメータリストの枠内右側(何も表示されていない部分)をマウスでクリックすると一覧が表示されます。
ここでは "cmdフッタ表示非表示" を選択します(ボタンに、押した痕跡が残るようになります)。
* また フォーカス移動は " 手続き実行 " の前に設定してもOKです。

cmdフッタ表示非表示 

"郵便番号簿"のイベントは次の行を追加してください。

  ライブラリ #一括パス名 + "Yubinjyusho.cmx"
   
  手続き定義開始 cmdフッタ表示非表示Click()
   手続き実行 フッタ部を表示( )
  手続き定義終了

ライブラリ設定、フッタ表示非表示 

如何ですか、コマンドボタンを押すごとにフッタ部分の表示・非表示が切り替わるようになりましたか。

フッタ表示切替画面 


それでは "郵便番号簿"のプログラムから、いくつかの手続きをライブラリに移動してみましょう。
ライブラリの手続きには、接頭辞は不要です("郵便番号簿"のプログラムからは "ライブラリにある手続き" の接頭辞は削除します)。

手続き定義開始 prc変数書出( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表 )

手続き定義開始 prc変数値代入文字列( 文字列 &変数名 , 参照 文字列 &変数値 )

手続き定義開始 prc変数値代入数値 ( 文字列 &変数名 , 参照 数値 &変数値 )      /* 整数と数値でもデータ型は異なります */

手続き定義開始 prc変数値代入整数 ( 文字列 &変数名 , 参照 整数 &変数値 ) も準備している場合は同様に移動してください。
  準備してない場合は、ライブラリで新規に作成します。

またライブラリへの移動に伴い、"郵便番号簿"の次の部分も修正してください(接頭辞の削除です)。
*コメント行でサンプルを準備している場合には、そちらも修正しておきましょう。

変数書き出し部分

ライブラリのプロシージャを呼び出す 

ライブラリ側は次のようになります( 接頭辞:prc は不要です)。

変数書出

また次のようになります( 手続き "変数値代入整数" も準備してください)。

変数値代入 

如何でしょうか、手続きをライブラリに移動しても問題なく動作してますでしょうか。

 


参考) ライブラリ

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

参考)郵便番号簿

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