Delphi MainFormOnTaskBar Модальная ошибка Windows
ПРИВЕТ
Я использую Delphi 2007 и установил для свойства MainFormOnTaskBar значение true.
Проблема, которая у меня возникла, заключается в следующем.
Если вы откроете дочернее окно из главной формы, а затем отобразите диалоговое окно сообщения из только что открытого дочернего окна. Когда вы закрываете диалоговое окно сообщения, а затем закрываете дочернее окно, основная форма будет отправлена на заднюю часть любого другого приложения, имеющегося на экране.
Это происходит под Windows Vista и Windows 7. Кто-нибудь знает, почему это происходит и как я могу это исправить?
3 ответа
Я исправил это двумя способами.
Во-первых, добавив stdcall в конец DoFindWindow в Forms.pas, как описано Андреасом Хаусладеном. Это обрабатывается, когда дочерняя форма скрыта (CloseAction = caHide) вместо освобождения при закрытии формы.
Во-вторых - скопировал код из TCustomForm.CMShowingChanged, который вызывает FindTopMostWindow, а затем активирует окно, которое было возвращено в TCustomForm.CMRelease.
(Изменить: блок кода должен иметь отступ в 4 пробела)
procedure TCustomForm.CMRelease;
var
NewActiveWindow: LongInt;
begin
if Application.MainFormOnTaskbar then
begin
NewActiveWindow := 0;
if (GetActiveWindow = Handle) and not IsIconic(Handle) then
begin
NewActiveWindow := FindTopMostWindow(Handle);
end;
if NewActiveWindow <> 0 then
begin
SetActiveWindow(NewActiveWindow);
end;
end;
Free;
end;
Это, кажется, сделало это, я продолжу тестирование, чтобы убедиться.
Я думаю, что это будет QC66892-Закрытие форм деактивирует приложение, которое, как представляется, было исправлено в Delphi 2009 согласно отчету. В нижней части отчета о контроле качества вы найдете комментарий Andreas Hausladen, включающий ссылку на его исправление ошибки. Но вы бы действительно хотели использовать его VCL Fix Pack, который также включает в себя множество других исправлений.
Свойства PopupMode и PopupParent были добавлены специально в TForm для решения этой проблемы. Прежде чем показывать дочернюю форму, установите ее PopupParent на основную форму, а PopupMode - pmAuto.
PopupParent особенно влияет на Z-порядок окон, когда отображаются другие окна.
Справка Delphi 2007 содержит некоторую документацию по этим двум свойствам, но вам нужно пройти через TForm, чтобы получить к ним доступ. Используйте "TForm,Pop" в качестве темы поиска (без кавычек, очевидно), чтобы попасть туда. Документы немного запутывают в PopupParent, потому что в нем обсуждается влияние, которое PopupMode оказывает на автоматическое назначение PopupParent. Немного экспериментов после прочтения документации, однако, окупятся.