99Basicインタプリタ(手引き書) PRINTの関係 - 画面

スキーで騎馬武者
透明スペーサー

◇ PRINT


100 PRINT " A=" A  "   B=" B  "   C=" C      ''  WIN互換ベーシックではエラー (; (セミコロン)の省略は不可)
100 PRINT " A=" A  "   B=" B  "   C=" C      ''  99BasicとDOS-N88BASICではOK
100 PRINT " A=";A ;"   B=";B ;"   C=";C      ''  99BasicとDOS-N88BASICWIN互換ベーシックすべてOK

200 PRINT " A+1="  A+1   " B+1="  B+1   " C+1="  C+1      ''  DOS-N88BASICではOKだったと記憶?
                         ''  99Basicでは「データーの型が一致していない」エラー
                         ''  WIN互換ベーシックではエラー (; (セミコロン)の省略は不可)
200 PRINT " A+1="; A+1 ; " B+1="; B+1 ; " C+1="; C+1      ''  WIN互換ベーシックOK、DOS-N88BASICもOK?
                         ''  99Basicでは「データーの型が一致していない」エラー
200 PRINT " A+1=";(A+1); " B+1=";(B+1); " C+1=";(C+1)      ''  すべてでOK
200 PRINT " A+1=" (A+1)  " B+1=" (B+1)  " C+1=" (C+1)      ''  99BasicとDOS-N88BASICではOK
                         ''  WIN互換ベーシックではエラー (; (セミコロン)の省略は不可)
 注:
 99Basicでは、
200 PRINT " A+1=" (A+1)  " B+1=" (B+1)  " C+1=" (C+1)
 のように、 PRINT A+1の後にさらプリントが続く場合は、 (A+1) 式に (  )で囲んでおく必要があります。
 但し、 (C+1)の後にはプリントが続かないので、
200 PRINT " A+1=" (A+1)  " B+1=" (B+1)  " C+1="  C+1
 となっていても、エラーにはなりません。

Top  99Menu


◇ PRINT USING

  (印刷をする命令 LPRINT USINGの場合についても、PRINT USINGと同じハズです。)
★ケース.1
3010 PRINT "操越= " USING "###,###,###";AK#         '' DOS-N88BASICのみでOK
3010 PRINT USING "操越= ###,###,###";AK#            '' 99BasicとDOS-N88BASICWIN互換ベーシックすべてOK
3010 PRINT "操越= ";: PRINT USING "###,###,###";AK# '' 99BasicとDOS-N88BASICWIN互換ベーシックすべてOK

★ケース.2
3050 PU1$="###,###,###   ###,###,###   ###,###,###   ###,###,###   ###,###,###"
3060 PRINT "事業所得       " USING PU1$ ;A#(1);A#(2);A#(3);A#(4);A#(5)
 DOS-N88BASICではOK、99Basicでは「文法どおりに記述されていない」エラー。
3060 PRINT USING "事業所得       "  PU1$ ;A#(1);A#(2);A#(3);A#(4);A#(5)
 DOS-N88BASICでは不明、99Basicでは「文法どおりに記述されていない」エラー。
3060 PRINT USING "事業所得       "+ PU1$ ;A#(1);A#(2);A#(3);A#(4);A#(5)
 DOS-N88BASICでは不明、99BasicではOK。
★ケース.3
 AK#=1234567 の場合
1000 PRINT USING "###,###,###";AK#
 99BasicとDOS-N88BASICWIN互換ベーシックすべてで、「1,234,567」と表示されます。
透明スペーサー
1000 PRINT USING "#########,";AK#
 99BasicとDOS-N88BASIC → 「1,234,567」
 WIN互換ベーシック → 「1234」と表示されます(= 下3桁の567が省略)。
透明スペーサー
1000 PRINT USING "#####,####";AK#
 99BasicWIN互換ベーシック → 「1,234,567」
 DOS-N88BASICでは、不明です。
透明スペーサー
★ケース.4
1290 PRINT ,USING "無ければ ( )を #,###,###,###";AK
 DOS-N88BASICではOK、99Basicでは「文法どおりに記述されていない」エラー。
透明スペーサー
1290 PRINT USING "    無ければ ( )を #,###,###,###";AK
 DOS-N88BASICも99BasicもOKです。
透明スペーサー
 上記以外のケースでは、とくに違いは見つかっていません。

Top  99Menu


◇ TAB( )

     TAB( )を代用出来るDEFFN(命令)/ FN(関数)についての実例は、このTAB( )解説の後半に書いてあります。

 TAB(X)は、画面ではXの桁にカーソルを移動します。LPRINT(印刷)やPRINT #(ファイルの出力)でも、同様に働き桁位置を移動します。
 しかし99Basicでは、TAB( )をコマンドを持っていないので、単なる配列変数としてみなしてしまいます。(X)が10を越せば、配列外のエラーです。(DOS-N88BASICやN88互換BASICでは配列変数として使っている訳ではないので、とうぜん配列宣言をしていません)
透明スペーサー
1630 PRINT TAB(B);: PRINT USING " ------ (##)";J;
 上記ではBが10を越すと配列外のエラー。
 またエラーにならない場合は、TAB(B)という配列変数をPRINT せよという命令なので、
0  ------ ( 8)
 などという表示になります。
 他のBasicから移植したプログラムで、画面左側の2桁目に原因不明の 0 が表示される場合は、このゴミ表示(PRINT TAB( ))の可能性が大です。
透明スペーサー
◇修正の実例(画面)
1630 PRINT TAB(B+17);: PRINT USING " ------ (##)";J;
 上記が元のプログラムの場合、以下のような方法があります。
1630 PRINT USING " ------ (##)";J;   → 表示の桁位置が大幅に狂う
1630 PRINT USING "         ------ (##)";J;   → 表示の桁位置が多少狂う
1630 PRINT SPACE$(B+17-1);: PRINT USING " ------ (##)";J;   → 表示の桁位置は正しい
1630 LOCATE(B+17): PRINT USING " ------ (##)";J;   → 表示の桁位置は正しい
透明スペーサー
 もっと複雑な場合は、LOCATEがお勧めです。
◇修正の実例(画面)
7000 ' -------- Sub. 科目コード表------
7010 CLS: CLS 2: COLOR 5: ' width 80,20
7020 FOR N=1 TO 15
7040    GX=N:          IF GX=<G1   THEN B_SW=0: GOSUB 7150   '  資産=1列め
7050    GX=N+G1:       IF GX=<G2   THEN B_SW=1: GOSUB 7150   '  負債資本=2列
7060    GX=N+G2:       IF GX=<G3   THEN B_SW=2: GOSUB 7150   '  収入=3列め
7070    GX=GF(N+G3)  : COLOR 4: PRINT GX;: IF GX-G1<G4 THEN B_SW=3: GOSUB 7150   '  経費=4列め
7080    GX=N+G3+G3-G1: COLOR 5: PRINT GX;: IF GX=<G4   THEN B_SW=4: GX=GF(GX): GOSUB 7150 '経費=5列
7085    PRINT
7090 NEXT N
7100 PRINT "": COLOR 7: RETURN
7110 '
7150  '  PRINT TAB(14*B_SW);: PRINT USING "###.&       &";GX; F$(GX);  ''  WIN互換ベーシック
7155     LOCATE   (14*B_SW) : PRINT USING "###.&       &";GX; F$(GX);  ''  99Basic
7160 RETURN
7170 '

