A classe FWCalendar cria um calendário, permitindo que o usuário adicione informações sobre  eventos e/ou descrições às suas respectivas datas.


Métodos:



New

Método de criação do objeto da classe


FWCalendar(): New ( < nMes>, < nAno> ) --> oSelf



NomeTipoDescriçãoObrigatórioReferência
nMesNuméricoMês de ReferênciaX
nAnoNuméricoAnode ReferênciaX


oSelf
    ()
  • Objeto criado



Activate

Método para a ativação da classe


FWCalendar(): Activate ( < oDlg > ) -->



NomeTipoDescriçãoObrigatórioReferência
oDlg ObjetoObjeto onde será inserido o calendárioX




AvalFocus

Método responsável por controlar o foco da célula corrente


FWCalendar(): AvalFocus ( ) -->



CreateCell

Método responsável por criar os objetos para as células do calendário


FWCalendar(): CreateCell ( < oDlg> ) -->



NomeTipoDescriçãoObrigatórioReferência
oDlgObjetoObjeto onde está inserido o calendárioX




Destroy

Método destrutor do objeto


FWCalendar(): Destroy ( < oDlg> ) -->



NomeTipoDescriçãoObrigatórioReferência
oDlgObjetoObjeto onde está inserido o calendárioX




GetInfo

Método responsável por extrair a informação de uma célula


