Tema calendario nuevamente.

Re: Tema calendario nuevamente.

Postby jbrita » Wed Jul 03, 2024 4:21 pm

Prove el calendario y muestra mal
Image

saludos
jbrita
 
Posts: 502
Joined: Mon Jan 16, 2006 3:42 pm

Re: Tema calendario nuevamente.

Postby jbrita » Wed Jul 03, 2024 4:23 pm

Provee el calendario pero muestra erroneo el mes

Image

saludos
jbrita
 
Posts: 502
Joined: Mon Jan 16, 2006 3:42 pm

Re: Tema calendario nuevamente.

Postby karinha » Thu Jul 04, 2024 1:06 pm

Code: Select all  Expand view

//-> MODIFICADO EM: 10/01/2023 - Joao. CALEND.PRG

#include "FiveWin.Ch"
#include "SSay.Ch"         // SAY'S Transparentes
#include "Obj2Hb.Ch"

#define CLR_AMARELO   nRGB( 255, 255, 000 ) //--> Amarelo Para o Fundo

FUNCTION Calend()

   LOCAL oFont, oFont2, oFonte, oFont3, oSay, oBrush, aGrad
   LOCAL oDlg, nVar2, oPrueba1
   LOCAL oPrueba, oBtn[ 10], oCombo[ 2 ]
   LOCAL nVar1 := nVar2 := 1
   LOCAL aLenguajes := { "  Português ", ;
                         "  Catalão   ", ;
                         "  Euskera   ", ;
                         "  Galego    ", ;
                         "  Espanhol  ", ;
                         "  Italiano  ", ;
                         "  Inglês    ", ;
                         "  Francês   ", ;
                         "  Alemão    " }

   LOCAL aCombinacion := { "  Cores 1"   , ;
                           "  Cores 2"   , ;
                           "  Cores 3"   , ;
                           "  Cores 4"   , ;
                           "  Cores 5"   , ;
                           "  Cores 6"  }

   LOCAL aTit_Color := aComboTitulo()
   LOCAL aCue_Color := aComboCuerpo()
   LOCAL aDom_Color := aComboDomingo()

   LOCAL aClrFestivo  := { Rgb( 255, 255, 255 ), ;   //Color borde superior
                           Rgb( 255, 255,   0 ), ;   //Color relleno
                           Rgb( 180, 180,   0 ), ;   //Color borde inferior
                           Rgb(   0,   0,   0 ) }    //color texto....

   LOCAL aColorCuerpo := { Rgb( 154, 242, 250 ), ;  //Color borde superior
                           Rgb(  11, 196, 210 ), ;  //Color relleno
                           Rgb(   9, 138, 149 ), ;  //Color borde inferior
                           Rgb(   0,   0,   0 ), ;  //color texto....
                           Rgb(   9, 138, 149 ) }   //color al perder el foco...

   LOCAL aColorTitulo := { Rgb(  10, 165, 177 ), ;  // Color Borde superior
                           Rgb(   0, 128, 128 ), ;  // Color de Relleno
                           Rgb(   5,  82,  88 ), ;  // Color Borde inferior
                           Rgb( 205, 205, 155 ), ;  // Color Letra mes y año
                           Rgb( 205, 205, 155 ) }   // Color de los dias.

   LOCAL aColorBoton  := { Rgb(  10, 165, 177 ), ;  // Color Borde superior
                           Rgb(   0, 128, 128 ), ;  // Color de Relleno
                           Rgb(   5,  82,  88 ), ;  // Color Borde inferior
                           Rgb( 205, 205, 155 ), ;  // Color Letra mes y año
                           Rgb( 205, 205, 155 ) }   // Color de los dias.

   // GRADIENTE NO DIALOGO
   aGrad := { { 0.30, CLR_WHITE, CLR_WHITE },{ 0.50, CLR_WHITE, CLR_WHITE } }

   // DEFINE BRUSH oBrush    RESOURCE "LOGO2"
   // Se activa el archivo de recursos a utilizar.
   DEFINE FONT oFont  NAME "Arial"         SIZE 0, - 14 BOLD
   DEFINE FONT oFont3 NAME "Ms Sans Serif" SIZE 0, - 13 BOLD

   DEFINE DIALOG oDlg TITLE "PLENOIND: Calendário do Sistema." ;
      FROM 10, 10 TO 360, 420 PIXEL COLOR "N/W"                ;
      STYLE nOR( DS_MODALFRAME ) GRADIENT aGrad

   oDlg:nStyle := nOr( oDlg:nStyle, 4 )

   oDlg:lHelpIcon := .F.

   oPrueba1 := TMiCalendario(): New ( 5, 5, 120, 120, oDlg, oFont )

   oPrueba1:bLButtonUp := {|| MsgInfo( oPrueba1:aFecha[2], ;
                                       "Data Selecionada Pelo Usuário" ) }

   // Para pintar los domingos de otro color...
   oPrueba1:FijaClrDomingo( { Rgb( 255, 255, 255 ), ;   //Color borde superior
                              Rgb( 220, 220, 220 ), ;   //Color relleno
                              Rgb( 128, 128, 128 ), ;   //Color borde inferior
                              Rgb(   0,   0,   0 ) } )  //color texto....

   // Aqui tem um Erro, Que NÆo Consegui Descobrir.
   // Para pintar los dias festivos..

   oPrueba1:aFestivos[ 1] := { 1 }      //Festivos de Enero
   oPrueba1:aFestivos[ 2] := {}         //Festivos de Ferbrero
   oPrueba1:aFestivos[ 3] := {}         //Festivos de Marzo
   oPrueba1:aFestivos[ 4] := { 18, 19 } //Festivos de Abril
   oPrueba1:aFestivos[ 5] := { 1, 21 }  //Festivos de Mayo
   oPrueba1:aFestivos[ 6] := { 16 }     //Festivos de Junio
   oPrueba1:aFestivos[ 7] := {}         //Festivos de Julio
   oPrueba1:aFestivos[ 8] := { 15 }     //Festivos de Agosto
   oPrueba1:aFestivos[ 9] := { 18, 19 } //Festivos de Septiembre
   oPrueba1:aFestivos[10] := {}         //Festivos de Octubre
   oPrueba1:aFestivos[11] := { 1 }      //Festivos de Noviembre
   oPrueba1:aFestivos[12] := { 25 }     //Festivos de Diciembre
   oPrueba1:aColorFestivo := aClrFestivo
   oPrueba1:FijaClrFestivo()

   // Al cambiar de mes... se asignan nuevos festivos...
   // Este es un metodo alternativo de marcar los festivos..
   oPrueba1:bCambioMes := { || FijarFestivos( oPrueba1 ) }
           
   @  5, 140 COMBOBOX oCombo[ 1 ] VAR nVar1 ;
      ITEMS aLenguajes OF oDlg        ;
      SIZE  54, 150                   ;
      FONT oFont3                     ;
      PIXEL COLOR CLR_CYAN, CLR_WHITE ;
      ON CHANGE ( oPrueba1:nLanguage := nVar1, ;
      oPrueba1:Language(),            ;
      oPrueba1:Paint() )

   @  20, 140 COMBOBOX oCombo[ 1 ] VAR nVar2 ;
      ITEMS aCombinacion OF oDlg             ;
      SIZE  54, 150                          ;
      FONT oFont3                            ;
      PIXEL COLOR CLR_CYAN, CLR_WHITE        ;
      ON CHANGE ( oPrueba1:aColorTitulo := aTit_Color[ nVar2], ;
      oPrueba1:aColorCuerpo := aCue_Color[ nVar2],    ;
      oPrueba1:aColorBoton  := aTit_Color[ nVar2],    ;
      oPrueba1:FijaClrDomingo( aDom_Color[ nVar2] ),  ;
      oPrueba1:RestaurarColor(),                      ;
      oPrueba1:Paint() )

   @ 145, 010 SENSITIVE SAY oSay PROMPT "<ESC> Sair " ;
      OF oDlg PIXEL SIZE 60, 12                       ;
      COLOR CLR_BLACK UPDATE FONT oFont  TRANSPARENT

   @  35, 140 BUTTON oBtn[  1]  PROMPT "&Display    " ;
      OF oDlg PIXEL SIZE 54, 12                       ;
      FONT oFont                                      ;
      ACTION( MsgInfo( oPrueba1:aFecha[2],            ;
                       "Data Selecionada Pelo Usuário" ) )

   oBtn[  1]:cToolTip := ( "Data Selecionada Pelo Usuário" )

   @  54, 140 BUTTON oBtn[  2] PROMPT "31/12/2008   " ;
      OF oDlg PIXEL SIZE 54, 12                       ;
      FONT oFont                                      ;
      ACTION oPrueba1:IrFecha( CtoD( "31/12/2008" ) )

   oBtn[  2]:cToolTip := ( "Data Selecionada Pelo Usuário: 31/12/2008" )

   @  65, 140 BUTTON oBtn[  3] PROMPT "&Hoje         " ;
      OF oDlg PIXEL SIZE 54, 12                        ;
      FONT oFont                                       ;
      ACTION oPrueba1:IrFecha( Date() )

   oBtn[  3]:cToolTip := ( "Data Selecionada Pelo Usuário: Hoje " )

   @  80, 140 BUTTON oBtn[  4] PROMPT "&Inglês       " ;
      OF oDlg PIXEL SIZE 54, 12                        ;
      FONT oFont                                       ;
      ACTION ( oPrueba1:nLanguage := 7,                ;
      oPrueba1:Language(),                             ;
      oPrueba1:Paint() )

   oBtn[  4]:cToolTip := ( "Lingua Selecionada Pelo Usuário: Inglês " )

   @  95, 140 BUTTON oBtn[  5] PROMPT "&Espanhol     " ;
      OF oDlg PIXEL SIZE 54, 12                        ;
      FONT oFont                                       ;
      ACTION ( oPrueba1:nLanguage := 5,                ;
      oPrueba1:Language(),                             ;
      oPrueba1:Paint() )

   oBtn[  5]:cToolTip := ( "Lingua Selecionada Pelo Usuário: Espanhol " )

   @ 110, 140 BUTTON oBtn[  6] PROMPT "&Nova Cor     " ;
      OF oDlg PIXEL SIZE 54, 12                        ;
      FONT oFont                                       ;
      ACTION ( oPrueba1:aColorCuerpo := aColorCuerpo,  ;
      oPrueba1:aColorTitulo := aColorTitulo,           ;
      oPrueba1:aColorBoton  := aColorBoton ,           ;
      oPrueba1:RestaurarColor(),                       ;
      oPrueba1:Paint() )

   oBtn[  6]:cToolTip := ( "Cores Selecionada Pelo Usuário: Escolha " )

   @ 125, 140 BUTTON oBtn[  7] PROMPT "&Pintar Dia 15" ;
      OF oDlg PIXEL SIZE 54, 12                        ;
      FONT oFont                                       ;
      ACTION ( oPrueba1:ColorDia( 15, aClrFestivo ),   ;
      oPrueba1:Paint() )

   oBtn[  7]:cToolTip := ( "Colorir o Dia 15 do Mês Corrente" )

   @ 140, 140 BUTTON oBtn[  8] PROMPT "&Saida"          ;
      OF oDlg PIXEL SIZE 54, 12                         ;
      FONT oFont                                        ;
      ACTION( oDlg:End() ) CANCEL

   oBtn[  8]:cToolTip := "Saida - Exit - Cancelar"

   ACTIVATE DIALOG oDlg CENTERED

   // oBrush:End()

   // Se sacan los recursos de memoria.
   RELEASE FONT oFont
   RELEASE FONT oFont3

   RELEASE ALL