◇修正の実例(画面)
 上記のプログラムを簡単に書き直すと、以下のようになりものです。 7150 PRINT USING "###.& &";GX; F$(GX);: PRINT TAB(14*1);: PRINT USING "###.& &";GX+G2; F$(GX+G2);: PRINT TAB(14*2);: PRINT USING "###.& &";GX+G2; F$(GX+G2);: PRINT TAB(14*3);: PRINT USING "###.& &";GX+G3; F$(GX+G3);: PRINT TAB(14*4);: PRINT USING "###.& &";GX+G4; F$(GX+G4) '' WIN互換ベーシック 7150 PRINT USING "###.& &";GX; F$(GX);: LOCATE(14*1);: PRINT USING "###.& &";GX+G2; F$(GX+G2);: LOCATE(14*2);: PRINT USING "###.& &";GX+G2; F$(GX+G2);: LOCATE(14*3);: PRINT USING "###.& &";GX+G3; F$(GX+G3);: LOCATE(14*4);: PRINT USING "###.& &";GX+G4; F$(GX+G4) '' 99Basic

Top  99Menu


★ LPRINTやPRINT #の場合に使うTAB( )は、少しやっかいです。
 印刷やファイルへ出力をする場合です。ここでは、印刷をする場合の LPRINTを例にしますが、ファイルへ出力をする PRINT #4, などの場合も同じです。
 ちなみに LOCATE ( ) はカーソル位置を指定するコマンドなので、 印刷やファイルへ出力に対しては無効です。
◇例1.
6000 LPRINT TAB(A); A$(N)
 というように行頭にTAB( )がある場合は
6000 LPRINT SPACE$(A-1); A$(N)
透明スペーサー
◇例2.
6000 LPRINT TAB(A); A$(N); TAB(30);: LPRINT USING "###,###,###";A#
 というように行の中間にもTAB( )がある場合は
6000 Q$=SPACE$(30-1) : MID$(Q$,A,LEN(A$))=A$(N)
6010 LPRINT Q$
;: LPRINT USING "###,###,###";A#
◇例3.
 または、TAB(A)の値が一定の場合なら
                            ↓=TAB(A)の値       ↓=TAB(30)
6000 LPRINT USING "         &                 & ###,###,###";A$(N) ;A#
 最初の & は TAB(A) の値の位置に置き、
 &             &の間隔は、予想されるA$(N)の長さ(=LEN(A$(N)))よりも少し余裕のある長さにしておきます。
◇例4.
6000 LPRINT TAB(A); A$(N); TAB(B);: LPRINT USING "###,###,###";A#
 前記の「例2.」のようなケース(=中間にもTAB( ))が多数ある場合は、
6000 T1=A : T2=B : T$=A$(N) : T2#=A# : GOSUB *TAB2_SUB
6900 *TAB2_SUB
6910 Q$=SPACE$(B-1)+"###,###,###" : MID$(Q$,T1,LEN(A$))=T$
6920 IF P$="y" THEN LPRINT USING Q$;A#
6930 IF DISK_OUT$="y" THEN PRINT #2, USING Q$;A#

Top  99Menu


◇ TAB( )その2.



PRINT TAB(x) A$ TAB(y) B$ TAB(z) C$
 このようなPRINT文の場合なら 以下のようにLOCATE ( )を使えば、わりと簡単に書き換えが出来ます。
LOCATE (x) : PRINT A$; : LOCATE (y): PRINT B$;: LOCATE (z): PRINT C$
 しかし LPRINT や PRINT #?, の場合は、LOCATE ( )を使えないため、かなり面倒です。
LPRINT TAB(x) A$
というように、先頭だけにTAB(x)が入っているだけなら
LPRINT SPACE$(x-1); A$
このように簡単に書き換えができます。しかし最初に書いた例文のような場合は、
LPRINT SPACE$(x-1); A$; SPACE$(y-(x-1+LEN(A$))); B$; SPACE$(???); C$
と、たいへんに面倒になってしまいます。こういう行が沢山あるので、とても、、、です。
 あるいは LPRINT USING を使うと簡単そうですが、TAB( )の値が配列変数ですと、1行1行を変えて作らなければならず、やはり大変すぎます。
透明スペーサー
 こういった場合に、ユーザー定義のDEFFN(命令)/ FN(関数)を使うと、大変便利です。
 説明を読んでも私にはまっくた理解も出来ず、イメージも湧きませんでした。私がTAB( )の変更で悩んだときに、
200 DEFFNS(m,n,o)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$+SPACE$(o-1-(n-1)-Len(S2$))+S3$ ' TAB( )が3つの場合→ DEFFNS(m,n,o)のパラメーターが3つ
210 DEFFNT(m,n)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$ ' TAB( )が3つの場合→ DEFFNT(m,n) のパラメーターが2つ
 このように関数名の名前を変えて、複数定義しておくことも可能です。
 たいへんに便利な、ユーザ定義の命令と関数です。
 但し、PRINT USING を、この関数そのものに組み込むことが出来るかどうか不明です。これが最大の悩みです。どなたかご指導頂ければ幸いです。

◇実例1.
200 FOR I=1 TO 30    '   DOS-N88BASICとN88互換BASIC
220     LPRINT TAB(x(I)) A TAB(y(I)) B$(I) TAB(z(I)) C$(I)
230 NEXT I
 上記のような場合は、99Basicでは
110 DEFFNS(m,n,o)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$+SPACE$(o-1-(n-1)-Len(S2$))+S3$
200 FOR I=1 TO 3  ' 30
210   S1$=STR$(A) : S2$=B$(I) : S3$=C$(I)
220   PRINT FNS(x(I),y(I),z(I))
230 NEXT I

◇実例2.
200 FOR I=1 TO 30    '   DOS-N88BASICとN88互換BASIC
220     LPRINT TAB(x(I)) A TAB(y(I)) B$(I) ;: LPRINT USING " ########, "; N#(I)
230 NEXT I
 上記のような場合は、99Basicでは
110 DEFFNS(m,n)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$
200 FOR I=1 TO 30
210   S1$=STR$(A) : S2$=B$(I)
220   LPRINT FNS(x(I),y(I),z(I)) ;
225   LPRINT USING " ########, "; N#(I)
230 NEXT I

