FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Corrección del menu de sistema (en aplicaciones delphi)
Bueno, hace tiempo que vengo leyendo temas en el foro pero no habia tenido la oportunidad de participar.
He estado buscando una forma de corregir el menu de la barra de tareas de las aplicacioens delphi (agregar tamaño, mover y maximizar) sin encontrar forma sencilla. (si es que estuviese posteado en el foro, pido disculpas). arme este unit que soluciona el problema
basta con hacerle un include desde el formulario principal del proyecto, y en el oncreate del formulario principal llamar la funcion SetFixSystemMenu. Por otro lado, estoy intentando crear ventanas MDI hijas en estado maximizado, hasta el momento no obtengo el efecto exacto que deseo, por lo que si hay alguien mas intereraso, me contacta y trabajamos junto en ese problema. PD: no puse en la parte de trucos porque prefiero que se pruebe primero. |
#2
|
||||
|
||||
He estado probando tu código y no termina de convencerme. El botón en la barra de tareas se comporta de forma extraña:
- nunca queda presionado cuando la aplicación está activa - al minimizar, el formulario principal se iconiza como si se tratase de un formulario secundario - si un formulario secundario se activa, al presionar el botón de la barra, vuelve a activarse el principal, lo que no debe ocurrir. Según leí alguna vez, la razón por la que Delphi no usa un menú "estandar" en el botón de la barra de tareas es porque dicho menú corresponde al menú de sistema, no del formulario principal, sino de la ventana de la aplicación, que es una ventana oculta. Los comandos minimizar y cerrar se aplican a toda la aplicación: minimizar oculta todos los formularios activos y cerrar cierra la aplicación. Pero un comando como maximizar es distinto pues no se maximiza una aplicación, sino uno de sus formularios, y lo mismo el comando mover. El punto es: ¿a qué ventana se tendrían que aplicar esas acciones? ¿a la principal? ¿a la activa? La razón quizá no es muy convincente pues pudieron optar por aplicarlos a una de estas dos ventanas, tal como lo hace tu código. Pero el problema, hasta donde he visto, es que el comportamiento es extraño. Haciendo pruebas, creo que he logrado algo añadiendo items directamente al menú de sistema de la aplicación, por ejemplo:
Esta función inserta un item en el menú de sistema de la ventana identificada por Handle. El parámetro Command es el identificador del comando a ejecutar, que corresponde al parámetro WPARAM del mensaje WM_SYSCOMMAND. No sirve que pasemos directamente un comando como SC_MOVE, precisamente porque la ventana de la aplicación no es la que deseamos mover, sino, por ejemplo, la ventana principal. Entonces debemos pasar un comando personalizado:
Para captar este comando podemos usar el evento OnMessage del objeto Application o de un objeto ApplicationEvents, da lo mismo:
Esto es, traspasamos el comando personalizado SC_MENEAR que llega a la aplicación, al formulario principal como SC_MOVE. Con esto básicamente funciona, pero debemos cuidar otros detalles como el habilitar o inhabilitar el item cuando sea necesario. El comando SC_MENEAR debe inhabiltarse si la aplicación se minimiza o si el formulario principal se maximiza. Y debe habilitarse de vuelta, cuando se restaure la aplicación o el formulario principal. Para empezar, complementamos el evento OnMessage dela aplicación:
donde EnableSysItem es:
Pero también hay que actuar cuando se maximice o restaure el formulario principal. Para ello podemos crear un manejador para el mensaje WM_SYSCOMMAND del formulario:
Adjunto un ejemplo ya hecho al cual le he añadido el comando SC_ESTRUJAR para cambiar de tamaño el formulario principal. Quedaría agregar el comando SC_INFLAR para maximizarlo. El ejecutable que está en el zip sólo correrá si se tiene Delphi 7 instalado. // Saludos |
#3
|
||||
|
||||
Otra forma, mucho más elegante y mucho más completa de alterar el menú de sistema de la aplicación, es usando la componente TTaskbarMenu de Zarco Gajic, que recién descubro.
// Saludos |
#4
|
||||
|
||||
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Una pequeña corrección | Faust | Varios | 1 | 07-07-2006 07:10:39 |
Ayuda en correccion de ejercicios sql | fede7 | SQL | 3 | 21-06-2005 12:46:44 |
Desplegar por código el menú de sistema de una ventana | Jan_polero | API de Windows | 7 | 06-05-2005 12:35:25 |
|