version 0.73.0

This commit is contained in:
2023-07-14 12:15:30 -03:00
parent 110d8a0419
commit 945dd1a809
1466 changed files with 374820 additions and 0 deletions
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

+260
View File
@@ -0,0 +1,260 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. CADASTRO.
AUTHOR. Infocont Sistemas Integrados(Danilo).
DATE-WRITTEN. 13/10/04.
SECURITY. *******************************************************
* Cadastro de Clientes *
*******************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CADASTRO ASSIGN TO "cadastro.dat"
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS CAD-CHAVE
FILE STATUS IS W77-RETCOD
ALTERNATE RECORD KEY IS CAD-NOME
WITH DUPLICATES.
DATA DIVISION.
FILE SECTION.
FD CADASTRO.
01 CAD-PRINCIPAL.
03 CAD-CHAVE.
05 CAD-CODIGO PIC 9(04).
03 CAD-NOME PIC X(40).
03 CAD-ENDERECO PIC X(40).
03 CAD-BAIRRO PIC X(25).
03 CAD-CIDADE PIC X(25).
03 CAD-UF PIC X(02).
03 CAD-CEP PIC X(10).
03 CAD-DDD PIC 9(04).
03 CAD-FONE PIC X(09).
03 CAD-FAX PIC X(09).
WORKING-STORAGE SECTION.
01 VARIAVEL PIC X(01).
01 VARIAVEIS-TCL.
03 TCL-CODIGO PIC X(04).
03 TCL-NOME PIC X(40).
03 TCL-ENDERECO PIC X(40).
03 TCL-BAIRRO PIC X(25).
03 TCL-CIDADE PIC X(25).
03 TCL-UF PIC X(02).
03 TCL-CEP PIC X(10).
03 TCL-DDD PIC X(04).
03 TCL-FONE PIC X(09).
03 TCL-FAX PIC X(09).
03 TCL-OPCAO PIC X(03).
88 TCL-GRAVA VALUE "gra".
88 TCL-DELETA VALUE "del".
88 TCL-SAI VALUE "sai".
88 TCL-BUSCA VALUE "bus".
88 TCL-ALTERA VALUE "alt".
03 TCL-MENSAGEM PIC X(60).
03 TCL-FOCUS PIC X(03).
03 TCL-MENSAGEM2 PIC X(10).
77 W77-ERRO PIC 9(01) VALUE ZEROS.
88 W88-ERRO VALUE 1.
77 W77-RETCOD PIC X(02) VALUE SPACES.
88 W88-OK VALUE "00" "02" "04" "05".
88 W88-CHAVE-DUPLICADA VALUE "22".
88 W88-ARQUIVO-INEXISTE VALUE "35".
88 W88-ARQUIVO-NAO-LIDO VALUE "43".
77 NOME-PROGRAMA PIC X(64) VALUE "cadastro.tcl".
01 W01-PARA PIC X(01).
PROCEDURE DIVISION.
0000-PRINCIPAL SECTION.
0000-INICIO.
CALL "initTcl".
0000-ABRE-CADASTRO.
OPEN I-O CADASTRO.
IF W88-ARQUIVO-INEXISTE
OPEN OUTPUT CADASTRO
CLOSE CADASTRO
GO TO 0000-ABRE-CADASTRO.
IF NOT W88-OK
DISPLAY "ERRO ABERTURA"
DISPLAY W77-RETCOD
GO TO 0000-EXIT.
INITIALIZE VARIAVEIS-TCL.
MOVE "cod" TO TCL-FOCUS.
0000-OPCAO.
CALL "tcleval" USING VARIAVEIS-TCL NOME-PROGRAMA.
MOVE SPACES TO TCL-MENSAGEM2.
0000-FUNCAO.
IF TCL-GRAVA
PERFORM 1000-GRAVA.
IF TCL-DELETA
PERFORM 2000-DELETA.
IF TCL-ALTERA
PERFORM 3000-ALTERACAO.
IF TCL-BUSCA
PERFORM 4000-BUSCA
IF W88-ERRO
MOVE ZEROS TO W77-ERRO
MOVE "err" TO TCL-OPCAO
GO TO 0000-FUNCAO
ELSE
MOVE "cod" TO TCL-FOCUS
MOVE SPACES TO TCL-OPCAO.
IF TCL-SAI
GO TO 0000-EXIT.
IF W88-ERRO
GO TO 0000-EXIT.
GO TO 0000-OPCAO.
0000-EXIT.
STOP RUN.
1000-GRAVA SECTION.
1000-INICIO.
MOVE TCL-CODIGO TO CAD-CODIGO.
MOVE TCL-NOME TO CAD-NOME.
MOVE TCL-ENDERECO TO CAD-ENDERECO.
MOVE TCL-BAIRRO TO CAD-BAIRRO.
MOVE TCL-CIDADE TO CAD-CIDADE.
MOVE TCL-UF TO CAD-UF.
MOVE TCL-CEP TO CAD-CEP.
MOVE TCL-DDD TO CAD-DDD.
MOVE TCL-FONE TO CAD-FONE.
MOVE TCL-FAX TO CAD-FAX.
WRITE CAD-PRINCIPAL.
IF W88-CHAVE-DUPLICADA
REWRITE CAD-PRINCIPAL
IF W88-ARQUIVO-NAO-LIDO
READ CADASTRO
MOVE TCL-NOME TO CAD-NOME
MOVE TCL-ENDERECO TO CAD-ENDERECO
MOVE TCL-BAIRRO TO CAD-BAIRRO
MOVE TCL-CIDADE TO CAD-CIDADE
MOVE TCL-UF TO CAD-UF
MOVE TCL-CEP TO CAD-CEP
MOVE TCL-DDD TO CAD-DDD
MOVE TCL-FONE TO CAD-FONE
MOVE TCL-FAX TO CAD-FAX
REWRITE CAD-PRINCIPAL
IF W88-OK
INITIALIZE VARIAVEIS-TCL
MOVE "ARQUIVO ATUALIZADO" TO TCL-MENSAGEM
ELSE
INITIALIZE VARIAVEIS-TCL
MOVE W77-RETCOD TO TCL-MENSAGEM
END-IF
END-IF
ELSE
IF W88-OK
INITIALIZE VARIAVEIS-TCL
MOVE "CLIENTE CADASTRADO" TO TCL-MENSAGEM
ELSE
MOVE SPACES TO TCL-MENSAGEM
STRING "OCORREU UM ERRO NA GRAVACAO ERRO:"
DELIMITED BY SIZE
W77-RETCOD DELIMITED BY SIZE
INTO TCL-MENSAGEM
MOVE 1 TO W77-ERRO.
MOVE "cod" TO TCL-FOCUS.
1000-EXIT.
EXIT.
2000-DELETA SECTION.
2000-INICIO.
MOVE TCL-CODIGO TO CAD-CODIGO.
READ CADASTRO.
IF NOT W88-OK
MOVE "CLIENTE NAO CADASTRADO" TO TCL-MENSAGEM
MOVE "cod" TO TCL-FOCUS
GO TO 2000-EXIT.
DELETE CADASTRO.
IF W88-OK
INITIALIZE VARIAVEIS-TCL
MOVE "CLIENTE EXCLUIDO" TO TCL-MENSAGEM
ELSE
MOVE 1 TO W77-ERRO
GO TO 2000-EXIT.
MOVE "cod" TO TCL-FOCUS.
2000-EXIT.
EXIT.
3000-ALTERACAO SECTION.
3000-INICIO.
MOVE TCL-CODIGO TO CAD-CODIGO.
READ CADASTRO.
IF NOT W88-OK
MOVE "Gravacao" TO TCL-MENSAGEM2
MOVE SPACES TO TCL-NOME
MOVE SPACES TO TCL-ENDERECO
MOVE SPACES TO TCL-BAIRRO
MOVE SPACES TO TCL-CIDADE
MOVE SPACES TO TCL-UF
MOVE SPACES TO TCL-CEP
MOVE SPACES TO TCL-DDD
MOVE SPACES TO TCL-FONE
MOVE SPACES TO TCL-FAX
MOVE SPACES TO TCL-MENSAGEM
GO TO 3000-EXIT
ELSE
MOVE "Alteracao" TO TCL-MENSAGEM2.
MOVE CAD-NOME TO TCL-NOME.
MOVE CAD-ENDERECO TO TCL-ENDERECO.
MOVE CAD-BAIRRO TO TCL-BAIRRO.
MOVE CAD-CIDADE TO TCL-CIDADE.
MOVE CAD-UF TO TCL-UF.
MOVE CAD-CEP TO TCL-CEP.
MOVE CAD-DDD TO TCL-DDD.
MOVE CAD-FONE TO TCL-FONE.
MOVE CAD-FAX TO TCL-FAX.
MOVE SPACES TO TCL-MENSAGEM.
3000-EXIT.
MOVE "nom" TO TCL-FOCUS.
EXIT.
4000-BUSCA SECTION.
4000-INICIO.
MOVE SPACES TO CAD-NOME
START CADASTRO KEY IS NOT LESS THAN CAD-NOME.
4000-LE-PROXIMO-REGISTRO.
READ CADASTRO NEXT.
IF NOT W88-OK
MOVE "ini" TO TCL-FOCUS
MOVE "pri" TO TCL-OPCAO
CALL "tcleval" USING VARIAVEIS-TCL NOME-PROGRAMA
IF TCL-OPCAO NOT EQUAL "cer"
MOVE 1 TO W77-ERRO
MOVE SPACES TO TCL-OPCAO
GO TO 4000-EXIT
END-IF
GO TO 4000-ACHA-REGISTRO.
MOVE SPACES TO TCL-MENSAGEM
STRING CAD-CODIGO DELIMITED BY SIZE
" " DELIMITED BY SIZE
CAD-NOME DELIMITED BY SIZE
INTO TCL-MENSAGEM.
MOVE "bus" TO TCL-OPCAO.
MOVE SPACES TO TCL-FOCUS.
CALL "tcleval" USING VARIAVEIS-TCL NOME-PROGRAMA.
GO TO 4000-LE-PROXIMO-REGISTRO.
4000-ACHA-REGISTRO.
MOVE TCL-MENSAGEM (1:4) TO CAD-CODIGO.
MOVE SPACES TO TCL-MENSAGEM.
READ CADASTRO.
IF NOT W88-OK
display "nao achei"
MOVE "Nao foi possivel localzar o registro"
TO TCL-MENSAGEM
GO TO 4000-EXIT.
MOVE CAD-CODIGO TO TCL-CODIGO
MOVE CAD-NOME TO TCL-NOME.
MOVE CAD-ENDERECO TO TCL-ENDERECO.
MOVE CAD-BAIRRO TO TCL-BAIRRO.
MOVE CAD-CIDADE TO TCL-CIDADE.
MOVE CAD-UF TO TCL-UF.
MOVE CAD-CEP TO TCL-CEP.
MOVE CAD-DDD TO TCL-DDD.
MOVE CAD-FONE TO TCL-FONE.
MOVE CAD-FAX TO TCL-FAX.
4000-EXIT.
EXIT.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+233
View File
@@ -0,0 +1,233 @@
#!/bin/sh
# \
exec wish "$0" "$@"
wm title . "Cadastro de Clientes"
# Os dois comandos abaixo, servem para chamar os pacotes BWidget(ComboBox) \
e Wcb(para definir limite de tamanho dos widgets entry), usados nesse tutorial.\
OBS: entry: são os campos da tela, como ACCEPTs do Cobol.\
widget: objetos de tela(ComboBox, Textos, entry etc)
package require BWidget
package require Wcb
# O comando abaixo serve para definir que todos os compontes "entry" tenham fundo branco
option add *Entry.background white
# Como voce pode ver, todo componente deve receber um nome, atribuido logo depois da declaracao do componente, \
precedido de um ponto (ex: label .nome_do_label)
# Quando se coloca o caracter "\" no final da linha, significa que a linha abaixo, e' continuacao da linha atual
# O comando abaixo, serve para criar um frame. Um frame serve para organizar melhor a sua janela, pois varios \
componetes podem ser armazenados dentro dele, como se fossem filhos desse frame, conforme você exibe ele, \
os widgets dentro dele, tambem sao exibidos, a opcao -bd define a largura de sua borda, e a opcao -relief \
define o estilo de frame.
frame .fr -bd 2 -relief groove
frame .meio
frame .fim -bd 2 -relief groove
# o comando button, serve para criar um botao, e a palavra a seguir e' o nome do botao, no caso abaixo\
o nome do botao e' .butgravar(nao se esquecendo do ponto no inicio), a opcao -image, define que imagem \
o botao ira mostrar em seu rotulo, a opcao -command, define qual acao sera feita, apos ser clicado no \
botao, no caso abaixo, a variavel tclopcao, sera carregada com o valor "gra", e logo em seguida fara o comando\
do_exit, que faz com que o programa retorne ao Cobol(explicado mais detalhadamente no arquivo leia-me.txt)\
OBS: para um botao que tenha no seu rotulo, epenas texto, voce substitui a opcao -image por -text e o \
texto desejado
button .butgravar -image [image create photo -file "gravarc.gif"] -command {set tclopcao gra ; do_exit}
button .butdeletar -image [image create photo -file "excluirc.gif"] -command {set tclopcao del ; do_exit}
button .butcancelar -image [image create photo -file "cancelac.gif"] -command {set tclcodigo "" ;\
set tclnome "" ; set tclendereco "" ; set tclbairro "" ; set tclcidade "" ; set tclcep "" ;\
set tclddd "" ; set tclfone "" ; set tclfax "" ; set tcluf SC ; focus .entcod}
button .butbusca -image [image create photo -file "buscac.gif"] -command {set tclopcao bus ; \
janela_busca ; do_exit}
button .butsair -image [image create photo -file "sairc.gif"] -command {set tclopcao sai ; do_exit}
button .butsobre -image [image create photo -file "sobrec.gif"] -command {janela_infocont}
# o comando abaixo, serve para criar rotulos a serem exibidos na tela, grotescamente falando, e' semelhante ao\
DISPLAY do Cobol, a opcao -textvariable, indica que o texto a ser exibido pelo label e' o valor que a variavel\
indicada tem, conforme muda o valor da variavel, automaticamente, o texto exibido pelo label, tambem e' alterado,\
no caso abaixo, o texto do label .labmensagem, tera o valor da variavel tclmensagem.
label .labmensagem -textvariable tclmensagem
label .mensagem2 -textvariable tclmensagem2
# o comando "pack" e' uma forma de mostrar os componentes na tela, explicado mais detalhadamente no arquivo leia-me.txt
pack .butgravar .butdeletar .butcancelar .butbusca .butsair .butsobre -in .fr -side left -fill both
pack .labmensagem -in .fim -pady 5 -side left
pack .mensagem2 -in .fim -pady 5 -side right
pack .fr -side top -fill x
pack .meio -side top -padx 10 -pady 10 -fill y -anchor nw
pack .fim -side bottom -fill x -anchor nw
label .labcodigo -text "Codigo"
label .labnome -text "Nome"
label .labendereco -text "Endereco"
label .labbairro -text "Bairro"
label .labcidade -text "Cidade"
label .labuf -text "UF"
label .labcep -text "CEP"
label .labddd -text "DDD"
label .labfone -text "Telefone"
label .labfax -text "FAX"
# O comando abaixo serve para criar campos na tela(semelhante ao ACCEPT do Cobol), a opcao -textvariable, \
tem a mesma funcao referente ao label, o valor exibido pelo entry e' o valor da variavel, conforme muda \
o valor da variavel e' alterado o valor do entry, e vice-versa.
entry .entcod -textvariable tclcodigo -width 5
# O comando abaixo pertence ao pacote Wcb. Ele faz com que o componente indicado(no caso o .entcod), tenha no maximo o \
numero de caracteres indicado(no caso, 5) e se os caracteres nao-numericos estao desativados(no caso esta desativado)
wcb::callback .entcod before insert {wcb::checkEntryLen 5} wcb::checkEntryForInt
entry .entnome -textvariable tclnome -width 40
wcb::callback .entnome before insert {wcb::checkEntryLen 40}
entry .entendereco -textvariable tclendereco -width 40
wcb::callback .entendereco before insert {wcb::checkEntryLen 40}
entry .entbairro -textvariable tclbairro -width 25
wcb::callback .entbairro before insert {wcb::checkEntryLen 25}
entry .entcidade -textvariable tclcidade -width 25
wcb::callback .entcidade before insert {wcb::checkEntryLen 25}
entry .entfocu -textvariable tclfocus
entry .entopcao -textvariable tclopcao
entry .entuf -textvariable tcluf
# o componente abaixo pertence ao pacote BWidget, e' uma caixa de texto, com uma lista de opcoes, explicado\
mais detalhadamente no arquivo leia-me.txt
ComboBox .cbuf -width 8 -textvariable tcluf -entrybg white \
-values {AC AL AP AM BA CE DF ES FN GO MS MA MT MG PA PB PR PE PI RN RS RJ RO RR SC SP SE TO}
entry .entcep -textvariable tclcep -width 9
wcb::callback .entcep before insert verifica_cep
entry .entddd -textvariable tclddd -width 4
wcb::callback .entddd before insert {wcb::checkEntryLen 4} wcb::checkEntryForInt
entry .entfone -textvariable tclfone -width 8
wcb::callback .entfone before insert {wcb::checkEntryLen 8} wcb::checkEntryForInt
entry .entfax -textvariable tclfax -width 8
wcb::callback .entfax before insert {wcb::checkEntryLen 8} wcb::checkEntryForInt
# o comando "grid" e' um outro metodo de organizacao dos componentes, explicado melhor no arquivo leia-me.txt
grid .labcodigo .entcod -in .meio -sticky w -pady 3
grid .labnome .entnome -in .meio -sticky w -pady 3
grid .labendereco .entendereco -in .meio -sticky w
grid .labbairro .entbairro -in .meio -sticky w -pady 3
grid .labcidade .entcidade -in .meio -sticky w
grid .labuf .cbuf -in .meio -sticky w -pady 3
grid .labcep .entcep -in .meio -sticky w
grid .labddd .entddd -in .meio -sticky w -pady 3
grid .labfone .entfone -in .meio -sticky w -pady 3
grid .labfax .entfax -in .meio -sticky w -pady 3
### Criando procedures
### proc {valores} {corpo}
### se voce quiser que a procedure receba mais de um valor, eles sao separados por espaco, \
conforme o exemplo abaixo:
### proc {valor1 valor2 valor3} {
### set valor1 a
### set valor2 b
### set valor3 c
### }
proc verifica_cep {comp idx str} {
set texto [wcb::postInsertEntryText $comp $idx $str]
set tamedit [string length $texto]
set ::campo $comp
regsub -all "::_" $::campo "" ::campo
if {![regexp {^[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?\.?[0-9]{0,3}?$} $texto]} {
wcb::cancel
} else {
if {$tamedit == 6} {
$comp insert end "."
}
if {$tamedit == 9} {
tk::TabToWindow [tk_focusNext $::campo]
}
}
}
proc janela_busca {} {
global tclopcao
destroy .janbusca
toplevel .janbusca -height 195 -width 325
wm title .janbusca "Busca"
wm transient .janbusca .
listbox .janbusca.lista1 -background white -selectmode single -yscrollcommand {.janbusca.rolagem1 set}
scrollbar .janbusca.rolagem1 -orient vertical -command {.janbusca.lista1 yview}
label .janbusca.labtitulo -text "De dois clicks no item desejado"
button .janbusca.butok -text "OK" -command {set tclmensagem \
[.janbusca.lista1 get [.janbusca.lista1 curselection]] ; \
set tclopcao cer ; do_exit ; destroy .janbusca}
button .janbusca.butcan -text "Cancela" -command {destroy .janbusca; do_exit}
place .janbusca.labtitulo -x 10 -y 10
button .janbusca.sai -text "sai" -command {do_exit}
place .janbusca.lista1 -x 10 -y 30 -height 120 -width 286
place .janbusca.rolagem1 -x 294 -y 30 -height 120 -width 15
place .janbusca.butok -x 10 -y 155 -width 70
place .janbusca.butcan -x 85 -y 155 -width 70
bind .janbusca.lista1 <Double-Button-1> {set tclmensagem [.janbusca.lista1 get [.janbusca.lista1 curselection]] ; \
set tclopcao cer ; do_exit ; destroy .janbusca}
}
proc janela_infocont {} {
destroy .janinfocont
toplevel .janinfocont -height 370 -width 450
wm maxsize .janinfocont 450 370
wm title .janinfocont "Sobre"
label .janinfocont.butinfocont -image [image create photo -file "infocont.gif"]
label .janinfocont.lab1 -text "Pensando na crescente comunidade do TinyCobol no Brasil a InfoCont"
label .janinfocont.lab2 -text "disponibiliza mais um tutorial sobre o uso deste otimo compilador."
label .janinfocont.lab3 -text "Atraves da linguagem Tcl/Tk o TinyCobol se torna capaz de manipular"
label .janinfocont.lab4 -text "telas graficas tanto em Linux quanto em Windows."
label .janinfocont.lab5 -text "Neste tutorial pretendemos demonstrar a todos os interassados o uso"
label .janinfocont.lab6 -text "desta nova tecnologia."
label .janinfocont.lab7 -text "Desejamos a todos um otimo estudo!"
label .janinfocont.lab8 -text "Viva o Software Livre!!!!!!!!"
label .janinfocont.lab9 -text "Fernando Wuthstrack" -foreground blue
label .janinfocont.lab10 -text "Danilo Pacheco Martins" -foreground blue
place .janinfocont.butinfocont -x 15 -y 15
place .janinfocont.lab1 -x 15 -y 120
place .janinfocont.lab2 -x 15 -y 140
place .janinfocont.lab3 -x 15 -y 160
place .janinfocont.lab4 -x 15 -y 180
place .janinfocont.lab5 -x 15 -y 200
place .janinfocont.lab6 -x 15 -y 220
place .janinfocont.lab7 -x 15 -y 240
place .janinfocont.lab8 -x 15 -y 260
place .janinfocont.lab9 -x 300 -y 310
place .janinfocont.lab10 -x 300 -y 330
}
proc var_cobol {} {
global cobol_fields widget tclnumero0 tclnumero1
set cobol_fields {
tclcodigo 4
tclnome 40
tclendereco 40
tclbairro 25
tclcidade 25
tcluf 2
tclcep 10
tclddd 4
tclfone 9
tclfax 9
tclopcao 3
tclmensagem 60
tclfocus 3
tclmensagem2 10
}
}
proc ::cobol_preprocess {args} {
global tclopcao tclmensagem tclfocus
switch $tclopcao {
bus {.janbusca.lista1 insert end $tclmensagem
do_exit}
}
switch $tclfocus {
cod {focus .entcod}
nom {focus .entnome}
ini {focus .janbusca.butok; set tclfocus " "; set tclmensagem ""}
}
}
# O comando "bind", tem por finalidade executar algum comando, conforme o evento solicidado, Ex: \
bind .entcod <Return> {puts "voce pressionou enter"} \
no caso acima o comando fara com que ao se pressionar "Enter" no componente ".entcod", seja exibido \
na tela a frase "voce pressionou enter"
# Esse comando abaixo passara o valor "alt" para a variavel tclopcao e depois ira para o cobol (do_exit), \
quando o componente .entcod perder o foco(o cursor sair desse componente e ir para outro), isso se a \
variavel tclopcao nao for igual a "bus" e nem "pri"
bind .entcod <FocusOut> {
if {$tclopcao != "bus" && $tclopcao != "pri"} {
set tclopcao alt
do_exit
}
}
bind .cbuf <Escape> {focus .entcidade}
bind Entry <FocusIn> {set [lindex [split [%W configure -textvariable] " "] 4] \
[string trimright [%W get] " "] ; %W icursor 0 ; %W selection clear ; focus %W}
bind all <Return> {tk::TabToWindow [tk_focusNext %W]}
bind all <Escape> {tk::TabToWindow [tk_focusPrev %W]}
var_cobol
focus .entcod
Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+670
View File
@@ -0,0 +1,670 @@
Tutorial Tcl/Tk
===========================================
Danilo Pacheco Martins <Danilo@infocont.com.br>
Fernando Wuthstrack <fernando@infocont.com.br>
Jueves, 21 de Enero del 2003
Resumen:
=======
Este tutorial tiene como objetivo ser una referencia en el aprendizaje del uso
de Tcl/Tk. Es una herramienta óptima para desarrollo gráfico y proporciona una
gran ventaja al poder ser ejecutado en varias plataformas sin que sea necesario
modificar los archivos fuentes.
Dudas, críticas y sugerencias favor dirigirlas al e-mail:danilo@infocont.com.br.
--------------------------------------------------------------------------------
Contenido:
1.- ¿Qué es Tcl/Tk?.
2.- Conceptos básicos de Tcl/Tk.
3.- Haciendo a Cobol "conversar" con Tcl/Tk.
4.- Apéndice.
--------------------------------------------------------------------------------
1.- ¿Qué es Tcl/Tk?.
Tcl (Tcl Command Language) es un lenguaje de scripts usado por medio millón
de programadores alrededor del mundo y se ha tornado en un componente
crítico en miles de corporaciones. Tiene una sintaxis simple y sus programas
pueden ser usados como aplicaciones "standalone" o incrustadas (embedded) en
otras aplicaciones.
Lo mejor de todo es que Tcl es Open Source y por tanto completamente libre y
gratis.
Tk es un "toolkit" para crear interfaces gráficas de usuario, posibilitando
así crear GUI's poderosas e increíblemente rápidas, al contrario de
aplicaciones desarrolladas en otros lenguajes interpretados y hasta
compilados. Ha probado ser tan popular que ahora está incorporado en todas
las distribuciones Tcl.
Tanto Tcl como Tk fueron desarrollados por John Ousterhout. Programadores
del mundo entero han seguido el ejemplo y construyen sus propias extensiones
de Tcl. Hay centenares de extensiones de Tcl para todas las necesidades de
las aplicaciones. Tcl y Tk son altamente portátiles y son ejecutados en
prácticamente todos los sabores de Unix, (Linux, Solaris, IRIX, AIX, *BSD*).
No podemos dejar de decir que tienen soporte para Windows y Macintosh. Hay
varias empresas que proveen binarios de precompiladores para varias
plataformas.
Tcl/Tk 8.3.4 era la versión estable para cuando se escribió este tutorial.
Para esa versión fueron incluidas varias características que hacen de Tcl
un lenguaje de scripts altamente recomendado para aplicaciones comerciales.
Tcl/Tk 8.4a4 era la versión de desarrollo más reciente para cuando se
escribió este documento. Tcl/Tk son Open Source y están en desarrollo
continuo, entre los ingenieros de Scriptics (www.stripctics.com) y usuarios
de la comunidad de Tcl. Striptics mantiene un repositorio CVS con el código
fuente de Tcl/Tk. Todos pueden enviar adiciones y correcciones a ese código
fuente de Tcl/Tk. En caso de que encuentre algún error en Tcl/Tk, usted
podrá comunicarlo directamente a Scriptics utilizando un repositorio de Bugs.
1.1.- Tcl: Una plataforma de integración:
Hoy en día, uno de los grandes problemas enfrentados por los
desarrolladores de soluciones es la diversidad de plataformas que
pueden ser encontradas en las empresas. Tcl es llamado el programa
para la integración de aplicaciones.
Para proyectos, la plataforma de integración resulta
estratégicamente importante en cuanto al Sistema Operativo y a los
Bancos de Datos.
Tcl es la mejor plataforma de integración debido a su velocidad,
cantidad de funcionalidades y características para proyectos de
desarrollo rápido como lineas de seguridad, internacionalización
y comportamiento multiplataforma.
La más reciente versión de Tcl provee todas las características para
satisfacer las necesidades de cualquier proyecto e incluye toda la
integración necesaria en un lenguaje de scripts.
Los comentarios hechos arriba tienen como base el sitio web:
http://tclbrasil.cipsga.org.br/tcltk.h
--------------------------------------------------------------------------------
2.- Conceptos básicos de Tcl/Tk.
2.1.- VENTANA PRINCIPAL.
2.1.1.- Definiendo Título de la Ventana:
wm title . "título de la ventana"
2.1.2.- Definiendo Tamaño de la Ventana:
wm geometry . XXXxYYY
Ejemplo: wm geometry . 500x500
2.2.- VARIABLES.
2.2.1.- Declarando las Variables que vienen de Cobol:
Las variables recibidas de un programa Cobol tienen
obligatoriamente que ser del tipo "string" y tener el mismo
tamaño declarado en ambos (tanto en el programa en Cobol
como en el script Tcl/Tk). La forma de pasar parámetros de
Cobol a Tcl/Tk y viceversa será tratada más adelante. La
siguiente declaración de grupo "cobol_fields" es obligatoria
y no puede ser alterada:
set cobol_fiels {
variable1 5
variable2 25
variable3 40
}
Observación: Un número par de nombres con su tamaño.
2.2.2.- Definiendo el valor de una Variable:
Para definir el valor de una variable deberá usar la
siguiente sintaxis:
vnome set Jose
En este caso el valor "Jose" es insertado en la variable
"vnome". El valor especificado _no_ requiere estar entre
comillas dobles ("") a no ser que se quiera que el valor a
insertar contenga _más_ de una palabra. Ej: "Jose Da Silva".
2.2.3.- Recibiendo el valor de una Variable:
Siempre que quiera recibir el valor de una variable, ésta
tendrá que estar precedida por el signo dolar ($). Ej:
vnome1 set $vnome2
En este caso la variable "vnome1" recibirá el valor de la
variable "vnome2".
2.3.- INSERTANDO UNA CONDICIÓN:
El comando "if" es utilizado para evaluar una condición pudiendo el
resultado ser "verdadero" o "falso". En caso de que la condición sea
verdadera se ejecutarán una serie de comandos, pero si es falsa, se
ejecutarán entonces otros comandos, todo de acuerdo a lo definido
por el programador.
Sintaxis:
if {condición1} [then] {cuerpo si verdadera} [else {cuerpo si falsa}
[elseif {condición 2} {cuerpo}]]
donde:
{condición1}, es la primera condición a ser evaluada.
[then], es opcional para la condición que será evaluada, es
utilizado para indicar que es lo que será ejecutado en
caso de que la condición sea verdadera.
{cuerpo si verdadera}, comandos que serán ejecutados si la
condición es verdadera.
[else], es utilizado para indicar algo que deberá ser hecho si
la condición es evaluada como falsa.
{cuerpo si falso}, comandos que será ejecutados cuando la
condición evaluada resulte falsa.
[elseif], es utilizado para hacer una segunda verificación
condicional dentro del mismo "if".
{condición2}, es una segunda condición que será evaluada si
existe el "elseif".
{cuerpo}, lo mismo que "cuerpo si verdadera".
2.4.- INSERTANDO UNA RUTINA DE REPETICIÓN:
El comando "while" permitirá ejecutar una serie de comandos en caso
de que la primera condición sea verdadera. Si se verifica que dicha
condición es falsa, no será ejecutado ningún comando del cuerpo de
la instrucción. Es semejante al PERFORM de Cobol.
Sintaxis:
while {condición} {cuerpo}
donde:
{condición}, será la condición verificada en cada "loop" o
ciclo y que indicará si continua o no el lazo o
bucle de repetición.
{cuerpo}, son los comandos que deberán ser repetidos en cada
"loop" (ciclo).
Ejemplo:
set var1 0
while {$var1 < 10}
incr var1
}
2.5.- PROCEDIMIENTOS:
Es posible en Tcl crear Procedimientos (semejante a PERFORM en
Cobol), con la siguiente sintaxis:
proc asigna_valor {a b c} {
set valor1 a
set valor2 b
set valor3 c
}
Una llamada al procedimiento anterior sería hecha de la siguiente
manera:
asigna_valor vara varb varc
2.6.- BIND:
El comando "bind" es utilizado para asociar eventos del teclado o
del mouse a objetos de Tk.
Ejemplo:
label .lab
entry .entcodigo
bind .entcodigo <FocusIn> {.lab configure -text "Ha ingresado
al campo de código"}
bind .entcodigo <FocusOut> {.lab configure -text "Ha salido
del campo código"}
En este ejemplo, cuando el cursor entra en "entcodigo" o pasa sobre
la etiqueta "lab", se mostrará el mensaje "Ha ingresado al campo
código" y cuando el cursor sale de allí, se mostrará el mensaje "Ha
salido del campo código".
2.7.- COMPONENTES TK:
Existen varios componentes de Tk. En nuestro tutorial usamos:
"entry", "label", "button" y "listbox". Todo nombre atribuido a un
componente debe ser precedido por un punto ".".
2.7.1.- LABEL:
Label es un componente de texto usado para mostrar textos
(ej: identificación de campos). Grotescamente podría ser
comparado con el DISPLAY de Cobol. La sintaxis para crear
un "label" es la siguiente:
label nombre_del_label
Ejemplo:
label .codigo
En este caso se ha creado un "label" (etiqueta) con el
nombre "codigo".
Existen varias propiedades para un "label", como por
ejemplo: -text, -foreground, -background, etc.
Ejemplo:
label .codigo -text "Código" -foreground blue
-background white
En este caso el valor del [label] "codigo" será "Código" y
estará escrito con letra de color azul con fondo blanco.
Observación: Si Usted quiere que el texto del "label"
tenga más de una palabra, deberá encerrarlo
entre comillas dobles (" "). Ejemplo:
-text "InfoCont Sistemas Integrados"
Para asociar la propiedad -text a una variable deberá
declarar dicha variable de la siguiente manera:
-textvariable var
En este caso, siempre que la variable "var" cambie su valor
el texto del "label" también será modificado.
2.7.2.- ENTRY:
Entry es un componente que permite atribuir valor y
propiedades a texto introducido mediante teclado. Semejante
a ACCEPT de Cobol.
La sintaxis para crear un "entry" es como sigue:
entry nombre_del_entry
Ejemplo:
entry .direccion
Acá se ha creado un "entry" con el nombre "direccion".
Existen varias propiedades para un "entry" como: -text,
-foreground, -background, etc.
Ejemplo:
entry .direccion -text "Domicilio" -foreground blue
-background white
En este ejemplo el [entry] "direccion" actualizará el valor
de la variable "Domicilio" cuyo texto lucirá con letra de
color azul y fondo blanco.
2.7.3.- BUTTON:
Button es un componente que ejecuta un procedimiento cuando
es accionado. Su sintaxis es como sigue:
button .nombre_del_botón
Ejemplo:
button .but
En este caso se está creando un botón con el nombre "but".
Existen varias propiedades para un botón, así tenemos: -text
-foreground, -background, -command, etc.
Ejemplo:
button .but -text "Salir" -foreground blue
-command {exit}
Aquí, el rótulo (etiqueta) del botón "but" será "Salir" con
letra azul y cerrará el panel (ventana) cuando sea pulsado.
Si desea ejecutar más de un proceso cuando un botón es
accionado deberá separar un proceso de otro mediante ";"
(punto y coma).
2.7.4.- LISTBOX:
Es un componente que muestra una lista de items. La sintaxis
para crear un "listbox" es la siguiente:
listbox .lista
En este caso se ha creado un "listbox" con el nombre "lista".
Existen varias propiedades para un "listbox", así tenemos:
-selectmode, -yscrollcommand, etc.
Ejemplo:
listbox .lista -selectmode browse -yscrollcommand
{-rolagemv set}
En este ejemplo se ha definido el tipo de selección como
"browse" y se asoció a una barra de desplazamiento vertical,
la cual será usada cuando el número de items sea superior al
tamaño físico del componente (vide scrollbar).
2.7.5.- SCROLLBAR:
Es un componente que sirve como barra de desplazamiento para
otros componentes. Su sintaxis es:
scrollbar nombre_del_scrollbar
Existen varias propiedades para un "scrollbar", a saber:
-orient y -command.
Ejemplo:
listbox .lista -selectmode browse -yscrollcommand
{-rolagemv set}
scrollbar .rolagemv -orient vertical -command
{.lista view}
En este caso se crea una "listbox" y una "scrollbar", donde
la "scrollbar" es vertical y se moverá hacia arriba y/o
hacia abajo de la "lista" definida con el comando "listbox".
2.7.6.- TOPLEVEL:
Es un comando que crea una nueva ventana y responde a la
siguiente sintaxis:
toplevel .nueva_ventana
Ejemplo:
toplevel .catastro
Con este comando se crea una nueva ventana de nombre
"catastro". Para asignar la altura a la ventana se utiliza
el parámetro "-height altura_ventana", y para especificar
el ancho de la ventana se usa "-width ancho_ventana".
Si quiere crear algún componente dentro de la ventana,
deberá colocar el nombre de esta última antes del nombre
del componente, por ejemplo:
button .catastro.but -text "Salir" -command {exit}
En este ejemplo se crea un botón llamado "but" dentro de la
ventana llamada "catastro". El rótulo o título del botón
será "Salir" y cuando sea presionado se procederá a terminar
el programa.
2.7.7.- PLACE:
Es un comando cuya utilidad es la de posicionar objetos
dentro de una ventana. Su sintaxis es como sigue:
place objeto -x pos_horz -y pos_vert -height alto
-width ancho
Descripción de Parámetros:
-x : indica cuantos pixels horizontales abarcará el objeto.
-y : " " " verticales " " " .
-height : indica la altura del objeto en pixels.
-width : " el ancho " " " " .
Ejemplo:
place .label -x 10 -y 15 -height 20 -width 170
En el ejemplo, el objeto "label" estará a 10 pixels del lado
izquierdo y a 15 pixels del lado superior de la ventana
creada y medirá 20 pixels de alto y 170 pixels de ancho.
2.9.- Paquete IWIDGETS:
El IWidget es una biblioteca que provee acceso a otros componentes,
como: Combobox y EntryField (campos editados).
Antes de utilizar un componente del paquete IWidgets tendrá que
declarar que va a usar componentes de esa biblioteca; para hacer
esto digite el siguiente comando:
package require Iwidgets
iwidgets::tipo_de_componente nombre_del_componente
Recordando que todo componente debe ser precedido por un punto ".".
En nuestro programa usamos dos componentes de IWidgets: combobox y
entryfield.
2.9.1.- Componente IWidgets ENTRYFIELD:
Para insertar un "entryfield" deberá usar la siguiente
sintaxis:
iwidgets::entryfield nombre_del_componente
En nuestro tutorial usamos las siguientes opciones para
crear un "entryfield": -validate y -textvariable.
La opción -validate es ejecutada cuando se pulsa cualquier
tecla. En nuestro programa llamamos un procedimiento de la
siguiente forma: -validate {verificacion %W "%c"}. En este
caso se llamará al procedimiento "verificacion" partiendo
del hecho de que "%W" es el nombre del componente y "%c" es
el caracter que fué insertado (digitado).
2.9.2.- Componente IWidgets COMBOBOX:
Para insertar un "combobox" debe seguirse la siguiente
sintaxis:
iwidgets::combobox nombre_del_componente
En nuestro tutorial usamos la opción -selection command,
la cual disparará un comando cuando una opción sea
seleccionada, Ejemplo:
-selection command {set tcluf "[.cbuf getcurselection]"}
En este caso, cuando una opción es seleccionada, la variable
"tcluf" recibirá el valor del item seleccionado en el
"combobox" (.cbuf).
Para insertar un item al final de la lista del "combobox" se
usa la siguiente sintaxis:
nombre_combobox insert list end item_a_ser_insertado
Ejemplo:
.cbuf insert list end Dom Lun Mar Mie Jue Vie Sab
Acá serán ingresados (agregados) los días de la semana. Para
referenciar un item cuyo nombre tenga más de una palabra,
deberá colocar su nombre entre comillas dobles (" ").
Para definir un valor para un "combobox" deberá hacerse
mediante el siguiente comando:
nombre_combobox selection set item
Ejemplo:
.cbuf selection set $tclsem
En este caso el valor definido para el "combobox" es la
variable "tclsem" recordando que este item atribuido al
"combobox" debe existir en la lista. En caso contrario se
producirá un error, por ello debe tenerse cuidado cuando
se asigna un item a una variable.
--------------------------------------------------------------------------------
3.- Haciendo a Cobol "conversar" con Tcl.
3.1.- Trabajando con las variables en Cobol:
Las variables asociadas a Tcl/Tk deberán ser declaradas en el
WORKING-STORAGE SECTION. Usted deberá declarar una variable de
nivel 01 a la cual pertenecen las variables cuyos valores serán
intercambiados. Los nombres de dichas variables quedan a su
criterio. También será necesario declarar una variable de tipo
COMP PIC 9(12) que servirá para contener la suma de los tamaños
de las variables que serán intercambiadas Cobol <--> Tcl/Tk.
Además será necesaria una variable más del tipo PIC X(64) que
contendrá el nombre del programa(script) en Tcl/Tk.
A continuación un ejemplo:
01 VARIABLES-TCL.
03 TCL-CODIGO PIC X(04).
03 TCL-NOMBRE PIC X(40).
03 TCL-DIRECCION PIC X(40).
01 SUMA-VARIABLES COMP PIC 9(12).
01 NOMBRE-VENTANA PIC X(64).
En este ejemplo declaramos la variable "VARIABLES-TCL" en la cual
están incluidas todas las variables que Tcl/Tk usará. Es
imprescindible que el tamaño de las variables de Cobol sea el mismo
que el de las variables declaradas en Tcl/Tk, siendo estas últimas
obligatoriamente alfanuméricas (PIC X) debido a que Tcl/Tk no
permite declarar campos numéricos.
Luego declaramos la variable "SUMA-VARIABLES" cuyo contenido
corresponderá a la suma de los tamaños de las variables declaradas
en el grupo "VARIABLES-TCL".
En el ejemplo de arriba, esta variable tendrá un valor igual a 84 el
cual procede de (4 + 40 + 40 = 84).
Posteriormente declaramos la variable "NOMBRE-VENTANA" que contendrá
el nombre del programa (script Tcl/Tk) que será llamado.
Digamos que hacemos un script para manejar una ventana y le damos el
nombre de "catastro.tcl", entonces la variable "NOMBRE-VENTANA"
recibirá ese mismo valor (catastro.tcl).
Vea el punto siguiente (3.2.-) para conocer como son usadas las
variables aquí definidas.
3.2.- Invocando a una Ventana:
Antes que todo Usted tendrá que llamar al programa "initTcl" el cual
inicializa el ambiente gráfico. Esto debe hacerse al comienzo del
programa, antes de cualquier rutina.
La llamada a la ventana (Tcl/Tk) es hecha a través de la rutina
"chamatcl", que es un programa escrito en lenguaje C (chamatcl.c),
el cual posee un interpretador de scripts Tcl/Tk. El es el
responsable de mostrar la ventana y de trasladar los contenidos de
las variables desde Cobol a Tcl/Tk y viceversa.
Para mostrar una ventana deberá ejecutar el programa "chamatcl"
mediante la sentencia CALL acompañada de las variables definidas
bajo "VARIABLES-TCL", que son los campos que se intercambian entre
Cobol y Tcl/Tk. La variable "SUMA-VARIABLES", que contiene la suma
de los tamaños de las variables de intercambio y la variable
"NOMBRE-VENTANA", que contiene el nombre del archivo script Tcl/Tk
que será llamado.
Usando el mismo ejemplo anterior (3.1.-):
01 VARIABLES-TCL.
03 TCL-CODIGO PIC X(04).
03 TCL-NOMBRE PIC X(40).
03 TCL-DIRECCION PIC X(40).
01 SUMA-VARIABLES COMP PIC 9(12).
01 NOMBRE-VENTANA PIC X(64).
Digamos que la ventana que Usted quiere invocar se llama
"catastro.tcl", entonces en Cobol haríamos de la siguiente manera:
MOVE 84 TO SUMA-VARIABLES.
MOVE "catastro.tcl" TO NOMBRE-VENTANA.
CALL "chamatcl" USING VARIABLES-TCL SUMA-VARIABLES
NOMBRE-VENTANA.
Esto funciona así, cuando la sentencia CALL es ejecutada, ésta llama
al programa(script) de Tcl/Tk "catastro.tcl" en el cual las variables
"cobol_fields" reciben los valores de las variables definidas en
Cobol ("VARIABLES-TCL").
3.3.- Regresando a Cobol:
Retornar a Cobol desde Tcl/Tk es muy simple, solo tiene que ejecutar
el comando "do_exit". Haciendo esto cerrará la ventana abierta por
Tcl/Tk moviendo las variables de "cobol_fields" a las variables de
Cobol conforme se declararon en el WORKING-STORAGE SECTION. Aquí Ud.
debe elaborar una rutina para que Cobol reciba los valores y retorne
a llamar nuevamente al programa (script) en Tcl/Tk para mostrar los
nuevos valores de las variables una vez éstos han sido procesados.
3.4.- ¿Cómo funciona el programa Cobol ejemplo de este Tutorial?:
En el ejemplo de nuestro tutorial ("catastro.cob") tenemos una
variable declarada con el nombre "TCL-OPCION" con la correspondiente
"tclopcion" en Tcl/Tk ("catastro.tcl").
El programa Cobol llama al programa Tcl/Tk a través de "chamatcl"
para mostrar la ventana. Cuando se pulsa algún botón o se quita el
foco del campo "Código", se le atribuye una acción a la variable
"tclopcion" y se ejecuta el comando "do_exit". Este comando hace que
se retorne al programa en Cobol recibiendo en el proceso el
contenido de las variables que vienen del script Tcl/Tk. El programa
Cobol lee la variable "TCL-OPCION" y ejecuta la rutina
correspondiente en base al valor de ésta, retornando luego al script
Tcl/Tk para mostrar la ventana nuevamente.
En el programa Cobol encontramos en el WORKING-STORAGE SECTION a la
variable "SUMA-VARIABLES" con un valor preasignado de "234", que es
el resultado de la suma de los tamaños de las variables que se
intercambian y a la variable "NOMBRE-VENTANA" con un valor
preasignado igual a "catastro.tcl" que es el nombre del programa
(script) en Tcl/Tk.
Al inicio del programa Cobol ejecutamos la sentencia CALL "initTcl"
que nos servirá para inicializar el ambiente gráfico.
Antes de llamar a la ventana objeto de este ejemplo por primera vez,
inicializamos las variables que serán usadas para intercambiar datos
entre Cobol y Tcl/Tk con el objetivo de que la ventana muestre los
campos vacíos.
Como las variables "SUMA-VARIABLES" y "NOMBRE-VENTANA" tienen sus
valores preasignados, llamamos a la ventana de la siguiente forma:
CALL "chamatcl" USING VARIABLES-TCL SUMA-VARIABLES NOMBRE-VENTANA.
Esta sentencia invocará al programa(script) "catastro.tcl", el cual
nos permitirá manipular la ventana.
Digamos que un Usuario quiere grabar un registro, entonces primero
rellenará los campos de datos y luego pulsará el botón "GRABAR".
Cuando hace esto el script Tcl/Tk asignará el valor "gra" a la
variable "tclopcion" y ejecutará el comando "do_exit"
(-command {set tclopcion gra ; exit})
lo cual hará que el procesamiento retorne al programa Cobol con los
nuevos valores de las variables.
Ya en Cobol, se leerá la variable "TCL-OPCION" la cual tendrá el
valor "gra" y se ejecutará un PERFORM a la rutina "1000-GRABAR",
donde los valores de las variables recibidas de Tcl/Tk serán movidas
al archivo FD "CATASTRO" efectuando luego la grabación del
registro.
A continuación la secuencia del programa inicializará las variables
(que van al script Tcl/Tk), asignará un mensaje de texto a la
variable "TCL-MENSAJE" describiendo el resultado del proceso de
grabación y saldrá de la rutina retornando al programa(script) en
Tcl/Tk. La ventana será mostrada con los nuevos valores venidos de
Cobol.
En el script Tcl/Tk hay una etiqueta que está vinculada a la
variables "tclmensaje" la cual será actualizada en cada retorno
mostrando al Usuario el resultado de la acción.
En resúmen, Cobol llama a Tcl/Tk, el Usuario modifica los valores
de las variables escribiendo sobre los campos en la ventana y luego
el control retorna al programa en Cobol. En este punto el programa
en Cobol identifica el deseo del Usuario y a continuación ejecuta el
proceso correspondiente retornando luego al programa(Script) Tcl/Tk.
--------------------------------------------------------------------------------------
4 - Apéndice.
4.1 - Agradecimientos.
- Carlucio Lopes<carsanlo@terra.com.br> que, mediante su tutorial, nos
permitió dar los primeros pasos con Tcl/Tk;
- Rildo Pragana<rildo@pragana.net> por los primeros ejemplos con Tcl/Tk y con
TinyCobol y por la paciencia en ayudarnos a superar algunas barreras
encontradas;
- John Ousterhout por crear el lenguaje Tcl y el toolkit gráfico TK.
- A Wesley R. Braga, creador del sitio tclbrasil.cipsga.org.br
4.2 Colaboradores.
- Danilo Pacheco Martins
- Fernando Wuthstrack
- Carlucio Lopes
- Rildo Pragana
- Wesley R. Braga
+479
View File
@@ -0,0 +1,479 @@
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
Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB