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 ) )
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
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.
