Несколько приложений Delphi и диалоговых окон - PullRequest
4 голосов
/ 22 августа 2008

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

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 22 августа 2008

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

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();
3 голосов
/ 27 августа 2008

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

1 голос
/ 22 августа 2008

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

0 голосов
/ 22 августа 2008

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

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

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

0 голосов
/ 22 августа 2008

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

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

...