Você está na página 1de 48

________________________________________________

PROGRAMAÇÃO ADVPL OOP

1
Índice
______________________________________________________________________________________________________________
Introdução à Linguagem Orientada a Objetos..............4
Conceitos Básicos da OOP..........................................4
Classe..................................................................................................................................4
Objeto..................................................................................................................................4
Mensagem...........................................................................................................................5
Método................................................................................................................................5
Método CONSTRUCTOR..............................................................................................5
Método DESTRUCTOR.................................................................................................5
Eventos................................................................................................................................5
Herança...............................................................................................................................6
Encapsulamento..................................................................................................................6
Criação de Janelas padrão OOP...................................7
Sintaxe do método Constructor da classe TWindow:..........................................................8
Propriedades dos objetos da classe TWindow.....................................................................8
Principais propriedades de estilo de janela.....................................................................9
Tabela de cores padrão..................................................................................................10
Métodos da classe TWindow.............................................................................................11
Sintaxe do método Activate...........................................................................................11
Exemplo de Código Fonte para Criação de um Objeto de Janela.....................................12
Caixas de Diálogo no padrão OOP.............................13
Sintaxe do método Constructor da classe TDialog:..........................................................13
Propriedades dos objetos da classe TWindow...................................................................13
Principais propriedades de estilo de caixas de diálogo.................................................14
Tabela de cores padrão..................................................................................................14
Métodos da classe TDialog...............................................................................................15
Sintaxe do método Activate..........................................................................................15
Exemplo de Código Fonte para Criação de Objeto de Janela...........................................16
Objetos de Controle.................................................17
Botões................................................................................................................................17
Sintaxe da Classe TBUTTON.......................................................................................17
Sintaxe da Classe SBUTTON.......................................................................................18
Exemplos de Código Fonte para Criação de um Objetos de botões.................................19
Código Fonte exemplo para criação de botões simples................................................19
Código fonte exemplo para criação de botões com bitmap..........................................20
Rótulos de Texto................................................................................................................22
Sintaxe da Classe TSAY................................................................................................22
Seleção de fontes para o objeto de rótulo de texto........................................................23
Sintaxe da classe TFont.............................................................................................23
Exemplo de criação de um objeto de fonte...............................................................23
Código fonte exemplo para criação de rótulos..............................................................24
Caixas de Texto.................................................................................................................25
Sintaxe da Classe TGET...............................................................................................25
Código fonte exemplo para criação de caixas de texto.................................................26
CheckBox..........................................................................................................................27
Sintaxe da Classe TCheckBox......................................................................................27

2
Código fonte exemplo para criação de CheckBoxes.....................................................28
ComboBox........................................................................................................................29
Sintaxe da Classe TComboBox.....................................................................................29
Código fonte exemplo para criação de ComboBoxes...................................................30
ListBox..............................................................................................................................31
Sintaxe da Classe TListBox..........................................................................................32
Código fonte exemplo para criação de ListBoxes.........................................................32
Radio Button.....................................................................................................................33
Sintaxe da Classe TRadMenu.......................................................................................34
Código fonte exemplo para criação de Radio Button...................................................35
Folders...............................................................................................................................36
Sintaxe da Classe TFolder.............................................................................................36
Métodos importantes da classe TFolder........................................................................36
Código fonte exemplo para criação de múltiplos Folders com vários objetos dentro. .37
Browse...............................................................................................................................38
Sintaxe da Classe TWBrowse.......................................................................................38
Código fonte exemplo para criação de browse completo.............................................39
Criação de janelas mestre-detalhe OOP.....................41
Modelo 3...........................................................................................................................41
Sintaxe da classe MSMGET.........................................................................................42
Construindo um código fonte para criação de um modelo 3.........................................43
Sintaxe da classe MSMGET.........................................................................................44
Criação de relatórios com qualidade gráfica..............51
Classe TMSPRINTER.......................................................................................................51
Sintaxe da Classe TMSPRINTER.................................................................................51
Principais métodos da classe TMSPRINTER...............................................................51
Principais métodos para impressão de dados................................................................51
Say.............................................................................................................................51
SayBitmap.................................................................................................................52
Box............................................................................................................................52
Line...........................................................................................................................52
Código fonte exemplo para impressão de relatórios com qualidade gráfica.................53
Rotinas de Web........................................................54
Envio de e-mail pelo sistema (Send Mail) através de SMTP............................................54
Função para conectar-se ao servidor.............................................................................54
Função para envio da mensagem..................................................................................54
Função para desconectar-se do servidor........................................................................55
Código fonte exemplo para envio de e-mails pelo sistema...........................................55
Workflow...........................................................................................................................56
Configuração dos parâmetros do workflow..................................................................56
Configuração doAgendamento do envio do workflow.................................................58
Configuração doAgendamento do envio do workflow.................................................58
Configuração do JOB no APxsrv.ini.............................................................................58
Código fonte para iniciar o job do workflow................................................................59
Ponto de entrada chamado na confirmação do cadastro de produtos............................59
Rotina de tratamento do retorno do workflow..............................................................60
Rotina de tratamento do Timeout do workflow............................................................61
Código fonte HTML utilizado no exemplo de atualização de preços pelo workflow. .61
3
Introdução à Linguagem Orientada a Objetos
A programação orientada à objetos é uma modalidade de
desenvolvimento de software que difere muito da conhecida linguagem
procedural que usamos no dia-a-dia.
Ela apresenta uma estratégia diferenciada de organizar, planejar,
escrever, atualizar e fazer manutenção do software.
As linguagens de alto nível representam uma conexão inteligente entre
o programador e o computador. Sua evolução é paralela às técnicas e
métodos do desenvolvimento do software, sendo inspirada pelo anseio
de criar componentes de softwares robustos e reutilizáveis que reduzem
os ciclos e o tempo da produção do software. Esta diminuição no tempo
de produção é ainda mais relevante quando uma equipe de
programadores está trabalhando em um projeto de software.
A história das linguagens de programação reflete a evolução de
linguagens estruturadas e destas para as orientadas ao objeto. As
linguagens estruturadas são linguagens procedurais, onde um programa
é particionado em um conjunto de procedimentos e funções. A
seqüência de rotinas descreve como os dados são manipulados.
Especificamente, o programador controla a interação entre o código e os
dados. O foco principal das linguagens procedurais é a rotina, enquanto
foco secundário são os dados que estão sendo manipulados.

Conceitos Básicos da OOP


Classe
Uma classe detalha os campos de dados de um objeto e os métodos
que atuam sobre os dados.
A classe é o nível macro do objeto, de onde são herdados suas
características e métodos. Podemos dizer que todo objeto descende de
uma classe.

Objeto
Um objeto é um membro de uma classe, tendo em si todas as
características da classe na qual foi herdado. Suas propriedades são
protegidas por conceitos de encapsulamento.

Mensagem
Uma mensagem é uma solicitação enviada a um objeto para chamar
um de seus métodos. Também podem ser acionadas por algum evento.

4
Método
Um método é o procedimento ou função chamado para atuar num
objeto. Um método define como uma mensagem deve ser executada.
A OOP (Programação Orientada a Objetos) permite uma abordagem mais
simples para a utilização de dados usando objetos que respondem a
mensagens. Esta abordagem demonstra uma noção de que objetos em
um programa são similares a alunos em uma sala de aula – você passa
um exercício ou um trabalho para um aluno ou à um grupo de alunos (o
objeto, neste caso) solicitando que lhe seja apresentado uma solução
para um determinado problema. Supondo-se que o trabalho seja
passado ao aluno ou grupo certo, ele responderá usando sua experiência
e recursos. O método pelo qual o trabalho é executado depende do
objeto receptor (aluno). Os detalhes da resposta são transparentes ao
professor (emissor da mensagem). Todo objeto por regra possui um
método CONSTRUCTOR e um método DESTRUCTOR.

Método CONSTRUCTOR
É o responsável por ativar o objeto durante a execução de uma rotina. Esse
método aloca o objeto na memória e o torna disponível para uso. O objeto será
carregado com todas suas propriedades e particularidades. Somente após o
método CONSTRUCTOR ser disparado é que poderemos em seguida acertar
suas propriedades e eventos. No ADVPL, o método CONSTRUCTOR é chamado
pela cláusula New(), como veremos nos exercícios a seguir.

Método DESTRUCTOR
Após a sua utilização, cada objeto deve ser removido da memória, para que no
decorrer da aplicação a performance não seja degradada. Para isso, utilizaremos
o método DESTRUCTOR. No ADVPL, os métodos a serem utilizados são End() ou
Destroy().

Eventos
Evento nada mais é do que uma ação acontecendo em um determinado
momento no objeto. Na programação OOP, um evento pode disparar
outras rotinas e modificar o processamento. Foi criado para interagir
com as ações do usuário determinando o processamento de forma
inteligente. Vamos imaginar uma tela de entrada de dados. Podemos ter
vários eventos relacionados ao usuário que a estiver operando, como
por exemplo, o clique de um mouse, o movimento do cursor do mouse
sobre algum campo, a seleção de uma determinada tecla, entre outros.
Dependendo da ação, determinamos o que será executado e haverá
interação com o usuário.

