Во-первых, обратите внимание, что простой обходной путь - использовать вместо этого функцию 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.Возможно, этот значок не рекомендуется использовать в последних руководствах по пользовательскому интерфейсу?