◇実例3.
6010 PRINT     TAB(A); A$(N); TAB(B); B$(N); TAB(C); C$(N)   '  TAB( )が3つ
6110 PRINT #2, TAB(A); A$(N); TAB(B); B$(N); TAB(C); C$(N)   '  TAB( )が3つ
6150 LPRINT    TAB(A); A$(N); TAB(B); B$(N); TAB(C); C$(N)   '  TAB( )が3つ
6210 PRINT     TAB(D); D$(N); TAB(E); E$(N)   '  TAB( )が2つ
6220 PRINT #2, TAB(D); D$(N); TAB(E); E$(N)   '  TAB( )が2つ
6250 LPRINT    TAB(D); D$(N); TAB(E); E$(N)   '  TAB( )が2つ
 上記のような場合は、99Basicでは
200 DEFFNS(m,n,o)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$+SPACE$(o-1-(n-1)-Len(S2$))+S3$
6100 S1$=A$(N) : S2$=B$(N) : S3$=C$(N)   '  TAB( )が3つ
6110 PRINT #2, FNS(A,B,C)
6150 LPRINT    FNS(A,B,C)

6200 S1$=D$(N) : S2$=E$(N) : S3$=""      '  TAB( )が2つ
6210 PRINT     FNS(D,E,70)               '  3番目のパラメーター70はダミー。大きな数値を
6220 PRINT #2, FNS(D,E,70)
6250 LPRINT    FNS(D,E,70)

◇実例4.
 この実例4.は、コピー・貼り付けをして保存すれば、プログラムとして正常に動くものです。
100 COLOR 6: PRINT "------- 以下は TAB(  ) プログラム---------": COLOR 7
150 PRINT "   PRINT    TAB(A); A$(N); TAB(B); B$(N); TAB(C); C$(N)   '  TAB( )が3つ"
160 PRINT "   PRINT    TAB(D); D$(N); TAB(E); E$(N)          '  TAB( )が2つ−1"
170 PRINT "   PRINT    TAB(D); D$(N); TAB(E); E$(N); C$(N)   '  TAB( )が2つ−2"
180 PRINT
200 DEFFNS(m,n,o)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$+SPACE$(o-1-(n-1)-Len(S2$))+S3$
300 FOR I=0 TO 6: PRINT "1234567890"; : NEXT : PRINT  '  TAB位置チェック用インジケーター
500 n=1: a=20: b=40: c=60: d=30: e=50                 '  ここから2行はダミーDATA
510 A$(N)="AAAAA": B$(N)="BBBBBBBBBBBBB": C$(N)="CCCCCCCCCCCCCCC": D$(N)="ddddddddddddd": E$(N)="eeeeeeee"
590 '
600 COLOR 6: PRINT "------- 以下は LOCATE(  ) で表示---------": COLOR 7
610 LOCATE(A-1): PRINT A$(N);: LOCATE(B-1): PRINT B$(N);: LOCATE(C-1):  PRINT C$(N)   '  TAB( )が3つ
630 LOCATE(D-1): PRINT D$(N);: LOCATE(E-1): PRINT E$(N)         '  TAB( )が2つ−1
640 LOCATE(D-1): PRINT D$(N);: LOCATE(E-1): PRINT E$(N); C$(N)  '  TAB( )が2つ−2
700 COLOR 5: PRINT "------- 以下は FNS(A,B,C) FNS(D,E,?)で表示---------": COLOR 7
710 S1$=A$(N) : S2$=B$(N) : S3$=C$(N)        '  TAB( )が3つ
720                 PRINT     FNS(A,B,C)
730 IF P$="y" THEN LPRINT     FNS(A,B,C)
740 IF D$="y" THEN  PRINT #2, FNS(A,B,C)
800 S1$=D$(N) : S2$=E$(N) : S3$=""           '  TAB( )が2つ−1
810                 PRINT     FNS(D,E,80)               '  3番目のパラメーター80はダミー。大きな数値を
820 IF P$="y" THEN LPRINT     FNS(D,E,80)
830 IF D$="y" THEN  PRINT #2, FNS(D,E,80)
900 S1$=D$(N) : S2$=E$(N)+C$(N) : S3$=""     '  TAB( )が2つ−2
910                 PRINT     FNS(D,E,80)               '  3番目のパラメーター80はダミー。大きな数値を
920 IF P$="y" THEN LPRINT     FNS(D,E,80)
930 IF D$="y" THEN  PRINT #2, FNS(D,E,80)
 TAB( )が2つの場合は、TAB(3)の部分(o)を=80くらいの大きな数値ダミーを(画面表示の関係で80以下)。
 それに続く不要なS3$を=""とすれば、同じDEFFNS( )とFNS( )がそのまま使えます。
 少し慣れれば大変に便利です(2004/ 7/09)。

◇実例5.
 この実例5.は、コピー・貼り付けをして保存すれば、プログラムとして正常に動くものです。
 実例4との違いは、2番目の「TAB(E); E$(N);」の後にも「 PRINT USING ” ##########, ”; N#(I)」が続くことです。
 910行の実例4の応用では、N#(I)の表示位置が狂います。
100 COLOR 6: PRINT "------- 以下は TAB(  ) プログラム---------": COLOR 7
160 PRINT "   PRINT    TAB(D); D$(N); TAB(E); E$(N);:  PRINT USING ” ##########, ”; N#(I)   '  TAB( )が2つ"
170 PRINT
200 DEFFNS(m,n,o)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$+SPACE$(o-1-(n-1)-Len(S2$))+S3$
210 DEFFNT(m,n)=SPACE$(m-1)+S1$+SPACE$((n-1)-(m-1)-Len(S1$))+S2$  '  DEFFNT(m,n)のパラメーターが2つ
300 FOR I=0 TO 6: PRINT "1234567890"; : NEXT : PRINT  '  TAB位置チェック用インジケーター
500 n=1: a=20: b=40: c=60: d=30: e=50: N#(I)=1234567              '  ここから2行はダミーDATA
510 A$(N)="AAAAA": B$(N)="BBBBBBBBBBBBB": C$(N)="CCCCCCCCCCCCCCC": D$(N)="ddddddddddddd": E$(N)="eeeeeeee"
590 '
600 COLOR 6: PRINT "------- 以下は LOCATE(  ) で表示---------": COLOR 7
630 LOCATE(D-1): PRINT D$(N);: LOCATE(E-1): PRINT E$(N);
640  PRINT USING " #########, "; N#(I)
700 COLOR 5: PRINT "------- 以下は  FNS(D,E)で表示---------": COLOR 7
800 S1$=D$(N) : S2$=E$(N)
810                 PRINT     FNT(D,E);:  PRINT     USING "##########, "; N#(I)
820 IF P$="y" THEN LPRINT     FNT(D,E);: LPRINT     USING "##########, "; N#(I)
830 IF D$="y" THEN  PRINT #2, FNT(D,E);:  PRINT #2, USING "##########, "; N#(I)
890 COLOR 4: PRINT "------- 以下は  FNT(D,E,70)で表示------ 実例4の応用でN#(I)の表示位置が狂う": COLOR 7
900 S3$=""
910                 PRINT     FNS(D,E,70);:  PRINT     USING "##########, "; N#(I)

◇実例6.
 この実例6.は、コピー・貼り付けをして保存すれば、プログラムとして正常に動くものです。
80 DEFFNS(m,n)=S1$+SPACE$(m-Len(S1$)-Len("### "))+S2$+SPACE$(n-m-Len(S2$)+1)+S3$
90 DEFFNT(m,n)=SPACE$(m)+S1$+SPACE$(n-m-Len(S1$)+1)+S2$  '  DEFFNT(m,n)のパラメーターが2つ
900 TBX=10: W=1: D$(W)="山田★郎": V$(1,W)="969-3131": V$(2,W)="福島県耶麻郡猪苗代町"
910 V$(3,W)="字大統領123": N2$(W)="": N3$(W)="": V$(4,W)="0242-62-0**0"
920 '
1000 FOR I=0 TO 6: PRINT "1234567890"; : NEXT : PRINT  '  TAB位置チェック用インジケーター
1010 ' PRINT D$(W) TAB(30-TBX) "〒" V$(1,W) TAB(38-TBX) V$(2,W) "  " V$(3,W)
1020 ' PRINT TAB(6) N2$(W) " ・ " N3$(W) TAB(38) "TEL." V$(4,W):' LPRINT G$;G$
1100 COLOR 2: PRINT "------- 以下は LOCATE(  ) で表示---------": COLOR 7
1110 PRINT USING "### ";W ;
1120 PRINT D$(W);: LOCATE(28-TBX)
1130 PRINT "〒"; V$(1,W);: LOCATE(39-TBX): PRINT V$(2,W); "  "; V$(3,W)
1140 LOCATE(6): PRINT N2$(W); " ・ "; N3$(W);: LOCATE(39): PRINT "TEL."; V$(4,W): PRINT G$; G$
1200 COLOR 4: PRINT "------- 以下は SPACE$(  ) で表示---------": COLOR 7
1210 PRINT USING "### ";W ;
1220 PRINT D$(W); SPACE$((28-TBX)-LEN("### "+D$(W))); "〒"; V$(1,W);
1230 PRINT SPACE$(39-TBX -(28-TBX)-LEN("〒"+V$(1,W))); V$(2,W); "  "; V$(3,W)
1240 PRINT SPACE$(6); N2$(W); " ・ "; N3$(W); SPACE$(38 -LEN(SPACE$(6-1)+N2$(W)+" ・ "+N3$(W))) ; "TEL."; V$(4,W)
1300 COLOR 5: PRINT "------- 以下は FNS(  )で表示---------": COLOR 7
1310 S1$=D$(W): S2$="〒"+V$(1,W): S3$=V$(2,W)+"  "+V$(3,W)
1340  PRINT USING "### ";W ;:  PRINT     FNS(28-TBX,38-TBX)
1350 COLOR 6: PRINT "------- 以下は FNT(  )で表示---------": COLOR 7
1360 S1$= N2$(W)+" ・ "+N3$(W) : S2$= "TEL."+V$(4,W)
1370  PRINT     FNT(6,38)
1500 COLOR 5: PRINT " DEFFNS(m,n)=S1$+SPACE$(m-Len(S1$)-Len(”### ”))+S2$+SPACE$(n-m-Len(S2$)+1)+S3$": COLOR 7
1510 COLOR 6: PRINT " DEFFNT(m,n)=SPACE$(m)+S1$+SPACE$(n-m-Len(S1$)+1)+S2$": COLOR 7

 仮引数とは、
 例えば、◇実例3.の「110 DEFFNS(m,n,o)= 」行なら「m,n,o」を指します。
 これは、プログラムの他の部分で使っている変数名であっても、それとは関係なく、この式の中だけで有効です。もちろん式の中には仮引数ではない変数も使えます。
 ここで定義したユーザ関数は、プログラムの各所で、FN 関数として使用できます。
 FN で実際に関数が使われる時、FN に引数として与えられた値が、仮引数に代入されて式の演算で出た値を FN 関数の値として返します。仮引数と一般の変数が同じであった場合でも、一般の変数の方の値が変化してしまうことはありません。

Top  99Menu


◇ TAB( )その3.

LPRINT TAB(x) A$ TAB(y) B$ TAB(z) C$
PRINT #3, TAB(x) A$ TAB(y) B$ TAB(z) C$
 これはエラーとなります。
 そこでMID$を使う対応策で、しかも簡単な方法を紹介します。
100 X=10:A$="ABC"
110 Y=20:B$="OPQRS"
120 Z=40:C$="123456789"
130 BUF$=SPACE$(70) '1行を70文字とする
140 MID$(BUF$,X)=A$
150 MID$(BUF$,Y)=B$
160 MID$(BUF$,Z)=C$
170  PRINT     BUF$   ' 画面に表示
180 LPRINT     BUF$   ' 印字する
190  PRINT #3, BUF$   ' ディスク出力する

      1234567890123456789012345678901234567890123456789012345678901234567890
BUF$="         ABC       OPQRS               123456789                      "
140 MID$(BUF$,X,LEN(A$))=A$
 上記が正しい書き方で、DOS-N88BASICやN88互換BASICではこのように書く必要があります。
 ところが、99Basicでは以下のように省略形を認めていて、エラーになりません。
140 MID$(BUF$,X)=A$
 理解が出来れば大変に便利なユーザー定義のDEFFN(命令)/ FN(関数)ですが、その理解が大変です。
 それに対して、ここで紹介したMID$( )の活用による方法は簡単です。

Top  99Menu


◇ width

 99Basicの中の説明では、何だか複雑な説明が書かれていますが、
 width 40,20 width 40,25 width 80,20 width 80,25 などはそのまま使えます。
透明スペーサー
 但しDOS-N88BASICとは異なるのが、width 40,です。これはフルサイズ画面を使い、結果的に文字が倍近く大きく表示されるのではなく、画面の横サイズがwidth 80,の半分に縮小されるだけです。
透明スペーサー
 反対にたいへんに便利なのは、今までに1画面に収まりきらず、上下で表示の半分が隠れてしまうような場合には、width 80,38などと指定することが可能です。N88互換BASICでは出来ますが、DOS-N88BASICでは出来ませんでした。
 同じく80マスの横に収まらない場合は、width 120,25というように横に画面を広げることも出来ます。もちろんwidth 120,40とすれば、上下・左右とも広げた大画面が得られます。
 画面表示の仕方にもよりますが、実際に有効な表示行数は40〜43くらいと思います。例えば WIDTH 80,40 または WIDTH 80,43 ということです。

