質問箱No.87(1998年11月号)の回答-04
(自問自答)
いろんな方法がありますね。回答有り難うございました。
あまり難しく考えないで、出来ればいいのですが・・・・ 自問自答はあまりエレガントとは言えませんが、幾つかポイントを上げてみます。
ここでは、対象は画面の1頁だけで、罫線を引くために充分な予備行があるということを前提にしています。
【方法1 <仕切罫線1>】
(1) キー列を指定するときのACCEPT文は ACCEPT /C ";〜〜"; とすると‘/C’によってスケール行に列番号が表示されるので便利です。
(2) <仕切罫線1> は予め罫線を引く行にマークを付けておく方法で、複数頁が対象になった場合にも応用が利きます。ここではマーク付けのための列を増やさないで、表の1桁目にある「システムカラム」を使うようにしました。縦罫線が1本でも引いてあるとこの方法が使えます。(縦罫線列をキー列
にしています)
(3) 横罫線を引くのに、FOR 〜 NEXT でマークを探して指令‘DRL’を実行するのですが、DRLをループの外に出して DRL/C としたほうが実行速度は上がります。
(4) システムカラムに書き込んだマーク(#)を探すには10行目のようにIF L%X2<>";=#*"; THEN 〜 とワイルドカードで1桁目をチェックします。
(5) 最後にシステムカラムに書き込んだマークを消しておきます。
1 <仕切罫線1>
2 $キー列: ACCEPT /C ";キー列は何列目?";,X1;
3 IF X1<1 | >C THEN GOTO $キー列;
4 CPA;M;Y;
5 DR;H+1,T;Y; S;
6 $マーク付け:MPU;M;S;1;;1;
7 C%X1<>S%X1;";#";=SC:C%X1=S%X1;E;Y; /* 1列目は縦罫線 */
8 $線引き: DRL/C;
9 FOR X2=T TO H STEP -1;
10 IF L%X2<>";=#*"; THEN CONTINUE;
11 R;%X2;
12 NEXT;ESC;
13 $マーク消し:MPU;M;;;"; ";=SC;E;Y;
14 STOP
【方法2 <仕切罫線2>】
(1) 多分最もシンプルな形でしょう。マーキングは一切なしです。
余計なことをしないのでスピードも速いと思います。(待場さんの回答が
もっと早いかも・・・・)
(2) ある行のデータとその前の行のデータが同じなら素通りし、異なる場合だ
け罫線を引きます。この方法は複数頁が対象になると使えません。
(3) ここでも罫線を引く指令は FOR 〜 NEXT の外に出して、DRL/C としてあ
ります。
16 <仕切罫線2>
17 $キー列: ACCEPT /C ";キー列は何列目?";,X1;
18 IF X1<1 | >C THEN GOTO $キー列;
19 $線引き: DRL/C;
20 FOR X2=T TO H+1 STEP -1;
21 IF [X2,X1]=[X2-1,X1] THEN CONTINUE;
22 R;%X2;
23 NEXT;ESC;
24 STOP
□
|