2007/9/14 金曜日

画面のカーソル位置情報関連

Filed under: RPG — takahashi @ 23:19:51

画面上のカーソルの位置情報を取得する方法についてお伝えします。
画面の項目のPOP-UP検索等、カーソルがどの項目に置かれている項目を判断する場合に利用できます。
この方法が使用できない昔のバージョンではカーソルが何行何桁目にあるのかを取得して判断していたようです。
昔のソースを引き続き使用している場合は、今でも昔ながらの方法でやっている場合を見かけます。
紹介する方法であれば画面変更で項目位置が変更されても、問題ありません。

DDS側のコーディングです

RPG:
  1. A          R #FMT10
  2. A                                      RTNCSRLOC(&D#RECD &D#FELD &D#POS)
  3. A                                      CSRLOC(D#LIN      D#COL)
  4. A            D#RECD        10A  H      TEXT('カーソル レコード')
  5. A            D#FELD        10A  H      TEXT('カーソル フィールド')
  6. A            D#POS          4S 0H      TEXT('カーソル 位置')
  7. A            D#LIN          3S 0H      TEXT('カーソル 行 ')
  8. A            D#COL          3S 0H      TEXT('カーソル 桁 ')
  9. A*
  10. A            D1KUBN         2Y 0B  6 11TEXT('区分')
  11. A            D1SHCD        13Y 0B  7 29TEXT('商品CD')

キーワード RTNCSRLOCを指定します。
パラメータには、レコード名、フィールド名、カーソル位置(任意)を指定します。
例では
レコード名=&D#RECD
フィールド名=&D#FELD
カーソル位置=&D#POS
とします。
続いて、レコード名、フィールド名を10桁のAタイプの非表示項目として定義します。
カーソル位置情報は4桁のSタイプの非表示項目として定義します。

この例では、カーソルが画面の商品CDにフィールドがあった場合は
D#RECDにはレコード名の"#FMT10"が入り、D#FELDには商品CDのフィールド名"D1SHCD"が入ります。フィールド外の場合はブランクになります。
任意項目のカーソル位置ですが、商品CDフィールドの中でのカーソル位置が入ります。
例えば、カーソルが商品CDフィールドの中の3桁目にあれば、3が入ります。
※カーソル位置に関しては未検証です。先ほどマニュアルを見直して発見しました。あまり利用する事も無い様に思います。

RPG側のコーディングです。

RPG:
  1. C                     SELEC
  2. C**- 区分検索
  3. C           D#FELD    WHEQ 'D1KUBN'
  4. C                     MOVEL*BLANK    P#SRCD
  5. C                     CALL 'CCM621'  PAR621
  6. C           P#SRCD    IFNE *BLANK
  7. C                     MOVELP#SRCD    D1KUBN
  8. C* MDT OFF
  9. C                     MOVEL*BLANK    W#MDT
  10. C                     ENDIF
  11. C**-- 商品コード検索
  12. C           D#FELD    WHEQ 'D1SHCD'
  13. C                     MOVEL*BLANK    P#SYC2
  14. C                     CALL 'CDM050'  PAR050
  15. C           P#SYC2    IFNE *BLANK
  16. C                     MOVELP#SYC2    D1SHCD
  17. C* MDT OFF
  18. C                     MOVEL*BLANK    W#MDT
  19. C                     ENDIF
  20. C                     ENDSL

実際の処理では、D#FELDの内容を判断してフィールドに見合った処理を行えばいいと思います。
レコード情報は、レコード違いでフィールド名が重複する様な事がなければ判断する必要はないと思います。

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.493 sec. Powered by WordPress ME