Transcript
Page 1: Apostila Delphi - RADStudio2007-121101142350

MINISTÉRIO DA EDUCAÇÃO

SECRETARIA DE EDUCAÇÃO MÉDIA E TECNOLÓGICA

Instituto Federal de Educação, Ciência e Tecnologia do Amazonas

DIRETORIA DE ENSINO

GERÊNCIA EDUCACIONAL DA ÁREA DE SERVIÇOS

Curso Técnico em Informática – SINF32

Prof. Manoel Pantoja A. Jr.

Apostila de Delphi

1. IDE

O ambiente de desenvolvimento é composto de várias partes compondo um

conjunto integrado de janelas que interagem entre si.

Figura 1 – Tela do Ambiente de Desenvolvimento Delphi 2007

1.1 FORM DESIGN

O Form representa as janelas do Windows que compõem a aplicação. O form é

responsável pela interação entre usuário e máquina, além de servir de base para os

demais componentes.

O form tem características de uma janela comum do windows, botões (Maximizar,

Minimizar, fechar e controle) e ícones que podem ser modificados para uma

aplicação.

Page 2: Apostila Delphi - RADStudio2007-121101142350

6

Figura 1.1 – Tela do Formulário

1.2 BARRA DE MENU PRINCIPAL

A barra de menu principal, contém todos os menus da aplicação.

Figura 2 – Barra de Menu Principal

1.3 PALETA DE COMPONENTES

Todos os componentes que podem ser utilizados no Delphi2007 encontram-se na

janela Tool Palette localizado ao lado direito da tela.

Figura 3 – Tool Palette

Page 3: Apostila Delphi - RADStudio2007-121101142350

7

Para que os componentes disponíveis na tool palette sejam inseridos no form,

podemos proceder das seguintes formas:

Clicando duas vezes sobre o componente deseja;

Clicar uma vez sobre o componente e em seguida clicar no form;

Clicando sobre o compoente e arrastá-lo até o form;

1.4 OBJECT INSPECTOR

É uma das janelas mais importantes do Delphi2007, pois nela podemos definir as

características dos componentes utilizados na aplicação.

Nela encontramos 2 (duas) guias:

Properties – responsável pelas informações a respeito das propriedades de cada

componente selecionado.

Events – Define quais os eventos que um determinado componente pode realizar e

que serão definidos pelo desenvolvedor.

Temos ainda uma caixa de combinação, onde podemos selecionar um componente

de forma mais rapidamente.

Figura 4 – Object Inspector Por exemplo, ao selecionarmos o componente Form, temos algumas propriedades:

Caption – permite a inserção de um rótulo de dados no componente;

Page 4: Apostila Delphi - RADStudio2007-121101142350

8

Align – Permite a definição do alinhamento;

Font – Permite a definição de uma fonte padrão para o form.

Icon – Define o ícone que será apresentado no form.

Perceba que ao lado esquerdo da propriedade Font existe um sinal de +, isto

significa que toda e qualquer propriedade que possua este símbolo tem a

característica de mostrar subpropriedades.

Já a propriedade Icon possui ao seu lado direito o símbolo ( … ), isto significa que

todo e qualquer propriedade que possua este símbolo abrirá um caixa de diálogo ao

ser acionado.

1.5 CODE EDITOR

É o responsável por toda parte de programação do Delphi2007, tais como:

declarações de variáveis, definição de objetos, bibliotecas, etc. Todas as

implementações realizadas pelo desenvolvedor no Delphi2007, será feito do Code

Editor.

Figura 5 – Code Editor

Uma característica muito interessante no Code Editor é que ao inserirmos um

componente no form, o mesmo é declarado automaticamente no editor de código.

Page 5: Apostila Delphi - RADStudio2007-121101142350

9

Figura 6 – Tela de Formulário Figura 7 – Tela do Code Editor

1.6 CODE INSIGHT

Um recurso que vai facilitar nossa vida no momento de desenvolvimento de código é

o Code Insight do Code Editor.

Ele atua como um ajudante de complemento junto ao código do desenvolvedor. Por

exemplo, ao digitar o nome de um objeto seguido de ponto (.) abre-se uma listagem

de métodos e propriedades que podem ser utilizadas neste objeto.

Figura 8 – Code Insight

1.7 CONFIGURAÇÕES DE AMBIENTE

Você pode personalizar o ambiente através do menu Tools | Options | Environment

Options, algumas opções podemos julgar importantes:

Page 6: Apostila Delphi - RADStudio2007-121101142350

10

1.7.1 Autosave Options

Editor files – Grava os arquivos fonte (.PAS) no momento da compilação, evitando

perda de código em caso de travamento da máquina. Porém, não permite compilar

um determinado projeto sem salva-lo antes.

Project Desktop - Grava a posição das janelas do projeto atual.

1.7.2 Compiling and Running

Show Compiler Progress – Mostra o progresso da compilação do projeto;

Minimize on run – Minimiza o codegear durante a execução do projeto;

2. TECLAS IMPORTANTES

Tecla Função

F12 Alterna entre o code editor e o form designer.

F11 Alterna entre o code editor, form designer e a object inspector.

F10 Torna o foco para a janela principal.

F9 (RUN) Permite compilar e executar o projeto para testes. Este processo gera automaticamente o arquivo .EXE no diretório onde foi gravado o arquivo de projeto (.DPR).

CTRL + F9 Permite compilar o projeto sem executar. Ideal para conferência de código.

SHIFT + F12 Permite alternar entre os formulários do projeto. Equivalente ao ícone View Form na SpeedBar.

CTRL + F2 Permite ‘destravar’ o Delphi em caso de testes onde ocorram exceções, como veremos mais adiante.

3. PROJETOS NO 2007

Um projeto nada mais é do que um conjunto de arquivos necessários para gerar

uma aplicação.

Vamos destacar alguns arquivos:

Page 7: Apostila Delphi - RADStudio2007-121101142350

11

Extensão Tipo e descrição Criação Necessário para compilar?

.PAS

Arquivo Pascal: o código-fonte de uma unidade Pascal, ou uma unidade relacionada a um formulário ou uma unidade independente.

Desenvolvimento Sim.

.DPROJ Arquivo Delphi Project. (Contém código-fonte em Pascal.)

Desenvolvimento Sim.

.DFM

Delphi Form File: um arquivo binário (na versão 5 pode ser convertido para texto) com a descrição das propriedades de um formulário e dos componentes que ele contém.

Desenvolvimento Sim. Todo formulário é armazenado em um arquivo PAS e em um arquivo DFM.

.DCU

Delphi Compiled Unit: o resultado da compilação de um arquivo Pascal.

Compilação Apenas se o código-fonte não estiver disponível. Os arquivos DCU para as unidades que você escreve são um passo intermediário; portanto, eles tornam a compilação mais rápida.

.BMP, .ICO,

.CUR

Arquivos de bitmap, ícone e cursor: arquivos padrão do Windows usados para armazenar imagens de bitmap.

Desenvolvimento: Image Editor

Normalmente não, mas eles podem ser necessários em tempo de execução e para edição adicional.

.CFG

Arquivo de configuração com opções de projeto. Semelhante aos arquivos DOF.

Desenvolvimento Necessário apenas se opções de compilação especiais foram configuradas.

.DOF

Delphi Option File: um arquivo de texto com as configurações atuais para as opções de projeto.

Desenvolvimento Exigido apenas se opções de compilação especiais foram configuradas.

.DSK

Arquivo de Desktop: contém informações sobre a posição das janelas do Delphi, os arquivos abertos no editor e outros ajustes da área de trabalho.

Desenvolvimento Não. Você deve excluí-lo se copiar o projeto em um novo diretório.

.EXE

Arquivo executável: o aplicativo Windows que você produziu.

Compilação: Ligação (linking)

Não. Esse é o arquivo que você vai distribuir. Ele inclui todas as unidades compiladas, formulários e recursos.

.~PAS

Backup do arquivo Pascal Pode ser ativado ou desativado através do Menu Tools – Options – Editor Options - Item: Create backup file.

Desenvolvimento Não. Esse arquivo é gerado automaticamente pelo Delphi, quando você salva uma nova versão do código-fonte.

3.1 SALVAR PROJETO

Para salvar um projeto no delphi 2007, você tem 4 opções :

Page 8: Apostila Delphi - RADStudio2007-121101142350

12

Comando Objetivo

Save Salvar apenas a unidade selecionada

Save As... Salvar a unidade selecionada como... pode-se renomear ou trocar de pasta (duplicando) o arquivo.

Save Project As... Salvar o projeto como… pode-se renomear ou trocar de pasta (duplicando) o arquivo.

Save All Grava todos os arquivos do projeto, e atualiza-os caso já sejam salvos.

Caso seja a primeira vez que o projeto será salvo, aparecerá a janela padrão do

Windows, onde deve ser preenchido o nome do arquivo e o local onde o mesmo

será salvo.

3.2 ABRIR O PROJETO

Todo projeto é identificado por um arquivo com extensão .DPROJ, desta forma para

abrir um projeto no codegear, basta ir no menu File e escolher uma das 3 (três)

opções Open; Open Project; Reopen.

Comando Objetivo

Open Permite abrir um arquivo .DPROJ, .PAS entre grupos de projeto.

Open Project... Permite abrir um arquivo de projeto.

Reopen Permite reabrir um arquivo (DPROJ ou PAS) utilizado anteriormente.

3.3 OPÇÕES DE PROJETO

É possível configurar vários itens do sistema através do Projects | Options:

Figura 9 – Tela de Opções do Projeto

Page 9: Apostila Delphi - RADStudio2007-121101142350

13

Forms :

Main form – Permite a escolha do formulário principal da aplicação;

Available forms – Os formulários available (disponíveis) em caso de criação

em tempo de execução.

Application:

Title – Define um nome para a aplicação diferente do nome do arquivo .DPR;

Help File – Define o nome do arquivo de Help associado à aplicação;

Icon – Define o ícone utilizado no arquivo executável;

Compiler

Estas opções permitem especificar uma compilação personalizada, ou seja,

cada projeto pode ser compilado com uma característica.

Linker

Estas opções incluem informações para a depuração.

Directories/Conditionals

Nesta guia pode-se configurar o diretório de saída para os arquivos gerados

pela aplicação.

Version Info

Estas informações podem ser visualizadas no Windows através do menu

rápido do mouse no arquivo executável.

Packages

Os packages permitem um controle de distribuição através de DLL’s básicas

externas ao executável entre outros recursos.

4 CONVENÇÃO DE NOMEAÇÃO

Para qualquer componente existente no projeto a principal propriedade é a name,

pois ela define o nome da variável que será utilizado no código escrito em Object

Pascal Grande parte dos desenvolvedores adota uma convenção para

facilitar/organizar o desenvolvimento/manutenção de sistemas. O Delphi 2007 adota

Page 10: Apostila Delphi - RADStudio2007-121101142350

14

como padrão o nome da classe da qual o componente é instanciado e um número

crescente de acordo com o número de vez que aquele componente é utilizado no

form. Exemplo: Button1; Button2, Label1, etc.

5 MANIPULANDO COMPONENTES

Vimos anteriormente que existem 3 formas de adicionarmos um componente no

objeto form. Uma vez que os objetos estejam adicionados podemos manipulá-los de

diversas formas.

Para selecionar um objeto, basta apenas clicar sobre o mesmo ou ir à janela do

object inspector e selecionarmos o componente desejado na caixa de diálogo. Para

selecionarmos um conjunto de objetos, basta pressionarmos a tecla SHIFT e clicar

nos objetos desejados.

Estando o(s) objeto(s) selecionado(s), para posicioná-los no local desejado, basta

arrastar com o mouse ou utiilizar as teclas de combinação CTRL + SETAS. Para

redimensioná-los, utilize a combinação SHIFT + SETAS.

Figura 10 – Selecionando Vários Objetos

6 MANIPULANDO EVENTOS

A guia Events do object Inspector permite ao desenvolvedor criar um manipulador de

evento, onde o usuário ou o próprio sistema poderá disparar um determinado evento.

Um evento é uma ação disparada dentro de uma aplicação. Exemplo:

Evento Ocorrência

OnClick Quando o usuário clicar uma vez com o botão esquerdo do mouse sobre o componente.

OnDblClick Quando o usuário dá um duplo clique no componente com o botão

Page 11: Apostila Delphi - RADStudio2007-121101142350

15

esquerdo do mouse.

OnEnter Quando o componente recebe o foco.

OnExit Quando o componente perde o foco.

OnKeyPress Quando pressiona uma única tecla de caractere.

Exemplo 1 : Codificando um objeto button.

Insira um componente button no form;

Na object inspector selecione o componente button e altere sua propriedade

caption para : “Exibir Mensagem”;

Dê um clique duplo no componente button;

Aparecerá no Code Editor a declaração do evento na cláusula interface e a

implementação do procedimento na cláusula implementation.

