Next is a section marked Frame Definitions, where the window’s one frame is defined:

DEFINE FRAME CustQuery
     BtnFirst AT ROW 2.19 COL 7 WIDGET-ID 12
     BtnNext AT ROW 2.19 COL 23.6 WIDGET-ID 14
     BtnPrev AT ROW 2.19 COL 40.2 WIDGET-ID 16
     BtnLast AT ROW 2.19 COL 57 WIDGET-ID 18
     Customer.Name AT ROW 4.57 COL 39 COLON-ALIGNED WIDGET-ID 8
          VIEW-AS FILL-IN 
          SIZE 32 BY 1
     Customer.CustNum AT ROW 4.67 COL 14 COLON-ALIGNED WIDGET-ID 6
          VIEW-AS FILL-IN 
          SIZE 9 BY 1
     Customer.Address AT ROW 6.67 COL 14 COLON-ALIGNED WIDGET-ID 2
          VIEW-AS FILL-IN 
          SIZE 37 BY 1
     Customer.City AT ROW 8.38 COL 14 COLON-ALIGNED WIDGET-ID 4
          VIEW-AS FILL-IN 
          SIZE 27 BY 1
     Customer.State AT ROW 8.38 COL 49 COLON-ALIGNED WIDGET-ID 10
          VIEW-AS FILL-IN 
          SIZE 22 BY 1
     OrderBrowse AT ROW 10.67 COL 8 WIDGET-ID 200
    WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 
         SIDE-LABELS NO-UNDERLINE THREE-D 
         AT COLUMN 1 ROW 1
         SIZE 80 BY 20.81 WIDGET-ID 100.

Here the code defines the position of each object in the frame. The exact position of the objects depends on how you laid them out in the design window. The four buttons are all at row position 2.19, counting in full character units.

Next come the fields from the Customer table. There are no DEFINE statements for these because the field definitions are taken automatically from the Data Dictionary definitions for the Customer fields.

Then the frame definition places the browse control at column 8 of row 10.67.

Finally, the frame definition has its own WITH clause, where it sets the following frame attributes:
  • 1 DOWN — You remember from “Using Basic ABL Constructs,” that the kind of ABL frame you get from a FOR EACH block with a DISPLAY statement in it is a down frame that displays multiple records in a report-like format. Frames in a graphical application are typically one down frames, which display only one instance of the objects defined for the frame. In this case, the browse control is a single GUI object that takes the place of the multi-line down frame in the older interface style that’s designed for character terminals.
  • NO-BOX, OVERLAY, NO-UNDERLINE, THREE-D — These all define various visual characteristics of the frame and are self-explanatory.
  • KEEP-TAB-ORDER — This attribute keeps language statements such as the ENABLE statement you saw in enable_UI from changing the tab order of the fields.
  • AT COLUMN 1 ROW 1 — This position is relative to the window the frame is in. The objects in the frame are positioned relative to the frame (their container), and the frame is positioned relative to its container (the window).
  • SIZE 80 BY 20.81 — This is the size of the whole frame in characters.

For more information on any of the frame attributes, see their descriptions under the Frame phrase entry in the ABL Reference.

Following the Frame Definition section are the Procedure Settings, which are specially formatted comments with information the AppBuilder uses internally. You should never edit special sections like this one.