Множественные приложения и диалоговые окна 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 и ищете решение этой проблемы, посмотрите мой ответ ниже на странице, чтобы узнать, чем я закончил.


person garethm    schedule 22.08.2008    source источник


Ответы (5)


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

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();
person Marius    schedule 22.08.2008
comment
Это только что решило для меня давнюю проблему. Спасибо. - person J__; 10.07.2014

В конце концов я нашел answer с помощью групп 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.

person garethm    schedule 27.08.2008

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

person Lars Truijens    schedule 22.08.2008

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

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

person Ryan Farley    schedule 22.08.2008

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

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

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

person Andrew    schedule 22.08.2008