Curso de C++ Builder


Ejemplo 3



Corresponde al final de la sección 7. En este ejemplo se muestra el tratamiento de excepciones para el movimiento de la pelota.



EJEMPLO.CPP

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

#include <vcl.h> #pragma hdrstop USERES("Ejemplo3.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;
   TTimer *Timer1;
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormDestroy(TObject *Sender);
   void __fastcall BotonSalirClick(TObject *Sender);
   void __fastcall Timer1Timer(TObject *Sender);

private:	// User declarations

   TPelota *Pelota;

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;

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

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

void __fastcall TPpalFrm::FormCreate(TObject *Sender)
{
   Pelota = new TPelota (PaintBox, clYellow, 120,  70, 25);
}
//----------------------------------------------------------------------

void __fastcall TPpalFrm::FormDestroy(TObject *Sender)
{
   delete Pelota;
}

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

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

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

void __fastcall TPpalFrm::Timer1Timer(TObject *Sender)
{
   Pelota->Mover();
}

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


OBJGRAF.H

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

#ifndef ObjGrafH
#define ObjGrafH

//*************************************************/
// Definicion de la clase EFueraRango
// Clase de excepcion por entrar en "fuera de rango":
// salirse de los limites del PaintBox al calcular
// las nuevas coordenadas de dibujo de la pelota.
//*************************************************/

class EFueraRango {};

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

class TObjGraf {

private:

   int FX;
   int FY;

   void SetX   (int _X) throw (EFueraRango); // Si hay problemas,crean un
   void SetY   (int _Y) throw (EFueraRango); // objeto de clase EFueraRango

   virtual int GetAncho (void) = 0; // Metodo virtual puro
   virtual int GetAlto  (void) = 0; // Metodo virtual puro

protected:

   TColor      FColor;
   TPaintBox   *PaintBox;

public:

   // Constructores de objetos TObjGraf

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

   TObjGraf (TObjGraf *ObjGraf);

 
 
   // Otros metodos

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

   __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 {

private:

   int FRadio;

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

public:

   // Constructores

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

   // Otros metodos

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

   __property int Radio =  {read=FRadio,  write=FRadio};

};

 
//*************************************************/
// Definicion de la clase derivada TPelota.
// TPelota deriva de la clase TCirculo, que a su
// vez deriva de la clase base TObjGraf
//*************************************************/

enum TDireccion {S=1, N=2, E=4, O=8, SE=5, NE=6, SO=9, NO=10};

/* Tipo definido por enumeracion para la direccion de TPelota
   La codificacion es:

 
        NO    N    NE
         10   2    6
          \   |   /
           \  |  /
   O 8 ----      ---- 4 E
           /  |  \
          /   |   \
         9    1    5
        SO    S    SE
*/

 
class TPelota: public TCirculo {

private:

   int FDirX;
   int FDirY;
   int FVelocidad;

   void        SetDireccion (TDireccion _Direccion);
   TDireccion  GetDireccion (void);

public :

   // Constructores

   TPelota (TPaintBox *_PaintBox, TColor _Color=clBlack,
             int _X=0, int _Y=0, int _Radio=1,
             TDireccion _Direccion=SE, int _Velocidad=5);

   // Otros metodos

   void Mostrar (void);
   void Borrar  (void);
   void Mover   (void);

   __property int  Velocidad = {read = FVelocidad, write=FVelocidad};
   __property TDireccion Direccion = {read = GetDireccion, write=SetDireccion};

};

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

class TCuadrado : public TObjGraf {

private:

   int FLado;

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

public:

   // Constructores

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

   // Otros metodos

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

   __property int Lado =  {read=FLado,  write=FLado};

};

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

#endif


OBJGRAF.CPP

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

#include <vcl.h>
#pragma hdrstop

#include "ObjGraf.h"

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

#pragma package(smart_init)

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

// Constructores

TObjGraf :: TObjGraf (TPaintBox *_PaintBox,
                      TColor _Color, int _X, int _Y)
{
   PaintBox = _PaintBox;
   FColor = _Color;
   FX = _X;
   FY = _Y;
}

TObjGraf :: TObjGraf (TObjGraf *ObjGraf)
{
   PaintBox = ObjGraf->PaintBox;
   FColor = ObjGraf->Color;
   FX = ObjGraf->FX;
   FY = ObjGraf->FY;
}

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

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

 
void TObjGraf :: SetY (int _Y) throw (EFueraRango)
{
   if (_Y < 0) {
      FY = 0;
      throw EFueraRango();
   }
   else
      if (_Y > (PaintBox->Height - Alto)) {
         FY = PaintBox->Height - Alto;
         throw EFueraRango();
      }
      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 TPelota.
// TPelota deriva de la clase TCirculo, que a su
// vez deriva de la clase base TObjGraf
/*****************************************************/

TPelota :: TPelota (TPaintBox *_PaintBox, TColor _Color,
             int _X, int _Y, int _Radio,
             TDireccion _Direccion, int _Velocidad) :
           TCirculo (_PaintBox, _Color, _X, _Y, _Radio)
{
   Direccion = _Direccion;
   Velocidad = _Velocidad;
}

 
// Instanciacion del metodo virtual puro de la clase TObjGraf

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

// Otras funcione propias de TPelota

void TPelota :: Borrar (void)
{
   PaintBox->Canvas->Pen->Color = clBtnFace; // PaintBox->Color;
   PaintBox->Canvas->Brush->Color = clBtnFace; //PaintBox->Color;
   PaintBox->Canvas->Ellipse(X, Y, X+Radio*2, Y+Radio*2);
}

void TPelota :: Mover (void)
{
   Borrar ();

   try {
      X += FDirX * Velocidad;
   }
   catch (EFueraRango) {
      FDirX = -FDirX;
   };

   try {
      Y += FDirY * Velocidad;
   }
   catch (EFueraRango) {
      FDirY = -FDirY;
   };

   Mostrar ();
}

void TPelota :: SetDireccion (TDireccion _Dir)
{
   FDirY = (_Dir & 1) ? +1 : ((_Dir & 2) ? -1 : 0);
   FDirX = (_Dir & 4) ? +1 : ((_Dir & 8) ? -1 : 0);
}

TDireccion TPelota :: GetDireccion (void)
{
   TDireccion _Dir;

   _Dir = (TDireccion) ((FDirY == +1) ? 1 : ((FDirY == -1 ) ? 2 : 0));
   _Dir = (TDireccion) (_Dir + (FDirX == +1) ? 4 :((FDirX == -1 )? 8:0));

   return (_Dir);
}

 
/*****************************************************/
// 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