Página 1 de 1

Calendário pra marcar datas

Enviado: 07 Jun 2025 10:54
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.

Calendário pra marcar datas

Enviado: 07 Jun 2025 11:57
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.

Calendário pra marcar datas

Enviado: 13 Jun 2025 14:19
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.