Ventanas Modales


Como te prometí en el capitulo anterior, vamos a tratar los cuadros de mensajes personalizados y, además, te enseñaré a crear un cuadro "Acerca de". ¿Preguntas que es un cuadro Acerca de?, pues en el clásico cuadro que muestra los créditos de un programa, es donde aparece en nombre del programador, o la compañía de Software que lo hizo, además de todo lo que se te pueda ocurrir. Normalmente se muestra cuando pulsas la opción Acerca De en un menú, de ahí su nombre. Para ser sincero, realmente creo que su nombre técnico no es ese, pero yo siempre me he referido a ellos así.

Primero vamos con los cuadros de mensajes personalizados. Pon un botón en un formulario vacío. En la propiedad Caption del Boton pongo algo significativo, algo así como Cuadro. Ahora abre el menú File del Delphi y selecciona New Form. Observa que ahora tenemos dos formularios, Form1 y Form2, en el primero has colocado el botón, el segundo nos servirá para crear nuestro cuadro personalizado. Selecciona el Form2, ya que vamos a trabajar un poco con él. En la propiedad Caption pon el nombre del cuadro, por ejemplo "mi cuadro". En la propiedadborderStyle selecciona bsDialog, aparentemente al seleccionar esta propiedad no cambia nada en el formulario, pero no te preocupes que cuando ejecutes el programa verás el efecto que tiene. Si tienes mucha prisa por verlo puedes probar el programa, pero antes vuelve al formulario principal (form1) y pulsa dos veces sobre el botón que colocaste anteriormente, y dentro de su manejador Onclick escribe esta linea de código: Form2.Showmodal; Si ejecutas ahora el programa, recibiras un error que dice algo así como que no se conoce form2. Lo que ocurre es que estas tratando de mostrar un formulario él, cual esta definido en otra unidad. ¿Qué es eso de unidad?, bueno tengo que explicarte un par de cosas sobre la programación en Delphi, que por ahora he omitido, tranquilo que son sencillas.

En Delphi cada formulario que hay tiene asociado una unidad (unit), que es donde esta toda la información sobre ese formulario, y los componentes que él hay, así como es donde se escribe el código que interactua con los componentes para que el programa funcione como nosotros queremos. El formulario Form1 tiene asociado la unit1, que es donde has escrito el código hasta ahora. Echa un vistazo al Unit1, veras un montón de cosas que te sonarán a chino, pero sí té fijas la primera línea dice que lo que estás viendo en un unidad (unit), que se llama unit1. Cuidado no se te ocurra tocar el nombre que le ha puesto Delphi, aunque pienses que es ortéra o poco significativo no se te ocurra tocarlo porque sino Delphi no sabrá como se llama la unidad. La manera de cambiar el nombre es grabar el fichero. Así que en menú File selecciona Save, y cuando Delphi te pida el nombre le pones el que te guste. Hay un viejo refrán que dice algo así como "al Cesar lo que es del Cesar", así que lo que haga el Delphi no se te ocurra cambiarlo.

Luego viene la cláusula uses, lo que hayan programado en Pascal pues ya saben lo que es. Para los programadores de C diré que es el equivalente al termino Include. Y para los nuevos comento que es donde se indica al compilador los ficheros que contienen información referente a ciertos temas. Por ejemplo Forms, incluye la información de cómo construir los formularios. Esto tiene sentido si te plantes lo siguiente: Para construir un formulario hace falta muchos datos y siempre son los mismos, pues sería pesado tener que escribirlo de nuevo cada vez que haces un formulario, pues la solución es poner esa información en un fichero e indicarle al compilador que en ese fichero encontrará información necesaria para la compilación del programa.

Más adelante encuentras la declaración del Formulario, pero eso es tema de la programación orienta al objeto y como estamos empezando no te lío. Simplemente, por ahora, ten cuenta que está ahí, es muy importante y Delphi se encarga, de nuevo, del trabajo sucio, así que no te toques. Luego esta la Implementación (implementation), que es "nuestro terreno". Después de esta línea que esta en negrita es donde debes indicar si usas otras unidades. Esto es, el caso que nos ocupa, mostrar otro formulario. Ahí debes escribir lo siguiente: Uses unit2; Para así indicar que quieres "usar" la unit2 desde ese formulario.

