Inno setup Inno设置带有三个按钮和三个结果的MsgBox

Inno setup Inno设置带有三个按钮和三个结果的MsgBox,inno-setup,pascalscript,Inno Setup,Pascalscript,我正在尝试创建一个带有三个按钮和三个结果的MsgBox,但看不到如何创建第三个结果?我目前有以下两个按钮的代码MsgBox,它可以完美地工作: 如果((strExistingInstallPath“”)和(strExistingVersion='2.5.3'),则 开始 如果SuppressibleMsgBox('安装程序检测到安装了'+strMyAppName+'+strExistingVersion+'.+strExistingBuild+'。+#13#10+#13#10+ '在安装或升级到

我正在尝试创建一个带有三个按钮和三个结果的
MsgBox
,但看不到如何创建第三个结果?我目前有以下两个按钮的代码
MsgBox
,它可以完美地工作:

如果((strExistingInstallPath“”)和(strExistingVersion='2.5.3'),则
开始
如果SuppressibleMsgBox('安装程序检测到安装了'+strMyAppName+'+strExistingVersion+'.+strExistingBuild+'。+#13#10+#13#10+
'在安装或升级到'+strMyAppVersion+'.+strMyAppBuild+'.+#13#10+#13#10之前,必须删除现有版本+
'是否希望安装程序卸载现有版本?',
嗯,嗯,是的,是的
开始
Exec(GetUninstallString、“”、SW_SHOW、,
EWAitUnterminated,intResultCode);
结果:=真;
结束其他
开始
MsgBox('必须先删除现有版本。'+#13#10+
“安装程序无法继续。安装程序将立即退出。”,
b错误,b_正常);
结果:=假;
结束;
结束;

如果我将
MB_YESNO
更改为
MB_YESNOCANCEL
,我现在会得到三个按钮,是、否和取消。但是,由于
if
语句被分配给了
MsgBox
,因此我正在努力解决如何执行
else-if-IDCANCEL-then
type语句。我尝试将MsgBox返回的ID常量分配给一个字符串,然后为该字符串创建单独的if语句,使其等于每个ID常量,但这失败得很惨。我错过了什么?理想情况下,我希望将这三个按钮标记为Yes、No和Silent,以便为第三个按钮提供一个
/Silent
参数,以防止出现卸载提示。那么,是否也可以重命名按钮?

您可以编写多个
if
语句,但必须将返回值存储到变量中并检查该变量值。但是正如@Sertac在他的评论中提到的,您可以使用
case
语句,这可以更好地描述代码中的目标,例如:

case SuppressibleMsgBox('Text',mbConfirmation,MB_YESNOCANCEL,idies)的
田园诗:
开始
{用户按“是”}
结束;
识别号:
开始
{用户按了否}
结束;
IDCANCEL:
开始
{用户按了取消}
结束;
结束;
出于好奇,多个
if
语句可能是:

var
MsgResult:整数;
开始
MsgResult:=SuppressibleMsgBox('Text',mbConfirmation,MB_YESNOCANCEL,idies);
如果MsgResult=idies,则
开始
{用户按“是”}
结束
其他的
如果MsgResult=IDNO,则
开始
{用户按了否}
结束
其他的
如果MsgResult=IDCANCEL,则
开始
{用户按了取消}
结束;
结束;

这是最后的代码,以防对其他人有用:

var
intMsgBoxResult:整数;
如果((strExistingInstallPath“”)和(strExistingVersion='2.5.3')),则
开始
intMsgBoxResult:=SuppressibleMsgBox('安装程序检测到安装了'+strMyAppName+'+strExistingVersion+'.+strExistingBuild+'。+#13#10+#13#10+
'在安装或升级到'+strMyAppVersion+'.+strMyAppBuild+'.+#13#10+#13#10之前,必须删除现有版本+
'是否希望安装程序卸载现有版本?',
MB确认,MB_YESNO,IDIGNORE);
如果intMsgBoxResult=idies,则
开始
Exec(GetUninstallString,'/silent','',软件显示,
EWAitUnterminated,intResultCode);
结果:=真;
结束;
如果intMsgBoxResult=IDNO,则
开始
MsgBox('必须先删除现有版本。'+#13#10+
“安装程序无法继续。安装程序将立即退出。”,
b错误,b_正常);
结果:=假;
结束;
如果intMsgBoxResult=IDIGNORE,则
开始
Exec(GetUninstallString、“”、SW_SHOW、,
EWAitUnterminated,intResultCode);
结果:=真;
结束;
结束;

MsgBox返回一个整数,您可以在其返回时使用“case”。这是我的问题。我不知道MsgBox返回了一个整数。ID常量看起来像字符串!谢谢关于if语句的第二个示例正是我之前所做的,但使用的是字符串!现在开始工作时,我意识到它应该是一个整数。您知道是否可以将按钮上的标签从“取消”更改为“静音”吗?在
SuppressibleMsgBox
(和
MsgBox
)函数后面是构建对话框的Windows API函数。该函数从当前选择的语言中获取按钮标题,并且不提供使用自定义标题的方法。但我想是的,但你需要一个带钩子的外部库。为这个做一个自定义表单会更容易。谢谢。然而,我现在实际上已经找到了一个更优雅的解决方案来实现我想要实现的目标,即使当您需要第三个结果时(我希望在命令行中使用/verysilent开关时将其作为默认选项),您实际上也不需要显示第三个按钮。您仍然可以使用MB_YESNO,但请给它一个不同的默认值,例如IDIGNORE,并在静默运行时调用它。这里的情况更好。但是无论如何,现在您总是要测试
intMsgBoxResult
值3次。如果你真的想使用
If
,那么至少要添加
else
(如我所示),因为如果
intMsgBoxResult
值将是
idies
,那么就不需要对
IDNO
IDIGNORE
进行测试。将进行修改,如果您认为这是一种更好的处理方式,可能会转而使用用例。非常感谢您的帮助和建议。