Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.01.2024, 21:10
michael2000 michael2000 вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 7
Репутация: 10
По умолчанию Проблемы с 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  
Старый 02.01.2024, 04:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,064
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

может что-то с получением хэндла не то.
Попробуй пока просто как-то так:
Код:
TTaskDialog.Create(self)
Это если в форме.
Если это у тебя библиотечная функция, то попробуй так:
Код:
TTaskDialog.Create(Application.MainForm)
Ответить с цитированием
  #3  
Старый 02.01.2024, 09:38
michael2000 michael2000 вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 7
Репутация: 10
По умолчанию

Не помогло. Тот бред, что у меня используется в параметре конструктора, сделан от безысходности. Так как я так и не смог постигнуть логику ломания системного компонента.
Ответить с цитированием
  #4  
Старый 02.01.2024, 23:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,064
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А на какой винде запускаешь?
Кстати, попробуй пока временно убрать лишние флаги (Dialog.Flags).

В принципе, можно попробовать вызвать эту функцию напрямую, а не через дельфиную обертку. Если напрямую будет так же не работать под отладчиком, то явно что-то не то.

сигнатуру см. тут: https://learn.microsoft.com/en-us/wi...trl-taskdialog
Ответить с цитированием
  #5  
Старый 03.01.2024, 16:30
michael2000 michael2000 вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 7
Репутация: 10
По умолчанию

Смех смехом, но я перенёс эту функцию в более мелкий проект и там всё заработало.
Ответить с цитированием
  #6  
Старый 03.01.2024, 19:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,064
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Хм. Значит что-то не так с твоим проектом.
А проверь, включены ли темы для дебаг сборки?
Ответить с цитированием
  #7  
Старый 03.01.2024, 20:31
michael2000 michael2000 вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 7
Репутация: 10
По умолчанию

Ты имеешь ввиду раздел Project->Options->Application->Apperance?
Если про это, то всё включено.
Ответить с цитированием
  #8  
Старый 03.01.2024, 20:43
michael2000 michael2000 вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо тебе добрый человек, ты натолкнул меня на мысль с темами и я решил проблему. Всё упиралось в настройку манифеста. Заходим в настройки проекта: Project->Options->Application->Manifest и делаем следующие действия: в разделе Manifest File выбираем Auto Generate, в разделе Tags To Include чекам чекбокс, в DPI Awarenes выбираем System Aware и вуаля - всё работает.
Ответить с цитированием
  #9  
Старый 03.01.2024, 22:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,064
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну да. Как я и ожидал.
Собственно, проблема в том, что в зависимости от данных в манифесте, подгружаются разные версии библиотеки comctl32. Если темы не включены, то подгружается старая версия, в которой просто нет соответсвующей функции.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
michael2000 (03.01.2024)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter