Criando uma caixa de mensagem com a API do Windows em NetExpress 3.1


yesorno

Quem usa DialogSystem já se acostumou a criar as caixas de mensagens e chamar direto pelo próprio Dialog. Já tinha visto alguns exemplos de criação das MessageBoxes dinamicamente, mas sempre achei trabalhoso demais.

Não faz muito tempo, comecei um projeto novo, que iria utilizar muitas dessas caixas, tanto de questionamento quanto de avisos para o usuário, resolvi então pesquisar um pouco mais sobre o assunto e colocá-lo em prática.

A idéia era simples: Criar uma classe para tratar essas mensagens, que deixasse a chamada do método mais simples possível.

E não é que deu certo ?

Agora para chamar uma MessageBox só preciso disso:

invoke wsrMsg "Question" using z"Confirma exclusão ?" returning wsResult

e para avisos, ainda mais simples:

invoke wsrMsg "Warning" using z"Data inválida"

Então vamos lá, o que é preciso para que você possa cria a sua classe também.

- No inicio do programa, declare o windows.cpy.
- Em special-names: call-convention 66 is WAPI.

E enfim, o método:

      *>================================================================
      *> Mensagem Sim / Não
      *>================================================================
       method-id. "Question".
 
       local-storage section.
 
       77 lsHwnd pic 9(09) comp-5.
       77 lsMsg pic x(255).
       77 lsCaption pic x(255).
       77 lsuType UINT.
       77 lsResult LRESULT.
 
       linkage section.
 
       77 lnkMsg pic x(255).
       77 lnkResult pic 9(09) comp-5.
 
       procedure division using lnkMsg returning lnkResult.
           // Pega o handle da janela que estiver ativa
           call WAPI "GetActiveWindow" returning lsHwnd
 
           // Move o texto e o título da janela
           move lnkMsg to lsMSG
           move z"Atenção !" to lsCaption
 
           // Seleciona o tipo de icone que irá aparecer
           move MB-ICONQUESTION to lsuType
 
           // Seleciona quais botões deverão aparecer
           add MB-YESNO to lsuType
 
           // Chamando a API
           call wapi MessageBoxA using by value lsHwnd
                           by reference lsMSG
                           by reference lsCaption
                           by value lsuType
                           returning lsResult
 
           move lsResult to lnkResult
 
       exit method
       end method "Question".

Já tem aí uma receita de bolo bacana pra quem quer começar.  Agradecimentos especiais ao Grande Mestre Jedi Alexandre Cortez.

Enjoy..

  1. #1 by André Bononi at July 14th, 2009

    Olá, Alexandre. Tudo bem ?
    Seguinte, estou tentando fazer uns testes com esta dicas mas estou encontrando alguns problemas.
    Eu não sei por que cargas d’águas as chamadas a API nem sempre funcionam. A mesma rotina numa determinada pasta funciona, em outra não. Por quê?

  2. #2 by admin at July 14th, 2009

    André Bononi :

    Olá, Alexandre. Tudo bem ?
    Seguinte, estou tentando fazer uns testes com esta dicas mas estou encontrando alguns problemas.
    Eu não sei por que cargas d’águas as chamadas a API nem sempre funcionam. A mesma rotina numa determinada pasta funciona, em outra não. Por quê?

    Olá André,

    Fica complicado dizer assim sem ver a sua classe, o que pode estar acontecendo. Mas pra tentar ajudar você, eu disponibilizei aqui no site, na sessão de Downloads, a classe que utilizo nos meus projetos.

    Não me recordo desse problema ter acontecido comigo antes. Quem sabe comparando as duas você não descobre algo que esqueceu.

    Espero que ajude, abraço.

    LeX

  3. #3 by Antonio João at August 24th, 2009

    Olá, Alexandre.

    Parabéns pela iniciativa.
    Eu também preciso disseminar coisas COBOL pela rede, quanto mais gente públicando, melhor.

    Só não concordo com uma coisa, você escreveu “Jedi” com jota minusculo, quando se referiu ao Mestre Jedi Alexandre Cortez.

  4. #4 by LeX at August 24th, 2009

    Antonio João :

    Olá, Alexandre.

    Parabéns pela iniciativa.
    Eu também preciso disseminar coisas COBOL pela rede, quanto mais gente públicando, melhor.

    Só não concordo com uma coisa, você escreveu “Jedi” com jota minusculo, quando se referiu ao Mestre Jedi Alexandre Cortez.

    Antônio,

    Obrigado pela visita e pelo comentário.

    E quanto ao Jedi, está em maiúscula sim, a fonte do blog dá uma enganada, mas está sim. rs.

    Abraço.

    LeX

(will not be published)
  1. Nenhuma trackback.