Lembre-se sempre verifique e baixe a versão da data mais atual possível, blz.
Temos então um conjunto de funções que cria e manipula um calendário, temos os sinais em que
podemos conectar nossos métodos e fazer o calendário responder por exemplo ao clicar em uma
data ou passar para o próximo mês e ano. Enfim, é bastante coisinha, mas leia o código com
atenção e verá que não é nada difícil.
Vamos ao código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
//simples calendário inclua 'igbr' janela = ig.janela("Exemplo Calendário" ); ig.conecte ( janela , ig.destruido , "ig.fimjanela( )" ); caixah = ig.caixahorizontal ( falso , 0 ); ig.ad ( janela , caixah ); calendario = ig.calendario( ); fonte = ig.fonte_descricao_string( "Arial bold 14"); ig.componente_modifique_fonte ( calendario , fonte ); // Como as variaveis passadas como parametro abaixao nao foram atribuidas ainda //logo elas tem valor nulo, portanto desativa todas as opcoes visuais do programa ig.calendario_opcoes_visual ( calendario, mostre_cabecalho, nao_mude_mes, mostre_nomes_dia, mostre_numeros_semana ); ig.ad ( caixah , calendario ); caixav = ig.caixavertical ( falso , 0 ); ig.ad ( caixah , caixav ); b_mostre_cabecalho = ig.botao_checagem('mostrar cabeçalho'); ig.ad ( caixav , b_mostre_cabecalho ); b_nao_mude_mes = ig.botao_checagem ( 'não mude mês'); ig.ad ( caixav , b_nao_mude_mes ); b_mostre_nomes_dia = ig.botao_checagem ( "mostrar nome dos dias"); ig.ad ( caixav , b_mostre_nomes_dia ); b_mostre_numeros_semana = ig.botao_checagem ( "mostrar numeros das semanas"); ig.ad ( caixav , b_mostre_numeros_semana ); //============================== funcao call back para conectar aos botoes de checagem // Essa funcao abaixo modifica o aspecto visual do calendario conforme o clique dos // botoes checagem funcao botao_exec ( comp , num ) se num == 1 entao se mostre_cabecalho == nulo entao mostre_cabecalho = ig.calendario_mostre_cabecalho ; senao mostre_cabecalho = nulo; fim//fim se mostre_cabecalho == nulo senaose num == 2 entao se nao_mude_mes == nulo entao nao_mude_mes = ig.calendario_nao_mude_mes; senao nao_mude_mes = nulo; fim senaose num == 3 entao se mostre_nomes_dia == nulo entao mostre_nomes_dia = ig.calendario_mostre_nomes_dia; senao mostre_nomes_dia = nulo; fim senaose num == 4 entao se mostre_numeros_semana == nulo entao mostre_numeros_semana = ig.calendario_mostre_numeros_semana; senao mostre_numeros_semana = nulo; fim fim ig.calendario_opcoes_visual ( calendario, mostre_cabecalho, nao_mude_mes, mostre_nomes_dia, mostre_numeros_semana ); fim //fim funcao //conectando o metodo acima ig.conecte ( b_mostre_cabecalho , ig.clique , "botao_exec( %s , 1 )" ); ig.conecte( b_nao_mude_mes , ig.clique , 'botao_exec( %s , 2 )' ); ig.conecte( b_mostre_nomes_dia , ig.clique , 'botao_exec( %s , 3 )' ); ig.conecte ( b_mostre_numeros_semana , ig.clique , 'botao_exec (%s , 4 )' ); //metodos para obter dados do calendário funcao mes_mudado ( calendario ) local t = ig.calendario_obt_data ( calendario ); //retorna uma tabela com os campos ano, mes e dia; imprima ("mes mudou : " .. t.mes ) fim ig.conecte( calendario , ig [ 'mes_mudado' ] , 'mes_mudado(%s)'); funcao dia_selecionado ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima( "Dia selecionado : " .. t.dia ); fim ig.conecte( calendario , ig['dia_selecionado'] , 'dia_selecionado( %s )' ); funcao duplo_dia_selecionado ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima ( "Duplo clique: dia : " .. t.dia ); fim ig.conecte( calendario , ig.dia_selecionado_duplo_clique , 'duplo_dia_selecionado(%s)' ); funcao anterior_mes ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima( "Mes anterior : " .. t.mes ); fim ig.conecte ( calendario , ig.anterior_mes , 'anterior_mes (%s)' ); funcao proximo_mes ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima( 'Proximo mes: ' .. t.mes ); fim ig.conecte( calendario, ig.proximo_mes , 'proximo_mes (%s) ' ); funcao anterior_ano ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima( 'Ano anterior : ' .. t.ano ); fim ig.conecte( calendario , ig.anterior_ano , 'anterior_ano( %s )' ); funcao proximo_ano ( calendario ) local t = ig.calendario_obt_data ( calendario ); imprima( 'Proximo ano : ' .. t.ano ); fim ig.conecte( calendario , ig [ 'proximo_ano'] , 'proximo_ano (%s) ' ); ig.componente_mostre_todos( janela ); ig.fimprograma( ); |
O interessante neste programa é que usamos uma caixa vertical dentro de uma horizontal, você
pode fazer isso com quantas caixas quiser, para que seu programa tenha o layout desejado.
Então, aqui temos algumas novidades:
Criando o calendário:
1 |
calendario = ig.calendario( ); |
O bom é que é possível modificar a fonte do calendário, veja:
carregando a fonte na variável fonte: (lê uma descrição de fonte a partir de uma string)
1 |
fonte = ig.fonte_descricao_string( "Arial bold 14"); |
atribuindo a fonte ao calendário:
Primeiro parâmetro é a variável do calendário, segundo é a variável da fonte criada anteriormente
1 |
ig.componente_modifique_fonte ( calendario , fonte ); |
Poderíamos fazer diretamente assim: ig.componente_modifique_fonte( calendario , “Arial bold 14”);
mas é bom dominar as duas maneiras, eu pessoalmente acho mais flexível criar a fonte separadamente.
Podemos mudar o visual do calendário mostrando ou escondendo partes dele, permitindo que
o mês e o ano possam ou não ser modificados pelos botões << ou >>, veja:
1 2 3 4 5 6 7 |
ig.calendario_opcoes_visual ( calendario, mostre_cabecalho, nao_mude_mes, mostre_nomes_dia, mostre_numeros_semana ); |
Bom está função deve ser analisada com paciência. Poderia muito bem ter uma função para mostrar
ou esconder cada ítem de cada vez não é, mas não tem. Você deve usar unicamente esta função,
veja os parâmetros com cuidado:
calendario = a variável do calendário criado;
mostre_cabecalho = esta é uma variável que criei, seu valor pode ser ig.calendario_mostre_cabecalho para
mostrar o cabeçalho ou nulo para ocultar o cabeçalho do calendário;
nao_mude_mes = é também um variável criada no programa, seu valor pode ser ig.calendario_nao_mude_mes
para o ano e o mês não serem alterados pelo usuário ou nulo para deixar mudar;
mostre_nomes_dia = outra variável criada no programa e pode ter o valor de ig.calendario_mostre_nomes_dia para
mostrar os nomes dos dias da semana ou nulo para ocultar;
mostre_numeros_semana = se seu valor for ig.calendario_mostre_numeros_semana os números aparecerão na lateral,
se for nulo ficam ocultos;
Esta função altera todos os valores, portanto se você passar somente o parâmetro para mostrar nomes
dos dias da semana a função entende que o restante é nulo e que não é para mostrar,
por isso sempre que chamá-la terá que passar todos os parâmetros ou nulo;
Observe que na primeira vez que usei a função ig.calendario_opcoes_visual, joguei as variáveis dentro dela sem
declarar uma se quer, lembre-se que em Prisma se você usar uma variável que não foi atribuído nenhum valor
antes, seu valor então por padrão é nulo, com isso a função entende que não queremos mostrar nada no
calendário, apenas o básico, por isso ele aparece com visual básico e só vai mudando quando clicamos nos
botões de chechagem.
Colocamos o calendário dentro da caixa horizontal:
note que usamos a função ig.ad ao invés de ig.caixa_ad, com isso os parâmetros que seriam usados
em ig.caixa_ad são omitidos em ig.ad, ficando o valor padrão.
1 |
ig.ad ( caixah , calendario ); |
criamos uma outra caixa mas vertical e colocamos dentro da caixa horizontal ao lado do calendário:
1 2 |
caixav = ig.caixavertical ( falso , 0 ); ig.ad ( caixah , caixav ); |
Depois criamos os botões de checagem para mudar o visual do calendário, e colocamos todos eles na caixa vertical:
só o primeiro está aqui para ilustrar, mas são quatro no total
1 2 |
b_mostre_cabecalho = ig.botao_checagem('mostrar cabeçalho'); ig.ad ( caixav , b_mostre_cabecalho ); |
Se você ainda não entendeu para que foi preciso criar outra caixa veja a ilustração do layout abaixo:
Criamos a função callback para responder aos cliques dos botões de checagem:
1 |
funcao botao_exec ( comp , num ) |
comp é o próprio botão passado através do parâmetro %s na função ig.conecte, e num é uma variável
do tipo número para saber qual botão foi clicado e assim qual visual mostrar ou esconder no calendário;
Dê uma olhada bem cuidadosa no código fonte, modifique alguns parâmetros, execute no
prismacod.exe e aos poucos tenha certeza que você vai entender melhor cada função neste
exemplo. Use a vontade os exemplos, copie e cole nos programas que você criar futuramente,
afinal, é difícil mesmo lembrar de cada função, eu mesmo sempre volto nos exemplos ao fazer
um programa novo.
Conectando a função botao_exec nos botões de checagem: (apenas um para ilustrar)
1 |
ig.conecte ( b_mostre_cabecalho , ig.clique , "botao_exec( %s , 1 )" ); |
Depois disso, temos os métodos conectados aos eventos do calendário:
1 2 3 4 5 6 7 8 9 |
funcao mes_mudado ( calendario ) local t = ig.calendario_obt_data ( calendario ); //retorna uma tabela com os campos ano, mes e dia; imprima ("mes mudou : " .. t.mes ) fim ig.conecte( calendario , ig [ 'mes_mudado' ] , 'mes_mudado(%s)'); |
esta é a função mes_mudado que responde ao evento ig.mes_mudado ( ou ig [ ‘mes_mudado’ ] ), isto é cada vez que
o mês do calendário é alterado esta função é chamada, e dentro dela há outra função que retorna uma tabela
contendo os campos ano, mes, dia, veja:
1 |
local t = ig.calendario_obt_data ( calendario ); |
local t é porque não queremos que a variável t seja acessada fora da função, veja que t recebe os
campos t.ano, t.dia e t.mes, mas aqui usaremos somente o t.mes.
A outras funções são idênticas só mudando o evento e o campo da variável t, veja os outros eventos:
ig.conecte( calendario , ig.dia_selecionado_duplo_clique , ‘duplo_dia_selecionado(%s)’ );
responde a um duplo clique em um determinado dia;
Bom, é isso aí, espero que possa ser útil, qualquer dúvida postem no fórum, ou deixem uma resposta ao pos, ok!
Att. Adalberto