MessageDlg показывает значок информации вместо подтверждения
на Win 7 MessageDlg показывает значок информации вместо значка подтверждения (вопросительный знак). Вот код:
MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes
что я делаю не так?
2 ответов
во-первых, обратите внимание, что простым обходным путем является использование Windows API :
MessageBox(Handle, 'This is a test.', 'Test', MB_ICONQUESTION or MB_YESNO)
MessageBox http://privat.rejbrand.se/MessageBoxQMark.png
а почему не MessageDlg работы? Ну,MessageDlg одно из двух возможных вещей. Он использует диалоговое окно задачи Windows Vista+, если это возможно, то есть это ОС 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. Возможно, этот значок не рекомендуется в их последних руководствах по пользовательскому интерфейсу?
Если вам нужны некоторые диалоги, вы можете взглянуть на наш блок SynTaskDialog с открытым исходным кодом для Windows XP, Vista, семь.
он вызовет собственный диалог задач под Vista и Seven и эмулирует его под XP. У вас будет лучшее взаимодействие, чем со стандартным модулем диалоговых окон или Windows API, и будет значок подтверждения, как и ожидалось.
вот результат под Windows Seven 64 бит компьютер:

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

вот диалоговое окно выбора задачи с кнопками "командные ссылки" в native Seven:

и вот окно, как создано с кодом эмуляции VCL:

обратите внимание, что значок подтверждения. ;)
работа с Delphi 6 до КСЕНОН.