CRIANDO O PROJETO CURSO.
Criar o diretrio (pasta) do seu projeto
Pode ser pelo DOSVOX ou pelo Windows Explorer.
Abrir o Delphi.
O Delphi j prepara uma janela Form1 para voc
Salvar o projeto
Atravs do Comando de Menu File / Save All (Teclas: Alt+F V)
Aparece uma janela de dilogo perguntando aonde salvar a Unit1. Digite o caminho de diretrio e 
um nome para a sua unit. Podemos utilizar a seguinte notao  para nomes de unit: 3 letras do nome 
do projeto mais 4 a 5 letras para identificar a unit. Opcionalmente voc pode colocar o tipo do 
arquivo .PAS. Tecle enter para fechar esse dilogo.
Aparece depois outro dilogo para salvar o projeto. Digite tambm o diretrio e o nome que voc 
quer dar ao projeto. Opcionalmente, voc pode colocar a extenso do projeto .DPR. Tecle enter 
para fechar o dilogo.
Renomear a Janela (Name e Caption)
Ir para o Object Inspector atravs da tecla F11, teclar Tab para escolher um nome de propriedade (no 
caso a propriedade Name) digitar Name, teclar tab de novo e escolher o nome do form (no nosso 
caso, escolhemos frmMain)
Teclar Tab ainda no Object Inspector, at ouvir o Select On, digitar Caption e teclar Tab para poder 
entrar com a propriedade Caption do form. No caso entrar Controle de Curso.
Voltar para a propriedade Name (Seqncia: Tab Name e teclar F12 at chegar no Form ou no Editor 
de Textos, dependendo de onde voc quiser chegar)
Incluir componentes
Teclar Alt+V C. Ser apresentada a janela com a lista de componentes disponveis. Digite o nome da 
classe do componente que voc deseja, por exemplo: TButton, TEdit , TLabel, TPanel, TComboBox. 
Tecle ENTER. Da o componente  inserido no centro do Form ou do Painel, caso o foco esteja num 
Painel dentro do form. Depois de teclar o ENTER, o dilogo Component List ainda no foi 
fechado e voc pode inserir tantos componentes quantos voc quiser basta digitar o nome da classe 
do componente e teclar ENTER. Tomar cuidado com os componentes que podem receber outros 
componentes em seu interior, tais como TPanel, TGroupBox. Para fechar o dilogo Component 
List, tecle ESC.  bom lembrar que  necessrio incluir no mnimo 2 componentes no, form para 
que voc possa ouvir o nome do componente, quando voc for digitando TAB, para navegar pelos 
componentes do Form.
Posicionar os componentes
Primeiro, selecionar o Form (basta teclar ESC at chegar no Form). Ir para o Object Inspector e 
verificar as propriedades Width e Height do form. Digamos que essas propriedades sejam 
respectivamente 544 e 375. Se quisermos posicionar os componentes (no caso os botes 1 e 2) na 
parte de baixo do Form, devemos colocar a propriedade Top dos botes igual a 375 menos o Height 
do boto e menos um pouco mais (5 a 15 pixels) para no ficar encostado no canto do Form. O 
posicionamento  direita  anlogo. Devemos colocar a propriedade Left do boto igual a 544 menos 
o Width do boto menos um delta X. S para fixar, para o posicionamento no topo ou  esquerda, 
basta colocar um valor prximo de zero nas propriedades Top ou Left (respectivamente) do boto. 
Posicione cada componente do form, lembrando sempre de considerar os componentes que j foram 
posicionados, para no colocar um em cima do outro.
Criar eventos para os componentes
Em primeiro lugar, selecionar o componente que voc deseja, atravs da tecla Tab. Ir para Object 
Inspector. Teclar Control+TAB, para selecionar a Orelha dos Eventos. O evento padro do 
componente j  selecionado. Se voc quiser modificar outro evento que no seja o padro, teclar 
Tab para selecionar o nome do evento, digitar o nome do evento e teclar Tab de novo, ou 
simplesmente ir andando com a setinha vertical (abaixo ou acima) e ir ouvindo o nome do evento. 
Para efetivamente criar o evento, tecle Control+ENTER, e o Delphi j cria um esqueleto de 
procedure, para voc entrar com o cdigo do evento. A janela de edio  ativada e voc j pode 
inserir o cdigo que desejar. Aps inserir o cdigo, lembre-se sempre de teclar F11, Control+Tab, e 
voltar para a propriedade Name.
Finalizaes
Para salvar as suas alteraes, tecle Alt+F V, se quiser salvar o projeto todo , ou Control+S, se quiser 
salvar s a unit atual.
Para sair do Delphi, teclar Alt+F X (exit)

ADICIONANDO OUTROS COMPONENTES AO FORM
O Painel: TPanel
Painel  um componente que pode conter outros componentes portanto cuidado ao inserir um painel 
dentro do Form:  necessrio selecionar o form, ou pelo Object Inspector (control + seta abaixo e 
escolhe o form), ou na prpria janela do form ativada, teclando ESC quantas vezes forem 
necessrias.
Propriedade Align: define a posio em relao ao Form, ou melhor, ao componente pai do objeto 
(alClient  todo espao restante, alLeft, alRight, alTop, alBottom e alNone).
Mover objetos para dentro de um painel
Selecione o objeto, tecle Control-X, selecione o painel e tecle Control+V.
Dicas de Seleo de Componente
Para selecionar um componente diretamente no Object Inspector, teclar Control + Seta Abaixo, andar 
com as setas abaixo e acima ou teclar o nome do componente, e finalmente teclar ENTER.
Componentes TEdit e TStaticText
Para que o Virtual Vision fale o que est contido no statitext,  necessrio criar primeiro o Tedit e 
logo depois o TStaticText,.
Propriedades do TEdit: MaxLength, Text.
Propriedades do TStaticText: TabStop (para receber foco), FocusControl (apontando para o Edit), 
AutoSize (por default  True), Caption (se for usado o &, a letra seguinte no caption ser tecla de 
atalho Alt + letra).
COMPILANDO O PROJETO
Preparar o ambiente de compilao
Para compilar o projeto, de tal maneira que voc possa ouvir as mensagens de erro ou de sucesso,  
necessrio ter os arquivos DCC.BAT e DCC.WAV (distribudos neste curso) no diretrio 
\WINDOWS.
Rodar a BAT de compilao
Para rodar o DCC.BAT, utilize o comando Executar do Menu Iniciar, ou v para o DOSVOX, e 
execute o comando:
DCC <diretrio> <projeto>, 
onde <diretrio>  o diretrio do projeto e <projeto>  o nome do projeto sem a extenso .DPR.
Nota: O atalho para Menu Iniciar/Executar  Tecla Iniciar+R.
Este arquivo DCC.BAT contm os seguintes comandos, entre outros:

c:\arquiv~1\borland\delphi5\bin\dcc32 %2 > %2.log
if errorlevel 1 goto erro

Podemos relembrar que o %2 indica o segundo parmetro (projeto). O programa DCC32  o 
compilador de linha que vai tomar o projeto e criar o arquivo executvel. Caso haja algum erro, ele 
retorna em ERRORLEVEL o valor 1, de modo que a BAT vai para a rotina de erro (que executa o 
EDIVOX).
Em caso de Erro...
Quando ocorrer algum erro de compilao, o EDIVOX  iniciado, mostrando um arquivo de LOG 
contendo a unit, o nmero da linha, onde ocorreu o erro, e a mensagem de erro. Para localizar o erro, 
busque a palavra ERROR, e nessa linha vo ter todas essas informaes.
CRIANDO OUTRO FORM
A criao
Teclar Alt+F F (File/New Form). O Delphi j cria um novo form vazio. Faa todo o procedimento de 
definio do Form (Name, Caption, BorderStyle, WindowState, FormStyle)
Nosso exemplo: O Form_Sobre
No form_sobre, colocamos o BorderStyle = bsDialog, para ele se comportar como uma janela de 
dilogo. Inserimos um StaticText (Programa Controle de Curso  Criado em Outubro de 2000) e 
definimos que ele tinha a propriedade TabStop = True. Inserimos tambm um boto TBitBtn, com a 
propriedade Kind = bkOK, que faz com que o caption seja OK, o Glyph seja um V verde, o 
modalresult seja mrOK, Default = True, entre outros.
Ao final de tudo, salvo o form.
Para chamar um Form a partir de outro.
Digamos que eu queira chamar o Form_Sobre, a partir do evento OnClick do boto OK que est no 
Form_Principal (ou frmMain). Tenho que criar o evento OnClick desse boto primeiramente. Para 
escolher o form Principal, posso teclar Shift+F12 (para escolher s os forms) ou Alt+0 (se eu quiser 
ir para qualquer janela aberta no Delphi).  Para criar o evento OnClick, lembrar que  necessrio ir 
para a orelhinha Events do Object Inspector (Control+Tab no Object Inspector) e teclar o 
Control+Enter para abrir o cdigo da procedure. Caso voc queira usar o DOSVOX, digite um texto 
qualquer, para identificar a posio no arquivo (.PAS) aonde voc quer chegar.
No DOSVOX, vamos ento editar o arquivo do projeto (no caso CURSO.DPR) e localizar a linha 
que contm o comando de criao do form_sobre:
  APPLICATION.CREATEFORM(TFORM_SOBRE,FORM_SOBRE);
