Vous êtes sur la page 1sur 46

PRÁTICAS DE

C++ Builder

Autor:
Leônidas Francisco de Lima Júnior

João Pessoa - Paraíba


Janeiro de 2001
Práticas de C++ Builder

PRÁTICA 1
1. Assunto
Introdução ao C++ Builder e o seu Ambiente Desenvolvimento Integrado (IDE)

2. Tópicos abordados
• O que é o C++ Builder ?
• Outros ambientes semelhantes
• Uma viagem pelo Ambiente de Desenvolvimento Integrado (IDE) do C++ Builder

3. Introdução teórica

3.1. O que é o C++ Builder?

C++ Builder é um ambiente de desenvolvimento para aplicações cliente/servidor


(chamado de front-end) produzido pela Inprise/Borland, tradicional empresa desenvolvera de
compiladores. O C++ Builder utiliza os conceitos de programação visual e dirigida por eventos
para proporcionar uma ferramenta RAD (Rapid Application Development) extremamente
poderosa, que permite desenvolver aplicações eficientes rapidamente. Algumas de suas
características mais marcantes são:
• Uso de uma biblioteca de componentes visuais, a VCL (Visual Components Library),
desenvolvida originalmente para o Delphi, ferramenta produzida pela mesma empresa
com características semelhantes ao C++ Builder, só que utilizando a linguagem Object
Pascal como linguagem base.
• Orientação a objetos: o C++ Builder utiliza a linguagem de programação orientada a
objetos C++, onde se pode utilizar plenamente os conceitos de POO (Programação
Orientada a Objetos) e obter os seus benefícios.
• Possui um excelente ambiente de desenvolvimento (IDE) com ferramentas de
produtividade que auxiliam a programação, além de um ótimo depurador (debugger)
• Ferramentas para desenvolvimento em equipes de programadores e controle de
versões.
• Grande escalabilidade no acesso a banco de dados: pode acessar tabelas locais dBase e
Paradox, assim como SGBDs como Oracle, Informix, Sybase, Microsoft SQL Server e
Interbase

3.2. Outros ambientes semelhantes

Além do C++ Builder, outras ferramentas similares são utilizadas para o desenvolvimento
de aplicações cliente/servidor. Entre elas, as mais conhecidas são: Delphi da própria Inprise,
Visual Basic da Microsoft, PowerBuilder da Sybase e SQL-Windows da Centura.

3.3. Uma viagem pelo Ambiente de Desenvolvimento Integrado (IDE) do C++ Builder

O IDE é composto de um conjunto de elementos integrados, que foram projetados para


proporcionar ferramentas necessárias ao desenvolvimento de aplicações de alto desempenho de
maneira muito rápida. O manual do C++ Builder ressalta o fato desse ambiente ser altamente
intuitivo. Porém, a maioria dos usuários não concordam com isso, e, efetivamente, demanda
algum tempo até que um programador se torne realmente eficiente desenvolvendo aplicações não
triviais. Isso é devido a sua grande complexidade (muito mais abrangente que uma simples
linguagem de programação), necessária para implementar suas funcionalidades.
Programação Básica em C++ Builder 1
Práticas de C++ Builder

Os principais elementos são:


• Formulários (forms): formam a base onde são posicionados os componentes; de
maneira geral pode-se dizer que um formulário é uma janela. Para cada formulário
existe uma Unit (Este termo foi emprestado do ambiente Delphi) correspondente da
linguagem C++, que contem as definições dos componentes (objetos) e tratadores de
eventos. O código em C++ é editado através do editor de código.

• Editor de Código (Code Editor): é um editor de programas poderoso com


características funcionalmente bastante avançadas.

Programação Básica em C++ Builder 2


Práticas de C++ Builder

• Paleta de componentes (Component Palette): componentes são objetos, que se


constituem nos blocos de montagem básicos utilizados para construir uma aplicação
em C++ Builder. Podem ser visíveis, como botões, caixas de listas, imagens, ou não
visíveis, como temporizadores e componentes de acesso a dados. A paleta de
componentes agrupa funcionalmente os componentes em páginas distintas.

• Inspetor de Objetos (Object Inspector): permite customizar facilmente a maneira como


um componente aparece e se comporta em uma aplicação. Manipula as propriedades e
os eventos de um componente através de duas páginas distintas que são selecionadas a
partir de abas posicionadas na sua parte superior. As páginas são divididas em duas
colunas: a da esquerda para o nome da propriedade ou evento; a da direita para o valor
da propriedade ou nome do tratador do evento.

• Barra de Acesso Rápido (SpeedBar): proporciona botões de acesso rápido para as


funções mais freqüentemente utilizadas. Pode ser configurada com as funções
desejadas pelo programador.

Programação Básica em C++ Builder 3


Práticas de C++ Builder

• Gerenciador de Projetos (Project Manager): um projeto é uma coleção de todos os


arquivos que juntos formam uma aplicação em C++ Builder. Alguns desses arquivos
são gerados durante o trabalho do programador em tempo de projeto. Outros são
criados quando o código fonte do projeto é compilado. O Project Manager é utilizado
para abrir, adicionar, salvar e remover arquivos do projeto, além de efetuar algumas
configurações. O Project Manager do C++ Builder permite que sejam gerenciados
vários projetos em grupo.

• Menus de Acesso Rápido(SpeedMenus): o C++ Builder oferece menus de acesso


rápido para comandos mais utilizados em vários locais distintos, como Formulário,
Code Editor, Object Inspector, etc. Os SpeedMenus podem ser ativados através do
botão direito do mouse ou através das teclas Alt + F10.

• Ajuda Instantânea (Online Help): o C++ Builder possui help online para as tarefas
mais comuns no desenvolvimento de aplicações, referência da linguagem C++ e dos
seus componentes básicos. Pode ser acessado através do menu ? (interrogação) ou
pressionando a tecla F1 sobre o item desejado.

Programação Básica em C++ Builder 4


Práticas de C++ Builder

4. Exercícios - Explorando o IDE

Siga as instruções abaixo:

1) Entre no ambiente C++ Builder


2) Clique no botão da direita do mouse sobre o formulário para observar o SpeedMenu
associado
3) Clique na barra de status localizada logo abaixo do formulário para ativar o Editor de Código
com a unit correspondente ao formulário apresentado
4) Observe a estrutura da unit e a declaração do objeto Form1 da classe Tform1. Pressione as
teclas Ctrl+F6 para visualizar o arquivo de cabeçalho com a declaração da classe TForm1.
5) Posicione o cursor sobre a palavra TForm e pressione F1 para ativar o help online. Observe
o conteúdo da ajuda e então retorne ao Editor de Código
6) Para retornar ao formulário clique na sua barra de título (para tornar o formulário a janela
ativa)
7) Para alternar entre formulário e unit associados, existem outras três maneiras: a) através da
opção Toggle Form/Unit no menu View. b) pressionando a tecla F12; c) clicando no
ícone na Barra de Acesso Rápido (SpeedBar). Experimente-as
8) Observe o Object Inspector. Ele possui duas abas na parte superior: uma para selecionar a
página com as propriedades e outra com os eventos do componente. Abaixo da barra de
título, encontra-se o nome do componente selecionado e a sua classe em um espaço
conhecido como caixa combinada (ComboBox)
9) Clique no botão da direita do mouse sobre o Object Inspector para observar o SpeedMenu
associado
10) Clique na aba Events para ver os eventos aos quais o componente formulário pode
responder. Clique na aba Properties para retornar às suas propriedades
11) Mova o apontador do mouse (seta) sobre um dos ícones da SpeedBar. Todos os ícones
possuem uma dica (uma caixa retangular de cor amarela) sobre a sua funcionalidade

Programação Básica em C++ Builder 5


Práticas de C++ Builder

12) Observe a Paleta de Componentes. Ela contém várias páginas onde estão os componentes,
divididos por categoria funcional. O C++ Builder permite customizar o ambiente,
acrescentando novos componentes em novas páginas ou páginas já existentes. A página que
está selecionada é chamada Standard (padrão) que contém componente básicos, como botão,
rótulo, caixa de edição e etc. Os ícones que representam os componentes também possuem
dicas que explicitam seus nomes.
13) Clique na aba Additional para selecionar a página de componentes chamados de adicionais.
Observe as demais páginas também.

14) Crie um novo formulário pressionando o ícone ou pela opção New Form do menu File.
15) Este novo formulário se chama Form2 e está associado a uma unit chamada Unit2. Ative o
editor de código e observe que na borda superior deste editor, agora encontram-se duas abas
(Unit1 e Unit2) utilizadas para selecionar as duas units existentes no projeto
16) Para escolher uma entre as várias units de um projeto pode-se também ativar a janela View
Unit. Isto pode ser feito de três maneiras: a) através da opção Units... do menu View; b)
pressionando as teclas Ctrl + F12; c) clicando no ícone na SpeedBar.
Experimente-as

17) Na janela View Unit pode-se observar outra unit além das duas associadas aos forms, que se
chama Project1. Ela contém o programa principal de uma aplicação C++ Builder, que
basicamente se destina a incluir as units do projeto, criar os forms e executar a aplicação
(ativando o primeiro formulário criado). O programa principal pode ser selecionado também
através da opção Project Source do menu View
18) Para escolher um entre os vários forms de um projeto pode-se ativar a janela View Form.
Isto pode ser feito de três maneiras: a) através da opção Foms... do menu View; b)
pressionando as teclas Shift + F12; c) clicando no ícone na SpeedBar.
Experimente-as

19) Ative o Gerenciador de Projetos, através da opção Project Manager do menu View. Ele
possui várias funções, como já foi visto. Vamos utilizá-lo para excluir o Form2 deste projeto,
criado neste exercício. Selecione a linha formada pelo Form2 e Unit2 e clique no botão
Remove. Será apresentado um diálogo perguntando se deseja salvar as alterações na Unit2.
Responda negativamente. Repare que excluir o formulário e a unit do projeto não significa
excluí-los do sistema de arquivos
20) Você acabou de concluir a prática sobre a utilização básica do IDE do C++ Builder !

Programação Básica em C++ Builder 6


Práticas de C++ Builder

PRÁTICA 2
1. Assunto
Primeiro programa em C++ Builder

2. Tópicos abordados
• Desenvolvendo um programa em C++ Builder
• Um programa para escrever “Hello World”
• Programando um evento

3. Introdução teórica
Desenvolver um programa (também podemos chamar de aplicação) em C++ Builder
consiste basicamente em: a) escolher os componentes desejados e posicioná-los no formulário de
acordo com o design desejado; b) configurar as propriedades desses componentes no Object
Inspector; c) programar os eventos necessários, utilizando os comandos da linguagem C++ e os
componentes do C++ Builder (suas propriedades e métodos).
O C++ Builder utiliza o conceito PME (Propriedades, Métodos e Eventos) uma vez que
seu ambiente é totalmente orientado a objetos.
Nesta prática será primeiramente desenvolvido um programa para imprimir a frase
tradicional Hello World ! (Alô Mundo!) utilizando-se um componente rótulo (label). Em
seguida, este programa será transformado em um programa para transferir o conteúdo de um
componente caixa de edição (EditBox) para o rótulo , através de um click em um componente
botão (Button).
Serão abordados vários conceitos básicos sobre programação visual e utilização de
componentes gráficos, bem como manipulação de suas propriedades e eventos.

4. Exercícios

1) Altere o tamanho do formulário como se altera o tamanho de uma janela no Windows


2) Altere o título do formulário, atualmente assinalada para Form1. Isto é efetuado no Object
Inspector, clicando no lado direito da propriedade Caption e substituindo o seu conteúdo
para Meu Primeiro Programa (sem o negrito)

3) Clique no ícone , correspondente ao componente Label (rótulo) na página Standard da


Paleta de Componentes. Então, clique em qualquer lugar sobre o formulário. O rótulo foi
colocado sobre o formulário com o título estampado de Label1. Depois de posicionado no
formulário, qualquer componente pode ser movido para outro local, clicando sobre ele e
arrastando.
4) Altere o título do rótulo (propriedade Caption) para Hello World (sem o negrito)
5) Experimente alterar os valores para a fonte utilizada, manipulando a propriedade Font.
Clicando no lado direito dessa propriedade observa-se a existência de um ícone com
reticências( ). Isto significa que esta é uma propriedade composta, sendo necessário mais
do que um valor para sua configuração. Clicando duas vezes neste ícone ativa-se uma janela
para configuração de fontes.
6) Existe outra maneira de alterar os valores da fonte. Observe também que no lado esquerdo
do nome Font existe um sinal de adição (+) representando que esta é uma propriedade que
contém “sub-propriedades”. Clicando duas vezes no nome Font, abre-se uma linha para cada
sub-propriedade, cujo valor pode ser alterado individualmente. Ao lado do nome Font, o

Programação Básica em C++ Builder 7


Práticas de C++ Builder

sinal de adição transforma-se em um sinal de subtração (-); para voltar a posição inicial
deve-se novamente clicar duas vezes sobre o nome Font.
7) Está pronto o programa para escrever Hello World. Para compilar e executar um programa,
existem três maneiras: a) através da opção Run no menu Run; b) pressionando a tecla F9; c)
clicando no ícone na SpeedBar
8) Para cancelar a execução do programa, utiliza-se o padrão do Windows, ou seja,
pressionando ALT + F4 ou clicando no ícone da janela.

9) Clique no ícone , correspondente ao componente Edit (caixa de edição ou EditBox). Em


seguida, posicione-o também sobre o formulário. O conteúdo da caixa automaticamente
assume o valor Edit1
10) Apague o valor do conteúdo da caixa de edição através da sua propriedade Text, no Object
Inspector

11) Inclua um componente botão, ícone , e altere o valor da sua propriedade Caption para
Transferir. Experimente manipular o formato e tamanho do botão, clicando nas suas bordas
e arrastando.
12) Para programar o evento OnClick do botão, primeiramente cerifique-se de que o botão está
selecionado, então selecione a página Events no Object Inspector. Clique duas vezes no lado
direito do evento OnClick (na caixa de edição, com fundo branco). Isto fará com que seja
atribuído o nome Button1Click ao tratador do evento e alternado para o Editor de Código
para escrever o código referente a este evento.
13) O tratador do evento é um função membro da classe TForm1, que recebeu o nome de
Button1Click. Repare que é permitido atribuir qualquer nome a um tratador de eventos,
porém recomenda-se manter o nome default, por questões de legibilidade do programa.
Como o evento OnClick é o primeiro da página para o componente botão pode-se também
ativar o seu tratador clicando duas vezes sobre o botão.
14) O objetivo do botão é, ao ser clicado, transferir o conteúdo (propriedade Text) digitado pelo
usuário na caixa de edição, para o título (propriedade Caption) do componente rótulo. Para
isto escreva a seguinte linha de comando no corpo do método Button1Click:
Label1->Caption = Edit1->Text;

15) Compile e execute o programa e depois teste-o.


16) Repare nos nomes dos componentes. Cada componente (objeto) tem uma identidade própria,
no caso, seu nome. Ao ser criado um componente é atribuído um nome default para ele (o
nome do componente mais um número). Este nome pode ser alterado através da propriedade
Name do componente. Os componentes rótulo, caixa de edição e botão receberam
respectivamente os nomes Label1, Edit1 e Button1.
17) Inclua um novo botão no formulário e repare como seu nome e propriedade Caption
assumem o valor Button2. Exclua o novo componente, pressionando a tecla Delete.
18) Altere os nomes dos componentes (propriedade Name): componente botão para Transferir;
componente caixa de edição para Entrada; e componente rótulo para Saída. Para manipular
determinado componente deve-se torná-lo o componente ativo. Para isso pode-se clicar sobre
ele no formulário ou selecioná-lo na caixa combinada (ComboBox) da parte superior do
Object Inspector.
19) Observe que o nome do tratador do evento OnClick do botão foi alterado para
TransferirClick, enquanto que os nomes Label1 e Edit1 da linha de comando digitada não
Programação Básica em C++ Builder 8
Práticas de C++ Builder

foram alterados. A razão é simples: tudo o que o C++ Builder criar automaticamente ele se
responsabiliza pela alteração; aquilo que for digitado pelo programador é sua
responsabilidade alterar !
20) Sem alterar os nomes dos componentes para Entrada e Saida, haverá erro de compilação!
Altere os nomes e execute o programa.

Programação Básica em C++ Builder 9


Práticas de C++ Builder

PRÁTICA 3
1. Assunto
Segundo programa em C++ Builder

2. Tópicos abordados
• O componente caixa de lista (ListBox)
• Adicionando dados a uma caixa de lista
• Controle ativo (com o foco) e seqüência
• Utilizando teclas de atalho
• Programando o evento OnKeyPress
• Incluindo dicas

3. Introdução teórica
Uma aplicação para ambiente gráfico Windows contempla uma enorme gama de opções e
formas de interação com o usuário, diferentes de ambientes baseados em caracter. A
programação visual, que por um lado proporciona enorme facilidade e flexibilidade para o
desenvolvimento de programas, por outro lado torna este programa consideravelmente mais
complexo (devido ao maior número de opções disponíveis). Conhecer estas opções e saber em
que situações utilizá-las são requisitos básicos para programadores neste ambiente.
Nesta prática será introduzido um componente muito utilizado em programas conhecidos
como Word, Excel e o próprio Windows. Este componente é a caixa de lista, ou ListBox como é
comumente chamado. Será desenvolvido um programa que tem a finalidade de transferir nomes
digitados em uma caixa de edição (EditBox) para a caixa de lista a partir de um clique em um
botão. Vários conceitos importantes serão apresentados, como a classe TStrings, o evento
OnActivate do formulário, além dos tópicos apresentados no ítem 2.
Uma questão importante em um ambiente gráfico é o assincronismo do foco da aplicação,
ou seja, o componente visual que pode ser manipulado não segue uma ordem estrita definida no
programa. O componente visual que é passível de ser manipulado em determinado momento
contém o foco da aplicação. Em C++ Builder, os componentes que podem receber o foco são
chamados de controles ajanelados (outros ambientes também utilizam este termo). Com relação
a qual controle terá o foco em determinado momento existem três questões:
a) existe uma ordem com a qual se passa de um controle a outro utilizando a tecla Tab (tecla
padrão do Windows para o avança entre controles; o retrocesso é efetuado pelas teclas
Shift+Tab), que é determinada pela propriedade TabOrder de todos os controles. Os
componentes que não são controles ajanelados não possuem esta propriedade (Ex: Label).
O valor desta propriedade varia de 0 a n-1. Inicialmente a ordem é determinada pela
seqüência de inclusão dos componentes no formulário, de modo que o primeiro
componente posicionado no formulário terá o foco quando o programa iniciar
b) através do mouse ou teclas de atalho (veremos adiante) pode-se passar o foco para outro
controle fora da ordem determinada por TabOrder. Por exemplo, quando se clica em um
botão, o foco permanece nele
c) pode-se alterar o foco através de programação. O componente formulário possui a
propriedade ActiveControl, que pode ser configurada pelo Object Inspector ou em tempo
de execução. Pode-se também enviar a mensagem SetFocus para o controle desejado.

Programação Básica em C++ Builder 10


Práticas de C++ Builder

4. Exercícios

O componente caixa de lista (ListBox)

1) Clique no ícone , correspondente ao componente caixa de lista (ListBox) na página


Standard da Paleta de Componentes. Então, clique em qualquer lugar sobre o formulário. A
caixa de lista foi colocada sobre o formulário na forma de um retângulo com fundo branco.
Como qualquer componente, a caixa de lista pode ser redimensionada e arrastada.
2) O conteúdo de uma caixa de lista é manipulado através da sua propriedade Items, que por
sua vez é um objeto da classe TStrings. Esta classe proporciona objetos que contêm vários
strings, ou seja várias linhas de caracteres, e métodos para manipulá-los.
3) A maneira mais simples de configurar esta propriedade é através do Object Inspector. Por
ser uma propriedade composta (já foi vista a propriedade composta Font, na 2a Prática),
deve-se clicar no ícone para ativar outra janela, o String List Editor. Este editor permite
que seja configurado estaticamente valores para as propriedades da classe TStrings. Pode-se
também carregar e salvar strings de arquivos ASCII. Cada linha no editor corresponde a uma
linha na caixa de lista. Quando a quantidade de linhas for maior que o tamanho da caixa de
lista, automaticamente será criada uma barra de rolagem (scrollbar) vertical. Digite alguns
valores iniciais para a caixa de lista.

Adicionando dados a uma caixa de lista


4) Outra maneira de configurar o conteúdo de uma caixa de lista é atribuir valores
dinamicamente, manipulando sua propriedade Items em tempo de execução (a classe
TStrings possui vários métodos, veja no help on-line). Para isso, inclua um componente
botão (Button) e um componente caixa de edição no formulário. Altere a propriedade
Caption do botão para Incluir e apague o conteúdo da propriedade Text da caixa de edição
5) Crie um tratador de eventos para o evento OnClick no botão Incluir e digite o seguinte
comando:
ListBox1->Items->Add(Edit1->Text);

6) Este comando envia uma mensagem para a propriedade Items do componente ListBox1,
solicitando a ativação do método Add com o parâmetro Edit1->Text. Ou seja, será
adicionado à caixa de lista o conteúdo da caixa de edição. Execute e teste o programa.
7) Configure a propriedade Sorted do componente ListBox1 para “True” e teste o programa.

Removendo dados de uma caixa de lista


8) Introduza outro botão e configure sua propriedade Caption para “Remover”.
9) Crie um tratador de eventos para o evento OnClick deste botão e digite o seguinte comando:
ListBox1->Items->Delete(ListBox1->ItemIndex);

Controle ativo (com o foco) e seqüência


10) Repare que, ao iniciar o programa o foco da aplicação está no componente caixa de lista,
quando o desejável seria que estivesse na caixa de edição. Do mesmo modo, após clicar no
botão, o foco permanece no botão, quando seria também desejável que retornasse à caixa de
edição. Existe sempre um componente que está com o foco da aplicação em qualquer
momento da execução de um programa. Se você não está seguro a respeito de foco da
aplicação releia a introdução teórica.

Programação Básica em C++ Builder 11


Práticas de C++ Builder

11) Altere o valor da propriedade ActiveControl do formulário. Isto pode ser feito de uma das
duas maneiras apresentadas abaixo:
12) Selecione o formulário, clicando sobre ele ou através da caixa combinada (ComboBox) na
parte de cima do Object Inspector. Configure a propriedade ActiveControl para o controle
Edit1. Não é necessário digitar o nome; pode-se escolher a partir de uma caixa combinada.
13) O mesmo efeito pode ser obtido programando o evento OnActivate do formulário
(disparado quando o formulário é ativado) com o seguinte comando:
ActiveControl = Edit1;

14) Complete a programação do evento OnClick do botão de modo a ficar da seguinte maneira:
ListBox1->Items->Add(Edit1->Text);
Edit1->Clear();
Edit1->SetFocus();

