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. Немного экспериментов после прочтения документации, однако, окупятся.

Другие вопросы по тегам