Field-level focus in DISPLAY ARRAY
The DISPLAY ARRAY dialog supports cell-level
focus with the FOCUSONFIELD.
Enabling focusable cells in DISPLAY ARRAY
When using a DISPLAY ARRAY
dialog to control a list view, you can enable cell-level focus handling with the FOCUSONFIELD attribute.
Important: This feature is not supported on mobile platforms.
With a graphical front-end, this feature allows cell mouse clicks or tabbing between cells, instead of having the whole current row highlighted.
This feature can also be used in text mode (FGLGUI=0), to move in DISPLAY ARRAY
fields with the keyboard using arrow keys or tab.
To enable field-level focus handling in a DISPLAY ARRAY, add the
FOCUSONFIELD attribute in the dialog definition:
DISPLAY ARRAY arr TO sr.* ATTRIBUTES(FOCUSONFIELD)
Detecting cell focus changes
When the
FOCUSONFIELD attribute is defined, BEFORE FIELD and AFTER FIELD blocks can be used, to
detect field focus
changes:DISPLAY ARRAY arr TO sr.* ATTRIBUTES(FOCUSONFIELD)
...
BEFORE FIELD cust_id
MESSAGE "focus in cust_id, row = ", arr_curr()
AFTER FIELD cust_id
MESSAGE "focus left cust_id, row = ", arr_curr()
BEFORE FIELD cust_name
MESSAGE "focus in cust_name, row = ", arr_curr()
...
END DISPLAYNote that if defined, the
AFTER ROW control block will execute after the
AFTER FIELD block and the BEFORE ROW control block will execute
before the BEFORE FIELD block. The code blocks execute in the following order:AFTER FIELD(for the field that loses the focus)AFTER ROW(for the previous current row)BEFORE ROW(for the new current row)BEFORE FIELD(for the field that gets the focus in the new row)
What is the current cell?
The current cell of
DISPLAY ARRAY with FOCUSONFIELD attribute
can be found by using the ui.Dialog.getCurrentItem()
method:DISPLAY ARRAY arr TO sr.* ATTRIBUTES(FOCUSONFIELD)
...
ON ACTION show_current_cell
MESSAGE "Current cell = ", DIALOG.getCurrentItem()Setting the current cell
To set the focus to a specific cell with program code, use the
NEXT FIELD
instruction, or the ui.Dialog.nextField() method, in conjunction with the
ui.Dialog.setCurrentRow()
method:DISPLAY ARRAY arr TO sr.* ATTRIBUTES(FOCUSONFIELD)
...
ON ACTION top_left ATTRIBUTES(TEXT = "TOP LEFT")
CALL DIALOG.setCurrentRow("sr", 1)
NEXT FIELD first_field
ON ACTION bottom_right ATTRIBUTES(TEXT = "BOTTOM RIGHT")
CALL DIALOG.setCurrentRow("sr", sr.getLength())
NEXT FIELD last_field
...
END DISPLAY