Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Santarm 2009
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
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
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
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
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
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
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
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
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
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
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
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
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.
15
Centro Universitrio Luterano de Santarm
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.
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.
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.
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:
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 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
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
lista de arquivos fonte do projeto. Escolha o arquivo do projeto ou qualquer outro que lhe interesse visualizar.
22
Centro Universitrio Luterano de Santarm
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.
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
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
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
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
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.
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
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
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
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
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:
32
Centro Universitrio Luterano de Santarm
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.
33
Centro Universitrio Luterano de Santarm
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
35
Centro Universitrio Luterano de Santarm
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
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.
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.
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.
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
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.
40
Centro Universitrio Luterano de Santarm
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
41
Centro Universitrio Luterano de Santarm
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
pressionamos esta tecla o foco ser mudado para o controle definido na propriedade FocusControl.
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
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
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.
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
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.
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
47
Centro Universitrio Luterano de Santarm
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
Figura 41 Componente GroupBox Basicamente alteraremos a as propriedades Name e Caption. Defina Name como gbDados e Caption como Dados Pessoais.
49
Centro Universitrio Luterano de Santarm
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
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
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
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
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
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
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
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
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
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.
Name
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
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
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.
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:
64
Centro Universitrio Luterano de Santarm
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
66
Centro Universitrio Luterano de Santarm
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
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.
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.
70
Centro Universitrio Luterano de Santarm
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
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
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.
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
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
75
Centro Universitrio Luterano de Santarm
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
Edit Propriedade Name Text Width Label Propriedade Caption Edit Propriedade Name Text Width
GroupBox Propriedade Contedo Caption Escrita Button Propriedade Caption Name Button Propriedade Caption Name Contedo &Novo btnNovo Contedo &Salvar btnSalvar
77
Centro Universitrio Luterano de Santarm
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:
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.
79
Centro Universitrio Luterano de Santarm
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
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 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
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
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
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
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.
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.
85
Centro Universitrio Luterano de Santarm
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 *
Situacao IdCidade
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.
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
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
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
89
Centro Universitrio Luterano de Santarm
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 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
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
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
Agora compile e execute o projeto. Abra a interface de cadastro de cidades e insira alguns registros na tabela.
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
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
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
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.
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
99
Centro Universitrio Luterano de Santarm
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
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.
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
uses u_cidade, u_cliente, u_conscidade; Em seguida clique na opo Consultas | Cidade e digite o seguinte cdigo no editor: frmConsCidade.Show;
Propriedade Active DatabaseName DataSource Name Params SQL State Mtodos ParamByName
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
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
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
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
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
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
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.
109
Centro Universitrio Luterano de Santarm
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
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
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
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
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
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
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
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
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
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
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
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
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
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:
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
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
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
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.
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
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