99Basicインタプリタ(手引き書) - 印刷の関係

   印刷開始をコントロールする 
スキーで騎馬武者    LPRINT CLOSE 
   LPRINT CHR$(12) ' 改ページ 
   環境の設定(1.印刷開始) 
   環境の設定(2.印刷の桁・行位置の調整) 
   環境の設定(3.宛名シールなどは難しい) 
   PRINT ***; と LPRINT ???; の入れ子(=大丈夫) 
   LPRINT USING(=大丈夫) 
   右寄せ・右合わせ(尻位置合わせ)表示・印刷(=大丈夫) 
   (TABに代わる)DEFFN / FN(命令) 
   右寄せ・右合わせ(尻位置合わせ)表示・印刷 
◇緊急レポート(2008/10/02)
WINDOWSビスタと99Basicの相性・不具合

◇ 印刷開始をコントロールする

 99Basicでは、LPRINT 命令で印刷するとき、データーをPRINTERに送信後、約(1〜)2分くらいたたないと印刷を開始しません。
 慣れない内は、互換性があるとはいえLPRINT文のどこかに要修正部分があったのかな? と悩んでしまいます。慣れてきても、2分間も待たされるのは精神衛生上よくありません。
透明スペーサー
 これを修正するには、
◇LPRINT文が終了した後に、LPRINT CHR$(12) を書いておきます。
 LPRINT CHR$(12) を出力することで、1ページ終了とし、用紙の排出を行います。
  • LPRINT CHR$(12)については、少し後で詳しく説明してあります。
または、
LPRINT CLOSE を書いておきます。
 明示的にプリンタをクローズし、すぐに用紙を排出するには、LPRINT CLOSE 命令を使用します。
 LPRINT CLOSE は、プリンタをクローズする命令です。この命令を実行すると、もし印刷中ならば、用紙をすぐに排出し、プリンタをクローズします。印刷中でなければ、何もしません。と書かれています。
  • LPRINT CLOSEについては、すぐ次の項でもう少し詳しく説明してあります。
または、
END も、用紙の排出を行います。
 プログラムの終了なので、その中にLPRINT CLOSE 命令も含まれるということなのでしょう。
 この2つの違いは、END はプログラムそのものを終了させ、LPRINT CLOSE は(待機中のものは印刷をさせて)印刷を終了させますが、プログラムの実行し続けます。
透明スペーサー

Top  99Menu


◇ LPRINT CLOSE

 明示的にプリンタをクローズし、すぐに用紙を排出するには、LPRINT CLOSE 命令を使用します。
 LPRINT CLOSE は、プリンタをクローズする命令です。この命令を実行すると、もし印刷中ならば、用紙をすぐに排出し、プリンタをクローズします。印刷中でなければ、何もしません。と書かれています。
 これはDOS-N88BASICや、N88互換BASICには無かった?ハズで、99Basic独自の命令だと思います。
透明スペーサー
◇LPRINT CHR$(12) とLPRINT CLOSEの使い分け
 例えば宛名シールや、1ページに収めたい資料の打ち出しでは、ページが終わる毎にLPRINT CHR$(12)が必要です。(これについては、すぐ次の項で述べます。)
透明スペーサー
500 GOSUB 1000 ' ' ' DATAの読み込み、計算など
600 GOSUB 2000 ' ' ' 必要なLPRINTの実行
700 IF P$="Y" THEN LPRINT CHR$(12)
710 INPUT "  以上です。";Q$
720 RUN
 最後にまだ印刷されない待機状態の部分の打ち出しがあるかも知れないので、
2000 行代で、LPRINT文がすべて終了した後にも
行 700 で、LPRINT CHR$(12)を記述しておけば、待たされる時間が短くなります。
 しかし、印刷が残っていない状態でも、この場合は排紙が行われてしまいます。
透明スペーサー
 このケースでは、以下のようにLPRINT CLOSE を書いておいたほうが良いです。「印刷中でなければ、何もしません」なので、何も残っていなければ排紙はされないのです。余分な排紙が無くなると、精神衛生的に良いものです。
500 GOSUB 1000 ' ' ' DATAの読み込み、計算など
600 GOSUB 2000 ' ' ' 必要なLPRINTの実行
700 IF P$="Y" THEN LPRINT CLOSE
710 INPUT "  以上です。";Q$
720 RUN

Top  99Menu


◇ LPRINT CHR$(12) ' 改ページ

 LPRINT CHR$(12)は排紙コマンドです。分かりやすく言えば、改ページを命令します。
 99Basicでは、LPRINT 命令で印刷するとき、データーをPRINTERに送信後、約(1〜)2分くらいたたないと印刷を開始しません。
 なかなか始まらないプリンの開始待ち時間の短縮だけでなく、宛名シールやページ単位で整える資料作りでは、LPRINT CHR$(12)が必要になります。

 但しよく分からないのは、
10 LPRINT CHR$(12)
 上記1行だけのプログラムを実行すると、2枚も排紙されることです。
透明スペーサー
10 LPRINT CHR$(12): LPRINT CHR$(12)
 上記1行だけのプログラムを実行すると、3枚も排紙されることです。
透明スペーサー
10 INPUT N
20 FOR I=1 TO N
30 LPRINT I
40 LPRINT CHR$(12)
50 NEXT
60 END
 上記のプログラムを実行すると、N=2では3枚、N=3では4枚、N=5では6枚排紙されます。
透明スペーサー
 DOS-N88BASICとN88互換BASICでは、正しく予想枚数が排紙されますが、99Basicではさらに1枚余分に排紙されます。
 バグなのか、それとも対策があるのかは不明です。
透明スペーサー
 この対策の意味も含めて、すぐ前にあるLPRINT CLOSEの項目もお読みください。

Top  99Menu


◇ 環境の設定  (1.印刷開始)

99Basic画面  すぐ前の項で述べた方法とは別に、99Basicの環境の設定で、印刷開始時間の変更が出来ます。
 これは99Basic実行画面の左上にある99の数字をクリックすると現れます。
 その画面の左下のほうに、プリンター関係があります。
 使用するプリンーという文字の横にある「変更(P)」をクリック。
 新たに開かれた「プリンターの設定」画面の下部にある、「排出までのタイムアウト(T)」横の小窓の数字を変更し、「OK」ボタンで閉じれば良いのです。
 多分、この初期設定が120秒になっていたのではないかと思います。
透明スペーサー
 ところがこれを短くしすぎると、別のトラブルが発生します。
 仮に、タイムアウト設定を10秒として、A、B、C、Dの4部分を1枚の用紙に印刷するプログラムを使ったとします。
 ある計算して、その結果A部分をLPRINTして、次の計算が10秒以上かかると、B部分をLPRINTする前に排紙されてしまうのです。即ち、本当は1枚の用紙に納めたかったものが、4枚に用紙に分けられて印刷される可能性があるのです。(のハズです?)。
 これは資源の無駄遣いだけでなく、印刷されたものが見にくくなります。もし印刷結果を資料として提出するものなら、これで使えません。
透明スペーサー
 こういうことがあり、99Basic入門後約2カ月の現時点では、タイムアウト設定を60秒としてあります。これなら2分間待たされるよりは、イライラが多少は少なくて済みます。
 それに加えて、
100 GOSUB  *JOB
110 PRINT "全ての仕事が完了しまた。"
120 IF P$="y" THEN LPRINT CLOSE                '  印刷の残りがあれば完了させる
130 END

1000 *JOB
1010 FOR N=1 TO 3
1020    ****************
1140    IF P$="y" THEN LPRINT "******"
1520    ****************
1640    LPRINT "******"
1700    IF P$="y" THEN LPRINT CHR$(12)         '  Nページめを強制的に印刷開始
1800 NEXT N
1850 RETURN
 というように、必要ならページ毎にLPRINT CHR$(12)を行い、全ての作業終了後にはLPRINT CLOSE を行っています。

Top  99Menu


透明スペーサー

◇ 環境の設定  (2.印刷の桁・行位置の調整)

99Basic画面  宛名シールや書類作成時に桁・行位置が狂う場合は、環境の設定から変更して調整が出来ます。
 これは99Basic実行画面の左上にある99の数字をクリックすると現れます。
 その画面の左下のほうに、プリンター関係があります。
 使用するプリンーという文字の横にある「変更(P)」をクリック。
 新たに開かれた「プリンターの設定」画面の中央より少し下にある、「余白」横の小窓の数字を変更し、「OK」ボタンで閉じれば良いのです。
 多分、この初期設定では、左、右、上の3つは「15ミリ」、下は「20」ミリになっていたのではないかと思います。
透明スペーサー
 用紙に印刷される行数、桁数をちょくせつ指定することは出来ず、左、右、上、下の余白の変更に連動して変更されるだけです(多分?)。
 あるいは「フォントサイズ」の「2.0mm×4.0mm 標準」を変えることでも、同様に調整が出来ます。

◇おまけ
 余談ですが、この環境設定は便利な機能です。
 「マウスでカーソル位置を変更する」や「エラーを日本語で表示する」などの設定も出来ます。
 「命令/関数のヘルプファイルを使う」であるキーに設定すれば、以降はそのキー一発でヘルプファイルを呼び出すことが出来ます。
 関心のある方は、

Top  99Menu

透明スペーサー

◇ 環境の設定 3.宛名シールなどへの正確な印字は難しい

99Basic画面printer     宛名シールとは、例えばA4サイズの用紙に縦6列、横2列に個々シールが並ぶものを指します。
◇ 本来はこの環境の設定内だけでうまく調整出来るハズなのですが、

 環境の設定の1.2.で述べた「上下の空白設定」や、「フォントサイズ」の変更による行数の調整などを上手く合わせれば、素直なプログラムのままで、収まりよく宛名シールなどに印字していける可能性はあります。
 しかしそれはあくまでも理論上であって、実際にその設定を探すことはきっと諦めたほうが良いでしょう。

 私の場合は、次のようなプログラム方法で何とかごまかし、利用している状態です。
@ 2枚目以降のシールでは、最初の1行目の印刷開始位置が1行分下になります。その対策として、1枚目のみ初めに1行分空打ち(空白行の印字)をさせて、他のページとの頭合わせを調整しています。(これは99Basicによるものではなく、私の使用プリンターが原因の可能性が大ですが、)
A また、そのまま素直に印刷していくと、途中から宛名シールの切れ目と、宛名印刷位置とに狂いが生まれてきます。そのために、例えば、2列目、4列目の終わりに1行分空打ち(空白行の印字)をさせて、各宛名シールの切れ目との位置合わせを調整しています。

2190 IX=IX+1:                         '  IX= 印刷カウンター
2200    ''  IF IX=1 → 各用紙の一人目を意味する
2210 IF (IX MOD 6=1) THEN LPRINT ".": IF IX=1 THEN LPRINT ".":     '   hpプリンター2枚目以降で1行下がりの調整

2390  IF ((IX MOD 2)=0) THEN LPRINT " "    ''  更に2列目と4列目の終わりで1行増

◇MOD とは
 割り算の余りを求める演算子です。
   命令書式: 整数1 MOD 整数2
 整数1を整数2で割った余りを計算します。この演算は、整数演算ですから、単精度実数や倍精度実数が指定された場合は、あらかじめ整数に変換された後、計算されます。得られる結果は整数です。
 例えば、IX=1 7 13 19 などの場合は、IX MOD 6=1 になります(IX÷ 6 = 余り 1)。
 例えば、IX=0 2 4 6 8 などの場合は、(IX MOD 2)=0 になります(IX÷ 2 = 余り 0)。

Top  99Menu


◇ PRINT ***; と LPRINT ???; の入れ子(=大丈夫)

4255 FOR X=1 TO SP
4260     PRINT X, SP$(X);: IF D_OUT$="Y" THEN PRINT #4, X, SP$(X);
4265     IF P$="Y" THEN LPRINT X, SP$(X);
4270 NEXT X: PRINT "": IF P$="Y" THEN LPRINT
4275     IF D_OUT$="Y" THEN PRINT #4,  ""
4295 RETURN
 入れ子とは、上記のように PRINT ; LPRINT ; PRINT ; LPRINT ; のように交互に連続する状態。
 99BasicではDOS-N88BASICと同様に、正常に機能します。(ファイル出力 PRINT #?, "***" の場合も)
DOS-BASICでは、「" Lp #6020"と" Lp #7020"」は、同一行に連続して印刷される。
 ところがN88互換BASICでは、印刷されずに、画面表示されてしまう。原因は、#4260行のPRINT文末の「 ; 」(=続くの命令)記号。これがあると、次にLPRINT命令があっても、PRINT命令として機能してしまう。
4255 FOR X=1 TO SP
4260     PRINT X, SP$(X);: IF D_OUT$="Y" THEN PRINT #4, X, SP$(X);
4265     IF P$="Y" THEN LPRINT X, SP$(X);
4270 NEXT X: PRINT "": IF D_OUT$="Y" THEN PRINT #4,  ""
4274 IF P$="" THEN RETURN
4280 FOR X=1 TO SP
4285     IF P$="Y" THEN LPRINT X, SP$(X);
4290 NEXT X: IF P$="Y" THEN LPRINT
4295 RETURN
 そのためにN88互換BASICでは、上記のようにPRINT部分(4255〜4270行)とLPRINT部分(4280〜4290行)を分けて、PRINT ;を完結させてから、LPRINTに入る必要がある。


 99Basicではこの必要性がありません。

Top  99Menu


◇ LPRINT USING(=大丈夫)

画面やファイルに、書式付きで、数字や文字を表示します。
 書式: PRINT [<@画面番号‖#ファイル番号>,]USING フォーマット;<表示内容[,表示内容,...]][<,‖;>]
フォーマット付きで、文字列や数字を表示します。特に、数字を表示する場合は、有効数字桁数などが厳密にチェックされ、表示数値の誤差を減らす工夫がなされています。ふつうの PRINT 命令の場合は、実行速度優先の立場から、有効数字チェックを行っていません。
 99Basicのヘルプによれば、以上のように書かれています。

 私自身も、LPRINT USINGでエラーの出た記憶はありません。
3010 LPRINT USING "  &             &      ##,###,###  "; MOJI$ ; SUUJI
3050 LPRINT USING "  &        &  ##,###   ##,###,###  &        &   ##,###,###" ; MOJI1$ ; SUUJI1 ; SUUJI2 ; MOJI2$ ; SUUJI3
 例えばこのような使い方をして、書式を整えます。文字列は頭合わせ(左寄せ)、数字は尻合わせ(右寄せ)になります。

 詳しい説明は、PRINT USINGでを参照下さい。

Top  99Menu

◇ 右寄せ・右合わせ(尻位置合わせ)表示・印刷



 詳しい説明は、PRINTページ内にある 右寄せ・右合わせ(尻位置合わせ)表示・印刷  を参照下さい。
  

Top  99Menu