Вы находитесь на странице: 1из 128

CARLOS ALBERTO PEDROSO ARAJO

LINGUAGEM DE PROGRAMAO COMERCIAL

Santarm 2009

Linguagem de Programao Comercial

Lista de Ilustraes
Figura 1 Form novo.........................................................................................................10 Figura 2 Object Inspector................................................................................................11 Figura 3 Paleta de Componentes.....................................................................................12 Figura 4 Botes de Alinhamento.....................................................................................12 Figura 5 Mtodo manipulador de evento OnClick de boto...........................................14 Figura 6 Cdigo do procedure.........................................................................................14 Figura 7 Caixa de mensagem...........................................................................................14 Figura 8 Mtodo manipulador do evento OnClick de form............................................15 Figura 9 Opes de Projeto.............................................................................................15 Figura 10 Alterando propriedade em tempo de execuo...............................................16 Figura 11 Cdigo para centralizar o boto em tempo de execuo.................................17 Figura 12 Cdigo fonte de um form................................................................................18 Figura 13 Unit com novo nome.......................................................................................18 Figura 14 Cdigo aps adicionar um boto.....................................................................18 Figura 15 Cdigo aps alterar a propriedade Name do boto.........................................18 Figura 16 Cdigo com manipuladores de eventos...........................................................19 Figura 17 Descrio textual do form...............................................................................20 Figura 18 Project Manager..............................................................................................21 Figura 19 Cdigo fonte do arquivo de projeto................................................................21 Figura 20 Descrio textual de um boto........................................................................24 Figura 21 Mudanas na descrio textual usando um editor qualquer............................24 Figura 22 Descrio textual do boto aps ser colado no form.......................................25 Figura 23 Comando Find in Files....................................................................................25 Figura 24 Informaes sobre um programa compilado...................................................27 Figura 25 Environment Options......................................................................................28 Figura 26 Assistente de Parmetros de Cdigo...............................................................32 Figura 27 Project Manager..............................................................................................32 Figura 28 Compilador em andamento.............................................................................33 Figura 29 Ponto de parada (Breakpoint)..........................................................................34 Figura 30 Fragmento de ALO.DOF................................................................................35 Figura 31 Arquivo desktop (.DSK).................................................................................36 Figura 32 Boto recm inserido.......................................................................................39 Figura 33 Cdigo o evento OnClick de btnFechar..........................................................40 Figura 34 Componente TEdit..........................................................................................41 Figura 35 Componente TLabel........................................................................................42 Figura 36 Componente TCheckBox................................................................................43 Figura 37 Componente TRadioGroup.............................................................................44 Figura 38 O Componente ListBox...................................................................................45 Figura 39 Componente ComboBox.................................................................................46 Figura 40 Componente ScrollBar....................................................................................48 Figura 41 Componente GroupBox..................................................................................49 Figura 42 Componente TMemo......................................................................................50 Figura 43 Form com a boto btnSalvar...........................................................................51 Figura 44 Cdigo do evento OnClick do boto btnSalvar...............................................52 Figura 45 Caixa de dilogo ShowMessage......................................................................54 Figura 46 Caixa de dilogo MessageDlg.........................................................................55 Figura 47 Caixa de dilogo MessageBox com botes de opes....................................56 3
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 48 MessageBox para informaes ao usurio......................................................57 Figura 49 Caixa de dilogo InputBox..............................................................................58 Figura 50 Aplicao Dialogos com um novo boto e rtulo...........................................59 Figura 51 Menu com opes agrupadas e sub-menu.......................................................61 Figura 52 Aplicao Menus.............................................................................................63 Figura 53 A caixa ColorDialog.......................................................................................64 Figura 54 Menu Designer................................................................................................65 Figura 55 Aspecto do menu criado..................................................................................66 Figura 56 Menu com teclas de atalho..............................................................................67 Figura 57 A janela Sobre.................................................................................................69 Figura 58 O componente PopupMenu.............................................................................70 Figura 59 Barra de ferramentas.......................................................................................72 Figura 60 Barra de status.................................................................................................75 Figura 61 Interface da aplicao......................................................................................77 Figura 62 Funo que retorna uma string de espaos......................................................78 Figura 63 O mtodo btnSalvarClick................................................................................79 Figura 64 Botes para leitura do arquivo........................................................................80 Figura 65 Cdigo do evento OnClick de btnIniciar........................................................81 Figura 66 Cdigo do evento OnClick de btnProximo.....................................................81 Figura 67 Configurao de acesso a banco de dados......................................................84 Figura 68 Modelo E-R.....................................................................................................85 Figura 69 Janela para definir o tipo da tabela..................................................................85 Figura 70 Janela para definio de campos.....................................................................86 Figura 71 BDE Administrator.........................................................................................87 Figura 72 DataModule.....................................................................................................90 Figura 73 Aparncia parcial da interface.........................................................................92 Figura 74 O controle DBNavigator.................................................................................92 Figura 75 O form de cadastro de clientes........................................................................98 Figura 76 Form de consulta a cidades...........................................................................100 Figura 77 Janela para criar TFields...............................................................................101 Figura 78 Cdigo do evento OnClick do boto btnPesquisar.......................................104 Figura 79 Modelo E-R do banco de dados....................................................................105 Figura 80 Nota fiscal.....................................................................................................110 Figura 81 Tela de definio da ligao entre duas tabelas............................................111 Figura 82 Form de Vendas............................................................................................114 Figura 83 Criao de campo Lookup............................................................................115 Figura 84 Criao de campo calculado..........................................................................116 Figura 85 Cdigo para atualizar o total da venda..........................................................118 Figura 86 Aba de componentes Rave............................................................................119 Figura 87 Rave Visual Designer....................................................................................120 Figura 88 Propriedades do objeto Page1.......................................................................121 Figura 89 Janela para criao da conexo a dados........................................................121 Figura 90 rvore de Objetos.........................................................................................122 Figura 91 Componente Region......................................................................................122 Figura 92 rea de impresso.........................................................................................122 Figura 93 Componentes Band e DataBand....................................................................123 Figura 94 Pgina com os objetos Band e DataBand......................................................123 Figura 95 Editor da propriedade BandStyle..................................................................123 Figura 96 Componente Text..........................................................................................124 Figura 97 Pgina com os objetos Band e DataBand......................................................124 4
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 98 Editor de Data Text.......................................................................................125 Figura 99 Aparncia do projeto do relatrio.................................................................125 Figura 100 A banda GroupHeader.................................................................................127 Figura 101 A aparncia final do desenho do relatrio...................................................127 Figura 102 Prvia do relatrio.......................................................................................128

5
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Lista de Quadros
Quadro 1 Propriedades, mtodos e eventos de Form......................................................39 Quadro 2 Propriedades, mtodos e eventos de Button....................................................40 Quadro 3 Propriedades, mtodos e eventos de Edit........................................................41 Quadro 4 Propriedades e eventos de Label.....................................................................42 Quadro 5 Propriedades, mtodos e eventos de CheckBox..............................................43 Quadro 6 Propriedades, mtodos e eventos de RadioGroup...........................................44 Quadro 7 Propriedades, mtodos e eventos de ListBox..................................................46 Quadro 8 Propriedades, mtodos e eventos de ComboBox.............................................47 Quadro 9 Propriedades, mtodos e eventos de ScrollBar................................................48 Quadro 10 Propriedades, mtodos e eventos de Memo...................................................50 Quadro 11 Propriedades e mtodos de TStrings.............................................................52 Quadro 12 Funes de converso de dados.....................................................................53 Quadro 13 Propriedades de BitBtn..................................................................................60 Quadro 14 Propriedades de ToolBar...............................................................................71 Quadro 15 Propriedades de StatusBar.............................................................................73 Quadro 16 Propriedades de TStatusPanel.......................................................................74 Quadro 17 Propriedades de StatusBar.............................................................................74 Quadro 18 Rotinas de Entrada e Sada............................................................................76 Quadro 19 Definio dos campos da tabela Cidade........................................................86 Quadro 20 Definio dos campos da tabela Cliente........................................................87 Quadro 21 Propriedades, mtodos e eventos de Table....................................................89 Quadro 22 Propriedades e eventos de DataSource..........................................................90 Quadro 23 Propriedades, mtodos e eventos de DBEdit.................................................91 Quadro 24 Propriedades e eventos de DBNavigator.......................................................92 Quadro 25 Propriedades, mtodos e eventos de DBLookUpComboBox........................95 Quadro 26 Propriedades, mtodos e eventos de DBComboBox.....................................96 Quadro 27 Propriedades, mtodos e eventos de DBRadioGroup....................................97 Quadro 28 Propriedades, mtodos e eventos de DBCheckBox.......................................97 Quadro 29 Propriedades, mtodos e eventos de DBGrid..............................................100 Quadro 30 Propriedades, mtodos e eventos de TField................................................101 Quadro 31 Propriedades e mtodos de TQuery.............................................................103 Quadro 32 Propriedades, mtodos e eventos de IBDatabase........................................107 Quadro 33 Propriedades e mtodos IBTransaction.......................................................108 Quadro 34 Propriedades do componente RvSystem.....................................................119 Quadro 35 Propriedades do componente RvProject......................................................120 Quadro 36 Propriedades do componente RvDataSetConnection..................................120

6
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Sumrio
Introduo..........................................................................................................................9 Captulo 1 Um form uma janela...................................................................................10 Adicionando um ttulo.............................................................................................10 Salvando a aplicao...............................................................................................11 Analisando o cdigo fonte.......................................................................................17 Captulo 2 O Ambiente Delphi........................................................................................23 O menu File.............................................................................................................23 O menu Edit.............................................................................................................24 O menu Search........................................................................................................25 O menu View...........................................................................................................26 O menu Project........................................................................................................26 O menu Run.............................................................................................................27 A Paleta de Componentes........................................................................................29 O Object Inspector...................................................................................................29 A Paleta de Alinhamento.........................................................................................29 Usando marcadores de pgina.................................................................................30 Code Insight.............................................................................................................30 Complementao de cdigo....................................................................................31 Modelos de cdigo..................................................................................................31 Parmetros de cdigo..............................................................................................32 O Project Manager...................................................................................................32 Ajustando opes de Projeto...................................................................................33 Compilando um Projeto...........................................................................................33 O Depurador Integrado............................................................................................34 O Object Browser....................................................................................................34 Captulo 3 Conhecendo os Componentes Bsicos..........................................................37 Propriedades de Form (TForm)...............................................................................38 Utilizando um Boto (TButton)...............................................................................39 Aceitando entrada de dados do Usurio (TEdit).....................................................40 Identificando Componentes (TLabel)......................................................................41 Fazendo escolhas (TCheckBox, TRadioButton e TRadioGroup)...........................43 Uma Lista com muitas escolhas (TListBox)...........................................................45 Muitas opes em pouco espao (TComboBox).....................................................46 Escolhendo um valor em um intervalo (TScrollBar)..............................................47 Agrupando componentes relacionados (TGroupBox).............................................49 Entrando mltiplas linhas (TMemo).......................................................................49 Juntando tudo...........................................................................................................51 Captulo 4 Caixas de Dilogo..........................................................................................54 Captulo 5 Criando Menus...............................................................................................61 A Caixa de Dilogo ColorDialog............................................................................63 Criando um Menu com o Menu Designer...............................................................64 Teclas de atalho e hotkeys.......................................................................................66 Respondendo aos comandos do menu.....................................................................67 Chamadas a forms...................................................................................................68 Menus locais (Pop-up).............................................................................................69 Captulo 6 Barras de ferramentas e de status...................................................................71 Barra de ferramentas (TToolBar)............................................................................71 7
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Barra de status (TStatusBar)....................................................................................73 Captulo 7 Tratamento de arquivos.................................................................................76 Escrevendo dados no arquivo......................................................................................78 Lendo dados do arquivo..............................................................................................79 Melhorando a interface................................................................................................82 Captulo 8 Aplicaes usando Banco de Dados Local....................................................84 Acesso a Banco de Dados............................................................................................84 Aplicao de banco de dados.......................................................................................85 BDE - Criao do Alias...........................................................................................87 Iniciando a aplicao...............................................................................................88 A interface de entrada de dados da tabela Cidade...................................................90 A interface de entrada de dados da tabela Cliente...................................................94 Consultas a banco de dados.........................................................................................98 Componente para o resultado da consulta (TDBGrid)............................................99 Pesquisa em tabelas usando Locate.......................................................................101 Pesquisa em tabelas usando TQuery.....................................................................103 Captulo 9 Aplicaes usando Banco de Dados Cliente/Servidor.................................105 Iniciando a aplicao.................................................................................................106 As interfaces de entrada de dados.........................................................................109 Form mestre-detalhe..............................................................................................110 Relatrios...................................................................................................................119 Relatrio de Cidades..............................................................................................119 Relatrio de Clientes.............................................................................................126

8
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Introduo

Delphi considerada uma ferramenta RAD (Rapid Application Development). E realmente podemos desenvolver aplicaes com bastante rapidez nesse ambiente. Desde suas primeiras verses, Delphi tem evoludo de forma a oferecer inmeros recursos aos desenvolvedores, tanto para aplicaes que rodam no desktop quanto para aplicaes web. Junta-se a essa caracterstica o fato de Delphi ser orientado a objetos, mas no totalmente, pois mantm o paradigma procedural e, possibilitar o desenvolvimento visual de aplicaes para o ambiente Windows. Este texto tenta apresentar Delphi de forma didtica. Sem nenhuma pretenso de cobrir toda a extenso desta poderosa ferramenta, mas oferecendo informaes suficientes para o estudante ou futuro desenvolvedor que deseje adotar o Delphi como uma de suas ferramentas de trabalho. Como objeto do estudo foi usado o Delphi 7. No entanto, qualquer verso a partir do Delphi 6 pode ser usada para acompanhar as atividades. Tentou-se organizar o texto de forma a privilegiar o auto-estudo. Ao fim da leitura, o estudante estar apto a desenvolver pequenas aplicaes usando bancos de dados, e capaz de prosseguir de forma autnoma, pois a base e o conceito do ambiente so apresentados com o objetivo de facilitar isso. Para atingir seu objetivo, este trabalho est organizado da seguinte forma: no Captulo 1 apresentado o conceito de form no Delphi e criada a primeira aplicao para introduzir o leitor no ambiente. No Captulo 2 tem-se uma viso do ambiente do Delphi, configuraes e recursos do editor de cdigo. No Captulo 3 so apresentados os componentes bsicos atravs da estratgia de se construir uma aplicao passo a passo. As caixas de dilogo so estudadas no Captulo 4. Menus e barras de ferramentas e de status so mostradas nos Captulos 5 e 6. Aps isso comea-se o estudo da persistncia de dados no Delphi, iniciando com os arquivos de texto no Captulo 7. Aplicaes de bancos de dados locais so estudadas no Captulo 8. Finalmente, no Captulo 9, criada uma aplicao usando banco de dados cliente/servidor e faz-se uma introduo a relatrios.

9
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 1 Um form uma janela


Aplicaes Windows so geralmente baseadas em janelas. Ento, como vamos criar nossa primeira janela? Bem, usando um form. Como o ttulo do captulo sugere um form realmente uma janela. No h diferena entre os dois conceitos, pelo menos de um ponto de vista geral.

Criando seu primeiro form


Embora voc provavelmente j tenha criado algumas aplicaes simples no Delphi, vou mostrar o processo de novo, para esclarecer alguns pontos interessantes. Criar um form uma das operaes mais fceis no sistema: voc s precisa abrir o Delphi, e ele automaticamente ir criar um form novo, como se pode ver na figura abaixo.

Figura 1 Form novo Se voc j tem um projeto aberto, escolha File | New | Application para fechar o projeto antigo e abrir um novo. Acredite, voc j tem uma aplicao funcionando. Voc pode execut-la, usando o boto Run ( ) na barra de ferramentas ou escolhendo Run | Run no menu, e voc ver um programa Windows padro. Certamente no uma aplicao muito til, pois apenas uma janela vazia, mas tem o comportamento default de qualquer janela Windows.

Adicionando um ttulo
Antes de executar a aplicao, vamos fazer uma rpida alterao. O ttulo do form Form1. Para um usurio, o ttulo da janela torna-se o nome da aplicao. Vamos mudar Form1 para algo mais significativo. Quando voc abre o Delphi, a janela Object Inspector deve aparecer ao lado esquerdo do form (se no aparecer pressione a tecla F11).

10
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 2 Object Inspector O Object Inspector mostra as propriedades do componente selecionado. A janela contm duas abas. A primeira rotulada Properties. A outra rotulada Events e mostra a lista de eventos que podem acontecer no form ou no componente selecionado. As propriedades so listadas em ordem alfabtica, assim fica fcil encontrar aquela que se quer modificar. Podemos mudar o ttulo do form simplesmente mudando a propriedade Caption. Enquanto voc digita um novo Caption o ttulo do form se modifica. Se voc digitar Alo o ttulo muda imediatamente. Como uma alternativa, voc pode modificar o nome do form mudando a propriedade Name. Se Caption ainda no tiver sido modificada, o valor de Name tambm ser usado por Caption. No entanto para a propriedade Name do form digite frmPrincipal (frm significa form e Principal indica a funo do form). Nem todas as propriedades de um componente mudam enquanto um novo valor digitado. Muitas so aplicadas quando voc termina de digitar e teclar Enter, ou quando muda o foco de entrada para outra propriedade. Sem muito trabalho ns construmos uma aplicao com um menu de sistema (aquele que aparece quando voc clica o canto superior esquerdo da janela) e os botes padro das janelas: Minimizar, Maximizar e Fechar. Se voc observar a barra de tarefas voc ver que algo no est certo. Em vez de mostrar o caption do form como caption do cone, ele mostra o nome do projeto, algo como Project1. Podemos corrigir isso dando um novo nome ao projeto quando o salvarmos no disco.

Salvando a aplicao
Selecione Save Project ou Save Project As no menu File, e o Delphi ir lhe perguntar o nome do arquivo do cdigo fonte (unit) associado ao form, e depois o nome do arquivo do projeto. Para o nome da unit digite o nome u_principal. Para que o nome do projeto seja o mesmo do caption do form d a ele o nome Alo. O Delphi vai salvar uma unit com o nome u_principal.pas e um projeto com o nome Alo.dpr. Sempre que salvar uma nova unit, tenha o cuidado de selecionar o diretrio da sua aplicao. Se esse 11
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

cuidado no for tomado, corre-se o risco de ter mdulos do programa espalhados pelo disco e depois difcil localiz-los. Voc pode tambm mudar o ttulo de uma aplicao usando a aba Application da caixa de dilogo Project Options (escolha a opo de menu Project | Options).

Usando Componentes
Agora hora de comear a inserir algo til em nosso form. Forms podem ser pensados como contineres de componentes. Cada form pode hospedar componentes e controles. Voc pode escolher um componente da paleta de componentes do ambiente do Delphi, como mostra a Figura 3.

Figura 3 Paleta de Componentes H quatro maneiras de colocar componentes em um form. Selecione o componente Button da aba Standard, voc pode inseri-lo no form de uma das seguintes formas: Clique no componente, mova o cursor do mouse para o form, pressione o boto esquerdo na posio onde ficar o canto superior esquerdo do boto e arraste o mouse para ajustar o tamanho. Selecione o componente e simplesmente clique no form na posio onde quer inserir o boto com tamanho padro. D um duplo clique no componente e o mesmo ser inserido no centro do form. Pressione a tecla Shift e clique ao mesmo tempo no componente, e coloque vrios componentes do mesmo tipo no form, procedendo de uma das duas primeiras maneiras acima.

Queremos apenas um boto no form. Vamos centraliz-lo manualmente. Selecione o boto inserido no form e depois View | Alignment Palette e uma caixa de ferramentas com botes de alinhamento como essa aparece:

Figura 4 Botes de Alinhamento Clique nos dois botes da terceira coluna e o boto ficar posicionado no centro do form.

Alterando Propriedades
Assim como o form, o boto tem uma propriedade Caption que ns podemos usar para alterar o seu rtulo (o texto mostrado dentro dele). Altere ento a propriedade Caption para Diga Al. Na propriedade Name digite btnAlo. 12
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

bastante comum definir uma conveno de nomes para cada tipo de componente. Sugiro usar um nome curto, tal como btn para Button, para o prefixo do nome do componente. Se voc usar um prefixo diferente para cada tipo de componente, o combo box do Object Inspector ir listar os componentes do mesmo tipo em um grupo, pois eles esto em ordem alfabtica. Name uma propriedade interna e usada como nome de uma varivel que se refere ao componente no cdigo da aplicao. Portanto, a propriedade Name segue as regras de nomeao de identificadores da linguagem Pascal: Um identificador uma seqncia de letras, dgitos ou underscore de qualquer tamanho, embora apenas os primeiros 63 caracteres sejam significativos. O primeiro caractere de um identificador no pode ser um nmero, deve ser uma letra ou underscore. Identificadores no so case-sensitive, mas geralmente cada palavra em um identificador comea com uma letra maiscula, como em BtnHello. Normalmente inicio o prefixo com letra minscula. Mas btnhello, btnHello ou BTNHello referem-se ao mesmo identificador.

Se voc executar esse programa agora, ver que o boto funciona adequadamente. Se voc clicar nele, ele ser pressionado, e quando libera o boto do mouse o boto tambm liberado. O problema que quando voc pressiona o boto, espera-se que algo acontea, mas nada acontece porque no definidos qualquer ao para o clique do mouse ainda.

Respondendo a Eventos
Quando voc pressiona o boto do mouse em um form ou componente, o Windows informa do evento sua aplicao, enviando uma mensagem a ela. O Delphi responde ao receber uma notificao de evento chamando um mtodo manipulador de evento apropriado. Como programador voc pode prover vrios desses mtodos, tanto para form quanto para os componentes colocados nele. O Delphi prev um certo nmero de eventos para cada tipo de componente. A lista de eventos para o form diferente da lista de eventos para um boto, como se pode ver clicando nesses dois componentes com a aba Events selecionada no Object Inspector. Alguns eventos so comuns a ambos os componentes. H vrias tcnicas que voc pode usar para definir um mtodo manipulador para o evento OnClick do boto: Selecione o boto e a aba Events no Object Inspector. D um duplo clique na rea branca ao lado direito do evento OnClick. Um novo nome de mtodo ir aparecer no editor de cdigo, btnAloClick. Selecione o boto e a aba Events no Object Inspector. Digite o nome de um novo mtodo na rea branca ao lado direito do evento OnClick. Pressione Enter para aceit-lo. D um duplo clique no boto e o Delphi ir executar a ao padro para esse componente, que adicionar um mtodo manipulador para o evento OnClick.

13
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Com qualquer uma dessas abordagens o Delphi cria um procedure chamado btnAloClick (ou o nome que voc escolheu) no cdigo do form e abre o arquivo do cdigo fonte nesta posio:

Figura 5 Mtodo manipulador de evento OnClick de boto Como vimos, a ao padro para um boto adicionar um manipulador para responder ao evento OnClick. Mesmo que voc no tenha certeza do efeito da ao padro de um componente, voc ainda pode dar um duplo clique nele. Se voc adicionar um procedure que no precisa, apenas deixe-o vazio. Mtodos vazios gerados pelo Delphi sero removidos assim que o arquivo for salvo ou o projeto for compilado. Agora podemos digitar algumas instrues entre as palavras chaves begin e end que delimitam o procedure. O cdigo simples. Apenas uma chamada ao procedure ShowMessage, para mostrar uma mensagem.

Figura 6 Cdigo do procedure Observe que quando voc digita o abre parnteses o Delphi ir mostrar a lista de parmetros em uma dica (hint) facilitando a sua lembrana. Se voc precisar de ajuda para ShowMessage posicione o cursor sobre seu nome e pressione ao mesmo tempo as teclas Ctrl e F1. Essa ao ir abrir a Ajuda do Delphi para o procedure em questo. Isso funciona para qualquer comando. Digite ento dentro dos parnteses a string 'Al pessoal'. Execute o programa agora e clique no boto. Voc ver a caixa de mensagem abaixo:

Figura 7 Caixa de mensagem A cada vez que voc clica no boto a caixa de mensagem mostrada. E se voc clicar fora do boto? Nada acontece. Naturalmente, podemos adicionar um novo cdigo para manipular esse evento. S precisamos adicionar um evento OnClick para o prprio form. Selecione o form e a aba Events do Object Inspector. D um duplo clique no lado direito do evento OnClick. Agora adicione o seguinte cdigo: 14
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 8 Mtodo manipulador do evento OnClick de form

Compilando e Executando um Programa


Antes de prosseguir com a implementao do nosso programa Alo, vamos analisar o que acontece quando executamos uma aplicao. Quando voc clica no boto Run ou seleciona Run | Run, o Delphi faz o seguinte: 1. 2. 3. 4. Compila o cdigo fonte Pascal que descreve o form. Compila o arquivo do projeto. Constri o arquivo executvel (EXE), ligando as bibliotecas apropriadas. Executa o arquivo executvel, geralmente em modo depurao (debug).

O ponto principal que quando voc pede para o Delphi executar uma aplicao, ele a compila em um arquivo executvel. Voc pode facilmente executar este arquivo do Windows Explorer ou usando o comando Executar do boto Iniciar. Compilar este programa como se faz comumente, ligando todos os cdigos de bibliotecas necessrios, produz um executvel de uma centena de Kbytes. Usando pacotes de tempo de execuo, pode-se comprimir o executvel para cerca de 20 Kb. Simplesmente selecione o comando de menu Project | Options, v para a aba Packages e marque a caixa Build with runtime packages.

Figura 9 Opes de Projeto

