山本氏による、パネル上の移動制御サンプル
SET CUAENTER ON|OFF
DEFINE ENTRYFIELD <<フィールド>|<メモリー変数>>
OF <パネル名> ;
AT <数値式1>,<数値式2> ;
[<BEFORE|AFTER> <オブジェクト名>]
このような記述を使用することで、おおよそ思い通りの動きを実現することが出来ますが、直接記述するため修正に時間を要してしまいます。
下記のサンプルでは構造体の登録順番を変更することで、記述を変更せずフォーカス移動を変更できます
なお、データ入力後のチェックを行うことは考慮されていません。
prologue notvalid に、define dialogなどを追加すると思い通りの動作をしないという現状があります。(参考)
・notvalidでdialogを表示すると、変更したデータをarago内部で認識できない。
・prologueでdialogを表示すると、表示が2回行われてしまう。
***************************************************************************
***************************************************************************
* Version 6 系の特殊事情に対応する
Ver6 = like("*Ver. 6*", Version())
* Win32API を借用
Extern CHANDLE SetFocus(CHANDLE) User32.dll
Extern CVOID OutputDebugStringA(CSTRING) Kernel32.dll
Extern CVOID SleepEx(CLONG) Kernel32.dll From "Sleep"
* ここの順番を変えることで動作を変更できる
DECLARE FIELD[5]
FIELD[1] = "A"
FIELD[2] = "B"
FIELD[3] = "C"
FIELD[4] = "D"
FIELD[5] = "E"
FIELDLENGTH = 5
* X印でクローズすると最後のデータを取りこぼすらしい?
ON EVENT "CLOSE" OnClose()
DEFINE PANEL PANEL1 FROM 0.0, 0.0 TO 300.0, 200.0
*
DEFINE TEXT TEXT1 OF PANEL1 AT 20.0, 20.0 PROMPT "A"
A = "0123456789"
DEFINE ENTRYFIELD A OF PANEL1 AT 20.0, 40.0 WIDTH 120.0 PROLOGUE
PROL() VALID REQUIRED REQ()
*
DEFINE TEXT TEXT2 OF PANEL1 AT 60.0, 20.0 PROMPT "B"
B = "a " &&space(32)
DEFINE ENTRYFIELD B OF PANEL1 AT 60.0, 40.0 WIDTH 120.0 PROLOGUE
PROL() VALID REQUIRED REQ()
*
DEFINE TEXT TEXT3 OF PANEL1 AT 100.0, 20.0 PROMPT "C"
C = "ABCD"
DEFINE ENTRYFIELD C OF PANEL1 AT 100.0, 40.0 WIDTH 120.0 PROLOGUE
PROL() VALID REQUIRED REQ()
DEFINE TEXT TEXT4 OF PANEL1 AT 140.0, 20.0 PROMPT "D"
D = "漢字です"
DEFINE ENTRYFIELD D OF PANEL1 AT 140.0, 40.0 WIDTH 120.0 PROLOGUE
PROL() VALID REQUIRED REQ()
*
DEFINE TEXT TEXT5 OF PANEL1 AT 180.0, 20.0 PROMPT "E"
E = "これが最後"
DEFINE ENTRYFIELD E OF PANEL1 AT 180.0, 40.0 WIDTH 120.0 PROLOGUE
PROL() VALID REQUIRED REQ()
*
KeyOn()
ACTIVATE PANEL PANEL1 MODAL ON A
KeyOff()
*=======================================================
FUNCTION KeyOn
SET KEY -400 TO KEYSHIFTTAB
SET KEY 9 TO KEYTAB
SET KEY 13 TO KEYENTER
SET KEY 5 TO KEYUPARROW
SET KEY 24 TO KEYDOWNARROW
RETURN .T.
*---------------------------------------
FUNCTION KeyOff
SET KEY -400 TO
SET KEY 9 TO
SET KEY 13 TO
SET KEY 5 TO
SET KEY 24 TO
RETURN .T.
*---------------------------------------
* Dbgview.exe
を起動していればメッセージを見ることが出来る。
* http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
* AragoW でも、?コマンドで表示する。 set talk on
必須
FUNCTION OutputDebugString
parameters msg
OutputDebugStringA(msg)
? msg
RETURN .T.
*---------------------------------------
FUNCTION OnClose
private o
*
下記の処理がない場合、変数に値が反映されないようだ
* Version 4.5 では、SetFocus(0) だけでは、VALID
が呼ばれないようだ
*SetFocus(0)
KEYENTER()
o = PANEL()
OutputDebugString("-------OnClose " + o + "
[" + &o + "]")
RETURN .T.
*---------------------------------------
* ぐるぐる動作にしているが必要なければ止める
PROCEDURE KEYENTER
private I
FOR I = 1 TO FIELDLENGTH STEP 1
if FIELD[I] = PANEL()
if I = FIELDLENGTH
DO FocusEx WITH (FIELD[1])
else
DO FocusEx WITH (FIELD[I + 1])
endif
exit
endif
NEXT
RETURN .T.
*---------------------------------------
PROCEDURE KEYUPARROW
private I
FOR I = 1 TO FIELDLENGTH STEP 1
if FIELD[I] = PANEL()
if I = 1
DO FocusEx WITH (FIELD[FIELDLENGTH])
else
DO FocusEx WITH (FIELD[I - 1])
endif
exit
endif
NEXT
RETURN .T.
*---------------------------------------
PROCEDURE KEYDOWNARROW
KEYENTER()
RETURN .T.
*---------------------------------------
PROCEDURE KEYTAB
KEYENTER()
RETURN .T.
*---------------------------------------
PROCEDURE KEYSHIFTTAB
KEYUPARROW()
RETURN .T.
*---------------------------------------
FUNCTION PROL
OutputDebugString("PROLOGUE -> " + PANEL())
RETURN .T.
*---------------------------------------
FUNCTION REQ
private o
o = PANEL()
OutputDebugString("VALID REQUIRED -> " + o +
" [" + &o + "]")
RETURN .T.
*---------------------------------------
* REQ で .T. を返しているので、ここには入らない
FUNCTION NOT
OutputDebugString("NOVALID -> " + PANEL())
RETURN .T.
*---------------------------------------
* フォーカス移動用ファンクション
PROCEDURE FocusEx
parameters pobj
if Ver6 = .T.
SetFocus(0)
endif
FOCUS("PANEL1", pobj)
RETURN .T.