Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
Todos os componentes que podem ser utilizados no Delphi2007 encontram-se na janela Tool Palette localizado ao lado direito da tela.
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;
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.
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.
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.
Uma caracterstica muito interessante no Code Editor que ao inserirmos um componente no form, o mesmo declarado automaticamente no editor de cdigo.
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.
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.
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
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.
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
.PAS
.DPROJ
Desenvolvimento Desenvolvimento
.DFM
Compilao
.DCU
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
.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.
.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.
12
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.
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.
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.
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.
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
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.
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:
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
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 *)
Vamos explanar alguns objetos com suas propriedades e seus respectivos mtodos.
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
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.
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.
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
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;
Salve seu projeto e atravs do comando RUN compile e faa os testes necessrios.
20
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.
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
Figura 17 GroupBox
Propriedades
Align Caption Pemite definir um alinhamento no objeto proprietrio. Define o texto informativo na parte superior do componente.
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.
Figura 19 - MainMenu
Propriedades
Items Images Define um novo item de Menu. Define um objeto do tipo ImageList.
22
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
Figura 21 - RadioButton
Propriedades
Checked Define se o componente est ligado ou desligado.
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.
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.
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
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.
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.
Figura 27 - PageControl
25
Propriedades
ActivePage Permite determinar qual a guia foi selecionada pelo usurio.
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.
Figura 31 - Gauge
Propriedades
Kind Progress Permite definir aparncias diferenciadas no componente. Define a posio corrente do controle no componente.
27
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.
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
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.
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.
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
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.
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;
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
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
Faixa de Valores
Valores Permite armazenar um caractere ASCII. Permite armazenar uma cadeia de at 255 caracteres. Permite armazenar uma cadeia ilimitada de caracteres.
Objetos variant so essencialmente variveis sem tipo podendo assumir diferentes tipos, automaticamente. Esta vantagem aparente tem a caracterstica de ser ineficiente se utilizada indiscriminadamente.
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
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.
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
APPLICATION.MESSAGEBOX
Uma outra caixa de dilogo o mtodo MessageBox do objeto Application. Esta funo est definida da seguinte maneira:
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
Figura 38 Application.MessageBox
10 CAIXAS DE ENTRADA
InputBox
A funo InputBox retorna um tipo String, que dado digitado pelo usurio na sua utilizao. Sua definio interna a seguinte:
Onde:
const ACaption APrompt Define o ttulo da janela Define um rtulo para orientao dentro da caixa.
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;
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
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
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.
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
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
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
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.
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.
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
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.
ErangeError
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
EOutOfMemory
EVariantError
EInvalidPointer
EAssertionFailed
Excees de Variantes
Excees de Pilha
Excees de Assero
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.
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.
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.
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.
SQL Links
Drivers ODBC
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
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
DBNavigator e configure-o:
object DBNavigator1: TDBNavigator DataSource = DsPeixes
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
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.
55
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
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.
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
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.
Selecione o componente AdoConnection1 e clique no boto ... da propriedade connectionstring na Object Inspector e aparecer aseguinte tela:
58
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:
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
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.
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.
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.
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)
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:
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.
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
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.
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.
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:
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:
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.
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 seis componentes BitBtn, e configure apenas as propriedades Name, Caption e Glyph. Uma sugesto visual pode ser vista a seguir:
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.
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.
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.
Edit
Permite editar o data set para alterao dos valores atuais para novos valores.
Exemplo:
Table1.Edit;
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;
Delete
Exemplo:
if MessageDLG(Est certo disto?!,mtConfirmation,[mbYes,mbNo],0) = mrYes then Table1.Delete;
Post
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
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.
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:
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
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:
73
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.
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
Grave a unit com o nome: UFrmCadDependente A propriedade Name do form ser: FrmCadDependente
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
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;
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]
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.
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
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
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.
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.
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.
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.
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.
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
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
'''
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
Para criarmos nosso relatrio no Rave, clique duas vezes sobre o componente TRvProject e ser executado o aplicativo Rave Reports.
Barra de Ferramentas:
Na barra de ferramentas voc encontra as opes mais utilizadas durante o desenvolvimento do seu relatrio.
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.
Abas de Componentes:
Encontramos nela todos os componentes disponveis para serem utilizados no desenvolvimento do relatrio.
87
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 .
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 :
Selecione a opo Direct Data View e em seguida clique no boto next que lhe dar acesso a seguinte tela:
88
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.
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
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
90
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:
91
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
93
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:
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;
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;
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
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
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 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.
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
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
AVG()
Ex:
COMMIT
Sintaxe: COMMIT
Ex :
COMMIT
COUNT()
Ex :
103
CREATE DATABASE Cria um novo Banco de Dados .GDB. Nele pode especificar as suas caractersticas, como:
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
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}
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 ),
DELETE
Apaga um ou mais registros de uma tabela InterBase. Se no for utilizado a clusula WHERE, ser apagado todos os registros da tabela.
{[WHERE <search_condition>] | WHERE CURRENT OF cursor}; DELETE FROM VENDAS WHERE DATA_VENDA <= 1-JAN-1999;
Ex :
DROP INDEX
107
Ex :
DROP TABLE
Apaga uma tabela do Banco de Dados, e tambm os ndices referenciados e triggers que a tabela faz referencia.
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
MAX( )
Ex :
MIN( )
Ex :
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>)
110
<tableref>
<joined_table>
table
view
procedure
| {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. :
111
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
SUM( )
112
Ex :
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} ]
Ex :
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.
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 );