| Campo | Tipo | Tamanho |
| Professor | Caracter | 5 |
Nome | Caracter | 30 |
Endereco | Caracter | 30 |
Bairro | Caracter | 20 |
Cidade | Caracter | 5 |
Curso | Caracter | 5 |
Início da Página Professores
Alterações Iniciais
O formulário será criado dentro do projeto HORARIO, no diretorio F:\usuarios\alunoxx.
Após abrir este projeto, clique em Documentos / Formulário para criarmos um novo Form. Para
o nosso conhecimento inicial, a única tabela criada é PROFESSORES.
Para iniciarmos o formulário de Cadastramento, altere algumas opções do form inicial:
1) Aumente um pouco o formulário na sua altura e largura (Height = 305 e Width = 520);
2) Altere o Caption para "Manutenções"
3) Insira um objeto Label com o Caption "Cadastro de Professores":
Font Size = 16 FontBold = .t. FontItalic = .t.
4) Coloque o form para ser executado sempre no centro da tela (Autocenter = .t.)
5) Agora, o form está pronto para receber os objetos da tabela, pelo Ambiente de Dados.
Início da Página Professores
Ambiente de Dados
Sobre o formulário, tecle o botão direito do mouse e escolha Ambiente de Dados. Assim:
1) Adicione a tabela Professores clicando em Adicionar. Depois de adicionada, clique em
Fechar.
2) Selecione a tabela e altere a propriedade Order para Professor.
3) Para criarmos os objetos de cadastramento de cada campo da tabela no form é simples:
Arraste campo a campo sobre o formulário. Cada campo criará um objeto Label com o nome
do campo e um objeto texto com as características do campo.
4) Após arrastar todos os campos, clique no formulário para o Ambiente de Dados fechar.
5) Não ligue se, arrastando, os objetos ficam desorganizados. Selecione apenas os labels
dos campos, ative a barra de ferramentas LAYOUT e escolha um dos dois primeiros botões
desta barra (Alinhar laterais à esquerda ou Alinhar laterais à direita).
6) Faça o mesmo para os objetos textos da tabela.
7) Para vermos o resultado até agora, execute o formulário, escolha um nome (CadProf) e,
para voltar, clique no Fechar do Windows (X).

Início da Página Professores
Botões de Consulta |