RETURN Nil

// Esta funcion es una alternativa al pintado de los festivos..

STATIC FUNCTION FijarFestivos( oCalendario )

   LOCAL aClrFestivo := { Rgb( 177, 218, 173 ), ;   //Color borde superior
                          Rgb( 121, 192, 114 ), ;   //Color relleno
                          Rgb(  70, 141,  50 ), ;   //Color borde inferior
                          Rgb(   0,   0,   0 ) }    //color texto....

   DO CASE
   CASE oCalendario:nMesNumero == 1

      oCalendario:ColorDia( 1, aClrFestivo )

   CASE oCalendario:nMesNumero == 2

   CASE oCalendario:nMesNumero == 3

   CASE oCalendario:nMesNumero == 4

      oCalendario:ColorDia( 18, aClrFestivo )
      oCalendario:ColorDia( 19, aClrFestivo )

   CASE oCalendario:nMesNumero == 5

      oCalendario:ColorDia( 1, aClrFestivo )
      oCalendario:ColorDia( 21, aClrFestivo )

   CASE oCalendario:nMesNumero == 6

      oCalendario:ColorDia( 16, aClrFestivo )

   CASE oCalendario:nMesNumero == 7

   CASE oCalendario:nMesNumero == 8

      oCalendario:ColorDia( 15, aClrFestivo )

   CASE oCalendario:nMesNumero == 9

      oCalendario:ColorDia( 18, aClrFestivo )
      oCalendario:ColorDia( 19, aClrFestivo )

   CASE oCalendario:nMesNumero == 10

   CASE oCalendario:nMesNumero == 11

      oCalendario:ColorDia( 1, aClrFestivo )

   CASE oCalendario:nMesNumero == 12

      oCalendario:ColorDia( 25, aClrFestivo )

   ENDCASE

RETURN NIL

STATIC FUNCTION aComboTitulo()

   LOCAL aDeColores

   aDeColores := { { Rgb( 170,170, 80 ), Rgb( 130,130, 65 ),Rgb( 100,100, 50 ),     ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) },                  ;
                   { Rgb( 55, 170, 170 ), Rgb( 40, 120, 120 ), Rgb( 40, 110, 110 ), ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) },                  ;
                   { Rgb( 60, 160, 60 ), Rgb( 50, 125, 50 ), Rgb( 40, 110, 40 ),    ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) },                  ;
                   { Rgb( 190, 60, 190 ), Rgb( 150, 50, 150 ), Rgb( 110, 40, 110 ), ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) },                  ;
                   { Rgb( 190, 63, 63 ), Rgb( 150, 50, 50 ), Rgb( 110, 40, 40 ),    ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) },                  ;
                   { Rgb( 125, 125, 125 ), Rgb( 100, 100, 100 ), Rgb( 75, 75, 75 ), ;
                     Rgb( 205, 205, 155 ), Rgb( 205, 205, 155 ) } }

RETURN aDeColores

STATIC FUNCTION aComboCuerpo()

   LOCAL aDeColores

   aDeColores := { { Rgb( 235,235,210 ), Rgb( 205,205,155 ),Rgb( 150,150, 75 ),        ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 205, 240, 240 ), Rgb( 145, 220, 220 ), Rgb( 55, 170, 170 ),  ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 205, 240, 205 ), Rgb( 175, 210, 175 ), Rgb( 55, 170, 55 ),   ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 240, 205, 240 ), Rgb( 220, 145, 220 ), Rgb( 170, 55, 170 ),  ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 240, 205, 205 ), Rgb( 230, 180, 180 ), Rgb( 210, 120, 120 ), ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 220, 220, 220 ), Rgb( 180, 180, 180 ), Rgb( 110, 110, 110 ), ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) } }

RETURN aDeColores

STATIC FUNCTION aComboDomingo()

   LOCAL aDeColores

   aDeColores := { { Rgb( 255,255,255 ), Rgb( 220,220,220 ),Rgb( 128,128,128 ),        ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 255, 255, 255 ), Rgb( 203, 238, 238 ), Rgb( 65, 192, 192 ),  ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 255, 255, 255 ), Rgb( 203, 238, 203 ), Rgb( 65, 192, 65 ),   ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 255, 255, 255 ), Rgb( 238, 203, 238 ), Rgb( 192, 65, 192 ),  ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 255, 255, 255 ), Rgb( 238, 203, 203 ), Rgb( 192, 65, 65 ),   ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) },                     ;
                   { Rgb( 255, 255, 255 ), Rgb( 220, 220, 220 ), Rgb( 128, 128, 128 ), ;
                     Rgb(   0,   0,   0 ), Rgb( 130, 130,  65 ) } }

RETURN aDeColores

// Datos que devuelve el calendario.
//  dFechaControl , la fecha seleccionado, formato fecha.

//  nMesNumero    , el numero del mes    , formato numero
//  cMesNumero    , el numero del mes    , formato caracter
//  cMesPalabra   , el nombre del mes

//  nDiaSemana    , el numero del dia de la semana formato numero
//  cDiaSemana    , el numero del dia de la semana formato caracter
//  cDiaPalabra   , el nombre del dia de la semana
//  nDiaMes       , el dia del mes formato numero
//  cDiaMes       , el dia del mes formato caracter
//  cDiaMesPalabra, el dia del mes en palabras.

//  nAno          , el numero del año formato numero
//  cAno          , el numero del año formato caracter
//  cAnoPalabra   , el numero del año en palabras.

// array con formatos de fecha.
//  aFecha[ 1]    , XX de enero del XXXX
//  aFecha[ 2]    , Domingo,XX de Septiembre de XXXX

//Se encuentra habilitado el boton derecho del mouse con otras
//opciones, mientras veo donde coloco los botones...

//METODOS
// CambiarMes( nMes)
// MesSiguinte() INLINE ::CambiarMes( +1)
// MesAnterior() INLINE ::CambiarMes( -1)
// AnoSiguinte() INLINE ::CambiarMes( 12)
// AnoAnterior() INLINE ::CambiarMes(-12)

//-> FIM DO PROGRAMA
 
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Tema calendario nuevamente.

Postby karinha » Thu Jul 04, 2024 1:08 pm

Code: Select all  Expand view

// ******************************************************
// Clase para mostrar y gestionar Calendarios en FW   *
// Desarrollada por Rodrigo Soto y Bingen Ugaldebere  *
// 2.002 - 2.003 - TCALENDA.PRG                       *
// ******************************************************

#include "FiveWin.ch"
#include "InKey.ch"
#include "Constant.ch"
#include "Obj2Hb.ch"

#define  K_MAS      43
#define  K_MENOS    45
#define  K_DIVISION 47
#define  K_HOY      72

#define  L_PORTUGUES 1
#define  L_CATALA    2
#define  L_EUSKERA   3
#define  L_GALEGO    4
#define  L_SPANISH   5     // BINGEN
#define  L_ITALIANO  6
#define  L_ENGLISH   7
#define  L_FRANCAIS  8
#define  L_DEUSTCH   9

CLASS TMiCalendario FROM TControl

   DATA lContinuar       AS LOGICAL INIT .T.
   DATA lConFoco         AS LOGICAL INIT .T.
   DATA oFont
   DATA lFont            AS LOGICAL INIT .F.
   DATA oFontMes
   DATA oFontTxt
   DATA oFontBtn
   DATA nPosFila      // la posicion de la fila
   DATA nPosCol       // la posicion de la columna
   DATA nPosBoton     // la columna del boton.
   DATA aDiaSemana    AS ARRAY INIT Array( 7 )
   DATA aXY           AS ARRAY INIT Array( 42 )
   DATA aBoton        AS ARRAY INIT Array( 5 )
   DATA aDias         AS ARRAY INIT Array( 42 )
   DATA aClrDias      AS ARRAY INIT Array( 42 )
   DATA aColorCuerpo  AS ARRAY
   DATA aColorTitulo  AS ARRAY
   DATA aColorBoton   AS ARRAY
   DATA aColorDomingo AS ARRAY
   DATA aColorFestivo AS ARRAY
   // Tinha o Erro de GPF aqui, quando usava READONLY
   DATA aFestivos     AS ARRAY INIT Array( 12 ) // READONLY gerava erro
   DATA nAltoFila
   DATA nAnchoCol
   DATA nAnchoBoton
   DATA aTitBoton
   DATA nFila1
   DATA nFila2
   DATA nCol1
   DATA nCol2
   DATA nPrimerDia    AS NUMERIC INIT  1
   DATA nUltimoDia    AS NUMERIC INIT 42
   DATA lSelectOK     AS LOGICAL INIT .T.
   DATA bCambioMes    // Block a ejecutar cuando cambie el mes...
   DATA bFestivos     // Bingen
   DATA nLanguage     // Bingen
   DATA aMeses        AS ARRAY INIT Array( 12 ) // Bingen
   DATA nLastDay      AS NUMERIC INIT  1

// Datos relacionados con la fecha seleccionada.
   DATA dFechaControl
   DATA nMesNumero             READONLY
   DATA cMesNumero             READONLY
   DATA cMesPalabra            READONLY
   DATA nDiaSemana             READONLY
   DATA cDiaSemana             READONLY
   DATA cDiaPalabra            READONLY
   DATA nDiaMes                READONLY
   DATA cDiaMes                READONLY
   DATA cDiaMesPalabra         READONLY
   DATA nAno                   READONLY
   DATA cAno                   READONLY
   DATA cAnoPalabra            READONLY
   DATA aFecha  AS ARRAY INIT Array( 2 ) READONLY
   DATA aVencto AS ARRAY INIT Array( 8 ) READONLY
// aFecha, es un array con formatos de fecha
// aVencto, es un array con las fechas de vencimiento 15,30,45,60 dias...

   // DATAS para reasignar teclas de navegacion.
   DATA nK_AnoAdelenta  AS NUMERIC INIT VK_NEXT
   DATA nK_AnoAtras     AS NUMERIC INIT VK_PRIOR
   DATA nK_MesAdelenta  AS NUMERIC INIT K_MAS
   DATA nK_MesAtras     AS NUMERIC INIT K_MENOS
   DATA nK_Menu         AS NUMERIC INIT K_DIVISION
   DATA nK_Hoy          AS NUMERIC INIT K_HOY

   DATA nPosicion
   DATA lTodoseCalculo   AS LOGICAL INIT .F.
   DATA lProcesarTecla   AS LOGICAL INIT .T.
   DATA lMostrarBoton    AS LOGICAL INIT .T.

   CLASSDATA lRegistered AS LOGICAL

   METHOD New() CONSTRUCTOR  // Bingen

   METHOD Display()

   METHOD Paint()

   METHOD Language()  // Bingen

   METHOD LButtonDown( nRow, nCol, nFlags )
   METHOD LButtonUp( nRow, nCol )
   METHOD RButtonUp( nRow, nCol, nKeyFlags )

   METHOD FijarFecha( dFecha )
   METHOD CalcularDias( dFecha )
   METHOD FijaClrs()
   METHOD FijaClrDomingo()
   METHOD FijaClrFestivo()
   METHOD RestaurarColor() INLINE ::FijaClrs(), ::FijaClrDomingo(), ::FijaClrFestivo()
   METHOD ColorDia( nDia, aColores )

   METHOD Default()

   METHOD Destroy()
   METHOD MouseMove( nRow, nCol, nKeyFlags )

   METHOD GetDlgCode( nLastKey )
   METHOD VerAlSalir()
   METHOD VerAlEntrar()
   METHOD PintarBoton( hDC, nColor, nRow, nCol )
   METHOD KeyChar( nKey, nFlags )
   METHOD KeyDown( nKey, nFlags )

   // Estos metodos devuelven verdadero o falso segun se encuentren
// dentro del cuerpo del calendario o en el area de botones.
   METHOD lCuerpo( nRow, nCol )
   METHOD lBotones( nRow, nCol )

   // Metodos para moverse entre los meses
   METHOD CambiarMes( nMeses, lProcesar )
   METHOD MesSiguinte()  INLINE ::CambiarMes(  1 )
   METHOD MesAnterior()  INLINE ::CambiarMes( - 1 )
   METHOD AnoSiguiente() INLINE ::CambiarMes( 12 )
   METHOD AnoAnterior()  INLINE ::CambiarMes( - 12 )
   METHOD Hoy()          INLINE ::IrFecha( Date() )
   METHOD IrFecha( dNvaFecha )

   // Metodos para tomar y dejar el foco.
   METHOD LostFocus( hCtlFocus ) INLINE Super:LostFocus( hCtlFocus ), ::VerAlSalir()
   METHOD GotFocus() INLINE ::setfocus(), ::VerAlEntrar()

ENDCLASS

METHOD NEW ( nTop, nLeft, nWidth, nHeight, oWnd, oFont, nLANGUAGE ) CLASS TMiCalendario

   DEFAULT nTop := 5, nLeft := 5, nWidth := 120, nHeight := 120  // Bingen
   DEFAULT nLanguage := L_PORTUGUES // L_SPANISH

   // Coordenadas de la region de dibujo.
   ::nTop      := nTop
   ::nLeft     := nLeft
   ::nBottom   := ::nTop  + nHeight
   ::nRight    := ::nLeft + nWidth

   ::dFechaControl := Date()
   ::bFestivos     := {|| Array( 0 )  }  // Bingen
   ::nLanguage   := nLanguage          // Bingen
   ::Language()                        // Bingen

   // Array con dias festivos...
   ::aFestivos     := { {}, {}, {}, ;
      {}, {}, {}, ;
      {}, {}, {}, ;
      {}, {}, {}  }

   ::oWnd      := oWnd
   ::oFont     := oFont
   ::lFont     := !oFONT = Nil
   ::nPosFila  := 1
   ::nPosCol   := 1
   ::nPosBoton := 1
   ::aColorCuerpo := { nRgb( 235, 235, 210 ), ; // Color Borde superior
      nRgb( 205, 205, 155 ), ; // Color de Relleno
      nRgb( 150, 150, 75 ), ; // Color Borde inferior
      nRgb(  0,  0,  0 ), ; // Color del texto,
      nRgb( 130, 130, 65 ) }  // Color dia seleccionado al perder el foco

   ::aColorTitulo := { nRgb( 170, 170, 80 ), ; // Color Borde superior
      nRgb( 130, 130, 65 ), ; // Color de Relleno
      nRgb( 100, 100, 50 ), ; // Color Borde inferior
      ::aColorCuerpo[ 2 ], ; // Color Letra mes y año
      nRgb( 255, 255, 255 ) } // Color de los dias.

   ::aColorBoton  := { nRgb( 170, 170, 80 ), ; // Color Borde superior
      nRgb( 130, 130, 65 ), ; // Color de Relleno
      nRgb( 100, 100, 50 ), ; // Color Borde inferior
      ::aColorCuerpo[ 2 ], ; // Color Letra
      ::aColorCuerpo[ 2 ] } // Color relleno cuando se selecciona.

   ::aColorDomingo := ::aColorTitulo
   ::aColorFestivo := ::aColorTitulo


   ::nPosicion    := Day( ::dFechaControl )
   ::FijaClrs()
   ::FijaClrDomingo()
   ::FijaClrFestivo()

   ::nStyle    := nOr( WS_CHILD, WS_VISIBLE, WS_TABSTOP )

   ::Register()

   IF !Empty( oWnd:hWnd )
      ::Create()
      oWnd:AddControl( Self )
   ELSE
      oWnd:DefControl( Self )
   ENDIF

   RETURN Self

METHOD Display() CLASS TMiCalendario

   IF ::lContinuar
      ::lContinuar := .F.
      ::BeginPaint()
      ::Paint()
      ::EndPaint()
      ::lContinuar := .T.
   ELSE
      MsgInfo( "Para Ccontrolar Que Nao Passe Duas Vezes" )
   ENDIF

   RETURN SELF


METHOD Paint() CLASS TMiCalendario

   // Se recupera identificador del boton.
   LOCAL hDC    := ::GetDC()
   LOCAL nColor

   IF !::lTodoseCalculo
      ::Default()
      ::SetSize( ::nCol2 + 1, ::nFila2 + 1 + IF( ::lMostrarBoton, ::nAltoFila, 0 ), .T. )  // Bingen
      ::lTodoseCalculo := .T.
   ENDIF

   // Comienza el dibujo
   DibujarTodo( hDC, ::nAltoFila, ::nAnchoCol, ::nFila1, ::nFila2, ;
      ::nCol1, ::nCol2, ::oFont, ::aDiaSemana, ;
      ::aXY, ::oFontTxt, ::aDias, ::aColorTitulo, ::aClrDias, ::aColorCuerpo, ::aColorBoton, ;
      ::cMesPalabra, ::oFontMes, ::cAno, ;
      ::oFontBtn, ::aBoton, ::nAnchoBoton, ::aTitBoton, ::bFestivos )  // Bingen

   // Se pinta si esta con el foco o no.
   IF ::lFocused
      MarcarDia( hDC, ::aXY[ ::nPosicion ], nrgb( 255, 0, 0 ) )
   ELSE
      MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aColorCuerpo[ 5 ] )
   ENDIF

   // Se libera el identificador del boton.
   ::ReleaseDC()

   RETURN Self


STATIC FUNCTION DibujarTodo( hDC, nAltoFila, nAnchoCol, nFila1, nFila2, ;
      nCol1, nCol2, oFont, aDiaSemana, aConPuntos, ;
      oFontTxt, aDias, aColorTitulo, aClrDias, aColorCuerpo, aColorBoton, ;
      cMesPalabra, oFontMes, cAno, ;
      oFontBtn, aBoton, nAnchoBoton, ;
      aTitBoton, bFestivos )  // Bingen

   LOCAL A
   LOCAL aLosPuntos := aConPuntos[ 42 ]

   // Se dibuja el cuerpo del calendario
   DibujaCuerpo( hDC, aConPuntos, aClrDias, aColorCuerpo )

   // Se dibujan los dias.
   DibujaDias( hDC, oFont, aDias, aConPuntos, aClrDias, bFestivos )

   // Se dibujan la parte superior del calendario
   DibujaEncabezado( hDC,  nFila1, nFila2, nAltoFila, ;
      nCol1,  nCol2, nAnchoCol, ;
      aDiaSemana,  oFont, aColorTitulo, ;
      cMesPalabra, oFontMes, cAno )

   // Se dibujan los titulos del encabezado.
   DibujaTitulos( hDC, nAltoFila, nCol1, nCol2, nAnchoCol, ;
      oFontMes, oFontTxt, aColorTitulo, cMesPalabra, ;
      cAno, aDiaSemana )

   // Se dibujan los botones.
   DibujaBotones( hDC, nFila2, nAltoFila, ;
      nCol1,  nCol2, nAnchoCol, ;
      oFontBtn,  aColorBoton, aBoton, aTitBoton, nAnchoBoton )

   RETURN NIL

STATIC FUNCTION DibujaDias( hDC, oFont, aDias, aXY, aClrDias, bFestivos )

   LOCAL HBROCHAANTERIOR, HOLDPEN
   LOCAL A, aFESTIVOS := Array( 0 ), nCOLOR := 0
   LOCAL hBrocha
   LOCAL hPen1
   LOCAL hPen2

   DEFAULT bFestivos   := {|| Array( 0 ) }

   aFESTIVOS := Eval( bFestivos )

   // Se dibujan los dias.
   SelectObject( hDC, oFont:hFont )

   FOR A = 1 TO 42
      // Se crea brocha para pintar el fondo del recuadro...
      hBrocha := CreateSolidBrush ( aClrDias[ A ][ 2 ] )

      // se carga la brocha, se guarda la brocha anterior y se pinta
      hBrochaAnterior := SelectObject ( hDC, hBrocha )
      FillRect( hDc, aXY[ A ], hBrocha )

      // Se restaura la brocha y destruye la utilizada
      SelectObject ( hDC, hBrochaAnterior )
      IF !DeleteObject( hBrocha )
         MsgInfo( "Parece que no se destruyo" )
      ENDIF

      // Aqui se dibujan los bordes....
// UNO. se cargan los lapices...
      hPen1 := CreatePen( PS_SOLID, 1, aClrDias[ A ][ 1 ] )   // Claro nrgb(235,235,210)
      hPen2 := CreatePen( PS_SOLID, 1, aClrDias[ A ][ 3 ] )   // Oscuro nrgb(160,160, 75)

      // Se carga el lapices y se dibuja borde superior..
      hOldPen := SelectObject( hDC, hPen1 )
      MoveTo( hDc, aXY[ A ][ 2 ] - 1, aXY[ A ][ 3 ]     )
      LineTo( hDc,  aXY[ A ][ 2 ] - 1, aXY[ A ][ 1 ] - 1 )
      LineTo( hDc,  aXY[ A ][ 4 ], aXY[ A ][ 1 ] - 1 )

      // Se destruyen objetos utilizados
      SelectObject( hDC, hOldPen )
      IF !DeleteObject( hPen1 )
         MsgInfo( "O objeto nao se destruiu" )
      ENDIF

      // Se carga el lapices y se dibuja borde inferior..
      hOldPen := SelectObject( hDC, hPen2 )
      MoveTo( hDc, aXY[ A ][ 2 ], aXY[ A ][ 3 ]     )
      LineTo( hDc,  aXY[ A ][ 4 ], aXY[ A ][ 3 ]     )
      LineTo( hDc,  aXY[ A ][ 4 ], aXY[ A ][ 1 ] - 2 )

      // Se destruyen objetos utilizados
      SelectObject( hDC, hOldPen )
      IF !DeleteObject( hPen2 )
         MsgInfo( "El objeto no se destruyo" )
      ENDIF

// Se dibuja el texto...
      SetBkColor(   hDC, aClrDias[ A ][ 2 ] )
      nCOLOR := AScan( aFESTIVOS, {| aVal | aVal[ 1 ] == Val( aDias[ A ] ) } ) // Comprobar festivos
      IF nCOLOR > 0    // Bingen
         SetTextColor( hDC, aFESTIVOS[ nCOLOR, 2 ] )
      ELSE
         SetTextColor( hDC, aClrDias[ A ][ 4 ] )
      ENDIF

      DrawText( hDC, " " + aDias[ A ] + "  ", aXY[ A ], ;
         nOr( 32, 4, 1 ) ) // 0 IZQUIERDA 1 CENTRO 2 DERECHA

   NEXT A

   RETURN NIL

STATIC FUNCTION DibujaCuerpo( hDC, aXY, aClrDias, aColorCuerpo  )

   // Se crea el lapiz a utilizar.
   LOCAL A, HOLDPEN
   LOCAL hPen1
   LOCAL hPen2
   LOCAL hBrocha
   LOCAL hBrochaAnterior

   // Se dibujan los bordes del cuerpo
   hPen1 := CreatePen( PS_SOLID, 1, aColorCuerpo[ 1 ] )
   hPen2 := CreatePen( PS_SOLID, 1, Getsyscolor( 16 ) )

   // Se carga el lapices y se dibuja borde superior..
   hOldPen := SelectObject( hDC, hPen1 )
   MoveTo( hDc, aXY[ 1 ][ 2 ] - 2, aXY[ 1 ][ 1 ] - 1 )
   LineTo( hDc,  aXY[ 1 ][ 2 ] - 2, aXY[ 36 ][ 3 ] + 2 )

   // Se destruyen objetos utilizados
   SelectObject( hDC, hOldPen )
   IF !DeleteObject( hPen1 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   // Se carga el lapices y se dibuja borde inferior..
   hOldPen := SelectObject( hDC, hPen2 )
   MoveTo( hDc, aXY[ 36 ][ 2 ] - 1, aXY[ 36 ][ 3 ] + 1 )
   LineTo( hDc,  aXY[ 42 ][ 4 ] + 1, aXY[ 36 ][ 3 ] + 1 )
   LineTo( hDc,  aXY[ 42 ][ 4 ] + 1, - 1              )

   // Se destruyen objetos utilizados
   SelectObject( hDC, hOldPen )
   IF !DeleteObject( hPen2 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   RETURN NIL

STATIC FUNCTION DibujaEncabezado( hDC,  nFila1, nFila2, nAltoFila, ;
      nCol1,  nCol2, nAnchoCol, ;
      aDiaSemana,  oFont, aColorTitulo, ;
      cMesPalabra, oFontMes, cAno )

   // Se crea el lapiz a utilizar.
   LOCAL hPen1 := CreatePen( PS_SOLID, 1, aColorTitulo[ 1 ] ) // Lapiz claro
   LOCAL hPen2 := CreatePen( PS_SOLID, 1, aColorTitulo[ 3 ] ) // Lapiz oscuro
   LOCAL hPenAnterior
   LOCAL aPuntos[ 4 ]
   LOCAL A

   // Se crea brocha pintar la parte superior y luego
   // se carga la brocha y se guarda la anterior brocha.
   LOCAL hBrocha         := CreateSolidBrush ( aColorTitulo[ 2 ] )
   LOCAL hBrochaAnterior := SelectObject ( hDC, hBrocha )


   // Se pinta el recuadro.
   FillRect( hDc, { 2, nCol1, nFila1 - 1, nCol2 }, hBrocha )

   // Se restaura la brocha y destruye la utilizada
   SelectObject ( hDC, hBrochaAnterior )
   IF !DeleteObject( hBrocha )
      MsgInfo( "Parece que no se destruyo" )
   ENDIF

   // Se dibuja el contorno se selecciona lapiz.
   // Linea superior y linea izquierda
   hPenAnterior := SelectObject( hDC, hPen1 )
   MoveTo( hDC, nCol2 - 1, 1 )
   LineTo( hDC, nCol1, 1 )
   LineTo( hDC, nCol1, nFila1 - 1 )
   LineTo( hDC, nCol1 - 1, nFila1 - 1 )
   LineTo( hDC, nCol1 - 1, 0 )
   LineTo( hDC, nCol2, 0 )

   // Linea horizontal del centro.
   MoveTo( hDC, nCol2 - 1, nAltoFila )
   LineTO( hDC, nCol1 - 1, nAltoFila )

   MoveTo( hDC, nCol2 - ( nAnchoCol * 2 ), 2 )
   LineTo( hDC, nCol2 - ( nAnchoCol * 2 ), nAltoFila )

   FOR A = 1 TO 6
      MoveTo( hDC, ( nAnchoCol * A ) + nCol1, nAltoFila )
      LineTo( hDC, ( nAnchoCol * A ) + nCol1, nAltoFila * 2 )
   NEXT a


   // Se destruyen objetos utilizados
   SelectObject( hDC, hPenAnterior )
   IF !DeleteObject( hPen1 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   // Se dibuja el contorno se selecciona lapiz.
   // Linea superior y linea izquierda
   hPenAnterior := SelectObject( hDC, hPen2 )
   MoveTo( hDC, nCol2 - 1, 1 )
   LineTo( hDC, nCol2 - 1, nFila1 - 1 )
   LineTo( hDC, nCol1 - 2, nFila1 - 1 )

   // Linea horizontal del centro.
   MoveTo( hDC, nCol2 - 1, nAltoFila - 1 )
   LineTO( hDC, nCol1 - 2, nAltoFila - 1 )

   MoveTo( hDC, nCol2 - ( nAnchoCol * 2 ) - 1, 0 )
   LineTo( hDC, nCol2 - ( nAnchoCol * 2 ) - 1, nAltoFila )

   FOR A = 1 TO 6
      MoveTo( hDC, ( nAnchoCol * A ) + nCol1 - 1, nAltoFila )
      LineTo( hDC, ( nAnchoCol * A ) + nCol1 - 1, nAltoFila * 2 )
   NEXT a

   // Se destruyen objetos utilizados
   SelectObject( hDC, hPenAnterior )
   IF !DeleteObject( hPen2 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   RETURN NIL

STATIC FUNCTION DibujaTitulos( hDC, nAltoFila, nCol1, nCol2, ;
      nAnchoCol,  oFontMes, oFont, aColorTitulo, ;
      cMesPalabra, cAno, aDiaSemana )

   LOCAL aPuntos[ 4 ]
   LOCAL A

   // Formato letra
   SelectObject( hDC, oFont:hFont )  // Se selecciona el tipo de letra.
   SetTextColor( hDC, aColorTitulo[ 5 ] )
   SetBkColor(   hDC, aColorTitulo[ 2 ] )

   // Se dibujan los titulos de los dias.
   A := 0
   aPuntos[ 1 ] := nAltoFila
   aPuntos[ 3 ] := nAltoFila * 2
   FOR A = 0 TO 6
      aPuntos[ 2 ] := nCol1 + ( A * nAnchoCol )
      aPuntos[ 4 ] := aPuntos[ 2 ] + nAnchoCol
      DrawText( hDC, Left( aDiaSemana[ A + 1 ], 3 ), aPuntos, ;
         nOr( 32, 4, 1 ) ) // 0 IZQUIERDA 1 CENTRO 2 DERECHA
   NEXT A

   // Se dibuja el mes en palabras.
   SelectObject( hDC, oFontMes:hFont )
   SetTextColor( hDC, aColorTitulo[ 4 ] )
   aPuntos[ 1 ] := 3
   aPuntos[ 2 ] := 2
   aPuntos[ 3 ] := nAltoFila - 1
   aPuntos[ 4 ] := nCol2 - ( nAnchoCol * 2 ) - 1
   DrawText( hDC, cMesPalabra, aPuntos, ;
      nOr( 32, 4, 1 ) ) // 0 IZQUIERDA 1 CENTRO 2 DERECHA

   // Se dibuja el numero del año
   aPuntos[ 2 ] := aPuntos[ 4 ] + 2
   aPuntos[ 4 ] := nCol2 - 1
   DrawText( hDC, cAno, aPuntos, ;
      nOr( 32, 4, 1 ) ) // 0 IZQUIERDA 1 CENTRO 2 DERECHA

   RETURN NIL

STATIC FUNCTION DibujaBotones( hDC, nFila2, nAltoFila, ;
      nCol1,  nCol2, nAnchoCol, ;
      oFont, aColorBoton, aBoton, aTitBoton, nAnchoBoton )

   // Se crea el lapiz a utilizar.
   LOCAL hPen1 := CreatePen( PS_SOLID, 1, aColorBoton[ 1 ] ) // Lapiz claro
   LOCAL hPen2 := CreatePen( PS_SOLID, 1, aColorBoton[ 3 ] ) // Lapiz oscuro
   LOCAL hPenAnterior
   LOCAL aPuntos[ 5 ]
   LOCAL A

   // Se crea brocha pintar la parte superior y luego
   // se carga la brocha y se guarda la anterior brocha.
   LOCAL hBrocha         := CreateSolidBrush ( aColorBoton[ 2 ] )
   LOCAL hBrochaAnterior := SelectObject ( hDC, hBrocha )


   // Se pinta el recuadro.
   FillRect( hDc, { nFila2 + 2, nCol1, nFila2 + nAltoFila - 1, nCol2 }, hBrocha )

   // Se restaura la brocha y destruye la utilizada
   SelectObject ( hDC, hBrochaAnterior )
   IF !DeleteObject( hBrocha )
      MsgInfo( "Parece que no se destruyo" )
   ENDIF

   // Se dibuja el contorno se selecciona lapiz.
   // Linea superior y linea izquierda
   hPenAnterior := SelectObject( hDC, hPen1 )
   MoveTo( hDC, nCol2 - 1, nFila2 + 1 )
   LineTo( hDC, nCol1, nFila2 + 1 )
   LineTo( hDC, nCol1, nFila2 + nAltoFila - 1 )
   LineTo( hDC, nCol1 - 1, nFila2 + nAltoFila - 1 )
   LineTo( hDC, nCol1 - 1, nFila2    )

   FOR A = 1 TO 4
      MoveTo( hDC, ( nAnchoBoton * A ) + nCol1 + 1, nFila2 + 1 )
      LineTo( hDC, ( nAnchoBoton * A ) + nCol1 + 1, nFila2 + nAltoFila )
   NEXT a

   // Se destruyen objetos utilizados
   SelectObject( hDC, hPenAnterior )
   IF !DeleteObject( hPen1 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   // Se dibuja el contorno se selecciona lapiz.
   // Linea inferior y linea derecha
   hPenAnterior := SelectObject( hDC, hPen2 )
   MoveTo( hDC, nCol2, nFila2 + 1 )
   LineTo( hDC, nCol2, nFila2 + nAltoFila )
   LineTo( hDC, nCol1 - 2, nFila2 + nAltoFila )
   LineTo( hDC, nCol1 - 2, nFila2 + nAltoFila - 1 )
   LineTo( hDC, nCol2 - 1, nFila2 + nAltoFila - 1 )
   LineTo( hDC, nCol2 - 1, nFila2 + 1 )

   FOR A = 1 TO 4
      MoveTo( hDC, ( nAnchoBoton * A ) + nCol1, nFila2 + 1 )
      LineTo( hDC, ( nAnchoBoton * A ) + nCol1, nFila2 + nAltoFila )
   NEXT a


   // Se destruyen objetos utilizados
   SelectObject( hDC, hPenAnterior )
   IF !DeleteObject( hPen2 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   // Formato letra
   SelectObject( hDC, oFont:hFont )  // Se selecciona el tipo de letra.
   SetTextColor( hDC, aColorBoton[ 5 ] )
   SetBkColor(   hDC, aColorBoton[ 2 ] )

   // Se dibujan los titulos de los botones       //Bingen
   DrawText( hDC, aTitBoton[ 1 ], aBoton[ 1 ], ;
      nOr( 32, 4, 1 ) )


   DrawText( hDC, aTitBoton[ 2 ], aBoton[ 2 ], ;
      nOr( 32, 4, 1 ) )
   DrawText( hDC, aTitBoton[ 3 ], aBoton[ 3 ], ;
      nOr( 32, 4, 1 ) )
   DrawText( hDC, aTitBoton[ 4 ], aBoton[ 4 ], ;
      nOr( 32, 4, 1 ) )
   DrawText( hDC, aTitBoton[ 5 ], aBoton[ 5 ], ;
      nOr( 32, 4, 1 ) )

   RETURN NIL

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TMiCalendario

   // Se recupera identificador del boton.
   LOCAL hDC       := ::GetDC()
   LOCAL nAltoFila := ::nAltoFila
   LOCAL nAnchoCol := ::nAnchoCol
   LOCAL nFila1    := ::nFila1
   LOCAL nFila2    := ::nFila2
   LOCAL n         := 1
   LOCAL nPos      := 0
   LOCAL nPosAnterior := ::nPosicion
   LOCAL B


   // Se fija que el objeto tenga el foco.
   ::SetFocus()

   // Se determina el recuadro donde se da el click
   IF ::lCuerpo( nRow, nCol )

      // Se determina el numero de fila
      WHILE nRow > ( nPos + nFila1 + nAltoFila ) .AND. n < 7
         nPos += ::nAltoFila
         n++
      END
      ::nPosFila := n

      // Se determina la posicion de la columna.
      n    := 1
      nPos := 0
      WHILE nCol > ( nPos + nAnchoCol + ::nCol1 ) .AND. n < 7
         nPos += nAnchoCol
         n++
      END
      ::nPosCol  := n


      // Se pinta el dia seleccionado.
      ::nPosicion := ( ( ::nPosFila - 1 ) * 7 ) + ::nPosCol
      B = AllTrim( ::aDias[ ::nPosicion ] )

      IF !Empty( B )
         MarcarDia( hDC, ::aXY[ nPosAnterior ], ::aClrDias[ nPosAnterior ][ 2 ] )
         MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )

         // Se actualizan los datos fecha.
         ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
            ::cMesNumero         + "/" + ;
            ::cAno ) )
         ::nLastDay := ::nDiaMes
      ELSE
         IF ::lCuerpo( nRow, nCol )    // Bingen
            Tone( 500, 3 )
            ::lSelectOK := .F.
         ENDIF
         ::nPosicion := nPosAnterior
      ENDIF

   ENDIF

   // Se evalua si es la linea de los botones.
   IF ::lBotones( nRow, nCol )

      // Se determina la posicion de la columna.
      n    := 1
      nPos := 0
      WHILE nCol > ( nPos + ::nAnchoBoton + ::nCol1 ) .AND. n < 5
         nPos += ::nAnchoBoton
         n++
      END

      ::nPosBoton  := n
      ::PintarBoton( hDC, ::aColorBoton[ 5 ], nRow, nCol )

      // Se evalua el boton seleccionado.
      DO CASE
      CASE ::nPosBoton == 1
         ::MesAnterior()
      CASE ::nPosBoton == 2
         ::MesSiguinte()
      CASE ::nPosBoton == 3
         ::AnoAnterior()
      CASE ::nPosBoton == 4
         ::AnoSiguiente()
      CASE ::nPosBoton == 5
         ::IrFecha( Date() )
      ENDCASE

   ENDIF

   // Se libera el identificador del boton.
   ::ReleaseDC()

   RETURN Self

METHOD LButtonUp( nRow, nCol )  CLASS TMiCalendario

   LOCAL hDC := ::GetDC()

   IF ::lSelectOK
      ::PintarBoton( hDC, ::aColorBoton[ 2 ], nRow, nCol )
      IF ::lCuerpo( nRow, nCol )
         Super:LButtonUp( nRow, nCol )
      ENDIF
   ELSE
      ::lSelectOK := .T.
   ENDIF

   ::ReleaseDC()

   RETURN Self

METHOD RButtonUp( nRow, nCol, nKeyFlags ) CLASS TMiCalendario

   LOCAL oMenu

   ::SetFocus()
   MENU oMenu POPUP
   MENUITEM ::aTitBoton[ 1 ] ACTION ::MesSiguinte()

   MENUITEM ::aTitBoton[ 2 ] ACTION ::MesAnterior()

   MENUITEM ::aTitBoton[ 5 ] ACTION ::Hoy()

   MENUITEM ( OemToAnsi( "Outro Mˆs" ) )
   MENU
   MENUITEM ::aMESES[ 1 ] ACTION ::CambiarMes( 1 - ::nMesNumero )
   MENUITEM ::aMESES[ 2 ] ACTION ::CambiarMes( 2 - ::nMesNumero )
   MENUITEM ::aMESES[ 3 ] ACTION ::CambiarMes( 3 - ::nMesNumero )
   MENUITEM ::aMESES[ 4 ] ACTION ::CambiarMes( 4 - ::nMesNumero )
   MENUITEM ::aMESES[ 5 ] ACTION ::CambiarMes( 5 - ::nMesNumero )
   MENUITEM ::aMESES[ 6 ] ACTION ::CambiarMes( 6 - ::nMesNumero )
   MENUITEM ::aMESES[ 7 ] ACTION ::CambiarMes( 7 - ::nMesNumero )
   MENUITEM ::aMESES[ 8 ] ACTION ::CambiarMes( 8 - ::nMesNumero )
   MENUITEM ::aMESES[ 9 ] ACTION ::CambiarMes( 9 - ::nMesNumero )
   MENUITEM ::aMESES[ 10 ] ACTION ::CambiarMes( 10 - ::nMesNumero )
   MENUITEM ::aMESES[ 11 ] ACTION ::CambiarMes( 11 - ::nMesNumero )
   MENUITEM ::aMESES[ 12 ] ACTION ::CambiarMes( 12 - ::nMesNumero )
   ENDMENU

   SEPARATOR
   MENUITEM ::aTitBoton[ 3 ] ACTION ::AnoSiguiente()
   MENUITEM ::aTitBoton[ 4 ] ACTION ::AnoAnterior()

   IF !::lMostrarBoton                                             // Bingen
      MENUITEM "Mostrar Botones" ACTION ::SetSize( ::nWidth(), ::nheight() + ::nAltoFila, .T. ), ;
         ::ReSize(), ;
         ::lMostrarBoton := .T.
   ELSE
      MENUITEM "Ocultar Botones" ACTION ::SetSize( ::nWidth(), ::nheight() - ::nAltoFila, .T. ), ;
         ::ReSize(), ;
         ::lMostrarBoton := .F.
   ENDIF

   ENDMENU

   ACTIVATE POPUP oMenu AT nRow, nCol OF Self

   RETURN SELF

METHOD lBotones( nRow, nCol ) CLASS TMiCalendario
   RETURN iif( ( nRow  > ::nFila2  .AND. ;
      nCol  > ::nCol1   .AND. ;
      nCol <= ::nCol2 ), .T., .F. )


METHOD lCuerpo( nRow, nCol )  CLASS TMiCalendario
   RETURN iif( ( nRow  > ::nFila1  .AND. ;
      nRow <= ::nFila2  .AND. ;
      nCol  > ::nCol1   .AND. ;
      nCol <= ::nCol2 ), .T., .F. )

METHOD Default() CLASS TMiCalendario

   LOCAL B := 1
   LOCAL aPuntos[ 5 ]

// Local aPunt   := GetClientRec(::hWnd)

   // Estos son los datos de las columnas.
   ::nCol1     := 1                                   // Inicio Columna
   ::nAnchoCol := CalcularAncho( ::nCol1, ::nWidth() ) // El ancho de la columna
   ::nCol2     := ( ::nAnchoCol * 7 ) + ::nCol1        // Final Columna

   // Estos son los datos de la fila
   ::nAltoFila := CalcularAlto( ::nHeight() )         // El alto de la fila.
   ::nFila1    := ::nAltoFila * 2                     // Ubicacion primera linea a dibujar
   ::nFila2    := ::nAltoFila * 8                     // Fila Final

   // Font del título 75% de la altura de la celda
   ::oFontMes := TFont():New( "Arial", 0, - ( ::nAltoFila * .75 ),, .T. ) // Bingen
   // Font de los textos de los días 50% de la altura de la celda
   ::oFontTXT := TFont():New( "Arial", 0, - ( ::nAltoFila * .40 ),, .T. ) // Bingen
   // Font para los días por defecto del 5O% de la altura de la celda
   ::oFont    := IF( ::lFont, ::oFont, TFont():New( "Arial", 0, - ( ::nAltoFila * .50 ),, .T. ) ) // Bingen
   // Font para los botones 4O% de la altura de la celda
   ::oFontBtn := TFont():New( "Arial", 0, - ( ::nAltoFila * .40 ),, .T. ) // Bingen

   // Se crea matriz con los datos dia del mes.
   // Coordenadas filas
   aPuntos[ 1 ] := ::nFila1 + 1
   aPuntos[ 3 ] := aPuntos[ 1 ] + ::nAltoFila - 2

   FOR  B = 1 TO 7

// Coordenadas columnas.
      aPuntos[ 2 ] := ::nCol1  + ( ::nAnchoCol * ( B - 1 ) ) + 1
      aPuntos[ 4 ] := aPuntos[ 2 ] + ::nAnchoCol - 2

      ::aXY[ B     ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }
      ::aXY[ B +  7 ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }
      ::aXY[ B + 14 ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }
      ::aXY[ B + 21 ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }
      ::aXY[ B + 28 ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }
      ::aXY[ B + 35 ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ] }

   NEXT B

   FOR  B = 1 TO 7
      ::aXY[ B +  7 ][ 1 ] := ::aXY[ B     ][ 1 ] + ::nAltoFila
      ::aXY[ B + 14 ][ 1 ] := ::aXY[ B +  7 ][ 1 ] + ::nAltoFila
      ::aXY[ B + 21 ][ 1 ] := ::aXY[ B + 14 ][ 1 ] + ::nAltoFila
      ::aXY[ B + 28 ][ 1 ] := ::aXY[ B + 21 ][ 1 ] + ::nAltoFila
      ::aXY[ B + 35 ][ 1 ] := ::aXY[ B + 28 ][ 1 ] + ::nAltoFila

      ::aXY[ B +  7 ][ 3 ] := ::aXY[ B +  7 ][ 1 ] + ::nAltoFila - 2
      ::aXY[ B + 14 ][ 3 ] := ::aXY[ B + 14 ][ 1 ] + ::nAltoFila - 2
      ::aXY[ B + 21 ][ 3 ] := ::aXY[ B + 21 ][ 1 ] + ::nAltoFila - 2
      ::aXY[ B + 28 ][ 3 ] := ::aXY[ B + 28 ][ 1 ] + ::nAltoFila - 2
      ::aXY[ B + 35 ][ 3 ] := ::aXY[ B + 35 ][ 1 ] + ::nAltoFila - 2

   NEXT B


   // Se calcula el ancho de los botones.
   ::nAnchoBoton := Int( ( ::nCol2 - ::nCol1 ) / 5 )

   // Se crean las coordenadas del boton.
   aPuntos[ 1 ] := ::nFila2 + 1
   aPuntos[ 3 ] := aPuntos[ 1 ] + ::nAltoFila - 2

   FOR  B = 1 TO 5

      // Coordenadas columnas.
      aPuntos[ 2 ] := ::nCol1  + ( ::nAnchoBoton * ( B - 1 ) ) + 1
      aPuntos[ 4 ] := aPuntos[ 2 ] + ::nAnchoBoton - 2

      ::aBoton[ B ] := { aPuntos[ 1 ], aPuntos[ 2 ], aPuntos[ 3 ], aPuntos[ 4 ], aPuntos[ 5 ] }
   NEXT B

   // Se fijan los datos de la fecha.
   ::FijarFecha( ::dFechaControl )
   ::nLastDay := ::nDiaMes

   RETURN SELF

METHOD FijaClrs( aColores )  CLASS TMiCalendario

   LOCAL A

   ::aColorCuerpo := iif( aColores == NIL, ::aColorCuerpo, aColores )

   // Se fijan los colores de bordes y de fondo de cada uno de los
   // cuadritos...
   FOR A = 1 TO 42
      ::aClrDias[ A ] := { ::aColorCuerpo[ 1 ], ; // Color Borde superior
         ::aColorCuerpo[ 2 ], ; // Color de Relleno
         ::aColorCuerpo[ 3 ], ; // Color Borde inferior
         ::aColorCuerpo[ 4 ] } // Color del texto,

   NEXT A

   RETURN NIL

METHOD FijaClrDomingo( aColores ) CLASS TMiCalendario

   LOCAL A

   ::aColorDomingo := iif( aColores == NIL, ::aColorDomingo, aColores )

   // Se fijan los colores para los dias domingo...
   FOR A = 7 TO 42 STEP 7
      ::aClrDias[ A ] := { ::aColorDomingo[ 1 ], ; // Color Borde superior
         ::aColorDomingo[ 2 ], ; // Color de Relleno
         ::aColorDomingo[ 3 ], ; // Color Borde inferior
         ::aColorDomingo[ 4 ] } // Color del texto,
   NEXT A

   RETURN NIL

METHOD FijaClrFestivo() CLASS TMiCalendario

   LOCAL aDiasFestivos := ::aFestivos[ ::nMesNumero ]
   LOCAL nFestivos     := Len( aDiasFestivos )
   LOCAL nDia          := 0
   LOCAL A

   // Se fijan los colores para los dias domingo...
   IF nFestivos > 0
      FOR A = 1 TO nFestivos
         nDia := aDiasFestivos[ A ]
         ::ColorDia( nDia, ::aColorFestivo )
      NEXT A
   ENDIF

   RETURN NIL

METHOD ColorDia( nDia, aColores ) CLASS TMiCalendario

   ::aClrDias[ ::nPrimerDia + ndia - 1 ] := aColores

   RETURN NIL

METHOD FijarFecha( dFecha ) CLASS TMiCalendario

   dFecha = iif( dFecha == NIL, Date(), dFecha )

   ::dFechaControl := dFecha
   ::CalcularDias( ::dFechaControl )

   ::nMesNumero    := Month( ::dFechaControl )
   ::cMesNumero    := Str( ::nMesNumero, 2, 0 )
   ::cMesPalabra   := IF( ::nMesNumero = NIL, "", ::aMESES[ ::nMesNumero ] )

   ::nDiaSemana    := if( ( ::nDiaSemana := DoW( ::dFechaControl ) - 1 ) = 0, 7, ::nDiaSemana )
   ::cDiaSemana    := Str( ::nDiaSemana, 2, 0 )
   ::cDiaPalabra   := ::aDiaSemana[ ::nDiaSemana ]
   ::nDiaMes       := Day( ::dFechaControl )
   ::cDiaMes       := Str( ::nDiaMes, 2, 0 )
   ::cDiaMesPalabra := FormarFrase( ::nDiaMes )

   ::nAno          := Year( ::dFechaControl )
   ::cAno          := AllTrim( Str( ::nAno, 4, 0 ) )
   ::cAnoPalabra   := FormarFrase( ::nAno )

   ::aFecha[ 1 ]    := ::cDiaMes + " de " + ::cMesPalabra + " de " + ::cAno
   ::aFecha[ 2 ]    := ::cDiaPalabra + ", " + ::cDiaMes + " de " + ::cMesPalabra + " de " + ::cAno

// aqui agregar todos los otros formatos que sean posibles.

   RETURN SELF

METHOD CalcularDias( dFecha ) CLASS TMiCalendario // TMiEjemplo

   LOCAL FechaInicioMes
   LOCAL nDiaSemana
   LOCAL nMes       := Month( dFecha )
   LOCAL nAno       := Year(  dFecha )
   LOCAL aDiaFinMes := { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
   LOCAL aLosDias[ 42 ]
   LOCAL B
   LOCAL CELMES, CELANO, NDIAFINALMES

   // Se limpian los dias.
   FOR B = 1 TO 42
      aLosDias[ B ] := "    " // Para sobrescribir el dibujo anterior
   NEXT B


   // Dia de la semana.
   FechaInicioMes := CToD( "01/" + Str( nMes, 2, 0 ) + "/" + Str( nAno, 4, 0 ) )
   cElMes         := IF( ::nMesNumero = NIL, "", ::aMESES[ ::nMesNumero ] )
   cElAno         := Str( nAno, 4 )
   aDiaFinMes[ 2 ] := iif( CToD( "29/02/" + cElAno ) = CToD( "0" ), 28, 29 )
   nDiaFinalMes   := aDiaFinMes[ nMes ]
   nDiaSemana     := DoW( FechaInicioMes ) - 1
   nDiaSemana     := iif( nDiaSemana = 0, 7, nDiaSemana )

   FOR B = 1 TO nDiaFinalMes
      aLosDias[ B + nDiaSemana - 1 ] := Str( B, 2, 0 )
   NEXT B

   ::aDias        := aLosDias
   ::nPrimerDia   := nDiaSemana
   ::nUltimoDia   := B + nDiaSemana - 2
   ::nPosicion    := Day( dfecha ) + nDiaSemana - 1

   RETURN SELF

METHOD Destroy() CLASS TMiCalendario

   ::oFontMes:End()
   ::oFontTxt:End()
   ::oFont:End()
   ::oFontBtn:End()

   RETURN Super:Destroy()


METHOD CambiarMes( nMeses, lProcesar ) CLASS TMiCalendario

   LOCAL aDiaFinMes := { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
   LOCAL nNumeroMes := ::nMesNumero
   LOCAL dNvaFecha
   LOCAL hDC
   LOCAL AnchoRelleno := ( ::nAnchoCol * 5 ) - 4
   LOCAL nDia

   DEFAULT nMeses   := 1, lProcesar := .F.



   // Se obtiene el controlador
   IF ( nMeses <> 0 .OR. lProcesar )
      hDC := ::GetDC()
      // Se desmarca el dia...
      MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
   ENDIF

   // Si el numero es cero, pues nada se hace y lprocesar, para obligar a procesar.
   IF ( nMeses <> 0 .OR. lProcesar )

      MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
      // Se comprueba que no sea mayor que doce el aumento de mes.
      nNumeroMes += nMeses

      DO CASE
      CASE nNumeroMes > 12
         ::nMesNumero := nNumeroMes - 12
         ::nAno++
      CASE nNumeroMes < 1
         ::nMesNumero := 12 + nNumeroMes
         ::nAno--
      OTHERWISE
         ::nMesNumero := nNumeroMes
      ENDCASE

      // Se verifica año bisciesto
      aDiaFinMes[ 2 ] := iif( CToD( "29/02/" + Str( ::nAno, 4, 0 ) ) = CToD( "0" ), 28, 29 )

      // Se determina el dia de cambio...
      nDia := iif( ::nLastDay > aDiaFinMes[ ::nMesNumero ], ;
         aDiaFinMes[ ::nMesNumero ], ;
         ::nLastDay )

      dNvaFecha := CToD( Str(  nDia, 2, 0 ) + "/" + ;
         Str( ::nMesNumero, 2, 0 ) + "/" + ;
         Str( ::nAno,      4, 0 ) )

      ::FijarFecha( dNvaFecha )

      // Se restauran los colores...
      ::RestaurarColor()

      // Se evalua bloque de codigo al cambiar de mes...
      IF !Empty( ::bCambioMes )
         Eval( ::bCambioMes )
      ENDIF

      // Se dibujan los dias.
      DibujaDias( hDC, ::oFont, ::aDias, ::aXY, ;
         ::aClrDias, ::bFestivos  )

// Se dibujan los titulos del mes y año.
      DibujaTitulos( hDC, ::nAltoFila, ::nCol1, ::nCol2, ;
         ::nAnchoCol,  ::oFontMes, ::oFont, ::aColorTitulo, ;
         xPadc( ::cMesPalabra, AnchoRelleno ), ::cAno, ::aDiaSemana )

// ::nPosicion := ::nDiaSemana
// MsgInfo( ::nPosicion )

      MarcarDia( hDC, ::aXY[ ::nPosicion ], nRgb( 255,  0,  0 ) )

      // Se libera el identificador
      ::ReleaseDC()

   ENDIF

   RETURN Self

METHOD VerAlSalir() CLASS TMiCalendario

   // Metodo cuando se abandona
   // Se recupera el identificador.
   LOCAL hDC := ::GetDC()

   ::lConFoco := .F.
   MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aColorCuerpo[ 5 ] )

   // Se destruye el identificador.
   ::ReleaseDC()

   RETURN Self

METHOD VerAlEntrar() CLASS TMiCalendario

   // Metodo cuando se abandona
   // Se recupera el identificador.
   LOCAL hDC := ::GetDC()

   IF !::lTodoseCalculo
      ::Default()
      ::SetSize( ::nCol2 + 1, ::nFila2 + 1 + IF( ::lMostrarBoton, ::nAltoFila, 0 ), .T. )  // Bingen
      ::lTodoseCalculo := .T.
   ENDIF

   ::lConFoco := .T.
   MarcarDia( hDC, ::aXY[ ::nPosicion ], nrgb( 255, 0, 0 ) ) // ::aColorTitulo[5]

   // Se destruye el identificador.
   ::ReleaseDC()

   RETURN Self


METHOD GetDlgCode( nLastKey ) CLASS TMiCalendario

   // This method is very similar to TControl:GetDlgCode() but it is
   // necessary to have WHEN working

   IF ! ::oWnd:lValidating
      IF nLastKey == VK_UP .OR. nLastKey == VK_DOWN ;
            .OR. nLastKey == VK_RETURN .OR. nLastKey == VK_TAB
         ::oWnd:nLastKey = nLastKey
      ELSE
         ::oWnd:nLastKey = 0
      ENDIF
   ENDIF

   RETURN If( IsWindowEnabled( ::hWnd ), DLGC_WANTALLKEYS, 0 )

METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TMiCalendario

   CursorHand()

   // Se evalua si es la linea de los botones.
// IF nRow  > nFila2 .and. ;
// nCol  > ::nCol1  .and. nCol <= ::nCol2
//
// ENDIF

   RETURN SELF

METHOD PintarBoton( hDC, nColor, nRow, nCol ) CLASS TMiCalendario  // Bingen

   // se carga la brocha y se guarda la anterior brocha.
   LOCAL hBrocha         := CreateSolidBrush ( nColor )
   LOCAL hBrochaAnterior := SelectObject ( hDC, hBrocha )
   LOCAL aPuntos         := ::aBoton[ ::nPosBoton ]


   // Se pinta el recuadro.
   FillRect( hDc, { aPuntos[ 1 ] + 1, ;
      aPuntos[ 2 ] + 1, ;
      aPuntos[ 3 ], ;
      aPuntos[ 4 ] }, hBrocha )

   // Se restaura la brocha y destruye la utilizada
   SelectObject ( hDC, hBrochaAnterior )
   IF !DeleteObject( hBrocha )
      MsgInfo( "Parece que no se destruyo" )
   ENDIF

   // Formato letra
   SelectObject( hDC, IF( ::lCuerpo( nRow, nCol ), ::oFont:hFont, ::oFontBtn:hFont ) )  // Bingen
   SetTextColor( hDC, ::aColorBoton[ 5 ] )
   SetBkColor(   hDC, nColor )

   // Se dibujan los titulos de los botones
   DrawText( hDC, ::aTitBoton[ ::nPosBoton ], aPuntos, ;
      nOr( 32, 4, 1 ) )

   RETURN SELF

METHOD KeyChar( nKey, nFlags ) CLASS TMiCalendario

   DO CASE
   CASE nKey == ::nK_MesAdelenta
      ::MesSiguinte()

   CASE nKey == ::nK_MesAtras
      ::MesAnterior()

   CASE nKey == ::nK_Menu
      ::RButtonUp( ::nAltoFila, ::nAnchoCol, 0 )

   OTHERWISE
      RETURN Super:KeyChar( nKey, nFlags )
   ENDCASE

   RETURN SELF

METHOD KeyDown( nKey, nFlags ) CLASS TMiCalendario

   LOCAL hDC
   LOCAL nPosAnterior := ::nPosicion

   DO CASE
   CASE nKey == VK_RETURN      // Bingen
      ::LButtonUp(  ::aXY[ ::nPosicion, 1 ], ::aXY[ ::nPosicion, 2 ] )

   CASE nKey == VK_END
      IF ::nPosicion < ::nUltimoDia
         hDC := ::GetDC()
         MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
         ::nPosicion :=  ::nUltimoDia
         MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
         ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
            ::cMesNumero         + "/" + ;
            ::cAno ) )
         ::nLastDay := ::nDiaMes
         ::ReleaseDC()
      ENDIF

   CASE nKey == VK_HOME
      IF ::nPosicion > ::nPrimerDia
         hDC := ::GetDC()
         MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
         ::nPosicion :=  ::nPrimerDia
         MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
         ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
            ::cMesNumero         + "/" + ;
            ::cAno ) )
         ::nLastDay := ::nDiaMes
         ::ReleaseDC()
      ENDIF

   CASE nKey == VK_DOWN
      IF ::lProcesarTecla
         ::lProcesarTecla := .F.
         IF ( ::nPosicion + 7 ) < 42 .AND. !Empty( ::aDias[ ( ::nPosicion + 7 ) ] )
            hDC := ::GetDC()
            MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
            ::nPosicion := ::nPosicion + 7

            MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
            ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
               ::cMesNumero         + "/" + ;
               ::cAno ) )

            ::nLastDay := ::nDiaMes
            ::ReleaseDC()
         ENDIF
         ::lProcesarTecla := .T.
      ENDIF

   CASE nKey == VK_UP
      IF ::lProcesarTecla
         ::lProcesarTecla := .F.
         IF ( ::nPosicion - 7 ) > 0 .AND. !Empty( ::aDias[ ( ::nPosicion - 7 ) ] )
            hDC := ::GetDC()
            MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
            ::nPosicion := ::nPosicion - 7

            MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
            ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
               ::cMesNumero         + "/" + ;
               ::cAno ) )
            ::nLastDay := ::nDiaMes
            ::ReleaseDC()
         ENDIF
         ::lProcesarTecla := .T.
      ENDIF

   CASE nKey == VK_LEFT
      IF ::lProcesarTecla
         ::lProcesarTecla := .F.
         hDC := ::GetDC()
         MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
         ::nPosicion--

         IF ::nPosicion <  ::nPrimerDia
            ::nPosicion := ::nUltimoDia
         ENDIF
         MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
         ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
            ::cMesNumero         + "/" + ;
            ::cAno ) )
         ::ReleaseDC()
         ::nLastDay := ::nDiaMes
         ::lProcesarTecla := .T.
      ENDIF

   CASE nKey == VK_RIGHT
      IF ::lProcesarTecla
         ::lProcesarTecla := .F.
         hDC := ::GetDC()
         MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )
         ::nPosicion++

         IF ::nPosicion > ::nUltimoDia
            ::nPosicion := ::nPrimerDia
         ENDIF
         MarcarDia( hDC, ::aXY[ ::nPosicion ], nRGB( 255, 0, 0 ) )
         ::FijarFecha( CToD( ::aDias[ ::nPosicion ] + "/" + ;
            ::cMesNumero         + "/" + ;
            ::cAno ) )
         ::ReleaseDC()
         ::nLastDay := ::nDiaMes
         ::lProcesarTecla := .T.
      ENDIF

   CASE nKey == VK_TAB .OR. nKey == VK_ESCAPE
      RETURN Super:KeyDown( nKey, nFlags )

   CASE nKey == ::nK_AnoAtras
      ::AnoAnterior()

   CASE nKey == ::nK_AnoAdelenta
      ::AnoSiguiente()

   CASE nKey == ::nK_Hoy
      ::IrFecha( Date() )

   OTHERWISE
      RETURN Super:KeyDown( nKey, nFlags )

   ENDCASE

   RETURN SELF

