问题
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?
回答1:
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;
回答2:
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;
来源:https://stackoverflow.com/questions/25515610/inno-setup-msgbox-with-three-buttons-and-three-outcomes