|
Os objetos Command (Botões de comando) para localização utilizam figuras com extensão
.ICO ou .BMP para sua identificação. A ordem depende da propriedade Order no Ambiente de
Dados. Siga as seguintes ações:
1) Crie quatro botões com tamanho adequado (Width = 22); disponha-os como no exemplo;
2) Retire o Caption dos quatro botões;
3) Para cada botão, insira na propriedade Picture o arquivo .ICO adequado e digite na
propriedade Click (dê duplo-clique) o código de cada botão:
3.1- Início 3.2- Fim
go top go bottom
thisform.refresh thisform.refresh
3.3- Anterior 3.4- Próximo
skip -1 skip
if bof() if eof()
go top go bottom
endif endif
thisform.refresh thisform.refresh
Início da Página Professores
Form Activate
Vamos iniciar algumas propriedades no início da execução do Formulário. Para isso,
digite o código seguinte no método Activate do Form (dê duplo-clique no form vazio):
public opcao && declaracao de variavel
opcao = 0
set date brit && data britancia dd/mm/aa
with thisform && auxilia na digitação dos nomes
.command1.setfocus && O botão INCLUSÃO recebe o foco
.txtprofessor.readonly = .t.
.txtnome.readonly = .t.
.txtendereco.readonly = .t. && os campos estarão desabilitados
.txtbairro.readonly = .t.
.txtcidade.readonly = .t.
.txtcurso.readonly = .t.
endwith
OBSERVACAO: Observe o nome de cada botão (Propriedade Name):
Inclusão : Command1 Início : Command5
OK : Command2 Fim : Command6
Cancela : Command3 Anterior: Command7
Encerra : Command4 Próximo : Command8
Alteração: Command9 Exclusão: Command10
Início da Página Professores
Botão de Inclusão
Agora, crie um botão com o Caption = "Inclusão" e digite o seguinte código (com duplo-clique):
opcao = 1 && Variavel informa que é uma inclusão
if txnlevel() = 0 && só executa se não há nenhuma transação
begin transaction && Inicia uma transação de comandos
append blank in professores && insere registro em branco na tabela
with thisform
.txtprofessor.readonly = .f.
.txtnome.readonly = .f.
.txtendereco.readonly = .f.
.txtbairro.readonly = .f. && Libera campos para digitação
.txtcidade.readonly = .f.
.txtcurso.readonly = .f.
.txtprofessor.setfocus && Inicia digitação no código
.command1.enabled = .f.
.command9.enabled = .f. && desabilita botões Inclusão/Alteração/Exclusão
.command10.enabled = .f.
.refresh
endwith
endif
Início da Página Professores
Botão de Alteração
Agora, crie um botão com o Caption = "Alteração" e digite o seguinte código (com duplo-clique):
opcao = 2
begin transaction
with thisform
.txtnome.setfocus
.txtnome.readonly = .f.
.txtendereco.readonly = .f.
.txtbairro.readonly = .f.
.txtcidade.readonly = .f.
.txtcurso.readonly = .f.
.command1.enabled = .f.
.command9.enabled = .f.
.command10.enabled = .f.
endwith
Início da Página Professores
Botão de Exclusão
Agora, crie um botão com o Caption = "Exclusão" e digite o seguinte código (com duplo-clique):
opcao = 3
if messagebox('Tem Certeza da Exclusão do Registro?',4,'Exclusão') = 6
delete
skip +1
if eof()
go bottom
endif
thisform.refresh
endif
MESSAGEBOX
1º Parâmetro: Mensagem a ser exibida
2º Parâmetro: Caixa de diálogo (botões). Exemplo: 4 = SIM e NÃO 0 = OK
3º Parâmetro: Mensagem do Caption da janela de mensagem.
A função messagebox retorna valores numéricos, dependendo do botão escolhido. Exemplo:
6-SIM 7-NÃO 1-OK 2-CANCELAR
Início da Página Professores
Botão OK
if txnlevel() # 0
with thisform
if val(thisform.txtprofessor.value) < 1
messagebox('Código do Professor inválido!','Erro')
.txtprofessor.setfocus
return
endif
if empty(thisform.txtnome.value)
messagebox('Nome do Professor não pode ser vazio!','Erro')
.txtnome.setfocus
return
endif
end transaction
.txtprofessor.readonly = .t.
.txtnome.readonly = .t.
.txtendereco.readonly = .t.
.txtbairro.readonly = .t.
.txtcidade.readonly = .t.
.txtcurso.readonly = .t.
.command1.enabled = .t.
.command9.enabled = .t.
.command10.enabled = .t.
endwith Início da Página Professores
endif
Botão Cancela
if txnlevel() # 0
rollback
if opcao # 2
go top
endif
with thisform
.txtprofessor.readonly = .t.
.txtnome.readonly = .t.
.txtendereco.readonly = .t.
.txtbairro.readonly = .t.
.txtcidade.readonly = .t.
.txtcurso.readonly = .t.
.command1.enabled = .t.
.command9.enabled = .t.
.command10.enabled = .t.
.refresh
endwith
endif
Início da Página Professores
Botão Encerra
if txnlevel() # 0
rollback
endif
thisform.release
Início da Página Professores
Error Event (No Form)
LPARAMETERS nError, cMethod, nLine
if nerror = 1884
messagebox('Professor já existe!','Erro')
thisform.txtprofessor.setfocus
endif
Início da Página Professores
Criação de Classes
Conceitos
Encapsulamento Oculta a complexidade desnecessária. Se possuimos um objeto criado como
classe, algumas características e execuções não precisam ser exibidas, apenas executadas.
Exemplo: Para guiar um carro, precisamos trocar as marchas. Porém, não há nenhuma neces-
sidade saber como funciona o mecanismo da caixa de marcha. O benefício de poder ignorar o
código interno de um objeto é chamado Abstração. O encapsulamento, que envolve o empaco-
tamento do código contribui para a abstração.
Polimorfismo (SubClasses) É o reaproveitamento de uma classe já desenvolvida. Podemos
acrescentar mais códigos ou propriedades de uma classe (também com códigos iniciais) e
salvá-la como uma nova classe. Assim, esta nova classe (subclasse) herdará as caracte-
rísticas da classe pai, mas possuindo seus próprios códigos. Quando houver uma alteração
na primeira classe, a subclasse também receberá as alterações.
Herança Faz com que se torne eficiente a manutenção do código. Se fizermos uma altera-
ção em uma classe, essa alteração se refletirá em todas as subclasses baseadas na classe.
Se possuirmos uma subclasse com erro de código e, com certeza, esta subclasse é utilizada
em vários programas, em vez de irmos a cada subclasse para alterar o código, vamos apenas
uma vez na classe pai e a alteração se propagará por todas as subclasses.
Exemplo Início da Página Classes
Exemplo de Classe
1- Crie um novo formulário. Ele não será utilizado no projeto final.
2- Insira um objeto Botão de Comando. Altere a caption para Encerra;
3- Selecione o botão e no menu Arquivo, salve o botão como classe definindo:
Nome: Encerrar
Arquivo: Crie no diretório Horario a biblioteca Horario;
Descrição: Encerra um Formulário.
4- Grave o Form como FormTeste e encerre-o; Em Bibliotecas de Classes, selecione o
botão Encerrar e escolha Modificar;
5- No evento click coloque o comando Thisform.Release. Grave-o e volte para o FormTeste
6- Ao lado do botão Encerra, insira o botão classe Encerrar (clique em Exibir classes,
um ícone com três livros e adicione a biblioteca Horario). Escolha o botão Encerrar;
7- Note que os dois botões são idênticos (veja o evento click). Execute o form;
8- Até agora vimos o Encapsulamento (código oculto). Selecione a classe encerrar e salve
como classe (Nome: Fechar Arquivo: Horario);
9- Feche o form, selecione a classe Encerrar e escolha modificar;
10- Escolha no menu Classes a opção Novo Método e crie:
Nome: Antes
Descrição: Executar antes do Release.
Adicione e Feche. No evento Click, antes do thisform.release, digite this.antes;
11- Salve a classe encerrar, abra a classe fechar e no método Antes, digite:
messagebox('Saída do Formulário','Fechar')
12- Salve a classe, volte para o FormTeste e insira a classe Fechar. Execute o Form.
13- Agora vimos a Herança e Polimorfismo. Início da Página Classes
Criação do Form
Na biblioteca de classes, possuimos atualmente os botões Encerrar e Fechar. Vamos criar
um form padrão que, se houver necessidade de uma alteração geral (algumas características)
alteraremos a classe e não form por form do projeto. Execute:
1- Crie um novo form (pode utilizar o próprio FormTeste);
2- Altere algumas características do form. Aumente um pouco a altura, largura e altere:
BackColor: 128,128,192 (ou a cor que desejar);
Caption: nenhum
Icon: sun.ico
3- Salve o form como classe (Nome: Basico Arquivo.: Horario)
4- Agora que o form foi gerado como classe, coloque o Basico como Form Inicial: Escolha
no menu a opção Ferramentas / Opções / Formulários / Formulario ... (escolha a bi-
blioteca Horario / classe Basico. Agora todos os novos forms serão gerados como Ba-
sico.
Aproveitando, Crie um novo form e salve-o como uma classe chamada Cadastro. É nesta
classe que vamos criar os objetos já conhecidos (inclusão,alteração,etc) e também criá-las
como classes.
Início da Página Classes
Caixa de Combinação
No cadastro principal, onde possuímos duas chaves estrangeiras (secundárias), normalmente
criamos um objeto combobox no lugar de um objeto edit comum, já que assim não há necessidade
de um código de crítica da existência da informação secundária. Vamos seguir os passos para
criarmos uma Caixa de combinação para o código da cidade no formulário de Professores:
1- Exclua do form o campo do código da cidade (guarde o nome do objeto);
2- Adicione no lugar um objeto combobox (Caixa de Combinação);
3- Altere o nome na propriedade NAME para o antigo nome do objeto (txtcidade);
4- Clique sobre o objeto com o botão direiro e escolha Construtor;
5- Itens da Lista: Escolha a tabela cidades e selecione os campos Nome e Cidade;
6- Estilo: Tridimensional, Lista Suspensa (não deixa alterar), Ativar busca incr.;
7- Layout: Ajustar largura do nome da cidade e esconda o código da cidade (se quiser);
8- Valor: Retornar campo CIDADE para armazenar em PROFESSORES.CIDADE;
9- OK. Execute o formulário e confira. Faça para o curso também.
Início da Página Classes
Classe Localizar
A imagem do form desta página, em "Criação de Classes", é o resultado final da nossa
classe Basico. A primeira classe que criaremos para este form será a classe localizar.
São os 4 botões de navegação pela tabela. Para adiantar nosso serviço, faça uma seleção
múltipla no form de cadastro de Professores nos 4 botões e salve como classe Localizar.
Abra a classe Cadastro e insira a classe Localizar.
Início da Página Classes