tinycobol/tutorials/TCL-TK/leia-me.txt

480 lines
24 KiB
Plaintext

Tutorial Tcl/Tk
=====================================
Danilo Pacheco Martins <Danilo@infocont.com.br>
Fernando Wuthstrack <fernando@infocont.com.br>
Quinta, 27 de maio de 2006
Resumo
------
Este tutorial tem por objetivo ser uma referencia ao aprendizado no uso do
Tcl/Tk. E uma otima ferramenta para desenvolvimento grafico, e a sua grande
vantagem de rodar em varias plataformas, sem que seja preciso mudar seu fonte.
Duvidas, criticas e sugestoes favor postar para o e-mail: danilo@infocont.com.br
--------------------------------------------------------------------------------------
Conteudo
--------
1 - O que e Tcl/Tk.
2 - Conceitos basicos do Tcl/Tk.
3 - Fazendo o Cobol "conversar" com o Tcl/TK.
4 - Instalando o Tcl/TK no Windows.
5 - Compilando o programa cadastro.cob.
6 - Duvidas.
7 - Apendice.
--------------------------------------------------------------------------------------
1 - O que e Tcl/Tk
Tcl (Tool Command Language) e uma linguagem de script usada por meio milhao de
programadores ao redor do mundo e se tornou um componente critico em milhares de
corporacoes. Ele tem uma sintaxe simples e programavel e pode ser usado como uma
aplicacao standalone ou embutida em outras aplicacoes. O melhor de tudo, e que o Tcl
e Open Source e completamente gratis.
Tk e um toolkit para criacao de interface graficas com o usuario, possibilitando assim
criar GUIs poderosas e inacreditavel mente rapidas, ao contrario de aplicacoes
desenvolvidas em outras linguagens Interpretadas ou ate mesmo pre compiladas.
Provou-se tao popular que agora vem em todas as distribuicoes do Tcl.
Tanto o Tcl como o Tk foram desenvolvidos por John Ousterhout. Programadores seguiram
o exemplo dele no mundo inteiro e construiram as proprias extensoes de Tcl. Hoje, ha
centenas de extensoes do Tcl para todas as necessidades de aplicacoes.
Tcl e Tk sao altamente portateis e sao executadas praticamente todos os sabores de
Unix, (Linux, Solaris, IRIX, AIX, *BSD *), nao podemos deixar de falar que ha suporte
para o Windows e Macintosh. Ha varios locais que proveem binarios de precompiladores
para varias plataformas.
Tcl e Tk sao Open Source e o desenvolvimento continuo dele e feito com a colaboracao
dos engenheiros da Scriptics (www.scriptics.com) e usuario da comunidade Tcl. A
Scriptics mantem um repositorio de CVS para o codigo fonte.
Todos podem enviar mudancas e correcoes ao codigo fonte do Tcl/TK. Caso seja
encontrado algum erro no Tcl/TK voce podera comunica-lo diretamente a Scriptics
utilizando o relatorio de Bugs.
1.1 - Tcl: A Plataforma de Integracao
Hoje em dia um dos grandes problemas enfrentado pelos desenvolvedores de solucoes e
a diversidade de plataformas que poderao ser encontradas nas empresas. O Tcl e chamado
de programacao de aplicacoes para integracao.
Para empreendimentos, a plataforma de integracao esta ficando tao estrategicamente
importante quanto o Sistema Operacional e os bancos de dados.
Tcl e a melhor plataforma de integracao por causa de sua velocidade de uso, largura de
funcionalidade, e caracteristicas para empreendimento prontas como linha-seguranca,
internacionalizacao e desenvolvimento multiplataforma.
O comentario acima foi feito com base no Site: http://tclbrasil.cipsga.org.br/tcltk.htm
--------------------------------------------------------------------------------------
2 - Conceitos basicos do Tcl/Tk.
2.1 - Janela principal.
2.1.1 Definindo titulo da janela.
wm title . "Titulo da Janela"
2.1.2 Definindo tamanho da janela.
wm geometry . XXXxYYY
Ex: wm geometry . 500x500
2.2 - Variaveis
2.2.1 Declarando as variaveis do Cobol.
As variaveis vindas do Cobol tem por obrigatoriedade ser do tipo string e terao
que ter o mesmo tamanho declarado no fonte Cobol. A forma de passagem de parametros
do Cobol para o Tcl/Tk sera tratada mais adiante. A declaracao do grupo
"cobol_fields" e obrigatoria e nao pode ser alterada.
set cobol_fields {
variavel_1 5
variavel_2 25
variavel_3 40
}
Observacao: O numero apos o nome da variavel e' o seu tamanho.
2.2.2 Definindo um valor para uma variavel.
Para definir um valor para uma variavel, voce usara a seguinte sintaxe:
set nome_da_variavel valor
Ex:
set vnome Jose
Neste caso ele inseriu o nome "Jose" na variavel "vnome", o valor atribuido nao
precisa necessariamente estar entre "" (aspas), a nao ser que voce queira
inserir mas de uma palavra, como por ex:
vnome set "Jose da Silva"
2.2.3 Recebendo o valor de uma variavel.
Sempre que voce quiser receber o valor de uma variavel, ela tera que ser
precedida do "$" (dolar), como por exemplo:
set vnome1 $vnome2
Neste caso a variavel "vnome1" recebeu o valor da variavel "vnome2"
2.3 - Inserindo uma condicao.
O comando if e utilizado para avaliar se uma condicao. dada e verdadeira ou
falsa. Caso a condicao seja verdadeira ele podera executar uma serie de comandos
ou, se falsa, ira executar outra serie de comandos de acordo com o definido
pelo programador.
Sintaxe:
if {condicao1} [then] {corpo se verdadeiro} [else {corpo se falso} [elseif {condicao2} {corpo}]]
onde:
{condicao1}, e a primeira condicao a ser avaliada
[then], e opcional apos a condicao que sera avaliada, e utilizado para indicar
o que sera executado caso a condicao seja verdadeira.
{corpo se verdadeiro}, e o que sera executado se a condicao avaliada for
verdadeira.
[else], e utilizado para indicar algo que devera ser feito se a condicao
avaliada for falsa.
{corpo se falso}, e o que devera ser executado quando a condicao avaliada for
falsa.
[elseif], e utilizado para fazer uma segunda verificacao condicional dentro do
mesmo if.
{condicao2}, e a segunda condicao que sera avaliada pelo elseif.
{corpo}, o mesmo que {corpo se verdadeiro}.
2.4 - Inserindo uma rotina de repeticao.
O comando while ira executar uma serie de comandos enquanto uma condicao for
verdadeira, caso na primeira verificacao ja for verificado que a condicao e
falsa nenhum comando do corpo sera executado, semelhante ao PERFORM do Cobol.
Sintaxe:
while {condicao} {corpo}
Onde:
{condicao}, sera a condicao verificada a cada loop para continuar ou parar o
laco de repeticao.
{corpo}, sao os comandos que deverao ser repetidos a cada loop
Exemplo:
set var1 0
while {$var1 < 10} {
incr var1
}
2.5 - Procedures.
E possivel no Tcl criar procedures (semelhante o PERFORM do Cobol), a sintaxe:
proc {valores} {corpo}
Exemplo:
proc atribui_valor {a b c} {
set valor1 $a
set valor2 $b
set valor3 $c
}
A chamada da procedure acima, seria feita da seguinte maneira:
atribui_valor "primeiro" "segundo" "terceiro"
2.6 - Bind.
O comando bind e utilizado para associar eventos do teclado ou mouse a objetos
do Tk. Exemplo:
label .lab
entry .entcodigo
bind .entcodigo <FocusIn> {.lab configure -text "Voce entrou no campo Codigo"}
bind .entcodigo <FocusOut> {.lab configure -text "Voce saiu do campo Codigo"}
No caso acima, quando o cursor entrar no ".entcodigo", o ".lab" vai exibir:
"Voce entrou no campo Codigo", e quando sair ele vai exibir: "Voce saiu do campo
Codigo"
2.7 - Componentes Tk.
Existem varios componente do Tk, em nosso tutorial usamos entry, label, button
e listbox. Todo nome atribuido a um componente deve proceder de um ponto ".".
2.7.1 Label.
Label e um componente de texto, apenas para exibir(ex: identificar campos).
Grotescamente podera ser comparado ao DISPLAY do Cobol.
A sintaxe para criar um label e a seguinte:
label nome_do_label
Exemplo:
label .codigo
No caso acima ele criou um label com o nome "codigo".
Existem varias propriedades para um label, como por exemplo -text, -foregorund,
-background e etc.
Exemplo:
label .codigo -text Codigo -foreground blue -background white
No caso acima, o label codigo tera o valor "Codigo", letra azul e fundo branco.
Observacao: se voce quiser que o texto do label tenha mais de uma palavra, voce
tera que coloca-lo entre "" (aspas). Exemplo: -text "InfoCont Sistemas Integrados"
Para associar a propriedade -text a uma variavel, voce tera que declara-la da
seguinte maneira:
-textvariable var
Neste caso, sempre que a variavel "var" mudar de valor, o texto do label tambem
sera modificado.
2.7.2 Entry.
Entry e um componente ao qual permite com que voce atribua valor a sua
propriedade texto via teclado. Semelhante ao ACCEPT do Cobol.
A sintaxe para criar um entry e a seguinte:
entry nome_do_entry
Exemplo:
entry .endereco
No caso acima ele criou um entry com o nome de "endereco".
Existem varias propriedade para um entry, como por exemplo -text, -foreground,
-background e etc.
Exemplo:
entry .endereco -text desendereco -foreground blue -background white
Neste caso, o entry "endereco" ira atualizar o valor da variavel "desendereco",
com letra azul e fundo branco.
2.7.3 Button.
Button e um componente que aciona algum procedimento quando acionado.
A sintaxe para criar um Button e a seguinte:
button .nome_do_botao
Exemplo:
button .but
No caso acima ele criou um botao com o nome de "but"
Existem varias propriedade para um botao, como por exemplo -text, -foregorund,
-background -command e etc.
Exemplo:
button .but -text Sair -foreground blue -command {exit}
Neste caso, o rotulo do botao "but" sera "Sair", letra azul e fechara a tela
quando ele for acionado, se voce quiser fazer mais de um procedimento quando
um botao for acionado, voce tera que separar um procedimento do outro com ";"
(ponto-e-virgula).
2.7.4 ListBox.
ListBox e um componente que mostra uma lista de itens.
A sintaxe para criar um ListBox e a seguinte:
listbox .lista
No caso acima ele criou um listbox com o nome de "lista"
Existem varias propriedades para um listbox, como por exemplo -selectmode
-yscrollcommand e etc.
-Exemlo:
listbox .lista -selectmode browse -yscrollcommand {.rolagemv set}
Neste caso ele definiu o tipo de selecao como "browse" a associou uma barra
de rolagem vertical, que sera utilizada quando o numero de itens for superior
ao tamanho fisico do componente (vide scrollbar).
2.7.5 Scrollbar.
Scrollbar e um componente que serve como barra de rolagem para outros
componentes.
A sintaxe para criar um Scrollbar e a seguinte:
scrollbar nome_do_scrollbar
Existem varias propriedades para um Scrollbar, como por exemplo -orient
e -command
Exemplo:
listbox .lista -selectmode browse -yscrollcommand {.rolagemv set}
scrollbar .rolagemv -orient vertical -command {.lista yview}
Neste caso ele criou um listbox e um scrollbar, onde o scrollbar esta na
vertical, e ele ira mover para cima ou para baixo a lista do ListBox.
2.7.6 TopLevel
TopLevel, e um comando que cria uma nova janela.
A sintaxe para criar um toplevel e a seguinte:
toplevel .nome_janela
Exemplo:
toplevel .cadastro
No caso acima ele criou uma nova janela com o nome de "cadastro"
Para setar a altura usa-se o comando -height altura_da_janela
para setar a largura usa-se o comando -width largura_da_janela
se voce quiser criar algum componente nesta janela voce tera que colocar o nome
da janela antes do nome do componente, como por exemplo:
button .cadastro.but -text "Sair" -command {exit}
No caso acima ele criou um botao chamado "but" na janela chamada "cadastro" o
rotulo desse botao e "Sair" e quando ele for pressionado, ele ira fechar o
programa.
2.8 - Place.
O Place e um comando com a utilidade de posicionar os objetos na janela.
Sua sintaxe e a seguinte:
place nome_do_objeto -x posicao_horizontal -y posicao_vertical
-height altura -width largura
Comandos principais:
-x : indica quantos pixels na horizontal o objeto deve se posicionar.
-y : indica quantos pixels na vertical o objeto deve se posicionar.
-height : indica a altura do objeto em pixels.
-width : indica a largura do objeto em pixels.
Exemplo:
place .entcidade -x 10 -y 15 -height 20 -width 170
No caso acima o componente "entcidade" estara 10 pixels na horizontal, da
janela criada 15 pixels na vertical, 20 pixels de altura, e 170 pixels de
largura.
2.9 - Grid.
Grid e um outro metodo para organizar objetos na tela, muito mais
pratico que o place, ele cria uma tabela invisivel na tela, e voce vai
colocando cada widget em uma celula dessa tabela, facilitando o trabalho, pois
voce nao precisa ficar se preocupando em alinhar os objetos, o grid faz isso
sozinho, o largura da coluna, e' do tamanho do componente mais largo da coluna,
e a altura da linha, e' o tamanho do componente mais alto da linha. Exemplo:
button .but1
button .but2
button .but3
button .but4
grid .but1 .but2
grid .but3 .but4
no caso acima foi criado quatro botoes e exibido na tela com o comando grid,
existem varias opcoes para o grid, como por exemplo:
-sticky nsew, isso indicara em que posicao da celula ficara o objeto, caso a
celula seja maior que o objeto, nesse exemplo, ela ficara na posicao norte, sul, leste
e oeste, ou seja, o tamanho do objeto, sera o tamanho da celula.
2.10 Pack.
Pack, e' uma outra maneira de se organizar objetos na tela. E' como se
ele jogasse os objetos para os cantos, na opcao -side voce define em que canto
o objeto sera jogado: para cima(top), para a esquerda(left), direita(right) ou
para baixo(bottom). A opcao -anchor, em que posicao do lado o objeto
ira ficar, norte(n), sul(s), leste(e) ou oeste(w) por exemplo:
button .but1
button .but2
button .but3
button .but4
pack .but1 .but2 .but3 .but4 -side right -anchor nw
Nesse exemplo, foram criados quatro botoes, eles irao aparecer no canto direito
superior, nao importando se voce altere o tamanho da janela.
--------------------------------------------------------------------------------------
3 - Fazendo o Cobol "conversar" com o Tcl/TK.
3.1 - Trabalhando com as variaveis do Cobol.
As variaveis associadas ao Tcl/TK, deverao ser declaradas na
WORKING-STORAGE SECTION. Voce ira declarar uma variavel do nivel 1, e as
variaveis pertencentes ao Tcl/TK deverao estar dentro dela, o nome das variaveis,
fica a seu criterio. Sera necessario declarar mais uma variavel PIC X(64) que
servir para identificar o nome do arquivo TCL. Veja o exemplo abaixo:
01 VARIAVEIS-TCL.
03 TCL-CODIGO PIC X(04).
03 TCL-NOME PIC X(40).
03 TCL-ENDERECO PIC X(40).
01 NOME-TELA PIC X(64).
Neste exemplo, declaramos a variavel "VARIAVEIS-TCL", nela estarao todas as
variaveis que o Tcl/TK ira usar. E imprescindivel que o tamanho das variaveis no
Cobol seja o mesmo das variaveis declaradas no Tcl/Tk e que tem por obrigatoriedade
ser PIC X, tendo em vista que o Tcl/Tk nao permite a declaracao de campos numericos.
Posteriormente declaramos a variavel "NOME-TELA", que sera o nome do arquivo da tela
(script Tcl/Tk) que voce ira chamar. Digamos que fizemos uma tela com o nome de
"cadastro.tcl", entao a variavel "NOME-TELA" receberia o valor "cadastro.tcl".
Veja no indice 3.2 (proximo) para saber como elas serao usadas.
3.2 - Chamando a tela.
Antes de tudo voce tera que chamar o programa "initTcl". Ele inicializa o
ambiente grafico. Faca isso no comeco do programa, antes de comecar qualquer
rotina.
A chamada da tela Tcl/TK e efetuada atraves da rotina "tcleval", que e
um programa escrito em linguagem C, que possui um interpretador de scripts TCL/TK.
Ele e responsavel por executar a tela e transportar os conteudos das variaveis
do Cobol para o Tcl/TK e vice-versa.
Para chamar a tela, voce tera que executar o programa "tcleval" atraves do
comando CALL, usando as variaveis do Tcl/Tk e a variavel com o nome do programa,
usando o mesmo exemplo anterior:
01 VARIAVEIS-TCL.
03 TCL-CODIGO PIC X(04).
03 TCL-NOME PIC X(40).
03 TCL-ENDERECO PIC X(40).
01 NOME-TELA PIC X(64).
Digamos que a tela que voce ira chamar, e "cadastro.tcl", entao no Cobol fariamos
da seguinte maneira.
MOVE "cadastro.tcl" TO NOME-TELA.
CALL "tcleval" USING VARIAVEIS-TCL NOME-TELA.
No caso acima, quando o CALL fosse executado, ele chamaria a tela escrita em Tcl/TK
"cadastro.tcl" e as variaveis do "cobol_field" no Tcl/TK receberiam os valores
vindos do Cobol.
3.3 - Voltando para o Cobol.
Voltar do Tcl/TK para o Cobol, e muito simples, voce tera que executar
no Tcl/TK o comando "do_exit", fazendo isso os valores das variaveis do "cobol_fields"
serao movida para as variaveis do Cobol, conforme voce declarou na
WORKING-STORAGE SECTION, dai cabe a voce fazer uma rotina, para que o Cobol receba os
valores e volte para a chamar a tela, mostrando os novos valores processados.
3.4 - Como funciona a rotina do tutorial.
No exemplo do nosso tutorial, temos uma variavel declarada no Cobol com o nome de
"TCL-OPCAO", com a correspondente "tclopcao" no Tcl/TK.
O Cobol chama o Tcl/TK atraves do "tcleval" e a tela e exibida. Quando voce clica
em algum botao, ou tira o foco do campo "codigo", ele atribui a acao para a variavel
tclopcao e executa o "do_exit". Este comando ira retornar o processamento para
o Cobol, transportando as variaveis vindas do Tcl/TK. O Cobol le a variavel
"TCL-OPCAO" e executa a rotina correspondente a opcao e retorna para o Tcl/Tk.
Exemplo:
Na WORKING-STORAGE SECTION atribuimos a variavel "NOME-PROGRAMA" com o valor
"cadastro.tcl", que e o nome do arquivo do Tcl/TK.
No inicio do programa Cobol executamos o "iniTcl" (CALL "initTcl".).
Antes de chamar a tela pela primeira vez inicializamos as variaveis que serao
usadas pelo Tcl/TK, para que tela seja exibida com os campos vazios.
Como a variavel "NOME-PROGRAMA" ja esta carregado com o nome da janela,
chamamos a tela (CALL "tcleval" USING VARIAVEIS-TCL NOME-PROGRAMA).
Isto ira chamar a tela do Tcl/TK. Digamos que o usuario queira gravar um registro,
entao ele ira preencher os dados e depois ira clicar no botao "Gravar". Quando ele
clicar em gravar, o Tcl/TK ira atribuir a variavel "tclopcao" o valor "gra" e fara
o comando "do_exit" (-command {set tclopcao gra ; do_exit}) que ira fazer com que o
processamento retorne ao programa Cobol, com os novos valores da variaveis.
O Cobol ira ler a variavel "TCL-OPCAO", que tera o valor "gra", e executara um
PERFORM para a secao "1000-GRAVA", onde os valores das variaveis vindas do Tcl/TK
serao movidas para a FD "CADASTRO" e sera executa a gravacao. Na seqüencia o
programa inicializara as variaveis do Tcl/TK, atribuira uma mensagem descrevendo
o resultado do processo de gravacao para a variavel "TCL-MENSAGEM" e saira da rotina,
retornando ao Tcl/TK (tcleval). A tela sera exibida com o novos valores vindos do
Cobol. No script Tcl/TK temos um label que esta vinculada a variavel "tclmensagem",
que no retorno sera atualizada e exibira ao usuario o resultado da acao.
Resumido, o Cobol chama o Tcl/TK, o usuario modificara os valores das variaveis,
voltara para o Cobol. O Cobol, por sua vez, ira identificar o desejo do usuario,
ira executar o processo correspondente e retornara ao Tcl/TK,
--------------------------------------------------------------------------------------
4 - Instalando o Tcl/TK no Windows.
4.1 - O melhor caminho para baixar o TCL/TK para Windows é através pacote ActiveTCL,
distribuido pela ActiveState. O interpretador TCL/TK é totalmente free.
Para realizar o download do ActiveTCL, acesse o endereço abaixo:
http://www.activestate.com/Products/ActiveTcl
O ActiveTCL trás, além do interpretador TCL/TK, inúmeros pacotes de componentes,
como o Iwidget e o Bwidgets, que agregam funções como suporte à campos editados,
calendários, utilitários para busca e seleção de arquivos e inúmeros outros recursos.
A instalação do ActiveTCL também é bastante simples, sendo necessário apenas confirmar
todos os passos do processo. Após a instalação é criado um grupo de programas
denominado ActiveState ActiveTCL, onde estão disponíveis os interpretadores e também o
grupo Demos, onde se encontram disponíveis todos os componentes agregados na instalação,
com exemplos em tempo de execução e também do código que deverá ser implementado na
sua aplicação.
A partir deste momento, você já terá acesso à todas as funcionalidades do TCL/TK,
sem a necessidade de qualquer configuração adicional. As interfaces criadas em TCL/TK
já poderão ser visualizadas e processadas.
5 - Compilando o programa cadastro.cob.
5.1 Para compilar e gerar o executável de cadastro.cob digite:
htcobol -vC cadastro.cob
Informacoes:
- O TC suporta a integração com o TCL/TK via call's a um interpretador TCL/TK atraves um
wrapper(empacotador) criado pelo Rildo. Esta rotina (initTcl.dll) já se encontra
devidamente compilada e presente no diretório C:\TinyCOBOL\bin.
6 - Duvidas e Sugestoes.
Poste suas duvidas e ou sugestoes para a lista abaixo, sendo que o topico devera ser
enviado para lista adequada.
6.1 Tinycobol.
Lista cobol@yahoogrupos.com.br
http://br.tinycobol.org
http://wiki.tinycobol.org
6.2 TCL/TK
lista tcl-br@yahoogrupos.com.br
http://tclbrasil.cipsga.org.br
http://www.ricardo-jorge.eti.br
http://www.tcl.tk
7 - Apendice.
7.1 - Agradecimentos.
- Carlucio Lopes<carsanlo@terra.com.br> que, atraves do seu tutorial, nos
permitiu dar os primeiros passos com o Tcl/Tk;
- Rildo Pragana<rildo@pragana.net> pelos primeiros exemplos com Tcl/TK com
o TinyCobol e pela paciencia em nos ajudar a superar algumas barreiras
encontradas;
- John Ousterhout por criar a linguagem TCL e o toolkit grafico TK.
- Wesley R. Braga, criador do site tclbrasil.cipsga.org.br
- Ricardo Jorge, grande colaborador da lista tcl-br.
7.2 Colaboradores.
- Danilo Pacheco Martins
- Fernando Wuthstrack
- Carlucio Lopes
- Rildo Pragana
- Wesley R. Braga