Delphi paso a paso (III): Controles (I) Propiedades de los menús
Transcripción
Delphi paso a paso (III): Controles (I) Propiedades de los menús
Delphi paso a paso (III): Controles (I) Por Vladimir Algara Debido a un desliz lamentable en la entrega anterior, además, ni siquiera puedo culpar a otro pues lo cometí yo, dejé de comentar la forma que tiene Delphi de implementar los menús locales a una ventana/control. Esos menús que aparecen cuando pinchamos con el botón derecho del ratón (izquierdo en los zurdos) y que tan de moda ha puesto Windows 95. En esta entrega, y antes de empezar a mover controles de arriba a abajo, dedicaré unas líneas a la forma de crear menús locales y que, de haberme percatado en su momento, debieran haber aparecido en el monográfico de menús del mes pasado. Ustedes sabrán disculparme. Propiedades de los menús locales En la figura 1 vemos un ejemplo del menú en el editor de menús y el aspecto que adquiere la ventana de propiedades (o ventana del inspector de objetos) de dicho menú. Como recordará el lector, los menús se elegían en la paleta de herramientas estándar y se ubicaban en cualquier parte de la ventana; si hacíamos doble clic en este elemento entrábamos en el editor de menús, donde el inspector de objetos recogía las características y eventos posibles que un determinado ítem (o todo el menú) podía entender y ejecutar. Una vez terminada la fase de diseño, y gracias al nombre simbólico (Name) dado al menú, asociábamos éste a la ventana. El proceso para los menús locales no es similar al de los menús generales, es idéntico; así que no haré perder más tiempo en explicar cómo operar, y me limitaré a poner un sencillo ejemplo. Figura 1: Ejemplo de menú local Ejemplo de menú local para salir de una aplicación 1.- Selecciónese el icono conveniente en la paleta de herramientas (ver figura 2) 1 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Figura 2: Icono de la paleta de herramientas 2.- Ubíquese a discreción en la ventana elegida. 3.- Edítese y comiéncese a añadir ítems y subítems entre 1 y 200 (o más). Añadir uno cuyo evento OnClick (en Events) se llame Salir. 4.- Púlsese [Intro] para entrar en el editor de código fuente y poder especificar Close según se aprecia en el fuente 1. // --- Fuente 1 ---------------------------------------------------------procedure TForm1.Salir(Sender: TObject); begin Close; end; 5.- Hágase clic en la ventana para poder manipular su inspector de objetos. 6.- Selecciónese la entrada PopUpMenu y asóciesele el PopUp creado. 7.- Ejecútese a fuego rápido la "aplicación". 8.- Sírvase pulsar el botón derecho del ratón sobre la ventana y elegir el ítem encargado de acabar. De nuevo, disculpas por el parche mal ubicado y dedicado a menús locales. Aunque, bien pensado, podría haber recurrido a la coartada de explicarlo como un control más, pues eso, precisamente, es lo que es. Controles varios Los controles por excelencia son los PushButton. Estos botones son los encargados de lanzar los procesos, cerrar las ventanas secundarias, abrir otras, dar conformidad a los datos, etc.; motivo principal por el que están presentes en casi cualquier aplicación, por sencilla que ésta sea. Los iconos que en la paleta de herramientas (no seleccionado y seleccionado) representan a los botones "normales" (los llamo así en contraposición a los botones con un gráfico en su interior) son los de la figura 3. Figura 3: Iconos para botones Una vez seleccionados se llevan a la ventana y allí pasamos a darles especificidades. Nota: Hay que recordar que cada vez que se pincha alguno de los elementos en la paleta de herramientas y se lleva a la ventana, éste se deselecciona automáticamente, debiendo pinchar sobre el control deseado tantas veces como controles se quieran poner. Esto se soluciona si, en 2 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS vez de pinchar directamente, pinchamos manteniendo pulsado [Shift]. El icono, al contrario de lo que ocurría con anterioridad, permanecerá hundido hasta que no lo pinchemos nuevamente, lo hagamos en otro distinto, o sobre el icono que representa al cursor del ratón (presente en cualquier pestaña de la paleta de herramientas). El nombre (Name) dado a un control de tipo botón, así como su literal inicial es Button1, Button2, etc., si bien éstos se pueden rebautizar como nos venga en gana mediante sus propiedades Name y Caption, respectivamente, en la ventana del inspector de objetos. Un control puede ser Marcado, Copiado/Cortado y Pegado hacia y desde el portapapeles. Todo ellos con la secuencia de teclas habituales en la que [Ctrl-C] copia, [Ctrl-X] corta y [Ctrl-V] pega. Además, la barra de herramientas se puede configurar (opción Configure de su menú local) y agregarle aquellos iconos que se necesiten, entre los cuales se encuentran los que manipulan la información del portapapeles mencionada. En la figura 4 se puede ver una barra de herramientas configurada, que ofrece un aspecto distinto al ofrecido cuando arrancamos Delphi por primera vez. Figura 4: Configuración de la barra de herramientas Movilidad de controles En este subapartado quiero contar, someramente, qué tipo de operaciones se pueden realizar con los controles que se añaden a una ventana; entendidas éstas como la posibilidad de mover, redimensionar, borrar, alinear, etc. los controles disponibles. Para ello podemos partir de una ventana que albergará tres botones, del mismo tamaño que uno de ellos, alineados respecto del primero y colocados en la esquina inferior derecha de una ventana según una rejilla (grid) de referencia cuyos puntos equidistan 6 píxels entre sí. Gráficamente se puede comprender mejor. Se quiere partir de una ventana como la de la figura 5 y se quiere llegar a la de la figura 6. Figura 5: Controles descolocados 3 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Figura 6: Controles colocados según Grid Para esta maniobra habremos de: 1.- Elegir un Grid para la ventana. Accedemos a la opción Options del menú Tools. En la ventana de diálogo que aparece marcaremos los CheckBox correspondientes a Display Grid y Snap To Grid (el primero visualiza la rejilla, el segundo fuerza que los elementos se adapten a su contorno -dése cuenta que podemos tener un Grid que sirva de referencia, pero, al tiempo, permitir que los controles no se constriñan a él-) y se fijará la separación entre los puntos horizontales y verticales (6 para ambos). 2.- Elegir el botón de referencia. Por ejemplo nos puede servir el Botón 1, lo pinchamos y lo hacemos tan grande como queramos. 3.- Amoldar el tamaño del resto de los botones al de referencia. Para ello se seleccionan todos los botones, bien marcando un área en cuyo interior se encuentren todos los controles deseados, bien eligiéndolos uno a uno mientras se mantiene presionada la tecla [Shift]. Se pincha con el botón derecho del ratón sobre la ventana y se elige la opción Size...; aparecerá una ventana en la que se permite: 1.2.3.4.- No realizar cambios Reducir todos los tamaños adaptándolos al del más pequeño Ampliar todos los tamaños adaptándolos al del más grande Fijar una dimensión Cualquiera de esas operaciones se puede aplicar al redimensionamiento a lo ancho o a lo alto del control. Si nos fijamos, no se puede especificar que todos los controles se adecúen al mismo tamaño del "mediano", sino al del más grande o al del más pequeño; pero esto es suficiente para contemplar todo los casos, pues lo habitual es elegir un conjunto de controles (con su tamaño por defecto), manipular uno haciéndolo más grande o más pequeño, y adaptar el resto. 4.- Alinear los botones. Esta operación se puede llevar a cabo por medio del la opción Aling... del menú local a la ventana, o haciendo aparecer la ventana de diálogo de la figura 7. A través del menú local aparecerá una ventana de diálogo con la misma lógica que la que aparecía cuando intentábamos ajustar el tamaño (Size...), en la que se permite: 1.2.3.4.5.6.- No realizar cambios Alinear a la izquierda y/o arriba Centrar Alinear a la derecha y/o abajo Espaciar idénticamente los controles Centrar en la ventana 4 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Todo ello según dos criterios, uno hacerlo horizontal y/o verticalmente, y el otro hacerlo respecto a un control de referencia. La forma que tiene Delphi de determinar cuál es el control de referencia consiste en la manera en que son elegidos dichos controles. Por ejemplo, cuando elijamos los tres controles de nuestro ejemplo, aquél que se pinche en primer lugar será el que sirva de referencia. A través de las distintas opciones de la ventana, que se aprecia en la figura 7 (a la que se accede tras elegir la opción Alignment Palette del menú View), se pueden hacer las mismas cosas que con la ventana de diálogo recién comentada. Figura 7: Controles colocados según Grid Un control, cómo no, se puede borrar sin más que seleccionarlo y pulsar la tecla [Supr]. Además, se puede ensayar cualquiera de las opciones que aparecen en el menú local, algunas de las cuales hemos repasado hace un momento. - Aling To Grig: Forzar a que los controles se ciñan a la rejilla visualizada. - Bring To Front: Traer delante el control elegido. Cuando dos o más controles ocupan un área común (por ejemplo un RadioButton dentro de un GroupBox) se permite fijar cuál se encontrará por encima de cuál. - Send To Back: Llevar detrás (la explicación es análoga a la de arriba). - Aling...: Ya comentada - Size...: Ya comentada - Scale...: Fijar un tamaño proporcional según el tamaño actual del control. Un valor de 100 equivale al mismo tamaño, un valor inferior a 100 (hasta un mínimo del 25%) provoca la disminución proporcional del tamaño actual del control y un valor superior (hasta un 400%) un aumento proporcionado. Este escalado es aplicable, no solo a un control específico, sino a un conjunto de ellos previamente seleccionados. - Tab Order... y Creation Order...: Se permite fijar la prioridad de los elementos visuales y no visuales de una ventana, con el fin de que en ejecución unos tengan preferencia sobre otros. - Add To Repository: Añadir la ventana recién configurada a la relación de las ventanas por defecto. - View as Text: Una ventana lleva asociado un código fuente encargado de ponerla en marcha. Dicho código se permite hojearlo mediante esta opción. Dada la correspondencia entre lo que se ve en la ventana y su código fuente, como el contenido del código fuente y lo que éste genera, cualquier modificación en uno conllevará la actualización del otro, y viceversa. Cuando se está inspeccionando el código fuente, habrá que volver a pulsar el botón derecho del ratón y elegir la opción View as Form (o pulsar [Ctrl-F12]) para volver a disponer de la ventana original. Propiedades de los botones 5 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Como elemento añadido, decir que no hay por qué conformarse con el tamaño que el editor le da por defecto a los botones para luego redimensionar, sino basta con pinchar en la ventana y, sin soltar, arrastrar el ratón hasta conseguir el tamaño deseado, soltar, y, acto seguido, disponer de un botón con las proporciones perfiladas. Las propiedades y eventos que un control tiene se pueden consultar y alterar en el inspector de objetos. los controles poseen propiedades comunes (como Caption, Name, Left, Hint, etc.), aunque hay otras que son particulares para cada uno. En este apartado se verán las propiedades comunes y particulares de los controles de tipo botón, con el objetivo de que las comunes queden zanjadas para ulteriores explicaciones. Someramente, y según aparecen en el inspector de objetos, son: - Cancel. Permite ejecutar el código asociado al botón cuando se pulsa la tecla [Esc]. Suele ser habitual asociarla al botón de cerrar la ventana; de esa forma pulsando [Esc] se da la impresión de abandono de la ventana actual para ir a la anterior. Esta propiedad es particular de los controles de tipo botón y se ha de poner a True cuando queramos activarla y False en caso contrario. - Caption. Contenido del control. Es el literal que se visualiza y al que podemos añadir el carácter & para convertir en acceso rápido la tecla que lo precede. &Aceptar se traduciría en el botón como Aceptar, lo cual permitiría pulsar la tecla A para que la acción asociada al botón se ejecutara. - Cursor. Aspecto que adoptará el cursor del ratón cuando lo paseemos sobre el control. El tipo de cursor puede ser definido por el usuario, pero lo más rápido es asignarle alguno de los predefinidos (definidos por medio de identificadores, tal y como se ve en la figura 8). Figura 8: Cursores predefinidos - Default. Permite ejecutar el código asociado al botón cuando se pulsa la tecla [Intro]. Suele ser habitual asociarla al botón de cerrar la ventana; de esa forma pulsando [Intro] se da la impresión de acceder de la ventana actual para ir a la siguiente. Esta propiedad es particular de los controles de tipo botón y se ha de poner a True cuando queramos activarla y False en caso contrario. - DragCursor. Aspecto del cursor cuando se pasea el puntero sobre el control si se está pinchando y arrastrando (Drag&Drop) elementos entre ventanas de una aplicación y/o entre 6 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS aplicaciones Windows. - DragMode. Forma en la que se va a controlar la técnica de arrastrar y soltar. Admite dos valores: automático y manual. - Enabled. Determina el estado habilitado o inhabilitado (color gris y no accesible) de un control. - Font. tipo de letra, tamaño, color etc. del literal que aparecerá en el control. - Heigth y Width. Alto y ancho, en píxels, del control. - HelpContext. Ayuda asociada al control - Hint y ShowHint. Literal del tip (etiqueta) que se mostrará cuando paremos el puntero del ratón sobre el control. Cuando ShowHint está a true el Hint se muestra, si no, no. - Left y Top. Coordenadas izquierda y superior que el control ocupa en la ventana. - ModalResult. Valor devuelto por el control cuando se pulsa. - Name. Nombre de control. Este nombre simbólico es el que se usa a lo largo de toda la aplicación para modificar propiedades del control en tiempo de ejecución. Boton1.Enabled := true; - PopUpMenu. Menú local asociado al control. Se trata de un menú particular del control que aparece cada vez que pulsamos el botón izquierdo del ratón sobre el control específico, y no en otra parte. - TabOrder. Secuencia en que se desplaza el foco al pulsar tabulador en la ventana. Delphi mantiene un orden secuencial a medida que se van añadiendo controles a la ventana. Este orden empieza en 0 y se va incrementando de 1 en 1, pero es modificable por el diseñador de dicha ventana. - TabStop. Habilita o no que la pulsación del tabulador tenga efecto sobre el control. - Tag. Número identificativo del control. - Visible. Hace desaparecer el control de la ventana, o no. Eventos posibles, o procedimientos que se llaman cada vez que... - OnClick: ...se pulsa un botón. - OnDragDrop, OnDragOver, OnEndDrag, OnStartDrag: ...se realiza una operación de arrastrar y soltar (Drag&Drop) - OnEnter: ...un control pasa de estar inactivo a estar activo. - OnExit: ...el foco abandona el control en curso. - OnKeyDown, OnKeyPress, nKeyUp: ...se presiona, se mantiene pulsada o se suelta una tecla. 7 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS - OnMouseDown, OnMouseMove, OnMouseUp: ...se presiona el botón del ratón, se mueve el puntero o se suelta el botón del ratón. Tanto las propiedades como los eventos se pueden asociar masivamente a un conjunto de controles. Para ello seleccionamos aquéllos que se desean alterar, y se cambia alguna de sus propiedades. Por ejemplo si queremos que todos los botones tengan el literal "Botón", modificaríamos la propiedad Caption de todos los que estuvieran seleccionados; seguidamente habrá que ir añadiendo 1, 2, 3, etc. para cada uno de ellos, pero no Botón 1, Botón 2, etc. Operaciones como poner el mismo Name a una colección de controles no están permitidas, pues el nombre es unívoco. Propiedades de los textos Para ver que muchas de las propiedades y muchos de los eventos son comunes entre controles, echemos un vistazo al inspector de objetos correspondiente a un texto (ver figura 9) Figura 9: Propiedades de un control de texto Como se puede ver, algunas nuevas respecto a los botones, pero también muchas comunes. Entre las nuevas cabe destacar las encargadas de alinear el texto, bien respecto a sus dimensiones, bien respecto a la ventana, tamaños y aspectos del literal escrito, si se tiene en cuenta o no el símbolo &, etc. Por otra parte, entre los eventos, aparece como nuevo OnDblClick, que se invoca cuando se hace doble clic sobre el texto implicado; pero no aparecen los relacionados con perder o ganar el foco (pues no se puede dar el foco a un texto) o pulsar y levantar una tecla. 8 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Ejemplo Pongamos un ejemplo en el que jugaremos con los dos controles vistos. La idea seguida ha sido habilitar el botón 1 con la propiedad Cancel a True (para que se invoque al pulsar [Esc]), el botón 2 con Default y asociar a ambos un procedimiento, llamado Texto, para que lo ejecuten cuando se pulsen. En dicho procedimiento se distingue si se llama con uno u otro botón, y se pinta uno u otro texto. El procedimiento Texto es el que se ve en el fuente 2. Sea cual sea el botón pulsado, se habilita un tercer botón, el de Salir, inicialmente inhabilitado por tener su propiedad Enabled a False. Su misión es permitir salir de la aplicación. Cada botón lleva un tipo de letra, un tamaño, etc. particular. // --- Fuente 2 ---------------------------------------------------------procedure TForm1.Texto(Sender: TObject); begin if Sender=Boton1 then Label1.caption := 'Se ha pulsado el botón 1 o [Esc]' else Label1.caption := 'El botón 2 se pulsó o [Intro]'; Boton3.Enabled := True end; La ventana que recoge este proceso es el la de la figura 10 y el código completo que hay que ensayar el del fuente 3. Figura 10: Aplicación para uso de botones y texto // --- Fuente 3 -------------------------------------------------------unit Boton1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Boton1: TButton; Label1: TLabel; Boton2: TButton; Label2: TLabel; Boton3: TButton; procedure Texto(Sender: TObject); 9 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS procedure Salir(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Texto(Sender: TObject); begin if Sender=Boton1 then Label1.caption := 'Se ha pulsado el botón 1 o [Esc]' else Label1.caption := 'El botón 2 se pulsó o [Intro]'; Boton3.Enabled := True end; procedure TForm1.Salir(Sender: TObject); begin Close; end; end. 10 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS