Vamos "tentar" tornar simples a tarefa de centralizar uma janela no desktop ? Apesar do Dialog System servir como opção no desenvolvimento de interfaces gráficas do Microfocus NetExpress, ele não oferece nenhum recurso ao desenvolvedor para centralizar uma simples tela na área de trabalho. Apesar de eu adorar o COBOL e principalmente a ferramenta NetExpress, eu confesso que é uma vergonha para nós desenvolvedores ter que fazer "malabarismos" para centralizar uma simples janela no desktop.
Para centralizarmos a janela no desktop, precisamos criá-la no evento SCREENSET-INITIALIZED da GS, antes que a janela apareça para o usuário. Em nosso exemplo, nossa janela chama-se WIN-PRINCIPAL:
DS-FUNCAO X 30.0
SCREENSET-INIITIALIZED
..CALLOUT-PARAMETER 1 CONFIG-FLAG $NULL
..CALLOUT-PARAMETER 2 CONFIG-VALUE $NULL
..MOVE 15 CONFIG-FLAG
..MOVE 1 CONFIG-VALUE
..CALLOUT "dsrtcfg" 3 $PARMLIST
*
..CREATE-WINDOW WIN-PRINCIPAL
..MOVE "CENTRALIZARJANELA" DS-FUNCAO
..RETC
Note que no evento SCREENSET-INITIALIZED, a janela ainda não aparece para o usuário. O comando CREATE-WINDOW cria a janela e toda a sua estrutura interna mas a mesma ainda não aparece para o usuário. É o momento de pegarmos as coordenadas da janela, além de sua largura e altura, para reposicioná-la no desktop. Isso será feito no programa Cobol. Na procedure division, precisamos alterar a section Program-Body para executar nossa operação. Além disso, vamos utilizar alguns vocabulários do Dialog System, portanto, o vocabulary copybook deve ser gerado também. Abaixo, cada uma das alterações que devem ser feitas em seu fonte Cobol:
special-names.
Para centralizarmos a janela no desktop, precisamos criá-la no evento SCREENSET-INITIALIZED da GS, antes que a janela apareça para o usuário. Em nosso exemplo, nossa janela chama-se WIN-PRINCIPAL:
DS-FUNCAO X 30.0
SCREENSET-INIITIALIZED
..CALLOUT-PARAMETER 1 CONFIG-FLAG $NULL
..CALLOUT-PARAMETER 2 CONFIG-VALUE $NULL
..MOVE 15 CONFIG-FLAG
..MOVE 1 CONFIG-VALUE
..CALLOUT "dsrtcfg" 3 $PARMLIST
*
..CREATE-WINDOW WIN-PRINCIPAL
..MOVE "CENTRALIZARJANELA" DS-FUNCAO
..RETC
Note que no evento SCREENSET-INITIALIZED, a janela ainda não aparece para o usuário. O comando CREATE-WINDOW cria a janela e toda a sua estrutura interna mas a mesma ainda não aparece para o usuário. É o momento de pegarmos as coordenadas da janela, além de sua largura e altura, para reposicioná-la no desktop. Isso será feito no programa Cobol. Na procedure division, precisamos alterar a section Program-Body para executar nossa operação. Além disso, vamos utilizar alguns vocabulários do Dialog System, portanto, o vocabulary copybook deve ser gerado também. Abaixo, cada uma das alterações que devem ser feitas em seu fonte Cobol:
special-names.
call-convention 66 is WAPI.
class-control.
class-control.
Window is class "window".
working-storage section.
77 handle8 pic 9(08) comp-x value zeros.
77 handle9 pic 9(09) comp-5 value zeros.
77 umaJanela object reference value null.
77 x pic 9(09) comp-5 value zeros.
77 y pic 9(09) comp-5 value zeros.
77 wDesktop pic 9(09) comp-5 value zeros.
77 hDesktop pic 9(09) comp-5 value zeros.
77 wJanela pic 9(09) comp-5 value zeros.
77 hJanela pic 9(09) comp-5 value zeros.
78 SM-CXSCREEN value 0.
78 SM-CYSCREEN value 1.
procedure division.
Program-Body SECTION.
....evaluate ds-Funcao
......when "CENTRALIZARJANELA" perform CentralizarJanela
....end-evaluate
....perform Call-Dialog-System.
CentralizarJanela section.
....move-object-handle win-principal handle8
....move handle8 to handle9
....invoke Window "fromHandleWithClass" using handle9 Window
....returning umaJanela
....call WAPI "GetSystemMetrics" using by value SM-CXSCREEN
....returning wDesktop
....call WAPI "GetSystemMetrics" using by value SM-CYSCREEN
....returning hDesktop
....invoke umaJanela "getNativeWidthHeight" using wJanela hJanela
....compute x = (wDesktop - wJanela) / 2
....compute y = (hDesktop - hJanela) / 2
....invoke umaJanela "scaleXYUp" using x y
....invoke umaJanela "setXY" using x y
Quase 3 dúzias de linhas de programação para centralizar uma janela no desktop. Se alguém tiver alguma outra solução melhor que essa, por favor, eu agradeceria muito se pudesse me enviar para que eu a publique aqui. Caso contrário, vou achar que a Microfocus realmente adora um "circo"...
Update: o post foi corrigido depois da observação do meu amigo Bruno. Obrigado, Bruno.
working-storage section.
77 handle8 pic 9(08) comp-x value zeros.
77 handle9 pic 9(09) comp-5 value zeros.
77 umaJanela object reference value null.
77 x pic 9(09) comp-5 value zeros.
77 y pic 9(09) comp-5 value zeros.
77 wDesktop pic 9(09) comp-5 value zeros.
77 hDesktop pic 9(09) comp-5 value zeros.
77 wJanela pic 9(09) comp-5 value zeros.
77 hJanela pic 9(09) comp-5 value zeros.
78 SM-CXSCREEN value 0.
78 SM-CYSCREEN value 1.
procedure division.
Program-Body SECTION.
....evaluate ds-Funcao
......when "CENTRALIZARJANELA" perform CentralizarJanela
....end-evaluate
....perform Call-Dialog-System.
CentralizarJanela section.
....move-object-handle win-principal handle8
....move handle8 to handle9
....invoke Window "fromHandleWithClass" using handle9 Window
....returning umaJanela
....call WAPI "GetSystemMetrics" using by value SM-CXSCREEN
....returning wDesktop
....call WAPI "GetSystemMetrics" using by value SM-CYSCREEN
....returning hDesktop
....invoke umaJanela "getNativeWidthHeight" using wJanela hJanela
....compute x = (wDesktop - wJanela) / 2
....compute y = (hDesktop - hJanela) / 2
....invoke umaJanela "scaleXYUp" using x y
....invoke umaJanela "setXY" using x y
Quase 3 dúzias de linhas de programação para centralizar uma janela no desktop. Se alguém tiver alguma outra solução melhor que essa, por favor, eu agradeceria muito se pudesse me enviar para que eu a publique aqui. Caso contrário, vou achar que a Microfocus realmente adora um "circo"...
Update: o post foi corrigido depois da observação do meu amigo Bruno. Obrigado, Bruno.
4 comentários:
Muito útil esse post mesmo. incrível como a Micro Focus deixou isso escapar...
Só um observação ao invokar dessa maneira
"invoke window "fromHandleWithClass" using handle9"
Deu erro 114 na minha aplicação, mas resolvido invokando desta maneira
"invoke "fromHandleWithClass" using handle9 window"
Espero ter ajudado tbm! :)
Parabéns pelo blog.
você foi perfeito, Bruno... quem sabe outras pessoas encontrem o mesmo problema ao testarem a rotina.. dessa forma teremos certeza que os nossos amigos leitores experimentam as dicas aqui no blog.. rs.. rs.. rs.. um abraço, rapaz...
Muito interessante..
Já estou mesmo pensando em começar a utilizar o Vocabulário, acho que esse era o incentivo que faltava.. rsrs..
Sempre usei a rotina da BMA, com PANELS2. Mas, como quero entrar no mundo da OOP, vou ter que começar a mudar algumas coisas.
Abração !
Caros amigos, vcs poderiam me mandar esse programa em anexo, nao sei se fiz alguma coisa errada, mas o meu nao centraliza, se poder eu agradeço, renato@actualy.com.br
obrigado e parabens pela iniciativa
Postar um comentário