FWCalendar(): GetInfo ( < cId> ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
cIdCaracterId da célula do calendárioX


cRet
    (caracter)
  • Retorna a informação da célula de acordo com o Id


HtmlDay

Método responsável por retornar o Html inicial da célula do dia ativo


FWCalendar(): HtmlDay ( [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
lHtmlLógicoAtribuir .F. para texto simples ou .T. para texto Html


cRet
    (caracter)
  • Retorna a string Html


HtmlDayOff

Método responsável por retornar o Html inicial da célula de dia inativo


FWCalendar(): HtmlDayOff ( ) --> cRet

cRet
    (caracter)
  • Retorna a string Html


HtmlFooter

Método responsável por retornar o Html inicial da célula de rodapé


FWCalendar(): HtmlFooter ( ) --> cRet

cRet
    (caracter)
  • Retorna a string Html


HtmlHeader

Método responsável por retornar o Html inicial da célula do cabeçalho


FWCalendar(): HtmlHeader ( ) --> cRet

cRet
    (caracter)
  • Retorna a string Html


HtmlToday

Método responsável por retornar o Html inicial da célula da data atual


FWCalendar(): HtmlToday ( [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
lHtmlLógicoAtribuir .F. para texto simples ou .T. para texto Html


cRet
    (caracter)
  • Retorna a string Html


HtmlWeek

Método responsável por retornar o Html inicial da célula da mesma


FWCalendar(): HtmlWeek ( ) --> cRet

cRet
    (caracter)
  • Retorna a string Html


HtmlWeekend

Método responsável por retornar o Html inicial da célula de dia de fim de semana


FWCalendar(): HtmlWeekend ( [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
lHtmlLógicoAtribuir .F. para texto simples ou .T. para texto Html


cRet
    (caracter)
  • Retorna a string Html


IdDay

Método responsável por retornar o ID de um dia do mês


FWCalendar(): IdDay ( < Retorna o Id da célula do calendário> ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
Retorna o Id da célula do calendárioNuméricoDia de referênciaX


cRet
    (caracter)
  • Retorna o Id da célula do calendário


nAtCell

Método responsável por retornar a posição de uma célula no vetor de controle


FWCalendar(): nAtCell ( < cId> ) --> nPos



NomeTipoDescriçãoObrigatórioReferência
cIdCaracterId da célula do calendárioX


nPos
    ()
  • Retorna a posição da célula no vetor de controle


ReCalcSets

Método responsável por recalcular o posicionamento do calendário


FWCalendar(): ReCalcSets ( ) -->



SetCalendar

Método responsável por configurar o calendário para um mês/ano determinado


FWCalendar(): SetCalendar ( < oDlg>, < nMes>, < nAno> ) -->



NomeTipoDescriçãoObrigatórioReferência
oDlgObjetoObjeto onde está inserido o calendárioX
nMesNuméricoMês de referênciaX
nAnoNuméricoAno de referênciaX




SetDay

Método responsável por definir o conteúdo das células do calendário referentes aos dias ativos


FWCalendar(): SetDay ( < nDia>, [ cTexto ], [ cTextoCab ], [ lHtml ] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
nDiaNuméricoDia de referênciaX
cTexto CaracterTexto para a montagem do Html

cTextoCab CaracterTexto para a montagem do cabeçalho Html

lHtml LógicoVerifica se os textos para montagem estão ou não no formato Html


cRet
    (caracter)
  • Retorna a string Html


SetDayOff

Método responsável por definir o conteúdo das células do calendário referentes aos dias inativos


FWCalendar(): SetDayOff ( < nDia >, [ cTexto ], [ lHtml ] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
nDia NuméricoDia de referênciaX
cTexto CaracterTexto para a montagem do Html

lHtml LógicoVerifica se o texto para montagem está ou não no formato Html


cRet
    (caracter)
  • Retorna a string Html


SetFooter

Método responsável por definir o conteúdo do rodapé


FWCalendar(): SetFooter ( [ cTexto], [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
cTextoCaracterTexto para a montagem do Html

lHtmlLógicoVerifica se o texto para montagem está ou não no formato Html


cRet
    (caracter)
  • Retorna a string Html


SetHeader

Método responsável por definir o conteúdo das células do calendário referentes ao cabeçalho


FWCalendar(): SetHeader ( [ cTexto], [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
cTextoCaracterTexto para a montagem do Html

lHtmlLógicoVerifica se o texto para montagem está ou não no formato Html


cRet
    (caracter)
  • Retorna a String Html


SetInfo

Método responsável por definir uma informação a ser exibida na célula


FWCalendar(): SetInfo ( < cId>, < uContent>, [ lHtml] ) -->



NomeTipoDescriçãoObrigatórioReferência
cIdCaracterId da célula do calendárioX
uContentArray of RecordString ou vetor de strings contendo as informações ou descrições dos itens referentes a cada célulaX
lHtmlLógicoVerifica se o texto para montagem está ou não no formato Html




SetWeek

Método responsável por definir o conteúdo das células do calendário referentes à semana


FWCalendar(): SetWeek ( [ cTexto], [ lHtml] ) --> cRet



NomeTipoDescriçãoObrigatórioReferência
cTextoCaracterTexto para a montagem do Html

lHtmlLógicoVerifica se o texto para montagem está ou não no formato Html


cRet
    (caracter)
  • Retorna a string Html


StartCell

Método responsável por inicializar os dados de células


FWCalendar(): StartCell ( < oDlg> ) -->



NomeTipoDescriçãoObrigatórioReferência
oDlgObjetoObjeto onde será inserido o calendárioX




StartControl

Método responsável por inicializar os dados de controle


FWCalendar(): StartControl ( ) -->



StartLayout

Método responsável por inicializar os dados de layout


FWCalendar(): StartLayout ( ) -->



StartMonth

Método responsável por inicializar os dados de um novo mês/ano


FWCalendar(): StartMonth ( < nMes>, < nAno> ) -->



NomeTipoDescriçãoObrigatórioReferência
nMesNuméricoMês de referênciaX
nAnoNuméricoAno de referênciaX






Exemplo de Implementação
#INCLUDE "PROTHEUS.CH"
#DEFINE ID         1 // Id do Celula
#DEFINE OBJETO     2 // Objeto de Tela
#DEFINE DATADIA    3 // Data Completa da Celula
#DEFINE DIA        4 // Dia Ref. Data da Celula
#DEFINE MES        5 // Mes Ref. Data da Celula
#DEFINE ANO        6 // Ano Ref. Data da Celula
#DEFINE NSEMANO    7 // Semana do Ano Ref. Data da Celula
#DEFINE NSEMMES    8 // Semana do Mes Ref. Data da Celula
#DEFINE ATIVO      9 // É celula referente a um dia ativo
#DEFINE FOOTER    10 // É celula referente ao rodape
#DEFINE HEADER    11 // É celula referente ao Header
#DEFINE SEMANA    12 // É celula referente a semana
#DEFINE BGDefault 13 // Cod de BackGround da Celula

/*/
{Protheus.doc} TestCalend
Função de exemplo de uso do metodo FWCalendar
@type  User Function
@author Bruno Pirolo
@since 04/11/2021
@return Nil
/*/
User Function TestCalend()
Local oDlg
Local cMes    
Local cAno    
Local cMesAno 
Local oCalend
Local nI
Local aList
Local aItems := {'item1','item2','item3'}

Private dDatabase

cMes        := StrZero(Month( Date() ), 2)
cAno        := StrZero(Year(  Date() ), 4)
cMesAno     := AllTrim(cMes)+'/'+AllTrim(cAno)
dDatabase   := Date()

Define MsDialog oDlg Title 'Calendário ' + StrTran( cMesAno, '/', ' / ' )  From 0, 0 To 768,1024 Pixel

oTela := FWFormContainer():New( oDlg )

cIdCalen  := oTela:createHorizontalBox(92)
cIdRodape := oTela:createHorizontalBox(08)
cIcoCalen := oTela:createVerticalBox( 05, cIdRodape )
cIcoBotoes:= oTela:createVerticalBox( 95, cIdRodape )

oTela:Activate( oDlg, .F. )

oTelaCaled := oTela:GetPanel( cIdCalen   )
oTelaIcoCa := oTela:GetPanel( cIcoCalen  )
oTelaIcoBt := oTela:GetPanel( cIcoBotoes )

oCalend             := FWCalendar():New( VAL(cMes), VAL(cAno) )
oCalend:blDblClick  := {|aInfo                  | DuploClick( oDlg, oTelaCaled, oCalend, aInfo ) }
oCalend:bRClicked   := {|aInfo, oObj, nRow, nCol| Direita('Botao da Direita ['  + aInfo[1] + ']', oObj, nRow, nCol    ) }
oCalend:aNomeCol    := {'Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado', 'Semana' }

// Exibe ou nao a coluna de semana
oCalend:lWeekColumn := .F. 

// Exibe ou nao o rodape
oCalend:lFooterLine := .F.

//Atribuindo conteúdo as datas
oCalend:Activate( oTelaCaled )

aList = Array(Len( oCalend:aCell ))

For nI := 1 To Len( oCalend:aCell )	
    If oCalend:aCell[nI][ATIVO]		
        oCalend:SetInfo( oCalend:aCell[nI][ID], aItems )	
    ElseIf oCalend:aCell[nI][SEMANA]	
    ElseIf oCalend:aCell[nI][FOOTER]		
        oCalend:SetInfo( oCalend:aCell[nI][ID], 'Rodapé' )	
    EndIf
Next

@0, 0 BTNBMP oButCal Resource "BTCALEND" Size 24, 24 Of oTelaIcoCa Pixel 

oButCal:cToolTip := "Alterar calendário..."

oButCal:bAction := { || dDiaSel := TrocaCalend( oDlg, CTod( '01/' + oCalend:cRef ) ) , oCalend:SetCalendar( oTelaCaled, Month( dDiaSel ) , Year( dDiaSel ) ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef, JogaTexto( oCalend ) }
oButCal:Align := CONTROL_ALIGN_ALLCLIENT
oCalend:SetInfo( oCalend:IdDay( 20 ), '<td>10</td><td>30</td><td>20</td>', .T.)
oCalend:SetInfo( oCalend:IdDay( 21 ), '<td><tr><td>10</td><td>30</td><td>20</td></tr><tr><td>30</td><td>30</td><td>30</td></tr></td>', .T.)
oCalend:SetInfo( oCalend:IdDay( 22 ), '<td>10</td><td>30</td><td>20</td>', .T.)
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+015 Button oBtn Prompt '01/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '01', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+040 Button oBtn Prompt '02/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '02', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+065 Button oBtn Prompt '03/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '03', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+090 Button oBtn Prompt '04/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '04', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+115 Button oBtn Prompt '05/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '05', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+05, oTelaIcoBt:nLeft+140 Button oBtn Prompt '06/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '06', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+015 Button oBtn Prompt '07/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '07', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+040 Button oBtn Prompt '08/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '08', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+065 Button oBtn Prompt '09/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '09', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+090 Button oBtn Prompt '10/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '10', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+115 Button oBtn Prompt '11/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '11', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
@ oTelaIcoBt:nTop+15, oTelaIcoBt:nLeft+140 Button oBtn Prompt '12/2011' Size 25, 10 Of oTelaIcoBt Pixel Action ( oCalend:SetCalendar( oTelaCaled, '12', '2011' ) , oDlg:cTitle := 'Calendário ' + oCalend:cRef )
oDlg:lMaximized := .T.

Activate MsDialog oDlg Centered

Return NIL

/*/
{Protheus.doc} DuploClick
Função de exemplo de uso do metodo FWCalendar
@type  Static Function
@author Bruno Pirolo
@since 04/11/2021
@return Nil
/*/
Static function DuploClick( oDlg, oTelaCaled, oCalend, aInfo )
Local nCelPos   as numeric
Local nItemPos   as numeric
Local cIdAtivo  as character
Local cConteudo as character

MsgInfo("Primeiro exemplo - Partindo do objeto oCalend")

    //Pega o ID selecionado
    cIdAtivo    := oCalend:CIDACTIVE

    //Utiliza o metodo GetInfo() para pegar a informação principal da célula (neste caso o dia)
    cConteudo   := Right(oCalend:GetInfo(cIdAtivo), 2)

    //Pega o indice da célula selecionada
    nCelPos := oCalend:nAtCell(cIdAtivo)

    If oCalend:aCell[nCelPos, 9]
        //Se possuir ListBox
        If oCalend:aCell[nCelPos, 14]
            //Verifica a celula selecionada
            nItemPos := oCalend:aCell[nCelPos, 2]:oListBoxContent:nAt

            //Verifica se tem uma celula posicionada
            If !Empty(nItemPos)
                Alert("Dia: "+cConteudo+" - Conteudo ListBox - "+oCalend:aCell[nCelPos, 2]:oListBoxContent:aItems[nItemPos])
            Else
                Alert("Dia: "+cConteudo+" - Conteudo ListBox - Nenhum item selecionado")
            EndIf
        EndIf
    Else
        Alert("Célula inativa, não pode ser acessada.")
    EndIf

MsgInfo("Segundo exemplo - Partindo do parametro que o componente já disponibiliza no evento de duplo clique, que já corresponde a célula.")

    //Pega o ID selecionado
    cIdAtivo    := oCalend:CIDACTIVE

    //Utiliza o metodo GetInfo() para pegar a informação principal da célula (neste caso o dia)
    cConteudo   := Right(oCalend:GetInfo(cIdAtivo), 2)

    If aInfo[9]
        //Se possuir ListBox
        If aInfo[14]
            //Verifica a celula selecionada
            nItemPos := aInfo[2]:oListBoxContent:nAt

            //Verifica se tem uma celula posicionada
            If !Empty(nItemPos)
                Alert("Dia: "+cConteudo+" - Conteudo ListBox - "+aInfo[2]:oListBoxContent:aItems[nItemPos])
            Else
                Alert("Dia: "+cConteudo+" - Conteudo ListBox - Nenhum item selecionado")
            EndIf
        EndIf
    Else
        Alert("Célula inativa, não pode ser acessada.")
    EndIf

Return    


Layout da tela: