TryMeConditionDialogs.MM |
This is one of the MAKEMSI samples which build a new MSI/MSM. This MSI makes use of these "TryMe.MM" files:
This sample shows how you can create dialogs where the flow is based on conditions as the "Dialog" command creates unconditional links between dialogs.
;---------------------------------------------------------------------------- ; MODULE NAME: TryMeConditionDialogs.MM ; ; $Author: USER "Dennis" $ ; $Revision: 1.2 $ ; $Date: 05 Nov 2008 17:29:24 $ ; $Logfile: C:/DBAREIS/Projects.PVCS/Win32/MakeMsi/TryMeConditionDialogs.MM.pvcs $ ; ; DESCRIPTION ; ~~~~~~~~~~~ ; Unlike the "TryMeWithUserDialog.MM" example, this sample is only ; demonstrating conditional display of dialogs and implements this flow: ; ; ; +---[ DialogB1 ]---+ ; +<<<<<< Back | ; | +>>| Next >>>>>+ ; | | +------------------+ | ; +--[ Licence ]--+ +---[ DialogA ]----+ | | | +--[ Setup ]--+ ; | |<<<<<< Back |<<+ | | | | ; | | | | | +<<<<< Back | ; | Next >>>>>>| Next >>>>>>+ | | | ; | | | |<<+ | | | | ; +---------------+ +------------------+ | | | +-------------+ ; | +>>+---[ DialogB2 ]---+ | ; | | Next >>>>>+ ; +<<<<<< Back | ; +------------------+ ; ; ; As you can see from the above we want to insert 2 new dialogs, the first ; dialog (DialogA) is always displayed and then we wish to follow that with ; either "DialogB1" or "DialogB2". ; ; This example aims to be generic and so it is more complex than any specific ; solution needs to be. For example it handles conditional forwards dialog ; transition although the default msi wizard doesn't use it. I could have hard ; coded the logic for the transition from "DialogA" to "DialogB" but decided ; to keep it generic and demonstrate how the existing values of the "Condition" ; and "Ordering" columns could be read and manipulated. ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;--- Override some MAKEMSI options ------------------------------------------ ;---------------------------------------------------------------------------- #define VER_FILENAME.VER TryMe.Ver ;;I only want one VER file for all samples! #define UISAMPLE_DIALOGS_ID_IN_TITLE.D Y ;;In developer mode add dialogs ID to the titlebar ;---------------------------------------------------------------------------- ;--- Include MAKEMSI support (with my customisations and MSI branding) ------ ;---------------------------------------------------------------------------- #include "ME.MMH" ;---------------------------------------------------------------------------- ;--- Create INSTALLDIR ------------------------------------------------------ ;---------------------------------------------------------------------------- <$DirectoryTree Key="INSTALLDIR" Dir="c:\program files\TryMe (makemsi sample)\<$MAKEMSI_MM_BASENAME>" CHANGE="\" PrimaryFolder="Y"> ;---------------------------------------------------------------------------- ;--- Insert after which dialog? (I never have a "UserRegistrationDlg") ------ ;---------------------------------------------------------------------------- #ifdef REMOVED_LicenseAgreementDlg ;;Only exists if the dialog has been removed... #define InsertAfter WelcomeDlg #else #define InsertAfter LicenseAgreementDlg #endif #define InsertBefore SetupTypeDlg ;-------------------------------------------------------------------------------------- ;--- The first dialog the user will see is UNCONDITIONAL, will decide 2nd user sees --- ;-------------------------------------------------------------------------------------- <$Dialog "DialogA - UNCONDITIONAL" INSERT="<$InsertAfter>-<$InsertBefore>" Dialog="DialogA"> <$Property "SOME" Value="1"> <$DialogEntry Property="SOME" Label="&Show Dlg 1 or 2:" ToolTip="1=Dialog B1, anything else Dialog B2" Max=10 Width=200> <$/Dialog> ;----------------------------------------------------------------------------------------- ;--- The 2nd dialog the user will see is CONDITIONAL (based on "SOME" property's value --- ;----------------------------------------------------------------------------------------- <$Dialog "DialogB1 - CONDITIONAL, got here because SOME = 1" INSERT="!DialogA-<$InsertBefore>" Dialog="DialogB1"> <$/Dialog> <$Dialog "DialogB2 - CONDITIONAL, got here because SOME <> 1" INSERT="!DialogA-<$InsertBefore>" Dialog="DialogB2"> <$/Dialog> ;---------------------------------------------------------------------------- ;--- Now set up the conditional transitions --------------------------------- ;---------------------------------------------------------------------------- #define COND_USE_DIALOG_B1 SOME = 1 #define COND_USE_DIALOG_B2 not (<$COND_USE_DIALOG_B1>) ;;Used "not" to be 100% sure conditions are mutually exclusive <$Table "ControlEvent"> ;--- Correct "Back" Link (on next dialog) first as easiest (will be unconditional) --- <$RowsDelete WHERE="`Dialog_` = '<$InsertBefore>' AND `Control_` = 'Back' AND `Event` = 'NewDialog'"> #( <$Row Dialog_="<$InsertBefore>" Control_="Back" Event="NewDialog" Argument="DialogB1" Condition="<$COND_USE_DIALOG_B1>" > #) #( <$Row Dialog_="<$InsertBefore>" Control_="Back" Event="NewDialog" Argument="DialogB2" Condition="<$COND_USE_DIALOG_B2>" > #) ;--- Correct Next Link (on previous dialog, may have condition!) -------------------------- dim CurrentNextDialogCondition : CurrentNextDialogCondition = "" dim CurrentNextDialogOrdering : CurrentNextDialogOrdering = "" <$Row @Where="`Dialog_` = 'DialogA' AND `Control_` = 'Next' AND `Event` = 'NewDialog'" @OK=^? > 0^ @Code="Y"> ;--- Pick up the current values ------------------------------------ CurrentNextDialogOrdering = <$COLINT.ControlEvent.Ordering> CurrentNextDialogCondition = <$COLSTR.ControlEvent.Condition> ;--- If we picked up a condition, display+log it ------------------- if CurrentNextDialogCondition <> "" and CurrentNextDialogCondition <> "1" then ;--- Wasn't unconditional (need to include as part of OUR condition! --- say "DIALOG '" & <$COLSTR.ControlEvent.Dialog_> & "' had condition : " & CurrentNextDialogCondition end if <$/Row> if CurrentNextDialogCondition = "" then CurrentNextDialogCondition = "1" ;;Unconditional end if if CurrentNextDialogOrdering = "" then CurrentNextDialogOrdering = 9999 ;;Should be big enough... end if <$RowsDelete WHERE="`Dialog_` = 'DialogA' AND `Control_` = 'Next' AND `Event` = 'NewDialog'"> dim NextCondition NextCondition = "<$COND_USE_DIALOG_B1 $$DQX2>" 'Need to double up quotes to produce valid VBS literal if CurrentNextDialogCondition <> "1" then NextCondition = "(" & CurrentNextDialogCondition & ") and (" & NextCondition & ")" end if #( <$Row Dialog_="DialogA" Control_="Next" Event="NewDialog" Argument="DialogB1" *Condition="NextCondition" *Ordering="CurrentNextDialogOrdering" > #) NextCondition = "<$COND_USE_DIALOG_B2 $$DQX2>" 'Need to double up quotes to produce valid VBS literal if CurrentNextDialogCondition <> "1" then NextCondition = "(" & CurrentNextDialogCondition & ") and (" & NextCondition & ")" end if #( <$Row Dialog_="DialogA" Control_="Next" Event="NewDialog" Argument="DialogB2" *Condition="NextCondition" *Ordering="CurrentNextDialogOrdering" > #) <$/Table>