Почему диалоговое окно отображается за основной формой? - PullRequest
0 голосов
/ 18 марта 2011

Ранее сегодня я пошел, чтобы открыть файл в написанном мною приложении Delphi.По какой-то причине соединение с сетью файла было прервано - причины неважны - и Windows создала диалоговое окно, предупреждающее меня о проблеме.Однако основная форма моего приложения находилась поверх вновь созданного диалогового окна (то есть была форма для моего приложения, для диалогового окна «Открытие файла» и для диалогового окна с предупреждением).Диалог предупреждения был модальным и скрыт за основной формой.Очевидно, у меня была проблема.

Есть идеи, что происходит, или как я могу решить проблему?Свойство position основной формы установлено в poDesigned, и я сохраняю / загружаю позицию формы при закрытии / запуске, я слишком новичок, чтобы даже знать, какая информация поможет вам диагностировать проблему.Чтобы было ясно, однако, проблема была , а не диалог открытия файла - который отображался там, где он должен был отображаться - проблема была в диалоговом окне предупреждения.

Спасибо, как всегда -

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Вы можете остановить это, используя SetErrorMode перед попыткой открыть файл на сетевом ресурсе:

var
  OldErrorMode: Integer;
begin
  OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
  try
    if OpenDialog1.Execute then
    begin
      // ....
    end;
  finally
    SetErrorMode(OldErrorMode);
  end;
end;

Более поздние версии Delphi (IIRC, D2007 и выше) добавили перегруженныйверсия TOpenDialog.Execute, которая принимает дескриптор окна в качестве параметра;это устанавливает родительский элемент TOpenDialog и предотвращает появление OpenDialog (и любого генерируемого им окна ошибок) за главным окном.

ПРИМЕЧАНИЕ. Вы можете перейти в фоновый диалог (из Windows), используя Alt + Tab для циклического переключения между ними.пока ваше приложение не вернется;обычно это приводит к тому, что скрытый диалог перенаправляется поверх вашей формы.

2 голосов
/ 18 марта 2011

Я не понимаю, почему Windows создает диалог в вашем приложении. Какой вызов API привел к этому? Обычные файловые операции не показывают пользовательский интерфейс.

Скорее всего, вы использовали функцию API, которая может отображать пользовательский интерфейс, возможно, из API оболочки. Любая функция, которая может показать модальное диалоговое окно, запросит владельца HWND.

Например, рассмотрим MessageBox(), функция, которую вы знаете, покажет модальное диалоговое окно в вашем приложении. Его первый параметр называется hWnd и задокументирован

Дескриптор окна владельца окно сообщения, которое будет создано. Если это параметр NULL, окно сообщения имеет нет окна владельца.

У Раймонда Чена есть целая серия статей о модальности, объясняющих, почему это важно.

У меня есть догадка, что вы вызываете какую-то функцию Win32 API, которая показывает модальный интерфейс, и неправильно устанавливаете владельца HWND. Конечно, я могу ошибаться, но больше информации нет.

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