//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "DigitNum.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(TDigitNum *) { new TDigitNum(NULL); } //--------------------------------------------------------------------------- __fastcall TDigitNum::TDigitNum(TComponent* Owner) : TGraphicControl(Owner) { Width = 96; // Establecemos valores por defecto Height = 33; vCerosIzq = false; BorderStyle = bsSingle; cLED_ON =clRed; cLED_OFF=clBtnFace; cLED_BRDon=clBlack; cLED_BRDoff=clGray; FValor = 0; // Obtenemos la longitud de la frase. ( En d¡gitos ) FLen = 4; FBrush = new TBrush; FBrush -> Color = clBtnFace; FBrush -> Style = bsClear; FBrush -> OnChange = CambioAtributo; Invalidate(); } //--------------------------------------------------------------------------- namespace Digitnum { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TDigitNum)}; RegisterComponents("JD soft.", classes, 0); } } //--------------------------------------------------------------------------- __fastcall TDigitNum::~TDigitNum() { delete FBrush; } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetCadena( int NuevaCadena ) { FValor = NuevaCadena; Invalidate(); } //--------------------------------------------------------------------------- // Este procedimiento es llamado cada vez que se modifica // la brocha, el lápiz o el tipo de letra void __fastcall TDigitNum::CambioAtributo( TObject * Sender ) { Invalidate(); // tras lo cual habrá que redibujar el componente } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetBrush( TBrush * NuevoValor ) { FBrush -> Assign( NuevoValor ); Invalidate(); // y volver a dibujar el componente } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetLedOn( TColor NuevoValor ) { cLED_ON = ( NuevoValor ); Invalidate(); // y volver a dibujar el componente } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetLedOff( TColor NuevoValor ) { cLED_OFF = ( NuevoValor ); Invalidate(); // y volver a dibujar el componente } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetLedBrdOn( TColor NuevoValor ) { cLED_BRDon = ( NuevoValor ); Invalidate(); // y volver a dibujar el componente } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetLedBrdOff( TColor NuevoValor ) { cLED_BRDoff = ( NuevoValor ); Invalidate(); // y volver a dibujar el componente } void __fastcall TDigitNum::SetNumDigit( int NuevoValor ) { if ( NuevoValor > 0 ) { FLen = NuevoValor; Invalidate(); // y volver a dibujar el componente } } //--------------------------------------------------------------------------- void __fastcall TDigitNum::Paint() { TRect Area; // Preparamos un RECT definiendo el área ocupada por el componente. Area = GetClientRect(); // Dibujar en el Canvas del componente // Establecer la brocha, lápiz y tipo de letra a usar Canvas -> Brush = FBrush; // Rellenamos el área con la trama y color seleccionados Canvas -> FillRect( Area ); DibujaLD(); } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetCerosIzq( bool NuevoValor ) { vCerosIzq = NuevoValor; Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TDigitNum::DibujaLD( void ) { // Proceso de redibujado de los digitos... int AnchoDigito, i, Digito; // ¿ Cuanto espacio le corresponde a cada dígito... ? AnchoDigito = Width / FLen; // Numero de digitos de la cifra... int Digitos = 1; while ( FValor >= (int)pow10(Digitos) ) Digitos++; i = 0; DibujaDigito( (( FValor % (int)pow10(i+1) ) / (int)pow10(i) ), AnchoDigito, AnchoDigito * (FLen - i - 1) ); for ( i = 1; i < FLen ; i++ ) { Digito = (( FValor % (int)pow10(i+1) ) / (int)pow10(i) ); if ( !CerosIzq && i >= Digitos )//!Digito && !CerosIzq ) DibujaDigito( 10, AnchoDigito, AnchoDigito * (FLen - i - 1) ); else DibujaDigito( Digito, AnchoDigito, AnchoDigito * (FLen - i - 1) ); } } //--------------------------------------------------------------------------- void __fastcall TDigitNum::DibujaDigito( short int Digito, short int AnchoDigit, short int PosInicial ) { int PMedio, PVert, Medio, MedioL, MedioH; POINT P1[5], P2[7], P3[5], P4[5], P5[5], P6[5], P7[5]; PMedio = (Height-1) / 8; PVert = AnchoDigit / 5; Medio = (Height-1)/2;//( ( ( PMedio * 6 ) - ( PMedio * 4 ) ) / 2 ) + ( PMedio*4 ); MedioL = Medio - ( PMedio / 2 ); MedioH = Medio + ( PMedio / 2 ); /* _ _ _ _ _ _ _ |_| _ _ _ _ | 1 __ |_| |#|#|#|_| | _ _ _ _ ___/ |_| |#|_|#|_| | |_| |_| |_| 4 |2| 5 ______ |_| |#|#|#|_| | |_| |_| |_| 6 |_| 7 ___ |_| |#|_|#|_| | \__ |_| |#|#|#|_| | 3 |_|_ _ _ _ _ _| */ // 1 // ______________ // \ / // \__________/ // P1[0] . x = 1 + 1 + PosInicial; P1[0] . y = 0; P1[1] . x = PVert * 4 - 1 + PosInicial; P1[1] . y = 0; P1[2] . x = PVert * 3 - 1 + PosInicial; P1[2] . y = PMedio*1 - 1; P1[3] . x = PVert * 1 + 1 + PosInicial; P1[3] . y = PMedio*1 - 1; P1[4] . x = 1 + 1 + PosInicial; P1[4] . y = 0; // 2 // __________ // / \ // \__________/ // P2[0] . x = 2 + PosInicial; P2[0] . y = Medio ; P2[1] . x = PVert * 1 + 1 + PosInicial; P2[1] . y = MedioL + 1; P2[2] . x = PVert * 3 - 1 + PosInicial; P2[2] . y = MedioL + 1; P2[3] . x = PVert * 4 - 2 + PosInicial; P2[3] . y = Medio ; P2[4] . x = PVert * 3 - 1 + PosInicial; P2[4] . y = MedioH - 1; P2[5] . x = PVert * 1 + 1 + PosInicial; P2[5] . y = MedioH - 1; P2[6] . x = 2 + PosInicial; P2[6] . y = Medio ; // 3 // __________ // / \ // /____________\ // P3[0] . x = PVert * 1 + 1 + PosInicial; P3[0] . y = PMedio*7 + 1; P3[1] . x = PVert * 3 - 1 + PosInicial; P3[1] . y = PMedio*7 + 1; P3[2] . x = PVert * 4 - 1 + PosInicial; P3[2] . y = PMedio*8 ; P3[3] . x = PVert * 0 + 2 + PosInicial; P3[3] . y = PMedio*8 ; P3[4] . x = PVert * 1 + 1 + PosInicial; P3[4] . y = PMedio*7 + 1; // . // |\ // | | // 4 | | // | | // |/ // · P4[0] . x = 0 + PosInicial; P4[0] . y = 1; P4[1] . x = PVert * 1 - 1 + PosInicial; P4[1] . y = PMedio*1 + 1; P4[2] . x = PVert * 1 - 1 + PosInicial; P4[2] . y = MedioL - 1; P4[3] . x = 0 + PosInicial; P4[3] . y = Medio - 1; P4[4] . x = 0 + PosInicial; P4[4] . y = 1; // . // /| // | | // 5 | | // | | // \| // · P5[0] . x = PVert * 4 + 1 + PosInicial; P5[0] . y = 1; P5[1] . x = PVert * 4 + 1 + PosInicial; P5[1] . y = Medio - 1; P5[2] . x = PVert * 3 + 1 + PosInicial; P5[2] . y = MedioL - 1; P5[3] . x = PVert * 3 + 1 + PosInicial; P5[3] . y = PMedio*1 + 1; P5[4] . x = PVert * 4 + 1 + PosInicial; P5[4] . y = 1; // . // |\ // | | // 6 | | // | | // |/ // · P6[0] . x = 0 + PosInicial; P6[0] . y = Medio + 1; P6[1] . x = PVert * 1 - 1 + PosInicial; P6[1] . y = MedioH + 1; P6[2] . x = PVert * 1 - 1 + PosInicial; P6[2] . y = PMedio*7 - 1; P6[3] . x = 0 + PosInicial; P6[3] . y = PMedio*8 - 1; P6[4] . x = 0 + PosInicial; P6[4] . y = MedioH + 1; // . // /| // | | // 7 | | // | | // \| // · P7[0] . x = PVert * 4 + 1 + PosInicial; P7[0] . y = Medio + 1; P7[1] . x = PVert * 4 + 1 + PosInicial; P7[1] . y = PMedio*8 - 1; P7[2] . x = PVert * 3 + 1 + PosInicial; P7[2] . y = PMedio*7 - 1; P7[3] . x = PVert * 3 + 1 + PosInicial; P7[3] . y = MedioH + 1; P7[4] . x = PVert * 4 + 1 + PosInicial; P7[4] . y = Medio + 1; // 1 === 0, 2, 3, 5, 6, 7, 8, 9, if ( Digito != 1 && Digito != 4 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P1, 4 ); // 2 === 2, 3, 4, 5, 6, 8, 9 if ( Digito != 0 && Digito != 1 && Digito != 7 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P2, 6 ); // 3 === 0, 2, 3, 5, 6, 8, 9 if ( Digito != 1 && Digito != 4 && Digito != 7 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P3, 4 ); // 4 === 0, 4, 5, 6, 8, 9 if ( Digito != 1 && Digito != 2 && Digito != 3&& Digito != 7 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P4, 4 ); // 5 === 0, 1, 2, 3, 4, 7, 8, 9 if ( Digito != 5 && Digito != 6 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P5, 4 ); // 6 === 0, 2, 6, 8 if ( Digito == 0 || Digito == 2 || Digito == 6 || Digito == 8 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P6, 4 ); // 7 === 0, 1, 3, 4, 5, 6, 7, 8, 9 if ( Digito != 2 && Digito != 10 ) { Canvas -> Brush -> Color = cLED_ON; Canvas -> Pen -> Color = cLED_BRDon; } else { Canvas -> Brush -> Color = cLED_OFF; Canvas -> Pen -> Color = cLED_BRDoff; } Canvas -> Polygon( P7, 4 ); } //--------------------------------------------------------------------------- void __fastcall TDigitNum::SetBorderStyle( TBorderStyle NuevoValor ) { FBorderStyle = NuevoValor; Invalidate(); // y volver a dibujar el componente }