N88互換BASIC for Windows95(手引き書) - LPRINT



LPRINTの紙面への実現

4080 LPRINT TAB(5); "@"; TAB(10); "A"; TAB(15); "B"; TAB(20); "C"

 DOS-BASICでは、上記のようなLPRINT行が実行されると、その都度、紙面へ印刷されていく。
 N88互換BASICでは、まだ印刷データーとして蓄えられるだけで、紙面へのLPRINTの実行はされない。実際に印刷するには、「LPRINT CHR$(12)で改ページ」と、N88互換BASICのマニュアルにも書かれているとおり。
◇解決策
  (注:以下の行番号は、プログラムに合わせてふさわしい行番号にすること)
1.根本的な対策
 次の用紙に切り替えたい場所に、下記のような命令行を追加挿入する。
1000 IF P$="y" THEN LPRINT CHR$(12)
 さらにジョブ(作業)の終了時に、印刷の実行を選べるようにメニュー項目に加える。
500 INPUT "*  仕事を選んで下さい"; JOB
550 IF JOB=? THEN PRINT "印刷の実行を行います。": LPRINT CHR$(12)
2.応急的な対策
 プログラム画面のタスクバーから「デバッグ」(虫眼鏡マーク)を選び→「デバッグ」画面内に LPRINT CHR$(12) を入力してEnterキーでOK。
3.応急的な対策 その2.
3-1 事前に、プログラム画面のタスクバーから「白紙」を選び、画面のプログラムを消去する。
3-2 プログラム画面のタスクバーから「プリンターマーク」または、「ファイル」→「印刷」でOK。
 もし3-1 を省略すると、初めに結果が印刷され、続いてDOSのLLIST- に相当するプログラム・リスト全体が印刷されるので注意。

Top  88Menu


CHR$( )

N88互換BASICで対応するCHR$( )は、LPRINT CHR$(12)だけ

 LPRINT 命令を使えば、現在選択されているプリンタを変更することによって、どんなプリンタにも印刷できますが、その代償として機種固有の制御コードを出力しても無視されます。
 例えばキャノンBJC-455Jでは、
LPRINT CHR$(14)= 横倍角 → CHR$(20) = 横倍角CHR$(14)の解除
LPRINT CHR$(15)= 縮小 → CHR$(18) = 縮小CHR$(15)の解除
LPRINT CHR$(15)= NM-9550( NEC ) や BJ-130では横倍角解除だったが、現在は上記の役目。
LPRINT CHR$(26); "P"; : LPRINT CHR$(27); "K"; ' 漢字ドットピッチ 36
LPRINT CHR$(26); "N"; : LPRINT CHR$(27); "K"; ' 漢字ドットピッチ 27
LPRINT CHR$(27);"a" ' 改ページ (どこのプリンターの命令か忘れましたが)
 などなどは、確か無視して、エラーを出さずにそのままプログラムは実行が継続されたように記憶します。

Top  88Menu


TAB( )位置の狂い

300 PRINT "300"; TAB(5); "@"; TAB(10); "A"; TAB(15); "B"; TAB(20); "C"
400 LPRINT "400"; TAB(5); "@"; TAB(10); "A"; TAB(15); "B"; TAB(20); "C"
  123456789012345678901234567890
300    @   A   B   C
 本来は、上段のようになるべきものが、下段のようになってしまう。
400    @         A              B                   C

 原因は TAB( ); 。
 LPRINT 命令(400行)では、間に挟まる空白の長さを決め、 TAB( ) = SPACE$( ) のような働きをしてしまう。画面表示はOKだが、印刷とディスク出力では狂う。
◇解決策
400 LPRINT USING "408 &  & &  & &  &"; @$; A$; B$
 というようにPRINT USINGを使い、正しい桁位置を設定する。
  (注:上記の@$、A$などは正しい変数に直す。また、ホームページの画面表示では半角スペースは省略されるため、一部全角スペースを入れているため、そのままコピーしても正しく機能しない)
 または、
400 LPRINT "400 @"; SPACE$( 10 - LEN("400 @")); "A"; SPACE$( 15 - LEN("400 @" + "A")); "B";; SPACE$( 20 - LEN("400 @" + "A" + "B")); "C"
 TAB(10); "A"; →  SPACE$( 10 - LEN("400 @"));; "A"; とは、
 今までに表示した文字列"400 @"の長さ (LEN("400 @") )を、表示したい桁位置TAB(10)から差し引いた数値を、仮に X とします。その X 分の半角スペース SPACE$(X)を挿入してから、続く"A";を出力しなさい。という意味。
 すなわち、10桁の位置に"A"が表示される。

Top  88Menu


PRINT ***; と LPRINT ???; の入れ子 (=印刷されない)

注: ディスク出力の場合は、入れ子になっていても大丈夫です

6010 PRINT TAB(A); B$ ;
6020 IF P$="y" THEN LPRINT TAB(A); B$; " Lp #6020" ;
6100 FOR G=0 TO 2 6110 A=(12*(I)): A$="###,###,###": A#=H#(I-1,G): GOSUB *P.TU1.C
6120 NEXT G
7000 *P.TU1.C
7010 PRINT TAB(A);: PRINT USING A$; A# ;
7020 IF P$="y" THEN LPRINT TAB(A);: LPRINT USING A$; A#;: LPRINT " Lp #7020" ;

 入れ子とは、 PRINT ; LPRINT ; PRINT ; LPRINT ; のように交互に連続する状態。
 DOS-BASICでは、「" Lp #6020"と" Lp #7020"」は、同一行に連続して印刷される。
 N88互換BASICでは、印刷されずに、画面表示されてしまう。
 原因は、#6010、#7010行のPRINT文末の「 ; 」(=続くの命令)記号。これがあると、次にLPRINT命令があっても、PRINT命令として機能してしまう。
◇解決策
 以下のように直し、 PRINT ; LPRINT ; の入れ子を無くせば良い
6010 PRINT TAB(A); B$ ;
6015 PRINT USING " ##月 ###,###,### ###,###,### ###,###,###"; G; H#(0,G); H#(1,G); H#(2,G)
6020 IF P$="y" THEN LPRINT TAB(A); B$; " Lp #6020" ;
6025 IF P$="y" THEN LPRINT USING " ##月 ###,###,### ###,###,### ###,###,###"; G; H#(0,G); H#(1,G); H#(2,G); : LPRINT " Lp #7020"
 または
◇解決策2.
6010 PRINT TAB(A); B$ ;
6100 FOR G=0 TO 2
6110 A=(12*(I)): A$="###,###,###": A#=H#(I-1,G): GOSUB *P.TU1.C
6120 NEXT G
6220 IF P$="y" THEN LPRINT TAB(A); B$; " Lp #6020" ;
6300 FOR G=0 TO 2
6310 A=(12*(I)): A$="###,###,###": A#=H#(I-1,G): GOSUB *P.TU1.C2
6320 NEXT G
透明スペーサー
7000 *P.TU1.C
7010 PRINT TAB(A);: PRINT USING A$; A# ;
透明スペーサー
7100 *P.TU1.C2
7120 IF P$="y" THEN LPRINT TAB(A);: LPRINT USING A$; A#;: LPRINT " Lp #7020" ;

Top  88Menu


◇ LPRINT "": LPRINT "":

53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "": LPRINT "": NEXT X

 本来は、もし P$="y" なら、「2行の改行」を、「FOR  NEXT X」回行いなさい、という命令。
 ところが、ここに入った1回目はある変数(私のプログラムではM)の値を変えてしまう。そして2回目には、ここの辺りでプログラムを勝手に終了させてしまう。
 プログラムによっては、単純なエラーか、問題ない場合もあるが、このケースでは重大なパグである。
◇解決策
53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "": LPRINT "": NEXT X
 上記のように""の間に実体のあるものを入れることで、解決出来た。印刷してもほとんど目立たない、のようなものが良いだろう。
◇関連

Top  88Menu





▼以下は作業中▼
 管理人自身が、何のエラーだったのか忘れてしまったため、後日調べて整理します。


7215 LPRINT ,X1$
定義されていないエラー  =何故エラーなのか不明  / 2002/11/16のテストではOK

8615 PRINT #4,USING "";NMAX; N; A;
8620 PRINT #4,AB$; TAB(GD-1);: PRINT #4,USING "##,###,###";D#;
8625 IF GC2=GB1 THEN PRINT #4,TAB(28);: PRINT #4, USING "##,###,###";D#;
8630 IF RIGHT$(E$,2)=" " THEN E$=LEFT$(E$,LEN(E$)-2)
8635 PRINT #4,TAB(38);: PRINT #4, USING "###,###,###";N#;: PRINT #4,EA$; E$
8370 IF GB1=KAMOKU OR (PLUS1$="y" AND GB1=KAMOKU+1) THEN TSW=2: AB$=C$: D0#=D#*XYZ : GD=19
8380 IF GC2=KAMOKU OR (PLUS1$="y" AND GC2=KAMOKU+1) THEN TSW=1: AB$=B$: D0#=D#*XYZ*(-1): GD=29
透明スペーサー

Top  88Menu