Top  99Menu


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

▼頭合わせ(左合わせ)の例▼
        磐梯ひじかたスキースクール
春〜秋 〒203-0003   東京都東久留米市金山町 2-6-14
              Tel & Fax. 042-475-****
冬    〒969-3102   福島県耶麻郡猪苗代町字****5
                Tel & Fax. 0242-62-****

透明スペーサー
 このような▼頭合わせ(左合わせ)の例▼は、一般的にも多く使われるもので、99Basicでも簡単に印刷や画面表示、あるいはファイル出力することが出来ます。
 例えば、 TAB( ) TAB( ) その2 LOCATE (TABに代わる)DEFFN / FN(命令) などが用意されています。
 あるいは、次のようにTAB( )の代わりにSPACE$( )を使うことも出来ます。
1270 PRINT #3,    TAB(17); Y0$
1270 PRINT #3, SPACE$(17); Y0$
透明スペーサー

 ところが次のような▼尻合わせ(右合わせ)の例▼では、少しだけ面倒です。ワープロやWEBサイトのような、一発で右寄せ、尻位置合わせをするコマンドや関数は99Basicには用意されていないのです。
▼尻合わせ(右合わせ)の例▼
                         磐梯ひじかたスキースクール
春〜秋 〒203-0003    東京都東久留米市金山町 2-6-14
                     Tel & Fax. 042-475-****
冬    〒969-3102   福島県耶麻郡猪苗代町字****5
                       Tel & Fax. 0242-62-****
 例えば上の例の省略形で紹介すると、次のようになります。
100 A1$="磐梯ひじかたスキースクール": A2$="東京都東久留米市金山町 2-6-14": A3$="Tel & Fax. 042-475-****": 
110 L1=LEN(A1$) : L2=LEN(A2$) :  L3=LEN(A3$) 
120 PRINT TAB(A0 +(L2-L1) )   A1$
130 PRINT TAB(A2)             A2$
140 PRINT TAB(A0 +(L3-L1) )   A3$
  または、 SPACE$( )を使うなら、 #120以下が次のように変わります。
120 PRINT SPACE$(A0 +(L2-L1) )   A1$
130 PRINT SPACE$(A2)             A2$
140 PRINT SPACE$(A0 +(L3-L1) )   A3$
透明スペーサー
 印刷をする場合なら、 PRINT を LPRINT に代えれば良いのです。

Top  99Menu


◇ CONSOLE

書式: CONSOLE [スクロール開始行][,[スクロール範囲][,[ファンクションキー]]]
 スクロール開始行........ 0〜63 の数値
 全てのパラメータを省略することは出来ません。
 第4パラメータはありません。削除して下さい。
例文.1
140 CLEAR: CONSOLE ,,1,1: width 80,25: CLS 2 '' WIN互換ベーシック
 上記は4番目の4パラメータ指定があるためエラーになります。次のように削除して下さい。
140 CLEAR: CONSOLE ,,1: width 80,25: CLS 2 '' 99Basic
透明スペーサー
例文.2
505 CONSOLE 19,24,1: P1$="" '' WIN互換ベーシック
 99Basicでは、Illegal function call( 関数/命令に与える数値/文字列の誤り)エラー。
505 CONSOLE 15,5,1: P1$="" '' 99Basic
 このように直したところOK。
 ということは、99Basicでの第2パラメーター([スクロール範囲])は、本当スクロール出来る範囲(行数)?であって、N88互換BASICやDOS-N88BASICではスクロール範囲の終わり行? との違いがある?ようです。
注: 2004/ 9/30 追記
透明スペーサー
 CONSOLE と LOCATE の使い方について、一部がよく分かりませんでした。本日いろいろテストをして以下が分かり、だいぶクリアーになりました。
透明スペーサー

width 80,20width 80,25

固定表示スクロール固定表示スクロール
CONSOLE 5,10 1〜 5、16〜20の計10行 6〜15の計10行 1〜 5、16〜25の計15行 6〜15の計10行
CONSOLE 10, 5 1〜10、16〜20の計15行11〜15の計 5行 1〜10、16〜25の計15行11〜15の計 5行
CONSOLE 10,10 1〜10の計10行11〜20の計10行 1〜10、21〜25の計15行11〜20の計10行
CONSOLE 19,10,0 1〜19の計19行20の計 1行 1〜19の計19行20〜25の計 6行
CONSOLE 19,10,1エラー 20行目はファンクションキー表示で使用済み。
スクロール可能な行が存在しないため。
1〜19の計19行20〜24の計 5行
CONSOLE 24,10,0エラー 画面は20行表示。それ以降の表示命令のため。 1〜24の計24行25の計 1行
CONSOLE 24,10,1エラー 画面は20行表示。それ以降の表示命令のため。エラー 25行目はファンクションキー表示で使用
済み。スクロール可能な行が存在しないため。
注:
 上記の CONSOLE 19,10,0 は、20行から10行すなわち30行までのスクロールを命じています。
 width 80,20の場合は、21行〜30行は存在しませんが無視され、エラーにはなりません。
 width 80,25の場合は、26行〜30行は存在しませんが無視され、エラーにはなりません。
 width 80,20では20行の1行が、width 80,25では20行〜25行の6行がスクロールの範囲として実在するために、エラーにはならず以降を無視するだけで済むのです。

 表のすぐ上に書いた「例文.2」の「 CONSOLE 19,24」でのエラーについては、原因は以下のように想像します。
 たぶん画面の広さ設定がwidth 80,20 になっていたのではないかと思います。画面には21〜25行は存在しないのに、その部分だけをスクロール可能に命令してしまたから。
 上記の表のエラーと同じ理由です。

Top  99Menu


◇ LINE

 書式: LINE [(X,Y)]-(X,Y)[,色][,<B‖BF>]
 グラフィック画面に線や四角を描画します。
 書式: LINE [(X,Y)]-(X,Y)[,色][,<B‖BF>]
◇サンプル例
100 LINE (40, 0)-(560, 390), 0, BF 110 LINE (80, 80)-(500, 80), 7: LINE (100, 20)-(100, 180), 7 120 LINE (500, 20)-(500, 180), 7 500 LINE (XB, YC)-(XB, YB), CL: LINE -(XA, YB - 10), CL: LINE -(XA, YB - 60), CL 200 CLS 2: X=2:Y=3 210 LINE(627, 15)-(541, 465),5 ,BF: LINE(538, 15)-(458, 465),5 ,BF: LINE(180, 15)-(95, 465),5 ,BF 220 LINE(627-X,15+Y)-(541+X,465-Y),0 ,BF: LINE(538-X,15+Y)-(458+X,465-Y),0 ,BF: LINE(180-X,15+Y)-(95+X,465-Y),0 ,BF
1540 LINE (D+X , E+Y )-(F-X , G-Y ) ,6,BF ,0
 99Basicでは第3パラメーターは存在しないので、削除しないとエラーになります。
