Сведения о вопросе

LiKIY

01:13, 14th August, 2020

Теги

delphi   delphi-7    

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

Просмотров: 438   Ответов: 5

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

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

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

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

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

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

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



  Сведения об ответе

ITSME

19:56, 9th August, 2020

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

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


  Сведения об ответе

KOMP

00:39, 5th August, 2020

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


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

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


  Сведения об ответе

PAGE

08:32, 2nd August, 2020

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


  Сведения об ответе

LIZA

05:42, 2nd August, 2020

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

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


  Сведения об ответе

prince

07:12, 6th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться