Técnicas de Programación 2.1.- Introducción: unos conceptos previos y primeros conceptos de la API Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder Introducción En Windows, no son las aplicaciones quienes manejan los recursos del sistema como pueden ser la memoria, los ficheros, las ventanas y hasta los controles gráficos. Es el sistema operativo quién realiza todas estas tareas. Y la aplicación se limita a realizar peticiones de lo que necesita. Estas peticiones se realizan mediante lo que se denomina la API de Windows, que es un conjunto de funciones que proporciona el sistema operativo para poder habilitar la comunicación. Pero este conjunto de funciones es muy grande, poco estructurado y difícil de manejar, por lo que describiremos algunas de ellas pero no todas. Vamos a comenzar viendo algunas características de Windows: •Para que el programador no tenga que ocuparse del modelo de tarjeta gráfica o de la impresora los programas Windows son, o debieran serlo, independientes de la máquina en la que se ejecutan, produciéndose el acceso a los dispositivos físicos a través de interfaces, y nunca se accede directamente a ellos. Es el sistema operativo el que se encargue de las comunicaciones con ellos. •En Windows los recursos (memoria, teclado, ratón,...) pueden ser usado por una o varias aplicaciones. Desde el punto de vista de un programador vamos a considerar como recursos los menús, los iconos, los cuadros de diálogo, los cursores, etc. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 1 Introducción • Las aplicaciones Windows se presentan como ventanas, por lo que cada aplicación tiene al menos una ventana, la ventana principal, y todas las comunicaciones entre usuario y aplicación se canalizan a través de ella. Cada ventana comparte el escritorio o espacio de la pantalla con otras ventanas, aplicaciones, aunque sólo una puede estar activa, es decir, sólo una puede recibir información del usuario. • Los programas en Windows están orientados a eventos, esto significa que normalmente los programas están esperando a que se produzca un evento (acontecimientos como clic del ratón, una pulsación de tecla, una entrada de datos por un puerto,etc) que les incumba, y mientras tanto permanecen a la espera. Es decir, Windows es un sistema operativo multitudinaria, y el tiempo del microprocesador ha de repartirse entre todos los programas que se estén ejecutando. • Las aplicaciones Windows intercambian datos con el usuario mediante los denominados controles, de los que existen muchos. Entre los más importantes tenemos: Controles estáticos como etiquetas, marcos, iconos o dibujos. Control edit, para que el usuario introduzca datos. Control list box con el que el usuario puede escoger entre varias opciones. Control combo box que es una combinación entre un edit y un list box. Control scroll bar o barras de desplazamiento. Control button para realizan acciones o comandos. Control check box que permite leer variables de dos estados "checked" o "unchecked" Control radio button que se usa en grupos excluyentes entre sí. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 2 Ventanas Dado que el componente fundamental vamos a ver los elementos que la componen. 1. Menú de control de la aplicación que normalmente contiene el icono de la ventana y que despliega el menú del sistema. 2. Barra de menú que se sitúa debajo de la barra de título y contiene los menús de la aplicación. 3. Barra de título que contiene el icono y el título de la ventana. Con clic y arrastrando sin soltar podemos mover la ventana por la pantalla, y mediante doble clic, cambiar entre el modo maximizado y tamaño normal. 4. Botón minimizar que sirve para disminuir el tamaño de la ventana y mandarla a la barra de estado. Botón maximizar que sirve para agrandar la ventana hasta que ocupe toda la pantalla. Cuando la ventana ya está maximizada, se sustituye por restaurar. Botón cerrar que sirve para cerrar la ventana. 5. Barra de scroll vertical que permite desplazar verticalmente la vista del área de cliente . 7. Borde, que puede ser de varios tipos, dependiendo de que estén o no activas las opciones de cambiar el tamaño de la ventana. Se trata de un área estrecha alrededor de la ventana que permite cambiar su tamaño. 6. Barra de scroll horizontal que permite desplazar horizontalmente la vista del área de cliente. 8. Área de cliente, que es donde el programador sitúa los controles, y los datos para el usuario. En general ocupa toda la superficie de la ventana que no lo está por las otras zonas. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 3 El IDE de C++ Builder C++ Builder es un entorno pensado para el desarrollo de aplicaciones RAD (Rapid Application Development) de forma rápida para Windows. Con esta herramienta se pueden desarrollar aplicaciones Win32 de consola o tipo DOS, tipo GUI (Graphical User Interface) o interfaz gráfica de usuario e incluso aplicaciones cliente-servidor. IDE es el acrónimo de Integrated Development Environment o Entorno de Desarrollo Integrado. El IDE de C++ Builder es una aplicación Windows y como tal cumple con los estándares de aspecto, diseño y comportamiento que aconseja Microsoft a los desarrolladores de aplicaciones. Este entorno consta de varias ventanas cada una de las cuales tiene su propósito particular dentro del programa. El IDE dispone de las herramientas necesarias para diseñar, implementar, ejecutar y depurar aplicaciones. El IDE consta de: 1.- Ventana Principal, con la barra de menús, la barra de herramientas y la paleta de componentes. 2.- Área de trabajo, que inicialmente muestra el diseñador de formularios, y escondido u oculto parcialmente tras éste aparece el editor de código. A la izquierda se colocan el árbol de visualización de objetos y el inspector de objetos. 1.- Ventana principal Barra de menús Barra de título con icono, nombre de la aplicación y nombre del proyecto/grupo de proyectos con el que actualmente se está trabajando. y de escritorios Botones de acceso rápido Paleta de componentes Por defecto asigna el nombre Project1 al proyecto con el que se va a trabajar, aunque éste deberá cambiarse, lógicamente. El concepto de proyecto es fundamental ya que es el mecanismo de organizar sensatamente todos los ficheros (formularios, código fuente, recursos, etc.) asociados a una aplicación. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 4 El IDE de C++ Builder Menú principal: File: Con entradas para crear, abrir, reabrir, salvar, cerrar, imprimir, salir del entorno, etc. Edit: Con las funciones típicas de edición (deshacer, rehacer, copiar, pegar y borrar) y funciones de ayuda a la colocación de elementos en la interfaz (alinear, traer al frente, enviar al fondo, etc.). Search: Con las opciones típicas de búsqueda. View: Permite seleccionar las ventanas que deseamos ver. Project: Para gestionar el proyecto o aplicación y generar su programa asociado con la compilación y el linkado. Run: Con los comandos de ejecución y depuración de la aplicación. Component: Para la gestión de componentes VCL (Visual Component Library) y la configuración de la Paleta de componentes. Database: Para trabajo con bases de datos. Tools: Permite visualizar y cambiar opciones del entorno de desarrollo, modificar la lista de programas, crear y editar imágenes y añadir y configurar herramientas auxiliares. Windows: Para movernos entre las distintas ventanas del proyecto. Help: Contiene toda la ayuda sobre C++ Builder. Barras de herramientas. Tienen como objeto acelerar las operaciones más comunes del menú principal. Si nos acostumbramos a utilizarla agilizaremos el uso del entorno significativamente. A continuación describimos brevemente cada una de ellas. Standar: New - abre la ventana de diálogo New Items. Open – Muestra la ventana de diálogo Abrir Fichero. La flechita de la derecha nos permite seleccionar el fichero a abrir de los mostrados en la lista desplegada. Save – Archiva los cambios realizados en todos los ficheros incluidos en el proyecto que tenemos abierto usando el nombre por defecto para cada fichero. Save All – Archiva todos los ficheros abiertos incluyendo el proyecto y los módulos. Open Project – Permite abrir un proyecto completo. Add file to project – Abre la ventana de diálogo Add to Project. Remove file from project - Abre la ventana de diálogo Remove from Project. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 5 El IDE de C++ Builder Barras de herramientas: View: View Unit - Muestra la ventana de diálogo View Unit para mostrar la ventana Unit que deseemos (Ctrl+F12). View Form - Muestra la ventana de diálogo View Form para visualizar la ventana form que deseemos (Shift+F12). Toggle Form/Unit – Conmuta entre las ventana form y su unit correspondiente (F12). New Form – Crea y añade un form en blanco al proyecto actual. Debug: Run – Compila y ejecuta la aplicación (F9). Pause- Detiene temporalmente la ejecución del programa. Trace Into – Ejecuta una línea del programa rastreando en funciones o procedimientos (F7). Step Over – Ejecuta una línea del programa sin rastrear en funciones o procedimientos (F8). Custom: Contiene un único botón para lanzar la ayuda de C++ Builder. Desktops: Pick list o lista desplegable - Nos permite conmutar entre varios escritorios que tengamos salvados previamente. Save current desktop – Nos permite archivar con un nombre dado los valores de escritorio actuales. Set debug desktop - Establece el escritorio actual como escritorio de depuración. Si dejamos el cursor del ratón sobre los iconos nos aparecerán mensajes o pistas de ayuda, informándonos de la funcionalidad de cada uno de los botones. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 6 El IDE de C++ Builder Barras de herramientas: Component palette: Compuesta por múltiples pestañas que dan acceso a los componentes que son los elementos básicos con los que construiremos los programas. Los componentes constituyen los bloques básicos sobre la que se construyen aplicaciones Windows con C++ Builder basadas en la VCL (Visual Component Library) y son la base de la VCL. Todos los componentes (visibles y no visibles) están accesibles rápida y cómodamente gracias a la paleta de componentes. Podemos decir que es un gran almacén de componentes listos para ser incorporados a una aplicación, seleccionándolo y colocándolo en un formulario. Por conveniencia, todos los componentes disponibles se encuentran organizados en distintas páginas o carpetas según su funcionalidad. Cada pestaña de la paleta de componentes da acceso a un conjunto de iconos que representan a componentes que pueden usarse para diseñar la aplicación. Todos los componentes de C++ Builder se encuentran cargados por defecto, aunque se le pueden añadir más mediante las opciones del menú de componentes (opción Component del menú principal). Cada componente tiene asignada una página, por lo que el usuario no puede elegir la ubicación de los componentes disponibles por defecto en la paleta de componentes, aunque puede modificar la disposición de las páginas y añadir nuevas páginas o componentes (Tools/Environment Options). Para colocar un componente en un formulario se debe seleccionar con un clic en la paleta de componentes el botón que representa al componente y a continuación, pinchar sobre el formulario en el lugar donde se desea colocarlo. Otra forma es hacer doble clic sobre el componente insertándose automáticamente en el centro del formulario. Esta última forma presenta el inconveniente de que los componentes se sitúan unos sobre otros en el mismo lugar de referencia. Conocer los componentes y su filosofía de trabajo (propiedades, métodos y eventos) es fundamental para un programador. Posteriormente entraremos en más detalles sobre los componentes disponibles en C++ Builder y sobre la estructura de la VCL. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 7 El IDE de C++ Builder Personalizar las barras de herramientas: Las barras de herramientas se puede personalizar (al igual que casi todas las partes del entorno) situando el cursor sobre cualquiera de ellas y pulsando con el botón derecho seleccionando Customize, lo que activará una ventana como la que vemos seguidamente. La pestaña Toolbars permite seleccionar/deseleccionar las barras de herramientas visibles. La pestaña Commands permite añadir las propiedades que necesitemos para anexarlas a alguna barra de herramientas solamente pinchando y arrastrando con el ratón al panel de la barra de herramientas. Si queremos eliminar alguna propiedad basta con pinchar y arrastrar con el ratón fuera del panel de la barra de herramientas. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 8 El IDE de C++ Builder Personalizar las barras de herramientas: En Options disponemos de dos opciones seleccionables, – Show tooltips. Muestra o no muestra los mensajes de ayuda al paso del ratón sobre los iconos. – Show shortcut keys on tooltips. Muestra o no en la ayuda emergente las teclas de acceso rápido asociadas al icono. Personalizar la paleta de componentes: Haciendo clic con el botón derecho sobre el área de esta paleta accedemos a un menú contextual en el que con Tabs podemos determinar que pestaña se muestra la primera, con Show Hints activar/desactivar las pistas rápidas, con Hide ocultamos la paleta, con Help accedemos a la ayuda sobre el tema y Properties activa la ventana que vemos, donde podemos renombrar, añadir, eliminar o reordenar las páginas de componentes. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 9 El IDE de C++ Builder 2.- Área de trabajo. Nos encontramos con dos tipos de ventanas, las de elaboración de la interfaz de aplicaciones Windows (Formulario, Inspector de Objetos y Árbol de visualización de Objetos) y las de implementación de la aplicación en código fuente C++ mediante un editor (Editor de Código). Para cada formulario se genera un fichero fuente C++ (.cpp) y su fichero de cabecera asociado (.h). El fichero C++ contendrá los manipuladores de eventos para los componentes que pongamos en el formulario y el fichero de cabecera contendrá los ficheros include requeridos para el formulario. Formulario: Es la ventana que aparece en el centro con el título Form1 y que actúa como contenedor de los componentes necesarios para acciones como solicitar datos, mostrar información o realizar otras tareas. En tiempo de ejecución un formulario se comporta como cualquier ventana de Windows. En la imagen vemos el formulario inicial en tiempo de diseño, donde podemos ver la similitud con la ventana descrita en la introducción a la API. Como hemos indicado anteriormente, es una ventana cuadriculada que sirve para diseñar las ventanas (o formularios) que formarán la aplicación. Es una herramienta visual destinada a diseñar y presentar la interfaz de usuario (la apariencia externa) de una aplicación. Un formulario puede ser la ventana principal de un programa, un cuadro de diálogo o cualquier otra ventana. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 10 El IDE de C++ Builder Inspector de Objetos: Es la ventana que aparece en la parte izquierda de la pantalla y consta de tres elementos básicos: Lista de componentes de que consta la aplicación, que contiene el nombre de cada componente que existe en la aplicación y el tipo de éste. Pestaña de propiedades, que muestra las propiedades del elemento que tengamos seleccionado así como los valores que tiene. Estas propiedades se pueden modificar para establecer la configuración del formulario. Pestaña eventos que contiene los nombres de los eventos aplicables al componente así como los procedimientos que se ejecutarán al generarse los eventos. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 11 El IDE de C++ Builder Inspector de Objetos: Cada componente tiene asociado un conjunto de propiedades y métodos y un conjunto de eventos a los que puede responder. Con el inspector de objetos podremos moldear los componentes de una aplicación según nuestras necesidades, en cuanto a su apariencia (propiedades) y funcionalidad (eventos a los que puede responder). En definitiva, podemos modificar las propiedades de los componentes y construir los gestores de eventos a los que éstos pueden responder. En la parte superior se especifica el objeto activo, en la figura, el botón llamado Button1. Las propiedades del objeto activo aparecen en la página con la pestaña Properties y los eventos a los que puede responder en la página con la pestaña Events. Para seleccionar un objeto desde el inspector de objetos se despliega la lista de objetos y se selecciona el objeto en la lista. También se puede seleccionar desde el diseñador de formularios pinchando (un solo clic) sobre el objeto o desde Object TreeView pinchando (un solo clic) sobre el nombre. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 12 El IDE de C++ Builder Inspector de Objetos (Algunas propiedades – Properties referidas al componente Label) • Left es la posición horizontal en que se encuentra el componente, comenzando desde la parte izquierda del elemento que la alberga. • Top es la posición vertical, tomada a partir de la parte superior de su “contenedor”. • Autosize es un valor de tipo “bool” (“boolean”), que indica si la etiqueta cambiará su tamaño automáticamente cuando nosotros cambiemos el texto (por defecto, su valor es true). • Height es la altura del componente y Width es su anchura. • ParentColor nos permite indicar si queremos que el color de esta etiqueta (el de fondo; el del texto lo veremos un poco más adelante) sea el color del “contenedor”. • Color es el color con que se escribirá (nuevamente el de fondo), en caso de que no queramos que sea el mismo que el de su “contenedor”. Tenemos definidas una serie de constantes para facilitarnos el trabajo. Unas indican colores “físicos”, como ClBlue (azul) o ClYellow (amarillo), mientras que otras se apoyan en la paleta que hayamos elegido en Windows, como ClBtnFace (el color de la cara de los botones o de los elementos 3D) y ClActiveBorder (el color del borde de la ventana activa). • ParentFont es para decir si queremos que use el mismo tipo de letra que su “contenedor”. • Font es el tipo de letra (fuente) con la que se escribirá esa etiqueta de texto. Para modificarla, hacemos doble clic en “Font” o clic en Font, y después en el botón de “puntos suspensivos” que aparece junto a esta palabra. Veremos la ventana habitual en Windows para elegir tipo de letra y apariencia, en la que podemos elegir todas las características de un paso. Inspector de Objetos (Algunos sucesos o eventos – Events referidos a componente Button) • OnClick: se activará cuando se pulse el botón. • OnEnter: se activará cuando el botón pase a ser control activo (por ejemplo, cuando se llegue a él pulsando la tecla del tabulador). • OnExit: cuando el botón deje de ser el control activo (por ejemplo, si se pulsa el tabulador cuando el botón está activo). • OnKeyPress, OnKeyDown, OnKeyUp: cuando se presione una tecla, o justo en el momento de empezar a pulsarla, o justo en el momento de terminar de pulsarla. • OnMouseMove, OnMouseDown, OnMouseUp: cuando el ratón se mueva por encima del botón (o del control que sea), o cuando se empieza a pulsar el botón, o cuando se deja de pulsar el botón. • OnDragDrop, OnDragOver, OnEndDrag: tienen que ver con la posibilidad de arrastrar y soltar (drag and drop), muy frecuente en Windows. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 13 El IDE de C++ Builder Al hacer doble clic en un cierto componente, pasamos directamente a modificar la rutina correspondiente al suceso más habitual (por ejemplo, el “OnClick” para un botón). Si queremos modificar otro suceso (por ejemplo “OnKeyDown”), deberemos seleccionarlo en el Inspector de Objetos y hacer doble clic en la ventana a la derecha del nombre de dicho suceso. C++ Builder escribirá la cabecera por nosotros y nos dejará el hueco para completar los detalles como vemos en la figura, donde hemos efectuado un doble clic en el Button1 del FormPrincipal del ejemplo 2 y doble clic sobre el evento OnKeyDown de Button2. Podemos observar como la ventana que estaba en blanco ha tomado el valor Button2KeyDown. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 14 El IDE de C++ Builder Editor de Código: Es la ventana que permite introducir el código fuente para definir el funcionamiento de nuestra aplicación. Inspector de clases Editor de código Pestañas para cambiar entre páginas de código .cpp y .h. La pestaña Diagram la veremos posteriormente Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 15 Relación IDE - API Vamos a establecer la relación entre la descripción de la ventana y las propiedades de un Form que aparecen en el inspector de objetos. Partes de una ventana Propiedad en inspector de objetos 1. Menú de control (icono) - - - - - - - - - - - - - - - - - - - - - - 2. Barra de menú - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3. Barra de título - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4. Botones minimizar, maximizar y cerrar - - - - - - - - - - 5. Barra de scroll vertical - - - - - - - - - - - - - - - - - - - - - - - 6. Barra de scroll horizontal - - - - - - - - - - - - - - - - - - - - - 7. Borde - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8. Área de cliente - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Icon Es un componente que estudiaremos Caption BorderIcons VertScrollBar HorzScrollBar BorderStyle Height, Width, Color, Font, Name, etc Ejemplo 1.- Propiedades Se trata de modificar,mediante el inspector de objetos, varias propiedades de las descritas para ver su efecto en tiempo de diseño y en tiempo de ejecución sobre el formulario de aplicación que se crea cuando se inicia C++ Builder. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 16 Colocación de componentes Mediante el uso del ratón podemos colocar componentes de la paleta de componentes en el área de diseño. Lo único que tenemos que hacer es: 1. Buscar el componente en la paleta de componentes. 2. Pinchar sobre el componente para seleccionarlo. 3. Pinchar en el formulario: el componente ha quedado asociado al formulario. 4. Arrastrarlo hasta su posición final. Un doble clic sobre un componente lo sitúa en la parte central del Form activo en ese momento. Esta acción la podemos repetir situándose los componentes en la misma zona. La posición de un componente siempre se ajusta al punto más próximo de la rejilla para facilitar su ajuste (su alineación). Las opciones relacionadas con la rejilla pueden modificarse en Tools/Environment Options. Siempre hay un componente (o en su defecto, el propio formulario) activo. Visualmente se sabe cuál es porque aparece enmarcado con trazos descontinuos en el diseñador de formularios. Se puede activar cualquier componente pinchando (un sólo clic) sobre él. Podemos modificar la situación de un componente de la forma habitual en Windows con pinchar y arrastrar o mediante las opciones Top y Left del inspector de objetos. También podemos dimensionar un componente mediante las opciones Height y Width del inspector de objetos o situar el cursor sobre uno de los puntos cuadrados que indican la selección del objeto y con un clic arrastrar en el sentido que indican las flechas (cursor del ratón). Si se pincha dos veces en lugar de una, se activa el editor de código para escribir el gestor del evento asociado por defecto a ese componente. Si esto no es lo que queremos basta con volver a activar el diseñador de formularios y continuar con la fase de diseño. Cuando se guarde el proyecto, el código que C++ Builder ha insertado automáticamente desaparecerá porque no hemos introducido ningún código para ese gestor. Cada formulario representa una ventana individual de la aplicación, pudiendo diseñar, añadir, eliminar o reconfigurar los componentes según las necesidades de la aplicación. En ningún caso se borrará manualmente lo que C++ Builder ha insertado automáticamente: podría provocar una inconsistencia interna y hacer inaprovechable el trabajo realizado. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 17 Colocación de componentes Ejemplo 2.- Diseño de nuestro primer formulario En primer lugar colocamos componentes en un formulario y lo redimensionaremos para que quede (aproximadamente) como vemos en la figura. Todos los componentes necesarios para realizar este ejemplo se encuentran en la página de componentes Standard. Pulsar sobre el botón Run o F9 y ver funcionamiento. Estructura y configuración de un proyecto En estos momentos debemos explicar como se estructura y configura un proyecto en C++ Builder aunque aún no vamos a trabajar profundamente con aplicaciones visuales. Estructura habitual de un proyecto escrito en C++ Una aplicación escrita en C++ se compone de un módulo (fichero) que contiene la función main() y, opcionalmente, de una serie de módulos adicionales que pueden contener declaraciones de clases, declaraciones de funciones (prototipos), definiciones de clases, etc. Para la creación de un ejecutable se requiere: 1. Un fichero makefile en el que se especifica la dependencia entre los diferentes módulos y la manera en la que se generan los módulos objeto, bibliotecas y el ejecutable final. 2. Ejecutar el programa make para que interprete el fichero makefile y desencadene las órdenes oportunas para la creación del ejecutable, de acuerdo a lo especificado en el fichero makefile. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 18 Estructura y configuración de un proyecto Ficheros de proyecto en C++ Builder En C++ Builder la gestión de proyectos software se realiza automáticamente y el usuario no necesita construir el fichero makefile ni ejecutar make para obtener el ejecutable, C++ Builder se encarga de todo esto. Para este trabajo estructura los ficheros asociados a una aplicación en un proyecto. Se puede decir que un fichero de proyecto es un fichero makefile. La extensión de estos ficheros es .bpr (Borland Project). Emplearemos el proyecto del ejemplo 2, que consiste en desarrollar una sencilla aplicación que consta de una única ventana. El proyecto se llamará Ejemplo2.bpr. En todo proyecto existe un fichero que contiene la función principal. En aplicaciones que hacen uso de la VCL la función main() se llama WinMain() y se aloja en un fichero cuyo nombre coincide con el del proyecto. Habitualmente no es preciso trabajar sobre este fichero, aunque se es preciso, para mostrar en el editor de código el fichero que contiene a la función WinMain(), seleccionaremos Project/View Source). La función WinMain() se alojará en el fichero Ejemplo2.cpp. Además, cualquier aplicación que contenga al menos una ventana existirán dos módulos adicionales: 1. Un módulo con extensión .cpp con el código asociado a esa ventana (usualmente contiene los gestores de los eventos que se pueden gestionar en esa ventana). 2. Un módulo cabecera con extensión .h que contiene la declaración de los componentes que se incluyen en la ventana. En este ejemplo 2, los ficheros asociados a la ventana principal (y única) se llamarán Principal.cpp y Principal.h. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 19 Estructura y configuración de un proyecto Configurar un proyecto en C++ Builder El primer consejo es que cada aplicación debería estar en un directorio propio donde se guardarán todos los ficheros asociados a la aplicación, Por ejemplo, crear un directorio llamado Ejemplo2 para guardar los ficheros asociados al proyecto. Ahora se procede a configurar la aplicación. Consiste, básicamente en proporcionar nombres significativos al proyecto y a los ficheros asociados al proyecto. a) Si se acaba de arrancar C++ Builder aparece, por defecto, un formulario vacío llamado Form1 asociado al proyecto Project1.bpr. b) Si existe un proyecto vigente, lo más cómodo es crear una nueva aplicación (File/New Application) salvando, si se desea el proyecto vigente. En cualquier caso se crean, por defecto: Project1.bpr, fichero de proyecto. Project1.cpp, fichero que contiene la función WinMain(), Unit1.cpp, fichero que contiene las funciones asociadas al formulario principal (constructor de la ventana y que posteriormente contendrá, además, los gestores de los eventos que puede gestionar). Unit1.h (especificación de los componentes del formulario principal). Puede comprobarse usando el gestor de proyectos (View/Project Manager). Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 20 Estructura y configuración de un proyecto Continuación Ejemplo 2.- Diseño de nuestro primer formulario 1.- Cambiar el nombre y título del formulario principal utilizando el inspector de objetos, por ejemplo cambiar la propiedad Caption por Ejemplo 2 y la propiedad Name por FormPrincipal. 2.- Guardar ficheros asociados a ventanas (File/Save As) en el directorio adecuado para dar nombres significativos a los ficheros. Por ejemplo, guardar Unit1.cpp como UnitPrincipal.cpp. (Unit1.h cambia automáticamente a UnitPrincipal.h). 3.- Guardar el proyecto: (File/Save Project As) en el directorio adecuado. Por ejemplo, guardar Project1.bpr como Ejemplo2.bpr. Observar que Project1.cpp ha cambiado automáticamente a Ejemplo2.cpp, y que éste contiene a la función WinMain(). 4.- Analizar estos cambios visualizando Project Manager. 5.- Observar los cambios producidos en el menú Project. Dar un nombre a la aplicación y fijar un icono. Estos datos aparecerán al minimizar el programa durante su ejecución. Para definirlos seleccionamos Project/Options/Application. Podemos aplicar esto a cualquiera de nuestros programas y ver los efectos cuando se pone en ejecución. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 21 Estructura y configuración de un proyecto Ejemplo 3.- Modificaciones de diseño de nuestro primer formulario En primer creamos un nuevo directorio denominado ejemplo 3 y abrimos el ejemplo 2 tal y como lo dejamos anteriormente. Lo que necesitamos, para mantener el ejemplo 2 intacto, es salvar nuestros archivos en el nuevo directorio antes de comenzar a trabajar con el ejemplo 3. Con Ejemplo2 abierto clicamos en File/Save As... y guardamos en nuestro nuevo directorio y también File/Save Project As ... para archivar el proyecto cambiando el nombre de Ejemplo2 a Ejemplo3. Con esto tendremos los archivos necesarios mínimos para el proyecto, como vemos en la figura. Posteriormente veremos los tipos de archivos. Realizar las modificaciones que citamos en la lista siguiente usando el Inspector de Objetos (pestaña Properties). FormPrincipal: Caption = Ejemplo 3 y Name = FormPrincipal. Label1 : Caption = Nombre y Name = LabelNombre. Edit1 : Dejar vacío el valor de Text y Name = EditNombre. RadioButton1 : Caption = Opción 1 y Name = RadioButtonOp1. RadioButton2 : Caption = Opción 2 y Name = RadioButtonOp2. CheckBox1 : Caption = Activación de opciones, Name = CheckBoxOpciones y Checked = true Button1 : Caption = OK, Name = ButtonOK y Enabled = false. Button2 : Caption = Salir y Name = ButtonSalir. Label2 : Dejar vacío el valor de Caption y Name = LabelSalida. Activar el cuadro de diálogo asociado a la propiedad Font y establecer los siguientes valores: Font = MS Serif, Font Style = Bold, Size = 10 y Color = clNavy. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 22 Estructura y configuración de un proyecto Observamos que, básicamente, se trata de modificar los valores de las propiedades Caption y Name: Caption: Se refiere al título o leyenda que acompaña a los componentes (por ejemplo, al texto que aparece sobre un botón). Name: Se refiere al nombre con el que se va a referenciar al componente desde el programa. Al ser un identificador (como un nombre de variable, por ejemplo) debe ser significativo. Por defecto, C++ Builder asigna nombres como Button1 y Button2 y es conveniente asignarles otros más clarificadores como ButtonOK o ButtonSalir, por ejemplo. Cuando se coloca un componente en un formulario, C++ Builder crea un puntero al componente en la declaración del formulario (fichero main.h en este ejemplo) y gracias a ello se puede acceder al componente a través del código. C++ Builder emplea la propiedad Name del componente para denominar al puntero. En tiempos de diseño y ejecución tendremos algo similar a: Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 23 Colores Los colores están definidos como constantes, cuyo nombre empieza por “cl” y sigue con el nombre del color en inglés (con su primera letra escrita en mayúsculas). Por ejemplo, podemos esperar que el color “rojo” estándar de Windows sea “clRed” (y efectivamente, así es), o que el negro sea clBlack, o el azul sea clBlue. Tenemos también colores basados en la paleta de colores de pantalla que hayamos definido en el Panel de Control de Windows. Por ejemplo, clMenu es el color que se haya escogido desde el Panel de Control para el texto de los menús. La lista completa sería ésta: Valor Significado Valor Significado clBlack Negro clScrollBar Color barras de desplazamiento clMaroon Marrón clBackground Color fondo del escritorio de Windows clGreen Verde clActiveCaption Barra de titulo de la ventana activa clOlive Verde aceituna clInactiveCaption Barra de titulo de la ventana inactiva clNavy Azul marino clMenu Color de fondo de los menús clPurple Púrpura clWindow Color de fondo de las ventanas clTeal Azul verdoso clWindow Frame Color del borde de las ventanas clGray Gris clMenuText Color del texto de los menús clSilver Plata clWindowText Color del texto en las ventanas clRed Rojo clCaptionText Color del texto de la ventana activa clLime Verde lima clBtnFace Color de la “cara” de los botones clYellow Amarillo clInactiveBorder Borde de la ventana inactiva clBlue Azul clAppWorkSpace Color espacio de trabajo de la ventana clFuchsia Fucsia clHighlight Color de fondo del texto seleccionado clAqua Agua clBtnShadow Color de la “sombra” de los botones clWhite Blanco clInactiveCaptionText Texto barra de título de ventanas inactivas clNone Ninguno clBtnHighlight Color de un botón destacado clGrayText Color del texto gris cl3DDkShadow Color de la sombra de objetos 3D clBtnText Color del texto de los botones cl3DLight Color del objeto 3D seleccionado clHightlightText Color del texto seleccionado clInfoText Color del texto mensajes de información. clActiveBorder Borde de la ventana activa clInfoBk Color de fondo de los mensajes de información Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 24 Editor de código C++ Builder nos permite el acceso a la totalidad del código fuente de la aplicación. Por esto es importante saber qué partes de ese código están mantenidas automáticamente, y sobre todo ¡evitar modificarlo!. El editor de código está relacionado muy estrechamente con el inspector de objetos. Al hacer doble clic en un evento, el IDE genera automáticamente el código para la función manejadora para tal evento. No tenemos que preocuparnos de cuál es exactamente el prototipo que debemos de usar para la función que maneje el evento, ya que este se generará correctamente en la unidad de código asociada al Form actual. Cuando queramos eliminar un manejador de evento que ha sido generado automáticamente es conveniente no borrar "a mano" la función. Lo mejor es borrar "el cuerpo" de dicha función (lo que el programador escribe) y dejar que el resto lo elimine C++ Builder (lo que ocurrirá cuando se guarde el archivo). Continuación Ejemplo 3.- Código para la aplicación Construir el gestor del evento que se genera al hacer clic sobre el botón de salir creado en el ejemplo 3. Se trata de que al pinchar sobre este botón la aplicación termine su ejecución. Para ello seleccionar el componente ButtonSalir y en la pestaña Events del inspector de objetos, hacemos doble clic en OnClick. El editor de código muestra el siguiente código, generado automáticamente: void __fastcall TFormPrincipal::ButtonSalirClick(TObject *Sender) { Línea en blanco } //--------------------------------------------------------------------------Escribir en la línea en blanco el siguiente código: Application->Terminate(); Application es un puntero a tipo TApplication y para acceder a las propiedades y métodos de un puntero a objeto se usa “->“. Aunque en este momento no entendamos muy bien esto ya veremos posteriormente los conceptos de puntero, métodos y propiedades. Ahora, generar el ejecutable y ejecutar el programa: al hacer clic sobre el botón de salir, el programa deja de ejecutarse. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 25 Administrador de proyectos - Archivos de un proyecto Un proyecto es un conjunto de archivos que trabajan en equipo para crear un archivo ejecutable independiente o una DLL. Los proyectos que componen un grupo de proyectos, y los archivos que componen cada uno de esos proyectos, es lo que presenta, en forma de árbol, el administrador de proyectos. Puede emplearse como navegador para seleccionar el módulo con el que se va a trabajar o el proyecto activo. Para visualizar el gestor de proyectos, seleccionar View/Project Manager. El gestor de proyectos puede "pegarse" al editor de código, arrastrándolo hasta colocarlo sobre éste último, como vemos en la figura. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 26 Administrador de proyectos - Archivos de un proyecto En todo momento existe un único proyecto activo, y será este el que se ejecute si elegimos la opción Run/Run. Podemos agregar, mediante el menú contextual que se despliega al clicar botón derecho sobre Project Manager, nuevos proyecto o proyectos ya existentes. También se puede salvar el grupo de proyectos y acceder al código fuente del archivo que define el grupo de proyectos. En la figura vemos como hemos añadido Ejemplo2 al grupo de proyectos que además hemos salvado con el nombre que vemos. Con los botones podemos: Añadir un nuevo proyecto al grupo, eliminar un proyecto del grupo o cambiar el proyecto activo. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 27 Administrador de proyectos - Archivos de un proyecto Los ficheros de proyecto especifican todos los recursos necesarios (ficheros .cpp, .h, ficheros de descripción de formularios, etc.) que se necesitan para la construcción del ejecutable. Los ficheros de proyecto tienen extensión .bpr y el ejecutable que se genera tiene el mismo nombre que el proyecto y la extensión .exe, lógicamente. Todo proyecto en C++ Builder se compone, al menos, de un archivo de código que contiene la función principal (WinMain()). Su nombre es el nombre del proyecto, con la extensión .cpp. Este fichero no está, habitualmente, visible, ya que no es necesario modificarlo. Puede abrirse en el editor de código con la opción Project/View Source, como vemos en la figura: Cualquier aplicación típica tendrá al menos una ventana. Para cada ventana habrá un módulo, formado por una pareja de ficheros: un .cpp y su correspondiente .h: en el fichero .cpp estarán los gestores de los eventos asociados a los componentes de esa ventana y en el .h (que no se modificará, normalmente) estará la declaración de los componentes de esa ventana. Además del fichero que contiene la función principal, un proyecto puede tener asociados una serie de módulos adicionales en los cuales pueden incluirse funciones y clases de objetos, como en cualquier aplicación C++. Cada uno de estos módulos estará formado por una pareja de ficheros: un .cpp y su correspondiente .h. A un grupo de proyectos se le pueden añadir proyectos, archivos, formularios, módulos... nuevos o que ya existan. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 28 Administrador de proyectos - Archivos de un proyecto Hemos dicho que, en definitiva, el administrador de proyectos es únicamente un organizador de archivos. Veamos brevemente qué tipos de archivos pueden formar parte de un proyecto/grupo de proyectos, y cuál es su cometido: Extensión Descripción .bpr Es el archivo makefile de opciones del proyecto. Define qué y cómo se debe compilar. .cpp Archivos fuente de C++. Es el código que le damos a los eventos de los objetos que tendrá el formulario final. .h Archivos de cabecera de C++. Para cada archivo .cpp, C++ Builder crea automáticamente un .h correspondiente que contiene la declaración del formulario y dice a C++ Builder la lista de componentes y los eventos que tendrá la aplicación. .obj .exe o .dll Archivos objeto resultado de la compilación. Es el archivo binario producto de la compilación. Es el archivo final según la elección realizada en la creación del proyecto, el .exe podrá ejecutarse, y el .dll es una libreria dinámica utilizable desde otros programas. .tds Archivos temporales para la compilación incremental. .res Archivo de recursos. .dfm Archivos de descripción de formulario. Contiene la información, definición y declaración del formulario y otros detalles importante como el tamaño, color, títulos, fondos, etc, así como detalles del resto de los componentes utilizados. Aunque está en formato binario, puede verse como texto seleccionando View as text en el menú contextual que aparece al pulsar con el botón derecho del ratón cuando se está situado sobre el formulario. Para volver a verlo como forma seleccionamos con el botón derecho View as Form. .dsk Es el archivo que contiene la configuración del escritorio en el momento de crear o finalizar un proyecto. .bpg Es un archivo de grupo de proyectos. Describe qué proyectos conforman el grupo de proyectos. .hpp Archivos de cabecera creados automáticamente por C++ Builder. .~h .~cpp .~dfm Archivos temporales de los anteriores En la página siguiente podemos ver el archivo .dfm como texto activando View as Form, aunque también podemos verlo con un editor de texto cualquiera. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 29 Administrador de proyectos - Archivos de un proyecto Aunque se pueden realizar modificaciones sobre el archivo que se reflejarán en el formato gráfico no resulta lo más conveniente salvo que seamos expertos y en necesidades muy concretas. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 30 Administrador de proyectos - Archivos de un proyecto En la figura vemos estos ficheros en el caso del ejemplo 3. Antes de continuar con más aspectos de la API y de las aplicaciones visuales nos introduciremos en las aplicaciones de consola para iniciar la programación C y C++. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 31 El sistema de ayuda de C++ Builder El sistema de ayuda será una de las herramientas que más útiles nos resulte en nuestro trabajo con C+ + Builder. Especialmente la documentación de los componentes y clases predefinidas. Saber programar con C++ Builder no significa dominar todos y cada uno de los aspectos del entorno, sino que más bien es conocer los principios en los que éste se basa, y los detalles concretos ya los buscaremos en la Ayuda cuando nos sean necesarios. La ayuda es una ayuda estándar de Windows por lo que no entraremos en más detalles, sólo comentar que pulsando F1 obtendremos una ayuda contextual. Así, por ejemplo, en el caso de hacerlo en el editor de código, se nos ofrecerá la ayuda correspondiente a la palabra que se encuentre bajo el cursor, como vemos en las imágenes siguientes. Ventana de ayuda desplegada al escoger C++ Builder Help del menú Help Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 32 El sistema de ayuda de C++ Builder Ventana de ayuda que se despliega al pulsar F1 sobre la palabra clave Application Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 33 El sistema de ayuda de C++ Builder Ejemplo proporcionado en la ayuda Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 34 El sistema de ayuda de C++ Builder Pulsando F1 sobre cualquier opción de un menú se mostrará la ayuda asociada a esa opción, como vemos en la imagen. Otra forma de ayuda que C++ Builder proporciona son algunas facilidades muy útiles a la hora de escribir código. Las más importantes son: • Auto-completar código. Al escribir el nombre de una clase seguido del operador de acceso punto (.) o el nombre de un puntero que referencia a un objeto seguido del operador de acceso flecha (->) se muestra la lista de propiedades, métodos y eventos asociados a esa clase, como podemos ver en la figura de la página siguiente. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 35 El sistema de ayuda de C++ Builder Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 36 El sistema de ayuda de C++ Builder • Patrones de código. Al pulsar Ctrl+J se muestran los patrones de código (también llamados "esqueletos") que pueden insertarse en el código de nuestro programa. Pueden crearse y guardarse nuevos patrones. Es posible configurar estas utilidades seleccionando Tools/Editor Options/Code Insight. Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 37 a l e d Fin s e r p n ó i c a t en Tema 2.1.2.- Introducción a la API y al IDE de C++ Builder 38