Подтвердить что ты не робот

"Оставайтесь на вершине" основной формы и модальных диалогов в Delphi XE

В Delphi XE Update 1, Im получает , по-видимому, случайное поведение модальных форм, если родительская (основная) форма FormStyle установлена ​​на fsStayOnTop.

1) С MainFormOnTaskbar: = False (старый способ), все "просто работает". С новым MainFormOnTaskbar: = True модальные формы скрываются за основной формой, когда основная форма настроена на "оставаться на вершине". В большинстве случаев говорят

modalForm.PopupParent := self;

перед вызовом modalForm.ShowModal, похоже, помогает. Но не всегда.

2) Все мои модальные формы просты, без излишеств, расположены в MainFormCenter, не используют наследование формы и т.д. И все же исправление PopupParent работает только около половины из них, а другая половина по-прежнему скрываются за основной формой. Самый странный из всех, в одном случае, упорядочение несвязанных строк кода ломается или делает это. См. Строки, отмеченные (1) и (2) в этом коде:

procedure TEchoMainForm.DBMaintenancePrompt( actions : TMaintenanceActions );
var
  frm : TDBMaintenanceForm;
begin
  frm := TDBMaintenanceForm.Create( self );
  try
    frm.Actions := actions; // (1)
    frm.PopupParent := self; // (2)
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;

При выполнении в этом порядке модальная форма отображается правильно поверх основной формы. Но когда я меняю строки, модальная форма скрывается за основной. Линия, помеченная (1), устанавливает свойство модальной формы, что приводит к тому, что несколько флажков проверяются на unchecked в TRzCheckGroup, сидя на TRZPageControl (из компонентов Raize). Это метод setter, который запускается при выполнении строки (1) выше:

procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions);
var
  ma : TMaintenanceAction;
begin
  for ma := low( ma ) to high( ma ) do
    cgMaintActions.ItemChecked[ ord( ma )] := ( ma in Value );
  end;
end;

Этого достаточно, чтобы модальная форма отображалась за основной формой, если порядок строк (1) и (2) отменен.

Это может указывать на TRzCheckGroup (который обрабатывается при запуске кода setter), но у меня есть две другие формы, которые показывают ту же проблему и не используют TRzCheckGroup (или TRzPageControl). И я не мог воспроизвести проблему с помощью отдельного примера приложения с использованием компонентов Raize. Отключение формы, pagecontrol или TRzCheckGroup на время действия сеттера не влияет.

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

3) Последнее замечание: мои модальные формы довольно просты, поэтому они отображаются практически мгновенно, без видимой задержки. Но когда основной формой является fsStayOnTop, то очень часто я вижу модальное представление формы поверх него, а затем вижу, что он "толкается" позади. Затем, при нажатии Esc, (невидимая) модальная форма отображается сверху основной формы на долю секунды, затем закрывается.

Либо я пропущу что-то, что кажется очевидным в ретроспективе, или это призыв к психической отладке, я не знаю. Любые идеи, пожалуйста?


UPDATE. Ive пытался отследить проблему в другой форме, где это происходит. Он имеет несколько кнопок (Raize) и TSyntaxMemo (расширенный компонент memo от eControl.ru). Эта форма почти не имеет ничего общего с другими формами, которые испытывают проблему. После удаления частей кода и тестирования я теперь могу воспроизвести проблему, внося небольшое изменение в метод, который присваивает строку компоненту memo:

Это мой оригинальный код, который заставляет форму, содержащую редактор, скрываться за основной формой:

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := Value;
end;

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

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := ''; // CRAZY! Problem goes away
end;

Когда я назначаю один символ редактору, форма снова начинает скрываться:

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := 'a'; // Problem is back
end;

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

Я попытался удалить элемент управления записью и добавить его снова (подумайте о создании порядка и т.д.), но это не повлияло. То же самое, если я создаю записку в коде. Форма скрывается, как только непустая строка присваивается свойству Memo Text.

4b9b3361

Ответ 1

У меня была такая же проблема некоторое время назад. Моим решением было добавить Self.BringToFront; в событие OnShow модальной формы.

Ответ 2

Windows не поддерживает многие популярные формы для приложения. И модальная форма по умолчанию самая верхняя. Но у вас есть этот стиль для вашей собственной формы.

Одно решение: удалите верхнюю часть основной формы (нет видимого эффекта), вызовите модальную форму, верните верхний стиль, когда модальный закончен.