Você está na página 1de 188

Notas ao Aluno

É com muito prazer termos você como nosso aluno virtual em nosso treinamento de
Desenvolvimento de Aplicações Delphi.

Você adquiriu a versão sem suporte a dúvidas. Mas futuramente poderá adquirir o
suporte quando achar necessário pelo e-mail: ramos@mgt.com.br

O conteúdo desta apostila é o conteúdo das vídeo aulas. Caso você tenha alguma dúvida
recorra às vídeo aulas e caso mesmo assim suas dúvidas não tenham sido sanadas pode
enviar para o nosso e-mail.

Todos exemplos desta apostila são progressivos, ou seja, dependem das lições
anteriores.

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Fazendo um Tour pelo Delphi

Este primeiro capítulo é dedicado a uma visão geral do Delphi e sua configuração.
Começamos pelo Main Menu Bar:

Main Menu Bar

Aqui temos os menus, os botões de atalho e as palhetas de componentes do Delphi.


Cada um destes itens serão apresentados no decorrer de nosso treinamento.

Vamos personalizar nossos atalhos para o Delphi. Clique com o botão direito do mouse
sobre esta área da figura a cima e escolha a opção Customize, deverá apresentar a tela
Customize:

Nesta tela encontramos três pastas: Toolbars, Commands e Options. Em nosso exemplo
da apostila temos a opção Custom desmarcada iremos marca-la e observe que o Main
Menu Bar sofrerá alterações, o mesmo ocorrerá se você desmarcar outras opções e
marcar novamente.

Na pasta Commands temos diversos outros atalhos que podem ser adicionados ao
Delphi. Para selecionar vamos escolher em Categories a opção Edit e em Commands
escolheremos a opção Cut:

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Observe que o mouse depois que selecionamos o componente fica com uma imagem,
isto ocorre porque o Delphi fica aguardando o lugar onde você irá colocar o atalho Cut
em nosso Main Menu Bar, coloque em qualquer lugar e veja que agora temos um atalho
para esta opção. Você também poderá retirar este ou qualquer outro atalho clicando
sobre ele e arrastando de volta ao Customize.

A opção Options não é aconselhado alterar pois são apresentação de hints e


possibilidade de atalhos que são sempre usados por nós.

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
A palheta de componentes

Aqui existem as opções de componentes que serão adicionados em nossos projetos de


desenvolvimento, cada um destes componentes serão vistos no decorrer do treinamento
pois seria inútil aqui fazermos um comentário de cada pasta e seus componentes.

Existem componentes visuais e não visuais. Os componente visuais são aqueles que
serão vistos pelos usuários quando o programa desenvolvido estiver sendo executado.
Os componentes não visuais são aqueles vistos somente pelo desenvolvedor.

A partir da versão 6 do Delphi temos duas categorias de componentes as VCL e as CLX


onde VCL são para programação Windows e CLX para programação Linux (Kylix). Os
componentes CLX funcionam tanto na plataforma Windows como na plataforma
Linux., já as VCL funcionam somente na plataforma Windows. Então caso você esteja
planejando desenvolver uma aplicação que suporte tanto Windows quanto Linux é
aconselhável utilizar somente componentes CLX.

Speed Menus

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Speed Menus existem em todo o Delphi, são menus em forma de pop-up que surgem
quando clicamos com o botão direito do mouse e nos dão diversas opções. No caso da
figura a cima são as opções de nosso editor de código, onde escrevemos os eventos e
códigos de nossas aplicações. Como são diversos Speeds Menus iremos ver mais
detalhadamente no decorrer do curso.

Object Inspector

A janela Object Inspector que se encontra a esquerda do Form, é onde definimos e


alteramos as propriedades dos objetos que serão utilizados no desenvolvimento de
nossas aplicações. É onde podemos alterar propriedades e eventos de componentes e
formulários de nossas aplicações enquanto desenvolvemos.

Propriedades - Properties

Ainda no Object Inspector, vou aqui falar um pouco de propriedades, como citado
anteriormente, estas propriedades iremos conhecer mais a fundo no decorrer de nosso
treinamento, até porque cada componente que iremos trabalhar possuem suas próprias
propriedades.

É na Propriedade do Objector Inspector que podemos colocar nome em cada objeto


(quando eu falar de objetos no decorrer do treinamento gostaria que fosse entendido
como componentes e formulários que iremos utilizar no desenvolvimento de nossas
aplicações), mudar a fonte, localização, tamanho entre diversas outras propriedades que
um objeto pode ter. No caderno de exercícios o primeiro exercício que tem para você
fazer é mudar a propriedade Font do Formulário. Gostaria de mostrar aqui somente um
5

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
caso que sempre gera dúvidas, na propriedade Font existe uma característica “...” estes
três pontinhos informam que existem uma janela de formatação de outras propriedades,
sempre que encontrar estes pontinhos fique sabendo que existem diversas sub
propriedades a esta propriedade. Você perceberá melhor nas vídeo aulas do CD-ROM e
no decorrer de nosso treinamento.

Eventos - Events

Eventos são o que ocorrerá a um objeto se por exemplo: Clicar, O mouse estiver por
cima, ou mouse estiver pressionado e diversos outros eventos que cada objeto pode ter –
não obrigatoriamente – e que veremos no decorrer do treinamento.

Form Designer, Code Editor e Code Explorer

O Form Designer é o principal no desenvolvimento de nossas aplicações pois é nele que


iremos adicionar todos componentes de nossa aplicação é a janela que iremos utilizar
sempre. Faça o seguinte para perceber, vá ao menu do Delphi Run e escolha a opção
Run para compilar e ver como fica o formulário.

Code Editor e Code Explorer

As janelas Code Editor e Code Explorer é onde é criado a programação de nossas


aplicações e onde podemos navegar pelo código desenvolvido.

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Não tenho muito o que dizer aqui na apostila, aconselho assistir a aula pois assim é
melhor explicado estas janelas, assim como no decorrer do treinamento você perceberá
outras utilidades.

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Nossa Primeira Aplicação

Esta lição é a mesma lição das vídeo aulas. A partir daqui que iremos começar a
realmente trabalhar com o Delphi e começar a conhecer mais a fundo os componentes,
propriedades e escrever os códigos de programação, que na minha opinião é a melhor
parte.

Este primeiro aplicativo é um aplicativo à-toa, mais para já ir apresentando alguns


componentes e regras no desenvolvimento que a partir de adiante iremos utilizar
sempre.

Então vamos começar:

1.) Vá ao menu File | New | Application:

2.) Nos será apresentado uma nova aplicação.

3.) No Object Inspector vamos alterar as seguintes propriedades:

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em Name, ao invés de Form1 iremos colocar frmDesigner. O que fizemos aqui foi
informar que o nome do Formulário será frmDesigner. Observe que retiramos todas
vogais e números do nome Form1 deixando apenas frm e adicionamos a palavra
Designer:

Na propriedade Caption, ao invés de frmDesigner iremos colocar Designer, onde o


Caption será o nome que será apresentado em nosso formulário, como mostra a figura a
seguir:

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
4.) Agora iremos adicionar componentes ao nosso formulário. Iremos adicionar os
seguintes componentes, veja na tabela com suas propriedades:

Componente Localização Propriedades


Edit1 Standard Name = TextForLabel
Text =
ProgressBar Win32 Name = prgrsbrAMountDone
Button1 Standard Name = btnProgressBarReset
Caption = Reseta Progress Bar
Button2 Standard Name = btnUpdate
Caption = Update
Label1 Standard Name = lblTextFromEdit
Label 2 Standard Name = lblCurrentTime
GroupBox Standard Name = grpbxCurrentTime
Caption = Current Time
Timer System Name = tmrProgressBar

Para melhor compreensão da tabela a cima temos:

Componente: Componente que iremos adicionar ao formulário.


Localização: Nome da pasta onde se localiza o componente.
Propriedades: As propriedades que deverão ser alteradas no Object Inspector para cada
componente.
O formulário deverá ficar como mostra a figura a baixo:

10

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para melhor compreensão é aconselhável assistir a vídeo aula desta lição.

Agora que você já montou a tela como apresentado na figura anterior, iremos agora
criar os eventos no object inspector de cada componente.

Selecionando o componente Reset Progress Bar (btnProgressBarReset) no Object


Inspector na pasta Events, dê um duplo clique no evento OnClick:

11

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E escreva o seguinte código:

procedure TfrmDesigner.btnProgressBarResetClick(Sender: TObject);


begin
prgrsbrAmountDone.Position := prgrsbrAmountDone.Min;
end;

Este código serve para resetar o componente ProgressBar quando ele estiver sendo
executado, quando o usuário clicar sobre o botão.

Agora no evento OnClick do componente btnUpdate iremos colocar o seguinte código:

procedure TfrmDesigner.btnUpdateClick(Sender: TObject);


begin
lblTextFromEdit.Caption := edtTextForLabel.Text;
end;

Este código irá transformar a Caption do componente Label lblTextFromEdit no que


estiver escrito no componente Edit edtTextForLabel sempre que o usuário clicar no
botão Update.

Agora no evento OnTimer do componente Timer (tmrProgressBar) coloque o seguinte


código:

procedure TfrmDesigner.tmrProgressBarTimer(Sender: TObject);


begin
//pega a hora atual
lblCurrentTime.Caption := TimeToStr(now);
//Se a barra de progresso ainda não estiver no máximo acrescenta mais um
if prgrsbrAmountDone.Position < prgrsbrAmountDone.Max then
begin
prgrsbrAmountDone.StepIt;
end
else
prgrsbrAmountDone.Position := prgrsbrAmountDone.Min;
end;

Este código monta a progressão da barra conforme os segundos do relógio de seu


computador e coloca a hora na caption do Label (lblCurrentTime).

Para finalizar execute nossa primeira aplicação e veja como ficou.

Depois de executado e fechado vamos agora salvar nossa aplicação, vá ao menu do


Delphi File | Save Project As, agora clique em janela, vá no ícone Criar nova pasta e
coloque o nome da pasta como Designer, salve o projeto como Designer.

12

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
13

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
14

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Componentes Sampler

A partir de agora iremos explorar um pouco os componentes Sampler e criar nossa


segunda aplicação que será como um Windows Explorer.

Primeiramente iremos criar uma nova aplicação indo ao menu do Delphi File | New |
Application, a partir de agora sempre que eu disser “criar uma nova aplicação” fica
entendido que será sempre estes passos.

Em seguida já vamos salvar este projeto criando uma nova pasta chamada
ComponentSampler e salvar como FromComponentSampler1.pás.

E em seguida como ComponentSampler.dpr:

15

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida vamos mudar as propriedades do formulário no Object Inspector com o
nome frmComponentSampler e o Caption como Component Sampler.

Os componentes que iremos utilizar:

Iremos utilizar os seguintes componentes: Panel, Splitter e StatusBar que são o caminho
ideal para criarmos uma boa interface gráfica ao nosso sisteminha e possibilitar ao
usuário modificações em tempo real.

Panel servirá para distribuirmos melhor a apresentação do nosso projeto e também para
possibilitar ao usuário a dimensionar os itens expostos no formulário.

Splitter é o objeto que iremos configurar para que possibilite esta movimentação dos
objetos pelo usuário do sistema.

StatusBar é uma barra que contém informações sobre onde o usuário do nosso exemplo
estará.

Você compreenderá melhor o que quero dizer até o final desta lição.

16

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Statusbar

Primeiramente vamos adicionar um componente StatusBar ao nosso formulário e setar a


propriedade Name para stsbrMain. O componente StatusBar fica localizado na aba de
componentes Win32:

Quando você colocou o componente StatusBar em seu formulário ele foi para o final do
Form. Agora vamos criar colunas para nosso StatusBar, na propriedade Panels clique
nos três pontinhos:

Deverá ser mostrado a janela Editing StatusBar1.Panels:

Clique sobre o botão Add New, devemos criar dois TstatusPanel:

17

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Com o 0 – TstatusPanel selecionado vamos mudar a propriedade Width de 50 para 200,
como mostra imagem a seguir:

Vamos mudar a propriedade Bevel de pbLowered para pbNone, perceba que ao


alterarmos esta propriedade o nosso componente StatusBar mudou de posição. Vamos
deixar assim.

18

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
19

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Panels

Vamos agora adicionar um componentes Panel da aba de componentes Standard em


nosso formulário e setar sua propriedade Name como pnlLeft e a propriedade Align
para alLeft:

Componente Panel da palheta Standard.

Agora vamos colocar um componente Splitter no formulário, o componente Splitter fica


na pasta Additional, e nas propriedades deste componente setar Name como splttrMain.

Componente Splitter da palheta Additional.

Vamos também definir a propriedade Align do Splitter como alLeft. Em seguida


coloque outro componente Panel no formulário com a propriedade Name como
pnlRigth e a propriedade Align como alClient. Seu formulário deverá ficar assim:

20

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
O componente Splitter é utilizado para que o usuário possa redimensionar a tela no
form, para ver na prática execute a aplicação clicando na tecla de atalho Run:

Tecla de atalho Run.

Agora vamos adicionar outro componente Panel em nosso formulário com a


propriedade Name pnlLeftTop.e propriedade Align como alTop:

Até o momento estávamos preparando como seria o visual da nossa aplicação. A partir
de agora iremos colocar novos componentes que darão a verdadeira função a nossa
aplicação que é um Windows Explorer nosso.

Vamos agora adicionar um componente DriveCombobox ao formulário sobre o Panel


pnlLeftTop, o componente DriveCombobox fica na aba de componentes Win3.1:

O componente DriverCombobox é um componente que lista os drivers que existem em


nosso computador.
21

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Depois de colocado o componente no form como mostra a figura a baixo, vamos
configurar suas propriedades como: Name = drvComboBox.

Aproveitando vamos retirar nas propriedades dos Panels seus respectivos captions
deixando vazios.

Agora localize o componente DirectoryListBox na palheta Win3.1 e coloque sobre o


panel pnLeft e configure a propriedade do componente DirectoryListBox como: Name
= lstDir e a propriedade Align como alClient devendo ficar assim:

22

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora coloque o componente FileListBox também da aba de componentes Win3.1 no
Panel pnlRight com o nome lstFiles e align como alClient, devendo ficar assim:

23

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Pronto, já temos o nosso Windows Explorer. Porém se você mandar executar perceberá
que ainda não está funcionando corretamente, isso porque ainda não terminamos,
teremos agora que determinar suas propriedades e realizar a programação de eventos
dos componentes adicionados. Enfim a parte divertida.

Inicialmente selecione o componente DriverComboBox do Formulário e na propriedade


dele em DirList vamos setar para lstDir, assim o nosso componente DriverComboBox
estará ligado ao nosso componente DirectoryListBox que colocamos o nome de lstDir:

Agora vamos linkar o componente DirectoryListBox com o componente FileListBox.


Com o componente DirectoryListBox de nosso formulário selecionado vamos setar a
propriedade FileList para lstFiles que foi o nome dado ao nosso componente
FileListBox:

24

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora sim, se você mandar executar nossa aplicação todos os controles estarão
funcionando perfeitamente. Vamos agora implementar o nosso Windows Explorer,
colocando uma informação informando todo o caminho que você está, como se fosse
uma Path.

Vamos adicionar um componente Label da aba de componentes Standard com o nome


de lblDir em sua propriedade. Depois vamos setar nosso label (lblDir) ao componente
DirectoryListBox na propriedade DirLabel:

25

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida sete a propriedade Visible do Label para True.

E está pronto nossa segunda aplicação.

26

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Menus

Características de Menus

Vamos iniciar uma nova aplicação para melhor ilustrar este exemplo. Na aba de
componentes Standard existe o componente MainMenu é com este componente que
criamos nossos menus.

Colocamos este componente em nosso formulário e com um duplo clique será aberto
uma nova janela que é a janela de edição de menus:

Como todo componente, ele possui sua propriedades no Object Inspector onde temos
em Caption a possibilidade de criar as opções de menu. Vamos criar o menu Opções
escrevendo no Caption.

Agora vamos criar as sub-opções tais como: Custommer, Parts, Vendors e Sair:

27

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para colocar um traço entre Vendors e Sair como mostra a figura a cima, basta colocar
um traço “-“ no Caption.

Você já deve ter percebido que programas Windows possuem navegação por teclado,
como por exemplo Alt+O e assim por diante, podemos fazer isso colocando o símbolo
“&” no Caption de cada opção na letra que acharmos mais conveniente, após fazer isso
observe que a letra onde colocamos o símbolo ficará sublinhado:

28

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Podemos criar sub-menus clicando sobre a opção desejada com o botão direito do
mouse e escolhendo a opção Create SubMenu:

Assim podemos fazer quantas sub opções desejarmos:

29

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Podemos também adicionar imagens, na verdade somente ícones (.ICO), em nossos
menus e sub-menus. Para isso precisamos adicionar um nosso formulário um
componente ImageList da aba de componentes Win32.

Para selecionarmos os ícones de cada opção de menu, basta clicar duas vezes sobre o
componente ImageList que deverá aparecer a seguinte tela:

Clique sobre o botão Add... em seguida ir a algum diretório onde haja ícones e
selecionar os ícones que irão ser utilizados em seu projeto, como neste exemplo temos 7
opções selecionamos 7 ícones:

30

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida clicamos sobre o botão OK.

Em nosso componente MainMenu na tela de edição de menus, vamos a propriedade


SubMenuImages e linkamos com o componente ImageList:

Agora podemos colocar as imagens em cada opção. Na propriedade ImageList de cada


uma das opções existem os Ícones que serão associados a cada opção e sub-opção,
enquanto linkamos cada imagem não vemos quando estamos criando (entenda editando)
mas se sairmos do editor de menus e irmos ver em nosso formulário poderemos então
visualizar:

31

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Assim encerramos este capítulo por enquanto.

32

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Borland Database Engine – BDE

O Borland Database Engine ou BDE é utilizado para realizar a conexão do Delphi com
banco de dados (Paradox, Access, Interbase, Oracle, SQLServer e outros) e permite
também distribuir suas aplicações a seus clientes. Neste módulo estaremos dando uma
introdução ao BDE.

Vamos executar o BDE Administrator que foi instalado em seu computador junto com o
Delphi, vá ao menu do Windows Iniciar | Programas | Borland Delphi | BDE
Administrator, deverá ser aberto uma janela como esta:

Vamos iniciar nosso aprendizado sobre o BDE com exemplos práticos e que serão
utilizados pelo nosso treinamento daqui por diante.

Vamos criar aqui um novo Alias1 , para isso vá ao menu Object | New onde deverá ser
apresentado a seguinte tela New Database Alias:

1
Alias é um apelido dado a um caminho onde é localizado os bancos de dados que iremos utilizar no
desenvolvimento de nossas aplicações para que o Delphi possa localizar quando estivermos
desenvolvendo e até mesmo para distribuir nossa aplicação aos nossos clientes.
33

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Escolheremos sempre STANDARD em seguida clique em OK, deverá ser apresentado a
seguinte tela:

Observe que a esquerda há um opção selecionada chamado STANDARD1 é aqui que é


criado o nome de nosso Alias, neste exemplo vamos colocar o nome como
Delphi_Local_Class_Data2 e em seguida teclar Enter para fixar o nome, como mostra a
figura a seguir:

2
Poderíamos criar qualquer nome para o Alias, mas vamos utilizar este nome em todas aplicações que
iremos desenvolver daqui por diante. Caso no futuro você desenvolva um controle de estoque poderia
colocar o nome deste Alias como Estoque.
34

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Ao lado direito da imagem temos algumas opções como: Type, Default Driver, Enable
BCD e Path. Nestas opções vamos trabalhar com somente a PATH3 clicando sobre esta
opção será apresentado os três pontinhos, ou janela de edição, que clicando sobre
teremos uma janela chamada Direct Directory que é onde definimos o local onde estão
os bancos de dados que iremos trabalhar.

Daqui por diante, para não perdermos tempo criando nossos Bancos de Dados (veremos
como criar banco de dados Paradox no próximo capítulo) iremos trabalhar com bancos
de dados já existentes no próprio Delphi que se localizam em: C:\ Arquivos de
programas\Arquivos comuns\Borland Shared\Data4 em seguida clicar em OK.

3
Caminho de diretórios onde se localiza o diretório onde estão os bancos de dados que o sistema a ser
desenvolvido estão armazenados.
4
Este caminho pode mudar de computador por computador, é aconselhável realizar um procura antes
pelas tabelas: customer.db, Parts.db e colocar o caminho onde se encontram.
35

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Após clicar em OK deverá nossa PATH listar o caminho selecionado:

Para salvar estes processos realizados, vá ao Menu Object | Apply.em seguida irá
perguntar se deseja salvar, confirme clicando em OK:

36

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Assim estará pronto para começar a desenvolver suas aplicações com banco de dados.

37

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Conhecendo o Database Desktop

Este capítulo é apenas como título de curiosidade, pois nosso objetivo é de apenas
ensinar a desenvolver aplicações Delphi. No treinamento oficial da Borland em nenhum
momento é ensinado a criar um banco de dados Paradox – apesar de ensinar como
desenvolver com – então aqui iremos passar rápido apenas como a título de curiosidade,
tanto que este texto já foi utilizado para outros propósitos para o portal Ramos da
Informática5.

Um banco de dados pode ser definido como um conjunto unificado de informação que
vai ser compartilhado pelas pessoas autorizadas de uma organização. A função de um
Banco de Dados é permitir o armazenamento e a recuperação da informação necessária
para as pessoas da organização tomarem decisões.
Um Banco de Dados é formado por um conjunto de arquivos de dados, também
chamados de tabelas. Em uma tabela temos, linhas e colunas. Onde uma linha contém
informações a respeito de um item em particular, e a coluna possui uma parte das
informações de uma linha. A figura a seguir ilustra uma tabela de Clientes.

Código Nome Telefone


001 Aldair 554-8788
002 Marina 879-9687
005 Aline 572-2258
012 José 7070-8580
150 Márcio 446-3987

A tabela mostrada acima possui os campos ou colunas: Código, Nome e Telefone. E


em cada linha temos a identificação de um cliente em particular.
Cada tabela em um banco de dados possui um campo que identifica unicamente cada
registro. O conjunto de atributos ou campos utilizados para gerar este índice é
conhecido como chave primária. Nós podemos escolher qualquer campo de uma
tabela para ser uma chave primária, sempre levando em consideração que ela deve ser
curta. Por exemplo, usar um campo numérico é melhor do que um campo formado por
Strings. Como a chave primária determina a singularidade de um registro, quando se
usa um string não poderemos ter dois registros com o mesmo nome de cliente.

Na tabela do exemplo acima, o mais sensato é determinar o campo Código como nossa
chave primária.
Além de determinarmos os campos e a chave primária da nossa tabela, também teremos
que definir o tipo de dado, comprimento, formato e o domínio para cada campo
desta tabela.
Tipo de Dado: refere-se ao conteúdo do dado, podendo ser numérico, alfabético, data,
hora ou cadeia de caracteres longa ou curta.
Comprimento: refere-se ao tamanho ou número máximo de posições que poderá
assumir o valor ou conteúdo de cada dado.

5
Portal Ramos da Informática é um portal de comunidade on-line voltado a desenvolvedores Delphi e
Kylix e todos bancos de dados do mercado. O endereço de acesso é: www.ramosdainformatica.com.br
38

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Formato: refere-se à forma com que os dados deverão ser editados ou apresentados,
definindo-se as posições de símbolos.

Domínio: especifica se os valores dos dados pertencem a uma lista de valores pré
definidos, podendo estar em uma lista, ou satisfazer uma regra.
Database Desktop

No grupo de programas do Delphi, encontramos o utilitário Database Desktop, que


permite a criação e manipulação de banco de dados de diversos formatos.

O nosso próximo exemplo, gerenciará duas tabelas. Uma com o cadastro dos clientes e
outra com as vendas realizadas para estes clientes.

Vá ao grupo de programas do Delphi e abra o Database Desktop.

Abra uma nova tabela como mostra a figura a seguir.

39

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Escolha o tipo Paradox 7. Aparecendo então a janela Create Paradox 7 Table.

Digite o nome para o primeiro campo (CODIGO) e mude para tipo de campo (Type)
usando a tecla Tab. Com o campo Type selecionado, de um clique com o botão direito
do mouse em cima dele, para ser exibido o menu pop-up com todos os valores para o
tipo de campo. As letras sublinhadas correspondem à letra de atalho para cada tipo de
dado. O nosso campo CODIGO será definido como tipo Alpha. Apesar de ser um
campo com números nós não iremos realizar nenhum cálculo matemático com ele, por
isso o definimos como Alpha.

40

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
O campo CODIGO será a nossa chave primária para a identificação dos clientes na
tabela Clientes. Para definir um campo como chave primária, pressione qualquer tecla
quando o campo Key estiver selecionado, marcando este campo com um * - asterisco.

41

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Dê continuidade entrando com outros campos, seguindo o modelo apresentado abaixo.

Salve-a como Clientes.db.

42

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Logo após, abra uma nova tabela no mesmo formato, e construa-a como mostrado
abaixo.

Para que a tabela Vendas se relacione com a tabela Clientes, deveremos definir o campo
CODIGO da tabela Vendas como índice secundário.

No ComboBox Table properties, selecione a opção Secundary Indexes e clique no botão


Define..., aparecendo o quadro de diálogo Define Secundary Index.

Na janela Define Secondary Index, selecione o campo CODIGO e dê um clique na seta


para introduzi-lo como campo índice, e finalmente dê um clique no botão OK para
aceitar a opção. Será então solicitado um nome para este índice, digite INDCODIGO.

43

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Salve a tabela como Vendas.dbf. Saia do Database Desktop, através do menu File,
opção Exit.

O Delphi possui um assistente para a construção de formulários de acesso a Banco de


Dados, nós iremos utilizá-lo para construirmos o nosso projeto, que utiliza as tabelas de
Clientes e Vendas construídas anteriormente.

44

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Criando Aplicações com Banco de Dados

O Delphi nos oferece algumas soluções para banco de dados como: Session, Database,
Dataset, DataSource e Data-aware controls ou controles de bancos de dados.

Os componentes Session e Database serão explicados em outro capítulo, neste iremos


conhecer apenas outros componentes.

Todos os componentes de bancos de dados possuem as seguintes relações:

Vamos inicialmente trabalhar somente com Table e Query, na ilustração a cima


pretendo mostrar que estes componentes estão ligados ao componente DataSource que
faz a ligação com os demais componentes de controle.

Ou seja, sempre que colocarmos um componente Table ou Query em nosso formulário


teremos sempre que colocar um componente DataSource para podermos realizar a
ligação aos componentes de controle de banco de dados. Teremos um capítulo só de
Table e um capítulo só de Query.

A diferença entre Table e Query é a seguinte:

Table é para banco de dados simples como o Paradox e não possui facilidades para
trabalhar com SQL.

45

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Query podemos trabalhar, além de Paradox, outros bancos de dados e possui maior
facilidade para criação de rotinas SQL.

Este capítulo iremos trabalhar somente com Table pois é necessário que você tenha
conhecimentos deste para podermos prosseguimos com Query e ambos são muito
idênticos mudando poucas coisas.

O componente Table está localizado na aba de componentes BDE:

Componente Table.

O componente DataSource está localizado na aba de componentes Data Access:

Componente DataSource.

Então sempre que pedir para colocar um desses componentes você já sabe onde
localizar. Os componentes de controle, apresentados no diagrama no começo deste
capítulo estão localizados na aba de componentes Data Controls.

Criando um simples formulário de Banco de Dados

Aqui começamos uma nova aplicação. Antes de continuar o assunto sobre criação de
aplicações com banco de dados, crie uma nova aplicação com as seguintes propriedades
do Form:

Name: frmMain
Caption: Nossa Aplicação

Em seguida salve o projeto como FormMain.pas e Aplicação.dpr.

Agora crie um menu com as seguintes opções:Opções, Customers, Parts. Como na


figura a baixo:

46

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos continuar entrando na parte de banco de dados.

Vá ao menu File | New | Form com o novo form vamos colocar as seguintes
propriedades para ele:

Name: frmCustomer
Caption: Customers

Em seguida coloque um componente Table no formulário e vamos colocar as seguintes


propriedades:

Name: tblCustomer
DatabaseName: Delphi_Loca_Class_Data (Observe que é aqui que utilizamos o
Alias criado no BDE.)
TableName: customer.db (Observe que aqui encontramos todos bancos de dados
que indicamos ao criar o Alias no BDE, neste exemplo utilizaremos a tabela
customer.db).

