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


Chapter5:引数は とっても便利
  改定版 /更新日:2024年10月3日

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

今回のレッスンは【引数】 です。
Chapter4で作成したプロシージャ(手続き)を変更 しながら講座をすすめていきます。

1 イメージです


1-1 改めて、Chapter4で保存した"住所録.kex"に、プロシージャ(手続き) "prc郵便番号簿検索()" を作成してください
※行番号は参考としてください。講座の進行に伴い変更になります。
 
 
2 引数の基本(注意:ここの解説は引数の基本的な流れを紹介しているだけです。ここの解説だけでは引数は使いこなせません)
2-1

手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )
  この処理で 一般プロシージャ(手続き) "prc郵便番号簿検索" を呼び出しますが、ここでは引数を設定し値を渡します。
使用する引数は任意で決められます。渡す値は "変数" だけでなく "値" そのものも OKです(参照渡しでは "変数" のみ)。
  ルールは [記載順] [値を渡すだけか、受け取るか(参照渡し)] [同じデータ型] の3つです
2-2
手続き定義開始 prc郵便番号簿検索( 整数 &TblNum , 文字列 &郵便番号 , 参照 文字列 &住所1 , 参照 文字列 &住所2 )
  送られてきた値を、設定した引数(変数)に受け入れます。
  引数に記載することで、変数宣言がなされ自動変数が設定され、呼び出した "プロシージャ(手続き)の引数に並び順で" その値が代入されます。
  ※新たに宣言した変数に初期値を代入する、ということなので呼び出したプロシージャの引数とは別の変数名でOKです。
  また [参照] と記載された変数では、この プロシージャ で処理(変更)した値を 呼び出した 元のプロシージャに [戻(渡)します]。
  引数を使うと プロシージャ の汎用性が高まります。プログラムが読みやすくなります。などなど、、、です。
2-3 ここでの引数の関係は次のようになります。

  矢印は値の方向を示しています。送る側と受ける側の変数表記は違ってかまいません。
  ここでは最初の引数の名前だけを変えています。 汎用性を考えたりとか分かり易いように考えてください。
  プロシージャ(手続き) "prc郵便番号簿検索()" は、[&TblNum]と [&郵便番号] に受け取った値で住所を検索して結果を [&住所1] と [&住所2] へ返します。
 
3 プロシージャ "prc住所一括更新実行()" と プロシージャ "prc住所多重化更新実行()" の郵便番号検索部分を
"手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )" に変更します。
3-1 プロシージャ "prc住所一括更新実行()" を次のように変更しました(行番号は参考としてください)。

同様に プロシージャ "prc住所多重化更新実行()" の該当部分も変更してください。

3-2 プロシージャ "prc住所検索()" を次のように変更しました(行番号は参考)。
※引数に記載している変数に注意してください。
 
   

4 引数を使ってメッセージを共通仕様にしてみます
4-1 プロシージャ "prc実行確認() " を作成します。
ここでは、" 手続き定義開始 cmd住所一括更新Click() " の [メッセージボックス] 表示部分をコピーして作成します(行番号は参考)。
 
赤の下線部分が、変更または追加になります。


222 手続き定義開始 prc実行確認( 文字列 &title , 参照 数値 &ans ) /* 引数が設定されています */
223 &ans = 0 /* 参照値の初期化 */
224 変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) } /* &WQ の値は半角二重引用符 ( " )  */
225 変数宣言 自動, 文字列 { &msg }  
226 * 変数宣言 自動, 文字列 { &title, &msg } /* &title は、引数ですでに宣言済みです */
227 * 変数宣言 自動, 数値 { &ans } /* 引数ですでに宣言済みです */
228 * &title = "" /* &title の値は引数で受け取り済みです */
241 手続き定義終了 (^_^)v~
  "*" でコメント行にしている部分は、メッセージボックスの "標準化" のためです。必要に応じて有効にします。
4-2 プロシージャ "cmd住所一括更新Click()" と "cmd住所多重化更新Click()" のメッセージ表示部分を変更します(行番号は参考)。

4-3 ここでの引数の関係は次のようになっています。
  プロシージャ "prc実行確認( )" で "&ans" の値が設定されて戻ってきます。
その値で " if ( &ans = 1 ) " かどうかが判定され、以降の処理に続きます。
 
5 引数の "参照渡し" について(初期化について)
5-1 値を更新するために "参照渡し" とする変数ですが、 実は先ず現在の値を [呼び出す "プロシージャ"] に渡しています。
※引数の値はまず "一般手続き:prc実行確認" に渡ります。
 そして参照渡しの場合は値が変更されて戻ってくることができるということです。
  その際の問題点として、ここの例では(何らかの原因で) "&ans = 1" となっていた場合、まずその値が呼び出した "プロシージャ" に渡ってしまいます。
