プログラミング入門 (桐s-2024LT:ツールバー編)


Chapter2:データーを検索して自動入力させましょう  
  改定版 /更新日:2024年10月2日

プロシージャ:[手続き]、[一般手続き]、[イベントハンドラ]のこと
ヒント イベントファイルが使用できるようになっているか確認するには
適当なフォームを定義で開いて ツールバー [書式]→ [定義画面の設定] で [詳細プロパティを使用する]
にチェックが入っていればOKです。
※一度設定すればOKです(桐自体の設定で、フォームごとの設定ではありません)

1 ここでは郵便番号を入力して、郵便番号簿から住所を検索し自動入力させます。
※郵便番号簿とリンクするのではありません(関数を使った表引き とは違います)
 
2 "住所録.wfx" に イベントファイルを設定します。
  "住所録.wfx" を 定義で開いて
項目名:郵便番号の明細部の テキストオブジェクト をダブルクリックして、[オブジェクトの属性] を表示します。
続いて、イベントタブの イベント:[入力前] をダブルクリックします。
※イベントファイルがない場合 ファイル名( ここでは "住所録.kex" ) を入力します(保存場所は 表、フォーム と同じフォルダを指定してください)

ファイル名を入力して [OK] でイベントファイルが立ち上がります


※拡張子は桐が自動付加してくれます。表、フォームには大文字で付加しますが、イベントファイルの拡張子は小文字( .kex )を付加するようです。

2-1 "住所録.kex" に [入力前]イベントバンドラが設定され、表示されます。


2-2
引き続き、[入力後]、[編集開始]、[ソース値更新] もダブルクリックしてイベントバンドラを設定します。

2-3 次のようにできあがりました。


2-4 フォーム"住所録.wfx" の [郵便番号] の明細行(テキストオブジェクト)の属性は次のようになっています。
 
[t郵便番号] → [オブジェクトの属性] → [イベント タブ]
  ▽
[入力前]、[入力後]、[編集開始]、[ソース値更新]
にチェックが入っていることを確認してください
(チェックが入ってなかったら、シングルクリック)
 
3 準備ができたので、次はプログラムコードを入力していきましょう(コメント部分は書かなくても構いません)。
頑張って入力してください。
3-1 名札 メイン
3 オブジェクト操作 @フォーム.編集対象表 = #一括パス名 + "住所録.tbx"  /* 編集対象表は、メイン処理でのみ変更できます */
  編集対象表 をきちんと確定しておきましょう。

ここでは 局所変数を宣言しています。宣言できる変数には、共通、固有、局所そして自動変数があります。
イベント処理では局所変数を原則としましょう。
フォームが独立して動けるので変数を自分だけのものとしておくことがトラブル回避になります。

3-2 テキストオブジェクト [t郵便番号] に設定したイベントプロシージャ(イベントバンドラ)
3-2-1 t郵便番号::入力前(参照 文字列 &編集文字列)
 
  [入力前]イベントはテキストボックスで編集するデータの初期値を設定するために使います
[入力前]イベントはエディタへ侵入する直前に発生します。つまりエディタの外部で発生するイベントです
 
  &編集文字列 に入力されていた値が代入されているので、名札メイン で設定した、局所変数 "&m入力前値" に保存しておきます。
   
3-2-2 t郵便番号::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
 
  [入力後]イベントは入力されたデータを整形するために使います
[入力後]イベントはエディタから脱出する直前に発生します。つまりエディタの内部で発生するイベントです
 
ここでは、値を入力した際の全角や余計な空白を削除して 郵便番号のデータとして整形しています。
 
  * ここまでの処理で \
 &m入力前値:元々入力されていた値。 \
 &m入力後値:半角にして、空白を取り除いた値。 \
 &m郵便番号:"-" を除いた値。\
 &編集文字列(このイベント処理の引数):"-" を追加した値、※#文字数( &m郵便番号 ) = 7 の場合。 \
 となります。
   
3-2-3 t郵便番号::編集開始()
 
  [編集開始]イベントは編集文字列を範囲選択できます
  [編集開始]イベントはエディタに入った直後に発生するイベントです
 
  入力時に値をすべて選択済みの状態にします。 [編集選択位置設定] についてはイベントリファレンスをご覧になってください。
※ また &this も便利です。
3-2-4 t郵便番号::ソース値更新()
 
  [ソース値更新]イベントは何かを実行するために使います
[ソース値更新]イベントはエディタから脱出した直後に発生します。つまりエディタの外部で発生するイベントです
 
  ここでは入力した値が既に入力済みの値と同じだった場合と入力している値を削除した場合には何もせず、
そうでない場合に住所検索を実行するとしています。
また住所検索処理は別に準備している 一般プロシージャ(手続き)  で実行します。

最後に都道府県と住所1を入力させたら、次の準備としてフォーカスを[住所2]に移動します。
 
3-3 一般手続き(プロシージャ):prc住所検索()
  郵便番号簿から住所を取得して自分(住所録)に値を入力する、実際の処理です。

[自分自身の"表"] と [検索する"表"] は、桐が自動的に割り当てる [表番号] を取得して区別します。
表番号は桐が自動的に 1~40までを割り当てます。

表は表番号で簡単に切り替えられるので、順を追って使用(処理)する表を設定します。

3-3-1
53 手続き定義開始 prc住所検索()
  接頭辞に "prc" と付けていますが、これは ” 他から呼び出される 一般手続き(一般プロシージャ) ” と明確にわかるようにです。

また接頭辞に "cmd" と付けると、コマンドボタンを押した際の処理としておけば
その処理から呼び出すのが "prc" で始まるプロシージャ。といった具合に整理できます。
※"prc"で始まるプロシージャ は ひとつの機能 にするように心がけましょう。
  汎用性につながりプログラムの使いまわしができるようになっていきます。まあ、先々の話です。
 
3-3-2
54 変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
55 変数宣言 自動,文字列 { &住所1 , &住所2 }
  ここでは 自動変数を使います。ここでのイベント処理が始まるときに宣言して、処理が終わればなくなってしまう使い捨て変数とお考え下さい。
 
3-3-3
56 &myTblNum = &hwindow /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
  "住所録.tbx" の表番号を取得しています。
 
3-3-4
58 表 "郵便番号簿.tbx"
59 &lookupTblNum = #IS表
  "郵便番号簿.tbx" を開いて表番号を取得しています(フォーム "郵便番号簿.wfx" は必要ないので開きません)。
 
