| 
       CREATE BROWSE handle
        IN WIDGET-POOL widget-pool-name ASSIGN attribute=expression trigger-phrase | 
| 
       /* r-dynbrws */
        DEFINE VARIABLE name-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE num-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE address-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE calc-col-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE browse-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE buff-field-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE brws-col-hdl AS HANDLE NO-UNDO. DEFINE VARIABLE jx AS INTEGER NO-UNDO. DEFINE BUTTON btn-delete LABEL "Delete". DEFINE BUTTON btn-quit LABEL "&Quit" AUTO-ENDKEY. DEFINE FRAME MyFrame SKIP(10) btn-delete btn-quit WITH SIZE 80 BY 22. DEFINE QUERY q1 FOR Customer SCROLLING. OPEN QUERY q1 FOR EACH Customer NO-LOCK. CREATE BROWSE browse-hdl ASSIGN TITLE = "Dynamic Browse" FRAME = FRAME MyFrame:HANDLE QUERY = QUERY q1:HANDLE X = 2 Y = 2 WIDTH = 74 DOWN = 10 VISIBLE = YES READ-ONLY = NO SENSITIVE = TRUE. ON ROW-DISPLAY OF browse-hdl DO: IF VALID-HANDLE(calc-col-hdl) THEN calc-col-hdl:SCREEN-VALUE = STRING(Customer.CreditLimit - Customer.Balance). END. ASSIGN num-hdl = browse-hdl:ADD-LIKE-COLUMN("Customer.CustNum"). name-hdl = browse-hdl:ADD-LIKE-COLUMN("Customer.Name"). address-hdl = browse-hdl:ADD-LIKE-COLUMN("Customer.Address"). calc-col-hdl = browse-hdl:ADD-CALC-COLUMN("INT","->,>>>,>>9.99","", "Credit Left"). /* Refresh needs to be done if ADD-CALC-COLUMN is done after the browse is displayed. In ROW-DISPLAY trigger, we can only set the calc field's screen-value if the handle is set. And the handle is set after the ADD-CALC-COLUMN method is done. */ browse-hdl:refresh(). browse-hdl:EXPANDABLE = YES. ON ROW-LEAVE OF browse-hdl DO: IF browse-hdl:CURRENT-ROW-MODIFIED THEN DO: REPEAT jx = 1 TO browse-hdl:NUM-COLUMNS: brws-col-hdl = browse-hdl:GET-BROWSE-COLUMN(jx). IF brws-col-hdl:MODIFIED THEN DO: buff-field-hdl = brws-col-hdl:BUFFER-FIELD. /* If buff-field-hdl is unknown, this is a calculated field and cannot be updated */ IF buff-field-hdl NE ? THEN buff-field-hdl:BUFFER-VALUE = brws-col-hdl:SCREEN-VALUE. END. END. END. END. ON CHOOSE OF btn-delete DO: /* LABEL "DeleteDynBrowse". */ DELETE WIDGET browse-hdl. END. ON CHOOSE OF btn-quit DO: QUIT. END. ENABLE ALL WITH FRAME MyFrame. WAIT-FOR CLOSE OF CURRENT-WINDOW. | 
 If the browse's height is set using the DOWN attribute and a browse column is added, the browse's height may change to ensure that the number of DOWN is preserved. This may be due to the addition of the horizontal scrollbar or the growth of the column header.
If the browse's height is set using the DOWN attribute and a browse column is added, the browse's height may change to ensure that the number of DOWN is preserved. This may be due to the addition of the horizontal scrollbar or the growth of the column header.
   If the browse's height is set using the HEIGHT-CHARS or HEIGHT-PIXELS attributes, or through direct manipulation, and a browse column is added, the DOWN attribute may change to ensure that the specified height is preserved. This may be due to the addition of the horizontal scrollbar or the growth of the column header.
If the browse's height is set using the HEIGHT-CHARS or HEIGHT-PIXELS attributes, or through direct manipulation, and a browse column is added, the DOWN attribute may change to ensure that the specified height is preserved. This may be due to the addition of the horizontal scrollbar or the growth of the column header.
   The DISPLAY . . . WITH BROWSE browse-name statement cannot be used with a dynamic browse. Instead, the user must set the SCREEN-VALUE attributes.
The DISPLAY . . . WITH BROWSE browse-name statement cannot be used with a dynamic browse. Instead, the user must set the SCREEN-VALUE attributes.
   A dynamic browse's validation expression is restricted. It may not contain a CAN-FIND function. To reference the field, the FRAME-VALUE function must be used. The CAN-FIND function will still work for a static browse column.
A dynamic browse's validation expression is restricted. It may not contain a CAN-FIND function. To reference the field, the FRAME-VALUE function must be used. The CAN-FIND function will still work for a static browse column.
   If a buffer-field is associated with a dynamic browse column, set the buffer-field's VALIDATE-EXPRESSION attribute before the dynamic browse column is added to the browse (via the ADD-LIKE-COLUMN( ) method). The validation expression is compiled at this time. If the VALIDATE-EXPRESSION attribute is changed later, it is ignored.
If a buffer-field is associated with a dynamic browse column, set the buffer-field's VALIDATE-EXPRESSION attribute before the dynamic browse column is added to the browse (via the ADD-LIKE-COLUMN( ) method). The validation expression is compiled at this time. If the VALIDATE-EXPRESSION attribute is changed later, it is ignored.
   You can use the ASSIGN option to assign a widget ID value to the WIDGET-ID attribute for this object. If you have enabled application-defined widget IDs in your ABL GUI application, by specifying the Use Widget ID (-usewidgetid) startup parameter, then the AVM uses this widget ID when it creates the widget at run time, instead of using the widget ID it normally generates by default. If you have not enabled application-defined widget IDs, then the AVM ignores this option setting at run time.
You can use the ASSIGN option to assign a widget ID value to the WIDGET-ID attribute for this object. If you have enabled application-defined widget IDs in your ABL GUI application, by specifying the Use Widget ID (-usewidgetid) startup parameter, then the AVM uses this widget ID when it creates the widget at run time, instead of using the widget ID it normally generates by default. If you have not enabled application-defined widget IDs, then the AVM ignores this option setting at run time.