procedure TForm1.Button1Click(Sender: TObject); begin form1.Caption := 'Meu Primeiro Programa'; ShowMessage(‘Meu Primeiro Programa em Delphi 2007'); end;

Executando a aplicação

Para executar a aplicação acima, pressione a tecla F9 ou clique no ícone RUN.

6.1 COMENTÁRIOS

Os comentários no código fonte são importantes e podem ser feitos através dos

seguintes símbolos:

//Comentário de linha

{ Comentário de bloco }

(*Comentário de bloco *)

7 VCL – VISUAL COMPONENT LIBRARY

Vamos explanar alguns objetos com suas propriedades e seus respectivos métodos.

7.1 OBJETO FORM

Propriedades

ActiveControl Permite definir qual o primeiro componente a receber foco assim que o

Page 12: Apostila Delphi - RADStudio2007-121101142350

16

formulário é criado.

Align Altera o alinhamento e preenchimento do objeto.

AutoScroll Permite habilitar as barras de rolagem.

AutoSize Determina se o controle será automaticamente redimensionado.

BorderIcons Determina os ícones a serem exibidos na barra de título do formulário.

BorderStyle Define o estilo da borda do formulário. bsDialog – Borda não redimensionável, comum em caixa de diálogo bsSingle – Borda simples e redimensionável. bsNone – Borda invisível, não redimensionável, sem botões de controle. bsSizeable – Borda padrão redimensionável.

BorderWidth Define a espessura da borda.

Caption Indica o rótulo exibido para o componente.

ClientHeight / ClientWidth

Define a altura e largura da área cliente.

Color Define a cor de fundo de um componente.

Cursor Indica a imagem exibida pelo ponteiro do mouse quando este ficar sobre o objeto.

DefaultMonitor Associa o form a um monitor específico em uma aplicação que utiliza vários monitores.

Enabled Define se o componente está habilitado ou não.

Font Permite controlar os atributos do texto exibido em um componente.

FormStyle Determina o estilo do formulário. fsNormal – Definição padrão do formulário. fsMDIChild – O formulário será uma janela-filha de uma aplicação MDI. fsMDIForm – O formulário será o formulário-pai de uma aplicação MDI. fsStayOnTop – O formulário permanece sobre todos os outros formulários do projeto, exceto aqueles que também têm a propriedade FormStyle igual a fsStayOnTop.

Height Define a altura do objeto.

HelpContext Define o tópico do arquivo help que será exibido ao pressionar a tecla F1.

HelpFile Define um arquivo de help específico.

Hint Permite exibir um texto de auxílio no momento em que o ponteiro do mouse permanece sobre o controle.

HorzScrollBar Define o comportamento de uma barra de rolagem horizontal.

Icon Define o ícone que será usado pelo formulário.

KeyPreview Define se o formulário deve ou não responder a um pressionamento de tecla, através do evento OnKeyPress, por exemplo.

Left Define a coordenada da extremidade esquerda de um componente.

Menu Permite escolher entre mais de um componente MainMenu.

Name Define o nome interno que identifica o componente dentro da aplicação.

PopupMenu Define o componente PopupMenu a ser utilizado pelo objeto.

Position Permite definir o tamanho e posição de um formulário no momento em que ele aparece na sua aplicação.

ShowHint Define se a string de auxílio deve ou não ser exibida quando o usuário mantém o ponteiro do mouse sobre um controle.

Tag A propriedade Tag é uma variável do tipo Longint que o Delphi coloca à disposição do usuário, que pode atribuir o significado mais conveniente.

Top Define a coordenada da extremidade superior de um componente.

VertScrollBar Define o comportamento de uma barra de rolagem vertical.

Visible Define se o componente aparece ou não na tela.

Width Define a largura do objeto.

WindowMenu Permite definir qual o menu responsável por manipular as janelas-filhas de uma aplicação MDI.

WindowState Define o estado de exibição de um formulário.

Métodos

Show Exibe o formulário de manipulação não-modal.

ShowModal Exibe o formulário de manipulação modal.

Close Permite fechar o formulário.

Page 13: Apostila Delphi - RADStudio2007-121101142350

17

7.2 OBJETO TBUTTON

É um dos objetos mais importantes para confirmar e disparar eventos associados.

Figura 11 - Button

Propriedades

Action Referencia uma ação definida em um objeto TActionList.

Anchors Permite manter a posição relativa do objeto ao objeto ‘parente’ quando este é redimencionado.

Cancel Associa o evento OnClick do objeto ao pressionamento da tecla Esc.

Default Associa ao evento OnClick do objeto ao pressionamento da tecla Enter.

ModalResult Propriedade utilizada para encerrar a execução de um formulário Modal quando selecionado um valor diferente de mrNone.

Parent... As propriedades Parent permitem que o componente receba a mesma formatação do objeto proprietário.

TabOrder Define a ordem na passagem de foco no momento de pressionamento da tecla TAB.

TabStop Define se o foco pára no componente.

Métodos

SetFocus Envia o foco do windows para o componente.

7.3 OBJETO TEDIT

Um dos principais componentes para a entrada de dados.

Figura 12 - Edit

Propriedades

AutoSelect Define se o texto exibido pelo controle será selecionado quando este receber o foco da aplicação.

AutoSize Para componentes TEdit a propriedade determina se a altura do controle será redimensionada quando o tamanho da fonte for alterado.

BorderStyle Determina o tipo da borda do componente.

CharCase Determina o se tipo da fonte será maiúscula, minúscula ou normal.

HideSelection Define se o texto perde a seleção ao perder o foco.

Maxlength Define um limite para a inserção de caracteres.

PasswordChar Define qual caractere será usado para ocultar o texto inserido no componente.

Text Permite manipular os caracteres inseridos no componente pelo usuário.

Page 14: Apostila Delphi - RADStudio2007-121101142350

18

Métodos

Clear Limpa o conteúdo da propriedade text.

SetFocus Envia o foco do windows para o componente.

7.4 OBJETO LABEL

Orienta os usuários à escolha de componentes.

Figura 13 - Label

Propriedades

Alignment Define o alinhamento da string na área do componente.

AutoSize Para componentes TDBText e TLabel, esta propriedade define se o controle será automaticamente redimensionado para acomodar o texto.

FocusControl Define qual o componente receberá foco quando o usuário selecionar a combinação de teclas aceleradoras (atalho) se existir.

Layout Define o alinhamento vertical do texto na área do componente.

ShowAccelChar Define se o caracter ‘&’ será um literal ou tecla de aceleradora (atalho).

Transparent Define se o fundo do componente será ‘transparente’ ou não.

WordWrap Define se o texto poderá utilizar o ‘retorno automático’ em caso de ultrapassar a largura definida e se a propriedade AutoSize estiver falsa.

EXERCÍCIO PROPOSTO 1

Objetivo: Trabalhar com objetos e elementos básicos em Object Pascal, introduzindo

técnica de manipulação de propriedades e eventos.

Componentes Utilizados: TLabel, TEdit e TButton

Enfoque: Quando o usuário digitar uma string, este texto deve ser exibido no título

do formulário e em uma mensagem de caixa de diálogo.

Resolução:

1. Primeiramente solicite um novo projeto clicando no menu File | New | VCL

Forms Application – Delphi for Win32;

2. Salve o projeto antes de prosseguir, criando uma pasta Exercício 1 e dentro

dela salve a unit com o nome ufrmPrimeiroExercicio e o projeto com o nome

prjPrimeiroExercicio;

Page 15: Apostila Delphi - RADStudio2007-121101142350

19

Figura 14 – Salvando a Aplicação

3. Insira os seguintes componentes no objeto form: 1 Label; 1 Edit; 2 Button.

Modifique as propriedades conforme abaixo:

a. Edit – MaxLength = 10; Name = edtMensagem;

b. Label – Caption = Digite: ; Focus Control = edtMensagem;

c. Form – Active Control = edtMensagem ; Caption = Formulário Principal;

Name = frmPrincipal;

d. Button1 – Caption = Confirmar; Hint = Executar uma ação; ShowHint =

True;

e. Button2 – Caption = Sair;

Para definirmos os eventos para os objetos Buttons, faça o seguinte procedimento:

- Selecione o Button1 (Confirmar) e na guia events da object inspector, identifique o

evento onclick e dê dois cliques no espaço em branco ao lado do evento. Um

procedimento será exibido no code editor.

- Insira o código entre o Begin e o End, como no exemplo abaixo:

begin frmPrincipal.Caption := edtmensagem.Text; ShowMessage(edtmensagem.Text); edtmensagem.Clear; end;

Para o Button2 (Sair) realize o mesmo procedimento:

begin frmPrincipal.Close; end;

Salve seu projeto e através do comando RUN compile e faça os testes necessários.

Page 16: Apostila Delphi - RADStudio2007-121101142350

20

7.5 OBJETO – MEMO

Permite a digitação de um texto bem mais extenso do que no componente edit.

Figura 15 - Memo

Propriedades

Lines Propriedade do tipo TStrings que contém as linhas de texto do componente.

MaxLength Define o limite máximo de caracteres no componente em sua propriedade Lines.

ReadOnly Define se o componente é do tipo somente leitura.

ScrollBars Define se o componente pode trabalhar com barras de rolagem.

WantReturns Define se a tecla ENTER será utiliza para ‘quebra de linha’.

WantTabs Define a tecla Tab como tabulação ou mudança de foco. Caso falso pode-se utilizar CTRL+TAB para produzir o efeito desejado.

Métodos

LoadFromFile Permite ‘carregar’ um arquivo para a propriedade Lines.

SaveToFile Permite salvar o conteúdo da propriedade Lines em um arquivo especificado.

7.6 Objeto – ComboBox

Cria uma lista suspensa de opções a escolha do usuário através do botão dropDown.

Figura 16 – ComboBox

Propriedades

Items Define uma lista de Strings que aparece no componente.

Sorted Define se os dados serão ordenados.

Text Define o texto atual da Combobox.

Métodos

Clear Permite limpar o conteúdo da propriedade Items.

LoadFromFile Permite ‘carregar’ um arquvo para a propriedade Items.

SaveToFile Permite salvar o conteúdo da propriedade Items para um arquivo.

Page 17: Apostila Delphi - RADStudio2007-121101142350

21

7.7 OBJETO – GROUPBOX

É um objeto contêiner, pois permite que possam ser inseridos outro componentes dentro dele.

Figura 17 – GroupBox

Propriedades

Align Pemite definir um alinhamento no objeto proprietário.

Caption Define o texto informativo na parte superior do componente.

7.8 OBJETO – RADIOGROUP

Permite a criação de opções para o usuário escolher apenas um dentre todas existentes.

Figura 18 - RadioGroup

Propriedades

Items Define os itens disponíveis ao usuário.

ItemIndex Define qual dos itens está selecionado.

Columns Define o número de colunas para organização dos componentes.

7.9 OBJETO – MAINMENU E POPUPMENU

Permite a criação de Menus principais e menus rápidos.

Figura 19 - MainMenu

Propriedades

Items Define um novo item de Menu.

Images Define um objeto do tipo ‘ImageList’.

Page 18: Apostila Delphi - RADStudio2007-121101142350

22

7.10 OBJETO – CHECKBOX (CAIXA DE VERIFICAÇÃO)

Permite verificar opções boolenas pré-definidas ou re-definidas pelo usuário.

Figura 20 - CheckBox

Propriedades

AllowGrayed Define caso verdadeiro, três estados possíveis para o checkbox: checked (ligado), unchecked (desligado) e grayed (parcial). Caso falso, dois estados: checked (ligado) e unchecked (desligado).

Checked Define se o componente está ligado ou não, caso tenha apenas dois estados.

State Permite definir três estados se AllowGrayed for verdadeiro.

7.11 OBJETO – RADIOBUTTON (BOTÃO DE ‘RADIO’)

Permite escolher entre um grupo, pelo menos uma opção.

Figura 21 - RadioButton

Propriedades

Checked Define se o componente está ligado ou desligado.

7.12 OBJETO – LISTBOX (CAIXA DE LISTAGEM)

Permite o usuário entrar ou manipular uma lista de dados.

Figura 22 - ListBox

Propriedades

Items Define uma lista de Strings que aparece no componente.

MultiSelect Permite selecionar vários itens (Strings) no componente.

Sorted Define se a lista de Strings será ordenada ou não.

Page 19: Apostila Delphi - RADStudio2007-121101142350

23

Métodos

Clear Permite limpar o conteúdo da propriedade Items.

LoadFromFile Permite ‘carregar’ um arquvo para a propriedade Items.

SaveToFile Permite salvar o conteúdo da propriedade Items para um arquivo.

7.13 OBJETO – PANEL (PAINEL)

Permite agrupar outros objetos e estabelecer um efeito visual nas aplicações.

Figura 23 - Painel

Propriedades

Align Define o alinhamento do componente em relação ao seu proprietário.

Bevel... Define a característica das bordas (interna e externa) bem como sua espessura.

BorderStyle Define o tipo da borda.

7.14 OBJETO – SPEEDBUTTON (BOTÃO PARA BARRA DE ÍCONES)

Permite ao usuário manipular os botões individuais ou através do conceito de grupo.

Figura 24 - SpeedButton

Propriedades

Glyph Define um Bitmap para o componente.

GroupIndex Permite agrupar um conjunto de SpeedButtons quando ao serem selecionados, tiverem a propriedade diferente de zero.

AllowAllUp Permite que o componente possa ter o relevo suspenso ao ser clicado. Só pode ser utilizado junto ao conceito de agrupamento.

Flat Define um efeito visual interessante.

Down Permite determinar qual componente foi pressionado. Só pode ser utilizado junto ao conceito de agrupamento.

Page 20: Apostila Delphi - RADStudio2007-121101142350

24

7.15 OBJETO MASKEDIT – (CAIXA DE EDIÇÃO COM MÁSCARA)

Permite estabelecer uma máscara para a entrada de dados no componente. Pode ser considerado literalmente um componente ‘Edit com máscara’.

Figura 25 - MaskEdit

Propriedades

CharCase Define o tipo dos caracteres.

EditMask Permite definir uma máscara para entrada de dados.

PasswordChar Define um caracter para ocultar a entrada de dados.

7.16 OBJETO – IMAGE (IMAGEM)

Permite inserir uma figura para uso geral na aplicação.

Figura 26 - Image

Propriedades

AutoSize Permite alterar o tamanho do componente baseado no tamanho da figura.

Picture Define a figura a ser exibida.

Stretch Permite alterar o tamanho da figura baseado no tamanho do componente.

Métodos

LoadFromFile Permite ‘carregar’ um arquivo de figura na propriedade Picture.

7.17 OBJETO – PAGECONTROL

Permite definir guias para agrupar os demais componentes. Cada guia representa um componente TabSheet do tipo TTabSheet, uma espécie de ‘sub-objeto’ do PageControl.

Figura 27 - PageControl

Page 21: Apostila Delphi - RADStudio2007-121101142350

25

Propriedades

ActivePage Permite determinar qual a guia foi selecionada pelo usuário.

7.18 OBJETO – OPENDIALOG (CAIXA DE DIÁLOGO PARA ABERTURA DE

ARQUIVOS)

Permite utilizar uma caixa de diálogo pronta com recursos padronizados pelo sistema operacional.

Figura 28 - OpenDialog

Propriedades

DefaultExt Especifica a extensão a ser adicionada ao nome de um arquivo quando o usuário digita o nome de um arquivo sem a sua extensão.

FileName Define o arquivo selecionado no componente.

Filter Permite definir as máscaras de filtro de arquivo a serem exibidas.

FilterIndex Define o filtro default a ser exibido na lista drop-down que define os tipos de arquivos selecionáveis.

InitialDir Define o diretório default quando a caixa de diálogo é aberta.

Options Neste componente, options define uma série de valores booleanos.

Title Define o título da caixa de diálogo.

Os componentes da paleta dialogs são executados através do método execute.

Este método é uma função que retorna um valor booleano, assim para exibir uma

caixa de diálogo, podemos escrever:

if OpenDialog1.Execute then

Se o usuário escolher algum arquivo e confirmar a caixa, execute retorna verdadeiro,

caso contrário, falso.

7.19 OBJETO – IMAGELIST (LISTA DE IMAGENS)

Permite definir um conjunto de ícones para serem re-utilizados por diversos componentes de recebem este objeto como provedor de uma lista de imagens.

Figura 29 - ImageList

Page 22: Apostila Delphi - RADStudio2007-121101142350

26

Para incluir imagens no componente ImageList, clique 2 vezes rapidamente no

componente e clique no botão Add.

7.20 OBJETO – PROGRESSBAR (BARRA DE PROGRESSO)

Permitir ao usuário ter um acompanhamento de uma rotina demorada.

Figura 30 - ProgressBar

Propriedades

Max Permite definir o valor máximo para a faixa de valores no componente.

Min Permite definir o valor mínimo para a faixa de valores no componente.

Orientation Define se o componente deverá ser vertical ou horizontal.

Position Define a posição corrente do controle no componente.

Step Define o incremento usado na variação do valor da propriedade position.

7.21 OBJETO – GAUGE (BARRA DE PROGRESSO)

Permitir ao usuário ter um acompanhamento de uma rotina demorada.

Figura 31 - Gauge

Propriedades

Kind Permite definir aparências diferenciadas no componente.

Progress Define a posição corrente do controle no componente.

Page 23: Apostila Delphi - RADStudio2007-121101142350

27

7.22 OBJETO – DATETIMEPICKER (DATA E HORA ATRAVÉS DE UMA

COMBOBOX)

Permite ao usuário escolher uma data através de um componente que possui um importante impacto visual e facilidade operacional.

Figura 32 - DateTimePicker

Propriedades

CalColors Define as cores do calendário.

Date Define a data selecionada no componente.

DateFormat Define o formato da apresentação da data.

DateMode Define o estilo da caixa de listagem.

Kind Define se o componente deve trabalhar com data ou hora.

MaxDate Define uma data máxima para uma faixa de valores.

MinDate Define uma data mínima para uma faixa de valores.

7.23 OBJETO – MONTHCALENDAR (CALENDÁRIO MENSAL)

Permite ao usuário escolher uma data através de um componente que possui um importante impacto visual e facilidade operacional.

Figura 33 - MonthCalendar

Propriedades

Date Define a data selecionada no componente.

FirstDayOfWeek Define qual o primeiro dia da semana.

WeekNumbers Permite numerar as semanas.

Page 24: Apostila Delphi - RADStudio2007-121101142350

28

7.24 OBJETO – STATUSBAR (BARRA DE STATUS)

Um dos principais componentes de informações sobre operações gerais no sistema.

Figura 34 – StatusBar

Propriedades

AutoHint Permite exibir o hint do componente automaticamente na barra de status. Se não houver painéis, a barra deve ter a propriedade SimplePanel ligada.

SimplePanel Define que a barra de status será sem divisões.

SimpleText Define o texto a ser exibido pela barra de status.

Panels Permite a criação e edição de painéis na barra de status. A propriedade SimplePanel deve estar desligada. Pode-se também dar um duplo clique na barra de status.

7.25 OBJETO – TOOLBAR (BARRA DE ÍCONES)

Permite criar barras de ícones de maneira rápida e simples.

Figura 35 – ToolBar

Propriedades

Flat Define um efeito visual com relevo através do mouse nos botões.

Images Permite definir um objeto do tipo ImageList.

HotImages Permite definir um objeto do tipo ImageList a ser usado no momento em que o mouse passa (ou clica) sobre o componente.

ShowCaptions Permite exibir a propriedade caption dos botões.

8 LINGUAGEM OBJECT PASCAL

Consideramos que uma aplicação em Delphi é baseada em um conjunto de

arquivos, (citados anteriormente .DPROJ .PAS e .DFM) básicos. Vamos examinar

alguns arquivos de fundamental importância:

Page 25: Apostila Delphi - RADStudio2007-121101142350

29

8.1 O MÓDULO .DPROJ

Todo programa em Object Pascal possui um arquivo .DPR, considerado como

arquivo de projeto, o seu formato é composto inicialmente da seguinte definição:

program Project1; uses Forms, Unit1 in ‘Unit1.pas’ {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(Tform1, Form1); Application.Run; end.

A palavra program define o nome do programa, este nome será alterado quando for

gravado o arquivo .DPROJ do projeto.

Na cláusula uses, são listadas as units usadas pelo módulo principal. As units são

responsáveis pela capacidade de dividir o programa em uma visão modularizada.

Em cada um, declaramos uma série de objetos (funções, variáveis, procedimento,

etc...) que podem ser usados por outras units e pelo módulo principal.

Em seguida vem um conjunto de comandos (denominado comando composto)

através de dois delimitadores begin e end.

8.2 AS UNITS

Um programa em Object Pascal é constituído de um módulo principal (.DPROJ) e de

uma ou mais unidades de compilação (.PAS). O compilador gera um arquivo com o

código objeto correspondente, e considera o mesmo nome do arquivo .PAS com a

extensão .DCU.

As units são entidades independentes, ou seja, no momento da criação não há

vínculo lógico (nem físico) entre uma unit e um programa principal que a utiliza. Com

esta característica, podemos utilizar as units em qualquer projeto.

A principal característica do conceito de unit é que possibilita estruturar o programa

em módulos funcionais, com cada unit provendo um conjunto de funções e

procedimentos. Cada formulário corresponde a uma unit. Mas, podemos criar units

independentes, não associadas a um form.

Page 26: Apostila Delphi - RADStudio2007-121101142350

30

Se considerarmos o código uma unit com um componente Button e um manipulador

de evento, teremos o seguinte código:

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type Tform1 = class(Tform) Button1: Tbutton; procedure Button1Click(Sender: Tobject); private { Private declarations } public { Public declarations } end; var Form1: Tform1; implementation {$R *.DFM} procedure Tform1.Button1Click(Sender: Tobject); begin Form1.Caption := ‘Curso de Delphi 2007’; Showmessage(‘Exemplo de caixa de diálogo’); end; end.

Uma unit possui cinco partes:

Cabeçalho

Contém a palavra reservada unit seguida de um identificador que é o nome da

unit. Este nome é o mesmo nome do arquivo com extensão .PAS

unit Unit1;

Interface

Contém tudo o que a unit exporta: constantes, tipos, variáveis, procedimentos,

funções, etc... Na declaração dos procedimentos e funções que a unit

exporta, deve constar apenas o cabeçalho (nome e parâmetros). A

declaração completa fica na parte da implementação.

Interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type Tform1 = class(Tform)

Page 27: Apostila Delphi - RADStudio2007-121101142350

31

Button1: Tbutton; procedure Button1Click(Sender: Tobject); private { Private declarations } public { Public declarations } end; var Form1: Tform1;

Implementação

Contém a definição completa das funções e procedimentos que constam na

interface. Se na implementação são usados identificadores definidos em outra

unit, o nome desta outra unit deve ser incluído na lista de units da cláusula

uses da implementação.

Implementation {$R *.DFM} procedure Tform1.Button1Click(Sender: Tobject); begin Form1.Caption := ‘Curso de Delphi 2007’; Showmessage(‘Exemplo de caixa de diálogo’); end;

Inicialização

É uma parte opcional. Quando usada, não pode conter nenhuma declaração.

Apenas comandos são permitidos nesta parte. Ela começa com a palavra

initialization, e os comandos de inicialização são executados “antes” do

programa começar.

Initialization

<comandos>

Finalização

É também uma parte opcional, com uma observação: ela só pode existir se na

unit houver também uma parte de inicialização e só pode conter comandos,

que serão executados dentro do processo de finalização do programa, após a

execução do programas principal.

Finalization

<comandos>

Toda unit termina com a palavra end seguida de um ponto final (‘.’).

Page 28: Apostila Delphi - RADStudio2007-121101142350

32

8.3 ATRIBUIÇÃO

Ao declarar uma variável, o compilador cuida de alocar na memória uma área que

seja suficiente para armazenar qualquer dos valores definidos através do seu tipo.

Os valores que podem ser atribuídos à variável são definidos através de um

comando de atribuição que pode ser considerado da seguinte forma:

Variável := expressão;

8.4 DECLARAÇÃO DE VARIÁVEIS

As variáveis podem ser classificadas em:

Globais: Quando são feitas diretamente na seção interface de uma unit (ou seja, fora

dos procedimentos e funções). Pode-se ter variáveis públicas e privadas.

Locais: Quando é feita a declaração dentro de um procedimento ou função.

Var N: Single; S: String; I: Integer;

8.5 TIPOS PARA MANIPULAÇÃO DE VARIÁVEIS

Tipos de variáveis Inteiras

Tipo Faixa de Valores Formato

Integer -2147483648.. 2147483647 32 bits

Cardinal 0..4294967295 32 bits, sem sinal

Shortint -128..127 8 bits

Smallint -32768..32767 16

Longint -2147483648.. 2147483647 32

Int64 -2^63..2^63-1 64

Byte 0..255 8 bits, sem sinal

Word 0..65535 16 bits, sem sinal

Longword 0..4294967295 32 bits, sem sinal

Tipos de números Reais

Tipo Faixa de Valores

Real 2.9*10E-39..1.7*10E38

Single 1.5*10E-45..3.4*10E38

Doublé 5.0*10E-324..1.7*10E308

Extended 3.4*10E-4932..1.1*10E4932

Page 29: Apostila Delphi - RADStudio2007-121101142350

33

Comp -2*10E63+1..2*10E63-1

Currency -9.22*10E14..9.22*10E14

Tipos de variáveis booleanas

Tipo Faixa de Valores

Boolean False ou True

ByteBool *

WordBool *

LongBool *

Tipos de variáveis de caracteres

Tipo Valores

Char Permite armazenar um caractere ASCII.

ShortString Permite armazenar uma cadeia de até 255 caracteres.

String Permite armazenar uma cadeia ‘ilimitada’ de caracteres.

Tipo genérico (Variant)

Objetos variant são essencialmente variáveis sem tipo podendo assumir diferentes

tipos, automaticamente. Esta vantagem aparente tem a característica de ser

ineficiente se utilizada indiscriminadamente.

8.6 FUNÇÕES DE CONVERSÃO E MANIPULAÇÃO

Os objetos do Delphi para entrada e/ou exibição de dados utilizam propriedades do

tipo String, as propriedades Text e Caption são bons exemplos. O problema ocorre

quando tentamos realizar cálculos matemáticos com os dados que devem ser

manipulados por estas propriedades.

Desta maneira precisamos de funções para converter dados String em tipos Inteiros

ou Reais ou Datas, por exemplo:

Função Objetivo

StrToInt(const S: String) Converte um dado String em tipo Inteiro.

IntToStr(value: Integer) Converte um dado Inteiro em tipo String.

StrToFloat(const S: String) Converte um dado String em tipo Ponto Flutuante.

FloatToStr(Value: Extended) Converte um dado Ponto Flutuante em tipo String.

DateToStr(Date: TdateTime) Converte um dado TdateTime em String.

DateTimeToStr(DateTime: TdateTime)

Converte um dado TdateTime em String.

StrToDate (const S: String) Converte um dado String em tipo TdateTime.

StrToDateTime(const S: String) Converte um dado String em tipo TdateTime

FormatFloat(const Format: string; Value: Extended): string

Permite formatar um tipo ponto flutuante retornando uma string. Edit2.Text := FormatFloat(‘###,###.00’,soma); Sendo soma uma variável real.

Page 30: Apostila Delphi - RADStudio2007-121101142350

34

8.7 EXPRESSÕES LÓGICAS

São expressões que retornam valor booleano (falso ou verdadeiro).

Operador Operação

Not Negação

And E lógico

Or OU lógico

xor OU EXCLUSIVO lógico

O operador not é unário, por exemplo: if not (X > Z) then

Devemos usar parênteses ao compararmos expressões lógicas, por exemplo:

if (X > Z) or (W > Y) then

EXERCÍCIO PROPOSTO 2

Objetivo: Trabalhar com objetos e elementos básicos utilizando as técnicas de

manipulação de propriedades e eventos.

Componentes utilizados: Label, Memo, Radio Group, CheckBox, ComboBox;

Enfoque: Deselvolver um pequeno editor de texto, onde o usuário possa alterar a

fonte, cor e estilo da fonte.

9 CAIXAS DE DIALOGO

No Delphi existem caixas de diálogos pré-definidas, nas quais podem ser utilizadas

visando facilitar o desenvolvimento de aplicativos pela ferramenta.

ShowMessage – Exibe uma mensagem na tela ao usuário.

Exemplo:

ShowMessage(‘Esta é uma mensagem de Texto.’);

Figura 36 – Tela de Mensagem

MessageDlg – Exibe uma mensagem na tela ao usuário, porém permite tratar a

resposta que o usuário informa na caixa de diálogo. Sua sintaxe é a seguinte:

function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons:

MsgDlgButtons; HelpCtx: Longint): Word;

Page 31: Apostila Delphi - RADStudio2007-121101142350

35

onde:

const Msg: string É uma constante string ou propriedade deste tipo.

DlgType: TmsgDlgType

mtWarning Contém um ícone exclamação amarelo. mtError Contém um ícone vermelho de ‘parada’. mtInformation Contém um ícone ‘i’ azul. mtConfirmation Contém uma interrogação verde. mtCustom Não contém BitMap.

Buttons: TMsgDlgButtons mbYes mbNo mbOK mbCancel mbAbort mbRetry mbIgnore mbAll mbNoToAll mbYesToAll mbHelp

HelpCtx: Longint Define um número para o help de contexto. Por padrão, zero ‘0’.

Exemplo:

if MessageDlg(‘Deseja sair?’, mtConfirmation, [mbYes, mbNo], 0)=mrYes then

Figura 37 – Tela de Confirmação

APPLICATION.MESSAGEBOX

Uma outra caixa de diálogo é o método MessageBox do objeto Application. Esta

função está definida da seguinte maneira:

function MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;

Onde:

const Text É uma constante string ou propriedade deste tipo.

Caption: PChar Define uma string para o título da janela.

Flags

Define os botões, ícones e a possibilidade de focar um determinado botão. Os valores para botões são: MB_ABORTRETRYIGNORE, MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO, MB_YESNOCANCEL

Page 32: Apostila Delphi - RADStudio2007-121101142350

36

Os valores para os ícones são: MB_ICONEXCLAMATION, MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONASTERISK, MB_ICONQUESTION, MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND Os valores para a definição do botão default pode ser: MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_DEFBUTTON4

O retorno da função é o tipo do botão como id

(IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES)

Desta maneira pode-se fazer testes lógicos como no exemplo:

If Application.MessageBox('Texto','Título',MB_YESNOCANCEL +

MB_ICONINFORMATION + MB_DEFBUTTON2) = IdYes then

Figura 38 – Application.MessageBox

10 CAIXAS DE ENTRADA

Podemos obter dados do usuário através de caixas de diálogo pré-defindas.

InputBox

A função InputBox retorna um tipo String, que é dado digitado pelo usuário na sua

utilização. Sua definição interna é a seguinte:

function InputBox(const ACaption, APrompt, ADefault: string): string;

Onde:

const ACaption Define o título da janela

APrompt Define um rótulo para orientação dentro da caixa.

Page 33: Apostila Delphi - RADStudio2007-121101142350

37

ADefault Define um valor default para a caixa.

Exemplo:

InputBox('Título da janela','Descrição','Valor Padrão')

Figura 39 – Tela de Input

11 ESTRUTURAS CONDICIONAIS

11.1 IF – THEN - ELSE

A estrutura condicional if pode ser composto de uma ou mais condições de

processamento, por exemplo:

if (A > B) then B := B + 1;

if (A > B) then B := B + 1 else A := A - 1;

Caso haja a mais de uma linha de comando dentro da estrutura then é necessário

delimitar o bloco de comando utilizando as cláusulas BEGIN e END

if (A > B) then begin

B := B + 1; X := B + A; end else begin A := A - 1; Y := Y + B; end;

O comando if-then-else é considerado como único, portanto, não há ponto e vírgula

(‘;’)antes da palavra reservada else.

É possível ainda que se tenha um conjunto de IF-then-else aninhados, por exemplo:

Page 34: Apostila Delphi - RADStudio2007-121101142350

38

if (A > B) then begin A := A + 1; ShowMessage(‘A é maior que B’);

end else Begin if (A < B ) then

begin A := A - 1; ShowMessage(‘B é maior do que A’); End else ShowMessage(‘A é igual a B’);

End;

11.2 ESTRUTURA CASE - OF

O comando case..of oferece uma alternativa para comandos if-then-else com um

‘grande’ número de testes. Por exemplo:

case Key of ‘A’..‘z’: Label1.Caption := ‘Letras’; ‘0’..‘9’: Label1.Caption := ‘Números’; ‘+’, ‘-’, ‘*’, ‘/’: Label1.Caption := ‘Operador’ else Label1.Caption := ‘Caracter especial’; end; //fim do case

12 ESTRUTURAS DE REPETIÇÃO

12.1 Repeat ... Until

A estrutura de repetição Repeat ... until, garante que pelo menos uma vez a

estrutura será executada. Para que as instruções de comando que estiverem dentro

da estrutura de repetição sejam executadas várias vezes é necessário que a

condições existente na cláusula until seja de valor FALSO. Exemplo:

.... Repeat X := x+ 1; Inc(Y,3); // equivale a y := y + 3; Dec(Aux,2); // equivale a aux := aux – 2; Until x >= 2000; ...

Page 35: Apostila Delphi - RADStudio2007-121101142350

39

12.2 WHILE - DO

A estrutura de repetição WHILE se difere da estrutura Repeat, pelo fato de realizar

uma validação dos dados antes de executar qualquer instrução dentro da sua

estrutura. Para que as instruções sejam executadas diversas vezes, é necessário

que a condição estabelecida seja VERDADEIRA. Exemplo:

… while X <= 200 do begin X := X + 1; INC(Z,3); DEC(AUX,2); end; ...

12.3 FOR – TO - DO

A estrutura FOR permite ao desenvolvedor delimitar o numero de vezes que uma

estrutura de comando será executada, pois é conhecido o inicio e o fim do numero

de interações que serão realizados. Exemplo:

for i:=0 to 500 do Label1.Caption := IntToStr(i); for i:=500 downto 100 do begin Label1.Caption := IntToStr(i); Edit1.Caption := IntToStr(i); end;

12.4 BREAK

O comando BREAK é utilizado para interromper a execução de um estrutura de

repetição ou seqüência de comandos alinhados. Exemplo:

frase := Edit1.Text; for i:=1 to length(frase) do begin if frase[I] = 'A' then break; aux := aux + frase[I]; end; Label1.caption := aux; //Label1 recebe o conteudo de frase até a letra ‘A’

Page 36: Apostila Delphi - RADStudio2007-121101142350

40

12.5 ADICIONADO FORMULARIOS AO PROJETO

As aplicações desenvolvidas por ferramentas visuais dificilmente utilizam somente

um formulário. Nos exercícios anteriores vimos que como se tratavam de aplicações

simples, não houve a necessidade de se adicionar novos formulários à aplicação.

Vamos criar uma pequena aplicação que seja capaz de manipular mais de um

formulário.

Primeiramente abra um novo projeto do Delphi 2007, clicando no menu File | New |

VCL Forms Applications – Delphi for Win32. Salve a aplicação em uma pasta

Exercicio3, salvando a unit1 com o nome de ufrmExercicio3 e o projeto com o nome

exercicio3.

Figura 40 – Salvando o Formulário 3

Incluia no form1 o compoente MainMenu e altere as propriedades dos objetos da

seguinte forma:

Object Form : TForm Caption : Exercício Proposto 3 Name : frmExercicio3; Position : poDesktopCenter;

Object : MainMenu: TMainMenu Name: mmFormularios;

Page 37: Apostila Delphi - RADStudio2007-121101142350

41

Figura 41 – Elaborando Menu de Opções

Agora que os objetos já estão configurados, vamos incluir as linhas de códigos

necessárias para que o nosso formulário frmexercicio3 possa “chamar” os outros

formulários da aplicação.

Primeiramente antes de realizarmos qualquer codificação é necessário que

adicionemos mais dois novos formulários na nossa aplicação, para isso clique no

menu File | New | Form – Delphi for Win32, salve-os com os respectivos nomes

ufrmFormulario2 e ufrmFormulario3, agora podemos codificar nosso mmFormularios.

Para “chamar” um outro formuário apartir do formulário atual temos duas formas:

Show e ShowModal

Show – “Chama” o formulário solicitado e permite que se alterne entre os formulários

durante a execução da aplicação.

Showmodal – Tem a mesma finalidade do Show, porém não permite a alternância

entre os formulários em tempo de execução.

Clique duas vezes sobre o componente MainMenu e clique duas vezes sobre o item

Formulario 1 e digite o seguinte código:

procedure TForm1.Formulario11Click(Sender: TObject); begin frmFormulario2.Show; end;

Em seguida, faça o mesmo procedimento para o item Formulário 2, mas com o

seguinte código:

procedure TForm1.Formulario21Click(Sender: TObject); begin frmFormulario3.ShowModal; end;

Após isto, salve sua aplicação e execute-a clicando no botão RUN ou pressionando

a tecla F9.

Page 38: Apostila Delphi - RADStudio2007-121101142350

42

Aparecerá a seguinte tela:

Figura 42 – Confirmação de Referência entre formulários

O Delphi está questionando se no formulário ‘Form1’ deve haver uma referência ao

formulário ‘frmFormulario2’. Ao confirmar o Delphi adiciona uma referência no Code

Editor da unidade UFrmExercicio3 na seguinte estrutura:

implementation

uses ufrmFormulario2;

Perceba que ao “chamar” o formulário 1 do menu, você ainda conseguirá acessar o

formulário principal, porém isto não é permitido ao “chamar” o formulário 2 do menu.

EXERCÍCIOS PROPOSTOS 4

Calcule o Volume de uma Espera; Área de um triangulo; Perímetro do Triangulo;

EXERCÍCIOS PROPOSTOS 5

Objetivo: Trabalhar com objetos e elementos básicos utilizando as técnicas de

manipulação de propriedades, eventos e formulários.

Enfoque: Deselvolver uma aplicação que contenha todos os projetos abaixo, sendo

cada um solicitado através de um Menu de opções.

1. PROJETO TRIANGULO: Dado 3 valores numéricos pelo usuário verificar se os

mesmo formam um triângulo e em caso positivo emitir uma mensagem informando

qual o tipo correspondente. Em caso negativo informar ao usuário através de uma

mensagem.

Page 39: Apostila Delphi - RADStudio2007-121101142350

43

2. PROJETO FIBONACCI: Sendo informado o nº de termos desejados para gerar a

seqüência de Fibonacci, faça um programa que exiba toda a seqüência em um

componente Memo.

3. PROJETO FATORIAL: Faça um programa que calcule o fatorial de um numero

informado pelo usuário. O resultado do cálculo deverá ser exibido em um

componente Edit.

4. PROJETO POTENCIA: Sendo informado a Base e o Expoente pelo usuário,

calcule a potência para esta operação. A base, o expoente e o resultado devem ser

informados através de um coponente Edit.

Cada item acima é desenvolvido em formulários separados.

13 PROCEDIMENTOS E FUNÇÕES

Toda parte programável no Delphi 2007 é realizada dentro de procedures ou

functions, toda vez em que um evento de um componente é programado, o Delphi

2007 cria automaticamente a sua declaração no Code Editor, por exemplo:

type TForm1 = class(TForm) MainMenu1: TMainMenu; Formulario11: TMenuItem; procedure Formulario11Click(Sender: TObject);

É possível também criar procedimentos e funções próprias não definidas pelo Delphi,

para isso deve-se declarar o procedimento ou função na seção INTERFACE do code

editor e implementá-la na seção IMPLEMENTATION.

Vale a pena lembrar que a decisão por utilizar procedimento ou função é decisão do

desenvolvedor, visto que todo procedimento não tem como obrigação retornar

valores ao programa, já a função deve por obrigação retornar um valor ao programa,

sendo que no Object Pascal este retorno de valor se dá pela variável result, variável

esta que não deve ser declarada pelo desenvolvedor, pois ela é declarada

automaticamente sempre que a função é solicitada pelo programa.

Uma forma automática de se implementar a declaração uma procedure ou function

na seção implementation e posicionar o curso de digitação sobre a declaração da

procedure ou function na seção Interface e pressionar as teclas CTRL + Shift + C.

Exemplo de procedure:

Page 40: Apostila Delphi - RADStudio2007-121101142350

44

... Type procedure TForm1.Soma(X, Y: String); ... Implementation procedure TForm1.Soma(X, Y: String); begin Label1.Caption := FloatToStr(StrToFloat(X)+StrToFloat(Y)); end; .... Exemplo de Function ... Type function TForm1.Subtrai(X, Y: String): String; ... Implementation function TForm1.Subtrai(X, Y: String): String; begin result := FloatToStr(StrToFloat(X)-StrToFloat(Y)); end;

14 TRATAMENTO DE EXCEÇÕES

Quando desenvolvemos nossos programas só os disponibilizamos aos usuários

após uma série de testes realizados, porém é impossível prever todo e qualquer tipo

de problema que possa ocorrer em tempo de execução, a esses erros damos o

nome de exceções.

As exceções devem ser tratadas para que o aplicativo não “trave” com o usuário;

não deixe o SO instável; etc.

Quando uma exceção ocorre, o fluxo de controle é automaticamente transferido para

blocos de códigos de exceção, denominados handlers, definidos através de

comandos do object Pascal.

14.1 TRY – EXCEPT

Uma das formas de tratarmos exceções no Delphi é utilizando o comando TRY-

EXCEPT.

Sua sintaxe é a sguinte:

Try <Comando a serem executado> Except <Bloco de execução> End;

Page 41: Apostila Delphi - RADStudio2007-121101142350

45

Toda vez que o aplicativo for executado sem ocorrer nenhuma exceção o bloco de

códigos de exceção é ignorado e o aplicativo prossegue normalmente, porém caso

ocorra a exceção o aplicativo é direcionado ao bloco de exceções e executa as

instruções lá contidas.

O bloco de exceção pode ser definido através de uma construção genérica,

exemplo:

try Abre(Arq); while not Fim(Arq) do processa(Arq); except Showmessage (‘Houve um erro inesperado.’); end; //bloco try

No exemplo acima tratamos os erros com uma mensagem genérica dentro de um

bloco try-except.

14.2 A CONSTRUÇÃO ON-DO

try Abre(Arq); while not Fim(Arq) do processa(Arq); except on EInOutError do //erro de entrada e saída begin Showmessage(‘Problemas...’); Fecha(Arq); end; on EdivByZero do //erro de divisão de nº inteiro por zero Showmessage(‘Erro ao dividir por zero’); on EconvertError do //erro de conversão de tipos Showmessage(‘Erro de conversão de tipos de dados’); end; //bloco try

Podemos ainda definir utilizando a cláusula on-do com um handler genérico usando

else, da seguinte forma:

try Processa; except on Exceção1 do Trata1; on Exceção2 do Trata2; else TrataOutras; end;

Os principais tipos de exceção da RTL (RunTime Library) do DELPHI, a serem

tratadas nos blocos on ... do são:

Page 42: Apostila Delphi - RADStudio2007-121101142350

46

Nome Descrição

EaccessViolation Ocorre quando se tenta acessar uma região de memória inválida (ex: tentar atribuir valor a um ponteiro cujo conteúdo é nil).

EconvertError ocorre quando se tenta converter um string em um valor numérico (ex: utilizar a função StrToInt em uma letra).

EdivByZero ocorre na divisão de um número inteiro por zero.

EinOutError ocorre numa operação incorreta de I/O (ex: abrir um arquivo que não existe).

EintOverFlow ocorre quando o resultado de um cálculo excedeu a capacidade do registrador alocado para ele (para variáveis inteiras).

EinvalidCast ocorre quando se tenta realizar uma operação inválida com o operador as (ex: tentar usar um Sender com uma classe que não corresponde a seu tipo).

EinvalidOp ocorre quando se detecta uma operação incorreta de ponto flutuante.

EinvalidPointer ocorre quando se executa uma operação invalida com um ponteiro (ex: tentar liberar um ponteiro duas vezes).

EoutOfMemory ocorre quando se tenta alocar memória mas já não existe mais espaço suficiente.

EoverFlow ocorre quando o resultado de um cálculo excedeu a capacidade do registrador alocado para ele (para variáveis de ponto flutuante).

ErangeError ocorre quando uma expressão excede os limites para a qual foi definida (ex: tentar atribuir 11 ao índice de um vetor que pode ir no máximo até 10).

EstackOverflow ocorre quando o sistema não tem mais como alocar espaço de memória na Stack.

Eunderflow ocorre quando o resultado de um cálculo é pequeno demais para ser representado como ponto flutuante.

EzeroDivide ocorre quando se tenta dividir um valor de ponto flutuante por zero.

14.3 O COMANDO TRY-FINALLY

Há outro comando cuja sintaxe começa com try. Este controle de finalização nos

permite lidar de forma estruturada com as situações em que alocamos algum tipo de

recurso e, haja o que houver, precisamos depois liberá-lo.

<aloca o recurso> try <usa o recurso> finally <libera o recurso com ou sem exceção> end;

O comando funciona da seguinte forma: os comandos especificados após o Try são

executados seqüencialmente. Se não ocorrer nenhuma exceção, os comandos

especificados após finally são executados, e o programa prossegue com a execução

Page 43: Apostila Delphi - RADStudio2007-121101142350

47

normal, com o comando seguinte ao try-finally. Porém, se houver alguma exceção –

qualquer uma – durante a execução da lista de comandos do try, o trecho após o

finally é executado e, no final, a exceção é reativada.

Em resumo: Os comandos do bloco finally sempre são executados, haja ou não

alguma exceção durante a execução dos comandos especificados após o try.

14.4 CLASSES BÁSICAS

Exceção

EMathError

EVariantError

EInval idOp

EZeroDivide

EOverFlow

EUnderFlow

EIntError EInOutError EAccessViolation

EDivByZero

ERangeError

EIntOv erFlow

EOutOfMemory

EInvalidPointer

EInval idCast

EConvertError

EPrivi lege

EStackOverflow

EControlC

EAssertionFailed

Exceções de

Ponto Flutuante

Exceções de

Variantes

Exceções de

Matemática de

Inteiros

Exceções de

Pilha

Exceções de

Entrada/Saída

Exceções

Typecast

Exceções de

Conv ersão

Exceções de

Processador

Exceções de

Asserção

Figura 43 – Classes Básicas de Exceções

14.5 BLOCOS TRY ANINHADOS

Blocos try aninhados permitem maior versatilidade na construção de blocos

protegidos, lembrando que se a exceção ocorrer, os comandos inseridos em except

serão executados. Já os comandos inseridos em finally serão executados havendo

ou não a ocorrência de erros.

Page 44: Apostila Delphi - RADStudio2007-121101142350

48

Embora no próximo exemplo, não exista margem para exceções dentro do laço

for..do (a menos que seja digitado errado) podemos ter uma idéia de como criar

blocos aninhados para garantir a execução de rotinas sujeitas a erros mais graves.

procedure TForm1.Button1Click(Sender: Tobject); var i, aux:integer; begin aux := 500; try {inicio do bloco try-finally. Screen controla uma serie de recursos do sistema operacional neste exemplo, muda-se a aparencia do cursor para ampulheta} Screen.Cursor := crHourGlass; try//inicio do bloco try-except for i:=0 to aux do begin Edit1.Text := IntToStr(i); Application.ProcessMessages; {O método ProcessMessages é necessário para forçar que as mensagens do windows sejam processadas, desenhando o numero no Edit. Sem ele, apenas o valor final seria visto.} end; except Showmessage('Ocorreu um erro.'); end;//fim do bloco try-except finally Screen.Cursor := crDefault; end;//fim do bloco try-finally end; //fim da procedure

15 BANCO DE DADOS

Grande parte dos sistemas desenvolvidos em Delphi, ou ferramentas visuais, tem a

necessidade de comunicação com banco de dados. Um banco de dados pode ser

interpretado de várias formas. Pode ser um arquivo único, pode ser um diretório com

vários arquivos, etc.

15.1 MODELAGEM DE DADOS

Existem 3 modelos básico para a modelagem de dados que devemos abordar

rapidamente antes de iniciarmos esta seção, são eles: Modelo Conceitual; Modelo

Lógico; Modelo Físico;

Modelo Conceitual : Procura abstrair a realidade independente da plataforma de

hardware e software.

Modelo Lógico : Define as regras básicas na forma de como os dados devem ser

armazenados no banco de dados.

Page 45: Apostila Delphi - RADStudio2007-121101142350

49

Modelo Físico : Implementa a definição do modelo lógico.

15.2 MODELO CONCEITUAL E LÓGICO

A princípio vamos entender como podemos definir os dados que serão armazenados

em um computador, através do conceito de entidade.

Ao pensarmos em cadastrar dados de clientes, alunos, fornecedores, etc... temos

exemplos de entidades. A entidade possui propriedades que serão identificados

como os dados propriamente ditos, estas propriedades são chamadas de atributos.

15.3 MODELO FISICO

No modelo físico de dados, as entidades serão chamadas de tabelas e os atributos

serão chamados de campos. A linha de dados que deriva do conjunto de campos

chama-se registro.

Nas entidades é necessário que haja um campo que seja capaz de identificar um

único registro dentre todos existente, a este campo chamamos de chave primária.

15.4 RELACIONAMENTOS

Para os bancos de dados relacionais, definimos relacionamentos como sendo uma

associação entre um ou mais entidades. O relacionamento pode ser representado

através de cardinalidades, que são as regras de relacionamento entre as entidades.

Existem 3 tipo de cardinalidades: 1:1 ; 1:N ; N : N

O relacionamento 1:N ou N:1 é tipo mais comum de relacionamento utilizado, ele

define que a chave primária da entidade 1, deve ser adicionada na entidade N como

chave estrangeira.

Já o relacionamento N:N tem como regra a criação de uma 3ª tabela, onde as

chaves primárias das entidades envolvidas no relacionamento, serão inseridas na 3ª

tabela como chave estrangeira.

16 CONEXAO DE BANCO DE DADOS

O Delphi 2007 utiliza uma estrutura de camadas para fazer com que o front-end

(formulário) manipulado pelo usuário venha interagir com a base de dados. O

caminho deve ser percorrido por uma série de componentes configurados entre si,

Page 46: Apostila Delphi - RADStudio2007-121101142350

50

porém, há uma camada intermediária que não fica dentro do ambiente Delphi, nem

diretamente preso ao banco, é o BDE.

16.1 BDE

O BDE, Borland DataBase Engine, é um conjunto de DLLs que deve acompanhar as

aplicações que fazem uso de seus recursos de acesso ao banco. É nesta camada

que são definidas características específicas de cada banco de dados, bem como

sua localização, ou seja, o front-end não acessa diretamente a base de dados, o

BDE é responsável para estabelecer este funcionamento.

Figura 44 – Esquema de Aplicação BDE

16.2 COMPONENTES DE CONTROLE E ACESSO

O sistema para conexão com o banco de dados utiliza além do BDE um conjunto de

componentes denominados: Session, DataBase, DataSet, DataSource e Data-

Aware. O componente Session não será o foco de nosso estudo.

Uma visão ‘geral’ sobre estes componentes pode ser vista da seguinte maneira:

Figura 45 – Visão Geral dos Componente

Session: Aplicações simples trabalham com apenas um banco de dados.

Porém o Delphi permite mais de uma conexão simultânea à bancos de dados

Aplicação Delphi

(Front-End)

Borland DataBase Engine (BDE)

Bancos de Dados Locais SQL Links Drivers ODBC

Session DataBase DataSet DataSource Data-Aware

Page 47: Apostila Delphi - RADStudio2007-121101142350

51

distintos, e também mais de uma conexão com o mesmo banco de dados. O

controle global das conexões é feito através do componente da classe

TSession, criado automaticamente pelo Delphi na execução do programa.

Esse componente representa a sessão default da aplicação.

DataBase: O componente DataBase é responsável pela conexão da

aplicação a um banco de dados com a finalidade maior de implementar

segurança (transações) e definir características de comunicação entre uma

aplicação Delphi-Client/Server. Embora em aplicações locais, sua utilização

explicita é recomendada.

DataSet: Existem três componentes que descendem de uma classe

chamada TDataSet e implementam importantes métodos de manipulação de

banco de dados além de suas características específicas. De fato, não

utilizamos a classe TDataSet diretamente, mas através dos componentes

TTable, TQuery(SQL) e TStoreProc. Estes componentes estão na paleta

BDE

DataSource: O componente DataSource é responsável por conectar os

componentes Data-Aware à uma determinada tabela representada pelo

DataSet. Este componente está na paleta DataAccess.

Data-Aware: Os componentes Data-Aware são responsáveis pela

visualização e manipulação direta dos dados. Todo componente Data-Aware

tem uma propriedade para conectar-se ao DataSource correspondente à

tabela destino. Estes componentes estão na paleta DataControls.

Exemplo

Vamos exemplificar a utilização de componentes básicos de acesso e controle

através de um exemplo baseado em uma tabela (arquivo de dados) já pronta, criada

na instalação do Delphi. O objetivo é entendermos o funcionamento destes

componentes.

Crie uma nova aplicação e salve-a na pasta especificada pelo instrutor.

A unit : UFrmPeixes

Page 48: Apostila Delphi - RADStudio2007-121101142350

52

Projeto: Peixes

Insira dois componentes: Um DataSource e um Table. Configure suas

propriedades de acordo com a orientação abaixo:

Object : Table : TTable Name: TbPeixes; DatabaseName = 'DBDEMOS' TableName = 'biolife.db' Active = True Object: DataSouce : TDataSource Name = DsPeixes; AutoEdit = False DataSet = TbPeixes

Insira um componente DBGrid e configure-o:

object DBGrid1: TDBGrid Align = alBottom DataSource = DsPeixes

Insira um componente DBImage e configure-o:

object DBImage1: TDBImage DataField = 'Graphic' DataSource = DsPeixes Stretch = True

Insira um componente DBMemo e configure-o:

object DBMemo1: TDBMemo DataSource = DsPeixes DataField = 'Notes'

Insira um componente

DBNavigator e configure-o:

object DBNavigator1: TDBNavigator DataSource = DsPeixes

Uma sugestão do visual pode ser a

seguinte:

Podemos perceber que a aplicação

funciona manipulando a tabela

Page 49: Apostila Delphi - RADStudio2007-121101142350

53

´biolife.DB´ sem a necessidade de nenhuma linha de código explícita.

É claro que este é apenas um exemplo para entendermos o mecanismo de

componentes de acesso e controle. Desse modo, veremos a seguir que linhas de

código serão necessárias para implementar funcionalidades específicas (pesquisas),

ou mesmo básicas como inclusão, edição e remoção.

Por último, vamos personalizar o componente DBGrid para não exibir os campos

Grafic e Notes (campos BLOB). Pode-se usar a propriedade Columns ou um duplo

clique no componente DBGrid, O Editor de colunas é exibido, clique no ícone Add

All Fields; os campos disponíveis serão exibidos, selecione o campo desejado

(Grafic) e clique em Delete Selected

Figura 47 – Editando Colunas Figura 48 – Eliminando um Campo

Salve novamente e execute a aplicação.

16.3 OBJETOS TFIELD

Vamos criar uma outra aplicação e exemplificar um recurso muito importante na

construção de aplicações baseadas em banco de dados, os campos persistentes.

Crie uma nova aplicação e salve-a na pasta especificada pelo instrutor. Os

nomes podem ser: O Formulário: UFrmPaises Projeto: Paises

Insira dois componentes: Um DataSource e um Table. Configure suas

propriedades de acordo com a orientação abaixo:

Figura 46 – Dados de Biolife

Page 50: Apostila Delphi - RADStudio2007-121101142350

54

Agora, ao invés de colocarmos componentes data-aware (paleta

DataControls) diretamente no form, vamos definir os campos persistentes

através de um duplo clique componente Table surgirá o editor de campos

(Fields Editor).

Clique com botão

direito no editor e escolha

Add all fields.

A partir de agora, cada

campo na tabela é

considerado um objeto

TField com suas

propriedades individualizadas na Object Inspector.

Mas, o melhor de tudo é o fato de podermos arrastar os campos TField diretamente

para o formulário, e perceber que o Delphi se encarrega de construir o componente

data-aware necessário a cada campo.

Isso realmente poupa muito tempo no desenvolvimento de aplicações em banco de

dados. Porém há a possibilidade de criar aplicativos que utilizem acesso à banco

sem data-aware.

Insira um componente DBNavigator e configure-o:

object DBNavigator1: TDBNavigator DataSource = DsPaises end

Uma sugestão para a disposição dos componentes pode ser:

Page 51: Apostila Delphi - RADStudio2007-121101142350

55

Figura 49 – Cadastro de Paises

Salve novamente e execute a aplicação.

16.4 BDE – CRIAÇÃO DO ALIAS

Vamos explorar com mais detalhes o conceito e funcionamento da camada BDE. O

BDE é instalado junto com o Delphi. Execute o programa e examine a tela inicial.

A tela é dividida em duas partes básicas: A listagem de Aliases do lado esquerdo e

as configurações de cada Alias no lado direito.

Um conceito importantíssimo é a definição de Alias. Cada nome do lado esquerdo

do BDE representa uma configuração para acesso a um determinado banco.

Exemplo: O Alias BDDEMOS representa o diretório C:\Arquivos de

programas\Arquivos comuns\Borland Shared\Data, o driver para acesso ao de banco

(Paradox) entre outras configurações.

Dessa maneira o desenvolvedor utiliza o nome DBDEMOS dentro do Delphi, porém

o diretório pode ser alterado no BDE sem maiores problemas. O Alias é uma string

que define o path e configurações para acesso ao banco de dados.

Page 52: Apostila Delphi - RADStudio2007-121101142350

56

Figura 50 – Borland DataBase Engine

Para criar um alias:

Clique no menu Object e escolha New. (CTRL+N).

Confirme o tipo de driver;

Defina um nome para o Alias (lado esquerdo).

Defina o path através do botão reticências.

Clique no menu Object e escolha Apply, para confirmar as alterações.

Confirme a gravação.

Note que já janela de ferramentas ( tool palette), há uma área específica para

componentes que acessam o banco de dados através do BDE.

16.5 COMPONENTE ADO - ACTIVEX DATA OBJECTS

Uma outra forma de fazer com que sua aplicação possa acessar um banco de dados

é através de componentes ADO, que permite o acesso direto ao banco de dados

sem a utilização do BDE.

Abaixo temos um pequeno aplicativo que acessa um banco de dados SQL utilizando

o componente ADO que no Delphi 2007 encontra-se na paleta dbGO.

Page 53: Apostila Delphi - RADStudio2007-121101142350

57

Figura 51 – Paleta dbGo

Como o objetivo do exemplo é mostrar a funcionalidade dos componentes ADO,

será utilizado apenas um formulário, um dbgrid e um DataSet, componentes estes já

conhecidos de capítulos anteriores. Utilizaremos os seguintes componentes da

paleta dbGo: TAdoConnection; TAdoTable.

TAdoConnection: Permite a conexão da aplicação diretamente com o banco de

dados.

TAdoTable : é utilizado para acessar as tabelas do banco de dados.

Figura 52 – Componentes Ado

Selecione o componente AdoConnection1 e clique no botão ... da propriedade

connectionstring na Object Inspector e aparecerá aseguinte tela:

Page 54: Apostila Delphi - RADStudio2007-121101142350

58

Figura 53 – Criando Conexão Ado

A propriedade connectionstring é utilizada para informar ao Delphi todas as diretivas

que serão utilizadas pelo banco de dados. Para definirmos a string de conexão,

clique no botão Build... e aparecerá a seguinte tela:

Figura 54 – Escolhendo tipo de Base de Dados

A janela acima se refere ao link de dados que será utilizado pela aplicação. Existem

diversos Links de Dados conforme mostrado na figura acima.

O link de dados que utilizaremos para este exemplo é o Microsoft OLE DB Provider

for SQL Server, que permite a conexão da aplicação com dados do banco SQL

Server. Em seguida clique no botão next >>

Page 55: Apostila Delphi - RADStudio2007-121101142350

59

Figura 55 – Selecionando Servidor

Na guia Connection, será especificado no item 1 o nome do servidor de dados onde

está instalado o SQL. No item 2, será especificado as informações sobre o tipo de

logon que será realizado no BD, caso o BD tenha uma senha de acesso definida é

necessário informar o nome do usuário e o senha de acesso, caso contrário é

possível realizar o acesso ao banco apenas utilizando a integridade de segurança do

Servidor.

Figura 56 – Selecionando Usuário

O item 3, será selecionado especificamente qual o bando de dados que você irá

acessar.

Page 56: Apostila Delphi - RADStudio2007-121101142350

60

É possível ainda verificar se as configurações realizadas foram bem sucedidas

através do botão Test Connection e em seguida clique OK.

Figura 57 – Exibição dos Dados da Tabela

Note que em nenhum momento foi feito a utilização do BDE.

É possível ainda utilizar os componentes ADO juntamente com drivers ODBC, que

permite você acessar outros tipos de bancos de dados.

17 APLICAÇÃO DE BANCO DE DADOS

Para aplicarmos tudo o que vimos até agora vamos desenvolver um pequeno projeto

de banco de dados aplicando todos os passos básicos de desenvolvimento desde a

construção das tabelas até a geração de relatórios.

Primeiramente vamos criar a estrutura de banco de dados abaixo utilizando o

InterBase e em seguida criar um Alias apontando para o banco.

Setor

Setor_ID: INTEGER

Descricao: VARCHAR(100)

Local: VARCHAR(25)

Funcionario

Matricula: CHAR(18)

Nome: VARCHAR(100)

Sexo: CHAR(1)

Endereco: VARCHAR(150)

Email: VARCHAR(150)

Cidade: VARCHAR(50)

Estado: VARCHAR(25)

Salario: FLOAT

Setor_ID: INTEGER (FK)

Dependente

Dependente_ID: INTEGER

Matricula: CHAR(18) (FK)

Nome: VARCHAR(100)

Sexo: CHAR(1)

GrauParentesco: VARCHAR(20)

Figura 58 – Esquema de Banco de Dados 1

Page 57: Apostila Delphi - RADStudio2007-121101142350

61

Após a estrutura de bando de dados criada, o passo seguinte é abrir o Delphi 2007 e

solicitar uma Nova aplicação clicando no menu File|New|VCL Forms Applications –

Delphi for Win32 e salve-a dentro de uma pasta empresa, sendo a unit com o nome

ufrmPrincipal e o projeto com o nome de Empresa.

No formulário principal, adicione o componente MainMenu com os seguintes itens:

Figura 59 – Menu de Opções

17.1 DATA MODULE

A definição dos componentes de acesso aos dados será centralizada em um

formulário especial chamado Data Module. Este formulário tem uma característica

bem específica: é um form invisível e só recebe componentes invisíveis, ou seja, o

usuário nem vai imaginar que o DataModule e os componentes que ele recebe estão

na aplicação. A sua finalidade é centralizar os componentes para que qualquer

formulário possa ter acesso aos dados, sem a necessidade de repetir os

componentes de acesso em cada formulário. Para criar formulário DataModule,

clique em File|New|Other|Delphi Files.

Figura 60 – Adicionando Novo Item

Page 58: Apostila Delphi - RADStudio2007-121101142350

62

Salve o novo formulário com o nome de UFrmDmEmpresa e insira três

componentes: um DataBase, Table ( Paleta BDE ) e DataSource (Paleta

DataAccess).

Figura 61 – DataModule

Configure as propriedades como abaixo:

Object DataBase : TDataBase; Connected : False; Name : Conexao AliasName: Empresa DataBaseName: dbEmpresa; Object Table : TTable; DataBaseName: tbEmpresa; TableName: Setor; Name: tbSetor; Object DataSource: TDataSource; Name: dsSetor; DataSet: tbSetor;

17.2 FORMULÁRIO DE CADASTRO DE SETOR

Adicione um novo formulário a aplicação e insira 2 componentes Panel, onde um

terá alinhamento na parte inferior (alBottom) e outro na área cliente (alClient).

Salve o formulário com o nome FrmCadSetor e a propriedade name do form será

FrmCadSetor.

Uma característica importante na construção de aplicações utilizando banco de

dados é a possibilidade de trabalharmos com campos TFIELD exemplificados

anteriormente, ou seja, campos que são considerados como objetos dentro da

aplicação, sendo assim estes campos possuem propriedades e eventos individuais

através da object inspector ou por atribuições manipulando código.

Vamos explorar um pouco mais da funcionalidade deste recurso. Campos TFIELD

são chamados de campos persistentes e sua criação é extremamente simples.

Page 59: Apostila Delphi - RADStudio2007-121101142350

63

No DataModule, localize o objeto Table referente à tabela desejada.

Um duplo clique no objeto Table, exibirá a janela de manipulação dos

campos

Um clique dentro da janela com o botão direito exibirá o speed menu.

Escolha a opção Add All Fields.

Figura 62 – Field Editor

Após a criação dos campos persistentes, pode-se selecioná-lo e verificar

propriedades específicas na Object Inspector. As propriedades serão diferentes

dependendo do tipo de dados do campo, neste exemplo um tipo TStringField.

Figura 63 – Exibindo Propriedades do campo TField

Page 60: Apostila Delphi - RADStudio2007-121101142350

64

Mas o melhor está para vir. Posicione a janela dos campos persistentes em um lado

da tela e com o formulário FrmCadSetor (criado anteriormente) visível, selecione os

campos e arraste-os para dentro do Form. Uma pergunta do tipo:

Figura 64 – Confirmação de Referência entre Formulários

Será exibida. Confirme com Yes, ou seja, o Delphi está questionando se no

formulário ‘FrmCadSetor’ deve haver uma referência ao formulário ‘DmEmpresa’

(DataModule). Ao confirmar o Delphi adiciona uma referência no Code Editor da

unidade UFrmCadSetor na seguinte estrutura:

implementation

uses UDMEmpresa;

Pode-se fechar o editor de campos persistentes. Uma diferença visual que tem

destaque agora são os controles de manipulação de dados que foram inseridos

automaticamente pelo Delphi.

Figura 65 – Tela de cadastro Versão 1

Embora se pareçam com um componente já visto anteriormente (Edit) estes

componentes são provenientes da paleta Data Controls e tem o nome de DBEdit, ou

seja, um controle específico para manipulação de dados provenientes de um banco

Page 61: Apostila Delphi - RADStudio2007-121101142350

65

de dados. Já nos referimos a estes controles nos primeiros exemplos do capítulo

anterior.

DBEdit

DataSource Permite ‘conectar’ o controle à fonte de dados.

DataField Permite especificar um campo da tabela referenciada em DataSource.

Insira um componente DBNavigator e modifique suas propriedades:

object DBNavigator1: TDBNavigator DataSource = DmEmpresa.DsSetor VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast] end

Insira seis componentes BitBtn, e configure apenas as propriedades Name, Caption

e Glyph. Uma sugestão visual pode ser vista a seguir:

Figura 66 – Tela de Cadastro Finalizada

17.3 MÉTODOS E PROPRIEDADES PARA MANIPULAÇÃO DE DADOS

Para percorrer os registros de uma tabela podemos utilizar os seguintes métodos:

First Move o cursor para o primeiro registro do dataset.

Prior Move o cursor para o registro anterior (se houver).

Next Move o cursor para o próximo registro (se houver).

Last Move o cursor para o último registro do dataset.

MoveBy(N) Move o cursor para frente ou para trás, conforme o valor do parâmetro N, que é um valor inteiro, positivo ou negativo.

Para controlar o início e fim da tabela podemos utilizar as propriedades:

BOF : Boolean Begin Of File. Indica True se o cursor estiver no primeiro registro da tabela.

EOF : Boolean End Of File. Indica True se o cursor estiver no último registro da tabela.

Page 62: Apostila Delphi - RADStudio2007-121101142350

66

Por exemplo: Table1.First; While not Table1.EOF do begin comando1; comando2; ... Table1.Next; end;

Um incoveniente com relação ao código acima é que os controles data-aware (data

controls) serão atualizados no monitor à medida que o método Next percorre a

tabela, gerando uma visualização indesejada e perda de tempo com a sua

atualização.

Neste caso, pode-se utilizar os métodos DisableControls e EnableControls.

Table1.DisableControls; try Table1.First; while not Table1.EOF do begin comando1; comando2; ... Table1.Next; end; finally Table1.EnableControls; end;

Em nosso exemplo atual, no formulário de Cadastro de Setores, os códigos para

percorrer o dataset foram implementados de maneira automática através do

componente DBNavigator. Porém nada impede a criação de botões independentes

e a definição de handlers de controle para navegação retirando o DBNavigator.

Para alterar (editar) os valores de um dataset podemos utilizar o seguinte método:

Edit Permite editar o data set para alteração dos valores atuais para novos valores.

Exemplo:

Table1.Edit;

Para inserir um novo registro em um dataset podemos utilizar dois métodos:

Page 63: Apostila Delphi - RADStudio2007-121101142350

67

Append Cria um novo registro após o último registro do dataset.

Insert Cria um novo registro após o registro corrente.

Exemplo:

Table1.Append;

Ou

Table1.Insert;

Para remover um registro em um dataset podemos utilizar o método:

Delete Remove o registro corrente.

Exemplo:

if MessageDLG(‘Está certo disto?!’,mtConfirmation,[mbYes,mbNo],0) = mrYes

then Table1.Delete;

Para confirmar (gravar) as alterações no dataset podemos utilizar o método:

Post Confirma as alterações em um dataset.

Exemplo:

Table1.Append; ... Table1.Post;

Table1.Edit; ... Table1.Post;

Para acessar o valor em um campo através de TField podemos utilizar a

propriedade Fields ou o método FieldByName.

Fields Faz referência a um campo específico através de um array.

FieldByName Faz referência a um campo através de seu nome.

Para cancelar algum comando enviado ao banco de dados, utiliza-se o método

cancel.

Cancel Confirma as alterações em um dataset.

Exemplo:

Table1.Append; ...

Table1.Edit; ...

Page 64: Apostila Delphi - RADStudio2007-121101142350

68

Table1.Cancel; Table1.Cancel;

17.4 OS ESTADOS DE UM DATASET

Os datasets trabalham com ‘estados’. Em cada estado uma determinada operação

pode ser válida, outras não. A manipulação do dataset através de métodos e

funções agem nestes estados em todo o tempo provocando mudanças.

Uma visão geral sobre os estados de um dataset pode ser vista a seguir:

Figura 67 – Estado de um DataSet

Vamos utilizar no formulário FrmCadSetor a prática deste conceito. Antes,

troque o DBEdit1 referente ao código para um componente DBText configure

as propriedades DataSource para a tabela Setor e DataField para o campo

Setor_ID.

O BitBtn referente à saída do form pode ter sua propriedade Cancel

verdadeira.

O BitBtn referente à confirmação das operações pode ter sua propriedade

Default verdadeira e a propriedade Enabled como falso.

O BitBtn referente ao cancelamento das operações pode ter sua propriedade

Enabled como falso.

Edit

Browse

Inativo

Insert

Insert

Append

Post

Cancel

Close Open

Edit Cancel

Post

Page 65: Apostila Delphi - RADStudio2007-121101142350

69

Figura 68 – Cadastrando Setor

unit uFrmCadSetor; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, DBCtrls, Mask, ExtCtrls,DB; type TFrmCadSetor = class(TForm) {Para criar o procedimento TrataBotoes, digite sua declaração (sem TFrmCadSetor) na cláusula Type e utilize CTRL+SHIFT+C Para todos os demais, selecione o objeto e utilize a object inspector} procedure TrataBotao; private { Private declarations } public { Public declarations } end; var FrmCadSetor: TFrmCadSetor; implementation uses uFrmDmEmpresa; {$R *.dfm} procedure TFrmCadSetor.bbtCancelarClick(Sender: TObject); begin DMEmpresa.tbSetor.Cancel; TrataBotao; end; procedure TFrmCadSetor.bbtConfirmarClick(Sender: TObject); begin DMEmpresa.tbSetor.Post; TrataBotao end; procedure TFrmCadSetor.bbtEditarClick(Sender: TObject); begin DMEmpresa.tbSetor.Edit; TrataBotao end; procedure TFrmCadSetor.bbtIncluirClick(Sender: TObject); Var ProxNum : Integer; begin TrataBotao;

Page 66: Apostila Delphi - RADStudio2007-121101142350

70

DMEmpresa.tbSetor.Last; ProxNum := DMEmpresa.tbSetor.FieldByName('Setor_ID').AsInteger + 1; DMEmpresa.tbSetor.Append; DMEmpresa.tbSetor.FieldByName('Setor_ID').AsInteger := ProxNum; DBEdit2.SetFocus; end; procedure TFrmCadSetor.bbtRemoverClick(Sender: TObject); begin if DMEmpresa.tbSetor.RecordCount <> 0 Then Begin if MessageDlg('Deseja excluir este registro?',mtConfirmation,[mbYes,mbNo],0) = mryes then DMEmpresa.tbSetor.Delete End Else MessageDlg('Não há registro a ser excluído.',mtInformation,[mbok],0); end; procedure TFrmCadSetor.bbtSairClick(Sender: TObject); begin FrmCadSetor.Close; end; procedure TFrmCadSetor.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if DMEmpresa.tbSetor.State IN [DSEDIT,DSINSERT] then if MessageDlg('Existem Dados Pendentes.'+ #13 + 'Deseja salvá-lo?',mtConfirmation, [mbYes,mbNo],0) = mryes then CanClose := False else begin DMEmpresa.tbSetor.Cancel; TrataBotao; CanClose := True; end; end; procedure TFrmCadSetor.TrataBotao; begin bbtIncluir.Enabled := not bbtIncluir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; end; end.

17.5 FORMULÁRIO DE CADASTRO DE FUNCIONÁRIO

FrmCadFuncionario

Vamos iniciar a construção do formulário de Cadastro de Funcionário.

No menu File escolha o comando New | Form – Delphi for Win32.

Grave este novo formulário com o nome de: UFrmCadFuncionario

A propriedade Name do form deverá ser FrmCadFuncionario

Page 67: Apostila Delphi - RADStudio2007-121101142350

71

Chame o DataModule. Crie os campos persistentes (TFields) para a tabela

Funcionário. Arraste-os para dentro do formulário. Confirme o diálogo (YES) sobre

usar o DataModule e posicione os objetos em uma seqüência à sua escolha. Uma

sugestão pode ser vista a seguir:

Figura 69 – Tela de Cadastro de Funcionario

Associe o componente o componente DBText1 à tabela através da propriedade

DataSource apontando para a tabela Funcionario e DataField apontando para o

campo Matricula.

Associe o componente DBNavigator à tabela Funcionário através da propriedade

DataSource.

Implemente os handlers de cada botão conforme o raciocínio do formulário anterior.

Vamos definir outros componentes e características que no formulário anterior não

existiam.

Por exemplo, o campo Sexo foi definido na tabela como uma String de um caracter.

Podemos evitar que o usuário entre com uma string diferente de M ou F por

exemplo, este raciocínio pode ser feito via código ou via componente.

Vamos optar pela segunda opção por uma série de vantagens.

Insira um componente DBRadioGroup no formulário e não se preocupe com o

alinhamento (por enquanto).

Modifique as propriedades do componente:

object DBRadioGroup1: TDBRadioGroup Caption = 'Sexo' Columns = 2 DataSource = DmEmpresa.DsFuncionario

Page 68: Apostila Delphi - RADStudio2007-121101142350

72

DataField = 'Sexo' Items.Strings = Masc Fem Values.Strings = F M end

Columns Define em quantas colunas os dados da propriedade items serão ordenados.

Items Define os itens a serem exibidos no componente.

Values Define os valores a serem armazenados na tabela.

Pode-se excluir o DBEdit responsável pelo campo Sexo e alinhar o DBRadioGroup

em seu lugar.

Um outro componente que pode exibir um conjunto de dados pré-definidos é o

DBComboBox.

Insira o componente no formulário e modifique suas propriedades:

object DBComboBox1: TDBComboBox DataSource = DmEmpresa.DsFuncionario DataField = 'Estado' Items.Strings = AC AL AP AM BA CE DF ES GO MA MT MS end

Exclua o DBEdit responsável pelo Estado e alinhe o DBComboBox em seu lugar.

17.6 INTEGRAÇÃO DE DADOS ENTRE AS TABELAS

Vamos acrescentar alguma funcionalidade para que o usuário não precise saber o

código do setor, ele poderá selecionar uma caixa de listagem através do nome do

setor, por exemplo:

Acrescente um DBLookupComboBox ao Form e faça as modificações necessárias,

a sugestão visual é a seguinte:

Page 69: Apostila Delphi - RADStudio2007-121101142350

73

Figura 70 – Cadastrando Funcionario

Configure o DBLookupComboBox com as propriedades a seguir:

object DBLookupComboBox1: TDBLookupComboBox ListSource = DmEmpresa.DsSetor ListField = Nome KeyField = Setor_id DataSource = DmEmpresa.DsFuncionario DataField = Setor_id end

Onde:

ListSource Permite ‘conectar’ o controle à fonte origem dos dados.

ListField Permite especificar um campo da tabela referenciada em ListSource.

KeyField Permite especificar o campo chave da tabela origem dos dados.

DataSource Permite ‘conectar’ o controle à fonte destino dos dados.

DataField Permite especificar o campo chave estrangeira da tabela destino.

Uma sugestão de implementação para o código fonte do formulário para Cadastro

de Funcionário é o seguinte:

unit ufrmCadFuncionario; {A interface não foi impressa}

implementation USES ufrmDmEmpresa; {$R *.dfm} procedure TfrmCadFuncionario.TrataBotao; Begin bbtIncluir.Enabled := not bbtIncluir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; End;

Page 70: Apostila Delphi - RADStudio2007-121101142350

74

procedure TfrmCadFuncionario.bbtCancelarClick(Sender: TObject); begin TrataBotao; DMEmpresa.tbFuncionario.Cancel; end; procedure TfrmCadFuncionario.bbtConfirmarClick(Sender: TObject); begin TrataBotao; DMEmpresa.tbFuncionario.Post; end; procedure TfrmCadFuncionario.bbtEditarClick(Sender: TObject); begin TrataBotao; DMEmpresa.tbFuncionario.Edit; end; procedure TfrmCadFuncionario.bbtIncluirClick(Sender: TObject); Var Prox : Integer; begin TrataBotao; DMEmpresa.tbFuncionario.Last; Prox := DMEmpresa.tbFuncionario.RecordCount + 1; DMEmpresa.tbFuncionario.Append; DMEmpresa.tbFuncionario.FieldByName('Matricula').AsString := IntToStr(Prox); DBLookupComboBox1.SetFocus; end; procedure TfrmCadFuncionario.bbtRemoverClick(Sender: TObject); begin if MessageDlg('Deseja excluir este Registro?',mtConfirmation,[mbYes,MbNO],0) = mrYes then DMEmpresa.tbFuncionario.Delete; end; procedure TfrmCadFuncionario.bbtSairClick(Sender: TObject); begin frmCadFuncionario.Close; end; end.

17.7 FORMULÁRIO DE CADASTRO DE DEPENDENTES

Vamos criar outro formulário com a finalidade de cadastrar os dependentes do

funcionário. Utilizaremos o mesmo raciocínio visto até aqui embora este processo

possa ser bem diferente do que vamos fazer. O objetivo maior é fixarmos os

conceitos vistos anteriormente.

Page 71: Apostila Delphi - RADStudio2007-121101142350

75

FrmCadDependente

Clique no menu File | New | Form – Delphi for Win32

Grave a unit com o nome: UFrmCadDependente

A propriedade Name do form será: FrmCadDependente

Figura 71 – Tela de Cadastro de Dependente

Configure o componente DBNavigator:

object DBNavigator1: TDBNavigator DataSource = DmEmpresa.DsDependente VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast] end

Insira dois componentes DBRadioGroup, um para o Sexo e outro para o

Parentesco.

A configuração do DBRadioGroup para o campo Sexo pode ser a seguinte:

object DBRadioGroup1: TDBRadioGroup Caption = 'Se&xo' Columns = 2 DataSource = DmEmpresa.DsDependente DataField = Sexo Items.Strings = Masc Fem Values.Strings = M F end

A configuração do DBRadioGroup para o campo Parentesco pode ser a seguinte:

Page 72: Apostila Delphi - RADStudio2007-121101142350

76

object DBRadioGroup2: TDBRadioGroup Caption = '&Parestesco' Columns = 4 DataSource = DmEmpresa.DsDependente DataField = 'GrauParentesco' Items.Strings = Esposa(o) Filho(a) Enteado(a) Pai/Mãe Values.Strings = E F N P End

Insira um DBText e altere suas propriedades DataSource e DataField.

Uma sugestão visual pode ser vista a seguir:

Figura 72 – Cadastrando Dependente

O código para implementar as funções dos BitBtns pode ser visto a seguir:

unit ufrmCadDependente; implementation uses ufrmDmEmpresa; {$R *.dfm} procedure TfrmCadDependente.TratarBotao; Begin bbtIncluir.Enabled := not bbtIncluir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; End;

Page 73: Apostila Delphi - RADStudio2007-121101142350

77

procedure TfrmCadDependente.bbtCancelarClick(Sender: TObject); begin TratarBotao; DMEmpresa.tbDependente.Cancel; end; procedure TfrmCadDependente.bbtConfirmarClick(Sender: TObject); begin TratarBotao; DMEmpresa.tbDependente.Post; end; procedure TfrmCadDependente.bbtEditarClick(Sender: TObject); begin TratarBotao; DMEmpresa.tbDependente.Edit; end; procedure TfrmCadDependente.bbtIncluirClick(Sender: TObject); var Prox : Integer; begin TratarBotao; DMEmpresa.tbDependente.last; Prox := DMEmpresa.tbDependente.RecordCount + 1; DMEmpresa.tbDependente.Append; DMEmpresa.tbDependente.FieldByName('Dependente_ID').AsInteger := Prox; DBLookupComboBox1.SetFocus; end; procedure TfrmCadDependente.bbtRemoverClick(Sender: TObject); begin if MessageDlg('Deseja excluir este registro?',mtConfirmation,[mbYes,mbNo],0) = mrYes then DMEmpresa.tbDependente.Delete; end; procedure TfrmCadDependente.bbtSairClick(Sender: TObject); begin frmCadDependente.Close; end; end.

18 MÉTODOS DE PESQUISA

A função locate vai localizar na tabela funcionário no campo Setor_ID o valor do

campo Setor_ID da tabela setor passado como parâmetro. Caso encontre, a função

retorna um valor booleano verdadeiro.

A alteração no código do botão remover do form Cadastro de Setor pode ser visto a

seguir:

procedure TFrmCadSetor.BbtRemoverClick(Sender: TObject); begin if DmEmpresa.TbSetor.RecordCount = 0 then ShowMessage('Tabela vazia!') else if DmEmpresa.TbFuncionario.Locate('Setor_ID',

Page 74: Apostila Delphi - RADStudio2007-121101142350

78

DmEmpresa.TbSetor.FieldByName('Setor_ID').AsInteger,[]) then ShowMessage('Este setor possui funcionários,'+#13+ 'favor realocá-los antes de deletar.') else if MessageDLG('Tem certeza que deseja remover o setor: '+#13+ DmEmpresa.TbSetor.FieldByName('Descricao').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DmEmpresa.TbSetor.Delete; end;

A função locate é declarada internamente da seguinte forma:

function Locate(const KeyFields: string; const KeyValues: Variant;

Options: TLocateOptions): Boolean; virtual;

Onde:

KeyFields Permite definir o(s) campo(s) a serem pesquisados.

KeyValues Permite definir o(s) valore(s) a serem pesquisados.

Options Permite definir se os valores a serem pesquisados serão parciais e/ou diferenciados de maiúscula e minúscula. [loCaseInsensitive, loPartialKey]

if DmEmpresa.TbFuncionario.Locate('Setor_ID',

DmEmpresa.TbSetor.FieldByName('Setor_ID').AsInteger,[]) then

Neste exemplo acima, estamos pesquisando na tabela TbFuncionario o campo

Setor_ID o valor que está na tabela TbSetor no campo Setor_ID. A pesquisa é

exata.

18.1 FORMULÁRIO DE CONSULTA DE FUNCIONÁRIOS

FrmConFuncionario

Clique em File | New | Form – Delphi for Win32

Grave o nova unit como UFrmConFuncionario

A propriedade Name do form será: FrmConFuncionario

Insira os componentes necessários, altere suas propriedades.

Configure o DBGrid para acessar a tabela Funcionario e exibir apenas a matricula e

o nome do funcionário, mudanças visuais podem ser feita na propriedade Title.

Page 75: Apostila Delphi - RADStudio2007-121101142350

79

Figura 73 – Consulta de Funcionários

Um exemplo de algumas propriedades que podem ser alteradas:

object DBGrid1: TDBGrid Cursor = crHandPoint TabStop = False Align = alBottom BorderStyle = bsNone DataSource = DmEmpresa.DsFuncionario ReadOnly = True Title|Font|Style = [fsBold] End

A propriedade Name dos BitBtn’s serão o prefixo Bbt + o caption (sem espaço

e sem acento).

Vimos no item anterior que podemos realizar pesquisas nas Tabelas (Table)

utilizando o método locate, porém este método pode levar muito tempo para realizar

a pesquisa caso o banco de dados seja muito grande.

Sabemos que pesquisas em bancos de dados são melhores executadas quando

realizadas com SQL (Structure Query Language) que é uma linguagem própria para

este tipo de pesquisa. Para utilizarmos este recurso no Delphi, adicione no

formulário uFrmDmEmpresa (DataModule) um novo componentes: Query (Paleta

BDE) e um DataSet ( Paleta DataAccess ).

O Componente Query tem como finalidade realizar pesquisa no banco de dados

através de instruções DML (Data Manipulation Language).

Configure os componentes da seguinte forma: Object Query : TQuery Name: QryConsFuncionario; DataBaseName: dbEmpresa; SQL: SELECT * FROM FUNCIONARIO; Active: False; Object DataSet: TDataSet Name: dsqryConsFunc;

Page 76: Apostila Delphi - RADStudio2007-121101142350

80

DataSet : QryConsFuncionario

A implementação do código do formulário FrmConFuncionario pode ser vista logo a

seguir:

unit ufrmConsFuncionario; interface implementation uses ufrmdmEmpresa; {$R *.dfm} procedure TfrmConsFuncionario.bbtLocalizarClick(Sender: TObject); Var StrQry : String; begin StrQry := 'Select * from Funcionario'; if edtNome.Text = '' then StrQry := StrQry + ' WHERE Matricula = ''' + edtCodigo.Text + ''';' else StrQry := StrQry + ' WHERE Nome Like ''' + edtCodigo.Text + '%'';'; DMEmpresa.qryConsFuncionario.Close; DMEmpresa.qryConsFuncionario.SQL.Clear; DMEmpresa.qryConsFuncionario.SQL.Add(StrQry); DMEmpresa.qryConsFuncionario.Open; end; procedure TfrmConsFuncionario.bbtSairClick(Sender: TObject); begin frmConsFuncionario.Close; end; end.

18.2 DEFININDO CAMPOS REQUERIDOS E EXCEÇÃO LOCAL

Podemos definir alguns campos que devem, obrigatoriamente, serem preenchidos

pelo usuário, por exemplo: No formulário de Cadastro de Dependentes os campos

Matricula e Nome são muito importantes e poderiam na sua ausência tornar o banco

inconsistente. Vamos utilizar um exemplo com a tabela Dependente.

Para definir campos requeridos e evitar inconsistência de campos em branco:

Chame o Data Module.

Escolha a tabela desejada (TbDependente) e clique duas vezes para chamar

os TFields.

Escolha o campo TField desejado (Matricula, neste exemplo) e na Object

Inspector defina Required como True.

Defina o mesmo recurso para o nome do dependente.

Page 77: Apostila Delphi - RADStudio2007-121101142350

81

Neste momento, se o usuário tentar gravar o registro sem digitar a matrícula do

funcionário ou o nome do dependente será levantada uma exceção da classe

EDatabaseError que deverá ser tratada pelos conceitos vistos no curso.

O evento OnClick do botão confirmar no cadastro de dependentes pode ser

(atualizado) implementado como o exemplo abaixo:

procedure TFrmCadDependente.BbtConfirmarClick(Sender: TObject); begin try DmEmpresa.TbDependente.Post; TrataBotoes; except on E: EDataBaseError do Showmessage('Campo obrigatório sem preencher! ' + #13+#13 + E.Message); end; end;

O objeto E da classe Exception recebe o valor do objeto de exceção. Este objeto

não precisa ser declarado e permite comparar qual é o erro atual, para tomada de

decisões.

18.3 EXCLUSÃO COM CONSISTÊNCIA

Antes de excluir em cascata, vamos exemplificar uma situação em que: havendo a

chave primária como chave estrangeira na outra tabela, não se pode excluir o

registro.

Neste projeto, o exemplo é o seguinte: Se houver uma ocorrência do código do setor

(chave primária) da tabela setor na tabela funcionário (chave estrangeira) não

vamos deletar o setor.

18.4 EXCLUSÃO EM CASCATA

Pense nesta situação: Ao excluir um funcionário, o código correspondente na tabela

dependente não será mais válido, ou seja, o dependente terá um código (Matricula)

que não existe mais.

Nosso objetivo então será deletar o(s) dependente(s) do funcionário deletado.

procedure TDmEmpresa.TbFuncionarioBeforeDelete(DataSet: TDataSet); begin if TbDependente.Locate('Matricula', TbFuncionario.FieldByName('Matricula').AsInteger,[]) then begin

Page 78: Apostila Delphi - RADStudio2007-121101142350

82

//desabilitar os controles data aware TbDependente.DisableControls; {Aplicar e ligar o filtro para que a tabela considere apenas os registros que tem a chave estrangeira com o código do funcionario a ser deletado} TbDependente.Filter := 'Matricula='+TbFuncionario.FieldByName('Matricula').AsString; TbDependente.Filtered := True; //Enquanto nao e o fim da tabela, delete os registros filtrados while not TbDependente.Eof do TbDependente.Delete; //Retirar o filtro para que a tabela possa considerar os outros registros TbDependente.Filter := ''; TbDependente.Filtered := False; end; end; procedure TDmEmpresa.TbFuncionarioAfterDelete(DataSet: TDataSet); begin //Habilitar os controles data aware após a deleçao do funcionario TbDependente.EnableControls; end;

As propriedades Filter e Filtered funcionam da seguinte forma:

Deve-se atribuir um valor (critério) à propriedade filter.

TbDependente.Filter := ‘Sexo=F’;

Depois ligar o filtro para que o critério tenha efeito.

TbDependente.Filtered := True;

A partir deste momento a tabela (TbDependente) só vai manipular os registros que

atentem ao critério, ou seja, todas as pessoas do sexo feminino. Caso o filtro não

seja desligado, a tabela não vai considerar os demais registros.

Os métodos EnableControls e DisableControls servem para habilitar e desabilitar

os controles data aware.

Para evitar isso, desabilitamos os controles no momento da deleção dos

dependentes e habilitamos no momento após a deleção do funcionário.

18.5 UM POUCO MAIS SOBRE CONSULTAS

Vamos criar uma consulta para saber quais funcionários trabalham em determinado

setor.

FrmConSetFun

Crie um novo formulário e grave-o com o nome de UFrmConSetFun

Insira os componentes necessários:

Page 79: Apostila Delphi - RADStudio2007-121101142350

83

Figura 74 – Consulta de Funcionário por Setor

Adicione no frmDmEmpresa um componente Query e um DataAccess e configure os

componentes conforme abaixo:

Object Query : TQuery Name: QryConsSetor; DataBaseName: dbEmpresa; SQL: SELECT * FROM SETOR; Active: False; Object DataSet: TDataSet Name: dsqryConsFunc; DataSet : QryConsFuncionario DataBaseName : dbEmpresa;

No formulário FrmConSetFun adicione 1 DbLookupComboBox e 1 DbGrid e faça a

seguinte configuração:

Object : DbLookUpComboBox : TDbLookUpComboBox ListSource: DMEmpresa->dsSetor; ListField: Descrição; KeyField: Setor_ID

Neste caso o componente DBLookUpComboBox será utilizado apenas para mostrar

quais os setores existentes na tabela Setor sem nenhuma relação com a tabela

Funcionário, por isso as propriedades DataField e DataSource não foram alteradas.

Object : DbGrid: TDbGrid DataSource : DMEmpresa->dsConsFunSetor

Page 80: Apostila Delphi - RADStudio2007-121101142350

84

Abaixo você terá uma sugestão para a tela acima:

var frmSetConsFun: TfrmSetConsFun; implementation uses ufrmDMEmpresa; {$R *.dfm} procedure TfrmSetConsFun.DBLookupComboBox1Click(Sender: TObject); Var StrQry : String; begin StrQry := 'SELECT * FROM FUNCIONARIO WHERE SETOR_ID = ''' + DMEmpresa.tbSetor.FieldByName('Setor_ID').AsString + ''';'; With DMEmpresa, qryConsSetorFun , SQL Do Begin Close; Clear; Add(StrQry); Open; End; end; end.

19 RELATORIOS

Todas as aplicações desenvolvidas por ferramentas visuais, têm a necessidade de

extrair os dados computados através de relatórios. O Delphi 2007 utiliza como

padrão de relatório o aplicativo Rave Report.

Para aprendermos a utilizá-lo, vamos desenvolver o relatório da consulta de

funcionários por setor Capítulo 18.

No formulário frmDmEmpresa, adicione o componente TRvProject e Componente

RvQueryConnection que encontra-se na Paleta Rave.

Page 81: Apostila Delphi - RADStudio2007-121101142350

85

Figura 75 – Paleta Rave

Para criarmos nosso relatório no Rave, clique duas vezes sobre o componente

TRvProject e será executado o aplicativo Rave Reports.

Figura 76 – Tela Principal do Rave Reports

Vamos conhecer o ambiente de projeto do Rave Reports.

Barra de Ferramentas:

Na barra de ferramentas você encontra as opções mais utilizadas durante o

desenvolvimento do seu relatório.

Page 82: Apostila Delphi - RADStudio2007-121101142350

86

Figura 77 – Barra de FErramentas Rave Reports

Janela de Propriedades:

Encontra-se as propriedades relativas aos componentes inserido no relatório.

Figura 78 – janela de Propriedades

Janela de Componentes:

Mostra quais o componentes que foram adicionado ao Rave Reports e possibilita ao

desenvolvedor selecionar os componentes de forma mais rapidamente.

Figura 79 – Janela de Componentes

Abas de Componentes:

Encontramos nela todos os componentes disponíveis para serem utilizados no

desenvolvimento do relatório.

Page 83: Apostila Delphi - RADStudio2007-121101142350

87

Figura 80 – Abas de Componentes

Primeiramente para darmos inicio ao nosso relatório vamos salvar o projeto do Rave

Reports com o nome RelEmpresa.rav, para isso clique no menu File | Save.

Vamos retornar ao Delphi 2007 e abrir o formulário frmDmEmpresa e selecionar o

componente RvProject e faça a seguinte configuração:

Object RvProject: TRvProject Name : RvRelSetor

ProjectFile: Clique no botão ... e selecione o projeto do Rave Reports salvo anteriormente.

Selecione o componente RvQueryConnection e modifique suas propriedades como

abaixo:

Object : RvQueryConnection : TRvQueryConnection Name: QryRvConsFunc Query : qryConsSetorFun

Uma vez que você fez as conexões acima descritas, vamos criar nosso relatório.

Retorne ao Rave Projects e clique no menu File | New Data Object, será exibida a

seguinte tela :

Figura 81 – Conexão de Dados

Selecione a opção Direct Data View e em seguida clique no botão next que lhe dará

acesso a seguinte tela:

Page 84: Apostila Delphi - RADStudio2007-121101142350

88

Figura 82 – Selecionado Conexão Rave/Delphi

Nesta tela você irá selecionar a conexão feita na sua aplicação do Delphi 2007 e

para finalizar clique no botão Finish.

Será exibido do lado direito do aplicativo na janela de componentes o componente

Data View e todos os seus campos que fazem parte da conexão que você

configurou.

Figura 83 – Dados do DataView1

A conexão com o banco está realizada, agora iremos “desenhar” nosso relatório de

Funcionários por setor.

Para adicionar qualquer componente no relatório é necessário adicionarmos a

página principal o componente Region (Guia Report) que para adicioná-lo, clique

duas vezes sobre o mesmo. É necessário dimensionar o componente por toda a

extensão da página principal.

Page 85: Apostila Delphi - RADStudio2007-121101142350

89

Figura 84 – Pagina Principal de Rave Reports

Em seguida adicionamos o componente Band Component ( Guia Report ) e vamos

adicionar 3 componentes Text (guia Standard) e altere a propriedade text para :

Matricula, Nome e Endereço respectivamente.

Após isto, adicione o componente Data Band e precionando a tecla CTRL clique no

campo do Data View referente ao nome do funcionário e arraste até o Data Band

alinhando com o componente Text referente a matrícula. Realize o mesmo

procedimento para os demais campos.

Altere as propriedades do componente Band conforme abaixo:

Objetc Band : Band Component ControllerBand : Data Band1 Objetc DataBand :DataBand Component ControllerBand : Data Band1 DataView : DataView1

Seu relatório terá a seguinte aparecia:

Page 86: Apostila Delphi - RADStudio2007-121101142350

90

Figura 85 – Montando Relatorio

Para visualizar o nosso relatório clique no botão Execute Report na barra de

ferramentes ou pressione a tecla F9. Pelo Delphi adicione um componente Button no

formulário e no evendo onclick digite: RVProject1.Execute. Aparecerá a seguinte

tela:

Figura 86 – Confirmação de Preview do Rave Reports

Clique no botão OK e será visualizado nosso relatório.

Page 87: Apostila Delphi - RADStudio2007-121101142350

91

Figura 87 – Preview dos Dados do Banco

Vimos em nos exemplos anteriores o desenvolvimento de aplicações que utilizam

componentes Data-Aware, porém nem sempre é viável o desenvolvimento de

aplicações somente com este tipo de componente. Existem aplicações onde se faz

necessário a programação propriamente dita, com instruções DML para inserção,

consulta e atualização de dados.

A aplicação exemplo a seguir será de uma Agenda, utilizando o Banco de Dados

Interbase e componentes da Paleta InterBase no Delphi 2007.

EXERCÍCIO PROPOSTO 6

Agenda

Codigo: INTEGER

Nome: VARCHAR(150)

Sexo: CHAR(1)

Telefone: VARCHAR(18)

Endereco: VARCHAR(150)

Bairro: VARCHAR(20)

Cidade: CHAR(20)

Cep: CHAR(10)

DtNasc: DATE

Idade: INTEGER

Profissao: VARCHAR(50)

Agora que o Banco está criado, vamos solicitar do Delphi 2007 uma nova aplicação

e salva-la em uma pasta chamada Agenda. Salve o unit com o nome untAgenda e o

projeto com o nome prjAgenda. No Form1, configure as seguintes propriedades:

Object Form1: TForm Name: frmPrincipal;

Page 88: Apostila Delphi - RADStudio2007-121101142350

92

Caption: Agenda Pessoal; Position: poDesktopCenter; BorderIcons: biMaximize = False; biMinimize = False;

Adicione um novo form do tipo DataModule e salve a unit com o nome udmAgenda e

altere a propriedade name para dmAgenda. Adicione os seguintes componentes no

datamodule: IBDataBase; IBTable; IBTransaction (Paleta InterBase) e DataAccess,

como na imagem abaixo.

Figura 88 - DataModule

Configure as propriedades conforme abaixo:

Object : IBDatabase : TIBDatabase DatabaseName: Clique no botão ... e selecione o arquivo salvo do Banco Interbase. Name: Conexão; LoginPrompt: False; Params: User_name=sysdba; password=masterkey; Connected: False; Object: IBTransaction : TIBTransaction DefaultDatabase: Conexao; Name: TransAgenda; Object: IBTable : TIBTable DataBase: Conexao; Transaction: TransAgenda; TableName: Agenda Name : tbAgenda; Active : False;

Object: DataSource : TdataSource Name: dsAgenda; DataSet : tbAgenda; Object: IBSQL : TIBSQL Name: SQLAgenda; DataBase:Conexao; Transaction : TransAgenda

No frmPrincipal adicione o componente MainMenu faça um layout como abaixo:

Page 89: Apostila Delphi - RADStudio2007-121101142350

93

Figura 89 – Menu de Opções Agenda

Adicione um novo form para o cadastro de pessoas e salve-o com o nome

ufrmCadastro e a propriedade name para frmCadastro. Uma sugestão de tela pode

ser:

Figura 90 – Tela de Cadastro Agenda

Os componentes utilizados foram: Toolbar, ImageList, Label, Edit, MaskEdit e

RadioGroup. Segue abaixo o código da programação da tela de cadastro.

unit ufrmCadastro; interface var frmCadastro: TfrmCadastro; implementation uses udmAgenda; {$R *.dfm} procedure TfrmCadastro.ControlarBotao; begin bbtNovo.Enabled := Not bbtNovo.Enabled; bbtAlterar.Enabled := Not bbtAlterar.Enabled; bbtCancelar.Enabled := Not bbtCancelar.Enabled; bbtConfirmar.Enabled := Not bbtConfirmar.Enabled; bbtExcluir.Enabled := Not bbtExcluir.Enabled; end; procedure TfrmCadastro.LimparCampos; begin edtNome.Clear;

Page 90: Apostila Delphi - RADStudio2007-121101142350

94

edtEndereco.Clear; edtBairro.Clear; edtCidade.Clear; edtIdade.Clear; edtIdade.Clear; edtProfissao.Clear; mskFone.Clear; mskCep.Clear; mskDataNascimento.Clear; lblCodigo.Caption := ''; end; procedure TfrmCadastro.bbtAlterarClick(Sender: TObject); begin ControlarBotao; end; procedure TfrmCadastro.bbtCancelarClick(Sender: TObject); begin ControlarBotao; end; procedure TfrmCadastro.bbtConfirmarClick(Sender: TObject); Var StrQry : String; begin StrQry := 'INSERT INTO AGENDA (BAIRRO, CEP, CIDADE, CODIGO, DTNASC, ENDERECO, IDADE, NOME, PROFISSAO, SEXO, TELEFONE) '; StrQry := StrQry + 'VALUES (:BAIRRO, :CEP, :CIDADE, :CODIGO, :DTNASC, :ENDERECO, :IDADE, :NOME, :PROFISSAO, :SEXO, :TELEFONE);'; ControlarBotao; with dmAgenda , SQLAgenda do Begin SQL.Add(StrQry); ParamByName('Bairro').Value := edtBairro.Text; ParamByName('CEP').Value := mskCep.Text; ParamByName('CIDADE').Value := edtCidade.Text; ParamByName('Codigo').Value := lblCodigo.Caption; ParamByName('DTNASC').Value := mskDataNascimento.Text; ParamByName('ENDERECO').Value := edtEndereco.Text; ParamByName('IDADE').Value := edtIdade.Text; ParamByName('NOME').Value := edtNome.Text; ParamByName('PROFISSAO').Value := edtProfissao.Text; case rdgSexo.ItemIndex of 0: ParamByName('SEXO').Value := 'M'; 1: ParamByName('SEXO').Value := 'F'; end; ParamByName('TELEFONE').Value := mskFone.Text; Try ExecQuery; MessageDlg('Registro cadastrado com sucesso.',mtInformation,[mbok],0); LimparCampos; Except on E : Exception do Begin ShowMessage('Erro durante a confirmação dos dados.' + #13 + E.Message); End; End; End; end; procedure TfrmCadastro.bbtNovoClick(Sender: TObject); var Registro : Integer; begin dmAgenda.tbAgenda.Open; dmAgenda.tbAgenda.Last; ControlarBotao;

Page 91: Apostila Delphi - RADStudio2007-121101142350

95

Registro := dmAgenda.TbAgenda.RecordCount + 1; lblCodigo.Caption := IntToStr(Registro); end; procedure TfrmCadastro.bbtSairClick(Sender: TObject); begin frmCadastro.Close; end;

O próximo formulário a ser desenvolvido é a tela de consulta, para isso adicione um

novo formulário e salve-o com o nome ufrmConsulta. Adicione os seguintes

componentes no DataModule: IBQuery (Paleta InterBase) e DataSource e confirgure

as propriedades como abaixo:

Object : IBQuery : TIBQuery DataBase : Conexao; Transaction : TransAgenda; Name: QryAgenda; Objetc : DataSource : TDataSource DataSet : qryAgenda; Name:dsQryAgenda;

Uma sugestão de tela de consulta é a seguinte :

Figura 91 – Tela de Consulta

Segue abaixo o código para a programação da tela de consulta:

unit ufrmConsulta; interface var frmConsulta: TfrmConsulta; xCriterio, xMetodo: string; implementation uses udmAgenda;

Page 92: Apostila Delphi - RADStudio2007-121101142350

96

{$R *.dfm} procedure TfrmConsulta.rdgCriterioClick(Sender: TObject); begin case rdgCriterio.ItemIndex of 0: xCriterio := 'SEXO'; 1: xCriterio := 'Bairro'; 2: xCriterio := 'Nome'; 3: xCriterio := 'Idade'; end; end; procedure TfrmConsulta.rdgMetodosClick(Sender: TObject); begin case rdgMetodos.ItemIndex of 0: xMetodo := ' = '; 1: xMetodo := ' LIKE '; 2: xMetodo := ' >= '; 3: xMetodo := ' <= '; 4: xMetodo := ' > '; 5: xMetodo := ' < '; 6: xMetodo := ' = '; end; end; procedure TfrmConsulta.sbtExcluirClick(Sender: TObject); Var StrQry: String; begin if messageDlg('Deseja excluir este registro?',mtConfirmation,[mbYes,mbNo],0) = mrYes then Begin StrQry := 'DELETE AGENDA WHERE CODIGO = ''' + dmAgenda.qryAgenda.FieldByName('CODIGO').AsString + ''''; With dmAgenda, SQLAgenda do Begin Close; SQL.Clear; SQL.Add(StrQry); Try ExecQuery; Except on E : Exception Do Begin MessageDlg('Não foi possível excluir este registro.' + #13 + E.Message, mtInformation,[mbok],0); End; End; End; End; end; procedure TfrmConsulta.sbtImprimirClick(Sender: TObject); begin with dmAgenda do Begin RvProject1.Execute; End; end; procedure TfrmConsulta.sbtLocalizarClick(Sender: TObject); var StrQry: string; begin if rdgCriterio.ItemIndex< 0 then Begin MessageDlg('Informe o critério de Pesquisa',mtInformation,[mbok],0); Exit; end; if rdgMetodos.ItemIndex < 0 then Begin

Page 93: Apostila Delphi - RADStudio2007-121101142350

97

MessageDlg('Informe o método de Pesquisa',mtInformation,[mbok],0); Exit; end; with dmAgenda, qryAgenda do Begin StrQry := 'SELECT * FROM AGENDA WHERE ' + xCriterio + xMetodo; StrQry := StrQry + '''' + edtPesquisar.Text ; if rdgMetodos.ItemIndex = 1 then StrQry := StrQry + '%'';' Else StrQry := StrQry + ''';'; Close; SQL.Clear; SQL.Add(StrQry); Open; End; end; end.

Para finalizar nosso aplicativo, vamos implementar o relatório. Para isso adicione o

componente RvProject e RvDataSetConnection no formulário dmAgenda

(DataModule). Clique duas veze sobre o componente RvProject e salve o seu projeto

.rav na pasta agenda.

Configure as seguintes propriedades no componentes inseridos:

Object : RvProject : TRvProject Name: RvAgenda; ProjectFile: Clique nas ... e selecione o arquivo .rav que foi salvo. Object : RvDataSetConnection : TRvDataSetConnection DataSet : qryAgenda; Name: dsrvAgenda

No aplicativo Rave Reports, Clique no menu File | New Data Object e selecione a

conexão que você realizou anteriormente.

Adicione os seguintes componentes da pagina de design do Rave Reports: 2

Region, na Region1 adicione um componente Band e no componente Band adicione

um Text e um BitMap. Na Region2, adicione um componente Band e um DataBand.

No Componente Band da Region2, adicione 3 Text e alter a propriedade Text para :

Nome, Endereço, Telefone e Data de Nascimento respectivamente. No Componente

DataBand adicione os campos do Data View correspondentes aos componentes

Text. Seu Relatório deve ficar da seguinte forma:

Page 94: Apostila Delphi - RADStudio2007-121101142350

98

Figura 92 – Relatório de Agenda

Faça as seguintes configurações nas bands:

Na Band que está na region1, adicione os componentes BitMap e Text e altere as

propriedades para:

Object BitMap: Image: Selecione a imagem que desejar no diretório de imagens do delphi2007. Object Text: Text: Relação de Nomes da Agenda

Na Region2, configure as propriedades do componente Band da seguinte forma:

ControllerBand: DataBand1

Adicione na Band os Text correspondente aos da imagem acima.

No Componente DataBand, altere a propriedade DataView para DataView1 e

adicione os DataText de acordo com a figura acima.

Salve a aplicação e execute-a.

EXERCICIO PROPOSTO 7

Com base no diagrama abaixo, desenvolva uma aplicação atendendo as

especificações do modelo:

Page 95: Apostila Delphi - RADStudio2007-121101142350

99

Cliente

CNPJ: VARCHAR(18)

RazaoSocial: VARCHAR(100)

Logradouro: VARCHAR(150)

Bairro: VARCHAR(50)

Cidade: VARCHAR(25)

CEP: VARCHAR(10)

Email: VARCHAR(50)

Fone: VARCHAR(12)

DtCadastro: DATE

Pedido

Pedido_ID: INTEGER

DataPedido: DATE

Valor: FLOAT

Status: CHAR(1)

CNPJ: VARCHAR(18) (FK)

Itens_Pedido

Iten_ID: INTEGER

Pedido_ID: INTEGER (FK)

Produto_ID: INTEGER (FK)

Qtde: INTEGER

Valor: FLOAT

Produto

Produto_ID: INTEGER

Descricao: VARCHAR(100)

QtdeEstoque: INTEGER

Valor: FLOAT

Ativo: CHAR(1)

Categoria_ID: INTEGER (FK)

Categoria

Categoria_ID: INTEGER

Descricao: VARCHAR(50)

O aplicativo deve ter: Cadastro/Consulta de Clientes; Cadastro de produtos e

categorias; Consulta de Produtos por Categoria; Relatório de Pedidos em um

determinado período. Crie a base de Dados no InterBase e utilize a paleta InterBase

para realizar a conexão e acesso ao Banco de Dados criado.

20 INTERBASE

O Interbase é um poderoso banco de dados Cliente/Servidor relacional que é

compatível com SQL-ANSI-92, e foi desenvolvido para ser um banco de dados

independente de plataformas e de sistemas operacionais.

Dispensa ainda o uso de super-servidores, usando pouco espaço em disco para sua

instalação e utilizando pouca memória em situações normais de uso. Por isso a

plataforma necessária para a sua instalação e utilização pode ser reduzida

diminuindo consideravelmente os custos do projeto.

Uma grande vantagem do Interbase é que ele é Múltiplaforma, ou seja, funciona em

vários Sistemas Operacionais, dentre eles podemos destacar: Windows 9x; Windows

NT; Linux; Solaris.

20.1 IBConsole

Page 96: Apostila Delphi - RADStudio2007-121101142350

100

O que é? E pra que serve?

O IBConsole é o gerenciador de Dados que acompanha o InterBase. A grande

vantagem dele é o fato, de não ser uma ferramenta de criação de Tabelas.

No IBConsole, você realmente aprende a linguagem SQL, pois, toda e qualquer

criação, relacionamento, manutenção, é feito no ISQL, tudo via Linha de Comando

DML “Linguagem de manipulação de Dados”.

No IBConsole o usuário master é “SYSDBA” e a sua senha é “masterkey”, o seu uso

é bastante simples, inicialmente você precisa se “logar” no IBConsole para isso

clique com o botão direito sobre a opção “Local Server” e escolha “login” em

USERNAME você informa o usuário master e a sua senha acima descrita. Na opção

Databases você pode registrar ou criar um novo banco de dados, para fazer o

registro o banco já deve existir, clique com o botão direito sobre a opção “Register”,

em Files você informa o nome do banco e o seu caminho se preferir pode procurar

com o botão de atalho que esta localizado a sua direita, o Alias Name é o nome do

Alias para esse banco, User Name / Password você deve informar o usuário e a sua

senha, clicando no botão de OK para finalizar o registro.

Para criarmos um Banco de Dados em ambiente Client/Server via IBConsole deve

escolher a opção “interactive SQL” no menu Tools ou clicar no ícone SQL. Com ela,

podemos enviar comandos SQL para o servidor Interbase administrar nossos dados.

Ao carregarmos o Interbase Windows ISQL, veremos uma tela dividida em duas

partes, a parte superior aceita comandos SQL e os resultados aparecerão na parte

inferior. Devemos observar que o ISQL não enviará nenhum comando SQL até

logarmos com um usuário e senha correta e nos conectarmos a um banco de dados.

Ex: Vamos mostrar todos os dados da tabela Employee, esta tabela é uma tabela de

exemplo que é instalada juntamente com o Interbase, não esqueça de se conectar a

esse banco antes.

Select * from employee

SQL – Structured Query Language

O Departamento de Pesquisas da IBM desenvolveu a SQL como forma de interface

para o sistema de Banco de Dados relacional denominado SYSTEM R, no inicio dos

anos 70. Em 1986 o American National Standard Institute (ANSI), publicou um

Page 97: Apostila Delphi - RADStudio2007-121101142350

101

padrão SQL e ela se estabeleceu como linguagem padrão de Banco de Dados

Relacional.

A SQL apresenta uma série de comandos que permitem a definição dos dados,

chamada de DDL (Data Definition Language – Linguagem de Definição de Dados),

composta entre outros pelos comandos Create, que é destinado à criação do Banco

de Dados, das tabelas que o compõe, além das relações existentes entre as tabelas.

Como exemplo da classe DDL temos os comandos Create, Alter, Drop e Rename.

Os comandos da série DML (Data Manipulation Language – Linguagem de

Manipulação de Dados), destinados as consultas, inserções, exclusões e alterações

em um ou mais registros de uma ou mais tabelas de maneira simultânea. Como

exemplo de comandos da classe DML temos os comandos Select, Insert, UpDate,

Delete, Commit e Rollback.

Comandos e Funções:

A seguir serão listados alguns comandos e funções mais utilizadas do Interbase,

com parâmetros mais comuns. Não serão abordados todos os comandos, mas o

essencial para se obter um bom conhecimento e conseguir usufruir do potencial

desse banco de dados.

ALTER DATABASE CREATE EXCEPTION DROP PROCEDURE

ALTER DOMAIN CREATE GENERATOR DROP TABLE

ALTER EXCEPTION CREATE INDEX DROP TRIGGER

ALTER INDEX CREATE PROCEDURE DROP VIEW

ALTER PROCEDURE CREATE TABLE EXECUTE PROCEDURE

ALTER TABLE CREATE TRIGGER GEN_ID( )

ALTER TRIGGER CREATE VIEW INSERT

AVG( ) DECLARE EXTERNAL FUNCTION MAX( ) / MIN( )

CAST( ) DELETE ROLLBACK

CLOSE DROP DATABASE SELECT

COMMIT DROP DOMAIN SET GENERATOR

COUNT( ) DROP EXCEPTION SUM( )

CREATE DATABASE DROP EXTERNAL FUNCTION UPDATE

CREATE DOMAIN DROP INDEX UPPER( )

ALTER TABLE

Altera a estrutura de uma tabela e ou a integridade da mesma.

Sintaxe:

Page 98: Apostila Delphi - RADStudio2007-121101142350

102

ALTER TABLE table ADD <col_def> <col_def> = col { <datatype> |

[COMPUTED [BY] (<expr>) | domain}[DEFAULT { literal | NULL | USER}][NOT

NULL] [ <col_constraint>]

[COLLATE collation]<col_constraint> = [CONSTRAINT constraint]

<constraint_def>

[ <col_constraint>]

Ex : ALTER TABLE FORNECEDORES ADD CGC CHAR(14), DROP

TIPOFORNECEDOR, ADD CONSTRAINT E_MAIL CHECK ( E_MAIL

CONTAINING ‘@’ OR E_MAIL IS NULL )

AVG()

Retorna a média de valores de uma coluna.

Ex: SELECT MES, AVG(VALOR_DA_VENDA) FROM VENDAS ORDER BY MES

COMMIT

Grava as alterações de uma transação permanente no Banco de Dados.

Sintaxe:

COMMIT

Ex : COMMIT

COUNT()

Retorna a quantidade de registros para uma condição em um SELECT

Sintaxe :

COUNT( * | ALL | valor | DISTINCT valor )

Ex : SELECT COUNT(*) FROM CLIENTES

Page 99: Apostila Delphi - RADStudio2007-121101142350

103

CREATE DATABASE

Cria um novo Banco de Dados “.GDB”. Nele pode especificar as suas

características, como:

Nome do Arquivo;

Tamanho da página de dados (PAGE SIZE);

Sintaxe :

CREATE {DATABASE | SCHEMA} ' filespec'

[USER ' username' [PASSWORD ' password']]

[PAGE_SIZE [=] int]

[LENGTH [=] int [PAGE[S]]]

[DEFAULT CHARACTER SET charset]

[ <secondary_file>];

<secondary_file> =FILE 'filespec' [<fileinfo>][<secondary_file>]

<fileinfo> = LENGTH [=] int [PAGE[S]] | STARTING [AT [PAGE]] int

[ <fileinfo>]

Ex :

CREATE DATABASE ‘C:\DB\TESTE.GDB’ DEFAULT CHARACTER SET

ISO8859_1 FILE ‘C:\DB\TESTE.GD1’ STARTING AT PAGE 10001 LENGHT

10000 PAGES

CREATE INDEX

Cria um índice para uma ou mais colunas especificas da tabela. O índice está ligado

diretamente a performance do seu banco de dados. O conceito de índices em

ambientes Desktop´s “xBase, Access, Paradox” é muito diferente do conceito de

índices em ambiente Client/Server. Um índice em ambiente Client/Server “InterBase,

Oracle, DB2”, não tem a função de organizar a tabela, pois, você tem o mesmo

efeito com ORDER BY. A função de um índice em ambiente Client/Server, é de

performance em primeiro lugar, caso o índice seja um PK “Primary Key”, tem a

função de manter a integridade da tabela, caso o índice seja um FK “Foreign Key”,

Page 100: Apostila Delphi - RADStudio2007-121101142350

104

tem a função de relacionamento e integridade da tabela, caso o índice seja UNIQUE,

tem a função de não deixar valores iguais serem incluídos.

As cláusulas ASCENDING e DESCENDING, tem a função de organizar da maneira

desejada o índice. O valor default é ASC

Sintaxe :

CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]

INDEX index ON table ( col [, col ...]);

Ex : CREATE INDEX IND_DATA_VENDA ON “VENDAS” ( DATA_VENDA );

CREATE DESC INDEX IND_SALARIOS ON “FUNCIONARIOS” ( SALARIO );

CREATE UNIQUE INDEX IND_COD_PRODUTO ON “PRODUTOS” ( ID );

CREATE TABLE

Cria uma nova tabela no seu banco de dados InterBase.

Sintaxe :

CREATE TABLE table [EXTERNAL [FILE] 'filespec']

(<col_def> [, <col_def> | <tconstraint> …]);

<col_def> = col {<datatype> | COMPUTED [BY] (<expr>) | domain}

[DEFAULT {literal | NULL | USER}]

[NOT NULL]

[<col_constraint>]

[COLLATE collation]

<datatype> =

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION}[<array_dim>]

| (DATE | TIME | TIMESTAMP} [<array_dim>]

| {DECIMAL | NUMERIC} [(precision [, scale])] [<array_dim>]

| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(int)]

[<array_dim>] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [(int)] [<array_dim>]

Page 101: Apostila Delphi - RADStudio2007-121101142350

105

| BLOB [SUB_TYPE {int | subtype_name}] [SEGMENT SIZE int]

[CHARACTER SET charname]

| BLOB [(seglen [, subtype])]<array_dim> = [[x:]y [, [x:]y …]]

<expr> = A valid SQL expression that results in a single value.

<col_constraint> = [CONSTRAINT constraint]

{ UNIQUE

| PRIMARY KEY

| REFERENCES other_table [(other_col [, other_col …])]

[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

| CHECK (<search_condition>)}

<tconstraint> = [CONSTRAINT constraint]

{{PRIMARY KEY | UNIQUE} (col [, col …])

| FOREIGN KEY (col [, col …]) REFERENCES other_table

[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

| CHECK (<search_condition>)}

<search_condition> = <val> <operator> {<val> | (<select_one>)}

| <val> [NOT] BETWEEN <val> AND <val>

| <val> [NOT] LIKE <val> [ESCAPE <val>]

| <val> [NOT] IN (<val> [, <val> …] | <select_list>)

| <val> IS [NOT] NULL

| <val> {>= | <=}

| <val> [NOT] {= | < | >}

| {ALL | SOME | ANY} (<select_list>)

| EXISTS (<select_expr>)

| SINGULAR (<select_expr>)

| <val> [NOT] CONTAINING <val>

| <val> [NOT] STARTING [WITH] <val>

| (<search_condition>)

| NOT <search_condition>

| <search_condition> OR <search_condition>

| <search_condition> AND <search_condition>

<val> = { col [<array_dim>] | :variable

| <constant> | <expr> | <function>

Page 102: Apostila Delphi - RADStudio2007-121101142350

106

| udf ([<val> [, <val> …]])

| NULL | USER | RDB$DB_KEY | ? }

[COLLATE collation]

<constant> = num | 'string' | charsetname 'string'

<function> = COUNT (* | [ALL] <val> | DISTINCT <val>)

| SUM ([ALL] <val> | DISTINCT <val>)

| AVG ([ALL] <val> | DISTINCT <val>)

| MAX ([ALL] <val> | DISTINCT <val>)

| MIN ([ALL] <val> | DISTINCT <val>)

| CAST (<val> AS <datatype>)

| UPPER (<val>)

| GEN_ID (generator, <val>)

Ex : CREATE TABLE PRODUTOS (

ID INTEGER NOT NULL,

NOME VARCHAR(50) NOT NULL,

DATA DATE DEFAULT CURRENTE DATE NOT NULL,

PRECO DOUBLE PRECISION ( CHECK PRECO > 0),

ESTOQUE INTEGER ( CHECK ESTOQUE > 0),

VALOR COMPUTED BY ( PRECO * ESTOQUE ),

CONSTRAINT PK_PRODUTOS PRIMARY KEY(ID));

DELETE

Apaga um ou mais registros de uma tabela InterBase. Se não for utilizado a

cláusula WHERE, será apagado todos os registros da tabela.

Sintaxe :

DELETE [TRANSACTION transaciona] FROM table

{[WHERE <search_condition>] | WHERE CURRENT OF cursor};

Ex : DELETE FROM VENDAS WHERE DATA_VENDA <= ‘1-JAN-1999’;

DROP INDEX

Page 103: Apostila Delphi - RADStudio2007-121101142350

107

Deleta o índice definido pelo usuário do Banco de Dados InterBase.

Sintaxe :

DROP INDEX “name”

Ex : DROP INDEX IND_NOME;

DROP TABLE

Apaga uma tabela do Banco de Dados, e também os índices referenciados e

trigger´s que a tabela faz referencia.

Sintaxe :

DROP TABLE “name”;

Ex : DROP TABLE “FORNECEDORES”;

INSERT

Comando responsável para adicionar um mais registros na tabela de Banco

de Dados InterBase. Os campos que forem omitidos recebem valores NULOS

“NULL”.

Sintaxe :

INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]

{VALUES (<val> [, <val> …]) | <select_expr>};

<object> = tablename | viewname

<val> = {:variable | <constant> | <expr>

| <function> | udf ([<val> [, <val> …]])

| NULL | USER | RDB$DB_KEY | ?

} [COLLATE collation]

<constant> = num | 'string' | charsetname 'string'

<function> = CAST (<val> AS <datatype>)

| UPPER (<val>)

| GEN_ID (generator, <val>)

Page 104: Apostila Delphi - RADStudio2007-121101142350

108

Ex : INSERT INTO CLIENTES (ID,NOME) VALUES (1,’Nome do Cliente’);

INSERT INTO VENDAS_OLD SELECT * FROM VENDAS WHERE

DATA_VENDA = CURRENTE DATE;

MAX( )

Função que agrega e retorna o valor máximo de uma coluna.

Sintaxe :

MAX([ALL <col> | DISTINCT <col>)

Ex : SELECT MAX(SALARIO) FROM FUNCIONARIOS;

MIN( )

Função que agrega e retorna o valor mínimo de uma coluna.

Sintaxe :

MIN([ALL <col> | DISTINCT <col>)

Ex : SELECT MIN(SALARIO) FROM FUNCIONARIOS;

ROLLBACK

Desfaz as mudanças ocorridas até o exato momento no Banco de Dados

InterBase, sem que o comando COMMIT tenha sido executado. Este comando e o

Commit fecham a transação aberta pela aplicação e ou ferramenta de

gerenciamento as tabelas.

Sintaxe :

ROLLBACK

Ex : ROLLBACK;

Page 105: Apostila Delphi - RADStudio2007-121101142350

109

SELECT

Este é o comando responsável pela obtenção dos dados da tabela, view´s e

ou Stored Procedures.

Sintaxe :

SELECT [TRANSACTION transaction]

[DISTINCT | ALL]

{* | <val> [, <val> …]}

[INTO :var [, :var …]]

FROM <tableref> [, <tableref> …]

[WHERE <search_condition>]

[GROUP BY col [COLLATE collation] [, col [COLLATE collation] …]

[HAVING <search_condition>]

[UNION <select_expr> [ALL]]

[PLAN <plan_expr>]

[ORDER BY <order_list>]

[FOR UPDATE [OF col [, col …]]];

<val> = {

col [<array_dim>] | :variable

| <constant> | <expr> | <function>

| udf ([<val> [, <val> …]])

| NULL | USER | RDB$DB_KEY | ?

} [COLLATE collation] [AS alias]

<array_dim> = [[x:]y [, [x:]y …]]

<constant> = num | 'string' | charsetname 'string'

<function> = COUNT (* | [ALL] <val> | DISTINCT <val>)

| SUM ([ALL] <val> | DISTINCT <val>)

| AVG ([ALL] <val> | DISTINCT <val>)

| MAX ([ALL] <val> | DISTINCT <val>)

| MIN ([ALL] <val> | DISTINCT <val>)

| CAST (<val> AS <datatype>)

| UPPER (<val>)

| GEN_ID (generator, <val>)

Page 106: Apostila Delphi - RADStudio2007-121101142350

110

<tableref> = <joined_table> | table | view | procedure

[(<val> [, <val> …])] [alias]

<joined_table> = <tableref> <join_type> JOIN <tableref>

ON <search_condition> | (<joined_table>)

<join_type> = [INNER] JOIN

| {LEFT | RIGHT | FULL } [OUTER]} JOIN

<search_condition> = <val> <operator> {<val> | (<select_one>)}

| <val> [NOT] BETWEEN <val> AND <val>

| <val> [NOT] LIKE <val> [ESCAPE <val>]

| <val> [NOT] IN (<val> [, <val> …] | <select_list>)

| <val> IS [NOT] NULL

| <val> {>= | <=}

| <val> [NOT] {= | < | >}

| {ALL | SOME | ANY} (<select_list>)

| EXISTS (<select_expr>)

| SINGULAR (<select_expr>)

| <val> [NOT] CONTAINING <val>

| <val> [NOT] STARTING [WITH] <val>

| (<search_condition>)

| NOT <search_condition>

| <search_condition> OR <search_condition>

| <search_condition> AND <search_condition>

<operator> = {= | < | > | <= | >= | !< | !> | <> | !=}

<plan_expr> =

[JOIN | [SORT] [MERGE]] ({<plan_item> | <plan_expr>}

[, {<plan_item> | <plan_expr>} …])

<plan_item> = {table | alias}

{NATURAL | INDEX (<index> [, <index> …]) | ORDER <index>}

<order_list> =

{col | int} [COLLATE collation]

[ASC[ENDING] | DESC[ENDING]]

[, <order_list> …]

Ex. : SELECT codigo,nome FROM funcionarios

Page 107: Apostila Delphi - RADStudio2007-121101142350

111

DISTINCT – Prevê a exclusão de linhas semelhantes do Result Set.

Operadores que fazem parte da cláusula WHERE

BETWEEN – Este operador testa se o valor da coluna encontra-se no

intervalo declarado.

IN – Verifica se valor está contido no Sub-Conjunto de dados na coluna

declarada.

ALL – Verifica se uma valor é igual a todos os valores retornados em um

SubQuery(*).

ANY e SOME – Verifica se um valor está contido em qualquer valor retornado

num SubQuery(*).

EXISTS – Verifica se um valor existe e ou está presente em pelo menos uma

linha no retorno do SubQuery(*). Está clausula pode conter também NOT

EXISTS.

SINGULAR – Opera com semelhança ao EXISTS, com a diferença de que o

valor tem que existir exatamente em uma ocorrência do SubQuery(*).

CONTAINING – Testa se o valor passado a coluna, contém em uma parte da

string. Está clausula é CASE-SENSITIVE.

STARTING WITH- Testa se a coluna inicia exatamente como indicado pelo

valor passado.

Clausula UNION

Executa a união de uma mais tabelas com o mesmo nome de colunas.

SUM( )

Page 108: Apostila Delphi - RADStudio2007-121101142350

112

Função de Agregação que retorna a soma dos valores da coluna

Sintaxe :

SUM( [ALL <val> | DISTINCT <val>)

Ex : SELECT SUM(VALOR) FROM VENDAS;

UPDATE

Comando responsável pela atualização da tabela no Banco de Dados

InterBase. Update trabalha de forma semelhante ao DELETE “é claro, com sua

enorme diferença”, se não passarmos a cláusula WHERE, toda a coluna da tabela

será atualizada.

Sintaxe :

UPDATE [TRANSACTION transaction] {table | view}

SET col = <val> [, col = <val> …]

[WHERE <search_condition> | WHERE CURRENT OF cursor];

Ex : UPDATE CLIENTE SET DATA_INCLUSAO = CURRENT DATE;

Tipos de Dados do InterBase

O InterBase, suporta a maioria dos tipos de Dados do SQL. O InterBase,

apenas não tem como tipo de dado, o tipo Boolean. Mas, isto não é uma falha do

InterBase, outro SGDB´s também não tem este tipo de dado.

BLOB

O tipo de Dado BLOB, tem o tamanho variável, isto é, não sabemos na hora

da criação do campo BLOB qual será o seu tamanho realmente, mas, o limite do

campo Blob que está na documentação do InterBase, é de 64k por segmento.

Este tipo de campo é o tipo indicado para armazenar Textos Grandes “Memos”,

Fotos, Gráficos, Ícones, isto é, aparentemente não tem um tipo de dado que não

possa ser armazenado no Campo Blob. Campos Blob´s não podem ser indexados.

Page 109: Apostila Delphi - RADStudio2007-121101142350

113

Saber qual o sub-tipo correto utilizar é essencial para criar aplicativos que se

utilizem dos campos BLOBs. Os BLOBs se apresentam em 3 versões :

Sub-tipo 0 - Armazena dados em formato binário – Fotos, etc.

Sub-tipo 1 - Armazena dados em formato texto – Memos.

Sub-tipos definidos pelo usuário.

Além dos 2 Sub-tipos pré-definidos, também existem os Sub-tipos definidos

pelo usuário. Esses tipos são determinados com o uso de valores negativos

logo após a palavra SUB_TYPE. O número utilizado é um inteiro determinado

arbitrariamente pelo usuário de acordo com sua preferência, desde que seja

negativo. O uso de -1 é funcionalmente equivalente ao uso de -2, -3,

Tc...

A única consideração que deve ser tomada é a de se certificar de sempre armazenar

o tipo pré-determinado de informação no respectivo sub-tipo de BLOB. O Interbase

não faz nenhuma análise dos dados que estão sendo gravados, portanto essa é

uma responsabilidade do aplicativo. Nenhum erro será retornado pelo Interbase se

um tipo errado de dado for inserido em um BLOB de sub-tipo incorreto, mas um

aplicativo pode ser prejudicado se ao recuperar as informações do BLOB, a mesma

não corresponder ao formato esperado.

Sintaxe :

Estas declarações é na criação da tabela :

MEMO BLOB SUB_TYPE 1;

FOTO BLOB SUB_TYPE 0;

Ex :

CREATE TABLE FUNCIONARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

NOME VARCHAR(50) NOT NULL,

....,

FOTO BLOB SUB_TYPE 0)

Page 110: Apostila Delphi - RADStudio2007-121101142350

114

CHAR(n)

O tipo de Dado CHAR, tem o seu tamanho definido na hora da criação da tabela.

Seu tamanho máximo é de 32767, 32k. Este tipo tem o seu tamanho fixo.

Ex :

CREATE TABLE FUNCIONARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

NOME VARCHAR(50) NOT NULL,

...

SEXO CHAR(01)

)

Este tipo de dado é usado quando você realmente souber o tamanho da

coluna/campo a ser criada.

VARCHAR(n)

O tipo de Dado VARCHAR, tem o seu tamanho definido na hora da criação da tabela.

Seu tamanho máximo é de 32767, 32k. Este tipo tem o seu tamanho variado na

tabela. Isto é, se você criar uma coluna de 45 Caracteres, mas, a coluna tenha

apenas 20 Caracteres gravados, o restante, os 25 Caracteres são descartados.

Ex :

CREATE TABLE FUNCIONARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

NOME VARCHAR(50) NOT NULL

)

Este tipo de dado é usado quando você realmente não souber o tamanho da

coluna/campo a ser criada. Outros exemplos, são criar campos Descrições,

Inscrições Estaduais.

DATE

Page 111: Apostila Delphi - RADStudio2007-121101142350

115

O tipo de Dado DATE, armazena a Data, e seu tamanho é de 32 bits inteiros longos.

Ex :

CREATE TABLE FUNCIONARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

NOME VARCHAR(50) NOT NULL,

...,

DATA_ADMISSAO DATE

)

TIME

O tipo de Dado TIME, armazena a hora, e seu tamanho é de 32 bits inteiros longos.

Ex :

CREATE TABLE FUNCIONARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

NOME VARCHAR(50) NOT NULL,

...,

HORA_ENTRADA TIME,

HORA_SAIDA TIME

)

TIMESTAMP

O tipo de Dado TIMESTAMP, armazena a Data e a hora ao mesmo tempo, e seu

tamanho é de 32 bits inteiros longos.

Ex :

CREATE TABLE PRODUTOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

...,

DATA_HORA_MOVIMENTACAO TIMESTAMP

)

DECIMAL

Page 112: Apostila Delphi - RADStudio2007-121101142350

116

O tipo de Dado DECIMAL armazena dígitos a serem gravados na precisão

especificada na criação da tabela.

Ex :

CREATE TABLE FUNCIOARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

...,

SALARIO DECIMAL(15,02)

)

NUMERIC

O tipo de Dado NUMERIC, armazenas dígitos a serem gravados na precisão

especificada na criação da tabela.

Ex :

CREATE TABLE FUNCIOARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

...,

SALARIO NUMERIC(15,02)

)

SMALLINT

O tipo de Dado SMALLINT, armazena dígitos a serem gravados, mas, com o limite

de : -32768 a 32767. Serve para armazenar dados numéricos pequenos.

Ex :

CREATE TABLE FUNCIOARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

...,

ALTURA SMALLINT

)

INTEGER

Page 113: Apostila Delphi - RADStudio2007-121101142350

117

O tipo de Dado INTEGER, armazena dígitos a serem gravados, mas, diferente do

SMALLINT, não existe um limite aparentemente, este tipo é de 32 bits, tem a escala

de valores em : -2.147.483.648 até 2.147.483.648

Ex :

CREATE TABLE FUNCIOARIOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

...)

FLOAT

O tipo de Dado FLOAT, armazena dígitos a serem gravados, mas, com precisão

simples de 7 dígitos.

Ex :

CREATE TABLE PRODUTOS (

ID INTEGER NOT NULL PRIMARY KEY,

DESCRICAO VARCHAR(50) NOT NULL,

VLR_ULT_CMP_ITEM FLOAT

...)

DOUBLE PRECISION

Este é o tipo de campo no qual é recomendado para uso monetário/valores no

InterBase. Sua precisão é de 64 bits.

Ex :

CREATE TABLE MOV_FINANCEIRA (

IDCODMOEDA CHAR(03) NOT NULL PRIMARY KEY,

DATA_MOVIMENTACAO DATE NOT NULL PRIMARY KEY,

VALOR_TOTAL_MOVIMENTACAO_DIA DOUBLE PRECISION

);


Top Related