Académique Documents
Professionnel Documents
Culture Documents
C++ Builder
Autor:
Leônidas Francisco de Lima Júnior
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
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
• 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.
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 !
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
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.
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;
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.
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.
4. Exercícios
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.
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
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.
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
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
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.
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)
4. Exercícios
Uma outra forma de inserir um registro usando o grid é pressionar a tecla Insert, que
realizará a inserção no ponto atual do cursor.
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.
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();
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?
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?
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.
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
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:
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 !
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.
12) Pressione no botão e escolha o nome emp.db para o arquivo que armazenará a
tabela.
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.
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.
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.
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();
}
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.
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.
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.
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.
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.
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:
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();
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.
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
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.
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.
13) Grave a definição do alias através do opção de menu Object | Apply. Abandone este
programa.
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.
O componente Database
28) Crie um Data Module através do menu File | New Data Module.
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();
36) Salve o formulário com o nome Main.cpp e o projeto com o nome PratCS.bpr
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.
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();
}
53) Dessa forma o usuário pode fazer três tentativas de conexão. Teste a aplicação.
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
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.