15
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Packages so bibliotecas de ligao dinmicas (dll) contendo os componentes Delphi. Usando os pacotes voc pode fazer um arquivo executvel muito menor. No entanto o programa no executar se as dlls apropriadas no estiverem disponveis no computador onde o programa rodar.

Alterando Propriedades em Tempo de Execuo


Vamos retornar nossa aplicao Alo. Queremos agora tentar mudar algumas propriedades em tempo de execuo. Por exemplo, ns podemos mudar o Caption de btnAlo para Diga al de novo depois que o usurio clica nele pela primeira vez. Pode ser necessrio tambm mudar a largura do boto, pois o Caption fica maior. Isso muito simples de fazer. S precisa mudar o cdigo do procedure btnAloClick como mostrado abaixo.

Figura 10 Alterando propriedade em tempo de execuo Portanto, para mudar uma propriedade como Caption em tempo de execuo, usa-se apenas um comando de atribuio. Muitas propriedades podem ser alteradas em tempo de execuo e outras podem ser alteradas apenas em tempo de execuo. Aquelas que s podem ser alteradas em tempo de execuo no so listadas no Object Inspector, mas aparecem na Ajuda do componente. Algumas dessas propriedades de tempo de execuo so definidas como apenas leitura, o que significa que voc pode ler seu valor, mas no pode alter-lo.

Adicionando Cdigo ao Programa


Nosso programa est quase finalizado, mas ainda temos um problema a resolver, que ir exigir alguma codificao. O boto inicia no centro do form mas no permanece l quando voc redimensiona o form. Este problema pode ser resolvido de duas formas diferentes. Uma soluo mudar o estilo da borda do form de modo que ele no possa ser redimensionado em tempo de execuo. V para a propriedade BorderStyle do form, e selecione bsSingle em vez de bsSizeable. A outra abordagem escrever algum cdigo para mover o boto para o centro a cada vez que o form for redimensionado. Embora parea que grande parte do seu trabalho em programar no Delphi seja selecionar opes e elementos visuais, tem um momento que necessrio escrever cdigo. Quanto mais experiente voc fica, mais cdigo voc escreve. Quando voc quer adicionar cdigo ao programa, a primeira pergunta a ser respondida : Onde? Em um ambiente orientado a eventos como o Delphi, o cdigo sempre executado em resposta a um evento. Quando um form redimensionado ocorre um evento: OnResize. Selecione o form e a aba Events no Object Inpector. Procure o evento OnResize e d um duplo clique direita dele. Um novo procedure adicionado ao arquivo fonte do form. Agora digite o seguinte cdigo: 16
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 11 Cdigo para centralizar o boto em tempo de execuo Para determinar as propriedades Top e Left do boto - isto , a posio do seu canto superior esquerdo - o programa calcula o centro da pgina, dividindo a altura e a largura da rea interna ou rea cliente da pgina por 2, e ento subtrai metade da altura (Height) e largura (Width) do boto. Se voc usar as propriedades Height e Width do form, em vez das propriedades Client Height e ClientWidth, voc estar se referindo ao centro da janela incluindo a barra do Caption.

Uma Ferramenta de Mo Dupla (Two-Way)


No exemplo anterior ns escrevemos trs pequenas pores de cdigo, para responder a trs eventos diferentes. Cada poro de cdigo era parte de um procedure diferente. Mas onde termina o cdigo que ns escrevemos? O cdigo fonte de um form escrito em um nico arquivo fonte Pascal, aquele que chamamos u_principal.pas. O arquivo cresce no apenas quando escrevemos cdigo para responder a eventos, mas tambm quando adicionamos componentes ao form. As propriedades desses componentes juntamente com as propriedades do form so armazenadas em um segundo arquivo chamado u_principal.dfm. O Delphi pode ser definido como uma ferramenta de mo dupla, pois tudo que voc faz no ambiente visual leva a algum cdigo. Nada oculto e inacessvel. Voc tem acesso ao cdigo completo, e embora alguns deles sejam bastante complexos, voc pode editar tudo. Naturalmente, voc pode usar apenas as ferramentas visuais, no mnimo at voc se tornar um programador Delphi mais experiente. O termo ferramenta de mo dupla tambm significa que voc livre para alterar o cdigo produzido por voc e ento voltar s ferramentas visuais. No entanto voc precisa seguir algumas regras.

Analisando o cdigo fonte


Vamos dar uma olhada no que o Delphi gerou de nossas operaes anteriores. Toda ao tem um efeito - no cdigo Pascal, no cdigo do form, ou em ambos. Quando voc inicia um novo form, ele tem um cdigo fonte associado como mostrado na Figura 12. O arquivo chamado Unit1, usa (uses) algumas units e define um novo tipo de dado (uma classe) e uma nova varivel (um objeto desta classe). A classe chamada TForm1 e derivada de TForm. O objeto Form1, do novo tipo TForm1. Units so mdulos nos quais um programa Pascal dividido. Quando voc inicia um novo projeto, o Delphi gera um mdulo program e uma unit que define o form principal. A cada vez que voc adiciona um form ao programa, uma unit adicionada. Por padro, arquivos units tm extenso .PAS e arquivos program tem extenso .DPR. 17
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 12 Cdigo fonte de um form Se voc renomeou os arquivos como sugerimos no exemplo anterior, o cdigo muda um pouco, pois o nome da unit deve refletir o nome do arquivo. Se voc chamou o arquivo de u_principal.pas o cdigo ir comear assim:

Figura 13 Unit com novo nome Assim que voc comea a adicionar novos componentes, a declarao da classe form muda. Por exemplo, quando voc adiciona um boto ao form, a parte do cdigo fonte que define novos tipos de dados torna-se o seguinte:

Figura 14 Cdigo aps adicionar um boto Agora se a propriedade Name do boto for alterada para btnAlo, o cdigo muda para:

Figura 15 Cdigo aps alterar a propriedade Name do boto 18


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A alterao de outras propriedades no afeta o cdigo fonte. As propriedades de form e seus componentes so armazenadas em um arquivo de descrio de form separado (com extenso .DFM). Adicionar novos manipuladores de eventos tem maior impacto no cdigo. A cada vez que um novo manipulador de evento definido, uma nova linha adicionada definio de tipo de dado do form, um corpo de mtodo vazio inserido na implementation, e alguma informao armazenada no arquivo de descrio do form tambm como pode ser observado na Figura 16. Vale observar que h um nico arquivo para o cdigo inteiro do form, no apenas pequenos fragmentos. Naturalmente, o cdigo apenas uma descrio parcial do form. O cdigo fonte determina como o form e seus componentes reagem aos eventos. A descrio do form (o arquivo DFM) armazena os valores das propriedades do form e de seus componentes. Em geral, o cdigo fonte define as aes do sistema, e os arquivos form definem o estado inicial do sistema.

Figura 16 Cdigo com manipuladores de eventos 19


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A descrio textual do form


Como j falamos, junto com o arquivo PAS contendo o cdigo fonte, h outro arquivo descrevendo o form e suas propriedades, seus componentes e as propriedades dos componentes. Este o arquivo DFM, um arquivo texto ou binrio. Independente do formato, se voc carregar esse arquivo no editor de cdigo, ele ser convertido em uma descrio textual. Isto pode dar a falsa impresso que o arquivo DFM um arquivo texto, mas isso s ocorre se voc selecionar a opo correspondente. Voc pode abrir a descrio textual de um form simplesmente clicando com o boto direito no form em tempo de desenvolvimento e selecionado o comando View As Text. Isto fecha o form, salvando-o se necessrio, e abre o arquivo DFM no editor. Depois podemos voltar ao form selecionando o comando View As Form no menu. Nos dois casos o atalho ALT + F12 produz o mesmo efeito. Para entender o que armazenado no arquivo DFM, vamos dar uma olhada na listagem seguinte, que mostra a descrio textual do form do nosso programa exemplo.

Figura 17 Descrio textual do form Como se pode ver nesta listagem, a descrio textual de um form contm objetos (neste caso, dois) em diferentes nveis. O objeto frmPrincipal contm o objeto btnAlo, como possvel ver pela identao do texto. Cada objeto tem suas propriedades e alguns mtodos conectados a eventos (neste caso, OnClick).

20
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

O arquivo de projeto
Alm dos dois arquivos que descrevem um form (PAS e DFM), um terceiro arquivo vital para construir a aplicao. o arquivo de projeto Delphi (DPR). Este arquivo construdo automaticamente, e raramente voc precisa alter-lo, principalmente para pequenos programas. Se for necessrio alterar o comportamento de um projeto, h duas maneiras bsicas de fazer isso: Voc pode usar o Project Manager do menu View e mudar algumas opes, ou pode editar diretamente o arquivo de projeto.

Figura 18 Project Manager O arquivo de projeto na verdade um arquivo fonte Pascal, descrevendo a estrutura geral do programa e seu cdigo de execuo.

Figura 19 Cdigo fonte do arquivo de projeto Podemos visualizar esse arquivo atravs do comando de menu View | Project Source. Ou clicar no boto View unit na barra de ferramentas ou o comando de menu View | Units. Em qualquer das opes o Delphi mostra uma caixa de dilogo com uma

21
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

lista de arquivos fonte do projeto. Escolha o arquivo do projeto ou qualquer outro que lhe interesse visualizar.

22
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 2 O Ambiente Delphi


Em uma ferramenta de programao visual como o Delphi, o papel do ambiente muito importante, algumas vezes mais importante que a linguagem usada pelo compilador. Esta uma boa razo para explorarmos um pouco o ambiente Delphi. No discutiremos todas as caractersticas do Delphi nem todas as opes de menu. Em vez disso daremos uma viso geral e ajudaremos voc a explorar algumas partes do ambiente que no so bvias, e tambm daremos algumas dicas que podem ser teis.

Pedindo Ajuda
O primeiro elemento do ambiente que iremos explorar o sistema de ajuda. H basicamente duas maneiras de chamar o sistema de ajuda: selecionando o comando apropriado no menu ou escolhendo um elemento da interface ou poro de cdigo fonte e pressionando F1. Quando voc pressiona F1 o Delphi no faz uma busca exata na lista de ajuda. Em vez disso, ele tenta entender o que voc est querendo. Por exemplo, quando voc aciona F1 quando o curso est sobre o nome do componente Button1 no cdigo fonte, o sistema de ajuda automaticamente abre a descrio da classe TButton, pois provavelmente isso que voc est buscando. Esta tcnica tambm funciona quando voc d um novo nome ao componente. Isto significa que o Delphi procura o significado contextual da palavra para a qual voc procura ajuda. Voc pode achar quase tudo no sistema de ajuda, mas preciso saber o que procurar. Isto parece bvio, mas s vezes no . Gastando algum tempo explorando o sistema de ajuda ir ajudar voc entender a estrutura desses arquivos e aprender como achar a informao que voc precisa. Os arquivos de ajuda tm bastante informao tanto para iniciantes quanto para programadores avanados. Eles listam todos os mtodos e propriedades de cada componente, os parmetros de cada mtodo ou funo, e detalhes semelhantes, que so importantes enquanto se escreve o cdigo.

Menus e Comandos do Delphi


H basicamente trs maneiras de executar um comando no ambiente do Delphi: Usar o menu. Usar a barra de ferramentas. Usar os menus ativados pressionando o boto direito do mouse.

A seguir algumas sugestes para usar alguns comandos de menu. Algumas opes possuem botes na barra de ferramentas.

O menu File
New: abre uma caixa de dilogo com novos itens que podem ser adicionados ao projeto em desenvolvimento. Open: responsvel pela abertura dos projetos. Tambm abre units, forms e texto no Editor de Cdigo. 23
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Open Project: essa opo abre somente projetos (DPR) e pacotes (BPG). Reopen: atalho para a abertura dos ltimos projetos e arquivos abertos anteriormente. Save: salva o arquivo aberto no Editor de Cdigo. Save All: salva todas as alteraes ainda no salvas. Save Project As: salva o projeto com outro nome ou outro local. Close: fecha o arquivo aberto no Editor de Cdigo. Close All: fecha a aplicao inteira.

O menu Edit
Este menu tem algumas operaes que so tpicas, tais como Undo, Redo e os comandos Cut, Copy e Paste, mais alguns comandos especficos para as janelas do editor e de form. importante dizer que os comandos padro do menu Edit (e os atalhos Crtl + Z, Ctrl + X, Ctrl + C e Ctrl + V) funcionam tanto para texto quanto para componentes. Algumas diferenas devem ser observadas. Por exemplo, quando trabalhamos com texto, o primeiro comando do menu Edit Undo, mas quando trabalhamos com form, o primeiro comando Undelete. Voc deve ter observado que possvel copiar componentes do form para o editor e vice versa. O Delphi coloca componentes no Clipboard na sua descrio textual. Voc pode at editar a verso textual do componente, copiar o texto para o Clipboard, e ento col-lo de volta no form como um novo componente. Por exemplo, se voc colocar um boto em um form, copi-lo e col-lo em um editor, voc obter a seguinte descrio:

Figura 20 Descrio textual de um boto Agora se voc alterar o nome (Name) do objeto, rtulo (Caption) ou posio (Left e Top), ou ainda adicionar uma nova propriedade, essas mudanas podem ser copiadas e coladas de volta em um form. Exemplo de mudanas:
object btnAlo: TButton Left = 200 Top = 200 Width = 180 Height = 60 TabOrder = 0 Caption = 'My Button' Font.Name = 'Arial' end

Figura 21 Mudanas na descrio textual usando um editor qualquer Copiando a descrio acima e colando-a em um form ir criar um boto na posio especificada com rtulo My Button e fonte Arial. Para usar esta tcnica, voc 24
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

precisar saber editar a descrio textual de um componente, que propriedades so vlidas, e como definir os valores das propriedades, principalmente o tipo de dado. Quando o Delphi interpreta a descrio textual de um componente, ele tambm pode mudar os valores de outras propriedades relacionadas quelas que voc alterou, e pode tambm mudar a posio do componente no form, para que ele no fique sobreposto a outro. Voc pode ver como o Delphi modifica as propriedades do componente visualizando o form como texto:

Figura 22 Descrio textual do boto aps ser colado no form Como podemos constatar algumas propriedades automaticamente, para especificar propriedades de Fonte. foram adicionadas

O menu Search
Este menu tem alguns comandos padro tambm, tais como Search and Replace, e o Find in Files:

Figura 23 Comando Find in Files O comando Find in Files permite procurar uma string em todos os arquivos fonte de um projeto, todos os arquivos abertos ou todos os arquivos em um diretrio dependendo do boto marcado. O resultado da busca ser mostrado na rea de 25
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

mensagem no rodap da janela do editor de cdigo. Voc pode selecionar uma entrada para abrir o arquivo correspondente e saltar para a linha que contm o texto encontrado. O comando Incremental Search quando selecionado posiciona o cursor no editor de cdigo e voc pode digitar o texto diretamente na rea de texto. Quando voc digita a primeira letra o editor ir se mover para a palavra que inicia com essa letra, e assim por diante. O comando Go to Line Number desvia o editor para a linha que voc selecionar. O comando Find Error localiza erros de execuo. Quando voc est executando um programa e ocorre um erro fatal o Delphi mostra um nmero de endereo interno. Voc pode entrar esse valor na caixa de dilogo Find Error para o Delphi recompilar o programa e procurar o endereo especificado. Quando ele encontra o endereo, ele mostra a linha de cdigo fonte correspondente. Pode ser que o erro no esteja em uma linha do seu cdigo, mas sim em uma linha de cdigo de sistema ou de biblioteca. Neste caso o comando no consegue encontrar a linha que causou o erro.

O menu View
Muitos dos comandos View podem ser usados para mostrar janelas do ambiente Delphi, tais como Project Manager, Breakpoints e Components. Algumas dessas janelas so usadas durante a depurao e outras quando se est escrevendo cdigo. Os comandos da segunda parte do View tambm esto disponveis na barra de ferramentas. O comando Toggle Form/Unit (F12) usado para alternar entre o form que voc est trabalhando e seu cdigo fonte. Se voc usar uma janela de cdigo fonte grande o suficiente para conter bastante texto, voc usar com freqncia esse comando. O comando New Edit Window abre uma segunda janela do editor. a nica maneira de visualizar dois arquivos lado a lado no Delphi. Voc visualiza dois arquivos ou partes diferentes de um mesmo arquivo. Em Toolbars voc pode optar por ocultar barra de ferramentas e paleta de componentes, embora essa no seja uma deciso muito sensata, pois torna o uso do ambiente bastante desconfortvel.

O menu Project
Este menu tem comandos para gerenciar um projeto e compil-lo. Add to Project e Remove from Project so usados para adicionar ou remover forms ou arquivos fonte em Pascal ao projeto. O comando Compile constri ou atualiza o arquivo executvel, verificando que arquivos fonte foram modificados e compilando-os quando necessrio. Build All compila todos os arquivos fonte do projeto mesmo se eles no tiverem sido modificados desde a ltima compilao. Se voc quiser saber se a sintaxe do cdigo escrito est correta, mas no quer construir o programa, voc pode usar o comando Syntax Check. O comando Information mostra alguns detalhes da ltima compilao feita. A figura seguinte mostra as informaes relacionadas a um programa:

26
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 24 Informaes sobre um programa compilado Options usado para alterar opes do compilador e do ligador, opes da aplicao, e assim por diante. Quando voc altera opes de projeto, voc pode marcar a caixa Default para indicar que o conjunto de opes ser usado para novos projetos.

O menu Run
O menu Run deveria ser chamado Debug. Muitos de seus comandos so relacionados depurao, inclusive o prprio comando Run. Quando voc executa um programa no ambiente Delphi, ele executado sob o depurador integrado, a menos que esta opo esteja desabilitada em Environment. O comando Run um dos mais executados, pois o Delphi automaticamente recompila um programa antes de execut-lo, se o cdigo fonte tiver sido modificado. Voc pode optar por teclar F9 para compilar e executar um programa. O comando Parameters pode especificar parmetros a serem passados na linha de comando do programa que vai ser executado. Os comandos restantes so usados durante a depurao, para executar um programa passo a passo, definir breakpoints, observar valores de variveis e objetos e assim por diante. O Delphi possui outros menus e os menus locais que podem ser acionados atravs do boto direito do mouse. Quase todas as janelas do Delphi possuem seus menus locais com seus comandos relacionados.

Trabalhando com o Form Designer


Desenhar forms a parte central do desenvolvimento visual no ambiente Delphi. Cada componente colocado no form e cada propriedade definida so armazenadas em um arquivo que descreve o form (arquivo DFM) e tem algum efeito no cdigo fonte associado ao form (arquivo PAS). Quando voc inicia uma nova aplicao, o Delphi cria um form vazio, e voc pode comear a trabalhar com ele. Um projeto pode ter qualquer quantidade de forms. Quando voc trabalha com um form em tempo de projeto, voc est na verdade usando o Form Designer. Quando voc est trabalhando com um form, voc pode alterar suas propriedades, as propriedades de um de seus componentes, ou as propriedades de vrios componentes de uma vez. Para selecionar um form ou um de seus componentes voc simplesmente clica nele ou usa o Object Selector (a caixa combinada no Object Inspector), onde se pode ver o nome e tipo do objeto selecionado. Voc pode selecionar 27
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

mais de um componente, mantendo a tecla Shift pressionada enquanto clica o mouse, ou arrastando um retngulo de seleo em volta dos componentes no form. Quando voc seleciona mais de um componente no form, voc pode alinh-los ou dimension-los. Muitas das opes na caixa de dilogo Alignment so tambm disponveis na aba Alignment (acessvel atravs do comando View | Alignment Palette). Voc pode tambm abrir as caixas Tab Order e Creation Order para ajustar a ordem que os componentes visuais sero alcanados pela tecla Tab e a ordem de criao dos componentes no visuais.

Figura 25 Environment Options Alm de comandos especficos de menus locais, possvel ajustar algumas opes de form usando o comando Tools | Environment Options e escolhendo a aba Designer. As opes relacionadas a form referem-se a ativao e dimensionamento da grade. A grade torna mais fcil colocar componentes exatamente onde se quer no form, ajustando depois seu tamanho e posio. Sem a grade torna-se difcil alinhar dois componentes manualmente. H duas alternativas para ajustar a posio de um componente: ou voc pode ajustar os valores das propriedades Left e Top, ou voc usar as setas enquanto mantm a tecla Crtl pressionada. O uso das setas possibilita o ajuste fino da posio. Similarmente, voc pode usar as setas juntamente com a tecla Shift para fazer o ajuste fino do tamanho do componente. Shift + Ctrl + setas faz o componente se mover em intervalos da grade.

28
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A Paleta de Componentes
Para adicionar um componente ao form, voc pode clicar no componente em uma das pginas da paleta de Componentes e ento clicar no form para colocar o novo componente. No form voc pode pressionar o boto esquerdo e arrastar o mouse para ajustar a posio e o tamanho do componente ao mesmo tempo, ou apenas clique para deixar o Delphi usar o tamanho padro. Cada aba da paleta tem um grupo de componentes, cada componente tem um cone e um nome que aparece em uma dica (hint). Para ver a dica apenas passe o mouse pelo boto e espere um segundo. As dicas mostram o nome oficial do componente. So formados pelos nomes das classes que definem os componentes sem o T inicial (por exemplo, se a classe TButton, o nome Button). Para inserir mais de um componente de um mesmo tipo no form, clique no componente na paleta com a tecla Shift pressionada. Assim, cada vez que voc clica no form o Delphi adiciona um novo componente deste tipo. Para encerrar a operao clique o boto com a seta (seletor padro) esquerda da paleta de componentes. Se voc estiver sem mouse voc pode adicionar um componente usando o comando View | Component List. Selecione um componente na lista e clique no boto Add to form.

O Object Inspector
Quando voc est desenhando um form, voc usa o Object Inspector para ajustar valores de propriedades de form ou componentes. Suas abas listam propriedades e seus valores, e eventos do componente selecionado, em duas janelas que podem ser redimensionadas. Um Object Selector no topo do Object Inspector indica o componente corrente e seu tipo de dado, e pode ser usado para mudar o componente selecionado. O Object Inspector no lista todas as propriedades de um componente. Inclui apenas as propriedades que podem ser alteradas em tempo de desenvolvimento. A coluna da direita do Object Inspector permite apenas a edio apropriada para o tipo de dado da propriedade. Dependendo da propriedade, voc poder inserir uma string ou nmero, escolher de uma lista de opes, ou chamar um editor especfico pressionando um boto elipse. Quando uma propriedade admite dois valores, como True ou False, voc pode alternar entre um valor e outro apenas com um duplo clique. Se h mais de dois valores, o duplo clique ir selecionar o prximo da lista. Para algumas propriedades, tais como Color, voc pode entrar um valor, selecionar um valor de uma lista ou chamar um editor especfico. Outras propriedades, tal como Font, podem ser customizadas ou expandindo suas subpropriedades (usando o sinal de mais ou menos prximo ao seu nome) ou invocando um editor. Em outros casos, tais como em listas de strings, os editores especiais so a nica maneira de alterar uma propriedade. Se por algum motivo o Object Inspector desaparecer, pressione F11 e ele ficar visvel de novo.

A Paleta de Alinhamento
A ltima ferramenta relacionada ao desenho de form a paleta Alignment. Voc pode abrir esta paleta com o comando View | Alignment Palette. Ou pode escolher o componente que deseja alinhar e ento selecionar o comando Align no menu local do form. A paleta de alinhamento apresenta comandos para posicionar controles, centraliz-los, espa-los igualmente, e assim por diante. 29
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Escrevendo cdigo no Editor


Depois que o form estiver desenhado, voc geralmente precisa escrever algum cdigo para responder a alguns de seus eventos. A cada vez que voc trabalha com um evento, o Delphi abre o editor com o arquivo relacionado ao form. Voc pode facilmente alternar entre o Form Designer e o editor de cdigo clicando no boto Toggle Form Unit na barra de ferramentas, clicando na janela correspondente, ou pressionando a tecla F12. O Delphi permite voc trabalhar com vrios arquivos fonte de uma nica vez, usando a metfora do bloco de notas com abas. Cada aba do bloco de notas corresponde a um arquivo diferente. Voc pode trabalhar com units relacionadas a forms, units independentes e arquivos de projetos; abrir arquivos de descrio de form no formato textual; e at trabalhar com arquivos texto quaisquer. Voc pode ir para a prxima aba do editor pressionando Ctrl + Tab, ou pressionando Shift + Ctrl + Tab para se mover no sentido contrrio. H vrias opes do ambiente que afetam o editor, muitas delas localizadas nas pginas Source Options, Display e Color da caixa de dilogo Editor Options no menu Tools. Na pgina Preferences de Environment Options voc pode ajustar a caracterstica Autosave. Salvar os cdigos fonte a cada vez que voc executa o programa pode prevenir perda de modificaes quando seu programa provocar travamento do sistema.

Usando marcadores de pgina


O editor tambm permite usar marcadores de pgina. Quando voc estiver em uma linha do editor, voc pode pressionar Ctrl + Shift mais uma tecla numrica de 0 a 9 para definir um novo marcador de pgina, que aparece como um pequeno bloco numerado na margem esquerda. A partir da voc pode teclar Ctrl mais a tecla numrica para retornar a essa linha. Para retirar a marca, posicione o editor na mesma linha marcada e pressione Ctrl + Shift + tecla numrica. Esses marcadores tm uma limitao que pode tornar seu uso um pouco difcil. Se voc criar um novo marcador usando um nmero j existente, o marcador anterior ser removido e inserido na nova linha. Outro comportamento desagradvel que voc pode adicionar mltiplos marcadores em uma mesma linha, mas apenas um deles ser visvel. Os marcadores no so salvos junto com o arquivo, s so vlidos enquanto o arquivo estiver aberto.

