Несколько приложений 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?
Я не уверен, что понимаю, к чему вы клоните, но вот несколько вещей, которые я могу предложить, вы можете попробовать...
- Это поведение меняется между различными версиями Delphi. Я бы предположил, что это связано с тем, что они перепрыгнули через поддержку Windows Vista в Delphi 2007.
- Если вы используете Delphi 2007, попробуйте удалить строку из исходного файла проекта, в которой установлена логическая переменная Application.MainFormOnTaskBar.
- С этим удалением вы сможете использовать различные методы формы BringToFront / SendToBack для достижения желаемого Z-порядка.
Я подозреваю, что то, что вы обнаружили, обсуждалось по этой ссылке. Конечно, я, возможно, только что полностью упустил вашу мысль, поэтому заранее извиняюсь!