Da, copiamos essa linha para a rea de Transferncia e apagamos ela. Salve o arquivo de projeto e 
entre no arquivo do Form_Principal (curmain.pas). Localize o texto que voc digitou no evento 
OnClick, e substitua ele pelo que est na rea de transferncia. Depois insira os comandos que vo 
mostrar e depois apagar da memria o form. O evento OnClick do boto ficaria da seguinte forma:
Begin
  Application.createform(tform_sobre,form_sobre);
  Try
    Form_sobre.showmodal;
  Finally
  Form_sobre.release;
End;
No caso de fazer essa mesma tarefa pelo Delphi, vamos seguir os seguintes passos:
Teclar Alt+P V (Project/View Source)
Localizar no source do projeto, aquela mesma linha application.createform.... Selecionar a linha, 
Cortar, salvar o projeto, fechar o source (Control+F4), ir para o editor no arquivo curmain.pas (pode-
se usar o Control+F12 que d uma lista das units). Localizar o evento OnClick do boto e fazer a 
mesma edio do DOSVOX.
PROJETO AGENDA: MDI FORM, MDI CHILD E MAIN MENU
Criar o diretrio do projeto
Pode-se usar o DOSVOX ou o prprio Windows Explorer para criar o diretrio \AGENDA.
Criar o Formulrio Principal (usando o estilo MDI Form)
Crie o form da maneira usual, mexendo nas seguintes propriedades: Name = FormPrincipal; 
Caption = Agenda; WindowState = wsMaximized; FormStyle = fsMDIForm. Salve o projeto todo 
(File/Save All  Alt+F V) no diretrio \AGENDA.
Criar o Menu Principal
Atravs da lista de componentes, escolha TMainMenu e insira no formulrio. No Object Inspector, 
na propriedade Items, tecle Control+ENTER e ser aberto o editor de menus.
Inserir os itens do menu
A partir desse momento voc pode inserir o primeiro item principal e seus subitens, bastando apenas 
digitar diretamente o Caption (pode-se j utilizar o caracter &) e teclar ENTER. A cada ENTER, o 
editor de menus j passa para o prximo subitem abaixo do que voc digitou. Caso voc queira 
digitar o Caption de um item principal ao lado daquele primeiro, tecle a seta pra direita logo aps o 
ENTER do ltimo subitem.
Dentro de um subitem, voc pode colocar outros subitens ou submenus. Para isso basta selecionar o 
subitem (pai) desejado e teclar Control+Seta para Direita, e digitar Captions normalmente.
Criando atalhos
Para criar teclas de atalho dos itens de menu, selecione o item (pode ser no Object Inspector atravs 
do Control+Seta Abaixo ou no prprio Editor de Menus), e v para a propriedade ShortCut no Object 
Inspector. Estando na propriedade, selecione na lista da caixa combinada um dos atalhos definidos 
ou escreva o nome do atalho, caso ele no exista na lista.
Obs.: Para navegar entre o Object Inspector e o Editor de Menus, pode-se usar a tecla F11, porm ela 
retorna para o Form corrente, portanto tecle Control+Enter na propriedade Items do MainMenu, para 
voltar ao Editor. Outra forma de ir para o Editor de Menus  usar a tecla Alt+0 (zero do teclado 
normal) e selecionar, a partir da lista de janelas do Delphi, a janela do Editor (o Virtual Vision fala o 
nome da janela que  o nome do form + ponto + nome do menu).
Criando os eventos de Click dos itens de menu
Para criar os eventos dos menus, selecione o item de menu desejado, selecione no Object Inspector a 
orelhinha de Eventos, selecione o evento, e tecle Control+Enter, se quiser criar um novo evento, ou 
simplesmente escolha a partir da caixa combinada um dos eventos j existentes.
TABELAS E DATABASE (PROJETO AGENDA)
Criar o diretrio de dados
Pode-se usar o DOSVOX ou o prprio Windows Explorer para criar o diretrio de dados. A nica 
observao  que seria muito interessante usar um subdiretrio embaixo do diretrio da aplicao. 
Ex.: \curso\dados ou \agenda\dados.
Criar o Alias
Abrir o Database Desktop. Teclar Alt+T. J aparece a opo Alias Manager, basta teclar ENTER. 
Teclar Alt+N que  o atalho para o boto New, Digite o nome do alias, tecle tab para ir escolher o 
drive type (o default  STANDARD) e tecle TAB de novo para definir o PATH, por exemplo, 
\agenda\dados. Para finalizar, tecle OK. Se for mostrada uma janela de Error,  porque o path est 
errado. Caso contrrio, aparece a janela PUBLIC ALIASES..., e ento s tecle ENTER, que ele vai 
criar o alias, e j vai apontar para esse alias.
Criar as tabelas
Entrar no menu File/New/Table ( Alt+F  N T ). Aparece uma janela perguntando o tipo da tabela (o 
default  Paradox 7). Tecle ENTER, e aparecer a janela para definio dos campos.  O foco j fica 
num Grid que contm as seguintes colunas: Field Name, Type, Size e Key. 
Observaes: 
1. Os campos de chave primria sempre tem que estar no incio (no caso de tabelas Paradox).
1. Digite Nome do Campo, tipo, tamanho e chave nessa ordem, pulando com o ENTER.
1. Nem todos os campos ficam habilitados. Por exemplo, a coluna Key s fica habilitada para os 
primeiros campos at que seja omitida. A coluna Size s  necessria para tipos que necessitam 
de tamanho, como o Alpha, o Memo, entre outros.
Criar ndices
Teclar Alt+P (Table Properties). Teclar Alt+seta abaixo ou F4 para abrir as opes da caixa combo. 
Selecionar Secondary Indexes e teclar ENTER. Teclar Tab para ir para o boto Define e tecle 
ENTER. Ligar modo de navegao (/ do teclado numrico), e navegar pela janela de dilogo. Ir com 
a tecla + do teclado numrico para o campo (ou campos) que voc deseja que seja o ndice, e dar um 
duplo clique (tecla 5 do teclado numrico) no campo. Tecle OK e ser pedido o nome do ndice. 
Digite o nome do ndice e tecle ENTER. O Database Desktop retorna para a janela de criao da 
tabela.
Salvar a tabela
Teclar Alt+A (Save As). Ser pedido o nome da tabela. Digite o nome da tabela. Tecle TAB at 
chegar  caixa combo Alias, para poder escolher o alias que voc deseja. Ex.: alagenda. Para 
finalizar, tecle Salvar.
Criar uma tabela de relacionamento
Para criar uma tabela de relacionamento, crie como se fosse uma tabela normal, porm os campos 
chaves so definidos de acordo com as tabelas de entidades. No caso de campo autoincremento na 
tabela de entidade, temos que colocar o campo correspondente no relacionamento como sendo do 
tipo Long Integer (I).
Criar Integridade Referencial
Para criar uma integridade referencial, tecle Alt+P (Table Properties), selecione Referential Integrity, 
tecle TAB e tecle Enter no boto Define. Selecione o campo da tabela que voc deseja criar a 
integridade e tecle Alt+A. Tecle Alt+T (Table) e selecione a tabela que estar relacionada com o 
campo e tecle Alt+S. Quando voc definir o campo e a tabela, o boto OK vai ficar habilitado. 
Clique no OK, e digite o nome da integridade referencial, e tecle Enter para criar efetivamente.
O FORM DE CADASTRO DE PESSOAS
Criar o Form
Tecle File/New Form (Alt+F F). Coloque as propriedades Name, Caption e defina a propriedade 
FormStyle igual a fsMDIChild.
Inserir os Componentes de Acesso a Dados
Na lista de componentes, inserir 3 tabelas e 3 datasources (TTable, TDataSource). Definir as 
seguintes propriedades:
Table1.Name = TabPessoa
Table2.Name = TabLaia
Table3.Name = TabRPL
DataSource1.Name = DataPessoa
DataSource2.Name = DataLaia
DataSource3.Name = DataRPL

TabPessoa
.DatabaseName = alagenda
.TableName = pessoas.db
.IndexName = indicenome
TabLaia
.DatabaseName = alagenda
.TableName = laia.db
TabRPL
.DatabaseName = alagenda
.TableName = rpl.db
.IndexFieldNames = codpessoa;codlaia
.MasterSource = datapessoa
.MasterFields = codigo
DataPessoa
.DataSet = TabPessoa
DataLaia
.DataSet = TabLaia
DataRPL
.DataSet = TabRPL
Inserir os Componentes de Edio de Dados de Pessoa
Na lista de componentes, inserir 5 TDBEdit e 5 TStaticText, alternadamente. Definir os captions dos 
statictexts (Nome, Telefone, Endereo, etc.). Posicionar da maneira que quiser. Definir as 
propriedades:
DBEdit1
.DataSource = DataPessoa
.DataField = Nome
DBEdit2
.DataSource = DataPessoa
.DataField = Telefone
DBEdit3
.DataSource = DataPessoa
.DataField = e-mail
DBEdit4
.DataSource = DataPessoa
.DataField = Endereco
DBEdit5
.DataSource = DataPessoa
.DataField = Nascimento
Obs.: Tanto a propriedade DataSource como DataField podem ser definidas no Object Inspector com 
a tecla Alt+Seta Abaixo.
Inserir o Componente de Edio de Dados da tabela de relacionamento RPL
Na lista de componentes, inserir 1 TDBLookupCombo e 1 TStaticText. Definir o caption do 
StaticText igual a Classe. Posicionar da maneira que quiser. Definir as propriedades:
DBLookupCombo1
.DataSource = DataRPL
.DataField = Codlaia
.LookupSource = DataLaia
.LookupField = Codigo
.LookupDisplay = Nome
Nesse momento j temos a relao entre todas as tabelas contidas nesse formulrio. A tabela RPL 
est relacionada com a tabela Pessoas, atravs das propriedades MasterSource, MasterFields e 
IndexFieldNames do prprio componente TabRPL. E o relacionamento entre a tabela RPL e a Laia  
feito atravs do componente TDBLookupCombo inserido agora. Esse relacionamento s tem 
necessidade para efeito de visualizao do nome da classe.
Inserir o Painel com Botes de Navegao
Na lista de componentes, inserir 1 TPanel e 9 TButton. Definir o Width do painel igual a 81, o Align 
igual a alRight e o Caption igual a . Para todos os botes, definir a propriedade Left igual a 3. A 
propriedade Top do primeiro boto  3. Depois posicione os outros botes embaixo do primeiro, com 
os Tops iguais a 28, 53, 78, 103, etc, pulando de 25 em 25. Defina os Captions dos botes na 
seguinte ordem: Primeiro, Anterior, Prximo, ltimo, Incluir, Excluir, Confimar, 
Cancelar e Sair.
Segue-se abaixo o cdigo dos eventos dos botes:

// -- INCIO DO CDIGO --
procedure TFormPessoas.Button1Click(Sender: TObject);
begin
  tabpessoa.first;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button2Click(Sender: TObject);
begin
  tabpessoa.prior;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button3Click(Sender: TObject);
begin
  tabpessoa.next;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button4Click(Sender: TObject);
begin
  tabpessoa.last;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button5Click(Sender: TObject);
begin
  tabpessoa.append;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button6Click(Sender: TObject);
begin
  if Application.MessageBox('Deseja realmente apagar este registro?', 
  'Confirme Excluso', MB_YESNO+MB_DEFBUTTON2) = IDYES then
  begin
    while tabrpl.recordcount > 0  do
      tabrpl.delete;
    if tabpessoa.recordcount > 0 then
      tabpessoa.delete;
  end;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button7Click(Sender: TObject);
begin
  if tabpessoa.state in dseditmodes then
    tabpessoa.post;
  if tabrpl.State in dseditmodes then
    tabrpl.post;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button8Click(Sender: TObject);
begin
  if tabpessoa.state in dseditmodes then
    tabpessoa.cancel;
  if tabrpl.state in dseditmodes then
    tabrpl.cancel;
  dbedit1.setfocus;
end;

procedure TFormPessoas.Button9Click(Sender: TObject);
begin
  Close;
end;
// -- FIM DO CDIGO --

Alm dos eventos dos botes,  necessrio colocar mais dois eventos, para que o funcionamento da 
janela fique correto. O primeiro evento  o AfterPost do componente TabPessoa. Este evento ser 
usado para garantir que ser dado o post da tabela RPL, mesmo que acontea um post implcito na 
tabela Pessoas. Este post implcito dar-se- quando, por exemplo, executarmos o evento next ou 
qualquer evento de movimentao da tabela Pessoas.

procedure TFormPessoas.tabpessoaAfterPost(DataSet: TDataSet);
begin
  if tabrpl.state in dseditmodes then
    tabrpl.post;
