Curso de C++ Builder


Ejemplo 1



Corresponde al final de la sección 5.2.5, antes de POLIMORFISMO.





EJEMPLO.CPP

//---------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

USERES("Ejemplo.res");
USEFORM("Ppal.cpp", PpalFrm);
USEUNIT("ObjGraf.cpp");

//---------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   try   
   {    
       Application->Initialize();       
       Application->CreateForm(__classid(TPpalFrm), &PpalFrm);
       Application->Run();
   }
   catch (Exception &exception)
   {
       Application->ShowException(&exception);
   }
   return 0;
}
//---------------------------------------------------------------------




PPAL.H


//-----------------------------------------------------------------------

#ifndef PpalH
#define PpalH

//-----------------------------------------------------------------------

#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>

#include "ObjGraf.h"
#include <Buttons.hpp>

//-----------------------------------------------------------------------

class TPpalFrm : public TForm{__published:	// IDE-managed Components
   TPaintBox *PaintBox;
   TBitBtn *BotonSalir;
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormDestroy(TObject *Sender);
   void __fastcall PaintBoxPaint(TObject *Sender);
   void __fastcall BotonSalirClick(TObject *Sender);

private:	// User declarations

public:		// User declarations
   __fastcall TPpalFrm(TComponent* Owner);
};

//-----------------------------------------------------------------------

extern PACKAGE TPpalFrm *PpalFrm;
//-----------------------------------------------------------------------
#endif



PPAL.CPP

//-----------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Ppal.h"

//-----------------------------------------------------------------------

#pragma package(smart_init)
#pragma resource "*.dfm"

TPpalFrm *PpalFrm;

// Punteros a objetos de las clases derivadas.

TCirculo  *Cir1,  *Cir2;
TCuadrado *Cuad1, *Cuad2;

//-----------------------------------------------------------------------

__fastcall TPpalFrm::TPpalFrm(TComponent* Owner): TForm(Owner)
{
}

//-----------------------------------------------------------------------

void __fastcall TPpalFrm::FormCreate(TObject *Sender)
{
   Cir1  = new TCirculo  (PaintBox, clBlack,  100, 100, 30);
   Cir2  = new TCirculo  (PaintBox, clGreen,  210,  40, 20);
   Cuad1 = new TCuadrado (PaintBox, clRed,    200, 150, 45);
   Cuad2 = new TCuadrado (PaintBox, clYellow, 120,  70, 25);
}

//-----------------------------------------------------------------------

void __fastcall TPpalFrm::FormDestroy(TObject *Sender)
{
   delete Cir1;
   delete Cir2;
   delete Cuad1;
   delete Cuad2;
}
//-----------------------------------------------------------------------

void __fastcall TPpalFrm::PaintBoxPaint(TObject *Sender)
{  
   Cir1->Mostrar();   
   Cir2->Mostrar();
   Cuad1->Mostrar();
   Cuad2->Mostrar();
}
//-----------------------------------------------------------------------

void __fastcall TPpalFrm::BotonSalirClick(TObject *Sender)
{
   Application->Terminate();    
}

//----------------------------------------------------------------------- 



OBJGRAF.H


//-----------------------------------------------------------------------

#ifndef ObjGrafH
#define ObjGrafH

//*************************************************/
// Definicion de la clase base TObjGraf
//*************************************************/

class TObjGraf {

private:    // Puede acceder SOLO los objetos de esta clase.

   int FX;  // OJO: Se ha cambiado el nombre a
   int FY;  // los miembros X e Y por FX y FY.

   void SetX   (int _X);
   void SetY   (int _Y);
   virtual int GetAncho (void) = 0; // Metodo virtual puro
   virtual int GetAlto  (void) = 0; // Metodo virtual puro

protected:  // Pueden acceder los objetos de esta clase y
            // sus descendientes.

   TColor      FColor;     // OJO: Se ha cambiado Color por FColor
   TPaintBox   *PaintBox;

public:     // Pueden usarlas todas.

   // Constructor de objetos TObjGraf

   TObjGraf (TPaintBox *_PaintBox, TColor _Color=clBlack, 
             int _X=0, int _Y=0);

   // Otros metodos

   virtual void Mostrar (void) = 0; // Metodo virtual puro

   // NUEVAS FORMAS DE ACCESO AL DECLARAR PRIVATE LOS MIEMBROS FX y FY.

