回答箱 No.98-2: DMで特定列をWindowsプリンターに倍角で出力したい
        ◆ 質問箱 No.98  質問者:  野崎 武治  1999年07月 210号 P.17
            ◆ 質問箱 目次へ
No.98-2   DMで特定列をWindowsプリンターに倍角で出力したい 回答者
  待場 純
1999年09月
212号 P.14
   ◆ No.98(1999年7月号)の回答-2
  1.   倍角化は、FORM$関数でパラメータを8にすることで実現します。
  2.   全角を倍角にする場合、実質の桁数が2倍増えるので、横のサイズが問題となります。これを回避するために、データから、10なり、20なり、DMラベル1枚のピース分だけデータを順に持ってきて、行数が減った文を桁の増加に振り替える、というのがこのシステムの基本です。
  3.   一定行を順に処理するのは、拙作の<コンパクトな印刷>のアルゴリズムをそのまま利用しています。
  4.   流れは、(1) ラベルのフォーマットを作成(4〜9行)、(2) データを一定数量順に流し込み(11〜38)、(3) 特定列を倍角化して(41〜42)、(4) 印刷処理します(43)。
  5.   便宜的にこのプログラムでは、ワークページを2ページ使用しています。
  6.   ラベルフォームの加工について、7行目を枚数分だけ繰り返せば任意の場合に対応できます。
  7.   この例は、小さなルーチンの組み合わせですが、相乗効果をねらうのが、PIPSでシステムを構築しているユーザーの醍醐味ではないでしょうか。

このプログラムはプログラム集にテキストファイルがあります。
【プログラム】
1. <ラベル印刷> 1999.8.12 BY J.MAT
2.
ACCEPT /P"バインダーは?",V9; LET X22=BINDER(V9);
3.

4. /* ラベル様式のセット -------------------------------------------------*/
5. SET;S;M;1;180;;Y; O; LABEL-FMT-作業様式; ESC; LET L1="$S"; LET L2="$E"; S;
6.
G;★LABEL-FMT/1
7.
/* 2連に設定 */; CPC;1;1; S; CPR;SA;2; P;★LABEL-FMT-WORK/1;
8.
/* ラベルは、2連5枚でX26=10ピース */; LET X26=10;
9.
/* 倍角にする対象列は、3列目 */; LET X39=4;
10. /*------------------------------------------------------------------*/
11.

12.
/* 10行単位で処理をするルーチン部 */
13.
G;%V9/1;
14.
/* 行の初期位相☆X4 */; LET X4=H;
15. /* 初期値 DATA COUNTER X5,複写開始行 X23 */; LET X5=1;LET X23=X4;
16.
/* ----- 受皿フォーマットの作成 -----*/
17. DR;A;; /* 新たに設定する横幅設定→ */; INFO;S; 500; IR;S;H;%X26;
18. S; /* DATA COUNTER */; LET X17=0;
19. FOR X1=1 TO X22; G;%V9/%X1;IF STATUS(1,1)=1 THEN LET X17=X17+T-H+1;
20. /* 次頁を呼出す */;IF X1<X22 H OR (STATUS(1,1)="0" AND>T) THEN CONTINUE;
21. /* 最終P処理 */;IF X1=X22 AND (STATUS(1,1)=0 OR H>T) THEN GOTO $処理;
22. /* 正常頁X24 開始行 */;LET X23=H;IF STATUS(1,1)=1 AND H<=T THEN GOTO $反復;
23.
/* 最終PにDATAがないときは印刷して終了する */
24.
IF (X5-1)MOD(X26)>0 THEN GOTO $反復 ELSE CONTINUE;
25. $反復: /* 頁の最終行 X6 */; LET X6=T;
26.
/* 複写先行 X27 */; LET X27=(X5-1)MOD(X26)+X4;
27.
/* 余り行数の比較 M=X13 */; LET X13=T-X23+1;
28.
/* S=X14 */; LET X14={T}-X27+1;
29.
/* コピー行数 X30元の表の余行 > 受皿の残行なら受皿残行分のみ複写*/;
30.
IF X13>=X14 THEN LET X30=X14 ELSE LET X30=T-X23+1;
31.
/* 複写終了行 X25 */; LET X25=X23+X30-1;
32. /*-- メインルーチン CPB M-->S --*/; CPB; %X23,1; %X25,T; S%X27,1;
33.
/* 次の通算番号 X5 */; LET X5=X5+X30;
34.
/* 次の開始行 X23 */;
35.
IF X13=X14 OR X25=X6 THEN LET X23=X4 ELSE LET X23=X23+X30;
36. $処理: /*- 受皿が満杯かDATAがなければサブ画面を印刷する -*/;
37. IF (X1=X22 AND X25=X6) OR (X5-1)MOD(X26)=0 THEN GOTO $LABEL印刷;
38.
/*- 受皿が満杯になるまで複写作業を反復継続する -*/; GOTO $反復CK;
39.

40. /*- ラベル印刷処理 ----------------------------------------------------*/
41. $LABEL: FOR X1=H TO T; LET V3=[X1,X39]; IF V3="=*-*" THEN CONTINUE;
42.
LET [X1,X39]=FORM$(V3,8);
43.
NEXT; P;★WORK/1; G; ★LABEL-FMT-WORK/1; DM; G;★WORK/1;
44. /*--------------------------------------------------------------------*/
45.

46.
LET X31=X31+1;
47.
S;
48.
IF X1=X22 AND X25=X6 THEN CONTINUE;
49.
/* 受皿のクリアと再セット */; FILL;;A;A;; S;
50. $反復CK: IF X25<T THEN GOTO $反復; /* 主画面にデータがある限り繰り返す */
51. NEXT; S"top";


このページのTOPへ戻る