Pregunta

Tengo una aplicación Delphi 7 que tiene dos vistas de un documento (p. ej.una edición HTML WYSIWYG puede tener una vista WYSIWYG y una vista fuente (no es mi aplicación real).Se pueden abrir en ventanas separadas o acoplarse a pestañas en la ventana principal.

Si abro un cuadro de diálogo modal desde uno de los formularios separados, el formulario principal pasa al frente y se muestra como la ventana seleccionada en la barra de tareas de Windows.Digamos que el formulario principal es la vista WYSIWYG y aparece la vista de origen.Vas a un punto particular en la vista de origen e insertas una etiqueta de imagen.Aparece un cuadro de diálogo que le permite seleccionar e ingresar las propiedades que desea para la imagen.Si la vista WYSIWYG y la vista de origen se superponen, la vista WYSIWYG pasará al frente y la vista de origen se ocultará.Una vez que se cierra el cuadro de diálogo, la vista de origen vuelve a aparecer.

Intenté configurar el propietario y las propiedades de ParentWindow en el formulario con el que está relacionado:

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

¿Como puedo solucionar este problema?¿Qué más debería intentar?

Dado que la gente parece tropezar con mi ejemplo, tal vez pueda probar con un ejemplo mejor:un editor de texto que te permite tener más de un archivo abierto al mismo tiempo.Los archivos que tiene abiertos están en pestañas (como en el IDE de Delphi) o en su propia ventana.Supongamos que el usuario abre el cuadro de diálogo de revisión ortográfica o el cuadro de diálogo de búsqueda.Lo que sucede es que si el archivo se está editando en su propia ventana, esa ventana se envía debajo del formulario principal en el orden z cuando se muestra el cuadro de diálogo modal;una vez que se cierra el cuadro de diálogo, vuelve a su orden z original.

Nota:Si está utilizando Delphi 7 y busca una solución a este problema, consulte mi respuesta más abajo en la página para ver qué terminé haciendo.

¿Fue útil?

Solución

Yo usaría este código...(Básicamente lo que dijo Lars)

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

Otros consejos

Al final terminé encontrando el respuesta usando Grupos de Google.En pocas palabras, a todos los cuadros de diálogo modales se les debe agregar lo siguiente:


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

Supongo que esto es equivalente a las respuestas de Lars y Marius en Delphi 7.

¿El cuadro de diálogo se muestra usando ShowModal o simplemente Mostrar?Probablemente debería configurar la propiedad PopupMode correctamente en su cuadro de diálogo.pmAuto sería probablemente tu mejor opción.Vea también si necesita configurar la propiedad PopupParent.

En primer lugar, no estoy completamente seguro de haberlo seguido; es posible que deba proporcionar algunos detalles adicionales para ayudarnos a comprender qué está sucediendo y cuál es el problema.Supongo que no estoy seguro de entender exactamente lo que estás tratando de lograr y cuál es el problema.

En segundo lugar, no debería necesitar configurar el padre del diálogo ya que eso es esencialmente lo que sucede con la llamada a Crear (pasando el padre).Para ser honesto, parece que los diálogos que estás describiendo podrían necesitar un poco de "repensamiento".¿Este cuadro de diálogo para ingresar las propiedades de la imagen es secundario de la ventana de origen o de la ventana WYSIWYG?

No estoy seguro de entender bien a qué te refieres, pero aquí hay algunas cosas que puedo sugerirte que pruebes...

  1. Este comportamiento cambia entre diferentes versiones de Delphi.Sugeriría que esto se debe a los obstáculos que superaron para admitir Windows Vista en Delphi 2007.
  2. Si está utilizando Delphi 2007, intente eliminar la línea del archivo fuente del proyecto que establece la variable booleana Application.MainFormOnTaskBar.
  3. Una vez eliminado esto, debería poder utilizar los distintos métodos BringToFront/SendToBack del formulario para lograr el orden Z que busca.

Sospecho que lo que has descubierto se ha discutido en este enlacePor supuesto, es posible que no haya comprendido por completo su punto, así que ¡disculpas de antemano!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top