Delphi - переопределение скрытого поведения TForm.showModal

В настоящее время я пишу оконную систему для существующего приложения Delphi.

В настоящее время программа состоит из ряда полноразмерных форм, которые показаны модально в том порядке, в котором они требуются, и ни одна из которых не может быть перемещена пользователем. Моя цель - сделать все эти формы подвижными. Раньше формы накладывались друг на друга, но поскольку ни одну из них нельзя было переместить, фоновые формы не были видны пользователю. Мое решение до сих пор заключалось в том, чтобы скрыть «родительскую» форму при открытии нового дочернего элемента и повторно показать его, когда этот дочерний элемент закрыт.

К сожалению, поскольку каждый дочерний элемент вызывается с помощью showModal, вызов сделать родительскую форму видимой не происходит до тех пор, пока модальный процесс не будет завершен и, следовательно, после того, как дочерняя форма была скрыта, поэтому пользователь видит мигающую долю секунды, в которой нет формы. видно.

Есть ли способ предотвратить автоматическое скрытие модальных форм после завершения их процесса? Это позволило бы мне вручную скрыть их, когда родительская форма снова станет видимой. Я попытался запланировать это в событии FormHide каждой дочерней формы, но это не работает, поскольку дочерняя форма также скрывается при открытии одного из своих собственных дочерних элементов.

РЕДАКТИРОВАТЬ:

Вот что я до сих пор основывал на приведенном ниже совете Реми

procedure openModalChild(child: TForm; parent: TForm);
var
  WindowList: Pointer;
  SaveFocusCount: Integer;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
  Result: integer;
begin
  CancelDrag;
  with child do begin
  Application.ModalStarted;
  try
  ActiveWindow := GetActiveWindow;
  WindowList := DisableTaskWindows(0);
  //set the window to fullscreen if required
  setScreenMode(child);
  try
    Show; //show the child form
    try
      SendMessage(Handle, CM_ACTIVATE, 0, 0);
      ModalResult := 0;
      repeat
        Application.HandleMessage;
        //if Forms.Application.FTerminate then ModalResult := mrCancel else
          if ModalResult <> 0 then closeModal(child as TCustomForm);
      until ModalResult <> 0;
      Result := ModalResult;
      SendMessage(Handle, CM_DEACTIVATE, 0, 0);
      if GetActiveWindow <> Handle then ActiveWindow := 0;
    finally
      parent.Show;
      Hide;
    end;
  finally
    EnableTaskWindows(WindowList);
    parent.Show; //reshow the parent form
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
  end;
  finally
    Application.ModalFinished;
  end;
  end;
end;

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

5
задан jmc 21 December 2011 в 07:46
поделиться