end;

O outro evento necessrio  o evento OnClose do FormPessoas. Este evento serve para modificar a 
ao de fechamento (Action) do form, pois, para forms do tipo MDI Child, a ao padro  
minimizar, e ns queremos que o form seja fechado, e que a memria usada para o form seja 
liberada. Outra coisa que deve ser feita no OnClose  verificar se as tabelas Pessoas e RPL esto em 
modo de edio (dsEditModes) e, caso afirmativo, perguntar se devemos salvar as alteraes feitas. 
O cdigo do OnClose fica ento da seguinte forma:

procedure TFormPessoas.FormClose(Sender: TObject; 
  var Action: TcloseAction);
begin
  Action := cafree;
  If (tabpessoa.state in dseditmodes) or (tabrpl.state in dseditmodes) then
    If Application.MessageBox('Salvar as alteraes?', 
    'Confirmao', MB_YESNO) = IDYES then
      Button7.click;
end;
O FORM DE CADASTRO DE CLASSES
Criar o Form
Tecle File/New Form (Alt+F F). Coloque as propriedades Name, Caption e defina a propriedade 
FormStyle igual a fsMDIChild.
Inserir os Componentes de Acesso a Dados
Na lista de componentes, inserir 2 tabelas e 1 datasource (TTable, TDataSource). Definir as seguintes 
propriedades:
Table1.Name = TabClasse
Table2.Name = TabRPL
DataSource1.Name = DataClasse

TabClasse
.DatabaseName = alagenda
.TableName = laia.db
.IndexName = indlaia
TabRPL
.DatabaseName = alagenda
.TableName = rpl.db
.IndexFieldNames = codlaia
.MasterSource = dataclasse
.MasterFields = codigo
DataClasse
.DataSet = TabClasse
Inserir os Componentes de Edio de Dados de Classe
Na lista de componentes, inserir 1 TDBEdit, 1 TStaticText, 1 TDBMemo e mais um TStaticText. 
Definir os captions dos statictexts (Nome e Observaes). Posicionar da maneira que quiser. Definir 
as propriedades:
DBEdit1
.DataSource = DataClasse
.DataField = Nome
DBMemo1
.DataSource = DataClasse
.DataField = Telefone
Obs.: Tanto a propriedade DataSource como DataField podem ser definidas no Object Inspector com 
a tecla Alt+Seta Abaixo.
Inserir o Painel com Botes de Navegao
Para criar o painel com botes de navegao, posso copiar do Form Cadastro de Pessoas. Para isso 
seleciono o FormPessoas (atravs do Shift+F12). Depois, seleciono o Painel (Panel1), que pode ser 
atravs da tecla TAB ou com o Control+Seta Abaixo no Object Inspector. Depois, volto ao Form de 
Pessoas e teclo Control+C. Em seguida, seleciono o Form de Cadastro de Classes (Shift+F12), e 
teclo Control+V. Nesse momento, o Form de Classes vai receber o painel Panel1 com todos os 
botes e propriedades que estavam em FormPessoas, porm os botes no estaro com os eventos.
Para criar os eventos, siga os mesmos passos usados no FormPessoas. Segue-se abaixo o cdigo dos 
eventos dos botes:

// -- INCIO DO CDIGO --
procedure TFormClasse.Button1Click(Sender: TObject);
begin
  tabclasse.first;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button2Click(Sender: TObject);
begin
  tabclasse.prior;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button3Click(Sender: TObject);
begin
  tabclasse.next;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button4Click(Sender: TObject);
begin
  tabclasse.last;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button5Click(Sender: TObject);
begin
  tabclasse.append;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button6Click(Sender: TObject);
begin
  if Application.MessageBox('Deseja realmente apagar este registro?', 
  'Confirme Excluso', MB_YESNO+MB_DEFBUTTON2) = IDYES then
  begin
    while tabrpl.recordcount > 0  do
      tabrpl.delete;
    if tabclasse.recordcount > 0 then
      tabclasse.delete;
  end;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button7Click(Sender: TObject);
begin
  if tabclasse.state in dseditmodes then
    tabpessoa.post;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button8Click(Sender: TObject);
begin
  if tabclasse.state in dseditmodes then
    tabclasse.cancel;
  dbedit1.setfocus;
end;

procedure TFormClasse.Button9Click(Sender: TObject);
begin
  Close;
end;
// -- FIM DO CDIGO --