47

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos colocar o componente DataSource que irá auxiliar na conexão com os
componentes de controle de bancos de dados, uma vez colocado no formulário vamos
realizar as seguintes configurações de propriedade para este componente:

Name: dtsrcCustomer
DataSet: tblCustomer

Pronto! Já fizemos a ligação do Delphi com nosso banco de dados. Vamos agora inserir
componentes de controle de banco de dados. Por enquanto vamos adicionar somente o
componente DBGrid na palheta de componentes DataControls e setar as seguintes
propriedades para este componente:

Name: dbgrdCustomer
DataSource: dtsrcCustomer

E está quase pronto, mas é preciso mostrar os dados do banco de dados Customer.db no
DBGrid, para isso selecione o componente table (tblCustomer) e coloque a propriedade
Active de False para True e pronto, lá estão os dados do banco de dados Customer.db
visível em nosso DBGrid.

48

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
49

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos voltar em nosso formulário onde está o menu, se você tiver dificuldades
em encontrar vá no menu View | Forms... será apresentado a janela View Form:

Selecione o frmMain e dê um duplo clique para abrir nosso formulário principal. No


menu, clique sobre a opção Customers deverá então aparecer a janela de edição de
código, coloque o seguinte código:
50

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora mande executar, quando você realizar esta operação o Delphi irá perguntar se
deseja declarar o frmCustomer a unir, clique no botão Yes para confirmar:

Em seguida mande executar novamente, para que faça a compilação completa. Os


comandos frmCustomer.Show; é usado para chamar o formulário de Customer.

Agora vamos melhorar nossa aplicação.

Vamos criar aqui uma interface mais agradável ao usuário com várias opções em uma
única tela. Para isso vamos selecionar o DBGrid e clicar no botão Delete de seu teclado,
vamos deletar o componente DBGrid, mas somente ele.

Vamos agora colocar um componente PageControl da aba Win32 em nosso formulário:

51

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique com o botão direito do mouse sobre este componente em nosso formulário e
escolha a opção New Page, será criado uma pasta com o nome TabSheet1 vamos agora
alterar a propriedade Caption de TabSheet1 para &Listin, vamos repetir esta operação
criando uma nova pasta com seu Caption como &Detail em seguida coloque novamente
o componente DBGrid e configure ele como fizemos no começo desta lição, uma vez
configurado coloque a propriedade Align do DBGrid como AlClient. Seu formulário
deverá ficar assim:

52

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Observe na imagem a cima que o DBGrid foi colocado na pasta Listn.

Agora vamos criar a opção para Detail, onde iremos colocar os detalhes do banco de
dados e conhecer outros componentes de controle de banco de dados.

Vamos agora colocar 6 componentes DBEdit da palheta de componentes Data Controls


e 6 componentes Label da palheta de componentes Standard. Onde os componentes
DBEdit terão as seguintes propriedades:

Componente Propriedades
DBEdit1 Name: dbedtCompany
DataSource: dtsrcCustomer
DataFiels: Company
DBEdit2 Name: dbdtAdress
DataSource: dtsrcCustomer
DataFiels: Addr1
DBEdit3 Name: dbdtCity
DataSource: dtsrcCustomer
DataFiels: City
DBEdit4 Name: dbdtState
DataSource: dtsrcCustomer
DataFiels: State
DBEdit5 Name: dbdtZip
DataSource: dtsrcCustomer
DataFiels: Zip

53

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
DBEdit6 Name: dbdtContact
DataSource: dtsrcCustomer
DataFiels: Contact
Label1 Caption: Company
Label2 Caption: Adresss
Label3 Caption: City
Label4 Caption: State
Label5 Caption: Zip
Label6 Caption: Contact

Devendo Ficar assim:

Agora para melhorar a aparência e colocar um novo controle, o controle de navegação,


vamos colocar um componente Panel da palheta de componentes Standard e definir em
suas propriedades:

Caption:
Align: alTop

Em seguida vamos colocar o componente de controle DBNavigator da palheta de


componentes Data Controls com as seguintes propriedades:

Name: dbnvgtrCustomer
DataSource: dtsrcCustomer

54

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Pronto, temos nosso controle de navegação que é melhor explicado na vídeo aula.

Vamos selecionar nosso Page Control que já está no formulário e vamos definir sua
propriedade Align para alClient, sua tela então deverá ficar como esta:

Fazendo ligação com mais de uma tabela

Vamos criar agora mais uma pasta em nosso Page Control que terá seu Caption como
&Orders:

55

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos adicionar em nosso formulário um novo componente Table com as
seguintes propriedades:

DatabaseName: Delphi_Local_Class_Data
TableName: orders.db
Name: tblOrders

Em seguida um componente DataSource com as seguintes propriedades:

Name: dtsrcOrders
DataSet: tblOrders

Em seguida coloque um componente de controle DBGrid e faça sua ligação ao banco de


dados, como já apresentado com o DataSource linkado em dtsrcOrders e Align como
alClient em seguida no componente tblOrders:

56

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos linkar as duas tabelas uma com a outra, para isso na tabela tblOrders na
propriedade MasterSource setar para dtsrcCustomer em seguida na propriedade
MasterField vamos clicar nos três pontinhos para abrir a caixa de edição Field Link
Designer:

57

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em Avaliable Indexes selecione CustNo, em Detail Fields selecione CustNo e também
em Máster Fields selecione CustNo em seguida clique sobre o botão Add:

Em seguida clique em Ok e coloque a propriedade do tblOrders de Active False para


True e mande executar.

O que fizemos faz em Orders mostrar todas as compras realizadas pela empresa
selecionada em Customer.

58

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Usando Database Wizards

Ainda em nossa aplicação que iniciamos no capítulo anterior aberta vamos criar o
cadastro de Parts.

Os Wizards são feitos para facilitar a criação de formulários já com os controles e


ligações necessárias aos bancos de dados. Esta é um opção muito fácil pois basta seguir
as instruções da tela.

Vamos ao menu do Delphi File | New | Other e vamos escolher a pasta Business:

Selecione o ícone Database Form Wizard e clique em OK:

59

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Form Options temos dois tipos de formulários, por enquanto vamos escolher apenas o
Create a simple form e, em DataSet Option por enquanto somente a primeira opção em
seguida clique sobre o botão Next:

Em Drive or Alias name vamos selecionar o nosso Alias. Em seguida escolha o banco
de dados Parts.db:

60

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique sobre o botão Next, clique sobre o botão ‘>>’ para que passe todos os campos da
esquerda para direita:

Clique sobre o botão Next e escolha a opção Horizontally:

61

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique sobre o botão Next e em Form Generation escolha a opção Form Only e deixe
desmarcado a opção Generate a main form:

Clique sobre o botão Finish, será criado nosso formulário do Parts, vamos alterar as
propriedades deste formulário para:

Name: frmParts
Caption: Parts

Selecione o componente table do formulário e coloque as seguintes propriedades:

Name: tblParts

62

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Selecione o componente DataSource e coloque a propriedade Name como dtsrcParts e
está pronto nosso formulário de Parts.

Agora vamos criar um novo formulário Mestre Detalhe6.

Mestre Detalhe Wizard

Vamos refazer os mesmos passos no anterior:

1. Vá ao menu do Delphi File | New | Other;


2. Selecione a pasta Business;
3. Selecione o ícone Database Form Wizard:

Escolha a opção Create a master/detail form:

Clique em Next e selecione a tabela Parts.db:

6
Mestre Detalhe é quando utilizamos dois ou mais bancos de dados em um formulário.
63

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique em Next e selecione e mova os itens da esquerda para direita:

Clique em Next, escolha a opção Horizontally:

64

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique em Next, escolha a tabela vendors.db:

Clique em Next, mova os itens da esquerda para a direita:

65

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique em Next, escolha a opção In a Grid:

Clique em Next, Selecione as opções VendorNo e clique em Add:

66

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique em Next, escolha a opção Form and DataModule:

Clique em Finish.

Será montado nosso formulário que liga a tabela Parts.db com Vendors.db:

67

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Vamos agora configurar as propriedades do formulário com:

Name: frmPartsVendors
Caption: Parts and Vendors

Temos uma novidade agora, a janela DataModule, onde estão os componentes do


formulário:

O DataModule veremos mais detalhadamente no próximo capítulo, por enquanto vamos


apenas configurar as propriedades do DataModule dos Tables e DataSources:

Componente Propriedades
DataModule2 Name: dtmdlPartsAndVendors
Table1 Name: tbltblParts
Table2 Name: tblVendors
DataSource1 Name: dtsrcParts
DataSource2 Name: dtsrcVendors

68

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Salve este projeto como FormPartsAndVendors.pas.

69

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Trabalhando com objetos Tfield

Os objetos TField são criados já quanto colocamos um componente de banco de dados


(Table ou Query) que possibilita a alteração e/ou personalização de cada campo do
banco de dados.

Tipos de Componentes TField

Existem diversas categorias de componentes Tfield são eles:

Componentes Correspondência
Field
TAutoIncField Campo de auto-incremento.
TStringField Dados em textos de até 255 caracteres.
TIntergerField Números entre –2147483648... 2147483648
TSmallIntField Números entre –32768...32168
TLargeIntField Campo Integer longo
TWordField Números de zero a 65535
TFloatField Números reais com 15-16 digitos
TCurrencyField O mesmo que TFloatField
TBCDField Números reais com decimais fixas de até 19 digitos
TBooleanField Valores True ou False
TDateTimeField Valores Data e Time
TTimeField Valor Time
TBlobField Campo binário sem limitação de tamanho.
TBytesField Igual ao TBlobField
TVarBytesField Campo binário com limitação de espaço para 65535 caracteres
TArrayField Campo Array
TMemoField Somente textos longos
TADTField Campo abstrato de dados
TGraphicField Campo de imagem (por exemplo, bitmap) sem limitação de tamanho.

Estes componentes apresentados na tabela são os que poderão ser alterados em tempo
de desenvolvimento ou em tempo de execução. Ou alterando suas propriedades no
Object Inspector ou via programação. Conheceremos agora no decorrer do treinamento
os principais e mais utilizados componentes TField.

Este capítulo, apesar de termos as vídeo aulas, vamos refazer os exemplos das vídeo
aulas e vamos explicar itens que não foram explicados nas mesmas.

Usando o Field Property Editor

Se você quiser criar um objeto TField quando estiver desenvolvendo sua aplicação,
clique sobre o componente Table que desejar com o botão direito do mouse e escolha a
opção Fields Editor... :

70

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Será apresentado o Fields Editor porém vazio. Necessitamos então adicionar os campos
da tabela selecionada clicando com o botão direito do mouse e escolhendo a opção Add
Fields... será então apresentado a tela Add Fields com os campos da tabela selecionados,
neste exemplo deixe todos selecionado:

Em seguida clique sobre o botão OK. Todos campos selecionados foram para o nosso
editor de Fields:

71

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Cada um destes campos possuem suas propriedades e eventos no Object Inspector.
Perceba por exemplo o nome do campo Company que está tblCustomerCompany que
quer dizer que este componente Field pertence a tabela Customer:

Existem outras propriedades para cada campo TField no Object Inspector. As que
iremos conhecer em nosso treinamento são:

Propriedade Descrição
DisplayLabel É o nome da coluna de um componente DBGrid, é aqui que corrigimos
o nome de uma coluna do DBGrid.
DisplayWidth Usado para definirmos o tamanho de uma coluna em um componente
DBGrid.
72

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
EditMask Usado para criarmos mascaras para os campos de cadastro e
visualização, como por exemplo CEP, CPF, CNPJ, Data e outros.
Currency Usado para colocar formatação de moeda. Não vamos tratar este na
apostila, mas está sendo tratado nas vídeo-aulas.

Formatando Campos com Edit Masks

Apesar de apresentarmos nas vídeo aulas, vamos tratar também aqui na apostila de
conteúdo o que não foi citado.

Temos algumas mascaras já criadas pelo próprio Delphi que podemos escolher, assim
como também podemos criar nossas próprias mascaras. Por exemplo podemos forçar
que o sistema aceito somente letras maiúsculas colocando o sinal de maior (“>”)antes da
mascara, ou podemos colocar o sinal de menor (“<”) para forçarmos o sistema aceitar
somente letras minúsculas. Podemos colocar o caracter “L” para aceitar somente letras e
o caracter “A” para aceitar letras e números. O caracter “9” permite somente números.
Um exemplo: Se você precisar criar uma mascara que force o usuário a digitar 3 letras
maiúsculas e em seguida 4 números você pode criar a seguinte mascara: >LLL-9999

73

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
74

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Manipulando DataSets

Movendo ponteiros

Podemos personalizar os botões de nosso DBNAvigator criando assim uma certa


personalização de nossas aplicações deixando de depender um pouco dos controles já
prontos pelo Delphi – apesar de não achar isso necessário mas acho importante
apresentar a você – com muita facilidade. Neste exemplo vamos implementar nosso
formulário frmCustomer.

Coloque um componente Panel em nosso formulário com a propriedade Align como


alRight:

Em seguida coloque dois componentes SpeedButton da palheta de componentes


Additional:

75

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Vá a propriedade Glyph dos SpeedButons para colocarmos imagens nos botões:

Clique sobre o botão Load e escolha as imagens BMP que melhor se encaixar ao
exemplo no meu caso estas imagens estavam em \Arquivos de
Programas\Borland\Delphi6\Demos\Fotball:

76

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Após clicar em OK a imagem selecionada foi para o nosso botão SpeedButton, repita os
mesmos passos para o segundo botão. Agora vamos escrever os códigos para que nossos
botões funcionem, no primeiro SpeedButton coloque o seguinte código no evento
OnClik:

77

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
No evento OnClick do segundo SpeedButton coloque o seguinte código:

Agora no componente DataSource de Orders, no evento OnDataChange:

78

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Escreva o seguinte código:

Agora é só rodar nossa aplicação e ver nossos botões mudando de registro.

79

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Limitando Record Sets

O que iremos criar agora – ainda incrementando o formulário de Customer – é realizar


filtros de nomes por pastas no DBGrid.

Vamos utilizar um componente TabControl da palheta de componentes Win32 e colocar


sobre nosso formulário:

Vamos colocar a propriedade Name deste componente como tbcntrlCustomer e na


