Sei sulla pagina 1di 113

MINISTRIO DA EDUCAO SECRETARIA DE EDUCAO MDIA E TECNOLGICA Instituto Federal de Educao, Cincia e Tecnologia do Amazonas DIRETORIA DE ENSINO GERNCIA

EDUCACIONAL DA REA DE SERVIOS

Curso Tcnico em Informtica SINF32 Prof. Manoel Pantoja A. Jr. Apostila de Delphi 1. IDE

O ambiente de desenvolvimento composto de vrias 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 compem a aplicao. O form responsvel pela interao entre usurio e mquina, alm de servir de base para os demais componentes. O form tem caractersticas de uma janela comum do windows, botes (Maximizar, Minimizar, fechar e controle) e cones que podem ser modificados para uma aplicao.

Figura 1.1 Tela do Formulrio

1.2 BARRA DE MENU PRINCIPAL

A barra de menu principal, contm todos os menus da aplicao.

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

Para que os componentes disponveis 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 caractersticas dos componentes utilizados na aplicao. Nela encontramos 2 (duas) guias: Properties responsvel pelas informaes a respeito das propriedades de cada componente selecionado. Events Define quais os eventos que um determinado componente pode realizar e que sero definidos pelo desenvolvedor. Temos ainda uma caixa de combinao, 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 insero de um rtulo de dados no componente;

Align Permite a definio do alinhamento; Font Permite a definio de uma fonte padro 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 smbolo tem a caracterstica de mostrar subpropriedades. J a propriedade Icon possui ao seu lado direito o smbolo ( ), isto significa que todo e qualquer propriedade que possua este smbolo abrir um caixa de dilogo ao ser acionado.

1.5 CODE EDITOR

o responsvel por toda parte de programao do Delphi2007, tais como: declaraes de variveis, definio de objetos, bibliotecas, etc. Todas as implementaes realizadas pelo desenvolvedor no Delphi2007, ser feito do Code Editor.

Figura 5 Code Editor

Uma caracterstica muito interessante no Code Editor que ao inserirmos um componente no form, o mesmo declarado automaticamente no editor de cdigo.

Figura 6 Tela de Formulrio

Figura 7 Tela do Code Editor

1.6 CODE INSIGHT

Um recurso que vai facilitar nossa vida no momento de desenvolvimento de cdigo o Code Insight do Code Editor. Ele atua como um ajudante de complemento junto ao cdigo do desenvolvedor. Por exemplo, ao digitar o nome de um objeto seguido de ponto (.) abre-se uma listagem de mtodos e propriedades que podem ser utilizadas neste objeto.

Figura 8 Code Insight

1.7 CONFIGURAES DE AMBIENTE

Voc pode personalizar o ambiente atravs do menu Tools | Options | Environment Options, algumas opes podemos julgar importantes:

10

1.7.1 Autosave Options Editor files Grava os arquivos fonte (.PAS) no momento da compilao, evitando perda de cdigo em caso de travamento da mquina. Porm, no permite compilar um determinado projeto sem salva-lo antes.

Project Desktop - Grava a posio das janelas do projeto atual.

1.7.2 Compiling and Running Show Compiler Progress Mostra o progresso da compilao do projeto; Minimize on run Minimiza o codegear durante a execuo do projeto;

2. TECLAS IMPORTANTES

Tecla F12 F11 F10 F9 CTRL + F9 SHIFT + F12 CTRL + F2

Funo Alterna entre o code editor e o form designer. Alterna entre o code editor, form designer e a object inspector. Torna o foco para a janela principal. (RUN) Permite compilar e executar o projeto para testes. Este processo gera automaticamente o arquivo .EXE no diretrio onde foi gravado o arquivo de projeto (.DPR). Permite compilar o projeto sem executar. Ideal para conferncia de cdigo. Permite alternar entre os formulrios do projeto. Equivalente ao cone View Form na SpeedBar. Permite destravar o Delphi em caso de testes onde ocorram excees, como veremos mais adiante.

3. PROJETOS NO 2007

Um projeto nada mais do que um conjunto de arquivos necessrios para gerar uma aplicao.

Vamos destacar alguns arquivos:

11

Extenso

Tipo e descrio Arquivo Pascal: o cdigo-fonte de uma unidade Pascal, ou uma unidade relacionada a um formulrio ou uma unidade independente. Arquivo Delphi Project. (Contm cdigo-fonte em Pascal.) Delphi Form File: um arquivo binrio (na verso 5 pode ser convertido para texto) com a descrio das propriedades de um formulrio e dos componentes que ele contm. Delphi Compiled Unit: o resultado da compilao de um arquivo Pascal.

Criao Desenvolvimento

Necessrio para compilar? Sim.

.PAS

.DPROJ

Desenvolvimento Desenvolvimento

Sim. Sim. Todo formulrio armazenado em um arquivo PAS e em um arquivo DFM.

.DFM

Compilao

.DCU

.BMP, .ICO, .CUR

Arquivos de bitmap, cone e cursor: arquivos padro do Windows usados para armazenar imagens de bitmap. Arquivo de configurao com opes de projeto. Semelhante aos arquivos DOF. Delphi Option File: um arquivo de texto com as configuraes atuais para as opes de projeto. Arquivo de Desktop: contm informaes sobre a posio das janelas do Delphi, os arquivos abertos no editor e outros ajustes da rea de trabalho. Arquivo executvel: o aplicativo Windows que voc produziu.

Desenvolvimento: Image Editor

Desenvolvimento

.CFG

Desenvolvimento

.DOF

Desenvolvimento

.DSK

Apenas se o cdigofonte no estiver disponvel. Os arquivos DCU para as unidades que voc escreve so um passo intermedirio; portanto, eles tornam a compilao mais rpida. Normalmente no, mas eles podem ser necessrios em tempo de execuo e para edio adicional. Necessrio apenas se opes de compilao especiais foram configuradas. Exigido apenas se opes de compilao especiais foram configuradas. No. Voc deve exclulo se copiar o projeto em um novo diretrio.

Compilao: Ligao (linking)

.EXE

.~PAS

Backup do arquivo Pascal Desenvolvimento Pode ser ativado ou desativado atravs do Menu Tools Options Editor Options - Item: Create backup file.

No. Esse o arquivo que voc vai distribuir. Ele inclui todas as unidades compiladas, formulrios e recursos. No. Esse arquivo gerado automaticamente pelo Delphi, quando voc salva uma nova verso do cdigo-fonte.

3.1 SALVAR PROJETO

Para salvar um projeto no delphi 2007, voc tem 4 opes :

12

Comando Save Save As... Save Project As... Save All

Objetivo Salvar apenas a unidade selecionada Salvar a unidade selecionada como... pode-se renomear ou trocar de pasta (duplicando) o arquivo. Salvar o projeto como pode-se renomear ou trocar de pasta (duplicando) o arquivo. 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 padro 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 extenso .DPROJ, desta forma para abrir um projeto no codegear, basta ir no menu File e escolher uma das 3 (trs) opes Open; Open Project; Reopen.

Comando Open Open Project... Reopen

Objetivo Permite abrir um arquivo .DPROJ, .PAS entre grupos de projeto. Permite abrir um arquivo de projeto. Permite reabrir um arquivo (DPROJ ou PAS) utilizado anteriormente.

3.3 OPES DE PROJETO

possvel configurar vrios itens do sistema atravs do Projects | Options:

Figura 9 Tela de Opes do Projeto

13

Forms : Main form Permite a escolha do formulrio principal da aplicao; Available forms Os formulrios available (disponveis) em caso de criao em tempo de execuo.

Application: Title Define um nome para a aplicao diferente do nome do arquivo .DPR; Help File Define o nome do arquivo de Help associado aplicao; Icon Define o cone utilizado no arquivo executvel;

Compiler Estas opes permitem especificar uma compilao personalizada, ou seja, cada projeto pode ser compilado com uma caracterstica.

Linker Estas opes incluem informaes para a depurao.

Directories/Conditionals Nesta guia pode-se configurar o diretrio de sada para os arquivos gerados pela aplicao.

Version Info Estas informaes podem ser visualizadas no Windows atravs do menu rpido do mouse no arquivo executvel.

Packages Os packages permitem um controle de distribuio atravs de DLLs bsicas externas ao executvel entre outros recursos.

4 CONVENO DE NOMEAO

Para qualquer componente existente no projeto a principal propriedade a name, pois ela define o nome da varivel que ser utilizado no cdigo escrito em Object Pascal Grande parte dos desenvolvedores adota uma conveno para

facilitar/organizar o desenvolvimento/manuteno de sistemas. O Delphi 2007 adota

14

como padro o nome da classe da qual o componente instanciado e um nmero crescente de acordo com o nmero 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 dilogo. 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 combinao CTRL + SETAS. Para redimension-los, utilize a combinao SHIFT + SETAS.

Figura 10 Selecionando Vrios Objetos

6 MANIPULANDO EVENTOS

A guia Events do object Inspector permite ao desenvolvedor criar um manipulador de evento, onde o usurio ou o prprio sistema poder disparar um determinado evento. Um evento uma ao disparada dentro de uma aplicao. Exemplo:

Evento OnClick OnDblClick

Ocorrncia Quando o usurio clicar uma vez com o boto esquerdo do mouse sobre o componente. Quando o usurio d um duplo clique no componente com o boto

15 OnEnter OnExit OnKeyPress esquerdo do mouse. Quando o componente recebe o foco. Quando o componente perde o foco. 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 declarao do evento na clusula interface e a implementao do procedimento na clusula implementation.
procedure TForm1.Button1Click(Sender: TObject); begin form1.Caption := 'Meu Primeiro Programa'; ShowMessage(Meu Primeiro Programa em Delphi 2007'); end;

Executando a aplicao

Para executar a aplicao acima, pressione a tecla F9 ou clique no cone RUN.

6.1 COMENTRIOS

Os comentrios no cdigo fonte so importantes e podem ser feitos atravs dos seguintes smbolos:
//Comentrio de linha { Comentrio de bloco } (*Comentrio de bloco *)

7 VCL VISUAL COMPONENT LIBRARY

Vamos explanar alguns objetos com suas propriedades e seus respectivos mtodos.

7.1 OBJETO FORM

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

16 Align AutoScroll AutoSize BorderIcons BorderStyle formulrio criado. Altera o alinhamento e preenchimento do objeto. Permite habilitar as barras de rolagem. Determina se o controle ser automaticamente redimensionado. Determina os cones a serem exibidos na barra de ttulo do formulrio. Define o estilo da borda do formulrio. bsDialog Borda no redimensionvel, comum em caixa de dilogo bsSingle Borda simples e redimensionvel. bsNone Borda invisvel, no redimensionvel, sem botes de controle. bsSizeable Borda padro redimensionvel. Define a espessura da borda. Indica o rtulo exibido para o componente. Define a altura e largura da rea cliente. Define a cor de fundo de um componente. Indica a imagem exibida pelo ponteiro do mouse quando este ficar sobre o objeto. Associa o form a um monitor especfico em uma aplicao que utiliza vrios monitores. Define se o componente est habilitado ou no. Permite controlar os atributos do texto exibido em um componente. Determina o estilo do formulrio. fsNormal Definio padro do formulrio. fsMDIChild O formulrio ser uma janela-filha de uma aplicao MDI. fsMDIForm O formulrio ser o formulrio-pai de uma aplicao MDI. fsStayOnTop O formulrio permanece sobre todos os outros formulrios do projeto, exceto aqueles que tambm tm a propriedade FormStyle igual a fsStayOnTop. Define a altura do objeto. Define o tpico do arquivo help que ser exibido ao pressionar a tecla F1. Define um arquivo de help especfico. Permite exibir um texto de auxlio no momento em que o ponteiro do mouse permanece sobre o controle. Define o comportamento de uma barra de rolagem horizontal. Define o cone que ser usado pelo formulrio. Define se o formulrio deve ou no responder a um pressionamento de tecla, atravs do evento OnKeyPress, por exemplo. Define a coordenada da extremidade esquerda de um componente. Permite escolher entre mais de um componente MainMenu. Define o nome interno que identifica o componente dentro da aplicao. Define o componente PopupMenu a ser utilizado pelo objeto. Permite definir o tamanho e posio de um formulrio no momento em que ele aparece na sua aplicao. Define se a string de auxlio deve ou no ser exibida quando o usurio mantm o ponteiro do mouse sobre um controle. A propriedade Tag uma varivel do tipo Longint que o Delphi coloca disposio do usurio, que pode atribuir o significado mais conveniente. Define a coordenada da extremidade superior de um componente. Define o comportamento de uma barra de rolagem vertical. Define se o componente aparece ou no na tela. Define a largura do objeto. Permite definir qual o menu responsvel por manipular as janelas-filhas de uma aplicao MDI. Define o estado de exibio de um formulrio.

BorderWidth Caption ClientHeight / ClientWidth Color Cursor DefaultMonitor Enabled Font FormStyle

Height HelpContext HelpFile Hint HorzScrollBar Icon KeyPreview Left Menu Name PopupMenu Position ShowHint Tag Top VertScrollBar Visible Width WindowMenu WindowState

Mtodos
Show ShowModal Close Exibe o formulrio de manipulao no-modal. Exibe o formulrio de manipulao modal. Permite fechar o formulrio.

17

7.2 OBJETO TBUTTON

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

Figura 11 - Button

Propriedades
Action Anchors Cancel Default ModalResult Parent... TabOrder TabStop Referencia uma ao definida em um objeto TActionList. Permite manter a posio relativa do objeto ao objeto parente quando este redimencionado. Associa o evento OnClick do objeto ao pressionamento da tecla Esc. Associa ao evento OnClick do objeto ao pressionamento da tecla Enter. Propriedade utilizada para encerrar a execuo de um formulrio Modal quando selecionado um valor diferente de mrNone. As propriedades Parent permitem que o componente receba a mesma formatao do objeto proprietrio. Define a ordem na passagem de foco no momento de pressionamento da tecla TAB. Define se o foco pra no componente.

Mtodos
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 AutoSize BorderStyle CharCase HideSelection Maxlength PasswordChar Text Define se o texto exibido pelo controle ser selecionado quando este receber o foco da aplicao. Para componentes TEdit a propriedade determina se a altura do controle ser redimensionada quando o tamanho da fonte for alterado. Determina o tipo da borda do componente. Determina o se tipo da fonte ser maiscula, minscula ou normal. Define se o texto perde a seleo ao perder o foco. Define um limite para a insero de caracteres. Define qual caractere ser usado para ocultar o texto inserido no componente. Permite manipular os caracteres inseridos no componente pelo usurio.

18

Mtodos
Clear SetFocus Limpa o contedo da propriedade text. Envia o foco do windows para o componente.

7.4 OBJETO LABEL


Orienta os usurios escolha de componentes.

Figura 13 - Label

Propriedades
Alignment AutoSize FocusControl Layout ShowAccelChar Transparent WordWrap Define o alinhamento da string na rea do componente. Para componentes TDBText e TLabel, esta propriedade define se o controle ser automaticamente redimensionado para acomodar o texto. Define qual o componente receber foco quando o usurio selecionar a combinao de teclas aceleradoras (atalho) se existir. Define o alinhamento vertical do texto na rea do componente. Define se o caracter & ser um literal ou tecla de aceleradora (atalho). Define se o fundo do componente ser transparente ou no. Define se o texto poder utilizar o retorno automtico em caso de ultrapassar a largura definida e se a propriedade AutoSize estiver falsa.

EXERCCIO PROPOSTO 1

Objetivo: Trabalhar com objetos e elementos bsicos em Object Pascal, introduzindo tcnica de manipulao de propriedades e eventos. Componentes Utilizados: TLabel, TEdit e TButton Enfoque: Quando o usurio digitar uma string, este texto deve ser exibido no ttulo do formulrio e em uma mensagem de caixa de dilogo.

Resoluo:

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 Exerccio 1 e dentro dela salve a unit com o nome ufrmPrimeiroExercicio e o projeto com o nome prjPrimeiroExercicio;

19

Figura 14 Salvando a Aplicao

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 = Formulrio Principal; Name = frmPrincipal; d. Button1 Caption = Confirmar; Hint = Executar uma ao; ShowHint = True; e. Button2 Caption = Sair;

Para definirmos os eventos para os objetos Buttons, faa o seguinte procedimento: - Selecione o Button1 (Confirmar) e na guia events da object inspector, identifique o evento onclick e d dois cliques no espao em branco ao lado do evento. Um procedimento ser exibido no code editor. - Insira o cdigo 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 atravs do comando RUN compile e faa os testes necessrios.

20

7.5 OBJETO MEMO


Permite a digitao de um texto bem mais extenso do que no componente edit.

Figura 15 - Memo

Propriedades
Lines MaxLength ReadOnly ScrollBars WantReturns WantTabs Propriedade do tipo TStrings que contm as linhas de texto do componente. Define o limite mximo de caracteres no componente em sua propriedade Lines. Define se o componente do tipo somente leitura. Define se o componente pode trabalhar com barras de rolagem. Define se a tecla ENTER ser utiliza para quebra de linha. Define a tecla Tab como tabulao ou mudana de foco. Caso falso pode-se utilizar CTRL+TAB para produzir o efeito desejado.

Mtodos
LoadFromFile SaveToFile Permite carregar um arquivo para a propriedade Lines. Permite salvar o contedo da propriedade Lines em um arquivo especificado.

7.6 Objeto ComboBox


Cria uma lista suspensa de opes a escolha do usurio atravs do boto dropDown.

Figura 16 ComboBox

Propriedades
Items Sorted Text Define uma lista de Strings que aparece no componente. Define se os dados sero ordenados. Define o texto atual da Combobox.

Mtodos
Clear LoadFromFile SaveToFile Permite limpar o contedo da propriedade Items. Permite carregar um arquvo para a propriedade Items. Permite salvar o contedo da propriedade Items para um arquivo.

21

7.7 OBJETO GROUPBOX


um objeto continer, pois permite que possam ser inseridos outro componentes dentro dele.

Figura 17 GroupBox

Propriedades
Align Caption Pemite definir um alinhamento no objeto proprietrio. Define o texto informativo na parte superior do componente.

7.8 OBJETO RADIOGROUP


Permite a criao de opes para o usurio escolher apenas um dentre todas existentes.

Figura 18 - RadioGroup

Propriedades
Items ItemIndex Columns Define os itens disponveis ao usurio. Define qual dos itens est selecionado. Define o nmero de colunas para organizao dos componentes.

7.9 OBJETO MAINMENU E POPUPMENU


Permite a criao de Menus principais e menus rpidos.

Figura 19 - MainMenu

Propriedades
Items Images Define um novo item de Menu. Define um objeto do tipo ImageList.

22

7.10 OBJETO CHECKBOX (CAIXA DE VERIFICAO)


Permite verificar opes boolenas pr-definidas ou re-definidas pelo usurio.

Figura 20 - CheckBox

Propriedades
AllowGrayed Define caso verdadeiro, trs estados possveis para o checkbox: checked (ligado), unchecked (desligado) e grayed (parcial). Caso falso, dois estados: checked (ligado) e unchecked (desligado). Define se o componente est ligado ou no, caso tenha apenas dois estados. Permite definir trs estados se AllowGrayed for verdadeiro.

Checked State

7.11 OBJETO RADIOBUTTON (BOTO DE RADIO)


Permite escolher entre um grupo, pelo menos uma opo.

Figura 21 - RadioButton

Propriedades
Checked Define se o componente est ligado ou desligado.

7.12 OBJETO LISTBOX (CAIXA DE LISTAGEM)


Permite o usurio entrar ou manipular uma lista de dados.

Figura 22 - ListBox

Propriedades
Items MultiSelect Sorted Define uma lista de Strings que aparece no componente. Permite selecionar vrios itens (Strings) no componente. Define se a lista de Strings ser ordenada ou no.

23

Mtodos
Clear LoadFromFile SaveToFile Permite limpar o contedo da propriedade Items. Permite carregar um arquvo para a propriedade Items. Permite salvar o contedo da propriedade Items para um arquivo.

7.13 OBJETO PANEL (PAINEL)


Permite agrupar outros objetos e estabelecer um efeito visual nas aplicaes.

Figura 23 - Painel

Propriedades
Align Bevel... BorderStyle Define o alinhamento do componente em relao ao seu proprietrio. Define a caracterstica das bordas (interna e externa) bem como sua espessura. Define o tipo da borda.

7.14 OBJETO SPEEDBUTTON (BOTO PARA BARRA DE CONES)


Permite ao usurio manipular os botes individuais ou atravs do conceito de grupo.

Figura 24 - SpeedButton

Propriedades
Glyph GroupIndex AllowAllUp Flat Down Define um Bitmap para o componente. Permite agrupar um conjunto de SpeedButtons quando ao serem selecionados, tiverem a propriedade diferente de zero. Permite que o componente possa ter o relevo suspenso ao ser clicado. S pode ser utilizado junto ao conceito de agrupamento. Define um efeito visual interessante. Permite determinar qual componente foi pressionado. S pode ser utilizado junto ao conceito de agrupamento.

24

7.15 OBJETO MASKEDIT (CAIXA DE EDIO COM MSCARA)


Permite estabelecer uma mscara para a entrada de dados no componente. Pode ser considerado literalmente um componente Edit com mscara.

Figura 25 - MaskEdit

Propriedades
CharCase EditMask PasswordChar Define o tipo dos caracteres. Permite definir uma mscara para entrada de dados. Define um caracter para ocultar a entrada de dados.

7.16 OBJETO IMAGE (IMAGEM)


Permite inserir uma figura para uso geral na aplicao.

Figura 26 - Image

Propriedades
AutoSize Picture Stretch Permite alterar o tamanho do componente baseado no tamanho da figura. Define a figura a ser exibida. Permite alterar o tamanho da figura baseado no tamanho do componente.

Mtodos
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 espcie de sub-objeto do PageControl.

Figura 27 - PageControl

25

Propriedades
ActivePage Permite determinar qual a guia foi selecionada pelo usurio.

7.18 OBJETO OPENDIALOG (CAIXA DE DILOGO PARA ABERTURA DE ARQUIVOS)


Permite utilizar uma caixa de dilogo pronta com recursos padronizados pelo sistema operacional.

Figura 28 - OpenDialog

Propriedades
DefaultExt FileName Filter FilterIndex InitialDir Options Title Especifica a extenso a ser adicionada ao nome de um arquivo quando o usurio digita o nome de um arquivo sem a sua extenso. Define o arquivo selecionado no componente. Permite definir as mscaras de filtro de arquivo a serem exibidas. Define o filtro default a ser exibido na lista drop-down que define os tipos de arquivos selecionveis. Define o diretrio default quando a caixa de dilogo aberta. Neste componente, options define uma srie de valores booleanos. Define o ttulo da caixa de dilogo.

Os componentes da paleta dialogs so executados atravs do mtodo execute. Este mtodo uma funo que retorna um valor booleano, assim para exibir uma caixa de dilogo, podemos escrever: if OpenDialog1.Execute then Se o usurio escolher algum arquivo e confirmar a caixa, execute retorna verdadeiro, caso contrrio, 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

26

Para incluir imagens no componente ImageList, clique 2 vezes rapidamente no componente e clique no boto Add. 7.20 OBJETO PROGRESSBAR (BARRA DE PROGRESSO)
Permitir ao usurio ter um acompanhamento de uma rotina demorada.

Figura 30 - ProgressBar

Propriedades
Max Min Orientation Position Step Permite definir o valor mximo para a faixa de valores no componente. Permite definir o valor mnimo para a faixa de valores no componente. Define se o componente dever ser vertical ou horizontal. Define a posio corrente do controle no componente. Define o incremento usado na variao do valor da propriedade position.

7.21 OBJETO GAUGE (BARRA DE PROGRESSO)


Permitir ao usurio ter um acompanhamento de uma rotina demorada.

Figura 31 - Gauge

Propriedades
Kind Progress Permite definir aparncias diferenciadas no componente. Define a posio corrente do controle no componente.

27

7.22 OBJETO DATETIMEPICKER (DATA E HORA ATRAVS DE UMA COMBOBOX)


Permite ao usurio escolher uma data atravs de um componente que possui um importante impacto visual e facilidade operacional.

Figura 32 - DateTimePicker

Propriedades
CalColors Date DateFormat DateMode Kind MaxDate MinDate Define as cores do calendrio. Define a data selecionada no componente. Define o formato da apresentao da data. Define o estilo da caixa de listagem. Define se o componente deve trabalhar com data ou hora. Define uma data mxima para uma faixa de valores. Define uma data mnima para uma faixa de valores.

7.23 OBJETO MONTHCALENDAR (CALENDRIO MENSAL)


Permite ao usurio escolher uma data atravs de um componente que possui um importante impacto visual e facilidade operacional.

Figura 33 - MonthCalendar

Propriedades
Date FirstDayOfWeek WeekNumbers Define a data selecionada no componente. Define qual o primeiro dia da semana. Permite numerar as semanas.

28

7.24 OBJETO STATUSBAR (BARRA DE STATUS)


Um dos principais componentes de informaes sobre operaes gerais no sistema.

Figura 34 StatusBar

Propriedades
AutoHint SimplePanel SimpleText Panels Permite exibir o hint do componente automaticamente na barra de status. Se no houver painis, a barra deve ter a propriedade SimplePanel ligada. Define que a barra de status ser sem divises. Define o texto a ser exibido pela barra de status. Permite a criao e edio de painis na barra de status. A propriedade SimplePanel deve estar desligada. Pode-se tambm dar um duplo clique na barra de status.

7.25 OBJETO TOOLBAR (BARRA DE CONES)


Permite criar barras de cones de maneira rpida e simples.

Figura 35 ToolBar

Propriedades
Flat Images HotImages ShowCaptions Define um efeito visual com relevo atravs do mouse nos botes. Permite definir um objeto do tipo ImageList. Permite definir um objeto do tipo ImageList a ser usado no momento em que o mouse passa (ou clica) sobre o componente. Permite exibir a propriedade caption dos botes.

8 LINGUAGEM OBJECT PASCAL

Consideramos que uma aplicao em Delphi baseada em um conjunto de arquivos, (citados anteriormente .DPROJ .PAS e .DFM) bsicos. Vamos examinar alguns arquivos de fundamental importncia:

29

8.1 O MDULO .DPROJ

Todo programa em Object Pascal possui um arquivo .DPR, considerado como arquivo de projeto, o seu formato composto inicialmente da seguinte definio:
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 clusula uses, so listadas as units usadas pelo mdulo principal. As units so responsveis pela capacidade de dividir o programa em uma viso modularizada. Em cada um, declaramos uma srie de objetos (funes, variveis, procedimento, etc...) que podem ser usados por outras units e pelo mdulo principal. Em seguida vem um conjunto de comandos (denominado comando composto) atravs de dois delimitadores begin e end.

8.2 AS UNITS

Um programa em Object Pascal constitudo de um mdulo principal (.DPROJ) e de uma ou mais unidades de compilao (.PAS). O compilador gera um arquivo com o cdigo objeto correspondente, e considera o mesmo nome do arquivo .PAS com a extenso .DCU. As units so entidades independentes, ou seja, no momento da criao no h vnculo lgico (nem fsico) entre uma unit e um programa principal que a utiliza. Com esta caracterstica, podemos utilizar as units em qualquer projeto. A principal caracterstica do conceito de unit que possibilita estruturar o programa em mdulos funcionais, com cada unit provendo um conjunto de funes e procedimentos. Cada formulrio corresponde a uma unit. Mas, podemos criar units independentes, no associadas a um form.

30

Se considerarmos o cdigo uma unit com um componente Button e um manipulador de evento, teremos o seguinte cdigo:
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 dilogo); end; end.

Uma unit possui cinco partes:

Cabealho Contm a palavra reservada unit seguida de um identificador que o nome da unit. Este nome o mesmo nome do arquivo com extenso .PAS unit Unit1;

Interface Contm tudo o que a unit exporta: constantes, tipos, variveis, procedimentos, funes, etc... Na declarao dos procedimentos e funes que a unit exporta, deve constar apenas o cabealho (nome e parmetros). A declarao completa fica na parte da implementao.
Interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type Tform1 = class(Tform)

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

Implementao Contm a definio completa das funes e procedimentos que constam na interface. Se na implementao so usados identificadores definidos em outra unit, o nome desta outra unit deve ser includo na lista de units da clusula uses da implementao.
Implementation {$R *.DFM} procedure Tform1.Button1Click(Sender: Tobject); begin Form1.Caption := Curso de Delphi 2007; Showmessage(Exemplo de caixa de dilogo); end;

Inicializao uma parte opcional. Quando usada, no pode conter nenhuma declarao. Apenas comandos so permitidos nesta parte. Ela comea com a palavra initialization, e os comandos de inicializao so executados antes do programa comear.

Initialization <comandos>

Finalizao tambm uma parte opcional, com uma observao: ela s pode existir se na unit houver tambm uma parte de inicializao e s pode conter comandos, que sero executados dentro do processo de finalizao do programa, aps a execuo do programas principal.

Finalization <comandos> Toda unit termina com a palavra end seguida de um ponto final (.).

32

8.3 ATRIBUIO

Ao declarar uma varivel, o compilador cuida de alocar na memria uma rea que seja suficiente para armazenar qualquer dos valores definidos atravs do seu tipo. Os valores que podem ser atribudos varivel so definidos atravs de um comando de atribuio que pode ser considerado da seguinte forma:

Varivel := expresso;

8.4 DECLARAO DE VARIVEIS

As variveis podem ser classificadas em: Globais: Quando so feitas diretamente na seo interface de uma unit (ou seja, fora dos procedimentos e funes). Pode-se ter variveis pblicas e privadas. Locais: Quando feita a declarao dentro de um procedimento ou funo. Var N: Single; S: String; I: Integer; 8.5 TIPOS PARA MANIPULAO DE VARIVEIS

Tipos de variveis Inteiras

Tipo Integer Cardinal Shortint Smallint Longint Int64 Byte Word Longword

Faixa de Valores -2147483648.. 2147483647 0..4294967295 -128..127 -32768..32767 -2147483648.. 2147483647 -2^63..2^63-1 0..255 0..65535 0..4294967295

Formato 32 bits 32 bits, sem sinal 8 bits 16 32 64 8 bits, sem sinal 16 bits, sem sinal 32 bits, sem sinal

Tipos de nmeros Reais

Tipo Real Single Doubl Extended

Faixa de Valores 2.9*10E-39..1.7*10E38 1.5*10E-45..3.4*10E38 5.0*10E-324..1.7*10E308 3.4*10E-4932..1.1*10E4932

33 Comp Currency -2*10E63+1..2*10E63-1 -9.22*10E14..9.22*10E14

Tipos de variveis booleanas

Tipo Boolean ByteBool WordBool LongBool False ou True * * *

Faixa de Valores

Tipos de variveis de caracteres

Tipo Char ShortString String

Valores Permite armazenar um caractere ASCII. Permite armazenar uma cadeia de at 255 caracteres. Permite armazenar uma cadeia ilimitada de caracteres.

Tipo genrico (Variant)

Objetos variant so essencialmente variveis sem tipo podendo assumir diferentes tipos, automaticamente. Esta vantagem aparente tem a caracterstica de ser ineficiente se utilizada indiscriminadamente.

8.6 FUNES DE CONVERSO E MANIPULAO

Os objetos do Delphi para entrada e/ou exibio de dados utilizam propriedades do tipo String, as propriedades Text e Caption so bons exemplos. O problema ocorre quando tentamos realizar clculos matemticos com os dados que devem ser manipulados por estas propriedades. Desta maneira precisamos de funes para converter dados String em tipos Inteiros ou Reais ou Datas, por exemplo:
Funo StrToInt(const S: String) IntToStr(value: Integer) StrToFloat(const S: String) FloatToStr(Value: Extended) DateToStr(Date: TdateTime) DateTimeToStr(DateTime: TdateTime) StrToDate (const S: String) StrToDateTime(const S: String) FormatFloat(const Format: string; Value: Extended): string Objetivo Converte um dado String em tipo Inteiro. Converte um dado Inteiro em tipo String. Converte um dado String em tipo Ponto Flutuante. Converte um dado Ponto Flutuante em tipo String. Converte um dado TdateTime em String. Converte um dado TdateTime em String. Converte um dado String em tipo TdateTime. Converte um dado String em tipo TdateTime Permite formatar um tipo ponto flutuante retornando uma string. Edit2.Text := FormatFloat(###,###.00,soma); Sendo soma uma varivel real.

34

8.7 EXPRESSES LGICAS

So expresses que retornam valor booleano (falso ou verdadeiro).


Operador Not And Or xor Operao Negao E lgico OU lgico OU EXCLUSIVO lgico

O operador not unrio, por exemplo: if not (X > Z) then Devemos usar parnteses ao compararmos expresses lgicas, por exemplo: if (X > Z) or (W > Y) then EXERCCIO PROPOSTO 2

Objetivo: Trabalhar com objetos e elementos bsicos utilizando as tcnicas de manipulao de propriedades e eventos. Componentes utilizados: Label, Memo, Radio Group, CheckBox, ComboBox; Enfoque: Deselvolver um pequeno editor de texto, onde o usurio possa alterar a fonte, cor e estilo da fonte.

9 CAIXAS DE DIALOGO

No Delphi existem caixas de dilogos pr-definidas, nas quais podem ser utilizadas visando facilitar o desenvolvimento de aplicativos pela ferramenta. ShowMessage Exibe uma mensagem na tela ao usurio.

Exemplo: ShowMessage(Esta uma mensagem de Texto.);

Figura 36 Tela de Mensagem

MessageDlg Exibe uma mensagem na tela ao usurio, porm permite tratar a resposta que o usurio informa na caixa de dilogo. Sua sintaxe a seguinte: function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: MsgDlgButtons; HelpCtx: Longint): Word;

35

onde:
const Msg: string uma constante string ou propriedade deste tipo. mtWarning Contm um cone exclamao amarelo. mtError Contm um cone vermelho de parada. mtInformation Contm um cone i azul. mtConfirmation Contm uma interrogao verde. mtCustom No contm BitMap. mbYes mbNo mbOK mbCancel mbAbort mbRetry mbIgnore mbAll mbNoToAll mbYesToAll mbHelp Define um nmero para o help de contexto. Por padro, zero 0.

DlgType: TmsgDlgType

Buttons: TMsgDlgButtons HelpCtx: Longint

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

Figura 37 Tela de Confirmao

APPLICATION.MESSAGEBOX

