Query Checkbox

CTLOP_QRYCB (opcode 5) may be used to query the current value of a checkbox or radiobutton. The value (returned in the cstatus parameter) may be one of: 0 (unchecked), 1 (checked), or 2 (indeterminate, for MBF_3STATE checkboxes).

The ability to query the value of a checkbox is useful when you want to present a bunch of checkboxes and let the user click on them in any order, or TAB around them, without having to code the INFLD logic necessary for handling individual field exitcodes and immediate validation. Instead, you can just let EVENTWAIT handle the operation until the user triggers the event requiring that you retrieve the values.

Note that in the local A-Shell/Windows environment, a special operation to query a checkbox isn't really necessary, since the AUI system will automatically and immediately update the checkbox value variable (specified in the func parameter when the checkbox was created). But in the ATE environment (where the checkbox is on the client and the variable is on the server), direct updating of the value variable isn't possible. The CTLOP_QRYCB method described below, will work in all environments and thus is recommended.

As an example, consider the following simple dialog containing several checkbox options:

The program creates the dialog, then waits in an EVENTWAIT loop to either click the green button (which triggers the checkbox query routine and displays the results in the trace window), or to close the dialog (by clicking the red X or hitting ESC).

Source code for above dialog.

program qrycb,1.0(100)  ! simple example of querying checkboxes

 

++include ashinc:ashell.def

 

define MAX_CB = 7       ! number of checkboxes

define DLG_ID$ = "dlg1" ! id of main dialog

 

map1 cb(MAX_CB)  

    map2 cb'id$,s,20    ! control id

    map2 cb'dsc$,s,20   ! display text

    map2 cb'val,b,1     ! checkbox value

 

map1 misc

    map2 i,f

    map2 row,b,4

    map2 col,b,4

    map2 evw'parentid$,s,24

    map2 evw'ctlid$,s,24

    map2 evw'flags,b,4

    map2 exitcode,f

    map2 status,f

 

data "cbAPEX",      "APEX"

data "cbASQL",      "ASQL"

data "cbATE",       "ATE"

data "cbATS",       "ATS"

data "cbISAMA",     "ISAM-A"

data "cbPDFX",      "PDFX"

data "cbPolyShell", "PolyShell"

 

 

    ! create the dialog

    xcall AUI, AUI_CONTROL, CTLOP_ADD, DLG_ID$, "A-Shell Options", &

        MBST_ENABLE, MBF_DIALOG + MBF_ALTPOS + MBF_SYSMENU, &

        NUL_CMD$, NUL_FUNC$, NUL_CSTATUS, 2000, 5000, 8000, 25000

 

    ! create the checkbox controls

    for i = 1 to 7

        read cb'id$(i), cb'dsc$(i)

 

        ! divide into two columns

        if i <= 4 then

            row = (i + 1) * 1000  ! millirows

            col = 3000

        else

            row = (i - 3) * 1000

            col = 12000

        endif

 

        cb'val(2) = 1   ! (initialize one of the checkboxes to checked)

 

        xcall AUI, AUI_CONTROL, CTLOP_ADD, cb'id$(i), cb'dsc$(i), &

            MBST_ENABLE, MBF_CHKBOX + MBF_LFJUST + MBF_TABSTOP, &

            NUL_CMD$, cb'val(i), NUL_CSTATUS, row, col, row+1000, col+7000, &

            NUL_FGC, NUL_BGC, NUL_FONTATTR, NUL_FONTSCALE, NUL_FONTFACE$, &

            NUL_TOOLTIP$, DLG_ID$

    next i

 

    ! create qry/exit buttons

    xcall AUI, AUI_CONTROL, CTLOP_ADD, "btnQry", "checks::ashico1", &

        MBST_ENABLE, MBF_BUTTON + MBF_ICON + MBF_KBD, &

        "VK_xF101", NUL_FUNC$, NUL_CSTATUS, 5500, 14000, 6500, 16000, &

        NUL_FGC, NUL_BGC, NUL_FONTATTR, NUL_FONTSCALE, NUL_FONTFACE$, &

        "Query the current checkbox values", DLG_ID$

 

    xcall AUI, AUI_CONTROL, CTLOP_ADD, "btnExit", "delete::ashico1", &

        MBST_ENABLE, MBF_BUTTON + MBF_ICON + MBF_KBD, &

        "VK_ESC", NUL_FUNC$, NUL_CSTATUS, 5500, 17000, 6500, 19000, &

        NUL_FGC, NUL_BGC, NUL_FONTATTR, NUL_FONTSCALE, NUL_FONTFACE$, &

        "Exit dialog", DLG_ID$

    ! wait for user to click Query or Exit

    evw'parentid$ = "dlg1"

    evw'ctlid$ = cb'id$(1)

    evw'flags = 0

    do

        xcall AUI, AUI_EVENTWAIT, evw'parentid$, evw'ctlid$, exitcode, evw'flags

        switch exitcode

            case -101            ! clicked ok

                trace.print "Querying checkboxes..."

                for i = 1 to MAX_CB

                    xcall AUI, AUI_CONTROL, CTLOP_QRYCB, cb'id$(i), NUL_CTEXT$, &

                        NUL_CSTATE, NUL_CTYPE, NUL_CMD$, NUL_FUNC$, status

                    cb'val(i) = status

                    trace.print "CB #"+i+" : "+cb'dsc$(i)+" = "+cb'val(i)

                next i

                exit

        endswitch

    loop until exitcode = 1     ! (escape)

 

    xcall AUI, AUI_CONTROL, CTLOP_DEL, DLG_ID$      ! close dialog

end

 

 

Comments

The program above uses alphanumeric IDs for the checkbox controls, which eliminates the need for the CTLOP_ADD operation to return the numeric ID of each newly-created checkbox. This speeds up creation of the dialog in the ATE environment (where otherwise the server would have to wait for the return status of each checkbox before creating the next one). But it doesn't help the CTLOP_QRYCB operation, which would require a round-trip (server to client and back) for each checkbox queried. For a small dialog like this it wouldn't be an issue, but if you have a dialog with hundreds of checkboxes, you may want to consider optimizing the ATE performance either using Batch Operations or perhaps organizing the checkboxes into an XTREE.

See Also

Get Control ID for an example scenario involving the need to query a radio button in order to enable/disable another control.