quarta-feira, 19 de dezembro de 2012

DataWindows com Marca d'água


A utilização de imagens como marca d'água de relatórios ou documentos é uma prática normalmente associada à segurança. Sistemas precisam inserir marcas d'águas em páginas impressas, a fim de deixar visível que a impressão foi realizada sobre uma circunstância especial.

Existem textos bastante comuns utilizados como marca d'água, como por exemplo: "Rascunho", "Cancelado", "Sem validade", "Para uso interno", etc.

Mas como utilizar marca d'águas no PowerBuilder? Bem, isto é possível através da inserção de imagens nas datawindows, mas imagine o trabalho que pode dar se a quantidade de dataobjects do seu sistema seja alta.
A fim de evitar que cada datawindow seja alterada, eu criei um código que insere a marca d'água dinamicamente em uma datawindow. Veja mais abaixo.



String  ls_marca_dagua
String ls_datawindow_syntax
Long  ll_pos

// Recupera dinamicamente a sintaxe da datawindow
ls_datawindow_syntax = dw_report.DESCRIBE("Datawindow.syntax")

// Constrói a sintaxe do controle referente a imagem da marca dágua
ls_marca_dagua= 'bitmap(band=foreground filename="Imagens\Marca.gif" x="14" y="28" height="2572" width="2194" border="0"  name=p_1 visible="1" )'

// Recupera a posição do caractere em que será inserido o controle
ll_pos = Pos(ls_datawindow_syntax, "htmltable(")

// Modifica a sintaxe data datawindow, inserindo o controle
ls_datawindow_syntax = MID(ls_datawindow_syntax, 1, ll_pos -1) + ls_marca_dagua + MID(ls_datawindow_syntax, ll_pos , LEN(ls_datawindow_syntax))

// Recria a datawindow com a nova sintaxe
dw_report.CREATE( ls_datawindow_syntax)


Perceba no código acima que eu trabalhei com a imagem no formato GIF. O motivo disto foi para tentar colocar um pouco de "transparência" à minha marca d'água. Eu só precisei utilizar este formato porque desenvolvi o código fonte em PowerBuilder 10. Se você estiver utilizando a versão 11 do PowerBuilder ou uma superior, pode usar dois recursos mais eficientes para a transparência:

  • Ou utilizar uma imagem no formato PNG;
  • Ou definir o atributo transparency para o controle de imagem. Veja como ficaria:


...

// Constrói a sintaxe do controle referente a imagem da marca dágua
ls_marca_dagua= 'bitmap(band=foreground filename="Imagens\Marca.gif" x="14" y="28" height="2572" width="2194" border="0"  name=p_1 visible="1" transparency="50")'

...


A imagem com a marca utilizada por mim foi esta:


Agora, veja um relatório de exemplo com e sem marca d'água.





terça-feira, 4 de dezembro de 2012

Verificação de IPs (ping)

Certas aplicações necessitam utilizar recursos da rede ou se conectar com outros computadores. Infelizmente, em PowerBuilder, as bibliotecas oferecidas para este tipo de conexão são bastante pobres.

Neste post eu apenas dou uma dica para realizar uma simples verificação de IP, ou seja, executar o clássico comando "ping" através do PowerBuilder. Faremos isto através de instruções fornecidas pelo próprio Shell do sistema operacional.

Abaixo eu apresento um exemplo de como isto pode ser implementado.

OleObject lo_Shell
Integer  li_return
String ls_ip

ls_ip = sle_ip.text

lo_Shell = CREATE OleObject
li_return = lo_Shell.ConnectToNewObject( "WScript.Shell" )

IF li_return <> 0 THEN
Messagebox("Falha", "Falha ao tentar instanciar Shell do Sistema Operacional.")
END IF

li_return =  lo_Shell.Run("ping -n 1 -w 300 " + ls_ip, 0, TRUE)

IF li_return <> 0 THEN
Messagebox("Falha", "Host indisponível.")
END IF


sábado, 1 de dezembro de 2012

Validação de campos de e-mail em PowerBuilder

Neste post eu apresento um código bastante útil para quem está trabalhando com campos de e-mail em uma aplicação.

Por questões de segurança e padronização, ao permitir que o usuário de seu sistema insira um e-mail, você deve validá-lo quanto ao seu formato. Abaixo segue um código em PowerBuider, mas que também pode ser adaptado a outras linguagens, cujo resultado é a validação de um-mail.

string  ls_email
boolean lb_email_valido

// Código para setar o e-mail em ls_email
ls_email = of_getEmail()

lb_email_valido = FALSE

IF (NOT ISNULL(ls_email)) AND Trim(ls_email) <> "" THEN
IF match(ls_email,'^[a-zA-Z0-9][a-zA-Z\0-9\-_\.]*[^.]\@[^.][a-zA-Z\0-9\-_\.]+\.[a-zA-Z\0-9\-_\.]*[a-zA-Z\0-9]+$'THEN
lb_email_valido = TRUE
END IF
END IF