イメージ 1
複数のQSOデータをまとめて1枚のQSLカードに印刷するために、QSOデータ表の概要でも述べた通り、QSLカード印刷の画面で、「JARL指定逆順」にしている。

これはQSOデータを入れてあるマスターデータを、印刷のときだけ、JARL転送の逆順番(または順番)に並べ替えることで、同じコールサインの局を前後に集めるために利用する。

しかも、「逆順」はDX局から始まるが、コールサインを「ZAの順に揃えるだけでなく、QSO日時の順を「新しい古いに並べ替えてくれる。
このようにQSOデータを並べ替えることが前提で、複数のQSOデータをまとめて印刷できるようになる訳だ。

複数のQSOデータをまとめるときは1つだけを参照しているのではなく、同じ相手局の印刷であっても、1行ずつ次々とデータの内容が変化していることを意識しなければならない・・・当局も最初はこれが疎かになっていた。

従って入力画面の His Name だけでもある行では「YAMA」、別の行では「山田」
更に「山田/YAMA」・・・と、異なる場合も多い。入力を忘れている場合もある。
当局は、例えば His Name であれば、最新行に近い(1行目~)QSOデータを参照するようにした。

逆にこのQSO5行の間に、1st QSO が含まれるか?を確認するためには、おそらく最終行(5行目)のQSOデータを参照しなければわからない。
また、QSOデータ中に特定モードが含まれるか? 特定周波数が含まれるか? などは、まとめる5行中に「あるか?」「ないか?」を探さなければならない。
当局は、1stQSOのCW-QSOがあった場合に、特別なコメントを使いたかったので、
モードをCWに絞って調べたが、SSTVとかPSKとか、人によって様々考えられる。

以上、各QSOデータ内を調べるために、すでに使い終わった引出し(変数)を再利用することにした。
例えば共通項目の設定で引出し(変数)に入れた $$N英語のOPネーム)は、すでに印刷が終わって、このカード内で再び使うことない。
そこで、最新の His Name またはクラブ局等のオペレータを探し出して記録するのに$$Nを再利用している。

こうした引出し(変数)を再利用するためには、今まで入ってていたデータを一旦消す(クリア)必要がある。
同時に、何行記録したかという$$V行カウント)に[1]を、項目表題行からデータの書き出し位置を1行分45(4.5mm)下げる。ここで1行の高さは40(4mm)のはずだが、データ文字の書き出しなので、5(0.5mm)足してある。

;データ行1行目の印刷----------------------------------
#Mov $$V=1 ; 行カウントの初期値
#Mov $$W=$$W+45 ; データ1行目の縦開始位置
#Mov $$N="" ; 名前を収納する変数をクリア
#Mov $$R="" ; 1stQSO記録を収納する変数をクリア
#Mov $$M="" ; モードにCWが含まれる変数をクリア
? DXST! ; DXでないか?
#Mov $$L="" ; 1行目のDXを変数$$Lに記録なし
? DXST ; DXであるか?
#Mov $$L="DX" ; 1行目のDXを変数$$Lに[DX]を記録
#Load "multi-sub-01.QSL" ; データ書込みサブルーチン

$$V行カウント)と$$Wデータ1行目の縦座標)を指定して、これから再利用する引出し(変数)をきれいに掃除(クリア)して準備を整える。
次に? DXST!DXでないか?)と? DXSTDXであるか?)を使って、相手局がDXか?否か?を最初の行で$$L録している。

準備が整ったところで、1行目のデータを印字するが、ここはまとめて別の定義ファイル"multi-sub-01.QSL"を作って使っている。

#Load別の定義ファイルを読み込む)は、以下のように記述する。

#Load "[別に作った定義のファイル名]"

取りあえず、同じハムログのフォルダに入れてあるが、今のところ別フォルダまで参照可能かは不明。(試していません)
面白いのは、母屋(現在書いている元々の定義ファイル)の変数など、そのまま行った先でも継承してくれるので、云わば「はなれ」?みたいなものなのだろうか。

前述の通り、「はなれ」の定義は次回以降に送って、話を進めます。

いよいよ、#DoLoopループの先頭)と、#EndLoopループのエンド)、更に#Readk次のデータを読んでジャンプ)が登場します。

; データ行2行目以降の印刷-----------------------------------------------------
#DoLoop ; QSOデータのループ開始
#Readk *890 ; 同じコールサインでなければ*890へジャンプ
#Mov $$V=$$V+1 ; 次の行カウント
#Load "multi-sub-01.QSL" ; データ書込みサブルーチン
#EndLoop $$U ; $$U0になったらループ終了

#EndLoopは、$$U0になったら、#DoLoopループの先頭)に戻るのをやめます。$$U共通項目の実際で引出し(変数)に入れておいたデータ行の最大数です。
当局は$$U 5にセットしてありますが、4の場合は1枚のQSLカードに4QSOまでになります。

#DoLoop
ループ内で処理する命令等を書く
#EndLoop [0で終了する変数名]

#Readk次のデータを読んでジャンプは、次に移動する行の「Call」が同じでなければ、*890(数字は何でも良い)という、ラベルの付いた定義の位置に飛ぶ(ジャンプ)ように指示します。

#Readk [コールが違う場合にジャンプするラベル名]

次のデータを読む命令には、比較するコールによって2種類あり、当局の実行してみた範囲では、#Readj の場合は、QSL転送先を比較し、#Readk は入力画面のCall」欄を比較してしているようです。
但し、国内局は#Readk でもポータブルあるなしに関わらず、同じコールとしてまとめてくれました。この機能には大変助かります。
一方DX局は、QSLマネージャーでまとめると、おかしくなることがるので、
#Readk がとっても使いやすいです。

#Readk でお墨付きをもたっらので$$V行カウントを1行分増やしています。
そして1行目同様に#Load で「はなれ」に処理をしてもらいます。

$$U0になると順番で自然に(この場合、*890のラベルは無視)、コールが一致しなくなったときはジャンプで、データ表の最終行の処理に移ります。

;データ表の最終行-------------------------------------------------------
*890 #Readk によるジャンプ先の場所
#FontName="Special Elite" ; データ最終行に書込むフォント指定
#FontSize=10 ; 文字の大きさ(普通)
#FontColor=0x707070 ; 文字色(灰色)
#Mov $$A=$$V ; 数値変数を文字列変数に変換
#Print $$X+220, $$W+2, "------ End of QSO-DATA(!$$A) ------"
;最終行を印字 

ここで要注意は、共通項目の実際で申し上げた通り、引出し(変数)につける名前は、$$A~$$Tが文字列用$$U~$$Zが数値用という決まりがあることだ。
今まで足し算で使ってきた$$V行カウント)は数値用で、#Print で文字として使うには、一旦$$A文字列用に入れ替えしなければ表示されないようです。

さて、今回のQSLカード印刷定義の流れは解りずらかったので、フロー図に書き直して、自分自身の頭の中を整理しておきました。

イメージ 2

さて「はなれ」と銘打ったサブルーチン風ファイルを#Load で呼び出す別定義ファイルの説明は、次回から始めます。

特にRemarks部分は何でも詰め込んでしまったので、条件命令の嵐になりました。