Herança
Uma outra característica da OOP é a herança, um recurso que produz
um grande efeito, que lhe permite criar subclasses. Cada subclasse
recebe as características de sua classe-mãe (da mesma forma que uma
criança traz consigo características peculiares de seus pais). Uma

5
subclasse acrescenta novos atributos às classes herdadas e pode
também substituir qualquer atributo herdado.

Encapsulamento
Uma das principais características da OOP é o encapsulamento, pois
evita que o programador não precise acessar diretamente os campos de
dados de um objeto. Para isto é necessário criar métodos que serão os
responsáveis pelo tratamento de dados.
Encapsulamento na verdade é unir numa única estrutura, campos de
dados e códigos que agirão sobre eles (métodos). O grande benefício do
encapsulamento é que o programador trabalha voltado única e
exclusivamente ao campo de dados que deseja atingir com seu código.
Outra grande vantagem a ser considerada é a proteção do código
interno, fazendo com que rotinas externas não interfiram diretamente
em seu código.

Criação de Janelas padrão OOP


Na programação ADVPL OOP, temos alguns objetos poderosos utilizados
na criação de janelas. Porém antes de nos aprofundarmos nesses
objetos, vamos aprimorar nosso conhecimento no funcionamento das
janelas e caixas de diálogo.
Uma janela nada mais é do que um objeto. As características de um
objeto de janela ou caixa de diálogo correspondem numa área
retangular na tela, que recebe e processa mensagens, sempre uma de
cada vez, além de interagir com o usuário através de eventos.
Com o objeto de janelas, temos a liberdade de cria-las visando qualquer
finalidade, onde o limite é a criatividade de cada desenvolvedor.

Durante a criação das janelas, teremos a necessidade de ajustar outros


objetos dentro dela. Dependendo de cada necessidade, poderemos
inserir botões, bitmaps, caixas de texto, rótulos entre outros mais.
Se adicionarmos objetos em nossa área de desenvolvimento, por padrão
cada objeto será independente e ficará separado uns dos outros. Dessa
forma, ao criar um botão após criar a janela, ambos apareceriam
separados na tela e não teriam relação alguma. Então, ao adicionarmos
mais objetos em nossos projetos, como fazer com que eles se tornem
integrantes de outro objeto? Simples: os objetos possuem uma
propriedade que identifica quem é o objeto pai. Ao definir essa
propriedade, o objeto filho será sempre criado dentro do objeto pai na
qual terá relação direta, tornando-o independente dos demais objetos
que compõem o projeto.
Essa capacidade de agrupar objetos dentro de outros objetos é chamado
de parent. No ADVPL, a propriedade que define o parent do objeto é o
oParent.

6
A classe que utilizaremos para criação de janelas no ADVPL é a
TWINDOW. Essa classe será responsável pela geração da caixa
retangular com todas as características de uma tela padrão, onde dentro
dela deverão ser inseridos novos objetos de acordo com a necessidade.
A classe TWINDOW possui grande flexibilidade em seu
desenvolvimento, permitindo a criação de janelas em tamanhos
definidos, título, botões de maximizar e minimizar, cores de fundo, além
de uma grande funcionalidade para desenvolvedores que utilizam a
programação estruturada, a possibilidade de criar janelas baseadas em
pixel na mesma métrica das janelas em modo texto.

Importante: Para utilizar essa classe, é necessária a utilização de uma


include especial chamada fwmsgs.h, que não está inclusa no pacote
original do ADVPL, mas é facilmente encontrada na internet em sites
relacionados ao Clipper.

Sintaxe do método Constructor da classe TWindow:

<oWnd> := TWindow():New(<nTop>,<nLeft>,<nBottom>,<nRight>,<cTitle>,
<nStyle>,<oMenu>,<oBrush>,<oIcon>,<oParent>,[<.vScroll.>],
[<.hScroll.>],<nClrFore>, <nClrBack>, <oCursor>,[Upper(<(border)>)], !
<.NoSysMenu.>,!<.NoCaption.>,!<.NoIconize.>,!<.NoMaximize.>,<.pixel.>)

Propriedades dos objetos da classe TWindow

nTop Linha inicial.


nLeft Coluna inicial.
nBottom Linha final.
nRight Coluna final.
cTitle Título da janela.
nstyle Estilo da janela. Através dessa propriedade podemos
personalizar suas funcionalidades de acordo com a
necessidade.

Principais propriedades de estilo de janela

7
WS_BORDER WS_EX_TRANSPARENT
WS_CAPTION WS_EX_TOOLWINDOW
WS_CHILD WS_EX_TOPMOST
WS_CLIPCHILDREN WS_EX_WINDOWEDGE
WS_CLIPSIBLINGS WS_HSCROLL
WS_DISABLED WS_MAXIMIZE
WS_DLGFRAME WS_MAXIMIZEBOX
WS_EX_ACCEPTFILES WS_MINIMIZE
WS_EX_CLIENTEDGE WS_MINIMIZEBOX
WS_EX_CONTEXTHELP WS_OVERLAPPED
WS_EX_DLGMODALFRAME WS_POPUP
WS_EX_LEFTSCROLLBAR WS_SYSMENU
WS_EX_MDICHILD WS_THICKFRAME
WS_EX_NOPARENTNOTIFY WS_VISIBLE
WS_EX_RIGHT WS_VSCROLL
WS_EX_RTLREADING
oMenu Não utilizado.
oBrush Não utilizado.
oIcon Não utilizado.
oParent Identifica qual é o objeto pai. Se não declarado,
assume a janela principal do sistema.
vScroll Não utilizado.
hScroll Não utilizado.
nClrFore Não utilizado.

nClrBack Seleciona a cor de fundo da janela. Default:


branca.

Tabela de cores
Low Intensity colors padrão High Intensity Colors

CLR_BLACK CLR_GRAY
CLR_BLUE CLR_HBLUE
CLR_GREEN CLR_HGREEN
CLR_CYAN CLR_HCYAN
CLR_RED CLR_HRED
CLR_MAGENTA CLR_HMAGENTA
CLR_BROWN CLR_YELLOW
CLR_HGRAY CLR_WHITE
CLR_LIGHTGRAY
CLR_HGRAY
oCursor Não utilizado.
Border Não utilizado.
SysMenu .T. exibe botão sysmenu, .F. inibe.
(.T./.F.)
Caption (.T./.F.) .T. exibe titulo da janela, .F. inibe.
Iconize Não utilizado.
Maximize .T. exibe botão maximize, .F. inibe.

8
(.T./.F.)
Pixel (.T./.F.) Define tipo de posicionamento e métrica da janela,
.T. em pixels, .F., modo texto (80/24).

Métodos da classe TWindow

Activate Principal método da classe TWindow, pois, é esse


método que vai ativar a janela na tela. Deve
obrigatoriamente ser chamado sempre que o
método construtor de uma janela for acionado.
Este método também possui recursos de
monitoramento de eventos. Quando os eventos
forem declarados dentro deste método, não será
mais necessário declara-los de forma estrutural.

Sintaxe do método Activate

<oWnd>:Activate( [ Upper(<(show)>) ],
<oWnd>:bLClicked [ := \{ |nRow,nCol,nKeyFlags| <uLClick> \} ],
<oWnd>:bRClicked [ := \{ |nRow,nCol,nKeyFlags| <uRClick> \} ],
<oWnd>:bMoved [ := <{uMove}> ],
<oWnd>:bResized [ := <{uResize}> ],
<oWnd>:bPainted [ := \{ | hDC, cPS | <uPaint> \} ],
<oWnd>:bKeyDown [ := \{ | nKey | <uKeyDown> \} ],
<oWnd>:bInit [ := \{ | Self | <uInit> \} ],
[<{uUp}>], [<{uDown}>], [<{uPgUp}>], [<{uPgDn}>],
[<{uLeft}>], [<{uRight}>], [<{uPgLeft}>], [<{uPgRight}>],
[<{uValid}>], [\{|nRow,nCol,aFiles|<uDropFiles>\}],
<oWnd>:bLButtonUp [ := <{uLButtonUp}>
bLClicked Bloco de código disparado quando acionado botão
esquerdo do mouse.
bRClicked Bloco de código disparado quando acionado botão
direito do mouse.
bLDblClick Bloco de código disparado quando acionado duplo
clique do mouse.
bGotFocus Bloco de código disparado quando a janela pega o
foco para si. Equivale à cláusula when.
bLostFocus Bloco de código disparado quando a janela perde o
foco. Equivale à cláusula valid.
9
bKeyDown Bloco de código disparado quando pressionada
uma tecla. Equivale à cláusula inkey(0).
Ex.: oWnd:bKeyDown := { | nKey,nFlags | MiFuncion (nKey) }
lFocused .T. está com o foco, .F. não está com foco.
End Método de finalização do objeto.
Destroy Método destructor do objeto.
SetFocus Força a obtenção do foco.
Refresh Executa a atualização dos controles da tela.

Exemplo de Código Fonte para Criação de um Objeto de Janela

#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_JAN ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de janela simples. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_JAN()

Local oWnd //Objeto de janela


Local _nStyle := WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX //Estilo da janela

oWnd := TWindow():New(10,10,20,40,"Exemplo de janela",_nStyle,,,,,.T.,.T.,,,,,;


.T.,.T.,.T.,.T.,.F.)

oWnd:Activate() //Ativa a janela


oWnd:Destroy()

Return

Caixas de Diálogo no padrão OOP


As caixas de diálogo são um tipo peculiar de janela que não possuem
botões de maximizar e minimizar. São criadas apenas para estabelecer
diálogo entre o programa e o usuário, oferecendo uma gama de
controles (objetos) que tornam a caixa de diálogo um recurso poderoso
para entrada e saída de dados.
Caixas de diálogo podem trabalhar em dois modos, modal e não-modal.
As janelas modais tem objetivo não permitir que o usuário mude para
outra janela enquanto não encerrar a rotina atual. Esse recurso é muito
interessante quando se trata de uma aplicação com diversas caixas de
10
diálogo, pois, podemos fazer com que o usuário as utilizem na seqüência
certa do processamento. Para isso, usamos a propriedade oParent,
fazendo com que dessa forma as caixas de diálogo fiquem dependentes
sempre da anterior, criando um conceito de cascata. A classe utilizada
para a criação da caixa de diálogo é a TDIALOG, derivada da classe
TWINDOW, sendo assim, as propriedades e métodos são bem similares.

Sintaxe do método Constructor da classe TDialog:

<oDlg> = TDialog():New( <nTop>, <nLeft>, <nBottom>, <nRight>,<cTitle>,


<cResName>, <hResources>, <.vbx.>, <nStyle>,<nClrText>, <nClrBack>,
<oBrush>, <oWnd>, <.pixel.>,<oIco>, <oFont>, <nHelpId>, <nWidth>,
<nHeight>)

Propriedades dos objetos da classe TWindow

nTop Linha inicial.


nLeft Coluna inicial.
nBottom Linha final.
nRight Coluna final.
cTitle Título da caixa de diálogo.
cResName Não utilizado.
hResources Não utilizado.
Vbx Não utilizado.
NStyle Estilo da janela. Através dessa propriedade podemos
personalizar suas funcionalidades de acordo com a
necessidade.

Principais propriedades de estilo de caixas de diálogo


WS_BORDER WS_EX_TRANSPARENT
WS_CAPTION WS_EX_TOOLWINDOW
WS_CHILD WS_EX_TOPMOST
WS_CLIPCHILDREN WS_EX_WINDOWEDGE
WS_CLIPSIBLINGS WS_HSCROLL
WS_DISABLED WS_MAXIMIZE
WS_DLGFRAME WS_MAXIMIZEBOX
WS_EX_ACCEPTFILES WS_MINIMIZE
WS_EX_CLIENTEDGE WS_MINIMIZEBOX

WS_EX_CONTEXTHELP WS_OVERLAPPED
WS_EX_DLGMODALFRAME WS_POPUP
WS_EX_LEFTSCROLLBAR WS_SYSMENU
WS_EX_MDICHILD WS_THICKFRAME
WS_EX_NOPARENTNOTIFY WS_VISIBLE
WS_EX_RIGHT WS_VSCROLL
WS_EX_RTLREADING
nClrText Não utilizado.

11
nClrBack Seleciona a cor de fundo da janela. Default:
branca.

Tabela de cores
Low Intensity colors padrão High Intensity Colors

CLR_BLACK CLR_GRAY
CLR_BLUE CLR_HBLUE
CLR_GREEN CLR_HGREEN
CLR_CYAN CLR_HCYAN
CLR_RED CLR_HRED
CLR_MAGENTA CLR_HMAGENTA
CLR_BROWN CLR_YELLOW
CLR_HGRAY CLR_WHITE
CLR_LIGHTGRAY
CLR_HGRAY
oBrush Não utilizado.
oWnd Parent da caixa de diálogo.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da janela,
.T. em pixels, .F., modo texto (80/24).
oIco Não utilizado.
oFont Não utilizado.
nHelpID Não utilizado.
nWidth Não utilizado.
nHeight Não utilizado.

Métodos da classe TDialog

Activate Principal método da classe TDialog, pois, é esse


método que vai ativar a caixa na tela. Deve
obrigatoriamente ser chamado sempre que o
método construtor de uma janela for acionado.
Este método também possui recursos de
monitoramento de eventos. Quando os eventos
forem declarados dentro deste método, não será
mais necessário declara-los de forma estrutural.

Sintaxe do método Activate

<oDlg>:Activate(<oDlg>:bLClicked[:={|nRow,nCol,nFlags|<uClick>}],
<oDlg>:bMoved [ := <{uMoved}> ],
<oDlg>:bPainted [ := {|hDC,cPS|<uPaint>}],<.center.>, [{|Self|
<uValid>}],[ ! <.NonModal.> ], [{|Self|<uInit>}],
<oDlg>:bRClicked [ := {|nRow,nCol,nFlags|<uRClicked>}],
[{|Self|<uWhen>}] )
bLClicked Bloco de código disparado quando acionado botão
esquerdo do mouse.
bRClicked Bloco de código disparado quando acionado botão
direito do mouse.
bLDblClick Bloco de código disparado quando acionado duplo
clique do mouse.
12
bValid Bloco de código para validar a saída da janela.
bInit Bloco de código para validar a inicialização da
janela.
bWhen Bloco de código para validar a inicialização da
janela antes de ser desenhada na tela.
bGotFocus Bloco de código disparado quando a janela pega o
foco para si. Equivale à cláusula when.
bLostFocus Bloco de código disparado quando a janela perde o
foco. Equivale à cláusula valid.
bKeyDown Bloco de código disparado quando pressionada
uma tecla. Equivale à cláusula inkey(0).
Ex.: oWnd:bKeyDown := { | nKey,nFlags | MiFuncion (nKey) }
lFocused .T. está com o foco, .F. não está com foco.
End Método de finalização do objeto.
Destroy Método destructor do objeto.
SetFocus Força a obtenção do foco.
Refresh Executa a atualização dos controles da tela.

Exemplo de Código Fonte para Criação de Objeto de Janela

#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_DLG ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de diálogo simples. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_DLG()

Local oDlg //Objeto de Diálogo

oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


oDlg:lCentered := .T.

oDlg:Activate(,,,,,.F.)

Return

Objetos de Controle
A grande finalidade da criação das janelas e caixas de diálogo é a
interação com os usuários durante o processamento de suas rotinas.
Para isso devem ser utilizados objetos de controle como botões, caixas
13
de texto, radio button, chekbox entre outros. Abaixo estão descritos os
objetos necessários para criação de janelas personalizadas para diversas
finalidades. Sempre que utilizarmos os objetos de controle, não podemos
esquecer de informar a propriedade oParent de cada um, apontando
para a janela na qual o objeto irá pertencer.

Botões
Botões são utilizados para dispararem eventos e rotinas dentro de uma
janela. OADVPL possui dois tipos de botões, derivados da classe
TBUTTON (Botão simples) e SBUTTON (botão estilo speed button, com
bitmap).

Sintaxe da Classe TBUTTON

[ <oBtn> := ] TButton():New( <nRow>, <nCol>, <cCaption>, <oWnd>,;


<{uAction}>, <nWidth>, <nHeight>, <nHelpId>, <oFont>, <.default.>,;
<.pixel.>, <.design.>, <cMsg>, <.update.>, <{WhenFunc}>,;
<{uValid}>, <.lCancel.> )

nRow Linha inicial.


nCol Coluna inicial.
cCaption Texto do botão.
oWnd Janela parent.
Action Bloco de código com a rotina a ser disparada.
nWidth Tamanho do botão.
nHeight Altura do botão.
nHelpID Não utilizado.
oFont Objeto de fonte do botão.
Default Define se virá com o foco quando mostrada a tela.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
Design Não utilizado.
cMsg Mensagem estilo Hint com a descrição do botão.
Update Não utilizado.
When Bloco de código que valida a execução da ação do
botão, antes de executar.
Valid Bloco de código que valida a execução da ação do
botão, depois de executar.
Cancel Não utilizado.

Sintaxe da Classe SBUTTON

[ <oBtn> := ] SButton():New( <nTop>,<nLeft>,<nType>,<{ uAction }>,;


<oWnd>,<.mode.>,<cMsg>,<{uWhen}>)

nTop Linha inicial.


nLeft Coluna inicial.

14
nType Texto do botão.
Action Bloco de código com a rotina a ser disparada.
oWnd Janela parent.
Mode Não utilizado.
cMsg Mensagem estilo Hint com a descrição do botão.
Update Não utilizado.
When Bloco de código que valida a execução da ação do
botão, antes de executar.

Exemplos de Código Fonte para Criação de um Objetos de


botões

Código Fonte exemplo para criação de botões simples.


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_BTN ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de diálogo simples, com botões.º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_BTN()

Local _oDlg //Objeto de Diálogo


Local _oBtn1 //Objeto de Botão
Local _oBtn2 //Objeto de Botão

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe botões
_oBtn1 := TButton():New(130,180,"Botão 1",_oDlg,{|| MSGInfo("Teste de
botão","Teste")},30,12,,,.T.,.T.,,"Teste",,,,)
_oBtn2 := TButton():New(130,210,"Fechar",_oDlg,{|| _oDlg:End()},30,12,,,.T.,.T.,,"Fechar",,,,)

_oDlg:Activate()

Return

Exemplo de criação de botões simples.

15
Código fonte exemplo para criação de botões com bitmap.

#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_BTN2 ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de diálogo simples, com botões º±±
±±º ³ de bitmap. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_BTN2()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2, _oBtn3, _oBtn4, _oBtn5, _oBtn6,; //Objetos de Botões
_oBtn7, _oBtn8, _oBtn9, _oBtn10, _oBtn11,_oBtn12,;
_oBtn13, _oBtn14, _oBtn15, _oBtn16, _oBtn17, _oBtn18,;
_oBtn19, _oBtn20, _oBtn21, _oBtn22

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(020,010,01,{|| MSGInfo("Tipo 1", "Informação")},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(040,010,02,{|| MSGInfo("Tipo 2", "Informação")},_oDlg,,"Tipo 2")
_oBtn3 := SButton():New(060,010,03,{|| MSGInfo("Tipo 3", "Informação")},_oDlg,,"Tipo 3")
_oBtn4 := SButton():New(080,010,04,{|| MSGInfo("Tipo 4", "Informação")},_oDlg,,"Tipo 4")
_oBtn5 := SButton():New(100,010,05,{|| MSGInfo("Tipo 5", "Informação")},_oDlg,,"Tipo 5")
_oBtn6 := SButton():New(120,010,06,{|| MSGInfo("Tipo 6", "Informação")},_oDlg,,"Tipo 6")
_oBtn7 := SButton():New(020,040,07,{|| MSGInfo("Tipo 7", "Informação")},_oDlg,,"Tipo 7")
_oBtn8 := SButton():New(040,040,08,{|| MSGInfo("Tipo 8", "Informação")},_oDlg,,"Tipo 8")
_oBtn9 := SButton():New(060,040,09,{|| MSGInfo("Tipo 9", "Informação")},_oDlg,,"Tipo 9")
_oBtn10 := SButton():New(080,040,10,{|| MSGInfo("Tipo 10","Informação")},_oDlg,,"Tipo 10")
_oBtn11 := SButton():New(100,040,11,{|| MSGInfo("Tipo 11","Informação")},_oDlg,,"Tipo 11")
_oBtn12 := SButton():New(120,040,12,{|| MSGInfo("Tipo 12","Informação")},_oDlg,,"Tipo 12")
_oBtn13 := SButton():New(020,070,13,{|| MSGInfo("Tipo 13","Informação")},_oDlg,,"Tipo 13")
_oBtn14 := SButton():New(040,070,14,{|| MSGInfo("Tipo 14","Informação")},_oDlg,,"Tipo 14")

16
_oBtn15 := SButton():New(060,070,15,{|| MSGInfo("Tipo 15","Informação")},_oDlg,,"Tipo 15")
_oBtn16 := SButton():New(080,070,17,{|| MSGInfo("Tipo 16","Informação")},_oDlg,,"Tipo 16")
_oBtn17 := SButton():New(100,070,18,{|| MSGInfo("Tipo 17","Informação")},_oDlg,,"Tipo 17")
_oBtn18 := SButton():New(120,070,19,{|| MSGInfo("Tipo 18","Informação")},_oDlg,,"Tipo 18")
_oBtn19 := SButton():New(020,100,20,{|| MSGInfo("Tipo 19","Informação")},_oDlg,,"Tipo 19")
_oBtn20 := SButton():New(040,100,21,{|| MSGInfo("Tipo 20","Informação")},_oDlg,,"Tipo 20")
_oBtn21 := SButton():New(060,100,22,{|| MSGInfo("Tipo 21","Informação")},_oDlg,,"Tipo 21")
_oBtn22 := SButton():New(080,100,23,{|| MSGInfo("Tipo 22","Informação")},_oDlg,,"Tipo 22")

_oDlg:Activate()

Return

Tipos válidos de botões com bitmap

Rótulos de Texto
Rótulos são muito importantes para a definição de campos na tela, bem
como exibição de texto livre. A Classe responsável pela criação de
rótulos é a TSAY.

Sintaxe da Classe TSAY

17
[ <oSay> := ] TSay():New( <nRow>, <nCol>, <{cText}>,[<oWnd>], [<cPict>],;
<oFont>, <.lCenter.>, <.lRight.>, <.lBorder.>, <.lPixel.>, <nClrText>,
<nClrBack>, <nWidth>, <nHeight>)

nRow Linha inicial.


nCol Linha Final.
cText Texto a ser exibido.
oWnd Janela parent.
cPict Picture do texto.
oFont Objeto para selecionar a fonte da janela.
lCenter Centraliza o texto no espaço do objeto.
lRight Alinha à direita (usado para números).
lBorder Não utilizado
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
nClrText Define a cor do texto.
nClrBack Define cor de fundo na exibição do texto.
nWidth Define o tamanho do objeto.
nHeight Define a altura do objeto.
Seleção de fontes para o objeto de rótulo de texto

Objetos de rótulo de texto podem ter seu fonte padrão alterado para
outro qualquer encontrado no sistema operacional. Para isso, deve ser
criado um objeto derivado da classe TFONT que terá as características
do fonte selecionado. Após carregar o objeto de fonte, basta declara-lo
na propriedade oFont do rótulo de texto.

Sintaxe da classe TFont

<oFont> := TFont():New(<cName>,<nWidth>,<nHeight>,<.from.>,
[<.bold.>],<nEscapement>,,<nWeight>,[<.italic.>])

cName Nome da fonte.


nWidth Comprimento da fonte (normalmente 9).
nHeight Tamanho do fonte.
From Não utilizado.
Bold (.T./.F.) Ativa negrito.
nEscapement Não utilizado.
Reservado
nWeight Não utilizado.
Italic Ativa itálico.

Exemplo de criação de um objeto de fonte

_oFont := TFont():New("Arial",09,12,,.T.,,,,.T.)

Código fonte exemplo para criação de rótulos.


#include "protheus.ch"
/*

18
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_SAY ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de texto livre na janela. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_SAY()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oSay //Objeto de rótulo

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Cria objeto de fonte


_oFont := TFont():New("Arial",09,12,,.T.,,,,.T.)

//Exibe o objeto de rótulo


_oSay := TSay():New(020,010,{||"Exemplo de texto livre..."},_oDlg,"@!",_oFont,.T.,,,.T.,,,200,20)

_oDlg:Activate()

Return

Exemplo de apresentação de mensagem de texto em caixas de diálogo

19
Caixas de Texto
Caixas de texto são objetos importantes para entrada de dados. Através
desse objeto pode-se editar valores de campos para serem processados.

Sintaxe da Classe TGET

[ <oGet> := ] TGet():New( <nRow>, <nCol>, bSETGET(<uVar>),[<oWnd>],;


<nWidth>, <nHeight>, <cPict>, <{ValidFunc}>,<nClrFore>, <nClrBack>,;
<oFont>, <.design.>,<oCursor>, <.pixel.>, <cMsg>, <.update.>, <{uWhen}>,;
<.lCenter.>, <.lRight.>,[\{|nKey, nFlags, Self| <uChange>\}],;
<.readonly.>,<.pass.>)

nRow Linha inicial.


nCol Coluna inicial.
bSetGet Variável de memória do campo.
oWnd Janela parent.
nWidth Tamanho do campo.
nHeight Altura do campo.
cPict Picture do campo.
Valid Bloco de código com função de validação do
campo.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
oFont Objeto que define a fonte utilizada no campo.
Design Não utilizado.
oCursor Não utilizado.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
cMsg Mensagem tipo Hint do campo.
Update Não utilizado.
When Bloco de código para validação na entrada do
campo.
lCenter Centraliza o texto na caixa de texto.
(.T./.F.)
lRight (.T./.F.) Alinha dados à direita.
nKey Não utilizado.
nFlags Não utilizado.
Change Bloco de código para validar quando alterado o
campo.
lReadOnly Deixa o campo somente para leitura.
Pass (.T./.F.) Converte o texto para o formato password (***).

Código fonte exemplo para criação de caixas de texto.


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

20
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_GET ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de caixas de texto e rótulos. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_GET()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oSay1, _oSay2, _oSay3 //Objeto de rótulo
Local _oGet1, _oGet2, _oGet3 //Objeto de caixa de texto
Local _cVar1 := Space(06) //Variável utilizada no Get
Local _cVar2 := Date() //Variável utilizada no Get
Local _cVar3 := 0 //Variável utilizada no Get

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.
//Exibe todos tipos válidos de botões
_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")
//Exibe o objeto de rótulo
_oSay1 := TSay():New(010,010,{||"Caixa de Texto"},_oDlg,,,,,,.T.,,,80,20)
_oSay2 := TSay():New(040,010,{||"Caixa de Data"},_oDlg,,,,,,.T.,,,80,20)
_oSay3 := TSay():New(070,010,{||"Caixa de Número"},_oDlg,,,,,,.T.,,,80,20)
//Exibe as caixas de texto
_oGet1 := TGet():New(020,010,bSetGet(_cVar1),_oDlg,50,12,"@!",,,,,,,.T.)
_oGet2 := TGet():New(050,010,bSetGet(_cVar2),_oDlg,50,12,,,,,,,,.T.)
_oGet3 := TGet():New(080,010,bSetGet(_cVar3),_oDlg,50,12,"@E 999,999.99",,,,,,,.T.)

_oDlg:Activate()

Return

Exemplo de variação de caixas de texto com formatos de dados


diferentes

CheckBox

21
A classe TCHECKBOX criará uma caixa de “marca/desmarca” na janela.
Seu funcionamento consiste em armazenar em uma variável lógica a
seleção do usuário, sendo .T. para marcado e .F. para desmarcado.

Sintaxe da Classe TCheckBox

[ <oCbx> := ] TCheckBox():New( <nRow>, <nCol>, <cCaption>,;


[bSETGET(<lVar>)], <oWnd>, <nWidth>, <nHeight>, <nHelpId>,;
[<{uClick}>], <oFont>, <{ValidFunc}>, <nClrFore>, <nClrBack>,;
<.design.>, <.pixel.>, <cMsg>, <.update.>, <{WhenFunc}> )

nRow Linha inicial.


nCol Coluna inicial.
cCaption Texto do checkbox.
bSetGet Variável lógica que conterá o valor selecionado do
checkbox.
oWnd Janela parent.
nWidth Tamanho do objeto.
nHeight Alturado objeto.
nHelpID Não utilizado.
Click Bloco de código disparado com o evento de um
clique do mouse.
oFont Objeto de seleção de fonte para o texto do objeto.
Valid Bloco de código responsável pela validação do
objeto.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
Design Não utilizado.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
cMsg Mensagem estilo hint do objeto.
Update Não utilizado.
When Bloco de código para validar a entrada no campo.

Código fonte exemplo para criação de CheckBoxes


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_CBX ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de checkbox. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_CBX()

Local _oDlg //Objeto de Diálogo


22
Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oCbx //Objeto CheckBox
Local _lVar //Variável para armazenar seleção do usuário

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Exibe o objeto checkbox


oCbx := TCheckBox():New(10,10,"Exemplo de Checkbox", bSetGet(_lVar),_oDlg,80,12)

_oDlg:Activate()

Return

Exemplo de criação de diálogo com checkbox.

ComboBox

A classe TCOMBOBOX criará uma caixa de seleção estilo drop-down na


janela. Seu funcionamento consiste em armazenar em uma variável
caracter a seleção do usuário. Os itens são armazenados em um array,
que depois é passado como propriedade do objeto.

Sintaxe da Classe TComboBox

[ <oCbx> := ] TComboBox():New( <nRow>, <nCol>, bSETGET(<cVar>),;


<aItems>, <nWidth>, <nHeight>, <oWnd>, <nHelpId>,;
[{|Self|<uChange>}], <{uValid}>, <nClrText>, <nClrBack>,;
<.pixel.>, <oFont>, <cMsg>, <.update.>, <{uWhen}>)

23
nRow Linha inicial.
nCol Coluna inicial.
bSetGet Variável que conterá o valor selecionado do objeto.
aItens Array contendo a lista de itens do objeto.
nWidth Tamanho do objeto.
nHeight Alturado objeto.
oWnd Janela parent.
nHelpID Não utilizado.
Change Bloco de código disparado com o evento alteração
no objeto.
Valid Bloco de código disparado para validar o objeto.
nClrText Define a cor do texto do objeto.
nClrBack Define a cor de fundo do objeto.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
oFont Objeto de seleção de fonte para o texto do objeto.
cMsg Mensagem estilo hint do objeto.
Update Não utilizado.
When Bloco de código para validar a entrada no objeto.

Código fonte exemplo para criação de ComboBoxes


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_CBX ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de combobox. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_CBX()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oCbx //Objeto ComboBox
Local _cVar := Space(06) //Variável que armazenará o item selecionado
Local _aVar := {} //Array contendo os itens do ComboBox

AADD(_aVar, "Item 1")


AADD(_aVar, "Item 2")
AADD(_aVar, "Item 3")
AADD(_aVar, "Item 4")
AADD(_aVar, "Item 5")

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Exibe o objeto ComboBox


oCbx := TComboBox():New(10,10,bSetGet(_cVar),_aVar,100,12,_oDlg,,,,,,.T.)

24
_oDlg:Activate()

Return

Exemplo de criação de diálogo com ComboBox.

ListBox

A classe TLISTBOX criará uma caixa de seleção estilo lista na janela.


Seu funcionamento consiste em armazenar em uma variável numérica
ou caracter a seleção do usuário. Os itens são armazenados em um
array, que depois é passado como propriedade do objeto.

Sintaxe da Classe TListBox

[ <oLbx> := ] TListBox():New( <nRow>, <nCol>, bSETGET(<cnVar>),;


<aList>, <nWidth>, <nHeight>, <{uChange}>, <oWnd>, <{uValid}>,;
<nClrFore>, <nClrBack>, <.pixel.>, <.design.>, <{uLDblClick}>,;
<oFont>, <cMsg>, <.update.>, <{uWhen}>)

nRow Linha inicial.

25
nCol Coluna inicial.
bSetGet Variável que conterá o valor selecionado do objeto.
aList Array contendo a lista de itens do objeto.
nWidth Tamanho do objeto.
nHeight Alturado objeto.
Change Bloco de código disparado com o evento alteração
no objeto.
oWnd Janela parent.
Valid Bloco de código disparado para validar o objeto.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
Design Não utilizado.
DblClick Bloco de código disparado no evento de duplo
clique.
oFont Objeto de seleção de fonte para o texto do objeto.
cMsg Mensagem estilo hint do objeto.
Update Não utilizado.
When Bloco de código para validar a entrada no objeto.

Código fonte exemplo para criação de ListBoxes


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_LST ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de listbox. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_LST()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oLbx //Objeto ListBox
Local _cVar := Space(06) //Variável que armazenará o item selecionado
Local _aVar := {} //Array contendo os itens do ListBox

AADD(_aVar, "Item 1")


AADD(_aVar, "Item 2")
AADD(_aVar, "Item 3")
AADD(_aVar, "Item 4")
AADD(_aVar, "Item 5")

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

26
//Exibe o objeto ListBox
oLbx := TListBox():New(10,10,bSetGet(_cVar),_aVar,100,50,,_oDlg,,,,.T.)

_oDlg:Activate()

Return

Exemplo de criação de diálogo com ListBox

Radio Button

A classe TRADMENU criará um campo de seleção de opções na janela


estilo Radio Button. Seu funcionamento consiste em armazenar em uma
variável numérica a seleção do usuário. Os itens são armazenados em
um array, que depois é passado como propriedade do objeto.

Sintaxe da Classe TRadMenu

[ <oRadMenu> := ] TRadMenu():New( <nRow>, <nCol>, {<cItems>},;


[bSETGET(<nVar>)], <oWnd>, [{<nHelpId>}], <{uChange}>,<nClrFore>,;
<nClrBack>, <cMsg>, <.update.>, <{uWhen}>,<nWidth>, <nHeight>,;
<{uValid}>, <.lDesign.>, <.lLook3d.>,<.lPixel.>)

nRow Linha inicial.


nCol Coluna inicial.
aItens Array contendo a lista de itens do objeto.
bSetGet Variável que conterá o valor selecionado do objeto.
oWnd Janela parent.
HelpId Não utilizado.
Change Bloco de código disparado com o evento alteração
no objeto.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
cMsg Mensagem estilo hint do objeto.
27
Update Não utilizado.
When Bloco de código para validar a entrada no objeto.
nWidth Tamanho do objeto.
nHeight Alturado objeto.
Valid Bloco de código disparado para validar o objeto.
Design Não utilizado.
Look3D Não utilizado.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).

Código fonte exemplo para criação de Radio Button


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_RAD ºAutor ³ º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de Radio Button. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_RAD()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oRad //Objeto Radio Button
Local _nVar := 1 //Variável que armazenará o item selecionado
Local _aVar := {} //Array contendo os itens do Radio Button

AADD(_aVar, "Item 1")


AADD(_aVar, "Item 2")
AADD(_aVar, "Item 3")
AADD(_aVar, "Item 4")
AADD(_aVar, "Item 5")

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe todos tipos válidos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Exibe o objeto Radio Button


oRad := TRadMenu():New(10,10,_aVar,bSetGet(_nVar),_oDlg,,,,,,,,80,20,,,,.T.)

_oDlg:Activate()

Return

Exemplo de criação de diálogo com ListBox

28
Folders

Uma importante classe a ser utilizada nas aplicações é a classe Tfolder.


Essa classe nos permite criar várias instâncias de uma aplicação
dividindo-as em várias pastas diferentes. É muito útil por exemplo
quando temos uma tela de entrada de dados muito grande gerando a
necessidade de subdividi-la em várias partes diferenciando por assunto
ou outra forma de divisão a critério do desenvolvedor.

Sintaxe da Classe TFolder

[<oFolder> := ] TFolder():New( <nRow>, <nCol>,[\{<cPrompt>\}], \


{<cDlgName1> [,<cDlgNameN>]\},<oWnd>, <nOption>, <nClrFore>, <nClrBack>,
<.lPixel.>,<.lDesign.>, <nWidth>, <nHeight>, <cMsg> )

nRow Linha inicial.


nCol Coluna inicial.
cPrompt Array contendo os textos de exibição das pastas.
CDlgName1... Array contendo os nomes dos objetos de pasta.
N
oWnd Janela parent.
nOption Número da pasta default na inicialização da janela.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
Design Não utilizado.
nWidth Tamanho do objeto.
nHeight Alturado objeto.
cMsg Mensagem estilo hint do objeto.
29
Métodos importantes da classe TFolder

oFolder Força a seleção da pasta representada por n,


:SetOption(n) onde n é a sequencia númerica de cada pasta.
oFolder Retorna o objeto individual de cada pasta do
:aDialogs[n] Folder criado. Muito útil para ser usado como
parent de outros objetos, quando houver a
necessidade de armazena-los nas pastas
corretas.

Código fonte exemplo para criação de múltiplos Folders com vários objetos
dentro
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_FLD ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de Folders. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_FLD()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oFld //Objeto Folder
Local _oSay1, oSay2, oSay3 //Objeto Folder

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe objetos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Exibe o objeto Folder


_oFld := TFolder():New(05,01,{"Pasta1","Pasta2","Pasta3"},{"Fld1","Fld2","Fld3"},_oDlg,1,,,.T.,,244,120)

//Exibe o objeto Rótulo em seus respectivos objetos Folders


_oSay1 := TSay():New(020,010,{||"Texto do Folder 1..."},_oFld:aDialogs[1],,,.T.,,,.T.,,,200,20)
_oSay2 := TSay():New(020,010,{||"Texto do Folder 2..."},_oFld:aDialogs[2],,,.T.,,,.T.,,,200,20)
_oSay3 := TSay():New(020,010,{||"Texto do Folder 3..."},_oFld:aDialogs[3],,,.T.,,,.T.,,,200,20)

_oDlg:Activate()

Return

Exemplo de criação de diálogo com ListBox

30
Browse

Browses são ferramentas importantes para a apresentação de dados. O


ADVPL disponibiliza uma classe poderosa para criação de ferramentas de
browse, a classe TWBROWSE. Essa ferramenta será constantemente
usada no dia-a-dia do desenvolvedor ADVPL, devido a sua gama de
recursos. Além de apresentar informações de campos no formato
tradicional, essa classe possui recursos de apresentação de bitmaps em
suas colunas. Com isso podemos desenvolver colunas com marcadores
coloridos e marcadores tipo checkbox, comumente conhecidos como
markbrowse.

Sintaxe da Classe TWBrowse

[ <oBrw> := ] TWBrowse():New( <nRow>, <nCol>, <nWidth>, <nHeigth>,;


[\{|| \{<Flds> \} \}], [\{<aHeaders>\}], [\{<aColSizes>\}], ;
<oDlg>, <(cField)>, <uValue1>, <uValue2>,[<{uChange}>],;
[\{|nRow,nCol,nFlags|<uLDblClick>\}],[\{|nRow,nCol,nFlags|<uRClick>\}],;
<oFont>, <oCursor>, <nClrFore>, <nClrBack>, <cMsg>,<.update.>, <cAlias>,;
<.pixel.>, <{uWhen}>,<.design.>, <{uValid}>)

nRow Linha inicial.


nCol Coluna inicial.
nWidth Tamanho do objeto.
nHeight Altura do objeto.
Flds Registros do browse.
aHeaders Array contendo o nome dos campos para exibição.
aColSizes Array contendo o tamanho de cada campo.
oDlg Janela parent.

31
cField Não utilizado.
Value1 Não utilizado.
Value2 Não utilizado.
Change Bloco de código disparado na alteração do objeto.
bLDblClick Bloco de código disparado no duplo clique do
mouse.
bRClick Bloco de código disparado no clique do botão
direito.
oFont Define a fonte padrão do objeto.
oCursor Não utilizado.
nClrFore Não utilizado.
nClrBack Define a cor de fundo do objeto.
cMsg Exibe mensagem estilo hint no objeto.
Update Não utilizado.
cAlias Não utilizado.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da
janela, .T. em pixels, .F., modo texto (80/24).
When Bloco de código disparado na entrada do objeto.
Design Não utilizado.
Valid Bloco de código disparado na validação do objeto.
Código fonte exemplo para criação de browse completo

#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_BRW ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de Browse. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_BRW()

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Local _oBrw //Objeto Browse
Local _aFields := {} //Campos do Browse
Local _aHeader := {} //Cabeçalho do Browse
Local _oOk := LoadBitmap(GetResources(),"LBOK")
Local _oNo := LoadBitmap(GetResources(),"LBNO")
Local _oVerde := LoadBitmap(GetResources(),"BR_VERDE")

_aFields := {{.F., _oVerde, "Exemplo de browse"}}


_aHeader := {" ", " ", "Campo 1"}

_oDlg := TDialog():New(10,10,300,500,"Teste de Diálogo",,,,,,,,,.T.,,,,,)


_oDlg:lCentered := .T.

//Exibe objetos de botões


_oBtn1 := SButton():New(130,180,01,{|| _oDlg:End()},_oDlg,,"Tipo 1")
_oBtn2 := SButton():New(130,210,02,{|| _oDlg:End()},_oDlg,,"Tipo 2")

//Exibe o objeto Browse


_oBrw := TWBrowse():New(10,10,225,115,,_aHeader,,_oDlg,,,,,,,,,,,,.F.,,.T.,,.F.)

32
_oBrw:SetArray(_aFields)
_oBrw:bLDblClick := {|| _aFields[_oBrw:nAT,1] := !_aFields[_oBrw:nAT,1]}
_oBrw:bLine := {|| {If(_aFields[_oBrw:nAT,1],_oOk,_oNo),_aFields[_oBrw:nAT,2],;
_aFields[_oBrw:nAT,3]}}

_oDlg:Activate()

Return

Exemplo de criação de Browse com recursos de marca e legenda

33
Criação de janelas mestre-detalhe OOP
Modelo 3

Janelas mestre-detalhe são muito importantes para cadastros


envolvendo duas tabelas relacionadas, normalmente cabeçalhos e itens.
O ADVPL nos proporciona algumas classes de objetos para elaboração
de telas complexas envolvendo tabelas relacionadas. O tutorial a seguir
nos mostra como montar uma tela mestre-detalhes passo-a-passo. As
classes envolvidas são MSMGET e MSGETDADOS. A tela construída no
ADVPL possui algumas características peculiares. A tela normalmente
apresentará três seções básicas, a Enchoice, a GetDados e o rodapé
para apresentação de resultados. A imagem abaixo demonstra
exatamente o funcionamento dessa tela. Enchoice
Bar

Enchoice

GetDado
s

Rodapé

A janela que traz os itens do cabeçalho é criada pela classe MSMGET e


os detalhes são montados pela classe MSGETDADOS. As informações da
GetDados são provenientes de dois arrays, aHeader e aCols. O aHeader
contém informações sobre os campos, como nome para exibição,
tamanho do campo etc. O aCols possui os dados a serem exibidos. Antes
de montar a tela, deve-se criar o aCols e carrega-lo com as informações
da tabela. Um detalhe a ser considerado é que deveremos criar o aCols
com um campo extra no final, pois, ele armazenará um valor lógico
informando se o registro foi deletado ou não. Essa informação será muito
útil durante a gravação dos registros, para que registros descartados
não sejam gravados.
34
Sintaxe da classe MSMGET

MSMGET():NEW( cAlias, nReg, nOpc, [ uPar1 ], [ uPar2 ], [ uPar3 ],


[ aACho ], [ aPos ], [ aCpos ], [ uPar4 ], [ uPar5 ], [ uPar6 ],
[ uPar7 ], [ oWnd ], [ uPar8 ], [ lMemoria ], [ lColuna ], [ uPar9 ],
[ lSemPastas ] )

CAlias Alias dos dados a serem cadastrados.


nReg Número do registro editado.
uPar1 Parâmetro reservado.
uPar2 Parâmetro reservado.
uPar3 Parâmetro reservado.
aAcho Array com os campos a serem editados.
aPos Vetor com as coordenadas onde a MsMGet será
criada no formato {coord. superior, coord.
esquerda, coord. direita, coord. inferior}.Função
executada para validar o contexto da linha atual do
aCols.
aCpos Array com os campos que poderão ser alterados.
uPar4 Parâmetro reservado. Nome dos campos do tipo
caracter que utilizarão incremento automático. Este
parâmetro deve ser no formato “+<nome do
primeiro campo>+<nome do segundo
campo>+...”.
uPar5 Parâmetro reservado.
uPar6 Parâmetro reservado.
uPar7 Parâmetro reservado.
oWnd Janela parent.
uPar8 Parâmetro reservado.
lMemoria Indica se será usado variáveis de memória ou os
campos da tabela para cadastramento dos dados.
Valor padrão falso.
lColuna Indica se a MsMGet sera apresentada com um
objeto por linha (uma coluna). Valor padrão falso.
Parâmetro reservado.
uPar9 Parâmetro reservado.
lSemPastas Indica se não será usado as Pastas de Cadastro na
MsMGet. Função executada para validar a exclusão
de uma linha do aCols.

35
Construindo um código fonte para criação de um modelo 3

Inicialmente iremos montar um markbrowse para iniciarmos a


visualização geral da tabela principal. Após selecionar o registro a ser
trabalhado, será aberta a janela modelo 3 com todas opções de trabalho
para o usuário. No nosso exemplo estaremos utilizando as tabelas SZ1
(cabeçalho) e SZ2 (Itens). Nas opções do menu do markbrowse,
trocaremos as funções padrão por outra personalizada que irá disparar o
modelo 3 com o registro selecionado.
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_MOD3 ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de Modelo3.
º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_MOD3()

Private cCadastro := "Modelo 3 Exemplo" //Titulo do cadastro


Private aHeader := {} //aHeader original do modelo3
Private aCols := {} //aCols original do modelo3
Private aRotina := {} //Reservado

AADD(aRotina ,{"Pesquisar" , "AxPesqui" , 0, 1})


AADD(aRotina ,{"Visualizar", 'U_MOD3EXEC("SZ1",RecNo(),2)', 0, 2})
AADD(aRotina ,{"Incluir" , 'U_MOD3EXEC("SZ1",RecNo(),3)', 0, 3})
AADD(aRotina ,{"Alterar" , 'U_MOD3EXEC("SZ1",RecNo(),4)', 0, 4})
AADD(aRotina ,{"Excluir" , 'U_MOD3EXEC("SZ1",RecNo(),5)', 0, 5})

dbSelectArea("SZ1")
MBrowse(006, 001, 022, 075, "SZ1")

Return

Após criado o markbrowse, notem que as funções do menu utilizadas


foram trocadas pela U_MOD3EXEC. Nessa função, passaremos como
parâmetro a tabela principal, o registro a ser editado e a ação que o
usuário estará fazendo. As ações são identificadas numericamente.
Termos 2-Visualização, 3-Inclusão, 4-Alteração, 5-Exclusão.

36
Sintaxe da classe MSMGET

MSMGET():NEW( cAlias, nReg, nOpc, [ uPar1 ], [ uPar2 ], [ uPar3 ],


[ aACho ], [ aPos ], [ aCpos ], [ uPar4 ], [ uPar5 ], [ uPar6 ],
[ uPar7 ], [ oWnd ], [ uPar8 ], [ lMemoria ], [ lColuna ], [ uPar9 ],
[ lSemPastas ] )

nSuperior Distancia entre a MsGetDados e o extremidade


superior do objeto que a contém..
nEsquerda Distancia entre a MsGetDados e o extremidade
esquerda do objeto que a contém.
nInferior Distancia entre a MsGetDados e o extremidade
esquerda do objeto que a contém.
nDireita Distancia entre a MsGetDados e o extremidade
inferior do objeto que a contém.
nOpc Posição do elemento do vetor aRotina que a
MsGetDados usará como referencia.
cLinhaOK Função executada para validar o contexto da linha
atual do aCols.
cTudoOk Função executada para validar o contexto geral da
MsGetDados (todo aCols).
cIniPos Nome dos campos do tipo caracter que utilizarão
incremento automático. Este parâmetro deve ser
no formato “+<nome do primeiro campo>+<nome
do segundo campo>+...”.
lApagar Habilita deletar linhas do aCols. Valor padrão falso.
aAlter Vetor com os campos que poderão ser alterados.
uPar1 Parâmetro reservado.
lVazio Habilita validação da primeira coluna do aCols para
esta não poder estar vazia. Valor padrão falso.
nMax Número máximo de linhas permitidas. Valor padrão
99.
cCampoOk Função executada na validação do campo.
cSuperApagar Função executada quando pressionada as teclas
<Ctrl>+<Delete>.
uPar2 Parâmetro reservado.
cApagaOk Função executada para validar a exclusão de uma
linha do aCols.
oWnd Janela parent.

37
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_MOD3 ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Modelo 3 OOP. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function MOD3EXEC(_cAlias, _nRecNo, _nOpc)

Local _oDlg //Objeto de Diálogo


Local _oBtn1, _oBtn2 //Objetos de Botões
Private nOpcA //Retorno da Enchoice Bar.

//Seleciona area
dbSelectArea("SZ1") //Cabeçalho
dbSetOrder(1) //Filial + Codigo

//Cria as variaveis de memoria da enchoice


RegToMemory(_cAlias, If(_nOpc==3, .T., .F.))

//Cria as caixa de diálogo principal


_oDlg := TDialog():New(10,10,500,700,"Teste de Diálogo",,,,,,,,,.T.,,,,,)
_oDlg:lCentered := .T.
_oDlg:bInit := EnchoiceBar(_oDlg, {|| nOpcA:=1, If(U_MOD3TUDOK(), _oDlg:End(),;
nOpcA := 0)}, {|| _oDlg:End()})

//Cria os campos da enchoice.


Zero()
_oEnc := MsMGet():New(_cAlias, _nRecno, _nOpc,,,,,{012,000,070,345},,2,,,, _oDlg)

//Carrega as matrizes aHeader e aCols.


MONTAHEADER(_nOpc)

//Monta a estrutura da getdados.


_oGet1 := MsGetDados():New(70, 001, 210, 345, _nOpc,,,,.T.,,,,,,,,,_oDlg)

_oDlg:Activate()

//Se incluiu ou alterou algum registro, faz a gravação.


If nOpcA == 1 .and. (_nOpc == 3 .or. _nOpc == 4 .or. _nOpc == 5)

BeginTran()

ATUAMOD3(_nOpc)

EndTran()

Else

RollBackSX8()

EndIf

Return

38
A função MOD3EXEC() cria uma caixa de diálogo e dentro dela monta o
modelo3. Na inicialização da janela, é chamada no método oDlg:bInit a
função EnchoiceBar, que será responsável pela criação dos botões de
confirmação e cancelamento, além de realizar a validação do modelo3
geral. O segundo parâmetro identifica se foi confirmada a operação do
usuário e dispara a rotina U_MOD3TUDOK(), cujo retorno dever ser .T.
ou .F. dependendo da validação. Caso .F., não deixa encerrar a tela até
que o usuário corrija os campos errados ou em branco.
Subseqüentemente é chamada a classe MSMGET, que irá trazer os
dados do arquivo de cabeçalho na tela. Antes de chamar a classe
MSGETDADOS, a rotina MONTAHEADER é executada para carregar os
dados dos vetores aHeader e aCols.

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³MONTAHEADERº Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Rotina para criar as matrizes aHeader e aCols da GetDados. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function MONTAHEADER(_nOpc)

Local _nUsado := 0
Local _cNum := ""

aHeader := {}
aCols := {}

//Monta o aHeader.

_nUsado := 0

dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("SZ2")
While !EOF() .and. SX3->X3_ARQUIVO == "SZ2"

If X3USO(SX3->X3_USADO) .and.;
cNivel >= SX3->X3_NIVEL .and.;
AllTrim(X3_CAMPO) <> ("Z2_CODIGO")

AADD(aHeader, {Trim(X3TITULO()),;
SX3->X3_CAMPO ,;
SX3->X3_PICTURE ,;
SX3->X3_TAMANHO ,;
SX3->X3_DECIMAL ,;
SX3->X3_VALID ,;
SX3->X3_USADO ,;
SX3->X3_TIPO ,;
SX3->X3_ARQUIVO ,;
SX3->X3_CONTEXT })

_nUsado++

Endif

dbSkip()

39
EndDo

//Monta o aCols.

//Opcao Inclui.

If _nOpc == 3

For x := 1 to Len("SZ2")

_nUsado := Len(aHeader)

aCols := {Array(_nUsado + 1)}

aCols[1, _nUsado + 1] := .F.

For y := 1 to _nUsado
aCols[1, y] := CriaVar(aHeader[y, 2], .F.)
Next y

Next x

//Monta o aCols.

//Visualiza, Altera e Exclui.

Else

_nUsado := Len(aHeader)

dbSelectArea("SZ2")
dbSeek(xFilial("SZ2") + M->Z1_CODIGO)
If Found()

While SZ2->Z2_CODIGO == M->Z1_CODIGO .and. !EOF()

AADD(aCols, Array(_nUsado + 1))

For y := 1 to _nUsado

aCols[Len(aCols), y] := FieldGet(FieldPos(aHeader[y, 2]))

Next

aCols[Len(aCols), _nUsado + 1] := .F.

dbSkip()

EndDo

//Se nao encontrar nenhum reg., abre um aCols em vazio apenas para exibir.
Else

nUsado := Len(aHeader)

aCols := {Array(_nUsado + 1)}

aCols[1, _nUsado + 1] := .F.

For y := 1 to _nUsado

aCols[1, y] := CriaVar(aHeader[y, 2], .F.)

Next y

EndIf

EndIf

Return

40
A função MONTAHEADER irá verificar qual foi a opção selecionada pelo
usuário. Caso tenha escolhido inclusão, abre um aCols com um registro
em branco. Nos demais casos irá varrer a tabela de itens e irá
armazenar em sua matriz como se fosse um filtro. Os dados poderão ser
alterados dependendo da operação e conseqüentemente o processo
inverso deverá ser feito para atualizar a tabela. A rotina responsável por
essa ação é a ATUAMOD3.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ ATUAMOD3 º Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Rotina para gravar os dados da enchoice e das getdados do º±±
±±º ³ modelo3. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function ATUAMOD3(_nOpc)

Local _cVar
Local bCampo := {|nCPO| Field(nCPO)}

//Inicia alterações no cabecalho.


³
dbSelectArea("SZ1")
If _nOpc == 3

RecLock("SZ1", .T.)

Else

RecLock("SZ1", .F.)

EndIf

//Se estiver incluindo ou alterando grava o cabecalho (SZ1).


If _nOpc == 3 .or. _nOpc == 4
For x := 1 to FCount()

If "FILIAL" $ Field(x)

FieldPut(x, xFilial("SZ1"))

Else

FieldPut(x, M->&(EVAL(bCampo, x)))

EndIf

Next x

//Se nao estiver incluindo ou alterando exclui o cabecalho (SZ1).


Else

dbDelete()

EndIf

MsUnlock()

//Se estiver alterando, apaga os detalhes e cria novamente conforme aCols.


41
//Se for exlusao, apenas apaga.

If _nOpc == 4 .or. _nOpc == 5

dbSelectArea("SZ2")
dbSeek(xFilial("SZ2") + SZ1->Z1_CODIGO)
While SZ2->Z2_CODIGO == SZ1->Z1_CODIGO

RecLock("SZ2", .F.)

dbDelete()

MsUnlock()

dbSkip()

EndDo

EndIf

//Se estiver incluindo ou alterando, grava os Itens das GetDados.


If _nOpc == 3 .or. _nOpc == 4

For y := 1 to Len(aCols)

If aCols[y][Len(aCols[y])] == .F.

RecLock("SZ2", .T.)

FieldPut(FieldPos("Z2_FILIAL"), xFilial("SZ2"))
FieldPut(FieldPos("Z2_CODIGO"), M->Z1_CODIGO)

For z := 1 to Len(aHeader)

FieldPut(FieldPos(aHeader[z, 2]), aCols[y, z])

Next z

MsUnlock()

EndIf

Next y

EndIf

Return

Por último deve ser desenvolvida a rotina de validação geral do


modelo3. Nessa rotina poderemos validar qualquer informação da
janela, sempre observando o retorno com valor lógico. Se retornar .F., a
janela não encerrará até que o usuário corrija as informações de acordo
com a regra da função.

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ MOD3TUDOK º Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Validação geral do modelo 3. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function MOD3TUDOK()

42
//Inclua aqui as validações da tela modelo 3.

Return(.T.)

Criação de relatórios com qualidade gráfica


Classe TMSPRINTER

A Classe TMSPRINTER inovou a maneira de produzir relatórios com o


ADVPL. Na programação estruturada os relatórios são impressos em
formato texto, com layout simples. Isso pode ser um problema uma vez
que podem surgir necessidades de implementações com qualidade
gráfica superior, formulários com layout avançado, inclusão de imagens
etc. Para resolver essa questão, utilizaremos a classe TMSPRINTER.

Sintaxe da Classe TMSPRINTER

[ <oPrn> := ] TMSPrinter():New()

Principais métodos da classe TMSPRINTER

StartPage Inicia uma nova página.


SetPortrait Ajusta relatório no padrão retrato.
SetLandscape Ajusta relatório no padrão paisagem.
IsPrinterActiv Verifica se a impressora está ativa.
e
Preview Exibe o gerenciador de impressão e o relatório em
vídeo.
Print Direciona a impressão direto para a impressora.
Setup Abre a caixa de setup de impressoras.
EndPage Encerra a página.

Principais métodos para impressão de dados

Say
Exibe um texto no relatório.

[ <oPrn> := ] TMSPrinter():Say(nLin, nCol, cTexto, oFont, nTam)

nLin Linha inicial.


nCol Coluna inicial.
cTexto Texto a ser impresso.
oFont Define a fonte do texto impresso.
nTam Tamanho do texto.

43
SayBitmap
Exibe um bitmap no relatório.

[ <oPrn> := ] TMSPrinter():SayBitmap(nLin, nCol, cBitmap, nWidth, nHeight)

nLin Linha inicial.


nCol Coluna inicial.
cTexto Nome do bitmap a ser impresso.
nWidth Largura do bitmap.
nAlatura Altura do Bitmap.

Box
Imprime uma caixa no relatório.

[ <oPrn> := ] TMSPrinter():Box(nLin, nCol, nWidth, nHeight)

nLin Linha inicial.


nCol Coluna inicial.
nWidth Largura da caixa.
nAlatura Altura da caixa.

Line
Imprime uma linha no relatório.

[ <oPrn> := ] TMSPrinter():Line(nLin, nCol, nWidth, nHeight)

nLin Linha inicial.


nCol Coluna inicial.
nWidth Largura da caixa.
nAlatura Altura da caixa.

44
Código fonte exemplo para impressão de relatórios com qualidade gráfica
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_PRN º Autor ³Organon TI Consultoriaº Data ³ 16/04/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de impressão de relatório OOP gráfico. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_PRN()

Local oFont1 := TFont():New("Arial",09,08,,.F.,,,,,.F.)


Local oFont2 := TFont():New("Arial",09,12,,.F.,,,,,.F.)
Local oFont3 := TFont():New("Arial Black",09,16,,.T.,,,,,.F.)
local oFont4 := TFont():New("Arial",09,12,,.T.,,,,,.F.)
Local oFont5 := TFont():New("Courier New",09,18,,.T.,,,,,.F.)
Local oFont6 := TFont():New("Courier New",09,14,,.T.,,,,,.F.)
Local oPrint

//Carrega classe de impressão


oPrint := TMSPrinter():New()

oPrint:StartPage()

oPrint:Box(0040,0040,0660,1400)
oPrint:SayBitmap(0050,0050,"LogoGM.bmp", 0200, 0200)
oPrint:Say(0060,0280,"Teste de impressão de relatório",oFont1,100)
oPrint:Say(0160,0280,"Teste de impressão de relatório",oFont2,100)
oPrint:Say(0260,0280,"Teste de impressão de relatório",oFont3,100)
oPrint:Say(0360,0280,"Teste de impressão de relatório",oFont4,100)
oPrint:Say(0460,0280,"Teste de impressão de relatório",oFont5,100)
oPrint:Say(0560,0280,"Teste de impressão de relatório",oFont6,100)

oPrint:EndPage()

oPrint:Preview()

Return

45
Rotinas de Web
Envio de e-mail pelo sistema (Send Mail) através de SMTP

O ADVPL possui rotinas de envio de e-mail através de SMTP. Esse


recurso pode ser muito útil para envio de informações do sistema pela
web. Basicamente o envio de e-mails é feito por três funções básicas.
Durante o envio, temos a opção de enviar ainda arquivos anexos, com
cópia e cópia oculta. Também podemos selecionar o tipo de corpo de
mensagem, HTML ou texto.

Função para conectar-se ao servidor


[<lResult>:=]MailSmtpOn( <cServer>, <cUser>, <cPass>, <nTimeOut> )

cServer Endereço IP do servidor.


cUser Usuário para autenticação.
cPass Senha de autenticação.
nTimeOut Time out.

Função para envio da mensagem

[<lResult>:=]MailSend( <cFrom>, \{ <aTo> \}, \{ <aCc> \}, \{ <aBcc> \},


<cSubject>, <cBody>, \{ <aFiles> \}, <.lText.> ) ; ;

cFrom E-mail do remetente.


aTo Array contendo todos os destinatários.
aCc Array contendo destinatários a copiar.
aBcc Array contendo destinatários a copiar modo oculto.
cSubject Assunto da mensagem.
cBody Corpo da mensagem.
46
aFiles Array contendo nome dos arquivos anexos.
lText (.T./.F.) Modo do corpo da mensagem, .T. - texto, .F. –
HTML.

Função para desconectar-se do servidor

[<lResult>:=]MailSmtpOff()

Código fonte exemplo para envio de e-mails pelo sistema


#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_EML º Autor ³Organon TI Consultoriaº Data ³ 16/04/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de envio de e-mail pelo sistema. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_EML()

Local lResult
Local cBody := '<p><font face="Arial">Teste de envio de e-mail...</font></p>'

//Conecta com o servidor SMTP na conta especificada


lResult := MailSmtpOn("200.157.215.4","organon@organon-ti.com.br","XXXXXX",100)

If !lResult
MsgInfo("Não foi possível conectar-se ao servidor SMTP...","Atenção")
EndIf

//Envia o e-mail
lResult := MailSend("organon@organon-ti.com.br",{"info@organon-ti.com.br"},,,;
"Teste de envio de email",cBody,,.F.)

If !lResult
MsgInfo("Não foi possível enviar a mensagem para a conta especificada...","Atenção")
EndIf

//Desconecta do servidor SMTP


lResult := MailSmtpOff()

If !lResult
MsgInfo("Erro ao tentar desconectar-se do servidor SMTP...","Atenção")
EndIf

Return

47
48

Você também pode gostar