そして呼び出した "プロシージャ" 側で 判定処理がない時 ( 本来 "&ans = 0" )でも 元の手続きに "&ans = 1" と戻してしまいます。
5-2 そこで呼び出される プロシージャ側で 最初に "&ans = 0" と初期化しておきます。
こうすることで安定した結果が得られます。
つまり、引数の関係を正しく表示すると次のようになります


5-3 まとめ(引数の初期化の方法)
あらかじめ戻り値が決まっている場合には、デフォルトの値を代入して初期化する
探索に成功して得た文字列の場合には、(探索失敗の文字列として)未定義値を代入して初期化する
5-4 プロシージャ "prc郵便番号簿検索()" も同様です。次のように訂正してください。
5-4-1
5-4-2 もしくは

5-4-3
もしくは

 


"引数" の話いかがでしたか。それでは次にチャレンジしてみてください  ρ(^。^)ノ イッテミヨー!

6 同じ目的のプロシージャを一つにする
6-1 次の2つのプロシージャを比べると、似てますよね~。
 

2つのプロシージャから郵便番号簿を検索している部分を新たなプロシージャとして作成します。
残った赤の下線部分に新たに作成する プロシージャ "prc住所一括検索()" を呼び出す1行を追加します。
6-2

※ Xprc住所一括更新実行() と Xprc住所多重化更新実行() は、削除してよいプロシージャです
 
6-3
共通で使用する 新たな プロシージャ"prc住所一括検索()"は次の通りです(行番号は参考)。


  如何でしょうか ε=ε=ε= ┌(;´゚ェ゚)┘

7 おまけ
 
 

 


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

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

 
53  手続き定義開始 prc住所検索()
54   変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
55   変数宣言 自動,文字列 { &住所1 , &住所2 }
56   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
57  
58   表 "郵便番号簿.tbx"
59   &lookupTblNum = #IS表
60  
61   手続き実行 prc郵便番号簿検索( &lookupTblNum , &m郵便番号 , &住所1 , &住所2 )
62  
63   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
64  
65   編集表 &myTblNum     /* 住所録の編集対象に戻る */
66  
67   変数宣言 自動,長整数{&更新モード}
68   メソッド呼び出し @フォーム.更新モード取得(&更新モード)
69   if ( &更新モード = 0 )
70    行訂正 [都道府県] = &住所1 , [住所1] = &住所2
71   else
72    項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
73   end
74  手続き定義終了
  
  
94  手続き定義開始 cmd住所一括更新Click()
95   変数宣言 自動, 数値 { &ans }
96  
97   手続き実行 prc実行確認( "cmd住所一括更新Click()" , &ans )
98   if ( &ans = 1 )
99    手続き実行 prc住所一括更新実行()
100    確認 "完了しました"
101   end
102  手続き定義終了
103   
104  手続き定義開始 prc住所一括更新実行()
105   変数宣言 自動,整数  { &myTblNum }
106   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
107   手続き実行 prc住所一括検索( &myTblNum )
108   編集表 &myTblNum         /* 住所録の編集対象に戻る */
109   ジャンプ 行番号 = 先頭      /* 処理が完了したら、先頭行に移動します */
110  手続き定義終了
111   
112  手続き定義開始 Xprc住所一括更新実行()
113   変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
114   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
115   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
116   
117   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
118   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
119   
120   編集表 &myTblNum      /* 使用する表を 住所録 に切り替える */
121   解除 *
122   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
123   
124   繰り返し ( .not #eof)     /* 終端行でなければ。 */
125    &郵便番号 = [郵便番号]
126    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
127   
128    編集表 &lookupTblNum                  /* 郵便番号簿に切り替えます */
129    検索 [郵便番号]{ &郵便番号 }
130    if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
131     &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
132    end  
133   
134    編集表 &myTblNum     /* 住所録の編集対象に戻る */
135    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
136    変数宣言 自動,長整数{&更新モード}
137    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
138    if ( &更新モード = 0 )
139     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
140    else
141     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
142    end
143   
144    ジャンプ 行番号 = 次行
145   繰り返し終了  
146  
147   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
148   編集表 &myTblNum        /* 住所録の編集対象に戻る */
149   ジャンプ 行番号 = 先頭
150  手続き定義終了
151   
152  手続き定義開始 cmd住所多重化更新Click()
153   変数宣言 自動, 数値 { &ans }
154   
155   手続き実行 prc実行確認( "cmd住所多重化更新Click()" , &ans )
156   if ( &ans = 1 )
157    手続き実行 prc住所多重化更新実行()
158    確認 "完了しました"
159   end
160  手続き定義終了
161   
162  手続き定義開始 prc住所多重化更新実行()
163   変数宣言 自動,整数  { &multiTblNum }
164   編集表 &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
165   多重化 
166   &multiTblNum = #is表       /* 多重化した住所録の表番号を取得 */
167   手続き実行 prc住所一括検索( &multiTblNum )
168   終了 表 &multiTblNum     /* 多重化した表を閉じる */
169   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
170   ジャンプ 行番号 = 先頭
171  手続き定義終了
172   
173  手続き定義開始 Xprc住所多重化更新実行()
174   変数宣言 自動,整数  { &multiTblNum , &lookupTblNum }
175   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
176  
177   編集表 &hwindow          /* 多重化する前には、基になる編集対象表を指定しておきます。 */
178   多重化 
179   &multiTblNum = #is表       /* 多重化した住所録の表番号を取得 */
180   
181   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
182   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
183   
184   編集表 &multiTblNum       /* 使用する表を 多重化した住所録 に切り替える */
185   解除 *
186   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
187   
188   繰り返し ( .not #eof)     /* 終端行でなければ。 */
189    &郵便番号 = [郵便番号]
190    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
191   
192    編集表 &lookupTblNum                  /* 郵便番号簿に切り替えます */
193    検索 [郵便番号]{ &郵便番号 }
194    if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
195     &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
196    end  
197   
198    編集表 &multiTblNum     /* 多重化した住所録に戻る */
199    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
200    変数宣言 自動,長整数{&更新モード}
201    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
202    if ( &更新モード = 0 )
203     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
204    else
205     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
206    end
207   
208    ジャンプ 行番号 = 次行
209   繰り返し終了  
210   
211   終了 表 &lookupTblNum     /* 郵便番号簿を閉じる */
212   終了 表 &multiTblNum     /* 多重化した表を閉じる */
213   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
214   ジャンプ 行番号 = 先頭
215  手続き定義終了
216  
217  手続き定義開始 prc郵便番号簿検索( 整数 &TblNum , 文字列 &郵便番号 , 参照 文字列 &住所1 , 参照 文字列 &住所2 )
218   &住所1 = #u , &住所2 = #u               /* 初期化します。 */
219   編集表 &TblNum                     /* 郵便番号簿に切り替えます */
220   検索 [郵便番号]{ &郵便番号 }
221   * &住所1 = #u , &住所2 = #u               /* 検索する前に変数値を初期化します。 */
222   if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
223    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
224   * else
225   *  &住所1 = #u , &住所2 = #u              /* 検索値がない場合、変数の値を初期化します。 */
226   end  
227  手続き定義終了
228   
229  手続き定義開始 prc実行確認( 文字列 &title , 参照 数値 &ans )
230   &ans = 0                        /* 参照値の初期化 */
231   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
232   変数宣言 自動, 文字列 { &msg }
233   * 変数宣言 自動, 文字列 { &title, &msg }        /* &title は、引数ですでに宣言済みです */
234   * 変数宣言 自動, 数値 { &ans }             /* 引数ですでに宣言済みです */
235   * &title = ""                      /* &title の値は引数で受け取り済みです */
236   &msg = &msg +   "  << 住所を更新します >>"
237   &msg = &msg + "\n"
238   &msg = &msg + "\n郵便番号から"
239   &msg = &msg + "\n都道府県と住所1を更新します。"
240   &msg = &msg + "\n"
241   &msg = &msg + "\n郵便番号の " + &WQ + "-" + &WQ +" を一旦取り除いて"
242   &msg = &msg + "\n郵便番号簿の住所で更新します。"
243   &msg = &msg + "\nその後新たに " + &WQ + "-" + &WQ +" を付け直します。"
244   &msg = &msg + "\n"
245   &msg = &msg + "\n実行しますか?"
246   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = ?,制御文字展開 = する,&ans
247    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
248  手続き定義終了
249  
250  手続き定義開始 prc住所一括検索( 整数 &currentTblNum )
251   変数宣言 自動,整数  { &lookupTblNum }
252   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
253   
254   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
255   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
256   
257   編集表 &currentTblNum      /* 使用する表を 住所録 に切り替える */
258   解除 *
259   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
260   
261   繰り返し ( .not #eof)     /* 終端行でなければ。 */
262    &郵便番号 = [郵便番号]
263    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
264   
265    手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )
266   
267    編集表 &currentTblNum     /* 住所録の編集対象に戻る */
268    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
269    変数宣言 自動,長整数{&更新モード}
270    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
271    if ( &更新モード = 0 )
272     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
273    else
274     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
275    end
276   
277    ジャンプ 行番号 = 次行
278   繰り返し終了  
279   
280   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
281  手続き定義終了
282  
283  手続き定義開始 cmd住所併合更新Click()
284   変数宣言 自動, 数値 { &ans }
285   
286   手続き実行 prc実行確認( "cmd住所併合更新Click()" , &ans )
287   if ( &ans = 1 )
288    解除 *
289    置換 [郵便番号] = #文字置換( [郵便番号] , "-" , "" )
290    併合 "郵便番号簿.tbx" , 置換 , {[郵便番号]照合[郵便番号],[都道府県]複写[住所1],[住所1]複写[住所2],[住所1]連結[住所3]}
291    置換 [郵便番号] = #部分列( [郵便番号] , 1 , 3 ) + "-" + #右側文字列( [郵便番号] ,4 )
292    確認 "完了しました"
293   end
294  手続き定義終了