Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
Para ser un buen programador en C++ Builder existen distintos aspectos que se deben conocer:
C++ Builder es una aplicación Windows que proporciona un entorno de trabajo visual para
construir aplicaciones Windows que integra distintos aspectos de la programación en un entorno
unificado o integrado. La integración y facilidad de manejo hace que sea una herramienta
indispensable para el desarrollo rápido de aplicaciones o RAD
(Rapid Application Development). Guarda una gran similitud con el IDE de Visual Basic,
aunque existen ciertas diferencias que veremos.
El IDE de C++ Builder es una aplicación Windows 95 y como tal cumple con los estándares
de aspecto, diseño y comportamiento que aconseja Microsoft a los desarrolladores de
aplicaciones. En consecuencia, cualquiera que esté familiarizado con el manejo a nivel de
usuario de Windows 95 no le supondrá ningún esfuerzo manejarlo con soltura.
El entorno de desarrollo se divide, básicamente, en tres partes. Una serie de ventanas, que
pueden estar visibles u ocultas, constituyen la base de C++ Builder. El aspecto de la aplicación
al inicio de una sesión de trabajo es el mostrado en la figura 2.1.
En la parte superior se coloca la ventana principal, que contiene el menú principal, la barra de
herramientas (a la izquierda) y la paleta de componentes (a la derecha). Debajo de la ventana
principal, y a la izquierda se coloca el inspector de objetos. A la dercha del inspector de objetos
está el área de trabajo de C++ Builder, que inicialmente muestra el diseñador de formularios,
y escondido u oculto parcialmente tras éste aparece el editor de código. Veamos a grandes
rasgos la misión de cada uno de ellos.
1. Ventana principal.
Menú principal.
Barra de herramientas.
Paleta de componentes.
2. Inspector de objetos.
Para cambiar las propiedades de los objetos que forman la aplicación y seleccionar
los eventos a los que debe responder la aplicación.
Diseñador de formularios.
Es una ventana cuadriculada sobre el que se disponen los componentes para diseñar las
ventanas que formarán la aplicación.
Un típico editor de texto multiventana para ver y editar el código de la aplicación. Está
perfectamente integrado con el inspector de objetos y el diseñador de formularios.
1. Menú Principal
Se puede decir que es la ventana principal del IDE de C++ Builder y siempre está visible.
En él podemos encontrar todas las operaciones disponibles.
Tiene los menús comunes a cualquier aplicación Windows: File, Edit, Search, Help...,
además de otros que ya iremos estudiando a lo largo del curso.
En el título del menú principal aparece el nombre de la aplicación (C++ Builder) y el
nombre del proyecto/grupo de proyectos con el que actualmente se está trabajando. Por
defecto, asigan el nombre Project1 al proyecto con el que se va a trabajar, aunque éste deberá
cambiarse, lógicamente. Como veremos, el concepto de proyecto es fundamental en C++
Builder ya que es el mecanismo de organizar sensatamente todos los ficheros (formularios,
código fuente, recursos, etc.) asociados a una aplicación.
2. Barra de Herramientas
La barra de herramientas tiene como objeto acelerar las operaciones más comunes del menú
principal. Si nos acostumbramos a utilizarla agilizaremos el uso del entorno
significativamente. Su aspecto habitual es el que mostramos en la figura 2.7.
Si pasamos el ratón sobre los iconos nos aparecerán unos globos o cuadros de ayuda,
informándonos de cual es la funcionalidad de cada uno de ellos.
La barra de herramientas se puede personalizar (al igual que casi todas las partes del
entorno) pulsando con el botón derecho y seleccionando Properties.
3. Paleta de Componentes
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.
4. Diseñador de Formularios
Como hemos indicado anteriormente, es una ventana cuadriculada quer sirve para diseñar
las ventanas (o formularios) que formarán la aplicación (ver figura 2.4). 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.
Si se pincha dos veces en lugar de una, se activa el editor de código para escribir el gestor
del evento OnClick asociado a ese componente. Si ésto 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.
5. Inspector de Objetos
Se trata, sin duda, de una de las herramientas más potentes y atractivas de C++ Builder.
Su aspecto es el que mostramos anteriormente en la figura 2.3. Se trata de una ventana que
contiene dos páginas: Properties y Events. En la figura 2.9 mostramos el aspecto de las dos
páginas en cuestión para el formulario que aparece por defecto al iniciar C++ Builder.
Figura 2.9. Las dos páginas (Properties y Events) del 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.
6. Editor de Código
Permite editar el código de una aplicación de una forma cómoda. Admite coloreo simple
de la sintaxis y distintos archivos abiertos simultáneamente.
A diferencia con Visual Basic, 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á
mantenido automáticamente, y sobre todo ¡¡¡evitar modificarlo!!!.
El editor de código está relacionado muy estrechamente con el inspector de objetos. Al
hacer doble click 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.
EJERCICIO 3: Uso del inspector de objetos para escribir gestores de eventos con el editor
de código.
7. Administrador de Proyectos
En todo momento existe un único proyecto activo (en la figura 2.12, Project1), y será este
el que se ejecute si elegimos la opción Run|Run.
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.
Cualquier aplicación típica tendrá al menos una ventana. Para cada ventana (en la figura
2.12, Form1) habrá un módulo, formado por una pareja de ficheros: un .cpp (en la figura
2.12, Unit1.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.
El sistema de ayuda será una de las herramientas que más útiles nos resultará 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 (figuras 2.13, 2.14 y 2.15).
Figura 2.13. Ventana de ayuda que se despliega al pulsar F1 sobre la palabra
clave Application
Figura 2.14. Ayuda detallada sobre Application variable (for standard applications).
Figura 2.15. Ejemplo proporcionado en la ayuda sobre Application variable (VCL
Reference).
Pulsando F1 sobre cualquier opción de un menú se mostrará la ayuda asociada a esa opción
(figura 2.16).
Figura 2.16. Ventana de ayuda mostrada al pulsar F1 estando seleccionada la opción View |
Project Manager
C++ Builder proporciona algunas facilidades muy útiles a la hora de escribir código. Las más
importantes son:
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
(figura 2.17).
Figura 2.17. Ayuda para completar código: Propiedades, métodos y eventos asociados a
la clase TApplication.
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 | Environment Options | Code Insight.
El objetivo final es la creación de un programa ejecutable correcto que funcione bajo Windows.
El ejecutable se construye tomando como referencia los ficheros que forman el proyecto activo.
Para esta tarea se utilizan los menús Project y Run (figura 2.18).
Figura 2.18. Submenús Project y Run del menú principal.
Project Run
Compile Unit.
Compila el modulo fuente activo (extensión .CPP) generando un fichero objeto
(extensión .OBJ).
Make. Genera el fichero ejecutable a partir de los ficheros objeto asociados al proyecto
recompilando únicamente los módulos fuente que se hayan modificado desde la última vez
que se compilaron.
Build. Genera el fichero ejecutable a partir de los ficheros objeto asociados al proyecto
recompilando todos los módulos fuente, aunque no se hayan modificado desde la última
vez que se compilaron.
Para ejecutar el programa basta con pinchar sobre el botón correspondiente de la barra de
herramientas o seleccionar la opción Run | Run.
Para que la depuración sea más completa y versátil se incorporan las siguientes opciones en el
mismo menú:
Evaluate/Modify Ctrl+F7.
Evaluar expresiones que involucren a las variables y modificar los
valores de las variables.
Add Watch Ctrl+F5. Visualizar el contenido de una variable permanentemente.
Add Breakpoint. Añade un punto de ruptura en la línea en la que está situado el cursor. de
modo que cuando se ejecute el programa se detendrá su ejecución al llegar al siguiente
punto de ruptura.
Contiene formularios, cuadros de diálogo, módulos de datos, asistentes, DLLs, etc. que
podemos utilizar para simplificar el desarrollo de aplicaciones. Todos ellos están prediseñados
y pueden servirnos como punto de partida para nuestros propios diseños. Además se pueden
incorporar nuevos elementos que nosotros desarrollemos, consiguiendo de esta forma reutilizar
nuestros diseños.
1. Aplicaciones de consola.
Una aplicación de consola no utiliza los objetos de la VCL, y el aspecto de una aplicación
de este tipo es el generado por los compiladores "tradicionales", ejecutándose sobre una
consola MS-DOS. En cualquier caso, C++ Builder permite la creación de este tipo de
aplicaciones. Veamos cómo.
Una aplicación de consola se crea usando el asistente Console Wizard. Seleccionar File |
New | Console Wizard y en el asistente, indicar que se va a crear una aplicación de consola
(Console).
#include <condefs.h>
#include <iostream.h>
#include <conio.h>
//-----------------------------------------------------------
#pragma argsused
getch();
return 0;
}
//-----------------------------------------------------------
Pueden construirse aplicaciones visuales (hacen uso de la VCL) sin necesidad de usar el
diseñador de formularios.
1. Ejemplo 1: Saludo.
En este ejemplo escribiremos un programa que lanza una ventana de mensaje con un
saludo.
El primer paso es crear una aplicación de la manera usual: Seleccionar File | New
Application. Como la aplicación no tendrá un formulario y por defecto se asocia uno a
la aplicación debemos borrarlo. Activar el formulario y a continuación
seleccionar Project | Remove from project.Unit1.cpp tiene asociado el formulario
principal Form1. Confirmar el borrado y de esta forma se eliminan
tanto Unit1.cpp como Unit1.h del proyecto vigente. Para escribir el código del
programa, seleccionar Project | View Source y escribir el siguiente código:
//-----------------------------------------------------------
#include <vcl.h>
//-----------------------------------------------------------
Como antes, en primer lugar se crea una aplicación: Seleccionar File | New Application.
Activar el formulario para eliminarlo del proyecto: seleccionar Project | Remove from
project. Finalmente, para escribir el código del programa, seleccionar Project | View
Source y escribir el siguiente código:
//-----------------------------------------------------------
#include <vcl.h>
//-----------------------------------------------------------
return 0;
}
//-----------------------------------------------------------
......
//-----------------------------------------------------------
ShowMessage (cadena);
delete []vector;
return 0;
}
//-----------------------------------------------------------
Componentes
Los componentes son unos elementos genéricos con una funcionalidad muy concreta, cuya
única finalidad es la reutilización. Cada uno de ellos está destinado a realizar una tarea típica
en una aplicación.
Un componente de la VCL es una clase que caracteriza a un control de Windows
agregando propiedades, métodos y gestores de eventos a cada control.
La filosofía de los componentes en C++ Builder es exactamente la misma que en Visual Basic.
Esto es tanto así que algunos componentes pueden utilizarse en ambos entornos (los
componentes ActiveX).
Standard: Incluye los componentes comunes y más habituales de los programas Windows.
Additional: Los componentes de esta página son controles especializados. propios de C++
Builder.
Win32: Componentes de cuadros de diálogo propios de Windows 95/NT.
System: Esta página incluye controles muy especializados para interacción con el sistema.
Internet: Componentes para distintos protocolos de acceso a Internet.
Data Access y Data Controls: Componentes especializados para acceso a bases de datos.
Midas: Esta página incluye componentes que permiten el desarrollo de aplicaciones
multicapa con MIDAS.
Decision Cube: Incluye componentes para realizar análisis multidimensionales de datos
con objeto de tomar decisiones.
QReport: Componentes para diseñar rápidamente informes y resúmenes.
Dialogs: Contiene cuadros de diálogo comunes en aplicaciones Windows listos para usar.
Win 3.1: Componentes propios de Windows 3.1, la mayoría de ellos se mantienen en C++
Builder sólo por compatibilidad con versiones anteriores.
Samples: Componentes de demostración (cómo hacer componentes personalizados).
Active X: Los componentes de esta página son objetos Active X, creados por otros
desarrolladores puede que utilizando otros lenguajes de programación.
De un componente podemos destacar tres aspectos: sus propiedades, los métodos que puede
ejecutar y los eventos a los que puede responder.
Propiedades.
Las propiedades son los elementos del componente que configuran su aspecto y
controlan su comportamiento.
Muchos componentes tienen propiedades en común. Por ejemplo, todos los componentes
visuales tienen las propiedades Top y Left que controlan la posición del componente en
el formulario, tanto en tiempo de diseño como en tiempo de ejecución.
Métodos.
Los métodos son funciones asociadas al componente que pueden invocarse para que el
componente realice distintas acciones.
Por ejemplo, todos los componentes visuales tienen un método llamado Show() para
mostralos y otro llamado Hide() para ocultarlos. En el ejemplo 3 invocamos al
método Terminate() asociado a la aplicación que se estaba ejecutando
(Objeto Application) para terminar su ejecución como respuesta a la pulsación del botón.
En C++ los métodos son miembros de una clase, al igual que las propiedades.
Eventos.
Se dice que Windows está orientado a eventos. Esto significa que cualquier programa
está condicionado por lo eventos que ocurren en el entorno Windows. Un programa
Windows está continuamente sondeando al sistema ante la ocurrencia de cualquier
evento y de ocurrir, Windows avisa al programa enviándole un mensaje. Un programa
Windows está ocioso la mayor parte del tiempo esperando a que ocurra algún evento.
EJERCICIO
6: Gestores de
eventos.
Los componentes no visuales se pueden colocar en los formularios de la misma manera que los
controles, aunque en este caso su posición es irrelevante.
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 todo esto es que los entornos de programación visuales, en su afán de aportar simplicidad
y estructuración a la programación en Windows, han desarrollado diversos Marcos de
Trabajo. Un marco de trabajo es una fase intermedia que se coloca por encima de la API para
aportar mayor sencillez a las aplicaciones. Normalmente estos marcos de trabajo son orientados
a objetos y se implementan como bibliotecas del lenguaje base, por ello también se suelen
denominar bibliotecas de clases.
Tan importantes son los marcos de trabajo, que dominar un entorno de programación visual,
suele traducirse en conocer el leguaje base del entorno, y su marco de trabajo.
OWL (Object Windows Library o Biblioteca de Objetos para Windows) fue un marco de
trabajo desarrollado por Borland e incorporado a los compiladores Borland C++ (versiones 3
y sucesivas) y supuso un importante hito en la programación para Windows por su potencia y
facilidad de uso.
Aunque MFC se usa más que OWL (Microsoft...) la arquitectura de OWL es, técnicamente,
mejor que MFC.
En 1995, Borland lanzó al mercado Delphi, que supuso la revolución en la programación para
Windows e inició el desarrollo rápido y sencillo de aplicaciones visuales. Delphi ofrecía el
desarrollo rápido de aplicaciones (RAD) empleando componentes (objetos que pueden ubicarse
en formularios y manipulados por medio de propiedades, métodos y eventos). Esta forma de
trabajo se hizo más popular con Visual Basic. Delphi empleaba como base al lenguaje Object
Pascal (una ampliación de Pascal que incorpora programación orienta a objetos) y permitía la
creación de programas ejecutables independientes que no requerían intérprete, por lo que se
ejecutaban mucho más rápido que los de Visual Basic.
Lo más relevante desde el punto de vista técnico es que Borland creó la VCL (Visual Class
Library o Biblioteca de Componentes Visuales) que es un marco de trabajo para crear
aplicaciones Windows diseñada en torno al concepto de componente (propiedades, métodos y
eventos). La VCL desarrollada para Delphi es la misma que se emplea como núcleo de C++
Builder, de hecho, está escrita en Object Pascal...
La VCL hace un uso extensivo del concepto de herencia. El objetivo final de la VCL es crear
clases que representan a componentes, aunque algunas clases no hagan referencia componentes
concretos: realizan tareas de gestión interna y se emplean como clases bases para derivar
mediante herencia otras clases. En la figura 4.2 mostramos una pequeña parte de la jerarquía de
clases que forman la VCL. En las secciones 4.1, 4.2 y 4.3 describimos con más detalle las clases
más importantes de la VCL.
TObject
Suele ser una buena idea derivar nuestras propias clases de TObject, porque aunque no
sea normal que el programador haga uso de los métodos proporcionados por TObject, si
lo es que lo haga C++ Builder en tiempo de ejecución.
TPersistent
Esta clase tiene que ver con la habilidad de un objeto de almacenarse en disco o en
memoria, asignarse a otros objetos, así como otros detalles internos de C++ Builder que
no es preciso conocer.
TComponent
Ésta es una de las clases más importantes de la VCL, ya que la mayoría de los objetos
que se manejan en una aplicación son componentes. Esta clase proporciona toda la
funcionalidad que requiere un componente básico.
La funcionalidad de TComponent permite que los objetos aparezcan en la paleta de
componentes y que sean manipulados por el diseñador de formularios, además de otras
capacidades comunes a los componentes.
TControl
Generaliza a los controles que tienen una representación visual, pero no pueden recibir
el foco: el usuario podrá verlos pero no interactuar con ellos. Suelen ser controles para
visualizar texto (no editable en tiempo de ejecución), gráficos o dibujos. Poseen una
propiedad Canvas que permite acceder a su área de dibujo.
TWinControl
Son los controles típicos de Windows, que pueden recibir el foco, contener otros
controles, y además poseen un manejador de ventana. Un manejador de ventana es un
identificador que proporciona Windows para el control, por lo que podemos decir
que Windows tiene un conocimiento directo de la existencia del mismo.
TApplication
La clase TApplication encapsula una aplicación Windows por lo que caracteriza las
operaciones fundamentales de un programa en Windows. TApplicationsimplifica el
interface entre el programador y el sistema operativo, ocupándose de tareas como
gestionar el paso de mensajes, proporcionar la ayuda contextual, establecer los textos de
sugerencia de los botones y barras de estado, procesamiento de "teclas rápidas", gestión
de excepciones, ejecutar cuadros de mensajes, etc.
Método Descripción
Establece la última ventana activa como la que se muestra por encima de todas las
BringToFront()
demás.
Crea un nuevo formulario. Generalmente, el programador no usa este método ya
CreateForm() que las líneas de código para la creación de formularios las añade
automáticamente C++ Builder.
HelpCommand(), Se emplean para gestionar la ayuda asociada a una aplicación. Generan un
HelpContext() y evento OnHelp, y si no hay un gestor para este evento, se gestiona a través
HelpJump() de WinHelp.
Muestra un mensaje al usuario en cuadro de diálogo que puede incorporar botones.
MessageBox() Devuelve un valor que depende del botón seleccionado para cerrar el cuadro de
diálogo.
Minimize() minimiza una aplicación y la aloja en la barra de tareas de Windows,
Minimize() y
mientras que Restore() reestablece el tamaño que tenía la aplicación antes de ser
Restore()
minimizada.
Run() ejecuta la aplicación, mientras Terminate() termina la ejecución de una
Run() y Terminate()
aplicación.
Muestra un cuadro de diálogo cuando se produce una excepción que no es
ShowException() gestionada por la aplicación. Para especificar qué excepciones pueden gestionarse
en la aplicación, construir un gestor para el evento OnException.
HandleException() Proporciona una manera de gestionar excepciones por defecto en la aplicación.
Evento Descripción
Ocurren cuando se activa o desactiva la aplicación, respectivamente.
Una aplicación se activa cuando se genera la aplicación (empieza a ejecutarse) o
OnActivate y
cuando estaba activa otra aplicación y una ventana de la aplicación a la que se refiere
OnDeactivate
recibe el foco. Una aplicación se desactiva cuando el usuario selecciona otra
aplicación.
OnHint ocurre cuando el cursor se coloca sobre un control o una opción de un menú
que puede mostrar un cuadro de sugerencia. Se suele escribir un gestor para este
evento cuando se quiere mostrar el texto largo de sugerencia en la barra de estado.
OnHint y
OnShowHint ocurre cuando la aplicación va a mostar un cuadro de sugerencia. Se
OnShowHint
suele usar para modificar la apariencia del cuadro.
TForm
Propiedad Descripción
ActiveControl Establece qué componente tiene el foco cuando se abre el formulario.
Enabled Indica si el formulario está activo (si puede recibir el foco).
AutoScroll,
HorzScrollBar y Controlan conjuntamente las barras de desplazamiento de un formulario.
VertScrollBar
BorderIcons Indica qué iconos aparecen en la barra de título de un formulario.
BorderStyle Indica qué tipo de borde debe tener el formulario.
Caption indica la cadena que aparece en la barra de título del formulario mientras
Caption y Name que Name indica con qué nombre se refiere al formulario en la aplicación (en el
código).
Color Color de fondo del formulario.
Cursor Especifica qué cursor se muestra cuando está sobre el formulario.
Permite especificar las propiedades de la fuente de letra que se usará en el
Font
formulario. Se aplica a todos los componentes ubicados en el formulario.
Establece el icono que se verá en la barra de título cuando se muestre el formulario
Icon
en tiempo de ejecución y cuando se minimize.
Height y Width Altura y anchura (en píxeles) del formulario.
Altura y anchura (en píxeles) del área de cliente del formulario (el área de cliente es
ClientWidth y
la que queda dentro de los bordes del formulario y por debajo de la barra de título y
ClientHeight
de la barra de menú). Al modificar estas propiedades se actualizan Width y Height.
Left y Top Coordenadas X e Y del formulario (su esquina superior izquierda) en la pantalla.
Position Determina el tamaño y la posición del formulario.
FormStyle Para especificar si un formulario es o no parte de una aplicación multiformulario.
HelpFile y Para especificar el fichero de ayuda asociado a la aplicación y gestionar la ayuda
HelpContext contextual.
Hint especifica el texto que debe aparecer en el cuadro de ayuda o texto de
Hint y sugerencia asociado al formulario. Este cuadro aparece cuando ocurre el
ShowHint evento OnHint. Por defecto se muestra únicamente el cuadro asociado al
componente sobre el que está el ratón por lo que usualmente se emplea esta
propiedad para mostrar la información extensa de este componente en una barra de
estado, por ejemplo.
Propiedad Descripción
Active Indica si el formulario está activo (si tiene el foco).
El lienzo es la superficie del formulario sobre la que se puede dibujar. La
propiedad Canvas da acceso a esta superficie para dibujar líneas, mapas de bits,
Canvas
texto, ... en el área de cliente.
Suele usarse con el gestor del evento OnPaint.
ClientRect Coordenadas de los cuatro puntos que delimitan el área de cliente del formulario.
El valor devuelto cuando se cierra un formulario modal (abierto con el
ModalResult
método ShowModal()).
Proporciona información acerca del estado en que se encuentra un formulario (si se
FormState
está creando, si es visible, si es modal, etc.).
Método Descripción
BringToFront() y
Coloca al formulario en primer plano o en último, respectivamente.
SendToBack()
Hide() Oculta el formulario (establece la propiedad Visible a falso).
Print() Imprime el contenido del formulario.
Show() y Para mostrar formularios. ShowModal() ejecuta (abre) el formulario modalmente:
ShowModal() debe cerrarse para que el usuario pueda seguir trabajando con la aplicación.
Close() y Close() cierra el formulario tras llamar a CloseQuery() para asegurarse de que es
CloseQuery() correcto cerrarlo. Esta última llama al manipulador del evento OnCloseQuery.
Activa el formulario y lo coloca en primer plano, poniendo a verdad la
SetFocus() propiedad Active. Además, el componente especificado en la
propiedad ActiveControl recibe el foco.
Devuelve verdad si el formulario puede recibir el foco (si las
CanFocus()
propiedades Visible y Enabled están a verdad).
Establece simultáneamente los valores de las
SetBounds()
propiedades Top, Left, Width y Height.
ClientToScreen() y Convierte las coordenadas del área de cliente en coordenadas de pantalla y
ScreenToClient() viceversa.
Invalidate(),
Refresh(),
Redibujar un formulario.
Repaint() y
Update()
Release() Destruye un formulario y libera toda la memoria asociada.
Una acción puede desencadenar varios eventos y el orden en ocurren puede ser muy
importante:
Evento Descripción
Ocurren cuando se activa o desactiva un formulario, respectivamente.
OnActivate y
Un formulario se activa cuando se recibe el foco y se desactiva cuando el foco pasa a
OnDeactivate
otro formulario de la misma aplicación.
OnCreate y OnCreate ocurre cuando se crea inicialmente el formulario (sólo ocurre un evento de
OnDestroy este tipo por formulario) y OnDestroy cuando se destruye.
OnClose y El evento OnClose ocurre cuando se cierra un formulario. Hace una llamada
OnCloseQuery a OnCloseQuery para asegurarse de que es correcto cerrarlo.
OnMouseDown,
OnMouseMove,
Para responder a los eventos que suceden al mover el ratón o cuando se pincha con él
OnMouseUp,
sobre el formulario.
OnClick y
OnDblClick
OnKeyDown,
OnKeyUp y Para responder a los eventos que suceden al pulsar alguna tecla sobre el formulario.
OnKeyPress
OnHelp Ocurre cuando se recibe una petición de ayuda en el formulario.
Ocurren cuando se oculta o se muestra el formulario, respectivamente (cuando su
OnHide y
propiedad Visible se establece a falso o verdad, respectivamente).
OnShow
OnShow ocurre justo antes de que el formulario se haga visible.
Ocurre cuando el formulario necesita ser redibujado (refrescado). Esto ocurre muy
frecuentemente, y aunque los componentes del formulario se redibujan por sí mismos
OnPaint
generalmente, a veces es preciso redibujar "manualmente" el formulario.
Ocurre antes de que cualquier control sea redibujado.
Ocurre cuando se modifica el tamaño del formulario, justo después de redimensionar
OnResize
el formulario.
OnShortCut Ocurre cuando se pulsa una tecla, antes de que ocurra OnKeyDown.
Este grupo abarca un amplio espectro de clases. Básicamente, incorpora a todos los
componentes que aparecen en la paleta de componentes del IDE de C++ Builder(ver
sección 3.1) lo que implica que se pueden colocar sobre un formulario.
La paleta de componentes
La paleta de componentes se estructura, por defecto, en 14 páginas. En la siguiente tabla
agrupamos las páginas según nuestra conveniencia, siguiendo el criterio de utilidad en este
curso. Las páginas cuyo título está precedido por el símbolo están traducidas al español.
Standard
Data Access
Additional ActiveX
Data Controls Internet
Win32 Samples
QReport MIDAS
System Win 3.1
Decision Cube
Dialogs
Aunque cada componente tiene sus propias propiedades, métodos y eventos, si es verdad que
existen algunas propiedades comunes, que comentaremos brevemente.
Propiedad Descripción
Establece distintas posiciones y ajustes del componente relativos al componente que
Align
lo contiene.
Caption indica el texto que acompaña a algunos componentes.
Las siguientes propiedades, aunque se usan frecuentemente, no están disponibles para todos
los componentes.
Propiedad Descripción
BorderStyle Para diferenciar al componente del formulario o integrarlo en su fondo.
Height y Width Altura y anchura (en píxeles) del componente.
HelpContext Para asociar un número de índice de un fichero de ayuda a un componente.
Left y Top Coordenadas X e Y del componente (su esquina superior izquierda).
TabOrder y Para establecer el order de tabulación y determinar si el componente forma o no
TabStop parte de la secuencia de tabulación, respectivamente.
No se emplean habitualmente porque las acciones que realizan se efectúan modificando las
propiedades del componente.
Método Descripción
ClientToScreen() y Convierte las coordenadas del área de cliente en coordenadas de pantalla y
ScreenToClient() viceversa.
Hide() y Hide() oculta el componente. Puede volver a hacerse visible posteriormente
Show() con Show(). Ambos métodos modifican la propiedad Visible.
Invalidate(),
Refresh(),
Redibujar un componente.
Repaint() y
Update()
Establece simultáneamente los valores de las
SetBounds()
propiedades Top, Left, Width y Height.
SetFocus() Sitúa el foco sobre un componente y lo convierte en el componente activo.
Devuelve verdad si el componente puede recibir el foco (si las
CanFocus()
propiedades Visible y Enabled están a verdad).
Una acción puede desencadenar varios eventos y el orden en ocurren puede ser muy
importante:
Los objetos de la VCL deben crearse siempre dinámicamente (con new). Esto es así porque
deben de localizarse en el heap, y no en la pila.
La VCL no asigna valores por defecto a las funciones.
No se puede usar herencia múltiple con clases VCL.
Pizarra
En primer lugar, crear el directorio Pizarra y, si procede, una nueva aplicación ( File | New
Applicaction).
Contiene 3 componentes:
PaintBox->Canvas->Pen->Color = clBlack;
PaintBox->Canvas->Brush->Color = clYellow;
PaintBox->Canvas->Ellipse (100, 100, 150, 150);
// Dibujar un cuadrado
PaintBox->Canvas->Pen->Color = clRed;
PaintBox->Canvas->Brush->Color = clRed;
PaintBox->Canvas->Rectangle (200, 100, 250, 150);
}
//-----------------------------------------------------------
4. Generar el ejecutable.
Controles de edición .
En primer lugar, crear el directorio Edicion y, si procede, una nueva aplicación ( File | New
Applicaction).
Contiene 8 componentes: tres Label (solapa Standard), tres Edit (solapa Standard), y dos
botones BitBtn (solapa Additional).
Utilizando el inspector de objetos, cambiar las propiedades de estas componentes prestando
especial cuidado al nombre (Name) de forma que los nombres queden como se indica en la
figura:
Añadir un nuevo formulario al proyecto: seleccionar File | New Form y fijar Name
=SaludoBox y Caption= Cuadro de salutación. Este formulario tiene un único
componente Label llamada Label. El aspecto del formulario será el siguiente:
Guardar el formulario (con los ficheros asociados). Seleccionar File | Save all y
guardar Unit1.cpp como Saludo.cpp (observar que Unit1.h cambia a Saludo.h).
4. Escribir el código.
En este caso, sólo se escribirá código para el evento OnClick del componente BotonOK del
formulario principal. Seleccionar en el inspector de objetos dicho componente, la
pestaña Events y hacer doble click el gestor del evento OnClick. El gestor de este evento
quedará como sigue:
//-----------------------------------------------------------
Application->MessageBox (
"Debe especificar todos los campos",
"Error en la entrada de datos", MB_OK);
}
else {
SaludoBox->Show();
EditNombre->Text = "";
EditApellido1->Text = "";
EditApellido2->Text = "";
EditNombre->SetFocus();
}
}
//-----------------------------------------------------------
5. Generar el ejecutable.
Observar que se produce un error de compilación - muy habitual, todo hay que decirlo - ya
que no se puede encontrar la definición de SaludoBox, objeto que es usado
en FuncsEdicion.cpp. De hecho, si miramos FuncsEdicion.cpp observaremos que este
fichero no incluye a Saludo.h. Estando activo en el editor de código FuncsEdicion.cpp,
seleccionar File | Include Unit Hdr y seleccionar Saludo. Observar que se añade la
línea #include "Saludo.h".
Como ejemplo de ejecución, si el usuario introduce los siguientes datos en las líneas de
edición:
1. Resulta poco profesional que la única posibilidad de cerrar un formulario sea pinchar
sobre el botón del aspa situado en el marco de una ventana. Añadir al formulario
secundario un botón para cerrarlo.
En este ejemplo se explica cómo crear rápidamente una aplicación para Windows con C++
Builder. La aplicación que se va a presentar consiste en un editor de texto con bastante
funcionalidad, aunque muy mejorable. No debe entenderse que la aplicación presentada está
cerrada, más bien al contrario, y el alumno puede añadirle más funcionalidad, lo que le
permitirá ampliar sus conocimientos sobre programación de aplicaciones visuales con C++
Builder.
Este ejercicio se estructura como sigue:
Mostramos con profundidad cómo configurar un formulario, desde añadir una barra rápida
hasta cuadros de diálogo. En esta sección se presentan los componentes habituales de una
aplicación Windows.
Una vez diseñado el formulario hay que escribir el código C++ de los manipuladores de
eventos asociados a los componentes
Mostramos cómo añadir cuadros de pista a los botones rápidos y cómo mostrar información
en la barra de estado.
Como referencia, esta es la estructura del proyecto que vamos vamos a crear, tal como debe
verse en el gestor de proyectos.
1. Crear y configurar el proyecto.
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.
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.
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.
Ejemplo. Crear un directorio (p.e. Ejercicio) para guardar los ficheros asociados al
proyecto.
A) Si se acaba de arrancar C++ Builder aparece, por defecto aparece 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.
1. Project1.bpr,fichero de proyecto.
2. Project1.cpp, fichero que contiene la función WinMain(),
3. 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), y
4. Unit1.h (especificacion de los componentes del formulario principal).
2. Guardar ficheros asociados a ventanas (File | Save As) en el directorio adecuado para dar
nombres significativos a los ficheros.
CONTINUAMOS…
En primer lugar, crear el directorio EjemploEditor y, si procede, una nueva aplicación ( File
| New Applicaction).
2. Guardar (File | Save As) la unidad asociada al formulario (Unit1.cpp, por defecto)
como FuncsEditor.cpp. Observar que Unit1.h ha cambiado automáticamente
a FuncsEditor.h
3. Guardar (File | Save Project As) el proyecto (Project1.bpr, por defecto)
como MiEditor.bpr.
4. Dar un nombre a la aplicación y fijar un icono ( Project | Options | Application).
Dar como título: Mi editor de texto 1.0 y seleccionar un icono.
Cambiar la propiedad Name por Memo, seleccionar la propiedad Lines y dejar limpio su
contenido con el editor de cadenas.
Name = SpeedBar
Height = 32
BevelOuter = bvNone
Caption = (Dejar en blanco)
Align = alTop
o Colocar los botones de acceso rápido de la barra rápida.
Se colocarán los botones para abrir fichero, salvar fichero y salir del programa.
Seleccionar el componente Memo y fijar la propiedad Align= alClient. Añadir una barra
de scroll vertical: cambiar la propiedad ScrollBars a ssVertical.
En primer lugar, añadiremos un menú principal (sección 3.1) junto con los submenús
asociados: Ficheros (sección 3.2), Edición (sección 3.3 y Ayuda (sección 3.4). El menú y
los submenús son los típicos de las aplicaciones Windows. Finalmente, crearemos un menú
contextual (sección 3.5).
Las cabeceras de los submenús serán: Ficheros, Edicion y Ayuda. Deseamos que se abra
un submenú asociado a cada una de estas categorías cuando se pinche con el ratón sobre
éstas.
Añadir las opciones: Nuevo, Abrir, Guardar, Guardar como, (separador), Imprimir,
Configurar impresora, (separador) y Salir.
Este submenú se creará usando una plantilla de menú. Seleccionar del menú principal la
cabecera Edicion. Pulsar el botón derecho del ratón y seleccionar Insert from Template |
Edit Menu. Borrar la antigua cabecera Edicion. Camiar la nueva cabecera Edit para
dejarla Name=EditMenu y Caption=&Edicion.
Añadir las opciones: Cortar, Copiar, Pegar, (separador) y Acerca de. Para cada opción:
Cada opción del menú y cada botón de la barra rápida debe tener asociada una acción. La
acción se asocia a cada componente mediante el gestor de eventosdel inspector de objetos.
Seleccionar Ficheros | Salir del menu principal. Se activa el editor de código, mostrando el
gestor que se va a completar:
//------------------------------------------------------------
}
//------------------------------------------------------------
{
Application->Terminate();
}
//------------------------------------------------------------
Como el botón rápido para salir ExitBtn debe realizar la misma tarea, le asignamos las
misma función al evento OnClick. Para ello, seleccionar el componente ExitBtn en el
inspector de objetos, pulsar en la pestaña Events y en en evento OnClick.
Para seleccionar una de las funciones ya escritas, desplegar la lista de funciones pulsando
sobre la flecha que aparece a la derecha del evento OnClick (ahora sólo
está FileExitClick()) y seleccionarla. Dicho de otra forma, la función FileExitClick() se
activa desde Ficheros | Salir y desde el botón rápido ExitBtn.
Para cada opción, proceder de la misma forma. Así, el resultado final debe ser:
42. Añadir tres componentes Label (solapa Standard) con textos (Caption): Mi editor de
texto, Versión 1.0, y © Curso de Programación Visual, respectivamente.
43. Añadir un icono (el mismo que se asoció a la aplicación) seleccionando un
componente Image (solapa Additional). Para este componente, fijar Autosize = true.
44. Añadir un botón de OK. Corresponde al componente BitBtn (solapa Additional).
Fijar Kind = bkOK.
45. Crear un marco que englobe a los tres componentes Label. Seleccionar el
componente Bevel (solapa Additional) y enmarcar el texto. Fijar Shape= bsFrame.
Añadir esta unidad al proyecto. Seleccionar FuncsEditor.cpp y File | Include Unit Hdr.
Seleccionar About.
Ahora, cuando se seleccione Ayuda | Acerca de ... o Acerca de ... en el menú contextual
debe abrirse la ventana que hemos creado. El código que abre esta ventana se completa
como sigue: seleccionar la opción Ayuda | Acerca de ... y completar el
manipulador HelpAboutClick() de la siguiente forma:
//-----------------------------------------------------------
AboutBox->ShowModal();
//-----------------------------------------------------------
Observar que al poner el cursor sobre el botón se muestra el cuadro de pista pero no en la
barra de estado. Modificar las propiedades Hint de los
botonesFileSaveBtn y ExitBtn fijándolas a Guardar fichero | Guardar en un fichero el
texto mostrado y Salir | Terminar la ejecución del programa, respectivamente, y fijar para
ambos ShowHint = true.
Para que aparezca el texto largo en la barra de estado basta con establecer la
propiedad AutoHint de la barra de estado a true.
Sonidos
En este ejemplo se crará un formulario que contendrá un componente MediaPlayer que servirá
para reproducir ficheros .WAV. Utilizaremos la gestión de excepciones para controlar la correcta
ejecución del programa.
En primer lugar, crear el directorio Sonidos. y, si procede, una nueva aplicación ( File | New
Application).
2. Configurar el formulario.
La gestión de las interrupciones capturadas se realiza con una función común cuyo
prototipo es:
void Error (AnsiString & name, Exception & e);
que se escribirá por encima de todas las funciones de Ppal.cpp. Así, los gestores de los
eventos OnClick asociados a los botones serán los siguientes:
//--------------------------------------------------------------
if (OpenDialog1->Execute())
{
MediaPlayer1->FileName = OpenDialog1->FileName;
try {
MediaPlayer1->Open();
MediaPlayer1->Wait = true;
MediaPlayer1->Play();
MediaPlayer1->Close();
}
catch (Exception & e) {
Error (MediaPlayer1->FileName, e);
}
} // if (OpenDialog1->Execute())
}
//--------------------------------------------------------------
Cuando se ejecuta este programa, si se pulsa en el botón Error (se supone que el fichero de
sonido que se quiere reproducir no existe) aparece la siguiente ventana:
En cambio, si se quiere reproducir un fichero cuyo formato no sea .wav aparece la siguiente
ventana:
La imagen se carga en la opción del Panel Izquierdo Object Inspector en Picture - None …
Seleccione la opción Load (Cargar) y Utilice la ruta donde se encuentra la imagen que desea
insertar.