|
|
Artículo realizado por
1. Introducción
Las secciones anteriores han estado dedicadas al entorno, al lenguaje Object Pascal, y a la exposición de todo lo que rodea a la programación con Delphi (orientación a objetos, programación visual, desarrollo rápido…) Tras todo esto, lo recomendable sería que se hubiera practicado haciendo uso del entorno, "soltando" componentes sobre el formulario principal, editando las propiedades de esos componentes (mediante el Inspector de Objetos), probando qué es lo que resulta tras esas modificaciones, y en definitiva, haberse "peleado" con la mayoría de las opciones principales que el entorno del lenguaje Delphi nos ofrece. Y ahora es el momento en el que hay que conocer un apartado fundamental en el mundo de la programación con Delphi. Este apartado es la VCL. 2.¿Qué es una VCL? Pues, ni más ni menos, una VCL es un objeto que podemos utilizar en nuestros programas, que podremos "soltar" sobre nuestro formulario, y al que podremos cambiar sus propiedades a través del Inspector de Objetos. Supongo que algunos se habrán dado cuenta de que esto es precisamente lo que se puede hacer con los componentes que se encuentran disponibles en las paletas de componentes de Delphi (botones, etiquetas, listas desplegables…). Pues ahora se puede decir que esos componentes que hemos estado utilizando hasta ahora (y que no olvidemos, son objetos), son también VCL. VCL o Visual Component Library no es más que un objeto que se diseña en Object Pascal, y que incluimos en la paleta de componentes de Delphi. El modo en que esto se hace lo afrontaremos después. Tan solo basta con saber, por ahora, que además de los componentes que ofrece Delphi, podremos crear los nuestros propios o utilizar los de otras personas (en este aspecto, cabe destacar que existen en Internet servidores exclusivamente dedicados a la difusión de VCL Free y Shareware), 3.Tipos de Componentes En una aplicación Delphi es posible utilizar tanto componentes Delphi, (las VCL), como componentes OCX (o también conocidos como componentes OLE). Esto es válido para los compiladores de Delphi versiones 2 y 3, pero para la versión 1, los OCX estaban vetados, ya que al ser la primera versión de Delphi para 16 bits, tan sólo estaban disponibles los VBX (versiones de 16 bits de los OCX que son de 32 bits). Aclarado esto, en la etapa de diseño de nuestro programa, mientras estemos trabajando con los componentes sobre el formulario, no notaremos ninguna diferencia entre VCL y OCX (VBX). Pero esto no quiere decir que sean lo mismo. Existe una diferencia fundamental entre ambos tipos de componentes, y es que mientras el código de las VCL pasa a formar parte del ejecutable que genera Delphi, (o sea, que la VCL está incluida en la propia aplicación), los OCX se mantienen en un archivo separado, con extensión OCX, que será necesario distribuir e instalar en el sistema junto con la aplicación (tal y como se haría si utilizásemos una DLL… pero eso ya lo veremos algún otro día). La mayor parte de los componentes que encontraremos en la paleta de Delphi son del tipo VCL, excepto la subpaleta donde pone OCX (en Delphi 2) o ActiveX (en Delphi 3). 4. Instalación de un Componente Los componentes son tan importantes a la hora de realizar un programa debido a que pueden facilitarnos nuestra tarea sobremanera. Supongamos que necesitamos incluir en nuestra aplicación música en un formato tan popular últimamente como el MP3. Cuando se va a realizar un programa "supuestamente profesional", no se puede perder el tiempo con experimentos, porque lo que queremos (más bien, lo que nos exigen) es productividad. Lo primero que se va a hacer es irse a Internet a buscar algo que lo haga por nosotros… vamos, que nos convertiremos en montadores de puzles si nos descuidamos un poco ya que lo que impera es sacar el producto cuanto antes frente a la satisfacción de haberlo realizado nosotros íntegramente. Así que cuando tengamos lo que buscamos, lo hayamos hecho nosotros o sea de un tercero, tendremos que pasar a la instalación en la paleta de Delphi para poder utilizarlo en nuestro proyecto. El proceso de instalación dará como resultado una nueva entrada en la paleta de componentes de Delphi, pasando a estar disponible como si hubiera "venido de fábrica". Este proceso varía para cada una de las versiones del compilador, así que nos centraremos en la más estándar, en la de Delphi 2. Primero hay que seleccionar la opción Install del menú Component. En la ventana que aparece, podremos ver en una lista los distintos componentes que actualmente se encuentran instalados en nuestro sistema. Pulsando el botón Add… podremos pasar a instalar una VCL, y pulsando el botón OCX…podremos instalar un OCX/OLE/ActiveX. En el primer caso tan sólo tendremos que facilitar el nombre del módulo en el que está contenido el componente (o sea, el nombre del fichero ".pas" si tenemos el fuente, o ".dcu" si lo tenemos compilado), con el path para localizarlo. En el segundo caso deberemos seleccionar el OCX de la lista de OCX registrados en el Registro del Sistema de W95 (o como preferimos llamarlo algunos: el Infierno de W95), ya que tan sólo aparecerán en esa lista los que estén instalados. Hay que tener en cuenta que en cualquier momento podemos desinstalar el componente que no nos interese (incluso los que vienen por defecto con Delphi… ¡Nooo, dejad eso para más tarde!). Esto lo podremos hacer pulsando el botón Remove. Esto no quiere decir que se borre físicamente el componente del disco duro, sino que lo hace inaccesible desde la paleta de componentes de Delphi, por lo que posteriormente se podrá volver a incluir. Y algunos ahora se preguntarán: ¿y entonces para qué se "remueve" el componente? Pues como los componentes se incluyen en los ejecutables, si eliminamos los que no utilizamos, el ejecutable generado será más pequeño, con lo que irá más rápida su carga y utilización… motivo suficiente ¿no? Pues bien, una vez realizada la instalación ya podremos utilizar el nuevo componente como cualquier otro, y recordemos que nos dará igual en principio que sea VCL, OCX, OLE, ActiveX, VBX… ¿no se cansa la gente de crear tantas siglas?
José Antonio Suárez.
Capítulo 4.
Trabajando con la Visual Component Library
5. Componentes, Componentes, Componentes
Pasemos ahora a un breve repaso por todo lo que nos ofrece Delphi a través de sus componentes "de fábrica" (ß No me gusta la palabra estándar, estandard o como diablos se diga en español)
Partiendo de que ya ha existido un previo "tute" entre el entorno y nosotros, (al cual le hemos expuesto que no nos va a dominar por sus ilimitadas opciones, menús, submenús y contramenús), que hemos más o menos tanteado las posibilidades de cada uno de los botones, listas desplegables, listas combo (¿y esto como diablos se dice en nuestro idioma?), y demás… ahora es el turno de una mayor profundización en algo que va a ser el aspecto que va a presentar nuestro programa: los controles o componentes que aparecerán en pantalla… y esto es algo que, por experiencia, provoca el inmediato rechazo o predisposición a aceptarlo por parte de los usuarios.
Puede parecer que esta parte va a ser algo tediosa, con una exposición de tantas opciones y subopciones, pero para justificarla, junto a cada una expondré un ejemplo del uso que se le puede dar en un programa de los que todos vemos.
De lo que se trata es de conocer las propiedades más habituales, los eventos y los métodos que están disponibles para cada uno de ellos.
Cuando, desde el código de nuestro programa queramos acceder a las propiedades, eventos o métodos de un componente, podremos utilizar dos formas distintas.
Supongamos que tenemos un componente sobre nuestro formulario que se llama "Chiquitin". Supongamos también que tiene dos propiedades llamadas "Cabeza" y "Piernas", y un método llamado "Llora".
Si queremos acceder al componente "Chiquitin" lo podemos hacer de la siguiente forma:
Chiquitin.Cabeza:=’Gorda’; Chiquitin.Piernas:=’Cortas’; Chiquitin.Llora;
Puede parecer un ejemplo tonto, pero lo que importa no es el exterior… (bueno, eso era de Disney)… lo que importa es que cuando se quiere acceder a las propiedades del mismo componente de manera seguida, podemos hacer lo siguiente:
with Chiquitin do begin Cabeza:=’Gorda’; Piernas:=’Cortas’; Llora; end;
Esta forma de acceder al objeto (componente) como si fuera un vulgar registro, es la más recomendable y elegante, y además la que ahorra más escritura de código por nuestra parte, y aunque ya lo hayamos visto en anteriores capítulos, nunca viene mal recordar… (a no ser que sea nuestro abuelo el que recuerde y diga: cuando yo era joven…)
Visto esto, pasemos ahora a comentar las propiedades que suelen compartir casi todos los componentes:
5.1.1 Posición y Dimensiones.
Todos los componentes están colocados en una determinada posición de la ficha (formulario) que los contiene, incluso aquellos que en tiempo de ejecución no están visibles.
La posición de un componente puede ser consultada y modificada a través de las propiedades Left y Top para las coordenadas izquierda y superior, respectivamente, siendo de tipo Integer, con lo que aunque la esquina superior izquierda del formulario sea (0,0), podremos dar coordenadas negativas (con lo que parte de él o su totalidad no aparecerán). Hay que tener en cuenta que estas coordenadas son relativas al formulario en que se encuentran, y si el formulario está situado en un rinconcito a la derecha, la coordenada (0,0) para cualquier componente representará la posición (0,0) dentro del formulario, no dentro de la pantalla del monitor, por lo que aparecerá en la esquina superior izquierda dentro del formulario.
El tamaño se encuentra en las propiedades Width y Height, para ancho y alto, respectivamente, siendo esta vez de tipo Word, o sea, que no pueden ser negativos (¿como sería un partido de baloncesto con jugadores que midiesen -1’90?)
Un aspecto a notar es que si desplazamos durante el diseño un componente por el formulario o cambiamos su tamaño con el ratón, en el Inspector de Objetos podremos ver cómo automáticamente se van actualizando los valores de Top, Left, Widht y Height.
Y no olvidar que estas propiedades pueden ser cambiadas tanto en diseño (desde el Inspector de Objetos o con el ratón), como en ejecución (desde el código del programa).
Como ejemplo de esto, podemos ver que en algunos programas, según las opciones que están disponibles, aumentan o disminuyen los tamaños de las ventanas, e incluso podemos modificar sus tamaños. Pues todo esto se realiza a partir de estas propiedades.
5.1.2 Títulos, Colores y Tipos de Letra
Muchos componentes tienen una propiedad llamada Caption, (el botón, la etiqueta, el panel, el propio formulario…), que sirve para almacenar el texto que aparecerá en pantalla en cada uno de ellos. Esta propiedad es de tipo String, con lo que podremos especificar una cadena de tipo alfanumérico.
Por poner un ejemplo, el formulario que contiene el explorador desde el cual estáis viendo esta página, tiene una barra superior donde se encuentran los botones de maximizado, minimizado y demás, pues bien, el texto que aparece a la izquierda es el Caption de ese formulario, y los textos que aparecen en los botones son los Caption de los botones.
Otro apartado son los colores. El color de un componente se refiere al fondo de lo que se va a ver en pantalla para ese componente. El color se especifica en la propiedad Color, que es de tipo TColor, al que podremos darle unos valores predefinidos o en hexadecimal.
Por último, el tipo de letra puede ser modificado a través de la propiedad Font, que es de tipo TFont. Para modificarla probad a hacer click sobre el botoncito con 3 puntos que aparece junto a ella en el Inspector de Objetos, con lo que aparecerá un menú donde podremos elegir la configuración que deseemos.
5.1.3 Más Propiedades Comunes
Todo lo que se ve en pantalla puede ser ocultado o deshabilitado. Esto se realiza mediante las propiedades Visible y Enabled.
Ambas son de tipo Boolean. Con lo que un valor de True permitirá que se vea en pantalla y que se pueda utilizar.
En todos los programas hay opciones que están disponibles siempre, y otras que o bien no aparecen (Visible:=False) o que no se pueden seleccionar y suelen aparecer en gris (Enabled:=False)
5.2 Eventos de un Componente
Los eventos, al igual que las propiedades, son miembros de un objeto (componente), y por lo tanto se puede acceder a ellos igual que a las propiedades.
La diferencia entre una propiedad y un evento es que el evento es un procedimiento o función y la propiedad una variable que almacena un valor.
La diferencia entre un evento y un método es que el evento es como una reacción del componente a algo que pasa (y lo escribimos nosotros), y el método es algo que nosotros llamamos, nunca el propio componente (y no lo escribimos nosotros).
Como esto puede parecer algo lioso, pongamos un ejemplo:
Cuando pulsamos sobre un botón, el botón genera el evento OnClick, en el cual pondremos el código que queremos que se realice cuando se pulse el botón.
Si llamamos al método Hide del botón, éste se ocultará, pero el código no lo habremos hecho nosotros, tan sólo habremos utilizado la llamada al procedimiento que lo hace y que ya está implementado.
Y también hay que hacer mención de que todos los eventos empiezan por "On".
La mayoría de los eventos son generados por el ratón, pero hay algunos otros que son generados por el propio sistema, como por ejemplo los pulsos de un temporizador (está en la paleta System, componente Timer).
5.2.1 Eventos del Ratón
El ratón es sin duda el dispositivo de entrada por excelencia en Windows, ya que mediante él es posible controlar prácticamente la totalidad de las funciones de una aplicación, si exceptuamos la entrada de datos tales como textos. Cada vez que movemos el ratón, pulsamos o liberamos cualquiera de sus botones, estamos generando un evento (en realidad es tal la ensalada-follón que se crea internamente con los mensajes entre las aplicaciones y sus controles, con lo eventos y los procesos, que me extraña que Windows no casque mucho más).
El evento OnMouseMove lo recibe un control (componente visible en tiempo de ejecución) cuando el puntero del ratón se está desplazando sobre él. Este evento cuenta con varios parámetros especiales (estado de las teclas Alt,Control, Mayús; y la posición X e Y del puntero).
Al pulsar y liberar un botón cualquiera, se generan dos eventos: OnMouseDown y OnMouseUp. Ambos comparten los parámetros del evento anterior, además de otro donde se indica qué botón es el que lo ha producido (izquierdo, central o derecho).
También está el evento OnDblClick que se refiere a cuando se hace un doble click, además de OnDragDrop, que se produce al arrastrar el cursor sobre el control con un botón pulsado; y otros muchos más (decenas, cientos, miles… y eso que con Delphi es más fácil).
5.2.2 Eventos de Teclado
Algunos controles como el formulario (Form) o la caja de texto (Edit), tienen la capacidad de recibir eventos de teclado, que permiten, por ejemplo, interceptar la pulsación de una tecla.
Cada vez que se pulsa una tecla que se corresponde directamente con un carácter se genera el evento OnKeyPress, que nos pasa como parámetro el carácter pulsado.
Como veremos, existe analogía entre los eventos del ratón y del teclado, ya que cuando se pulsa una tecla y se suelta, también se generan los eventos: OnKeyDown y OnKeyUp.
Y existen muchos tipos más de eventos, pero como introducción ya basta.
5.3 Métodos de un Componente
Por último, vamos a ver los métodos.
Un método es un procedimiento o función perteneciente a un objeto.
Ya hemos comentado algo sobre ellos.
Nosotros tan solo nos limitamos a llamarlos, ya que el código está ya hecho y no se puede cambiar.
Habitualmente están siempre disponibles en cualquier componente los métodos: Show y Hide, que muestran u ocultan el control, (podemos hacer lo mismo con Visible:=True o a False, respectivamente).
Supongamos que queremos que cuando "pase algo", el foco del control activo pase al control que más coraje nos dé (a mí particularmente me cae fatal el RadioButton, tan pretencioso y con esas curvas tan remarcadas… y esa forma de activarse ¡ahggg!). Eso se hace mediante el método SetFocus, y podemos saber si un control puede ser "focuseado" (ß que me perdone Cervantes) mediante el método CanFocus, que nos devuelve un Booleano.
Y podemos también hacer que una ventana se muestre por encima o por debajo mediante: BringToFront y SendToBack.
6. Resumen
Reconozco que tantos conceptos de golpe abruman a cualquiera que se enfrente a ellos por primera vez, y más cuando diga que hemos visto el 5% de las propiedades, eventos y métodos del 2% de los componentes que existen.. Pero no hay que agobiarse. Esto no se aprende de golpe, sino con el uso y la necesidad de utilizar un control en concreto. Y nadie por muy profesional que sea, conoce exacta y absolutamente todo lo que existe bajo un simple TButton.
Hasta aquí este capítulo, donde hemos repasado lo que es el manejo de los componentes (habré escrito esta palabra unas 46 veces aprox.), y que pretende ser una especie de introducción o de afianzamiento para todos aquellos que se han "currado" algo el entorno de Delphi. Pero todo esto no caerá en saco roto (ß expresión tonta pero que me gusta), ya que en el próximo capítulo vamos a realizar nuestra primera aplicación medio seria. Así, sin más, ya que la mejor forma de aprender esto es haciendo un programa. Palabra.
Cuelgues Mentales
Vamos a relajarnos ahora y a reírnos un poco de lo absurdo que suelen ser algunos pretenciosos. Esto no es inventado, es un hecho real y publicado en revistas y periódicos americanos.
En el transcurso de una feria informática reciente (no, no es cuando a Guillermo Puertas se le cascó el Güindows "95+3 chorradas", sino en otro llamado Comdex), Bill Gates comparó la industria informática con la del automóvil afirmando:
"Si General Motors hubiera renovado tanto su tecnología como la industria informática, ahora conduciríamos coches de 25$ que consumirían un galón cada 1000 millas".
La respuesta de General Motors no se hizo esperar. Vino en forma de Comunicado Oficial
Ciertamente, pero ¿desearla usted que su coche se parara dos veces por día?
Cada vez que las líneas divisorias de las carreteras fueran repintadas usted se vería obligado a cambiar de coche.
De vez en cuando, en plena autopista, su coche se pararía sin razón aparente, y usted debería aceptarlo, volver a ponerlo en marcha y continuar.
De vez en cuando, haciendo una maniobra, su coche se pararía y usted debería volver a instalar el motor. De una manera un tanto sorprendente, usted lo aceptaría igualmente.
No podría haber más de una persona a la vez en su coche, a no ser que usted compre "Coche95' o 'CocheNT. Pero entonces, usted debería comprar los asientos aparte.
Apple fabricaría un coche que funcionaría con energía solar, fiable, cinco veces más rápido, dos veces más fácil de conducir. Pero sólo funcionaría en un 5% de las carreteras.
Los poseedores de coches Macintosh añadirían actualizaciones Microsoft a sus coches... que los volverían más lentos.
Las luces del aceite, gasolina y alternador se verían reemplazadas por una única de 'Error general del coche.'
Los nuevos asientos obligarían a todo el mundo a tener el mismo tamaño de culo.
El sistema de airbag avisaría ‘¿Está usted seguro?’, antes de abrirse.
En caso de accidente usted no sabría lo que ha sucedido.
|
|