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

StackOverflow https://stackoverflow.com/questions/21749

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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-упорядочения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top