propriedade Tabs vamos colocar a palavra TODOS e em seguida todo o alfabeto – é o
seguinte, se selecionarmos a pasta TODOS será listado todas companhias cadastradas e
conforme vamos mudando as pastas serão listados somente as companhias que
comecem por aquela letra da pasta.

Logo após clicar em OK seu TabControl ficará assim:


80

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora para que você deixe sua tela como mostra a figura a cima é necessário você
deletar o DBGrid em seguida no componente TabControl colocar sua propriedade Align
como alClient e depois colocar o DBGrid novamente de volta e realizar suas ligações ao
banco de dados como já foi apresentado anteriormente.

Para fazermos um filtro conforma a letra da pasta selecionada devemos colocar o


seguinte código no evento OnChange do componente TabControl:

81

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Não esquecer de colocar a propriedade IndexFieldName do componente tblCustomer
em Company.

Assim já estará pronto para rodar a aplicação e ver como funciona este filtro.

Criando uma pesquisa em registros

Vamos criar um simples sistema de busca, para este exemplo vamos trabalhar um pouco
na no formulário frmParts, deixando um pouco de lado nosso formulário Customer, mas
pode ser feito também em outros formulários futuros.

Crie um novo formulário com as seguintes propriedades:

Name: frmFindPart
Caption: Find Part

Em seguida salve este formulário como FormFindPart. Coloque 3 componentes Panel


no formulário e coloque as propriedades Align de cada Panel respetivamente como
alTop, alBotton e alClient, devendo ficar assim:

No Panel2 colque um componente DBGrid, com sua propriedade Align como alClient:

82

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
No Panel2 coloque 2 componente BitBtn da palheta de componentes Additional e
coloque suas propriedades como:

Para BitBtn1:

Name: btbtnCancel
Kind: bkCancel

Para BitBtn2:

Name: btbtnOk
Kind: bkOK

No Panel1 vamos colocar um componente label e um componente Edit, com as


seguintes propriedades cada um:

Para o componente Label:

Name: lblFindPartName
Caption: Find Part Name:

Para o componente Edit:

Name:edtFind

Devendo seu formulário ficar assim:

83

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Na propriedade DataSource do DBGrid coloque dtmdlParts.dtsrcParts para interligar ao
DataMolude criado quando desenvolvemos este formulário na lição de Wizard. Neste
exemplo é necessário que a propriedade IndexFieldName do componente tblParts esteja
como Description que assim será ordenado por ordem de descrição. Agora no evento
OnChange de nosso componente Edit vamos escrever o seguinte código:

84

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
ATENÇÃO: O comando FindNearest aplica-se somente com componente Table. Se
você for utilizar componente Query ou StoredProc o método Locate é o melhor a ser
utilizado. Iremos ver este método quando chegarmos a parte do treinamento que trata de
Query.

Bookmarking Records

Agora precisamos fazer o formulário frmParts chamar o formulário frmFindPart e


quando voltarmos de nosso sistema de busca ele volte no registro que realizamos a
pesquisa para que o usuário, caso deseje, possa alterar informações. Para isso vamos
adicionar um componente SpeedButton no form Parts e no evento OnClick deste
componente escrever o seguinte código para que isto seja realizado:

Esta rotina faz a ligação com o DataModule e manda o Delphi construir o formulário de
pesquisa.

85

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Migração para Cliente/Servidor – Client/Server

Este capítulo é voltado a migração de aplicações para Cliente Servidor. Você aprenderá
a converter seus bancos de dados Paradox para o Interbase e a configurar sua aplicação
facilmente para esta plataforma.

Escolhemos o banco de dados Interbase não apenas por ser um banco de dados da
Borland, mas também por ser um banco de dados muito mais confiável que muitos
outros como: MS-Access, MySQL, Paradox e outros.

Este capítulo só funciona com o Borland Delphi versão 7, mas pode ser aplicado
perfeitamente ao Delphi 6. Particularmente eu prefiro o Delphi 7 por ter mais recursos e
alguns passos desta lição podem não dar certo com a versão 6 do Delphi.

Num ambiente Cliente/Servidor nós temos um banco de dados central sendo acessado
por vários outros usuários - Clientes. Este banco de dados central deve ser gerenciado
por um programa específico para isto.

O Delphi incorpora o gerenciador de banco de dados InterBase da Borland, nós iremos


trabalhar com este gerenciador, o que permite a criação e teste de aplicativos sem
estarem instalados no ambiente de produção. Quando o projeto estiver terminado, basta
instalá-lo no computador servidor de arquivos para uso imediato.

Migrando seus Bancos de Dados com o Data Migration Wizard

Para converter os bancos de dados de Paradox para Interbase vamos utilizar uma
ferramenta que já vem no próprio Borland Delphi 7.

Vamos abrir o DataPump, que irá nos abrir diretamente nesta tela:

86

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Podemos escolher abrir as tabelas a partir do Alias ou do diretório, vou abrir a partir do
Alias.

Mas antes por ser um ambiente Cliente Servidor devemos criar um novo Alias, como já
foi apresentado não irei demonstrar novamente, chamado Delphi_Server_Class_Data,
em seguida escolhido o alias inicial Delphi_Local_Class_Data clique sobre o botão
Next e na próxima tela selecione o Alias Delphi_Server_Class_Data:

Em seguida clique sobre o botão Next, vamos selecionar todos os bancos de dados
clicando sobre o botão >>:

Em seguida clique sobre o botão Next e será apresentado um relatório sobre cada tabela
que irá ser convertida, clique sobre o botão Upsize para iniciarmos a conversão de

87

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Paradox para Interbase, será apresentado uma barra de progressão informando a
conversão dos bancos em seguida será apresentado um relatório:

Este relatório apresenta que tudo ocorreu bem na conversão, clique em Done e pronto,
seus bancos de dados agora são Interbase com todas informações neles contidos
mantidos. Agora vamos às modificações que você deve realizar em sua aplicação para
que rode perfeitamente, agora com banco de dados Interbase e Cliente Servidor.

Modificando Aplicações

Aqui neste exemplo vamos realizar a mudança somente no formulário Parts, quando
você for desenvolver seus aplicativos e converte-lo deve realizar estes processos em
todos formulários.

Então com o formulário Parts aberto:

88

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Devemos realizar diversas modificações de configuração do banco de dados. Vamos
começar alterando a propriedade do DatabaseName para o nosso banco de dados
servidor que criamos com o DataPump. Em seguida altere a propriedade TableName de
parts.db para somente parts e estará pronto sua conversão.

Aqui em meu exemplo deu tudo certo, porém podem ocorrer erros quando você for
realizar. Entre em contato para que possamos resolver e explicar o que aconteceu.

89

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
UTILIZANDO COMPONENTES TQUERY

Introdução e instrução

Até este momento vimos a utilização de componente TTable para ligação de tabelas. A
partir de agora veremos como utilizar o componente TQuery. O componente TQuery é
parecido com o componente TTable. O componente Query é indicado para outros tipos
de bancos de dados que não seja o Paradox, apesar de funcionar perfeitamente bem com
o Paradox, em especial bancos de dados que trabalhem com instruções SQL como o
Interbase. Então a diferença básica entre componente Table e Query é que este último
necessita conhecimentos de SQL.

Este treinamento não tem como objetivo ensinar SQL, mas vou mostrar aqui algumas
funções básicas de SQL. Você poderá conhecer mais sobre SQL no Portal Ramos da
Informática ( www.ramosdainformatica.com.br ) na seção de artigos. Não ensinarei o
SQL, assim como não ensinei o Paradox, pois sairia do contexto do treinamento que é o
Delphi exclusivamente.

A utilização de SQL é sem dúvidas mais eficiente e rápido que se fizéssemos com
Object Pascal puro e, uma vez que você já tiver conhecimentos de SQL verá como é
muito mais fácil desenvolver suas aplicações, sem contar que o SQL é uma linguagem
universal para banco de dados, muito utilizada pelos principais bancos de dados do
mercado.

Com os objetos (componentes) Query você pode desenvolver aplicações muito mais
rápidas e seguras, além de ser mais indicado no desenvolvimento de aplicações
Client/Server e redes.

Um componente Query possui em suas propriedades a possibilidade de criar suas strings


SQL e parâmetros. Vamos utilizar o nosso formulário Customer já criado anteriormente
para podermos ilustrar melhor a utilização de Querys em nossas aplicações. Neste
formulário Customers que criamos utilizamos a tabela Orders. Vamos colocar agora um
componente Query, da palheta de componentes BDE, em nosso formulário e setar a
propriedade Name para qryOrders e definir a propriedade DatabaseName para o nosso
Alias. Em seguida, vamos colocar já um parâmetro em SQL na propriedade SQL deste
objeto para fazer a ligação com a tabela orders, este comando deverá ser:

Select * From Orders

Este comando, como já dito, serve para fazer a ligação da tabela Orders ao componente
Query, é sempre este comando mudando apenas o nome do banco de dados sem sua
extensão.

90

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Esta caixa de diálogos a cima é onde se coloca o parâmetro de SQL. Podemos criar aqui
diversos outros parâmetros para SQL como UPDATE, DELETE e INSERT. Agora
devemos colocar um componente DataSource com o nome de dtsrcOrders para esta
nova Query.
É aconselhável abrirmos e fecharmos sempre uma Query quando abrimos ou fechamos
um formulário, isto para evitar erros e até mesmo para deixar nossas aplicações mais
rápidas e seguras. Para isso devemos colocar no evento OnCreate de nossos formulários
o seguinte código a baixo para podermos sempre que entrarmos no formulário abrir a
Query sem problemas:

procedure TfrmCustomer.FormCreate(Sender: TObject);


begin

91

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
pgcntrlCustomer.ActivePage := TabSheet1; // Quando a PageControl de Customer
estiver //ativa na Pasta TabSheet1 que é a pasta Listin

// prepara o query para a tabela orders


if not qryOrders.Prepared then
qryOrders.Prepare;
qryOrders.Open; // Abre tabela
end;

Vou esclarecer os métodos Prepare e Prepared. O método Prepare é importante para


otimizar a conexão ao banco de dados, principalmente em um servidor. Assim os
comandos SQL já são enviados ao banco de dados deixando a execução e toda operação
mais dinâmica. Já o método Prepared checa sempre depois que o usuário executar
alguma operação pré-programada por nós deixando assim a aplicação mais lenta. Para
finalizarmos esta conexão em nosso banco de dados com Query precisamos agora
sempre desativar a propriedade Prepare iniciada quando entramos no formulário e
fechar o banco de dados. Isso é preciso, pois sempre que trabalhamos com Query se não
fecharmos o banco de dados o computador sempre irá abrir novamente o banco de
dados sempre que o usuário entrar no formulário, o que pode ocasionar diversos erros
futuros em nossas aplicações e bancos de dados forçando assim uma chamada do cliente
ao desenvolvedor da aplicação para corrigir erros o que não é bom. A função que
mostro a seguir fecha o banco de dados e desativa a propriedade Prepare com a
propriedade UnPrepare, este código é adicionado no evento OnDestroy do formulário:

procedure TfrmCustomer.FormDestroy(Sender: TObject);


begin
qryOrders.Close;
qryOrders.UnPrepare;
end;

Agora precisamos fazer a ligação entre as tabelas tblCustomer e qryOrders para que
haja o filtro pelo CustNo, como era antes de realizarmos estas alterações, então de volta
ao editor de SQL do Query acrescente:

92

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Criamos um parâmetro chamado CustNo. Veja na propriedade Params este parâmetro
criado:

Observe as propriedades deste parâmetro, o seu exemplo deverá ficar igual. Em seguida
no evento OnDataChange de seu componente dtsrcOrders escreva o seguinte código:

procedure TfrmCustomer.dtsrcOrdersDataChange(Sender: TObject;


Field: TField);
begin
with qryOrders do // Com a Query Orders
begin
DisableControls; //Desabilita controle
Close; // Fecha
ParamByName( 'CustNo' ).Value := tblCustomerCustNo.Value; // Diz que campo
CustNo de Orders é igual ao campo CustNo de Customer.
Open; // Abre
EnableControls; // Ativa controles
end;
end;

Assim está pronto, voltamos a fazer a comunicação entre as tabelas Customer.db e


Orders.db utilizando o componente Query.

93

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora vamos criar novo formulário utilizando somente de Querys.

Database Form Wizard

Anteriormente vimos como trabalhar com o Database Form Wizard com Table agora
vemos com Query. Vá ao menu do Delphi File | New | Other e na pasta Business
escolha a opção Database Form Wizard:

Em seguida clique em OK. Escolha agora Create Master/Detail Form e Create a Form
using TQuery Objects em seguida clique em Next:

94

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em Driver or Alias Name coloque o Alias que estamos trabalhando e escolha a tabela
Orders.db em seguida clique em Next:

Selecione todos os campos com exceção dos campos que comecem por Ship, em
seguida clique sobre o botão Next:

95

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Defina como Horizontally em seguida clique em Next:

Em seguida escolha a tabela OrderLineItems.db e clique em Next:

Selecione todos campos com exceção de COMMENT em seguida clique em Next:

Escolha a opção In a Grid em seguida clique em Next:


96

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Selecione ORDER_KEY com OrdNo e clique em Add... em seguida clique em Next:

Escolha a opção Form and DataModule e clique em Finish:

E assim será montado o novo formulário com o DataModule:

97

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Se você olhar na propriedade SQL dos componentes Querys terá os seguintes códigos a
baixo. Neste o Query de Orders:

Select
orders."OrderNo",
orders."CustNo",
orders."SaleDate",
orders."ShipDate",
orders."EmpNo",
orders."PO",
orders."Terms",
orders."PaymentMethod",
orders."ItemsTotal",
orders."TaxRate",
orders."Freight",
orders."AmountPaid"
From "orders.db"
As orders

O de OrderLineItems teremos:

Select
OrderLineitems."LINEITEM_KEY",
OrderLineitems."ORDER_KEY",
OrderLineitems."PART_KEY",
OrderLineitems."SUPPLIER_KEY",
OrderLineitems."LINE_NUMBER",
OrderLineitems."QUANTITY",
OrderLineitems."EXTENDED_PRICE",
OrderLineitems."DISCOUNT",
OrderLineitems."TAX",
OrderLineitems."RETURN_PART",
OrderLineitems."LINE_STATUS",
98

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
OrderLineitems."SHIP_DATE",
OrderLineitems."COMMISSION_DATE",
OrderLineitems."RECEIPT_DATE",
OrderLineitems."SHIP_INSTRUCTIONS",
OrderLineitems."SHIP_MODE"
From "OrderLineitems.DB"
As OrderLineitems
Where
"OrderLineitems"."ORDER_KEY" =:"OrderNo"

