Jump to content
Fivewin Brasil

helio1361303486

Membros
  • Posts

    408
  • Joined

  • Last visited

Posts posted by helio1361303486

  1. Dá para colocar uma foto no documento Word através da TWord?

    Tipo assim:

    oWord:Replace( "[FOTO]" ,"C:\FOTOS\FOTO.JPG" )

    Não queria ter que colocar a foto via Word, e sim via programação.

    Grato.

    Hélio

    xHarbout/WS/PellesC

  2. Rapaz, será que terá que formatar por causa disso?

    se for assim, dá medo de usar MySql !

    Por isso que o FireBird é bonzim, não tem raizes criadas no windows que dá sangramento se tiver que desinstalar etc.

    Não usei o MySql, só instalei uma vez e fiz 2 testes, mas me lembro que mesmo com a sequencia de instalação que tem em dicas, teve um problema de ele não funcionar direito.

    Mas acredito que tenha um outro jeito de contornar essa situação, pois isso não é possível ter que formatar o HD.

    Helio

    xHarbour/WS/PellesC

  3. Jef,

    Fica na casa do amigo Kapiaba. rsss

    brincadeirinha.:-)

    Em se tratando de hoteis, quanto mais perto do centro velho mais barato fica. Pois na região da Paulista é "finesse" e costuma ser bem caro.

    Se você vier com equipamentos que dá para carregar nas mãos, você pode ficar em qualquer hotel perto do metrô, pois tem uma estação que desemboca à 17 passos da porta do prédio da SoftwareExpress.

    Hélio

    xHarbour/WS/PellesC

  4. Pessoal,

    No fim da reportagem vcs viram que custa 50 mil para montar uma empresa para distribuir o software livre? eles trabalham de graça? tudo é dinheiro. nada é de graça no fim tem custo sim. é ilusão.

    Outra coisa: Tudo é passageiro, tudo depois se resolve e vira em torno do $DINHEIRO$, nossa sociedade é gulosa demais e gananciosa, e logo, isso se resolve e passa como moda de sapato.

    Veja o ser humano é tão hipócrita, que mesmo que JESUS CRISTO viesse exclusivamente para ele e o convencesse de que era mesmo JESUS, ele com o tempo logo deixaria isso de lado e procuraria viver com a ganância. e quando alguém perguntasse: e aí você viu Jesus, ele responde: Ah ! é mesmo, já até havia me esquecido.

    O povo esquece, o povo vive pelo dinheiro. e esse "negócio" de software livre viverá, mais o dinheiro ainda fala mais alto.

    Não se preocupem com isso, sempre irá ter empresários precisando de nossos serviços, direta ou indiretamente.

    Minha opnião.

    Hélio

    xHarbour/WS/PellesC

  5. Pessoal,

    Qual o melhor para usar, em se tratando de facilidade, velocidade, e um certo desapego ao criador, limitações, preço.

    Sei que aqui no forum usam muito o SQLLIB, mas queria saber qual a opnião de alguns de vocês sobre esses dois RDDs, Gostaria que deixassem de lado a afinidade pessoal, e colocassem seus reais pensamentos sobre as ferramentas.

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  6. Pessoal,

    Qual o melhor para usar, em se tratando de facilidade, velocidade, e um certo desapego ao criador, limitações, preço.

    Sei que aqui no forum usam muito o SQLLIB, mas queria saber qual a opnião de alguns de vocês sobre esses dois RDDs, Gostaria que deixassem de lado a afinidade pessoal, e colocassem seus reais pensamentos sobre as ferramentas.

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  7. Luiz e Julio,

    Até consegui usar esta classe do PellesC, e clicando no dia ele responde com a data selecionada OK.

    Agora só resta, quando ir clicando nos dias que desejamos ele ir marcando/pintando esses dias por exemplo com a cor verde.

    Onde se faz isso? qual classe esta? pois a que tem no exemplo é tão pequena e parece não ter onde alterar isso...

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  8. Luiz, nuito obrigado pela sua ajuda.

    Estou usando esta classe, porque ela faz algumas coisas que preciso, veja:

    preciso criar uma dialog que tenha os 12 meses nela.

    DEFINE DIALOG oDlg....

    oCal1:= TMonthCal():New( oDlgLan,4001) .......

    oCal2:= TMonthCal():New( oDlgLan,4002) .......

    .

    .

    oCal12:= TMonthCal():New( oDlgLan,4012) .......

    ACTIVATE DIALOG oDlg.....

    Preciso que quando clicar em qualquer dos 12 meses com o mouse no dia que deseja o mesmo seja PINTADO de uma cor. Isso porque preciso selecionar alguns dias nos 12 meses. Entende?

    Também se der para prever a tecla direita do mouse para colocar outras acções...

    Se der pra fazer isso com essa classe, seria GENIAL!!!

    Mas o mais importante é ir clicando nos dias dos 12 meses e esses dias serem marcados de uma cor.

    Será que dá?

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  9. Não deu certo. Segue o código da classe.

    *******************************************************

    * Clase para mostrar y gestionar Calendarios en FW *

    * Desarrollada por Rodrigo Soto y Bingen Ugaldebere *

    * 2.002 - 2.003 *

    *******************************************************

    #include "\FWH\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(3) 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 .F.

    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 "Otro Mes"

    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 := { 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

    ::aFecha[ 3] := CTOD( ::cDiaMes + "/" + STRZERO(::nMesNumero, 2) + "/" + ::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"}

    *::aTitBoton := {"< MÛs", "MÛs >", "< Ano", "Ano >", "Hoje"}

    ::aTitBoton := {" ", " ", " ", " ", " "}

    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

  10. Estou usando a classe Tcalendario:

    o problema é o seguinte:

    No PellesC criei uma dialog inserindo o calendário e dei o número do ID qualquer 101

    no:

    DEFINE DIALOG .....

    oPrueba:= TMiCalendario(): New ( 5,5,50,30,oDlg,oFont)

    ACTIVATE DIALOG...

    Quando entra pela PRIMEIRA vez nesta dialog, tudo bem !!!!

    mas se fechar e tornar à abrir a dialog dá erro dizendo que não existe o ID 102.

    Quer dizer: cada vez que ele entra na dialog esta somando +1 ao controle e dizendo que este não existe.

    Queria que ele usasse apenas o controle 101 que foi dado no pellesc SEMPRE que entrar quantas vezes fosse nesta dialog.

    Tem alguma solução?

    Obrigado.

    Hélio

    xHarbour/WS/PellesC

  11. Estou usando a classe Tcalendario:

    o problema é o seguinte:

    No PellesC criei uma dialog inserindo o calendário e dei o número do ID qualquer 101

    no:

    DEFINE DIALOG .....

    oPrueba:= TMiCalendario(): New ( 5,5,50,30,oDlg,oFont)

    ACTIVATE DIALOG...

    Quando entra pela PRIMEIRA vez nesta dialog, tudo bem !!!!

    mas se fechar e tornar à abrir a dialog dá erro dizendo que não existe o ID 102.

    Quer dizer: cada vez que ele entra na dialog esta somando +1 ao controle e dizendo que este não existe.

    Queria que ele usasse apenas o controle 101 que foi dado no pellesc SEMPRE que entrar quantas vezes fosse nesta dialog.

    Tem alguma solução?

    Obrigado.

    Hélio

    xHarbour/WS/PellesC

  12. No caso, se você desejar que todas as suas MsgInfo, msgAlert, Msgstop, sejam substituidas pelas que você fabricou, é só colocar no inicio das LIB no arquivo de compilação que o compilador pegará sempre o primeiro(suas novas msgs) e desprezará as originais. Dessa forma não será preciso alterar uma linha se quer nos fontes já feitos, quando não quiser mais as suas é só "quitar" as suas do arquivos de compilação.

    Hélio

    xHarbour/WS/PellesC

  13. Senhores amigos,

    Sei que existe o SQL, MySql, FireBird etc, que dá uma segurança ao banco de dados, Tanto na segurança de registros em tráfego, quanto à curiosos que

    possam copiar o banco de dados para análise ou até mesmo alterar, neste caso a senha inibe esse tipo de prática.

    Mas.... e para quem AINDA usa .DBF ??

    exite alguma forma de proteger o acesso ?

    Pois o DBF fica visivel demais, podendo ser aberto até pelo Excel !

    Existe alguma forma de bloquear essa abertura?

    Sei que existe uma opção de você coloca no inicio do arquivo um caracter

    para que não possa ser aberto nem pelo DBU, e só desbloquear quando entrar

    no sistema, Mas e quando se trata de rede local? como ficaria?

    Em resumo... existe alguma forma de se trabalhar com DBF tendo uma segurança

    no quesito de não acesso à CURIOSOS?

    SQLLIB é uma solução, mas uso muitos browses, e não queria abrir mão deles pela facilidade que disponibiliza, e pelo que tenho ouvido é que fica lento "corrijam-me se estiver equivocado". E também não tenho muito tempo para alterar toda esquemática do programa para poder usar á sqllib ou outro rdd.

    Abraço à todos.

    Heliotines

    xHarbour/WS/PellesC

  14. Senhores amigos,

    Sei que existe o SQL, MySql, FireBird etc, que dá uma segurança ao banco de dados, Tanto na segurança de registros em tráfego, quanto à curiosos que

    possam copiar o banco de dados para análise ou até mesmo alterar, neste caso a senha inibe esse tipo de prática.

    Mas.... e para quem AINDA usa .DBF ??

    exite alguma forma de proteger o acesso ?

    Pois o DBF fica visivel demais, podendo ser aberto até pelo Excel !

    Existe alguma forma de bloquear essa abertura?

    Sei que existe uma opção de você coloca no inicio do arquivo um caracter

    para que não possa ser aberto nem pelo DBU, e só desbloquear quando entrar

    no sistema, Mas e quando se trata de rede local? como ficaria?

    Em resumo... existe alguma forma de se trabalhar com DBF tendo uma segurança

    no quesito de não acesso à CURIOSOS?

    SQLLIB é uma solução, mas uso muitos browses, e não queria abrir mão deles pela facilidade que disponibiliza, e pelo que tenho ouvido é que fica lento "corrijam-me se estiver equivocado". E também não tenho muito tempo para alterar toda esquemática do programa para poder usar á sqllib ou outro rdd.

    Abraço à todos.

    Heliotines

    xHarbour/WS/PellesC

  15. Valdir,

    realmente setando para A4 não dá o tamanho real de um papel A4, fica cortando. então tive que redefinir assim e deu certo.

    oPrn:SetSize(2100,3100)

    se colocar 2970 que é o comprimento do papel ele corta. então aumentei para 3100 aí belezinha.

    Hélio

    xHarbour/WS/PellesC

  16. Porque uma foto impressa na TPrinter, fica tão ruim tanto no preview como na impressão no papel?

    Vejam como foi feito:

    Na Dialog....

    REDEFINE IMAGE oImg cImg ID 100 OF oDlg ADJUST

    cImg := "MinhaFoto.JPG"

    oImg:LoadBmp(cImg)

    oImg:Refresh()

    Depois no Printer.

    Prn:SayImage( 800, 2385, oImg,400,420 )

    Alguém saberia responder porque fica ruim a impressão?

    Minha impressora é uma jato de tinta epson, mas esta e outras fotos impressas pelo windows fica show.

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  17. Porque uma foto impressa na TPrinter, fica tão ruim tanto no preview como na impressão no papel?

    Vejam como foi feito:

    Na Dialog....

    REDEFINE IMAGE oImg cImg ID 100 OF oDlg ADJUST

    cImg := "MinhaFoto.JPG"

    oImg:LoadBmp(cImg)

    oImg:Refresh()

    Depois no Printer.

    Prn:SayImage( 800, 2385, oImg,400,420 )

    Alguém saberia responder porque fica ruim a impressão?

    Minha impressora é uma jato de tinta epson, mas esta e outras fotos impressas pelo windows fica show.

    Abraços.

    Hélio

    xHarbour/WS/PellesC

  18. Pessoal,

    Este comando não funciona ?

    oFoto := "c:\minhafoto.jpg"

    oPrn:SayImage( 05.35, 14.50, oFoto, 5, 5, 2 )

    Não aparece nada !!!

    tenho uma foto tirada de uma camera digital, e queria imprimi-la em tamanho menor, como ficha de funcionário.

    Tem aguma outra forma de fazer isso ?

    Grato,

    Hélio

    xHarbour/WS/PellesC

  19. Pessoal,

    Este comando não funciona ?

    oFoto := "c:\minhafoto.jpg"

    oPrn:SayImage( 05.35, 14.50, oFoto, 5, 5, 2 )

    Não aparece nada !!!

    tenho uma foto tirada de uma camera digital, e queria imprimi-la em tamanho menor, como ficha de funcionário.

    Tem aguma outra forma de fazer isso ?

    Grato,

    Hélio

    xHarbour/WS/PellesC

  20. rcscoelho,

    FiveWin xHarbour, tá mais do que testado, e a prova esta aí, procure qualquer pessoa que tenha um sistema rodando nesta plataforma e TODOS, veja bem, TODOS falaram muito bem desta incrível ferramenta de programação, à não ser aqueles que não sabem programar nem o forno de micro-ondas. rs.

    Ela é independente, sem amarrações de DLLs, Facílima de usar, LEVÃSSIMA, rapidíssima.

    Qualquer dúvida vc poderá resolver aqui com os nossos mestres APAIXONADOS por FW.

    Cuidado com as fantasias e promessas de outras linguagens consideradas "da moda" ou "da onda", não que elas não fazem o que prometem, é que com FW voce faz: MELHOR, MAIS RÃPIDO, E VC FICA FELIZ (rs), Dà TEMPO PRA TOMAR BREJAS, E O PRINCIPAL, SEU CLIENTE VAI FICAR SATISFEITO, e o final feliz se realiza. rs.

    Desculpe o entusiasmo !!! rs

    Hélio

    xHarbour/WS/PellesC

  21. Agora me lembrei de uma coisa.

    Todo mundo sabe que o preview/printer tem distorções na impressão com impressoras diferentes.

    Neste caso de importar EMF do Corel ou de outro software, fica arriscado, quando jogarmos as informações dentro dos campos dessa armação pronta, pois podem ficar fora do quadro, Isso é um problema.

    Ah não ser que se faça para somente alguns clientes já sabendo a impressora que eles usam e tal, mas para distribuir o software por aí não dá não.

    Poxa, a printer nunca tem atualização nesse sentido né não?

    Hélio

    xHarbour/WS/PellesC

×
×
  • Create New...