sexta-feira, 26 de outubro de 2007

Uma StatusBar em tempo de execução


Você gosta daquelas barras de status com seções recheadas de ícones, textos de ajuda ou barras de progresso ? Aprenda a criar uma barra de status em tempo de execução e mude o visual de suas aplicações.

Os exemplos que são colocados aqui no blog sempre levam em consideração a utilização dos recursos de vocabulários nas aplicações. Leia mais sobre o assunto no artigo "Aumentando o seu vocabulário".

Defina o tipo de chamada das API´s:

special-names.
call-convention 66 is wapi.

Definas as classes que serão utilizadas:

class-control.
ProgressBar is class "progress"
Window is class "window"
CharacterArray is class "chararry"
Icondata is class "icondata"
.

Defina as seguintes variáveis na working-storage section:

77 umaWindow object reference value null.
77 umaStatusbar object reference value null.
77 umaBarra object reference value null.
77 umIconeImpressora object reference value null.
77 umIconeOk object reference value null.
77 umTexto object reference value null.

77 handle8 pic 9(08) comp-x value zeros.
77 wHandle pic 9(09) comp-5 value zeros.
77 sHandle pic 9(09) comp-5 value zeros.
77 iHandle pic 9(09) comp-5 value zeros.

77 wsSecao pic 9(09) comp-5 value zeros.
77 wsLargura pic 9(09) comp-5 value zeros.
77 wsTotal pic 9(09) comp-5 value zeros.

77 x pic s9(09) comp-5 value zeros.
77 y pic s9(09) comp-5 value zeros.
77 w pic 9(09) comp-5 value zeros.
77 h pic 9(09) comp-5 value zeros.
77 hBarra pic 9(09) comp-5 value zeros.
77 hWindow pic 9(09) comp-5 value zeros.

78 SB-SETICON value 1039
.

Na procedure division, a section abaixo captura a window principal da sua GS, criando assim uma instância da classe Window. Em nosso exemplo, a window principal definida dentro da GS chama-se win-principal. Em seguida, o método "addStatusbar" adiciona uma barra de status à window. A partir daí, tres seções serão criadas na barra de status. A primeira seção irá conter um ícone e um texto. Na segunda seção, criaremos uma barra de progresso que poderá ser usada pela aplicação. Na terceira e última seção da barra de status colocaremos outro ícone e mais um texto de exemplo. Veja os comandos a seguir:

CriarStatusBar section.
move-object-handle win-principal handle8
move handle8 to wHandle
invoke Window "fromHandleWithClass" using wHandle Window
returning umaWindow

*>--------------------------------------------------------
*> o método "addStatusBar" adiciona uma barra de status
*> à window


invoke umaWindow "addStatusbar" returning umaStatusbar
invoke umaStatusbar "create"

*>--------------------------------------------------------
*> os comandos a seguir pegam a altura da barra de status
*> e somam com a altura da window, em pixéis, para que a
*> a barra de status não esconda nenhum objeto que já exista
*> na window, perto de sua base


invoke umaWindow "getHeight" returning hWindow
invoke umaStatusbar "getHeight" returning hBarra
add hBarra to hWindow
invoke umaWindow "setHeight" using hWindow

*>--------------------------------------------------------
*> o método "setNumberOfParts" cria 3 seções na barra de status

move 3 to wsTotal
invoke umaStatusBar "setNumberOfParts" using wsTotal

*>--------------------------------------------------------
*> o método "setSectionWidth" ajusta o tamanho de uma seção

move 1 to wsSecao
move 400 to wsLargura
invoke umaStatusBar "setSectionWidth" using wsSecao wsLargura

move 2 to wsSecao
move 400 to wsLargura
invoke umaStatusBar "setSectionWidth" using wsSecao wsLargura

move 3 to wsSecao
move 800 to wsLargura
invoke umaStatusBar "setSectionWidth" using wsSecao wsLargura

*>--------------------------------------------------------
*> o método "SetSectionText" coloca um texto em uma seção.
*> Note que o método necessita de uma instância da classe
*> CharacterArray, passada como parâmetro.

invoke CharacterArray "withValue" using z"Relatório"
returning umTexto
move 1 to wsSecao
invoke umaStatusbar "setSectionText" using wsSecao umTexto
invoke umTexto "finalize" returning umTexto

*>--------------------------------------------------------
*> A classe Icondata cria uma instância a partir da informação
*> de um arquivo de ícone. Essas instâncias são utilizadas como
*> parâmetros em métodos de diversas classes
*> O método "getID" retorna o handle que representa o ícone

invoke IconData "fromFileZ" using z"printer.ico"
returning umIconeImpressora
invoke umIconeImpressora "getID" returning iHandle

*>--------------------------------------------------------
*> Agora usamos a mensagem SB-SETICON para colocar um ícone
*> em uma seção da barra de status.
*> Note que a API "SendMessageA" utiliza o número da seção
*> a partir do zero. Ou seja, a primeira seção é a seção
*> zero, a segunda seção é a seção número um, e assim por diante.

move 0 to wsSecao *> na verdade, representa a primeira seção
invoke umaStatusbar "getID" returning sHandle
call WAPI "SendMessageA" using by value sHandle
by value SB-SETICON size 4
by value wsSecao
by value iHandle

*>--------------------------------------------------------
*> A classe ProgressBar cria a barra de progressos, usando
*> como "parent window" a nossa barra de status.
*> Para posicionar a barra de progressos na seção correta,
*> precisamos pegar dados da seção, como linha, coluna,
*> largura e altura. Alguns ajustes foram feitos com essas
*> informações para centralizar a barra de progressos na seção

invoke Progressbar "new" using umaStatusbar
returning umaBarra
move 2 to wsSecao
invoke umaStatusbar "getSectionRect" using wsSecao x y w h
invoke umaBarra "create"
add 4 to y
add 2 to x
subtract 8 from w h
invoke umaBarra "setNativeXY" using x y
invoke umaBarra "setNativeWidthHeight" using w h
invoke umaBarra "show"

*>--------------------------------------------------------
*> Abaixo, colocamos um outro ícone e um novo texto na
*> terceira seção

invoke IconData "fromFileZ" using z"gravar16.ico"
returning umIconeOk
invoke umIconeOk "getID" returning iHandle

move 2 to wsSecao
invoke umaStatus "getID" returning sHandle
call WAPI "SendMessageA" using by value sHandle
by value SB-SETICON size 4
by value wsSecao
by value iHandle

invoke CharacterArray "withValue" using z"Alexandre Cortez"
returning umTexto
move 3 to wsSecao
invoke umaStatusbar "setSectionText" using wsSecao umTexto
invoke umTexto "finalize" returning umTexto

A partir daí, basta utilizar as rotinas acima para manipular cada uma das seções com outros ícones, outros textos e até mesmo utilizar a barra de progresso que foi criada.

Nenhum comentário: