Jump to content
Fivewin Brasil

evertonlb

Membros
  • Posts

    733
  • Joined

  • Last visited

  • Days Won

    18

Reputation Activity

  1. Like
    evertonlb reacted to Luiz Fernando in Android - iOS - Windows Phone   
    Aqui já uso a windev mobile a uns 5 anos, utilizando banco de dados local no aparelho(sqllite) e tb usando banco de dados externo(mysql), a empresa windev existe deste 1993, todos anos tem versão nova, hoje tb tenho modulo utilizando a windev desktop, aonde utilizo junto com meu sistema de fivewin.
    Abraços
  2. Like
    evertonlb reacted to kleyber in Android - iOS - Windows Phone   
    Dê uma olhada no Windev Mobile. Vale à pena o investimento. Agora quanto ao Fivetouch...
  3. Like
    evertonlb reacted to kapiaba in Impressora Epson L365   
    nRowStep = oPrn:nVertRes() / 20 // We want 20 rows
    nColStep = oPrn:nHorzRes() / 15 // We want 15 cols

    ou,

    // fonte indicada:
    DEFINE FONT oFont NAME "Courier New" SIZE 0, -10 OF oPrn

    nRowStep = oPrn:nVertRes() / 40
    nColStep = oPrn:nHorzRes() / 40 // We want 15 cols

    // ex:
    oPrn:Say( nRowStep * nColStep, 1, MemoLine( cText,, n + 1 ), oFont )

    procure por oPrn:nVertRes() // como imprimir em qualquer impressora.


  4. Like
    evertonlb got a reaction from toya in Software Grátis - giveawayoftheday   
    O site
    http://pt.giveawayoftheday.com/
    tem para download softwares completos e grátis todos os dias. Os softwares ficam disponíveis durante 24 horas.
    São registrados como uma versão especial.. Não shareware nem demo. As limitações nestas versões são ausência de suporte ou atualizações...
    Estou acompanhando este site já faz tempo... as vezes tem algo interessante, noutras nem tanto. Vale a pena dar uma olhada sempre.
    Att.
    Everton
  5. Like
    evertonlb got a reaction from frkiko in Software Grátis - giveawayoftheday   
    O site
    http://pt.giveawayoftheday.com/
    tem para download softwares completos e grátis todos os dias. Os softwares ficam disponíveis durante 24 horas.
    São registrados como uma versão especial.. Não shareware nem demo. As limitações nestas versões são ausência de suporte ou atualizações...
    Estou acompanhando este site já faz tempo... as vezes tem algo interessante, noutras nem tanto. Vale a pena dar uma olhada sempre.
    Att.
    Everton
  6. Like
    evertonlb got a reaction from jfaguiar in Impressora Epson L365   
    Olha brother..
    Se serve de alento tô numa situação mais complicada que isso. Não consegui fazer os relatórios serem impressos corretamente em diversas impressoras... Tenho uma Multifuncional Samsung e nela os relatório ficam uma beleza, mas em qualquer outra impressora a coisa fica feia... Já tentei algumas coisas que peguei em dicas e no fórum mesmo, mas até agora nada funcionou a contento. Felizmente dos quatro únicos clientes que estão usando softwares em FW, 3 tem impressoras Samsung. O outro, o que não tem Samsung, só está vendo os relatórios no vídeo até eu não arrumar essa bronca... Ajudar não ajudei. Essa foi só para você não se sentir sozinho! hahahahahahah
    Att.
    Everton
  7. Like
    evertonlb got a reaction from kapiaba in Software Grátis - giveawayoftheday   
    O site
    http://pt.giveawayoftheday.com/
    tem para download softwares completos e grátis todos os dias. Os softwares ficam disponíveis durante 24 horas.
    São registrados como uma versão especial.. Não shareware nem demo. As limitações nestas versões são ausência de suporte ou atualizações...
    Estou acompanhando este site já faz tempo... as vezes tem algo interessante, noutras nem tanto. Vale a pena dar uma olhada sempre.
    Att.
    Everton
  8. Like
    evertonlb reacted to kapiaba in SAT e QRCODE   
    Sim, mas não tenho mais o fonte, pois isso foi para um cliente, e ele teve que comprar uma versão atualizada do Fivewin, junto ao Gilmer Tavares para poder compilar o fonte que eu enviei para ele. abs,
  9. Like
    evertonlb got a reaction from kapiaba in Impressora Epson L365   
    Olha brother..
    Se serve de alento tô numa situação mais complicada que isso. Não consegui fazer os relatórios serem impressos corretamente em diversas impressoras... Tenho uma Multifuncional Samsung e nela os relatório ficam uma beleza, mas em qualquer outra impressora a coisa fica feia... Já tentei algumas coisas que peguei em dicas e no fórum mesmo, mas até agora nada funcionou a contento. Felizmente dos quatro únicos clientes que estão usando softwares em FW, 3 tem impressoras Samsung. O outro, o que não tem Samsung, só está vendo os relatórios no vídeo até eu não arrumar essa bronca... Ajudar não ajudei. Essa foi só para você não se sentir sozinho! hahahahahahah
    Att.
    Everton
  10. Like
    evertonlb reacted to kapiaba in Leitor e gravador de Cartão com chip   
    Pessoas, vamos tentar entender como funciona?
    http://www.4shared.com/zip/8M95BlSCce/Realtek_SimEdit_SDK_20130516.html
    abs.
  11. Like
    evertonlb reacted to kapiaba in Problemas com Imagens - Resolvido 66%   
    Envie para mim, que eu disponibilizo no www.4shared.com não sei porque o Gilmer não está aprovando os downloads.
    kapiabafwh@bol.com.br ou no meu skype.
    abs.
  12. Like
    evertonlb got a reaction from kapiaba in Problemas com Imagens - Resolvido 66%   
    Nossa Kapiaba.. funcionou direitinho cara!!! A visualização das imagens tá muito bacana.
    Consegui a TScan. Tinha ela guardada aqui numa pasta de download de coisas do FW. Inclusive coloquei em dicas.. O Scanner ta funcionando legal mesmo, scaneia e grava o arquivo como nome definido pelo sistema, etc, etc...
    Agora só falta eu acertar a WebCam... Mas isso é coisa pra daqui uns 10 dias..
    Obrigado pela ajuda!
    Att.
    Everton
  13. Like
    evertonlb reacted to kapiaba in Falsos boletos   
    Everton e Leonardo, o que se pode fazer neste caso para proteger a empresa? Ontem mesmo, um hacker atacou um cliente, e destruiu todos os bancos de dados que não estavam abertos na memória(sorte, é que tinha backup), como se proteger disto?
    O que vocês fazem, ou fariam?
  14. Like
    evertonlb reacted to evertonlb in Falsos boletos   
    Pode ser isso e ainda, venda de Banco de Dados das.:
    Associações Comerciais,
    Empresa de fornecimento de energia
    Água
    Telefonia, etc....
    Juntando isso a um spyware que envia dados dos e-mail recebidos pra conta da "pilantrage" é um prato cheio.
    Tu sabe, se tiver um CNPJ válido dá pra saber toda a vida e todos os dados da empresa e dos sócios..
    Uma vez, eu precisei contactar um empresário, mas eu só tinha o telefone da empresa e no momento ninguém estava trabalhando, então falei com um amigo que tem uma
    empresa de assessoria de cobrança... passei o nome da empresa e em alguns minutos ele me ligou passando os 3 números de celular do cara, endereço, número de telefone da casa, nome da mãe e telefone da mãe, CNPJ e endereço da empresa... É mole?
    Infelizmente estes "boletos" vão ser cada vez mais comuns...
    Os empresários tem que estar ligados pra não pagar contas indevidas... Dureza brother!!
    Att.
    Everton
  15. Like
    evertonlb reacted to sygecom in Falsos boletos   
    http://www.empresascnpj.com/
  16. Like
    evertonlb got a reaction from kapiaba in Falsos boletos   
    Pode ser isso e ainda, venda de Banco de Dados das.:
    Associações Comerciais,
    Empresa de fornecimento de energia
    Água
    Telefonia, etc....
    Juntando isso a um spyware que envia dados dos e-mail recebidos pra conta da "pilantrage" é um prato cheio.
    Tu sabe, se tiver um CNPJ válido dá pra saber toda a vida e todos os dados da empresa e dos sócios..
    Uma vez, eu precisei contactar um empresário, mas eu só tinha o telefone da empresa e no momento ninguém estava trabalhando, então falei com um amigo que tem uma
    empresa de assessoria de cobrança... passei o nome da empresa e em alguns minutos ele me ligou passando os 3 números de celular do cara, endereço, número de telefone da casa, nome da mãe e telefone da mãe, CNPJ e endereço da empresa... É mole?
    Infelizmente estes "boletos" vão ser cada vez mais comuns...
    Os empresários tem que estar ligados pra não pagar contas indevidas... Dureza brother!!
    Att.
    Everton
  17. Like
    evertonlb got a reaction from kapiaba in Problemas com Imagens - Resolvido 66%   
    Obrigado Kapiaba.. to longe do escritório agora.. mas assim que chegar testarei!
    Obrigado mesmo!
    Att.
    Everton
  18. Like
    evertonlb got a reaction from Ronaldbuch in Desconto na compra do FastReport   
    Bom dia amigos.
    Creio que vários de vocês já receberam e-mails com este assunto...
    de qqer maneira, repasso.
    Quem fizer a inscrição para o Congresso de FireBird ganha os descontos descritos nesta página.
    http://www.firebirddevelopersday.com.br/fdd/2015/descontos.html?utm_source=acbr&utm_medium=email&utm_campaign=acbr28jul
    Att.
    Everton
  19. Like
    evertonlb got a reaction from Ronaldbuch in Curso de LINUX - Free   
    Amigos, ha alguns dias atras eu tive contato com um curso grátis de linux.
    Tem um e-book grátis também..
    Eu ainda não tive tempo de ler e colocar em pratica.
    Agora tem um curso online que me parece ser bem bacana tambem.
    http://profissionaislinux.com.br/como-comecar-com-linux/
    AI o link.
    Att.
    Everton
  20. Like
    evertonlb got a reaction from kapiaba in Calendário   
    Perfeito Kapiaba... Obrigado cara.. Muito obrigado mesmo!!!
    Att.
    Everton
  21. Like
    evertonlb reacted to kapiaba in Calendário   
    *******************************************************
    * Clase para mostrar y gestionar Calendarios en FW *
    * Desarrollada por Rodrigo Soto y Bingen Ugaldebere *
    * 2.002 - 2.003 *
    *******************************************************

    #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 .not. ::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",;
    "Sexta","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


  22. Like
    evertonlb got a reaction from kapiaba in Calendário   
    Obrigado kapiaba... Vou testar agora!!
  23. Like
    evertonlb reacted to kapiaba in Calendário   
    //----------------------------------------------------------------------------//
    // 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

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


  24. Like
    evertonlb reacted to Alain da Silva in Calendário   
    everton, é praticamente o código que postei. Nesse eu coloquei mais dois botões, sair e transportar a data.
  25. Like
    evertonlb got a reaction from Ronaldbuch in Relatório travando - RESOLVIDO   
    Boa tarde pessoas!!
    Estou com um problema muito interessante. Tenho um relatório de "fechamento de caixa" que está meu deixando louco!!!
    Este relatório de fechamento é um relatório que pega vários dados de vários arquivos ( DBF ).. vê o que foi vendido, o que foi
    cobrado, as saídas de grana e entradas.. enfim um relatório de fechamento normal, comum... o que esta acontecendo é que este
    bendito relatório só funciona quando ninguém mais esta no sistema. Se tiver 2 micros executando o meu software o relatório não sai.
    O micro fica "pensando", "pensando" e não sai nada. Depois de 10 minutos eu clico em qqer lugar e me da a mensagem que o
    software não responde!!!!
    Se somente um micro tiver executando o software e mandar sair o relatório demora uns 15 a 20 segundos... tempo que considero aceitável... Mas o engraçado é que é somente este relatório... os outros funciona muito bem...
    Se eu tirar os relatórios de vendas, recebimentos, crédito e débito ou cancelamentos separadamente.. sai no mesmo segundo, praticamente imediato ao clique no botão, mas este "fechamento" não.. parece que se acha especial, que quer ser diferente dos outros! rsrsrsrs
    Bom, o relatório é igual aos outros, não mudo nada, só tenho todas as pesquisas com softseek on, pois pego tudo por data!
    Alguém já passou por isso? Alguém tem alguma dica?
×
×
  • Create New...