Code Insight
O editor tem vrias caractersticas conhecidas coletivamente como Code Insight. A idia principal desta tecnologia tornar mais fcil a escrita de cdigo tanto por programadores iniciantes quanto por programadores experientes. So quatro essas funcionalidades: O assistente de complementao de cdigo permite que voc escolha a propriedade ou mtodo de um objeto simplesmente procurando-o numa lista, ou digitando suas letras iniciais. Permite tambm que voc procure um valor apropriado para um comando de atribuio. O assistente de modelos de cdigo permite voc inserir um dos modelos predefinidos de cdigo, tal como um comando complexo com um bloco begin-end interno. possvel tambm definir novos modelos. 30
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

O assistente de parmetro de cdigo mostra em uma sugesto (hint) ou janela dica de contexto (tooltip) o tipo de dado de um parmetro de mtodo ou funo enquanto voc o est digitando. A avaliao de expresso dica de contexto uma caracterstica de tempo de depurao. Ela mostra o valor do identificador, propriedade ou expresso que est sob o cursor do mouse.

Complementao de cdigo
H duas maneiras de ativar esse assistente. Voc pode digitar o nome de um objeto, tal como Button1, adicionar um ponto, e esperar. O Delphi ir mostrar uma lista de propriedades e mtodos vlidos que podem ser aplicados a esse objeto. O tempo que voc precisa esperar para aparecer a janela com a lista de opes depende da opo Delay, que pode ser configurada na pgina Code Insight da janela de configuraes do editor em Editor Options. A segunda maneira de ativar o assistente consiste em digitar o nome do objeto seguido de ponto, as letras iniciais da propriedade ou mtodo e pressione Ctrl + espao. A lista ser mostrada imediatamente, mas agora, o assistente tentar adivinhar que propriedade ou mtodo voc est procurando atravs das letras iniciais digitadas. Esta combinao de teclas pode ser usada em um comando de atribuio. Se voc digitar x := e pressionar Ctrl + espao o Delphi mostrar uma lista de possveis objetos, variveis ou constantes que podem ser usados neste ponto do programa. As opes mostradas nessa lista so dinmicas. O Delphi est constantemente validando o cdigo digitado. Assim, se voc adicionar uma nova varivel ela ser mostrada na lista.

Modelos de cdigo
Diferente do assistente de complementao de cdigo, o assistente de modelos de cdigo deve ser ativado manualmente. Voc pode fazer isso teclando Ctrl + J para mostrar todos os modelos. Geralmente voc digita uma palavra chave, como if ou array, e ento pressiona Ctrl + J, para ativar apenas os modelos que iniciam com aquela palavra. Para algumas palavras chave existem vrios modelos, todos iniciando com a mesma palavra chave (tais como ifA ou ifB). Assim, se voc pressionar Ctrl + J voc ver todos os modelos relacionados quela palavra chave. Voc pode usar esse assistente para dar um nome a uma expresso comum usando a pgina Code Insight. Por exemplo, se voc usa com freqncia a funo MessageDlg, voc pode entrar um novo modelo chamado mess, digite uma descrio e ento adicione o seguinte texto: MessageDlg('|', mtInformation, [mbOk], 0); Agora toda vez que voc precisar criar uma caixa de mensagem, voc apenas digita mess e pressiona Ctrl + J, e o texto completo ser mostrado. A linha vertical indica a posio para onde o cursor ser movido depois que o Delphi mostrar o texto. Como pudemos ver esse assistente no est relacionado a palavras chave da linguagem, mas um mecanismo geral.

31
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Parmetros de cdigo
A terceira tecnologia Code Insight que ser discutida o assistente de parmetros de cdigo. Com esse recurso digitamos o nome da funo e o abre parnteses, os parmetros e tipos de dados aparecem em uma janela de dica.

Figura 26 Assistente de Parmetros de Cdigo Observe que o primeiro parmetro aparece em negrito. Depois que voc digita o primeiro parmetro, o segundo fica em negrito e assim por diante. Isso til para funes com muitos parmetros. Esse assistente tambm funciona para as funes que voc cria.

Gerenciando Projetos
Vamos estudar maneiras de alterar caractersticas de um projeto usando as opes Project Manager e Project Options.

O Project Manager
Quando um projeto carregado voc pode selecionar a opo View | Project Manager para abrir uma janela de projeto. A janela lista todos os forms e units que fazem parte do projeto. Os menus locais de Project Manager permitem fazer uma srie de operaes sobre um projeto, tais como adicionar arquivos novos ou existentes, remover arquivos, ver um arquivo de cdigo fonte ou form, e adicionar o projeto ao repositrio. Muitos desses comandos esto disponveis na barra de ferramentas dessa janela:

Figura 27 Project Manager

32
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Ajustando opes de Projeto


A partir do Project Manager (ou do menu Project) voc pode chamar o dilogo Project Options. A primeira pgina de Project Options, chamada Forms, lista os forms que podem ser criados automaticamente na inicializao do programa (comportamento padro) e os forms que podem ser criados manualmente pelo programa. Um form pode facilmente ser movido de uma lista para outra. A prxima pgina, Application, usada para definir o nome da aplicao e o nome do arquivo de ajuda e tambm escolher o cone. Outras opes dizem respeito ao compilador e linkeditor, informao de verso e o uso de pacotes de tempo de execuo. Todas as opes de projetos so salvas automaticamente com o projeto em um arquivo com a extenso DOF. um arquivo texto que pode facilmente ser editado. Este arquivo no pode ser excludo se voc modificar alguma opo padro.

Compilando um Projeto
H vrias maneiras de compilar um projeto. Se voc execut-lo (pressionando F9 ou clicando no boto da barra de ferramentas) o Delphi ir compil-lo primeiro. Quando o Delphi compila um projeto, ele compila apenas os arquivos que foram modificados. Selecionando Build All, todos os arquivos so compilados mesmo se no tiverem sido alterados. Isso no faz muito sentido, pois o Delphi sabe o que precisa compilar, mas quando voc altera alguma opo de projeto Build All deve ser usado para que as alteraes tenham efeito. O projeto lista os arquivos de cdigo fonte e os forms relacionados. A lista visvel tanto nos fontes do projeto quanto no Project Manager, e usado para compilar ou reconstruir um projeto. Cada arquivo de cdigo fonte transformado em uma unit compilada Delphi, um arquivo com o mesmo nome do cdigo fonte, mas com a extenso DCU. Quando o cdigo fonte do projeto compilado, as units que formam o projeto so linkados no arquivo executvel junto com o cdigo da biblioteca Visual Component Library (VCL). Voc pode entender melhor os passos da compilao e acompanhar o que acontece durante esta operao se voc habilitar a opo Show Compiler Progress. Voc encontrar esta opo na pgina Preferences da caixa de dilogo Environment Options. Isso torna a compilao um pouco mais lenta, a janela possibilita ver que cdigo fonte est sendo compilado.

Figura 28 Compilador em andamento

33
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Explorando um Programa Compilado


Delphi oferece vrias ferramentas que podem ser usadas para explorar um programa compilado, incluindo o depurador e o Object Browser.

O Depurador Integrado
O Delphi tem um depurador integrado com vrias caractersticas, e no necessrio fazer muita coisa para us-lo. Cada vez que voc executa um programa no ambiente Delphi, ele executado por padro no depurador. Isso significa que voc pode determinar um ponto de parada (breakpoint) de execuo do programa em uma linha de cdigo especfica. Por exemplo, abra o programa Alo criado no Captulo 1 e d um duplo clique no boto para abrir o editor no cdigo relacionado. Agora crie um ponto de parada clicando na margem do editor, escolhendo o comando Toggle Breakpoint no menu local do editor ou pressionando F5.

Figura 29 Ponto de parada (Breakpoint) O editor ir destacar a linha onde voc inseriu o ponto de parada, mostrando-a em uma cor diferente. Agora o programa pode ser executado normalmente, mas toda vez que voc clicar no boto o depurador ir parar a execuo do programa, mostrando a linha de cdigo correspondente. Voc pode executar esta e as linhas seguintes passo a passo, inspecionando as funes chamadas ou continuando a execuo do programa. Quando o programa parado voc pode inspecionar seu estado em detalhes. Embora haja muitas maneiras de inspecionar um valor, a maneira mais simples a Avaliao de Expresses Dica de Contexto. Simplesmente passe o mouse sobre o nome de qualquer varivel e voc ver seu valor em uma janela de dica.

O Object Browser
Depois que o programa compilado, voc pode executar o Object Browser (disponvel atravs do comando de menu View | Browser) para explor-lo, mesmo que voc no o esteja executando o depurando-o. Esta ferramenta permite que voc veja todas as classes definidas pelo programa (ou pelas units usadas direta ou indiretamente pelo programa), todas as variveis e nomes globais, etc. Para cada classe, o Object Browser mostra a lista de propriedades, mtodos e variveis - locais e herdadas, privadas e pblicas. A informao mostrada no Object Browser pode no significar muito se voc ainda no est familiarizado com a linguagem Object Pascal usada pelo Delphi.

34
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Os Arquivos produzidos pelo Sistema


Como j vimos, o Delphi produz uma srie de arquivos para cada projeto, e voc deve saber como so nomeados e o que eles guardam. Basicamente h dois elementos que tm impacto na forma como os arquivos so nomeados: os nomes que voc d ao projeto e seus forms, e as extenses predefinidas usadas pelo Delphi para os arquivos que voc escreve e para aqueles gerados pelo sistema. A grande vantagem do Delphi sobre outros ambientes de programao visual que muitos dos arquivos de cdigo fonte so arquivos texto ASCII. J vimos o cdigo fonte Pascal, cdigo do projeto e arquivos de descrio de form no Captulo 1. Agora vamos dar uma olhada nos arquivos de opes e desktop. Ambos os arquivos usam estrutura similar aos arquivos INI do Windows, nos quais cada seo indicada pelo nome entre colchetes. Por exemplo, veja um fragmento de ALO.DOF do projeto Alo na Figura 30. A mesma estrutura usada pelos arquivos desktop, que geralmente so mais longos. bom dar uma olhada no que armazenado nesses arquivos para entender seu papel. Em resumo, um arquivo desktop (.DSK) lista as janelas Delphi, indicando suas posies e estados. Por exemplo, a descrio da janela principal pode ser visualizada na Figura 31.

Figura 30 Fragmento de ALO.DOF

35
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 31 Arquivo desktop (.DSK) Alm de opes do ambiente e posies de janela, o arquivo desktop contm uma srie de listas de histrico, indicao dos pontos de parada atuais, mdulos ativos, mdulos fechados e forms.

36
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 3 Bsicos

Conhecendo

os

Componentes

Agora que j conhecemos um pouco o ambiente Delphi, j entendemos a estrutura de uma aplicao, j criamos um pequeno programa, estamos prontos para ir para a parte principal do ambiente de programao: o uso de componentes. Esta a caracterstica chave deste ambiente: programao visual usando componentes. O sistema vem com uma srie de componentes prontos para uso. No sero descritos aqui todos os componentes em detalhes com suas propriedades, mtodos e eventos. Se voc precisar de mais informao, isso pode ser facilmente encontrado no sistema de ajuda. Neste captulo usaremos exemplos bastante simples para focar em apenas algumas caractersticas mais importantes. Iniciaremos dando destaque a um grupo de componentes bsicos, tais como botes, rtulos, caixas de listas, campos de edio e outros controles relacionados. A maioria dos componentes que so discutidos neste captulo est presente na aba Standard da paleta de componentes.

Componentes do prprio Windows


De onde vem a idia de programar para Windows usando componentes? A resposta simples: o prprio Windows possui alguns componentes, geralmente chamados controles. Um controle tecnicamente uma janela predefinida com um comportamento especfico, algumas propriedades e alguns mtodos. Esses controles foram o primeiro passo em direo ao desenvolvimento por componentes. O segundo passo foi provavelmente os controles do VisualBasic e o terceiro passo so os componentes do Delphi. Os controles de sistema padro so os componentes bsicos de cada aplicao Windows, independente da linguagem de programao usada para escrev-la, e so bem conhecidos por todos os usurios do Windows. O Delphi literalmente empacota esses controles predefinidos do Windows em alguns de seus componentes bsicos, inclusive os que sero discutidos neste captulo. TWinControl a classe base de todos os componentes ajanelados do Delphi. Esses componentes podem receber foco, podem conter outros controles e tm um manipulador de janela.

Propriedades, eventos e mtodos


Propriedades so um tipo especial de campo de um componente, que definem suas caractersticas. Valores de algumas propriedades podem ser alterados pelo Object Inspector em tempo de desenvolvimento. Outras propriedades s podem ser modificadas em tempo de execuo. Eventos acontecem em resposta a uma ao do usurio ou do prprio sistema. Ao programar um mtodo de evento devemos levar em considerao que este s ser executado quando o evento acontecer. Uma das tarefas mais importantes da programao orientada a eventos determinar quais eventos sero usados e qual a ordem que esses eventos acontecem. 37
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Os mtodos realizam aes definidas pelo componente, representam o comportamento do componente. So procedimentos e funes definidos dentro da classe, e por isso podem acessar diretamente as propriedades do componente sem que necessitem ser passados como parmetros.

Iniciando uma nova Aplicao


J vimos no Captulo 1 que, quando o Delphi aberto, automaticamente, iniciada uma nova aplicao. Vejamos outra maneira de criar uma nova aplicao. Vamos usar o menu File. Clique depois em New e a seguir em Application. Se houver uma aplicao aberta, nesse momento, o Delphi perguntar se voc deseja salvar o projeto. Confirme se for o caso, e uma nova aplicao ser iniciada, com um form pronto para ser desenhado. A primeira ao a ser feita salvar nosso projeto para nomear os arquivos. Para isso vamos usar o comando File | Save All. Esse comando ir salvar os arquivos de unit e de projeto (DPR). Inicialmente ele pede que seja informado o nome da unit. Tenha o cuidado de escolher uma pasta para o seu programa e salvar cada nova unit nesta mesma pasta. Vamos digitar u_exemplo1 e pressionar o boto Salvar. Em seguida ele pede o nome do projeto. Digite Exemplo1 e pressione o boto Salvar. Nosso programa ser um cadastro de dados pessoais. Os dados a serem cadastrados so: nome, idade, profisso, escolaridade, sexo e situao cadastral.

Propriedades de Form (TForm)


Antes de inserir qualquer componente no novo form, vamos modificar algumas de suas propriedades usando o Object Inspector. Lembre que o Object Inspector mostra propriedades e eventos do componente que estiver selecionado. O quadro abaixo apresenta as propriedades que sero modificadas, os valores a serem definidos e a descrio de cada uma. So mostrados tambm os mtodos e eventos mais importantes. H muitas outras propriedades, mas essas so as bsicas. Propriedade +BorderIcons biMaximize BorderStyle Caption Color Height Icon Name Position Width WindowState Mtodo Close Show ShowModal Evento OnActivate Contedo False bsSingle Exemplo 1 clBtnFace 480 HandShak.ico frmExemplo1 poScreenCenter 640 wsNormal Descrio Desabilita o boto maximizar Borda simples, tamanho fixo Legenda da barra de ttulos Cor padro de fundo da tela Altura da tela em pixels cone da barra de ttulos da janela Identificador da janela Posiciona a janela no centro da tela Largura da tela em pixels Abre a tela no tamanho original Descrio Fecha a janela Abre a janela Abre a janela, mas usurio precisa fech-la para continuar a aplicao Descrio Quando a janela recebe o foco 38
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

OnClose OnCloseQuery OnCreate OnShow

Quando a janela fechada Quando a janela fechada, mas o usurio pode impedir o seu fechamento Quando o form criado Quando a janela aberta Quadro 1 Propriedades, mtodos e eventos de Form

Para modificar a propriedade biMaximize, clique no sinal de + ao lado de BorderIcons para expandir suas subpropriedades e defina o novo valor. Para carregar o cone da propriedade Icon, clique no boto elipse (aquele com os trs pontos) e depois no boto Load para escolher o cone em C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Icons. Por enquanto no programaremos nenhum evento.

Utilizando um Boto (TButton)


O Delphi disponibiliza alguns tipos de boto. Vamos selecionar o boto da paleta Standard e inseri-lo no form recm criado.

Figura 32 Boto recm inserido Iremos alterar as propriedades do boto que foi inserido. O quadro abaixo mostra as propriedades e os valores a serem definidos, alm de mtodos e eventos mais usados. Note que na propriedade Caption ns inserimos um & (ampersand) antes da letra F. Este recurso define uma tecla de atalho sublinhada. Desta forma o boto pode ser pressionado usando apenas o teclado. Simplesmente pressione a letra F e o boto ser pressionado. Propriedade Caption Default Enabled Contedo &Fechar False True Descrio Legenda do boto Evento OnClick no executado se Enter for pressionado Habilita o boto 39
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Height ModalResult Name Width Mtodo Click Evento OnClick OnEnter

Altura do boto Determina se e como o form ser fechado Identificador do boto Largura do boto Descrio Simula um clique de mouse como se o usurio tivesse pressionado o boto Descrio Quando o usurio clica no boto Quando o boto recebe o foco Quadro 2 Propriedades, mtodos e eventos de Button

25 mrNone btnFechar 75

Aps definirmos as propriedades precisamos escrever o cdigo para que o boto tenha o comportamento que desejamos. Quando pressionarmos o boto Fechar, queremos que o form seja fechado. Para definir o comportamento do boto, vamos dar um duplo clique nele. O editor de cdigo ser aberto e vamos digitar o cdigo que realizar a ao.

Figura 33 Cdigo o evento OnClick de btnFechar Como desejamos que o form seja fechado quando clicarmos no boto, isso representa uma ao a ser realizada pelo form. Portanto devemos usar um mtodo que tenha esse comportamento, por isso escolhemos o mtodo Close, de acordo com o Quadro 1. Voc pode compilar seu programa e agora ele pode ser fechado usando o boto padro no canto superior direito ou o boto btnFechar que foi programado.

Aceitando entrada de dados do Usurio (TEdit)


J vimos que o usurio pode interagir com uma aplicao usando o mouse, ou o teclado em vez do mouse para selecionar um boto pressionando a tecla correspondente letra sublinhada no Caption. Alm desses casos, o Windows pode manipular entrada do teclado diretamente. O Delphi prov uma srie de controles para construir campos de edio e editores de texto. Dentre esses vamos utilizar o componente campo de edio (TEdit) da paleta Standard. Este componente permite que o usurio digite apenas uma linha de texto. Mais adiante usaremos um componente que possibilita a entrada de mais de uma linha. Selecione ento esse componente e insira-o no form. Esse primeiro campo de edio que estamos inserindo ser utilizado para entrada do nome da pessoa em nosso cadastro de dados pessoais.

40
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 34 Componente TEdit Da mesma forma que procedemos com os outros componentes iremos alterar algumas propriedades desse componente. A seguir apresentamos um quadro com propriedades, eventos e mtodos de TEdit. Propriedade CharCase Height Name PasswordChar Text Width Mtodo Clear SetFocus Evento OnChange OnEnter OnExit Descrio No faz nenhum tipo de converso no que digitado. ecUpperCase converte tudo para maisculas 21 Altura da caixa de texto edNome Identificador da caixa de texto #0 Define qual caractere ser usado para ocultar o texto digitado. #0 no oculta o texto digitado Retorna o que foi digitado pelo usurio. Seu contedo deve ser apagado 400 Largura da caixa de texto Descrio Limpa o contedo de Text Muda o foco para o controle Descrio Quando o texto modificado Quando o controle recebe o foco Quando o foco sai do controle e vai para outro Quadro 3 Propriedades, mtodos e eventos de Edit Contedo ecNormal

Identificando Componentes (TLabel)


Rtulos so apenas texto, ou comentrios, escritos em um form. Geralmente o usurio no interage com rtulos - pelo menos no diretamente. No faz muito sentido clicar em um rtulo, embora no Delphi isso seja tecnicamente possvel. Nem todo texto

41
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

que vemos em um form corresponde a um rtulo. O mtodo TextOut de form pode apresentar um texto. Usamos rtulos para descrever outros componentes, tais como campos de edio e caixas de lista ou combo, pois eles no tm ttulo. O Delphi implementa rtulos como componentes grficos, no ajanelados. Vamos ento inserir um rtulo no nosso form. Selecione o rtulo na paleta Standard e insira-o ao lado esquerdo do campo de edio conforme mostrado na figura seguinte. Altere suas propriedades de acordo com o Quadro 4:

Figura 35 Componente TLabel Propriedade Alignment AutoSize Caption FocusControl Name WordWrap Evento OnClick Contedo taLeftJustify True Descrio Texto justificado esquerda Define se o controle ser automaticamente redimensionado para acomodar o texto &Nome Legenda do rtulo edNome Define qual componente receber o foco quando for selecionada a tecla de atalho sublinhada da legenda lblNome Identificador do rtulo False Se AutoSize estiver False, define se o texto poder utilizar retorno automtico (quebra de linha) no caso de ultrapassar a largura definida Descrio Quando o usurio clica no rtulo Quadro 4 Propriedades e eventos de Label

Observe que na legenda do componente, a exemplo da legenda do boto, foi inserido um & para definir uma tecla de atalho sublinhada. No caso do rtulo quando

42
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

pressionamos esta tecla o foco ser mudado para o controle definido na propriedade FocusControl.

Fazendo escolhas (TCheckBox, TRadioButton e TRadioGroup)


H dois controles do Windows que permitem ao usurio escolher diferentes opes. O primeiro a caixa de verificao (TCheckBox), que corresponde a uma opo que pode ser selecionada livremente. O segundo controle o boto de rdio (TRadioButton), que corresponde a uma seleo exclusiva. Por exemplo, se voc tiver dois botes de rdio com rtulos A e B, voc pode selecionar um dos dois, mas no ambos ao mesmo tempo. A outra caracterstica que a escolha de uma das opes obrigatria. Selecione uma caixa de verificao na paleta Standard e insira-o no form. Usaremos a caixa de verificao para definir a situao cadastral da pessoa - pode assumir a situao Ativo se a caixa estiver marcada e No ativo, caso contrrio. No Quadro 5 abaixo podemos ver as propriedades, mtodos e eventos de TCheckBox.

Figura 36 Componente TCheckBox Propriedade Caption Checked Name State Evento OnClick OnEnter Descrio Legenda da caixa de verificao Especifica se o controle est marcado Identificador da caixa de verificao Indica se o controle est selecionado, no selecionado ou parcial Descrio Quando o usurio clica no controle Quando o controle recebe o foco Quadro 5 Propriedades, mtodos e eventos de CheckBox Contedo Situao False chxSituacao cbUnchecked

43
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Vamos inserir um componente para selecionarmos o sexo da pessoa que est sendo cadastrada. Nesse caso precisamos de um componente que possibilite mais opes. Usaremos ento o grupo de botes de rdio (TRadioGroup). Grupo de botes de rdio permite que sejam inseridos vrios botes, cada um com uma opo. Selecione o grupo de botes de rdio da paleta Standard e o insira no form.

Figura 37 Componente TRadioGroup Vamos alterar algumas propriedades deste componente. No quadro a seguir so apresentadas algumas propriedades, mtodos e eventos de TRadioGroup. Propriedade Caption Columns Height ItemIndex Items Name Width Mtodo SetFocus Evento OnClick OnEnter OnExit Contedo Sexo 1 90 0 Masculino Feminino rgSexo 185 Descrio Legenda do grupo de botes de rdio Nmero de colunas em que as opes do grupo de botes so apresentadas Altura do controle Define o item selecionado (primeiro item 0) Lista de opes

Identificador do grupo de botes de rdio Largura do grupo de botes de rdio Descrio Muda o foco para o controle Descrio Quando o controle clicado Quando o controle recebe o foco Quando o foco sai do controle e vai para outro Quadro 6 Propriedades, mtodos e eventos de RadioGroup

Para definir a lista de opes, clique no boto elipse no lado direito da propriedade Items no Object Inspector. Ser aberto o editor de String List. Digite uma 44
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

opo em cada linha e confirme pressionando o boto Ok. A propriedade Items do tipo TStrings e ser utilizada em outros componentes, com o mesmo nome ou no.

Uma Lista com muitas escolhas (TListBox)


Se voc precisar de muitas opes os botes de rdio no so apropriados, a menos que voc tenha um form realmente grande. No se deve usar mais que 5 ou 6 botes de rdio. A soluo usar caixas de lista (TListBox). Uma caixa de lista pode manter um grande nmero de opes em um pequeno espao, pois ela tem uma barra de rolagem para mostrar na tela apenas uma pequena parte da lista completa. Outra vantagem que podemos facilmente adicionar ou remover elementos da lista. Caixas de lista tambm podem permitir uma nica escolha ou mltiplas escolhas. A caixa de lista usada em nossa aplicao servir para a definio da profisso do cadastro de dados pessoais. Selecione a caixa de lista da paleta Standard e o insira no form conforme a figura mostrada a seguir. Insira um rtulo tambm.

Figura 38 O Componente ListBox Vamos alterar algumas propriedades do controle. No quadro abaixo mostramos algumas propriedades, mtodos e eventos de TListBox. Propriedade Columns Height ItemIndex Items MultiSelect Name Sorted Contedo 0 80 0 False lbxProfissao True Descrio Nmero de colunas mostradas sem precisar rolar horizontalmente Altura do controle Define o item selecionado (primeiro item 0) Lista de opes Define se o usurio pode selecionar mais de um item Identificador da caixa de lista Define se os elementos sero ordenados 45
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Width Mtodo Clear SetFocus Evento OnClick OnEnter OnExit

