Esse esquema de reaproveitar, igual usei pra exemplos, é muito legal.
Ajustei mais um pouco, e agora são 3 fontes.
O básico: calendário de um mês, é usado em todos os outros, mas pode compilar sozinho.
Código: Selecionar todos
#include "hwgui.ch"
STATIC nRowPos := -1, nColPos := -1
FUNCTION OneMonth( lWithDialog, oDlg, oButton, dDate )
LOCAL nCont, xValue, dDatRef, nMes
hb_Default( @lWithDialog, .T. )
SET DATE BRITISH
IF oButton == Nil
oButton := Array(31)
ENDIF
IF dDate == Nil
dDate := Date()
ENDIF
dDatRef := dDate - 1
nMes := Month( dDate )
nColPos := -1
nRowPos := -1
IF lWithDialog
INIT DIALOG oDlg ;
TITLE "Test Month" ;
AT 1,1 ;
SIZE 770, 548 ;
STYLE WS_SYSMENU + WS_SIZEBOX + WS_VISIBLE
ENDIF
FOR nCont = 1 TO 7
@ 20 + ( ( nCont - 1 ) * 50 ), 40 SAY Left( CDOW( Stod( "20250601" ) + nCont ), 3 ) ;
SIZE 45, 30
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
/* button
@ ColPos(), nRowPos BUTTON oButton[ xValue ] ;
CAPTION StrZero( xValue, 2 ) ;
SIZE 30, 30 ;
; // FONT oFont ;
STYLE WS_TABSTOP + BS_FLAT ;
ON CLICK { || Routine( dDatRef + xValue ) }
*/
@ ColPos(), nRowPos CHECKBOX oButton[ xValue ] ;
CAPTION Ltrim( Str( xValue ) ) ;
SIZE 50, 30
ENDIF
NEXT
NEXT
IF lWithDialog
ACTIVATE DIALOG oDlg CENTER
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
O segundo que já tinha postado, ajustei pro nome do mês, e pra um ano.
É um ano inteiro em tabs, e chama o do mês 12 vezes.
Código: Selecionar todos
/*
oneyear.prg
*/
#include "hwgui.ch"
FUNCTION OneYear( lWithDialog, oDlg, nYear )
LOCAL oTab, nCont, oButton[ 12, 31 ], aItem, dDate
hb_Default( @lWithDialog, .T. )
hb_Default( @nYear, 2025 )
FOR EACH aItem IN oButton
AFill( aItem, .F. )
NEXT
IF lWithDialog
INIT DIALOG oDlg ;
TITLE "Test Month" ;
AT 1,1 ;
SIZE 770, 548 ;
STYLE WS_SYSMENU + WS_SIZEBOX + WS_VISIBLE
ENDIF
@ 20, 80 TAB oTab ;
ITEMS {} ;
OF oDlg ;
SIZE 504, 341 ;
STYLE WS_CHILD + WS_VISIBLE
FOR nCont = 1 TO 12
dDate := Stod( StrZero( nYear, 4 ) + StrZero( nCont, 2 ) + "01" )
BEGIN PAGE CMonth( dDate ) OF oTab
OneMonth( .F., oTab, oButton[ nCont ], dDate )
END PAGE OF oTab
NEXT
@ 30, 500 BUTTON "showAll" SIZE 100,20 ON CLICK { || Show(oButton) }
IF lWithDialog
ACTIVATE DIALOG oDlg CENTER
ENDIF
RETURN Nil
STATIC FUNCTION Show( aValue )
LOCAL cTxt := "", oMonth, oDay
FOR EACH oMonth IN aValue
FOR EACH oDay IN oMonth
IF ValType( oDay ) == "O" .AND. oDay:Value
cTxt += Dtoc( Stod( "2025" + StrZero( oMonth:__EnumIndex(), 2 ) + StrZero( oDay:__EnumIndex(), 2 ) ) ) + " "
ENDIF
NEXT
NEXT
hwg_MsgInfo( cTxt )
RETURN Nil
E agora mais um, pra ano anterior, atual e seguinte.
Chama o fonte de ano 3 vezes.
Código: Selecionar todos
/*
test.prg
*/
#include "hwgui.ch"
FUNCTION Test()
LOCAL oDlg, oTab, nCont, nYear := 2025
INIT DIALOG oDlg ;
TITLE "Test Month" ;
AT 1,1 ;
SIZE 800, 600 ;
STYLE WS_SYSMENU + WS_SIZEBOX + WS_VISIBLE
@ 20, 10 TAB oTab ;
ITEMS {} ;
OF oDlg ;
SIZE 750, 550 ;
STYLE WS_CHILD + WS_VISIBLE
FOR nCont = 1 TO 3
BEGIN PAGE Str( nYear - 2 + nCont, 4 ) OF oTab
OneYear( .F., oTab, nYear - 2 + nCont )
END PAGE OF oTab
NEXT
ACTIVATE DIALOG oDlg CENTER
RETURN Nil
Curiosidade:
HMG 3 e HMG Extended não fazem isso, o nível de tab é só um.
HWGUI, OOHG e FIVEWIN conseguem.
Lembrando que aqui poderia ser o cadastro do funcionário, com o ano em uma aba.
Pode não ser algo tão fora do comum usar mais tabs.