Veja que assim o Wizard já montou os parâmetros SQL de chamada para seus bancos
de dados.

Vamos agora alterar algumas propriedades do Formulário:

Caption = Orders
Name: frmOrders

Agora basta você chamar este formulário no menu do Formulário principal da aplicação
com o comando:

FrmOrders.Show;

Editando Registros

Este formulário ainda não está aceitando edição porque o Wizard deixa a propriedade
RequestLive dos Querys como False, coloque esta propriedade como True para que
possibilite a edição de registros.

Porém utilizar-se somente deste artifício para edição de registro não é aconselhável por
não ser uma operação segura principalmente se você for trabalhar com aplicações em
rede. Por enquanto isto basta, mas veremos mais adiante como fazer corretamente em
“TDatasets Avançado”.

Localizando Registros em Queries

Com o componente Table podemos utilizar os métodos FindKey ou FindNearest para


realizarmos pesquisas, isso porque com os Tables podemos aproveitar dos indeces das
tabelas. Já com o componente Query não podemos utilizar dos índices de tabelas
portanto não podemos utilizar os métodos FindKey ou FindNearest, então neste
exemplo não vamos utilizar estes métodos pois estamos trabalhando com Query.

Neste nosso exemplo vamos colocar um componente Label, Edit e Button devendo ficar
desta forma:

99

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E iremos utilizar o método Locate, então no evento OnClick de nosso botão escreva o
código a seguir:

procedure TfrmOrders.btnFindOrdersClick(Sender: TObject);


var
OrderToFind : Variant; // Declara variável
begin
OrderToFind := edtFind.Text; // Define esta variável como o Texto a ser digitado
no edit.
with dtmdlOrders.qryOrder do // Define tabela que iremos trabalhar
if not Locate('Order_Key', OrderToFind, [loCaseInsensitive]) then // se não
localizar então…
MessageDlg('Order not Found', mtError, [mbOK], 0); // mostra esta
mensagem de erro com o botão OK.

end;

O SQL Builder

Eu disse que neste treinamento não irei entrar em detalhes sobre programação em SQL,
porém o Delphi possui um gerador de rotinas em SQL, o SQL Builder que pode ser
acessado diretamente nos componentes Query, clicando sobre o botão direito deles:

100

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Devendo aparecer a seguinte tela:

Vou demonstrar como gerar seus SQLs com este gerador do Delphi. Primeiro vamos
definir nosso Alias em Database:

101

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Neste exemplo vamos abrir os bancos de dados Customer e Order em Table, devendo
ficar assim:

Agora vamos selecionar os campos que iremos utilizar em nossas tabelas, tanto em
Customer quanto em Orders, como mostra a ilustração a baixo:

102

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para realizar uma interligação de nossas tabelas, na pasta Joins iremos definir que o
campo Customer_Key da tabela de Customer é igual ao campo Customer_Key da tabela
Orders, como mostra a ilustração a seguir:

O SQL Builder permite fazer outros tipos de controles além de setar compartilhar
tabelas dos Querys. Podemos fazer outras condições ao código SQL que será gerado.
Por exemplo a próxima figura mostra que posso definir critérios:

103

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Além de diversas outras opções como na pasta Group Criteria que podemos realizar
operações matemáticas entre os campos, onde SUM seria a somatória de valores de um
campo a ser definido.:

Na barra de atalhos do SQL Builder possui o Execute Query onde você poderá
visualizar os em um DBGrid o que está sendo montado para que você aprove ou não:

104

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Quando você já souber trabalhar com SQL poderá ver e editar o código gerado pelo
SQL Builder, ainda na barra de atalhos, através do Show and Edit SQL :

Você deverá copiar este código pois o SQL Builder não coloca automaticamente nas
propriedades SQL de seu Query.

105

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
DbExpress

O dbExpress surgiu a partir da versão 6 do Delphi. Apesar disto é muito importante que
você, mesmo começando a programar a partir da versão 6 do Delphi, conheça e aprenda
o BDE pois a maioria, eu diria uns 95%, da aplicações já desenvolvidas e ainda por
desenvolver trabalha com o BDE e creio que ainda vá demorar bastante para que sejam
convertidos para o dbExpress. Esta nova camada foi reconstruída a partir do zero, não
aproveitando a estrutura da BDE
.
Veja agora as principais diferenças entre a BDE e a DbExpress:

• A camada DbExpress é muito mais simples e leve, deixando muitos recursos a


serem controlados pela própria aplicação. Por exemplo, o caching de dados. A
dbExpress retornará os dados somente de forma unidirecional, ou seja, não
criará um handle de edição (live result set). A camada Midas, encapsulada nos
objetos DataCLX, será a responsável pelo cache dos dados retornados.

• A API desta camada é mais simples, baseada em apenas quatro objetos-


SQLDriver, SQLConnection, SQLCommand e SQLCursor - comumente
chamados de SQLObjects.

• A movimentação de registros, a indexação, ou qualquer outro tipo de


manipulação dos dados retornados serão controlados pelo MIDAS
ClientDataSet, livrando a DbExpress deste trabalho.

• A dbExpress também não implementará o Cached Updates, RequestLives ou


reprocessamento de querys dinamicamente, o que irá incrementar a performance
de acesso.

Em suma, a nova camada promete um considerável aumento de performance para


aplicações que manipulem massas de dados. Vejamos os principais pontos oferecidos
pela DbExpress:

• Incremento considerável de velocidade, visto que a DbExpress é muito simples,


eliminando toda a carga de processamento realizada pelo BDE;

• Maior praticidade para distribuição do aplicativo, pois a complexidade de


configuração e instalação da BDE não estará mais presente;

• Alocação de recursos dinâmicos no cliente será muito menor.


• O dbExpress permite criar tanto para Delphi quanto para Kylix.

106

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Conhecendo os componentes do dbExpress

Esta é a palheta de componentes do dbExpress:

Nesta palheta temos os componentes SQLConnection, SQLDataSet, SQLQuery,


SQLStoredProc, SQLTable, SQLMonitor e SQLDataSet respectivamente. É mais
utilizado em banco de dados que se utilizam de SQL, como: Oracle, Interbase, SQL
Server, MySQL e outros. Para se trabalhar com o dbExpress é necessário o
conhecimento de SQL e outros bancos de dados.

Vamos conhecer aqui uma breve descrição sobre cada um destes componentes. Para que
você conheça melhor suas propriedades veja no Help do Delphi.

SQLConnection – Este componente realiza a conexão com banco de dados. O


componente SQLConnection suporta elementos requeridos para o login, transação e
interação com o servidor.

SQLDataSet – Este componente é um componente especializado ClientDataSet para se


utilizar os componentes internos SQLDataSet e DataSetProvider, que realiza a ligação
com os campos do banco de dados.

SQLQuery – Este é um componente DataSet para enviar códigos SQL para o servidor
de banco de dados. Este componente suporta dados enviados pelo comando SELECT.
Modificações de dados com INSERT, UPDATE e DELETE são suportados. Comandos
para criar definições como CREATE TABLE (etc.) enquanto é executado.

SQLStoredProc – Este componente é utilizado para acessar stored procedures de


bancos de dados em servidores, via SQLConnection. TSQLStoredProc retorna o
resultado de uma stored procedure ao cursor. Você adiciona um componente
TSQLStoredProc em um formulário ou DataModule em tempo de design ou cria em
tempo de execução.

SQLTable – Este componente é utilizado para se conectar a simples bancos de dados –


como o paradox.

SQLMonitor – Este componente é como se fosse uma ferramenta para se verificar as


stored procedures dos bancos de dados. Ele faz uma verificação encontrando possíveis
erros dentro das procedures dos bancos de dados.

Para entendermos melhor os conceitos e utilização do dbExpress vamos a partir de


agora criar um exemplo.

107

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Um exemplo de mundo real

Para que você compreenda melhor o funcionamento do dbExpress, que necessita do


componente ClientDataSet, vamos mostrar na prática com o desenvolvimento de um
exemplo de mundo real.

Vamos imaginar que você precise criar uma aplicação flexível. Mais ainda, suponha que
sua aplicação tenha que trabalhar com diversos tipos de bancos de dados e sistemas
operacionais, e que necessita de ser utilizado em um laptop para em seguida se conectar
a um servidor para transferência de dados para este servidor, quando o usuário chegar
ao escritório. Melhor explicando: Você foi contratado para desenvolver uma aplicação
onde os vendedores de um grande distribuidor atacadista necessitam recolher
informações de seus clientes em seguida enviar estas informações em seus laptops a
central de atacado para poderem processar os pedidos e sua aplicação necessita ser
flexível pois a empresa está com planos futuros de mudar toda sua base de dados e
necessite de algo que não dependa de plataforma ou tipo de banco de dados. Então
como fazer? Quais componentes utilizar?

No Delphi você utilizará o componente ClientDataSet. Este componente permite que


você crie arquivos fixos em seu computador para Interbase, Oracle, XML ou arquivo
binário, sem necessitar conhecer estes bancos de dados. E para realizarmos a conexão e
transferência para o servidor de banco de dados iremos então utilizar o dbExpress.

Crie agora um novo projeto case1.dpr com FormCDS.pas como formulário principal.
Coloque os seguintes componentes com seus respectivos nomes no formulário:

Componente Name Palheta de componentes


ClientDataSet clntdtstSales Data Access
DataSource dtsrcSales Data Access
BDNavigator dbnvgtrSales Data Controls
DBGrid dbgrdSales Data Controls

Precisamos agora fazer ligações entre nossos componentes. Observe que ainda não
utilizamos nenhum componente do dbExpress, principalmente o componente
SQLConnection que será envolvido neste exemplo. Coloque a propriedade DataSet do
DataSource para o componente específico ClientDataSet, o DBGrid e o DBNavigator a
propriedade Datasource para dtsrcSales.

108

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora clique com o botão direito do mouse sobre o componente ClientDataSet deverá
ser apresentado um pop-menu, como mostra figura a baixo. Este menu você pode ler
uma tabela de seu disco ou associar a um banco de dados na propriedade DataSet. Para
este exemplo vamos utilizar do Field Editor para definirmos uma nova tabela, e
criarmos em tempo de design um banco de dados a ser criado em tempo de execução.

Selecione a opção Fields Editor. Na janela de Fields Editor não há entradas. Clique com
o botão direito do mouse sobre o Fields Editor e selecione New Field, veja na figura a
seguir. Coloque as informações como mostra a figura:

109

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clique em OK e crie um novo campo com as propriedades Name como “Description”,
Type como String, Size como 50 e FieldType como Data. O seu Field Editor deverá
ficar assim:

Feche a janela Fields Editor. Agora clique com o botão direito do mouse sobre o
componente ClientDataSet onde você deverá ver as seguintes opções:

110

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora você tem a opção de criar seu DataSet. Clique na opção Create DataSet e observe
o DBGrid. O grid agora tem duas colunas com os campos criados. Coloque a
propriedade Active do ClientDataSet para True.

Se clicarmos com o botão direito do mouse novamente sobre o componente


ClientDataSet, veremos que o pop-menu sofreu algumas alterações. O pop-menu nos dá
a opção de salvar os dados do DataSet em vários formatos no disco, ou podemos limpar
as informações de dados.

111

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Mas qual opção vamos salvar as informações? Iremos escolher a opção Save to MyBase
Xml table, para convertermos e criarmos informações em XML (Extensible Markup
Language). É linguagem de marcação de dados (meta-markup language) que provê um
formato para descrever dados estruturados. Isso facilita declarações mais precisas do
conteúdo e resultados mais significativos de busca através de múltiplas plataformas. O
XML também vai permitir o surgimento de uma nova geração de aplicações de
manipulação e visualização de dados via internet.

Um elemento XML pode ter dados declarados como sendo preços de venda, taxas de
preço, um título de livro, a quantidade de chuva, ou qualquer outro tipo de elemento de
dado. Como as tags XML são adotadas por intranets de organizações, e também via
Internet, haverá uma correspondente habilidade em manipular e procurar por dados
independentemente das aplicações onde os quais são encontrados. Uma vez que o dado
foi encontrado, ele pode ser distribuído pela rede e apresentado em um browser como o
Internet Explorer 5 de várias formas possíveis, ou então esse dado pode ser transferido
para outras aplicações para processamento futuro e visualização.

Em nosso exemplo salvado em XML temos seu conteúdo assim:

<?xml version="1.0" standalone="yes" ?>


- <DATAPACKET Version="2.0">
- <METADATA>
- <FIELDS>
<FIELD attrname="ID" fieldtype="i4" />
<FIELD attrname="Description" fieldtype="string"
WIDTH="50" />
</FIELDS>
<PARAMS />
</METADATA>
<ROWDATA />
</DATAPACKET>

Neste exemplo do conteúdo do XML apresentado mostra somente os campos porque


não digitamos nada.

Neste treinamento, assim como o SQL, não vamos entrar muito em detalhes sobre XML
porque é voltado exclusivamente ao Delphi.

Execute esta aplicação e insira alguns dados.

112

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Assim está pronta nossa aplicação inicial. Poderem se você encerrar a aplicação e
mandar executar novamente perceberá que a tabela foi esvaziada. Para podermos
registrar e sempre ler o que foi registrado em nossa grid precisamos definir a
propriedade FileName do componente ClientDataSet como Sales.xml. Assim estaremos
com este problema resolvido.

Se você quiser fazer isso em tempo de execução utilize os métodos LoadFromFile e


SaveToFile do ClientDataSet.

Agora que nossa aplicação já está criando e salvando as informações precisamos agora
fazer com que se conecte ao servidor de banco de dados e mande as informações para
lá.

ClientDataSet com dbExpress

Vamos agora adicionar os seguintes componentes a nossa aplicação:

Componente Name Palheta de componentes


SQLConnection cnncthMain dbExpress
SQLTable tblSales DbExpress
DataSetProvider dtstprvdrSales Data Access

113

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Defina as propriedades do ClientDataSet: Filename como em branco por agora e Active
de True para False. Agora clique com o botão direito do mouse sobre o ClientDataSet e
selecione Clear Data.

