40000 '<<<<<<<<<<<<<<<<<<<<  Visual Interface Library  >>>>>>>>>>>>>>>>>>>>
40004 '<<<<<<<<<<<<<<<<<<<<       　Ｖ　Ｉ　Ｌ　       >>>>>>>>>>>>>>>>>>>>
40008 '<<<<<<<<<<<<<<<<<<<<  基本パッケージ・ファイル  >>>>>>>>>>>>>>>>>>>>
40012 '
40016 '--------------------  バージョンチェック　--------------------
40020 '
40024 *VIL_BAS_VER
40028 VIL_VER%=300                                  'ＶＩＬ VER3.00
40032 RETURN
40036 '
40040 '---------------  ENV  アプリ環境ファイルパッケージ　---------------
40044 '必要パッケージ : なし
40048 '・アプリ環境ファイルの入出力処理
40052 '
40056 *VIL_ENV_INITM
40060 '　アプリ環境ファイルパッケージ初期化
40064 '
40068 '入力変数         : なし
40072 '破壊変数         : W0%           : トークン切り出し用
40076 '出力変数         : ENV_ENV$      : アプリ環境ファイル名（パス付）
40080 '                 : ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
40084 '呼出しモジュール : なし
40088 '
40092 VIL_ENV_ENV$="APPLI.ENV"      ' アプリ環境ファイル・デフォルト名
40096 VIL_ENV_ORG$="APPLI.ORG"      ' 初期アプリ環境ファイル・デフォルト名
40100 '
40104 VIL_W0%=SEARCH(VIL_ENVNAM$,"APPLIENV"):                                      IF VIL_W0%>-1 THEN VIL_ENV_ENV$=VIL_ENVVAL$(VIL_W0%)
40108 VIL_W0%=SEARCH(VIL_ENVNAM$,"APPLIORG"):                                      IF VIL_W0%>-1 THEN VIL_ENV_ORG$=VIL_ENVVAL$(VIL_W0%)
40112 RETURN
40116 '
40120 *VIL_ENV_ROP
40124 '　アプリ環境ファイル入力オープン
40128 '
40132 '入力変数         : ENV_ENV$      : アプリ環境ファイル名（パス付）
40136 '                 : ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
40140 '破壊変数         : なし
40144 '出力変数         : E%            : 0      : 正常終了
40148 '                                   その他 : オープン失敗
40152 '呼出しモジュール : なし
40156 '
40160 VIL_E%=0:OPEN "I",#1,VIL_ENV_ENV$
40164 IF VIL_E% THEN VIL_E%=0:OPEN "I",#1,VIL_ENV_ORG$
40168 RETURN
40172 '
40176 *VIL_ENV_RCL
40180 '　アプリ環境ファイル入力クローズ
40184 '
40188 '入力変数         : なし
40192 '破壊変数         : なし
40196 '出力変数         : なし
40200 '呼出しモジュール : なし
40204 '
40208 CLOSE #1:RETURN
40212 '
40216 *VIL_ENV_WOP
40220 '　アプリ環境ファイル出力オープン
40224 '
40228 '入力変数         : ENV_ENV$      : .ENVファイル名（パスつき）
40232 '破壊変数         : なし
40236 '出力変数         : E%            : 0      : 正常終了
40240 '                                   その他 : オープン失敗
40244 '呼出しモジュール : なし
40248 '
40252 VIL_E%=0:OPEN "O",#1,VIL_ENV_ENV$
40256 IF VIL_E%=64 THEN KILL VIL_ENV_ENV$:GOTO 40252
40260 RETURN
40264 '
40268 *VIL_ENV_WCL
40272 '　アプリ環境ファイル出力クローズ
40276 '
40280 '入力変数         : なし
40284 '破壊変数         : なし
40288 '出力変数         : なし
40292 '呼出しモジュール : なし
40296 '
40300 CLOSE #1:RETURN
40304 '
40308 *VIL_ENV_ERR
40312 '　アプリ環境ファイルエラー
40316 '
40320 '入力変数         : なし
40324 '破壊変数         : なし
40328 '出力変数         : なし
40332 '呼出しモジュール : なし
40336 '
40340 CLS               '現バージョンはアプリを強制終了
40344 PRINT"環境ファイルにエラーがあります"
40348 PRINT"エラー行:";VIL_W0$
40352 STOP
40356 RETURN
40360 '
40364 '--------------------  BEEP  ブザー音パッケージ　--------------------
40368 '必要パッケージ : なし
40372 '・受理時/エラー時のブザー音
40376 '
40380 *VIL_BEEP_INITM
40384 '　ブザー音パッケージ初期化
40388 '
40392 '入力変数         : なし
40396 '破壊変数         : なし
40400 '出力変数         : なし
40404 '呼出しモジュール : なし
40408 '
40412 'パッケージ変数
40416 VIL_BEEP_F%=-1        'ブザーフラグ（-1:ON / 0:OFF）
40420 RETURN
40424 '
40428 *VIL_BEEP_ENVR
40432 '　アプリ環境ファイル読み込み
40436 '
40440 '入力変数         : なし
40444 '破壊変数         : なし
40448 '出力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
40452 '呼出しモジュール : VIL_LNR
40456 '
40460 VIL_W0$="":WHILE VIL_W0$<>"#BEEP":GOSUB *VIL_LNR:WEND
40464 GOSUB *VIL_LNR:VIL_BEEP_F%=VAL(VIL_W0$)
40468 RETURN
40472 '
40476 *VIL_BEEP_ENVW
40480 '　アプリ環境ファイル書き込み
40484 '
40488 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
40492 '破壊変数         : なし
40496 '出力変数         : なし
40500 '呼出しモジュール : なし
40504 '
40508 PRINT #1,"#BEEP"
40512 PRINT #1,VIL_BEEP_F%
40516 RETURN
40520 '
40524 *VIL_BEEP_G
40528 '　受理ブザー音
40532 '
40536 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
40540 '破壊変数         : I%            : ループ用
40544 '出力変数         : なし
40548 '呼出しモジュール : なし
40552 '
40556 IF VIL_BEEP_F% THEN FOR VIL_I%=1 TO 4:BEEP 363523,5,400:WAIT 5:NEXT
40560 RETURN
40564 '
40568 *VIL_BEEP_B
40572 '　エラー・ブザー音
40576 '
40580 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
40584 '破壊変数         : なし
40588 '出力変数         : なし
40592 '呼出しモジュール : なし
40596 '
40600 IF VIL_BEEP_F% THEN BEEP 363523,40,80:WAIT 40
40604 RETURN
40608 '
40612 '--------------------  WIN  ウィンドウ・パッケージ　------------------
40616 '必要パッケージ : なし
40620 '・ウィンドウ領域の退避・復元処理および退避データの管理
40624 '・絶対座標/相対座標モードの切替
40628 '※ウィンドウ・オープン/クローズは絶対座標モードで行うこと
40632 '
40636 *VIL_WIN_INITM
40640 '　ウィンドウ・パッケージ初期化
40644 '
40648 '入力変数         : W0&           : 画面退避バッファサイズ
40652 '                   W1%           : 最大ウィンドウ番号
40656 '破壊変数         : なし
40660 '出力変数         : なし
40664 '呼出しモジュール : なし
40668 '
40672 'パッケージ変数
40676 '     アクティブウィンドウ左上隅座標・右下隅座標
40680 VIL_WIN_X%=0:VIL_WIN_Y%=0:VIL_WIN_W%=0:VIL_WIN_Z%=0
40684 '     ウィンドウ枠の上部・下部・左部・右部幅
40688 VIL_WIN_UB%=0:VIL_WIN_DB%=0:VIL_WIN_LB%=0:VIL_WIN_RB%=0
40692 '     現在のアクティブウィンドウ番号（0:NONE/1..W1%）
40696 '     座標モード（0:絶対座標 / -1:相対座標）
40700 VIL_WIN_AN%=0:VIL_WIN_PM%=0
40704 '
40708 '画面退避バッファサイズ、最大ウィンドウ番号
40712 VIL_WIN_BFMAX&=VIL_W0&:VIL_WIN_ANMAX%=VIL_W1%
40716 '     画面退避バッファ，WIN_BF%()オフセット
40720 DIM VIL_WIN_BF%(VIL_W0&),VIL_WIN_BFO&(VIL_W1%)
40724 '     ウィンドウ左上隅座標・右下隅座標
40728 DIM VIL_WIN_X%(VIL_W1%),VIL_WIN_Y%(VIL_W1%)
40732 DIM VIL_WIN_W%(VIL_W1%),VIL_WIN_Z%(VIL_W1%)
40736 '     WIN_AN%=0 のとき相対座標＝絶対座標
40740 VIL_WIN_X%(0)=  0:VIL_WIN_Y%(0)=  0
40744 VIL_WIN_W%(0)=639:VIL_WIN_Z%(0)=479
40748 '
40752 RETURN
40756 '
40760 *VIL_WIN_ENVR
40764 '　アプリ環境ファイル読み込み
40768 '
40772 '入力変数         : なし
40776 '破壊変数         : なし
40780 '出力変数         : なし
40784 '呼出しモジュール : VIL_LNR
40788 '
40792 VIL_W0$="":WHILE VIL_W0$<>"#WIN":GOSUB *VIL_LNR:WEND
40796 RETURN
40800 '
40804 *VIL_WIN_ENVW
40808 '　アプリ環境ファイル書き込み
40812 '
40816 '入力変数         : なし
40820 '破壊変数         : なし
40824 '出力変数         : なし
40828 '呼出しモジュール : なし
40832 '
40836 PRINT #1,"#WIN"
40840 RETURN
40844 '
40848 *VIL_WIN_OP
40852 '　ウィンドウ・オープン
40856 '
40860 '入力変数         : WIN_X%,WIN_Y% : ウィンドウ左上隅座標
40864 '                   WIN_W%,WIN_Z% : ウィンドウ右下隅座標
40868 '破壊変数         : なし
40872 '出力変数         : E%            : 0 : 正常終了
40876 '                                   5 : オープン失敗（退避領域不足）
40880 '                   WIN_X%,WIN_Y% : オープン失敗時のみ、現在の
40884 '                   WIN_W%,WIN_Z%   アクティブウィンドウの値を設定
40888 '呼出しモジュール : なし
40892 '
40896 VIL_WIN_AN%=VIL_WIN_AN%+1
40900 VIL_WIN_X%(VIL_WIN_AN%)=VIL_WIN_X%:VIL_WIN_Y%(VIL_WIN_AN%)=VIL_WIN_Y%
40904 VIL_WIN_W%(VIL_WIN_AN%)=VIL_WIN_W%:VIL_WIN_Z%(VIL_WIN_AN%)=VIL_WIN_Z%
40908 VIL_WIN_BFO&(VIL_WIN_AN%)=VIL_WIN_BFO&(VIL_WIN_AN%-1)                        +INT((INT((VIL_WIN_W%-VIL_WIN_X%+VIL_WIN_LB%+VIL_WIN_RB%+8)/8)               *(VIL_WIN_Z%-VIL_WIN_Y%+VIL_WIN_UB%+VIL_WIN_DB%+1)*4+1)/2)
40912 VIL_E%=0
40916 GET@A(VIL_WIN_X%-VIL_WIN_LB%,VIL_WIN_Y%-VIL_WIN_UB%)                             -(VIL_WIN_W%+VIL_WIN_RB%,VIL_WIN_Z%+VIL_WIN_DB%)                              ,VIL_WIN_BF%,VIL_WIN_BFO&(VIL_WIN_AN%-1)
40920 IF VIL_E% THEN
40924   VIL_WIN_AN%=VIL_WIN_AN%-1
40928   VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%)
40932   VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
40936   VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%)
40940   VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
40944 ENDIF
40948 RETURN
40952 '
40956 *VIL_WIN_CL
40960 '　ウィンドウ・クロ－ズ
40964 '
40968 '入力変数         : なし
40972 '破壊変数         : なし
40976 '出力変数         : WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
40980 '                   WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
40984 '呼出しモジュール : なし
40988 '
40992 PUT@A(VIL_WIN_X%(VIL_WIN_AN%)-VIL_WIN_LB%,VIL_WIN_Y%(VIL_WIN_AN%)            -VIL_WIN_UB%)-(VIL_WIN_W%(VIL_WIN_AN%)+VIL_WIN_RB%,VIL_WIN_Z%(               VIL_WIN_AN%)+VIL_WIN_DB%),VIL_WIN_BF%,,,,,VIL_WIN_BFO&(VIL_WIN_AN%-1)
40996 VIL_WIN_AN%=VIL_WIN_AN%-1
41000 VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%):VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
41004 VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%):VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
41008 RETURN
41012 '
41016 *VIL_WIN_CLDMY
41020 '　ウィンドウ・クロ－ズダミー
41024 '
41028 '入力変数         : なし
41032 '破壊変数         : なし
41036 '出力変数         : WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
41040 '                   WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
41044 '呼出しモジュール : なし
41048 '
41052 VIL_WIN_AN%=VIL_WIN_AN%-1
41056 VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%):VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
41060 VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%):VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
41064 RETURN
41068 '
41072 *VIL_WIN_CLALL
41076 '　ウィンドウ全クロ－ズ
41080 '
41084 '入力変数         : なし
41088 '破壊変数         : なし
41092 '出力変数         : WIN_X%,WIN_Y% : (0,0)
41096 '                   WIN_W%,WIN_Z% : (639,479)
41100 '呼出しモジュール : WIN_CL
41104 '
41108 WHILE VIL_WIN_AN%
41112   GOSUB *VIL_WIN_CL
41116 WEND
41120 RETURN
41124 '
41128 *VIL_WIN_PMR
41132 '　相対座標モード
41136 '
41140 '入力変数         : なし
41144 '破壊変数         : なし
41148 '出力変数         : WIN_PM%       : -1 (相対座標モード)
41152 '呼出しモジュール : なし
41156 '
41160 VIL_WIN_PM%=-1
41164 VIEW(VIL_WIN_X%,VIL_WIN_Y%)-(VIL_WIN_W%,VIL_WIN_Z%)
41168 WINDOW(0,0)-(VIL_WIN_W%-VIL_WIN_X%,VIL_WIN_Z%-VIL_WIN_Y%)
41172 RETURN
41176 '
41180 *VIL_WIN_PMA
41184 '　絶対座標モード
41188 '
41192 '入力変数         : なし
41196 '破壊変数         : なし
41200 '出力変数         : WIN_PM%       : 0 (絶対座標モード)
41204 '呼出しモジュール : なし
41208 '
41212 VIL_WIN_PM%=0
41216 VIEW(0,0)-(639,479):WINDOW(0,0)-(639,479)
41220 RETURN
41224 '
41228 '--------------------  メニュー選択パッケージ　--------------------
41232 '必要パッケージ : なし
41236 '・マウス／パッド／キーボードによるメニュー選択入力
41240 '
41244 *VIL_MSEL_INITM
41248 '　メニュー選択パッケージ初期化
41252 '
41256 '入力変数         : W0%           : 最大メニュー番号
41260 '                   W1%           : 最大ボックス数
41264 '                   W2%           : 設定メニュー最大行数
41268 '破壊変数         : I%            : ループ用
41272 '出力変数         : なし
41276 '呼出しモジュール : なし
41280 '
41284 'パッケージ変数
41288 VIL_MSEL_MN%=0        'メニュー番号（0のとき無効）
41292 VIL_MSEL_BB%=1        'ボックス番号ＭＩＮ
41296 VIL_MSEL_BE%=9        'ボックス番号ＭＡＸ
41300 VIL_MSEL_BN%=0        'ボックスカーソル（ＢＣ）位置(ボックス番号)
41304 VIL_MSEL_BC%=0        '-1:ＢＣ表示済 / 0:ＢＣ未表示
41308 VIL_MSEL_BD%=0        'ボックスの並べ方
41312 '                         1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
41316 '                         2:左方向に並べる    (省略時右方向)
41320 '                         4:上方向に並べる    (省略時下方向)
41324 '                         これらの和を指定
41328 VIL_MSEL_KY%=0        '選択キーコード
41332 '                          0..    : 番号選択キー
41336 '                         -1      : 取消キー
41340 '                         -2      : 決定キー
41344 '                         -3      : 非対応キー
41348 '                         -4      : ヌル入力
41352 '                         -5..-8  : 移動キー（→←↑↓）
41356 '                         -9..-12 : 拡張移動キー（→←↑↓）
41360 '                         -13     : ウィンドウマネージャ起動キー
41364 VIL_MSEL_WT% =50       'リピート開始までのウェイト
41368 VIL_MSEL_MRM%=0        'マウスボタン リピートモード
41372 VIL_MSEL_PRM%=0        'パッドボタン リピートモード
41376 VIL_MSEL_MKM%=0        '移動キー・モード
41380 '                       0 : 上下／左右ともそのメニュー内
41384 '                       1 : 上下キーが押されたらその旨返して終了
41388 '                       2 : 左右キーが押されたらその旨返して終了
41392 VIL_MSEL_CMN%=0       ' 設定メニュー番号 (0 以外を指定)
41396 VIL_MSEL_CMR%=0       ' 設定メニュー行数
41400 VIL_MSEL_CR%=0        ' 設定メニュー現在行(0 ～ MSEL_CMR%)
41404 VIL_MSEL_CRB%=0       ' MSEL_CR%保存用
41408 VIL_MSEL_SC$=""       ' ショートカットキー定義文字列
41412 VIL_MSEL_SCB$=""      ' SC$設定時のKB%()退避用
41416 DIM VIL_MSEL_X%(VIL_W1%),VIL_MSEL_Y%(VIL_W1%)'ボックス左上隅座標保存
41420 DIM VIL_MSEL_W%(VIL_W1%),VIL_MSEL_Z%(VIL_W1%)'ボックス右下隅座標保存
41424 DIM VIL_MSEL_BN%(VIL_W0%)                    'ＢＣ位置保存
41428 '         キー割当テーブル、パッド割当テーブル( PAD(1)+PTRIG(1)*9 )
41432 DIM VIL_MSEL_KB%(255),VIL_MSEL_PAD%(107)
41436 '設定メニュー用
41440 '     各行の基準ボックス　左上隅・右下隅座標
41444 DIM VIL_MSEL_CX%(VIL_W2%),VIL_MSEL_CY%(VIL_W2%)
41448 DIM VIL_MSEL_CW%(VIL_W2%),VIL_MSEL_CZ%(VIL_W2%)
41452 '     各行のボックス個数,  各行のボックス間隔(左上隅座標間隔)
41456 DIM VIL_MSEL_CN%(VIL_W2%),VIL_MSEL_CL%(VIL_W2%)
41460 '     各行のボックス番号ＭＩＮ, ＭＡＸ
41464 DIM VIL_MSEL_CBB%(VIL_W2%),VIL_MSEL_CBE%(VIL_W2%)
41468 '     MSEL_BN%()保存用（変更取消時に使用）
41472 DIM VIL_MSEL_CBN%(VIL_W2%)
41476 '
41480 'アプリ設定ファイル読み込み
41484 VIL_W0$="":WHILE VIL_W0$<>"#MSEL":GOSUB *VIL_LNR:WEND
41488 GOSUB *VIL_LNR:VIL_MSEL_BCM%=VAL(VIL_W0$)  'ＢＣ描画モード
41492 '     MSEL_KB%()
41496 FOR VIL_I%=0 TO 240 STEP 16
41500   GOSUB *VIL_LNR
41504   FOR VIL_J%=0 TO 15
41508     VIL_MSEL_KB%(VIL_I%+VIL_J%)=VAL(VIL_W0$)
41512     VIL_W0%=INSTR(VIL_W0$,",")+1
41516     IF VIL_W0%>1 THEN VIL_W0$=MID$(VIL_W0$,VIL_W0%)
41520   NEXT
41524 NEXT
41528 '     MSEL_PAD%()
41532 FOR VIL_I%=0 TO 99 STEP 9
41536   GOSUB *VIL_LNR
41540   FOR VIL_J%=0 TO 8
41544     VIL_MSEL_PAD%(VIL_I%+VIL_J%)=VAL(VIL_W0$)
41548     VIL_W0%=INSTR(VIL_W0$,",")+1
41552     IF VIL_W0%>1 THEN VIL_W0$=MID$(VIL_W0$,VIL_W0%)
41556   NEXT
41560 NEXT
41564 '
41568 MOUSE 0:MOUSE 1,320,240,0
41572 RETURN
41576 '
41580 *VIL_MSEL_ENVR
41584 '　アプリ環境ファイル読み込み
41588 '
41592 '入力変数         : なし
41596 '破壊変数         : なし
41600 '出力変数         : MSEL_WT%      : リピート開始までのウェイト
41604 '呼出しモジュール : VIL_LNR
41608 '
41612 VIL_W0$="":WHILE VIL_W0$<>"#MSEL":GOSUB *VIL_LNR:WEND
41616 GOSUB *VIL_LNR:VIL_MSEL_WT%=VAL(VIL_W0$)
41620 RETURN
41624 '
41628 *VIL_MSEL_ENVW
41632 '　アプリ環境ファイル書き込み
41636 '
41640 '入力変数         : MSEL_WT%      : リピート開始までのウェイト
41644 '破壊変数         : なし
41648 '出力変数         : なし
41652 '呼出しモジュール : なし
41656 '
41660 PRINT #1,"#MSEL"
41664 PRINT #1,VIL_MSEL_WT%
41668 RETURN
41672 '
41676 *VIL_MSEL_M
41680 '　メニュー選択
41684 '
41688 '入力変数         : X%,Y%         : 基準ボックス左上隅座標
41692 '                   W%,Z%         : 基準ボックス右下隅座標
41696 '                   XN%,YN%       : ボックス縦横個数
41700 '                   XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
41704 '                   C%            : ボックスカーソル（ＢＣ）色
41708 '                   MSEL_MN%      : メニュー番号 (0 のとき無効)
41712 '                   MSEL_BB%      : ボックス番号ＭＩＮ
41716 '                   MSEL_BE%      : ボックス番号ＭＡＸ
41720 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
41724 '                                   MSEL_MN%>0のときは無効
41728 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
41732 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
41736 '                             1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
41740 '                             2:左方向に並べる(省略時右方向)
41744 '                             4:上方向に並べる(省略時下方向)
41748 '                                 これらの和を指定
41752 '                   MSEL_WT%      : リピート開始までのウェイト
41756 '                   MSEL_MKM%     : 移動キー・モード
41760 '                             0 : 上下／左右ともそのメニュー内
41764 '                             1 : 上下キーが押されたらその旨返して終了
41768 '                             2 : 左右キーが押されたらその旨返して終了
41772 '破壊変数         : なし
41776 '出力変数         : KN%           : 入力番号
41780 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
41784 '                     -1                 :右クリック/取消
41788 '                     -2                 :ボックス外を左クリック
41792 '                     -3                 :非対応キー入力
41796 '                    -13                 : ウィンドウマネージャ起動キー
41800 '                   KY%           : 入力キーのアスキーコード
41804 '                                  （入力なし:0 ）
41808 '                   K$            : 入力キー
41812 '                                  （入力なし:""）
41816 '                   MX%,MY%       : 左クリック位置(絶対座標)
41820 '                   MW%,MZ%       : 左クリック位置(相対座標)
41824 '                                   (ともにKN%=-2 の時有効)
41828 '                              ただしウィンドウ外クリックの時 MW%=-1
41832 '                   MSEL_KY%      : 選択キーコード
41836 '                   MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
41840 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
41844 '呼出しモジュール : MSEL_BCMK,MSEL_IN
41848 '
41852 GOSUB *VIL_MSEL_BCMK
41856 GOSUB *VIL_MSEL_IN
41860 RETURN
41864 '
41868 *VIL_MSEL_BCMK
41872 '　ボックス座標作成
41876 '
41880 '入力変数         : X%,Y%         : 基準ボックス左上隅座標
41884 '                   W%,Z%         : 基準ボックス右下隅座標
41888 '                   XN%,YN%       : ボックス縦横個数
41892 '                   XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
41896 '                   MSEL_BB%      : ボックス番号ＭＩＮ
41900 '                   MSEL_BE%      : ボックス番号ＭＡＸ
41904 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
41908 '                             1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
41912 '                             2:左方向に並べる(省略時右方向)
41916 '                             4:上方向に並べる(省略時下方向)
41920 '                                 これらの和を指定
41924 '破壊変数         : W0%           : ボックス番号
41928 '                   W1%,W2%       : ボックス並びの方向
41932 '                   I%,J%         : ループ用
41936 '出力変数         : MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
41940 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
41944 '呼出しモジュール :   なし
41948 '
41952 IF VIL_MSEL_BD% AND 2 THEN VIL_W1%=-1 ELSE VIL_W1%=1
41956 IF VIL_MSEL_BD% AND 4 THEN VIL_W2%=-1 ELSE VIL_W2%=1
41960 FOR VIL_I%=1 TO VIL_YN%
41964   FOR VIL_J%=1 TO VIL_XN%
41968     IF VIL_MSEL_BD% AND 1 THEN
41972       VIL_W0%=(VIL_J%-1)*VIL_YN%+VIL_I%-1+VIL_MSEL_BB%
41976     ELSE
41980       VIL_W0%=(VIL_I%-1)*VIL_XN%+VIL_J%-1+VIL_MSEL_BB%
41984     ENDIF
41988     VIL_MSEL_X%(VIL_W0%)=VIL_X%+(VIL_J%-1)*VIL_XL%*VIL_W1%
41992     VIL_MSEL_Y%(VIL_W0%)=VIL_Y%+(VIL_I%-1)*VIL_YL%*VIL_W2%
41996     VIL_MSEL_W%(VIL_W0%)=VIL_W%+(VIL_J%-1)*VIL_XL%*VIL_W1%
42000     VIL_MSEL_Z%(VIL_W0%)=VIL_Z%+(VIL_I%-1)*VIL_YL%*VIL_W2%
42004   NEXT
42008 NEXT
42012 RETURN
42016 '
42020 *VIL_MSEL_IN
42024 '　メニュー選択入力
42028 '
42032 '入力変数         : XN%,YN%       : ボックス縦横個数
42036 '                   C%            : ボックスカーソル（ＢＣ）色
42040 '                   MSEL_MN%      : メニュー番号 (0 のとき無効)
42044 '                   MSEL_BB%      : ボックス番号ＭＩＮ
42048 '                   MSEL_BE%      : ボックス番号ＭＡＸ
42052 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
42056 '                                   MSEL_MN%>0のときは無効
42060 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
42064 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
42068 '                             1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
42072 '                             2:左方向に並べる(省略時右方向)
42076 '                             4:上方向に並べる(省略時下方向)
42080 '                                 これらの和を指定
42084 '                   MSEL_WT%      : リピート開始までのウェイト
42088 '                   MSEL_MKM%     : 移動キー・モード
42092 '                             0 : 上下／左右ともそのメニュー内
42096 '                             1 : 上下キーが押されたらその旨返して終了
42100 '                             2 : 左右キーが押されたらその旨返して終了
42104 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
42108 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
42112 '破壊変数         : W0%,W1%,      : カーソルキーコード
42116 '                   W2%,W3%
42120 '                   W4%           : ワーク
42124 '                   I%,J%         : ループ用
42128 '出力変数         : KN%           : 入力番号
42132 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
42136 '                     -1                 :右クリック/取消
42140 '                     -2                 :ボックス外を左クリック
42144 '                     -3                 :非対応キー入力
42148 '                    -13                 : ウィンドウマネージャ起動キー
42152 '                   KY%           : 入力キーのアスキーコード
42156 '                                  （入力なし:0 ）
42160 '                   K$            : 入力キー
42164 '                                  （入力なし:""）
42168 '                   MX%,MY%       : 左クリック位置(絶対座標)
42172 '                   MW%,MZ%       : 左クリック位置(相対座標)
42176 '                                   (ともにKN%=-2 の時有効)
42180 '                              ただしウィンドウ外クリックの時 MW%=-1
42184 '                   MSEL_KY%      : 選択キーコード
42188 '                   MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
42192 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
42196 '呼出しモジュール : MSEL_BC,MSEL_KY
42200 '
42204 'VIL_W4%=MOUSE(3,0)+MOUSE(3,1)                 'マウス先行入力除去
42208 VIL_W0%=-5:VIL_W1%=-6:VIL_W2%=-7:VIL_W3%=-8
42212 IF VIL_MSEL_BD% AND 2 THEN SWAP VIL_W0%,VIL_W1%
42216 IF VIL_MSEL_BD% AND 4 THEN SWAP VIL_W2%,VIL_W3%
42220 IF VIL_MSEL_BD% AND 1 THEN SWAP VIL_W0%,VIL_W3%:SWAP VIL_W1%,VIL_W2%
42224 '
42228 'FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BE%      '以下３行はデバッグ時の
42232 'LINE(VIL_MSEL_X%(VIL_I%),VIL_MSEL_Y%(VIL_I%))                                   -(VIL_MSEL_W%(VIL_I%),VIL_MSEL_Z%(VIL_I%)),PSET,VIL_I%,B
42236 'NEXT':VIL_A$=INPUT$(1)                       'ボックス位置確認用
42240 MOUSE 1,,,1                                   'マウス表示
42244 IF VIL_MSEL_MN% THEN VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%) 'BN復元
42248 IF VIL_MSEL_BN%<VIL_MSEL_BB% OR VIL_MSEL_BE%<VIL_MSEL_BN%                      THEN VIL_MSEL_BN%=VIL_MSEL_BB% 'BNが範囲外なら最初のボックス番号に
42252 IF VIL_MSEL_BC%=0 THEN GOSUB *VIL_MSEL_BC     'ＢＣ未表示なら表示
42256 '
42260 GOSUB *VIL_MSEL_KY
42264 '                                     マウスボタンリピート
42268 IF MOUSE(6,0) THEN VIL_MSEL_MRM%=0
42272 IF MOUSE(2,0) THEN
42276   IF VIL_MSEL_MRM%=1 THEN WAIT VIL_MSEL_WT%
42280   IF VIL_MSEL_MRM%<2 THEN VIL_MSEL_MRM%=VIL_MSEL_MRM%+1
42284 ENDIF
42288 '
42292 IF MOUSE(3,1) OR VIL_MSEL_KY%=-1 THEN         '右クリック/ 取消
42296   VIL_W4%=MOUSE(3,0)                          '左クリックをクリア
42300   VIL_KN%=-1
42304 ELSE IF MOUSE(3,0) OR MOUSE(2,0) THEN       '左クリック
42308   VIL_MX%=MOUSE(0):VIL_MY%=MOUSE(1)
42312   IF VIL_WIN_PM% THEN                         '相対座標モード
42316     VIL_KN%=-2
42320     IF  VIL_WIN_X%<=VIL_MX% AND VIL_MX%<=VIL_WIN_W%                              AND VIL_WIN_Y%<=VIL_MY% AND VIL_MY%<=VIL_WIN_Z% THEN
42324 '                                                ウィンドウ内クリック
42328       VIL_MW%=VIL_MX%-VIL_WIN_X%:VIL_MZ%=VIL_MY%-VIL_WIN_Y%'相対座標化
42332       GOSUB *VIL_MSEL_BC:GOSUB *VIL_MSEL_BCCHK:GOSUB *VIL_MSEL_BC
42336     ENDIF
42340   ELSE                                        '絶対座標モード
42344     VIL_MW%=VIL_MX%:VIL_MZ%=VIL_MY%
42348     GOSUB *VIL_MSEL_BC:GOSUB *VIL_MSEL_BCCHK:GOSUB *VIL_MSEL_BC
42352     VIL_MW%=-1
42356   ENDIF
42360 ELSE
42364   IF VIL_MSEL_KY%=-4 THEN                             '入力なし
42368     GOTO 42260
42372   ELSE IF  VIL_MSEL_BB%<=VIL_MSEL_KY%                                               AND VIL_MSEL_KY%<=VIL_MSEL_BE% THEN
42376 '                                                     番号選択キー
42380     VIL_KN%=VIL_MSEL_KY%
42384     GOSUB *VIL_MSEL_BC:VIL_MSEL_BN%=VIL_KN%:GOSUB *VIL_MSEL_BC
42388   ELSE IF VIL_MSEL_KY%=-2 THEN                        '決定キー
42392    VIL_KN%=VIL_MSEL_BN%
42396   ELSE IF VIL_MSEL_KY%=-3 OR VIL_MSEL_KY%=-13 THEN    '非対応キー                                                                 ・ＷＭ起動キー
42400     VIL_KN%=VIL_MSEL_KY%
42404   ELSE                                                '移動キー
42408     IF VIL_MSEL_MKM%=1 THEN
42412       IF VIL_MSEL_KY%=-7 OR VIL_MSEL_KY%=-8 THEN                                     VIL_KN%=VIL_MSEL_KY%:GOTO 42472
42416     ELSE IF VIL_MSEL_MKM%=2 THEN
42420       IF VIL_MSEL_KY%=-5 OR VIL_MSEL_KY%=-6 THEN                                     VIL_KN%=VIL_MSEL_KY%:GOTO 42472
42424     ENDIF
42428 '
42432     GOSUB *VIL_MSEL_BC
42436     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     -(VIL_MSEL_KY%=VIL_W0%)+(VIL_MSEL_KY%=VIL_W1%)                              +((VIL_MSEL_KY%=VIL_W2%)-(VIL_MSEL_KY%=VIL_W3%))*VIL_XN%
42440     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     +(VIL_MSEL_KY%=VIL_W0% AND (VIL_MSEL_BN% MOD VIL_XN%)=1)*VIL_XN%
42444     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     -(VIL_MSEL_KY%=VIL_W1% AND ((VIL_MSEL_BN%+1) MOD VIL_XN%)=1)                  *VIL_XN%
42448     VIL_MSEL_BN%=VIL_MSEL_BN%-((VIL_MSEL_BN%<VIL_MSEL_BB%)                       -(VIL_MSEL_BN%>VIL_MSEL_BE%))*(VIL_MSEL_BE%-VIL_MSEL_BB%+1)
42452     GOSUB *VIL_MSEL_BC
42456     GOTO 42260
42460   ENDIF
42464 ENDIF
42468 '
42472 VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_MSEL_BN%
42476 MOUSE 1,,,0
42480 VIL_MSEL_BC%=-1
42484 RETURN
42488 '
42492 *VIL_MSEL_BCCHK
42496 '　指定座標がボックスに含まれるかをチェック
42500 '
42504 '入力変数         : MX%,MY%       : ボックスに含まれるかを調べる座標
42508 '                   MSEL_BB%      : ボックス番号ＭＩＮ
42512 '                   MSEL_BE%      : ボックス番号ＭＡＸ
42516 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
42520 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
42524 '破壊変数         : I%,J%         : ループ変数
42528 '出力変数         : KN%           : 入力番号
42532 '                     MSEL_BB%..MSEL_BE% :指定座標がボックス内
42536 '                     -2                 :指定座標がボックス外
42540 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
42544 '                                   （指定座標がボックス内のとき）
42548 '呼出しモジュール : MSEL_BC
42552 '
42556 VIL_KN%=-2
42560 FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BB%+VIL_XN%-1
42564   IF  VIL_MSEL_X%(VIL_I%)=<VIL_MW%                                             AND VIL_MW%=<VIL_MSEL_W%(VIL_I%) THEN
42568     FOR VIL_J%=VIL_I% TO VIL_MSEL_BE% STEP VIL_XN%
42572       IF  VIL_MSEL_Y%(VIL_J%)=<VIL_MZ%                                             AND VIL_MZ%=<VIL_MSEL_Z%(VIL_J%) THEN
42576         VIL_KN%=VIL_J%
42580 '        GOSUB *VIL_MSEL_BC
42584         VIL_MSEL_BN%=VIL_KN%
42588 '        GOSUB *VIL_MSEL_BC
42592         VIL_I%=VIL_MSEL_BE%:VIL_J%=VIL_I%
42596       ENDIF
42600     NEXT
42604   ENDIF
42608 NEXT
42612 RETURN
42616 '
42620 *VIL_MSEL_CNFM
42624 '　設定メニュー選択
42628 '
42632 '入力変数         : MSEL_CX%(),   : 各行の基準ボックス左上隅座標
42636 '                   MSEL_CY%()
42640 '                   MSEL_CW%(),   : 各行の基準ボックス右下隅座標
42644 '                   MSEL_CZ%()
42648 '                   MSEL_CN%()    : 各行のボックス個数
42652 '                   MSEL_CL%()    : 各行のボックス間隔(左上隅座標間隔)
42656 '                   MSEL_CBB%()   : 各行のボックス番号ＭＩＮ
42660 '                   MSEL_CBE%()   : 各行のボックス番号ＭＡＸ
42664 '                   C%            : ボックスカーソル（ＢＣ）色
42668 '                   MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
42672 '                   MSEL_CMR%     : 設定メニュー行数
42676 '                     (MN% は CMN%～CNB%+CMR% までが使用される)
42680 '                     (MSEL_BN%(MSEL_CMN%) にはアクティブ行番号を格納)
42684 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
42688 '破壊変数         : MSEL_BD%      : ボックスの並べ方(0 に設定)
42692 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
42696 '                   MSEL_MKM%     : 移動キー・モード(0 に設定)
42700 '                   MSEL_CR%      : 現在行(0 ～ MSEL_MRN%)
42704 '                   MSEL_CRB%     : MSEL_CR%保存用
42708 '                   MSEL_MN%      : メニュー番号
42712 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
42716 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
42720 '出力変数         : KN%           : 入力番号
42724 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
42728 '                     -1                 :右クリック/取消
42732 '                     -2                 :ボックス外を左クリック
42736 '                     -3                 :非対応キー入力
42740 '                    -13                 : ウィンドウマネージャ起動キー
42744 '                   KY%           : 入力キーのアスキーコード
42748 '                                  （入力なし:0 ）
42752 '                   K$            : 入力キー
42756 '                                  （入力なし:""）
42760 '                   MX%,MY%       : 左クリック位置(絶対座標)
42764 '                   MW%,MZ%       : 左クリック位置(相対座標)
42768 '                                   (ともにKN%=-2 の時有効)
42772 '                              ただしウィンドウ外クリックの時 MW%=-1
42776 '                   MSEL_KY%      : 選択キーコード
42780 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
42784 '呼出しモジュール : MSEL_BCMK,MSEL_LC,MSEL_IN,MSEL_BC,MSEL_BCCHK
42788 '
42792 VIL_MSEL_BD%=0:VIL_MSEL_MKM%=1
42796 '
42800 IF VIL_MSEL_BC%=0 THEN
42804   FOR VIL_MSEL_CR%=1 TO VIL_MSEL_CMR%
42808     GOSUB 43020                           'パラメータ作成
42812     GOSUB *VIL_MSEL_BCMK
42816     VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
42820     GOSUB *VIL_MSEL_LC
42824   NEXT
42828 ENDIF
42832 VIL_MSEL_CR%=VIL_MSEL_BN%(VIL_MSEL_CMN%)
42836 IF VIL_MSEL_CR%<1 OR VIL_MSEL_CMR%<VIL_MSEL_CR% THEN VIL_MSEL_CR%=1
42840 '
42844 'VIL_MSEL_MN%=VIL_MSEL_CMN%
42848 VIL_KN%=-6 'ループに入るためのダミー
42852 WHILE -9<VIL_KN% AND VIL_KN%<-4   ' OR -1<VIL_KN%
42856   GOSUB 43020
42860   GOSUB *VIL_MSEL_BCMK:VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
42864   GOSUB *VIL_MSEL_LC
42868   VIL_MSEL_BC%=0
42872   GOSUB *VIL_MSEL_IN
42876   GOSUB *VIL_MSEL_BC
42880   GOSUB *VIL_MSEL_LC
42884 '
42888   IF VIL_KN%=-2 THEN  'アクティブ行のボックス外を左クリック
42892     VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_MSEL_BN%
42896     IF VIL_WIN_PM%=0 THEN VIL_MW%=VIL_MX%:VIL_MZ%=VIL_MY%
42900     VIL_MSEL_CRB%=VIL_MSEL_CR%
42904     FOR VIL_I%=1 TO VIL_MSEL_CMR%
42908       IF  VIL_MSEL_CY%(VIL_I%)<=VIL_MZ%                                            AND VIL_MZ%<=VIL_MSEL_CZ%(VIL_I%) THEN
42912         VIL_MSEL_CR%=VIL_I%
42916         GOSUB 43020:GOSUB *VIL_MSEL_BCMK:GOSUB *VIL_MSEL_BCCHK
42920         IF VIL_KN%>-1 THEN  'アクティブ行を移動
42924           GOSUB *VIL_MSEL_LC
42928           VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
42932           VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_KN%
42936           GOSUB *VIL_MSEL_LC
42940         ELSE
42944           VIL_MSEL_CR%=VIL_MSEL_CRB%
42948           VIL_KN%=-2          'ボックス外をクリックのため終了
42952         ENDIF
42956         VIL_I%=VIL_MSEL_CMR%
42960       ENDIF
42964     NEXT
42968     IF VIL_WIN_PM%=0 THEN VIL_MW%=-1
42972   ELSE
42976     VIL_MSEL_CR%=VIL_MSEL_CR%+(VIL_KN%=-7)-(VIL_KN%=-8)
42980     VIL_MSEL_CR%=VIL_MSEL_CR%                                                                +((VIL_MSEL_CR%>VIL_MSEL_CMR%)-(VIL_MSEL_CR%<1))                             *VIL_MSEL_CMR%
42984   ENDIF
42988 WEND
42992 '
42996 VIL_MSEL_BN%(VIL_MSEL_CMN%)=VIL_MSEL_CR%
43000 VIL_MSEL_MKM%=0
43004 RETURN
43008 '
43012 'MSEL_M 呼出し用にパラメータを作成
43016 '
43020 VIL_X%=VIL_MSEL_CX%(VIL_MSEL_CR%):VIL_Y%=VIL_MSEL_CY%(VIL_MSEL_CR%)
43024 VIL_W%=VIL_MSEL_CW%(VIL_MSEL_CR%):VIL_Z%=VIL_MSEL_CZ%(VIL_MSEL_CR%)
43028 VIL_XL%=VIL_MSEL_CL%(VIL_MSEL_CR%)
43032 VIL_XN%=VIL_MSEL_CN%(VIL_MSEL_CR%):VIL_YN%=1
43036 VIL_MSEL_BB%=VIL_MSEL_CBB%(VIL_MSEL_CR%)
43040 VIL_MSEL_BE%=VIL_MSEL_CBE%(VIL_MSEL_CR%)
43044 VIL_MSEL_MN%=VIL_MSEL_CMN%+VIL_MSEL_CR%
43048 RETURN
43052 '
43056 *VIL_MSEL_CNFSV
43060 '　設定メニューの設定保存
43064 '
43068 '入力変数         : MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
43072 '                   MSEL_CMR%     : 設定メニュー行数
43076 '破壊変数         : I%            : ループ変数
43080 '出力変数         : MSEL_CBN%()   : MSEL_BN%()保存用
43084 '呼出しモジュール : なし
43088 '
43092 FOR VIL_I%=0 TO VIL_MSEL_CMR%:                                                 VIL_MSEL_CBN%(VIL_I%)=VIL_MSEL_BN%(VIL_MSEL_CMN%+VIL_I%):                  NEXT
43096 RETURN
43100 '
43104 *VIL_MSEL_CNFLD
43108 '　設定メニューの設定復元
43112 '
43116 '入力変数         : MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
43120 '                   MSEL_CMR%     : 設定メニュー行数
43124 '破壊変数         : I%            : ループ変数
43128 '出力変数         : MSEL_BN%()    : MSEL_CBN%()からの復元値
43132 '呼出しモジュール : なし
43136 '
43140 FOR VIL_I%=0 TO VIL_MSEL_CMR%:                                                 VIL_MSEL_BN%(VIL_MSEL_CMN%+VIL_I%)=VIL_MSEL_CBN%(VIL_I%):                  NEXT
43144 RETURN
43148 '
43152 *VIL_MSEL_BC
43156 '　ボックスカーソル表示/消去
43160 '
43164 '入力変数         : C%            : ボックスカーソル（ＢＣ）色
43168 '                 : MSEL_BCM%     : ＢＣ描画モード（0:枠/1:反転）
43172 '破壊変数         : なし
43176 '出力変数         : なし
43180 '呼出しモジュール : なし
43184 '
43188 IF VIL_MSEL_BCM% THEN 
43192   LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Y%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%,BF
43196 ELSE
43200   LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Y%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%,B
43204 ENDIF
43208 RETURN
43212 '
43216 *VIL_MSEL_LC
43220 '　ラインカーソル表示/消去
43224 '
43228 '入力変数         : C%             : ラインカーソル色
43232 '破壊変数         : なし
43236 '出力変数         : なし
43240 '呼出しモジュール : なし
43244 '
43248 LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%
43252 RETURN
43256 '
43260 *VIL_MSEL_KY
43264 '　選択キーチェック
43268 '
43272 '入力変数         : なし
43276 '破壊変数         : なし
43280 '出力変数         : KY%           : 入力キーのアスキーコード
43284 '                                  （入力なし:0 ）
43288 '                   K$            : 入力キー
43292 '                                  （入力なし:""）
43296 '                   MSEL_KY%      : 選択キーコード
43300 '呼出しモジュール : なし
43304 '
43308 VIL_K$=INKEY$:VIL_MSEL_KY%=-4
43312 IF VIL_K$<>"" THEN
43316   VIL_KY%=ASC(VIL_K$):VIL_MSEL_KY%=VIL_MSEL_KB%(VIL_KY%)
43320 ELSE
43324   VIL_KY%=0
43328   VIL_PAD%=PAD(1)+PTRIG(1)*9
43332   IF VIL_PAD% THEN
43336     IF VIL_MSEL_PRM%=0 THEN VIL_MSEL_PRM%=1:                                                             VIL_MSEL_KY%=VIL_MSEL_PAD%(VIL_PAD%)
43340 '    IF VIL_MSEL_PRM%=1                                                             THEN WAIT VIL_MSEL_WT%:VIL_PAD%=PAD(1)+PTRIG(1)*9
43344 '    IF VIL_MSEL_PRM%<2 THEN VIL_MSEL_PRM%=VIL_MSEL_PRM%+1
43348 '    VIL_MSEL_KY%=VIL_MSEL_PAD%(VIL_PAD%)
43352   ELSE
43356     VIL_MSEL_PRM%=0
43360     VIL_MSEL_KY%=-4
43364   ENDIF
43368 ENDIF
43372 '
43376 RETURN
43380 '
43384 *VIL_MSEL_SETSC
43388 '　ショートカットキー定義
43392 '
43396 '入力変数         : MSEL_SC$      : ショートカットキー定義文字列
43400 '破壊変数         : I%            : ループ用
43404 '                   W0%           : SC$切りだし用
43408 '出力変数         : MSEL_SCB$     : SC$設定時のKB%()退避用
43412 '                   MSEL_KB%()    : キー割当テーブル（アスキーコード）
43416 '呼出しモジュール : なし
43420 '
43424 '
43428 VIL_MSEL_SCB$="":VIL_I%=1
43432 WHILE VIL_I%>0
43436   VIL_W0%=ASC(MID$(VIL_MSEL_SC$,VIL_I%,1))
43440   VIL_MSEL_SCB$=VIL_MSEL_SCB$+","+MID$(VIL_MSEL_SC$,VIL_I%,1)                                                 +STR$(VIL_MSEL_KB%(VIL_W0%))
43444   VIL_MSEL_KB%(VIL_W0%)=VAL(MID$(VIL_MSEL_SC$,VIL_I%+1))
43448 ' PRINT VIL_I%;VIL_W0%;MID$(VIL_MSEL_SC$,VIL_I%,1);"/";MID$(VIL_MSEL_SC$,VIL_I%+1);":";VIL_MSEL_SCB$
43452 ' PRINT VIL_I%;ASC(MID$(VIL_MSEL_SC$,VIL_I%,1));VAL(MID$(VIL_MSEL_SC$,VIL_I%+1))
43456   VIL_I%=INSTR(VIL_I%+1,VIL_MSEL_SC$,","):VIL_I%=VIL_I%-(VIL_I%>0)
43460 WEND
43464 'PRINT VIL_MSEL_SCB$ '***********
43468 RETURN
43472 '
43476 *VIL_MSEL_RESETSC
43480 '　ショートカットキー消去
43484 '
43488 '入力変数         : MSEL_SCB$     : SC$設定時のKB%()退避用
43492 '破壊変数         : I%            : ループ用
43496 '                   W0%           : SCB$切りだし用
43500 '出力変数         : MSEL_KB%()    : キー割当テーブル（アスキーコード）
43504 '呼出しモジュール : なし
43508 '
43512 VIL_I%=2
43516 WHILE VIL_I%>0
43520   VIL_W0%=ASC(MID$(VIL_MSEL_SCB$,VIL_I%,1))
43524   VIL_MSEL_KB%(VIL_W0%)=VAL(MID$(VIL_MSEL_SCB$,VIL_I%+1))
43528 '   PRINT VIL_I%;VIL_W0%;VIL_MSEL_KB%(VIL_W0%)
43532   VIL_I%=INSTR(VIL_I%+1,VIL_MSEL_SCB$,","):VIL_I%=VIL_I%-(VIL_I%>0)
43536 WEND
43540 RETURN
43544 '--------------------  入力パッケージ　--------------------
43548 '必要パッケージ : MSEL,WIN
43552 '・指定長以内の文字列入力
43556 '
43560 *VIL_INP_INITM
43564 '　入力パッケージ初期化
43568 '
43572 '入力変数         : W0%           : ヒストリー系列数
43576 '破壊変数         : なし
43580 '出力変数         : なし
43584 '呼出しモジュール : なし
43588 '
43592 'パッケージ変数
43596 '     現在の文字列長、カーソル位置
43600 VIL_INP_L%=0:VIL_INP_CX%=0
43604 '     ヒストリーポインタ、ヒストリー系列番号、ヒストリー系列数
43608 VIL_INP_HSP%=0:VIL_INP_HSN%=0:VIL_INP_HSMAX%=VIL_W0%
43612 'ヒストリーデータ開始位置、ヒストリーポインタ
43616 DIM VIL_INP_HSB%(VIL_W0%+1),VIL_INP_HSP%(VIL_W0%)
43620 DIM VIL_INP_HS$(0)    'ヒストリーデータ（ダミー定義）
43624 '
43628 'VIL_W0$="":WHILE VIL_W0$<>"#INP":GOSUB *VIL_LNR:WEND
43632 '
43636 MOUSE 0:MOUSE 1,320,240,0
43640 RETURN
43644 '
43648 *VIL_INP_ENVR
43652 '　アプリ環境ファイル読み込み
43656 '
43660 '入力変数         : なし
43664 '破壊変数         : I%,J%         : ループ用
43668 '出力変数         : INP_HSB%()    : ヒストリーデータ開始位置
43672 '                   INP_HSP%()    : ヒストリーポインタ
43676 '                   INP_HS$()     : ヒストリーデータ
43680 '呼出しモジュール : VIL_LNR
43684 '
43688 VIL_W0$="":WHILE VIL_W0$<>"#INP":GOSUB *VIL_LNR:WEND
43692 FOR VIL_I%=1 TO VIL_INP_HSMAX%    'ヒストリーデータ開始位置読み込み
43696   GOSUB *VIL_LNR:                                                              VIL_INP_HSB%(VIL_I%+1)=VIL_INP_HSB%(VIL_I%)+VAL(VIL_W0$)+1:                  VIL_INP_HSP%(VIL_I%)=VIL_INP_HSB%(VIL_I%)
43700 NEXT
43704 ERASE VIL_INP_HS$                 'ヒストリーデータ領域確保
43708 DIM VIL_INP_HS$(VIL_INP_HSB%(VIL_INP_HSMAX%+1))
43712 '
43716 FOR VIL_I%=1 TO VIL_INP_HSMAX%
43720 '     ヒストリーポインタ読み込み
43724   GOSUB *VIL_LNR:                                                              VIL_INP_HSP%(VIL_I%)=VIL_INP_HSB%(VIL_I%)+VAL(VIL_W0$)-1
43728 '     ヒストリーデータ読み込み
43732   FOR VIL_J%=VIL_INP_HSB%(VIL_I%) TO VIL_INP_HSB%(VIL_I%+1)-1
43736     GOSUB *VIL_LNR:VIL_INP_HS$(VIL_J%)=MID$(VIL_W0$,2)
43740   NEXT
43744 NEXT
43748 'FOR VIL_I%=1 TO VIL_INP_HSMAX%:PRINT VIL_I%
43752 '  FOR VIL_J%=VIL_INP_HSB%(VIL_I%) TO VIL_INP_HSB%(VIL_I%+1)-1
43756 '    PRINT VIL_J%;"|";VIL_INP_HS$(VIL_J%);"|"
43760 '  NEXT
43764 'NEXT:A$=INPUT$(1)
43768 RETURN
43772 '
43776 *VIL_INP_ENVW
43780 '　アプリ環境ファイル書き込み
43784 '
43788 '入力変数         : なし
43792 '破壊変数         : なし
43796 '出力変数         : なし
43800 '呼出しモジュール : なし
43804 '
43808 PRINT #1,"#INP"
43812 FOR VIL_I%=1 TO VIL_INP_HSMAX%    '保存個数書き込み
43816   PRINT #1,VIL_INP_HSB%(VIL_I%+1)-VIL_INP_HSB%(VIL_I%)-1
43820 NEXT
43824 '
43828 FOR VIL_I%=1 TO VIL_INP_HSMAX%
43832 '     ヒストリーポインタ書き込み
43836   PRINT #1,VIL_INP_HSP%(VIL_I%)
43840 '     ヒストリーデータ書き込み
43844   FOR VIL_J%=VIL_INP_HSB%(VIL_I%) TO VIL_INP_HSB%(VIL_I%+1)-1
43848     PRINT #1,"\"+VIL_INP_HS$(VIL_J%)
43852   NEXT
43856 NEXT
43860 RETURN
43864 '
43868 *VIL_INP_STR
43872 '　文字列入力
43876 '
43880 '入力変数         : X%,Y%         : 入力行左上隅座標
43884 '                   L%            : 入力文字列最大長
43888 '                   A$            : 入力文字列初期値
43892 '                                   （なければ空文字列）
43896 '                   C%            : 入力文字・カーソル色
43900 '                   CB%           : 背景色
43904 '                   INP_HSN%      : ヒストリー系列番号
43908 '                                 　（0:ヒストリーを使用しない）
43912 '破壊変数         : W0%           : カーソルサイズ
43916 '出力変数         : KN%           :  0:決定入力
43920 '                                   -1:取消入力
43924 '                                   -2:左クリック
43928 '                                  -13:ウィンドウマネージャ起動キー
43932 '                   K$            : 最後の入力キー
43936 '                   KY%           : 最後の入力キーのアスキーコード
43940 '                   A$            : 入力文字列(KN%=-1 の時は無効)
43944 '                   MX%,MY%       : 左クリック位置(絶対座標)
43948 '                   MW%,MZ%       : 左クリック位置(相対座標)
43952 '                                   (ともにKN%=-2 の時有効)
43956 '                              ただしウィンドウ外クリックの時 MW%=-1
43960 '                   INP_L%,INP_CX%: 現在の文字列長、カーソル位置
43964 '呼出しモジュール : INP_GPRINT,MSEL_KY
43968 ' 
43972 VIL_INP_L%=LEN(VIL_A$)
43976 VIL_INP_CX%=VIL_INP_L%:VIL_INP_CKX%=KLEN(VIL_A$,0)
43980 IF VIL_INP_HSN% THEN VIL_INP_HSP%=VIL_INP_HSP%(VIL_INP_HSN%)
43984 'PRINT VIL_INP_HSN%;VIL_INP_HSP%
43988 MOUSE 1,,,1
43992 '
43996 VIL_KN%=1:GOSUB *VIL_INP_GPRINT:GOSUB 44364
44000 '
44004 WHILE VIL_KN%>0
44008 '
44012 '  PRINT VIL_INP_CX%;VIL_INP_CKX%;KLEN(VIL_A$);VIL_INP_L%;"/";VIL_L%
44016   GOSUB *VIL_MSEL_KY
44020 '         全角文字入力    **** 全角入力にはエラーを返すモード検討
44024   IF 128<=VIL_KY% AND VIL_KY%<=159                                               THEN VIL_W0$=VIL_K$:GOSUB *VIL_MSEL_KY:VIL_K$=VIL_W0$+VIL_K$
44028 '
44032   IF MOUSE(3,1) OR VIL_MSEL_KY%=-1 THEN             '右クリック/取消
44036     VIL_KN%=-1
44040   ELSE IF MOUSE(3,0) OR MOUSE(2,0) THEN             '左クリック
44044     VIL_MX%=MOUSE(0):VIL_MY%=MOUSE(1)
44048     IF VIL_WIN_PM% THEN
44052       IF VIL_WIN_PM% AND VIL_WIN_X%<=VIL_MX% AND VIL_MX%<=VIL_WIN_W%                              AND VIL_WIN_Y%<=VIL_MY% AND VIL_MY%<=VIL_WIN_Z%               THEN   '相対座標化
44056         VIL_MW%=VIL_MX%-VIL_WIN_X%:VIL_MZ%=VIL_MY%-VIL_WIN_Y%
44060       ELSE
44064         VIL_MW%=-1
44068       ENDIF
44072     ENDIF
44076     VIL_KN%=-2
44080   ELSE IF VIL_MSEL_KY%=-4 THEN             'ヌル入力
44084     VIL_KN%=1     'ループから抜けないためのダミー
44088   ELSE IF VIL_MSEL_KY%=-2 THEN             '決定キー
44092     IF VIL_INP_HSN% THEN
44096       VIL_INP_HS$(VIL_INP_HSP%(VIL_INP_HSN%))=VIL_A$
44100 '                    連続して同じものなら登録しない方式検討
44104       VIL_INP_HSP%(VIL_INP_HSN%)=VIL_INP_HSP%(VIL_INP_HSN%)+1
44108       IF VIL_INP_HSP%(VIL_INP_HSN%)=VIL_INP_HSB%(VIL_INP_HSN%+1) THEN                VIL_INP_HSP%(VIL_INP_HSN%)=VIL_INP_HSB%(VIL_INP_HSN%)
44112       ENDIF
44116     VIL_KN%=0
44120   ELSE IF VIL_MSEL_KY%=-13 THEN            'ウィンドウマネージャキー
44124     VIL_KN%=-13
44128   ELSE IF VIL_MSEL_KY%=-7 OR VIL_MSEL_KY%=-8 THEN '↑↓
44132     VIL_KN%=1 'ループから抜けないためのダミー
44136     IF VIL_INP_HSN% THEN
44140       VIL_INP_HSP%=VIL_INP_HSP%+(VIL_MSEL_KY%=-7)-(VIL_MSEL_KY%=-8)
44144       IF VIL_INP_HSP%<VIL_INP_HSB%(VIL_INP_HSN%)                                     THEN VIL_INP_HSP%=VIL_INP_HSB%(VIL_INP_HSN%+1)-1
44148       IF VIL_INP_HSP%=VIL_INP_HSB%(VIL_INP_HSN%+1)                                   THEN VIL_INP_HSP%=VIL_INP_HSB%(VIL_INP_HSN%)
44152 '     PRINT VIL_INP_HSP%;"|";VIL_INP_HS$(VIL_INP_HSP%);"|"
44156       GOSUB 44364
44160       IF VIL_INP_HSP%=VIL_INP_HSP%(VIL_INP_HSN%)                                     THEN VIL_A$=""                                                               ELSE VIL_A$=VIL_INP_HS$(VIL_INP_HSP%)
44164       VIL_INP_L%=LEN(VIL_A$)
44168       VIL_INP_CX%=VIL_INP_L%:VIL_INP_CKX%=KLEN(VIL_A$,0)
44172       GOSUB *VIL_INP_GPRINT:GOSUB 44364
44176     ENDIF
44180   ELSE IF VIL_MSEL_KY%=-5 THEN              '→
44184     GOSUB 44364
44188     IF VIL_INP_CX%<VIL_INP_L% THEN
44192       VIL_INP_CKX%=VIL_INP_CKX%+1:VIL_W0%=VIL_INP_CX%
44196       IF VIL_INP_CKX%<KLEN(VIL_A$)+1                                                 THEN VIL_INP_CX%=VIL_INP_CX%+1+KTYPE(VIL_A$,VIL_INP_CKX%)                    ELSE VIL_INP_CX%=VIL_INP_CX%+1
44200       IF VIL_INP_CX%=VIL_L%                                                          THEN VIL_INP_CX%=VIL_W0%:VIL_INP_CKX%=VIL_INP_CKX%-1
44204     ENDIF
44208     GOSUB 44364:VIL_KN%=1
44212   ELSE IF VIL_MSEL_KY%=-6 THEN              '←
44216     GOSUB 44364
44220     IF VIL_INP_CX%>0 THEN
44224       VIL_INP_CKX%=VIL_INP_CKX%-1
44228       VIL_INP_CX%=VIL_INP_CX%-1-KTYPE(VIL_A$,VIL_INP_CKX%+1)
44232     ENDIF
44236     GOSUB 44364:VIL_KN%=1
44240   ELSE
44244     GOSUB 44364
44248     IF VIL_KY%>=32 AND VIL_KY%<>127 THEN '表示可能文字
44252       VIL_W0%=KTYPE(VIL_K$,1)+1
44256       IF VIL_INP_L%+VIL_W0%<=VIL_L% THEN
44260         VIL_A$=LEFT$(VIL_A$,VIL_INP_CX%)+VIL_K$                                            +MID$(VIL_A$,VIL_INP_CX%+1)
44264         VIL_INP_L%=VIL_INP_L%+VIL_W0%
44268         IF VIL_INP_L%<VIL_L% THEN
44272           VIL_INP_CKX%=VIL_INP_CKX%+1:VIL_INP_CX%=VIL_INP_CX%+VIL_W0%
44276         ENDIF
44280       ENDIF
44284     ELSE IF VIL_KY%=8 AND VIL_INP_CX%>0 THEN              '[BS]
44288       VIL_INP_CKX%=VIL_INP_CKX%-1
44292       VIL_W0%=KTYPE(VIL_A$,VIL_INP_CKX%+1)+1
44296       VIL_INP_L%=VIL_INP_L%-VIL_W0%:VIL_INP_CX%=VIL_INP_CX%-VIL_W0%
44300       VIL_A$=KLEFT$(VIL_A$,VIL_INP_CKX%)+KMID$(VIL_A$,VIL_INP_CKX%+2)
44304     ELSE IF VIL_KY%=127 AND VIL_INP_CX%<VIL_INP_L% THEN   '[削除]
44308       VIL_INP_L%=VIL_INP_L%-KTYPE(VIL_A$,VIL_INP_CKX%+1)-1
44312       VIL_A$=KLEFT$(VIL_A$,VIL_INP_CKX%)+KMID$(VIL_A$,VIL_INP_CKX%+2)
44316     ELSE IF VIL_KY%=11 THEN                               '[HOME]
44320       VIL_A$="":VIL_INP_L%=0:VIL_INP_CX%=0:VIL_INP_CKX%=0
44324     ENDIF
44328     GOSUB *VIL_INP_GPRINT:GOSUB 44364
44332     VIL_KN%=1
44336   ENDIF
44340 WEND
44344 MOUSE 1,,,0
44348 GOSUB 44364
44352 RETURN
44356 '
44360 'CURSOR
44364 VIL_W0%=7
44368 IF VIL_INP_CX%<VIL_INP_L% THEN IF KTYPE(VIL_A$,VIL_INP_CKX%+1)                                                THEN VIL_W0%=15
44372 LINE(VIL_X%+VIL_INP_CX%*8        ,VIL_Y%+17)                                    -(VIL_X%+VIL_INP_CX%*8+VIL_W0%,VIL_Y%+17),XOR,%VIL_C%
44376 RETURN
44380 '
44384 *VIL_INP_GPRINT
44388 '　文字列表示(グラフィック座標指定)
44392 '
44396 '入力変数         : X%,Y%         : 表示位置
44400 '                   A$            : 表示文字列
44404 '                   L%            : 文字列長
44408 '                   C%            : 文字列表示色
44412 '                   CB%           : 背景色
44416 '破壊変数         : なし
44420 '出力変数         : なし
44424 '呼出しモジュール : なし
44428 '
44432 LINE(VIL_X%,VIL_Y%)-(VIL_X%+VIL_L%*8-1,VIL_Y%+15),PSET,%VIL_CB%,BF
44436 SYMBOL(VIL_X%,VIL_Y%),VIL_A$,1,1,%VIL_C%
44440 RETURN
44444 '
44448 *VIL_INP_FEPON
44452 '　システム行表示
44456 '
44460 '入力変数         : なし
44464 '破壊変数         : W0%           : 座標モード一時保存
44468 '出力変数         : なし
44472 '呼出しモジュール : WIN_PMA,WIN_PMR
44476 '
44480 CONSOLE 0,24,2
44484 VIL_W0%=VIL_WIN_PM%:GOSUB *VIL_WIN_PMA
44488 VIL_E=0
44492 GET@A(0,464)-(639,479),VIL_WIN_BF%,VIL_WIN_BFO&(VIL_WIN_AN%)
44496 IF VIL_E=0 THEN LINE(0,464)-(639,479),PSET,0,BF
44500 IF VIL_W0% THEN GOSUB *VIL_WIN_PMR
44504 RETURN
44508 '
44512 *VIL_INP_FEPOFF
44516 '　システム行非表示
44520 '
44524 '入力変数         : なし
44528 '破壊変数         : W0%           : 座標モード一時保存
44532 '出力変数         : なし
44536 '呼出しモジュール : WIN_PMA,WIN_PMR
44540 '
44544 CONSOLE 0,25,0
44548 VIL_W0%=VIL_WIN_PM%:GOSUB *VIL_WIN_PMA
44552 PUT@A(0,464)-(639,479),VIL_WIN_BF%,PSET,,,,VIL_WIN_BFO&(VIL_WIN_AN%)
44556 IF VIL_W0% THEN GOSUB *VIL_WIN_PMR
44560 RETURN
44564 '
44568 *VIL_INP_MVWAIT
44572 '　マウス移動/クリック/キー/パッド入力待ち
44576 '
44580 '入力変数         : なし
44584 '破壊変数         : W0%,W0$       : 先行入力無効化用
44588 '出力変数         : なし
44592 '呼出しモジュール : なし
44596 '
44600 VIL_W0%=MOUSE(9)+MOUSE(10):VIL_W0$=INKEY$
44604 WHILE ABS(MOUSE(9))<10 AND ABS(MOUSE(10))<10                                   AND MOUSE(2,0)+MOUSE(2,1)=0 AND INKEY$="" AND PAD(1)+PTRIG(1)=0:WEND
44608 RETURN
44612 '
44616 'SCALE--------2---------3---------4---------5---------6---------7-----*--*8