Alm dos eventos dos botes,  necessrio colocar mais um evento, para que o funcionamento da 
janela fique correto. O evento  o OnClose do FormClasse. Este evento serve para modificar a ao 
de fechamento (Action) do form e para efetivar possveis alteraes ainda no confirmadas. O cdigo 
do OnClose fica ento da seguinte forma:

procedure TFormClasse.FormClose(Sender: TObject; 
  var Action: TcloseAction);
begin
  Action := cafree;
  If tabclasse.state in dseditmodes then
    If Application.MessageBox('Salvar as alteraes?', 
    'Confirmao', MB_YESNO) = IDYES then
      Button7.click;
end;
LOCALIZANDO E FILTRANDO REGISTROS DE UMA TABELA
Atualizar o Menu do Form Principal
Selecione a propriedade Items do componente MainMenu no Form Principal. Tecle Control+Enter e 
edite o menu, inserindo o item de menu Editar, com submenus Localizar e Filtrar, cada um 
deles com um submenu (Control+Seta Direita), chamado Nome.
No editor de menus, selecionar o subitem Nome (de Localizar), e trocar o Name para 
NomeLocalizar. Voltar para o editor de menus, selecionar o outro subitem Nome (de Filtrar), e 
trocar o Name para NomeFiltrar.
Criar os eventos OnClick dos menus Nome
No Object Inspector, selecione o componente NomeLocalizar. V para a orelinha de Eventos 
(Control+TAB), e selecione o evento OnClick. Tecle Control+Enter e digite o seguinte cdigo:

procedure TFormPrincipal.NomeLocalizarClick(Sender: TObject);
var
  s : string;
begin
  s := '';
  if InputQuery('Entre com o nome', 'Nome:', S)
  then begin
    AbreJanela(TFormPessoas,FormPessoas);
    with FormPessoas,TabPessoas do
    begin
      if not Locate('Nome',S,[loCaseInsensitive,loPartialKey])
      then
        Application.MessageBox('Nome no encontrado', 'Informao', MB_OK);
      DBEdit1.SetFocus;
    end;
  end;
end;

 importante salientar que esse evento est usando uma procedure chamada AbreJanela (que ser 
explicada adiante) e tambm duas constantes definidas na unit DB (loCaseInsensitive e 
loPartialKey). Para poder usar essas constantes,  necessrio inserir manualmente a unit DB no 
USES do Form Principal. Quanto  procedure AbreJanela, devemos inserir esta procedure na 
definio da classe TFormPrincipal da seguinte maneira:
1. Procurar a linha que contem a palavra PUBLIC na definio da classe TFormPrincipal, e inserir 
embaixo dessa linha o seguinte:
procedure AbreJanela(FClass: TFormClass; var F);
1. Na implementation, definir a procedure:
procedure TFormPrincipal.AbreJanela(FClass: TFormClass; var F);
var
  i : integer;
  AForm : TForm absolute F;
begin
  AForm := nil;
  for i := 0 to MDIChildCount  1 do
  begin
    AForm := MDIChildren[i];
    if AForm is Fclass then
      break;
    AForm := nil;
  end;
  if AForm = nil then
    Application.CreateForm(Fclass,AForm);
  AForm.BringToFront;
end;

Agora, que ns j colocamos a unit DB e a procedure AbreJanela, podemos criar o outro evento 
OnClick do item de menu NomeFiltrar. O evento ser o seguinte:

procedure TFormPrincipal.NomeFiltrarClick(Sender: TObject);
var
  s : string;
begin
  s := '';
  if InputQuery('Entre com o nome', 'Nome:', S)
  then begin
    AbreJanela(TFormPessoas,FormPessoas);
    with FormPessoas,TabPessoas do
    begin
      Filtered := s <> '';
      if Filtered
      then
        s := 'Nome = ''' + s + '*''';
      Filter := s;
      DBEdit1.SetFocus;
    end;
  end;
end;