3-3-5
61 検索 [郵便番号] { &m郵便番号 }  
62 if ( .not #eof) /* 終端行でなければ。つまり検索値が存在すれば。 */
63  &住所1 = [住所1] , &住所2 = [住所2] + [住所3]  
64 end  
65    
66 終了 表 &lookupTblNum  /* 郵便番号簿を閉じる */
  検索コマンドは特別な指定をしていなければ表の最初から検索を始めます。
指定されたデータが存在しない場合、終端行に移動するので、終端行でなければ検索値と一致するものがあったということで
その部分の所定項目からデーターを取得して、変数に代入します。

検索が終わったら "郵便番号簿.tbx" を閉じます。
   
3-3-6
68 編集表 &myTblNum  /* 住所録の編集対象に戻る */
  処理対象とする表 "住所録.tbx" をきちんと指定して、郵便番号簿から取得した値を所定の項目に入力させます。
   
3-3-7 次の構文ではフォームの更新モード(表示か編集)を調べて、それに応じて必要なコマンドを使用するようにしています。
一種の定型文だとお考え下さい。
 
70 変数宣言 自動,長整数{&更新モード}
71 メソッド呼び出し @フォーム.更新モード取得(&更新モード)
72 if ( &更新モード = 0 )
73  行訂正 [都道府県] = &住所1 , [住所1] = &住所2
74 else
75  項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
76 end
   
  それでは保存終了して、住所録フォームで郵便番号を入力して住所が表示されるか確かめてください。

 


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

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

 
1  名札    メイン
2
3   オブジェクト操作 @フォーム.編集対象表 = #一括パス名 + "住所録.tbx"  /* 編集対象表は、メイン処理でのみ変更できます */
4
5   変数宣言 局所,文字列 { &m入力前値 , &m入力後値 }
6   変数宣言 局所,文字列 { &m郵便番号 }
7
8  *
9
10  手続き定義開始 t郵便番号::入力前(参照 文字列 &編集文字列)
11   &m入力前値 = &編集文字列                /* 既存入力値を取得します。半角 です。 */
12  手続き定義終了
13
14  手続き定義開始 t郵便番号::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
15   &編集文字列 = #半角 ( &編集文字列 )           /* 全角入力された場合には半角にします。 */
16   &編集文字列 = #TRIM( &編集文字列 , 4 )         /* 空白を取り除きます。 */
17   &m入力後値 = &編集文字列                /* 半角にして空白を取り除いた値になります */
18   &m郵便番号 = #文字置換( &編集文字列 , "-" , "" )    /* "-" が入力されている場合は、削除して &m郵便番号 に代入します。 */
19
20   if ( #文字数( &m郵便番号 ) = 7 )       /* 郵便番号は "-"がなければ7桁です */
21    &編集文字列 = #部分列( &m郵便番号 , 1 , 3 ) + "-" + #右側文字列( &m郵便番号 ,4 )
22    * 最初から3文字取り出した値と、4文字目から取り出した値を組み合わせ正しい位置に "-" を入力します。
23   else
24    if ( &m入力後値 = #未定義 )
25     * 未定義の場合何もしません。郵便番号を削除した場合に未定義になります。
26    else
27     &編集文字列 = &m入力前値
28     &入力継続 = 1
29     * 入力した値が "-" を除いて7桁でない場合には、元の値に戻して入力を継続します( &入力継続 = 1 についてはイベントリファレンスを参照してください)。
30    end
31   end
32
33   * ここまでの処理で \
34    &m入力前値:元々入力されていた値。&m入力後値:半角、空白を取り除いた値。 \
35    &m郵便番号:"-" を除いた値。 &編集文字列(このイベント処理の引数):"-" を追加した値、*#文字数( &m郵便番号 ) = 7 の場合。 \
36    となります。
37  手続き定義終了
38
39  手続き定義開始 t郵便番号::編集開始()
40   メソッド呼び出し &this.編集選択位置設定( 1 ,-1 )     /* &this は、イベントが発生したオブジェクトの名前が格納されている定数です。*/
41  手続き定義終了
42
43  手続き定義開始 t郵便番号::ソース値更新()
44   if ( &m入力後値 = &m入力前値 .or &m入力後値 = #未定義 )
45    * 入力前と値が同じ場合、また入力値が削除された場合には何もしません。
46   else
47    手続き実行 prc住所検索()
48   end
49
50   メソッド呼び出し @t住所2.フォーカス設定()
51  手続き定義終了
52
53  手続き定義開始 prc住所検索()
54   変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
55   変数宣言 自動,文字列 { &住所1 , &住所2 }
56   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
57
58   表 "郵便番号簿.tbx"
59   &lookupTblNum = #IS表
60
61   検索 [郵便番号] { &m郵便番号 }
62   if ( .not #eof)        /* 終端行でなければ。つまり検索値が存在すれば。 */
63    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
64   end
65
66   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
67
68   編集表 &myTblNum     /* 住所録の編集対象に戻る */
69
70   変数宣言 自動,長整数{&更新モード}
71   メソッド呼び出し @フォーム.更新モード取得(&更新モード)
72   if ( &更新モード = 0 )
73    行訂正 [都道府県] = &住所1 , [住所1] = &住所2
74   else
75    項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
76   end
77  手続き定義終了