Несколько приложений Delphi и диалоговых окон

У меня есть приложение Delphi 7, у которого есть два представления документа (например, редактирование WYSIWYG HTML может иметь представление WYSIWYG и представление источника - не мое настоящее приложение). Их можно открыть в отдельных окнах или закрепить на вкладках в главном окне.

Если я открою модальное диалоговое окно из одной из отдельных форм, основная форма переносится на передний план и отображается как выбранное окно на панели задач Windows. Скажем, основной формой является представление WYSIWYG, а исходное представление выскакивает. Вы переходите к определенной точке в исходном представлении и вставляете тег изображения. Появится диалоговое окно, позволяющее вам выбрать и ввести свойства, которые вы хотите для изображения. Если вид WYSIWYG и вид источника перекрываются, вид WYSIWYG будет переведен вперед, а вид источника скрыт. Как только диалог закрывается, исходный вид возвращается в поле зрения.

Я попытался установить владельца и свойства ParentWindow в форме, с которой он связан:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

Как я могу исправить эту проблему? Что еще я должен пытаться?

Учитывая, что люди, кажется, спотыкаются о моем примере, возможно, я могу попробовать лучший пример: текстовый редактор, который позволяет вам открывать более одного файла одновременно. Файлы, которые вы открываете, находятся либо во вкладках (как в Delphi IDE), либо в своем собственном окне. Предположим, что пользователь вызывает диалог проверки правописания или диалог поиска. Что происходит, так это то, что, если файл редактируется в своем собственном окне, это окно отправляется ниже основной формы в z-порядке, когда отображается модальное диалоговое окно; как только диалоговое окно закрыто, оно возвращается в исходный z-порядок.

Примечание. Если вы используете Delphi 7 и ищете решение этой проблемы, см. Мой ответ ниже на странице, чтобы узнать, что я в итоге сделал.

5 ответов

Решение

Я бы использовал этот код... (в основном то, что сказал Ларс)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

В конечном итоге я нашел ответ с помощью групп Google. Короче говоря, все модальные диалоги должны иметь следующее добавленное к ним:


procedure TDialogForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_POPUP;
  Params.WndParent := (Owner as TWinControl).Handle;
end;

Я предполагаю, что это эквивалентно ответам Ларса и Мариуса в Delphi 7.

Отображается ли диалог с использованием ShowModal или просто Show? Вам, вероятно, следует установить правильное свойство PopupMode в вашем диалоге. pmAuto, вероятно, ваш лучший выбор. Также посмотрите, нужно ли вам установить свойство PopupParent.

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

Во-вторых, вам не нужно устанавливать родителя диалога, так как это, по сути, то, что происходит с вызовом Create (передача родителя). Диалоги, которые вы описываете, звучат так, как будто они могут немного переосмыслить, если честно. Является ли этот диалог для ввода свойств изображения дочерним по отношению к исходному окну или окну WYSIWYG?

Я не уверен, что понимаю, к чему вы клоните, но вот несколько вещей, которые я могу предложить, вы можете попробовать...

  1. Это поведение меняется между различными версиями Delphi. Я бы предположил, что это связано с тем, что они перепрыгнули через поддержку Windows Vista в Delphi 2007.
  2. Если вы используете Delphi 2007, попробуйте удалить строку из исходного файла проекта, в которой установлена ​​логическая переменная Application.MainFormOnTaskBar.
  3. С этим удалением вы сможете использовать различные методы формы BringToFront / SendToBack для достижения желаемого Z-порядка.

Я подозреваю, что то, что вы обнаружили, обсуждалось по этой ссылке. Конечно, я, возможно, только что полностью упустил вашу мысль, поэтому заранее извиняюсь!

Другие вопросы по тегам