Inserir Objetos TFields (Acesso aos Campos das Tabelas)
Selecionar o componente TabRPL, na janela Cadastro de Pessoas. Tecle Alt+F10 para ativar o menu 
de contexto do componente. Selecione o item Fields Editor e tecle enter, para abrir uma janela de 
dilogo que contm uma lista vazia de campos. Tecle Shift+F10, para ativar o contexto dessa lista, 
selecione Add All Fields, e tecle enter. No caso da tabela RPL, sero adicionados os campos 
codpessoa e codlaia na lista, e no formulrio sero adicionados 2 componentes do tipo TField, que 
podem ser usados para acessar, via cdigo, esses campos do arquivo. Os nomes desses componentes 
so automaticamente gerados pelo Delphi. Nomes: TabRPLCodPessoa e TabRPLCodLaia.
Selecione o componente TabRPL, v para a janela Cadastro de Pessoas, tecle Alt+F10 de novo, 
selecione Fields Editor, tecle enter, tecle Shift+F10, selecione New Field e tecle enter. Nesse 
momento vamos criar um novo campo que ser um campo de lookup. O Virtual Vision no fala os 
dados que voc precisa digitar, mas vamos colocar na ordem o que  necessrio informar. Primeiro: 
digite o nome do campo. No nosso caso, digite NomeLaia. Tecle TAB at encontrar uma caixa 
combinada. Tecle Alt+Seta Abaixo e selecione o tipo do campo (no nosso caso: String). Tecle TAB e 
digite o tamanho do campo se necessrio (campos Integer, AutoInc, etc, no precisam de tamanho). 
No nosso caso, vamos usar esse campo para pegar o nome da laia, portanto o tamanho da string  20.
Tecle Enter, para fechar o dilogo. Nesse momento, voc j possui um componente chamado 
TabRPLNomeLaia. No Object Inspector, selecione esse componente, e defina as seguintes 
propriedades:
TabRPLNomeLaia
.LookupDataSet = tablaia
.LookupKeyFields = codigo
.LookupResultField = nome
.KeyFields = codlaia
.FieldKind = fkLookup
Para compreender o que significa esse novo campo NomeLaia, podemos dizer que ele  um campo 
que mostra para o usurio o nome da classe (laia) cujo cdigo est definido no campo codlaia da 
tabela RPL. Essa idia de campo lookup foi implementada, pois sempre se tem a necessidade de 
trabalhar com o nome ou descrio de algum objeto, e no com o cdigo, mas guardar no arquivo o 
cdigo. No nosso caso, a tabela RPL s contm aqueles dois campos de cdigo, porm quando eu 
insiro o campo NomeLaia da maneira mostrada acima, a tabela RPL tambm contm um terceiro 
campo, que  a descrio do cdigo da laia. Esse campo no est fisicamente na tabela e sim 
guardado em memria.
UM NOVO COMPONENTE: TVVSPEAKER
Preparar a instalao do componente
O componente TVVSpeaker (distribudo neste curso)  um componente criado para falar atravs 
do sintetizador de voz do Virtual Vision. Ele est definido nos arquivos SPEAKER.PAS e 
SPEAKER.DCR, e estes arquivos tm que ser colocados no diretrio \Arquivos de 
Programas\Borland\Delphi*\Lib.
Instalao no Delphi
Rode o Delphi e execute o comando de menu Components/Install Components (Alt+C I) .
Nesse momento, abre-se uma janela de dilogo, que contm dois botes Browse. Selecione o 
segundo boto (Atalho Alt+B) e tecle ENTER, para escolher o nome do arquivo que contem o 
componente, no nosso caso, SPEAKER.PAS. Depois de selecionado, feche o dilogo (tecle Enter), e 
ento o prprio Delphi se encarrega de instalar o componente. Vrias janelas de dilogo so 
mostradas. Tecle ENTER em todas elas, at aparecer uma janela de Information. A partir da 
instalao, o componente TVVSpeaker estar disponvel na lista de componentes e no ser mais 
necessrio instal-lo nesse computador. Para finalizar, feche o Delphi, para que ele possa salvar o 
arquivo de pacote (DCLUSR*.DPK) que contm o componente.
Como usar o componente TVVSpeaker?
Uma vez que o componente TVVSpeaker estiver instalado, ele funciona como qualquer outro 
componente, ou seja, para inseri-lo num Form, use Alt+V C, digite TVVSpeaker e tecle ENTER. 
Este componente s possui, visveis no Object Inspector, as propriedades Name e Tag; no possui 
nenhum evento; e possui dois mtodos para manipular o som do Virtual Vision: Speak e 
ToggleMute.

A procedure Speak tem o seguinte formato:
VVSpeaker1.Speak(Minha expresso string);
Atravs do comando acima, o Virtual Vision fala a string passada no parmetro.

A procedure ToggleMute tem o seguinte formato:
VVSpeaker1.ToggleMute;
Atravs desse comando, voc liga/desliga a opo Mudo do Virtual Vision.

Obs.: Obviamente, para que o TVVSpeaker funcione,  necessrio que o Virtual Vision esteja 
instalado e rodando no seu computador.
