|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблемы с TTaskDialog
В какой-то момент времени решил в проекте заменить стандартные MessageDlg на более продвинутые TTaskDialog. И всё бы хорошо, но столкнулся со странной проблемой - когда программа скомпилирована с отладчиком, то окна TTaskDialog не выводятся на экран. А когда программа скомпилирована без отладчика, то всё нормально вызывается.
Вот такой функцией вызывается TTaskDialog: Код:
function ShowRussianMessageDialog(const DlgCaption: string; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; const Title: String = ''): Integer; var S: string; Dialog: TTaskDialog; begin if Trim(DlgCaption) = '' then case DlgType of mtWarning: S := 'Предупреждение'; mtError: S := 'Ошибка'; mtInformation: S := 'Информация'; mtConfirmation: S := 'Подтверждение'; mtCustom: S := ''; end else S := DlgCaption; Dialog := TTaskDialog.Create(FindControl(Application.ActiveFormHandle)); try Dialog.Caption := S; Dialog.Text := Msg; Dialog.Title := Title; Dialog.Flags := Dialog.Flags + [tfPositionRelativeToWindow]; {$IFDEF VER340} Dialog.Flags := Dialog.Flags + [tfSizeToContent]; {$ENDIF} case DlgType of TMsgDlgType.mtWarning: Dialog.MainIcon := tdiWarning; TMsgDlgType.mtError: Dialog.MainIcon := tdiError; TMsgDlgType.mtInformation: Dialog.MainIcon := tdiInformation; TMsgDlgType.mtConfirmation: Dialog.MainIcon := tdiShield; end; Dialog.CommonButtons := []; if mbOk in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbOk]; if mbYes in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbYes]; if mbNo in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbNo]; if mbCancel in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbCancel]; if mbRetry in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbRetry]; if mbClose in Buttons then Dialog.CommonButtons := Dialog.CommonButtons + [tcbClose]; Dialog.Execute; Result := Dialog.ModalResult; finally Dialog.Free; end; end; |
#2
|
|||
|
|||
может что-то с получением хэндла не то.
Попробуй пока просто как-то так: Код:
TTaskDialog.Create(self) Если это у тебя библиотечная функция, то попробуй так: Код:
TTaskDialog.Create(Application.MainForm) |
#3
|
|||
|
|||
Не помогло. Тот бред, что у меня используется в параметре конструктора, сделан от безысходности. Так как я так и не смог постигнуть логику ломания системного компонента.
|
#4
|
|||
|
|||
А на какой винде запускаешь?
Кстати, попробуй пока временно убрать лишние флаги (Dialog.Flags). В принципе, можно попробовать вызвать эту функцию напрямую, а не через дельфиную обертку. Если напрямую будет так же не работать под отладчиком, то явно что-то не то. сигнатуру см. тут: https://learn.microsoft.com/en-us/wi...trl-taskdialog |
#5
|
|||
|
|||
Смех смехом, но я перенёс эту функцию в более мелкий проект и там всё заработало.
|
#6
|
|||
|
|||
Хм. Значит что-то не так с твоим проектом.
А проверь, включены ли темы для дебаг сборки? |
#7
|
|||
|
|||
Ты имеешь ввиду раздел Project->Options->Application->Apperance?
Если про это, то всё включено. |
#8
|
|||
|
|||
Спасибо тебе добрый человек, ты натолкнул меня на мысль с темами и я решил проблему. Всё упиралось в настройку манифеста. Заходим в настройки проекта: Project->Options->Application->Manifest и делаем следующие действия: в разделе Manifest File выбираем Auto Generate, в разделе Tags To Include чекам чекбокс, в DPI Awarenes выбираем System Aware и вуаля - всё работает.
|
#9
|
|||
|
|||
Ну да. Как я и ожидал.
Собственно, проблема в том, что в зависимости от данных в манифесте, подгружаются разные версии библиотеки comctl32. Если темы не включены, то подгружается старая версия, в которой просто нет соответсвующей функции. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
michael2000 (03.01.2024)
|