METHOD IrFecha( dNvaFecha ) CLASS TMiCalendario

   // Se recupera identificador del boton.
   LOCAL hDC       := ::GetDC()
   LOCAL AnchoRelleno := ( ::nAnchoCol * 5 ) - 4

   // Se desmarca el dia...
   MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aClrDias[ ::nPosicion ][ 2 ] )


   // Se fija la fecha.
   ::FijarFecha( dNvaFecha )
   ::nLastDay := ::nDiaMes

   // Se restauran los colores...
   ::RestaurarColor()

   // Se evalua bloque de codigo al cambiar de mes...
   IF !Empty( ::bCambioMes )
      Eval( ::bCambioMes )
   ENDIF

   // Se dibujan los dias.
   DibujaDias( hDC, ::oFont, ::aDias, ::aXY, ;
      ::aClrDias, ::bFestivos )

   // Se dibujan los titulos del mes y año.
   DibujaTitulos( hDC, ::nAltoFila, ::nCol1, ::nCol2, ;
      ::nAnchoCol,  ::oFontMes, ::oFont, ::aColorTitulo, ;
      xPadc( ::cMesPalabra, AnchoRelleno ),      ::cAno, ::aDiaSemana )



   MarcarDia( hDC, ::aXY[ ::nPosicion ], ::aColorCuerpo[ 5 ] )

   // Se libera el identificador
   ::ReleaseDC()

   RETURN NIL


/*-------------------------------------------------------------------------*/
METHOD Language() CLASS TMiCalendario    // Bingen

   // Soporte multilenguaje
   IF ::nLanguage = L_PORTUGUES
      ::aMESES := { "Janeiro", "Fevereiro", "Março", "Abril", ;
         "Maio", "Junho", "Julho", "Agosto", ;
         "Setembro", "Outubro", "Novembro", "Dezembro" }

      ::aDiaSemana   := { "Segunda", "Terça", "Quarta", "Quinta", ;
         "_", "Sábado", "Domingo" }

      ::aTitBoton    := { "&-Mês", "&+Mês", "< Ano", "Ano >", "Hoje" }



   ELSEIF ::nLanguage = L_CATALA
      ::aMESES := { "Gener", "Febrer", "Març", "Abril", ;
         "Maig", "Juny", "Juliol", "Agost", ;
         "Setembre", "Octubre", "Novembre", "Desembre" }

      ::aDiaSemana   := { "Dilluns", "Dimarts", "Dimecres", "Dijous", ;
         "Divendres", "Dissabte", "Diumenge" }

      ::aTitBoton    := { "&-Mes", "&+Mes", "-Any", "+Any", "Avuy" }

   ELSEIF ::nLanguage = L_EUSKERA
      ::aMESES := { "Urtarrila", "Otsaila", "Martxoa", "Apirila", ;
         "Maiatza", "Ekaina", "Uztaila", "Abuztua", ;
         "Iraila", "Urria", "Azaroa", "Abendua" }

      ::aDiaSemana   := { "Astelehena", "Asteartea", "Asteazkena", "Osteguna", ;
         "Ostirala", "Larunbata", "Igandea" }

      ::aTitBoton    := { "&-Hil", "&+Hil", "-Urte", "+Urte", "Gaur" }

   ELSEIF ::nLanguage = L_GALEGO
      ::aMESES := { "Xaneiro", "Febreiro", "Marzal", "Abril", ;
         "Maio", "Xuño", "Xulio", "Agosto", ;
         "Septembro", "Octubro", "Novembro", "Decembro" }

      ::aDiaSemana   := { "Luns", "Martes", "Mércores", "Xoves", ;
         "Venres", "Sabado", "Domingo" }

      ::aTitBoton    := { "&-Mes", "&+Mes", "< Año", "Año >", "Hoxe" }

   ELSEIF ::nLanguage = L_SPANISH
      ::aMESES := { "Enero", "Febrero", "Marzo", "Abril", ;
         "Mayo", "Junio", "Julio", "Agosto", ;
         "Septiembre", "Octubre", "Noviembre", "Diciembre" }

      ::aDiaSemana   := { "Lunes", "Martes", "Miercoles", "Jueves", ;
         "Viernes", "Sabado", "Domingo" }

      ::aTitBoton    := { "&-Mes", "&+Mes", "-Año", "+Año", "Hoy" }

   ELSEIF ::nLanguage = L_ITALIANO
      ::aMESES := { "Gennaio", "Febbraio", "Marzo", "Aprile", ;
         "Maggio", "Giugno", "Luglio", "Agosto", ;
         "Settembre", "Ottobre", "Novembre", "Dicembre" }

      ::aDiaSemana   := { "Lunedi", "Martedi", "Mercoledi", "Giovedi", ;
         "Venerdi", "Sabato", "Domenica" }

      ::aTitBoton    := { "&-Mese", "&+Mese", "-Anno", "+Anno", "Oggi" }

   ELSEIF ::nLanguage = L_ENGLISH
      ::aMESES := { "Jannuary", "February", "March", "April", ;
         "May", "June", "July", "August", ;
         "September", "October", "November", "December" }

      ::aDiaSemana   := { "Monday", "Tuesday", "Wednesday", "Thursday", ;
         "Friday", "Saturday", "Sunday" }

      ::aTitBoton    := { "&-Month", "&+Month", "-Year", "+Year", "Today" }

   ELSEIF ::nLanguage = L_FRANCAIS
      ::aMESES := { "Janvier", "Février", "Mars", "Avril", ;
         "Mai", "Juin", "Juillet", "Août", ;
         "Septembre", "Octobre", "Novembre", "Decembre" }

      ::aDiaSemana   := { "Lundi", "Mardi", "Mercredi", "Jeudi", ;
         "Vendredi", "Samedi", "Dimanche" }

      ::aTitBoton    := { "&-Mois", "&+Mois", "-An", "+An", "Auj'hui" }

   ELSEIF ::nLanguage = L_DEUSTCH
      ::aMESES := { "Januar", "Februar", "März", "April", ;
         "Mai", "Juni", "Juli", "August", ;
         "September", "Oktober", "November", "Dezember" }

      ::aDiaSemana   := { "Montag", "Dienstag", "Mittwoch", "Donnerstag", ;
         "Freitag", "Samstag", "Sonntag" }

      ::aTitBoton    := { "&-Monat", "&+Monat", "-Jahr", "+Jahr", "Heute" }

   ENDIF