Largura da caixa de lista Descrio Deleta os itens da caixa de lista Muda o foco para o controle Descrio Quando o controle clicado Quando o controle recebe o foco Quando o foco sai do controle e vai para outro Quadro 7 Propriedades, mtodos e eventos de ListBox

121

Na propriedade Items insira os seguintes elementos: Carpinteiro, Analista de Sistemas, Arquiteto, Enfermeiro, Engenheiro, Pedreiro e Professor. No rtulo que foi inserido defina Name com lblProfissao e Caption com Profisso.

Muitas opes em pouco espao (TComboBox)


Caixas de lista ocupam muito espao na tela e suas opes so fixas, no dando ao usurio a oportunidade de escolher uma opo diferente daquelas previamente programadas. Podemos solucionar essas dificuldades usando caixas combinadas (TComboBox). Uma caixa combinada rene em um mesmo controle uma caixa de edio, onde se pode digitar algum texto, e uma caixa de lista que aberta quando pressionamos a seta. O prprio nome do controle sugere que ele a combinao de dois componentes, um Edit e um ListBox. No entanto, o comportamento do ComboBox pode mudar, dependendo do valor da propriedade Style. Veremos um pouco mais adiante como definir corretamente esta propriedade para que o componente tenha o comportamento desejado. Vamos usar uma caixa combinada para definir a escolaridade no cadastro de dados pessoais. Selecione o componente na paleta Standard e o posicione no form conforme a figura. Coloque um rtulo tambm para identificar a caixa.

Figura 39 Componente ComboBox 46


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Vamos ento modificar algumas propriedades deste componente. No quadro a seguir so apresentadas algumas de suas propriedades, mtodos e eventos. A propriedade Style pode assumir os seguintes valores: csDropDown define uma caixa combinada tpica que permite edio e mostra uma caixa de lista para escolha de opo. csDropDownList define uma caixa combinada que no permite edio. Se for pressionada uma letra, o controle mostra a primeira opo que ele encontra iniciando com essa letra. csSimple define um controle que permite edio e sempre mostra a caixa de lista. A altura da caixa depende da propriedade Height.

Existem outros valores para essa propriedade, mas apenas essas so de nosso interesse. Propriedade ItemIndex Descrio Define o item selecionado (primeiro item 0). No pode ser alterado em tempo de desenvolvimento Items Lista de opes Name cbxProfissao Identificador da caixa combinada Sorted True Define se os elementos sero ordenados Style csDropDown Define o estilo de apresentao da caixa Text Retorna o que foi selecionado ou digitado Mtodo Descrio Clear Deleta os itens da caixa combinada SetFocus Muda o foco para o controle Evento Descrio OnChange Quando o contedo do controle modificado OnClick Quando o controle clicado OnEnter Quando o controle recebe o foco OnExit Quando o foco sai do controle e vai para outro Quadro 8 Propriedades, mtodos e eventos de ComboBox Na propriedade Items inclua os seguintes elementos: Analfabeto, Fundamental, Mdio, Superior e Ps-graduao. Para o rtulo que foi inserido defina Name como lblEscolaridade e Caption como Escolaridade. Contedo

Escolhendo um valor em um intervalo (TScrollBar)


Vamos explorar agora o controle chamado barra de rolagem (TScrollBar). Barras de rolagem so normalmente associados com outros componentes, tais como caixas de lista. Nesses casos a barra de rolagem parte do componente, uma propriedade sua. O uso de barras de rolagem muito raro, exceto quando a faixa de valores a ser escolhida muito grande, pois existe o TTrackBar para intervalos menores. Iremos usar a barra de rolagem para definir a idade da pessoa no cadastro.

47
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Selecione ento uma barra de rolagem na paleta Standard e o insira no form conforme mostrado na figura abaixo. Coloque um rtulo para identificar o componente.

Figura 40 Componente ScrollBar Vejamos as propriedades deste componente que sero modificadas. No quadro seguinte so apresentadas propriedades, mtodos e eventos de ScrollBar. Propriedade Kind Descrio Especifica se o controle ser horizontal ou vertical LargeChange 10 Especifica quanto Position varia quando o usurio clica nos lados da barra Max 100 Especifica a posio mxima Min 1 Especifica a posio mnima Name sbIdade Identificador da barra de rolagem Position 1 Indica a posio atual da barra SmallChange 1 Especifica quanto Position varia quando o usurio clica nas setas Mtodo Descrio SetFocus Muda o foco para o controle Evento Descrio OnChange Quando posio da barra modificada OnScroll Quando a barra rolada OnEnter Quando o controle recebe o foco OnExit Quando o foco sai do controle e vai para outro Quadro 9 Propriedades, mtodos e eventos de ScrollBar No rtulo que foi inserido, modifique a propriedade Name para lblIdade e a propriedade Caption para Idade. Contedo sbHorizontal

48
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Agrupando componentes relacionados (TGroupBox)


TGroupBox usado para agrupar componentes que se relacionam. Usaremos este componente para colocar dentro um componente do tipo TMemo. Selecione o GroupBox na paleta Standard e insira-o no form.

Figura 41 Componente GroupBox Basicamente alteraremos a as propriedades Name e Caption. Defina Name como gbDados e Caption como Dados Pessoais.

Entrando mltiplas linhas (TMemo)


Vimos antes, que o componente TEdit permite a entrada de uma nica linha de texto. Para possibilitar a entrada de mais de uma linha de texto usaremos o componente memorando (TMemo). Selecione o componente Memo da paleta Standard e o insira no form dentro do GroupBox, como mostrado na figura abaixo.

49
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 42 Componente TMemo Usaremos este componente para mostrar todos os dados pessoais cadastrados quando for pressionado o boto correspondente. Assim, precisamos modificar algumas propriedades de Memo. No quadro a seguir so apresentadas propriedades, mtodos e eventos de Memo. Propriedade Align Lines Name ReadOnly Mtodo Clear SetFocus Evento OnChange OnEnter OnExit Descrio Determina como o controle se alinha dentro do seu continer Contm as linhas de texto do controle memDados Identificador do memorando True Define se o usurio pode editar o texto do controle Descrio Deleta as linhas de texto do memorando Muda o foco para o controle Descrio Quando o texto no controle modificado Quando o controle recebe o foco Quando o foco sai do controle e vai para outro Quadro 10 Propriedades, mtodos e eventos de Memo Contedo alClient

O continer do controle Memo o GroupBox. Dessa forma, quando definimos a propriedade Align como alClient, o memorando se ajusta para caber dentro de seu controle pai. A propriedade Lines do tipo TStrings, portanto possui propriedades e mtodos particulares que sero abordados posteriormente. Por enquanto entre no editor da propriedade Lines e delete a linha existente. Memorandos podem ser usados para entrada de dados atravs do teclado, mas no nosso caso ele ser usado para receber os dados programaticamente. Por isso definimos a propriedade ReadOnly como True, para que o usurio no possa alterar o texto.

50
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Juntando tudo
Insira um novo boto no form. Esse boto, quando pressionado, mostrar os dados pessoais no campo Memo. Defina a propriedade Caption como Salvar, Default como True e Name como btnSalvar. Observe na Figura 43 a seguir como deve ficar o form aps a incluso de um novo boto. A definio da propriedade Default como True indica que, se o usurio pressionar a tecla Enter, o evento OnClick ser executado. Agora iremos escrever o cdigo que far todo o trabalho para ns. Como vimos no nosso primeiro programa, se queremos que a ao acontea quando pressionarmos o boto, ento deveremos programar o evento OnClick do boto. D um duplo clique no boto e o editor de cdigo ser aberto para inserirmos o cdigo. Vamos analisar cada linha do cdigo mostrado na Figura 44. Para facilitar a anlise ns numeramos cada linha com um comentrio. Iniciaremos pela linha 1. Esta linha responsvel por deletar as linhas do memorando, conforme descrio do mtodo Clear no Quadro 10. Dessa forma toda vez que inserirmos os dados de uma nova pessoa e pressionarmos o boto btnSalvar, os dados anteriores so apagados. Observe que, para chamar um mtodo de um componente, informamos o nome do componente seguido do nome do mtodo separados por ponto. A propriedade Lines do componente Memo um objeto do tipo TStrings, portanto possui propriedades e mtodos. Dos mtodos disponveis de Lines usaremos Add, para adicionar novas linhas ao texto do controle.

Figura 43 Form com a boto btnSalvar Na linha 2 do cdigo da Figura 44 o nome da pessoa adicionada ao texto. Observe a forma de invocarmos o mtodo Add. Add um mtodo de Lines, e Lines uma propriedade de mmDados. O argumento do mtodo deve ser uma string. Como argumento usamos um literal, que identifica o dado da linha de texto, concatenado ao nome da pessoa, que dado pela propriedade Text do componente edNome. A terceira linha semelhante segunda, no merece maiores comentrios.

51
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 44 Cdigo do evento OnClick do boto btnSalvar A profisso da pessoa adicionada na linha 4. As profisses esto na propriedade Items de lbxProfissao. O ndice do elemento selecionado no ListBox dado pela propriedade ItemIndex. Items pode ser tratado como um vetor indexado por ItemIndex. Por isso a linha 4 escrita dessa forma. Na linha 5 adicionamos a idade da pessoa, definida pela propriedade Position de ScrollBar. Position uma propriedade numrica do tipo integer. Antes de concatenar seu valor necessrio convert-lo para string. Por isso usamos a funo IntToStr(), para converter um nmero inteiro para string. A linha 6 pode ser analisada de forma semelhante linha 4. Portanto no ser necessrio acrescentar nenhum comentrio a respeito. No caso da linha 7 e seguintes, o que se faz necessrio para mostrar o sexo da pessoa. Como a propriedade Checked do componente CheckBox boolean, usamos isso para implementar uma estrutura de deciso. Se Checked estiver marcado (True) ento ser mostrado sexo masculino, caso contrrio ser mostrado sexo feminino. TStrings, sendo uma classe, possui atributos e mtodos tambm. A seguir mostramos os membros mais usados. Note que a propriedade Items dos componentes TComboBox e TListBox, assim como Lines, de TMemo, tambm so do tipo TStrings. Propriedade Count Strings Text Mtodo Add AddStrings Clear Delete IndexOf Insert LoadFromFile SaveToFile Descrio Informa quantas linhas existem na lista Referencia as strings na lista atravs de sua posio. Sempre baseada em 0 Retorna as strings da lista como uma nica string onde cada linha finalizada com um Enter (LF) e um retorno de carro (CR) Descrio Adiciona uma string no final da lista Adiciona um TStrings na lista Deleta as linhas de texto da lista Deleta uma linha da lista usando sua posio Procura uma string na lista Insere uma string em uma posio especfica Preenche a lista com as linhas de um arquivo texto Salva a lista em um arquivo texto Quadro 11 Propriedades e mtodos de TStrings 52
Centro Universitrio Luterano de Santarm

Contedo

Linguagem de Programao Comercial

O Delphi, alm da funo IntToStr() que usamos no cdigo da Figura 44, tem outras funes para converso de dados que so mostradas no quadro a seguir: Funo Descrio StrToInt(const S: String) Converte um String para Inteiro IntToStr(value: Integer) Converte um Inteiro para String StrToFloat(const S: String) Converte um String para Ponto Flutuante FloatToStr(value: Extended) Converte um Ponto Flutuante para String DateToStr(date: TDateTime) Converte um TDateTime para String DateTimeToStr(date: TDateTime) Converte um TDateTime para String StrToDate(const S: String) Converte um String para TDateTime StrToDateTime(const S: String) Converte um String para TDateTime TimeToStr(time: TDateTime) Converte um TDateTime para String FormatFloat(const format: String; value: Formata um Ponto Flutuante retornando Extended) um String de acordo com o formato Quadro 12 Funes de converso de dados

53
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 4 Caixas de Dilogo


O Delphi oferece algumas caixas de dilogo pr-definidas que facilitam muito o desenvolvimento de aplicaes.

ShowMessage
Declarada internamente pelo Delphi da seguinte forma: procedure ShowMessage(const Msg: string); Onde o argumento uma string. Para experimentar a utilizao das caixas de dilogo vamos criar uma nova aplicao. Depois de iniciar a nova aplicao vamos modificar Name do form para frmDialogos, e Caption para Dilogos. Depois vamos salv-la. Vamos dar unit o nome de u_dialogos e ao projeto o nome Dialogos. Insira um boto, d a ele o nome de btnMensagem1 e em Caption coloque ShowMessage. Aumente a largura do boto, deixando a propriedade Width com o valor 100. Agora d um duplo clique no boto e quando abrir o editor de cdigo escreva: ShowMessage('Este texto ser mostrado'); Execute a aplicao e pressione o boto. A caixa de dilogo ser mostrada:

Figura 45 Caixa de dilogo ShowMessage Essa a caixa mais simples. Sua barra de ttulo sempre mostra o nome do projeto e apresenta apenas o boto OK.

MessageDlg
ShowMessage apenas mostra uma mensagem, no permite interao com o usurio. MessageDlg permite vrios tipos de dilogos e oferece recurso de resposta do usurio. Essa caixa de dilogo declarada pelo Delphi da seguinte forma: function MessageDlg(const Msg: TMsgDlgType; Buttons: TMsgDlgButtons; Word; string; HelpCtx: DlgType: Longint):

Onde: const Msg: string uma constante ou varivel do tipo string que contm a mensagem que ser mostrada na caixa de dilogo. DlgType: TMsgDlgType so cones que indicam o tipo da caixa de dilogo. Pode ser mtWarning (cone 'exclamao' amarelo), mtError (cone 'pare' vermelho), 54
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

mtInformation (cone 'i' azul), mtConfirmation (cone 'interrogao' verde) e mtCustom (no tem cone). Buttons: TMsgDlgButtons um array de botes que aparecem na caixa. Pode ser mbYes, mbNo, mbOk, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNotToAll, mbYesToAll e mbHelp. HelpCtx: Longint define o nmero do help de contexto. Por padro 0. O retorno da funo a informao do boto pressionado pelo usurio. Assim, apenas troque mb por mr nos nomes dos botes, para verificar o boto que foi clicado. Os possveis valores de retorno so mrYes, mrNo, mrOk, mrCancel, mrAbrot, mrRetry, mrIgnore, mrAll, mrNotToAll, mrYesToAll e mrHelp. Vamos ento programar o evento OnCloseQuery do form da nossa aplicao Dialogos. Esse evento acontece quando a janela fechada, mas d ao usurio a chance de confirmar ou no o fechamento. Selecione o evento na aba Events do ObjectInpector, d um duplo clique na sua direita para abrir o editor de cdigo e digite o seguinte cdigo if MessageDlg('Deseja sair?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then CanClose := False; CanClose uma varivel boolean, declarada pelo mtodo que estamos programando. Seu valor padro True, e neste caso a janela fechada. Se quisermos impedir seu fechamento mudamos a varivel para False. Execute o programa e clique o boto para fechar a janela. A seguinte caixa ser mostrada:

Figura 46 Caixa de dilogo MessageDlg Se voc pressionar o boto Yes a janela ser fechada. Observe que na barra ttulo apareceu o texto Confirm e os textos dos botes esto em ingls tambm. Realmente no podemos modificar isso, pois faz parte da API (Interface de Programao de Aplicativos) do Delphi, que toda em ingls. Logo veremos como resolver esse problema.

Application.MessageBox
Esta caixa de dilogo a mais completa do ambiente Delphi e a que apresenta maior flexibilidade para o programador. Ela encapsula a funo MessageBox da API do Windows e est definida da seguinte forma: function MessageBox(const Text, Caption: PChar; Flags: Longint): Integer; Onde: 55
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

const Text uma constante ou varivel do tipo PChar que contm o texto da mensagem. PChar um ponteiro para uma string. Caption: PChar define um ttulo para a janela. do tipo PChar. Flags: Longint define botes, cones e a possibilidade de focar um determinado boto. Os valores de boto so MB_ABORTRETRYIGNORE, MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO e MB_YESNOCANCEL. Os cones podem ser MB_ICONEXCLAMATION, MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONASTERISK, MB_ICONQUESTION, MB_ICONSTOP, MB_ICONERROR e MB_ICONHAND. Os valores para definio de boto default so MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3 e MB_DEFBUTTON4. O retorno da funo o boto que foi pressionado. Os possveis valores de retorno so IDABORT, IDCANCEL, IDIGNORE, IDNO, IDOK, IDRETRY e IDYES. Insira um novo boto no form do projeto Dialogos. Na propriedade Name informe btnMensagem2, na propriedade Caption defina MessageBox. Altere a propriedade Width para 100. D um duplo clique no boto para programar o evento OnClick de btnMensagem2. No editor de cdigo digite ento o seguinte: if Application.MessageBox('Deseja salvar o arquivo?', 'Confirmao', MB_YESNOCANCEL + MB_ICONQUESTION + MB_DEFBUTTON2) = idYes then ShowMessage('Voc pressionou o boto SIM'); Este no um cdigo muito funcional, apenas exemplifica a utilizao de MessageBox. Observe como so informados os botes, o cone e o boto default. Como definimos que MB_DEFBUTTON2 o boto default, ento o default ser o boto No. Execute o programa e pressione o boto MessageBox. A caixa ir parecer com a figura. Note tambm que os textos dos botes esto em portugus, e que podemos definir o texto da barra de ttulo da caixa.

Figura 47 Caixa de dilogo MessageBox com botes de opes Tanto MessageDlg quanto MessageBox podem ser usadas apenas para apresentar informaes ao usurio, sem necessidade de checar o boto pressionado. Por exemplo, se for inserido o cdigo abaixo no evento OnClick do boto btnMensagem2: Application.MessageBox('Arquivo no pode ser salvo', 'Informao', MB_OK + MB_ICONEXCLAMATION); A seguinte caixa de dilogo ser mostrada.

56
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Note que apresentamos apenas o boto Ok. Sendo uma informao sobre uma ocorrncia, podendo ser inclusive uma mensagem de erro, no precisamos verificar o boto pressionado pelo usurio.

Figura 48 MessageBox para informaes ao usurio Note que apresentamos apenas o boto Ok. Sendo uma informao sobre uma ocorrncia, podendo ser inclusive uma mensagem de erro, no precisamos verificar o boto pressionado pelo usurio. Em certas situaes pode ser que o programador deseje construir caixas de dilogo dinmicas, ou seja, onde as mensagens de texto dependem de determinadas condies durante a execuo do programa. Nesses casos deve-se observar que os argumentos de MessageBox no so do tipo string e sim PChar. Analisemos o cdigo a seguir: var Msg: string; begin Msg := 'Arquivo no pode ser salvo'; Application.MessageBox(PChar(Msg), 'Informao', MB_OK + MB_ICONEXCLAMATION); end; Para podermos usar uma string como argumento de MessageBox necessrio convertermos para PChar. Por isso usamos a chamada funo PChar().

InputBox
O ambiente Delphi oferece tambm caixas de dilogo para entrada de dados do usurio. Uma dessas caixas InputBox, que retorna um tipo string com o texto digitado pelo usurio. A definio interna dessa funo : function InputBox(const ACaption, APrompt, ADefault: string): string; Onde: const ACaption define o ttulo da janela. APrompt define a orientao ao usurio dentro da caixa. ADefault define um valor default para a caixa. Ser retornado se o usurio pressionar a tecla Cancel. Para exemplificar o funcionamento dessa caixa de entrada vamos inserir um boto no form do programa Dialogos. Na propriedade Name digite btnEntrada1, em Caption escreva InputBox. Altere a largura do boto modificando a propriedade Width 57
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

para 100. Para programarmos o evento OnClick do boto d um duplo clique nele. No editor de cdigo faa as alteraes para que o procedimento do evento fique assim: var Cidade: string; begin Cidade := InputBox('Entrada', 'Digite o nome da cidade', 'Santarm'); end; Execute o programa e clique no boto InputBox. A seguinte caixa de dilogo ser mostrada na tela:

Figura 49 Caixa de dilogo InputBox Se voc clicar no boto Cancel, a funo retornar o texto default, no nosso caso, Santarm. Ou podemos digitar uma nova cidade no campo e pressionar OK.

InputQuery
InputQuery retorna um tipo boolean, o texto digitado pelo usurio ser atribudo a uma varivel string previamente declarada. A funo retornar True se o usurio pressionar OK ou retornar False, caso o usurio pressione o boto Cancel. Internamente a funo assim definida: function InputQuery(const A Caption, APrompt: string; var Value: string): Boolean; Os parmetros so semelhantes aos de InputBox, no entanto Value deve ser declarada e inicializada antes, pois passada por referncia funo e retorna o texto digitado pelo usurio. Para exemplificar o funcionamento da funo InputBox vamos inserir um novo boto e um rtulo na nossa aplicao Dialogos. Na propriedade Name do boto informe btnEntrada2, na propriedade Caption informe InputQuery e na propriedade Width modifique o valor para 100. No rtulo defina Name como lblCidade e Caption como Santarm. Clique no sinal de mais (+) ao lado de Font. Defina Size como 16. O form deve ficar com aparncia semelhante da Figura 50 a seguir. Queremos que o usurio digite o nome de uma cidade e que esse nome seja mostrado no rtulo lblCidade, apenas se for pressionado o boto OK. Para programar o evento OnClick desse boto d um duplo clique nele e digite o seguinte cdigo no editor:

58
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

var Cidade: string; begin Cidade := 'Santarm'; if InputQuery('Cidade', 'Digite o nome da cidade', Cidade) then lblCidade.Caption := Cidade; end;

Figura 50 Aplicao Dialogos com um novo boto e rtulo Execute o programa e clique no boto InputQuery. Digite o nome de uma cidade e pressione OK. O nome digitado ser mostrado no rtulo.

Boto com cone (TBitBtn)


Para finalizar nosso programa Dialogos, vamos inserir um boto para fechar a janela. Mas vamos usar um boto diferente. Selecione a aba de componentes Additional. Selecione o boto BitBtn e o insira no form. BitBtn um boto que, alm de um Caption, aceita tambm um cone e possui alguns comportamentos pr-definidos. Voc pode adicionar botes tais como OK, Cancel, Close, etc. sem necessidade de escrever nenhum cdigo. Vamos descrever algumas propriedades de BitBtn. Propriedade Caption Default Enabled Glyph Kind Contedo &Fechar False True bkClose Descrio Legenda do boto Evento OnClick no executado se Enter for pressionado Habilita o boto Define um cone para o boto Seleciona o tipo do boto e seu comportamento 59
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Name

btnFechar Identificador do boto Quadro 13 Propriedades de BitBtn

Demais propriedades, mtodos e eventos so os mesmos de TButton. Observe que alteramos a propriedade Caption para Fechar. Quando voc escolhe o tipo em Kind, o Delphi atribui a Caption um texto com o mesmo nome do tipo. Podemos alter-lo sem com isso mudar seu comportamento. No entanto no podemos alterar o cone, pois isso implicaria na mudana de Kind para bkCustom, que significa um boto onde o programador define seu comportamento e seria necessrio inserir cdigo para isso. Note que no inserimos cdigo para o evento OnClick, mas se executarmos o programa e pressionarmos o boto Fechar a janela ser fechada.

60
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 5 Criando Menus


As aplicaes que criamos at o momento no possuem um dos elementos de interface mais importantes de uma aplicao Windows: a barra de menus. Mesmo nossas aplicaes tendo um menu de sistema (aquele do canto superior esquerdo), muitas tarefas so acessadas atravs de comandos de menu. Uma aplicao possui vrios menus que podem inclusive mudar em tempo de execuo e vrios menus locais (normalmente acessados atravs de um clique no boto direito do mouse). Os componentes para criar menus esto localizados na aba Standard da paleta de Componentes.

Estrutura do Menu Principal


Geralmente os menus tm dois nveis. Uma barra de menu, abaixo do ttulo da janela, contm os nomes dos sub-menus (pull-down), que por sua vez tm uma srie de itens. No entanto a estrutura de menu muito flexvel. possvel colocar um item de menu diretamente na barra de menu e colocar um sub-menu de segundo nvel dentro de outro sub-menu. Voc deve evitar colocar comandos diretamente na barra de menu. Isso no muito comum. Se realmente isso for necessrio, acrescente um menu com um nico item de menu. Um exemplo tpico o menu Ajuda com o item Sobre. Colocar sub-menus dentro de outro sub-menu - um sub-menu de segundo nvel mais comum, e neste caso o Windows oferece uma indicao visual, um pequeno tringulo direita do menu. De qualquer maneira, menus de segundo nvel podem se tornar o uso do programa uma coisa chata. Pense na possibilidade de agrupar as opes separando os grupos por barras separadoras. Veja a figura.

Figura 51 Menu com opes agrupadas e sub-menu 61


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Diferentes funes dos itens de menu


H trs tipos fundamentais de itens de menu: Comandos so itens de menu usados para executar uma ao. No tm indicao visual de sua funo. Modificadores de estado so itens usados para alternar uma opo entre ligado e desligado, para mudar o estado de um elemento particular. Esses comandos geralmente possuem uma marca no lado esquerdo para indicar que esto ativos. Neste caso, selecionar a opo produz a ao oposta. Dilogo so itens que invocam uma caixa de dilogo quando so selecionados. Isso inclui qualquer janela onde o usurio precise interagir. Estes comandos deveriam ter uma indicao visual que consiste de trs pontos aps o texto.

Aplicao Exemplo
Para exemplificarmos a construo de menus vamos criar uma nova aplicao. Defina a propriedade Name do form como frmMenus, o Caption como Menus e salve tudo atribuindo unit o nome u_menus e ao projeto o nome Menus. Selecione um rtulo na aba Standard e insira-o no form. Defina a propriedade Name como lblTexto. Na propriedade Align selecione alClient. Escreva algum texto bastante longo na propriedade Caption. Mude a propriedade WordWrap para True, para ter vrias linhas de texto. Mude AutoSize para False para permitir o redimensionamento do rtulo. Clique no sinal de mais (+) ao lado da propriedade Font e altere Name para Arial e Size para 38. Selecione um componente TPanel na aba Standard e o insira no form. Panel usado para agrupar outros controles. Muito usado para criar barras de ferramentas. Exatamente isso que vamos implementar na nossa aplicao. Mude a propriedade Name para panBarra, e delete o texto da propriedade Caption. Defina sua propriedade Align como alTop.

62
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 52 Aplicao Menus Insira cinco botes (TButton) e os posicione adequadamente no Panel. No primeiro defina Name como btnFonte e Caption como Cor &Texto... No segundo defina Name como btnFundo e Caption como Cor &Fundo... No terceiro defina Name como btnEsquerda e Caption como &Esquerda. No quarto defina Name como btnCentro e Caption como &Centro. No ltimo defina Name como btnDireita e Caption como &Direita. A janela deve ficar como a Figura 52. Os trs ltimos botes mudam o alinhamento (Alignment) do rtulo. Ento vamos escrever o cdigo para os eventos OnClick desses botes. D um duplo clique em cada um deles. Para btnEsquerda digite no editor de cdigo: lblTexto.Alignment := taLeftJustify; Para btnCentro digite: lblTexto.Alignment := taCenter; E para btnDireita digite: lblTexto.Alignment := taRightJustify; Voc pode verificar a funcionalidade dos botes executando a aplicao e pressionando cada um deles e observando seus efeitos sobre o texto do rtulo.

A Caixa de Dilogo ColorDialog


Vamos inserir na nossa aplicao um componente denominado ColorDialog. Esse componente serve para apresentar a caixa de dilogo para seleo de cores padro do ambiente Windows. Localize-o na aba Dialogs. Pode ser colocado em qualquer lugar da janela, pois no um componente visual, ou seja, no ser visvel quando o programa for executado. Ser invocado em tempo de execuo pelos dois primeiros botes, por isso eles tm os trs pontos no Caption, para indicar a chamada a uma caixa de dilogo. Vamos mudar a propriedade Name do componente. Defina-a como dlgCores. Queremos que, quando pressionados, os dois primeiros botes chamem a caixa de dilogo dlgCores. Nessa caixa selecionamos a cor desejada e quando pressionarmos o boto OK, a cor ser atribuda propriedade Color do rtulo ou propriedade Color de Font. D um duplo clique no boto btnFonte e digite o seguinte cdigo no editor: dlgCores.Color := lblTexto.Font.Color; if dlgCores.Execute then lblTexto.Font.Color := dlgCores.Color; Na primeira linha fazemos com que a caixa de dilogo seja mostrada com a cor do texto. Depois executamos a caixa de dilogo e, se o usurio pressionar o boto OK, a cor do texto do rtulo modificada. O mtodo Execute de ColorDialog retorna True se for pressionado o boto OK ou False se for pressionado o boto Cancel. Vamos fazer o mesmo com o boto btnFundo e digitar o seguinte cdigo no editor: dlgCores.Color := lblTexto.Color; 63
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

if dlgCores.Execute then lblTexto.Color := dlgCores.Color; Execute o programa e clique no boto btnFonte. Voc ter a caixa de dilogo de cores como na figura:

Figura 53 A caixa ColorDialog

Criando um Menu com o Menu Designer


Vamos criar um menu com a seguinte estrutura: Arquivo Sair Exibir Barra de ferramentas Opes Cor do texto Cor do fundo Esquerda Centro Direita Ajuda Sobre O Delphi possui um editor de menus chamado Menu Designer. Para utiliz-la precisamos de um componente TMainMenu. Selecione esse componente na aba Standard e o insira no form em qualquer posio. O Delphi se encarrega de posicionar o menu no lugar correto, abaixo da barra de ttulo.

64
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

O MenuDesigner uma ferramenta poderosa: voc cria um menu simplesmente escrevendo o texto dos comandos, para mover os itens simplesmente os arraste e as propriedades podem ser modificadas facilmente. Para comprovar isso vamos dar um duplo clique no componente MainMenu. A janela do Menu Designer ser mostrada, selecionando a primeira opo de menu. Digite &Arquivo na propriedade Caption e tecle Enter. O Menu Designer define a primeira opo, inicia o sub-menu abaixo de &Arquivo e prepara a criao de uma nova opo de menu, conforme pode ver visto na figura:

Novo menu

Sub-menu

Figura 54 Menu Designer Estando o sub-menu selecionado digite Sai&r na propriedade Caption. Clique no retngulo identificado como novo menu, digite E&xibir na propriedade Caption e tecle Enter. No sub-menu abaixo de Exibir digite Barra de &ferramentas na propriedade Caption e na propriedade Checked desse item defina True. No prximo menu digite &Opes na propriedade Caption. No sub-menu digite Cor do &texto... no Caption primeiro item e Cor de &fundo... no segundo item. No terceiro item digite um hfen (-). Isso cria um separador no sub-menu. No quarto item digite &Esquerda, no quinto item digite &Centro e no ltimo digite &Direita. Finalmente no ltimo menu digite Aj&uda na propriedade Caption e no sub-menu digite &Sobre...

65
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 55 Aspecto do menu criado

Teclas de atalho e hotkeys


Uma caracterstica dos itens de menu que eles podem conter uma letra sublinhada, chamada hotkey. Esta letra usada para selecionar o menu usando o teclado. Pressionando ALT mais a letra sublinhada seleciona-se o menu. Pressionando outra letra sublinhada envia-se o comando. As letras sublinhadas de cada item dentro de um sub-menu devem ser diferentes. Observe que durante a criao do nosso menu, definimos as letras sublinhadas inserindo um & antes da letra. Outra caracterstica padro dos menus so as teclas de atalho. Quando aparece uma combinao de teclas no lado direito do item de menu, significa que voc pode usar essa combinao para executar o comando. Essa caracterstica oferece a maneira mais rpida de executar um comando. Para associar teclas de atalho a um item de menu muito fcil. Ainda no Menu Designer simplesmente escolha uma combinao de teclas na propriedade ShortCut do item. Vamos fazer isso para as opes: Esquerda, Centro e Direita. Selecione a opo Esquerda e na propriedade ShortCut selecione a combinao CTRL + E. Para a opo Centro selecione CTRL + C e para a opo Direita selecione CTRL + D. Veja a figura abaixo:

66
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 56 Menu com teclas de atalho

Respondendo aos comandos do menu


Para responder aos comandos de menu, voc deveria definir um mtodo para o evento OnClick de cada item de menu. No Menu Designer, selecione o item de menu Sair. Selecione a aba Events do Object Inspector e d um duplo clique no evento OnClick. Queremos que janela seja fechada quando o usurio selecionar este comando. Portanto, quando abrir o editor de cdigo digite o comando: Close; O comando Exibir | Barra de ferramentas tem uma marca de verificao, fica marcada quando a barra de ferramentas est visvel. Aqui est o cdigo para o evento OnClick desse comando: panBarra.Visible := not panBarra.Visible; Barradeferramentas1.Checked := panBarra.Visible; A primeira linha muda a visibilidade da barra de ferramentas que foi criada pelo componente Panel. A segunda linha marca/desmarca o item de menu de acordo com a visibilidade do painel. No comando Opes | Cor do texto digite o seguinte cdigo para o evento OnClick: dlgCores.Color := lblTexto.Font.Color; if dlgCores.Execute then lblTexto.Font.Color := dlgCores.Color; Note que este cdigo exatamente o mesmo programado para o evento OnClick do boto btnFonte. Na verdade no precisamos replicar esse cdigo aqui, mas vamos manter dessa forma por questes didticas. Mostraremos como reutilizar o cdigo do evento de um componente em outro. Observe que o cdigo do comando Opes | Cor de fundo o mesmo do evento OnClick do boto btnFundo. Ento selecione esta opo no Menu Designer e v para a aba Events no Object Inspector. Clique no boto com a seta do evento OnClick para ver todos os eventos disponveis. Selecione btnFundoClick. Pronto, agora o comando do menu chamar o mesmo cdigo do evento OnClick do boto btnFundo. Os outros trs itens do menu Opes tm basicamente o mesmo cdigo dos botes de alinhamento. No entanto devemos acrescentar uma marca de verificao ao lado do item que estiver habilitado, desmarcando os demais. Inicialmente, no Menu Designer, selecione Opes | Esquerda e altere a propriedade Checked para True. Essa a nossa situao padro. Sempre que a aplicao iniciar o texto estar alinhado esquerda. Em seguida vamos escrever o cdigo para o comando em questo. Selecione o evento OnClick do item de menu e d um duplo clique nele. Digite ento o seguinte cdigo: lblTexto.Alignment := taLeftJustify; Esquerda1.Checked := True; Centro1.Checked := False; Direita1.Checked := False; 67
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Este cdigo, alm de definir o alinhamento esquerda do texto, marca e desmarca adequadamente as opes do menu. Vamos agora codificar o evento OnClick de Opes | Centro. Digite o seguinte cdigo: lblTexto.Alignment := taCenter; Esquerda1.Checked := False; Centro1.Checked := True; Direita1.Checked := False; Em Opes | Direita digite o seguinte cdigo: lblTexto.Alignment := taRightJustify; Esquerda1.Checked := False; Centro1.Checked := False; Direita1.Checked := True;

Chamadas a forms
Com certeza suas aplicaes sempre tero muitos forms. Existe um form principal (main) que faz chamadas a outros forms. A maneira de chamarmos forms ser estudada agora. Vamos criar um novo form na nossa aplicao. Esta janela ser nosso Sobre (About). O Delphi j possui um modelo para esse form. Execute o comando File | New | Others. Clique na aba Forms, selecione o cone AboutBox e confirme pressionando OK. Um form Sobre ser includo no projeto. Selecione esse form e, no Object Inspector, altere a propriedade Caption para Sobre, e a propriedade Name para frmSobre. Salve a unit e d a ela o nome u_sobre. Na interface desse form existem quatro rtulos, um componente TImage e um boto. Vamos deixar Image como est, mas possvel escolher outra imagem para o componente simplesmente clicando no boto elipse da propriedade Picture e selecionando a imagem desejada. O boto tambm no precisa ser modificado. Note que a propriedade ModalResult do boto est definida como mrOk. Isso indica que, quando a janela fechada, esse valor retornado ao form que fez a chamada a frmSobre. Nenhum cdigo necessrio para o evento OnClick do boto. No rtulo ProductName altere Caption para Menus. Em Version altere Caption para Verso 1.0. Em Copyright altere Caption para Copyright: seu nome. Em Comments altere Caption para Comentrios: contatos pelo e-mail seu email. Estas so apenas sugestes, programe os rtulos com as informaes que voc desejar. Queremos chamar frmSobre quando o usurio selecionar o comando Ajuda | Sobre. No entanto, apesar de frmSobre fazer parte do nosso projeto, frmMenus no sabe da sua existncia. necessrio dizermos a frmMenus que frmSobre existe. Para fazer isso precisamos dizer a frmMenu que use a unit u_sobre, correspondente a frmSobre. Logo abaixo da palavra implementation escreva o seguinte cdigo: uses u_sobre; Isso habilita frmMenus acessar qualquer objeto de frmSobre e o prprio form. H duas maneiras de fazermos chamadas a um form: Modal - o foco fica preso ao form e no liberado at que este seja fechado. O usurio pode ativar qualquer outra aplicao Windows, mas no pode 68
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

ativar outra janela da aplicao cuja janela foi aberta como modal. Para ativar esse modo chame o form usando o mtodo ShowModal. No modal - o foco pode ser transferido para outra janela sem que esta precise ser fechada. Para ativar esse modo chame o form usando o mtodo Show.

Agora selecione o evento OnClick do comando Ajuda | Sobre e digite o seguinte cdigo: frmSobre.ShowModal; Execute o programa e clique no comando Ajuda | Sobre. A aparncia da aplicao deve ser como a Figura 57. Em tempo de desenvolvimento gerenciar muitos forms pode ser muito trabalhoso, pois apenas um deles pode estar ativo a cada instante. Para selecionar um form a ser modificado, selecione o comando View | Forms, pressione o boto correspondente na barra de ferramentas ou use as teclas de atalho SHIFT + F12. Para selecionar uma unit, selecione o comando View | Units, pressione o boto correspondente na barra de ferramentas ou use as teclas de atalho CRTL + F12.

Figura 57 A janela Sobre

Menus locais (Pop-up)


Nas aplicaes Windows comum haver menus locais ativados com um clique no boto direito do mouse. O menu que mostrado geralmente depende do local onde o mouse clicado. Esses menus agrupam opes relacionadas com o elemento da interface que est selecionado. So mais rpidos que o menu estudado anteriormente porque no necessita que o mouse seja movimentado para ativ-lo. No Delphi h duas maneiras de tratar menus locais. Podemos deixar o Delphi manipul-los automaticamente ou escolher a tcnica manual. Vamos apresentar aqui apenas o menu local automtico. 69
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Para adicionar um menu local a um form, selecione o componente TPopupMenu na aba Standard e o insira no form em qualquer posio. Altere a propriedade Name para mlAlinhamento. D um duplo clique no componente para abrir o Menu Designer. Insira as opes: Esquerda, Centro e Direita. Na opo Esquerda mude a propriedade Checked para True. Ou seja, queremos um menu local com as mesmas opes referentes ao alinhamento do texto do rtulo do MainMenu que criamos. Portanto vamos fazer algumas modificaes nos mtodos para reutilizar o cdigo. No mtodo do evento OnClick do item de menu Esquerda vamos incluir cdigo para marcar e desmarcar as opes do menu local: lblTexto.Alignment := taLeftJustify; Esquerda1.Checked := True; Esquerda2.Checked := True; Centro1.Checked := False; Centro2.Checked := False; Direita1.Checked := False; Direita2.Checked := False; Depois selecione a opo Esquerda no menu local, v para a aba Events do Object Inspector, clique no boto do evento OnClick e selecione o mtodo Esquerda1Click. Agora quando executarmos o comando Esquerda no menu local estaremos executando o mesmo mtodo do evento OnClick do comando Opes | Esquerda. E o cdigo marcar/desmarcar opes nos dois menus. Vamos repetir o procedimento para as opes Centro e Direita. Selecione o rtulo lblTexto e na propriedade PopupMenu selecione mlAlinhamento. Esta a maneira de associar o menu local a um componente. Execute o programa, clique com o boto direito do mouse no rtulo, selecione uma das trs opes de alinhamento do texto e verifique que a opo escolhida fica marcada nos dois menus.

Figura 58 O componente PopupMenu

70
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 6 Barras de ferramentas e de status


Barra de ferramentas (TToolBar)
A barra de ferramentas (ToolBar) um componente com botes prprios e recursos personalizados. Os botes so do tipo TToolButton, considerados objetos internos de ToolBar. Para exemplificar sua utilizao vamos substituir o painel de botes do programa Menus por um componente ToolBar. Para isso selecione o componente panBarra e pressione o a tecla DEL. Assim o painel e todos os botes inseridos nele so deletados. Note que os mtodos definidos para os botes no foram excludos, porque existe cdigo do programador neles. Agora selecione o componente ToolBar na aba Win32 e o insira em qualquer posio do form. O componente alinha-se automaticamente no topo do form, abaixo da barra de menu. Algumas propriedades desse componente so apresentadas no quadro a seguir: Propriedade +EdgeBorders ebLeft ebTop ebRight ebBottom EdgeInner EdgeOuter Flat Images Name Contedo False True False True esRaised esLowered True Descrio Define bordas para a barra de ferramentas. Nesse caso, definimos que haver bordas no topo e na base

Define o formato interno da borda Define o formato externo da borda Torna a ToolBar transparente e deixa os botes sem bordas Permite definir um objeto ImageList que contm as imagens para os botes tbBarra Identificador da barra de ferramentas Quadro 14 Propriedades de ToolBar

Altere as propriedades do componente de acordo com a tabela. Experimente vrios formatos de borda e deixe-os da maneira que voc achar mais adequada. Vamos inserir os botes. Para isso clique com o boto direito do mouse no componente ToolBar e selecione a opo New Button. Inclua dois botes. Ao primeiro d o nome de tbuFonte e ao segundo d o nome de tbuFundo. Agora insira um separador clicando com o boto direito do mouse e selecionando New Separator. Insira trs botes em seguida e d a eles os nomes: tbuEsquerda, tbuCentro e tbuDireita. Os botes que compem barras de ferramentas possuem imagens e no captions. Portanto vamos inserir imagens nos nossos botes. Selecione o componente TImageList da aba Win32 e o coloque no form em qualquer posio. D um duplo clique no ImageList e pressione o boto Add. Selecione um cone para cada boto. Depois de escolher imagens para os botes clique na barra de ferramentas e na propriedade Images selecione ImageList1. Cada uma das imagens escolhidas ser inserida em um boto conforme mostra a Figura 59.

71
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 59 Barra de ferramentas Vamos reutilizar os mtodos programados para os eventos OnClick dos botes que foram excludos. Selecione o primeiro boto da barra de ferramenta, tbuTexto. Selecione a aba Events do Object Inspector e no evento OnClick selecione o mtodo btnFonteClick pressionando o boto ao lado direito do nome do evento. Para o boto tbuFundo selecione o mtodo tbuFundoClick. Execute a aplicao e clique nos dois botes da barra de ferramentas. Os dois devem chamar a caixa de dialogo de cores. Iremos repetir o procedimento para os outros trs botes da nossa barra de ferramentas. Mas, em vez de usar os mtodos dos botes anteriormente excludos, vamos usar os mtodos dos comandos de menu. Assim, para o boto tbuEsquerda vamos selecionar o mtodo Esquerda1Click. Para o boto tbuCentro selecione o mtodo Centro1Click. E para o boto tbuDireita selecione o mtodo Direita1Click. Vamos excluir os mtodos criados para os botes btnEsquerda, btnCentro e btnDireita. Para isso acesse o cdigo de cada mtodo no editor e exclua apenas a linha que voc digitou. Quando o programa for compilado, os mtodos e todas as referncias a eles sero eliminadas. O procedimento adotado para programar os eventos OnClick dos botes se deveu apenas ao reaproveitamento do cdigo que j existia para os botes anteriores. Mas se precisarmos escrever um mtodo novo procedemos da maneira j exposta anteriormente. Um duplo clique no boto e o editor aberto na posio onde o cdigo deve ser inserido. Como os eventos OnClick dos botes foram programados para responder aos mesmos eventos dos comandos de menu, pressionar o boto tem o mesmo efeito de selecionar o comando. S precisamos de uma indicao visual da opo de alinhamento que est selecionada no momento.Vamos configurar os botes de alinhamento para que eles operem como botes de rdio. necessrio formar um grupo com os botes que sero tratados como botes de rdio. Altere a propriedade Grouped dos trs botes de alinhamento para True. Modifique a propriedade Style dos botes para tbsCheck. Definimos que o alinhamento esquerda o padro, portanto vamos alterar a propriedade Down de tbuEsquerda para True. Execute o programa e clique nos botes para ver os efeitos. 72
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Note que ao pressionarmos um boto de alinhamento do texto ele permanece pressionado at que selecionemos outro. Mas quando selecionamos o alinhamento do texto a partir de um comando de menu o comportamento dos botes no se alteram. Para solucionar esse problema vamos incluir um comando no mtodo que fora o pressionamento do boto. Inclua ento a seguinte linha no mtodo Esquerda1Click: tbuEsquerda.Down := True; Faa o mesmo nos mtodos Centro1Click e Direita1Click para os botes tbuCentro e tbuDireita. Para finalizar, vamos modificar o cdigo do mtodo correspondente ao comando Exibir | Barra de ferramentas. Altere para o seguinte cdigo: tbBarra.Visible := not tbBarra.Visible; Barradeferramentas1.Checked := tbBarra.Visible; Observe que apenas mudamos o nome do painel panBarra para tbBarra, o componente ToolBar, no cdigo do mtodo.

Barra de status (TStatusBar)


A barra de status usada para apresentar inmeras informaes ao usurio. Pode mostrar mensagens, a data e hora atuais, dicas, etc. O Delphi possui um componente para essa finalidade. Na paleta de componentes v at a aba Win32, selecione o componente TStatusBar e o insira na nossa aplicao Menus. No importa onde voc insere o StatusBar, o Delphi sempre o posiciona na base da janela. Iremos modificar algumas propriedades da barra de status de acordo com o quadro abaixo: Propriedade Name Panels SimpleText Contedo stbMenu Descrio Identificador da barra de status Define os painis que constituem o componente Define um texto que aparecer na barra de status Quadro 15 Propriedades de StatusBar

Uma barra de status pode ter vrios painis que agrupam informaes relacionadas. Vamos dividir esta barra em dois painis. Clique no boto elipse ao lado direito da propriedade Panels. Isso ir abrir o editor de painis. Adicione dois painis pressionando o boto Add New na parte superior do editor ou teclando Ins. O Delphi guarda as informaes sobre os painis do StatusBar em um array. O primeiro painel chamado stbMenu.Panels[0] e o segundo stbMenu.Panels[1]. Lembre que o Delphi sempre considera os ndices dos arrays iniciando em 0. Cada painel um objeto do tipo TStatusPanel. Portanto possui propriedades. Altere as propriedades de stbMenu.Panels[0] conforme o quadro: Propriedade Alignment Style Text Width Contedo Descrio taLeftJustify Define o alinhamento do texto mostrado psText Define como o texto mostrado no painel Desenvolvido por Joo Define o texto que ir aparecer no painel da Silva 400 Define a largura do painel 73
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Quadro 16 Propriedades de TStatusPanel Para alterar as propriedades de um painel, abra o editor de painis dando um duplo clique na barra de status e depois selecione o painel desejado. O Object Inspector mostrar as propriedades desse painel. A propriedade Style permite que as configuraes do texto mostrado no painel sejam definidas pelo programador atravs de um manipulador de evento, mas vamos adotar psText para essa propriedade. Isso indica que o alinhamento do texto dado pela propriedade Alignment e a fonte determinada pela propriedade Font de StatusBar. A propriedade Width define a largura do painel. medida que aumentamos o valor da propriedade Width do painel esquerdo, o painel direito tem sua largura diminuda. No segundo painel mostraremos a hora corrente. O evento mais indicado para isso o OnShow do form. Esse evento acontece quando a janela mostrada. exatamente isso que queremos: apresentar a hora no momento em que a janela for aberta. Note que os componentes adicionados ao form no permitem que ele seja selecionado. Vamos ento mostrar outra maneira de selecionarmos um componente. No Object Inspector existe uma caixa combo (ComboBox) no topo da janela. Clique nessa caixa e selecione o form pelo nome frmMenus. Agora clique na aba Events e d um duplo clique no evento OnShow. No editor de cdigo digite: stbMenu.Panels[1].Text := TimeToStr(Time); Este cdigo converte a hora atual para string e a atribui propriedade Text do segundo painel da barra de status. Execute o programa. Muito bom, mas voc deve ter observado que a hora esttica. Ou seja, a aplicao mostra a hora do instante que a janela aberta, e no se altera dai em diante. Para que a hora seja mostrada a cada segundo necessrio um novo componente: o TTimer. Esse componente tem um nico evento, chamado OnTimer, que acontece a determinados intervalos de tempo. isso que queremos: mostrar a hora a cada segundo. Vejamos ento as propriedades e evento de Timer. Propriedade Enabled Interval Name Evento OnTimer Contedo True 1000 timHora Descrio Habilita o componente Determina o intervalo de tempo (milissegundos) Nome do componente Descrio Ocorre a cada intervalo definido por Interval Quadro 17 Propriedades de StatusBar

A linha de cdigo anterior, que foi programada para o evento OnShow do form, deve ser executada no evento OnTimer. Para no reescrevermos o cdigo selecione o evento na aba Events, clique no boto da caixa combinada e escolha o mtodo FormShow. Execute o programa. Voc ir observar um relgio digital na barra de status.

74
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 60 Barra de status

75
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 7 Tratamento de arquivos


A partir de agora aprenderemos como criar aplicaes que acessam bancos de dados em Delphi. Mas, antes disso vamos estudar os recursos que o Delphi oferece para acesso a arquivos texto. Arquivos texto so importantes porque podem ser usados para trocar informaes entre sistemas diferentes, mais especificamente para converter dados entre bases diferentes, como dBase para Firebird, por exemplo. Um arquivo texto um conjunto de linhas de texto e seu acesso sequencial. Ou seja, se precisarmos ler a ltima linha do arquivo, necessrio ler todas as linhas anteriores. Arquivos texto so um tipo em Delphi: TextFile. Para manipular os arquivos existem procedimentos e funes. No quadro abaixo so apresentadas algumas delas. Procedimento/Funo AssignFile Append Eof FileClose Flush Read/Readln Reset Rewrite Write/Writeln Objetivo Associa o arquivo no disco a uma varivel do tipo TextFile Abre um arquivo existente para insero de novos dados Verifica se a posio atual do cursor o final do arquivo Fecha o arquivo Assegura que todas as informaes so gravadas no arquivo L valores do arquivo. Readln posiciona o cursor na prxima linha aps a leitura Abre um arquivo existente Cria um arquivo e o abre para escrita Escreve num arquivo. Writeln posiciona o cursor na prxima linha aps a insero Quadro 18 Rotinas de Entrada e Sada

Para entender melhor o funcionamento dos arquivos vamos criar uma nova aplicao. Mude a propriedade Name do form para frmArquivo, Caption para Manipulando Arquivos e vamos salvar toda nossa aplicao para nomearmos a unit e o projeto. D o nome de u_arquivos para a unit e Arquivos para o projeto. Depois coloque os objetos e defina suas propriedades de acordo com as descries: Label Propriedade Caption Edit Propriedade Name Text Width Label Propriedade Caption Contedo Nome Contedo edNome 280 Contedo Endereo 76
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Edit Propriedade Name Text Width Label Propriedade Caption Edit Propriedade Name Text Width

Contedo edEndereco 280 Contedo Telefone Contedo edTelefone 120

GroupBox Propriedade Contedo Caption Escrita Button Propriedade Caption Name Button Propriedade Caption Name Contedo &Novo btnNovo Contedo &Salvar btnSalvar

A janela dever ficar como a figura a seguir:

Figura 61 Interface da aplicao

77
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Escrevendo dados no arquivo


Nossa aplicao exemplo recebe dados de uma pessoa nos trs campos disponveis e, quando o usurio pressiona o boto Salvar, esses dados so escritos em um arquivo texto. Para escrever o cdigo que executa a funo de gravar no arquivo texto precisamos definir o que ser executado com um pouco mais de detalhes: O arquivo ser criado se no existir, ou aberto para escrita, caso contrrio. Os dados informados nos campos do form, depois de tratados, so escritos no arquivo. O arquivo fechado.

comum que campos escritos em arquivos texto tenham o mesmo tamanho em todas as linhas. descrio dos campos e seus tamanhos chama-se layout e importante que o programador o conhea para facilitar a leitura posterior do arquivo. Apresentamos a seguir o layout do nosso arquivo: Nome do campo Nome Endereo Telefone Tamanho 40 40 15

Nos campos de edio no existe controle sobre o tamanho do texto. E o tamanho do campo sempre o tamanho do texto digitado pelo usurio. Portanto, antes de enviar os dados para o arquivo necessrio que eles sejam tratados para se adequarem ao layout informado. Por isso precisamos de uma funo que retorna uma string de espaos dado um tamanho, pois esses espaos complementaro o campo para que tenha o tamanho definido. O cdigo dessa funo mostrado na figura:

Figura 62 Funo que retorna uma string de espaos 78


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A funo Espacos() totalmente escrita pelo programador e o seu cabealho deve ser inserido na seo type, como podemos ver na primeira linha da figura. O cdigo do mtodo que implementa o evento OnClick do boto btnSalvar o seguinte:

Figura 63 O mtodo btnSalvarClick Vamos analisar detalhadamente o cdigo: Linha 1 - declara a varivel Arquivo do tipo TextFile. Linha 2 - associa a varivel Arquivo ao arquivo no disco. Note que no informamos o caminho do arquivo, portanto ele estar localizado no mesmo diretrio da aplicao. Linha 3 - a funo FileExists() verifica se o arquivo existe no disco. Se existir executa a linha 4, seno executa a linha 5. Linha 4 - abre o arquivo para escrita. A escrita ocorre sempre aps a ltima linha. Linha 5 - cria o arquivo e o abre para escrita. Linha 6 - escreve os dados no arquivo e salta para a prxima linha. A funo Length() retorna o tamanho de uma string, assim Espacos() retorna a quantidade de espaos necessria para complementar o tamanho do campo. Linha 7 - Fecha o arquivo. O cdigo de btnNovo limpa os campos de edio, preparando-os para uma nova insero. Digite o seguinte no mtodo do evento OnClick desse boto: edNome.Text := ''; edEndereco.Text := ''; edTelefone.Text := ''; Execute o programa e insira dados de vrias pessoas. Agora abra o arquivo dados.txt usando o bloco de notas e observe os dados que foram inseridos.

Lendo dados do arquivo


Para ler os dados do arquivo iremos inserir mais trs botes no formulrio segundo as descries seguintes, alm de um GroupBox:

79
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

GroupBox Propriedade Contedo Caption Leitura Button Propriedade Caption Name Button Propriedade Caption Name Button Propriedade Caption Name Contedo &Iniciar btnIniciar Contedo &Prximo btnProximo Contedo &Parar btnParar

Os componentes devem ser colocados no form conforme a figura abaixo. Observe que usamos o componente GroupBox para agrupar os botes de leitura e os botes de escrita.

Figura 64 Botes para leitura do arquivo O boto btnIniciar inicia a leitura do arquivo na primeira linha. btnProximo l a prxima linha e btnParar encerra a leitura, fechando o arquivo. No mtodo do evento OnClick de btnIniciar digite como no cdigo da Figura 65. Declare uma varivel global com o nome Dados e tipo TextFile. Ela deve ser declarada na seo var antes de implementation. Vamos analisar esse cdigo: Linha 1 - abre o arquivo para leitura. Linha 2 - verifica se final de arquivo. Se for o final do arquivo encerra a leitura. Linha 3 - l a linha e posiciona o cursor na prxima. 80
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Linha 4 - a funo copy() retira parte da string, de acordo com o layout do arquivo, e atribui propriedade Text dos campos de edio. Copy() est descrita a seguir: function string; Copy(S: string; Index, Count: Integer):

Onde: S: string a string original de onde ser extrada a substring. Index, Count: integer delimitam a substring. Index a posio inicial da substring e Count o tamanho em nmero de caracteres.

Figura 65 Cdigo do evento OnClick de btnIniciar O cdigo de btnProximo o seguinte:

Figura 66 Cdigo do evento OnClick de btnProximo Este cdigo parte do anterior e no necessita maiores observaes. O cdigo de btnParar simplesmente fecha o arquivo usando CloseFile(Dados).

81
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Melhorando a interface
Nossa aplicao tem algumas deficincias. Por exemplo, se voc pressionar btnProximo antes de btnIniciar, o arquivo no estar aberto e um erro ser retornado. Para solucionar esses problemas vamos alterar nosso cdigo para habilitar ou desabilitar os botes de acordo com a necessidade. Altere a propriedade Enabled de btnProximo, btnParar e btnSalvar para False. A listagem seguinte mostra as alteraes feitas em cada mtodo:
procedure TfrmArquivo.btnSalvarClick(Sender: TObject); var Arquivo:TextFile; begin AssignFile(Arquivo,'dados.txt'); if FileExists('dados.txt') then Append(Arquivo) else Rewrite(Arquivo); Writeln(Arquivo,edNome.Text+Espacos(40-length(edNome.Text)) +edEndereco.Text+Espacos(40-length(edEndereco.Text)) +edTelefone.Text+Espacos(15-length(edTelefone.Text))); CloseFile(Arquivo); btnNovo.Enabled := True; btnSalvar.Enabled := False; btnIniciar.Enabled := True; end; procedure TfrmArquivo.btnIniciarClick(Sender: TObject); var Linha: string; begin AssignFile(Dados, 'dados.txt'); if FileExists('dados.txt') then begin Reset(Dados); if not Eof(Dados) then begin Readln(Dados, Linha); edNome.Text := copy(Linha, 1, 40); edEndereco.Text := copy(Linha, 41, 40); edTelefone.Text := copy(Linha, 81, 15); end; btnIniciar.Enabled := False; btnProximo.Enabled := True; btnParar.Enabled := True; btnNovo.Enabled := False; end else ShowMessage('Arquivo no existe'); end; procedure TfrmArquivo.btnProximoClick(Sender: TObject); var Linha: string; begin

82
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

if not Eof(Dados) then begin Readln(Dados, Linha); edNome.Text := copy(Linha, 1, 40); edEndereco.Text := copy(Linha, 41, 40); edTelefone.Text := copy(Linha, 81, 15); end; end; procedure TfrmArquivo.btnNovoClick(Sender: TObject); begin edNome.Text := ''; edEndereco.Text := ''; edTelefone.Text := ''; btnNovo.Enabled := False; btnSalvar.Enabled := True; btnIniciar.Enabled := False; end; procedure TfrmArquivo.btnPararClick(Sender: TObject); begin CloseFile(Dados); btnIniciar.Enabled := True; btnProximo.Enabled := False; btnParar.Enabled := False; btnNovo.Enabled := True; end;

Execute o programa e observe. Na leitura, os botes btnProximo e btnParar s so habilitados depois que btnIniciar pressionado. Na escrita, o boto btnSalvar s habilitado se o arquivo no estiver sendo lido e o boto btnNovo for pressionado.

83
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 8 Aplicaes usando Banco de Dados Local


Acesso a Banco de Dados
O Delphi utiliza uma estrutura de camadas para fazer com que o front-end manipulado pelo usurio interaja com o banco de dados. O caminho deve ser percorrido por uma srie de componentes configurados entre si.

Figura 67 Configurao de acesso a banco de dados A camada BDE fica entre a aplicao e o banco de dados. Mas existem outras maneiras de acessar bancos de dados sem o BDE. Alm do conjunto de componentes BDE, o Delphi dispe do conjunto Interbase Express, para acesso a banco de dados Interbase/Firebird, e a biblioteca dbExpress, para acesso qualquer servidor SQL. O BDE um conjunto de DLLs que deve acompanhar as aplicaes que fazem uso de seus recursos de acesso a bancos de dados. nessa 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 dados, o BDE responsvel para estabelecer este funcionamento. Alm do BDE, vemos pela Figura 67 que o Delphi utiliza um amplo conjunto de componentes: Session: aplicaes simples trabalham com apenas um banco de dados. Porm, o Delphi permite mais de uma conexo simultnea a bancos de dados distintos, e tambm mais de uma conexo com o mesmo banco de dados. O controle dessas conexes feito atravs do componente da classe TSession, criado automaticamente pelo Delphi na execuo do programa. Esse componente representa a sesso padro da aplicao. DataBase: responsvel pela conexo da aplicao com um banco de dados com a finalidade de implementar os requisitos de transao e definir caractersticas de comunicao de uma aplicao Delphi-Client/Server. Em aplicaes locais no utilizado. DataSet: existem trs componentes que descendem de uma classe denominada TDataSet e implementam mtodos importantes para 84
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

manipulao de tabelas alm de caractersticas especficas. Os componentes utilizados so: TTable, TQuery e TStoredProc. DataSource: responsvel por conectar componente Data-Aware a uma determinada tabela representada por um DataSet. Data-Aware: so responsveis pela visualizao e manipulao direta dos dados. Todo componente desse tipo tem uma propriedade para conectar-se ao DataSource correspondente tabela destino.

Aplicao de banco de dados


Vamos criar um projeto para exemplificar a construo de uma aplicao de banco de dados mostrando todos os passos, que vo desde a criao das tabelas at a gerao de relatrios. O projeto usar um banco de dados local e possui duas tabelas com 0 seguinte modelo E-R:

Figura 68 Modelo E-R Para criarmos as tabelas precisamos de um gerenciador de banco de dados. O Delphi instala uma ferramenta com essa finalidade que cria tabelas Paradox ou dBase, o Database Desktop. Se voc quiser usar Access use a prpria ferramenta da Microsoft para isso.

Database Desktop
Para criar as tabelas selecione o comando File | New | Table. Uma janela para definio do tipo de banco de dados ser exibida. Vamos escolher o banco de dados Paradox. Cada tabela em Paradox, corresponde a um arquivo em disco com a extenso .DB. Neste caso o conceito de banco de dados definido pelo diretrio onde esto as tabelas, e no o nome do arquivo como no Access, por exemplo.

Figura 69 Janela para definir o tipo da tabela

85
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Selecione Paradox 7 e pressione OK. Em seguida a janela para definio dos campos ser mostrada, onde: Field Name: define o nome do campo da tabela. Type: define o tipo de dado do campo. Tecle Espao para visualizar uma lista com os possveis tipos. Size: tamanho do dado definido pelo campo Type. Alguns campos j so padronizados no permitindo alterao. Key: define se o campo chave primria. Tecle Espao para ligar ou desligar. Um asterisco mostrado para confirmao de chave primria ligada. Table Properties: define uma srie de itens como Validaes, Integridade referencial e ndices secundrios.

Uma validao permite, por exemplo, definir um domnio para o campo. Integridade referencial define restries de chave estrangeira. ndices secundrios permitem ordenao por campos diferentes da chave primria.

Figura 70 Janela para definio de campos Field Name Type Size Key IdCidade Number * Nome Alpha 40 Quadro 19 Definio dos campos da tabela Cidade Field Name IdCliente Nome Endereco Estado Sexo Type Number Alpha Alpha Alpha Alpha Size 40 40 2 1 86
Centro Universitrio Luterano de Santarm

Key *

Linguagem de Programao Comercial

Situacao IdCidade

Logical Number Quadro 20 Definio dos campos da tabela Cliente

Defina os campos e seus tipos para Cidade e Cliente e salve cada uma pressionando o boto Save As... Sugere-se que voc crie um diretrio para sua aplicao e salve suas tabelas nesse mesmo diretrio.

BDE - Criao do Alias


Assim como o Database Desktop, o BDE tambm instalado junto com o Delphi. No grupo de programas do Delphi execute o BDE Administrator. Observe a tela inicial.

Figura 71 BDE Administrator A tela dividida em duas partes: a lista de Aliases/Bancos de Dados no lado esquerdo e as configuraes de cada Alias/Banco de Dados no lado direito. Alias uma string que define o caminho (path) e as configuraes para acesso ao banco de dados. Por exemplo, na Figura 71 temos em destaque o Alias DESTINO. No lado direito vemos que esse Alias corresponde a um banco de dados do tipo dBase localizado no caminho identificado pelo campo Path. Na aplicao utilizaremos o nome do Alias para ter acesso s tabelas. Dessa forma possvel mudar a localizao das tabelas desde que se mantenha sempre o mesmo Alias. Para criar um Alias: Selecione o comando Object | New ou pressione CTRL + N. Confirme o tipo de driver. No nosso caso usaremos o Paradox. Defina um nome para o Alias (lado esquerdo da tela). Use o nome Clientes. Defina o caminho onde voc criou suas tabelas no campo Path. Selecione o comando Object | Apply para salvar as alteraes. 87
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Confirme as alteraes.

O BDE deve ser instalado no equipamento onde a aplicao vai ser executada, e o Alias deve ser criado da mesma maneira com o mesmo nome.

Iniciando a aplicao
Nossa aplicao ter uma janela principal e dois formulrios para cadastro de cidades e de clientes. Inicie uma nova aplicao no Delphi. No form crie um menu do tipo MainMenu com os seguintes itens: Arquivo Sair Cadastros Cidade Cliente Consultas Cidade Cliente Relatrios Cidade Cliente Ajuda Defina a propriedade Caption do form como Clientes e Name como frmPrincipal. Salve o projeto inteiro com o comando File | Save All atribuindo unit o nome u_principal e ao projeto o nome Clientes. Tome a precauo de salvar tudo no mesmo diretrio.

Data Module
Antes de inserir novos forms vamos introduzir um novo objeto. Costumamos centralizar os componentes de acesso ao banco de dados em um nico lugar chamado DataModule. DataModule um continer visual onde podemos colocar componentes no visuais, definir suas propriedades e escrever mtodos manipuladores de eventos. Para criar um DataModule selecione File | New | Data Module. O DataModule semelhante a um form, mas em tempo de execuo ele existe apenas na memria. TDataModule deriva de TComponent, e portanto no tem qualquer relao com o conceito de janelas do Windows, pois como vimos antes os componentes ajanelados do Delphi derivam de TWinControl. No entanto, ele tem uma unit e um arquivo de definio de form, e podemos trat-lo como um form. Crie um DataModule e na propriedade Name defina dmDados. Salve-o e d o nome u_dmdados para a unit. E vamos ento inserir os componentes de acesso ao banco de dados. Como vimos anteriormente, para bancos de dados locais, tais como Paradox, no necessrio usar o componente DataBase. O componente TTable Selecione o componente Table da aba de componentes BDE. No quadro abaixo descrevemos as propriedades, mtodos e eventos desse componente. Na coluna Contedo do quadro so informados os valores que devem ser definidos em cada propriedade da nossa aplicao. 88
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A propriedade Active, alm de indicar se a tabela est aberta ou no, pode ser usada para abrir ou fechar a tabela. Na propriedade DatabaseName pode definir o banco de dados atravs do Alias ou informando-se diretamente o caminho onde esto localizadas as tabelas. Propriedade Active DatabaseName MasterFields Descrio Indica se a tabela est aberta ou no Define o banco de dados Define os campos de relacionamento entre duas tabelas MasterSource Define a tabela me do relacionamento Name tbCidade Define o nome do componente Table TableName Cidade.db Define a tabela fsica associada ao componente State Indica o estado atual da tabela Mtodo Descrio Cancel Cancela a alterao feita num registro Close Fecha a tabela Delete Exclui o registro corrente First Posiciona o cursor no primeiro registro Locate Localiza registros em uma tabela Last Posiciona o cursor no ltimo registro Next Posiciona o cursor no prximo registro Open Abre a tabela Post Escreve um registro na tabela Prior Posiciona o cursor no registro anterior Evento Descrio AfterPost Acontece aps escrever o registro na tabela AfterCancel Acontece depois de cancelar um registro AfterDelete Acontece depois de excluir um registro BeforeCancel Acontece antes de cancelar um registro BeforeDelete Acontece depois de excluir um registro BeforePost Acontece antes de escrever o registro na tabela Quadro 21 Propriedades, mtodos e eventos de Table Neste quadro foram apresentados alguns mtodos e eventos. A quantidade de mtodos e eventos utilizada muito maior que essa. Preferimos apresent-los medida que forem sendo necessrios. A propriedade State indica em que estado se encontra a tabela. Estado o modo de operao. Alguns desses estados so listados abaixo: dsInactive - tabela fechada. dsBrowse - tabela pode ser visualizada, mas no alterada. o estado padro. dsEdit - registro corrente pode ser modificado. dsInsert - o registro corrente foi recentemente inserido, mas ainda no escrito na tabela. Pode ser modificado, salvo ou descartado. Contedo False Clientes

Existem outros estados, mas estes so os mais comuns.

89
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Insira mais um componente Table. Define DatabaseName como Clientes. Name como tbCliente e TableName como Cliente.db. O componente TDataSource DataSource componente que faz a ponte de acesso entre um DataSet e os controles de banco de dados (Data-Aware) Na paleta DataAccess selecione TDataSource e insira no DataModule. Defina suas propriedades de acordo com o quadro abaixo. Propriedade AutoEdit Descrio Determina se a tabela entra em edio quando o usurio modifica o contedo de um campo DataSet tbCidade Define o componente DataSet associado Name dsCidade Define o identificador do componente State L o estado do DataSet associado Evento Descrio OnDataChange Acontece quando o registro modificado e quando move-se entre campos ou registros OnStateChange Acontece quando o estado de um DataSet modificado Quadro 22 Propriedades e eventos de DataSource Insira mais um componente DataSource. Defina DataSet como tbCliente e Name como dsCliente. Contedo True

Figura 72 DataModule

A interface de entrada de dados da tabela Cidade


Agora vamos criar a interface de entrada de dados para a tabela Cidade. Inclua um novo form na aplicao. Defina a propriedade Caption do form como Cidades e a propriedade Name como frmCidade. Salve a aplicao e d o nome u_cidade unit. O controle TDBEdit 90
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A aba DataControls agrupa o conjunto de componentes Data-Aware que so responsveis pela visualizao e manipulao de dados das tabelas. O mais comum desses controles TDBEdit. Esse objeto uma caixa de edio onde o usurio digita um texto a ser inserido em um campo de tabela. Vamos inserir um componente desses na interface responsvel por inserir dados na tabela Cidade. No quadro seguinte so apresentadas as propriedades, mtodos e eventos desse componente. Propriedade CharCase DataField DataSource Name Mtodos SetFocus Evento OnChange OnEnter OnExit Descrio Define se o texto digitado ser convertido para maisculas, minsculas ou no ser convertido IdCidade Define o campo da tabela que ser manipulado pelo DBEdit dmDados.dsCidade Define o DataSource da tabela dbeIdCidade Define o identificador do controle Descrio Muda o foco para o controle Descrio Acontece quando o texto do controle modificado Acontece quando o controle recebe o foco Acontece quando o foco sai do controle Quadro 23 Propriedades, mtodos e eventos de DBEdit Contedo ecNormal

Para definir a propriedade DataSource necessrio criar uma referncia unit do DataModule dmDados na unit u_cidade. Isso necessrio porque o componente DataSource est localizado no DataModule. Dessa forma insira a seguinte linha de cdigo abaixo da linha implementation da unit u_cidade: uses u_dmdados; Aps isso se voc clicar na caixa combinada da propriedade DataSource de tbCidade, ser mostrada uma lista de todos os componentes DataSource que esto no DataModule. Selecione o objeto que corresponde tabela Cidade e depois clique na caixa combinada da propriedade DataField para selecionar o campo da tabela. Insira um TLabel da aba Standard para identificar o controle dbeIdCidade. Na propriedade Caption escreva Id. Coloque outro componente DBEdit abaixo do primeiro. Defina sua propriedade Name como dbeNome, DataSource como dmDados.dsCidade e DataField como Nome. Identifique esse controle com um TLabel. Defina seu Caption como Nome.

91
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 73 Aparncia parcial da interface TDBNavigator Este controle rene um conjunto de botes que movem o ponteiro da tabela para frente ou para trs. Pode tambm colocar a tabela no estado Insert, Edit ou Browse e gravar registro inseridos ou modificados. Propriedade ConfirmDelete Descrio Determina se uma mensagem de confirmao de excluso de registro ser mostrada DataSource dmDados.dsCidade Define o DataSource da tabela Flat False Define se os botes tero aparncia de 3-D ou 2-D VisibleButtons Define que botes aparecero no navegador Evento Descrio BeforeAction Acontece quando um dos botes pressionado, antes da ao padro OnClick Acontece quando um dos botes pressionado, depois da ao padro Quadro 24 Propriedades e eventos de DBNavigator Contedo True

Figura 74 O controle DBNavigator Funes dos botes do navegador: First Prior Move o ponteiro da tabela para o primeiro registro. Move o ponteiro da tabela para o registro anterior. 92
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Next Last Insert Delete Edit Post Cancel Refresh

Move o ponteiro da tabela para o prximo registro. Move o ponteiro da tabela para o ltimo registro. Insere um novo registro na tabela. Deleta o registro corrente. Pe a tabela no estado Edit o que permite modificar um registro. Grava as modificaes feitas na tabela. Cancela alteraes feitas na tabela. Atualiza os dados do buffer.

Abrindo e fechando a tabela Para usar uma tabela ela precisa ser aberta. Depois que seu uso finalizado ela ser fechada. Vamos concretizar esses procedimentos no cdigo da unit. O cdigo para abrir a tabela ser executado no momento que a janela for aberta, no evento OnShow da janela frmCidade. Selecione o form e a aba Events no Object Inspector. D um duplo clique no evento OnShow e complete o cdigo: procedure TfrmCidade.FormShow(Sender: TObject); begin dmDados.tbCidade.Open; // mtodo para abrir // a tabela end; Agora d um duplo clique no evento OnClose. Esse evento acontece quando a janela fechada. nele que vamos inserir o cdigo para fechar a tabela. procedure TfrmCidade.FormClose(Sender: TObject; var Action: TCloseAction); begin dmDados.tbCidade.Close; // mtodo para fechar // a tabela end; Chamando o form Nesse ponto do nosso projeto se ele for compilado, no ter como executarmos a interface de cadastro de cidades. A janela que ser mostrada a janela do menu principal. Portanto precisamos programar a janela principal do projeto para chamar a janela de cidades. Para fazer isso, inicialmente, digite a seguinte linha de cdigo na rea implementation da unit u_principal: uses u_cidade; Com isso a unit principal pode referenciar qualquer objeto da interface de entrada de dados da tabela cidade. Selecione o comando de menu Cadastros | Cidades e digite a linha de cdigo a seguir: frmCidade.Show; // mtodo para abrir // a janela 93
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Agora compile e execute o projeto. Abra a interface de cadastro de cidades e insira alguns registros na tabela.

A interface de entrada de dados da tabela Cliente


Insira um novo form na aplicao. Altere a propriedade Caption para Clientes e a propriedade Name para frmCliente. Salve-o e defina o nome da unit como u_cliente. Na rea implementation digite a linha de cdigo: uses u_dmdados; Insira trs objetos DBEdit e no lado esquerdo de cada um deles insira um Label. Defina suas propriedades de acordo com as descries abaixo: Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Contedo Id Contedo ecNormal IdCliente dsCliente dbeId 75 Contedo Nome Contedo ecNormal Nome dsCliente dbeNome 290 Contedo Endereo Contedo ecNormal Endereco dsCliente dbeEndereco 290 94
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Selecionando dados de outra tabela (TDBLookUpComboBox) O campo IdCidade da tabela cliente uma chave estrangeira que referencia a tabela Cidade. Devemos usar um controle que permita que o usurio apenas escolha uma cidade entre aquelas que esto cadastradas na tabela Cidade. Para isso existe o componente TDBLookUpComboBox. Este objeto preenche uma caixa combinada com os dados lidos da tabela referenciada. Ai ento o usurio escolhe um desses itens para o campo quando pressiona o boto da caixa. Insira um componente TDBLookUpComboBox e defina suas propriedades conforme o Quadro 25. Coloque tambm um Label esquerda do controle. Defina a propriedade Caption do rtulo como Cidade.

Propriedade DataField

Descrio Define o campo da tabela que ser manipulado pelo controle DataSource dmDados.dsCliente Define o DataSource da tabela KeyField IdCidade Define o campo chave ListField Nome Define o campo a ser visualizado ListSource dmDados.dsCidade Define o DataSource da tabela referenciada Name dblIdCidade Define o identificador do controle Width 190 Define o tamanho do componente Mtodos Descrio SetFocus Muda o foco para o controle Evento Descrio OnChange Acontece quando o texto do controle modificado OnEnter Acontece quando o controle recebe o foco OnExit Acontece quando o foco sai do controle Quadro 25 Propriedades, mtodos e eventos de DBLookUpComboBox Note que as propriedades DataSource e DataField tm a mesma descrio dos demais controles DataAware. Portanto se referem tabela que est sendo editada/consultada. As propriedades ListSource, ListField e KeyField definem dados da tabela referenciada pela chave estrangeira. Neste caso, a tabela Cidade. Selecionando dados de uma lista (TDBComboBox) O campo Estado da tabela foi definido para aceitar siglas dos estados brasileiros, por isso tem apenas dois caracteres como tamanho. Vamos criar uma lista com essas siglas e o usurio do programa poder escolher uma delas. Para isso iremos usar o controle TDBComboBox, uma caixa combinada que permite a escolha a partir de uma lista ou a digitao de uma nova opo. Insira um objeto desses no form e defina suas propriedades de acordo com o quadro abaixo. Propriedade DataField DataSource Contedo Estado Descrio Define o campo da tabela que ser manipulado pelo controle dmDados.dsCliente Define o DataSource da tabela 95
Centro Universitrio Luterano de Santarm

Contedo IdCidade

Linguagem de Programao Comercial

Items Name Sorted Style Width Mtodos SetFocus Evento OnChange OnClick OnEnter OnExit

Contm a lista de strings com as opes dbcEstado Define o identificador do controle True Define se os itens estaro ordenados csDropDownList Define como o controle mostra os itens 65 Define o tamanho do componente Descrio Muda o foco para o controle Descrio Acontece quando o texto do controle modificado Ocorre quando o usurio clica no controle Acontece quando o controle recebe o foco Acontece quando o foco sai do controle Quadro 26 Propriedades, mtodos e eventos de DBComboBox

Clique no boto elipse da propriedade Items e digite os seguintes itens, um em cada linha do editor: AC, AM, PA, AP, RR, RO, MA, PI, CE, PE, RN. PB, SE, AL, BA, ES, MG, RJ, SP, SC, PR, RS, GO, TO, DF, MT, MS. No se preocupe com a ordem das opes, porque a propriedade Sorted cuida disso. A propriedade Style pode assumir os seguintes valores: csDropDown define uma caixa combinada tpica que permite edio e mostra uma caixa de lista para escolha de opo. csDropDownList define uma caixa combinada que no permite edio. Se for pressionada uma letra, o controle mostra a primeira opo que ele encontra iniciando com essa letra. csSimple define um controle que permite edio e sempre mostra a caixa de lista. A altura da caixa depende da propriedade Height.

Existem outros valores para essa propriedade, mas apenas essas so de nosso interesse. Insira um rtulo para identificar a caixa combinada e defina a propriedade Caption como Estado. Uma lista com poucas opes (TDBRadioGroup) O campo Sexo tem apenas duas opes: Masculino e Feminino. Mas, o tamanho do campo prev apenas um caractere. Vamos definir que M e F sero os caracteres que representaro o sexo do cliente. Selecione um objeto TDBRadioGroup na aba DataControls e o insira no form. Defina suas propriedades conforme o Quadro 27. Propriedade Caption Columns DataField DataSource Items Name Contedo Sexo 1 Descrio Define a legenda do controle Determina em quantas colunas a lista de opes ser apresentada Estado Define o campo da tabela que ser manipulado pelo controle dmDados.dsCliente Define o DataSource da tabela Contm a lista de strings com as opes dbrSexo Define o identificador do controle 96
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Values Mtodos SetFocus Evento OnChange OnClick OnEnter OnExit

Determina que valores sero escritos na tabela Descrio Muda o foco para o controle Descrio Acontece quando o texto do controle modificado Ocorre quando o usurio clica no controle Acontece quando o controle recebe o foco Acontece quando o foco sai do controle Quadro 27 Propriedades, mtodos e eventos de DBRadioGroup

Na propriedade Items so definidas as opes que o usurio escolhe. No nosso caso clique no boto elipse e digite Masculino e Feminino. A propriedade Values define os valores correspondentes s opes que sero escritos na tabela. Clique na propriedade Values e informe M e F. Caixa de verificao (TDBCheckBox) A situao cadastral do cliente dada pelo campo Situacao. Este campo assume dois valores: Ativo e Inativo. Sendo que ser escrito na tabela as letras A e I, correspondentes situao do cliente. Iremos usar uma caixa de verificao, DBCheckBox. Coloque um objeto desses no form. Defina suas propriedades de acordo com o quadro a seguir. Propriedade Caption DataField Descrio Define a legenda do controle Define o campo da tabela que ser manipulado pelo controle DataSource dmDados.dsCliente Define o DataSource da tabela Name dbxSituacao Define o identificador do controle ValueChecked A Determina o valor que ser escrito na tabela se a caixa estiver marcada ValueUnchecked I Determina o valor que ser escrito na tabela se a caixa estiver desmarcada Mtodos Descrio SetFocus Muda o foco para o controle Evento Descrio OnChange Acontece quando o texto do controle modificado OnClick Ocorre quando o usurio clica no controle OnEnter Acontece quando o controle recebe o foco OnExit Acontece quando o foco sai do controle Quadro 28 Propriedades, mtodos e eventos de DBCheckBox Para completar a parte visual da janela, insira um TDBNavigator e defina a propriedade DataSource como dmDados.dsCliente. E para finalizar a programao precisamos incluir o cdigo para abrir e fechar as tabelas. Observe que nos referimos a tabelas. No plural. Voc notou que a tabela Cliente se refere tabela Cidade atravs do componente TDBLookupComboBox. Portanto precisamos abrir e fechar as duas tabelas. Contedo Situao Situacao

97
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Selecione ento o form e a aba Events no Object Inspector. D um duplo clique no evento OnShow e digite o seguinte cdigo: dmDados.tbCidade.Open; dmDados.tbCliente.Open; Faa o mesmo para o evento OnClose e digite: dmDados.tbCidade.Close; dmDados.tbCliente.Close; O form frmCliente deve ficar como a Figura 75. Agora precisamos inserir o cdigo para chamar o form do cadastro de clientes na unit u_principal. Inicialmente abaixo de implementation acrescente u_cliente na clusula uses, de forma que fique assim: uses u_cidade, u_cliente;

Figura 75 O form de cadastro de clientes Em seguida clique na opo Cadastros | Cliente e digite o seguinte cdigo no editor: frmCliente.Show; Compile o projeto e execute o programa. Abra o form de cadastro de clientes e insira alguns registros.

Consultas a banco de dados


De nada valeria inserir dados em tabelas se no pudssemos fazer consultas. Recuperar dados cadastrados de vrias formas uma das caractersticas dos sistemas 98
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

gerenciadores de banco de dados (SGDB). Mesmo o Paradox no sendo um SGDB, o Delphi oferece recursos de consulta que suprem essa deficincia, e servem para qualquer sistema utilizado. Insira um novo form na aplicao. Altere a propriedade Name do form para frmConsCidade e o Caption para Consulta Cidades. Salve a unit e d a ela o nome u_conscidade. Ser necessrio acessar os componentes do Data Module, por isso acrescente abaixo de implementation, na unit u_conscidade, o seguinte cdigo: uses u_dmdados; Na aba Standard selecione e coloque no form um RadioGroup, um Edit e um Button. Defina suas propriedades de acordo com as descries a seguir:

RadioGroup Propriedade Contedo Caption Pesquisar por: ItemIndex 0 Items Cdigo Nome Name rgCampo Edit Propriedade Name Text Button Propriedade Caption Name Contedo edValor

Contedo Pesquisar btnPesquisar

Componente para o resultado da consulta (TDBGrid)


DBGrid um componente para apresentao de dados de tabelas em linhas e colunas. Mas pode tambm ser usado para inserir/alterar dados em tabelas. Selecione um objeto DBGrid na aba Data Controls e o insira no form. A janela deve ter o seguinte aspecto:

99
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 76 Form de consulta a cidades Vamos definir algumas propriedades de DBGrid conforme o quadro a seguir: Propriedade Columns Descrio Descreve os atributos de apresentao dos campos da tabela DataSource dmDados.dsCidade Define o DataSource da tabela Name dbgCidade Define o identificador do controle +TitleFont Define caractersticas da fonte dos ttulos das colunas da grade Mtodos Descrio SetFocus Muda o foco para o controle Evento Descrio OnEnter Acontece quando o controle recebe o foco OnExit Acontece quando o foco sai do controle Quadro 29 Propriedades, mtodos e eventos de DBGrid A propriedade Columns uma coleo de objetos TColumn. Pressione o boto elipse no Object Inspector e o editor de colunas ser mostrado. O primeiro boto na barra de ferramentas do editor adiciona um novo objeto TColumn. Voc pode definir que campo da tabela estar associado a ele atravs da propriedade FieldName. Na propriedade Title pode-se definir uma legenda (Caption) e as caractersticas da fonte. No entanto se no for adicionada nenhuma coluna no editor, o Delphi assume que todos os campos da tabela sero mostrados na grade. Neste caso, as caractersticas das colunas que sero mostradas so definidas atravs dos objetos TField. Objetos TField TField a classe ancestral de todas as classes Field de uma classe TTable. Esta classe tem propriedades, eventos e mtodos para alterar o valor de um campo em uma tabela, converter o valor de um campo em outro tipo de dado, fazer validao de dados, definir como os campos sero apresentados, etc. Propriedade Contedo Descrio 100
Centro Universitrio Luterano de Santarm

Contedo

Linguagem de Programao Comercial

AsCurrency AsDateTime AsInteger AsString DisplayLabel EditMask Name Required Evento OnChange OnValidate

Converte o valor do campo em Currency Converte o valor do campo em DateTime Converte o valor do campo em Integer Converte o valor do campo em String Define a legenda do ttulo na DBGrid Define uma mscara para restringir entrada de dados Define o identificador do controle Define se o campo obrigatrio Descrio Acontece quando o valor do campo escrito no buffer Acontece que os dados sejam escritos no buffer. Usa-se para validar dados Quadro 30 Propriedades, mtodos e eventos de TField

Para criar os objetos TField da tabela Cidade, d um duplo clique em tbCidade. Uma pequena janela semelhante da Figura 77 ser aberta:

Figura 77 Janela para criar TFields Clique com o boto direito do mouse na janela e selecione Add all fields. Todos os campos da tabela sero adicionados.

Pesquisa em tabelas usando Locate


O componente TTable oferece um mtodo para fazer pesquisas em tabelas. O mtodo Locate declarado em Delphi da seguinte forma: function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean; Onde: const KeyFields: String uma lista de campos objetos da pesquisa delimitados por ponto-e-vrgula. const KeyValues: Variant um array de Variant contendo os valores que se deseja pesquisar. Variant um tipo de dado que pode ser usado quando no possvel 101
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

determinar o tipo em tempo de compilao. Para criar um array de Variant use a funo VarArrayOf. Options: TLocateOptions especifica opes adicionais para a consulta. loCaseInsensitive define que a consulta ignora maisculas e minsculas. loPartialKey define que a busca parcial. Para usar essas opes necessrio incluir na clusula uses a unit DB. Na nossa consulta queremos que o usurio escolha um campo para pesquisa, digite o valor a ser pesquisado e clique no boto Pesquisar. Dessa forma d um duplo clique no boto e digite: with dmDados.tbCidade do if (rgCampo.ItemIndex = 0) then begin if not Locate('IdCidade', edValor.Text, []) then ShowMessage('Registro no encontrado'); end else if not Locate('Nome', edValor.Text, [loCaseInsensitive, loPartialKey]) then ShowMessage('Registro no encontrado'); Se for selecionado o campo IdCidade no RadioGroup, a busca ser feita pelo campo IdCidade, e se for selecionado o campo Nome a busca ser feita pelo campo Nome. Quando a busca feita pelo campo Nome usamos as opes loCaseInsensitive e loPartialKey, que definem que a pesquisa ignora maisculas e minsculas, e que a pesquisa pode ser feita por parte do campo Nome. A primeira linha do cdigo acima , iniciando com a palavra chave with, indica que mtodos e propriedades cujo objeto no informado devem considerar o objeto especificado nesta linha. Lembre de incluir DB na clusula uses conforme o cdigo seguinte: interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DB; Para que nosso programa funcione necessrio abrir e fechar a tabela adequadamente. Selecione ento o form e a aba Events no Object Inspector. D um duplo clique no evento OnShow e digite o seguinte cdigo: dmDados.tbCidade.Open; Faa o mesmo para o evento OnClose e digite: dmDados.tbCidade.Close; Agora precisamos inserir o cdigo para chamar o form de consulta de cidades na unit u_principal. Inicialmente abaixo de implementation acrescente u_conscidade na clusula uses, de forma que fique assim: 102
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

uses u_cidade, u_cliente, u_conscidade; Em seguida clique na opo Consultas | Cidade e digite o seguinte cdigo no editor: frmConsCidade.Show;

Pesquisa em tabelas usando TQuery


Pesquisas com Locate s retornam dados de uma nica tabela. Pesquisas que retornam dados de mais de uma tabela devem ser feitas usando o componente TQuery. Este objeto oferece uma propriedade que um comando SELECT de SQL. E isso d grande flexibilidade consulta. Como a maioria das propriedades dos componentes, possvel definir a propriedade SQL em tempo de desenvolvimento ou em tempo de execuo. Vamos criar a consulta tabela Cliente usando TQuery. Para isso selecione um componente TQuery na aba BDE e o insira no Data Module. Defina suas propriedades de acordo com o quadro seguinte:

Propriedade Active DatabaseName DataSource Name Params SQL State Mtodos ParamByName

Contedo False Clientes

Descrio Indica se a tabela est aberta ou no Define o banco de dados Define o componente de onde sero extrados valores de parmetros queConsCliente Define o nome do componente Query Define parmetros usados no comando SQL Define o comando SQL associado ao componente Indica o estado atual da tabela Descrio Acessa parmetros atravs de seus nomes Quadro 31 Propriedades e mtodos de TQuery

Os eventos e os mtodos, exceto Locate, do Quadro 21 se aplicam a TQuery. A propriedade SQL ser definida em tempo de execuo. Insira tambm um DataSource e defina a propriedade Name como dsConsCliente e na propriedade DataSet selecione queConsCliente. Inclua agora um novo form na aplicao. Altere a propriedade Name do form para frmConsCliente e o Caption para Consulta Clientes. Salve a unit e d a ela o nome u_conscliente. Ser necessrio acessar os componentes do Data Module, por isso acrescente abaixo de implementation, na unit u_conscliente, o seguinte cdigo: uses u_dmdados; Insira no form os mesmos componentes que foram inseridos na janela de consulta a Cidades. Os valores que foram definidos para as propriedades podem ser 103
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

igualmente definidos, com exceo de DataSource da DBGrid, que deve ser definida com dsConsCliente. Todas as aes desta consulta sero realizadas atravs do cdigo do evento OnClick do boto Pesquisar.

Figura 78 Cdigo do evento OnClick do boto btnPesquisar Vamos analisar o cdigo acima. A linha que inicia com with evita a repetio da escrita do nome do objeto todas as vezes que for necessrio se referir a ele. A idia geral do cdigo que fechamos a Query (mtodo Close), limpamos o contedo da sua propriedade SQL (mtodo Clear), inserimos um novo comando SELECT em SQL (mtodo Add), definimos um valor de parmetro (ParamByName) e abrimos novamente a Query (Open) para retornar os dados pesquisados. Quando o item selecionado em rgCampo o cdigo, o comando SELECT especifica o campo IdCliente em where. Os dois pontos (:) indicam que pIdCliente um parmetro. Ou seja, um valor que deve ser definido em tempo de execuo. Seu valor atribudo na linha seguinte usando ParamByName('IdCliente').Value. O valor digitado em edValor usado na consulta. Caso o usurio selecione o nome em rgCampo, o comando SELECT especifica o campo Nome em where, mas nesse caso usando like porque queremos fazer uma pesquisa parcial. Note que inclumos o smbolo % no valor do parmetro, de acordo com as regras do operador like. Agora precisamos inserir o cdigo para chamar o form de consulta de clientes na unit u_principal. Inicialmente abaixo de implementation acrescente u_conscliente na clusula uses, de forma que fique assim: uses u_cidade, u_cliente, u_conscidade, u_conscliente; Em seguida clique na opo Consultas | Cliente e digite o seguinte cdigo no editor: frmConsCliente.Show; 104
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Captulo 9 Aplicaes usando Banco de Dados Cliente/Servidor


Tudo que foi dito no Captulo 8 sobre acesso a banco de dados vlido tambm para os bancos de dados cliente/servidor. A aplicao Delphi pode acessar os dados diretamente ou atravs do BDE. Neste captulo apresentaremos o acesso atravs do conjunto de componentes da aba Interbase que no necessita BDE. Para criar a aplicao usaremos o banco de dados Firebird, um SGBD (Sistema Gerenciador de Banco de Dados) livre e de cdigo aberto, compatvel com Interbase. Nossa aplicao acessar um banco de dados com o seguinte modelo E-R:

Figura 79 Modelo E-R do banco de dados Para criar as tabelas usaremos os seguintes comandos SQL: CREATE TABLE CIDADE (ID_CIDADE INTEGER PRIMARY KEY, NOME VARCHAR(40) NOT NULL); NOT NULL

CREATE TABLE CLIENTE (ID_CLIENTE INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(40) NOT NULL, ENDERECO VARCHAR(40) NOT NULL, ID_CIDADE INTEGER REFERENCES CIDADE(ID_CIDADE), ESTADO CHAR(2), SEXO CHAR(1), SITUACAO CHAR(1)); CREATE TABLE PRODUTO (ID_PRODUTO INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(40) NOT NULL, PRECO_VENDA NUMERIC(12,2) NOT NULL, ESTOQUE INTEGER NOT NULL); 105
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

CREATE TABLE VENDA (ID_VENDA INTEGER NOT NULL PRIMARY KEY, TIPO CHAR(1) NOT NULL, DATA_VENDA DATE NOT NULL, VALOR_VENDA NUMERIC(12,2) NOT NULL, ID_CLIENTE INTEGER NOT NULL REFERENCES CLIENTE(ID_CLIENTE)); CREATE TABLE ITEM (ID_VENDA INTEGER NOT NULL REFERENCES VENDA(ID_VENDA), ID_PRODUTO INTEGER NOT NULL REFERENCES PRODUTO(ID_PRODUTO), QUANTIDADE INTEGER NOT NULL, PRIMARY KEY(ID_VENDA, ID_PRODUTO));

Iniciando a aplicao
Crie uma nova aplicao. No form crie um menu do tipo MainMenu com os seguintes itens: Arquivo Sair Cadastros Cidade Cliente Produto Venda Consultas Cidade Cliente Produto Relatrios Cidade Cliente Venda Ajuda Defina a propriedade Caption do form como Vendas e Name como frmPrincipal. Salve o projeto inteiro com o comando File | Save All atribuindo unit o nome u_principal e ao projeto o nome Vendas. Tome a precauo de salvar tudo no mesmo diretrio.

DataModule
Crie um DataModule selecionando File | New | Data Module, e na propriedade Name defina dmDados. Salve-o e d o nome u_dmdados para a unit. E vamos ento inserir os componentes de acesso ao banco de dados. Para esta aplicao usaremos o conjunto de componentes Interbase Express (IBX). Este conjunto se encontra na aba de componentes Interbase. TIBDatabase Este componente prov controle sobre uma conexo a um nico banco de dados. Oferece principalmente controle de transao e de logins de usurios. Todas as aplicaes que usam bancos de dados cliente/servidor necessitam deste componente. Selecione o componente TIBDatabase na aba Interbase e ponha-o no Data Module. Vejamos a seguir as propriedades, mtodos e eventos desse objeto: 106
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Propriedade Connected DatabaseName

Contedo Descrio True Indica se o banco de dados est aberto C:\Cliente\Cliente.fdb Define o nome do arquivo de banco de dados e o local onde ele se encontra DefaultTransaction Define um componente IBTransaction padro para o banco de dados LoginPrompt False Define se o login ser solicitado. Condicionado definio de usurio/senha na propriedade Params Name dbCliente Define o nome do componente Params Define parmetros que so passados ao servidor de banco de dados SQLDialect 3 Define o dialeto usado pelo banco de dados Mtodos Descrio Open Abre a conexo com o banco de dados. Connected fica em True Close Fecha a conexo com o banco de dados. Leva Connected a False Eventos Descrio OnLogin Ocorre quando a aplicao se conecta ao banco de dados AfterConnect Ocorre depois que uma conexo estabelecida BeforeConnect Ocorre antes que uma conexo seja estabelecida Quadro 32 Propriedades, mtodos e eventos de IBDatabase Defina a propriedade Params com o seguinte: user_name=sysdba password=masterkey Esta definio juntamente com LoginPrompt em False e Connected em True, definem que o login no ser solicitado ao usurio. S necessrio um componente TIBDatabase para toda a aplicao. O componente TIBTransaction O servidor de banco de dados Firebird est estruturado em um modelo de transao. As transaes permitem que instrues enviadas ao banco de dados ocorram em blocos, com a caracterstica especial de que estas instrues so tratadas como uma s, podendo ser executada completamente ou no ser executada. O gerenciamento de transaes do Firebird permite que aplicaes clientes iniciem mltiplas transaes simultneas. As transaes podem ser isoladas de modo que no so afetadas por alteraes realizadas por transaes concorrentes. O componente TIBTransaction prov controle de transao discreta sobre uma ou mais conexes de banco de dados. Em aplicaes que utilizam IBX cada componente TDataSet deve ter seu prprio componente TIBTransaction. Selecione um componente 107
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

desses na aba Interbase e o coloque no Data Module. A seguir as propriedades e mtodos de TIBTransaction. Propriedade Ative DeafultAction Descrio True Define se a transao est ativa TACommit Define a ao que ser executada quando o limite de tempo definido em IdleTimer atingido DefaultDatabase dbCliente Define o banco de dados padro da transao IdleTimer 0 Especifica quanto tempo uma transao deve esperar at que seja executado um Commit ou Rollback Name trCidade Define o nome do componente Params Define parmetros do buffer de transao Mtodos Descrio Commit Grava permanentemente os dados associados com a transao e finaliza a transao Rollback Cancela as atualizaes da transao e a finaliza Quadro 33 Propriedades e mtodos IBTransaction O componente TIBTable Este componente tem caractersticas e comportamento semelhantes ao componente TTable estudado anteriormente. A principal diferena que em TIBTable existe a propriedade Transaction. Nesta propriedade definimos qual o componente TIBTransaction associado ao componente TIBTable. Ento vamos definir a propriedade Database com dbCliente, Name com tbiCidade, Transaction como trCidade e TableName como CIDADE. Procure seguir essa ordem de definio das propriedades. No possvel selecionar a tabela se o objeto Transaction no for definido antes. necessrio escrever algum cdigo para efetuar o Commit na transao. Vamos inserir esse cdigo no mtodo do evento AfterPost de tbiCidade. Selecione o objeto tbiCidade, na aba Events d um duplo clique no evento AfterPost e digite o cdigo: procedure TdmDados.tbiCidadeAfterPost(DataSet: TDataSet); var Ponteiro: TBookMark; //1 begin Ponteiro := tbiCidade.GetBookmark; //2 if trCidade.InTransaction then //3 trCidade.Commit; if not tbiCidade.Active then //4 begin tbiCidade.Open; //5 tbiCidade.GotoBookmark(Ponteiro); //6 end; tbiCidade.FreeBookmark(Ponteiro); //7 end; 108
Centro Universitrio Luterano de Santarm

Contedo

Linguagem de Programao Comercial

Vamos analisar cada linha desse cdigo: Linha 1: declarao de uma varivel do tipo TBookMark. Esse tipo de dado define um ponteiro para um registro de tabela. Linha 2: GetBookmark um mtodo que retorna o ponteiro para o registro corrente. Linha 3: Verifica se existe uma transao ativa. Se existir executa o mtodo Commit. Linha 4: Verifica se a tabela est fechada. No conjunto de componentes IBX, sempre que uma transao finalizada as tabelas associadas com esse transao so fechadas, por isso na linha 5 a tabela aberta caso a verificao na linha 4 seja verdadeira. Linha 6: Faz o ponteiro da tabela ir para o registro que era corrente antes da tabela ser fechada. Linha 7: Libera a memria utilizada pelo ponteiro TBookMark. Em resumo: este cdigo encerra a transao, reabre a tabela e move o ponteiro para o registro que estava sendo atualizado antes da transao ser finalizada. Insira tambm um TDataSource da aba Access no Data Module. Defina a propriedade Name como dsCidade e DataSet como tbiCidade. Insira no Data Module componentes para as tabelas Cliente e Produto exatamente como foi feito at aqui para a tabela Cidade.

As interfaces de entrada de dados


Inclua um novo form na aplicao e defina seu nome e nome da unit exatamente como na interface criada para a tabela Cidade na aplicao anterior. Insira os mesmos componentes que foram inseridos na interface da tabela Cidade anterior. Para fazer a associao dos controles com o DataSource da tabela Cidade digite o seguinte cdigo abaixo de implementation na unit u_cidade: uses u_dmdados; Para abrir e fechar a tabela necessrio incluir cdigo nos eventos OnShow e OnClose do form. D um duplo clique no evento OnShow e complete o cdigo: procedure TfrmCidade.FormShow(Sender: TObject); begin dmDados.tbiCidade.Open; end; Agora d um duplo clique no evento OnClose. Digite o cdigo para fechar a tabela Cidade. procedure TfrmCidade.FormClose(Sender: TObject; var Action: TCloseAction); begin dmDados.tbiCidade.Close; end;

109
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Selecione o form principal e complete o cdigo para chamar a tela de cadastro de cidades, exatamente como foi feito na aplicao anterior. Siga os mesmos procedimentos para criar as interfaces de entrada de dados das tabelas Cliente e Produto. Crie-as da mesma forma que foi criada a interface de Cliente anterior. Execute o programa e insira dados nas tabelas Cidade, Cliente e Produto.

Form mestre-detalhe
Vamos analisar uma nota fiscal:

Figura 80 Nota fiscal A rea identificada com a chave onde so especificados os produtos constantes da nota fiscal. Cada linha dessa regio corresponde, em geral, a um produto. Toda a rea 110
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

restante onde ficam os dados da nota: cliente, data, total da nota, etc. Dessa anlise podemos concluir que uma nota fiscal composta de muitos produtos. E tambm podemos afirmar que um produto pode estar presente em vrias notas fiscais, visto que um produto pode ser vendido para vrios clientes. Ou seja, o relacionamento entre as entidades nota fiscal e produto N:N. Sendo um relacionamento muitos para muitos, este relacionamento possui atributos. Esse relacionamento est representado no modelo E-R da Figura 79. Data Module No Data Module insira um TIBTable, um TIBTransaction e um TDataSource e faa as associaes e definies necessrias para eles se conectarem tabela Venda. Ao TIBTable d o nome tbiVenda, ao TIBTransaction d o nome trVenda e ao TDataSouce d o nome dsVenda. Insira um TIBTable, um TIBTransaction e um TDataSource e faa as associaes e definies necessrias para eles se conectarem tabela Item. Ao TIBTable d o nome tbiItem, ao TIBTransaction d o nome trItem e ao TDataSouce d o nome dsItem. Lembre de incluir o cdigo para o evento AfterPost de cada uma dessas tabelas, da mesma forma que foi feito para as tabelas Cidade, Cliente e Produto. Agora vamos definir o relacionamento mestre-detalhe entre a tabela Venda (mestre) e a tabela Item (detalhe). Inicialmente selecione tbiItem e localize a propriedade MasterSource. Nesta propriedade selecione o objeto dsVenda. Assim estamos dizendo que Venda mestre (Master) de Item. Em seguida precisamos definir a chave estrangeira (detalhe) e a chave primria (mestre) do relacionamento. Na propriedade MasterFields de tbiItem clique no boto elipse. Ser aberta a tela Field Link Designer onde faremos essa definio.

Figura 81 Tela de definio da ligao entre duas tabelas Selecione o campo ID_VENDA na caixa Detail Fields, que define a chave estrangeira da tabela detalhe, e na caixa Master Fields, que define a chave primria da tabela mestre. O boto Add ser habilitado. Clique nele e a relao ser mostrada na caixa Joined Fields. Confirme no boto OK. Est pronto o relacionamento mestredetalhe. 111
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

A interface de entrada de dados Insira um novo form no programa. Altere a propriedade Caption para Vendas e a propriedade Name para frmVenda. Salve-o e defina o nome da unit como u_venda. Na rea implementation digite a linha de cdigo: uses u_dmdados; Insira objetos e defina suas propriedades de acordo com as informaes a seguir: Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Label Propriedade Caption Contedo Id Contedo ecNormal Id_Venda dmDados.dsVenda dbeId_Venda 75 Contedo Data Contedo ecNormal Data_Venda dmDados.dsVenda dbeData_Venda 100 Contedo Cliente

DBLookupComboBox Propriedade Contedo DataField Id_Cliente DataSource dmDados.dsVenda KeyField Id_Cliente ListField Nome ListSource dmDados.dsCliente Name dblId_Cliente Width 200

112
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

DBRadioGroup Propriedade Contedo Caption Tipo de Venda Columns 2 DataField Tipo DataSource dmDados.dsVenda Height 40 Items Venda vista Venda prazo Name dbrTipo Values V P Width 240 Label Propriedade Caption DBEdit Propriedade CharCase DataField DataSource Name Width Contedo Valor Contedo ecNormal Valor_Venda dmDados.dsVenda dbeValor_Venda 150

DBNavigator Propriedade Contedo DataSource dmDados.dsVenda GroupBox Propriedade Contedo Caption Itens DBGrid Propriedade DataSource Name Contedo dmDados.dsItem dbgItem

Note que, nesta janela, estamos utilizando trs tabelas: Venda, Item e Cliente. Lembre que no objeto DBLookupComboBox, ligamos ele tabela Cliente atravs do DataSource dsCliente. Portanto necessrio abrir as trs tabelas para que a janela funcione corretamente. Ento, no evento OnShow do form digite o seguinte cdigo: procedure TfrmVenda.FormShow(Sender: TObject); begin dmDados.tbiVenda.Open; dmDados.tbiItem.Open; dmDados.tbiCliente.Open; end; 113
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

E no evento OnClose digite o seguinte: procedure TfrmVenda.FormClose(Sender: TObject; var Action: TCloseAction); begin dmDados.tbiVenda.Close; dmDados.tbiItem.Close; dmDados.tbiCliente.Close; end; A interface, aps todas essas definies dever ter o aspecto mostrado na Figura 82.

Figura 82 Form de Vendas Selecione o form principal e acrescente o cdigo necessrio para chamar a janela de vendas. Execute o programa e chame a tela de Vendas. Insira os dados de uma venda (sem os itens) e depois salve usando o boto do navegador. Se a venda no for salva, quando voc tentar incluir um item o programa retornar uma mensagem do Firebird alertando para erro de chave estrangeira. Na DBGrid deve estar aparecendo as colunas ID_VENDA, ID_PRODUTO e QUANTIDADE. Clique na coluna ID_PRODUTO e digite um cdigo de produto que voc tenha cadastrado. Observe que, automaticamente, o ID_VENDA preenchido com a chave da venda inserida. V para o campo QUANTIDADE e digite qualquer valor e tecle ENTER se no quiser mais inserir itens ou a seta para baixo para inserir um novo item. Para excluir um item na DBGrid selecione-o e pressione CTRL + DEL. Uma pergunta ser feita para confirmar a excluso do item. Voc deve ter observado que, no objeto DBLookupComboBox, a lista de clientes no abre totalmente, mostrando apenas uma linha. Para resolver isso, selecione o

114
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

DBLookupComboBox, na aba Events do Object Inspector d um duplo clique no evento OnDropDown e digite o seguinte cdigo: procedure TfrmVenda.dblId_ClienteDropDown (Sender: TObject); begin dmDados.tbiCliente.MoveBy(5); end; Agora vamos melhorar nossa interface. Inicialmente vamos incluir mscaras para a data e para o valor da venda. Selecione o Data Module e crie os objetos TField de tbiVenda. Ainda com a tela de criao de TFields aberta, selecione DATA_VENDA e na propriedade EditMask digite !99/99/0000;1;_. Agora as barras da data no precisam ser digitadas. Selecione VALOR_VENDA e na propriedade DisplayFormat digite ###,##0.00. Com isso, o valor da venda ser formatado com ponto separando milhar e vrgula decimal. Crie os objetos TField de tbiItem. Selecione ID_VENDA e na propriedade Visible escolha False. Isso far com que esta coluna seja ocultada na DBGrid, pois no precisamos digit-la, visto que a definio mestre-detalhe inclui seu valor automaticamente. Seria interessante podermos selecionar o produto de uma lista na DBGrid, em vez de digitar o cdigo. Vamos ento criar um objeto TField do tipo Lookup manualmente, que faa isso para ns. Na tela de criao de TFields de tbiItem clique com o boto direito e selecione New Field. Uma janela como a da Figura 83 ser aberta.

Figura 83 Criao de campo Lookup Preencha os campos exatamente como est mostrado. O campo Component tem preenchimento automtico. Campo Lookup busca dados em outra tabela atravs de um relacionamento. Neste caso, o campo ID_PRODUTO da tabela Item (Key Fields) usada para fazer o relacionamento com a chave primria ID_PRODUTO (Lookup Keys) da tabela Produto (Dataset) e retornar o NOME (Result Field). Pressione OK para confirmar. Arraste o novo TField para ficar depois de ID_PRODUTO. 115
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Vamos criar tambm um TField para calcular o valor total de cada produto, resultado do produto da quantidade pelo preo de venda. Na tela de criao de TFields de tbiItem selecione New Field. D o nome TOTAL para o campo, especifique que o tipo de dado float e marque o tipo Calculated. Veja a Figura 84. Confirme pressionando o boto OK. Isto cria um campo calculado, mas no define que clculo ser feito. Os campos desse tipo so calculados no evento OnCalcFields do DataSet correspondente.

Figura 84 Criao de campo calculado Selecione tbiItem e na aba Events d um duplo clique no evento OnCalcFields. Digite o seguinte cdigo: procedure TdmDados.tbiItemCalcFields(DataSet: TDataSet); begin if tbiProduto.Locate('ID_PRODUTO', tbiItemID_PRODUTO.Value, []) then tbiItemTOTAL.Value := tbiItemQUANTIDADE.Value * tbiProdutoPRECO_VENDA.Value; end; Neste mtodo, inicialmente o produto localizado usando o mtodo Locate. A chave primria do produto digitado passada como parmetro. Se for localizado, na linha seguinte o campo TOTAL calculado multiplicando-se a QUANTIDADE de tbiItem pelo PRECO_VENDA e tbiProduto. Compile, rode o programa e faa testes inserindo vendas. Trabalhando com excees No cdigo que vamos apresentar em seguida h comandos no estudados ainda, por isso vamos abrir uma janela na sequncia que estamos seguindo para apresentar o tratamento de excees no Delphi. A idia por trs das excees fazer programas mais robustos adicionando a capacidade de manipular erros de software e hardware de maneira uniforme. Um 116
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

programa pode sobreviver a tais erros ou terminar normalmente, permitindo ao usurio salvar os dados antes de sair. Excees permitem separar o cdigo de manipulao de erros do seu cdigo normal em vez de misturar os dois. Outro benefcio das excees definir um mecanismo para relatar erros, universal e uniforme, que tambm usado pelos componentes do Delphi. Do ponto de vista do cdigo em que levantada, uma exceo passada ao cdigo que o chama e assim por diante. Se nenhuma parte do seu cdigo trata a exceo, o prprio Delphi a trata, mostrando uma mensagem de erro padro e tenta continuar a execuo do programa, manipulando a prxima mensagem do sistema ou requisio do usurio. O mecanismo completo de tratamento de excees baseado em quatro palavras chaves: try - delimita o incio de um bloco de cdigo protegido. except - delimita o fim de um bloco de cdigo protegido e introduz os cdigos de manipulao de exceo, com a seguinte sintaxe: on tipo-de-exceo do comando finally - usado para especificar um bloco de cdigo que sempre ser executado mesmo quando ocorrem excees. Este bloco geralmente usado para operaes de limpeza que sempre sero executadas, tais como fechar arquivos ou tabelas de bancos de dados, liberar objetos, liberar memria ou outros recursos requisitados pelo programa. raise - comando para criar uma exceo. Muitas excees so geradas pelo prprio sistema, mas voc pode gerar suas prprias excees quando encontrar dados invlidos ou inconsistentes em tempo de execuo. Este comando tambm pode ser usado para relanar uma exceo dentro de um manipulador, isto , propag-la para o prximo manipulador. Vejamos um exemplo: try result := A div B; except on EDivByZero do ShowMessage ('Ocorreu uma tentativa de dividir por zero'); end; Neste caso, se B for igual a zero, uma exceo do tipo EDivByZero levantada e tratada pelo bloco except. possvel ter um bloco try somente com um bloco finally. Neste caso, no queremos tratar uma exceo, mas garantir que um bloco de cdigo ser executado mesmo que ocorra uma exceo. Calculando o total da nota Para finalizar a interface de venda vamos fazer a implementao que ir calcular o total da venda. No existe uma maneira visual de fazer isso, tudo tem que ser feito

117
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

atravs de cdigo. Mostramos o cdigo na Figura 85 e vamos analis-lo detalhadamente. A idia por trs do cdigo que, sempre que inserirmos ou excluirmos um produto da nota, ele percorre todos os itens calculando o novo total. Depois do clculo, esse valor atribudo ao campo VALOR_VENDA da nota fiscal. Esse cdigo ser ento programado nos eventos AfterPost e AfterDelete de tbiItem. Para no haver repetio de cdigo, vamos criar um procedimento que ser chamado AtualizaTotal, e depois ele ser chamado nos eventos citados. Lembre de incluir a assinatura do mtodo na seo type. A seguir analisamos cada linha do cdigo: Linha 6: Guarda o ponteiro do registro atual da tabela Item, pois durante o clculo os registros de itens da venda sero percorridos um a um, e depois retornaremos posio corrente.

Figura 85 Cdigo para atualizar o total da venda Linha 8: Desabilita os controles Data-Aware que esto associados a tbiItem, para evitar que durante a varredura dos itens, os controles reflitam as mudanas de registro. Linha 9: Posiciona o ponteiro de registros no primeiro item. A configurao mestredetalhe limita a varredura apenas aos itens constantes da nota fiscal. Linha 10: Inicializa a varivel que receber o total da nota. Linha 11: Verifica se o ltimo registro no foi alcanado. Linha 13: Acumula o total do item na varivel totalizadora. Linha 14: Muda o ponteiro para o prximo registro.

118
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Linhas 16 e 17: Verifica se a tabela est em estado de navegao (dsBrowse). Se estiver, muda o estado para edio. Linha 18: O objeto TField correspondente a VALOR_VENDA recebe o total calculado. Linhas 20 a 24: Este bloco ser executado mesmo que ocorra uma exceo no bloco try. Habilita novamente os controles Data-Aware associados a tbiItem, retorna ao registro corrente antes da execuo do mtodo e libera a memria ocupada pelo ponteiro. Inclua uma chamada a AtualizaTotal nos eventos AfterPost e AfterDelete de tbiItem. Compile e execute o programa. Faa testes de incluso, alterao e excluso de itens nas notas para perceber o efeito do cdigo que inserimos.

Relatrios
Relatrios so como consultas a bancos de dados enviadas para uma impressora, conectada ao computador. Para construir nossos relatrios utilizaremos o conjunto de componentes Rave. Rave uma sigla para Report Authoring Visual Environment. Essa ferramenta possibilita que os relatrios sejam criados utilizando cdigo, ou seja, totalmente em Object Pascal, ou que sejam criados usando a sua IDE. Os relatrios so criados como projetos e gravados em arquivos. Esses arquivos podem ser incorporados aplicao e, se for necessrio alter-los, no preciso compilar o programa novamente. Vamos abordar apenas a criao de relatrios usando a IDE do Rave. Os componentes necessrios para criar relatrios esto localizados na aba Rave.

Figura 86 Aba de componentes Rave Para a criao dos relatrios inicialmente so inseridos componentes desta aba na aplicao. Os componentes inseridos definem um projeto e a conexo da ferramenta com um objeto DataSet. Depois o Rave chamado para criar o relatrio visualmente. Pode-se chamar o Rave atravs de um duplo clique no componente RvProject, ou selecionando-se a opo Tools | Rave Designer no menu do Delphi. Construdo o relatrio, ele salvo como um arquivo e incorporado aplicao atravs do objeto RvProject. Finalmente, para executar o relatrio inclumos uma linha de cdigo para fazer a chamada onde for conveniente.

Relatrio de Cidades
Vamos ento criar o relatrio de Cidades. Selecione o Data Module e insira um componente RvSystem da aba Rave. Este componente responsvel pelo envio do relatrio para uma impressora ou para a tela de Preview. Altere suas propriedades como o quadro seguinte: Propriedade Name TitlePreview TitleSetup TitleStatus Contedo Descrio rvsysVendas Define o nome do objeto Previso do Relatrio Opes de Impresso Status de Impresso Quadro 34 Propriedades do componente RvSystem

119
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Insira um componente RvProject. Este componente responsvel pela ligao entre o projeto Delphi e o projeto de relatrios Rave. Altere suas propriedades de acordo com o quadro: Propriedade Engine Name Contedo Descrio rvsysVendas Define um motor de relatrio rvVendas Define o nome do componente Quadro 35 Propriedades do componente RvProject

Insira um componente RvDataSetConnection. Este componente exporta um DataSet do projeto Delphi para o projeto Rave. Altere suas propriedades de acordo com o quadro: Propriedade Contedo Descrio DataSet tbiCidade Define o DataSet objeto do relatrio Name rdsCidade Define o nome do componente Quadro 36 Propriedades do componente RvDataSetConnection Agora d um duplo clique no objeto rvProject para abrir o Rave Visual Designer. Voc tambm pode abrir o IDE selecionando a opo Tools | Rave Designer no menu do Delphi. Localize cada elemento da interface conforme as identificaes feitas na Figura 87.
Paletas de Componentes

Barra de Ferramentas

rvore de objetos

Painel de Propriedades

A Pgina

Figura 87 Rave Visual Designer Selecione File | New para criar um novo projeto de relatrio. Selecione File | Save para salvar o projeto e d a ele o nome Vendas.rav. 120
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Configuraes gerais Na rvore de Objetos, selecione RaveProject e, no Painel de Propriedades, altere a propriedade Units para unMM (milmetros). Expanda Report Library e, selecione Report1. No Painel de Propriedades, altere a propriedade FullName para Relatrio Geral de Cidades, e a propriedade Name para rptCidade. Abaixo de rptCidade selecione Page1. No Painel de Propriedades, altere as propriedades de acordo com a Figura 88. So propriedades da pgina onde ser construdo o relatrio. Desta forma alteramos as dimenses para o tamanho A4 e a grade que orientar o desenho do relatrio.

Figura 88 Propriedades do objeto Page1 Acesso aos Dados Para imprimir um relatrio necessrio ter acesso aos dados, nesse caso da tabela Cidade. No Rave isto feito atravs do Data Object. Para criar o Data Object, selecione no menu File | New Object, ou pressione o boto correspondente na barra de ferramentas. Assim, aparecer a tela:

Figura 89 Janela para criao da conexo a dados Selecione a opo Direct Data View. Isto dar acesso a todos os objetos do tipo DataSet que inserimos na aplicao. Pressione o boto Next. Aparecer nova tela mostrando todos os objetos RvDataSetConnection inseridos no projeto. Como foi inserido apenas um, o rdsCidade, selecione-o e clique no boto Finish. Na rvore de Objetos expanda Data View Directory. Selecione DataView1 e, no Painel de Propriedades, altere a propriedade Name para dvCidade, e a propriedade Full Name para Registros de Cidade.

121
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 90 rvore de Objetos

Desenhando o relatrio Nas Paletas de Componentes selecione a aba Report. Nesta aba selecione o componente Region e o coloque na Pgina. Esse componente determina e delimita a rea de impresso da pgina. Redimensione o componente Region de modo que ocupe quase toda a rea da Pgina. Deixe uma rea livre no final da pgina, onde ser o rodap. A pgina deve ficar como a Figura 92. Region Figura 91 Componente Region

Componente Region

Rodap da pgina Figura 92 rea de impresso Selecione a aba Report, selecione e insira em Region um componente Band e um DataBand. Esses componentes so usados para definirmos o que ser impresso no relatrio. 122
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Band e DataBand Figura 93 Componentes Band e DataBand A Figura 94 mostra a pgina de impresso depois de inseridos os objetos Band e DataBand. No componente Band definiremos o ttulo do relatrio e os rtulos dos cabealhos de colunas. Em DataBand sero inseridos os dados da tabela a serem impressos.

Figura 94 Pgina com os objetos Band e DataBand Selecione Band1 e altere suas propriedades no Painel de Propriedades. Selecione a propriedade BandStyle e a seguinte janela ser aberta:

Figura 95 Editor da propriedade BandStyle 123


Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Em Print Location marque Body Header. E em Print Occurrence marque First e New Page. Na propriedade ControllerBand selecione DataBand1. Defina a propriedade Name como PageHeader. Selecione o objeto Band2 e altere as propriedades Name para Detalhe, e DataView para dvCidade. Vamos colocar um ttulo no cabealho da pgina e ttulos no cabealho de coluna. Para isso vamos usar o componente Text da aba Standard. Text Figura 96 Componente Text Insira um Text em PageHeader. Altere a propriedade Text para Relatrio de Cidades e FontJustify para pjCenter. Altere a propriedade Font para definir seu tamanho, nome e estilo de acordo com a sua preferncia. Ajuste a largura e a posio do componente para que ele fique centralizado. Insira mais dois componentes Text abaixo do ttulo do relatrio, que sero os rtulos das colunas ID_CIDADE e NOME. A pgina deve ficar como a figura abaixo:

Figura 97 Pgina com os objetos Band e DataBand Para exibir data de impresso do relatrio, insira no cabealho um componente DataText da aba Report. Na propriedade DataField pressione o boto elipse. Na caixa Report Variables selecione DateShort. Clique no boto Insert Report Var e a varivel selecionada ser inserida na caixa Data Text. Pode ser deixado assim ou inclua um texto para identificar a varivel. Por exemplo: 'Emitido em: ' + Report.DateShort

124
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 98 Editor de Data Text Insira outro DataText no cabealho para imprimir o nmero da pgina. Em Report Variables selecione CurrentPage e proceda da mesma maneira que foi feito para a data. Agora iremos montar a banda detalhe, onde sero impressos os dados da tabela. Com a tecla CTRL pressionada, arraste cada campo abaixo de dvCidade na rvore de Objetos, para a posio desejada na banda detalhe. Aparecer um componente DataText para cada campo arrastado.

Figura 99 Aparncia do projeto do relatrio Salve o projeto. Pressione a tecla F9 para visualizar uma prvia do relatrio. Para imprimir o relatrio no Delphi, selecione o objeto rvVendas no Data Module. Na propriedade ProjectFile selecione o arquivo Vendas.Rav que acabamos de criar. Agora vamos ao nosso menu principal e selecionar a opo Relatrios | Cidade. No mtodo do evento OnClick desse item digite: dmDados.rvVendas.ExecuteReport('rptCidade'); 125
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Pronto. Agora vamos compilar e executar o programa.

Relatrio de Clientes
O relatrio de clientes ser com quebra de grupo. Ou seja, os clientes sero listados por cidade. A cada nova cidade ser impresso o nome da cidade e em seguida todos os clientes daquela cidade. No Data Module vamos inserir um componente IBTransaction da aba Interbase. Defina sua propriedade Name como trRelCliente e em DefaultDatabase selecione dbCliente. Insira tambm um IBQuery. Na propriedade Database selecione dbCliente. Em Name defina queRelCliente e em Transaction selecion trRelCliente. Na propriedade SQL digite: SELECT a.ID_CLIENTE, a.NOME, a.ENDERECO, b.ID_CIDADE, b.NOME FROM CLIENTE a, CIDADE b WHERE a.ID_CIDADE = b.ID_CIDADE ORDER BY b.ID_CIDADE; Selecione um objeto RvDataSetConnection da aba Rave. Altere a propriedade Name para rdsCliente em DataSet selecione queRelCliente. Em um mesmo projeto Rave podemos criar vrios relatrios. Desta forma, vamos criar esse relatrio no mesmo projeto criado anteriormente. No menu selecione File | New Report. Na rvore de Objetos selecione o novo relatrio, Report1. Atravs do Painel de Propriedades altere FullName para Relatrio de Clientes e Name para rptCliente. Altere as dimenses de Page1 da mesma forma que foi definido em rptCidade. necessrio definir acesso aos dados atravs de um Data Object. Crie um novo objeto e, procedendo da mesma maneira que foi feito para o relatrio de cidades, selecione rdsCliente. Na rvore de Objetos expanda Data View Directory. Selecione DataView1 e, no Painel de Propriedades, altere a propriedade Name para dvCliente, e a propriedade Full Name para Registro de Cliente. Desenhando o relatrio Insira um componente Region (aba Report) na Pgina. Redimensione-o para ocupar toda a pgina. Insira dois componente Band e um DataBand. Defina suas propriedades da seguinte forma: DataBand Propriedade Contedo DataView dvCliente Name Detalhe Band Propriedade BandStyle ControllerBand Name Contedo Selecione Body Header e First Detalhe PageHeader

126
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Band Propriedade BandStyle ControllerBand GroupDataView GroupKey Name

Contedo Selecione Group Header e First Detalhe dvCliente ID_CIDADE GroupHeader

Insira um Text (aba Standard) em PageHeader e defina a propriedade Text como Relatrio de Clientes. Defina suas propriedades conforme foi feito no relatrio anterior.

DataText Text Text

Figura 100 A banda GroupHeader A banda GroupHeader ter a aparncia da Figura 100. Insira os componentes conforme mostrado na figura. Lembre que, para definir um DataText, voc deve arrastar o campo a partir da rvore de Objetos segurando a tecla CTRL. Na aba Drawing selecione um componente HLine e o insira na parte de baixo da banda GroupHeader. Redimensione-o para ocupar a largura da pgina. Insira os campos DataText na banda detalhe de maneira que ela fique com a aparncia mostrada na figura abaixo:

Figura 101 A aparncia final do desenho do relatrio Salve o projeto. Pressione a tecla F9 para visualizar uma prvia do relatrio.

127
Centro Universitrio Luterano de Santarm

Linguagem de Programao Comercial

Figura 102 Prvia do relatrio Para executar o relatrio no Delphi, no menu principal selecione Relatrios | Cliente e digite o seguinte cdigo no mtodo do evento OnClick: dmDados.rvVendas.ExecuteReport('rptCliente');

128
Centro Universitrio Luterano de Santarm

Оценить