Si usas el Delphi 2.0 o superior, al compilar el proyecto dice que el Form1 hace referencia al Form2, el cual esta declarado en la unit 2, y que no haces referencia a él en la lista de "uses", y si quieres añadirlo. Lo que ocurre aquí es que Delphi 2.0 es un poco más listo que su "hermano pequeño" el Delphi 1.0. Y nos esta dando la opción de que él añada la línea anterior por nosotros. Si pulsas Yes (que es lo que debes hacer) vuelve a compilar el programa y pruébalo.

Observa que el segundo formulario sale descentrado, aunque ha quedado con el mismo aspecto, en líneas generales, que un cuadro. Sal del programa primero cerrando el cuadro, y luego el formulario. Fíjate que se comporta de forma Modal, es decir, que hasta que no cierras el cuadro no te deja tocar la ventana principal, eso es debido que lo hemos invocado con la ordenShowmodal. La solución a que una ventana salga descentrada está en su propiedad Position, si seleccionas poScreenCenter, ya esta solucionado, ya que la ventana se centrará en tu pantalla al ser mostrada.

Ahora viene la parte artística del tema de hoy. Coloca una etiqueta en el formulario, y pon el texto siguiente en su propiedad Caption: "Este es mi cuadro de mensajes". Ahora en la barra de controles señala la pestaña que pone Additional, y ahora escoge el primer control por la izquierda, se llama BitBtn. Coloca un par de estos botones en el formulario Form2. Los botones BitBtn tiene una propiedad que se llama Kind, que determina aspecto del mismo, por defecto estos están en bkCustom. Estos botones tienen, además, otra propiedad que es Glyph. Esta propiedad permite colocar en el botón un bitmap o un icono. Estas dos propiedades que te acabo de comentar están relacionadas, ya que cuando Kind está en bkCustom el programador es él que decide que texto aparece en la propiedad Caption, y que dibujo muestra el botón. Quizás estarás pensando, o tratando de recordar como era el formato de los botones de cancelar, o los de Si, pues deja de comerte la cabeza porque si despliegas las opciones de la propiedad Kind verás que tienes diversos formatos predefìnidos. Para un botón selecciona el formato BkYes, y para el otro BkNo. Al hacer esto observa que Delphi retoca ciertas propiedades del botón, una de ellas es la propiedad Glyph, para colocar el icono apropiado, la otra es la propiedad Caption, donde pone el texto del botón, y una tercera es la propiedad ModalResult. Pero vamos por partes, el botón que pone No, está perfecto, pero el otro esta en inglés. Tranquilo puedes retocar su propiedad Caption, poner Si, que para eso hablamos Español. También puedes cambiar el icono de posición respecto al texto que muestra el botón, la posición esta controlada por la propiedad Layout.

Te acuerdas de los cuadros de mensajes predefínidos, por windows, que según el botón que pulsaras, este devolvía un valor, pues la propiedad ModalResult, determina que valor va devolver ese botón. Hay varios valores, desde MrNone (el botón no devuelve nada, entonces no cierra el cuadro modal), hasta MrRetry, pasando porMrYes, MrNo, y otros. Échale una mirada a las posibilidades, de todos modos Delphi según el tipo de botón que has seleccionado en la propiedad Kind, ya ha ajustado los valores por omisión. Puedes crear el botón desde cero, pero esta manera es un atajo para crear un botón standard con ciertos toques de personalización y sin mucho esfuerzo.

Por ahora los controles que hemos visto y que muestran un texto, lo hacen con la misma letra, y quizás no te guste. La solución esta en manipular la propiedad Font de estos. Hay dos maneras, fíjate que de lado de la palabra Font, hay una cruz, esto indica que esta propiedad tiene subpropiedades, pulsa sobre la cruz dos veces, y verás aparecer más propiedades, y la última es Style, que también tiene subpropiedades. Esta manera es una forma rápida de retocar alguna propiedad, pero más cómodo seria por un cuadro de dialogo de fuentes, como el que tienen los procesadores de texto. Esto es posible si pulsas sobre el campo de la propiedad Font, y luego sobre el botón que tiene puntos suspensivos que aparecen a la derecha de (Tfont).