Uma outra caixa de dilogo o mtodo MessageBox do objeto Application. Esta funo est definida da seguinte maneira:

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

const Text Caption: PChar

Flags

uma constante string ou propriedade deste tipo. Define uma string para o ttulo da janela. Define os botes, cones e a possibilidade de focar um determinado boto. Os valores para botes so: MB_ABORTRETRYIGNORE, MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO, MB_YESNOCANCEL

36 Os valores para os cones so: MB_ICONEXCLAMATION, MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONASTERISK, MB_ICONQUESTION, MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND Os valores para a definio do boto default pode ser: MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_DEFBUTTON4

O retorno da funo o tipo do boto como id (IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES) Desta maneira pode-se fazer testes lgicos como no exemplo:

If

Application.MessageBox('Texto','Ttulo',MB_YESNOCANCEL

MB_ICONINFORMATION + MB_DEFBUTTON2) = IdYes then

Figura 38 Application.MessageBox

10 CAIXAS DE ENTRADA

Podemos obter dados do usurio atravs de caixas de dilogo pr-defindas.

InputBox

A funo InputBox retorna um tipo String, que dado digitado pelo usurio na sua utilizao. Sua definio interna a seguinte:

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

Onde:
const ACaption APrompt Define o ttulo da janela Define um rtulo para orientao dentro da caixa.

37 ADefault Define um valor default para a caixa.

Exemplo: InputBox('Ttulo da janela','Descrio','Valor Padro')

Figura 39 Tela de Input

11 ESTRUTURAS CONDICIONAIS 11.1 IF THEN - ELSE

A estrutura condicional if pode ser composto de uma ou mais condies 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 necessrio delimitar o bloco de comando utilizando as clusulas 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, no h ponto e vrgula (;)antes da palavra reservada else. possvel ainda que se tenha um conjunto de IF-then-else aninhados, por exemplo:

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 nmero de testes. Por exemplo:
case Key of A..z: Label1.Caption := Letras; 0..9: Label1.Caption := Nmeros; +, -, *, /: Label1.Caption := Operador else Label1.Caption := Caracter especial; end; //fim do case

12 ESTRUTURAS DE REPETIO

12.1 Repeat ... Until

A estrutura de repetio Repeat ... until, garante que pelo menos uma vez a estrutura ser executada. Para que as instrues de comando que estiverem dentro da estrutura de repetio sejam executadas vrias vezes necessrio que a condies existente na clusula 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; ...

39

12.2 WHILE - DO

A estrutura de repetio WHILE se difere da estrutura Repeat, pelo fato de realizar uma validao dos dados antes de executar qualquer instruo dentro da sua estrutura. Para que as instrues sejam executadas diversas vezes, necessrio que a condio 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 interaes que sero 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 execuo de um estrutura de repetio ou seqncia 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

40

12.5 ADICIONADO FORMULARIOS AO PROJETO

As aplicaes desenvolvidas por ferramentas visuais dificilmente utilizam somente um formulrio. Nos exerccios anteriores vimos que como se tratavam de aplicaes simples, no houve a necessidade de se adicionar novos formulrios aplicao. Vamos criar uma pequena aplicao que seja capaz de manipular mais de um formulrio. Primeiramente abra um novo projeto do Delphi 2007, clicando no menu File | New | VCL Forms Applications Delphi for Win32. Salve a aplicao em uma pasta Exercicio3, salvando a unit1 com o nome de ufrmExercicio3 e o projeto com o nome exercicio3.

Figura 40 Salvando o Formulrio 3

Incluia no form1 o compoente MainMenu e altere as propriedades dos objetos da seguinte forma:
Object Form : TForm Caption : Exerccio Proposto 3 Name : frmExercicio3; Position : poDesktopCenter; Object : MainMenu: TMainMenu Name: mmFormularios;

41

Figura 41 Elaborando Menu de Opes

Agora que os objetos j esto configurados, vamos incluir as linhas de cdigos necessrias para que o nosso formulrio frmexercicio3 possa chamar os outros formulrios da aplicao. Primeiramente antes de realizarmos qualquer codificao necessrio que adicionemos mais dois novos formulrios na nossa aplicao, 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 formurio apartir do formulrio atual temos duas formas: Show e ShowModal Show Chama o formulrio solicitado e permite que se alterne entre os formulrios durante a execuo da aplicao. Showmodal Tem a mesma finalidade do Show, porm no permite a alternncia entre os formulrios em tempo de execuo.

Clique duas vezes sobre o componente MainMenu e clique duas vezes sobre o item Formulario 1 e digite o seguinte cdigo:
procedure TForm1.Formulario11Click(Sender: TObject); begin frmFormulario2.Show; end;

Em seguida, faa o mesmo procedimento para o item Formulrio 2, mas com o seguinte cdigo:
procedure TForm1.Formulario21Click(Sender: TObject); begin frmFormulario3.ShowModal; end;

Aps isto, salve sua aplicao e execute-a clicando no boto RUN ou pressionando a tecla F9.

42

Aparecer a seguinte tela:

Figura 42 Confirmao de Referncia entre formulrios

O Delphi est questionando se no formulrio Form1 deve haver uma referncia ao formulrio frmFormulario2. Ao confirmar o Delphi adiciona uma referncia no Code Editor da unidade UFrmExercicio3 na seguinte estrutura:

implementation uses ufrmFormulario2; Perceba que ao chamar o formulrio 1 do menu, voc ainda conseguir acessar o formulrio principal, porm isto no permitido ao chamar o formulrio 2 do menu.

EXERCCIOS PROPOSTOS 4

Calcule o Volume de uma Espera; rea de um triangulo; Permetro do Triangulo;

EXERCCIOS PROPOSTOS 5

Objetivo: Trabalhar com objetos e elementos bsicos utilizando as tcnicas de manipulao de propriedades, eventos e formulrios. Enfoque: Deselvolver uma aplicao que contenha todos os projetos abaixo, sendo cada um solicitado atravs de um Menu de opes.

1. PROJETO TRIANGULO: Dado 3 valores numricos pelo usurio verificar se os mesmo formam um tringulo e em caso positivo emitir uma mensagem informando qual o tipo correspondente. Em caso negativo informar ao usurio atravs de uma mensagem.

43

2. PROJETO FIBONACCI: Sendo informado o n de termos desejados para gerar a seqncia de Fibonacci, faa um programa que exiba toda a seqncia em um componente Memo. 3. PROJETO FATORIAL: Faa um programa que calcule o fatorial de um numero informado pelo usurio. O resultado do clculo dever ser exibido em um componente Edit. 4. PROJETO POTENCIA: Sendo informado a Base e o Expoente pelo usurio, calcule a potncia para esta operao. A base, o expoente e o resultado devem ser informados atravs de um coponente Edit.

Cada item acima desenvolvido em formulrios separados.

13 PROCEDIMENTOS E FUNES

Toda parte programvel 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 declarao no Code Editor, por exemplo:
type TForm1 = class(TForm) MainMenu1: TMainMenu; Formulario11: TMenuItem; procedure Formulario11Click(Sender: TObject);

possvel tambm criar procedimentos e funes prprias no definidas pelo Delphi, para isso deve-se declarar o procedimento ou funo na seo INTERFACE do code editor e implement-la na seo IMPLEMENTATION. Vale a pena lembrar que a deciso por utilizar procedimento ou funo deciso do desenvolvedor, visto que todo procedimento no tem como obrigao retornar valores ao programa, j a funo deve por obrigao retornar um valor ao programa, sendo que no Object Pascal este retorno de valor se d pela varivel result, varivel esta que no deve ser declarada pelo desenvolvedor, pois ela declarada automaticamente sempre que a funo solicitada pelo programa. Uma forma automtica de se implementar a declarao uma procedure ou function na seo implementation e posicionar o curso de digitao sobre a declarao da procedure ou function na seo Interface e pressionar as teclas CTRL + Shift + C.

Exemplo de procedure:

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 EXCEES

Quando desenvolvemos nossos programas s os disponibilizamos aos usurios aps uma srie de testes realizados, porm impossvel prever todo e qualquer tipo de problema que possa ocorrer em tempo de execuo, a esses erros damos o nome de excees. As excees devem ser tratadas para que o aplicativo no trave com o usurio; no deixe o SO instvel; etc. Quando uma exceo ocorre, o fluxo de controle automaticamente transferido para blocos de cdigos de exceo, denominados handlers, definidos atravs de comandos do object Pascal. 14.1 TRY EXCEPT

Uma das formas de tratarmos excees no Delphi utilizando o comando TRYEXCEPT. Sua sintaxe a sguinte:
Try <Comando a serem executado> Except <Bloco de execuo> End;

45

Toda vez que o aplicativo for executado sem ocorrer nenhuma exceo o bloco de cdigos de exceo ignorado e o aplicativo prossegue normalmente, porm caso ocorra a exceo o aplicativo direcionado ao bloco de excees e executa as instrues l contidas. O bloco de exceo pode ser definido atravs de uma construo genrica, 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 genrica dentro de um bloco try-except.

14.2 A CONSTRUO ON-DO


try Abre(Arq); while not Fim(Arq) do processa(Arq); except on EInOutError do //erro de entrada e sada begin Showmessage(Problemas...); Fecha(Arq); end; on EdivByZero do //erro de diviso de n inteiro por zero Showmessage(Erro ao dividir por zero); on EconvertError do //erro de converso de tipos Showmessage(Erro de converso de tipos de dados); end; //bloco try

Podemos ainda definir utilizando a clusula on-do com um handler genrico usando else, da seguinte forma:
try Processa; except on Exceo1 do Trata1; on Exceo2 do Trata2; else TrataOutras; end;

Os principais tipos de exceo da RTL (RunTime Library) do DELPHI, a serem tratadas nos blocos on ... do so:

46

Nome EaccessViolation EconvertError EdivByZero EinOutError EintOverFlow EinvalidCast

Descrio Ocorre quando se tenta acessar uma regio de memria invlida (ex: tentar atribuir valor a um ponteiro cujo contedo nil). ocorre quando se tenta converter um string em um valor numrico (ex: utilizar a funo StrToInt em uma letra). ocorre na diviso de um nmero inteiro por zero. ocorre numa operao incorreta de I/O (ex: abrir um arquivo que no existe). ocorre quando o resultado de um clculo excedeu a capacidade do registrador alocado para ele (para variveis inteiras). ocorre quando se tenta realizar uma operao invlida com o operador as (ex: tentar usar um Sender com uma classe que no corresponde a seu tipo). ocorre quando se detecta uma operao incorreta de ponto flutuante. ocorre quando se executa uma operao invalida com um ponteiro (ex: tentar liberar um ponteiro duas vezes). ocorre quando se tenta alocar memria mas j no existe mais espao suficiente. ocorre quando o resultado de um clculo excedeu a capacidade do registrador alocado para ele (para variveis de ponto flutuante). ocorre quando uma expresso excede os limites para a qual foi definida (ex: tentar atribuir 11 ao ndice de um vetor que pode ir no mximo at 10). ocorre quando o sistema no tem mais como alocar espao de memria na Stack. ocorre quando o resultado de um clculo pequeno demais para ser representado como ponto flutuante. ocorre quando se tenta dividir um valor de ponto flutuante por zero.

EinvalidOp EinvalidPointer EoutOfMemory EoverFlow

ErangeError

EstackOverflow Eunderflow EzeroDivide

14.3 O COMANDO TRY-FINALLY

H outro comando cuja sintaxe comea com try. Este controle de finalizao nos permite lidar de forma estruturada com as situaes 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 exceo> end;

O comando funciona da seguinte forma: os comandos especificados aps o Try so executados seqencialmente. Se no ocorrer nenhuma exceo, os comandos especificados aps finally so executados, e o programa prossegue com a execuo

47

normal, com o comando seguinte ao try-finally. Porm, se houver alguma exceo qualquer uma durante a execuo da lista de comandos do try, o trecho aps o finally executado e, no final, a exceo reativada. Em resumo: Os comandos do bloco finally sempre so executados, haja ou no alguma exceo durante a execuo dos comandos especificados aps o try. 14.4 CLASSES BSICAS

Exceo

EMathError

EIntError

EInOutError

EAccessViolation

EInvalidOp

EDivByZero

Excees de Entrada/Sada

EPrivilege

EZeroDivide

ERangeError

EInvalidCast

EStackOverflow

EOverFlow

EIntOv erFlow

Excees Typecast EControlC Excees de Processador


EConvertError

EUnderFlow Excees de Ponto Flutuante

Excees de Matemtica de Inteiros

EOutOfMemory

EVariantError
EInvalidPointer

Excees de Conv erso

EAssertionFailed

Excees de Variantes

Excees de Pilha

Excees de Assero

Figura 43 Classes Bsicas de Excees

14.5 BLOCOS TRY ANINHADOS

Blocos try aninhados permitem maior versatilidade na construo de blocos protegidos, lembrando que se a exceo ocorrer, os comandos inseridos em except sero executados. J os comandos inseridos em finally sero executados havendo ou no a ocorrncia de erros.

48

Embora no prximo exemplo, no exista margem para excees dentro do lao for..do (a menos que seja digitado errado) podemos ter uma idia de como criar blocos aninhados para garantir a execuo 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 mtodo ProcessMessages necessrio para forar 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 comunicao com banco de dados. Um banco de dados pode ser interpretado de vrias formas. Pode ser um arquivo nico, pode ser um diretrio com vrios arquivos, etc.

15.1 MODELAGEM DE DADOS

Existem 3 modelos bsico para a modelagem de dados que devemos abordar rapidamente antes de iniciarmos esta seo, so eles: Modelo Conceitual; Modelo Lgico; Modelo Fsico;

Modelo Conceitual : Procura abstrair a realidade independente da plataforma de hardware e software. Modelo Lgico : Define as regras bsicas na forma de como os dados devem ser armazenados no banco de dados.

49

Modelo Fsico : Implementa a definio do modelo lgico. 15.2 MODELO CONCEITUAL E LGICO

A princpio vamos entender como podemos definir os dados que sero armazenados em um computador, atravs do conceito de entidade. Ao pensarmos em cadastrar dados de clientes, alunos, fornecedores, etc... temos exemplos de entidades. A entidade possui propriedades que sero identificados como os dados propriamente ditos, estas propriedades so chamadas de atributos.

15.3 MODELO FISICO

No modelo fsico de dados, as entidades sero chamadas de tabelas e os atributos sero chamados de campos. A linha de dados que deriva do conjunto de campos chama-se registro. Nas entidades necessrio que haja um campo que seja capaz de identificar um nico registro dentre todos existente, a este campo chamamos de chave primria.

15.4 RELACIONAMENTOS

Para os bancos de dados relacionais, definimos relacionamentos como sendo uma associao entre um ou mais entidades. O relacionamento pode ser representado atravs de cardinalidades, que so 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 primria da entidade 1, deve ser adicionada na entidade N como chave estrangeira. J o relacionamento N:N tem como regra a criao de uma 3 tabela, onde as chaves primrias das entidades envolvidas no relacionamento, sero 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 (formulrio) manipulado pelo usurio venha interagir com a base de dados. O caminho deve ser percorrido por uma srie de componentes configurados entre si,

50

porm, h uma camada intermediria que no 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 aplicaes que fazem uso de seus recursos de acesso ao banco. nesta camada que so definidas caractersticas especficas de cada banco de dados, bem como sua localizao, ou seja, o front-end no acessa diretamente a base de dados, o BDE responsvel para estabelecer este funcionamento.

Aplicao Delphi (Front-End) Borland DataBase Engine (BDE)

Bancos de Dados Locais

SQL Links

Drivers ODBC

Figura 44 Esquema de Aplicao BDE

16.2 COMPONENTES DE CONTROLE E ACESSO

O sistema para conexo com o banco de dados utiliza alm do BDE um conjunto de componentes denominados: Session, DataBase, DataSet, DataSource e DataAware. O componente Session no ser o foco de nosso estudo. Uma viso geral sobre estes componentes pode ser vista da seguinte maneira:

Session

DataBase

DataSet

DataSource

Data-Aware

Figura 45 Viso Geral dos Componente

Session: Aplicaes simples trabalham com apenas um banco de dados. Porm o Delphi permite mais de uma conexo simultnea bancos de dados

51

distintos, e tambm mais de uma conexo com o mesmo banco de dados. O controle global das conexes feito atravs do componente da classe TSession, criado automaticamente pelo Delphi na execuo do programa. Esse componente representa a sesso default da aplicao.

DataBase: O componente DataBase responsvel pela conexo da aplicao a um banco de dados com a finalidade maior de implementar segurana (transaes) e definir caractersticas de comunicao entre uma aplicao Delphi-Client/Server. Embora em aplicaes locais, sua utilizao explicita recomendada.

DataSet: Existem trs componentes que descendem de uma classe chamada TDataSet e implementam importantes mtodos de manipulao de banco de dados alm de suas caractersticas especficas. De fato, no utilizamos a classe TDataSet diretamente, mas atravs dos componentes TTable, TQuery(SQL) e TStoreProc. Estes componentes esto na paleta BDE

DataSource: O componente DataSource responsvel por conectar os componentes Data-Aware uma determinada tabela representada pelo DataSet. Este componente est na paleta DataAccess.

Data-Aware:

Os

componentes

Data-Aware

so

responsveis

pela

visualizao e manipulao direta dos dados. Todo componente Data-Aware tem uma propriedade para conectar-se ao DataSource correspondente tabela destino. Estes componentes esto na paleta DataControls.

Exemplo

Vamos exemplificar a utilizao de componentes bsicos de acesso e controle atravs de um exemplo baseado em uma tabela (arquivo de dados) j pronta, criada na instalao do Delphi. O objetivo entendermos o funcionamento destes componentes.

Crie uma nova aplicao e salve-a na pasta especificada pelo instrutor. A unit : UFrmPeixes

52

Projeto: Peixes

Insira dois componentes: Um DataSource e um Table. Configure suas propriedades de acordo com a orientao 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 sugesto do visual pode ser a seguinte:

Podemos perceber que a aplicao funciona manipulando a tabela

53

biolife.DB sem a necessidade de nenhuma linha de cdigo explcita. claro que este apenas um exemplo para entendermos o mecanismo de componentes de acesso e controle. Desse modo, veremos a seguir que linhas de cdigo sero necessrias para implementar funcionalidades especficas (pesquisas), ou mesmo bsicas como incluso, edio e remoo. Por ltimo, vamos personalizar o componente DBGrid para no 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 disponveis sero exibidos, selecione o campo desejado (Grafic) e clique em Delete Selected
Figura 46 Dados de Biolife

Figura 47 Editando Colunas

Figura 48 Eliminando um Campo

Salve novamente e execute a aplicao.

16.3 OBJETOS TFIELD

Vamos criar uma outra aplicao e exemplificar um recurso muito importante na construo de aplicaes baseadas em banco de dados, os campos persistentes.

Crie uma nova aplicao e salve-a na pasta especificada pelo instrutor. Os nomes podem ser: O Formulrio: UFrmPaises Projeto: Paises

Insira dois componentes: Um DataSource e um Table. Configure suas propriedades de acordo com a orientao abaixo:

54

Agora, ao invs de colocarmos componentes data-aware (paleta DataControls) diretamente no form, vamos definir os campos persistentes atravs de um duplo clique componente Table surgir o editor de campos

(Fields Editor). Clique com boto 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 formulrio, e perceber que o Delphi se encarrega de construir o componente data-aware necessrio a cada campo.

Isso realmente poupa muito tempo no desenvolvimento de aplicaes em banco de dados. Porm 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 sugesto para a disposio dos componentes pode ser:

55

Figura 49 Cadastro de Paises

Salve novamente e execute a aplicao.

16.4 BDE CRIAO 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 bsicas: A listagem de Aliases do lado esquerdo e as configuraes de cada Alias no lado direito. Um conceito importantssimo a definio de Alias. Cada nome do lado esquerdo do BDE representa uma configurao para acesso a um determinado banco. Exemplo: O Alias BDDEMOS representa o diretrio C:\Arquivos de

programas\Arquivos comuns\Borland Shared\Data, o driver para acesso ao de banco (Paradox) entre outras configuraes. Dessa maneira o desenvolvedor utiliza o nome DBDEMOS dentro do Delphi, porm o diretrio pode ser alterado no BDE sem maiores problemas. O Alias uma string que define o path e configuraes para acesso ao banco de dados.

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 atravs do boto reticncias. Clique no menu Object e escolha Apply, para confirmar as alteraes. Confirme a gravao.

Note que j janela de ferramentas ( tool palette), h uma rea especfica para componentes que acessam o banco de dados atravs do BDE.

16.5 COMPONENTE ADO - ACTIVEX DATA OBJECTS

Uma outra forma de fazer com que sua aplicao possa acessar um banco de dados atravs de componentes ADO, que permite o acesso direto ao banco de dados sem a utilizao 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.

57

Figura 51 Paleta dbGo

Como o objetivo do exemplo mostrar a funcionalidade dos componentes ADO, ser utilizado apenas um formulrio, um dbgrid e um DataSet, componentes estes j conhecidos de captulos anteriores. Utilizaremos os seguintes componentes da paleta dbGo: TAdoConnection; TAdoTable. TAdoConnection: Permite a conexo da aplicao 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 boto ... da propriedade connectionstring na Object Inspector e aparecer aseguinte tela:

58

Figura 53 Criando Conexo Ado

A propriedade connectionstring utilizada para informar ao Delphi todas as diretivas que sero utilizadas pelo banco de dados. Para definirmos a string de conexo, clique no boto 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 aplicao. 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 conexo da aplicao com dados do banco SQL Server. Em seguida clique no boto next >>

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 informaes sobre o tipo de logon que ser realizado no BD, caso o BD tenha uma senha de acesso definida necessrio informar o nome do usurio e o senha de acesso, caso contrrio possvel realizar o acesso ao banco apenas utilizando a integridade de segurana do Servidor.

Figura 56 Selecionando Usurio

O item 3, ser selecionado especificamente qual o bando de dados que voc ir acessar.

60

possvel ainda verificar se as configuraes realizadas foram bem sucedidas atravs do boto Test Connection e em seguida clique OK.

Figura 57 Exibio dos Dados da Tabela

Note que em nenhum momento foi feito a utilizao do BDE. possvel ainda utilizar os componentes ADO juntamente com drivers ODBC, que permite voc acessar outros tipos de bancos de dados.

17 APLICAO 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 bsicos de desenvolvimento desde a construo das tabelas at a gerao de relatrios. 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)

Dependente Dependente_ID: INTEGER Matricula: CHAR(18) (FK) Nome: VARCHAR(100) Sexo: CHAR(1) GrauParentesco: VARCHAR(20)

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)

Figura 58 Esquema de Banco de Dados 1

61

Aps a estrutura de bando de dados criada, o passo seguinte abrir o Delphi 2007 e solicitar uma Nova aplicao 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 formulrio principal, adicione o componente MainMenu com os seguintes itens:

Figura 59 Menu de Opes

17.1 DATA MODULE

A definio dos componentes de acesso aos dados ser centralizada em um formulrio especial chamado Data Module. Este formulrio tem uma caracterstica bem especfica: um form invisvel e s recebe componentes invisveis, ou seja, o usurio nem vai imaginar que o DataModule e os componentes que ele recebe esto na aplicao. A sua finalidade centralizar os componentes para que qualquer formulrio possa ter acesso aos dados, sem a necessidade de repetir os componentes de acesso em cada formulrio. Para criar formulrio DataModule, clique em File|New|Other|Delphi Files.

Figura 60 Adicionando Novo Item

62

Salve o novo formulrio com o nome de UFrmDmEmpresa e insira trs 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 FORMULRIO DE CADASTRO DE SETOR

Adicione um novo formulrio a aplicao e insira 2 componentes Panel, onde um ter alinhamento na parte inferior (alBottom) e outro na rea cliente (alClient). Salve o formulrio com o nome FrmCadSetor e a propriedade name do form ser FrmCadSetor.

Uma caracterstica importante na construo de aplicaes utilizando banco de dados a possibilidade de trabalharmos com campos TFIELD exemplificados anteriormente, ou seja, campos que so considerados como objetos dentro da aplicao, sendo assim estes campos possuem propriedades e eventos individuais atravs da object inspector ou por atribuies manipulando cdigo. Vamos explorar um pouco mais da funcionalidade deste recurso. Campos TFIELD so chamados de campos persistentes e sua criao extremamente simples.

63

No DataModule, localize o objeto Table referente tabela desejada. Um duplo clique no objeto Table, exibir a janela de manipulao dos campos

Um clique dentro da janela com o boto direito exibir o speed menu. Escolha a opo Add All Fields.

Figura 62 Field Editor

Aps a criao dos campos persistentes, pode-se selecion-lo e verificar propriedades especficas na Object Inspector. As propriedades sero diferentes dependendo do tipo de dados do campo, neste exemplo um tipo TStringField.

Figura 63 Exibindo Propriedades do campo TField

64

Mas o melhor est para vir. Posicione a janela dos campos persistentes em um lado da tela e com o formulrio FrmCadSetor (criado anteriormente) visvel, selecione os campos e arraste-os para dentro do Form. Uma pergunta do tipo:

Figura 64 Confirmao de Referncia entre Formulrios

Ser exibida. Confirme com Yes, ou seja, o Delphi est questionando se no formulrio FrmCadSetor deve haver uma referncia ao formulrio DmEmpresa (DataModule). Ao confirmar o Delphi adiciona uma referncia no Code Editor da unidade UFrmCadSetor na seguinte estrutura:

implementation uses UDMEmpresa;

Pode-se fechar o editor de campos persistentes. Uma diferena visual que tem destaque agora so os controles de manipulao de dados que foram inseridos automaticamente pelo Delphi.

Figura 65 Tela de cadastro Verso 1

Embora se paream com um componente j visto anteriormente (Edit) estes componentes so provenientes da paleta Data Controls e tem o nome de DBEdit, ou seja, um controle especfico para manipulao de dados provenientes de um banco

65

de dados. J nos referimos a estes controles nos primeiros exemplos do captulo anterior.

DBEdit
DataSource DataField Permite conectar o controle fonte de dados. 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 sugesto visual pode ser vista a seguir:

Figura 66 Tela de Cadastro Finalizada

17.3 MTODOS E PROPRIEDADES PARA MANIPULAO DE DADOS

Para percorrer os registros de uma tabela podemos utilizar os seguintes mtodos:

First Prior Next Last MoveBy(N)

Move o cursor para o primeiro registro do dataset. Move o cursor para o registro anterior (se houver). Move o cursor para o prximo registro (se houver). Move o cursor para o ltimo registro do dataset. Move o cursor para frente ou para trs, conforme o valor do parmetro N, que um valor inteiro, positivo ou negativo.

Para controlar o incio e fim da tabela podemos utilizar as propriedades:

BOF : Boolean EOF : Boolean

Begin Of File. Indica True se o cursor estiver no primeiro registro da tabela. End Of File. Indica True se o cursor estiver no ltimo registro da tabela.

66

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

Um incoveniente com relao ao cdigo acima que os controles data-aware (data controls) sero atualizados no monitor medida que o mtodo Next percorre a tabela, gerando uma visualizao indesejada e perda de tempo com a sua atualizao.

Neste caso, pode-se utilizar os mtodos 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 formulrio de Cadastro de Setores, os cdigos para percorrer o dataset foram implementados de maneira automtica atravs do componente DBNavigator. Porm nada impede a criao de botes independentes e a definio de handlers de controle para navegao retirando o DBNavigator.

Para alterar (editar) os valores de um dataset podemos utilizar o seguinte mtodo:

Edit

Permite editar o data set para alterao dos valores atuais para novos valores.

Exemplo:
Table1.Edit;

Para inserir um novo registro em um dataset podemos utilizar dois mtodos:

67

Append Insert

Cria um novo registro aps o ltimo registro do dataset. Cria um novo registro aps o registro corrente.

Exemplo:
Table1.Append; Ou Table1.Insert;

Para remover um registro em um dataset podemos utilizar o mtodo:

Delete

Remove o registro corrente.

Exemplo:
if MessageDLG(Est certo disto?!,mtConfirmation,[mbYes,mbNo],0) = mrYes then Table1.Delete;

Para confirmar (gravar) as alteraes no dataset podemos utilizar o mtodo:

Post

Confirma as alteraes em um dataset.

Exemplo:
Table1.Append; ... Table1.Post; Table1.Edit; ... Table1.Post;

Para acessar o valor em um campo atravs de TField podemos utilizar a propriedade Fields ou o mtodo FieldByName.

Fields FieldByName

Faz referncia a um campo especfico atravs de um array. Faz referncia a um campo atravs de seu nome.

Para cancelar algum comando enviado ao banco de dados, utiliza-se o mtodo cancel.
Cancel Confirma as alteraes em um dataset.

Exemplo:
Table1.Append; ... Table1.Edit; ...

68 Table1.Cancel; Table1.Cancel;

17.4 OS ESTADOS DE UM DATASET Os datasets trabalham com estados. Em cada estado uma determinada operao pode ser vlida, outras no. A manipulao do dataset atravs de mtodos e funes agem nestes estados em todo o tempo provocando mudanas.

Uma viso geral sobre os estados de um dataset pode ser vista a seguir:

Inativo
Insert Append Close Open

Insert
Post Cancel

Browse
Edit Cancel Post

Edit
Figura 67 Estado de um DataSet

Vamos utilizar no formulrio FrmCadSetor a prtica deste conceito. Antes, troque o DBEdit1 referente ao cdigo para um componente DBText configure as propriedades DataSource para a tabela Setor e DataField para o campo Setor_ID.

O BitBtn referente sada do form pode ter sua propriedade Cancel verdadeira.

O BitBtn referente confirmao das operaes pode ter sua propriedade Default verdadeira e a propriedade Enabled como falso.

