version 0.73.0
|
After Width: | Height: | Size: 482 B |
@@ -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.
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 269 B |
|
After Width: | Height: | Size: 711 B |
|
After Width: | Height: | Size: 371 B |
|
After Width: | Height: | Size: 4.1 KiB |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 309 B |
|
After Width: | Height: | Size: 1.0 KiB |