Calendário pra marcar datas

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Calendário pra marcar datas

Mensagem por JoséQuintas »

O mesmo exemplo de hwgui agora em minigui.

Aqui democalmonth.prg, compilado sozinho cria o calendário do mês atual.

Código: Selecionar todos

/*
democalmonth.prg
*/

#include "minigui.ch"

STATIC nRowPos := -1, nColPos := -1

FUNCTION DemoCalMonth( lWithDialog, xParent, oButton, dDate )

   LOCAL nCont, xValue, dDatRef, nMes

   hb_Default( @lWithDialog, .T. )

   SET WINDOW MAIN OFF

   IF oButton == Nil
      oButton := Array(31)
   ENDIF
   IF dDate == Nil
      dDate := Date()
   ENDIF

   dDatRef := dDate - Day( dDate )
   nMes    := Month( dDate )

   nColPos := -1
   nRowPos := -1

   IF lWithDialog
      DEFINE WINDOW ( xParent := Ze_Name( "DLG" )  ) ;
         AT 1, 1 ;
         WIDTH 800 ;
         HEIGHT 600;
         TITLE hb_Dtoc( dDatRef + 1, "YYYY-MM" ) ;
         FONT "Arial" SIZE 18
      END WINDOW
   ENDIF
   FOR nCont = 1 TO 7

      DEFINE LABEL ( ze_Name( "LBL" ) )
         PARENT ( xParent )
         COL 20 + ( ( nCont - 1 ) * 50 )
         ROW 40
         WIDTH 45
         HEIGHT 30
         VALUE Upper( Left( CDOW( Stod( "20250601" ) + nCont ), 3 ) )
      END LABEL

   NEXT
   IF Dow( dDatRef - 1 ) != 7
      FOR nCont = 1 TO Dow( dDatRef - 1 )
         ColPos()
      NEXT
   ENDIF
   FOR nCont = 1 TO 31
      FOR EACH xValue IN { nCont }
         IF Month( dDatRef + xValue ) == nMes
            DEFINE CHECKBOX ( oButton[ nCont ] := ze_Name( "CHK" ) )
               PARENT ( xParent )
               COL ColPos()
               ROW nRowPos
               WIDTH 45
               HEIGHT 30
               CAPTION Ltrim( Str( nCont ) )
            END CHECKBOX

         ENDIF
      NEXT
   NEXT

   IF lWithDialog
      DoMethod( xParent, "CENTER" )
      DoMethod( xParent, "ACTIVATE" )
   ENDIF

   RETURN Nil

STATIC FUNCTION ColPos()

   IF nColPos == -1
      nColPos := 20
      nRowPos := 80
   ELSE
      nColPos += 50
      IF nColPos > 350
         nRowPos += 40 // LINE_HEIGHT
         nColPos := 20
      ENDIF
   ENDIF

   RETURN nColPos

FUNCTION ze_Name( cPrefix )

   STATIC nIndex := 0

   nIndex += 1

   RETURN cPrefix + Ltrim( Str( nIndex ) )
democalmonth.png
Agora democalyear.prg, que chama democalmonth.prg 12 vezes.

Código: Selecionar todos

/*
democalyear.prg
*/

#include "minigui.ch"

FUNCTION DemoCalYear()

   LOCAL xTab, nCont, oButton[ 12, 31 ], aItem, dDate, nYear := 2025, xDlg

   SET WINDOW MAIN OFF

   FOR EACH aItem IN oButton
      AFill( aItem, .F. )
   NEXT

      DEFINE WINDOW ( xDlg := Ze_Name( "DLG" )  ) ;
         AT 1, 1 ;
         WIDTH 800 ;
         HEIGHT 600;
         TITLE "2025" ;
         FONT "Arial" SIZE 18
      END WINDOW

   DEFINE TAB ( xTab := Ze_Name( "TAB" ) ) ;
      PARENT ( xDlg ) ;
      AT 080, 20 ;
      WIDTH 504 ;
      HEIGHT 341 ;
      HOTTRACK

   FOR nCont = 1 TO 12

      dDate := Stod( StrZero( nYear, 4 ) + StrZero( nCont, 2 ) + "01" )

      PAGE cMonth( dDate )

      DemoCalMonth( .F., xTab, oButton[ nCont ], dDate )

      END PAGE

   NEXT

   END TAB

   DEFINE BUTTONEX ( ze_Name( "BTN" ) )
      PARENT ( xDlg )
      ROW         500
      COL         30
      WIDTH       100
      HEIGHT      20
      CAPTION     "ShowAll"
      ACTION      Show( oButton, xDlg, xTab)
      FLAT       .T.
      NOXPSTYLE  .T.
   END BUTTONEX

   DoMethod( xDlg, "CENTER" )
   DoMethod( xDlg, "ACTIVATE" )

   (xTab)

   RETURN Nil

