2008-08-22 2 views
4

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

Если я открываю модальное диалоговое окно из одной из отдельных форм, основная форма выводится на передний план и отображается как выбранное окно на панели задач 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(); 
+0

Это просто решил для меня давнюю проблему. Спасибо. – 2014-07-10 11:08:52

0

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

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

1

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

0

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

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

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

3

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


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

Я предполагаю, что это делает эквивалент Lars' и Мариус ответы в Delphi 7.