Escolar Documentos
Profissional Documentos
Cultura Documentos
1 - Foxpro - O CAMINHO DAS PEDRAS PDF
1 - Foxpro - O CAMINHO DAS PEDRAS PDF
Como desenvolvedor vindo de linguagens não visuais como Clipper e FoxPro, tive um certo
trabalho pra me adaptar com Visual FoxPro. Primeiro pela infinidade de coisas que são
abertas na tela pra se clicar e segundo porque existem muitos conceitos novos.
Pretendo através deste pequeno manual apresentar o caminho mais rápido para se desenvolver
aplicações em Visual FoxPro, sem que ter apresentar todos os conceitos da linguagem.
Nós que viemos de dialetos xBase e principalmente de linguagens para ambiente DOS temos
um vasto vocabulário de termos para elementos de nossas aplicações que provavelmente
mudarão de nomes no ambiente Windows. Alguns desses vocábulos:
Tabela 1
Linguagem não Visual Linguagem Visual
Tela Janela
Tela de Dados Formulário de Dados
Lib Biblioteca de classes
Get Textbox
Say Label
Ao contrário do que muitos acham, não é necessário conhecer tudo de VFP para começar a
desenvolver. Note que eu disse começar. À medida que se aprende mais, mais se têm
necessidade de aprender. Isso é o que é o máximo! Em outras palavras quero dizer que é
necessário aprender sempre.
• Project Manager
• Database Designer
• Form Designer
• Menu Designer
• Report Designer
• Program Editor
O Project Manager
Como é de se notar na figura do Project Manager acima, há seis abas dividindo os arquivos
do projeto por categoria, sendo elas:
Classes – exibe as bibliotecas de classes (vcx) incluídas no projeto assim como as classes
nelas contidas.
Other – exibe os demais tipos de arquivos que possam estar inclusos no projeto, como
imagens, arquivos texto, menus, etc.
Add... – serve para adicionar um componente já existente. Para adicionar um banco de dados
já pronto, bastaria clicar sobre Database e depois em Add... escolhendo então o banco de
dados a ser adicionado ao projeto.
Run – serve para executar o componente selecionado. Os componentes que podem ser
executados são os forms, labels, reports, prgs, menus.
Build... – serve para compilar o projeto, permitindo-os criar app’s, dll’s e exe’s.
Já mostrei algumas informações sobre o gerenciador de projetos mas ainda nem mostrei como
abri-lo. Pois bem, abri-lo é tarefa bastante simples.
Quando se trata de criar um novo projeto, você pode ir no menu File e escolher New... a
primeira opção é Project.
Ainda sobre o Gerenciador de projetos, podemos adicionar que há um menu específico para o
mesmo, conforme mostra a próxima figura.
O menu Project possui as ações dos botões contidos no Project Manager e ainda algumas
outras importantes ações como Project Info, utilizada para visualizar algumas outras
informações sobre o projeto. A opção Clean Up Project é uma espécie de reindexador e
compactador do projeto. À medida que vamos adicionando e removendo itens do projeto é
bom sempre que executemos o Clean Up Project para reduzir o tamanho do mesmo.
A Database Designer
Desde os tempos mais remotos o FoxPlus, FoxPro Dos e Windows também já permitia a
criação de tabelas de forma interativa, facilitando bastante a vida do usuário.
No Visual FoxPro não é diferente. Há uma ferramenta chamada Database Designer a qual
utilizamos para a criação de forma visual e interativa dos componentes de um banco de
dados.
A principal diferença conceitual é que na versão Visual, o Banco de dados é formado por um
Container e diversas tabelas. O DBC ou Database Container é responsável por armazenar
informações sobre as tabelas, índices, stored procedures (procedimentos armazenados),
triggers (disparadores), conexões e views.
Para acessar a Database Designer, você pode simplesmente a partir da aba Data do
gerenciador de projetos clicar em Database ou no nome do banco de dados existente (caso
exista um) e então clicar em New..., ou em Modify (caso exista um banco de dados).
No nosso caso como o banco ainda não existe, vamos criar um novo, clicando em New...
Uma nova janela será apresentada. Escolha New Database.
Agora informe o nome do banco de dados a ser criado. Caso queira colocá-lo dentro de uma
pasta separada, fique à vontade.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 5 de 103
Após clicar sobre o botão Save, o banco foi criado vazio e a janela da Database Designer irá
aparecer para que você adicione novas tabelas ao banco:
Observe que além da janela da Database Designer veio junto uma barra de ferramentas de
mesmo nome. A partir dessa barra de ferramentas podemos realizar as seguintes operações:
Já que estamos falando em banco de dados, vamos logo definir aqui o que vamos desenvolver
para aprendizado. Pensei num aplicativo simples, porém com um certo nível de
complexidade. Um Contas a Pagar e Contas a Receber seria um bom começo.
• Tabela de Fornecedores
• Tabela de Clientes
• Tabela de Contas a Pagar
• Tabela de Contas a Receber
• Tabela de Usuários
Passemos agora a definir a estrutura de cada uma dessas tabelas formando assim nosso banco
de dados. A estrutura das tabelas é a seguinte:
Tabela 2
Tabela: Clientes
Nome do Campo Tipo Tamanho
Id_cliente Character 6
Nome_cliente Character 40
Endereço Character 40
Numero Character 5
Bairro Character 20
Cep Character 8
Cidade Character 20
Estado Character 2
Ddd Character 2
Telefone Character 8
Contato Character 20
Tabela 3
Tabela: Fornecedores
Nome do Campo Tipo Tamanho
Id_fornecedor Character 6
Nome_fornecedor Character 40
Endereço Character 40
Numero Character 5
Bairro Character 20
Cep Character 8
Cidade Character 20
Estado Character 2
Ddd Character 2
Telefone Character 8
Contato Character 20
Tabela 4
Tabela: ContasReceber
Nome do Campo Tipo Tamanho
Id_ContaReceber Character 6
ID_Cliente Character 6
TipoDocto Character 10
NumeroDocto Character 8
DataVencimento Date 8
Valor Numeric 7,2
Quitado Logic 1
DataPagto Date 8
ValorPagto Numeric 7,2
Cheque_banco Character 3
Cheque_agencia Character 7
Cheque_numconta Character 10
Cheque_numero Character 6
Cheque_titular Character 40
DataCadastro Date 8
ID_usuario Character 3
Tabela 5
Tabela: ContasPagar
Nome do Campo Tipo Tamanho
Id_ContaPagar Character 6
ID_Fornecedor Character 6
TipoDocto Character 10
NumeroDocto Character 8
DataVencimento Date 8
Valor Numeric 7,2
Quitado Logic 1
DataPagto Date 8
ValorPagto Numeric 7,2
DataCadastro Date 8
ID_usuario Character 3
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 8 de 103
Tabela 6
Tabela: Usuários
Nome do Campo Tipo Tamanho
Id_usuario Character 3
NomeUsuario Character 25
SenhaUsuario Character 8
Uma vez que já temos a descrição das tabelas e seus campos, agora vamos colocar a mão na
massa... ops!, na raposa.
Como você já está com o banco de dados aberto, clique sobre o botão New Table. Aparecerá
o seguinte diálogo:
Clique sobre o botão New Table. Aparecerá então o diálogo Create para que você informe o
nome da tabela a ser criada.
Ao clicar em Save, um novo diálogo aparecerá onde você definirá o conteúdo da tabela.
Agora é só informar as informações de cada campo.
Observe na figura acima as informações de cada campo. Na lista da esquerda estão os campos
da tabela. No painel da direita colocamos informações adicionais para definirmos
propriedades e comportamentos em particular de cada campo.
Na figura acima temos dois destaques. O primeiro, na coluna Index indica que o campo será
um índice. O segundo, na coluna NULL indica que o campo poderá receber um valor vazio.
Como você observou no painel da direita, exibido na figura 8, temos algumas propriedades
relacionadas à forma como os dados serão exibidos na tela ou em relatórios. Veja a figura 10:
Caption – define o título (descrição) para o campo. Esta é a informação que aparecerá no
cabeçalho das grids, browses, labels, relatórios, etiquetas, etc. Definir este valor neste ponto
fará com que tenhamos muito menos trabalho na hora de formatar nossos formulários e
relatórios.
O painel Field Validation da figura 8, apesar de parecer interessante não terá muita utilidade
quando estivermos criando nossas aplicações. Na maioria das vezes esse tipo de validação
estará em nossos formulários e não diretamente no banco de dados.
O painel Map field type do class permite que façamos um mapeamento para o tipo de
controle que será usado para a entrada dos dados, por exemplo, Combo, Checkbox, Textbox,
etc. Na maioria das vezes não faremos esse mapeamento diretamente no banco de dados.
Tabela 7
Configuração Descrição
Uma vez que definimos os campos da tabela e já marcamos quais campos gostaríamos que
fossem índice, precisamos agora refinar esses índices acrescentando alguma informação ou
simplesmente escolhendo o tipo de índice apropriado.
Primary – Índice primário ou chave primária, conforme o gosto do freguês. Este tipo de
índice não aceita valor duplicado. Ideal para campos identificadores, CNPJ, CPF, ou qualquer
outro que requer um valor único em toda a tabela.
Cadidate – É um índice semelhante à chave primária. Este tipo de índice substitui o tipo
UNIQUE de versões anteriores do FoxPro e também do dBase e Clipper. Uma chave do tipo
Cadidate não aceita valores duplicados, por isso é uma chave candidata a chave primária.
Regular – É o tipo de índice comum, usado apenas para indexar uma tabela por uma
determinada chave. No Visual FoxPro as chaves estrangeiras são índices do tipo regular.
Para refinar a definição de nossos índices vamos clicar na aba Indexes e teremos o seguinte
diálogo:
Name – é o nome que daremos para a marca (TAG) de índice da tabela. São permitidos até
10 caracteres.
Expression – define o campo que será usado na marca de índice. Chaves compostas podem
ser criadas. Para tal, basta concatenarmos a expressão colocando ali os campos que
desejamos. Funções nativas do VFP ou definidas pelo usuário também podem ser utilizadas
nas expressões de índice.
Filter – permite criarmos filtros para nossos índices. Algumas vezes é interessante criar
índices com filtro, por exemplo um filtro sem os registros apagados.
Collate – permite definir a página de código para o índice. Esta opção é muito útil quando do
desenvolvimento de aplicações internacionais que usam idiomas diferentes. Esta opção está
disponível somente a partir da versão 8 do VFP. Em versões anteriores consegue-se um
resultado semelhante através do comando SET COLLATE.
Agora que nossas tabelas estão criadas, vamos definir os relacionamentos permanentes. Este
talvez seja um conceito novo para quem vem de outras linguagens. Mas é bastante
interessante e com esse tipo de relacionamento temos muito a ganhar. Por exemplo, o
relacionamento definido entre uma tabela de clientes com a tabela de contas a receber será
feito de forma automática quando adicionarmos tais tabelas ao nosso formulário. Não apenas
isso, mas regras de integridade podem ser definidas a partir do relacionamento.
Vamos então modificar a estrutura do nosso banco de dados para criar os relacionamentos e a
integridade referencial. Com o projeto aberto, clique na aba Data, e então clique sobre o
banco de dados cpedras. Agora clique no botão Modify.
Na figura acima fiz questão de destacar o índice id_usuario. Note que agora as tabelas
possuem os campos listados na primeira parte e logo abaixo da lista de campos vem os
índices. O campo de chave primária terá uma ao lado esquerdo da marca de índice.
Definindo relacionamentos
Agora vamos definir os relacionamentos entre as tabelas. Este procedimento é muito simples.
Basta você arrastar o índice da tabela pai (lado um) do relacionamento para o índice da tabela
filho (lado muitos). Por exemplo, arrastar o índice id_cliente para cima do índice.
Tabela 8
Tabela Pai Tabela Filha
Clientes->id_cliente ContaReceber->id_cliente
Fornecedores->id_fornece ContaPagar->id_fornece
Usuarios->id_usuario ContaReceber->id_usuario
Usuarios->id_usuario ContaPagar->id_usuario
Os relacionamentos do tipo um para muitos são os mais comuns e mais fáceis de serem
definidos, como é o caso que fizemos aqui. Note que o lado um do relacionamento há uma
notação parecida com um sinal de mais ( + ) e do lado muitos há uma espécie de gancho com
três pontas.
É muito importante saber como editar o relacionamento entre as tabelas, pois pode ser que
por falta de atenção arrastemos um índice para outro que não seja o seu correspondente
causando assim uma falha de relacionamento. Nenhum erro ocorrerá mas muito
provavelmente o resultado não será o esperado.
Editando um relacionamento
Para editar um relacionamento, basta clicar sobre a linha de relacionamento entre as tabelas
com o botão direito e escolher Edit Relationship... Aparecerá um diálogo como o apresentado
a seguir na figura 15.
Observe de acordo com a figura 15 que o lado esquerdo representa a tabela a qual o
relacionamento inicia-se e o lado direito é a tabela à qual ela se relaciona. A informação
Relationship type exibe se o relacionamento é do tipo um para muitos (One To Many) ou um
para um (One To One). Note também que há um botão Referential Integrity. Através deste
botão podemos definir a integridade referencial entre as duas tabelas.
Para gerar integridade referencial, é necessário abrir o banco de dados em modo exclusivo.
Muito provavelmente seu banco já estará aberto em modo exclusivo, mas caso receba uma
mensagem como esta:
Você deverá fechar o seu banco de dados e então abri-lo em modo exclusivo. Em nosso caso,
basta digitar o seguinte na janela de comandos:
Como vimos na figura 15, é possível definir a integridade referencial a partir do diálogo de
edição do relacionamento. Mas essa não é a única forma. Temos ainda as opções de acessar
através do menu Database ou do menu de contexto clicando com o botão direito sobre a linha
do relacionamento e escolhendo Edit Referential Integrity.
Vamos então clicar com o botão direito sobre o relacionamento entre a tabela de clientes e a
tabela ContasReceber e escolher Edit Referential Integrity. Aparecerá um diálogo
semelhante ao seguinte:
Este diálogo aparece a fim de selecionarmos o Builder (criador) que será usado para definir a
integridade referencial. O Builder padrão do VFP para esssa tarefa é o Referential Integrity
Builder. Após selecionar, clique em OK.
Agora temos o Builder aberto. Clique sobre a aba Rules for Deleting (Regras para apagar).
Em nosso caso vamos criar regras (rules) apenas para ações de apagar (delete). Faremos isso
para garantir que quando um registro de uma tabela pai for apagado, os registros da tabela
filha não fiquem órfãos.
As opções são:
Do ponto de vista funcional, a melhor das opções é a Restrict, uma vez que não permitirá
apagar um cliente caso esse possua algum lançamento de conta a receber.
Caso você ainda não tenha feito, defina as regras conforme mostra a figura 18 e depois clique
em OK. Aparecerá o seguinte diálogo:
Escolha Yes. Caso você venha a modificar alguma Stored Procedure gerada automaticamente
pelo VFP, se você refizer a integridade através do Builder você perderá as modificações. Por
isso a opção de fazer a cópia antes.
Algumas definições:
Para garantir essa funcionalidade de forma automática, o VFP irá criar triggers, ou seja,
disparadoras automáticos para a ação de excluir das tabelas clientes e fornecedores, apagando
os registros de ContasReceber e ContasPagar, respectivamente.
Um trigger (disparador) é uma expressão ligada a uma tabela e que é invocado sempre que há
algum tipo de modificação na mesma. Podemos associar expressões trigger’s para incluir,
modificar e apagar registros.
Trigger’s podem ser criados para as mais diversas funções, por exemplo, criar índices,
selecionar determinados registros, fazer lançamentos ou processamentos em tabelas, e assim
por diante. O código escrito para um trigger é armazenado como stored procedure
(procedimentos armazenados) no banco de dados.
Embora o Visual FoxPro 8.0 já tenha de forma nativa um campo de auto-incremento, vamos
criar nossa própria rotina de auto-incremento através de uma stored procedure. Basta
adicionar o seguinte código às stored procedures:
Essa Stored Procedures é capaz de gerar código seqüencial para qualquer tabela do banco de
dados, desde que sejam seguidas as seguintes regras:
É claro que para gerar código seqüencial para campos do tipo numérico ou inteiro basta
alterar a função. Fica a gosto do freguês.
Uma vez que a função já está inclusa no banco, juntamente com as Stored Procedures, vamos
alterar a estrutura das nossas tabelas e adicionar a função ao valor inicial do campo
seqüencial. Para isso, modifique o banco de dados e clique sobre o nome da tabela que quer
alterar. Vamos começar pela tabela de clientes. Clique sobre o botão Modify após selecionar
a tabela.
Agora repita a mesma operação para as outras quatro tabelas. Lembre-se apenas sobre o
campo ID da própria tabela.
Humm... já estava me esquecendo... muito provavelmente você deve estar curioso pra saber
onde é que vai a chamada ao código do trigger para apagar os registros. Muito bem,
modifique a tabela de clientes e vá à aba Table e veja, conforme figura 24:
Muito bem, a parte de banco de dados está finalmente pronta! Agora partiremos para
conhecer os formuários.
Como quase tudo no Visual FoxPro, existe mais de uma forma de programar os formulários.
Os mesmos podem ser criados a partir da Form Designer ou programados diretamente através
de PRG’s. Com certeza a primeira opção será mais produtiva uma vez que tudo pode ser feito
de forma visual, enquanto que a segunda precisa de ser codificada na munheca. ☺
Como nosso objetivo é produzir mais em menos tempo, vamos partir para a Form Designer.
A ferramenta Gerenciador de Projetos possui uma aba dedicada aos documentos que são
Formulários, Relatórios e Etiquetas.
No diálogo acima, escolha New Form. A Form Designer será aberta, conforme mostra a
próxima figura.
Na figura 27 temos a área de desenho do formulário onde iremos inserir todos os controles.
Temos também a barra de ferramentas Form Controls. Essa barra de ferramentas disponibiliza
ao desenvolvedor todos os controles possíveis de se inserir em um formulário. São os
controles básicos do Visual FoxPro. Como podemos personalizar (subclassificar) cada um
desses controles e criar os nossos próprios, temos ainda a opção de anexar nossas bibliotecas
de controles para serem exibidas na barra de ferramentas Form Controls.
Assim que a Form Designer é aberta um novo menu chamado Form é adicionado à barra de
menus. Esse menu serve para disparar algumas opções relacionadas ao formulário. Veja a
figura 28:
Temos ainda um componente muito importante. Na verdade tão importante quanto a Form
Designer. É a janela de propriedades, a qual utilizamos para configurar desde o formulário até
as mais diversas características de cada controle nele incluso. Veja a figura 29:
Há cinco abas nessa janela: All, Data, Methods, Layout e Other. Vejamos para que servem:
2. Quando você altera uma propriedade, o valor alterado aparecerá em negrito na janela
de propriedades facilitando a identificação.
3. Os valores que aparecem no formato itálico são valores somente leitura (ready only),
ou seja, não podem ser editados.
Além dos componentes já apresentados temos um outro que também é muito importante.
Trata-se do Ambiente de Dados (Data Environment). O ambiente de dados é responsável por
gerenciar a abertura e fechamento das tabelas do banco de dados, além de oferecer recursos
de Buffer (proteção). É claro que não é obrigatória a utilização do ambiente de dados. Mas já
que é um recurso que está disponível e funciona muito bem, porque não utilizá-lo?
As tabelas que serão apresentadas ou manipuladas neste ambiente podem ser operadas desde
os mais clássicos comandos do mundo xBase como APPEND BLANK, REPLACE, até
comandos SQL como INSERT SQL, UPDATE SQL, DELETE SQL, SELECT SQL, etc.
Em nosso primeiro formulário vamos procurar usar a maioria das ferramentas aqui
apresentadas, de forma que as conheçamos na prática.
Com o formulário que criamos agora há pouco, vamos configurar algumas propriedades para
melhor adequá-lo à realidade de nosso software. Vamos criar um formulário para
cadastro/manutenção de usuários do sistema.
1. Com o formulário aberto, clique sobre o mesmo e depois clique sobre a aba Layout da
janela de propriedades.
3. Mude a propriedade AutoCenter para .T. (True). Isto fará com que a janela seja
centralizada automaticamente ao ser aberta.
6. Nesta aba, altere ainda a propriedade DataSession para 2 – Private Data Session. Isso
garantirá que cada instância desse formulário terá uma sessão de dados separada. É
importante saber que quando um formulário usa uma sessão de dados privada, todos
os comandos SET para configuração de ambiente devem ser configurados dentro do
próprio formulário. É claro que isso parece trabalhoso à medida que nossos
formulários vão aumentando, mas graças às técnicas de Programação Orientada a
Objetos (OOP) tudo isso é muito fácil.
Em nosso aplicativo, vamos utilizar o ambiente de dados (data environment) para controlar a
manipulação dos dados em nossos formulários. Para tal, precisamos adicionar ao ambiente de
dados a tabela que iremos utilizar:
1. Clique sobre a área do formulário com o botão direito do mouse e escolha Data
Envivonment...
2. No diálogo Add Table ou View, escolha a tabela de usuários e depois clique sobre o
botão Add, conforme figura 31, depois clique em Close.
4. Agora selecione os campos da tabela usuarios. Você pode segurar a tecla SHIFT
enquanto sobre os campos. Uma vez selecionados, clique com o botão direito do
mouse e arraste-os para a área de design do formulário, conforme mostra a figura 33.
5. Assim que você soltar o botão do mouse aparecerá um menu com três opções,
conforme a figura 33. Escolha Create Multiple Controls Here. Os controles serão
criados, conforme mostra a próxima figura:
1. Clique sobre o controle que deseja verificar as propriedades. No nosso caso, clique
sobre o controle do tipo TextBox para entrada do ID do usuário. O nome do controle é
txtId_usuario e ganhou esse nome automaticamente ao arrastarmos o controle para o
formulário. Por padrão o Visual FoxPro adiciona um prefixo de três letras a cada
controle que você arrastar, identificando o tipo de campo. Essa é uma prática que é
bom seguirmos para termos padronização e também para sabermos identificar
facilmente o tipo de controle que está sendo utilizado.
2. Se a janela de propriedades estiver aberta, apenas clique nela e vá para a bada Data.
Caso contrário, clique com o botão direito sobre o objeto txtId_usuario e escolha
Properties. Vá então para a aba Data conforme dito anteriormente.
Embora os prefixos não sejam requeridos, utilizá-los tornará nosso código bem mais
profissional e fácil de ser entendido. A seguir está uma lista dos prefixos sugeridos pela
Microsoft:
Tabela 9
Prefixo Tipo de Objeto Exemplo
Chk CheckBox chkReadOnly
Col Collection colFormObjects
Cbo ComboBox cboEnglish
Cmd CommandButton cmdCancel
Cmg CommandGroup cmgChoices
Cnt Container cntMoverList
Ctl Control ctlFileList
Cad CursorAdapter cadInventory
<user- Custom user-defined
defined>
Dte DataEnvironment dteSalesForm
Edt EditBox edtTextArea
Frm Form frmFileOpen
Frs FormSet frsDataEntry
Grd Grid grdPrices
Grc Column grcCurrentPrice
Grh Header grhTotalInventory
Hpl HyperLink hplHomeURL
Img Image imgIcon
Lbl Label lblHelpMessage
Lin Line linVertical
Lst ListBox lstPolicyCodes
Olb OLEBoundControl olbObject1
Ole OLE oleObject1
Opt OptionButton optFrench
Opg OptionGroup opgType
Pag Page pagDataUpdate
Pgf PageFrame pgfLeft
Prj ProjectHook prjBuildAll
Sep Separator sepToolSection1
Shp Shape shpCircle
Spn Spinner spnValues
Txt TextBox txtGetText
Tmr Timer tmrAlarm
Tbr ToolBar tbrEditReport
Xad XMLAdapter xadRemoteXMLData
Xfd XMLField xfdPrices
Xtb XMLTable xtbInventory
Nosso formulário de Cadastro de Usuários deverá ficar com a aparência exibida na figura 36.
Os botões de comando para todos os demais formulários de cadastro serão os mesmos. Por
isso é bom planejarmos para que o código seja 100% reutilizável. Dessa forma estaremos
aplicando bem os conceitos da OOP.
Tabela 10 - MÉTODOS
MÉTODO OBJETIVO
BloquearRegistro() Bloqueia o registro para operações de alteração e
remoção (delete).
CoordenaBotoes() Coordena o estado dos botões do formulário de acordo
com cada operação.
CoordenaControles() Coordena o estado dos controles de edição dos dados,
tornando-os editáveis ou não editáveis.
CoordenaNavegacao() Coordena o estado dos botões de navegação do
formulário.
CriticarDados() Reservado para a escrita de código para validação dos
dados do formulário.
PosicionarPrimeiroCampo() Executa o comando armazenado na propriedade
PrimeiroCampoFoco. É usado para posicionar o cursor no
campo que será o primeiro foco em operações de adição e
edição de registros.
TratarErro() Faz o tratamento de erros do formulário.
Tabela 11 - PROPRIEDADES
PROPRIEDADE OBJETIVO
PrimeiroCampoFoco Nesta propriedade será colocado o comando responsável
pelo posicionamento do foco no primeiro campo editável.
Além dos métodos já apresentados, ainda iremos programar o evento Init do formulário a fim
de definirmos as configurações iniciais do formulário. Sim, eu disse programar o evento Init.
O fato é que um evento também pode ser programado como um método. Ou seja, podemos
determinar código para ser executado quando um evento ocorre. Assim o código programado
no evento Init logo será o método Init. Pra descomplicar um pouco, apenas tenha em mente
que o evento em si não faz nada. Ele apenas ocorre e pronto. Aí, para facilitar nossa vida
podemos escrever códigos quando eles ocorrem. Ao código escrito ali no evento,
denominamos método.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 34 de 103
É importante saber que diversos outros tipos de objetos também possuem Propriedades,
Eventos e Métodos (PEM’s) de mesmo nome. Apesar de terem PEM’s de mesmo nome, a
execução desses PEM’s em um objeto não interfere na execução dos PEM’s de outro objeto.
A esta característica damos o nome de ENCAPSULAÇÃO.
Agora que já estamos conhecendo a ordem de ocorrência dos eventos quando da execução de
um formulário já podemos ter idéia de onde adicionar o código. Existem diversos outros
eventos que ocorrem quando um formulário está sendo executado, mas à medida que formos
precisando deles passaremos a conhecê-los em mais detalhes.
Os botões de ação ou botões de comando são usados para disparar ações a serem executadas.
O Windows está cheio deles. No Visual FoxPro não é diferente. Quando estamos
programando um formulário para inserção e manutenção de dados numa tabela poderemos ter
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 35 de 103
vários botões com ações como essas: Novo, Gravar, Editar, Desfazer, Excluir, Primeiro,
Anterior, Próximo, Último e assim por diante, conforme a necessidade do projeto. Cada ação
requer a especificação de código para executar a tarefa a qual o botão se propõe.
Nessa etapa do nosso estudo, vamos lidar com os botões de ação para começarmos a dar vida
aos nossos formulários. De nada adianta termos belas interfaces, se essas não puderem
realizar o trabalho esperado sobre os dados.
Adicionar um botão ao formulário é tarefa simples. Basta clicar sobre Command Button na
barra de ferramenta Form Controls e em seguida posicionar o cursor no local onde deseja
adicionar o botão ao formulário e clicar.
A seguir está a descrição dos objetos Buttons que teremos em nosso formulário e quais
propriedades e métodos devemos alterar ou escrever.
Tabela 13
BOTÃO: Novo
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Novo
Name bntNovo
Picture imagens\new.bmp
Height 27
Left 3
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 14
BOTÃO: Gravar
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Gravar
Name bntGravar
Picture imagens\save.bmp
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 36 de 103
Height 27
Left 80
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 15
BOTÃO: Editar
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Editar
Name bntEditar
Picture Imagens\wzedit.bmp
Height 27
Left 157
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 16
BOTÃO: Desfazer
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Desfazer
Name bntDesfazer
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 37 de 103
Picture imagens\wzundo.bmp
Height 27
Left 234
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 17
BOTÃO: Excluir
PROPRIEDADE VALOR A ATRIBUIR
Caption E\<xcluir
Name bntExcluir
Picture imagens\wzundo.bmp
Height 27
Left 311
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 18
BOTÃO: Primeiro Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntPrimeiro
Picture imagens\wztop.bmp
Height 27
Left 390
PicturePosition 1
Top 179
ToolTip Text Primeiro Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 19
BOTÃO: Registro Anterior
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntAnterior
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 39 de 103
Picture imagens\wzback.bmp
Height 27
Left 416
PicturePosition 1
Top 179
ToolTip Text Registro Anterior
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 20
BOTÃO: Próximo Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntProximo
Picture imagens\wznext.bmp
Height 27
Left 442
PicturePosition 1
Top 179
ToolTip Text Próximo Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 21
BOTÃO: Último Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntUltimo
Picture imagens\wzend.bmp
Height 27
Left 468
PicturePosition 1
Top 179
ToolTip Text Último Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Tabela 22
BOTÃO: Fechar
PROPRIEDADE VALOR A ATRIBUIR
Caption Fecha\<r
Name bntFechar
Picture imagens\wzclose.bmp
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 40 de 103
Height 27
Left 496
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event
Talvez você esteja pensando muitas coisas nesse momento, mas com certeza uma delas deve
ser: Como faço para atribuir essas configurações e escrever o código de cada evento/método?
Primeiro você deve clicar sobre o objeto que deseja atribuir as propriedades ou o código.
Depois clique com o botão direito e escolha Properties. Para seguir uma seqüência lógica,
comece pelo botão Novo. Após clicar em Properties, você terá a janela de propriedades
aberta, como mostra a figura 37:
O código do evento Click, conforme tabela 13 deve ser digitado no evento clique do botão
Novo. Para isso você deve acessa a aba Methods e localizar o Click Event, dê dois cliques
sobre o mesmo e abrirá o editor de programas para você digitar o código:
Agora defina todas as propriedades para os botões e também o código do evento Click
conforme ilustra as tabelas de número 13 a 22.
Além do código do evento Click de cada botão, nosso formulário ainda contém código nos
métodos relacionados na tabela 10. A seguir estão relacionados os métodos e os seus
respectivos códigos.
Tabela 23
MÉTODO CÓDIGO DO MÉTODO
BloquearRegistro
CoordenaBotoes()
CoordenaControles()
CoordenaNavegacao()
CriticarDados()
PosicionarPrimeiroCampo()
=AERROR(dados)
*-- A função AERROR( ) cria uma matriz,
* retornando o número de linhas da matriz.
* Número do elemento Descrição
* 1 Numérico. Contém o número do erro.
* Idêntico ao valor retornado por ERROR( ).
* 2 Caractere. O texto da mensagem de erro.
* Idêntico ao valor retornado por MESSAGE( ).
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 47 de 103
DO CASE
lnNrBotao = MESSAGEBOX( ;
cMsgErro + CHR(13)+CHR(13)+[Pressione: ]+CHR(13);
+[ OK para forçar a gravação;]+CHR(13);
+[ Cancelar para desfazer.]+CHR(13)+[], ;
32+1+0, ;
[Erro atualizando o banco de dados])
Thisform.CoordenaBotoes("PADRAO")
RETURN
OTHERWISE
*-- Caixa de Mensagem "Exclamação"
* botões "Ok"
* default "1º Botão"
= MESSAGEBOX( ;
[Erro número: ] + alltrim(str(dados(1)));
+CHR(13)+CHR(13);
+dados(2)+CHR(13)+CHR(13);
+[O programa será cancelado!];
+CHR(13)+[], ;
48+0+0, ;
[Erro inesperado])
ON ERROR
ON SHUTDOWN
*-- Cancela a execução
CANCEL
*-- Termina o ciclo de eventos
CLEAR EVENTS
ENDCASE
Init
Faça isso para todos os métodos que precisas criar para o formulário.
3. Clique em Add.
Agora que a propriedade está disponível, clique sobre o formulário, depois clique com o
botão direito do mouse e escolha Properties. Na janela de propriedades, escolha a aba All e vá
para o final da lista. Deve aparecer a propriedade. Informe o valor
Thisform.txtNomeUsuario.SetFocus() para a mesma.
Após realizadas todas as alterações proposta acima, seu formulário deverá estar pronto. É
claro que você pode melhorar a aparência conforme seu gosto, movendo os objetos para os
locais que melhor lhe atraia e até mesmo inserindo outros objetos de interface.
Agora chegou a hora de executarmos nosso formulário para testá-lo. Quando for testar, faça-o
devagar, senão poderá se ferir. ☺
O que acho fantástico no Visual FoxPro é poder mesmo no ambiente de design ver o
resultado daquilo que estamos fazendo sem ter que compilar o projeto e gerar um executável.
Para executar o formulário basta você clicar sobre o botão . Faça isso então e verás o
resultado semelhante à figura 36. A diferença será os dados ainda não preenchidos em sua
tabela.
Ainda há uma coisa a se fazer. Como nosso formulário possui um ambiente de dados privado,
toda a configuração externa a este não é incorporada. Por exemplos os registros apagados
poderão aparecer causando uma impressão de que o botão excluir não funciona corretamente.
3. No diálogo New Class, exibido na figura 42, informe SetagemAmbiente como Class
Name, Based On como Custom e Sore In, informe ambiente.vcx. O arquivo
ambiente.vcx passará a ser a biblioteca de classes para classes de ambiente em nosso
projeto. Click em OK.
7. Voltando ao Gerenciador de Projetos, você verá que a classe que criamos já aparece
na lista de classes.
8. Agora abra novamente o formulário usuários para ser modificado. Vamos incluir a
classe que acabamos de criar no formulário.
9. Observe a figura 45, onde estão posicionadas as duas janelas (Gerenciador de Projetos
e Usuários). Com a janela do Gerenciador de Projetos aberta, clique sobre a classe
SetagemAmbiente e segurando o botão do mouse arraste-a para dentro do formulário
de usuários. O resultado será algo como o seguinte:
10. Pronto, agora é só você arrastar o objeto SetagemAmbiente1 que foi instanciado
dentro do formulário usuários. Somente o simples fato dele estar lá dentro o código já
será executado, uma vez que o código da classe fôra escrito dentro do evento Init do
mesmo.
11. Salve o formulário e execute-o. Inclua registros e os apague e veja que agora tudo
funciona perfeitamente.
Agora que o formulário está pronto e funcionando, vencemos a primeira etapa. Você já deve
ser capaz de programar outros formulários com características semelhantes. Por exemplo o
formulário de Cadastro de Clientes e o de Cadastro de Fornecedores.
Antes porém de passar a desenvolver esses outros formulários quero comentar um pouco
sobre algumas partes do código principalmente alguns termos usados.
O modelo de objetos pode ser considerado a um grande recipiente. Pra ficar mais claro ainda
vamos comparar esse recipiente como sendo ao muro que cerca uma casa.
Esse muro possui suas características (propriedades) por exemplo, altura, largura,
comprimento, espessura, cor, composição (material utilizado) e outros.
Dentro do muro há várias coisas, por exemplo uma casa, um jardim, etc.
Tanto a casa e o jardim ambos possuem suas propriedades que você mesmo pode imaginar
quais são e enumerá-las.
Dentro da casa há diversas dependências como sala, quarto, cozinha, varanda, garagem,
banheiros, etc.
Gostaria que você desse uma olhada na seguinte planta baixa de uma casa e imaginasse a
relação hierárquica entre cada objeto:
Imagine a linha preta em volta como sendo o muro. A área verde representa o jardim e a
planta interior é a casa com suas dependências e objetos em cada dependência.
Usando uma semântica de notação semelhante à do Visual FoxPro, onde cada objeto contido
em outro é separado por um ponto “.”, se fôssemos descrever o que temos na casa faríamos
algo como o que se segue:
Muro.Jardim.Casa.Sala.Sofá1.Cor = “Marrom”
Muro.Jardim.Casa.Quarto1.Cama.Tipo = “Casal”
Muro.Jardim.Grama.Cor = “Verde”
Muito bem, vou parar por aqui a analogia que fiz com a casa. Agora vamos tentar entender
como funciona o Modelo de Objetos do Visual FoxPro.
Quando você abre o Visual FoxPro a primeira coisa que temos é uma grande janela contendo
várias barras de ferramentas, etc. Essa é a janela principal do Visual FoxPro e no modelo de
objetos ela é representada com o nome _Screen.
A partir do Objeto _Screen muitos outros podem ser adicionados, por exemplo formulários,
barras de ferramentas, etc, etc.
À medida que vamos adicionando objetos dentro de outro objeto estamos implicitamente
criando uma hierarquia entre esses objetos, de forma que para acessar o objeto contido,
precisamos especificar também o recipiente (container), ou seja, aquele que contém o objeto
contido.
O Visual FoxPro gerencia muito bem a hierarquia dos objetos. Em um nível mais superior
como do objeto _Screen, muito raramente precisaremos gerenciá-los.
Sendo:
Value -> Propriedade do objeto txtNomeUsuario que irá armazenar o nome do usuário.
Abra o seu formulário de usuários para modificar e depois clique no botão executar
formulário .
Imagino que você vá colocar o seu nome. ☺ Tudo bem, eu não ligo.
Muito bem, agora vamos ver algumas formas relativas de se acessar objetos.
Imagine que num método genérico desenvolvido para ser reaproveitado com vários outros
formulários de nomes diferentes você precise acessar alguns botões, métodos, propriedades.
Só que você não saberá qual é o nome do formulário. Por isso ficará inviável usar da forma
que fizemos acima.
Thisform quer dizer este formulário. Ou seja, faz uma referência ao formulário que está
executando o código sem se importar qual é o seu nome.
na janela de comandos você obterá um erro, pois a referência é inválida. Essa referência só
será válida quando chamada do próprio formulário e não de outros lugares.
É por isso que no código dos métodos e eventos do nosso formulário está cheio de referência
usando thisform. Por exemplo:
Neste caso o código está dizendo para executar o método CoordenaNavegacao, passando o
parâmetro “PRIMEIRO” no formulário em questão.
This é uma referência para o objeto em questão. Ou seja, quando estamos codificando dentro
de um determinado objeto e queremos nos referir a ele próprio então usamos this.
Imagine que inserimos um objeto container e nele colocamos alguns outros objetos como por
exemplo botões de comando.
This.Parent.bntBotao2.Click
Aqui estou dizendo assim, acesse o Parent (pai, recipiente, container) no qual estou inserido e
então dispare o Click de bntBotao2.
Entendeu a flexibilidade?
A princípio parece complicado, mas à medida que você for codificar perceberá que na prática
é mais simples, principalmente se estiver utilizando o recurso de IntelliSense do Visual
FoxPro.
No final deste documento você encontra um guia de referência para os comandos e funções
utilizados até o momento.
Apesar do conceito ser um pouco vago, você entenderá na prática o que estou tentando dizer.
Até o momento definimos um formulário chamado usuarios.scx. Neste formulário
adicionamos vários controles do tipo Botão de Comando e dentro de cada botão inserimos um
código a ser executado quando do seu pressionamento.
Se fôssemos usar os métodos da linguagem tradicional o que faríamos seria copiar esses
controles para um novo formulário e estaria tudo certo.
Aí você pergunta:
─ Funciona.
─ Porque além de você ter o trabalho de copiar tudo cada vez para cada formulário novo, se
de repente você encontrasse um erro no código de algum desses botões, você teria que sair
corrigindo o erro em cada formulário, sem contar que o tamanho do seu executável
aumentaria bastante pois o código estaria duplicado em cada formulário.
Antes que você pergunte como definir uma classe, vou lhe explicar.
Vamos criar uma classe a partir do formulário usuarios.scx porque todo o código necessário
para o seu funcionamento como os métodos de coordenação de controles, botões, navegação
já estão ali agregados (encapsulados) no formulário e todos os botões já estão prontos.
Evidentemente que algumas coisas não serão reaproveitadas como por exemplo a tabela de
usuários e os campos.
Criando a Classe:
A partir desse momento uma nova biblioteca de classes foi criada com o nome
formulários.vcx. Dentro dessa classe está a definição da classe FormularioPadrao.
Agora que nossa classe está criada, é necessário que façamos as adequações necessárias para
que possamos reaproveitá-la (herança).
2. Caso a classe ainda não apareça na lista de classes, use o botão Add... para adicioná-
la.
6. Como você pode notar na figura 49 o formulário de usuários está ali completinho,
aparentemente. O que muda é que este formulário perdeu o ambiente de dados.
Simplesmente desaparece o vínculo quando transformamos um formulário em classe.
Isso faz sentido já que cada formulário instanciado a partir dessa classe terá um
ambiente de dados diferente. Agora precisamos redefinir algumas propriedades como:
A forma mais rápida e mais fácil de criarmos um formulário interativamente baseado em uma
classe visual é definindo qual a classe da qual o formulário irá se originar. Podemos fazer isso
acessando a opção Options do menu Tools.
Ao acessar a opção Options do menu Tools, clique na aba Forms. O resultado será algo como
o apresentado na figura 50.
Observe no destaque da figura. Esse grupo, Template Classes serve para definirmos qual será
a classe que servirá de modelo para nossos formulários. Marque o CheckBox Form.
Aparecerá um novo diálogo permitindo-nos escolher qual será a biblioteca e a classe
utilizada:
Você estará novamente no diálogo Options, e sua aparência deve ser a seguinte:
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 63 de 103
Note agora que o TextBox Form foi preenchido com o nome da classe seguido pelo caminho
e nome da biblioteca de formulários.
Clique no botão Set As Default. Agora já podemos criar nossos formulários baseados nesta
classe. Clique em OK.
Se você é como eu, provavelmente não conseguiu esperar até este ponto do texto e
provavelmente já tenha criado os formulários de clientes e fornecedores. Muito bem.
Parabéns! Esse tipo de iniciativa é uma ótima qualidade de um desenvolvedor. Não se deve
ficar esperando pelos outros, deve-se correr atrás.
Embora aprecie sua iniciativa, pode ser que o caminho escolhido não seja o mais produtivo
tanto em tempo de desenvolvimento como em futuras manutenções ao sistema.
Vamos agora criar os formulários do nosso sistema baseados na classe FormularioPadrao que
definimos como Class Template.
5. Observe que o formulário FormDoc1 (assim chamado porque ainda não foi salvo)
possui exatamente as mesmas características da classe FormularioPadrao. Quando
criamos um objeto baseado nas especificações de uma classe, dizemos que estamos
criando a instância da classe no objeto. Portanto, o formulário FormDoc1 é uma
instância da classe FormularioPadrao.
Agora que temos nosso formulário disponível para ser alterado, faremos as seguintes
modificações para que o mesmo se transforme em nosso formulário de clientes:
1. Clique com o botão direito do mouse sobre uma área livre do formulário e escolha
Data Environment.
6. É claro que você pode adicionar e remover código conforme a sua necessidade, mas
não se esqueça de sempre retornar os valores Falso (.F.) ou Verdadeiro (.T.) quando a
condição não obedecer as regras ou quando for o contrário disso, respectivamente.
Pronto! Seu formulário está pronto para ser usado. Difícil não é?
Agora sim, você pode criar todos os formulários de cadastro, inclusive recrie o formulário de
usuários para que todos fiquem baseados na mesma classe.
MÉTODO – Um método é uma ação que um objeto é capaz de executar. Um objeto pode ter
inúmeros métodos, mas pode também não ter nenhum. Em termos gerais um método é
comparado a uma função, porém está encapsulado dentro de um objeto. Um método é
representado por um ícone .
EVENTO – É uma ação que ocorre no ambiente de execução e que é reconhecido por um
objeto permitindo que seja programada uma reação. Eventos podem ocorrer por diversos
motivos, por exemplo um clique de mouse, a entrada ou perda de foco de um TextBox ou
qualquer outro controle. Existem vários eventos para cada tipo de objeto. Para identificar um
evento, note o tipo de ícone que representa um evento .
OBJETO -
ENCAPSULAÇÃO –
Sintaxe
& NomeVar[.cExpressão]
Argumentos
? &gcX
Comentários
AERROR() Cria uma matriz de variável que contém informações sobre o erro
mais recente do ODBC, OLE ou Visual FoxPro.
Sintaxe
AERROR(NomeMatriz)
Tipos de retorno
Numérico
Argumentos
Comentários
6 O valor nulo.
7 O valor nulo.
de OLÉ.
7 O valor nulo.
Sintaxe
ALLTRIM(cExpressão)
Tipos de retorno
Caractere
Argumentos
Comentários
Sintaxe
APPEND [BLANK]
[IN nÁreaTrabalho | cAliasTabela]
[NOMENU]
Argumentos
selecionada.
Comentários
APPEND abre uma janela de edição para que você possa fornecer
dados a um ou mais novos registros. Quando você adiciona um novo
registro, o Visual FoxPro atualiza todos os índices abertos.
Sintaxe
BOF([nÁreaTrabalho | cAliasTabela])
Tipos de retorno
Lógico
Argumentos
Comentários
Sintaxe
CANCEL
Comentários
Sintaxe
DELETE
[Escopo] [FOR lExpressão1] [WHILE lExpressão2]
[IN nÁreaTrabalho | cAliasTabela]
[NOOPTIMIZE]
Argumentos
Comentários
ENDCASE
Sintaxe
DO CASE
CASE lExpressão1
Comandos
[CASE lExpressão2
Comandos
...
CASE lExpressãoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 78 de 103
Argumentos
Comentários
Sintaxe
EMPTY(eExpressão)
Tipos de Retorno
Lógico
Argumentos
Numérica 0
Moeda 0
Flutuante 0
Número inteiro 0
Dupla 0
Comentários
Sintaxe
EOF([nÁreaTrabalho | cAliasTabela])
Tipos de Retorno
Lógico
Argumentos
EOF( ) retornará falso (.F.) se uma tabela não estiver aberta na Área
de trabalho que você especificou.
Comentários
Sintaxe
Argumentos
Comentários
Sintaxe
– Ou –
– Ou –
Argumentos
Comentários
Sintaxe
IF lExpressão [THEN]
Comandos
[ELSE
Comandos]
ENDIF
Argumentos
depois de ENDIF.
Comentários
Sintaxe
Tipos de retorno
Lógico
Argumentos
Comentários
Sintaxe
LOCAL ListaVar
– Ou –
Argumentos
Comentários
Sintaxe
LPARAMETERS ListaParâmetros
Argumentos
Comentários
Sintaxe
MESSAGEBOX(cTextoMensagem [, nTipoCaixaDiálogo [,
cTextoBarraTítulo]])
Tipos de retorno
Numérico
Argumentos
1 Botões OK e Cancelar.
Valor Ícone
16 Sinal de parada.
32 Ponto de interrogação.
48 Ponto de exclamação.
0 Primeiro botão.
Comentários
1 OK
2 Cancelar
3 Anular
4 Repetir
5 Ignorar
6 Sim
7 Não
Sintaxe
[Form.]Object.Refresh
Comentários
Sintaxe
Object.Release
Comentários
Sintaxe
Control.SetFocus
Comentários
Sintaxe
ON ERROR
[Comando]
Argumentos
Comentários
Sintaxe
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 93 de 103
ON SHUTDOWN [Comando]
Argumentos
Comentários
Sintaxe
READ EVENTS
Comentários
Sintaxe
Argumentos
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 94 de 103
Comentários
Sintaxe
RLOCK([nÁreaTrabalho | cAliasTabela]
| [cListaNúmerosRegistro, nÁreaTrabalho | cAliasTabela])
Tipos de retorno
Lógico
Argumentos
Comentários
Sintaxe
Argumentos
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 97 de 103
Comentários
SKIP Move o ponteiro do registro para frente e para trás em uma tabela.
Sintaxe
SKIP
[nRegistros]
[IN nÁreaTrabalho | cAliasTabela]
Argumentos
Comentários
SKIP 4 IN 'customer'
? RECNO('customer') && Exibe 5
GO BOTTOM
SKIP -5
? RECNO( )
TABLEREVERT() Ignora as alterações feitas em uma linha, tabela ou cursor que esteja
utilizando buffer e restaura os dados de OLDVAL( ) para cursores
remotos e os valores atuais do disco para tabelas e cursores locais.
Sintaxe
Tipos de retorno
Numérico
Argumentos
Comentários
Sintaxe
Tipos de retorno
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 100 de 103
Lógico
Argumentos
Comentários
Sintaxe
UNLOCK
[RECORD nNúmeroRegistro]
[IN nÁreaTrabalho | cAliasTabela]
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 102 de 103
[ALL]
Argumentos
Comentários
Sintaxe
UPPER(cExpressão)
Tipos de retorno
Caractere
Argumentos
Comentários