C++Builder tutorial

102
 1 Tema 3.2.2.- Componentes en C++ Builder Técnicas de Programación Introducción Los compiladores C++Builder nos ofrecen definidos una serie de componentes en la paleta de componentes. Los componentes se agrupan en esta paleta en una serie de pestaas o p!ginas seg"n la funcionalidad de los mismos. #$isten tres formas pos i%les de insertar cual&uier co mponente en un formulario' &ue son( )acemos clic so%re el componentes * posteriormente en el formulario. )acemos un do%le clic so%re el componente. )acemos un clic so%re el componente *' manteniendo pulsado el %otón i,&uierdo del ratón' arrastramos so%re el formulario asta dar el tamao deseado al componente. ediante el inspector de o%/etos accedemos a las propiedades * e0entos asociados a los componentes. #stos componentes son elementos genéricos con una funcionalidad mu* concreta' cu*a finalidad es la reutili,ación. Cada uno de ellos est! destinado a reali,ar una tarea tpica en una aplicación. Los componentes se organi,an en la denominada CL isual Component Li%rar*4 &ue es una /erar&ua de clases escritas en 5%/ect Pascal * &ue se asocia al I6# de C++Buider. 7n componente de la CL es una clase &ue caracteri,a a un control de 8indo9s agregando propiedades' métodos * gestores de e0entos a cada control. #n este tema 0amos a anali,ar las propiedades' métodos * e0entos de los componentes m!s importante * usuales. Tema 3.2.2.- Componentes en C++ Builder 3.2.- Programación C++ con Builder C++

description

c++

Transcript of C++Builder tutorial

  • 1Tema 3.2.2.- Componentes en C++ Builder

    Tcnicas de Programacin

    IntroduccinLos compiladores C++Builder nos ofrecen definidos una serie de componentes en la paleta de componentes. Los componentes se agrupan en esta paleta en una serie de pestaas o pginas segn la funcionalidad de los mismos. Existen tres formas posibles de insertar cualquier componente en un formulario, que son: Hacemos clic sobre el componentes y posteriormente en el formulario. Hacemos un doble click sobre el componente. Hacemos un click sobre el componente y, manteniendo pulsado el botn izquierdo del ratn,

    arrastramos sobre el formulario hasta dar el tamao deseado al componente.Mediante el inspector de objetos accedemos a las propiedades y eventos asociados a los componentes. Estos componentes son elementos genricos con una funcionalidad muy concreta, cuya finalidad es la reutilizacin. Cada uno de ellos est destinado a realizar una tarea tpica en una aplicacin. Los componentes se organizan en la denominada VCL (Visual Component Library) que es una jerarqua de clases escritas en Object Pascal y que se asocia al IDE de C++Buider.Un componente de la VCL es una clase que caracteriza a un control de Windows agregando propiedades, mtodos y gestores de eventos a cada control. En este tema vamos a analizar las propiedades, mtodos y eventos de los componentes ms importante y usuales.

    Tema 3.2.2.- Componentes en C++ Builder

    3.2.- Programacin C++ con Builder C++

  • 2Tema 3.2.2.- Componentes en C++ Builder

    La VCL (Visual Components Library) o biblioteca de componentes visualesEn Windows, no son las aplicaciones quienes manejan los recursos del sistema como pueden ser la memoria, los ficheros, las ventanas y hasta los controles grficos. Es el sistema operativo quin realiza todas estas tareas. Y la aplicacin se limita a realizar peticiones de lo que necesita. Estas peticiones se realizan mediante lo que se denomina la API de Windows.Por todo esto los entornos de programacin visuales 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 tambin se suelen denominar bibliotecas de clases. La VCL es un marco de trabajo visual y orientado a objetos.

    Aplicacin

    VCL

    S.O. Windows

    Tan importantes son los marcos de trabajo, que dominar un entorno de programacin visual, suele traducirse en conocer el lenguaje base del entorno, y su marco de trabajo.Los marcos de trabajo se pueden clasificar en dos categoras:1. Los marcos de trabajo C++ (OWL y MFC)2. La VCL.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 programacin para Windows por su potencia y facilidad de uso.MFC (Microsoft Foundation Class o Biblioteca Fundamental de Clases de Microsoft) y lo incorpor a los compiladores Microsoft Visual C++ (actualmente incluso en Borland C++ 6). MFC es una biblioteca de clases menos abstracta que el OWL y ms cercana a la API. Tambin resulta ms sencillo que OWL para los programadores que conocen la API.Aunque MFC se usa ms que OWL la arquitectura de OWL es, tcnicamente, mejor que MFC.

  • 3Tema 3.2.2.- Componentes en C++ Builder

    La VCL (Visual Components Library) o biblioteca de componentes visualesEn 1995, Borland lanz al mercado Delphi, que supuso la revolucin en la programacin para Windows e inici el desarrollo rpido y sencillo de aplicaciones visuales (RAD), empleando componentes (objetos que pueden ubicarse en formularios y manipulados por medio de propiedades, mtodos y eventos). Delphi se basa en el lenguaje Object Pascal (una ampliacin de Pascal que incorpora programacin orientada a objetos) y permita la creacin de programas ejecutables independientes que no requeran intrprete, por lo que se ejecutaban mucho ms rpido.Lo ms relevante desde el punto de vista tcnico es que Borland cre la VCL (Visual Class Library o Biblioteca de Componentes Visuales) que es un marco de trabajo para crear aplicaciones Windows diseada en torno al concepto de componente (propiedades, mtodos y eventos). La VCL desarrollada para Delphi es la misma que se emplea como ncleo de C++ Builder, de hecho, est escrita en Object Pascal. TObject

    TPersistent

    TComponent

    Ttimer, Ttable, ...

    TControl

    TGraphicControl

    TpaintBox ...

    TWinControl

    Tbutton, Tpanel, ...

    Componentes visibles

    Componentesno visibles

    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 a componentes concretos: realizan tareas de gestin interna y se emplean como clases bases para derivar mediante herencia otras clases. En la figura mostramos una pequea parte de la jerarqua de clases que forman la VCL.

  • 4Tema 3.2.2.- Componentes en C++ Builder

    La VCL (Visual Components Library) o biblioteca de componentes visualesEs posible construir aplicaciones Windows de gran calidad con C++ Builder sin un conocimiento exhaustivo de la VCL, aunque es conveniente realizar una somera descripcin de la jerarqua de clases que conforman la VCL.Las clases que conforman la parte superior (el techo) de la jerarqua de la VCL (Tobject, TPersistent y TComponent) se denominan clases "abstractas" porque sirven para estructurar, y agrupar comportamientos comunes de las clases de la VCL. No se suelen crear objetos directamente a partir de ellas. Rigurosamente hablando, no son clases abstractas, porque no tienen mtodos virtuales puros, pero las podemos considerar como tales en la prctica.TobjectEs el ancestro de todas las clases de la VCL. Encapsula el comportamiento comn de los objetos en C++ Builder, como puede ser informacin de la clase, instanciacin... Suele ser una buena idea derivar nuestras propias clases de TObject, porque aunque no sea normal que el programador haga uso de los mtodos proporcionados por Tobject, si lo es que lo haga C++ Builder en tiempo de ejecucin. Directamente de TObject heredan aquellas clases que no son componentes, y no necesitan ser almacenadas en disco.TPersistentEsta 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.TComponentsta es una de las clases ms importantes de la VCL, ya que la mayora de los objetos que se manejan en una aplicacin son componentes. Esta clase proporciona toda la funcionalidad que requiere un componente bsico. La funcionalidad de TComponent permite que los objetos aparezcan en la paleta de componentes y que sean manipulados por el diseador de formularios, adems de otras capacidades comunes a los componentes.Los componentes no visibles derivan directamente de TComponent mientras que los componentes visibles derivan de TControl, que a su vez deriva de TComponent. Por esta razn se suelen denominar controles a los componentes visibles.

  • 5Tema 3.2.2.- Componentes en C++ Builder

    La VCL (Visual Components Library) o biblioteca de componentes visualesTControlProporciona la funcionalidad de los componentes visibles (controles). Esta funcionalidad es principalmente el aspecto visual que deben ofrecer los componentes en tiempo de ejecucin. TControl proporciona mayor funcionalidad que la que requieren los componentes visibles: los componentes individuales derivan de TGraphicControl o de TWinControl, clases derivadas de Tcontrol.TGraphicControlGeneraliza a los controles que tienen una representacin 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 ejecucin), grficos o dibujos. Poseen una propiedad Canvas que permite acceder a su rea de dibujo.TWinControlSon los controles tpicos de Windows, que pueden recibir el foco, contener otros controles, y adems 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. Dicho identificador es un nmero que Windows incorpora a su base de datos de controladores y peridicamente comprueba si ha realizado alguna solicitud.Clases de Formularios y AplicacionesSon controles en si mismos, pero no se presentan en la paleta de componentes.TApplicationLa clase TApplication encapsula una aplicacin Windows por lo que caracteriza las operaciones fundamentales de un programa en Windows. TApplication simplifica el interface entre el programador y el sistema operativo, ocupndose 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 rpidas", gestin de excepciones, ejecutar cuadros de mensajes, etc.Todas las aplicaciones de C++ Builder tienen un puntero a un objeto Tapplication denominado Application, que se crea automticamente. Cuando un programa empieza a ejecutarse, C++ Builder invoca a la variable Application, llama a sus mtodos Initialize(), CreateForm() y Run().

  • 6Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesTApplicationPor ejemplo, si retomamos el ejemplo 3 podemos abrir el fichero Ejemplo3.cpp o bien abrir el proyecto y seleccionar Proyect/View Source para observar el contenido del fichero que C++ Builder crea como fichero principal de la aplicacin.{ try { Application->Initialize(); Application->Title = "Primera aplicacin"; Application->CreateForm(__classid(TFormPrincipal), &FormPrincipal); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0;}

    Mtodos Initialize(), CreateForm() y Run().Adems aparece el mtodo Title por haber puesto un ttulo a nuestra aplicacin

    Como Application se crea automticamente no aparece en la paleta de componentes ni est disponible en el inspector de objetos para manipular "visualmente" sus propiedades.En cualquier caso, algunas propiedades pueden establecerse en tiempo de diseo seleccionando las pginas Forms o Applicaction en Project/Options.

  • 7Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesPropiedades de TApplication

    Propiedad DescripcinActive Especifica si la aplicacin est activa y tiene el foco.

    Hint

    Hint especifica el texto que debe aparecer en el cuadro de ayuda o texto de sugerencia asociadoa la aplicacin. Este cuadro aparece cuando ocurre el evento OnHint. Por defecto se muestranicamente el cuadro asociado al componente sobre el que est el ratn por lo que usualmentese emplea esta propiedad para mostrar la informacin extensa de este componente en una barrade estado, por ejemplo.

    ShowHintShowHint determina si los cuadros de sugerencia estarn activados o desactivados para toda laaplicacin.Pueden emplearse las funciones GetShortHint() y GetLongHint() para obtener las dos partes dela propiedad Hint.

    MainForm MainForm especifica qu formulario acta como ventana principal de la aplicacin.

    ShowMainFormShowMainForm especifica si la aplicacin debe mostrar la ventana principal al iniciar suejecucin. Para ocultarla, establecer esta propiedad a false antes de la llamada a Application->Run y asegurarse de que la propiedad Visible del formulario est tambin a false.

    Icon y TitleEspecifican el icono y el texto, respectivamente, que aparecen en la barra de tareas de Windowscuando se minimiza la aplicacin. Pueden establecerse en tiempo de diseo seleccionandoProject/Options/Application.

    HelpFile yCurrentHelpFile Para especificar el fichero de ayuda asociado a la aplicacin.

    Ejemplo 93.- Propiedades de TApplicationVamos a realizar paso a paso una aplicacin visual que muestra el uso de la propiedad

    Application.

  • 8Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesPropiedades de TApplicationCreamos una aplicacin y archivamos el trabajo, no es necesario cambiar el nombre a ningn archivos.Declaramos el mtodo DisplayHint como un procedimiento pblico del Formulario

    Escribimos en el Unit, debajo de lo creado automticamente, el mtodo DisplayHint y lo asignamos a Application para que lo maneje el evento OnCreate del Form. void __fastcall TForm1::DisplayHint(TObject *Sender){ StatusBar1->SimpleText = GetLongHint(Application->Hint);}Situamos sobre el formulario un componente OpenPictureDialog de la pestaa Dialog y un botn al que modificamos su propiedad Caption a Seleccionar un Icono.

  • 9Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesPropiedades de TApplicationSituamos sobre el formulario un componente StatusBar de la pestaa Win32 y hacemos doble clic sobre el formulario para crear el gestor de evento y teclear las lneas siguientes.

    void __fastcall TForm1::FormCreate(TObject *Sender){ Form1->Hint="Mostrar la propiedad Hint"; Application->OnHint = DisplayHint; Application->Title="Uso de Application";}

    Hacemos doble clic sobre el botn para crear el gestor de evento y teclear las lneas siguientes.void __fastcall TForm1::Button1Click(TObject *Sender){ OpenPictureDialog1->DefaultExt = GraphicExtension(__classid(TIcon)); OpenPictureDialog1->FileName = GraphicFileMask(__classid(TIcon)); OpenPictureDialog1->Filter = GraphicFilter(__classid(TIcon)); OpenPictureDialog1->Options.Clear(); OpenPictureDialog1->Options Icon->LoadFromFile(OpenPictureDialog1->FileName); break; } else { OpenPictureDialog1->Options.Clear(); OpenPictureDialog1->Options

  • 10Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesPropiedades de TApplicationEjecutando el programa y seleccionando un icono al pulsar el botn obtenemos el siguiente resultado. Observar minimizando la aplicacin como aparece el ttulo de la misma.El ejemplo lo hemos realizado a efectos de demostracin de Application, ya que mostrar una pista en la barra de estado se puede hacer con su propiedad Autohint sin necesidad de escribir el evento OnHint.Mtodos de TApplication

    Mtodo DescripcinBringToFront() 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 decdigo 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 nohay 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 unvalor que depende del botn seleccionado para cerrar el cuadro de dilogo.Minimize() Minimiza una aplicacin y la aloja en la barra de tareas de Windows.Restore() Reestablece el tamao que tena la aplicacin antes de ser minimizada.Run() Ejecuta la aplicacin.Terminate() Finaliza laejecucin de una aplicacin.

    ShowException()Muestra un cuadro de dilogo cuando se produce una excepcin que no es gestionada por laaplicacin. Para especificar qu excepciones pueden gestionarse en la aplicacin, debemosconstruir un gestor para el evento OnException.

    HandleException() Proporciona una manera de gestionar excepciones por defecto en la aplicacin.

  • 11Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesEventos de TApplication

    Evento Descripcin

    OnActivateOnDeactivate

    Ocurren respectivamente cuando se activa o desactiva la aplicacin.Una aplicacin se activa cuando se genera la aplicacin (empieza a ejecutarse) o cuandoestaba activa otra aplicacin y una ventana de la aplicacin a la que se refiere recibe el foco.Una aplicacin se desactiva cuando el usuario selecciona otra aplicacin.

    OnHintOnHint ocurre cuando el cursor se coloca sobre un control o una opcin de un men quepuede mostrar un cuadro de sugerencia.Se suele escribir un gestor para este evento cuando se quiere mostrar un texto largo desugerencia en una barra de estado.

    OnShowHintOnShowHint ocurre cuando la aplicacin va a mostar un cuadro de sugerencia. Se sueleusar para modificar la apariencia del cuadro.Pueden emplearse las funciones GetShortHint() y GetLongHint() para obtener las dos partesde la propiedad Hint

    OnMinimizeOnRestore

    Ocurren cuando la aplicacin se minimiza o se reestablece al tamao normal,respectivamente.

    OnHelp Ocurre cuando la aplicacin recibe una peticin de ayuda. Los mtodos HelpContext() yHelpJump() gestionan de forma automtica este evento.

    OnException Se emplea cuando se desea modificar el comportamiento por defecto de una aplicacincuando se manifiesta alguna excepcin que no es tratada por el programa.

    OnShortCutSe emplea este gestor para realizar acciones antes de que el formulario o los controles delformulario 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.

  • 12Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesMtodos y eventos de TApplicationEjemplo 94.- Mtodos y eventos de TApplication

    Muestra de un programa totalmente comentado para ver algunos mtodos y eventos de Tapplication. Situando en un Form un componente Timer y dos botones para tener algo similar a:

    void __fastcall TForm1::Button1Click(TObject *Sender){ /* Hacemos doble clic sobre el botn al que hemos puesto en Caption Mostrar Mensaje. Las siguientes lneas harn que la ventana con el mensaje se muestre en primer plano y una vez cerrada esta que el formulario desde el que la hemos llamado se restaure en primer plano. */ Application->NormalizeTopMosts(); Application->MessageBox("Esto se muestra en primer plano", "Observese", MB_OK); Application->RestoreTopMosts();}//---------------------------------------------------------------------------void __fastcall TForm1::AppDeactivate(TObject *Sender){ /* El cdigo siguiente minimiza la aplicacin cuando esta se desactiva. Debemos declarar el mtodo como pblico en el header con lo siguiente: void __fastcall AppDeactivate(TObject *Sender); */ Application->Minimize();}//--------------------------------------------------------------------------- /* Las siguientes lneas van a provocar el siguiente efecto: cuando minimizamos la aplicacin el Timer comienza a contar y tras el tiempo especificado la ventana vuelve a su estado anterior debido al evento OnTimer. El temporizador no estar activo hasta la prxima vez que minimicemos la ventana. */

  • 13Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesMtodos y eventos de TApplication// Creamos el eventovoid __fastcall TForm1::IniciarTimer(TObject *Sender){ /* Implementamos el mtodo IniciarTimer sin olvidarnos de declararlo como pblico con: void __fastcall IniciarTimer(TObject *Sender); */ Timer1->Enabled = true;}// Creamos el eventovoid __fastcall TForm1::FormCreate(TObject *Sender){ Application->OnDeactivate = AppDeactivate; Application->OnMinimize = IniciarTimer; Timer1->Interval = 1000;}// Creamos el eventovoid __fastcall TForm1::Timer1Timer(TObject *Sender){ Application->Restore(); Timer1->Enabled = false;}// Creamos el eventovoid __fastcall TForm1::Button2Click(TObject *Sender){ Application->Terminate();}//---------------------------------------------------------------------------

  • 14Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesTformLa clase TForm caracteriza a los formularios en la VCL. Los formularios se emplean como ventanas principales, cuadros de dilogo, ventanas secundarias o cualquier otro tipo de ventana que se pueda imaginar. A continuacin veremos las propiedades, mtodos y eventos principales de los formularios de forma resumida.Propiedades de los formularios en tiempo de diseo y ejecucin

    Propiedad DescripcinActiveControl Establece qu componente tiene el foco cuando se abre el formulario.Enabled Indica si el formulario est activo (si puede recibir el foco).AutoScroll,HorzScrollBarVertScrollBar

    Controlan conjuntamente las barras de desplazamiento de un formulario.

    BorderIcons Indica qu iconos aparecen en la barra de ttulo de un formulario.BorderStyle Indica qu tipo de borde debe tener el formulario.Caption Indica la cadena que aparece en la barra de ttulo del formulario mientras que NameName Indica con qu nombre se refiere al formulario en la aplicacin (en el cdigo).Color Color de fondo del formulario.Cursor Especifica qu cursor se muestra cuando est sobre el formulario.

    Font Permite especificar las propiedades de la fuente de letra que se usar en el formulario. Se aplica a todoslos 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 ejecuciny cuando se minimice.Height y Width Altura y anchura (en pxels) del formulario.

    ClientWidthClientHeight

    Altura y anchura (en pxels) del rea de cliente del formulario (el rea de cliente es la que queda dentro delos bordes del formulario y por debajo de la barra de ttulo y de la barra de men). Al modificar estaspropiedades se actualizan Width y Height.

  • 15Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesPropiedades de los formularios en tiempo de diseo y ejecucin

    Propiedad DescripcinLeft y Top Coordenadas X e Y del formulario (esquina superior izquierda) en la pantalla.Position Determina el tamao y la posicin del formulario.FormStyle Para especificar si un formulario es o no parte de una aplicacin multiformulario.HelpFileHelpContext Para especificar el fichero de ayuda asociado a la aplicacin y gestionar la ayuda contextual.

    HintEspecifica 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 asociadoal componente sobre el que est el ratn por lo que usualmente se emplea esta propiedad para mostrar lainformacin extensa de este componente en una barra de estado, por ejemplo.

    ShowHint Determina si los cuadros de sugerencia estarn activados o desactivados para el formulario.

    Visible Indica si el formulario es visible o no. Los mtodos Show() y ShowModal() hacen que un formulario seavisible y lo colocan por encima de todos.WindowState Para establecer el estado inicial del formulario (normal, minimizado o maximizado) o consultar su estado.

    Propiedades de los formularios en tiempo de ejecucin

    Propiedad DescripcinActive Indica si el formulario est activo (si tiene el foco).

    CanvasEl lienzo es la superficie del formulario sobre la que se puede dibujar. La propiedad Canvas da acceso aesta superficie para dibujar lneas, mapas de bits, texto, ... en el rea de cliente. Suele usarse con el gestordel 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 esvisible, si es modal, etc.).

  • 16Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesMtodos de los formularios

    Mtodo DescripcinBringToFront() SendToBack() Coloca al formulario en primer plano o en ltimo, respectivamente.

    Hide() Oculta el formulario (establece la propiedad Visible a falso).Print() Imprime el contenido del formulario.Show()ShowModal()

    Para mostrar formularios. ShowModal() ejecuta (abre) el formulario modalmente: debe cerrarse paraque 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, elcomponente 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() Convierte las coordenadas del rea de cliente en coordenadas de pantalla y viceversa.

    Invalidate()Refresh()Repaint()Update()

    Para redibujar un formulario.

    Release() Destruye un formulario y libera toda la memoria asociada.

    Eventos de los formulariosUna accin puede desencadenar varios eventos y el orden en que ocurren puede ser muy importante.Cuando se crea un formulario se generan los siguientes eventos, que enumeramos ordenadamente:1. OnCreate.2. OnShow.3. OnActivate.4. OnPaint.

  • 17Tema 3.2.2.- Componentes en C++ Builder

    Clases de Formularios y AplicacionesEventos de los formulariosDe la misma manera, cuando se destruye el formulario se generan los siguientes eventos, que enumeramos ordenadamente:1. OnCloseQuery.2. OnClose.3. OnDestroy.4. Destructor del formulario (si existe).

    Evento DescripcinOnActivateOnDeactivate

    Ocurren cuando se activa o desactiva un formulario, respectivamente. Un formulario se activa cuandose recibe el foco y se desactiva cuando el foco pasa a otro formulario de la misma aplicacin.

    OnCreateOnDestroy

    OnCreate ocurre cuando se crea inicialmente el formulario (slo ocurre un evento de este tipo porformulario) y OnDestroy cuando se destruye.

    OnCloseOnCloseQuery

    El evento OnClose ocurre cuando se cierra un formulario. Hace una llamada a OnCloseQuery paraasegurarse de que es correcto cerrarlo.

    OnMouseDownOnMouseMoveOnMouseUpOnClickOnDblClick

    Para responder a los eventos que suceden al mover el ratn o cuando se pincha con l sobre elformulario.

    OnKeyDownOnKeyUpOnKeyPress

    Para responder a los eventos que suceden al pulsar alguna tecla sobre el formulario.

    OnHelp Ocurre cuando se recibe una peticin de ayuda en el formulario.

    OnHideOnShow

    Ocurren cuando se oculta o se muestra el formulario, respectivamente (cuando su propiedad Visible seestablece a false o true, respectivamente). OnShow ocurre justo antes de que el formulario se hagavisible.

    OnPaintOcurre cuando el formulario necesita ser redibujado (refrescado). Esto ocurre muy frecuentemente, yaunque los componentes del formulario se redibujan generalmente por s mismos, a veces es precisoredibujar "manualmente" el formulario.

    OnResize Ocurre cuando se modifica el tamao del formulario, justo despus de redimensionar el formulario.

  • 18Tema 3.2.2.- Componentes en C++ Builder

    Resumen sobre la VCLLa VCL (Visual Component Library) la forman un conjunto de componentes u objetos visuales prefabricados. Cuando incluimos un componente en una aplicacin este pasa a formar parte de su ejecutable. Podemos decir que un componente es un elemento de nuestro programa que posee caractersticas (propiedades) y acciones (mtodos) asociadas y que reaccionar o no ante una situacin producida en el entorno (evento). Un componente, por tanto, est asociado a mtodos (cdigo de programa correspondiente a un procedimiento al que se puede acceder desde el programa), y en muchos casos a propiedades y eventos.

    Las propiedades representan los datos contenidos en el objeto. Los mtodos son las acciones que el objeto puede realizar. Los eventos son condicionantes ante los cuales el objeto puede reaccionar.

    Todo componente posee un nombre (Name) que lo diferencia del resto de componentes de una aplicacin. Por defecto, C++ Builder asigna un valor que tiene relacin con el tipo de componente y un nmero que los diferencie del resto de componentes.Una propiedad la podemos considerar como una variable ligada al componente que posee un valor que condicionar su funcionamiento. Algunas propiedades estn disponibles en fase de diseo y otras no, es decir, que podremos modificar su contenido mediante el Inspector de Objetos o lo deberemos hacer en tiempo de ejecucin. Por ejemplo, para modificar el ttulo de un formulario podemos asignar el valor directamente a la propiedad Caption desde el Inspector de Objetos o modificarla desde cdigo cuando ocurra un evento o cuando se inicie la aplicacin. El cdigo asociado se incluira en el cdigo del programa como muestra la figura:

  • 19Tema 3.2.2.- Componentes en C++ Builder

    Resumen sobre la VCLEn la figura anterior aparece la lnea de cdigo Caption = "Modificacin del ttulo o Caption"; que modificar el contenido de la propiedad en tiempo de ejecucin. Si queremos hacer referencia a una propiedad de un componente desde un procedimiento no asociado a ese componente debemos referenciar la propiedad con el operador -> de la siguiente forma:

    Form1->Caption = "Modificacin del ttulo o Caption";Un evento es una situacin que se produce durante la ejecucin de un programa. Los eventos pueden provenir del sistema, del ratn, desde teclado, etc.... Un componente podr reaccionar ante un evento si el tipo de componente lo tiene as predefinido, dependiendo del objetivo para el que est diseado. Por ejemplo, un componente TForm (formulario o ficha) tiene, por supuesto, un evento asociado a la accin de cerrar (Sistema), en cambio, el componente TButton (botn) no lo tendr. Cuando ocurre un suceso durante la ejecucin de nuestro programa, los componentes sobre los que se produzca reaccionarn o no a este suceso si disponen de un evento que lo detecte. Cuando queramos incluir un conjunto de sentencias que se ejecuten cuando se produzca un determinado suceso deberemos asociar un conjunto de instrucciones al evento correspondiente del componente. Este grupo de acciones se expresar en el cdigo del programa. C++ Builder generar automticamente la base principal del cdigo que se va asociar al evento, pudiendo escribir como bloque de instrucciones las sentencias que deseemos. Por ejemplo, si pulsamos en el Inspector de Objetos del componente formulario (Form1) sobre el evento OnClose (que se produce cuando se cierra el formulario) aparecer el editor de cdigo con las lneas:

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){

    ShowMessage(Cierre de la aplicacin);}

    Crendose una lnea en blanco donde se sita el cursor y donde podemos escribir una lnea de cdigo como la destacada en rojo. Esto nos mostrar una ventana de dilogo con el mensaje entrecomillado y un botn OK.

  • 20Tema 3.2.2.- Componentes en C++ Builder

    Resumen sobre la VCLEjemplo 95.- Propiedades, mtodos y eventos sobre un formulario

    Se trata de realizar un programa visual que trabaje con propiedades, mtodos y eventos de un formulario para realizar las operaciones que iremos describiendo paso a paso. En el inspector de objetos (Object Inspector) hacemos los siguientes cambios de propiedades del formulario:1.- Ponemos en false los valores de biMinimize y biMaximize de BorderIcons, lo que eliminar las

    opciones de maximizar y minimizar en tiempo de ejecucin.2.- A la propiedad BorderStyle le damos el valor bsSingle, impidiendo que la ventana sea

    dimensionable en la fase de ejecucin.3.- Asignamos a la propiedad Position el valor psScreenCenter, con lo que la ventana siempre

    aparezca centrada en pantalla. 4.- Establecemos la propiedad Cursor con el valor crHandPoint y cuando el puntero del ratn est

    situado sobre el formulario aparezca el cursor como una mano.5.- Establecemos unas dimensiones del formulario de 150x300 pixels.

    Accedemos a la ventana de cdigo con F12, o con el botn de acceso rpido Toggle Form/Unit o bien desde men view y escribimos justo debajo de la lnea Tform *Form1; la sentencia int ncolor; con la que definiremos una variable global de tipo entero que, en nuestro programa podr tomar los valores 1, 2, 3 4.Entre las llaves que definen el constructor del formulario (lneas que siguen en gris) tecleamos la lnea que vemos destacada en negro .

    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){Caption = "Modificacin del ttulo o Caption";}

  • 21Tema 3.2.2.- Componentes en C++ Builder

    Resumen sobre la VCLEjemplo 95.- Propiedades, mtodos y eventos sobre un formularioHacemos doble clic sobre el evento OnClose del Inspector de Objetos teniendo seleccionado el componente Form1 y sobre el gestor de evento que se genera (gris) tecleamos la lnea de cdigo en negro.void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){ ShowMessage("Cierre de la aplicacin");}Hacemos doble clic en el evento OnCreate y escribimos el siguiente cdigo:void __fastcall TForm1::FormCreate(TObject *Sender){ ncolor=1; Form1->Color=clRed;}En este caso no sera necesario anteponer a la propiedad Color el componente al que corresponde porque la funcin corresponde al propio formulario. Tambin podramos usar el puntero this escribiendo this->Color=clRed; , aunque tampoco es necesario en este caso.Generamos el evento OnCloseQuery, que se producir cuando se solicite el cierre del formulario, y escribimos el siguiente cdigo:void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose){ if (Application->MessageBox("Esta seguro?","Va a cerrar la aplicacin",MB_YESNO) == ID_YES) CanClose=true; else CanClose=false;}Conseguimos que se pregunte al usuario si quiere o no abandonar el programa, evitndolo si su respuesta es no.

  • 22Tema 3.2.2.- Componentes en C++ Builder

    Resumen sobre la VCLEjemplo 95.- Propiedades, mtodos y eventos sobre un formularioFinalmente, hacemos doble clic sobre el evento OnClick de forma que cada vez que se pulse el ratn aparezca el fondo del formulario de uno de los 4 colores que escogemos con el cdigo siguiente.void __fastcall TForm1::FormClick(TObject *Sender){ switch (ncolor) { case 1:Color=clMaroon; break; case 2:Color=clPurple; break; case 3:Color=clGreen; break; default:Color=clRed; ncolor=0; } ncolor++;}Guardamos el programa, depuramos los posibles errores de compilacin, linkado y ejecucin hasta ejecutar el programa y la ventana tendr la siguiente apariencia al solicitar su cierre:

  • 23Tema 3.2.2.- Componentes en C++ Builder

    ComponentesYa 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 breveMainMenu No Diseo de barras de mens junto con sus correspondientes mens desplegables.

    PopUpMenu No Diseo de mens contextuales o emergentes que se muestras al hacer clic con el botnderecho 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 SiCasilla de verificacin, para alternativas tipo S/No, Verdadero/Falso o Activado/Desactivado.Los CheckBox son independientes entre s, ya que las opciones que representan no sonexcluyentes entre ellas.

    RadioButton Si Para representar opciones donde slo est disponible una de ellas. ListBox Si Lista de opciones para que el usuario seleccione una o varias de ellas.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 Agrupar componentes relacionados en una ficha.RadioGroup Si Agrupar RadioButton en una ficha.Panel Si Agrupar componentes y creacin de barras de estado.

  • 24Tema 3.2.2.- Componentes en C++ Builder

    ComponentesPestaa Standar

    Componente Visible? Descripcin breveFrames Si Contenedor de componentes que puede anidarse en otros frames o formularios.

    ActionList No Mantiene una lista de las acciones que pueden ser usadas por componentes y controles,como opciones de men y botones.

    Ejemplo 96.- Modificacin y consulta de propiedades en tiempo de ejecucinSe trata de retomar el ejemplo 3 donde diseamos un formulario con varios campos y establecer

    el cdigo necesario sobre los gestores de eventos para realizar las operaciones que citamos.Sobre el evento OnCreate:

    Modificamos la propiedad Caption para que aparezca Ejemplo 96 Si el color del Form es clBtnFace lo cambiamos a clWhite Establecemos la propiedad Checked del CheckBox a false Hacemos que se oculten los dos RadioButtom Crear y trabajar con otros gestores de eventos que describiremos una vez realizadas las

    operaciones anteriores. En primer lugar creamos un nuevo directorio denominado ejemplo 96 y abrimos el ejemplo 3 tal y como lo dejamos anteriormente. Clicamos en File/Save As... y guardamos en nuestro nuevo directorio y tambin File/Save Project As ... para archivar el proyecto cambiando el nombre de Ejemplo3 a Ejemplo96. Con esto tendremos los archivos necesarios mnimos para el proyecto. El cdigo asociado al evento OnCreate ser: FormPrincipal->Caption = "Ejemplo 96"; if (FormPrincipal->Color == clBtnFace) // Lectura FormPrincipal->Color = clWhite; // Escritura CheckBoxOpciones->Checked = false; // Escritura RadioButtonOp1->Hide(); RadioButtonOp2->Hide(); /* Hide() es el mtodo que oculta el componente sobre el que se aplica. */

  • 25Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 96.- Modificacin y consulta de propiedades en tiempo de ejecucin

    Hasta este momento el aspecto de la aplicacin en tiempo de ejecucin ser

    if (CheckBoxOpciones->Checked == true) { RadioButtonOp1->Show(); RadioButtonOp2->Show(); RadioButtonOp1->Checked = true; ButtonOK->Enabled = true; } else { RadioButtonOp1->Hide(); RadioButtonOp2->Hide(); ButtonOK->Enabled = false; LabelSalida->Caption = ""; }

    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. Para ello, escribiremos el gestor asociado al evento OnClick del componente CheckBox:

  • 26Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 96.- Modificacin y consulta de propiedades en tiempo de ejecucinFinalmente, 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; }

  • 27Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposCuando estudiamos la clase AnsiString vimos que resultaba especialmente til la conversin entre tipos, por lo que vamos a analizar algunas de las rutinas de conversin entre tipos.StrToIntConvierte un AnsiString que representa un nmero entero (en notacin decimal o hexadecimal) a un nmero. Su sintaxis es la siguiente: StrToInt(const AnsiString S);. StrToInt convierte la cadena S de tipo AnsiString, que representa un nmero de tipo entero en notacin decimal o hexadecimal, en un nmero. Si la S no representa nmero vlido, StrToInt ejecuta una excepcin EconvertError.Ejemplo 97.- Uso de StrToInt

    Situamos en un formulario dos elementos Edit y un elemento Button. Cuando pulsemos el botn, el cdigo convierte los valores introducidos en los Edit a nmeros enteros, los suma, y muestra un mensaje que indica la suma. El fichero .cpp quedara en los gestores de eventos de la siguiente forma:

    void __fastcall TForm1::Button1Click(TObject *Sender){ int i1, i2; //Declara i1 e i2 como enteros i1 = StrToInt(Edit1->Text); //Convierte a entero el Text que introducimos en Edit1, que deber ser // un nmero entero, y asigna el valor a i1 i2 = StrToInt(Edit2->Text); //Convierte a entero el Text que introducimos en Edit2, que deber ser // un nmero entero, y asigna el valor a i2 ShowMessage("Suma: " + IntToStr(i1 + i2)); // Suma los valores i1 e i2 (un entero) y convierte el resultado en un // string que se muestra como mensaje emergente.}//---------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){ Edit1->Text=""; Edit2->Text="";}

  • 28Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tipos

    Efectivamente, el nmero introducido no es un valor entero vlido, por lo que se ejecuta una excepcin EconvertError antes de efectuar la operacin sealada. Dicho de otra forma, la suma se realiza en complemento a 1 y, mientras los datos introducidos sean enteros vlidos, el procesador efectuar la suma dentro de rango sin lanzar una excepcin EconvertError. De esta forma se evita que el procesador realice operaciones no vlidas mediante comandos de programacin, pero en cambio surge un error en la programacin que debemos tener especialmente presente.

    Recordemos lo que pasaba con la suma de enteros con nmeros dentro del rango del tipo int.En cambio cuando tecleamos un nmero fuera de rango lo que ocurre es:

  • 29Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposEl problema lo podemos resolver utilizando el siguiente procedimiento, del que vemos el resultado:Ejemplo 97b.- Uso de StrToInt

    Situamos en un formulario tres elementos Edit, dos label y un elemento Button. Cuando pulsemos el botn, el cdigo convierte los valores introducidos en los Edit a nmeros enteros de 64 bits, los suma, y muestra en el tercer Edit la suma. El fichero .cpp quedara en los gestores de eventos de la siguiente forma:

    void __fastcall TForm1::Button1Click(TObject *Sender){ __int64 i1, i2; i1 = StrToInt64(Edit1->Text); i2 = StrToInt64(Edit2->Text); Edit3->Text = i1+ i2;}//---------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){ Edit1->Text=""; Edit2->Text=""; Edit3->Text="";}

  • 30Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposStrToIntDefConvierte un AnsiString que representa un nmero entero a un nmero. Su sintaxis es la siguiente:

    StrToIntDef(const System::AnsiString S, int Default);StrToIntDef convierte la cadena S de tipo AnsiString, que representa un nmero de tipo entero en un nmero. Si la S no representa nmero vlido, StrToIntDef devuelve el entero introducido por defecto en int Default, evitando as la excepcin EconvertError que se produce en StrToInt.Ejemplo 98.- Uso de StrToIntDef

    Veamos un ejemplo que utiliza dos elementos Label, dos Edit y un Button de forma que el usuario introduce en dato de entrada un nmero entero, clica sobre el botn de ejecucin y en el campo correspondiente a dato de salida aparece el nmero tecleado si es un entero vlido, en caso contrario aparecer el nmero 0 introducido por defecto. El cdigo para el OnClick del botn ser el siguiente:

    void __fastcall TForm1::Button1Click(TObject *Sender){ int Numero = StrToIntDef(Edit1->Text, 0); Edit2->Text = IntToStr(Numero);}

    Los resultados son:

  • 31Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposIntToStrConvierte 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; // 1i1 = 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; // 1i1 = 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

  • 32Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposStrToFloatConvierte 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.FloatToStrConvierte 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.FloatToStrFConvierte 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 '.

  • 33Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposStrToCurrConvierte un AnsiString en un objeto tipo Currency. Su sintaxis es la siguiente:

    StrToCurr(const AnsiString S);CurrToStr y CurrToStrFConvierte 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);

    StrToDateConvierte 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 ECONVERTERRORTDateTime 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.DateToStrConvierte 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.

  • 34Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposEjemplo 99.- Que da de la semana es?void __fastcall TForm1::Button1Click(TObject *Sender){ DateSeparator = '-'; //Cambia el separador / por - ShortDateFormat = "d/m/yyyy"; //Cambia el formato de m/d/yyyy a d/m/yyyy Label2->Caption = DateToStr(Date()); //Fecha actual del sistema char dias[7][10]={"Domingo","Lunes","Martes","Mircoles","Jueves","Viernes","Sabado" }; TDateTime dia = StrToDate(Edit1->Text); //1 Label4->Caption = dias[dia.DayOfWeek() - 1]; //Mostramos el resultado obtenido//1 Convertimos de String a Date almacenandolo en dia del tipo TDateTime}

    StrToTimeConvierte 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.TimeToStrConvierte un objeto TdateTime a un AnsiString con la siguiente sintaxis:

    TimeToStr(System::TDateTime Time);

  • 35Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tipos

    Ejemplo 100.- Buenos das o buenas tardesVeamos un programa que salude con buenos das o buenas tardes segn la hora introducida.

    Adems vamos a mostrar la fecha y la hora con las conversiones vistas.El cdigo es:void __fastcall TForm1::Button1Click(TObject *Sender){ DateSeparator = '-'; //Cambia el separador / por - ShortDateFormat = "d/m/yyyy"; //Cambia el formato de m/d/yyyy a d/m/yyyy TDateTime hora = StrToTime(Edit1->Text); //1 if (hora < (TDateTime) 0.50 ) //2 Edit2->Text="Buenos das"; else Edit2->Text="Buenas tardes";// 1 Convertimos el texto de Edit1 (dado en formato HH:MM:SS) a formato Tdate Time// asignado el valor a la variable hora//2 Segn sea antes de las 12 o despus de las salude se emite uno u otro saludo TimeSeparator = '_'; Label3->Caption = TimeToStr(Time()); Label5->Caption = DateToStr(Date()); //Fecha actual del sistema Label7->Caption = DateTimeToStr(Now());}

    DateTimeToStrConvierte un objeto TdateTime a un AnsiString con la siguiente sintaxis:

    DateTimeToStr(const System::TDateTime DateTime);

  • 36Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposEjemplo 100.- Buenos das o buenas tardes

    Algunos resultados.

    IntToHexConvierte 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.

  • 37Tema 3.2.2.- Componentes en C++ Builder

    Conversin entre tiposIntToHexCdigos UNICODE de los nmeros:

    0030 - 0039 -> 0 - 9 ISO - LATIN-1Cdigos UNICODE de las letras y otros caracteres:

    0024 Signo de $0041 - 005A Mayusculas A a Z005F _(guin bajo)0061 - 007A Minusculas a a z00C0 - 00D6 00D8 - 00F6 00F8 - 00FF

    Ejemplo 101.- Conversin a HexadecimalSobre un formulario situaremos, entre otros, un Edit, un Button y un Label de forma que en el

    Label aparezca la conversin a hexadecimal de la cadena introducida en el Edit.void __fastcall TForm1::Button1Click(TObject *Sender){ AnsiString EditText = Edit1->Text; Label2->Caption = ""; for (int i=1;iCaption = Label2->Caption + IntToHex(EditText[i],4) + " "; }}

  • 38Tema 3.2.2.- Componentes en C++ Builder

    ComponentesLabelEste 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 SpeedButtonButton 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.).

  • 39Tema 3.2.2.- Componentes en C++ Builder

    ComponentesButton, BitBtn y SpeedButtonDe 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.

  • 40Tema 3.2.2.- Componentes en C++ Builder

    ComponentesButton, BitBtn y SpeedButtonSus 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.

    EditLa 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) -> Edit1b) En C: printf("%d", sueldo) -> Edit2c) 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) );

  • 41Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEditSi, 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:

  • 42Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEdit

    int a; // rea de declaracin de variablesdouble b;a = Edit1->Text.ToInt(); // rea de captura de datosb = Edit2->Text.ToDouble();a = a+3; // rea de operacionesb = b *5.1; // rea de despliegue y conversin de nmeros a strings o EditsLabel3->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 00.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 Zero0.000E+00 1.234E+03 -1.234E+03 5.000E-01 0.000E+00#.###E-0 1.234E3 -1.234E3 5E-1 0E0

  • 43Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEditPor ejemplo:

    double a; // rea de declaracin de variablesa = Edit1->Text.ToDouble(); // captura y conversin de datosa = a/3.1416 ; // operacionesEdit2->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:

    Ejemplo 102.- Calcular el rea de un tringuloVamos a construir un programa que nos facilite el modelo de solucin del rea del tringulo

    conocidas la base y la altura. Construimos un formulario similar a:

  • 44Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 102.- Calcular el rea de un tringuloEl cdigo asociado al evento OnClick del componente Button quedar como sigue:

    Edit3->Text=FormatFloat("###.##",Edit1->Text.ToDouble()*Edit2->Text.ToDouble()/2);

    MaskEditEste 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.

  • 45Tema 3.2.2.- Componentes en C++ Builder

    ComponentesMaskEditEn 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! Los carcteres opcionales aparecen en blanco

    > Todos los caracteres que le siguen se pasan a maysculas hasta el final de la mscara o hasta que seencuentra el carcter . Los caracteres que siguen aparecen en maysculas o minsculas segn sean tecleados por el usuario.\ El carcter siguiente es un carcter literal. L Requiere una letra mayscula o minscula en esta posicinl Permite una letra es esta posicin pero no la requiereA Requiere un carcter alfanumrico (letras y/o nmeros) en esta posicina Permite un carcter alfanumrico en esta posicin pero no lo requiereC Requiere un carcter arbitrario en esta posicin.c Permite un carcter arbitrario en esta posicin pero no lo requiere0 Requiere un numero en esta posicin9 Permite un numero pero no lo requiere# Permite un numero y signos mas y menos en esta posicin pero no lo requiere: Separador de horas, minutos y segundos para funciones horarias. / Separador de meses, das y aos para funciones de fecha. ; Se utiliza para separar los tres campos o partes de que consta una mascara_ Para insertar espacios en blanco en el texto de la mascara

  • 46Tema 3.2.2.- Componentes en C++ Builder

    ComponentesMaskEditCualquier 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().

    ComboBoxExisten 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:

  • 47Tema 3.2.2.- Componentes en C++ Builder

    ComponentesComboBox

    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().PanelPara 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.

  • 48Tema 3.2.2.- Componentes en C++ Builder

    ComponentesPanelEste 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.GroupBoxEste 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 agrupamientoVamos a reconstruir el ejemplo de clculo del rea de un tringulo utilizando un componente

    panel y un groupbox.

  • 49Tema 3.2.2.- Componentes en C++ Builder

    ComponentesMltiples ventanasUn 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; //1int 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:

  • 50Tema 3.2.2.- Componentes en C++ Builder

    ComponentesMltiples ventanas0. 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 cortaForm2->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 ventanasVamos 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.

  • 51Tema 3.2.2.- Componentes en C++ Builder

    Asignacin de memoriaEn 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 diseo

    Tiempo de ejecucin

  • 52Tema 3.2.2.- Componentes en C++ Builder

    Asignacin de memoriaOperadores new y deleteInicialmente, 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.

  • 53Tema 3.2.2.- Componentes en C++ Builder

    Asignacin de memoriaOperadores new y deleteLa 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:

  • 54Tema 3.2.2.- Componentes en C++ Builder

    Asignacin de memoriaEjemplo 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}

  • 55Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 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);}

  • 56Tema 3.2.2.- Componentes en C++ Builder

    Componentes

    Ejemplo 108.- Decisiones con CheckBox y componente SpeedButtonVamos 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:

    CheckBoxEste 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.

    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;

    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.

    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;

  • 57Tema 3.2.2.- Componentes en C++ Builder

    ComponentesRadioButton y RadioGroupEl 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:

  • 58Tema 3.2.2.- Componentes en C++ Builder

    ComponentesRadioButton y RadioGroupEl 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 seleccionael 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:

  • 59Tema 3.2.2.- Componentes en C++ Builder

    ComponentesListBoxComponente 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.

  • 60Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 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 ; xItems->Add(AnsiString("1 x ")+(x)+AnsiString(" = ")+(1*x));};};

    ...Sentencias similares para resto de ItemIndex...

    }

  • 61Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 110.- Tablas de multiplicar.El programa en ejecucin es:

    Ejemplo 111.- Ms tablas de multiplicar.Vamos a mejorar el ejemplo anterior permitiendo al usuario entrar el nmero del que desea

    obtener la tabla y el nmero de items que quiere obtener de la misma. Para ello vamos a emplear el componente ListBox y el mtodo Add(valor) en la propiedad Items de ListBox para cargar todos sus elementos o valores en tiempo de ejecucin del programa.Para esto situaremos sobre el formulario principal Form1 los elementos necesarios para que el aspecto inicial del formulario en tiempo de diseo sea similar al siguiente:

  • 62Tema 3.2.2.- Componentes en C++ Builder

    ComponentesEjemplo 111.- Ms tablas de multiplicar.

    Observese el cambio de nombre y de icono en el formulario.A continuacin vemos el cdigo completo del programa ya comentado.void __fastcall TForm1::Button1Click(TObject *Sender){/* Declaramos e inicializamos las variables enteras x, y, z x ser el nmero del que queremos obtener la tabla asociado a Edit1 z ser el nmero de items que queramos obtener asociado a Edit2 y ser la variable empleada en el bucle */int x=0,