透明スペーサー
 99BasicとDOS-N88BASICでは、文字などはテキスト画面に描かれ、LINEはグラフィック画面に描かれます。だからテキスト画面に新しい表示がされても重なった部分のLINEが消えることはありません。
 一方のN88互換BASICではテキスト画面を持ちません。どちらもグラフィック画面に描かれます。だから新たに文字などが描がかれると、その重なった部分のLINEが消えるてしまいます。
 これに関連して、99BasicとDOS-N88BASICでは、CLSはテキスト画面だけを消去し、CLS 2はグラフィック画面だけを消去します。
 N88互換BASICでは、CLSもCLS 2画面消去として、まったく同じ働きをします。
 CLSについては、すぐ次で詳しく説明します。

Top  99Menu


◇ CLS ( ROLL )

 面面を消去します。
 CLS はテキスト画面を消去。(正確には、現在作業中の画面だそうです)
   これは、99Basic、DOS-N88BASICも同じです。テキスト画面を持たないN88互換BASICでも、確かCLS 2と同じ働きをして、同様に考えて良かったはず記憶しています。
 CLS 1 はテキスト画面とキャラクター画面を消去。
   私は使ったことがないので分かりません。
 CLS 2 はグラフィック画面とスプライト画面を消去。
   私にはスプライト画面が何なのか分かりませんが、グラフィック画面の消去で使う限りは、99Basic、DOS-N88BASIC、N88互換BASICでも同じです。
 CLS 3 は全ての画面を消去。
   私は使ったことがないので分かりません。
透明スペーサー
 ちなみにDOS-N88BASICでは、ROLL というコマンドがあります。
 ROLL 199なら、グラフィック画面を199上方向に約半分スクロールさせる命令で、結果的にはCLS 2 と同じ機能をします。N88互換BASICでも同様です。
  99Basicでは、「文法どおりに書かれていない」のエラーになるので、CLS 2 に書き換えが必要になります。
 詳しくは、ROLL 199を参照ください。
透明スペーサー
 N88互換BASICでは、CLSもCLS 2画面消去として、まったく同じ働きをします。
◇サンプル例
100 LINE (40, 0)-(560, 390), 0, BF 110 LINE (80, 80)-(500, 80), 7: LINE (100, 20)-(100, 180), 7 120 LINE (500, 20)-(500, 180), 7
 例えば、上記のようにグラフィック画面にラインを引いた場合、  CLS では、テキスト画面だけを消すので、ラインは描かれたままです。99BasicもDOS-N88BASICも同じです。  CLS 2 では、グラフィック画面に描かれたラインだけ消されて、テキスト画面の文字は残ります。99BasicもDOS-N88BASICも同じです。  CLS 3 では、全ての画面を消去するとなっています。DOS-N88BASICにもあった命令なのかも知れませんが、私は知らなかったため、「 CLS : CLS 2 」と併記して使っていました。
透明スペーサー

Top  99Menu


◇ CSRLIN → YLOC
 ◇ POS( ) → XLOC

 N88互換BASICとDOS-N88BASICでは、CSRLINは現在のカーソル行位置を取得する関数です。POS( )は桁位置を取得します。
 例えばカウント20毎にカウンターに飛ばし、その後で元のカーソル位置に戻すなどのときに使います。
 99Basicでは、XLOC 、 YLOCという関数が設けられています。何か難しい説明が書かれていますが、私のプログラム群ではそのままPOS( )→XLOCに、CSRLIN→YLOCに置き換えて正しく機能しています。
サンプル1
2060 FOR I=B2 TO B3
2065    IF I MOD 5=1 THEN PS=POS(1): CS=CSRLIN: LOCATE 40,0: COLOR 6:
                     PRINT YY$; "年度 "; DR$ ;: PRINT USING "#,###/#,###";I;B3: COLOR 7: LOCATE PS,CS  ''  WIN互換ベーシック
2065    IF I MOD 5=1 THEN PS=XLOC  : CS=YLOC: LOCATE 40,0: COLOR 6:
                     PRINT YY$; "年度 "; DR$ ;: PRINT USING "#,###/#,###";I;B3: COLOR 7: LOCATE PS,CS  ''  99Basic

サンプル2
5425      PS=POS(1): CS=CSRLIN: GOSUB 3000:  LOCATE PS,CS        '  タイトル 項目の表示  ''  WIN互換ベーシック
5425      PS=XLOC  : CS=YLOC: GOSUB 3000:  LOCATE PS,CS        '  タイトル 項目の表示  ''  99Basic
 サンプル1は、伝票5枚毎に現在のカーソル行位置を覚えておき(CS=CSRLIN)、一度画面上段の右の方(LOCATE 40,0)にカウンターの数字を書き換えろ、という命令です。
サンプル2は、同様に「タイトル 項目の表示」。
 しかしDOS-N88BASICとN88互換BASICでは有効ですが、99BasicではYLOCが使えます。
用意されていない。注釈行とするか、または 工夫してLOCATE( )文に置き換える。
LOCATE
 当然、カーソルの桁位置を取得する関数POS( )も、99BasicではXLOCが使えます。
にはありません。
  YLOC (システム変数)
テキスト画面やキャラクタ画面の現在のカーソル位置が入っているシステム変数です。  書式: YLOC 代入はできません。
 返される値が、テキスト画面のカーソル位置のY座標なのか、キャラクタ画面のY座標なのか、あるいは、グラフィック画面のものなのかは、SET PAGE 命令によって指定された現在の画面によって変わります。スプライト画面が選択されている場合は、必ず 0 が返ります。
参照:XLOC(システム変数) LOCATE(命令)
 私の場合は、テキスト画面のカーソルの行位置を取得するCSRLINについては、YLOCがそのまま使えました。
例文
2050 IF I MOD 20=1 THEN CS=CSRLIN: COLOR 5: LOCATE 42, 0: PRINT DR$;: PRINT USING "#,###/#,### ";I ;B3: COLOR 7: LOCATE 0,CS ' N88互換BASIC、DOS-N88BASIC
2050 IF I MOD 20=1 THEN CS=YLOC: COLOR 5: LOCATE 42, 0: PRINT DR$;: PRINT USING "#,###/#,### ";I ;B3: COLOR 7: LOCATE 0,CS ' 99Basic
5025 ' PS=POS(1): CS=CSRLIN: LOCATE 50,0: COLOR 6 5027 ' PRINT USING "& &年度 & & #,###/#,###";YY$ ,DR$ ; I;B3: COLOR 7: LOCATE PS ,CS 5030 PS=XLOC: CS=YLOC: LOCATE 50,0: COLOR 6 5032 PRINT USING "& &年度 & & #,###/#,###";YY$ ,DR$ ; I;B3: COLOR 7: LOCATE PS ,CS
  YLOC (システム変数)
