山本氏による、パネル上の移動制御サンプル

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.