2009-01-21 15 views
10

Tengo una aplicación donde hay un formulario de fondo principal, desde allí el usuario puede solo formularios no modales que mantienen diferentes partes del sistema. Las formas no modales reemplaza el método CreateParams por lo que cada uno muestra un botón en la barra de tareas de inicio:Delphi, ¿es posible hacer una forma modal a una forma primaria específica solo?

procedure TfmMaterialsPlanning.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    //create a new window on the task bar when this form is created 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
end; 

En efecto, un usuario puede abrir una forma no modal que mantiene 'Manzanas', otro no modal formulario que mantiene 'Naranjas', y utiliza la barra de menú de inicio para cambiar fácilmente entre los dos.

Sin embargo, si abren un formulario modal del formulario 'Manzanas', p. para establecer opciones, preferencias, etc., entonces no pueden usar los formularios 'Naranjas' hasta que cierren el formulario modal.

¿Es posible hacer un formulario modal modal a la forma principal solamente? Entonces, si abren el formulario de opciones de Apple, ¿no pueden usar el formulario de mantenimiento de Manzanas, pero aún pueden usar el formulario de mantenimiento de Naranjas?

Gracias

Respuesta

0

¿no podría conseguir el mismo efecto mediante la prevención de la forma "manzanas" de aceptar el enfoque mientras que su formulario secundario está abierto?

-2

Esto es posible si crea cada formulario no modal en su propio hilo. Cada formulario modal bloqueará el hilo al que pertenece.

Editar: Esto debería ser posible, aunque el vcl no es seguro para subprocesos. Por favor, eche un vistazo a Alexeys explanation de cómo se puede hacer esto:

Así que si usted tiene un conjunto de formularios que deben vivir en un hilo separado y luego colocarlos en una DLL, compilarlo sin paquetes y usar! Funcionará y será seguro para subprocesos.

+0

Imposible de usar cuando se usa el VCL, solo se puede utilizar desde un hilo al hacer cosas con la GUI. – mghie

+0

Es cierto, pero cada DLL tiene su propia copia de la VCL completa y su propio objeto Application. IMO esto es apenas mejor que ir con ejecutables distintos en primer lugar. – mghie

+0

No sé por qué Robo quiere las cosas como él las describe. Él pregunta si es posible, y yo digo que sí. Usted dice que no, digo que está equivocado ... – Vegar

6

Si usted tiene un vistazo al código fuente de TCustomForm.ShowModal(), verá que la VCL no utiliza la llamada API de Windows para mostrar cuadros de diálogo modales, sino que lo hace en lugar de desactivar todas las demás formas de la aplicación mientras se muestra el formulario modal. Por supuesto, puede intentar lo mismo, simplemente muestre() el cuadro de diálogo de forma modal, luego deshabilite el elemento principal y vuelva a habilitarlo después de que se haya cerrado el cuadro de diálogo de forma modal. Es necesario que haya un lugar central en el que realice un seguimiento de los diálogos de formularios modales, los formularios que deben volver a habilitarse, etc. Sin embargo, debe probar minuciosamente si el código realmente hace lo que quiere que haga, incluso al alternar entre las aplicaciones, al minimizar la aplicación, etc.

Habiendo dicho eso, no creo que esta sea una buena idea en absoluto. Rompe todas las suposiciones que hace un usuario de Windows sobre el comportamiento de las aplicaciones. A diferencia de Mac OS X, no existe distinción en Windows entre los diálogos de modalidad de aplicación y de forma modal, y debe ajustarse al comportamiento consistente con la plataforma contra la que está programando.

Probablemente haya una mejor manera de estructurar su IU. Eche un vistazo a la página relevante para dialog boxes en las "Pautas de interacción de la experiencia del usuario de Windows". Los diálogos modales se evitan tanto como sea posible, las pautas vinculadas muestran mejores alternativas para muchos casos de uso. Si limita el uso de cuadros de diálogo modales, tal vez ya no necesite los cuadros de diálogo de forma modal.

+1

Si el usuario tiene dos botones en la barra de tareas, está perfectamente dentro de las pautas de la interfaz de usuario que un cuadro de diálogo modal mostrado por una de esas dos ventanas no bloquea la otra ventana. El hecho de que los dos botones de la barra de tareas estén alojados por el mismo proceso es irrelevante para el usuario. De hecho, diría que un diálogo modal que bloquea ambas ventanas es inapropiado. De todos modos, Daniel se vincula a una solución que funciona. –

0

Como un lado (aunque sería un montón de trabajo), otro enfoque de este problema es la forma en que el cromo de Google fue, donde cada "pestaña" es un proceso separado pero aparece para el usuario como un solo integrado solicitud.

Aunque este enfoque lograría lo que quería, tendría que estar de acuerdo con el comentario anterior de que esto rompería las suposiciones y expectativas del usuario sobre el comportamiento modal.

3

Esta entrada no tiene un buen truco para acomplish sus necesidades: http://blogs.teamb.com/deepakshenoy/2006/08/21/26864

El resumen es para volver a activar la ventana no modal que quiere cuando una ventana modal deshabilitado ella.

+0

¡Funciona muy bien! Probablemente sea una buena idea agregar alguna lógica extra para que el formulario no envíe 'WM_REENABLED' a sí mismo cuando muestra un cuadro de diálogo modal propio. –

Cuestiones relacionadas