   __property int    X     =  {read=FX,      write=SetX  };
   __property int    Y     =  {read=FY,      write=SetY  };
   __property TColor Color =  {read=FColor,  write=FColor};
   __property int    Ancho =  {read=GetAncho             };
   __property int    Alto  =  {read=GetAlto              };

};

//*************************************************/
// Definicion de la clase derivada TCirculo.
// Deriva de la clase base TObjGraf
//*************************************************/

class TCirculo : public TObjGraf {

protected:  // Pueden acceder los objetos de esta clase y
            // sus descendientes.

   int Radio;

   inline int GetAncho  (void) {return(Radio*2);}
   inline int GetAlto   (void) {return(Radio*2);}

public:

   // Metodo constructor

   TCirculo (TPaintBox *_PaintBox, TColor _Color=clBlack,
             int _X=0, int _Y=0, int _Radio=1);

   void Mostrar (void); // Instanciacion del metodo virtual puro de
                        // la clase TObjGraf

};

//*************************************************/
// Definicion de la clase derivada TCuadrado.
// Deriva de la clase base TObjGraf
//*************************************************/

class TCuadrado : public TObjGraf {

protected:  // Pueden acceder los objetos de esta clase y
            // sus descendientes.

   int Lado;

   inline int GetAncho  (void) {return(Lado);}
   inline int GetAlto   (void) {return(Lado);}

public:

   // Metodos

   // Constructores y destructores

   TCuadrado (TPaintBox *_PaintBox, TColor _Color=clBlack,
             int _X=0, int _Y=0, int _Lado=1);

   void Mostrar (void); // Instanciacion del metodo virtual puro de
                        // la clase TObjGraf
};
//-----------------------------------------------------------------------
#endif


OBJGRAF.CPP


//-----------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ObjGraf.h"

//-----------------------------------------------------------------------

#pragma package(smart_init)

/*****************************************************/
// Metodos asociados a la clase base TObjGraf
/*****************************************************/

TObjGraf :: TObjGraf (TPaintBox *_PaintBox,
                      TColor _Color, int _X, int _Y)
{
   PaintBox = _PaintBox;
   FColor = _Color;   // MUY IMPORTANTE: Estas tres lineas han cambiado:
   FX = _X;           // No se puede llamar a los metodos virtuales puros
   FY = _Y;           // (GEtAncho, GetAlto) para fijar el valor de una
                      // propiedad virtual (Alto, Ancho) desde un
                      // constructor de la clase base.
}

// Funciones de escritura de las propiedades virtuales X e Y

void TObjGraf :: SetX (int _X)
{
   if (_X < 0)
      FX = 0;
   else
      if (_X > (PaintBox->Width - Ancho))
         FX = PaintBox->Width - Ancho;
      else
         FX = _X;
}

void TObjGraf :: SetY (int _Y)
{
   if (_Y < 0)
      FY = 0;
   else
      if (_Y > (PaintBox->Height - Alto))
         FY = PaintBox->Height - Alto;
      else
         FY = _Y;
}

/*****************************************************/
// Metodos asociados a la clase derivada TCirculo.
// TCirculo deriva de la clase base TObjGraf.
/*****************************************************/

TCirculo :: TCirculo (TPaintBox *_PaintBox, TColor _Color,
                      int _X, int _Y, int _Radio) :
            TObjGraf (_PaintBox, _Color, _X, _Y)
{
   Radio = _Radio;
}

// Instanciacion del metodo virtual puro de la clase TObjGraf

void TCirculo :: Mostrar (void)
{
   PaintBox->Canvas->Pen->Color = Color;
   PaintBox->Canvas->Brush->Color = Color;
   PaintBox->Canvas->Ellipse(X, Y, X+Radio*2, Y+Radio*2);
}

/*****************************************************/
// Metodos asociados a la clase derivada TCuadrado.
// TCuadrado deriva de la clase base TObjGraf.
/*****************************************************/

TCuadrado :: TCuadrado (TPaintBox *_PaintBox, TColor _Color,
                        int _X, int _Y, int _Lado) :
            TObjGraf (_PaintBox, _Color, _X, _Y)
{
   Lado = _Lado;
}

// Instanciacion del metodo virtual puro de la clase TObjGraf

void TCuadrado :: Mostrar (void)
{
   PaintBox->Canvas->Pen->Color = Color;
   PaintBox->Canvas->Brush->Color = Color;
   PaintBox->Canvas->Rectangle(X, Y, X+Lado, Y+Lado);
}



Atrás