Como mudar o título de um dia no FWCalendar

No artigo de hoje, vou mostrar como mudar o título de um dia na montagem de um FWCalendar.

Esse artigo foi montado com a ajuda do grande Alexandre Behling ( LinkedIn ).

Antes de começarmos o tutorial, se você nunca usou FWCalendar, segue um artigo com exemplo completo – Exemplo de tela com FWCalendar.

Agora vindo para nosso exemplo, em uma tela feito com FWCalendar, usuários me perguntaram se existia a possibilidade de alterar o título de um dia, para identificar se é um Feriado ou um Fim de Semana.

Então na montagem do calendário, a lógica seria a seguinte:

  • Durante o laço de repetição que percorre todos os dias
  • Pega o dia atual, e deixa com dois dígitos
  • Se o dia atual não for uma data válida
  • Se o dia da semana for 1 (domingo) ou 7 (sábado), terá o texto FDS, senão terá o texto Feriado
  • Define o texto e a cor do texto como vermelho
  • Se a data for válida, será apenas o dia e a cor do texto em azul

Abaixo um print de exemplo do mês de Janeiro de 2021:

Exemplo da tela com título alterado

E abaixo o código fonte desenvolvido:

dDataAtu := oCalend:aCell[nCell][DATADIA]
cObsText := ""
cDia := StrZero(Day(dDataAtu), 2)

//Se a data não for válida
If DataValida(dDataAtu) != dDataAtu
	
	//Se for domingo ou sábado, será FDS senão será FERIADO
	If Dow(dDataAtu) == 1 .Or. Dow(dDataAtu) == 7
		cObsText := "FDS"
	Else
		cObsText := "FERIADO"
	EndIf

	//Define o título da célula
	cHtml := '<html><p style="color: #ff0000;"><b>' + cDia + ' - ' + cObsText + '</b></p></html>'
	oCalend:aCell[nCell][OBJETO]:oEditTitle:cTitle := cHtml
Else
	//Define o título da célula
	cHtml := '<html><p style="color: #0000ff;"><b>' + cDia + '</b></p></html>'
	oCalend:aCell[nCell][OBJETO]:oEditTitle:cTitle := cHtml
EndIf

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 Responses

  1. Francisco disse:

    Tem o código fonte atualizado deste calendário? Gostaria de saber o código para criar o link para altera o Mês / Ano do calendário. O fonte disponibilizado não contém essa funcionalidade.

    • Bom dia Francisco. Tenho sim, basicamente a lógica é assim:
      1. Crie um label que ficará entre os dois botões de navegação, e esse label terá uma função quando clicar nele (obs.: crie a variável oMesAtual como Private no começo da função)
      2. Nessa função, você adiciona um Pergunte ou ParamBox solicitando a data
      3. O usuário confirmando, ai você aciona a função para atualizar o mês/ano
      4. Por último, na função de mudar o mês e o ano, você atualiza o label

      Abaixo os trechos conforme a lógica acima:

      //1. Crie um label que ficará entre os dois botões de navegação, e esse label terá uma função quando clicar nele
      //.......
      oMesAtual := TSay():New(0, 0, {|| }, oPanTitulo, , , , , , .T., 20, 20, , , , , , , , .T.)
      oMesAtual:Align := CONTROL_ALIGN_ALLCLIENT
      oMesAtual:nClrPane := nCorFundo
      oMesAtual:bLClicked := {|| FwMsgRun(Nil, {|| fMudMesAno()}, Nil, "Montando calendário...")}
      //......
      
      //2. Nessa função, você adiciona um Pergunte ou ParamBox solicitando a data
      Static Function fMudMesAno()
      	Local aArea := GetArea()
      	Local aPergs := {}
      	Local dData := sToD(cAno + cMes + "01")
      	Local nMonth := 0
      	Local nYear := 0
      
      	//Adiciona os parâmetros
      	aAdd(aPergs, {09, "Selecione uma data para atualizar o calendário", 200, 40, .T.}) 
      	aAdd(aPergs, {01, "Data",      dData,    "", ".T.",           "",    ".T.",    80,  .T.})
      
      	//Se a pergunta for confirmada
      	If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bValid*/, /*aButtons*/, /*lCentered*/, /*nPosX*/, /*nPosY*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
      		nMonth := Month(MV_PAR02)
      		nYear  := Year(MV_PAR02)
      
      		//3. O usuário confirmando, ai você aciona a função para atualizar o mês/ano
      		oCalend:SetCalendar( oPanCalend, cValToChar(nMonth), cValToChar(nYear) )
      		fMesAno(nMonth, nYear)
      	EndIf
      
      	RestArea(aArea)
      Return
      
      4. Por último, na função de mudar o mês e o ano, você atualiza o label
      //.........
      cMesAno := Capital(MesExtenso(nMonth)) + " / " + cValToChar(nYear)
      cTexto += '<p align="center">'
      cTexto += '<font face="' + cFontUti + '" color="#000000" style="font-size:14px"><strong>' + cMesAno + '</strong> (<u>clique aqui</u> para mudar mês/ano)</font>'
      cTexto += '</p>'
      oMesAtual:SetText(cTexto)
      
      //.........
      

Deixe uma resposta