テキスト画面やキャラクタ画面の現在のカーソル位置が入っているシステム変数です。  書式: YLOC
代入はできません。
 返される値が、テキスト画面のカーソル位置のY座標なのか、キャラクタ画面のY座標なのか、あるいは、グラフィック画面のものなのかは、SET PAGE 命令によって指定された現在の画面によって変わります。スプライト画面が選択されている場合は、必ず 0 が返ります。
参照:XLOC(システム変数) LOCATE(命令)

Top  99Menu


◇ LOCATE

 書式: LOCATE [@画面番号,]X,Y[,カーソル]
   画面番号........0〜3 の数値
   X、Y..........0〜画面サイズより小さい数値
   カーソル........0 か 1。
 文字を表示する位置を指定します。あるいはカーソル表示を有無を設定します。
 PRINT 命令や PRINT USING 命令、WRITE 命令などで文字を表示する位置を指定します。
 これらの命令で文字が表示できるのは、テキスト画面だけではありません。キャラクタ画面、グラフィック画面にも PRINT 命令や PRINT USING 命令、WRITE 命令(注:)などで文字が表示できます。
注:
 WRITE 命令とは、「画面やシーケンシャルファイルに数字や文字を表示します」となっています。
 このLOCATE が有効なのは、WRITE 命令の画面表示だけであって、シーケンシャルファイル出力では無効ではないかと想像します。但しテストはしていません。

 なおXは桁位置を、Yは行位置を指示します。
LOCATE 10, 5 の場合は、6行目の10桁目にカーソルを置け、という命令です。(行については、画面最上端を0行と数えるので、Y=5 とすれば+1の6行目になります)
* X、Yを()で囲った場合、
LOCATE ( X )     桁位置Xだけを囲うことはOK
LOCATE ( X, Y )   桁位置X、行位置Yの両方を囲うとエラー
 99Basicではエラーになりますが、DOS-N88BASICとN88互換BASICでは、どうだったかは不明です。
透明スペーサー

 カーソルの位置を決めます。画面表示には有効ですが、LPRINT ゃ PRINT # に対しては意味を持ちません。
 私は以下のように、PRINT TAB( )をそのまま置き換え使うことが少なくありません。
1630    PRINT TAB(B+17);: PRINT USING " ------ (##)";J;  ''  WIN互換ベーシック
1630    LOCATE(B+17) : PRINT USING " ------ (##)";J;  ''  99Basic

7150    PRINT TAB(14*B_SW);: PRINT USING "###.&       &";GX; F$(GX);  ''  WIN互換ベーシック
7155    LOCATE   (14*B_SW) : PRINT USING "###.&       &";GX; F$(GX);  ''  99Basic

110     PRINT TAB(x); A$; TAB(y); B$; TAB(z); C$  ''  WIN互換ベーシック
110     LOCATE (x) : PRINT A$; : LOCATE(y) : PRINT B$; :  LOCATE (z): PRINT C$  ''  99Basic
 ちなみにその後にも PRINT が続く場合、 A$;  B$; の ; が省かれると、
    A$A$A$A$
            B$B$B$
                   C$C$
 というように、行が別れて表示されてしまいます。
    A$A$A$A$    B$B$B$    C$C$
 このように、同一行に表示したい場合は、 A$;  B$; の ; が必要です。

 または、以下のようにLOCATE(*,n)  ,n の挿入が必要になります。(この場合は ; は不要です)
110     LOCATE x,n : PRINT A$ : LOCATE y,n : PRINT B$ :  LOCATE z,n: PRINT C$  ''  99Basic

 もし n の行位置が不明の場合は、
100      n=YLOC              ''  99Basic
110     LOCATE x,n : PRINT A$ : LOCATE y,n : PRINT B$ :  LOCATE z,n : PRINT C$  ''  99Basic
 DOS-N88BASICやN88互換BASICでは、POS(1)、CSRLIN関数で画面上の桁、行位置を得ることが出来ますが、99BasicではYLOC、XLOCというシステム変数が用意されています。まったく同じものと考えて良いように思います。

Top  99Menu


◇ FILES (命令・関数)

 ディレクトリの一覧を表示します。あるいは、ディレクトリエントリの個数を返します。
 命令書式: FILES [ファイルスペック][ , W][ , P]
 関数書式: FILES(ファイルスペック)
透明スペーサー
 ファイルスペック.....ディレクトリ名や、ワイルドカードなどの文字列
 W オプションが付くと、ロングファイルネームのみを、横に並べて表示します。横に表示される数は、ファイル名の長さによって2〜8以上の間で自動的に調整されます。
 P オプションは、1 画面ずつスクロールを停止して、キー入力を待ちます。これはファイル数が多数で1 画面に収まらないような場合に、1 画面に分割して表示するための方法です。

◇99Basicでの実例
FILES   OKです。
FILES ,W  「文法どおりに記述されていない」エラーです。
FILES "*.*" ,W  OKです。
FILES ,P  「文法どおりに記述されていない」エラーです。
FILES "*.*" ,P  OKです。
FILES *.TXT  「必要なパラメーターの指定が無い」エラーです。
FILES "*.TXT"  OKです。
FILES "?B*.*"  OKです。
透明スペーサー
? * をワイルドカードと言いますが、99Basic、DOS-N88BASICでは使えますが、N88互換BASICでは使えません。
 ?(半角の文字です)は、その位置にある文字は何でも良い、という意味です。
 *(半角の文字です)は、その位置からある文字、または文字列は何でも良い、という意味です。


 例えば、FILES "?B*.*" の場合、
 最初の1文字は何でも良く、2文字目は必ず B であり、3文字目以降と拡張子(ピリオドの後)は何でも良い。この条件に該当するファイル名のものを表示せよ、という命令です。
 その結果、以下のようなファイルが表示されます。
   ABCD.TXT、1BCD.XLS、アB34.JTD、BB学校名一覧.123などなど。
 その結果、以下のようなファイルは表示されません。
   BACD.TXT、B1CD.XLS、Bア34.JTD、B2B学校名一覧.123などなど。
 このケースはDOS-N88BASICとまったく同じです。

Top  99Menu


◇ ON MOUSE GOSUB

 マウスのボタンが操作されると自動実行される、マウス割込ルーチンを設定します。
