Tutorial: Override em funções de sistema (PowerBuilder)

Fiquei algum tempo sem saber se deveria fazer este post ou não. A razão da minha dúvida está no potencial de problemas que este tipo de procedimento pode causar.

No final das contas, acreditando que os leitores deste site são pessoas responsáveis, resolvi publicar este tutorial.

Neste post, vou mostrar como sobrescrever a MessageBox, que é uma função de sistema amplamente utilizada. O que vou fazer é utilizar uma janela customizada, o que vai ampliar muito as possibilidades de interação com o usuário.

Este exemplo pegará esta MessageBox:

Default MessageBox

E transformará nesta:

Custom MessageBox

 

 

Qual a diferença entre as duas janelas?

A diferença óbvia entre as duas é o estilo. A janela que criei é quadrada, possui um label do título com o ícone a esquerda e um link para maiores informações. Este link aponta para uma URL qualquer.  Ela poderia ter outros comportamentos, ser mais interativa e (obviamente) desenhada com um aspecto mais agradável, mas confesso que meus poderes de design não são lá muito bons…

 

Como fazer o override?

Este processo é bem simples: Basta criar outra função global com o mesmo nome e os mesmos argumentos. Neste caso, criaremos uma função chamada MessageBox, que possuirá os seguintes argumentos:

  1. [readonly] string as_title
  2. [readonly] string as_message
  3. [readonly] icon aic_icon

 

Dentro desta função, você vai fazer o que for necessário para customizar o MessageBox. No caso deste tutorial, você vai instanciar uma janela e passar as informações para ela.

Após salvar a nova função, você precisa fazer um Fullbuild para que o PowerBuilder a reconheça!

 

A janela que eu criei para este tutorial se chama w_new_messagebox e possui uma função publica que recebe os argumentos que serão apresentados nela. Tenho certeza que você vai fazer algo mais refinado, mas este formato funciona bem para fins didáticos.

No corpo da nova função MessageBox, vou inserir o seguinte código:

w_new_messagebox lw_msgbox

open(lw_msgbox)
lw_msgbox.wf_set_message_parm(as_title, MID(as_message, 1, LastPos(as_message, "#") -1), MID(as_message, LastPos(as_message, "#")+1), aic_icon)

return 1

 

Uma nota sobre a quebra que eu faço no argumento as_message:  Quando passo a mensagem, utilizo um # para separar a mensagem da URL que será utilizada, exemplo: “Texto da mensagem!#http://raccoon.ninja”.

Esta abordagem poderia causar problemas em produção, pois se a mensagem possuir #, isso vai estragar a divisão da string. Novamente, reforço que fiz desta forma para exemplificar.

Se você já concluiu o Fullbuild, está feito.

 

Atenção aos detalhes!

Sempre que você chamar a função Messagebox(“titulo”, “mensagem”, Information!), a sua janela será chamada. Todavia, se você chamar o Messagebox desta forma: MessageBox(“titulo”, “mensagem”), a função padrão será chamada.

Isso acontece por que esta função de sistema possui outros tipos de chamada (overload). Para resolver este problema, precisaríamos criar estes overloads na função MessageBox que acabamos de criar.  Apesar de também ser um procedimento simples, como criar overloads em funções ficará para um próximo post.

 

Por que criar fazer estes overrides?

A razão principal é a flexibilidade que eles podem trazer.

Adicionalmente, você também pode resolver problemas em sistemas legados com esta técnica.

Exemplos:

  1. Sistema antigo, onde diversos procedimentos são feitos em janelas e o resultado é informado ao usuário via Messagebox.  Agora você precisa utilizar estes procedimentos feitos em janelas como se fosse um serviço, ou seja, sem utilização de componentes visuais. Com esta técnica, você pode sobrescrever as chamadas para a MessageBox e utilizar uma flag global, que informa se o MessageBox deve ser exibido ou redirecionado para um arquivo de Log.
  2. Você pode salvar em um arquivo de log todas as MessageBox que informam um erro de banco, incluindo no arquivo informações sobre qual o usuário logado e qual janela ele estava utilizando.

 

Existem diversos outros exemplos que podem ser passados, mas estes são os mais simples e significativos que consegui pensar agora.

 

Tem exemplos de código?

Sim. Coloquei um exemplo no meu GitHub. Nele você tem uma janela onde você informa os parâmetros e chama a função MessageBox, que vai  exibir a janela customizada.

Link: https://github.com/brenordv/powerbuilder-snippets/tree/master/override-sys-funcs-demo

 

Espero ter ajudado!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, PowerBuilder and tagged , , , .