Corresponde al final de la sección 5.2.5, antes de POLIMORFISMO.
//--------------------------------------------------------------------- #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; } //---------------------------------------------------------------------
//----------------------------------------------------------------------- #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
//----------------------------------------------------------------------- #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(); } //-----------------------------------------------------------------------
//----------------------------------------------------------------------- #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
//----------------------------------------------------------------------- #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); }