MessageDlg показывает значок информации вместо подтверждения - PullRequest
9 голосов
/ 14 июня 2011

На Win 7 MessageDlg показывает значок информации вместо значка подтверждения (вопросительный знак). Вот код:

MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes

Что я делаю не так?

Ответы [ 2 ]

18 голосов
/ 14 июня 2011

Во-первых, обратите внимание, что простой обходной путь - использовать вместо этого функцию Windows API MessageBox:

MessageBox(Handle, 'This is a test.', 'Test', MB_ICONQUESTION or MB_YESNO)

MessageBox http://privat.rejbrand.se/MessageBoxQMark.png

Но почему не работает MessageDlg?Ну, MessageDlg делает одну из двух возможных вещей.Он использует Windows Vista + Task Dialog, если это возможно, то есть, если это ОС Windows Vista или более поздние and темы включены and * Глобальная переменная UseLatestCommonDialogs true (по умолчанию).Если нет, VCL фактически создает пользовательский TForm и добавляет все кнопки, метки и значки вручную (что немного странно, если вы спросите меня - почему бы просто не использовать MessageBox?).

Последний подход поддерживает значок вопросительного знака.В самом деле, попробуйте

UseLatestCommonDialogs := false;
MessageDlg('This is a test', mtConfirmation, [mbYes, mbNo], 0);

MessageDlg http://privat.rejbrand.se/MessageDlgQMark.png

Но это выглядит так ужасно !Пожалуйста, не делай этого! глупо создавать собственное диалоговое окно сообщения вместо использования собственных диалоговых окон ОС!

К сожалению, однако, диалоговое окно задач не поддерживает значок вопросительного знака ( как предопределенный значок ).Это не ограничение оболочки TTaskDialog, а ограничение API диалога задач Windows.См., Например, официальную документацию .Есть TD_ERROR_ICON, TD_WARNING_ICON и TD_INFORMATION_ICON, но без значка вопросительного знака.

Конечно, в диалоге задач можно использовать любой значок .Например, вы можете сделать

if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then
    with TTaskDialog.Create(Self) do
      try
        Caption := 'Test';
        Title := 'Test';
        Text := 'This is a test.';
        CommonButtons := [tcbYes, tcbNo];
        CustomMainIcon.ReleaseHandle;
        CustomMainIcon.Handle := LoadIcon(0, IDI_QUESTION);
        Flags := [tfUseHiconMain];
        Execute;
      finally
        Free;
      end
  else
    MessageBox(Handle,
               'This is a test.',
               'Test',
               MB_ICONQUESTION or MB_YESNO);

Обратите внимание, что я обращаюсь к старому MessageBox, если API диалога задач не доступен.

Диалог задач http://privat.rejbrand.se/TaskDialogQMark.png

В принципе, функция MessageDlg может использовать дополнительную логику для раздельного обращения со знаком вопроса, что отличается от информации, предупреждений и ошибок.Это позволило бы mtConfirmation дать правильный значок даже с помощью диалога задач, за счет немного более сложного и менее элегантного кода VCL.Однако, очевидно, Embarcadero выбрал более простую альтернативу - просто притвориться, что вы просили значок информации.

Тем не менее, мне интересно, почему Microsoft решила не включать константу TD_QUESTION_ICON в API.Возможно, этот значок не рекомендуется использовать в последних руководствах по пользовательскому интерфейсу?

2 голосов
/ 14 июня 2011

Если вам нужны диалоги, вы можете взглянуть на наш SynTaskDialog с открытым исходным кодом для Windows XP, Vista, Seven.

Он вызовет диалог родных задач в Vista и Seven и будет эмулировать его в XP. Вы будете лучше взаимодействовать, чем со стандартным модулем Dialogs или Windows API, и у вас будет значок подтверждения, как и ожидалось.

Вот результат под 64-битным компьютером Windows Seven:

Windows Seven

А вот тот же диалог, созданный из нашего эмулированного чистого кода Delphi:

from Delphi code

Вот диалог выбора задачи, с кнопками «Командные ссылки», в родной семерке:

Windows Seven

А вот окно, созданное с помощью кода эмуляции VCL:

from Delphi code

Обратите внимание, что есть значок подтверждения. ;)

Работа от Delphi 6 до XE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...