O componente SQLConnection provê a conexão direta com um banco de dados.


Editando suas propriedades vamos interliga-lo colocando um banco de dados Interbase
chamado Employee.gdb e definirmos as propriedades Name como “sysdba”, Password
como “masterkey”. E a propriedade LoginPrompt como False.

114

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Coloque as propriedades do componente SQLTable para acessar o SQLConnection e a
propriedade TableName como “SALES” e a propriedade Active para True.

Coloque agora a propriedade DataSet do componente DataSource para tblSales e a


propriedade ProviderName do componente ClientDataSet para dtstprvdrSales.

Você precisa agora definir a propriedade do componente DataSetProvider para o


componente SQLTable. E a propriedade ProviderName do componente ClientDataSet
para o componente DataSetProvider. A propriedade DataSe do DataSource deve estar
ligado ao ClientDataSet e a propriedade Active do ClientDataSet como True. Então o
seu DBGRid deverá ficar assim:

115

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Neste ponto em que estamos podemos mudar os registros e adicionar em nosso
ClientDataSet, mas nós ainda não estamos mandando ao servidor. Nós precisamos
adicionar alguns códigos para atualizar o ClientDataSet e adicionar os dados do banco
de dados. Agora vamos mandar as informações ao servidor de banco de dados, para isso
nós devemos checar a propriedade ChangeCount do ClientDataSet.

Vamos adicionar um componente Button em nosso formulário:

116

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
No evento OnDataChange do componente Datasource vamos escrever o código a baixo
para desativarmos o botão enquanto não houver modificações no ClientDataSet:

btnApplyUpdates.Enabled := clntdtstSales.ChangeCount > 0;

No evento OnClick do botão coloque o código a seguir para realizarmos a atualização


ao servidor de banco de dados:

clntdtstSales.ApplyUpdates(-1);

Agora na propriedade FileName do componente ClientDataSet coloque “Sales.cds” e


execute sua aplicação e edita o DBGrid.

SQLDataSet

Salve este projeto em um novo diretório com o nome de Case3.dpr. Remova o


componente SQLTable. Coloque um componente SQLDataSet com o nome de
sqldtstSales.

Nas propriedades do SQLDataSet configure seus DataSource e SQLConnection e edita


CommmandText como:

Select * from SALES

117

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E na propriedade do DataSetProvider coloque o Dataset com o SQLDataSet. Em
seguida execute a aplicação e edite os dados do grid.

118

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Conferindo erros do servidor

Quando você estiver editando e realizando update no banco de dados poderão surgir
erros que o servidor não permite. Vamos agora criar um formulário que reporte o erro e
possibilite a correção em tempo de execução evitando assim erro ao mudar ou adicionar
os dados na tabela.

Salve seu projeto em um novo diretório com o nome de Case4.dpr. Vá ao menu do


Delphi File | New | Other e escolha a pasta Dialogs a opção “Reconcile Error Dialog” e
salve como FormReconcile.pas.

No evento OnReconcilleError do componente ClientDataSet coloque o seguinte código:

Action := HandleReconcileError(DataSet, UpdateKind, E);

Você precisa adicionar o FormReconcile a clausula uses de FromCDS:

implementation

{$R *.dfm}

uses

FormReconcile;

Assim você terá sempre os avisos de erro do servidor e poderá corrigir alterando os
valores, evitando assim erros do sistema.

119

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
120

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Técnicas de Interface de usuários 1

Aqui vamos ver:

Como criar um Splash Screen


Como criar aplicações SDI
Melhor forma de destruir formulários
Controlar os cursores de mouse
Hints

O Delphi é bastante rico para desenvolvermos nossas interfaces, neste capítulo e no


próximo irei apresentar algumas das mais importantes técnicas de interface que você
poderá adicionar em suas aplicações.

Splash Screen

A primeira técnica de interface que vou demonstrar é a apresentação de um Splash


Screen. O Splash Screen é um formulário que é aberto antes de carregar nossas
aplicações que possuem informações tanto do sistema quanto da empresa ou
profissional que desenvolvel a aplicação, como se fosse uma abertura. Esta abertura tem
dois propósitos. O primeiro, é um aviso ao usuário que sua aplicação está sendo
iniciada. Segundo para que o usuário aguarde enquanto sua aplicação está sendo
carregada.

Para criar um Splash Screen no Delphi, primeiro criamos um formulário com


informações (imagens, textos e copyright). Depois definimos a propriedade BorderIcons
do Form como vazio e a propriedade BorderStyle como bsNone. No formulário você
pode colocar o que quiser, neste eu coloquei desta forma:

O Splash Screen deve ser colocado no projeto DPR do formulário principal da


aplicação. Você deverá escrever o seguinte código:

121

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
begin

Application.Initialize;

frmSplash := TfrmSplash.Create(Application);

frmSplash.Show;

frmSplash.Refresh;

Application.CreateForm(TfrmMain, frmMain);

Application.CreateForm(TfrmSplash, frmSplash);

frmSplash.Free;

Application.Run;

end.

Assim teremos o Splash Screen sendo apresentado enquanto são carregados os Form e
bancos de dados de nossas aplicações.

Criando e liberando Formulários

A técnica apresentada agora é um meio de deixar nossas aplicações mais rápidas.


Imagine o usuário ter que carregar todos os formulários e bancos de dados de uma
aplicação sempre que ela for iniciada. Isto sem contar que com o tempo os bancos de
dados ficariam muito carregados com a quantidade de informações que estaria
carregado. Imagine seu cliente abrir o sistema, ter que carregar tudo para acessar
somente a base de dados de cliente. Quanto tempo ele irá perder abrindo a aplicação.

O método que vou apresentar, servirá para que o sistema carregue mais rápido e que o
sistema carregue somente o que o usuário irá utilizar gastando assim menos memória e
tempo na máquina do cliente deixando nossas aplicações mais rápidas.

Na lista do DPR inicial, isto em nossa aplicação, vamos deixar somente desta forma:

122

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Observe que eliminei todas chamadas de criação dos outros formulários e bancos de
dados, deixando somente a abertura de nosso Splash Screen e a criação do formulário
principal de nossa aplicação.

O que vamos fazer agora é, em cada opção do menu para chamada de um novo Form,
realizar a criação dos formulários e dos bancos de dados de cada formulário na hora em
que o usuário abrir. Você poderá estar se perguntando: Mas aí irá demorar sempre para
abrir este formulário. Correto. Mas pense, é melhor o cliente esperar para abrir só o que
ele vai usar do que abrir tudo quando for iniciar o sistema que pode levar muito mais
tempo com o decorrer do uso do sistema.

Lembra que para chamarmos um formulário no menu colocávamos apenas o comando


com o nome do formulário a ser aberto seguido de .Show? Tipo:

FrmCustomer.show;

Como eliminamos a criação de cada um dos formulários no arquivo DPR de


inicialização do sistema, vamos ter que coloca-lo novamente, desta vez no mesmo lugar
onde colocamos o comando citado a cima, devendo ficar assim:

123

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Isso somente no caso do Formulário de Customer. Deve você fazer o mesmo com os
demais formulários, como mostra a ilustração a cima.

Por termos feito isso, e para continuarmos melhorando a velocidade de nosso sistema
em todos os formulários de nossa aplicação devemos destruir a criação do Formulário e
dos bancos de dados para estarmos sempre liberando memória na máquina de nossos
clientes. Até mesmo porque, se não fizermos isto, pode ocorrer o seguinte: sempre que o
usuário fechar o formulário que chamou com nossa aplicação aberta e depois fechar este
formulário ele será fechado na vista de nossos clientes mas não liberará da memória e
quando o usuário for abrir novamente o mesmo formulário estará criando novamente
sempre que for realizando esta operação sendo assim, consumindo sempre mais
memória. Então devemos destruir o formulário com o método caFree para liberar a
memória sempre que os formulários forem sendo fechados.

Por isto em todos formulários de nossa aplicação, no evento OnClose devemos utilizar
do comando: Action := caFree;

124

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Controlando os cursores

Quando mandamos criar nossos formulários e bancos de dados em tempo de execução


pode haver uma demora na abertura do formulário e precisamos informar ao usuário que
é para ele esperar que está sendo executado. Uma forma de comunicar ao usuário que o
formulário está sendo carregado e que é para ele esperar é mudando o cursor do mouse.

Existem diversos tipos de cursores do próprio Windows e do próprio Delphi que


podemos utilizar, a baixo há uma tabela com seus valores e imagens dos cursores que
podemos utilizar em nossas aplicações:

Para mudarmos o cursor precisamos saber seus nomes. O que a aplicação usa sempre é
o crDefaut. Vamos mudar o cursor de crDefaut para crHourglass sempre que o usuário
125

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
for entrar em um novo formulário em nossa aplicação e assim que o formulário e os
bancos de dados forem recarregados retornar ao crDefaut.

Este procedimento vamos realizar em todas chamadas de formulário assim como


fizemos para criar cada um dos formulários. O código será o seguinte:

E assim estará pronto. Talvez você não vá perceber que está funcionando porque talvez
sua aplicação esteja com poucos dados o que torna esta operação muito rápida. Mas
conforme seu banco de dados vá crescendo com certeza isto será muito útil.

126

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Toolbars

Dando continuidade às técnicas de interface, vamos agora colocar atalhos em nossa


aplicação, devendo nossa aplicação ficar assim no final:

Vamos adicionar um componente TooBar da palheta de componentes Win32 em nosso


formulário. Em seguida com o botão direito do mouse vamos criar 5 novos botões sendo
que o ultimo será separado por um separador:

Vamos precisar colocar imagens nestes botões. Para isto coloque um componente
ImageList, também da palheta de componentes Win32, em nosso formulário e vamos
127

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
colocar o nome deste componente como imglstMainMenu. Agora com um duplo clique
sobre este botão vamos definir as imagens de cada um destes – como já apresentei este
componente anteriormente vamos prosseguir. O meu eu coloquei as imagens que tenho
aqui onde meu aplicativo ficou desta forma:

Agora no evento OnClick de cada um destes botões coloque as ligações que deseja para
cada um deles. Aqui eu coloquei as ligações como: Botão 1 para Customers, Botão 2
para Orders, Botão 3 para Parts, Botão 4 para Suppliers e botão 5 ainda não coloquei
nada.

128

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Hints

Podemos agora colocar Hints em cada um destes botões. Hints são pequenas ajudas que
auxiliam o usuário na navegação de uma aplicação, são mensagens que informam a
utilidade de um botão.

Nas propriedades de todos tipos de botões existem os Hints, basta escrever em cada um
o que quer que seja mostrado ao usuário para o guiar. E definir a propriedade ShowHint
para True.

129

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Técnicas de Interface II

Neste capítulo veremos:

Como criar aplicações MDI


A distinção entre fsMDIForm e fsMDIChild
Como controlar as instancias
Como implementar o Windows Window Menu

Aplicações MDI

Até o momento aprendemos desenvolver aplicações SDI e MDI. Agora vou ensinar a
deixar sua aplicação somente como MDI. O MDI é legal que dá uma aparência mais
confortável aos usuário que podem abrir várias telas e visualizar todas sem nenhuma ou
pouca dificuldade.

A propriedade FormStyle

Para definirmos nossas aplicações como MDI devemos utilizar a propriedade


FormStyle. O normal é a propriedade fsNormal que cria aplicações SDI – o que fizemos
o tempo todo. Para mudarmos nossas aplicações para MDI devemos mudar para
fsMDIForm ou fsMDIChild em todos os formulários no método Show.

fsMDIForm

O estilo fsMDIForm cria janelas MDI pais. É muito importante saber sobre isso.
Primeiro que não são todos formulários que são definidos como fsMDIForm. Devemos
sempre definir o formulário principal como fsMDIForm porque assim as janelas filhas
não irão sobrepor o menu nem os botões da ToolBar criados quand as janelas filhas
forem maximizadas.

fsMDIChild

O fsMDIChild é a janela filha de fsMDIForm, ou seja, fsMDIChild é dependente de


fsMDIForm. Devemos respeitar sempre esta regra. Em nossa aplicação devemos então
agora definir a propriedade FormStyle de nosso formulário principal como fsMDIForm
e os formulários restantes como fsMDIChild.

Fazendo isto podemos até eliminar o método Show para chamarmos nossos formulários.
Veja o exemplo a baixo que eliminamos o método Show e deixamos somente
frmSuppliers := TfrmSuppliers.Create( Application );

130

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Window Menu

Agora vamos colocar controles para nossa aplicação MDI que facilitem ao usuário sua
organização automática. O Windows menu possui opções típicas como title, cascate,
minimize all e arrange icons para os formulários filhos. Agora nós vamos utilizar o
componente TactionList.

Action Lists

Action List faz a localização para responder aos comandos do usuário, acionados pelo
clique do mouse, para os objetos do menu. O componente ActionList é usado para
definirmos uma lista de ações (TAction). Então coloque o componente ActionList em
nosso formulário principal e vamos dar um duplo clique sobre ele:

131

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Nós agora temos que adicionar ações para o ActionList selecionando New Standard
Action na botão toolbar, como mostra a figura:

Esta é uma caixa de dialog com uma lista de ações para escolhermos ao formulário:

132

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Vamos selecionar as ações de Window. Agora acabamos de criar as ações para as
escolhas do menu Window.

Podemos agora selecionar cada um destas opções de ações e definir diversas


propriedades em nosso Object Inspector para cada uma destas opções, deixarei livre
para que você explore estas propriedades uma vez que você já possui conhecimentos
para isto:

133

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora você deve editar novamente o menu e colocar as ações correspondentes para cada
uma das opções, na propriedade Action do Object Inspector para cada opção de menu:

Depois que você fizer estas ligações todas modificações realizadas serão atualizadas no
formulário:

134

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Assim, quando você for executar a sua aplicação abra diversos formulários e explore as
opções do menu Window.

Agora vamos criar uma opção para fechar todos os formulários de uma vez quando o
usuário assim o desejar, crie a opção Close All no menu:

135

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Agora precisamos criar uma ação no ActionList para fecharmos todas janelas filhas que
poderão ser abertas pelo usuário. Vamos precisar criar uma nova ação no editor de ação
do componente ActionList:

Com o nome de actnCloseAll:

Agora vamos colocar no evento OnExecute desta ação o seguinte código:

136

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida faça a ligação desta ação nas propriedades do Menu da opção Close All
Criada, com isto o usuário poderá fechar todas janelas abertas por ele automaticamente
e tudo de uma única vez. Mas para concretizarmos tudo isto sem erros devemos ainda
colocar o seguinte código no evento OnUpdate da ação criada:

137

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para finalizar este capítulo temos que tomar cuidados com o seguinte. O usuário não
pode fechar a aplicação toda se tiver com algum formulário aberto dentro da aplicação,
porque os formulários não foram destruídos, portanto precisam ser destruídos para que
libere memória ao computador do usuário. Então precisamos criar uma mensagem para
que o usuário feche primeiro os formulários abertos para poder sair da aplicação.

Para isso no evento OnCloseQuery do formulário principal escreva o seguinte código:

138

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida rode sua aplicação abrindo diversos formulários e tente fechar sua aplicação
com os formulários abertos que deverá aparecer a mensagem: 'Cannot close application
while child windows are open'. E assim encerramos este capítulo.

139

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Introdução ao Rave Report

A partir da versão 7 do Delphi o QuickReport deixa de existir para dar lugar ao Rave
Report.

Com o Rave Report o desenvolvedor pode criar e visualizar relatórios, como era no
QuickReport, mas o rave permite tanto CLX quanto VCL (plataformas Linux e
Windows).

O primeiro componente da palheta Rave é o TRvProject. Este controla a impressão e


visualização dos relatórios.

É com este componente que você irá trabalhar para criar o visual do seu relatório.

O Componente TRvSystem é um componente fundamental para integração e


funcionalidade de um pré-visualizacão antes da impressão. É este componente que
manda o relatório para impressão ou visualização. É com este componente que se faz a
ligação entre os componentes TRvNDRPreview, TRvNDRPrinter e TRvNDRWriter
todos fáceis de se usar.

O Componente TRvNDRWriter é usado em conjunto com os componentes


TRvNDRPreview e TRvNDRPrinter.

Os próximos 4 componentes da lista são: TrvCustomConnection,


TRvDataSetConnection, TRVTableConection e TRvQueryConection que são utilizados
para realizar conexão a banco de dados para geração dos relatórios. Onde temos:

- TrvCustomConnection - Este componente realiza a conexão tradicional em seu


danco de dados.

- TrvDataSetConnection - Seta o acesso ao banco de dados.

- TRVTableConection - Implementa a conexão ao banco de dados.

- TrvQueryConection - Faz conexão como se fosse um Querie.

Os próximos 2 componentes são:

- TrvRenderPreview - Componente que realiza os controles do preview.

- TrvRenderPreview - Componente que realiza a administração (funcionamento) do


preview.
140

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Os quatro últimos componentes são:

- TRvRenderPDF - cria seus relatórios em formato de PDF.

- TRvRenderHTML - gera seus relatórios em HTML.

- TRvRenderRTF - Geral seus relatórios no formato Rich-Text.

- TRvRenderTEXT - Gera seus relatórios em formato de texto (ASCII).

Criando Relatórios visuais com o Rave

Podemos criar relatórios de forma visual com sua ferramenta. Assim criamos relatórios
dinâmicos sem utilizar comandos.

Neste exemplo vamos iniciar uma nova aplicação. Em seguida vamos adicionar um
componente ClientDataSet da palheta de componentes Data Access ao formulário, com
a propriedade Name como clntDataLocal e a propriedade FileName como customer.xml
e colocar a propriedade Active para True.

Localize o componente RvDataSetConnection na palheta de componentes Rave e


coloque em seu formulário com as seguintes propriedades:

Name = rvDataSetLocal

DataSet = clntDataLocal

Agora para finalizar a conexão de componentes adicione o componente RvProject no


formulário para iniciarmos o desenvolvimento de nosso relatório exemplo.

Clique com o botão direito sobre este componente e escolha a opção Rave Visual
Designer:

141

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Este é o editor visual de relatórios do Rave:

Criar relatórios com o Rave é muito fácil. Uma vez dentro do editor do Rave vá ao
menu do Rave em File | New Data Object.

142

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Com o Rave suporta diversos tipos de relacionamentos com dados, vamos especificar
um tipo de dados que queremos criar.

Selecione Direct Data View e prossione o botão de Next. Em seguida você deverá
especificar que tipo de conexão deseja realizar, é neste que definimos nosso
componente do tipo rvDataSetLocal.

Nos é apresentado no canto direito da tela os campos desta conexão:

143

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Esta lista de campos está localizado em uma Tree View, na opção Data View
Dictionary.

Assim podemos começar a desenvolver nossos relatórios. Vamos utilizar neste exemplo
Wizard para a construção de nosso relatório exemplo. Para isso vá ao menu do Rave
Tools | Report Wizards | Simple Table:

144

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Será apresentado a caixa de diálogo como mostra a figura a cima, com nosso
DataView1 definido então clique em Next. Nesta próxima caixa de diálogos escolhemos
quais campos deverão ser apresentado ao nosso relatório, que você poderá marcar ou
desmarcar:

Ao clicarmos em Next será apresentado os campos selecionados com a possibilidade de


alterar suas ordens para apresentação do relatório.

145

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Clicando no botão Next é apresentado uma caixa de diálogo que mostra e permite a
criação do Título, ou não, do relatório:

Clicando em Next você pode alterar os tipos de fontes do relatório:

146

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Depois de alterado os tipos de fonte do relatório clicando no botão Generate você terá
seu relatório pronto e poderá até fazer modificações utilizando as ferramentas de edição
do Rave.

147

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para vermos se nosso relatório está realmente correto podemos executar pelo próprio
Rave, para isto vá ao menu File | Execute Report, deverá ser apresentado esta tela:

Nesta opção você pode imprimir, gerar uma pré-visualização ou gerar um arquivo.
Selecione o Preview pois iremos apenas visualizar nosso relatório, deverá ser
apresentado um preview que você poderá ver como ficou seu relatório.

Quando você gera seu relatório em Rave, são criadas propriedades exclusivas do mesmo
e você precisa salvar todas estas características. Todos relatórios Rave possuem a
extensão .rav. Tanto para alterar futuramente seus projetos de relatórios quanto para
enviar aos clientes você precisa enviar estes arquivos .rav quando for distriubuir suas
aplicações.

Gerando o Relatório no Delphi

Depois que você criou o design de seu relatório e o salvou, a forma de chamar no
Delphi é muito fácil.

Vamos adicionar com componente Button ao formulário e no evento OnClick do botão


escrever o seguinte código:

148

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
TDataSets Avançado

Processando Transações

Temos agora a seguinte situação. Atualmente quando o usuário faz alguma modificação
ao em algum registro do banco de dados este registro é alterado na hora ou quando se
começa a fazer alguma alteração não tem como voltar atrás. Precisamos permitir ao
usuário poder definir se aquela mudança que ele fez no registro é o que realmente quer e
dar a possibilidade de voltar atrás. Neste tipo de operação é necessário utilizar controles
de transação aos métodos dos objetos de banco de dados. As transações são obrigadas a
iniciar no evento BeforeEdit com o método StartTransaction. É preferível segurar todas
modificações para o banco de dados até que o método Commit seja usado, escrevendo
todas mudanças no banco de dados ou o método Rollback para modificações pendentes.

Multi-Dataset Updates com Transações

Vamos abrir o formulário de Supplier – que já foi criado anteriormente neste


treinamento – para podermos incorporar as mudanças para a realização das transações.
O formulário Supplier tem uma relação entre a tabela Supplier e a tabela Inventory.

Vamos colocar no evento BeforeEdit do componente tblSupplier o código a seguir, que


possibilita iniciar a transação:

Devemos agora criar um evento para aceitar a transação quando o usuário quiser salvar
o que foi realizado, utilizando o método Commit. Para isso no evento AfterPost do
mesmo componente iremos colocar o seguinte código:

Caso o usuário deseja cancelar as mudanças precisamos cancelar a transação com o


método rollback que não salva as informações na tabela e em seguida devemos utilizar o
149

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
método refresh para voltar as informações anteriores ao usuário apagando as alterações
por ele canceladas. Então devemos colocar no evento AfterCancel do componente o
seguinte código:

Cached Updates

O Cached Updates é utilizado para que possamos habilitar ao usuário diversas


possibilidades para edição de registros ou tabelas, realizando assim transações
explicitas. Com isto o Delphi checa se o registro – ou registros – foram feitos e se não
os atualizam.

O Dataset possui três métodos e uma propriedade para implementar o Cached Updates.
A propriedade CachedUpdate é preciso estar como True para que todos os métodos
tenham efeitos. Então, se o usuário desejar sempre salvar, todas mudanças precisam do
método ApplyUpdate. Se o usuário desejar não salvar todas mudanças, o método
CancelUpdates deve ser executado para voltar ao que era anteriormente. Se o usuário,
no meio de sua edição quiser voltar ao que era anteriormente aquele campo em que ele
estava editando, temos que utilizar o método RevertRecord. Neste caso, todos edits que
o usuário estiver alterando voltara ao que era.

Multi-Dataset Updates com Cached Updates

Componentes TDatabase também possuem o método ApplyUpdates.

150

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em nosso exemplo vamos usar na tabela pai o evento AfterPost para criar uma
transação e escrever todas pendências de atualização em ambas tabelas pais e filhas.
Porém, neste exemplo o método AfterPost não será usado. A razão para isto é que com
o método Post é chamado para os Dataset (qryOrders) pai, e automaticamente atualiza
as tabelas filhas (qryLineItems). Para isto vamos criar um novo SpeedButton em nosso
formulário para postar as mudanças.

No Datamodule, vamos mudar ambos objetos query para usar o cached updates. No
formulário adicione um componente SpeedButton com a propriedade name como
spdbtnAppluUpdates e mude a propriedade VisibleButtons do DBNavigator para que o
botão Post não seja apresentado. No evento OnClick do SpeedButton escreva o seguinte
código:

Neste exemplo, o evento AfterCancel é usado para jogar fora todas mudanças de um
Query. Para cancelarmos mudanças devemos, no evento AfterCancel do componente,
escrever o seguinte código:

151

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Usando Componentes TUpdateSQL

Podemos fazer atualizações também com comandos SQL utilizando o componente


TUpdateSQL.

Você terá com este componente três possibilidades: InsertSQL, DeleteSQL e


ModifySQL. Onde você pode respectivamente: Inserir, deletar e modificar dados de
TQuerys que serão voltados para o servidor. Para utilizar estas opções do componente
TUpdateSQL, para a propriedade das Querys, CachedUpdates como True e RequestLive
para false.

Vamos ver mais na prática. Usando o formulário Orders, vamos mudar a propriedade
ResquestLive para False dos componentes qryOrders e qryLineItems.

Vamos agora adicionar dois componentes UpdateSQL com nosso DataModule com as
propriedades Name como updtsqlOrders e updtsqlLineItems:

Veja que nas propriedades do componente UpdateSQL podemos escrever os códigos de


SQL para cada item: DeleteSQL, InsertSQL e ModifySQL:

152

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Na janela a baixo é mostrado o editor onde podemos escrever as instruções em SQL
para estas três propriedades:

Dando um duplo clique sobre o componente UpdateSQL teremos a seguinte caixa de


diálogos, que gera os códigos em SQL, como não é nosso objetivo ensinar SQL neste
treinamento, vamos aprender como utilizar esta caixa:

153

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Por enquanto não temos nada nesta caixa de diálogos pois precisamos fazer a ligação
dos componentes UpdateSQL com os componentes Query, para isso basta setar, na
propriedade UpdateObject dos Querys seus respectivos componentes UpdateSQL:

Assim, se você novamente realizar um duplo clique sobre o componente UpdateSQL


encontrará a caixa de diálogos assim:

154

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Temos quatro botões:

Get Table Fields – Pega todos campos da tabela

Dataset Defalts – pega os campos que estão dispostos no formulário.

Select Primary Keys – Seleciona chave primária

Generate SQL – Gera rotina SQL automática para você.

Como este curso não ensina SQL você deverá sempre utilizar o botão Generate SQL
para criar seus ModifySQL, InsertSQL e DeleteSQL.

Observe que clicando sobre o botão Generate SQL você gera seus códigos
automaticamente já para os três items.

155

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
156

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
157

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Packages

Package é uma DLL (dynamic-link library) que inclui os códigos de um sistema. Os


packages podem ser usados tanto em tempo de execução, quanto em tempo de design de
nossos sistemas. Neste capítulo irei demonstrar como criar, distribuir e instalar packages
no Delphi.

Podemos entender como packages, também, como se fosse um componente. Vamos


entender as diferenças entre Packages em tempo de execução e em tempo de design.

Packages em tempo de execução

Temos algumas vantagens em trabalhar com packages em tempo de execução:

O compilador constrói sua aplicação mais rápido.


Sua aplicação é carregada mais rápida.
Reduz o espaço em disco rígido requerido.
Você pode utilizar em diversos sistemas desenvolvidos por você, e sempre que
você alterar alguma coisa no sistema é alterados em todos seus sistemas e você
precisa enviar ao cliente somente a package alterada.
Deixa seu executável menor.

Mas sempre que você criar packages em tempo de execução é necessário levar estas aos
seus clientes. Um package não acompanha os fontes.

Packages em tempo de Design

Packages em tempo de design é utilizado somente quando você está desenvolvendo suas
aplicações. Não vou detalhar muito ainda pois veremos com maior clareza com a
criação de exemplos.

Criação de Package

Para criar uma package, vá ao Menu File | New. Em seguida escolha “Package” da pasta
“New Items”, deverá aparecer uma caixa de diálogos como esta:

158

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
A janela de edição de Package é usado para administrar packages. Esta interface nos
permite adicionar ou remover units de um package, construir a package, configurar as
opções do package, administrar dependências e instalar um package.

Para salvar um package clique na opção Save.

O Delphi pedirá um nome para o arquivo de projeto (.DPK). Este deverá ser o nome do
package que será criado.

Adicionando componentes

Nós vamos ver primeiro como adicionar componentes que já existem no package. Para
adicionar um componente para um package, precisamos então adicionar. Clique no
botão Add no editor de Package.

159

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Temos as seguintes páginas nesta tela:

Add Unit – Onde podemos adicionar a unit que será nosso Package.

New Component – Onde podemos criar novo componente Package.

Import ActiveX – Que podemos importar controles ActiveX para nossas aplicações.

Utilizando componentes ActiveX

