I am trying to create a MsgBox
with three buttons and three outcomes, but am unable to see how I can create the third outcome? I currently have the following code for a two button MsgBox
, which works perfectly:
if ((strExistingInstallPath <> '') and (strExistingVersion = '2.5.3')) then
begin
if SuppressibleMsgBox('Setup has detected that ' + strMyAppName + ' ' + strExistingVersion + '.' + strExistingBuild + ' is installed.' + #13#10 + #13#10 +
'The existing version must be removed before installing or upgrading to ' + strMyAppVersion + '.' + strMyAppBuild + '.' + #13#10 + #13#10 +
'Would you like Setup to uninstall the existing version?',
mbConfirmation, MB_YESNO, IDYES) = IDYES then
begin
Exec(GetUninstallString, '', '', SW_SHOW,
ewWaitUntilTerminated, intResultCode);
Result := True;
end else
begin
MsgBox('The existing version must be removed first.' + #13#10 +
'Setup is unable to continue. Setup will now exit.',
mbError, MB_OK);
Result := False;
end;
end;
If I change the MB_YESNO
to MB_YESNOCANCEL
, I now get three buttons, Yes, No and Cancel. However, since the if
statement is assigned to the MsgBox
, I'm struggling to work out how to do an else if IDCANCEL then
type statement. I tried to assign the ID constant returned by the MsgBox to a string and then create separate if statements for the string being equal to each ID constant, but this failed miserably. What am I missing here? Ideally, I would like the three buttons be labelled as Yes, No and Silent, so that the third button can be given a /silent
parameter to prevent the uninstall prompt. So, is it possible to rename the buttons as well?
You could write multiple if
statements, but you'd have to store the returned value into a variable and check that variable value. But as @Sertac mentioned in his comment, you can use a case
statement, which better describes the aim in your code, for instance:
case SuppressibleMsgBox('Text', mbConfirmation, MB_YESNOCANCEL, IDYES) of
IDYES:
begin
{ user pressed Yes }
end;
IDNO:
begin
{ user pressed No }
end;
IDCANCEL:
begin
{ user pressed Cancel }
end;
end;
Out of curiosity with multiple if
statements it could be:
var
MsgResult: Integer;
begin
MsgResult := SuppressibleMsgBox('Text', mbConfirmation, MB_YESNOCANCEL, IDYES);
if MsgResult = IDYES then
begin
{ user pressed Yes }
end
else
if MsgResult = IDNO then
begin
{ user pressed No }
end
else
if MsgResult = IDCANCEL then
begin
{ user pressed Cancel }
end;
end;
Here is the final code in case it is useful for anyone else:
var
intMsgBoxResult: Integer;
if ((strExistingInstallPath <> '') and (strExistingVersion = '2.5.3')) then
begin
intMsgBoxResult := SuppressibleMsgBox('Setup has detected that ' + strMyAppName + ' ' + strExistingVersion + '.' + strExistingBuild + ' is installed.' + #13#10 + #13#10 +
'The existing version must be removed before installing or upgrading to ' + strMyAppVersion + '.' + strMyAppBuild + '.' + #13#10 + #13#10 +
'Would you like Setup to uninstall the existing version?',
mbConfirmation, MB_YESNO, IDIGNORE);
if intMsgBoxResult = IDYES then
begin
Exec(GetUninstallString, '/silent', '', SW_SHOW,
ewWaitUntilTerminated, intResultCode);
Result := True;
end;
if intMsgBoxResult = IDNO then
begin
MsgBox('The existing version must be removed first.' + #13#10 +
'Setup is unable to continue. Setup will now exit.',
mbError, MB_OK);
Result := False;
end;
if intMsgBoxResult = IDIGNORE then
begin
Exec(GetUninstallString, '', '', SW_SHOW,
ewWaitUntilTerminated, intResultCode);
Result := True;
end;
end;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With