Как я могу переместить форму Delphi перед другой? - PullRequest
5 голосов
/ 01 ноября 2011

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

Как правило, у меня есть список заданий в дочерней форме основной формы с соответствующими деталями, указанными в основной форме.Другие детали могут управляться с помощью ShowModal.

В настоящее время проблема заключается в том, что пользователи недавно обратились с просьбой о перетаскивании основной формы перед списком заданий.

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

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

Ответы [ 2 ]

6 голосов
/ 02 ноября 2011

Примечание : В остальной части этого ответа терминология владение принимает значение, используемое документацией Windows .Это отличается от значения того же термина в VCL.

То, что происходит, заключается в том, что ваше окно списка заданий является окном верхнего уровня.

Принадлежность накладывает несколько ограниченийв окне.

  • Собственное окно всегда находится над своим владельцем в z-порядке.
  • Система автоматически уничтожает собственное окно, когда его владелец уничтожается.
  • Окно, находящееся в собственности, скрыто, когда его владелец свернут.

Если вы хотите, чтобы окно списка вакансий могло находиться под главным окном в z-порядке, его нельзяпринадлежит главному окну.Это можно сделать следующим образом:

class TJobListForm = class(...)
protected
  procedure CreateParams(var Params: TCreateParams); override;
...
procedure TJobListForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := Application.Handle;
end;

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

procedure TJobListForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;

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

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

2 голосов
/ 01 ноября 2011

Пока форма списка заданий не является дочерней по отношению к какому-либо другому окну (т. Е. Его свойство Parent не установлено и его метод CreateParams() не переопределен для установки поля TCreateParams.WndParent), и онотображается с использованием метода Show() вместо метода ShowModal(), тогда пользователь должен иметь возможность свободно переключаться между двумя окнами по желанию.

...