Diversas aplicações que temos em nossos computadores possuem controles ActiveX. E


podemos “pegar emprestado” estes controles para implementar nossas aplicações. No
Delphi 7 por exemplo já existe um componente para rodar arquivos do Flash (.SWF)
porém no Delphi 6 não existe componente, mas podemos utilizar componentes ActiveX
do Flash para termos este componente no Delphi 6.

Geralmente existe uma lista de todos componentes ActiveX instalados em nosso


computador na pasta Import ActiveX, bastando escolher o que deseja instalar e clicando
em seguida sobre o botão Add.

160

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Adicionando Dependências (Requires)

Como já dito, um package pode depender de outros packages para que seja executado,
são os Requires. Selecione a pasta requires do nosso editor de Package:

Em seguida clique sobre o botão Add:

161

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
É nesta opção que adicionamos os Packages que poderão ser exigidos pelo packages
que você possa vir instalar.

Instalando Packages

Podemos instalar packages no menu Component | Install Package que abrirá a janela
Project Option from Package:

Que podemos adicionar, remover e editar packages.

162

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Instalando componentes

Podemos também instalar novos componentes ao Delphi, no menu Component | Install


Component, que abrirá a caixa de diálogos “Install Component”:

Na aba “Into existing package” você pode instalar a unit e/ou package do componente
que deseja instalar.

163

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Um exemplo prático

Como discutido anteriormente, packages em tempo de execução são pequenas partes de


código que uma aplicação pode executar. Com isto podemos desenvolver múltiplas
aplicações com um mesmo pacote deixando nossos executáveis menores.

Para entender melhor esta questão imagine o seguinte: Você tem um sistema que é
dividido por módulos, estoque, clientes, caixa, bancário e outros. Você pode criar um
package para cada um destes módulos.

Vamos ver por outro aspecto também, suponha-se que você trabalha com uma equipe de
desenvolvedores e cada um é responsável por cada um destes módulos e para distribuir
para que outros desenvolvedores aproveitem estes módulos em suas aplicações você
precisa só criar um package para isto.

Para criar um novo package baseado em nosso exemplo principal, nós vamos precisar
criar uma nova package. Vamos chamar esta package de “pkgDataOrderEntry.dpk”.
Uma vez criado, vamos adicionar a unit DataMain.pas em nosso editor de Package:

Uma vez adicionado, vamos compilar a package. Por padrão, o arquivo DCP é gerado
em um diretório padrão. Este diretório mode ser mudado nas opções do Package na
pasta Directories/Conditionals. Os outros arquivos gerados deverão ficar no diretório
corrente.

Nós vamos agora remover a unit DataMain de nosso projeto. Para isto abra o project
manager e com o botão direito do mouse sobre a unit DataMain escolha a opção
Remove From Project.

164

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Nós removemos o datamodule de nosso projeto, nós então removemos o datamodule.
Então, nós precisamos criar a conexão de volta a este datamodule para que nosso
sistema funcione novamente realizando a conexão com os bancos de dados deste
datamodule. Precisamos fazer a chamada deste para podermos utilizar em nossa
aplicação. Portanto no evento OnCreate do formulário principal de nossa aplicação
precisamos colocar o seguinte código:

dtmdlMain := TdtmdlMain.Create(Application);

Devemos também fazer uma referencia a unit DataMain a cláusula Uses do formulário.

E assim nosso sistema volta a funcionar com seu executável menor e com a package em
tempo de execução.

165

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Opções de distribuição usando Packages

Quando você for distribuir sua aplicação é necessário que o Package criado vá junto a
sua aplicação, para isto você deve definir no Delphi a sua package libary (.BLP). Em
“Project Option” (vá ao menu do Delphi Project | Option...) na pasta Packages.

Habilite a opção “Build with runtime packages” para habilitar o botão Add:

166

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Você também poderá mexer nos arquivos DCU que sua aplicação exige, não aconselho
mexer nestes arquivos. Clique direto no botão Add:

Clique então no botão Browse para indicar o arquivo .BPL que criamos:

167

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E assim está pronto. Você pode compilar sua aplicação e verificar o tamanho do seu
executável antes e depois de realizarmos todos estes processos e você verá que seu
executável ficou menor. O que possibilita uma maior rapidez as suas aplicações.

168

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Threading

Introdução

Neste módulo nós vamos discutir como criar e manipular objetos thread em Object
Pascal.

Para entender o que um thread é, nós precisamos primeiro entender como é seu
processo.

Quando executamos uma aplicação no Windows é chamado um processo. Quando o


Windows carrega um programa, um processo é criado. O processo consiste de um
endereço de espaço virtual, código, dados e outras operações de recursos de sistema. Ou
seja, todas aplicações executadas no Windows possui ao menos um thread.

Um processo pode conter mais de um Thread. A partir do Windows 95 foi possível a


utilização de diversos Threads.

O Thread permite que o sistema realize várias tarefas ao mesmo tempo. Por isso
podemos hoje abrir diversos programas no Windows que não há problemas, isso porque
os Threads permitem que a cada milésimo de segundos seja realizado uma operação de
cada vez sem que o usuário perceba e quando mais rápido o computador menos será
visível ao usuário.

Utilidade para aplicações Muilti-Thread

Pelo motivo de VCL e outras restições, você é obrigado a ter cuidado ao decidir quais
objetos você precisa criar Thread. Em nossa aplicação nós vamos agora criar um thread
para executar query para atualizar dados em um database. Isso porque dependendo da
quantidade de informações e processos que esta atualização pode realizar pode, com
certeza demorar e precisamos permitir que o usuário realize outras operações enquanto é
realizado estes processos, criando Thread.

VCL e Segurança ao usar Thread

Em uma aplicação Delphi, você não deve usar operações thread todo tempo. É preciso
tomar algumas precauções em certas situações. Por exemplo, os VCL não são seguros
para se utilizar thread. O uso de thread em aplicações VCL podem causar diversos erros
de corrupção porque não é seguro sua utilização e pode deixar suas aplicações muito
lentas. A razão para esta lentidão é que VCL não foi desenvolvido pensado-se somente
no Windows mas também no Linux, que não possui as mesmas características do
Windows.

169

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Criando Objetos Thread

Vamos criar um novo objeto thread pelo menu do Delphi File | New... | Threads
Objects. E vamos chamar a “Class Name” de TmonthEndProcThread.

A Classe TThread

Em seguida será criado automaticamente o código fonte necessário para o nosso


exemplo. Observe em especial o método Execute:

170

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
O método Execute contém o código que você precisa para executar enquanto o thread
começa.

Em nosso exemplo, nós vamos usar Thread para atualizar a tabela Customer. Para isso,
vamos precisar que no fim do mês nós ajustamos o campo Account_Balance de
Customer uma ajustação mensal na porcentagem para uma especifica nação (país).
Neste exemplo então vamos adicionar um componente SpeedButton ao formulário de
Customer, com a propriedade Name como spdbtnMonth e no evento OnClick do botão
escreva o código a seguir:

171

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Neste código a cima, se o usuário responder que sim, “yes”, aparece a mensagem e a
thread é criada e o parâmetro CreateSuspender é setada para True. Lembre-se, se o
parâmetro CreateSuspend é True (Verdadeiro), o método Execute da Thread criada é
chamada.

Bem, devemos agora antes de testar colocar um novo componente querie com o nome
de qryMonthEnd em sua propriedade.

Agora mude o código de sua Thread como mostra o código a seguir:

172

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
173

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
174

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
175

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Aqui no método Execute nós checamos a propriedade de qryMontEnd está configurada
corretamente. Se estas propriedades não estão configuradas mostra a mensagem. Se as
propriedades estão todas configuradas continua a operação. Neste caso, é continuado
utilizando três procedures: GetNations, GenerateUpdateQuery e ApplyMonthEnd.

A procedure GetNations é usado para pegar uma lista de todas nações em uso para
nossa tabela Customer..

176

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Então ele seta na propriedade SQL de qryMonthEnd o código SQL:

select distinct Nation from Customer

O resultado deste código é usado no TstringList, com o nome de strnglstNations, e então


o qryMonthEnd é fechado.

Com isto temos a lista de nações, nós vamos atualizar o campo account balance da
tabela Customer. Para isso, nós primeiro temos que criar os códigos para realizar este
update. A procedure GenerateUpdateQuery tem este propósito:

177

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
A Query a cima tem dois parâmetros: Fee e Nation. A procedure UpdateNation verifica
estes parâmetros depois que a query é executada. A procedures ApplyMonthEnd chama
a procedure UpdateNation em um loop. Basicamente, para todas nações na
strnglstNation, Isto para executarmos o código SQL para os corretas Nation e Fee.

A função MonthEndFee é usado na procedure UpdateNation para determinar o


parâmetro Fee usado em cada nação:

Assim quando você executar a aplicação e mandar realizar esta atualização você poderá
facilmente mover ou fazer qualquer outra coisa enquanto é executado esta atualização.

178

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Criando componentes em tempo de execução

O Delphi permite que você crie componentes em tempo de execução, assim como em
tempo de design. Todo componente que você coloca no formulário é criado em tempo
de design, todo o componente que você coloca no formulário que você não tenha
colocado no formulário quando desenvolveu em tempo de design é em run-time (tempo
real). O Delphi permite que você crie componentes dinamicamente se desejar. Neste
capítulo vamos ilustrar com alguns exemplos pequenos sobre como fazer isto e um
exemplo que cria componentes em tempo de execução conforme for a condição.

Testando componentes depois de instalados

Componentes tem essencialmente duas interfaces: Interface de desenvolvimento (ou


design) e interface de aplicações em tempo real (enquanto a aplicação é rodada). No
decorrer deste capítulo você aprenderá a criar componentes em run-time (Tempo de
execução).

Criando componentes em Tempo de Execução

Para que você entenda melhor este assunto vamos explicar na prática as teorias. Observe
a sintaxe que precisaríamos para criar um componente Timer em tempo de execução:

TmrClock := TTimer.Create( self );

Onde temos:

TmrClock seria a propriedade Name do componente Timer.

:= TTimer.Create( self ); que informa que o TmrClock é o componente Ttimer e manda


criar este componente e self é o parâmetro usado para definir que este é um objeto a ser
criado.

Sempre vamos utilizar self quando quisermos criar nossos componentes em tempo de
execução.

Vamos nos aprofundar ainda mais.

Para componentes não visuais (como o componente Timer) você precisa somente
chamar o construtor. Porém para componentes visuais (como um componente de botão)
você precisa definir a propriedade pai7 (Parent).

7
Propriedade pai – Por exemplo, se você colocar um componente Panel em seu formulário ele será o pai
de todos outros componentes que forem anexados a ele, que serão os filhos do Panel. Assim como o pai
do Panel é o formulário.
179

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Para criar um componente é preciso que você defina suas propriedades (é opcional
definir a propriedade pai) no código. Em um novo formulário coloque um componente
Panel com as propriedades:

Name = pnlContainer e Align = alClient.

No evento OnCreate do formulário escreva o seguinte código:

180

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Esta figura mostra nossa aplicação sendo rodada:

Muito bem, criamos o botão, agora precisamos determinar alguma função para ele pois
por enquanto só está sendo apresentado em nosso formulário. Como é um botão que é

181

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
criado em tempo de execução, não o Object Inspector para mudarmos suas propriedade
e eventos, então devemos continuar escrevendo código para ele.

Primeiro criamos o evento OnClick para o botão, declarando como público:

Em seguida adicionamos o comando a baixo para definirmos que o evento OnClick do


botão será esta variável publica que foi criada:

OnClick := ButtonClick

182

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Em seguida criamos a rotina para o evento OnClick do botão criado até agora:

Se rodarmos nossa aplicação, além de ser mostrado o componente se você clicar sobre o
botão será apresentado a mensagem:

Assim você criou sua primeira aplicação com componentes em run-time. Vamos agora
evoluir um pouco mais em nossos estudos e vamos aplicar isto a banco de dados.

Imagine a seguinte situação: Você precisa criar um formulário que mostre somente os
países cadastrados em um banco de dados, sendo estes países botões e você não sabe

183

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
quais paises existem nos bancos de dados, e listar uma somatória referente a cada um
dos países que será selecionado pelo usuário em tempo de execução. Como você não
sabe quais países existem cadastrados – e nem te interessa saber – você tem que criar
em tempo de execução botões que representem estes países e a cada clique em um
destes botões deverá ser apresentado um relatório das somatórias de cada pais.

Para exemplificar, vamos agora criar este exemplo em um novo formulário, com botões
que representem os países cadastrados na tabela de customer. O grid a esquerda lista as
nações achadas na tabela de customer com um total, assim:

Para montar este exemplo você irá adicionar um componente ScrollBox com as
propriedades: Name = scrlbxButtons e Align = alLeft.

Colocar um componente Panel, com a propriedade Align = alClient.

Um componente DBNavigator com a propriedade Align = alTop.

Um componente DBGrid com a propriedade Align = alClient.

Em seguida você deve adicionar dois componentes Query, sendo o primeiro com o
nome de qryNations, a propriedade DatabaseName definir o nosso Alias padrão e na
caixa de edição da propriedade SQL deste componente escrever a seguinte sintaxe:

184

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Nesta sintaxe em SQL estou pedindo que selecione as nações sem repetição de nome da
tabela customer em ordem alfabética.

O segundo componente Query com o nome de qryTotals, a propriedade DatabaseName


definir o nosso Alias padrão e na caixa de edição da propriedade SQL deste componente
escrever a seguinte sintaxe:

Nesta sintaxe em SQL estou pedindo que faça uma somatória geral do campo
Total_Price de cada nação.

Em seguida adicione um componente DataSource e defina a propriedade DataSet deste


componente para qryTotals.

185

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
Na propriedade DataSource dos componentes DBGrid e DBNavigator defina o nosso
DataSource.

No evento OnCreate do formulário coloque a seguinte sintaxe:

Lembro que você deve definir a cláusula uses e a variável publica para habilitar o
evento OnClick de cada componente de botão que será criado:

186

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E antes da procedure que cria os botões é necessário também definir as variáveis de
localização dos botões para que a rotina funcione perfeitamente.

Agora precisamos criar os eventos OnClick de cada um dos botões, escrevendo em


seguida:

187

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br
E assim temos nossa aplicação pronta.

188

Ramos da Informática – Todos direitos reservados.


www.ramosdainformatica.com.br