CtrlGetSubCommand Example

InstallShield 2015 ยป InstallScript Language Reference

Note: To call this function in a Basic MSI setup, you must first create a custom action for the entry-point function, execute the custom action in a sequence or as the result of a dialog's control event, and then build the release.

/*--------------------------------------------------------------*\

*

* InstallShield Example Script

*

* Demonstrates the CtrlGetSubCommand function.

*

* This example script displays a list of program groups in

* the list box of a custom dialog.  It then responds to events

* from the edit box and list box as follows:

*

* Single-click in list box:  Selected item is put into edit box.

*

* Double-click in list box:  Double-clicked item is stored for

*                            later display and dialog is closed.

*

* Change in edit box value:  The default system sound is played.

*

* The "custom" dialog used in this script is actually the

* InstallShield Sd dialog that is displayed by the built-in

* function SdSelectFolder.  Because this dialog is stored in

* the file _isres.dll, which is already compressed in

* the installation, it can be used in a script as a custom

* dialog.

*

\*--------------------------------------------------------------*/

 

// Dialog and control IDs.

#define RES_DIALOG_ID        12008    // ID of custom dialog

#define RES_PBUT_NEXT            1    // ID of Next button

#define RES_PBUT_CANCEL          9    // ID of Cancel button

#define RES_PBUT_BACK           12    // ID of Back button

#define RES_DIALOG_EDITBOX     301    // ID of edit box

#define RES_DIALOG_LISTBOX     401    // ID of list box

 

// Include Ifx.h for built-in InstallScript function prototypes.

#include "Ifx.h"

 

    export prototype ExFn_CtrlGetSubCommand(HWND);

 

function ExFn_CtrlGetSubCommand(hMSI)

    STRING szDialogName, svSelection;

    NUMBER nResult, nCmdValue, nSubCommand;

    BOOL   bDone, bSelected;

    HWND   hwndDlg;

begin

 

    // Specify a name to identify the custom dialog in this installation.

    szDialogName = "CustomDialog";

 

    // Define the dialog.  Pass a null string in the second parameter

    // to get the dialog from _isuser.dll or _isres.dll.  Pass a null

    // string in the third parameter because the dialog is identified

    // by its ID in the fourth parameter.

    nResult = EzDefineDialog (szDialogName, "", "", RES_DIALOG_ID);

 

    if (nResult < 0) then

        // Report an error; then terminate.

        MessageBox ("Error in defining dialog", SEVERE);

        abort;

    endif;

 

    // Initialize indicators used to control the while loop

    // and indicate whether an item was selected.

    bDone = FALSE;

    bSelected = FALSE;

 

    // Loop until done.

    repeat

 

        // Display the dialog and return the next dialog event.

        nCmdValue = WaitOnDialog (szDialogName);

 

        // Respond to the event.

        switch (nCmdValue)

            case DLG_CLOSE:

                // The user clicked the window's Close button.

                Do (EXIT);

            case DLG_ERR:

                MessageBox ("Unable to display dialog. Setup canceled.", SEVERE);

                abort;

            case DLG_INIT:

                // Initialize the back, next, and cancel button enable/disable states

                // for this dialog and replace %P, %VS, %VI with

                // IFX_PRODUCT_DISPLAY_NAME, IFX_PRODUCT_DISPLAY_VERSION, and

                // IFX_INSTALLED_DISPLAY_VERSION, respectively, on control IDs 700-724 and 202.

                hwndDlg = CmdGetHwndDlg(szDialogName);

                SdGeneralInit(szDialogName, hwndDlg, 0, "");

 

                // Place a list of folders into the dialog's list box.

                if (CtrlPGroups (szDialogName, RES_DIALOG_LISTBOX) < 0) then

                    MessageBox ("CtrlPGroups failed.", SEVERE);

                endif;

            case RES_DIALOG_LISTBOX:

                // Get the event.

                nSubCommand = CtrlGetSubCommand (szDialogName);

 

                if (nSubCommand = LISTBOX_SELECT) then

                    // Single-click:  Put the selected item in the edit box.

                    CtrlGetCurSel (szDialogName, RES_DIALOG_LISTBOX, svSelection );

                    CtrlSetText (szDialogName, RES_DIALOG_EDITBOX, svSelection );

                elseif (nSubCommand = LISTBOX_ENTER) then

                    // Double-click:  Get the selected item and set

                    // indicator to exit.

                    CtrlGetCurSel (szDialogName, RES_DIALOG_LISTBOX, svSelection );

                    bSelected = TRUE;

                    bDone = TRUE;

                endif;

            case RES_DIALOG_EDITBOX:

                // Get the event.

                nSubCommand = CtrlGetSubCommand (szDialogName);

 

                // Play default system sound if the edit box contents have changed.

                if (nSubCommand = EDITBOX_CHANGE) then

                    MessageBeep (0);

                endif;

            case RES_PBUT_CANCEL:

                // The user clicked the Cancel button.

                Do (EXIT);

            case RES_PBUT_NEXT:

                // Get the current selection from the edit box.

                CtrlGetText (szDialogName, RES_DIALOG_EDITBOX, svSelection );

                bSelected = TRUE;

                bDone = TRUE;

            case RES_PBUT_BACK:

                bDone = TRUE;

        endswitch;

 

    until bDone;

 

    // Close the dialog.

    EndDialog (szDialogName);

 

    // Free the dialog from memory.

    ReleaseDialog (szDialogName);

 

    if bSelected then

        // Display the name of the selected folder.

        MessageBox ("You selected " + svSelection +".",INFORMATION);

    endif;

 

end;