O BitBtn referente ao cancelamento das operaes pode ter sua propriedade Enabled como falso.

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 declarao (sem TFrmCadSetor) na clusula 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;

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('No h registro a ser excludo.',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 FORMULRIO DE CADASTRO DE FUNCIONRIO

FrmCadFuncionario

Vamos iniciar a construo do formulrio de Cadastro de Funcionrio. No menu File escolha o comando New | Form Delphi for Win32. Grave este novo formulrio com o nome de: UFrmCadFuncionario A propriedade Name do form dever ser FrmCadFuncionario

71

Chame o DataModule. Crie os campos persistentes (TFields) para a tabela Funcionrio. Arraste-os para dentro do formulrio. Confirme o dilogo (YES) sobre usar o DataModule e posicione os objetos em uma seqncia sua escolha. Uma sugesto pode ser vista a seguir:

Figura 69 Tela de Cadastro de Funcionario

Associe o componente o componente DBText1 tabela atravs da propriedade DataSource apontando para a tabela Funcionario e DataField apontando para o campo Matricula. Associe o componente DBNavigator tabela Funcionrio atravs da propriedade DataSource. Implemente os handlers de cada boto conforme o raciocnio do formulrio anterior. Vamos definir outros componentes e caractersticas que no formulrio anterior no existiam. Por exemplo, o campo Sexo foi definido na tabela como uma String de um caracter. Podemos evitar que o usurio entre com uma string diferente de M ou F por exemplo, este raciocnio pode ser feito via cdigo ou via componente. Vamos optar pela segunda opo por uma srie de vantagens. Insira um componente DBRadioGroup no formulrio e no se preocupe com o alinhamento (por enquanto). Modifique as propriedades do componente:
object DBRadioGroup1: TDBRadioGroup Caption = 'Sexo' Columns = 2 DataSource = DmEmpresa.DsFuncionario

72 DataField = 'Sexo' Items.Strings = Masc Fem Values.Strings = F M end Define em quantas colunas os dados da propriedade items sero ordenados. Columns Items Define os itens a serem exibidos no componente. Values Define os valores a serem armazenados na tabela.

Pode-se excluir o DBEdit responsvel 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 formulrio 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 responsvel pelo Estado e alinhe o DBComboBox em seu lugar.

17.6 INTEGRAO DE DADOS ENTRE AS TABELAS

Vamos acrescentar alguma funcionalidade para que o usurio no precise saber o cdigo do setor, ele poder selecionar uma caixa de listagem atravs do nome do setor, por exemplo:

Acrescente um DBLookupComboBox ao Form e faa as modificaes necessrias, a sugesto visual a seguinte:

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 ListField KeyField DataSource DataField Permite conectar o controle fonte origem dos dados. Permite especificar um campo da tabela referenciada em ListSource. Permite especificar o campo chave da tabela origem dos dados. Permite conectar o controle fonte destino dos dados. Permite especificar o campo chave estrangeira da tabela destino.

Uma sugesto de implementao para o cdigo fonte do formulrio para Cadastro de Funcionrio o seguinte:
unit ufrmCadFuncionario; {A interface no 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;

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 FORMULRIO DE CADASTRO DE DEPENDENTES

Vamos criar outro formulrio com a finalidade de cadastrar os dependentes do funcionrio. Utilizaremos o mesmo raciocnio visto at aqui embora este processo possa ser bem diferente do que vamos fazer. O objetivo maior fixarmos os conceitos vistos anteriormente.

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 configurao 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 configurao do DBRadioGroup para o campo Parentesco pode ser a seguinte:

76

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

Insira um DBText e altere suas propriedades DataSource e DataField.

Uma sugesto visual pode ser vista a seguir:

Figura 72 Cadastrando Dependente

O cdigo para implementar as funes 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;

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 MTODOS DE PESQUISA

A funo locate vai localizar na tabela funcionrio no campo Setor_ID o valor do campo Setor_ID da tabela setor passado como parmetro. Caso encontre, a funo retorna um valor booleano verdadeiro. A alterao no cdigo do boto 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',

78 DmEmpresa.TbSetor.FieldByName('Setor_ID').AsInteger,[]) then ShowMessage('Este setor possui funcionrios,'+#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 funo locate declarada internamente da seguinte forma:

function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual; Onde:
KeyFields KeyValues Options Permite definir o(s) campo(s) a serem pesquisados. Permite definir o(s) valore(s) a serem pesquisados. Permite definir se os valores a serem pesquisados sero parciais e/ou diferenciados de maiscula e minscula. [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 FORMULRIO DE CONSULTA DE FUNCIONRIOS

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 necessrios, altere suas propriedades. Configure o DBGrid para acessar a tabela Funcionario e exibir apenas a matricula e o nome do funcionrio, mudanas visuais podem ser feita na propriedade Title.

79

Figura 73 Consulta de Funcionrios

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 BitBtns sero o prefixo Bbt + o caption (sem espao e sem acento).

Vimos no item anterior que podemos realizar pesquisas nas Tabelas (Table) utilizando o mtodo locate, porm este mtodo pode levar muito tempo para realizar a pesquisa caso o banco de dados seja muito grande. Sabemos que pesquisas em bancos de dados so melhores executadas quando realizadas com SQL (Structure Query Language) que uma linguagem prpria para este tipo de pesquisa. Para utilizarmos este recurso no Delphi, adicione no formulrio 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 atravs de instrues 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;

80 DataSet : QryConsFuncionario

A implementao do cdigo do formulrio 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 EXCEO LOCAL

Podemos definir alguns campos que devem, obrigatoriamente, serem preenchidos pelo usurio, por exemplo: No formulrio de Cadastro de Dependentes os campos Matricula e Nome so muito importantes e poderiam na sua ausncia tornar o banco inconsistente. Vamos utilizar um exemplo com a tabela Dependente.

Para definir campos requeridos e evitar inconsistncia 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.

81

Neste momento, se o usurio tentar gravar o registro sem digitar a matrcula do funcionrio ou o nome do dependente ser levantada uma exceo da classe EDatabaseError que dever ser tratada pelos conceitos vistos no curso. O evento OnClick do boto confirmar no cadastro de dependentes (atualizado) implementado como o exemplo abaixo:
procedure TFrmCadDependente.BbtConfirmarClick(Sender: TObject); begin try DmEmpresa.TbDependente.Post; TrataBotoes; except on E: EDataBaseError do Showmessage('Campo obrigatrio sem preencher! ' + #13+#13 + E.Message); end; end;

pode ser

O objeto E da classe Exception recebe o valor do objeto de exceo. Este objeto no precisa ser declarado e permite comparar qual o erro atual, para tomada de decises.

18.3 EXCLUSO COM CONSISTNCIA

Antes de excluir em cascata, vamos exemplificar uma situao em que: havendo a chave primria como chave estrangeira na outra tabela, no se pode excluir o registro. Neste projeto, o exemplo o seguinte: Se houver uma ocorrncia do cdigo do setor (chave primria) da tabela setor na tabela funcionrio (chave estrangeira) no vamos deletar o setor.

18.4 EXCLUSO EM CASCATA

Pense nesta situao: Ao excluir um funcionrio, o cdigo correspondente na tabela dependente no ser mais vlido, ou seja, o dependente ter um cdigo (Matricula) que no existe mais. Nosso objetivo ento ser deletar o(s) dependente(s) do funcionrio deletado.
procedure TDmEmpresa.TbFuncionarioBeforeDelete(DataSet: TDataSet); begin if TbDependente.Locate('Matricula', TbFuncionario.FieldByName('Matricula').AsInteger,[]) then begin

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 cdigo 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 aps a deleao do funcionario TbDependente.EnableControls; end;

As propriedades Filter e Filtered funcionam da seguinte forma: Deve-se atribuir um valor (critrio) propriedade filter. TbDependente.Filter := Sexo=F; Depois ligar o filtro para que o critrio tenha efeito. TbDependente.Filtered := True;

A partir deste momento a tabela (TbDependente) s vai manipular os registros que atentem ao critrio, ou seja, todas as pessoas do sexo feminino. Caso o filtro no seja desligado, a tabela no vai considerar os demais registros. Os mtodos EnableControls e DisableControls servem para habilitar e desabilitar os controles data aware. Para evitar isso, desabilitamos os controles no momento da deleo dos dependentes e habilitamos no momento aps a deleo do funcionrio.

18.5 UM POUCO MAIS SOBRE CONSULTAS

Vamos criar uma consulta para saber quais funcionrios trabalham em determinado setor. FrmConSetFun Crie um novo formulrio e grave-o com o nome de UFrmConSetFun Insira os componentes necessrios:

83

Figura 74 Consulta de Funcionrio 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 formulrio FrmConSetFun adicione 1 DbLookupComboBox e 1 DbGrid e faa a seguinte configurao:


Object : DbLookUpComboBox : TDbLookUpComboBox ListSource: DMEmpresa->dsSetor; ListField: Descrio; KeyField: Setor_ID

Neste caso o componente DBLookUpComboBox ser utilizado apenas para mostrar quais os setores existentes na tabela Setor sem nenhuma relao com a tabela Funcionrio, por isso as propriedades DataField e DataSource no foram alteradas.
Object : DbGrid: TDbGrid DataSource : DMEmpresa->dsConsFunSetor

84

Abaixo voc ter uma sugesto 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 aplicaes desenvolvidas por ferramentas visuais, tm a necessidade de extrair os dados computados atravs de relatrios. O Delphi 2007 utiliza como padro de relatrio o aplicativo Rave Report. Para aprendermos a utiliz-lo, vamos desenvolver o relatrio da consulta de funcionrios por setor Captulo 18. No formulrio frmDmEmpresa, adicione o componente TRvProject e Componente RvQueryConnection que encontra-se na Paleta Rave.

85

Figura 75 Paleta Rave

Para criarmos nosso relatrio 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 opes mais utilizadas durante o desenvolvimento do seu relatrio.

86 Figura 77 Barra de FErramentas Rave Reports

Janela de Propriedades:

Encontra-se as propriedades relativas aos componentes inserido no relatrio.

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 disponveis para serem utilizados no desenvolvimento do relatrio.

87

Figura 80 Abas de Componentes

Primeiramente para darmos inicio ao nosso relatrio 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 formulrio frmDmEmpresa e selecionar o componente RvProject e faa a seguinte configurao:
Object RvProject: TRvProject Name : RvRelSetor ProjectFile: Clique no boto ... 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 conexes acima descritas, vamos criar nosso relatrio. Retorne ao Rave Projects e clique no menu File | New Data Object, ser exibida a seguinte tela :

Figura 81 Conexo de Dados

Selecione a opo Direct Data View e em seguida clique no boto next que lhe dar acesso a seguinte tela:

88

Figura 82 Selecionado Conexo Rave/Delphi

Nesta tela voc ir selecionar a conexo feita na sua aplicao do Delphi 2007 e para finalizar clique no boto 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 conexo que voc configurou.

Figura 83 Dados do DataView1

A conexo com o banco est realizada, agora iremos desenhar nosso relatrio de Funcionrios por setor. Para adicionar qualquer componente no relatrio necessrio adicionarmos a pgina principal o componente Region (Guia Report) que para adicion-lo, clique duas vezes sobre o mesmo. necessrio dimensionar o componente por toda a extenso da pgina principal.

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 Endereo respectivamente. Aps isto, adicione o componente Data Band e precionando a tecla CTRL clique no campo do Data View referente ao nome do funcionrio e arraste at o Data Band alinhando com o componente Text referente a matrcula. 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 relatrio ter a seguinte aparecia:

90

Figura 85 Montando Relatorio

Para visualizar o nosso relatrio clique no boto Execute Report na barra de ferramentes ou pressione a tecla F9. Pelo Delphi adicione um componente Button no formulrio e no evendo onclick digite: RVProject1.Execute. Aparecer a seguinte tela:

Figura 86 Confirmao de Preview do Rave Reports

Clique no boto OK e ser visualizado nosso relatrio.

91

Figura 87 Preview dos Dados do Banco

Vimos em nos exemplos anteriores o desenvolvimento de aplicaes que utilizam componentes Data-Aware, porm nem sempre vivel o desenvolvimento de aplicaes somente com este tipo de componente. Existem aplicaes onde se faz necessrio a programao propriamente dita, com instrues DML para insero, consulta e atualizao de dados. A aplicao exemplo a seguir ser de uma Agenda, utilizando o Banco de Dados Interbase e componentes da Paleta InterBase no Delphi 2007.

EXERCCIO 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 aplicao 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;

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 boto ... e selecione o arquivo salvo do Banco Interbase. Name: Conexo; 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 faa um layout como abaixo:

93

Figura 89 Menu de Opes Agenda

Adicione um novo form para o cadastro de pessoas e salve-o com o nome ufrmCadastro e a propriedade name para frmCadastro. Uma sugesto de tela pode ser:

Figura 90 Tela de Cadastro Agenda

Os componentes utilizados foram: Toolbar, ImageList, Label, Edit, MaskEdit e RadioGroup. Segue abaixo o cdigo da programao 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;

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 confirmao 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;

95 Registro := dmAgenda.TbAgenda.RecordCount + 1; lblCodigo.Caption := IntToStr(Registro); end; procedure TfrmCadastro.bbtSairClick(Sender: TObject); begin frmCadastro.Close; end;

O prximo formulrio a ser desenvolvido a tela de consulta, para isso adicione um novo formulrio 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 sugesto de tela de consulta a seguinte :

Figura 91 Tela de Consulta

Segue abaixo o cdigo para a programao da tela de consulta:


unit ufrmConsulta; interface var frmConsulta: TfrmConsulta; xCriterio, xMetodo: string; implementation uses udmAgenda;

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('No foi possvel 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 critrio de Pesquisa',mtInformation,[mbok],0); Exit; end; if rdgMetodos.ItemIndex < 0 then Begin

97 MessageDlg('Informe o mtodo 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 relatrio. Para isso adicione o componente RvProject e RvDataSetConnection no formulrio 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 conexo 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, Endereo, Telefone e Data de Nascimento respectivamente. No Componente DataBand adicione os campos do Data View correspondentes aos componentes Text. Seu Relatrio deve ficar da seguinte forma:

98

Figura 92 Relatrio de Agenda

Faa as seguintes configuraes 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 diretrio de imagens do delphi2007. Object Text: Text: Relao 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 aplicao e execute-a.

EXERCICIO PROPOSTO 7

Com base no diagrama abaixo, desenvolva uma aplicao atendendo as especificaes do modelo:

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; Relatrio de Pedidos em um determinado perodo. Crie a base de Dados no InterBase e utilize a paleta InterBase para realizar a conexo e acesso ao Banco de Dados criado.

20 INTERBASE

O Interbase um poderoso banco de dados Cliente/Servidor relacional que compatvel 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 espao em disco para sua instalao e utilizando pouca memria em situaes normais de uso. Por isso a plataforma necessria para a sua instalao e utilizao pode ser reduzida diminuindo consideravelmente os custos do projeto. Uma grande vantagem do Interbase que ele Mltiplaforma, ou seja, funciona em vrios Sistemas Operacionais, dentre eles podemos destacar: Windows 9x; Windows NT; Linux; Solaris.

20.1 IBConsole

100

O que ? E pra que serve?

O IBConsole o gerenciador de Dados que acompanha o InterBase. A grande vantagem dele o fato, de no ser uma ferramenta de criao de Tabelas. No IBConsole, voc realmente aprende a linguagem SQL, pois, toda e qualquer criao, relacionamento, manuteno, feito no ISQL, tudo via Linha de Comando DML Linguagem de manipulao de Dados. No IBConsole o usurio master SYSDBA e a sua senha masterkey, o seu uso bastante simples, inicialmente voc precisa se logar no IBConsole para isso clique com o boto direito sobre a opo Local Server e escolha login em USERNAME voc informa o usurio master e a sua senha acima descrita. Na opo Databases voc pode registrar ou criar um novo banco de dados, para fazer o registro o banco j deve existir, clique com o boto direito sobre a opo Register, em Files voc informa o nome do banco e o seu caminho se preferir pode procurar com o boto 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 usurio e a sua senha, clicando no boto de OK para finalizar o registro. Para criarmos um Banco de Dados em ambiente Client/Server via IBConsole deve escolher a opo 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 aparecero na parte inferior. Devemos observar que o ISQL no enviar nenhum comando SQL at logarmos com um usurio 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, no esquea 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

101

padro SQL e ela se estabeleceu como linguagem padro de Banco de Dados Relacional. A SQL apresenta uma srie de comandos que permitem a definio dos dados, chamada de DDL (Data Definition Language Linguagem de Definio de Dados), composta entre outros pelos comandos Create, que destinado criao do Banco de Dados, das tabelas que o compe, alm das relaes existentes entre as tabelas. Como exemplo da classe DDL temos os comandos Create, Alter, Drop e Rename. Os comandos da srie DML (Data Manipulation Language Linguagem de Manipulao de Dados), destinados as consultas, inseres, excluses e alteraes em um ou mais registros de uma ou mais tabelas de maneira simultnea. Como exemplo de comandos da classe DML temos os comandos Select, Insert, UpDate, Delete, Commit e Rollback. Comandos e Funes:

A seguir sero listados alguns comandos e funes mais utilizadas do Interbase, com parmetros mais comuns. No sero abordados todos os comandos, mas o essencial para se obter um bom conhecimento e conseguir usufruir do potencial desse banco de dados.

ALTER DATABASE ALTER DOMAIN ALTER EXCEPTION ALTER INDEX ALTER PROCEDURE ALTER TABLE ALTER TRIGGER AVG( ) CAST( ) CLOSE COMMIT COUNT( ) CREATE DATABASE CREATE DOMAIN

CREATE EXCEPTION CREATE GENERATOR CREATE INDEX CREATE PROCEDURE CREATE TABLE CREATE TRIGGER CREATE VIEW DECLARE EXTERNAL FUNCTION DELETE DROP DATABASE DROP DOMAIN DROP EXCEPTION DROP EXTERNAL FUNCTION DROP INDEX

DROP PROCEDURE DROP TABLE DROP TRIGGER DROP VIEW EXECUTE PROCEDURE GEN_ID( ) INSERT MAX( ) / MIN( ) ROLLBACK SELECT SET GENERATOR SUM( ) UPDATE UPPER( )

ALTER TABLE

Altera a estrutura de uma tabela e ou a integridade da mesma.

Sintaxe:

102

ALTER TABLE table ADD <col_def> <col_def> = col { <datatype> | [COMPUTED [BY] (<expr>) | domain}[DEFAULT { literal | NULL | USER}][NOT NULL] [ <col_constraint>] [COLLATE <constraint_def> [ <col_constraint>] collation]<col_constraint> = [CONSTRAINT 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 mdia de valores de uma coluna.

Ex:

SELECT MES, AVG(VALOR_DA_VENDA) FROM VENDAS ORDER BY MES

COMMIT

Grava as alteraes de uma transao permanente no Banco de Dados.

Sintaxe: COMMIT

Ex :

COMMIT

COUNT()

Retorna a quantidade de registros para uma condio em um SELECT

Sintaxe : COUNT( * | ALL | valor | DISTINCT valor )

Ex :

SELECT COUNT(*) FROM CLIENTES

103

CREATE DATABASE Cria um novo Banco de Dados .GDB. Nele pode especificar as suas caractersticas, como:

Nome do Arquivo; Tamanho da pgina 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 Desktops xBase, Access, Paradox muito diferente do conceito de ndices em ambiente Client/Server. Um ndice em ambiente Client/ Server InterBase, Oracle, DB2, no tem a funo de organizar a tabela, pois, voc tem o mesmo efeito com ORDER BY. A funo de um ndice em ambiente Client/Server, de performance em primeiro lugar, caso o ndice seja um PK Primary Key, tem a funo de manter a integridade da tabela, caso o ndice seja um FK Foreign Key,

104

tem a funo de relacionamento e integridade da tabela, caso o ndice seja UNIQUE, tem a funo de no deixar valores iguais serem includos.

As clusulas ASCENDING e DESCENDING, tem a funo de organizar da maneira desejada o ndice. O valor default ASC

Sintaxe : CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX index ON table ( col [, col ...]); 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 );

Ex :

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>]

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>

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 NOME DATA PRECO ESTOQUE VALOR DATE DOUBLE INTEGER COMPUTED BY INTEGER NOT NULL, NOT NULL,

VARCHAR(50)

DEFAULT CURRENTE DATE NOT NULL, PRECISION ( CHECK PRECO > 0), ( CHECK ESTOQUE > 0), ( PRECO * ESTOQUE ),

CONSTRAINT PK_PRODUTOS PRIMARY KEY(ID));

DELETE

Apaga um ou mais registros de uma tabela InterBase. Se no for utilizado a clusula WHERE, ser apagado todos os registros da tabela.

Sintaxe : DELETE [TRANSACTION transaciona] FROM table

{[WHERE <search_condition>] | WHERE CURRENT OF cursor}; DELETE FROM VENDAS WHERE DATA_VENDA <= 1-JAN-1999;

Ex :

DROP INDEX

107

Deleta o ndice definido pelo usurio do Banco de Dados InterBase.

Sintaxe : DROP INDEX name

Ex :

DROP INDEX IND_NOME;

DROP TABLE

Apaga uma tabela do Banco de Dados, e tambm os ndices referenciados e triggers que a tabela faz referencia.

Sintaxe : DROP TABLE name; DROP TABLE FORNECEDORES;

Ex :

INSERT

Comando responsvel 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>)

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( )

Funo que agrega e retorna o valor mximo de uma coluna.

Sintaxe : MAX([ALL <col> | DISTINCT <col>)

Ex :

SELECT MAX(SALARIO) FROM FUNCIONARIOS;

MIN( )

Funo que agrega e retorna o valor mnimo de uma coluna.

Sintaxe : MIN([ALL <col> | DISTINCT <col>)

Ex :

SELECT MIN(SALARIO) FROM FUNCIONARIOS;

ROLLBACK

Desfaz as mudanas 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 transao aberta pela aplicao e ou ferramenta de gerenciamento as tabelas.

Sintaxe : ROLLBACK

Ex :

ROLLBACK;

109

SELECT

Este o comando responsvel pela obteno dos dados da tabela, views e ou Stored Procedures.

Sintaxe : SELECT [DISTINCT {* [INTO FROM [WHERE | :var <tableref> <val> [, [, [TRANSACTION | [, <val> :var <tableref> transaction] ALL] ]} ]] ]

<search_condition>]

[GROUP BY col [COLLATE collation] [, col [COLLATE collation] ] [HAVING [UNION [PLAN [ORDER [FOR UPDATE [OF col [, col ]]]; <val> col | | | udf NULL | [<array_dim>] <constant> | ([<val> USER | <expr> [, = | | <val> RDB$DB_KEY | { :variable <function> ]]) ? BY <select_expr> <search_condition>] [ALL]] <plan_expr>] <order_list>]

} [COLLATE collation] [AS alias] <array_dim> = [[x:]y [, [x:]y ]] <constant> = num | 'string' | charsetname 'string' <function> | | | | | | | GEN_ID (generator, <val>) SUM AVG MAX MIN CAST = COUNT ([ALL] ([ALL] ([ALL] ([ALL] (* | [ALL] <val> | | | | AS | DISTINCT <val>) <val>) <val>) <val>) <val>) <datatype>) (<val>)

<val> <val> <val> <val> (<val> UPPER

DISTINCT DISTINCT DISTINCT DISTINCT

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_item> | <plan_expr>} ]) <plan_item> = {table | alias} {NATURAL | INDEX (<index> [, <index> ]) | ORDER <index>} <order_list> {col [ASC[ENDING] [, <order_list> ] | int} | [COLLATE = collation] DESC[ENDING]] = <plan_expr>}

Ex. :

SELECT codigo,nome FROM funcionarios

111

DISTINCT Prev a excluso de linhas semelhantes do Result Set.

Operadores que fazem parte da clusula 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 tambm NOT EXISTS. SINGULAR Opera com semelhana ao EXISTS, com a diferena de que o valor tem que existir exatamente em uma ocorrncia do SubQuery(*). CONTAINING Testa se o valor passado a coluna, contm 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 unio de uma mais tabelas com o mesmo nome de colunas.

SUM( )

112

Funo de Agregao que retorna a soma dos valores da coluna

Sintaxe : SUM( [ALL <val> | DISTINCT <val>)

Ex :

SELECT SUM(VALOR) FROM VENDAS;

UPDATE

Comando responsvel pela atualizao da tabela no Banco de Dados InterBase. Update trabalha de forma semelhante ao DELETE claro, com sua enorme diferena, se no passarmos a clusula WHERE, toda a coluna da tabela ser atualizada. Sintaxe : UPDATE SET col [TRANSACTION = <val> transaction] [, col {table = | <val> view} ]

[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 no tem como tipo de dado, o tipo Boolean. Mas, isto no uma falha do InterBase, outro SGDBs tambm no tem este tipo de dado.

BLOB

O tipo de Dado BLOB, tem o tamanho varivel, isto , no sabemos na hora da criao do campo BLOB qual ser o seu tamanho realmente, mas, o limite do campo Blob que est na documentao do InterBase, de 64k por segmento. Este tipo de campo o tipo indicado para armazenar Textos Grandes Memos, Fotos, Grficos, cones, isto , aparentemente no tem um tipo de dado que no possa ser armazenado no Campo Blob. Campos Blobs no podem ser indexados.

113

Saber qual o sub-tipo correto utilizar essencial para criar aplicativos que se utilizem dos campos BLOBs. Os BLOBs se apresentam em 3 verses : Sub-tipo 0 - Armazena dados em formato binrio Fotos, etc. Sub-tipo 1 - Armazena dados em formato texto Memos. Sub-tipos definidos pelo usurio.

Alm dos 2 Sub-tipos pr-definidos, tambm existem os Sub-tipos definidos pelo usurio. Esses tipos so determinados com o uso de valores negativos logo aps a palavra SUB_TYPE. O nmero utilizado um inteiro determinado arbitrariamente pelo usurio de acordo com sua preferncia, desde que seja negativo. O uso de -1 funcionalmente equivalente ao uso de -2, -3, Tc... A nica considerao que deve ser tomada a de se certificar de sempre armazenar o tipo pr-determinado de informao no respectivo sub-tipo de BLOB. O Interbase no faz nenhuma anlise dos dados que esto 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 informaes do BLOB, a mesma no corresponder ao formato esperado.

Sintaxe : Estas declaraes na criao 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)

114

CHAR(n) O tipo de Dado CHAR, tem o seu tamanho definido na hora da criao da tabela. Seu tamanho mximo 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 criao da tabela. Seu tamanho mximo 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 so descartados.

Ex : CREATE TABLE FUNCIONARIOS ( ID INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(50) NOT NULL )

Este tipo de dado usado quando voc realmente no souber o tamanho da coluna/campo a ser criada. Outros exemplos, so criar campos Descries, Inscries Estaduais.

DATE

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

116

O tipo de Dado DECIMAL armazena dgitos a serem gravados na preciso especificada na criao 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 dgitos a serem gravados na preciso especificada na criao 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 dgitos a serem gravados, mas, com o limite de : -32768 a 32767. Serve para armazenar dados numricos pequenos. Ex : CREATE TABLE FUNCIOARIOS ( ID INTEGER NOT NULL PRIMARY KEY, DESCRICAO VARCHAR(50) NOT NULL, ..., ALTURA SMALLINT ) INTEGER

117

O tipo de Dado INTEGER, armazena dgitos a serem gravados, mas, diferente do SMALLINT, no 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 dgitos a serem gravados, mas, com preciso simples de 7 dgitos. 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 monetrio/valores no InterBase. Sua preciso 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 );

Potrebbero piacerti anche