Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3.2.2 PDF
Tema 3.2.2 PDF
Descripcin
Active
Hint
Hint especifica el texto que debe aparecer en el cuadro de ayuda o texto de sugerencia asociado
a la aplicacin. Este cuadro aparece cuando ocurre el evento OnHint. Por defecto se muestra
nicamente el cuadro asociado al componente sobre el que est el ratn por lo que usualmente
se emplea esta propiedad para mostrar la informacin extensa de este componente en una barra
de estado, por ejemplo.
ShowHint
ShowHint determina si los cuadros de sugerencia estarn activados o desactivados para toda la
aplicacin.
Pueden emplearse las funciones GetShortHint() y GetLongHint() para obtener las dos partes de
la propiedad Hint.
MainForm
ShowMainForm
Icon y Title
HelpFile y
CurrentHelpFile
Descripcin
BringToFront()
Establece la ltima ventana activa como la que se muestra por encima de todas las dems.
CreateForm()
Crea un nuevo formulario. Generalmente, el programador no usa este mtodo ya que las lneas de
cdigo para la creacin de formularios las aade automticamente C++ Builder.
HelpCommand()
HelpContext()
HelpJump()
Se emplean para gestionar la ayuda asociada a una aplicacin. Generan un evento OnHelp, y si no
hay un gestor para este evento, se gestiona a travs de WinHelp.
MessageBox()
Muestra un mensaje al usuario en cuadro de dilogo que puede incorporar botones. Devuelve un
valor que depende del botn seleccionado para cerrar el cuadro de dilogo.
Minimize()
Restore()
Run()
Ejecuta la aplicacin.
Terminate()
ShowException()
Muestra un cuadro de dilogo cuando se produce una excepcin que no es gestionada por la
aplicacin. Para especificar qu excepciones pueden gestionarse en la aplicacin, debemos
construir un gestor para el evento OnException.
10
Descripcin
OnActivate
OnDeactivate
OnHint
OnHint ocurre cuando el cursor se coloca sobre un control o una opcin de un men que
puede mostrar un cuadro de sugerencia.
Se suele escribir un gestor para este evento cuando se quiere mostrar un texto largo de
sugerencia en una barra de estado.
OnShowHint
OnMinimize
OnRestore
OnHelp
Ocurre cuando la aplicacin recibe una peticin de ayuda. Los mtodos HelpContext() y
HelpJump() gestionan de forma automtica este evento.
OnException
OnShortCut
Se emplea este gestor para realizar acciones antes de que el formulario o los controles del
formulario gestionen los eventos oportunos a la pulsacin de teclas.
Cuando se pulsa una tecla se desencadenan los siguientes eventos, por este orden:
OnKeyDown, OnKeyPress, y OnKeyUp.
11
12
13
Descripcin
ActiveControl
Enabled
AutoScroll,
HorzScrollBar
VertScrollBar
BorderIcons
BorderStyle
Caption
Indica la cadena que aparece en la barra de ttulo del formulario mientras que Name
Name
Color
Cursor
Font
Permite especificar las propiedades de la fuente de letra que se usar en el formulario. Se aplica a todos
los componentes ubicados en el formulario o componentes hijo.
Icon
Establece el icono que se ver en la barra de ttulo cuando se muestre el formulario en tiempo de ejecucin
y cuando se minimice.
Altura y anchura (en pxels) del rea de cliente del formulario (el rea de cliente es la que queda dentro de
los bordes del formulario y por debajo de la barra de ttulo y de la barra de men). Al modificar estas
propiedades se actualizan Width y Height.
14
Descripcin
Left y Top
Position
FormStyle
HelpFile
HelpContext
Hint
Especifica el texto que debe aparecer en el cuadro de ayuda o texto de sugerencia asociado al formulario.
Este cuadro aparece cuando ocurre el evento OnHint. Por defecto se muestra nicamente el cuadro asociado
al componente sobre el que est el ratn por lo que usualmente se emplea esta propiedad para mostrar la
informacin extensa de este componente en una barra de estado, por ejemplo.
ShowHint
Visible
Indica si el formulario es visible o no. Los mtodos Show() y ShowModal() hacen que un formulario sea
visible y lo colocan por encima de todos.
WindowState Para establecer el estado inicial del formulario (normal, minimizado o maximizado) o consultar su estado.
Descripcin
Active
Canvas
El lienzo es la superficie del formulario sobre la que se puede dibujar. La propiedad Canvas da acceso a
esta superficie para dibujar lneas, mapas de bits, 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.
ModalResult
El valor devuelto cuando se cierra un formulario modal (abierto con el mtodo ShowModal()).
FormState
Proporciona informacin acerca del estado en que se encuentra un formulario (si se est creando, si es
visible, si es modal, etc.).
15
Descripcin
BringToFront()
SendToBack()
Hide()
Print()
Show()
ShowModal()
Para mostrar formularios. ShowModal() ejecuta (abre) el formulario modalmente: debe cerrarse para
que el usuario pueda seguir trabajando con la aplicacin.
Close()
CloseQuery()
Close() cierra el formulario tras llamar a CloseQuery() para asegurarse de que es correcto cerrarlo.
Esta ltima llama al manipulador del evento OnCloseQuery.
SetFocus()
Activa el formulario y lo coloca en primer plano, poniendo a true la propiedad Active. Adems, el
componente especificado en la propiedad ActiveControl recibe el foco.
CanFocus()
Devuelve true si el formulario puede recibir el foco (si las propiedades Visible y Enabled estn a true).
SetBounds()
Establece simultneamente los valores de las propiedades Top, Left, Width y Height.
ClientToScreen()
ScreenToClient()
Invalidate()
Refresh()
Repaint()
Update()
Release()
16
Descripcin
OnActivate
OnDeactivate
OnCreate
OnDestroy
OnCreate ocurre cuando se crea inicialmente el formulario (slo ocurre un evento de este tipo por
formulario) y OnDestroy cuando se destruye.
OnClose
OnCloseQuery
El evento OnClose ocurre cuando se cierra un formulario. Hace una llamada a OnCloseQuery para
asegurarse de que es correcto cerrarlo.
OnMouseDown
OnMouseMove
Para responder a los eventos que suceden al mover el ratn o cuando se pincha con l sobre el
OnMouseUp
formulario.
OnClick
OnDblClick
OnKeyDown
OnKeyUp
OnKeyPress
Para responder a los eventos que suceden al pulsar alguna tecla sobre el formulario.
OnHelp
OnHide
OnShow
OnPaint
Ocurre cuando el formulario necesita ser redibujado (refrescado). Esto ocurre muy frecuentemente, y
aunque los componentes del formulario se redibujan generalmente por s mismos, a veces es preciso
redibujar "manualmente" el formulario.
OnResize
Ocurre cuando se modifica el tamao del formulario, justo despus de redimensionar el formulario.
Tema 3.2.2.- Componentes en C++ Builder
17
18
19
20
21
22
Componentes
Ya hemos visto que los componentes que podemos insertar en nuestros formularios estn organizados
en carpetas (pestaas o pginas) en la Paleta de Componentes del IDE. Los componentes pueden ser
visibles y no visibles.
Pestaa Standar. Estos componentes son los elementos de control ms comunes de Windows.
Componente Visible?
Descripcin breve
MainMenu
No
PopUpMenu
No
Diseo de mens contextuales o emergentes que se muestras al hacer clic con el botn
derecho del ratn.
Label
Si
Para mostrar texto no accesible por el usuario, como son los ttulos.
Edit
Si
Presenta un rea donde el usuario puede introducir o modificar texto en una sola lnea.
Memo
Si
Presenta un rea donde el usuario puede introducir o modificar varias lneas de texto.
Button
Si
Un botn permite que los usuarios lo seleccionen para realizar una operacin.
CheckBox
Si
RadioButton
Si
ListBox
Si
ComboBox
Si
Conjunta la funcionalidad del Edit y del ListBox para presentar una lista de opciones.
ScrollBar
Si
Barra de desplazamiento para poder desplazar en pantalla la parte visible de una lista o ficha,
o trasladarse por un rango en incrementos.
GroupBox
Si
RadioGroup
Si
Panel
Si
23
Componentes
Pestaa Standar
Componente Visible?
Descripcin breve
Frames
Si
ActionList
No
Mantiene una lista de las acciones que pueden ser usadas por componentes y controles,
como opciones de men y botones.
24
Componentes
Ejemplo 96.- Modificacin y consulta de propiedades en tiempo de ejecucin
Hasta este momento el aspecto de la aplicacin en tiempo de ejecucin ser
Una vez llegados a este punto vamos a dar sentidos
a los botones, a la casilla de seleccin, a las
opciones de seleccin (ahora no visibles) y a la
etiqueta que por ahora no es visible (propiedad
Caption vaca). Procedemos a:
Construir el gestor del evento asociado a modificar
el componente de seleccin CheckBox de forma que
cuando se active (inicialmente est desactivado) se
muestren los dos RadioButtom y se active el botn
de OK. Cuando se desactive, los RadioButtom se
volvern a ocultar y el botn de OK se desactivar.
if (CheckBoxOpciones->Checked == true)
Para ello, escribiremos el gestor asociado al evento
{
OnClick del componente CheckBox:
RadioButtonOp1->Show();
RadioButtonOp2->Show();
RadioButtonOp1->Checked = true;
ButtonOK->Enabled = true;
}
else
{
RadioButtonOp1->Hide();
RadioButtonOp2->Hide();
ButtonOK->Enabled = false;
LabelSalida->Caption = "";
}
Tema 3.2.2.- Componentes en C++ Builder
25
Componentes
Ejemplo 96.- Modificacin y consulta de propiedades en tiempo de ejecucin
Finalmente, escribiremos el gestor del evento asociado a hacer clic sobre el botn OK, que est
operativo (propiedad Enabled) nicamente cuando el CheckBox est activado, y en consecuencia,
cuando pueden emplearse los RadioButtom. Haremos adems que en la etiqueta vaca se muestre un
texto alusivo al texto introducido (o no) en el Edit y a la opcin elegida. Este evento ser:
if (RadioButtonOp1->Checked)
{
if (EditNombre->Text=="")
LabelSalida->Caption="Ha escogido la Opcin 1, D./D. sin identificar";
else
LabelSalida->Caption="Ha escogido la Opcin 1, D./D. " + EditNombre->Text;
}
else
{
if (EditNombre->Text == "")
LabelSalida->Caption = "Ha escogido la Opcin 2, D./D. sin identificar";
else
LabelSalida->Caption = "Ha escogido la Opcin 2, D./D. " + EditNombre->Text;
}
26
27
28
29
30
IntToStr
Convierte un nmero entero en un AnsiString. Su sintaxis, cuando trabajamos con tipo int, es la
siguiente:
IntToStr(int Value);
Su sintaxis, cuando trabajamos con tipo __int64, es la siguiente:
IntToStr(__int64 Value);
Es decir puede trabajar con cualquier dato de tipo int.
En el ejemplo de StrToInt hemos puesto la lnea siguiente: Edit3->Text = i1+i2;. El texto del Edit3 era la
suma i1+i2 , que es un nmero entero (tambin es una cadena) puesto que lo son i1 e i2, pero lo ms
correcto es convertir de forma efectiva el nmero entero en un AnsiString que es lo que en realidad
puede mostrar un Edit. Lo ms correcto en el ejemplo citado ser:
Para tipo int:
int i1, i2; // 1
i1 = StrToInt(Edit1->Text);
i2 = StrToInt(Edit2->Text);
Edit3->Text = IntToStr(i1+i2); //2
// 1: Datos de tipo int
// 2: Como i1 e i2 son tipo int, IntToStr trabajo con tipo int
Para tipo __int64:
__int64 i1, i2; // 1
i1 = StrToInt64(Edit1->Text);
i2 = StrToInt64(Edit2->Text);
Edit3->Text = IntToStr(i1+i2); //2
// 1: Datos de tipo int64
// 2: Como i1 e i2 son tipo int64, IntToStr trabajo con tipo int64
Tema 3.2.2.- Componentes en C++ Builder
31
StrToFloat
Convierte un AnsiString a un valor de coma flotante. Su sintaxis es la siguiente:
StrToFloat(const AnsiString S);
StrToFloat convierte la cadena AnsiString S a un valor de coma flotante. La cadena S puede contener
opcionalmente un signo + o -, una cadena de dgitos con un punto decimal, una E' o e' seguida por un
nmero entero con signo. Los espacios en blanco son ignorados.
La variable global DecimalSeparator define el carcter usado como punto decimal. En la cadena no se
pueden usar separadores de miles ni smbolos de moneda. Si la S no contiene un valor vlido,
StrToFloat lanza una excepcin ECONVERTERROR.
FloatToStr
Convierte un valor en coma flotante a un AnsiString. Su sintaxis es la siguiente:
FloatToStr(Extended Valor);
FloatToStr convierte el valor en coma flotante dado por Valor a una cadena. En general, el formato de
conversin numrica emplea 15 dgitos significativos.
Extended hace referencia a los tipos reales descritos anteriormente.
FloatToStrF
Convierte un valor en coma flotante a un AnsiString usando un formato que debemos especificar en
cuanto a precisin y nmero de dgitos. Su sintaxis es la siguiente:
FloatToStrF(Extended Valor, TfloatFormat Formato, int Precision, int Digitos);
FloatToStrF convierte el valor en coma flotante especificado por Valor a su representacin como
cadena de caracteres (string). El parmetro Valor es el valor a convertir. El parmetro precisin
especifica la precisin de valor. Debera ser inferior o igual a 7 para valores sencillos, menor o igual a
15 para valores de tipo Doble, y menor o igual a 18 para los valores de tipo real descritos. El nmero de
dgitos y los parmetros de formato controlan la forma de conversin en cadena.
Para todos los formatos, los caracteres usados como coma decimal y separador de miles se definen en
las variables globales DecimalSeparator y ThousandSeparator respectivamente.
Si el valor dado es una cadena YO (no un nmero), la cadena resultante es 'YO'. Si el valor dado es el
infinito positivo, la cadena resultante es 'INF'. Si el valor dado es el infinito negativo, la cadena
resultante es '-INF '.
Tema 3.2.2.- Componentes en C++ Builder
32
StrToCurr
Convierte un AnsiString en un objeto tipo Currency. Su sintaxis es la siguiente:
StrToCurr(const AnsiString S);
CurrToStr y CurrToStrF
Convierte un currency en representacin de tipo cadena sin y con formato respectivamente. Su sintaxis
es la siguiente:
CurrToStr(Currency value);
CurrToStrF(System:: Currency Value, TFloatFormat Format, int Digits);
StrToDate
Convierte una cadena AnsiString a un objeto TdateTime con la siguiente sintaxis:
StrToDate(const AnsiString S);
Llama a StrToDate para analizar una cadena que especifica una fecha. Si la S no contiene una fecha
vlida, StrToDate lanza una excepcin ECONVERTERROR
TDateTime es una clase de C++ basada en el tipo de datos de fecha y hora de Delphi. La clase
TDateTime es un miembro heredado de datos val declarado como double que contiene los valores de
fecha y hora. La parte entera de un TDateTime es el nmero de das que han pasado desde 12/30/1899.
La parte fraccionaria de un valor TDateTime es la hora de ese da.
DateToStr
Convierte un objeto TdateTime a un AnsiString con la siguiente sintaxis:
DateToStr(System::TDateTime Date);
Ejemplo 99.- Que da de la semana es?
Sobre un formulario situamos varios Label, un Edit y un Button. Cuando introduzcamos en el edit
un dato con el formato DD-MM-YY, la cadena ser convertida a un valor TdateTime que ser usado para
calcular el da de la semana que representa, mostrndonos adems la fecha actual.
33
StrToTime
Convierte una cadena AnsiString a un objeto TdateTime con la siguiente sintaxis:
StrToTime(const AnsiString S);
El parmetro S se forma con dos o tres numeros, separados por un caracter definido en la variable
global TimeSeparator, y seguidos opcionalmente del indicador AM o PM. Los nmeros representan las
horas, minutos y, opcionalmente, los segundos. Si la hora va seguida de AM o PM se asume un formato
de reloj de 12 horas y si no se incluye el indicador el formato es de 24 horas.
TimeToStr
Convierte un objeto TdateTime a un AnsiString con la siguiente sintaxis:
TimeToStr(System::TDateTime Time);
Tema 3.2.2.- Componentes en C++ Builder
34
35
IntToHex
Convierte a notacin hexadecimal un entero. Su sintaxis es la siguiente:
IntToHex(int Valor, int Digitos);
IntToHex(__int64 Valor, int Digitos);
Antes de ver un ejemplo de conversin a hexadecimal diremos que la conversin se realiza carcter a
carcter dando como resultado un carcter UNICODE. UNICODE es un juego de caracteres que emplea
dos bytes para representar cada carcter.
Tema 3.2.2.- Componentes en C++ Builder
36
IntToHex
Cdigos UNICODE de los nmeros:
0030 - 0039 -> 0 - 9 ISO - LATIN-1
Cdigos UNICODE de las letras y otros caracteres:
0024
Signo de $
0041 - 005A
Mayusculas A a Z
005F
_(guin bajo)
0061 - 007A
Minusculas a a z
00C0 - 00D6
00D8 - 00F6
00F8 - 00FF
37
Componentes
Label
Este componente se utiliza para desplegar textos o mensajes estticos dentro de los formularios,
textos tales como encabezados, solicitud al usuario del programa para que proporcione algn dato o
informacin (edad, sueldo, etc.), en cierta forma hace las funciones de printf, cout, etc., pero solo
cuando se considera el aspecto de mensajes.
Tambin es un objeto en C++Builder y por tanto tiene asociados sus propias propiedades, mtodos y
eventos. Como su uso normal es dentro de un objeto Form, muchas propiedades que se definan para
el objeto Form1, el objeto Label1 las va a heredar.
La propiedad Caption es la que contiene el mensaje a mostrar en la pantalla, que por defecto es su
nombre inicial, pero se puede cambiar haciendo clic en la propiedad Caption del Inspector de Objetos,
teniendo seleccionado Label en el formulario y escribir el texto que deseemos. Tambin podemos
cambiar la propiedad Caption en tiempo de ejecucin mediante una lnea de programa como la
siguiente: Label1->Caption = Hola mundo...;
Su uso se limita a mostrar resultados e informacin al usuario, debido a que este no puede editarlo. No
puede contener el foco en una aplicacin.
Su principales propiedades son:
Name: Es el nombre lgico con el que se referencia al componente.
Caption: Permite modificar el texto que se muestra.
Font: Modifica la fuente, estilo de fuente, tamao, etc. del caption.
Alignment: Especifica la alineacin del texto (derecha, izquierda o centro).
Button, BitBtn y SpeedButton
Button es un botn estndar de Windows, mientras los que los otros dos (pestaa Additional) amplan
sus funcionalidades como permitir incluir un bitmap.
Button es el componente ms empleado, ya que normalmente contiene el cdigo principal del
programa y su activacin por el usuario provoca que se realicen los principales procesos del problema
planteado (aqu es donde se va a capturar datos, realizar operaciones, etc.).
Tema 3.2.2.- Componentes en C++ Builder
38
Componentes
Button, BitBtn y SpeedButton
De este componente manejaremos su propiedad Caption para indicar acciones, etiquetndolo con
palabras como Ok, Aceptar, Exe, ejecutar, etc. , y su evento OnClick para activarlo, siendo en dicho
evento donde se construye el cdigo del programa.
Lo dicho anteriormente no significa que sea un componente necesario en los programas, ya que el
cdigo se puede asociar a cualquier evento de cualquier formulario u otro componente del programa,
pero el manejo de Windows nos tiene acostumbrados al empleo del botn OK o Aceptar.
Este botn puede activar su evento OnClick, cuando el usuario presione la tecla Enter poniendo su
propiedad Default en true. Igualmente puede activar su evento OnClick cuando el usuario, presione la
tecla ESC tan solo con poner la propiedad Cancel en true. Estas opciones no estn disponibles para
SpeedButton. Sus principales propiedades son:
Name: Nombre lgico con el que se referencia al componente.
Caption: Texto del botn.
Font: Modifica la fuente, estilo de fuente, tamao, etc. del caption.
Height y Width: Alto y ancho del botn en pixels.
Left y Top: Posicin superior izquierda del extremo superior izquierdo del botn relativa al del
formulario en pixels.
Enabled: Habilita o deshabilita la respuesta del botn a eventos.
Hint: Texto de ayuda a pista rpida. Para podamos ver el Hint debe colocarse la propiedad
ShowHint en true. Estas propiedades se encuentran en la mayora de los componentes
visuales.
Visible: Determina cuando aparece el botn en el formulario.
Glyph (slo en BitBtn y SpeedButton): permite especificar el bitmap que aparece en el botn.
Kind (slo en BitBtn): determina el tipo de algunos bitmap predefinidos.
Flat (slo en SpeedButton): hace desaparecer el efecto 3D de los botones.
Down (slo en SpeedButton): especifica cuando el botn est presionado. Para quedar
presionado la propiedad GroupIndex debe ser distinta de cero.
TabOrder: especifica el orden en el que los componentes tendrn el foco.
Tema 3.2.2.- Componentes en C++ Builder
39
Componentes
Button, BitBtn y SpeedButton
Sus principales eventos son:
OnClick: ocurre cuando se hace click sobre el botn.
OnMouseMove: ocurre cuando se mueve el mouse sobre el botn.
Un mtodo muy empleado es:
SetFocus: coloca el foco en el botn.
Edit
La funcin principal de este componente visual es manejar todos los procesos de entrada y salida
(input/output) del programa. El componente Edit, es el equivalente a las variables en cualquier lenguaje de
programacin, mas la instruccin de captura o despliegue correspondiente, es decir;
a) En PASCAL: Read (Ciudad) -> Edit1
b) En C: printf("%d", sueldo) -> Edit2
c) En C++, cin.get(nombre,30) -> Edit3
Es decir, que este componente permite capturar datos y tambin, como en el caso del componente Label,
desplegar datos, textos, mensajes o resultados de operaciones, usando su propiedad Text. Esta propiedad,
as como la propiedad Caption en Label, permiten igualarse a muchos procesos bsicos, es decir es fcil
igualar Text o Caption a un dato, una variable, otro Text o Caption, o una expresin algebraica normal, como
en los siguientes ejemplos:
Edit1->Text = 5;
Label2->Caption = "Palabra";
Edit3->Text = 87/ 6.2 ;
Su valor por defecto es Edit1 y es en su propiedad Text donde se modifica, generalmente al principio de un
programa se deja en blanco, y al ejecutarse el programa, el usuario lo llena con los datos solicitados o el
programa lo llena con el resultado de las operaciones. Cuando un usuario lo carga con un dato, este es
almacenado como tipo texto, independientemente de lo que haya escrito el usuario.
Para resolver el problema de usar datos numricos dentro de Text de un componente Edit, en operaciones
matemticas, basta agregarle a la propiedad Text, las funciones de conversin vistas, como .ToInt() o
.ToDouble(), como se muestra en los siguientes ejemplos.
Edit3->Text= Edit2->Text.ToInt() * 5;
Edit5->Text= 3 * pow( Edit2->Text.ToDouble(), double (4) );
Tema 3.2.2.- Componentes en C++ Builder
40
Componentes
Edit
Si, por ejemplo, se pide resolver el problema de multiplicar dos nmeros cualesquiera, se utilizarn
tres componentes Edit (multiplicando, multiplicador, producto) como si fuesen tres variables simples
directamente.
El problema puede resolver de la siguiente manera:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit3->Text=Edit1->Text.ToInt()* Edit2->Text.ToInt();
}
Y un posible resultado puede ser:
Observamos como el componente Edit permite capturar datos por parte del usuario del programa.
Si se realizan divisiones con componentes Edit debemos recordar que al menos uno de ellos sea
double, porque de lo contrario se trunca la parte fraccionaria.
Para resolver el problema de conversin de datos o variables numricas a Texto de un componente
Edit, donde se tiene una variable numrica cargada, con un resultado o dato numrico y se pretende
mandarla a un componente Edit o Label para su despliegue, existen dos manera sencillas, que son:
Usando la clase AnsiString, que puede recibir como argumentos o parmetros una variable de
tipo entera o double y convertirla directamente a una string, que es el tipo de dato que espera el
componente Edit o el componente Label para su despliegue, por ejemplo:
Tema 3.2.2.- Componentes en C++ Builder
41
Componentes
Edit
int a; // rea de declaracin de variables
double b;
a = Edit1->Text.ToInt(); // rea de captura de datos
b = Edit2->Text.ToDouble();
a = a+3; // rea de operaciones
b = b *5.1; // rea de despliegue y conversin de nmeros a strings o Edits
Label3->Caption = AnsiString(a);
Edit4->Text = AnsiString(b);
Como se observa se puede transferir variables numricas tanto a Label como a Edit mediante la clase
AnsiString, sin embargo es mas sencillo usar el mtodo que se usa en el programa dado de ejemplo
para la multiplicacin, es decir considerar los componentes Edit como variables normales.
Para el caso de resultados decimales , la salida incluye todo el conjunto de decimales
asociados a un tipo double (muchos ceros), para resolver este problema se pueden usar
directamente algunos de los mtodos asociados a la clase AnsiString, por ejemplo uno de esos
mtodos es; FormatFloat("string de formato", var double);
La string de formato contiene una serie de smbolos literales que se utilizan para darle el formato de
salida deseado, esto smbolos o constantes literales junto con algunos ejemplos de salida con el
formato que producen son:
0
1234
-1234
1
0
0.00
1234.00
-1234.00
0.50
0.00
#.##
1234
-1234
.5
#,##0.00
1,234.00
-1,234.00
0.50
0.00
#,##0.00;(#,##0.00)
1,234.00
(1,234.00)
0.50
0.00
#,##0.00;;Zero
1,234.00
-1,234.00
0.50
Zero
0.000E+00
1.234E+03
-1.234E+03
5.000E-01
0.000E+00
#.###E-0
1.234E3
-1.234E3
5E-1
0E0
Tema 3.2.2.- Componentes en C++ Builder
42
Componentes
Edit
Por ejemplo:
double a; // rea de declaracin de variables
a = Edit1->Text.ToDouble(); // captura y conversin de datos
a = a/3.1416 ; // operaciones
Edit2->Text= FormatFloat("###,###.##", a); // conversin y despliegue de datos con formato
Veamos un ejemplo muy similar al de multiplicar asociando a Button1 la siguiente lnea de comandos:
Edit3->Text= FormatFloat("###,###.##",Edit1->Text.ToDouble()/ Edit2->Text.ToDouble());
En la figura vemos algunos posibles resultados:
43
Componentes
Ejemplo 102.- Calcular el rea de un tringulo
El cdigo asociado al evento OnClick del componente Button quedar como sigue:
Edit3->Text=FormatFloat("###.##",Edit1->Text.ToDouble()*Edit2->Text.ToDouble()/2);
MaskEdit
Este componente de la pestaa Adittional es muy similar en su uso al componente Edit, excepto que
proporciona una mascara especializada para el formato de datos, es decir se puede usar para que el
usuario proporcione datos con formatos bien definidos, como son valores numricos que incluyan
puntos y comas por ejemplo 3,345.87, o que incluyan smbolos, o para el caso de fechas que lleven su
propio separador como por ejemplo 16/06/2003.
Tambin se puede usar, para asegurar
que el dato proporcionado por el usuario,
solo incluya nmeros, o solo contenga
letras, etc. Para dar formato al dato que el
usuario debe proporcionar basta con
hacer doble clic en la propiedad EditMask
en (Inspector de Objetos), para desplegar
la ventana que vemos.
Observamos en la parte derecha de la
ventana algunos ejemplos de mascaras
de edicin.
Tema 3.2.2.- Componentes en C++ Builder
44
Componentes
MaskEdit
En la ventanilla superior izquierda se colocan los caracteres especiales de edicin y en la ventanilla inferior
izquierda se muestra el formato que adquiere y se pueden proporcionar datos para probar el formato
diseado. Los principales caracteres especiales de edicin son:
Carcter
Significado
>
Todos los caracteres que le siguen se pasan a maysculas hasta el final de la mscara o hasta que se
encuentra el carcter <.
<
Todos los caracteres que le siguen se pasan a minsculas hasta el final de la mscara o hasta que se
encuentra el carcter >.
<>
Los caracteres que siguen aparecen en maysculas o minsculas segn sean tecleados por el usuario.
Se utiliza para separar los tres campos o partes de que consta una mascara
45
Componentes
MaskEdit
Cualquier carcter que no aparezca en la tabla anterior puede aparecer en una mscara, pero se tomara
como un literal cualquiera, es decir se insertar automticamente y el cursor saltar a una posicin
posterior. El segundo campo de una mascara es un carcter simple que indica que carcter literal debe
ser incluido como parte del texto del componente MaskEdit, por ejemplo (000)_000-000;0;*. Un 0 en el
segundo campo indica que solo deben capturarse los nueve dgitos marcados con 0, en lugar de los 13
que tiene la mascara. El tercer campo de la mascara es el carcter que queremos que aparezca en lugar
de espacios en blancos.
Para procesar MaskEdit deberemos usar solo Text y no Text.ToDouble() y recurdese que este formato
es para capturar datos, no para mostrarlos, puesto que para este caso se usa FormatFloat().
ComboBox
Existen multitud de ocasiones en donde el usuario del programa tiene que proporcionar datos que
provienen de un conjunto finito y muy pequeo de posibles respuestas, lo que significa que cada vez
que se ejecute el programa, el usuario deber proporcionar las mismas respuestas. Por ejemplo
capitales de provincia en Andaluca, donde las posibles respuestas son: Almera, Cdiz, Crdoba,
Granada, Huelva, Jan, Mlaga o Sevilla; o en la situacin de preguntar por el sexo (Hombre, Mujer),
etc. Para situaciones como esta, existen componentes que permiten programar por adelantado las
posibles respuestas, y el usuario solo debe seleccionar la respuesta apropiada, en lugar de tener que
escribirla. Este componente es el ComboBox, que nos permite definir en primera instancia un conjunto
de datos, valores o respuestas asociados a un componente de edicin cualquiera, de forma que el
usuario tendr la oportunidad de seleccionar un dato del conjunto de datos o respuestas ya definido. El
componente ComboBox tiene dos partes:
Una parte de encabezado, para poner el nombre del grupo de respuestas (por ejemplo capitales de
provincia, sexo, etc.), que se carga usando la propiedad Text del componente; y
Una segunda parte que es la lista de opciones o respuestas que se debe cargar cuando se disea la
ventana. Para la inclusin de datos debemos hacer doble clic en la propiedad Items en el Inspector
de objetos y nos saldr el siguiente editor de strings o cadenas:
Tema 3.2.2.- Componentes en C++ Builder
46
Componentes
ComboBox
En tiempo de ejecucin del programa, toda la lista de respuestas, estar a la vista del usuario, para que
seleccione la deseada. Basta que este pulse sobre la flechita que esta al lado del encabezado. Para
procesar este componente debemos usar su propiedad Text de manera normal, es decir si la respuesta
se desea de tipo string usaremos ComboBox1->Text, y si la respuesta se quiere numrica debemos
convertir Text a ToInt() o ToDouble(). Por ejemplo, ComboBox1->Text.ToDouble().
Panel
Para poder organizar correctamente todos los datos e informacin que aparecen en las aplicaciones
disponemos de dos mtodos, bien trabajar con dos o ms ventanas o bien utilizar alguno de los
componentes de agrupamiento disponibles. El componente Panel es el ms sencillo y comn de los
componentes de agrupamiento y se utiliza para poner un panel, cuadro o marco dentro de una ventana.
El componente Panel puede contener toda una serie lgica de otros componentes. Tan solo se debe
recordar que primero debemos colocar todos los paneles en el formulario y encima de ellos los
componentes que contendrn.
Tema 3.2.2.- Componentes en C++ Builder
47
Componentes
Panel
Este componente tambin tiene una serie de propiedades que le dan una mejor presentacin usando
las propiedades BevelInner, BevelOuter, BevelWidth, y BorderWidth.
Es decir, podemos dividir una ventana en varias partes, por ejemplo en un panel se ponen los
componentes donde se capturan los datos de un problema y en otro panel se ponen los datos de
salida.
Para modificar programas construidos sin paneles, el procedimiento para agregarlos es:
0. Mover todos los componentes a alguna parte de la ventana en la que no molesten. Si es necesario
se ampla la ventana.
1. Colocar los componentes panel en su posicin.
2. Seleccionamos con un clic el Componente a relocalizar.
3. Seleccionamos del men Edit la entrada Copy o mejor Cut (CTRL+C o CRTL+X)
4. Clic dentro del panel, donde queremos el componente.
5. Seleccionamos del men Edit la entrada Paste (CTRL+V).
6. Readaptamos la ventana al tamao adecuado.
GroupBox
Este componente es muy similar al componente panel, excepto que incluye una pestaa que permite
dejar mas claro el propsito del grupo. El texto que identifica el propsito general del grupo se escribe
dentro de la propiedad Caption en el Inspector de Objetos, teniendo seleccionado este componente
GroupBox.
Adems de sus propiedades, mtodos y eventos propios, como todos los componentes de este tipo,
hereda las propiedades, mtodos y eventos de todos los controles generales de tipo Windows.
Ejemplo 103.- Componentes de agrupamiento
Vamos a reconstruir el ejemplo de clculo del rea de un tringulo utilizando un componente
panel y un groupbox.
48
Componentes
Mltiples ventanas
Un problema muy comn en programacin visual es el de poder crear, controlar y administrar dos o
ms formularios o ventanas desde una misma aplicacin o proyecto.
Lo primero que hay que entender para poder resolver este problema es que en C++Builder, cada
formulario o ventana tiene asociados ciertos recursos especiales, ademas de los componentes que
contiene relacionados todos ellos en un archivo, que por defecto, toma el nombre de Unit1.cpp. Es
decir, si se crea un segundo formulario o ventana, dicho formulario, junto con sus recursos,
componentes, etc., se encontrara contenido en el archivo llamado "Unit2.cpp" y as sucesivamente.
Para crear un segundo formulario (Form2), se puede usar el icono de New Form de la barra de
herramientas, o bien la entrada New Form del men File.
El segundo formulario se construye normalmente, pero queda el problema de donde situar el botn de
ordenes, y la respuesta es que se pone en el primer formulario o ventana principal del programa. El
proceso en este botn es similar al de los programas anteriores, es decir primero se capturan los datos
(pantalla o ventana de captura), luego se resuelve las operaciones y finalmente se traspasan los datos
a los componentes de la segunda ventana. Para poder realizar este proceso la sintaxis general es
ahora:
Nombre_formulario -> Nombre_componente -> Nombre_propiedad
Los siguientes ejemplos aclararn estos conceptos:
Form5->Edit3->Text=Form1->Edit2->Text; //1
int alfa = Form3->Edit4->Text.ToInt(); //2
// 1. El contenido de la propiedad Text del Edit2 de Form1 se pasa a la propiedad Text del Edit3 del Form5.
// 2. La variable tipo int alfa toma como valor el contenido, convertido a tipo int, del Edit4 del formulario Form3.
Observamos que procesar elementos de distintas ventanas, es, inicialmente, sencillo, pero adems
existen ciertas condiciones que debern cuidarse para que estos procesos funcionen, y estas
condiciones son:
Tema 3.2.2.- Componentes en C++ Builder
49
Componentes
Mltiples ventanas
0. Crear y disear todas las ventanas junto con sus componentes y programas.
1. Cualquier ventana que mencione o contenga una referencia dentro de su cdigo a otra ventana,
deber incluir en su Unit respectiva, la unidad (Unit) de la otra forma o ventana.
2. Para incluir la unidad (Unit) de la otra ventana debemos tener seleccionada la ventana que llama y
usar la orden Include Unit del men File, que mostrar una lista con todas las unidades (Unit) que se
han diseado, y debemos seleccionar la apropiada que se incluir automticamente en la ventana
actual.
3. Si una ventana referencia dos o ms ventanas diferentes debemos usar la orden File/Include Unit,
tantas veces como sea necesario.
Este procedimiento permite construir programas con dos o ms ventanas, pero el problema es que
todas ellas estarn a la vista del usuario, para resolver este problema, el procedimiento ms sencillo es
poner en False la propiedad visible de la ventana que se quiera tener oculta y poner cualquiera de las
siguientes instrucciones en el cdigo del programa para que aparezcan o desaparezcan a voluntad:
Form2->Visible = true;
Form2->Show(); // similar a la anterior, pero mas corta
Form2->ShowModal(); // no permite acceder a la primera ventana hasta que se cierra la segunda ventana
Si tenemos formularios de mas, o que ya no se quieren usar, o que estn mal construidas se pueden
quitar del proyecto usando el icono Remove File from Project de la barra de herramientas, y
seleccionando la unidad que contiene el formulario a eliminar.
Ejemplo 104.- Mltiples ventanas
Vamos a realizar una aplicacin que contenga en la ventana principal los siguientes
componentes: BitBtn, SpeedButton, MaskEdit y ComboBox. Respondiendo a distintos eventos se
deben mostrar ventanas para cada componentes bien con Show o bien con ShowModal que expliquen
de forma visible la principal utilidad de cada componente y sus principales propiedades.
Tema 3.2.2.- Componentes en C++ Builder
50
Asignacin de memoria
En tiempo de ejecucin de un programa toda la informacin que necesite manipular deber estar, en un
momento u otro, en la memoria RAM del ordenador. Sabemos que la memoria se divide en celdas de 8
bits (1 byte) y que a cada una de las cuales le corresponde una direccin.
Ejemplo 105.- Direcciones de memoria.
Realizar una serie de declaraciones de variables y punteros para posteriormente mostrar el valor
de dichas variables y su correspondiente direccin de memoria utilizando para ello componentes
Label.
Tiempo de ejecucin
Tiempo de diseo
51
Asignacin de memoria
Operadores new y delete
Inicialmente, un puntero no apunta a ningn sitio y, para poder usarlo, tendremos que asignarle un
bloque de memoria y obtener su direccin. La cantidad de memoria asignada puede determinarlo el
tipo propio del puntero, que se indica detrs de new, encargndose este de localizar un bloque de
memoria adecuado en tamao, reservarlo para el programa, almacenar la direccin del puntero y
permitirnos el acceso al valor apuntado por l.
A diferencia de la asignacin de memoria esttica, la memoria asignada por new est libre al comienzo
del programa reservndose solamente cuando se llama a este operador. Cuando la memoria asignada
con new no nos sea til tendremos que liberarla, ya que a diferencia de lo que ocurre con una variable,
la liberacin no es automtica. Para liberar la memoria se emplea el operador delete, al que pasaremos
como parmetro el puntero que contiene la direccin de memoria del bloque a liberar y que es
habitualmente el mismo que el de new. Un cdigo cmo el siguiente origina el resultado que vemos.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int *Pnumero;
Pnumero = new int;
Edit1->Text= AnsiString(*Pnumero);
*Pnumero = 125;
Edit2->Text = AnsiString(*Pnumero);
delete Pnumero;
}
Cuando asignamos memoria con el operador new es posible especificar un valor inicial dndolo entre
parntesis detrs del tipo, por ejemplo Pnumero = new int(125) asigna memoria e inicializa.
A veces es necesario asignar memoria no solamente para un nmero o un carcter, lo que podemos
hacer es especificar el tamao en el tipo de puntero. Supongamos por ejemplo que queremos reservar
memoria para almacenar 25000 enteros. Es evidente que no vamos a crear 25000 identificadores,
aunque si podramos tener como recurso crear una matriz con 25000 elementos.
Tema 3.2.2.- Componentes en C++ Builder
52
Asignacin de memoria
Operadores new y delete
La solucin de la matriz solamente es valida si se conoce de antemano el nmero exacto de elementos,
porque si dicho nmero se determina externamente, ser difcil crear una matriz del tamao adecuado
sin que resulte, a veces pequea, o a veces grande, desperdiciando memoria.
Para este tipo de casos es posible asignar un bloque de memoria del tamao que nosotros deseemos
mediante los operadores new y delete, indicando dicho tamao entre corchetes. Al utilizar delete
dispondremos detrs del operador unos corchetes vacos, indicando que lo que se libera es una matriz.
Ejemplo 106.- Punteros y matrices
Ejemplo en el que empleamos la asignacin de memoria dinmica mediante matrices,
inicializamos los elementos y mostramos resultados tanto de direcciones de memoria como del
contenido de las mismas. Diseamos un formulario con un aspecto como el de la figura:
53
Asignacin de memoria
Ejemplo 106.- Punteros y matrices
El cdigo es:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int *PunteroNumero; //Puntero a entero
PunteroNumero = new int[5]; //Asignamos memoria para 5 int
//Inicializamos los 5 elementos
PunteroNumero[0] = 100;
PunteroNumero[1] = 200;
PunteroNumero[2] = 300;
PunteroNumero[3] = 400;
PunteroNumero[4] = 500;
//Mostramos en los Edit el contenido y la direccin de memoria
Edit1->Text = AnsiString(PunteroNumero[0]);
Edit2->Text = AnsiString(PunteroNumero[1]);
Edit3->Text = AnsiString(PunteroNumero[2]);
Edit4->Text = AnsiString(PunteroNumero[3]);
Edit5->Text = AnsiString(PunteroNumero[4]);
Edit6->Text = AnsiString((unsigned int) &PunteroNumero[0]);
Edit7->Text = AnsiString((unsigned int) &PunteroNumero[1]);
Edit8->Text = AnsiString((unsigned int) &PunteroNumero[2]);
Edit9->Text = AnsiString((unsigned int) &PunteroNumero[3]);
Edit10->Text = AnsiString((unsigned int) &PunteroNumero[4]);
delete [] PunteroNumero; //Liberamos la memoria asignada
}
54
Componentes
Ejemplo 107.- Sentencias if anidadas, Cul es el menor de tres nmeros? Con componentes
Sobre un formulario vamos a situar dos componentes GroupBox de la pestaa Standard, a uno de
ellos le vamos a llamar Entrada de datos y al otro El menor es. Sobre el primero situamos tres
componentes Label y tres Edit (cambiando la propiedad name como A, B y C respectivamente), y sobre
el segundo un componente Edit con la propiedad name establecida a Menor, adems de un BitBtn en el
que seleccionamos bkOK para la propiedad Kind. El aspecto inicial del proyecto lo vemos en la figura
siguiente:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
float datoA, datoB, datoC, Resultado;
datoA = StrToFloat(A->Text);
datoB = StrToFloat(B->Text);
datoC = StrToFloat(C->Text);
if (datoA < datoB)
if (datoA < datoC)
Resultado = datoA;
else
Resultado = datoC;
else
if (datoB < datoC)
Resultado = datoB;
else
Resultado = datoC;
Menor->Text = FloatToStr(Resultado);
}
55
Componentes
CheckBox
Este componente permite al usuario seleccionar una opcin o tomar una decisin directamente en
pantalla, es decir en tiempo de ejecucin. Es en la propiedad Text del componente donde se debe
escribir el sentido que queremos dar a la seleccin.
Ejemplo 108.- Decisiones con CheckBox y componente SpeedButton
Vamos a crear un nuevo proyecto y sobre el formulario principal situamos cuatro componentes
SpeedButton (pestaa Additional) y cuatro componentes CheckBox (pestaa Standard). Distribuimos y
modificamos la propiedad Caption de forma que quede algo similar a la figura siguiente. Hacemos
doble clic sobre cada uno de los botones e incluimos el siguiente cdigo:
SpeedButton1
CheckBox1->Checked=true;
CheckBox2->Checked=false;
CheckBox3->Checked=false;
CheckBox4->Checked=false;
SpeedButton2
CheckBox2->Checked=true;
CheckBox1->Checked=false;
CheckBox3->Checked=false;
CheckBox4->Checked=false;
SpeedButton3
CheckBox3->Checked=true;
CheckBox1->Checked=false;
CheckBox2->Checked=false;
CheckBox4->Checked=false;
SpeedButton4
CheckBox4->Checked=true;
CheckBox1->Checked=false;
CheckBox2->Checked=false;
CheckBox3->Checked=false;
Hemos utilizado la propiedad booleana Checked de los componentes CheckBox para hacer que trabaje
con una sola seleccin.
Naturalmente los CheckBox pueden seleccionarse todos, aunque en el programa del ejemplo no
parezca lo ms apropiado.
56
Componentes
RadioButton y RadioGroup
El componente RadioButton se utiliza para presentar al usuario un conjunto de opciones mutuamente
excluyentes entre si, es decir si el usuario selecciona un componente RadioButton todos los dems
componentes RadioButton en el formulario, se desmarcan o deseleccionan solos.
En la propiedad Caption se pone el texto que identifica el propsito del botn y su propiedad Checked
refleja el cambio (True o False). Tambin su evento onclick se activa automticamente cada vez que el
usuario selecciona el RadioButton.
La situacin de que sean excluyentes entre si deber resolverse por parte del programador, es decir si
se supone un programa donde el usuario debe seleccionar uno de entre dos sexos y uno de entre
cinco municipios, en este caso se ocupan ocho RadioButton, pero como todos son mutuamente
excluyentes entre si, cuando el usuario seleccione uno de ellos, todos los dems se desmarcaran
automticamente. Para resolver este problema se debern usar componentes de agrupamiento, como
son el componente Panel y el componente GroupBox. Es decir se debern encerrar en su propio panel
o GroupBox todos los RadioButton lgicos, es decir en un Panel los de sexo, en otro Panel los de
municipios, etc. De esta manera C++Builder los evala por separado y se puede tener seleccionado un
RadioButton en cada Panel. En la figura vemos un ejemplo de lo dicho:
57
Componentes
RadioButton y RadioGroup
El componente RadioGroup es un componente especializado en la agrupacin de RadioButton. Un
componente u objeto RadioGroup es una caja especial que solo contiene componentes RadioButton,
tambin cuando el usuario marca o selecciona uno de ellos, todos los dems se desmarcan o
deseleccionan.
Para aadir los RadioButton al componente RadioGroup debemos editar la propiedad Items en el
Inspector de Objetos, que nos muestra el minieditor de strings. Debemos recordar que cada lnea en el
editor corresponder a un RadioButton dentro del RadioGroup.
Para procesar o programar un determinado RadioButton usareremos la propiedad ItemIndex que queda
cargada con el numero de RadioButton seleccionado por el usuario. Por ejemplo:
if(Form1->RadioGroup1->ItemIndex==4)
{
cdigo a ejecutar si el usuario selecciona
el RadioButton4 del RadioGroup1
};
Tambin se pueden desplegar los botones en una o ms columnas, usando la propiedad Columns en el
Inspector de Objetos, para indicarle cuantas columnas de RadioButton se quieren manejar.
El ejemplo anterior resuelto con este componente podra tener un aspecto como el siguiente:
58
Componentes
ListBox
Componente que permite procesar un conjunto de elementos de tipo string. Se puede aadir, eliminar e
insertar tems en la lista usando los mtodos Add, Delete e Insert respectivamente de la propiedad
Items. La propiedad Columns permite que ListBox tenga varias columnas y los items se pueden
clasificar u ordenar usando la propiedad Sorted. Las propiedades MultiSelect y ExtendedSelect
permiten al usuario hacer selecciones mltiples. Para determinar que tem en particular esta
seleccionado debemos validar la propiedad Selected y para conocer cuantos tems se han
seleccionado consultar los valores de la propiedad SelCount. La propiedad ItemIndex se utiliza para
seleccionar la posicin o ndice de un tem o elemento en la lista. La propiedad Style establece los
estilos de ListBox, que son: lbStandard; LbOwnerDrawFixed; LbOwnerDrawVariable; LbVirtual y
LbVirtualOwnerDraw.
Ejemplo 109.- Nmeros, su cuadrado y su raz cuadrada.
Vamos
a
desplegar
los
nmeros
enteros
comprendidos entre 15 y 25, su cuadrado y su raz
cuadrada utilizando componentes ListBox y su
mtodo Add de la propiedad Items. Para este
problema situaremos sobre el formulario principal
Form1, tres componentes label con su font
seleccionado en color rojo, tres componentes ListBox
y un componente Button que en su evento OnClick
contendr los bucles o ciclos for y la carga de los
componentes ListBox.
59
Componentes
Ejemplo 110.- Tablas de multiplicar.
Vamos a implementar un programa que muestre las tablas de multiplicar hasta el 15 de la forma
en que estamos acostumbrados a verlas. Para ello vamos a emplear dos componentes ya conocidos, el
componente RadioGroup y el componente ListBox. Emplearemos el mtodo Add(valor) en la propiedad
Items de ListBox para cargar todos sus elementos o valores en tiempo de ejecucin del programa y la
propiedad ItemIndex del componente RadioGroup; con cdigo asociado al evento OnClick del
elemento RadioGroup y sentencias condicionales y bucles.
Para este problema situaremos sobre el formulario principal Form1 los elementos necesarios para que
el aspecto inicial del formulario en tiempo de diseo es el siguiente:
El cdigo del programa adecuando el resto de ItemIndex podra ser el
siguiente:
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
int x;
if(Form1->RadioGroup1->ItemIndex==0)
{
ListBox1->Items->Clear();
for (x=0 ; x<=15 ; x++)
{ListBox1->Items->Add(AnsiString("1 x ")+(x)+AnsiString(" = ")+(1*x));};
};
...
Sentencias similares para resto de ItemIndex
...
}
Tema 3.2.2.- Componentes en C++ Builder
60
Componentes
Ejemplo 110.- Tablas de multiplicar.
El programa en ejecucin es:
61
Componentes
Ejemplo 111.- Ms tablas de multiplicar.
62
Componentes
Ejemplo 111.- Ms tablas de multiplicar.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
/* Asociado al evento OnCreate del Form borramos el contenido de los Edit*/
Edit1->Text="";
Edit2->Text="";
}
//--------------------------------------------------------------------------void __fastcall TForm1::Edit1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
/* Establecemos el foco en Edit1 asociado al evento OnMouseMove */
Edit1->SetFocus();
}
//---------------------------------------------------------------------------
63
Componentes
Trabajo con componentes Edit, Buttom y Label
Edit
La principal finalidad de un Edit es permitir la entrada de un texto por parte del usuario que se almacena
en su propiedad Text, a la que podemos dar un valor inicial en tiempo de diseo. Este componente no
cuenta con la propiedad Caption, por lo que se suele disponer una etiqueta de texto adjunta que sirve
como ttulo.
Existe un componente en la pestaa Additional que se compone de un Label y de un Edit, el LabeledEdit,
que resulta sencillo de manejar cuando se conocen los dos componentes de forma individual.
Cuando en tiempo de ejecucin el usuario modifica el contenido de un Edit, su propiedad Modified se
establece como true. Nosotros podemos, mediante cdigo, comprobar el valor de esta propiedad y, en
caso de que proceda, recuperar la entrada realizada por el usuario leyendo la propiedad Text.
Longitud del Texto
Por defecto el control Edit no pone ningn lmite a la cantidad de texto que el usuario puede introducir y,
en caso de que sea necesario, desplazar el contenido actual a medida que se introducen nuevos
caracteres. Si es necesario, podemos limitar el nmero de caracteres que es posible introducir mediante
la propiedad MaxLength. El valor 0 indica que no hay un lmite establecido y cualquier otro nmero entero
fija la longitud mxima de la propiedad Text.
Seleccin de texto
Mientras se edita el contenido de un control Edit, el usuario puede marcar una porcin del texto, mediante
la combinacin de la tecla Shitf y los cursores o bien con el ratn, con el fin de realizar alguna operacin
que le afecte, como puede ser eliminarlo o copiarlo al portapapeles.
En cualquier momento podemos saber qu texto es el que hay seleccionado en el control, para lo que
disponemos de las propiedades SelStart, SelLength y SelText. La primera contiene el carcter a partir del
cual se ha seleccionado, sabiendo que el primero de los existentes es el carcter 0. La segunda propiedad
contiene el nmero de caracteres que hay marcados y la tercera contiene el texto.
El valor de estas propiedades tambin puede ser establecido por el cdigo de nuestro programa,
seleccionando automticamente el texto que nos interese. Si deseamos marcar todo el texto contenido en
el control podemos realizar una simple llamada al mtodo SelectAll().
Tema 3.2.2.- Componentes en C++ Builder
64
Componentes
65
Componentes
Uso
Valores
true o false
Izquierda: taLeftJustify
Derecha: taRightJustify
Centro: taCenter
Tiene sentido cuando la etiqueta se usa como ttulo de otro control. Sirve para
Nombre del control que
FocusControl que la etiqueta de texto sepa a qu control debe pasar el foco de entrada cuando
recibe el foco.
se pulse la tecla de acceso rpido (&).
66
Componentes
El primer Edit, que recibir el foco desde su etiqueta (propiedad FocusControl) lo utilizaremos
para comprobar el funcionamiento de las propiedades MaxLength, a la que asignaremos el valor 10, y
PasswordChar, a la que asignaremos el valor *.
El segundo Edit, que recibir el foco desde su Label lo usaremos para ver cmo podemos
controlar la entrada de caracteres, permitiendo tan slo la introduccin de dgitos numricos. Para ello
vamos a generar el siguiente gestor de eventos OnKeyPress.
Tema 3.2.2.- Componentes en C++ Builder
67
Componentes
Trabajo con componentes Edit, Buttom y Label
Ejemplo 112.- Componentes Edit, Buttom y Label
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
if ((Key < '0' || Key > '9') && Key != 8) Key=0;
/* Se comprueba que el carcter sea un dgito o la tecla de borrado.
Los caracteres se encierran entre comillas simples porque estamos comparando un carcter tipo char.
Asignar a Key el valor 0 es anular la pulsacin. */
}
El ltimo Edit (recibe el foco de su Label) lo vamos a usar para probar los mtodos de copiar,
borrar y pegar el texto seleccionado. Ser al pulsar cualquiera de los tres botones que hemos
dispuesto debajo cuando se realice la accin de copiado, borrado o pegado, gracias al cdigo que
asociaremos al evento OnClick de cada uno de los botones de la forma que se muestra a continuacin.
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit3->SelectAll();
Edit3->CopyToClipboard();
Edit3->SetFocus();
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Edit3->ClearSelection();
Edit3->SetFocus();
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Edit3->PasteFromClipboard();
Edit3->SetFocus();
}
Tema 3.2.2.- Componentes en C++ Builder
68
Componentes
Tipos de propiedades
Las
propiedades
de
los
componentes de la VCL tienen
asignado un tipo de dato que
determina los valores que esta
puede tomar. Hay propiedades
de tipo bool (Visible), otras de
tipo string (Caption) y otras de
tipo enumerado (BorderIcons)
que solamente pueden tomar
valores de una lista prefijada.
A continuacin vemos lo que
muestra
la
ayuda
de
BorderIcons.
Indica que la propiedad
BorderIcons de un formulario
es del tipo TborderIcon es de
tipo enumerado, y que, por
tanto, slo puede tomar los
valores preestablecidos.
69
Componentes
Tipos de propiedades
Ejemplo 113.- Propiedad BorderIcons
Realizar una aplicacin para trabajar con esta propiedad en
tiempo de ejecucin.
Partimos de un diseo similar al siguiente, en el que al botn Salir le
hemos establecido su propiedad Visible a false.
70
Componentes
Trabajo con componentes Memo, CheckBox, RadioButton y RadioGroup
Memo
Ya hemos visto el uso del componente Edit para solicitar al usuario alguna entrada, pero esta no puede
tener mas que una lnea. Cuando necesitemos una entrada de texto que ocupe varias lneas podemos
usar un componente Memo que posee muchas propiedades de las vistas para el Edit (ReadOnly,
MaxLength, Text, ...), as como con los mtodos relacionados con las operaciones del portapapeles.
Un Memo puede tener barras de desplazamiento o ScrollBars, permitiendo trabajar con lneas ms
largas que el espacio horizontal disponible y con ms lneas de las que es posible mostrar de forma
simultnea. La propiedad de tipo enumerado TScrollBars permite el uso de estas barras de
desplazamiento. Esta propiedad puede tomar los valores:
0 ssNone
//Ninguna
1 ssVertical
//Slo la vertical
2 ssHorizontal //Slo la horizontal
3 ssBoth
//Las dos
El texto que contiene un Memo es accesible mediante la propiedad Text, al igual que en un Edit. Pero
resulta ms til y conveniente acceder a ese texto lnea a lnea, para lo que el componente dispone de
la propiedad Lines que es de tipo Strings.
Sus dos mtodos ms interesantes tienen relacin con guardar o recuperar el texto en un archivo en
disco y son SaveToFile() y LoadFromFile(), que tienen como nico parmetro el nombre del fichero
donde se va a guardar o del que se va a recuperar la informacin del Memo.
Otra propiedad muy interesante es Count con la que podemos averiguar en cada momento cuntas
lneas tiene simplemente haciendo: Memo1->Lines->Count.
Un componente Memo tiene la posibilidad de trabajar con las teclas Enter y Tab como parte de la
edicin del texto siempre que l est activo. Pero, por defecto, estas teclas tienen su funcin propia en
un formulario. Para que al pulsar la tecla Enter el componente Memo la reconozca como salto de lnea y
no como activacin de, por ejemplo, el botn por defecto, debemos asignar el valor true a la propiedad
WantReturns. Lo mismo ocurre con la propiedad WantTabs, que si est activada permitir insertar
tabulaciones en el texto en lugar de pasar el foco de entrada al siguiente componente del formulario.
Tema 3.2.2.- Componentes en C++ Builder
71
Componentes
Trabajo con componentes Memo, CheckBox, RadioButton y RadioGroup
CheckBox
Este componente permite mostrar y seleccionar informacin de tipo bool, representndose los dos
estados posibles visualmente mediante una casilla, que puede contener o no en su interior una marca.
La propiedad Checked nos permite saber el estado actual del componente y, como no, modificarlo;
estando a true cuando est marcado y a false en caso contrario.
Podemos poner todos los componentes CheckBox que necesitemos en un formulario, no afecto el
hecho de que alguno de ellos est activo al resto, es decir no son opciones excluyente entre s. Para
que varias opciones sean excluyentes se usan componentes RadioButton.
Lo ms comn es agrupar los componentes CheckBox en un contenedor denominado GroupBox que
tiene la posibilidad de asignar un ttulo comn a los componentes CheckBox que lo componen.
RadioButton y RadioGroup
El componente RadioButton tambin cuenta con una propiedad Checked en la que se almacena su
estado. Si tenemos que usar varios RadioButton en un formulario y que se destinen a solicitar datos
diferentes que tengan, a su vez, opciones exclusivas entre s, debemos usar componentes RadioGroup.
Para establecer las opciones de un RadioGroup tendremos que editar el contenido de la propiedad
Items, que es de tipo Strings. En modo diseo haremos doble clic sobre la propiedad Items para abrir el
editor especfico, aadiendo los ttulos de las opciones que deseemos mostrar. En tiempo de ejecucin
podremos usar los mtodos Add(), Append(), Insert() y Clear() para aadir o eliminar elementos. Los
elementos RadioButton existentes en un RadioGroup se numeran con un ndice que comienza en 0.
Este ndice nos servir para saber qu opcin es la que est activa o bien para establecerla, mediante
la propiedad ItemIndex. De esta forma no es necesario comprobar la propiedad Checked de cada uno
de los RadioButton que aparece en el RadioGroup.
72
Componentes
Trabajo con componentes Memo, CheckBox, RadioButton y RadioGroup
Ejemplo 114.- Trabajo con componentes Memo, CheckBox, RadioButton y RadioGroup
Vamos a realizar una aplicacin para mostrar el uso de estos componentes, sus propiedades y
los mtodos descritos en este apartado.
Comenzamos una nueva aplicacin e incluimos en el Form los siguientes componentes: Tres Label, un
Memo, un GroupBox, dos CheckBox dentro de un GroupBox, un RadioGroup y dos Button, de forma
que inicialmente tengamos un aspecto como el que vemos a continuacin:
Continuamos dando los pasos necesarios para conseguir como cdigo fuente del Unit asociado al
Form el que vemos seguidamente:
73
Componentes
74
Componentes
75
Componentes
76
Componentes
Descripcin
Add()
Una cadena de texto es el parmetro que la aade como un nuevo elemento al final de la lista, salvo que
la propiedad Sorted del ListBox est a true, en cuyo caso se insertar en la posicin que le corresponda.
Insert()
Toma dos parmetros, de los que el primero es la posicin en la que se desea insertar el elemento y el
segundo el texto a aadir.
Delete()
Mtodo que nos permite eliminar el elemento de la lista del que facilitamos su ndice.
Clear()
IndexOf()
Move()
Exchange()
Similar a Move() lo que hace es intercambiar las posiciones de los elementos correspondientes.
SaveToFile()
LoadFromFile() Recupera la lista de elementos de un archivo cuyo nombre se facilita como parmetro.
La propiedad ItemIndex del ListBox indica en cada momento qu elemento hay seleccionado. Un valor 1 indica que no hay ninguno seleccionado. Cuando contiene ms elementos de los que puede mostrar
de forma simultnea aparece una barra de desplazamiento vertical.
Tema 3.2.2.- Componentes en C++ Builder
77
Componentes
Al botn Aadir le establecemos la propiedad Default a true para permitir la insercin mediante la tecla
Enter del texto introducido en el Edit y al botn Borrar le establecemos la propiedad Enabled a false
para que este no est activo si no tenemos ningn elemento seleccionado.
El resto del proceso es ir creando los gestores de eventos que vemos seguidamente con el cdigo que
debemos insertar en los mismos.
Tema 3.2.2.- Componentes en C++ Builder
78
Componentes
79
Componentes
80
Componentes
Descripcin
csDropDown
Se trata del estilo establecido por defecto y presenta un Edit en el que es posible introducir texto. El
botn del extremos derecho despliega una lista con los elementos que contiene.
csSimple
El ComboBox aparece como un Edit sin botn ni lista desplegable adjunta. Para recorrer los elementos
de sta debemos usar las teclas de cursor arriba y abajo.
csDropDownList
Con este valor se permite al usuario seleccionar uno de los valores de la lista pero no puede introducir
texto alguno.
81
Componentes
Situamos un ComboBox al que establecemos como valor csDropDown para la propiedad Style y
eliminamos el contenido de su propiedad Text.
Tambin situamos un RadioGroup con las tres opciones que vemos y que nos van a permitir cambiar el
estilo del ComboBox en tiempo de ejecucin.
Veamos en dos fases el cdigo necesario para nuestros propsitos:
Por un lado deberemos controlar cada pulsacin de tecla sobre el ComboBox, mediante el evento
OnKeyPress, para que en el momento en que se detecte la pulsacin de la tecla Enter se almacene el
texto en el ComboBox pero ignorando la pulsacin de dicha tecla. El cdigo que deberemos escribir es
el siguiente:
Tema 3.2.2.- Componentes en C++ Builder
82
Componentes
83
Componentes
Ejemplo 117.- Races con funciones
Comenzamos por situar un formulario con las siguientes propiedades:
Height = 150 y Width = 350
Caption = Races
BorderIcon: biMinimize = false, biMaximize = false y biSystemMenu = false. Esto har que la
ventana no presente los iconos ni de maximizar, ni de minimizar ni de cerrar. Tampoco presentar el
icono ni el men contextual asociado.
BorderStyle = bsSingle. Har que se presente un borde de una lnea sencilla y el tamao de la
ventana no ser escalable.
Position = poScreenCenter. La ventana de la aplicacin aparecer centrada en la pantalla.
Sobre el formulario situamos:
Un componente ListBox con Height = 70 y Width = 330
Un botn con Caption = &Salir.
Ambos componentes los alineamos Center in windows.
El aspecto en tiempo de diseo ser:
84
Componentes
Ejemplo 117.- Races con funciones
El cdigo completo del programa es:
#include <vcl.h>
#pragma hdrstop
#include <math.h> //Para usar pow()
#include "Codigo.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------AnsiString AlmacenDatos; /*Declaracion global de un AnsiString para ir guardando los resultados obtenidos con
los datos que se pasen */
//--------------------------------------------------------------------------/* Declaramos la funcin Raiz con los parmetros:
Argumento de tipo __int64 para trabajo con nmeros grandes
Indice de tipo int con valor por defecto 2 */
void Raiz(__int64 Argumento, int Indice=2)
{
/* En Almacen de Datos vamos guardando las cadenas y los valores pasados o por defecto de los parmetros. El
clcula de la raiz lo realizamos con la funcin pow() */
85
Componentes
Ejemplo 117.- Raices con funciones
AlmacenDatos = "La raiz de Indice " + AnsiString(Indice) + " del nmero " + AnsiString(Argumento)+
" es: " + AnsiString(pow(Argumento,1.0/Indice));
}
//MOSTRMOS LOS RESULTADOS ASOCIADOS A: TForm1::FormCreate
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Raiz(16); //Pasamos un parmetro (se calcula la raiz cuadrada)
ListBox1->Items->Add(AlmacenDatos); //Aadimos los resultados
Raiz(27,3); //Pasamos los dos argumentos (se calcula la raiz cbica)
ListBox1->Items->Add(AlmacenDatos); //Aadimos los resultados
Raiz(30517578125,5); //Pasamos los dos argumentos (se calcula la raiz quinta)
ListBox1->Items->Add(AlmacenDatos); //Aadimos los resultados
Raiz(999,15); //Pasamos los dos argumentos (se calcula la raiz 15)
ListBox1->Items->Add(AlmacenDatos); //Aadimos los resultados
Raiz(3); //Pasamos un parmetro (se calcula de nuevo la raiz cuadrada)
ListBox1->Items->Add(AlmacenDatos); //Aadimos los resultados
}
//--------------------------------------------------------------------------//NECESITAMOS UN BOTON PORQUE HEMOS DESABILITADO LOS ICONOS PARA CERRAR
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Application->Terminate();
}
86
Componentes
Significado
El formulario no es ni ventana MDI padre ni ventana MDI hijo.
fsMDIChild
fsMDIForm
El formulario permanece sobre todo en el escritorio y sobre otros formularios del proyecto, excepto sobre los que
fsStayOnTop tambin tiene la propiedad FormStyle a fsStayOnTop. Si un formulario fsStayOnTop lanza otro del mismo tipo,
ninguno permanecer coherentemente sobre el otro.
87
Componentes
88
Componentes
Propiedad Icon
Por defecto, si no se selecciona ninguno, Builder presenta el icono propio de las aplicaciones C++
Builder. Se puede cambiar haciendo doble clic en el botn Load, para seleccionar el archivo del icono
deseado. Esta propiedad busca archivos con extensin .ico. C++ Builder tiene una biblioteca de
archivos .ico en la carpeta:
\\Archivos de programa\Archivos comunes\Borland Shared\Images\Icons\
El compilador dispone de un editor de iconos que se puede seleccionar en el men principal:
Tools/Image Editor para experimentar con l. En la figura vemos su aspecto con el icono chip cargado.
89
Componentes
Propiedad Position
Determina donde se desplegar el formulario en la pantalla del PC en el momento de la ejecucin.
Valor
poDesigned
poDefault
El formulario aparece en una posicin de la pantalla con una altura y una anchura
determinadas por Windows. Cada vez que ejecutemos la aplicacin, el formulario se
mover levemente abajo y a la derecha.
El formulario se muestra con el tamao con que se cre en tiempo del diseo, pero
poDefaultPosOnly Windows elige su posicin respecto a la pantalla. Cada vez que ejecutemos la aplicacin,
el formulario se mover levemente abajo y a la derecha.
poDefaultSizeOnly
El formulario aparece en el lugar donde estaba en tiempo de diseo, pero Windows elige
su tamao.
poScreenCenter
Propiedad WindowState
Esta propiedad muestra las caractersticas del formulario en tiempo de ejecucin.
Valor
wsNormal
wsMinimized
wsMaximized
90
Componentes
Ejemplo 119.- Propiedades y eventos
Los efectos de los botones Maximizar, Minimizar y Salir los vamos a asociar a los eventos OnClick para
efectuar esas operaciones.
Para botn Maximizar: WindowState=wsMaximized;
Para botn Maximizar: WindowState=wsMinimized;
Para botn Maximizar: Application->Terminate();
El efecto del botn Normal va a ser devolver la ventana a su estado normal asocindolo al evento
OnMouseMove del ratn.
Para botn Normal: WindowState=wsNormal;
Para el botn Mantenemos pulsada una tecla del ratn? y la etiequeta que tiene a la derecha vamos a
trabajar con los eventos OnMouseDown y OnMouseUp de forma que mientras tengamos pulsada la tecla
izquierda del ratn sobre el botn la etiqueta muestre SI y en caso contrario NO.
91
Componentes
Ejemplo 119.- Propiedades y eventos
Para el botn Tecla pulsada y su etiqueta de la derecha vamos a generar un evento OnKeyPress de forma que
cuando el botn tenga el foco la etiqueta nos muestre la tecla que hemos pulsado.
void __fastcall TForm1::Button6KeyPress(TObject *Sender, char &Key)
{
char keyString[2];
keyString[0] = Key;
strcpy(&keyString[1], "");
Label2->Caption= keyString;
}
Ahora aadimos un nuevo formulario con un Label y hacemos que tenga algo parecido a:
No debemos olvidar File/Include Unit ... para tener en Unit1 #include "Unit2.h". Para este Form vamos a
generar un evento OnResize al que asociamos el cdigo:
void __fastcall TForm2::FormResize(TObject *Sender)
{
Label1->Left = (ClientWidth/2) - (Label1->Width/2);
Label1->Top = (ClientHeight/2) - (Label1->Height/2);
}
Finalmente para el botn Otro Form generamos su evento OnClick y hacemos que muestre el segundo
formulario de forma modal.
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Form2->ShowModal();
}
Tema 3.2.2.- Componentes en C++ Builder
92
Componentes
Ejemplo 120.- Eventos DragOver y DragDrop
Creamos una aplicacin para trabajar con estos eventos y el formulario tendr un componente
ListBox y tres Label, cada uno con la fuente que se especifica.
Label 1: Britannic Bold - Negrita - Cursiva - 10 Puntos Azul
Label 2: Arial - Normal - 12 Puntos - Rojo
Label 3: Courier New - Negrita - Subrayado - 8 Puntos - Verde
Para probar el funcionamiento seleccionamos un Label, arrastramos hasta el ListBox y soltamos,
cambiando el texto del mismo al aspecto del Label seleccionado.
El formulario debe tener un aspecto similar a:
La propiedad DragMode de los Label debe ser dmAutomatic de lo que nos aseguramos asociando la
propiedad al evento OnCreate del formulario.
El cdigo del programa es:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Label1->DragMode = dmAutomatic;
Label2->DragMode = dmAutomatic;
Label3->DragMode = dmAutomatic;
}
Tema 3.2.2.- Componentes en C++ Builder
93
Componentes
Ejemplo 120.- Eventos DragOver y DragDrop
void __fastcall TForm1::ListBox1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{
Accept = Source->ClassNameIs("TLabel");
}
//--------------------------------------------------------------------------void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source,
int X, int Y)
{
if (Sender->ClassNameIs("TListBox") && Source->ClassNameIs("TLabel"))
{
TListBox *Puntero = (TListBox *)Sender;
Puntero->Font = ((TLabel *)Source)->Font;
Puntero->Color = ((TLabel *)Source)->Color;
}
}
Eventos OnHide y OnPaint. Trabajo con la propiedad Canvas del Form
La propiedad TCanvas de un formulario permite dibujar en su rea de cliente. Canvas se usa en el
evento OnPaint del formulario. El mtodo Draw de Canvas tienen una sintaxis como:
Draw(int X, int Y, TGraphic* Grafico);
Dibujndo el grfico especificado por el parmetro Grafico en el canvas y la localizacin que indican
las coordenadas X e Y. Tendremos por tanto que facilitar un mbito global de acceso del tipo:
Graphics::TBitmap *Grafico;
El evento OnHide ocurre cuando el formulario se oculta, es decir cuando su propiedad Visible se pone
en false.
94
Componentes
Ejemplo 121.- Eventos OnHide y OnPaint. Trabajo con la propiedad Canvas del Form
Vamos a implementar una aplicacin con dos formularios que permita mediante la pulsacin de
un botn mostrar el otro formulario dibujando en cada uno de ellos una imagen diferente mediante la
propiedad Canvas del formulario. Debemos tambin permitir que la aplicacin se cierre desde
cualquiera de los formularios.
Comenzamos por construir dos formularios con un Label y un Button con el aspecto que mostramos,
estando los Label con su propiedad Caption vaca y situados a la izquierda de los botones. Ambos
formularios tienen su propiedad Height = 250 y Width a 190 y 240 respectivamente.
95
Componentes
TForm1 *Form1;
Graphics::TBitmap *Grafico; //Ambito global de acceso
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->Show();
this->Hide();
}
void __fastcall TForm1::FormHide(TObject *Sender)
{
Form2->Label1->Caption = "Athenea oculta";
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Form1->Canvas->Draw(0, 0, Grafico); //Dibuja el grafico en Canvas
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Grafico = new Graphics::TBitmap(); //Crea objeto bitmap
//Carga bitmap
Grafico->LoadFromFile("C:\\ARCHIVOS DE PROGRAMA\\ARCHIVOS COMUNES\\BORLAND
SHARED\\IMAGES\\SPLASH\\16COLOR\\ATHENA.BMP");
}
Tema 3.2.2.- Componentes en C++ Builder
96
Componentes
El cdigo del segundo Form es:
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h" //File/Incude Unit ...
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
Graphics::TBitmap *Grafico1; //Ambito global de acceso
__fastcall TForm2::TForm2(TComponent* Owner)
: Tform(Owner) { }
void __fastcall TForm2::Button1Click(TObject *Sender)
{ Form1->Show();
this->Hide(); }
void __fastcall TForm2::FormHide(TObject *Sender)
{ Form1->Label1->Caption = "Tierra oculta"; }
void __fastcall TForm2::FormPaint(TObject *Sender)
{ Form2->Canvas->Draw(0, 0, ElGrafico1); //Dibuja el grafico en Canvas }
void __fastcall TForm2::FormCreate(TObject *Sender)
{ Grafico1 = new Graphics::TBitmap(); //Crea objeto bitmap
//Carga bitmap
Grafico1->LoadFromFile("C:\\ARCHIVOS DE PROGRAMA\\ARCHIVOS COMUNES\\BORLAND SHARED\\
IMAGES\\SPLASH\\16COLOR\\EARTH.BMP");
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->Close(); //Cerramos el Form principal
}
Tema 3.2.2.- Componentes en C++ Builder
97
Componentes
Trabajo con ficheros: la clase ofstream
En el fichero Fstream.h se define la clase ofstream que permite trabajar con ficheros. Para esto
debemos declarar una variable debiendo ser el tipo de dicha variable cualquiera de las tres clases
siguientes:
Clase de objeto
Especializacin
ifstream
Entrada de datos desde un archivo
ofstream
Salida de datos a un archivo
fstream
Lectura y escritura en un archivo abierto
Para declarar el fichero de salida lo haremos con algo similar a:
ofstream Fichero("Archivo de Prueba.txt",ios::trunc).
El constructor de la clase toma como primer parmetro el nombre del archivo a asociar al objeto y
como segundo el modo de apertura, que est formado por uno o ms de los indicadores definidos en la
clase ios siguientes:
Indicador
Modo
Ejemplos de cdigo
in
out
app
ate
trunc
binary
El constructor de la clase ifstream tiene como valor por defecto para el segundo parmetro ios::in y el
constructor de ofstream ios::out.
Tema 3.2.2.- Componentes en C++ Builder
98
Componentes
ProgressBar, StaticText y Animate
Vamos a usar el ejemplo para describir estos componentes.
Ejemplo 122.- Uso de ProgressBar, StaticText y Animate
Se trata de realizar un ejercicio que almacene los 15000 primeros nmeros en un fichero txt, que
una barra de progreso nos muestre el avance que se produce, nos aparezca un nmero indicativo del
progreso sobre la barra y que se muestre un objeto animado tipo folio volando entre carpetas.
Vamos a disear un formulario con altura 165, anchura 315 y centrado en pantalla sobre el que
situamos un objeto ProgressBar (Pestaa Win32) con alineacin alBotton, Max=15000 y Step=1; un
objeto Animate (Pestaa Win32) con Active = false, CommonAVI = aviCopyFile, Repetitions = 1,
StarFrame = 1, StopFrame = 20 y Visible = false.; un objeto StaticText con su Caption vaco y centrado
sobre ProgressBar en vertical y en horizontal estableciendoles una fuente color rojo de 10 puntos y en
negrita; y finalmente colocamos un botn y un CheckBox para tener un diseo similar a:
99
Componentes
ProgressBar, StaticText y Animate
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <FStream.h> // la clase ofstream est definida en este fichero
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/* Con el CheckBox vamos a conmutar la propiedad Smooth de la barra de progreso
Smooth=false hace que la barra sea segmentada y Smooth=true que sea continua */
if(CheckBox1->Checked==false)
ProgressBar1->Smooth=false;
else
ProgressBar1->Smooth=true;
// Creamos el fichero borrando su contenido cuando se crea si ya existe
ofstream Fichero("Archivo de Prueba.txt",ios::trunc);
Cursor = crHourGlass;
Button1->Enabled = false;
100
Componentes
ProgressBar, StaticText y Animate
// Recorremos un bucle para los 15000 valores
for (int N=0; N<15000; N++)
{
Animate1->Active=true;
Animate1->Visible=true;
Animate1->Repetitions = 3;
Animate1->Timers=ProgressBar1->Position;
// Texto a mostrar en la etiqueta StaticText
StaticText1->Caption=AnsiString(ProgressBar1->Position*100/15000+1) + " %";
// Mtodo de Application que interrumpe la ejecucin de una solicitud a fin
// de que pueda procesar la cola de mensajes
Application->ProcessMessages();
// Desplazamiento a la izquierda de forma que Fichero se va completando sin dejar espacios en blanco.
Fichero << N;
// Mtodo StepIt para avanzar (actualizar) segn lo establecido en la propiedad Step de ProgressBar.
ProgressBar1->StepIt();
}
Fichero.close(); // Mtodo para cerrar el archivo
// Establecimiento de las condiciones iniciales
ProgressBar1->Position=0;
Button1->Enabled = true;
Cursor = crDefault;
StaticText1->Caption="";
Animate1->Visible=false;
}
101
a
l
e
d
Fin
s
e
r
p
i
c
a
t
en
102