Inno Setup MsgBox с тремя кнопками и тремя результатами

Я пытаюсь создать MsgBox с тремя кнопками и тремя результатами, но я не могу понять, как я могу создать третий результат? В настоящее время у меня есть следующий код для двух кнопок MsgBox, который отлично работает:

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;

Если я изменю MB_YESNO в MB_YESNOCANCEL Теперь я получаю три кнопки: Да, Нет и Отмена. Тем не менее, так как if заявление присваивается MsgBox Я изо всех сил пытаюсь понять, как сделать else if IDCANCEL then Тип заявления. Я попытался присвоить константе ID, возвращаемой MsgBox, строку, а затем создать отдельные операторы if для строки, равные каждой константе ID, но это с треском провалилось. Что мне здесь не хватает? В идеале я хотел бы, чтобы три кнопки были помечены как Да, Нет и Без звука, чтобы третьей кнопке можно было присвоить /silent параметр, чтобы предотвратить приглашение удаления. Итак, возможно ли переименовать кнопки?

2 ответа

Решение

Вы могли бы написать несколько if операторы, но вам нужно будет сохранить возвращаемое значение в переменной и проверить значение этой переменной. Но, как упомянул @Sertac в своем комментарии, вы можете использовать case утверждение, которое лучше описывает цель в вашем коде, например:

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;

Из любопытства с несколькими if Заявления это могут быть:

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;

Вот окончательный код на случай, если он пригодится кому-либо еще:

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;
Другие вопросы по тегам