quarta-feira, 20 de agosto de 2008

Uma toolbar ao seu alcance

Eu recebo muitos emails de desenvolvedores interessados em utilizar a Toolbar padrão do Windows em suas aplicações. Nesse artigo, mostro como utilizar diversas toolbars em uma mesma janela, com a utilização de um programa controlador único, e sem a necessidade de se vincular ítens de menu aos botões.



Longe da dificuldade dos exemplos do NetExpress, essa demonstração mostra de maneira muito fácil o uso desse componente e também tem o intuito de buscar colaboração entre os leitores desse blog para que eu continue estimulado a escrever os artigos que ajudam a tantos desenvolvedores espalhados por todo o Brasil.

Colabore com o NetAlexpress !!!
Nessa versão de demonstração disponível para download no site do clube cobol não estão inclusos os fontes completos do projeto. Para receber os fontes completos, colabore com o NetAlexpress com R$ 49,00 (quarenta e nove reais) através de depósito bancário. Para maiores informações, envie email para alexandre@ciasoftonline.com.br.

O custo é pequeno justamente para que os desenvolvedores possam colaborar com o blog e também poderem ter acesso aos componentes mais utilizados nas aplicações gráficas, como a Toolbar. Minha intenção é criar novas classes para utilização de novos componentes e disponibilizar aqui no blog. No meu próximo artigo, vou escrever sobre a Treeview.

......$set mfoo
.......program-id. TBDemo.
.......class-control.

........*> Abaixo são definidas as classes utilizadas nesse programa
...........ACTButton is class "actbutton"
...........ACMaskedImageList is class "acmaskedimagelist"
...........ACUtils is class "acutils"
............
.......DATA DIVISION.
.......WORKING-STORAGE SECTION.

.......*> Variáveis usadas nas listas de imagens
.......77 umaLista object reference value null.
.......77 umaListaBmp object reference value null.

.......*> Variáveis usadas para identificar os ícones utilizados
.......77 icoAbrir pic 9(09) comp-5 value zeros.
.......77 icoNovo pic 9(09) comp-5 value zeros.
.......77 icoAlterar pic 9(09) comp-5 value zeros.
.......77 icoExcluir pic 9(09) comp-5 value zeros.
.......77 icoVisualizar pic 9(09) comp-5 value zeros.
.......77 icoGravar pic 9(09) comp-5 value zeros.
.......77 icoCancelar pic 9(09) comp-5 value zeros.
.......77 icoSair pic 9(09) comp-5 value zeros.

.......*> Variáveis usadas para identificar os bitmaps utilizados
.......77 bmp1 pic 9(09) comp-5 value zeros.
.......77 bmp2 pic 9(09) comp-5 value zeros.
.......77 bmp3 pic 9(09) comp-5 value zeros.
.......77 bmp4 pic 9(09) comp-5 value zeros.
.......77 bmp5 pic 9(09) comp-5 value zeros.
.......77 bmp6 pic 9(09) comp-5 value zeros.
.......77 bmp7 pic 9(09) comp-5 value zeros.
.......77 bmp8 pic 9(09) comp-5 value zeros.

.......*> Os botões da toolbar não terão vínculo com um item de menu
.......*> por isso ele será passado sempre com nulo
.......77 umItemNulo object reference value null.

.......*> Variáveis usadas para identificar os botões das toolbars
.......77 umBotaoClicado object reference value null.
.......77 umBotaoAbrir object reference value null.
.......77 umBotaoNovo object reference value null.
.......77 umBotaoAlterar object reference value null.
.......77 umBotaoExcluir object reference value null.
.......77 umBotaoVisualizar object reference value null.
.......77 umSeparador object reference value null.
.......77 umBotao1 object reference value null.
.......77 umBotao2 object reference value null.
.......77 umBotao3 object reference value null.
.......77 umBotao4 object reference value null.
.......77 umBotao5 object reference value null.
.......77 umBotao6 object reference value null.
.......77 umBotao7 object reference value null.
.......77 umBotao8 object reference value null.
.......77 umBotaoGravar object reference value null.
.......77 umBotaoCancelar object reference value null.
.......77 umBotaoSair object reference value null.

.......77 icone pic 9(09) comp-5 value zeros.
.......77 w pic 9(09) comp-5 value zeros.
.......77 h pic 9(09) comp-5 value zeros.
.......77 l pic 9(09) comp-5 value zeros.

.......78 dialog-system VALUE "DSGRUN".
.......01 Display-Error.
..........03 Display-Error-No PIC 9(4) comp-5.
..........03 Display-Details-1 PIC 9(4) comp-5.
..........03 Display-Details-2 PIC 9(4) comp-5.

.......COPY "DS-CNTRL.MF".
.......COPY "TBDemo.CPB".
.......COPY "KEYS.CPY".
.......PROCEDURE DIVISION.
.......Main-Process SECTION.
...........PERFORM Program-Initialize
...........PERFORM Program-Body UNTIL funcao = "SAIR"
...........perform Program-Terminate
............

......*--------------------------------------------------------------*
*.......Program-Initialize SECTION.
...........INITIALIZE Ds-Control-Block
...........INITIALIZE Data-block
...........MOVE Data-block-version-no TO Ds-Data-Block-Version-No
...........MOVE Version-no TO Ds-Version-No
...........MOVE Ds-Push-Set TO Ds-Control
...........MOVE "TBDemo" TO Ds-Set-Name
............

......*---------------------------------------------------------------*
.......Program-Body SECTION.
...........evaluate FUNCAO
.............when "MONTAR" perform Montar
.............when "BOTAOCLICADO" perform BotaoClicado
...........end-evaluate
...........perform Call-Dialog-System
............

......*---------------------------------------------------------------*
.......Montar section.
........*> Esse é a primeira seção chamada, que cria as listas
........*> de imagens e as toolbars
...........perform MontarListaDeImagens
...........perform MontarToolbar
...........perform MontarToolbarGravar
...........perform MontarToolbarLateral
............

......*-------------------------------------------------------------*
.......MontarListaDeImagens section.
........*> Aqui é criada a primeira lista de imagens, com 16x16 pixeis
...........move 16 to w h
...........invoke ACMaskedImageList "Nova" using w h returning umaLista
...........invoke umaLista "adicionarIcone" using z"abrir16.ico"
..................returning icoAbrir
...........invoke umaLista "adicionarIcone" using z"novo16.ico"
..................returning icoNovo
...........invoke umaLista "adicionarIcone" using z"alter16.ico"
..................returning icoAlterar
...........invoke umaLista "adicionarIcone" using z"exclui16.ico"
..................returning icoExcluir
...........invoke umaLista "adicionarIcone" using z"lupa16.ico"
..................returning icoVisualizar
...........invoke umaLista "adicionarIcone" using z"gravar16.ico"
..................returning icoGravar
...........invoke umaLista "adicionarIcone" using z"cancel16.ico"
..................returning icoCancelar
...........invoke umaLista "adicionarIcone" using z"sair.ico"
..................returning icoSair

........*> Aqui é criada outra lista de imagens, com 128x128 pixeis
...........move 128 to w h
...........invoke ACMaskedImageList "Nova" using w h
..................returning umaListaBmp
...........invoke umaListaBmp "adicionarBitmap" using z"iphone1.bmp"
..................returning bmp1
...........invoke umaListaBmp "adicionarBitmap" using z"iphone2.bmp"
..................returning bmp2
...........invoke umaListaBmp "adicionarBitmap" using z"iphone3.bmp"
..................returning bmp3
...........invoke umaListaBmp "adicionarBitmap" using z"iphone4.bmp"
..................returning bmp4
...........invoke umaListaBmp "adicionarBitmap" using z"iphone5.bmp"
..................returning bmp5
...........invoke umaListaBmp "adicionarBitmap" using z"iphone6.bmp"
..................returning bmp6
...........invoke umaListaBmp "adicionarBitmap" using z"iphone7.bmp"
..................returning bmp7
...........invoke umaListaBmp "adicionarBitmap" using z"iphone8.bmp"
..................returning bmp8
............

......*---------------------------------------------------------------*
.......MontarToolbar section.
........*> Nessa seção, adicionamos cada um dos botões das toolbars
...........invoke umaToolbar "lista"
...........invoke umaToolbar "semDivisor"
...........invoke umaToolbar "flat"

...........invoke umaToolbar "setarListaDeImagens" using umaLista
...........invoke umaToolbar "setarListaDeImagensHot" using umaLista

...........invoke umaToolbar "adicionarBotao"
..................using umItemNulo icoNovo
..................returning umBotaoNovo
...........invoke umBotaoNovo "setarTexto"
..................using z" Novo"
...........invoke umBotaoNovo "setarTooltip"
..................using z"Botão Novo..."

...........invoke umaToolbar "adicionarSeparador"

...........invoke umaToolbar "adicionarBotao"
..................using umItemNulo icoAlterar
..................returning umBotaoAlterar
...........invoke umBotaoAlterar "setarTexto"
..................using z" Alterar"
...........invoke umBotaoAlterar "setarTooltip"
..................using z"Botão Alterar..."

...........invoke umaToolbar "adicionarBotao"
..................using umItemNulo icoExcluir
..................returning umBotaoExcluir
...........invoke umBotaoExcluir "setarTexto"
..................using z" Excluir"
...........invoke umBotaoExcluir "setarTooltip"
..................using z"Botão Excluir..."

...........invoke umaToolbar "adicionarBotao"
..................using umItemNulo icoVisualizar
..................returning umBotaoVisualizar
...........invoke umBotaoVisualizar "setarTexto"
..................using z" Visualizar"
...........invoke umBotaoVisualizar "setarTooltip"
..................using z"Botão Visualizar..."

...........
invoke umaToolbar "mostrar"
............

......*---------------------------------------------------------------*
.......MontarToolbarGravar section.
........*> Nessa seção, adicionamos cada um dos botões das toolbars
...........invoke umaToolbarGravar "lista"
...........invoke umaToolbarGravar "semDivisor"

...........invoke umaToolbarGravar "setarListaDeImagens"
..................using umaLista
...........invoke umaToolbarGravar "setarListaDeImagensHot"
..................using umaLista

...........invoke umaToolbarGravar "adicionarBotao"
..................using umItemNulo icoGravar
..................returning umBotaoGravar
...........invoke umBotaoGravar "setarTexto"
..................using z" Gravar"
...........invoke umBotaoGravar "setarTooltip"
..................using z"Botão Gravar..."

...........invoke umaToolbarGravar "adicionarBotao"
..................using umItemNulo icoCancelar
..................returning umBotaoCancelar
...........invoke umBotaoCancelar "setarTexto"
..................using z" Cancelar"
...........invoke umBotaoCancelar "setarTooltip"
..................using z"Botão Cancelar..."

...........invoke umaToolbarGravar "adicionarSeparador"
...........invoke umaToolbarGravar "adicionarBotao"
..................using umItemNulo icoSair
..................returning umBotaoSair
...........invoke umBotaoSair "setarTexto"
..................using z" Sair"
...........invoke umBotaoSair "setarTooltip"
..................using z"Botão Sair..."

...........invoke umaToolbarGravar "mostrar"
............

......*---------------------------------------------------------------*
.......MontarToolbarLateral section.
........*> Nessa seção, adicionamos cada um dos botões das toolbars
...........invoke umaToolbarLateral "semDivisor"
...........invoke umaToolbarLateral "multiplasLinhas"

...........invoke umaToolbarLateral "setarListaDeImagens"
..................using umaListaBmp
...........invoke umaToolbarGravar "setarListaDeImagensHot"
..................using umaListaBmp

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp1
..................returning umBotao1
...........invoke umBotao1 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp2
..................returning umBotao2
...........invoke umBotao2 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp3
..................returning umBotao3
...........invoke umBotao3 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp4
..................returning umBotao4
...........invoke umBotao4 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp5
..................returning umBotao5
...........invoke umBotao5 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp6
..................returning umBotao6
...........invoke umBotao6 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp7
..................returning umBotao7
...........invoke umBotao7 "BotaoCheckGroup"

...........invoke umaToolbarLateral "adicionarBotao"
..................using umItemNulo bmp8
..................returning umBotao8
...........invoke umBotao8 "BotaoCheckGroup"

...........invoke umaToolbarLateral "mostrar"
...........move 4 to l
...........invoke umaToolbarLateral "setarLinhas" using l
............

......*---------------------------------------------------------------*
.......BotaoClicado section.
........*> Quando um botão é clicado, ele é informado para a classe
........*> ACUtils que retorna através do método abaixo, o botão que
........*> foi clicado
...........invoke ACUtils "botaoDaToolbarClicado"
..................returning umBotaoClicado
...........evaluate umBotaoClicado
.............when umBotaoNovo display "Botão novo clicado..."
.............when umBotaoAlterar display "Botão alterar clicado..."
.............when umBotaoExcluir display "Botão excluir clicado..."
.............when umBotaoVisualizar display "Botão visualizar clicado..."

.............when umBotao1 display "Botão calendário clicado..."
.............when umBotao2 display "Botão som clicado..."
.............when umBotao3 display "Botão telefone clicado..."
.............when umBotao4 display "Botão música clicado..."
.............when umBotao5 display "Botão email clicado..."
.............when umBotao6 display "Botão texto clicado..."
.............when umBotao7 display "Botão configuração clicado..."
.............when umBotao8 display "Botão sms clicado..."

.............when umBotaoGravar display "Botão gravar clicado..."
.............when umBotaoCancelar display "Botão cancelar clicado..."
.............when umBotaoSair display "Botão sair clicado..."
...........end-evaluate
............

......*---------------------------------------------------------------*
.......Call-Dialog-System SECTION.
...........CALL dialog-system USING Ds-Control-lock,
....................................Data-Block
...........IF NOT Ds-No-Error
..............MOVE Ds-System-Error TO Display-error
..............DISPLAY "DS ERROR NO: " Display-error-no
..............DISPLAY "Error Details(1) : " Display-Details-1
..............DISPLAY "Error Details(2) : " Display-Details-2
..............PERFORM Program-Terminate
...........END-IF
............

......*---------------------------------------------------------------*
.......Program-Terminate SECTION.
........*> Ao final, as listas de imagens devem ser finalizadas
...........invoke umaLista "deepFinalize" returning umaLista
...........invoke umaListaBmp "deepFinalize" returning umaListaBmp
...........stop run
............





Ao terminar de escrever esse artigo, eu comentava com um amigo sobre o assunto e ele me alertava sobre o fato de alguns mais "espertinhos" resolverem colaborar em grupo com o blog. Por exemplo, dividir simbólicos quarenta e nove reais entre quatro ou mais pessoas e depois os fontes serem distribuídos entre todos. Seria realmente lamentável se o fato ocorresse, até porque a colaboração que peço é apenas um incentivo às minhas pesquisas. Não penso em ficar rico escrevendo artigos para o NetAlexpress. O prazer em ver os amigos desenvolvedores evoluindo com a ferramenta é muito maior do que qualquer quantia em dinheiro. O NetAlexpress surgiu para ajudar a todos os desenvolvedores. E vai continuar da mesma forma. Aos "mais espertos", caso eles apareçam, apenas o meu lamento.

4 comentários:

Joventino disse...

Alexandre, parabens pela sua iniciativa, vá em frente. Espertinhos podem existir, mas não devem desestimular sua criatividade. Algum dia nosso povo vai criar vergonha na cara, é só uma questão de tempo. Tenho observado suas colaborações há algum tempo e apesar de não programar atualmente, fico muito feliz por ver que existem pessoas como vc, que investem seu tempo em busca de originalidade e ao mesmo tempo é generoso ao distribuir seu conhecimento. Gostaria de conhecê-lo pessoalmente, para lhe dar os parabéns.
Atenciosamente,
Joventino Medeiros.

Anônimo disse...

Com essa toolbar consegui padronizar as telas de cadastro do meu sistema usando 1 unico objeto. Ficou muito mais fácil dar manutenção agora. =o). Sem contar o trabalho que me poupou. Os meus R$ 49,00 foram muito bem investidos.

Parabéns pela iniciativa meu xará e já estou ancioso pelos próximos componentes que você vai lançar.

Abraço e conte comigo pro que precisar.

Anônimo disse...

A minha quantia foi bem investida. Consegui finalmente fazer uma toolbar na tela do meu menu, é bom quando alguém mostra o caminho das pedras, principalmente no cobol onde tudo é mais difícil, quando o assunto é informação.

Parabéns por mais essa iniciativa.

E que venha o Treeview o objeto mais chato de todos. Rs

Unknown disse...

Boa tarde a todos.
Alexandre, enviei um e-mail para você e retornou com erro.
Como faço para entrar em contato com você a respeito de comprar os fontes dos componentes.
Att.