// Para realimentar los datos fechas con los nuevos valores.
   ::FijarFecha( ::dFechaControl )

   RETURN NIL

STATIC FUNCTION CalcularAncho( nEspacioIzq, nWidth )

   LOCAL nColumnaAncho

   nColumnaAncho := Int( ( nWidth - nEspacioIzq ) / 7 )

   RETURN nColumnaAncho

STATIC FUNCTION CalcularAlto( nHeight )

   LOCAL nFilaAlto

   nFilaAlto := Int( ( nHeight - 1 ) / 8 )

   RETURN nFilaAlto

STATIC FUNCTION MarcarDia( hDC, aPuntos, nColor )

   // Se crea el lapiz a utilizar.y se carga.
   LOCAL hPen1        := CreatePen( PS_SOLID, 3, nColor )
   LOCAL hPenAnterior := SelectObject( hDC, hPen1 )

   // Se dibuja el rectangulo
   MoveTo( hDC, aPuntos[ 2 ] + 1, aPuntos[ 1 ] + 1 )
   LineTo( hDC, aPuntos[ 4 ] - 3, aPuntos[ 1 ] + 1 )
   LineTo( hDC, aPuntos[ 4 ] - 3, aPuntos[ 3 ] - 2 )
   LineTo( hDC, aPuntos[ 2 ] + 1, aPuntos[ 3 ] - 2 )
   LineTo( hDC, aPuntos[ 2 ] + 1, aPuntos[ 1 ] + 1 )

   // Se destruyen objetos utilizados
   SelectObject( hDC, hPenAnterior )
   IF !DeleteObject( hPen1 )
      MsgInfo( "El objeto no se destruyo" )
   ENDIF

   RETURN NIL

