Hola colega, querÃa tener un calendario con xbrowse asi que aca esta para quienes quieren ocuparlo o mejorarlo.
aca una Imagen
y aca el codigo:
STATIC oDlg,oFecha,oCal,oBtn ,cPrompt
STATIC cMeses := { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", ;
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }
function Main()
SET EPOCH TO 2005
SET DATE FORMAT "dd-mm-yyyy"
CalendarView( Date() )
return nil
// ----------------------------------------------
// Ventana Calendario
// ----------------------------------------------
function CalendarView( dFecha )
local oDlg, oBrw,oFntCal,oBtnPrev ,oBtnNext ,i,oBtnText,n
local aDatos := CalendarArray( dFecha )
LOCAL nFondo := RGB(200, 200, 255) // Color gris claro
LOCAL nTexto := RGB(0, 0, 0) // Negro
cPrompt:= cMeses[MONTH(dFecha )]+" "+ Str(YEAR(dFecha),4)DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, -16
DEFINE DIALOG oDlg FROM 370,890 TO 680,1160 PIXEL STYLE DS_MODALFRAME FONT oFntCal //| WS_BORDER | WS_POPUP
@ 15,1 XBROWSE oBrw OF oDlg ARRAY aDatos ;
COLUMNS 1,2,3,4,5,6,7 ;
HEADERS "Lun","Mar","Mié","Jue","Vie","Sáb","Dom" ;
SIZE 142, 110 PIXEL;
JUSTIFY AL_CENTER,AL_CENTER,AL_CENTER,AL_CENTER,AL_CENTER,AL_CENTER,AL_CENTER;
COLSIZES 35,35,35,35,35,35,35
oBrw:nStretchCol := STRETCHCOL_WIDEST
oBrw:CreateFromCode()
obrw:nColDividerStyle := LINESTYLE_RAISED
oBrw:nRowDividerStyle := LINESTYLE_RAISED
oBrw:lRecordSelector := .F.
oBrw:nHeaderHeight := 30
oBrw:lHScroll := .T.
oBrw:lVScroll := .T.
oBrw:l2007 := (.F.)
oBrw:bClrHeader := { || {CLR_WHITE,RGB(134, 219, 9)} }
FOR n = 1 TO Len( oBrw:aCols )
oBrw:aCols[n]:nHeadStrAlign:= AL_CENTER
* oBrw:aCols[n]:bClrStd := { || ChangeColor( oBrw, n,dFecha ) }NEXT
oBrw:aCols[1]:bClrStd := {
oBrw:aCols[2]:bClrStd := {
oBrw:aCols[3]:bClrStd := {
oBrw:aCols[4]:bClrStd := {
oBrw:aCols[5]:bClrStd := {
oBrw:aCols[6]:bClrStd := {
oBrw:aCols[7]:bClrStd := { || ColorCelda( oBrw, 7,dFecha ) }
*/
@ 00,05 BTNBMP oBtnPrev PROMPT "<" OF oDlg SIZE 20, 14 PIXEL ;
ACTION ( dFecha := AddMonth( dFecha, -1 ), ;
aDatos := CalendarArray( dFecha ), ;
oBrw:SetArray( aDatos ), ;
oBrw:Refresh(), ;
ActualizarBotones( oBtnPrev, dFecha, oDlg,oBtnText ) )
oBtnPrev:lTransparent = .F.
oBtnPrev:SETCOLOR(CLR_WHITE,RGB(134,219,9 ))
@ 00,113 BTNBMP oBtnNext PROMPT ">" OF oDlg SIZE 20, 14 PIXEL ;
ACTION ( dFecha := AddMonth( dFecha, 1 ), ;
aDatos := CalendarArray( dFecha ), ;
oBrw:SetArray( aDatos ), ;
oBrw:Refresh(), ;
ActualizarBotones( oBtnPrev, dFecha, oDlg,oBtnText ) )
oBtnNext:lTransparent = .F.
oBtnNext:SETCOLOR(CLR_WHITE,RGB(134,219,9 ))
@ 00,24 BTNBMP oBtnText PROMPT cPrompt OF oDlg SIZE 90, 14 PIXEL ;
oBtnText:lTransparent = .F.
oBtnText:SETCOLOR(CLR_WHITE,RGB(134,219,9 ))ACTIVATE DIALOG oDlg CENTER on init (oBtnPrev:Hide())
return nil
// Función para controlar el estado del botón
static function ActualizarBotones( oBtnPrev, dFecha, oDlg,oBtnText )
local dHoy := Date()
cPrompt:= cMeses[MONTH(dFecha )]+" "+ Str(YEAR(dFecha),4)if Month(dFecha) == Month(dHoy) .and. Year(dFecha) == Year(dHoy)
*oBtnPrev:Disable()
oBtnPrev:Hide()
else
oBtnPrev:Enable()
oBtnPrev:Show()
endif
oBtnText:Setcolor(CLR_WHITE,RGB(134, 219, 9 ))
oBtnText:setText(cPrompt )
oBtnText:Refresh()
return nil
// ----------------------------------------------------
// Genera un calendario mensual (6x7)
// ----------------------------------------------------
function CalendarArray( dFecha )
local aCal := {}
local dPrimDia, nDiaSemana, nDiasMes
local i, j, nDia := 1
// Primer dÃa del mes (sin CTOD)
dPrimDia := dFecha - ( Day( dFecha ) - 1 )
// DOW: Domingo=1 ? cambiamos a Lunes=1
nDiaSemana := DOW( dPrimDia )
if nDiaSemana == 1
nDiaSemana := 7
else
nDiaSemana--
endif
// dÃas del mes
nDiasMes := Day( EOM( dFecha ) )
// crear matriz 6x7
for i := 1 to 6
aAdd( aCal, Array(7) )
next
// llenar calendario
for i := 1 to 6
for j := 1 to 7
if (i == 1 .and. j < nDiaSemana) .or. nDia > nDiasMes
aCal[j] := ""
else
aCal[j] := LTrim( Str( nDia ) )
nDia++
endif
next
next
return aCal
STATIC FUNCTION ColorCelda( oBrw, nCol, dFecha )
LOCAL aColor := { CLR_BLACK, CLR_WHITE }
LOCAL nFila := oBrw:nArrayAt
LOCAL nDia
local dHoy := Date()
local nColorBkg := CLR_WHITE
local cValue := oBrw:SelectedCol():Value
IF nFila > 0 .AND. nFila <= 7
TRY
nDia:= oBrw:aArrayData[ nFila ][ nCol ]
If Year(dFecha) == Year(dHoy) .and. Month(dFecha) == Month(dHoy)
If ValType( nDia ) == "N"
if val(nDia) < Day(dHoy)
aColor := { RGB( 180, 180, 180 ),CLR_WHITE } // GRIS para dÃas pasados
elseif Val(nDia) == Day(dHoy)
aColor := { CLR_WHITE,RGB(134, 219, 9) }
endifEndif
Endif
CATCH
// Si el XBrowse intenta inventar una fila, devolvemos color neutro
aColor := { CLR_BLACK, CLR_WHITE }
END
Endif
RETURN aColor
Saludos