15) A primeira linha acrescentada limpa o conteúdo da caixa de edição. A segunda transfere o
foco da aplicação para a caixa de edição. Execute o programa e teste-o
16) Altere o conteúdo da propriedade TabOrder dos componentes caixa de edição, caixa de lista
e botão respectivamente para 0, 1 e 2. Esta será agora a seqüência de fluxo do foco da
aplicação. Teste o programa, utilizando as teclas Tab e Shift+Tab
17) A alteração da propriedade TabOrder em vários componentes um por um tende a ser um
atividade morosa e desinteressante em um formulário com muitos componentes. Por isto, o
C++ Builder proporciona um modo de realizar esta tarefa através de programação visual.
Clique com o botão da direita sobre o formulário e escolha a opção TabOrder....para ativar
a janela Edit Tab Order. Através dela pode-se arrastar com o mouse um controle para a
posição desejada ou movê-lo clicando nos ícones seta para cima e seta para baixo. É muito
mais prático!
18) Em resumo, ao iniciar o programa o foco estará no controle com TabOrder igual a 0, a não
ser que tenha sido configurada explicitamente a propriedade ActiveControl do formulário
Utilizando teclas de atalho
19) A maioria das aplicações Windows permite realizar praticamente todas as operações também
através do teclado, além do mouse. Isto é obtido através da combinação da tecla Alt com a
letra que está sublinhada na operação desejada. Teclas de atalho podem ser utilizadas para
todos os controles que possuem um título. Para isto, basta acrescentar, na propriedade
Caption, o caracter & antes da letra que será sublinhada e ela automaticamente se
transforma em uma tecla de atalho.
20) Configure a propriedade Caption do botão Incluir para &Incluir e do botão Excluir para
&Excluir e teste o programa utilizando as teclas Alt+I e Alt+E para incluir e excluir nomes
na/da caixa de lista
21) O componente rótulo (label) não pode ter o foco da aplicação, mas freqüentemente é
associado a outros componentes, como um complemento. Deste modo, mesmo não sendo um
controle, ele permite a configuração de tecla de atalho, delegando o foco para algum controle
associado
22) Crie um rótulo configurando a Caption para &Nome e posicione-o antes da caixa de edição.
Configure a propriedade FocusControl para Edit1. Teste o programa passando o foco para
outro controle com Tab e depois retornando a caixa de edição com Alt+N

Programação Básica em C++ Builder 12


Práticas de C++ Builder

Programando o evento OnKeyPress


23) Como fazemos para transferir o nome digitado na caixa de edição para a caixa de lista
pressionando a tecla Enter (como no DOS!) ? Programando o evento OnKeyPress da caixa
de edição, que é disparado quando qualquer tecla é pressionada, e testando se a tecla é Enter
(código 13 na tabela ASCII)
24) Crie um tratador de eventos para o evento OnKeyPress do componente Edit1 e insira o
seguinte código:
if (Key == '\r') {
Button1Click(Sender);
Key = 0;
}

Onde Key é o parâmetro passado ao tratador de eventos que contém a tecla pressionada e '\r'
representa o caracter ASCII associado à tecla Enter.
OBS: O componente caixa de edição possui um evento chamado OnEnter, que é ativado
quando o foco da aplicação entra no controle. Ele não tem nenhuma relação com a tecla
Enter
25) No exemplo acima, seria possível incluir o mesmo código já digitado para o evento OnClick
do botão “Incluir”. Porém, em vez disso, é mais otimizado chamar diretamente o tratador de
eventos chamado Button1Click. Isto mesmo! Como um tratador de eventos é um método da
classe, ele pode ser chamado de qualquer outro lugar do programa.
26) O tratador de eventos Button1Click deve ser chamado com o parâmetro Sender, que é
enviado a praticamente todos os tratadores de eventos, e representa o componente que
originou (emitiu) o evento. Por exemplo, isto é útil no caso de, dentro do tratador
Button1Click ser necessário saber qual componente gerou o evento, o botão ou a caixa de
edição.
Incluindo Dicas (Hint)
27) Dicas são aqueles retângulos amarelos que aparecem abaixo dos componentes descrevendo
suscintamente sua função. Duas propriedades são utilizadas para tratar dicas. A propriedade
Hint contem o texto da dica e a propriedade ShowHint estabelece se a dica deve ser escrita
ou não.
28) Selecione o botão Incluir e configure sua propriedade Hint com o texto “Incluir na lista”.
Configure a propriedade ShowHint para “True”. Execute o programa e posicione o cursor
do mouse (a seta) sobre o botão para que a dica seja mostrada.
Melhorando a eliminação de itens da lista
29) Normalmente as aplicações Windows utilizam a tecla Del (Delete) para eliminar itens de
uma Caixa de Lista. Faça as alterações necessárias para permitir que este processo ocorra
também nesta aplicação. Dica: Uso o evento OnKeyDown da ListBox.

Programação Básica em C++ Builder 13


Práticas de C++ Builder

PRÁTICA 4
1. Assunto
Criando aplicações de bancos de dados - Parte 1

2. Tópicos abordados
• Usando componentes TTable
• Usando componentes TDataSource
• Usando alguns componentes data-aware: TDBGrid, TDBEdit, TDBText, TDBImage
• Usando componente TDBNavigator

3. Introdução teórica
O C++ Builder oferece uma série de ferramentas e recursos que possibilitam a criação de
aplicações de bancos de dados de forma rápida e fácil. Nas próximas práticas serão introduzidos
os conceitos básicos na manipulação com bancos de dados em C++ Builder, oferecendo uma
visão geral dos componentes de acesso a dados mais corriqueiramente utilizados.
O coração das aplicações de bancos de dados do C++ Builder está no Borland Database
Engine (BDE), uma camada de software que realiza o acesso a bancos de dados baseados em
arquivos como Paradox e dBase ou a servidores de bancos de dados locais ou remotos como
InterBase, Informix, Oracle, SyBase, etc. Os componentes de bancos de dados do C++ Builder
oferecem uma forma simplificada, que usa programação visual baseada em PME (Propriedades,
Métodos e Eventos), para acessar a API do BDE.
Há duas grandes classes de componentes: os componentes de acesso a dados (data-access)
e os componentes de controle, visualização e manipulação dos dados (data-controls), sendo que
os componentes de visualização e manipulação de dados são também denominados de
componentes data-aware (componentes capazes de mostrar e atualizar os dados armazenados em
uma tabela associada). Estes dois grupos de componentes estão localizados, respectivamente, nas
páginas Data Access e Data Controls da paleta de componentes do C++ Builder.
Os principais componentes do tipo data-access utilizados na criação de aplicações com
bancos de dados em C++ Builder são os componentes derivados da classe abstrata TDataSet, que
são: Table da classe TTable, Query da classe TQuery e StoredProc da classe TStoredProc.
Qualquer um dos componentes derivados da classe TDataSet podem ser referenciados como
datasets. Os componentes Query e StoredProc são mais utilizados em aplicações cliente-servidor
e serão vistos posteriormente. O componente Table oferece a forma mais simples de se acessar
informações em uma tabela de banco de dados e o estudaremos nesta prática.
Um dataset possui um conjunto de estados onde pode se encontrar. Os estados possíveis
são:
Estado Descrição

Inactive Quando o dataset encontra-se fechado.

Browse O estado no qual o dataset se encontra quando o mesmo é aberto e permanece a


maior parte do tempo de seu uso. Registros podem ser lidos, mas não alterados
ou inseridos.

Edit Permite que a linha (registro) corrente seja editada (alterada).

Insert Permite que uma nova linha seja inserida e alterada. Após uma chamada ao
método Post uma nova linha é gravada na tabela e o dataset volta ao estado de

Programação Básica em C++ Builder 14


Práticas de C++ Builder

Estado Descrição
Browse.

SetKey Permite que sejam atribuídos valores aos campos que compõem o índice
atualmente em uso pelo dataset, possibilitando que os métodos GoToKey e
GoToNearest realizem buscas na tabela. Este estado e métodos só estão
disponíveis em componentes da classe TTable.

CalcFields Estado que ocorre quando um campo calculado está sendo atualizado.

Uma aplicação pode posicionar um dataset em determinado estado através de uma


chamada explícita a um método ou através da ocorrência de um evento que desencadeie uma
troca de estado. Há métodos que sempre levam para determinado estado e são chamados
métodos correspondentes aos estados. São eles: Edit, Insert, Append e Setkey. Um outro
conjunto de métodos sempre retorna o dataset para o seu estado de Browse como Delete, Cancel,
GotoKey e GotoNearest. Há casos em que o sucesso ou insucesso do método define se o dataset
volta ao estado de Browse, como o método Post.
O diagrama de estados da Figura 1 mostra os possíveis estados de um dataset e os métodos
que causam as trocas de estado para outro.

Inactive

Close Open
1 2
Insert SetKey*
Append EditKey*
3 8
9
Insert Browse SetKey
4 7
Post Post (Sucesso) Cancel
(Insucesso) Delete GotoKey*, GotoNearest*
Post
5 6
Edit Cancel
Delete
Post (Sucesso)
Edit
* Somente TTable
10
Post (Insucesso)

Figura 1 - Diagrama de estados de um dataset

O componente Table é a interface entre o Borland Database Engine e os componentes


DataSource O componente DataSource por sua vez oferece a interface para os componentes
data-aware. que irão compor a interface com o usuário. Trabalhando-se com o componente
Table usa-se a propriedade DatabaseName para especificar o banco de dados a ser acessado; a
propriedade TableName serve para indicar a tabela a acessar; utiliza-se a propriedade
IndexName para definir o uso de um determinado índice com a tabela; configura-se a
propriedade Active para True ou chame-se o método Open para abrir o dataset, colocando ele no
estado Browse; coloca-se a propriedade Active em False ou chame-se o método Close para
fechar o dataset.

Programação Básica em C++ Builder 15


Práticas de C++ Builder

O componente DataSource é a interface entre um componente dataset e os componentes


data-aware nos formulários. O DataSource liga-se a um dataset através da propriedade Dataset.
Os componentes Data-aware, como DBEdit e DBGrid, ligam-se ao DataSource através de suas
propriedades DataSource. Usualmente há apenas um DataSource para cada dataset, no entanto
pode-se conectar a um dataset tantos DataSource quantos forem necessários. Para monitorar-se
alterações no estado do dataset associado ao DataSource pode-se associar um método ao evento
OnStateChange.
Há vários componentes do tipo data-controls no C++ Builder. Nesta prática vamos estudar
o DBGrid que permite a visualização, alteração e navegação no conjunto de todos os registros e
campos de uma tabela; o DBText que mostra os dados em um campo de uma tabela como um
label read-only similar ao componente Label; o DBEdit usado para apresentar e alterar os
valores de um campo numa caixa de edição similar a um componente Edit; o DBImage que
apresenta gráficos e figuras do tipo bitmap armazenados em um campo do tipo BLOB (Binary
Large Object), de forma semelhante ao realizado pelo componente Image; e o DBNavigator que
oferece um conjunto de botões para navegar pelas linhas de um dataset, adicionar ou eliminar
uma linha, colocar o dataset no estado de edição, confirmar ou cancelar as alterações realizadas
no dataset ou recarregar os dados do disco, atualizando o dataset.

4. Exercícios

Aplicação simples usando tabela já existente


1) Crie um novo projeto. Altere a propriedade Name do Form1 para “J_Main”, e a propriedade
Caption para “Prática 4 - Aplicação com Banco de Dados”.
2) Salve o projeto atribuindo o nome MAIN.CPP para a Unit1 e PRAT4.BPR para o projeto.

3) Introduza um componente Table no formulário, (ícone da página Data Access da paleta


de componentes), configure sua propriedade Name para tbEmpregados, sua propriedade
DatabaseName para BCDEMOS e sua propriedade TableName para EMPLOYEE.DB.

4) Insira um componente DataSource (ícone da página Data Access da paleta de


componentes) no formulário, configure sua propriedade DataSet para tbEmpregados.

5) Insira um componente DBGrid (ícone da página Data Controls da paleta de


componentes), ajuste suas dimensões para se adaptarem ao tamanho do formulário e altere
sua propriedade DataSource para DataSource1.
6) Altere a propriedade Active do componente tbEmpregados para True. A tabela será aberta e
você visualizará os dados no grid em tempo de projeto. Em seguida coloque esta mesma
propriedade novamente para False.
7) Programe o evento OnActivate do formulário com o seguinte comando:
tbEmpregados->Open();

Que é equivalente a fazer


tbEmpregados->Active = true;

Isto irá abrir a tabela em tempo de execução.


8) Execute e teste a aplicação. Observe que os dados poderão ser alterados, mas recomendamos
que não se façam alterações, uma vez que estes dados são utilizados por aplicações exemplo
do C++ Builder.

Programação Básica em C++ Builder 16


Práticas de C++ Builder

Visualizando os estados do DataSet tbEmpregados


9) Adicione na parte superior esquerda do formulário principal um componente Label. Altere
sua propriedade Name para labelEstado e limpe o conteúdo de sua propriedade Caption.
10) Crie um manipulador de eventos para o evento OnStateChange do componente
DataSource1. Este evento é gerado toda vez que o dataset associado ao datasource (neste
caso tbEmpregados) muda de estado. Digite o seguinte código:
switch (tbEmpregados->State) {
case dsInactive:
labelEstado->Caption = "Estado Inativo";
break;
case dsBrowse:
labelEstado->Caption = "Estado de Browse";
break;
case dsEdit:
labelEstado->Caption = "Estado de Edição";
break;
case dsInsert:
labelEstado->Caption = "Estado de Inserção";
break;
case dsSetKey:
labelEstado->Caption = "Estado de Busca (SetKey)";
break;
case dsCalcFields:
labelEstado->Caption = "Estado de Campo Calculado";
break;
}
11) Adicione ao formulário principal um componente Button. Altere sua propriedade Name para
btAbreFecha, sua propriedade Caption para Fechar e programe um tratador de eventos para
o seu evento OnClick com o seguinte código:
tbEmpregados->Active = !tbEmpregados->Active;
if (tbEmpregados->Active)
btAbreFecha->Caption = "Fechar";
else
btAbreFecha->Caption = "Abrir";

12) Compile e teste a aplicação.


QUESTÃO No 1: Qual é o estado inicial do dataset tbEmpregados? Quando se clica no
botão fechar qual o novo estado? Que transição no diagrama da Figura 1 está associada a
essa mudança?
13) Com a tabela tbEmpregados aberta, posicione no campo EmpNo do empregado de cujo valor
de EmpNo é 2. Dê um clique neste campo e digite o valor 4. Troque para um novo registro
dando um clique no registro para onde se deseja ir.
QUESTÃO No 2: O que acontece? Porque a exceção foi gerada? Qual o estado do dataset
antes e após a tentativa de mudar de registro? Que transição no diagrama da Figura 1 está
associada a essa mudança?
14) Pressione a tecla Esc para cancelar as alterações. Use a barra de rolagem do grid para
posicionar a tabela no último registro. Use a tecla Down (↓) para inserir um novo registro.
QUESTÃO No 3: Qual o novo estado do dataset? Que transição no diagrama da Figura 1
está associada a essa mudança?

Uma outra forma de inserir um registro usando o grid é pressionar a tecla Insert, que
realizará a inserção no ponto atual do cursor.

Programação Básica em C++ Builder 17


Práticas de C++ Builder

15) Digite o número 147 no campo EmpNo e os dados do seu nome nos campos FirstName e
LastName. Mude de registro para confirmar as alterações (Post).
16) Posicione sobre o registro récem-incluído e pressione as teclas Ctrl+Del para eliminar o
registro. Escolha Ok quando for mostrada a caixa de diálogo de confirmação.

Buscando registros. Estado SetKey de um DataSet


17) Adicione um componente Edit ao formulário J_Main. Altere sua propriedade Name para
editBusca e limpe o conteúdo de sua propriedade Text.
18) Adicione 2 botões do tipo SpeedButton. Configure a propriedade Name de cada um deles
para btPreparaBusca e btBusca, respectivamente. Programe a propriedade glyph do primeiro
para o bitmap contido no arquivo C:\Arquivos de Programas\Arquivos comuns\Borland
Shared\Images\Buttons\fcabopen.bmp e a do segundo para o bitmap do arquivo
C:\Arquivos de programas\Arquivos comuns\Borland shared\images\buttons\find.bmp.
O formulário deve ficar com o aspecto da figura a seguir.

19) Programe o evento OnClick do botão btPreparaBusca com o seguinte código:


tbEmpregados->SetKey();
tbEmpregados->FieldByName("EmpNo")->AsString = editBusca->Text;

20) Programe o evento OnClick do botão btBusca com o segunite código:


tbEmpregados->GotoKey();

21) Compile e teste a aplicação. A busca é realizada pelo código, índice principal da tabela.
Digite o valor 10 na caixa de edição. Clique sobre o botão btPreparaBusca.
QUESTÃO No 4: Qual o novo estado do dataset? Que transição no diagrama da Figura 1
está associada a essa mudança?
22) Clique sobre o botão btBusca. O registro foi localizado? Digite o valor 11 na caixa de
edição. Pressione os botões btPreparaBusca e btBusca. E agora o registro foi localizado?
Encerre a aplicação.
23) Altere o evento OnClick do botão btBusca para:
tbEmpregados->GotoNearest();

Programação Básica em C++ Builder 18


Práticas de C++ Builder

24) Recompile e teste a aplicação. Faça uma busca usando o valor 10.
QUESTÃO No 5: Qual registro foi localizado? Qual a diferença entre os métodos GotoKey
e GotoNearest?

Fazendo uma busca incremental pelo Nome do Empregado


25) Selecione o componente tbEmpregados. Altere sua propriedade IndexName para ByName.
26) Crie um tratador de eventos para o evento OnChange do componente EditBusca e digite:
if (editBusca->GetTextLen() > 0)
tbEmpregados->FindNearest(ARRAYOFCONST((editBusca->Text)));

27) Compile e teste a aplicação. Digite um nome na caixa de edição começando com r. O que
acontece?
QUESTÃO No 6: Por que a busca agora foi realizada pelo nome? Qual a função do método
FindNearest? Ele condensa a função de quais outros métodos?
28) Digite o valor 146 na caixa de edição. Pressione o botão btPreparaBusca. O que acontece?
QUESTÃO No 7: Qual a razão do erro? Por que não foi possível atribuir o valor 146 ao
campo EmpNo com o dataset no modo SetKey? Que campos podem ter valores atribuídos
no modo SetKey?

Mudando a estrutura da tabela EMPLOYEE.DB


29) Chame o Database DeskTop (Menu Tools | Database DeskTop).
30) No DataBase DeskTop Escolha o menu File | Open | Table… Na caixa de diálogo Open
Table, abra o combobox Alias (última linha) e escolha BCDEMOS. Selecione Employee.db
e clique no botão abrir.
31) Escolha o menu Table | Restructure… Com a caixa de diálogo aberta, use a tecla Down (↓)
para posicionar além do último campo (Salary), incluindo um novo campo.
32) Digite na coluna FieldName, o nome Picture, pressione a tecla <Tab> para posicionar na
coluna Type. Digite G (Campo do tipo Graphic BLOB).
33) Clique no botão Save para validar as alterações. Feche a tabela Employee.db (Clique duplo
no menu de controle da sua janela) e feche o Database DeskTop.

Criando um formulário para edição de campos individuais


34) Crie um novo formulário. Altere sua propriedade Name para J_Empregados, sua
propriedade Caption para ‘Empregados’ e a propriedade BordeStyle para bsDialog. Salve o
projeto, dando o nome EMPREG.CPP (lembrar de voltar o diretório atual para o
diretório da Prática 4) para a Unit associada ao novo formulário criado.
35) Ajuste o formulário J_Empregados para ser o formulário principal da aplicação. Menu
Project | Options.
36) Introduza um componente Table no formulário, configure sua propriedade Name para
tbEmpregados, sua propriedade DatabaseName para BCDEMOS e sua propriedade
TableName para EMPLOYEE.DB.
37) Insira um componente DataSource no formulário, configure sua propriedade DataSet para
tbEmpregados.

38) Insira um componente DBText (ícone da página Data Controls da paleta de


componentes), configure sua propriedade DataSource para DataSource1 e sua propriedade

Programação Básica em C++ Builder 19


Práticas de C++ Builder

DataField para EmpNo. Mude sua propriedade Font para tamanho 18, estilo negrito e cor
castanho.
Este componente serve para exibir valores de uma determinada tabela, sem permitir que os
mesmos sejam alterados.

39) Adicione um componente DBEdit (ícone da página Data Controls da paleta de


componentes), configure sua propriedade DataSource para DataSource1 e sua propriedade
DataField para FirstName. Inclua um componente Label para identificar o campo,
posicionando-o logo acima do DBEdit e ajuste seu Caption para ‘Primeiro Nome’.
40) Repita o passo 39 para os campos LastName e Salary.

41) Adicione um componente DBImage (ícone da página Data Controls da paleta de


componentes). Altere sua propriedade DataSource para DataSource1, sua propriedade
DataField para Picture e sua propriedade Stretch para True.

42) Inclua um componente DBNavigator (ícone da página Data Controls da paleta de


componentes). Configure sua propriedade DataSource para DataSource1 e sua propriedade
ShowHint para True.
43) Posicione um componente BitBtn. Ajuste sua propriedade Kind para bkOk, a propriedade
Name para btOk e seu Caption para ‘&Fechar’. Programe o evento OnClick do mesmo com
o seguinte código:
Close();
44) Adicione um Bevel, configurando sua propriedade Shape para bsBottomLine. O formulário
deve ficar com o seguinte aspecto:

45) Ajuste a propriedade Active do componente tbEmpregados para True.


46) Compile e teste a aplicação. Verifique o funcionamento de cada um dos botões no navegador
(DBNavigator).

Programação Básica em C++ Builder 20


Práticas de C++ Builder

Inserindo uma figura no campo Picture


47) Adicione um componente OpenDialog no formulário J_Empregados. Ajuste sua propriedade
Filter para conter na coluna Filter Name Imagens (*.bmp) e na coluna Filter para *.bmp;
altere o item ofHideReadOnly da propriedade Options para True.
48) Programe um tratador de eventos para o evento OnDblClick do componente DBImage1
contendo os seguinte código:
if (OpenDialog1->Execute()) {
DataSource1->DataSet->Edit();
DBImage1->Picture>LoadFromFile(OpenDialog1->FileName);
}
49) Compile e teste a aplicação. Para carregar uma nova figura no campo DBImage basta dar um
duplo-click sobre a mesma.
Obs: Uma outra forma de carregar valores sobre um campo DBImage é usando o ClipBoard
(Sequências de teclas Ctrl+V para inserir e Ctrl+C para copiar).

Deixando o grid Read-Only e chamando a janela de edição


50) Transfira o formulário J_Empregados da lista Auto-create forms para a lista Available forms
(menu Project | Options).
51) Selecione o formulário J_Main e neste o componente DBGrid1. No Object Inspector
selecione sua propriedade Options e dê um duplo-clique sobre a mesma para visualizar os
seus itens. Configure os itens dgEditing para False, dgRowSelect e
dgAlwaysShowSelection para True. Altere ainda a propriedade ReadOnly deste
componente para True.
52) Utilize o menu File | Include Unit Hdr….para fazer uso do módulo MAIN.CPP.
53) Crie um tratador de eventos para o evento OnDblClick do componente DBGrid1 e digite as
seguintes linhas de código:
J_Empregados = new TJ_Empregados(this);
J_Empregados->DataSource1->DataSet = tbEmpregados;
J_Empregados->ShowModal();
delete J_Empregados;

54) Selecione o formulário J_Empregados e elimine o componente tbEmpregados. O


DataSource1 será ligado em tempo de execução (linha 2 do item anterior) ao dataset do tipo
TTable do formulário J_Main denominado tbEmpregados.
Obs: Neste caso temos 2 componentes datasource ligados ao mesmo dataset.
55) Altere a propriedade Name do botão btAbrirFechar do formulário J_Main para btSair, a sua
propriedade Caption para Sair e o código do seu envento OnClick para:
Close();
56) Compile e teste a aplicação. Para visualizar e editar um determinado registro basta dar um
duplo clique sobre o mesmo. Realize algumas operações com os dados e observe as
alterações no LabelEstado do formulário J_Main.
QUESTÃO No 8: Porque o estado do dataset tbEmpregados é influenciado quando altera-se
os componentes ligados ao datasource do formulário J_Empregados?

Configurando o componente DBNavigator


O componente DBNavigator pode ser configurado para apresentar apenas alguns dos botões
de navegação. Além disso as mensagens apresentadas no Hint podem ser personalizadas.

Programação Básica em C++ Builder 21


Práticas de C++ Builder

57) Selecione o componente DBNavigator1 do formulário J_Empregados. Selecione a sua


propriedade VisibleButtons e dê um duplo clique para visualizar os seus itens. Altere os
itens nbEdit e nbRefresh para False.
58) Selecione a propriedade Hints do componente DBNavigator1. Dê um clique sobre o botão
para ativar o editor de lista de strings. Digite os seguintes itens: Primeiro, Anterior, Próximo,
Último, Adicionar, Eliminar, Editar, Gravar Alterações, Cancelar Alterações, Atualizar
Informações.
Obs: Veja que mesmo os botões Edit e Refresh não estando visíveis no navegador, as
mensagens de Hint devem ser obrigatoriamente especificadas para os mesmos, na ordem
em que os botões apareceriam.
59) Compile e teste a aplicação. Chame a janela de edição dos registros (Janela Empregados) e
posicione o mouse sobre os botões do navegador. As mensagens programadas irão aparecer.

Programação Básica em C++ Builder 22


Práticas de C++ Builder

PRÁTICA 5
1. Assunto
Criando aplicações de bancos de dados - Parte 2

2. Tópicos abordados
• Configurando o BDE e criando novos aliases
• Usando utilitário Database Desktop para criar novas tabelas
• Usando o Database Explorer para visualizar o banco de dados

3. Introdução teórica
O Borland Database Engine (BDE, apresentado anteriormente) oferece um utilitário de
configuração chamado BDE Administrator (BDEAdmin.EXE) que permite configurar os aliases
utilizados e alterar o ambiente do Engine como: drivers instalados, configuração interna do
sistema e formato de apresentação de data e hora e valores numéricos. Essas informações são
gravadas em um arquivo de configuração, normalmente chamado IDAPI32.CFG.
O BDE usa os aliases como nomes alternativos para data sources freqüentemente utilizados,
sejam estes locais ou remotos. Além do BDE Administrator para criar e configurar aliases pode-
se utilizar também o Database Explorer para realizar estas tarefas. Alternativamente pode-se
utilizar o programa BDE Configuration Utility (BDECFG32.EXE) e o Database Desktop para
manipular aliases. No entanto, o seu uso com versões mais novas do C++ Builder não é
aconselhável.
O Database Desktop (DBD) é um utilitário independente do C++ Builder, que pode ser
utilizado para visualizar criar e modificar tabelas Paradox e dBase, além de efetuar outras tarefas
relacionadas à administração de banco de dados. Pode-se também realizar operações restritas em
outros bancos de dados, como Oracle, Interbase e outros. Este não vem sendo atualizado junto
com as novas versões do C++ Builder, e a sua utilização deve ser descontinuada
progressivamente, à medida que outras ferramentas assumam as suas funções.
O Database Explorer permite visualizar e manter bancos de dados (remotos ou locais, com
restrições), trabalhar com aliases do BDE e com metadados (tabelas, visões, etc., ou seja, dados
sobre dados). Na versão Enterprise do C++ Builder o Database Explorer recebe o nome de SQL
Explorer, porque tem a possibilidade de acessar bancos de dados SQL.

4. Exercícios
Definindo um novo alias
1) Crie um diretório denominado Prat5. No interior deste crie um outro denominado Dados.
2) Chame o BDE Administrator através do menu Iniciar | Programas | Borland

C++Builder 4 | BDE Administrator, ícone . O BDE Administrator pode ser acessado


também a partir do Painel de Controle do Windows.
3) A interface do BDE Administrator é implementada com um componente TreeView, no estilo
do Windows Explorer. Clique no sinal do ícone para verificar os bancos de
dados existentes.
4) Escolha no menu Object a opção New. Será apresentada a caixa de diálogo New Database
Alias. Mantenha o Database Driver Name como STANDARD (tabelas locais Paradox e
dBase) que já é o valor default e pressione o botão OK.

Programação Básica em C++ Builder 23


Práticas de C++ Builder

5) Substitua o nome STANDARD1 sugerido por Prat2. Na propriedade PATH do lado direito
da janela digite o caminho onde serão armazenados os dados da prática 5, ou seja o diretório
Dados criado no item 1. Ou procure o diretório, clicando no botão . Por exemplo:

6) Escolha o menu Object | Apply (pressione OK na janela de confirmação) para salvar as


novas configurações. O novo alias está criado e salvo. Quando as alterações são salvas a seta
verde no novo alias some. Antes de fechar a aplicação dê uma olhada geral na guia
Configuration do utilitário de administração, para conhecer um pouco os drivers instalados
e o que mais pode ser configurado no BDE. Em seguida feche o utilitário.

Abrindo o DataBase Desktop e configurando o Working Directory


7) Com o alias criado, vamos realizar agora a criação das novas tabelas a serem utilizadas na
nossa aplicação.
8) Chame o DataBase Desktop (Menu Iniciar | Programas | Borland C++Builder 4 |
DataBase Desktop, ícone , da barra de tarefas do Windows).

9) Com a aplicação aberta escolha o menu File | Working Directory… e preencha a caixa de
diálogo de acordo com a figura abaixo. No campo Alias escolha Prat5 e o campo Working
Directory será preenchido automaticamente !

Programação Básica em C++ Builder 24


Práticas de C++ Builder

Criação da tabela de Empregados


10) Em seguida escolha o menu File | New | Table… para criar uma nova tabela ou

alternativamente clique com o botão da direita sobre o ícone da SpeedBar e escolher a


opção New…. O tipo da tabela deve ser Paradox 7.0, que já é o default. Preencha então os
campos de acordo com a figura a seguir .

Obs: Para especificar a chave primária da tabela (indicada por um asterisco na coluna Key dos
campos que a compõem) basta pressionar qualquer tecla com o cursor na coluna Key do
campo.
11) Definidos os campos, vamos criar os índices secundários a serem utilizados como
alternativas para a ordem de visualização e consulta, que não aquela estabelecida pela chave
primária Cod_Emp. Escolha no combobox Table properties a opção Secondary Indexes e

em seguida clique sobre o botão . Será aberta a caixa de diálogo para definição
de índices secundários. Preencha-a de acordo com a figura abaixo e clique no botão Ok. Dê o
nome idxNome para o índice.
Obs: Os índices compostos por um único campo e que sejam do tipo Case Sensitive não
requisitam nome e assumem o próprio nome do campo.

Programação Básica em C++ Builder 25


Práticas de C++ Builder

12) Pressione no botão e escolha o nome emp.db para o arquivo que armazenará a
tabela.

Criação da tabela de Departamentos


13) Repita os passos10 a 12 para criar a tabela de Departamentos.
14) Insira os campos apresentados na tabela abaixo:
Field Name Type Size Key
Cod_Dep N *
Descricao A 25
Gerente N
Fone A 20
15) Crie um índice secundário denominado idxDescricao contendo o campo Descricao.
16) Salve a tabela com o nome depto.db.

Criação das regras de integridade referencial


17) Abra a tabela de Departamentos (Depto.db). Clique no menu Table | Restructure… ou no

ícone para realizar alterações na estrutura da tabela. Escolha no combobox Table

properties a opção Referencial Integrity e em seguida clique sobre o botão .


Será aberta a caixa de diálogo para definição das regras de integridade referencial para esta
tabela. Preencha-a de acordo com a figura a seguir. Isto garantirá que as atualizações
realizadas no campo Cod_Emp da tabela de empregados se reflitirá de forma automática
para a chave estrangeira Gerente da tabela de departamentos. A regra para deleção é
implícita e sempre proibitiva.

Programação Básica em C++ Builder 26


Práticas de C++ Builder

Clique sobre o botão OK para validar os dados, aparecerá uma caixa de diálogo pedindo o
nome para a regra de integridade referencial. Forneça o nome rGerente e clique em OK.

18) Clique no botão para salvar as alterações. Feche a tabela Depto.db.


19) Abra a tabela Emp.db e crie uma regra de integridade referencial para a chave estrangeira
Cod_Dep relacionando-a com a tabela Depto.db. Atribua o nome rDepto para esta regra. A
caixa de diálogo de criação de regras de integridade referencial deve ser preenchida da
seguinte forma:

20) Saia do Database Desktop.

Usando o Database Explorer


21) Abra o Database Explorer (no C++ Builder Client/Server se chama SQL Explorer) através
do menu Database | Explore .
22) A interface do Explorer é semelhante à do BDE Administrator. Navegue no banco de dados
Prat5 e verifique as tabelas que acabaram de ser criadas no Database Desktop.
Programação Básica em C++ Builder 27
Práticas de C++ Builder

23) Repare que, no lado direito da janela, além de visualizar a definição das tabelas (guia
Definition) pode-se manipular os seus dados, através da guia Data.
24) Abra o banco de dados DBDEMOS e consulte os dados da tabela ANIMALS.DBF. Repare
que o navegador acima dos dados fica habilitado.

OBS.: O Database Explorer permite inserir, excluir e alterar dados em tabelas locais
(Paradox e dBase), mas não permite criar novas tabelas ! No entanto, em bancos de dados
SQL é possível criar tabelas e também outros metadados.

Exercício Complementar
25) Crie uma aplicação usando o C++Builder para acessar as tabelas Emp.db e Depto.DB criadas
nesta prática.

Programação Básica em C++ Builder 28


Práticas de C++ Builder

PRÁTICA 6
1. Assunto
SQL em C++ Builder

2. Tópicos abordados
• SQL em tabelas Paradox
• Usando o Data Migration Wizard
• Consultas SQL dinâmicas (com parâmetros)
• Comandos SELECT, INSERT, UPDATE e DELETE
• Usando o Visual Query Builder

3. Introdução teórica
Em C++ Builder não é necessário acessar um SGBD relacional para utilizar a linguagem
SQL. Através do BDE (Borland Database Engine) o C++ Builder proporciona acesso a
tabelas Paradox e dBase com uma versão resumida do SQL (chamado de SQL Local). Essa
prática utilizará os comandos básicos do SQL: SELECT, INSERT, UPDATE e DELETE.
Para utilizar comandos SQL em C++ Builder, existe o componente Query, que pode ser
utilizado em substituição ao componente Table, pois ambos são descendentes da Classe
TDataSet. Desse modo, conecta-se o componente Query à propriedade DataSet do componente
DataSource ou se usa diretamente os seus métodos e propriedades.
O método Open do componente Query é utilizado para comandos SQL que retornam
valores de resultados, como o SELECT. O método ExecSQL é utilizado para comandos SQL
que não retornam valores de resultado, como INSERT, UPDATE e DELETE.
Normalmente o conjunto de resultado de dados retornado de um comando SQL não pode
ser atualizado, ou seja, é somente para leitura. A propriedade RequestLive do componente
Query pode ser utilizada para permitir que os dados sejam atualizados, da mesma forma como o
componente Table.
O Data Migration Wizard (assistente de migração de dados), também chamado de Data
Pump é utilizado para mover dados (a definição do banco de dados e o seu conteúdo) entre
bancos de dados. Tanto a origem como o destino, podem ser bancos de dados locais, como
servidor de banco de dados remotos (SGBDs).
O Visual Query Builder (VQB - construtor visual de consultas) é uma ferramenta poderosa
para construir consultas. Ele permite a construção de consultas visualmente passo a passo. A
vantagem disso é que se pode construir e executar consultas complexas (envolvendo várias
tabelas, por exemplo) sem conhecimento de SQL.

4. Exercícios
Copiando uma tabela com o Data Migration Wizard
1) Crie um diretório chamado PratSQL. Abre o Database Explorer e crie também um alias
chamado PratSQL do tipo STANDARD configurado para acessar este diretório. Salve este
alias.
2) Chame o programa Data Migration Wizard, através do menu Iniciar | Programas | Borland
C++ Builder 4 | Datapump, ícone . O título da janela deste programa é Data Pump.
Programação Básica em C++ Builder 29
Práticas de C++ Builder

3) Neste programa deve-se escolher primeiramente o alias de origem, o alias de destino e então
a(s) tabela(s) que se deseja migrar. Depois, para cada tabela, pode-se alterar o seu nome, os
nomes dos campos, dos índices e de outros metadados. Pode-se também alterar os tipos dos
campos, se o Data Migration Wizard não conseguir fazer o mapeamento corretamente entre
tipos diferentes de bancos de dados.
4) Mantenha a seleção default do botão de rádio Select by alias name e escolha BCDEMOS
como alias de origem (Source Alias Name), de acordo com a janela abaixo.

5) Clique no botão Next > e selecione PratSQL como o alias destino (Target alias).
6) Clique novamente no botão Next > e selecione a tabela EMPLOYEE.DB, clicando no botão
.
7) Clique novamente no botão Next > e será apresentada a tela de verificação e modificação do
mapeamento dos itens do banco de dados realizado automaticamente pelo Data Pump. Nesta
janela, note que os campos (Fields) não foram modificados (unchanged), foram detectados
dois índices que também não foram modificados e a integridade referencial está em ordem.
8) Como o item Fields (campos) está selecionado, clique no botão Modify Mapping
Information for Selected Item para modificá-los, de acordo com a janela abaixo.

Programação Básica em C++ Builder 30


Práticas de C++ Builder

9) Altere o nome da tabela de EMPLOYEE para EMPREG e o campo EmpNo para


CodEmp. Selecione os demais campos um a um e altere na seqüência: LastName para
Sobrenome; FirstName para Nome; PhoneExt para Fone; HireDate para Contratação;
Salary para Salário.
10) Selecione então novamente o botão Next > e depois o botão Upsize, para realizar realmente
a migração. Espere o término da operação e então clique no botão Done para finalizar.

Criando o formulário principal


11) Introduza no formulário os seguintes componentes, de acordo com a figura abaixo: 4

componentes botão de comando (Button), 1 botão BitBtn, 2 componentes Query (ícone ,


da página Data Access), 1 componente DataSource, 1 DBGrid e 1 DBNavigator. Altere o
nome do DBGrid para “GridConsulta”. Altere os nomes (propriedade Name) dos botões de
comando para “btIncluir”. “btExcluir”, “btAlterar” e “btConsultar”. Configure a propriedade
Kind do BitBtn para bkCancel e Name para “btFechar”.

12) Ao componente Query localizado acima do componente DBGrid dê o nome de


“quConsultar” e ao Query localizado ao lado do botão “Excluir” dê o nome de “quExcluir”.
Altere o nome do DataSource para “dsConsultar”.
13) Efetue a ligação entre os componentes GridConsulta, dsConsultar, quConsultar e o
DBNavigator.
14) Altere a Caption do formulário para “Cadastro de Empregados” e seu nome para
J_CadEmp. Salve o projeto dando o nome de CadEmp.cpp para o formulário e
PratSQL.bpr para o projeto.
15) Configure o componente quConsultar: propriedade DatabaseName , valor “PratSQL”;
propriedade SQL, valor:
SELECT CodEmp, Nome FROM EMPREG
16) Ative o editor de campos (Fields Editor) do componente quConsultar e inclua os campos
CodEmp e Nome (Somente irão aparecer os dois campos na lista, uma vez que são os
únicos retornados pelo comando SELECT).Altere a propriedade DisplayLabel do campo
CodEmp para “Código”.
17) Programe o evento OnActivate do formulário com o comando
quConsultar->Open();

Programação Básica em C++ Builder 31


Práticas de C++ Builder

18) Programe o evento OnClick do botão Fechar:


Close();

Excluindo
19) Configure o componente quExcluir: propriedade DatabaseName , valor “PratSQL”;
propriedade SQL, valor:
DELETE FROM EMPREG WHERE CodEmp = :Codigo
Obs.:. Nesse caso, “:Codigo” representa um parâmetro a ser passado para o comando de
exclusão.
20) Programe o evento OnClick do botão “Excluir” com as seguintes linhas de comando:
if (Application->MessageBox( "Excluir este empregado ?",
"Confirma Exclusão",
MB_YESNO | MB_ICONQUESTION) == IDYES) {
quExcluir->ParamByName("Codigo")->AsInteger =
GridConsulta->Fields[0]->AsInteger;
quExcluir->ExecSQL();
quConsultar->Close();
quConsultar->Open();
}

Obs.:A expressão “QueryExcluir->ParamByName("Codigo")->AsInteger” representa o


parâmetro “Codigo” do componente QueryExcluir considerado como inteiro. A
expressão “GridConsulta->Fields[0]->AsInteger;” representa o primeiro
campo (campo 0) do item selecionado no DBGrid considerado como inteiro.

Incluindo e Alterando
21) Crie um novo formulário para as operações de inclusão e alteração, de acordo com a figura
abaixo. O formulário deverá conter os seguintes componentes: 2 componentes Edit, chame
um de edCodigo e o outro de edNome; 2 componentes BitBtn, chame um de btOK
(propriedade Kind = bkOK) e outro de btFechar (propriedade Kind = bkCancel); 2
componentes Query, chame um de quIncluir e outro de quAlterar.

22) Configure o componente quIncluir: propriedade DatabaseName , valor “PratSQL”;


propriedade SQL, valor:
INSERT INTO Empreg (CodEmp, Nome)
VALUES (:Codigo,:Nome)
23) Configure o componente quAlterar: propriedade DatabaseName , valor “PratSQL”;
propriedade SQL, valor:
UPDATE Empreg SET Nome = :Nome
WHERE CodEmp = :Codigo

Programação Básica em C++ Builder 32


Práticas de C++ Builder

24) Altere a Caption do formulário para “Inclusão/Alteração” e chame-o “J_IncluiAltera”.


Salve-o com o nome IncAlt.cpp.
25) Programe o evento OnClick do botão “OK” com as seguintes linhas de comando:
if (Caption == "Inclusão") {
quIncluir->Params->Items[0]->AsInteger = StrToInt(edCodigo->Text);
quIncluir->Params->Items[1]->AsString = edNome->Text;
quIncluir->ExecSQL();
} else {
quAlterar->Params->Items[0]->AsString = edNome->Text;
quAlterar->Params->Items[1]->AsInteger = StrToInt(edCodigo->Text);
quAlterar->ExecSQL();
}

Obs.: As expressões “Params->Items[0]” e “Params->Items[1]” representam o


primeiro e o segundo parâmetro definido para o componente (respectivamente
“Codigo” e “Nome”). Isto é equivalente às expressões “ParamByName("Codigo")” e
“ParamByName("Nome")”

Chamando a inclusão/alteração
26) Volte para o formulário principal.
27) Programe o evento OnClick do botão “Incluir” do formulário principal com as seguintes
linhas de comando:
J_IncluiAltera->edCodigo->Clear();
J_IncluiAltera->edNome->Clear();
J_IncluiAltera->Caption = "Inclusão";
J_IncluiAltera->edCodigo->ReadOnly = false;
J_IncluiAltera->ShowModal();
quConsultar->Close();
quConsultar->Open();

28) Programe o evento OnClick do botão “Alterar” do formulário principal com as seguintes
linhas de comando:
J_IncluiAltera->edCodigo->Text = GridConsulta->Fields[0]->AsString;
J_IncluiAltera->edCodigo->ReadOnly = true;
J_IncluiAltera->edNome->Text = GridConsulta->Fields[1]->AsString;
J_IncluiAltera->Caption = "Alteração";
J_IncluiAltera->ShowModal();
quConsultar->Close();
quConsultar->Open();

29) Para que o formulário de inclusão e alteração possa ser chamado a partir do formulário
principal, é necessário usá-lo no formulário principal, através do menu File | Include Unit
Hdr. Escolha a Unit IncAlt.

30) Execute e teste a sua aplicação.

Consultando “dados vivos”

31) Teste a aplicação, tentando incluir, alterar ou excluir algum registro através do DBGrid. Não
é possível, pois o comando SELECT do SQL retorna valores somente de leitura.
32) Configure a propriedade RequestLive do componente quConsultar para True. Agora, os
dados no DBGrid podem ser alterados, da mesma forma que com um componente Table.

Programação Básica em C++ Builder 33


Práticas de C++ Builder

Obs. 1: ATENÇÃO, são restritas as condições nas quais isto é possível. Não é permitido, por
exemplo, utilizar “dados vivos” quando se junta duas ou mais tabelas. Consulte o
Help da propriedade RequestLive para informações mais detalhadas.
Obs. 2: A utilização de “dados vivos” tem um impacto negativo no desempenho, conforme
será visto posteriormente.

Usando o Visual Query Builder


33) Crie um novo formulário para fazer consultas utilizando o Visual Query Builder, de acordo
com a figura abaixo, com os seguintes componentes: 2 componentes Edit, chame um de
edSalario e o outro de edData; 1 componente Button, chame-o de btExecutar; 1 componentes
BitBtn, chame-o de btFechar (propriedade Kind = bkCancel); 1 componentes Query, chame-
o de quVQB; 1 componente DataSource e 1 DBGrid
34) Faça a ligação entre o DBGrid, o DataSource e o Query. Configure a propriedade
DatabaseName do Query para PratSQL.

35) Ative o Visual Query Builder, clicando com o botão da direita no componente Query e
escolhendo a opção SQL Builder.... Na caixa de diálogo Add Table, adicione a tabela
EMPREG.DB e então clique no botão Close.

Programação Básica em C++ Builder 34


Práticas de C++ Builder

36) Selecione os campos CodEmp, Nome, Salário e Contratação. Preencha a página chamada
Criteria conforme mostrado na figura.
37) Selecione o botão SQL, ícone , para ver o código SQL gerado. Feche esta janela e
selecione o botão , para sair do Query Builder. Confirme a gravação da query. Veja o
conteúdo da propriedade SQL do componente quVQB.

38) Altere o conteúdo da propriedade SQL do componente quVQB para deixá-la com o seguinte
código:

SELECT CodEmp, Nome, Contratacão, Salário


FROM "Empreg.DB" Empreg
WHERE (Contratacão < :Data)
AND (Salário > :Salario)

39) Programe o botão Executar com:


quVQB->Close();
quVQB->Params->Items[0]->AsDate = StrToDate(edData->Text);
quVQB->Params->Items[1]->AsFloat = StrToFloat(edSalario->Text);
quVQB->Open();

40) Chame esse formulário de J_Consulta, altere o seu título para, “Usando o Visual Query
Builder” e salve-o com o nome Consulta.cpp.
41) No formulário principal programe o botão Consultar com:
J_Consulta->ShowModal();

42) Faça com que o formulário principal enxergue a unit Consulta.cpp.


43) Execute e teste a aplicação, entrando na tela de consulta e fornecendo o valor 30000 no edit
salário e o valor 01/01/92 no edit Data. Deverão ser selecionados os empregados com salário
maior que 30000, que foram contratados antes de 01/01/92. Teste com outros valores.

Programação Básica em C++ Builder 35


Práticas de C++ Builder

PRÁTICA 7

1. Assunto
Usando um Sistema Gerenciador de Banco de Dados

2. Tópicos abordados
• Criando banco de dados no Interbase
• Criando tabela no ISQL
• O componente Database
• Criando uma janela de login
• Migrando para o SQL Server

3. Introdução teórica
Com o C++ Builder é possível desenvolver aplicações utilizando banco de dados locais
(tipo Paradox ou dBase), utilizando o componente Table e até mesmo o Query. Existem, no
entanto, várias vantagens (segurança, por exemplo) na utilização de um Sistema Gerenciador de
Banco de Dados (SGBD).
O Interbase é um SGBD desenvolvido pela Borland (Inprise). Juntamente com o C++
Builder é distribuída uma cópia de uma versão do Interbase. Esta versão aceita conexões
simultâneas de até 5 usuários por vez, e pode ser utilizada para desenvolver sistemas que
utilizam um SGBD. Ou seja, pode-se dispor de todas as características de um SGBD, sem os
perigos de se utilizar um servidor que esteja em operação e sem mesmo a necessidade de dispor
desse servidor. Posteriormente a aplicação pode ser facilmente migrada para o SGBD que
realmente irá hospedar os dados, que pode ser o próprio Interbase. A Inprise liberou a licença de
distribuição do Interbase 6.0 (Inclusive liberou fontes) e esta é sem dúvida uma excelente
alternativa para aqueles clientes que não pretendem gastar muito.
Por motivo de segurança, todo SGBD exige que seja feita uma conexão, fornecendo nome
do usuário e senha sempre que for utilizado. Todo SGBD necessita de atividades relacionados à
sua administração, como criação/alteração/eliminação de tabelas, inclusão/exclusão de usuários,
atribuição de permissões, configurações a respeito de memória, disco, etc. O usuário que realiza
estas tarefas e tem plenos poderes é o Administrador de Banco de Dados (DBA - DataBase
Administrator). No Interbase este usuário se chama SYSDBA. O SYSDBA possui uma senha
default (é masterkey) que deve ser alterada quando o banco começa efetivamente a ser utilizado
(por motivo de segurança, é claro; o SYSDBA é semelhante ao root do Unix).
O componente Database não é necessário para acesso a banco de dados, mas ele
proporciona controle adicional sobre fatores que são extremamente importantes em aplicações
cliente/servidor. Alguns desses fatores são: conexão com o SGBD, processamento de transações,
níveis de isolamento, etc. Quando não é criado um componente Database explicitamente e o
programa acessa alguma tabela em um banco de dados, o C++ Builder cria um componente
Database temporário (virtual)
A propriedade AliasName é o nome de um alias do BDE existente. A propriedade
DatabaseName é o nome de uma conexão de banco de dados que pode ser utilizada pelos
componentes de acesso a dados (Table e Query, por exemplo). Em outras palavras, esta
propriedade cria um alias interno ao programa que aparece na lista da propriedade
DatabaseName dos componentes de acesso a dados. Isto permite que os recursos oferecidos pela
componente Database estejam disponíveis aos componentes de acesso a dados.

Programação Básica em C++ Builder 36


Práticas de C++ Builder

Para trabalhar com um SGBD remoto no C++ Builder deve-se, em primeiro lugar , possuir
a versão Enterprise. Ela disponibiliza alguns drivers nativos, para Oracle, SQL-Server, Sybase,
Informix, DB2 e Interbase. Além disso, pode-se utilizar outros SGBDs, através de ODBC.
O processo inicia com a criação do alias no BDE com o driver correspondente fazendo as
configurações necessárias a cada SGBD. Alguns necessitam que alguns produtos estejam
instalados. No Oracle, por exemplo, deve-se instalar o SQL-Net além de especificar denominada
DLL que é necessária. A documentação do C++ Builder apresenta mais detalhes sobre a
configuração dos aliases para cada tipo de banco de dados suportado.
Nesta prática, será utilizado o Interbase para demonstrar os conceitos gerais sobre SGBD.
Depois disso, a aplicação será alterada para acessar um banco de dados idêntico no SQL-Server,
desenvolvido pela Microsoft e muito utilizado em conjunto com o Windows NT. Isso mostra que
pode-se desenvolver uma aplicação localmente e depois, quando estiver pronta, migrar o seu
banco de dados para um servidor remoto. Se a aplicação não utilizar nenhum recurso específico
do servidor, a migração é completamente transparente, sendo necessária somente a alteração do
alias.

4. Exercícios

Trabalhando com o Interbase


1) Crie um diretório chamado “PratCS”.
2) Verifique se o Interbase está realmente executando, na barra de tarefas do Windows, no
canto inferior direito da tela: . Dê um duplo clique no ícone referente
ao Interbase para ativar a janela Propriedades de InterBase Guardian. Abandone então esta
janela. Caso o interbase não esteja sendo executado, ative o ative o programa InterBase
Server Manager (Menu Iniciar | Programas | InterBase | Intebase Server Manager) e
clique no botão Start.
3) No grupo de programas InterBase execute o programa InterBase Console, representado pelo
ícone .[

4) No InterBase Console use o menu Server | Register... para ativar a janela de registro e
conexão de servidores. Configure-a conforme mostrado na figura abaixo.

Programação Básica em C++ Builder 37


Práticas de C++ Builder

5) Use o menu Database | Create Database para ativar a janela de criação de banco de dados.
Configure-a conforme a figura abaixo:

6) Será assumido agora que o diretório criado no passo 1 é C:\PratCS. Se o seu diretório não é
C:\PratCS, substitua.
7) Preencha os campos: Alias = “PratCS”, Files = “C:\PratCS\PratCS.gdb”; SQL Dialect = 1,
“User Name = SYSDBA”; “Password = masterkey”. Então pressione o botão OK.
8) Use o menu Tools | Interactive SQL… para ativar o ISQL do interbase.
9) Crie uma tabela chamada CLIENTE, com os campos “Codigo” e “Nome”. Para isso, digite
as seguintes linhas de comando em SQL DDL (Data Definition Language) na janela
principal do ISQL:
CREATE TABLE cliente
(CodCliente integer not null primary key,
Nome char(25));

10) Pressione o botão para executar o comando e criar a tabela. Não abandone esse
programa.

Criando um alias no BDE


11) Abra o programa Database Explorer a partir do menu Database do C++ Builder ou através
do grupo de programas Borland C++ Builder 4.
12) Atribua o nome “PratCS” para o alias e escolha o tipo “INTRBASE”. Será criado o novo
alias com valores default. Substitua o parâmetro SERVER NAME (no lado direito da tela)
para C:\PratCS\PratCS.gdb e o parâmetro USER NAME para SYSDBA.
Obs.: Se o seu diretório não é C:\PratCS, substitua-o.

Programação Básica em C++ Builder 38


Práticas de C++ Builder

13) Grave a definição do alias através do opção de menu Object | Apply. Abandone este
programa.

Copiando uma tabela pelo Data Migration Wizard


44) Chame o programa Data Migration Wizard, através do menu Iniciar | Programas | Borland
C++ Builder 4 | Datapump, ícone .
45) Mantenha a seleção default do botão de rádio Select by alias name e escolha BCDEMOS
como alias de origem. Pressione o botão Next > e escolha o alias PratCS como alias
destino. Forneça a senha masterkey para fazer o login no servidor Interbase. Pressione o
botão Next > e escolha a tabela ANIMALS.DBF. Pressione novamente o botão Next > e
então selecione o botão Upsize. Finalize escolhendo o botão Done.

Criando uma tabela no Database Explorer


14) Entre novamente no Database Explorer e abra o banco de dados PratCS dando um clique
duplo sobre o alias. Forneça a senha masterkey para fazer o login no servidor.
15) Dê um clique duplo novamente para visualizar os itens disponíveis e selecione Tables. Crie
uma nova tabela através da opção de menu Object | New. Substitua o nome sugerido
TABLE1 por PEDIDO.
16) Crie agora os campos da tabela PEDIDO. Dê dois cliques sobre a tabela e selecione
Columns. Clique com o botão da direita sobre Columns (eqüivale à opção de menu Object |
New) e selecione a opção New do menu, para criar a primeira coluna (campo). Substitua o
nome default COLUMN1 por CodPedido. No lado direito da janela, na guia Definition,
preencha o Type (tipo) com SMALLINT e Nulls com No (para não permitir valores nulos)
de acordo com a figura abaixo.

17) Crie os demais campos, selecionando, para cada um deles, o item Columns e clicando com o
botão da direita do mouse. Os campos são:
CAMPO TIPO
DATA DATE
VALOR FLOAT
CODCLIENTE SMALLINT
Programação Básica em C++ Builder 39
Práticas de C++ Builder

18) Defina o campo CodPedido como chave primária, clicando com o botão da direita em
Primary Key e selecionando New. Então, clique em Columns e selecione New novamente.
19) Salve as alterações ao banco de dados PratCS selecionando o alias com o botão da direita e
escolhendo a opção Apply do menu.

Copiando uma tabela pelo Database Desktop


20) Entre no DataBase Desktop e escolha a opção de menu Tools | Utilities | Copy para ativar a
janela Copy. Selecione o alias DBDEMOS na combobox embaixo no formulário e a tabela
Employee.db.
21) Clique no botão OK para ativar a janela Copy Employee.db To:. Selecione o alias PratCS e
forneça o nome EMPREG. Será apresentada a janela de conexão, para verificar se o usuário
tem o direito ou não de criar a tabela. Utilize o usuário “SYSDBA” e a senha masterkey.
22) Efetue a cópia clicando no botão Copy. A tabela é copiada do Paradox para o InterBase,
sendo realizada uma conversão padrão dos tipos de campos.

Criando uma tabela no Database Desktop


23) No Database Desktop crie uma nova tabela ITEM do Interbase através do menu File | New |
Table, escolhendo o tipo INTRBASE. Introduza os seguintes campos:
Field Name Type Size Dec
1 CodItem SHORT
2 Preco FLOAT
3 Quantidade SHORT
4 CodPedido SHORT
24) Repare que não existem tantas opções de configuração de tabelas para o Interbase como para
o Paradox. Na realidade o Database Desktop não é adequado para a administração do
Interbase. Estas funções são melhor desempenhadas utilizando manualmente os comandos
da DDL do SQL através do programa InterBase Interactive SQL ou através do Database
Explorer.
25) Clique no botão Save As para salvar e forneça o nome ITEM e o alias PratCS. Agora, não
mais será apresentada a janela de conexão, pois ela foi realizada na cópia da tabela
Employee.DB.
26) Saia do Database Desktop e retorne ao programa InterBase Console. Selecione o banco de
dados PratCS e liste as tabelas que compõem este banco de dados, usando a opção de menu
Database | View Metadata.... Note que além da tabela CLIENTE criada neste banco de
dados estão também as tabelas ANIMALS (copiada pelo Data Pump), PEDIDO (criada no
Database Explorer), EMPREG (copiada a partir de uma tabela Paradox) e ITEM (criada no
Database Desktop).
27) Saia deste programa e ative o C++ Builder.

O componente Database
28) Crie um Data Module através do menu File | New Data Module.

29) Clique no ícone , correspondente ao componente Database na página Data Access da


Paleta de Componentes. Posicione o componente no Data Module e configure a propriedade
AliasName para “PratCS” e a propriedade DatabaseName para “BDCliente”. BDCliente
Programação Básica em C++ Builder 40
Práticas de C++ Builder

será utilizado nos componentes DataSet em substituição ao alias. Quando se usa o


componente Database somente ele precisa se referenciar diretamente ao alias externo.

30) Introduza um componente Query, ícone , também da página Data Access, configurando
as seguintes propriedades:
DatabaseName = BDCliente
SQL = SELECT * FROM EMPREG ORDER BY EMPNO
RequestLive = True
Obs. 1: Ao tentar ativar o componente Query será solicitada a conexão com o banco de
dados. Utilize novamente o usuário SYSDBA e a senha masterkey.
Obs. 2: Quando se ativa qualquer dataset .associado a um componente Database é solicitada
a conexão com o servidor. Em caso de sucesso na conexão a propriedade
Connected é configurada automaticamente para True.
31) Programe o evento OnCreate do DataModule com o seguinte código:
Query1->Open();

32) Salve o Data Module com o nome DataMod.cpp


33) Selecione o formulário e faça com que ele use o Data Module (File | Include Unit Hdr).
Introduza componentes DataSource e DBGrid, fazendo as configurações necessárias com o
Query no Data Module.
34) Altere a Caption do formulário para “Usando um SGBD” e o nome para “J_Principal”.
35) Execute e teste o programa. Será novamente solicitada a conexão com o banco de dados.
Teste a alteração e inclusão de novos empregados. Quando se usa o componente Query não
são refletidas automaticamente as inclusões que são realizadas. Programe o evento
AfterPost de Query1:
int marcaEmp;
TLocateOptions locateOptions;

locateOptions = locateOptions << loCaseInsensitive;


marcaEmp = DataModule1->Query1->FieldByName("EmpNo")->AsInteger;
Query1->DisableControls();
Query1->Close();
Query1->Open();
Query1->Locate("EmpNo", marcaEmp, locateOptions);
Query1->EnableControls();

36) Salve o formulário com o nome Main.cpp e o projeto com o nome PratCS.bpr

Inibindo a janela de conexão


37) Configure a propriedade LoginPrompt do Database para “False” e a propriedade Params
com:
USERNAME=SYSDBA
PASSWORD=masterkey

Obs.: Isto inibirá a janela inicial de solicitação de nome de usuário e senha para a conexão.
Mas, cuidado ! Este método não é seguro.
38) Execute o programa. Verifique que não será apresentada a janela de conexão.

Programação Básica em C++ Builder 41


Práticas de C++ Builder

Customizando a janela de conexão


39) Crie um novo formulário de acordo com a figura abaixo:

40) Chame os componentes de edUsuário e edSenha de acordo com a sua função. Configure a
propriedade PasswordChar do edSenha com * (asterisco) para ocultar a senha enquanto o
usuário está digitando.
41) Altere a propriedade BorderStyle do formulário para bsDialog, propriedade Name para
J_Login, propriedade Caption para Conexão com o SGBD, propriedade Position para
poScreenPosition e salve-o com o nome Login.cpp.
42) Modifique o formulário para a lista dos formulários disponíveis, através de Project |
Options.
43) Configure o componente Database alterando as propriedades LoginPrompt para “True”,
para que seja novamente realizada a conexão com o servidor.
44) Programe o evento OnLogin do Database com as seguintes linhas de código:
J_Login = new TJ_Login(Application);
try {
if (J_Login->ShowModal() == mrOk) {
LoginParams->Values["USER NAME"] = J_Login->edUsuario->Text;
LoginParams->Values["PASSWORD"] = J_Login->edSenha->Text;
} else {
Application->Terminate();
}
} catch (...) {}
delete J_Login;

45) Faça com que o Data Module use o formulário de login, através da opção File | Include Unit
Hdr.
46) Execute e teste o programa. Caso seja digitada usuário e senha corretos (SYSDBA e
masterkey, por exemplo) a conexão é realizada. Se o usuário cancelar a conexão, é
executado o Comando Application->Terminate() e a aplicação é finalizada.
47) Teste novamente digitando usuário e/ou senha incorretos. Agora ocorre uma exceção !
48) Para tratar a exceção adequadamente, configure a propriedade Connected do Database para
False e altere a programação do evento OnCreate do DataModule:
try {
Database1->Open();
Query1->Open();
} catch (Exception &e) {
Application->MessageBox("Usuário ou Senha são inválidos!",
"Falha na conexão", MB_OK | MB_ICONHAND);
Application->Terminate();
}

49) Execute e teste o programa digitando usuário e/ou senha inválidos.

Programação Básica em C++ Builder 42


Práticas de C++ Builder

Melhorando o diálogo de login


50) Através do Object Inspector, retire a programação do evento OnLogin do componente
Database. Não é necessário apagar o tratador de eventos, apenas fazer com que ele não seja
ativado.
51) Configure a propriedade LoginPrompt do Database para “False”
52) Substitua o evento OnCreate do Data Module por:
int tentativas;
bool usrInvalido;

J_Login = new TJ_Login (Application);


tentativas = 1;
usrInvalido = true;
while (usrInvalido) {
if (J_Login->ShowModal() == mrOk) {
Database1->Params->Values["USER NAME"] = J_Login->edUsuario->Text;
Database1->Params->Values["PASSWORD"] = J_Login->edSenha->Text;
try {
Database1->Open();
Query1->Open();
usrInvalido = false;
} catch (...) {
Application->MessageBox( "Usuário ou Senha são inválidos! ",
"Falha na conexão",
MB_OK | MB_ICONHAND);
if (++tentativas > 3) break;
}
}
else break;
}
delete J_Login;
if (usrInvalido) {
Application->ShowMainForm = false;
Application->Terminate();
}

53) Dessa forma o usuário pode fazer três tentativas de conexão. Teste a aplicação.

Migrando para o SQL Server


54) Abra o Database Explorer e crie um alias para um banco de dados existente no servidor SQL
Server. A partir de Object | New, escolha o driver MSSQL. Configure as propriedades
DATABASE NAME para BancoXX, onde XX é o seu número; SERVER NAME para
Lab7-01 (identificação do servidor onde está rodando o SQL Server); e a propriedade USER
NAME para sa. Altere o nome do alias para PratMSSQL e salve as alterações realizadas.
55) Chame o programa Data Migration Wizard (menu Iniciar | Programas | Borland C++
Builder 4 | Datapump) e copie as tabelas CLIENTE, EMPREG, ITEM e PEDIDO do alias
PratCS para o alias PratMSSQL.
56) Retorne ao C++ Builder. Altere a propriedade AliasName do componente Database para
PratMSSQL. Execute e teste a aplicação, conectando-se com o usuário sa e senha vazia.
57) Dessa forma, pode-se notar que a migração de uma aplicação de um banco de dados para
outro envolve praticamente nenhuma modificação no C++ Builder, a menos que alguma
característica específica de um servidor tenha sido utilizada.

Programação Básica em C++ Builder 43


Práticas de C++ Builder

Gerenciando usuários e permissões


58) Execute o programa Interbase Console, representado pelo ícone no grupo de programas
InterBase.
59) Execute a conexão com o servidor, através da opção Server | Login.... Utilize o usuário
(campo User Name) SYSDBA e senha (campo Password) masterkey.
60) Ative a janela User Information através da opção de menu Server | User Security. Clique
no botão “New” e preencha os campos: “User Name = USUARIO1”; “Password = xyz”;
“Confirm Password = xyz”. Então pressione Apply.
61) Ative o Interactive SQL (menu Tools | Interactive SQL) e conecte-se ao servidor Interbase
através do menu Database | Connect As. Preencha os campos conforme a figura abaixo e
então pressione OK.

62) Atribua permissão somente de consulta ao usuário “USUARIO1” para a tabela EMPREG,
com o seguinte comando:
grant SELECT on EMPREG to USUARIO1

63) Sem sair do Interactive SQL, retorne ao C++ Builder, altere a propriedade AliasName do
componente Database1 da aplicação para PRATCS e execute o programa conectando-se
como usuário “USUARIO1” e senha “xyz”. Experimente tentar incluir um novo empregado
na tabela. Como este usuário não tem permissão de gravação sobre esta tabela, será
apresentada uma mensagem de erro!
64) Retorne ao programa Interactive SQL e atribua todas as permissões ao usuário
“USUARIO1” para a tabela EMPREG, com o seguinte comando:
grant ALL on EMPREG to USUARIO1

65) Teste novamente o programa no C++ Builder. Agora todas as operações são permitidas,
inclusive, inserção, exclusão e atualização.
66) Retorne ao programa InterBase Interactive SQL e retire todas as permissões do usuário
“USUARIO1” para a tabela EMPREG, com o seguinte comando:
revoke all on EMPREG from USUARIO1

Programação Básica em C++ Builder 44


Práticas de C++ Builder

67) Teste novamente o programa no C++ Builder. Agora nenhuma operação é permitida, nem
mesmo consultar a tabela.
68) No programa InterBase Console, remova o usuário USUARIO1, através da opção Server |
User Security. Selecione o usuário, clique no botão Delete User e confirme.

Dando shutdown no Servidor Interbase


69) Dê o shutdown do Servidor Interbase. Isto significa “derrubar” o servidor, ou seja, terminar o
processo que estava rodando em background. Clique com o botão da direita no ícone do
Interbase no canto inferior direito da tela, na barra de tarefas do Windows e escolha a opção
Shutdown. Ele informa que há conexões ativas. Responda OK para cancelar a conexão.
Obs: No caso de estar rodando em uma máquina NT, o ícone referido acima não irá aparecer,
pois o servidor estará rodando como um serviço NT. Neste caso é preciso ativar o Interbase
Manager, através da opção Interbase | Interbase Server Manager do menu Iniciar. Com o
Interbase Manager ativo, pressiona-se o botão Stop.

Programação Básica em C++ Builder 45

Vous aimerez peut-être aussi