2011-06-07 22 views
6

Aquí está mi problema.Problema con varios cuadros de diálogo modales usando Delphi XE

Tengo la aplicación principal ejecutándose y abro un diálogo1 modal, en este punto la pantalla de la aplicación principal está deshabilitada y todos se enfocan en el nuevo cuadro de diálogo1.

Desde este diálogo1 abro otro cuadro de diálogo modal2. Entonces ahora la pantalla principal y el diálogo1 están deshabilitados y este diálogo2 tiene todo el foco. Perfecto hasta el momento.

Ahora, cuando cierre este cuadro de diálogo superior, esperaría que vuelva al diálogo1. Se centra en el diálogo1, pero ahora la aplicación principal está habilitada y puede hacer clic en cualquier lugar que envíe el cuadro de diálogo1, pero lo deja abierto. Esto causa problemas para el 1% de veces que un usuario no solo cierra el diálogo1 inmediatamente y hace clic en él. Como se puede imaginar, a QA no le gusta esto; o)

Parece que Windows se confunde un poco porque la aplicación principal parece saber que todavía tiene el diálogo abierto mientras el botón de la cinta aún está abajo.

¿Alguna idea?

El mejor que he conseguido hasta ahora es establecer explícitamente:

dialog1.PopupMode := pmExplicit; dialog1.PopupParent := MainFrm;

Esto parece mantener Dialog1 sábana de la aplicación principal cuando se cierra dialog2 incluso si hace clic en la aplicación principal. Entonces eso alentará al usuario a cerrarlo pero no es 100% correcto.

Editar: Desde entonces he creado una aplicación independiente y funciona como se esperaba. A medida que cierras las ventanas, el control y el enfoque van desde dialog2 a dialog1 y luego a la aplicación principal cuando dialog1 está cerca. El sugiere que hay algo más en nuestro código de cinta que no puedo encontrar. Humph!

+2

El sospechoso habitual sería 'Application.ProcessMessages' u otra cosa que inicie un bucle de mensaje paralelo. –

+0

Si no está satisfecho con Delphi TRibbon nativo, eche un vistazo a [Windows Ribbon Framework] de Erik van Bilsen (http://www.bilsen.com/windowsribbon/index.shtml). – menjaraz

+0

Hola. Puede que sea mucho trabajo, pero sugiero que en lugar de ShowMessage() o MessageDlg(), cree un nuevo formulario y muestre el mensaje que desee dentro de ese formulario (incluso puede hacer esto dentro de un método/función que no sea mucho de trabajo :)), haciendo esto puede usar la función Modalresult para manejar formularios específicos de instancia (myForm: = TForm1.Create(); si Myform.ShowModal = MrOk then {call second form etc etc ...}) espero que esto ayuda –

Respuesta

Cuestiones relacionadas