FUNCTION Show( oButton, xDlg, xTab )

   LOCAL cTxt := "", oMonth, oDay

   FOR EACH oMonth IN oButton
      FOR EACH oDay IN oMonth
         IF ! Empty( oDay ) .AND. GetProperty( xDlg, oDay, "Value" ) // error
            cTxt += Dtoc( Stod( "2025" + StrZero( oMonth:__EnumIndex(), 2 ) + StrZero( oDay:__EnumIndex(), 2 ) ) ) + " "
         ENDIF
      NEXT
   NEXT
   MsgBox( cTxt )

   (xDlg);(xTab) // warning -w3 -es2

   RETURN Nil
democalyear.png
Tudo variável local, acesso ao ano todo em democalyear.prg, mesmo com checkmark sendo feita em democalmonth.prg

Lembrando:
Internamente a HMG3 faz uso de variável pública pra criar controles, mas HMG Extended não.
Mesmo assim, dá pra usar desse jeito na HMG3, alterando CHs.
De modo simples: não importa o nome de nada, uso variável do tipo que eu quiser, com o nome que eu quiser.
Pra mim, isso é mais poderoso do que a fake oop.
TODOS OS CHECKBOX DE TODOS OS MESES EM UMA ÚNICA VARIÁVEL ARRAY.
O array criado em democalyear.prg.
O array utilizado em democalmonth.prg.
E democalmonth.prg pode ser compilado sozinho e funcionar sozinho só pra um mês, sem a variável de democalyear.prg.
Como eu disse, acho poderoso trabalhar desse jeito, sem fake oop.

Nota:
Ainda não peguei o jeito de visual bonito, mas dá pra brincar bastante.
Meu uso real está sendo fivewin, mas procurando não esquecer como cada lib funciona.

No caso desse multiuso, só é possível usando SET MAIN WINDOW OFF.
Não seria possível um exemplo chamar o outro, se os dois tivessem MAIN.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Calendário pra marcar datas

Mensagem por JoséQuintas »

O que merece destaque nesse exemplo:

O simples fato de definir variáveis de um tipo que facilita tudo.

Se é LIB minigui, hwgui, fivewin, console, tanto faz.
A variável array, com sua propriedade de ser passada por referência, facilitou tudo.

No caso mais específico da minigui, o fato de não ter nome fixo para os controles.
Isso permitiu usar o mesmo fonte de mês 12 vezes.
A cada execução do fonte (12 vezes), o nome de checkbox é outro.
Já pensou, criar 365 variáveis pra nomear checkbox ? seria uma loucura mexer no fonte.
Com a fake OOP, aquilo de checkbox.value, teria que criar 365 controles.
É sobre isso que estou comentando.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Calendário pra marcar datas

Mensagem por JoséQuintas »

hwguical.png
democalmonth.prg - calendário de um mês
democalyear.prg - calendário de um ano, reutilizando o democalmonth.prg, chamando 12 vezes
democal3years.prg - calendário de 3 anos, reutilizando o democalyear.prg 3 vezes, o que chama o democalmonth.prg 36 vezes

demoall.prg
- na aba Month chama democalmonth.prg
- na aba Year chama democalyear.prg
- na aba 3Years chama democal3years.prg
Totais: democal3years.prg chamado 1 vez, democalyear.prg chamado 4 vezes, democalmonth.prg chamado 49 vezes.
Isso só na abertura do demoall

Sei lá... até agora hwgui aguentou firme, sem limites.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder