最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

9.48.罫線を画面につけたい(2)

[ Previous ] [ HOME ] [ Upper ] [ Next ]


手順

  1. 罫線データの書き出し
  2. 罫線合成で文字データ表示
  3. 罫線データの消去

grdbeye.gif (19913 バイト)

 

実例

今、サンプルとして、下記のような、簡単な罫線をひくことにしましょう。ちょっと、みづらいかもしれないけど、我慢してください。

grd006.gif (10950 バイト)

上記のソース

文字データは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の文字以内の部分だけ注目します。下図は、その拡大図です。
grd001.gif (4698 バイト)
grd003.gif (2062 バイト)

そして、さらに、垂直と、水平に分解して考えます。

水平と垂直は、1マス単位に上図のように、右辺と上辺だけに限られます。また、=1とは、onのことで、=0はoffのことだと思ってください。

arrow001.gif (1099 バイト)

上図をもう少し分かりやすく、着色してみました。これから、水平、垂直に分解していきます。

grd002.gif (4913 バイト)

arrow001.gif (1099 バイト)

これを、水平がON、垂直がONとして分化していきます。

grd004.gif (8198 バイト)

当然ですが、画面右横、画面最下段も上記の罫線になるので、罫線が引ける範囲は、下図のようになります。

grd010.gif (8460 バイト)

よく見てください。右端と、一番下に罫線が引かれていませんね。ここは、そもそも罫線が引けないのです。左端と、最上段は罫線が引かれているのですが、目を凝らさないと分かりません。この部分は、画面設計の時に注意してください。まあ、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)

scrngrd4.gif (21767 バイト)

罫線定義データ
第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進数を判断

罫線定義データの求め方

さて先ほどの罫線情報を罫線指定データにしてみましょう。

grd004.gif (8198 バイト)

この内容を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桁目

grdwrt02.gif (5451 バイト)

あなたが、プログラマーなら、直ぐに気がつくでしょう。そうです、非表示のフィールドが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.表示属性について

grdwrt01.gif (8588 バイト)

この様に、罫線情報をバッファに書き込みます。これで、罫線が引ける状態になりました。あとは、これと合成する、文字データを合成用の制御コードをつけて書き出すだけです。

罫線合成表示

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桁はこの罫線合成のために予約されて使えなくなります。ですから予め、画面設計するときから、この部分を空けないといけません。

grdwtr04.gif (2953 バイト)

罫線の消去

あと、罫線の消去です。使い終わったら消す。これって重要です。不用意にデータは残さないようにしましょう。使い方は簡単です。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


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送