手順
- 罫線データの書き出し
- 罫線合成で文字データ表示
- 罫線データの消去
実例
今、サンプルとして、下記のような、簡単な罫線をひくことにしましょう。ちょっと、みづらいかもしれないけど、我慢してください。
上記のソース
文字データはFMT01で、罫線指定データを含む、罫線書き出し制御画面は、KEIDTAというレコード様式名です。表示は、CLPでも、RPGでも可能です。まずは、先にDDSソースを全部出してみましょう。
画面ファイルKEID
これをコピーしても、罫線は出ないでしょう。罫線データのSJISとEBCDICの変換のところで、おかしくなるような、気がします。
0001.00 A R FMT01
0002.00 A S#KBFR 2 O 1 2DSPATR(BL)
0003.00 A 2 2'ABC'
0004.00 A 3 2'DEF'
0005.00 A 4 2'GHI'
0006.00 A*
0007.00 A R KEIDTA
0008.00 A FRCDTA
0009.00 A PUTOVR
0010.00 A S#KBFR 2 O 1 2DSPATR(ND)
0011.00 A 1 5DSPATR(ND)
0012.00 A ' '' -
0013.00 A 」c -
0014.00 A ? -
0015.00 A -
0016.00 A -
0017.00 A -
0018.00 A -
0019.00 A -
0020.00 A -
0021.00 A -
0022.00 A -
0023.00 A -
0024.00 A -
0025.00 A -
0026.00 A -
0027.00 A -
0028.00 A -
0029.00 A -
0030.00 A CF'
0031.00 A*
0032.00 A R KEICLR
0033.00 A FRCDTA
0034.00 A S#KBFR 2 O 1 2DSPATR(BL RI)
|
罫線の基本
さて、ここで、罫線を図式化して、調べて見ましょう。まず、80桁×24行で、1920の文字スペースがあると考えます。罫線なので、ビット操作かた思うかもしれませんが、実は、このように、文字単位に罫線を設定していきます。最大、1920の指定があることになりますよね。なお、このように文字単位なので、この機能では、斜めの線は、絶対にひけません。(斜めの線というのは、直線よりも大変なのです。)
ここでは、3×3の文字以内の部分だけ注目します。下図は、その拡大図です。
|
そして、さらに、垂直と、水平に分解して考えます。
水平と垂直は、1マス単位に上図のように、右辺と上辺だけに限られます。また、=1とは、onのことで、=0はoffのことだと思ってください。 |
|
上図をもう少し分かりやすく、着色してみました。これから、水平、垂直に分解していきます。
|
|
これを、水平がON、垂直がONとして分化していきます。
|
当然ですが、画面右横、画面最下段も上記の罫線になるので、罫線が引ける範囲は、下図のようになります。
よく見てください。右端と、一番下に罫線が引かれていませんね。ここは、そもそも罫線が引けないのです。左端と、最上段は罫線が引かれているのですが、目を凝らさないと分かりません。この部分は、画面設計の時に注意してください。まあ、80桁目は、大抵、フィールドの終わりになっている表示属性の部分のはずなので、気にならないでしょう。ただ、24行目が垂直罫線が引けないので、注意しましょう。
ここで、この図を頭に入れておいてもらって、さらに、それをどのようにコード化するのか、について、説明しましょう。
罫線定義データ
罫線書き込み制御コード |
罫線指定データ |
4 byte |
1byte |
640 byte |
3 byte |
X'27' |
X'2F' |
F/B |
X'20'
X'27' |
X'27' |
罫線定義データ |
X'C3' |
色? |
X'20' |
罫線定義データは表示画面の1行目の1桁目から24行目の80桁目まで、順番に連続した各表示位置の罫線情報を定義します。下図のように1バイトで連続した3桁の罫線情報を定義しますので、常に640バイトの固定長となります。(24行×80桁÷3=640)
罫線定義データ |
第1バイト |
第2バイト |
第3バイト |
... |
第639バイト |
第640バイト |
0 |
1 |
罫1 |
罫2 |
罫3 |
0 |
1 |
罫4 |
罫5 |
罫6 |
0 |
1 |
罫7 |
罫8 |
罫9 |
0 |
1 |
罫1915 |
罫1916 |
罫1917 |
0 |
1 |
罫1918 |
罫1919 |
罫1920 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
これをさらに、1バイト単位に見ていくと、下図のようになります。
1バイト (8ビット) |
0 |
1 |
罫線1 |
罫線2 |
罫線3 |
h 水平 |
v 垂直 |
h 水平 |
v 垂直 |
h 水平 |
v 垂直 |
最初の2ビットは常に01で固定です。 |
連続する3桁の罫線情報を2ビットずつで定義します。hで表された位置のビットは横罫線の情報,vで表されたビットは縦罫線の情報を指定します。すなわち,h,vで表された位置のビットが
- 0の場合: 罫線が引かれません。
- 1の場合: 罫線が引かれます。
|
一画面分の罫線は、この1バイトのセットを640組準備することになります。また最初に各バイトを、ビット01固定で開始するのは、この1バイトデータを空白(X'40')以上にしたかったのだと思います。X'40'はビットでは、(01000000)です。最初の2ビットは、01ですよね。これで、X'40'未満のデータは出来なくなります。この後に出てくる、ソースデータを見れば、分かりますね。(参考:14.16. RPG BITONから16進数を判断)
罫線定義データの求め方
さて先ほどの罫線情報を罫線指定データにしてみましょう。
この内容を1バイトずつコード化してみましょう。ABCが2行目の2桁目から、DEFが3行目2桁目から、GHIが4行目2桁目から表示されています。それから、1バイトが3文字分の罫線の設定だから、1バイトが、2行にまたがる部分もありますよね。80桁は3で割り切れませんから。下図の「罫線翻訳」は、上図の水平=1,垂直=0などを、1,0
と表現しています。たとえば、[A]は、11、[B]は11、[C]は01ですね。上図を良く見て、下図と照らしあわせてください。
画面 |
行 |
... |
1 |
2 |
... |
3 |
... |
4 |
... |
桁 |
79 |
80 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
80 |
1 |
2 |
3 |
4 |
5 |
1 |
2 |
3 |
4 |
5 |
6 |
罫線 |
罫線翻訳 |
00 |
00 |
00 |
11 |
11 |
01 |
00 |
00 |
00 |
00 |
00 |
11 |
10 |
01 |
00 |
00 |
10 |
10 |
00 |
00 |
00 |
ビット (01+) |
01 |
00 |
00 |
00 |
01 |
11 |
11 |
01 |
01 |
00 |
00 |
00 |
01 |
00 |
00 |
11 |
01 |
10 |
01 |
00 |
01 |
00 |
10 |
10 |
01 |
00 |
00 |
00 |
16進数 |
4 |
0 |
7 |
D |
4 |
0 |
4 |
3 |
6 |
4 |
4 |
A |
4 |
0 |
ここで、理解の手助けとして、自作の罫線設定のプログラムの一部です。SCCやECCは開始桁、終了桁を意味します。また、POSは、1から1920までの一画面分のデータストリームの桁を意味します。
0250.00 C*----------------------------------------------------*
0251.00 C @HH BEGSR : 罫線水平
0252.00 C*----------------------------------------------------*
0253.00 C Z-ADDW1SCC SCC 30 :
0254.00 C W1ECC SUB 1 ECC 30 :
0255.00 C W1SLL SUB 1 POS 50 :
0256.00 C MULT 80 POS :
0257.00 C* :
0258.00 C SCC DO ECC CC 30 :
0259.00 C* :
0260.00 C POS ADD CC P 50 :
0261.00 C DIV 3 P :
0262.00 C MVR B 10 73 :
0263.00 C 73 ADD 1 P :
0264.00 C* :
0265.00 C B COMP 0 70:
0266.00 C B COMP 1 71:
0267.00 C B COMP 2 72:
0268.00 C* :
0270.00 C 70 BITON'6' AX,P :
0271.00 C 71 BITON'2' AX,P :
0272.00 C 72 BITON'4' AX,P :
0278.00 C* :
0279.00 C ENDDO :
0280.00 C* :
0281.00 C ENDSR :
|
BITON'6','2','4'は以下のビット位置から決まります。Bは、3の倍数表現に関係があります。以下の、3n+1,3n+2,3n+0の、0,1,2がBです。これにより、1から1920のデータを、1から640の文字1バイトづつの、ビット、6,2,4にセットしています。これがもし、垂直ならば、ビットは、7,3,5になります。
bit番号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
桁 |
固定 |
3n+1 |
3n+2 |
3n+0 |
h / v |
0 |
1 |
水平 |
垂直 |
水平 |
垂直 |
水平 |
垂直 |
ここでは、実際に出来たコードを掲げます。全部は長すぎるので、罫線がある部分だけです。これが変換データですが、DDSに書く場合は、ちょっと気を付けなくてはいけません。
444444444444444447444444444444444444444444444444444444444444644444444444444444444444444444444
00000000000000000D00000000000000000000000000000000000000000340000000000000000000000000A000000
|
X'7D'は、シングルコーテーションのため、DDSの実際にコーディングする際に使用するシングルコーテーションとぶつかります。ソースが無いので、詳しくわかりませんが、Tool
Boxでは、それを避けるために、固定情報データ内でシングルコーテーションを作る場合の規則どおり、2つのシングルコーテーションにしているようです。下図の「''」のことです。ちなみに自分で作ったときは、この罫線情報を物理ファイルに保管するようにしました。
0007.00 A R KEIDTA
0008.00 A FRCDTA
0009.00 A PUTOVR
0010.00 A S#KBFR 2 O 1 2DSPATR(ND)
0011.00 A 1 5DSPATR(ND)
0012.00 A ' ''
0013.00 A 「エ
0014.00 A ?
0015.00 A
0016.00 A
0017.00 A
0018.00 A
0019.00 A
0020.00 A
0021.00 A
0022.00 A
0023.00 A
0024.00 A
0025.00 A
0026.00 A
0027.00 A
0028.00 A
0029.00 A
0030.00 A CF'
0031.00 A*
|
DDSソースと罫線書き込み制御
ホスト・システムのプログラムから、この制御データを送るとき、システム上は通常の表示データとして送り出します。このとき、次のように表示の開始位置を指定する必要があります。
1 罫線書き込み制御コード・・・・・・・・・1行目、1桁目
2 罫線指定データ・・・・・・・・・・・・・1行目、4桁目
あなたが、プログラマーなら、直ぐに気がつくでしょう。そうです、非表示のフィールドが2個あればいいのです。下図のDDSでは、そのうち一つがS#KBFRで、残りの罫線指定データの部分は、固定情報のフィールドになっていますね。
DDSソースを見てみて下さい。ここでは、KEIDTAというレコード様式に、罫線書き込み制御が入っています。
0007.00 A R KEIDTA
0008.00 A FRCDTA
0009.00 A PUTOVR
0010.00 A S#KBFR 2 O 1 2DSPATR(ND)
0011.00 A 1 5DSPATR(ND)
0012.00 A ' ''
0013.00 A 「エ
0014.00 A ?
0015.00 A
0016.00 A
0017.00 A
0018.00 A
0019.00 A
0020.00 A
0021.00 A
0022.00 A
0023.00 A
0024.00 A
0025.00 A
0026.00 A
0027.00 A
0028.00 A
0029.00 A
0030.00 A CF'
0031.00 A*
0032.00 A R KEICLR
0033.00 A FRCDTA
0034.00 A S#KBFR 2 O 1 2DSPATR(BL RI)
|
ここで、S#KBFR に注目してください。2バイトののフィールドが、ND(非表示)で指定されていますね。非表示は、表示属性では、X'27'ですね。さらに、その2バイトのフィールドのなかに、プログラムで、「X'2F'
+ F」又は、「X'2F' + B」をセットしてあげれば、制御コードのデータストリームが完成します。つまり、1行目の1桁目を開始として、X'27'から制御コードがかかれるのです。この画面を表示装置ファイルに送信(WRITE)すれば、その後に続く、長い罫線データを表示装置バッファに、罫線データとして書き出すことが出来る仕掛けです。
参考:9.2.表示属性について
この様に、罫線情報をバッファに書き込みます。これで、罫線が引ける状態になりました。あとは、これと合成する、文字データを合成用の制御コードをつけて書き出すだけです。
罫線合成表示
0001.00 A R FMT01
0002.00 A S#KBFR 2 O 1 2DSPATR(BL)
0003.00 A 2 2'ABC'
0004.00 A 3 2'DEF'
0005.00 A 4 2'GHI'
|
形式
X'28' |
X'2F' |
X'nn' |
X'20'
|
明滅 |
S#KBFR |
通常 |
非表示 |
F/B |
この制御コード4バイトを文字データとともに、書き出すだけです。簡単ですが、1行目の1から4桁はこの罫線合成のために予約されて使えなくなります。ですから予め、画面設計するときから、この部分を空けないといけません。
罫線の消去
あと、罫線の消去です。使い終わったら消す。これって重要です。不用意にデータは残さないようにしましょう。使い方は簡単です。S#KBFRに内容をセットして、書き出すだけです。
0031.00 A*
0032.00 A R KEICLR
0033.00 A FRCDTA
0034.00 A S#KBFR 2 O 1 2DSPATR(BL RI)
|
プログラム
画面ファイルKEID
0001.00 A R FMT01
0002.00 A S#KBFR 2 O 1 2DSPATR(BL)
0003.00 A 2 2'ABC'
0004.00 A 3 2'DEF'
0005.00 A 4 2'GHI'
0006.00 A*
0007.00 A R KEIDTA
0008.00 A FRCDTA
0009.00 A PUTOVR
0010.00 A S#KBFR 2 O 1 2DSPATR(ND)
0011.00 A 1 5DSPATR(ND)
0012.00 A ' '' -
0013.00 A 」c -
0014.00 A ? -
0015.00 A -
0016.00 A -
0017.00 A -
0018.00 A -
0019.00 A -
0020.00 A -
0021.00 A -
0022.00 A -
0023.00 A -
0024.00 A -
0025.00 A -
0026.00 A -
0027.00 A -
0028.00 A -
0029.00 A -
0030.00 A CF'
0031.00 A*
0032.00 A R KEICLR
0033.00 A FRCDTA
0034.00 A S#KBFR 2 O 1 2DSPATR(BL RI)
|
CLPで表示する例
0001.00 PGM
0002.00
0003.00 DCLF KEID
0004.00
0005.00 CHGVAR %SST(&S#KBFR 1 1) X'2F'
0006.00 CHGVAR %SST(&S#KBFR 2 1) 'F'
0007.00
0008.00 SNDF *N KEIDTA
0009.00 SNDRCVF *N FMT01
0010.00 SNDF *N KEICLR
0011.00
0012.00 RETURN
0013.00 ENDPGM
|
RPGで表示する例
0001.00 H Y/ 1
0002.00 FKEID CF E WORKSTN
0003.00 IS#KBFR DS
0004.00 I I X'2F' 1 1 DSX2F
0005.00 I 2 2 DSKBFR
0006.00 C*
0007.00 C MOVE 'F' DSKBFR
0008.00 C WRITEKEIDTA
0009.00 C*
0010.00 C EXFMTFMT01
0011.00 C*
0012.00 C WRITEKEICLR
0013.00 C MOVE *ON *INLR
0014.00 C RETRN
|
ここで解説するほども無いのですが、ポイントは、画面ファイルの制御フィールドS#KBFRに、X'2F'とバッファの識別'F'か'B'をセットすることです。これなら、CLPでもRPGでも出来ますね。
以上
2000-8-5 |