STATIC FUNCTION FormarFrase( ElNumero )

   // ElNumero      , corresponde al numero que se debera frasear.

   // Se definen variables locales de control.
   LOCAL Pon_la_Y   := ""
   LOCAL Pon_Mil    := ""
   LOCAL CtrlTexto  := ""    // Almacenara a ELNUMERO en formato texto.
   LOCAL FraseNumero := ""
   LOCAL ValorPos[ 11 ]
   LOCAL Num_A[ 30 ]
   LOCAL Num_B[ 9 ]
   LOCAL Num_C[ 10 ]

   // Se llenan matricez de control de palabras.
   Num_A[  1 ] = ""           ; Num_A[ 16 ] = "Quince "
   Num_A[  2 ] = "Un "        ; Num_A[ 17 ] = "Dieciseis "
   Num_A[  3 ] = "Dos "       ; Num_A[ 18 ] = "Diecisiete "
   Num_A[  4 ] = "Tres "      ; Num_A[ 19 ] = "Dieciocho "
   Num_A[  5 ] = "Cuatro "    ; Num_A[ 20 ] = "Diecinueve "
   Num_A[  6 ] = "Cinco "     ; Num_A[ 21 ] = "Veinte "
   Num_A[  7 ] = "Seis "      ; Num_A[ 22 ] = "Veintiun "
   Num_A[  8 ] = "Siete "     ; Num_A[ 23 ] = "Veintidos "
   Num_A[  9 ] = "Ocho "      ; Num_A[ 24 ] = "Vientitres "
   Num_A[ 10 ] = "Nueve "     ; Num_A[ 25 ] = "Veinticuatro "
   Num_A[ 11 ] = "Diez "      ; Num_A[ 26 ] = "Veinticinco "
   Num_A[ 12 ] = "Once "      ; Num_A[ 27 ] = "Veintiseis "
   Num_A[ 13 ] = "Doce "      ; Num_A[ 28 ] = "Veintisiete "
   Num_A[ 14 ] = "Trece "     ; Num_A[ 29 ] = "Veintiocho "
   Num_A[ 15 ] = "Catorce "   ; Num_A[ 30 ] = "Veintinueve "

   Num_B[  1 ] = "Diez "      ; Num_C[  1 ] = ""
   Num_B[  2 ] = "Veinte "    ; Num_C[  2 ] = "Ciento "
   Num_B[  3 ] = "Treinta "   ; Num_C[  3 ] = "Doscientos "
   Num_B[  4 ] = "Cuarenta "  ; Num_C[  4 ] = "Trescientos "
   Num_B[  5 ] = "Cincuenta " ; Num_C[  5 ] = "Cuatrocientos "
   Num_B[  6 ] = "Sesenta "   ; Num_C[  6 ] = "Quinientos "
   Num_B[  7 ] = "Setenta "   ; Num_C[  7 ] = "Seiscientos "
   Num_B[  8 ] = "Ochenta "   ; Num_C[  8 ] = "Setecientos "
   Num_B[  9 ] = "Noventa "   ; Num_C[  9 ] = "Ochocientos "
   Num_C[ 10 ] = "Novecientos "

   // Se vacias valores de control
   CtrlTexto    = Str( ElNumero, 8, 0 )
   ValorPos[ 1 ] = Val( SubStr( CtrlTexto, 8, 1 ) )
   ValorPos[ 2 ] = Val( SubStr( CtrlTexto, 7, 1 ) )
   ValorPos[ 3 ] = Val( SubStr( CtrlTexto, 6, 1 ) )
   ValorPos[ 4 ] = Val( SubStr( CtrlTexto, 5, 1 ) )
   ValorPos[ 5 ] = Val( SubStr( CtrlTexto, 4, 1 ) )
   ValorPos[ 6 ] = Val( SubStr( CtrlTexto, 3, 1 ) )
   ValorPos[ 7 ] = Val( SubStr( CtrlTexto, 2, 1 ) )
   ValorPos[ 8 ] = Val( SubStr( CtrlTexto, 1, 1 ) )
   ValorPos[ 9 ] = Val( SubStr( CtrlTexto, 7, 2 ) )
   ValorPos[ 10 ] = Val( SubStr( CtrlTexto, 4, 2 ) )
   ValorPos[ 11 ] = Val( SubStr( CtrlTexto, 1, 2 ) )

   // Se comienza a generar la frase de control comenzando por las
   // unidades.
   Pon_la_Y = IF( ValorPos[ 1 ] = 0, "", "y " )
   IF ValorPos[ 2 ] < 3
      FraseNumero = Num_A[ ValorPos[ 9 ] + 1 ]
   ELSE
      FraseNumero = Num_B[ ValorPos[ 2 ] ] + Pon_la_Y + ;
         IF( ValorPos[ 9 ] > 20, Num_A[ ValorPos[ 1 ] + 1 ], "" )
   ENDIF

   // se continua formado la frase para las centenas
   Num_C[ 2 ] = IF( ( ValorPos[ 1 ] + ValorPos[ 2 ] ) = 0, "Cien ", "Ciento " )
   FraseNumero = Num_C[ ValorPos[ 3 ] + 1 ] + FraseNumero

   // se continua formado la frase para los miles
   Pon_Mil  = IF( ( ValorPos[ 4 ]  + ValorPos[ 5 ] + ValorPos[ 6 ] ) = 0, "", "Mil " )
   Pon_la_Y = IF( ValorPos[ 4 ] = 0, "", "y " )

   IF ValorPos[ 5 ] < 3
      FraseNumero = Num_A[ ValorPos[ 10 ] + 1 ] + Pon_Mil + FraseNumero
   ELSE
      FraseNumero = Num_B[ ValorPos[ 5 ] ] + Pon_la_Y + ;
         Num_A[ ValorPos[ 4 ] + 1 ] + Pon_Mil + FraseNumero
   ENDIF

   RETURN  FraseNumero

// -> FIM DO PROGRAMA
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Tema calendario nuevamente.

Postby karinha » Thu Jul 04, 2024 1:11 pm

Code: Select all  Expand view

//----------------------------------------------------------------------------//
//  AUTOR.....: Manuel Exp¢sito Su rez    Soft 4U '98                         //
//  e-Mail....: maex14@dipusevilla.es                                         //
//  CLASE.....: Obj2Hb.CH                                                     //
//  FECHA MOD.: 10/11/2000                                                    //
//  VERSION...: 9.00                                                          //
//  PROPOSITO.: Compatibiliza HARBOUR OOP con Objects                         //
//----------------------------------------------------------------------------//


#ifdef __HARBOUR__

    #xtranslate AS ALL     => AS ANYTYPE     // Compatible con OBJECTS
    #xtranslate AS BLOCK   => AS CODEBLOCK

    // Extraido de Objects.ch

    #xcommand DEFAULT <Desc> [, <DescN> ]      => ;
                      __DFT__( <Desc> ) [ ; __DFT__( <DescN> ) ]

    #xtranslate __DFT__( <Var> := <Dft> ) => ;
                if( <Var> == nil, <Var> := <Dft>, )

    #xtranslate __DFT__( <Var> = <Dft> )  => ;
                __DFT__( <Var> := <Dft> )

    #xtranslate BYNAME <V> [, <VN> ]     => ::<V> := <V> [; ::<VN> := <VN> ]
    #xtranslate BYNAME <V> DEFAULT <Val> => ::<V> := BYDEFAULT <V>, <Val>
    #xtranslate BYDEFAULT <V>, <Val>     => if( <V> == NIL, <Val>, <V> )
    #xtranslate BYNAME <V> IFNONIL       => ;
                                if <V> != NIL ;;
                                    ::<V> := <V> ;;
                                end
    #xtranslate BYDEFAULT <V>, <Val>     => if( <V> == NIL, <Val>, <V> )

    #include "HBClass.ch"

#else

    #include "Objects.ch"

#endif

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


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 60 guests