100 ON MOUSE GOSUB *ON_MOUSE
110 GOSUB ON
 ON MOUSE GOSUB 命令で割込ルーチンを指定しただけでは割込が開始されません。この110行のように、その後で、割込を ON にしておく必要があります。99Basic、DOS-N88BASIC、N88互換BASICの全て同じです。
 これはその他、以下のような場合も同様です。
280 ON KEY GOSUB ,,,,,, 16000,15000
260 KEY (7) ON: KEY (8) ON
透明スペーサー
300 ON MOUSE GOSUB 2000: MOUSE ON
 300行のように同一行に書くこともOKです。

◇INPUT Q$ では割り込まず、 INKEY$では割り込みます。

 何故かINPUT Q$ の最中にはマウスを動かしても、99Basic、N88互換BASICでは割り込みが発生しません。( GOSUB *ON_MOUSE、 GOSUB 2000などが実行されないという意味です。)INPUT Q$ が終わった瞬間に、割り込みが発生します。(但し、N88互換BASICではテストをしていないので不明です。)
 DOS-N88BASICでは、実行出来ていたはずです。
 いろいろテストの結果、INPUT Q$ を辞めて INKEY$に代えたところ、割り込みが発生すること分かりました。
1000 INPUT Q$
 この状態では、割り込みを発生しない、という意味です。
1000 Q$=INKEY$ : IF Q$="" THEN GOTO 1000
 この状態では、割り込みが有効になります。


◇ON MOUSE / GET MOUSE で、マウス位置へカーソル移動するプログラム

 書式: GET MOUSE 機能,[変数1][,[変数2][,変数3]]
    マウスの状態を取得します。
GET MOUSE 1, , X, Y
         (X, Yは、別の変数名に変更可です。)
 上記のように、機能 1 を選ぶと、CRT画面上の絶対座標値をX, Yに得ることが出来ます。但しこれはテキスト画面で LOCATE 1 , 0 (画面の左上・隅)に相当する場所では、X=75 , Y=122くらいの大きな数字になってしまいます。
 このまま LOCATE X, Yとしたのでは、とんでもない位置カーソルが運ばれるか、「関数/命令に与えられる数値/文字列の誤り」というエラーになります。
 以下のプログラムはその辺を調整し、まだ正確なものではありませんが、大体の近似値にカーソルの移動が出来ます。
100 ON MOUSE GOSUB 200:  MOUSE ON
105 width 80,35: CLS
110 FOR I=1 TO 7:  FOR N=0 TO 9: PRINT USING "#";N;:  NEXT:  NEXT: PRINT
120 FOR N=1 TO 20: PRINT N :  NEXT
125 FOR I=1 TO 7:  FOR N=0 TO 9: PRINT USING "#";N;:  NEXT:  NEXT: PRINT
130    PRINT " マウスを移動させ、左クリックするとカーソルが移動します。何度でも。"
150    PRINT "   終了は、ENTERキーなどを押して下さい。"
160 Q$=INKEY$: IF Q$="" THEN GOTO 160
170 PRINT "end ": END
200 '
220    GET MOUSE 1, , X, Y: TAB=INT((X-60)/8.3): L_INE=INT((Y-120)/16+0.1)
230    LOCATE TAB, L_INE
250    PRINT "LOCATE" TAB "," L_INE
260 RETURN

◇ カーソル移動先のテキスト画面データーを INPUT Q$に納める

 上記サンプルのように、ただカーソルだけ移動しても意味がありません。次のように、主に200行以降を少し代えると、その行のテキストデーターのコピーが出来るようになります。
100 ON MOUSE GOSUB 200:  MOUSE ON
105 width 80,35: CLS: PRINT
110 A$(1)="123456": A$(2)="ABCDEF": A$(3)="hijklm": A$(4)="いろは": A$(5)="789": A$(6)="東京都": A$(7)="アジア"
120 FOR N=1 TO 7: FOR M=1 TO 20: PRINT  A$(N);: NEXT: PRINT: NEXT: PRINT
130 PRINT " マウスを移動させ左クリックしてから、ENTERキーを"
140 PRINT "   → その行のカーソル以降がコピー・入力されます。 何度でも。"
150    PRINT "    終了は、9 を": PRINT
160    Q$=INKEY$: IF Q$="" THEN GOTO 160
170 IF Q$="9" THEN PRINT "end ": END: ELSE GOTO 160
200 '
210    PS=XLOC  : CS=YLOC
220    GET MOUSE 1, , X, Y: TAB=INT((X-60)/8.3): L_INE=INT((Y-120)/16+0.1)
230    LOCATE TAB, L_INE : INPUT Q$
240    LOCATE PS,CS: COLOR 6: PRINT "  新しいQ$= ";: COLOR 5: PRINT Q$: COLOR 7
260 RETURN

◇ 実際のプログラムでの利用例

 あるファイル名を入力するプログラムです。しかし、ファイル名がおぼろげな場合、またはファイル名が長くて面倒な場合、または入力間違いをしそうな場合に使います。
 99BasicやDOS-N88BASICでは、表示されたテキストデーターの上にカーソルを移動して、Enterキーを押せば INPUT Q$に入力されるのです。
 (N88互換BASICでは、特殊なサブルーチンを自作しない限りは、不可能です。 詳しくはN88互換BASIC便利なINPUT活用のサブルーチンを参照。)
透明スペーサー
 このようなプログラムを組まずに、直接カーソルキーを移動しても同じ結果を得ることは出来ますが、その移動距離が大きいと面倒だし、時間もかかります。ですから、こういうケースが度々あるならプログラムに組み利用すると便利です。
透明スペーサー
 その他のケースでは、顧客管理や会計伝票の入力時に、一部のみ訂正して再利用したいときには便利です。この辺りのことについては、N88互換BASICINPUT Q$で、詳しく説明してあります。参照ください。
200 ON MOUSE GOSUB 210:  MOUSE ON

540 COLOR 7  '  g.640
550    FILES "05*.txt",w : FILES "06*.txt",w  '  候補のファイル名を表示
560    COLOR 6: PRINT "  入力ファイル名= "; FILE$;: COLOR 7
570    PRINT "でOKなら 1 を、"
580    PRINT "上記のどれかに変えるならマウスを移動させ、クリックを利用して、入力を "
590    Q$=INKEY$: IF Q$="" THEN GOTO 590
595    '  #200 ON MOUSE GOSUB → INKEY$が絶対条件、INPUT Q$では割り込み非実行
597    '
600 IF Q$="1" OR ASC(Q$)=13 THEN GOTO 700  '   ASC(Q$)=13 ENTERキー
610     F1$=Q$ : PRINT: PRINT , X1$
620     COLOR 6: PRINT , F1$;: COLOR 7: PRINT " で良ければEnter を、"
630     INPUT "  再訂正なら、2 入力を ";Q$
640 IF Q$<>"" THEN 540
650 FILE$=F1$
695  '
700  PRINT   '   g.600

Top  99Menu