Quizás estés pensando en que no estaría de más que todos los controles que muestran texto y estén en el mismo formulario tengan el mismo tipo de letra. La solución "chapucera" es armarse de moral y retocar todos los controles, pero lo mejor es seleccionar la propiedad Font del Formulario, y poner la letra que nos guste, y después fijarnos que todos los controles que pongamos en el formulario tenga su propiedad ParentFont en true, por lo que "heredarán" la fuente del formulario que los contiene. Si quieres que un control tenga otro tipo de letra, pues desactiva esta opción de este control y pon es su propiedad Font lo que desees.

Bueno llega el momento de probar, el programa. Antes escribe el procedimiento Onclick del botón que pusiste en el form1 lo siguiente:
If form2.showmodal = mrYes Then
showmessage ('has pulsado el Si')
Else
showmessage ('Has pulsado el No');
Ahora ejecuta el programa y pruebalo. Ya has construido tu cuadro de mensaje personalizado. Puedes poner los botones que desees, y lo que quieras en el cuadro.

Bueno, ahora vamos con los cuadros Acerca de. En principio se construyen igual que los anteriores, o sea, las propiedades del formulario que va a contener el cuadro Acerca de, son las mismas. La diferencia estriba en que suelen llevar solo un botón y por lo cual nos da igual que botón se pulse. Así que en un formulario nuevo pon unas etiquetas con el texto que más te guste, pon un botón, puede ser un BitBtn, o uno normal, y de la paleta Additional selecciona el componente Image, es ese que parece que tiene un cuadro pintado en su interior. Pon uno de esto donde más te guste, ya que nos servirá para poner una imagen en su interior, y darle un toque de distinción a nuestro cuadro. La propiedad Picture determina que dibujo va a mostrar el componente. También son interesantes las propiedades Centre, Autosize, y Stretch. La primera determina si la imagen se centrará en el área que ocupa el componente, la segunda si el componente tratará de tomar el tamaño de la imagen, y la tercera determina si la imagen se ajusta al tamaño del componente (se reduce). Este componente puede mostrar tanto iconos como bitmaps, pero los iconos no pueden cambiar su tamaño, lo que implica que debe ser el componente el que cambie su tamaño. Selecciona la propiedad Picture, y carga un icono o bitmap para colocar en el componente, y adornar tu aplicación.

Ahora coloca un botón para invocar el cuadro Acerca de, y en su manejar OnClick por la línea de que muestre el formulario de manera Modal. ¿Qué no sabes como?, pues igual que toda ventana hija de buen vecino: NombreFormulario.ShowModal;

Bueno, si quieres puedes coger el código fuente de este tema y echarle una mirada. Por cierto has visto esos cuadros Acerca De, que dicen el sistema operativo, el nombre al que esta registrado Windows, pues son muy fáciles de hacer, ya que Windows no da una función que lo hace solo. Para ver este cuadro tienes que añadir en la cláusula uses del principio un nuevo fichero de datos, que se llama ShellApi, que es donde están especificadas muchas de las funciones de Windows. Ahora pon un botón para invocar el cuadro, y dentro del manejador Onclick pon esto:
ShellAbout (Handle,'Cursillo de Delphi','(c) Blue Boy',Application.Icon.Handle);
El primer parámetro es el identificador de nuestra aplicación que Windows asigna dinámicamente cada vez que se ejecuta la aplicación. El segundo es el primer texto, tercer parámetro es en segundo texto. Y el último es el icono de nuestra aplicación. Si este último lo cambias por un valor nulo (el cero) se mostrará el icono del sistema operativo que usas, Windows 95 o NT. ¡OJO! Que este truco solo vale para Windows 95 o NT y Delphi 2.0 o superior

Bueno como siempre práctica con lo aprendido, en la próxima entrega ya haremos un programita que sirva para algo el cual iremos complicando, y acuerdate del sponsor, si aun no has pulsado, con un vez llega por visita.