Скрыть форму, когда приложение свернуто - PullRequest
7 голосов
/ 09 июня 2011

У меня есть основная форма и форма статуса, которые я отображаю, когда в моем приложении идет работа. Если работа закончена, я просто звоню Hide в форме статуса и форма статуса исчезает.

Моя проблема возникает, когда я минимизирую основную форму, пока форма ожидания видима. Тогда обе формы скрыты, что я и хочу. Однако, если работа завершается, а основная форма свернута, тогда, когда я ее восстанавливаю, форма состояния также восстанавливается, даже если для нее была вызвана Hide, а свернута.

Visible кажется False для формы состояния, когда приложение свернуто, и поэтому вызов Hide, кажется, не имеет никакого эффекта (справка говорит, что просто устанавливает Visible в False).

Правильны ли эти наблюдения? Как восстанавливается видимость формы, когда приложение снова получает фокус? Как я могу скрыть свою форму, пока приложение свернуто?

Ответы [ 3 ]

4 голосов
/ 09 июня 2011

Visible формы отображения действительно ложно, и вызов Hide ничего не делает, когда приложение свернуто, поскольку оно скрыто приложением как часть механизма минимизации.

Кодовые вызовы ShowOwnedPopups с первым «False» в качестве «bShow» во время сворачивания приложения, а затем с «True» в качестве «bShow» во время восстановления приложения.Поскольку функция отображает все окна, которые были скрыты предыдущим вызовом, изменение видимости формы между ними не имеет никакого эффекта.

Теперь посмотрите эту цитату в разделе замечаний документации по функции,

если всплывающее окно скрыто с помощью функции ShowWindow, последующий вызов ShowOwnedPopups с параметром fShow, установленным в значение TRUE, не приводит к отображению окна

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

type
  TForm1 = class(TForm)
  ..
  private
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  ...

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if (Msg.CmdType = SC_MINIMIZE) and Assigned(Form2) and Form2.Visible then
    Form2.Hide;
  inherited;
  if (Msg.CmdType = SC_RESTORE) and Assigned(Form2) and Form2.ShouldBeVisible then
    Form2.Show;
end;
2 голосов
/ 10 июня 2011

Я сейчас использую следующее решение, которое работает для меня:

  1. В Application.OnRestore обработчик события восстановления я вызываю StatusForm.NotifyRestored. Форма состояния явно скрыта, если она не должна быть видимой.
  2. В форме статуса я отслеживаю видимость в логическом поле FShouldDisplay. Это устанавливается в методах ShowStatusForm и HideStatusForm.

procedure TMainForm.OnApplicationRestore(Sender : TObject);
begin
StatusForm.NotifyRestored;
end;

procedure TStatusForm.NotifyRestored;
begin
if not FShouldDisplay then
  ShowWindow(Handle, SW_HIDE);
end;

procedure TStatusForm.ShowStatusForm;
begin
FShouldDisplay := True;
Show;
end;

procedure TStatusForm.HideStatusForm;
begin
FShouldDisplay := False;
Hide;
end;
2 голосов
/ 09 июня 2011

Предупреждение: Я не уверен на 100%, что следующий подход безопасен.

Если вам не требуется, чтобы один и тот же объект формы оставался живым в течение всего срока службы приложения (что, скорее всего, вам не нужно), то вы можете попытаться отключить автоматическое создание всплывающей формы (Project / Options) а затем создать и показать его по

Application.CreateForm(TForm2, Form2);
Form2.Show;

и затем освободите его

Form2.Release;

Таким образом, форму невозможно восстановить вместе с основной формой.

...