Tutorial: Override em funções de sistema (PowerBuilder)
Overview
Você já teve a curiosidade de personalizar componentes padrões do seu software? Neste envolvente post, embarcaremos juntos numa jornada técnica repleta de criatividade e inovação. Exploraremos passo a passo como sobrescrever uma função de sistema - a MessageBox - em PowerBuilder, substituindo-a por uma janela customizada que abre um leque de novas possibilidades para interagir com o usuário. Este relato não é apenas um guia; é um convite para ampliar suas habilidades e trazer mais flexibilidade aos seus projetos. Venha conosco descobrir este fascinante processo cheio de potencial e aprendizado.
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:
E transformará nesta:
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:
- [readonly] string as_title
- [readonly] string as_message
- [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:
- 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.
- 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!