Основная форма и модальные диалоги «Оставаться на вершине» в Delphi XE

В Delphi XE Update 1 я получаю , казалось бы, случайное поведение модальных форм , если родительская (основная) форма 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;

При выполнении в этом порядке модальная форма отображается правильно поверх основной формы. Но когда я переворачиваю строки, модальная форма прячется за main. Строка, отмеченная (1), устанавливает свойство модальной формы, в результате чего несколько флажков проверяются на снятом флажке в TRzCheckGroup, сидящем на TRzPageControl (из компонентов Raize).Это метод установки, который запускается при выполнении указанной выше строки (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 (которым манипулируют при запуске кода установщика), но у меня есть две другие формы, которые показывают ту же проблему и не используют TRzCheckGroup (или TRzPageControl). И я не смог воспроизвести проблему с помощью отдельного примера приложения, использующего компоненты Raize. Отключение формы, элемента управления страницей или TRzCheckGroup на время действия установщика не имеет никакого эффекта.

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

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

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


ОБНОВЛЕНИЕ . Я попытался отследить проблему в другой форме, где она возникает. В нем есть несколько кнопок (Raize) и TSyntaxMemo (расширенный компонент заметок от eControl.ru). Эта форма почти не имеет ничего общего с другими формами, в которых возникает проблема.После удаления частей кода и тестирования я теперь могу воспроизвести проблему, сделав небольшое изменение в методе, который присваивает строку компоненту памятки:

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

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;

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

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

10
задан That1Guy 13 November 2015 в 21:09
поделиться