Sei sulla pagina 1di 211

Delphi Fundamentos

Nilton Ren Alberto Brustolin

CAXIAS DO SUL 2003

Sumrio
INTRODUO...........................................................................................................................................................................5

OBJETIVOS ...........................................................................................................................................................................5
VERSES....................................................................................................................................................................................6 IDE................................................................................................................................................................................................7 O FORM DESIGN...................................................................................................................................................................7 A BARRA DE MENU PRINCIPAL.......................................................................................................................................8 A PALETA DE COMPONENTES .........................................................................................................................................8 A SPEEDBAR .........................................................................................................................................................................9 OBJECT INSPECTOR ............................................................................................................................................................9 CODE EDITOR .....................................................................................................................................................................11 CODE INSIGHT....................................................................................................................................................................12 SPEED MENUS ....................................................................................................................................................................13 DESKTOPS TOOLBAR .......................................................................................................................................................13 CONFIGURAES DO AMBIENTE .................................................................................................................................14 Autosave Options ...........................................................................................................................................................14 Compiling and running ..................................................................................................................................................14 Form designer.................................................................................................................................................................14 TECLAS IMPORTANTES .....................................................................................................................................................15 PROJETO EM DELPHI .........................................................................................................................................................16 .PAS E .DPR ..........................................................................................................................................................................18 SALVAR O PROJETO .........................................................................................................................................................18 ABRIR O PROJETO .............................................................................................................................................................19 OPES DE PROJETO........................................................................................................................................................20 Forms................................................................................................................................................................................20 Application .......................................................................................................................................................................20 Compiler...........................................................................................................................................................................20 Linker ................................................................................................................................................................................20 Directories/Conditionals ................................................................................................................................................21 Version Info .....................................................................................................................................................................21 Packages .........................................................................................................................................................................21 A LISTA TO-DO...................................................................................................................................................................21 TIPOS DE COMPONENTES .................................................................................................................................................21 Visveis .............................................................................................................................................................................21 No-Visveis ....................................................................................................................................................................21 CONVENO DE NOMEAO ..........................................................................................................................................22 MANIPULANDO COMPONENTES.....................................................................................................................................22 Utilizando o Object Inspector .......................................................................................................................................23 MANIPULANDO EVENTOS .................................................................................................................................................25 Construo de um manipulador de evento para o objeto button. .........................................................................26 Executando a aplicao ................................................................................................................................................27 COMENTRIOS...................................................................................................................................................................27 UM POUCO MAIS SOBRE EVENTOS..............................................................................................................................27 VCL ............................................................................................................................................................................................28 Objeto Form (Formulrio)..........................................................................................................................................28 Objeto Button (Boto) ................................................................................................................................................30 Objeto Edit (Caixa de edio)...................................................................................................................................30 Objeto Label (Rtulo de orientao) .......................................................................................................................31

Sugesto: Exercicio 1....................................................................................................................................................31 MAIS SOBRE A PALETA STANDARD ............................................................................................................................32 Objeto Memo (Memorando)......................................................................................................................................32 Objeto CheckBox (Caixa de verificao)................................................................................................................32 Objeto RadioButton (Boto de radio) ....................................................................................................................33 Objeto ListBox (Caixa de listagem) .........................................................................................................................33 Objeto ComboBox (Caixa de listagem em formato de cortina)..........................................................................33 Objeto GroupBox (Caixa de agrupamento) ...........................................................................................................34 Objeto RadioGroup (Grupo de botes radio) ..........................................................................................................34 Objeto Panel (Painel) .................................................................................................................................................35 Objetos MainMenu e PopupMenu (Menu principal e Menu rpido)..................................................................35 Sugesto: Exerccio 2....................................................................................................................................................35 A LINGUAGEM OBJECT PASCAL ....................................................................................................................................36 O MDULO .DPR ................................................................................................................................................................36 AS UNITS..............................................................................................................................................................................36 Cabealho........................................................................................................................................................................37 Interface ...........................................................................................................................................................................37 Implementao ...............................................................................................................................................................38 Inicializao .....................................................................................................................................................................38 Finalizao.......................................................................................................................................................................38 ATRIBUIO.......................................................................................................................................................................38 DECLARAO DE VARIVEIS.......................................................................................................................................38 TIPOS PARA MANIPULAO DE VARIVEIS ............................................................................................................39 Tipos de variveis Inteiras............................................................................................................................................39 Tipos de nmeros Reais ...............................................................................................................................................39 Tipos de variveis booleanas ......................................................................................................................................39 Tipos de variveis de caracteres.................................................................................................................................39 Tipo genrico (Variant)..................................................................................................................................................39 FUNES DE CONVERSO E MANIPULAO...........................................................................................................40 EXPRESSES LGICAS ....................................................................................................................................................40 COMANDO IF ......................................................................................................................................................................40 COMANDO CASE................................................................................................................................................................41 COMANDO REPEAT...........................................................................................................................................................41 COMANDO WHILE.............................................................................................................................................................41 COMANDO FOR ..................................................................................................................................................................42 COMANDO BREAK ............................................................................................................................................................42 COMANDO WITH ...............................................................................................................................................................42 Sugesto: Exerccio 3....................................................................................................................................................42 PROCEDURES E FUNES ..............................................................................................................................................42 DECLARAO E ATIVAO DE PROCEDIMENTO ...................................................................................................43 DECLARAO E ATIVAO DE FUNES ................................................................................................................43 DECLARAES CRIADAS AUTOMATICAMENTE PELO DELPHI...........................................................................44 CAIXAS DE DILOGO.......................................................................................................................................................44 ShowMessage ................................................................................................................................................................44 MessageDlg.....................................................................................................................................................................44 Application.MessageBox...............................................................................................................................................45 CAIXAS DE ENTRADA ......................................................................................................................................................46 InputBox ...........................................................................................................................................................................46 InputQuery .......................................................................................................................................................................47 Exemplo ...........................................................................................................................................................................47 Sugesto: Exerccio 4....................................................................................................................................................48 CHAMADA DE FORMS.........................................................................................................................................................48 COMPONENTES (VCL).........................................................................................................................................................48 Objeto BitBtn (Boto com figuras opcionais).........................................................................................................48 Objeto SpeedButton (Boto para barra de cones) ..............................................................................................49 Objeto MaskEdit (Caixa de edio com mscara) ...............................................................................................50 Objeto Image (Imagem).............................................................................................................................................50 Objeto - PageControl .....................................................................................................................................................51 Objeto OpenDialog (Caixa de dilogo para abertura de arquivos) ...................................................................51

Sugesto: Exerccio 5 ..................................................................................................................................................52 Objeto ImageList (Lista de imagens) ......................................................................................................................52 Objeto RichEdit (Texto com formatao) ...............................................................................................................52 Objeto ProgressBar (Barra de progresso) .............................................................................................................53 Objeto Gauge (Barra de progresso)........................................................................................................................53 Objeto Animate (Animaes)....................................................................................................................................54 Sugesto: Exerccio 6....................................................................................................................................................54 Objeto DateTimePicker (Data e hora atravs de uma Combobox)...................................................................54 Objeto MonthCalendar (Calendrio mensal) .........................................................................................................55 Objeto StatusBar (Barra de status) .........................................................................................................................55 Objeto ToolBar (Barra de cones)............................................................................................................................56 TRATAMENTO DE EXCEES .........................................................................................................................................56 O COMANDO TRY-EXCEPT .............................................................................................................................................57 A CONSTRUO ON-DO ..................................................................................................................................................57 O COMANDO TRY-FINALLY ...........................................................................................................................................58 CLASSES BSICAS ............................................................................................................................................................60 BLOCOS TRY ANINHADOS..............................................................................................................................................60 TRATAMENTO DE EXCEES DE FORMA GLOBAL ................................................................................................61 TRATAMENTO DE EXCEES SILENCIOSAS.............................................................................................................62 Sugesto: Exerccio 8....................................................................................................................................................62 UM POUCO MAIS SOBRE COMPONENTES (VCL).......................................................................................................63 Objeto Timer (Temporizador) ...................................................................................................................................63 Objeto FileListBox (Caixa de listagem de arquivos) ............................................................................................63 Objeto DirectoryListBox (Caixa de listagem de diretrios) .................................................................................64 Objeto - DriveComboBox (Caixa de listagem de drives) ........................................................................................64 Objeto FilterComboBox (Caixa de listagem de filtros).........................................................................................64

Introduo

Objetivos
Esta apostila baseada no Livro Dominando o Delphi 5 A Bblia, do escritor Marco Cant e, de um modo geral, segue a mesma ordem de apresentao dos assuntos. O Help on-line do aplicativo foi um dos recursos secundrios utilizados para um maior detalhamento de certos tpicos. So requisitos para um bom aproveitamento da apostila os conhecimentos por parte do leitor da linguagem Pascal e de conceitos de Orientao a Objetos, j que o texto se concentra na implementao desse recurso e no na sua teoria.

VERSES
A verso 5 a segunda atualizao do Delphi depois que a Borland tornou-se Inprise. Tanto o Delphi como outros produtos continuam sendo comercializados com o nome Borland visando ao desenvolvimento da empresa. O Delphi distribudo em trs verses: Standard Verso bsica do produto que disponibiliza um conjunto bem limitado de componentes. considerada a verso mais bsica e apropriada para os novos usurios e programadores ocasionais. Ela apresenta uma biblioteca com cerca de 85 componentes reutilizveis. Professional Tem por objetivos programadores profissionais. Possui de todos os recursos bsicos, suporte programao de banco de dados, suporte a servidores Web (WebBroker) e algumas ferramentas externas. Esta verso inclui vrios componentes Internet nativos (na prpria linguagem Object Pascal) e ferramentas de eliminao de erros. Possui mais de 150 componentes reutilizveis. Enterprise Conhecida como Client/Server nas verses anteriores; enfoca programadores que esto construindo aplicativos empresariais. Possui o SQL Links para conexes Cliente/Servidor BDE nativas, vrios componentes para Internet, componentes ADO e InterBase Express, suporte a aplicativos multiusurios, internacionalizao e arquitetura de trs camadas. Todas as verses possuem a mesma definio de ambiente integrado e a capacidade de expandir sua VCL original. O Delphi tambm conhecido no mercado como uma ferramenta RAD (Rapid Application Development).

IDE
O ambiente de desenvolvimento do Delphi composto de vrias partes compondo um conjunto integrado de janelas que interagem entre si.

Vamos abordar cada uma separadamente:

O FORM DESIGN
Form o termo utilizado para representar as janelas do Windows que compem uma aplicao. Os forms servem como base para o posicionamento dos componentes, que so responsveis pela interao entre usurio e mquina. Para selecionarmos o form devemos clicar (uma vez) em sua rea interna ou na object inspector, e no simplesmente em seu ttulo. As caractersticas iniciais do form como tamanho, botes (minimizar, maximizar, fechar, controle) e cone podem (e sero) ser modificadas atravs de recursos que veremos adiante.

A BARRA DE MENU PRINCIPAL


Como todo programa padro Windows, h uma janela onde esto situados os menus da aplicao, a barra que contem os menus tambm agrupa outras partes.

A PALETA DE COMPONENTES
Aplicativos orientados a objetos trabalham com elementos que denominamos componentes. No Delphi, os componentes encontram-se em uma paleta com vrias guias.

Pode-se configurar a ordenao das guias clicando com o boto direito do mouse sobre qualquer componente e clicar na opo Properties.

H basicamente trs maneiras de inserirmos os componentes no formulrio: Clicar uma vez no componente, e clicar dentro do formulrio (no arrastar para o form). Clicar duas vezes rapidamente no componente desejado. Segurar a tecla Shift e clicar no componente desejado; clicar no form vrias vezes. Na terceira opo, o componente ser travado ao mouse. Para destrav-lo clique no cone da seta, o primeiro cone da paleta.

A SPEEDBAR
A speedbar est posicionada ao lado esquerdo da barra principal do Delphi. Possui diversos botes (cones) que representam comandos muito utilizados durante o desenvolvimento.

Pode-se customizar a speedbar adicionando ou retirando algum boto atravs do boto direito em qualquer cone (da speedbar) e escolher o comando customize. Na janela aberta, seleciona-se a guia Commands. Neste momento pode-se arrastar nos dois sentidos, para adicionar ou retirar botes.

OBJECT INSPECTOR
Uma das partes mais importantes da orientao a objeto a possibilidade de definir caractersticas personalizadas aos componentes. No Delphi, utilizamos a janela object inspector para realizar esta tarefa.

H uma caixa de listagem1 que permite a escolha de qual componente dever ser selecionado. Duas guias: Properties Define as propriedades e valores do Objeto selecionado. Events Define quais os eventos sero manipulados pelo desenvolvedor.

Objeto atual selecionado

Propriedade

Algumas propriedades trazem opes diferenciadas para alterao. Por exemplo: Caption Permite a insero de uma string de caracteres. Color Permite a insero de um dos valores pr-definidos na caixa de listagem.

Valor atual desta propriedade

BorderIcons Toda propriedade que possui o sinal de + tem a caracterstica de mostrar subpropriedades. Deve-se clicar no sinal de + para expandir e no sinal de para ocultar. Icon Exibe um boto de reticncias (...) que dar origem a uma caixa de dilogo. Os nomes definidos como valores das propriedades na object inspector sero os nomes usados na construo do cdigo em Object Pascal.

Componente ComboBox.

10

CODE EDITOR
O editor de cdigo responsvel por receber todas as declaraes criadas pelo Delphi e handlers2 criados pelo desenvolvedor. E no ambiente Code Editor que implementamos o algoritmo na linguagem Object Pascal.

Code Editor Code Explorer

Na janela do editor pode haver uma outra janela denominada Code Explorer. a parte esquerda da janela, onde podemos ter uma orientao sobre os objetos, procedimentos, funes e classes utilizadas na aplicao. Para desligar o code explorer clique no pequeno X ao lado da guia do code editor, para visualiza-lo clique com o boto direito dentro do editor e escolha View Explorer ou pelo teclado Ctrl+Shift+E. Uma caracterstica muito importante do Code Explorer que quando inserirmos componentes no form, a sua declarao feita pelo Delphi de maneira automtica.

Manipulador de eventos.

11

Podemos considerar tambm o seguinte fato: Tudo o que o Delphi escrever, problema dele. Agora, Tudo o que voc escrever problema seu. Problema no sentido de atualizao de cdigo, como veremos adiante. Quando alteramos o nome do objeto, deve-se utilizar o mesmo nome nas rotinas implementadas. Agora, o que o Delphi declarou, ele se encarrega de atualizar. Pode-se personalizar o Editor atravs do menu Tools | Editor Options.

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

Esta lista pode ser ordenada por nome, clicando com o boto direito dentro da listagem.

No momento de chamada de procedimentos ou mtodos:

12

Para forar o code insight em determinada situao, utiliza-se: Ctrl + Barra de Espao - Para complemento de objetos; seus mtodos e propriedades. Ctrl + Shift + Barra de Espao Para complemento de parmetros.

SPEED MENUS
Speed Menus ou Menus Rpidos a caracterstica de podermos selecionar comandos rpidos atravs do boto direito do mouse. Em vrias situaes (j citadas anteriormente) utilizamos o boto direito para escolher algum comando ou ao.

DESKTOPS TOOLBAR
Este novo recurso permite gravar vrios layouts3 de tela personalizando seu ambiente de trabalho. Estas opes (layouts) podem ser manipuladas pelos cones ou pelo menu: View Desktops

Disposies das janelas no monitor.

13

CONFIGURAES DO AMBIENTE
O Delphi permite que voc personalize o ambiente atravs do menu Tools | Environment Options.

Algumas opes da janela Environment Options que a princpio, podemos julgar importantes:

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

Compiling and running


Minimize on run Para minimizar o Delphi no momento da compilao em efeito de testes. Evita confuses de janelas.

Form designer
New forms as text Para tornar compatvel os arquivos de definio de formulrio (.DFM) criados no Delphi5 para o Delphi4, desligue esta opo.

14

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

15

PROJETO EM DELPHI
O conceito de projeto em Delphi baseado em um conjunto de arquivos necessrios para gerar uma aplicao. Vamos destacar os principais arquivos: Extenso Necessrio para compilar? Arquivo Pascal: o cdigo-fonte Desenvolvimento Sim. de uma unidade Pascal, ou uma unidade relacionada a um formulrio ou uma unidade independente. Arquivo Delphi Project. Desenvolvimento Sim. (Contm cdigo-fonte em Pascal.) Delphi Form File: um arquivo Desenvolvimento Sim. Todo binrio (na verso 5 pode ser formulrio convertido para texto) com a armazenado em descrio das propriedades um arquivo PAS e de um formulrio e dos em um arquivo componentes que ele contm. DFM. Delphi Compiled Unit: o Compilao Apenas se o resultado da compilao de cdigo-fonte no um arquivo Pascal. estiver disponvel. Os arquivos DCU para as unidades que voc escreve so um passo intermedirio; portanto, eles tornam a compilao mais rpida. Arquivos de bitmap, cone e Desenvolvimento Normalmente no, cursor: arquivos padro do : Image Editor mas eles podem Windows usados para ser necessrios em armazenar imagens de tempo de execuo bitmap. e para edio adicional. Arquivo de configurao com Desenvolvimento Necessrio apenas opes de projeto. se opes de Semelhante aos arquivos compilao DOF. especiais foram configuradas. Delphi Option File: um arquivo Desenvolvimento Exigido apenas se de texto com as configuraes opes de atuais para as opes de compilao projeto. especiais foram 16 Tipo e descrio Criao

.PAS

.DPR

.DFM

.DCU

.BMP, .ICO, .CUR

.CFG

.DOF

.DSK

Arquivo de Desktop: contm informaes sobre a posio das janelas do Delphi, os arquivos abertos no editor e outros ajustes da rea de trabalho. Aquivo executvel: o aplicativo Windows que voc produziu.

configuradas. Desenvolvimento No. Voc deve exclu-lo se copiar o projeto em um novo diretrio.

.EXE

.~PA

.TODO

Compilao: No. Esse o Ligao (linking) arquivo que voc vai distribuir. Ele inclui todas as unidades compiladas, formulrios e recursos. Backup do arquivo Pascal Desenvolvimento No. Esse arquivo Pode ser ativado ou gerado desativado atravs do Menu automaticamente pelo Delphi, Tools Editor Options - guia display Item: Create backup quando voc salva file. uma nova verso do cdigo-fonte. Arquivo da lista to-do, Desenvolvimento No. Esse arquivo contendo os itens contm notas para relacionados ao projeto os programadores. inteiro.

O Delphi possui um mecanismo de gerncia de arquivos de projeto informando os principais arquivos e seu path. Clique em View Project Manager

A figura acima um exemplo de um projeto inicial, ainda no salvo. O diretrio padro para criao dos arquivos projects, obviamente devemos definir na gravao pasta e nomes de arquivos mais especficos.

17

.PAS E .DPR
Para visualizarmos o cdigo fonte da unidade (.PAS) em Delphi basta selecionarmos o code editor (F12). Para visualizarmos o cdigo fonte no arquivo de projeto (.DPR) basta selecionarmos o menu Project View Source. O arquivo de projeto exibido em uma guia no code editor. Para fechar a guia basta clicar com o boto direito e escolher close page. No feche as janelas atravs do X (boto fechar do Windows)

SALVAR O PROJETO
Como vimos anteriormente, o conceito de projeto em Delphi se faz atravs de um conjunto de arquivos. No Menu File do Delphi temos quatro opes para a gravao do projeto:

Onde: Comando Save Save As... Save Project As... Save All Objetivo Salvar apenas a unidade selecionada Salvar a unidade selecionada como... pode-se renomear ou trocar de pasta (duplicando) o arquivo. Salvar o projeto como pode-se renomear ou trocar de pasta (duplicando) o arquivo. Grava todos os arquivos do projeto, e atualiza-os caso j sejam salvos.

Ao clicar em Salve All abre-se uma caixa de dilogo padro do Windows onde deve ser preenchido o nome do arquivo e escolhida uma pasta para armazenar o projeto. Observe o ttulo da janela, pois aps a gravao do arquivo da unidade, ser exibida a mesma caixa (com ttulo diferente) para a gravao do arquivo de projeto.

18

Escolher a pasta.

Nomear o arquivo.

ABRIR O PROJETO
O projeto em Delphi determinado atravs do arquivo com extenso .DPR. Desta forma, para abrir um projeto, deve-se abrir o arquivo .DPR. No menu File do Delphi podemos utilizar mais de uma opo:

Onde: Comando Open Open Project... Reopen Objetivo Permite abrir um arquivo .DPR, .PAS entre grupos de projeto. Permite abrir um arquivo de projeto. Permite reabrir um arquivo (DPR ou PAS) utilizado anteriormente.

No abra um arquivo .PAS atravs destas opes, a menos que saiba o que est fazendo. Os arquivos .PAS devem ser abertos atravs do menu View | Units aps a abertura do .DPR.

19

OPES DE PROJETO
O Delphi permite a configurao de vrios itens do sistema atravs do menu Project Options.

Forms
Main form - Nesta guia permite a escolha do formulrio principal da aplicao. Available form - Os formulrios available (disponveis) em caso de criao em tempo de execuo.

Application
Title - Define um nome para a sua aplicao diferente do nome do arquivo de projeto (.DPR). Help file Define o nome do arquivo de Help (.HLP) associado aplicao. Icon Define o cone utilizado no arquivo executvel. (.EXE)

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

Linker
Estas opes incluem informaes para a depurao.

20

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

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

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

A LISTA TO-DO
O Delphi adicionou um recurso de controle/gerenciamento de projeto na verso 5, denominado To-Do List. Voc pode incluir incluir ou modificar itens a serem feitos atravs de dilogos que podem ter dois estados, prontos ou fazer. Para utilizar a To-Do List clique no menu View | To-Do List.

Clique com o boto direito dentro da janela e escolha Add. O arquivo gerado gerado pela lista gravado no diretrio do projeto com a extenso .todo

TIPOS DE COMPONENTES
Fazemos uma distino de duas categorias bsicas quando tratamos dos componentes, so: Componentes Visveis e Componentes No-Visveis.

Visveis
Quando um componente pode ser visto pelo usurio em tempo de execuo. Exemplo Button e Edit.

No-Visveis
Alguns componentes aparecem no form durante o tempo de projeto na aparncia de um cone, mas no podem ser vistos pelo usurio em tempo de execuo. Exemplo: Timer e MainMenu.

21

CONVENO DE NOMEAO
A propriedade mais importante de um componente a propriedade Name. ela que define o nome interno com relao ao cdigo escrito em Object Pascal. Para organizar e facilitar o processo de desenvolvimento/manuteno do sistema, grande parte dos desenvolvedores adota uma nomenclatura para tornar o cdigo mais legvel possvel. O Delphi adota como nomenclatura padro o nome da classe da qual o componente instanciado e um nmero crescente de acordo com o nmero de ocorrncia deste componente no form. Exemplo: Button1, Button2, etc... so componentes instanciados da classe TButton . No obrigatria a utilizao da conveno de nomes utilizados nesta apostila, mas muito importante fazer uso de uma conveno mais clara possvel. Exemplo: Nome gerado pelo Delphi Button1 Edit1 Label1 Objetivo Conveno

Sair da aplicao BtnSair Receber nome do usurio EdtNome Indicar componente Edit LblNome

MANIPULANDO COMPONENTES
Podemos adicionar os componentes ao formulrio de trs maneiras, (citadas anteriormente) e utilizar ferramentas e tcnicas de alinhamento para aumentar nossa produtividade. Para selecionar um componente, basta clic-lo uma vez ou na object inspector selecion-lo na caixa de listagem. Pode-se ento arrast-lo com o Mouse ou utilizar as teclas CTRL+SETAS para mover o componente. As teclas SHIFT+SETAS alteram a largura e altura. Para selecionar mais de um componente ao mesmo tempo, utiliza-se a tecla SHIFT, pode-se mover ou alterar o conjunto. O recurso de arrastar e selecionar (Paint, por exemplo) vlido quando a base o Form. Quando inserirmos componentes em cima de outro objeto (Panel, por exemplo) necessrio segurar a tecla CTRL no processo de arrastar.

22

Para definir vrios componentes baseados em uma propriedade de outro, altere o componente modelo, selecione-o primeiro e com SHIFT selecione os outros. Na object inspector selecione a propriedade a ser definida para todos Width (largura, por exemplo) e aperte a tecla ESC. O Delphi dispe de uma ferramenta para auxlio ao alinhamento dos componentes. Clique no menu View Alignment Palette

Uma outra opo clicar sobre o componente selecionado e no Speed Menu (Menu rpido) selecionar Align.

Utilizando o Object Inspector


O object inspector uma janela importantssima na programao orientada a objetos, atravs dela que podemos alterar as propriedades e definir os eventos de acordo com o objetivo da aplicao.

23

Na parte superior da janela h uma caixa de listagem que permite a seleo de componentes j inseridos no formulrio. Duas guias (Properties e Events) separam as listas de propriedades e eventos. As propriedades so definidas atravs de tipos. Podemos citar no exemplo com o objeto form: Tipos Simples So tipos String ou valores numricos definidos ao digitar um valor na frente da propriedade. Exemplo: Name, Caption, Height e Width entre outros. Tipos Enumerados So tipos definidos por uma quantidade limitada de opes que devem ser previamente selecionadas, no simplesmente definidas pelo usurio. Exemplo: Cursor, BorderStyle e WindowState entre outros.

24

Tipo Set Algumas propriedades podem conter mltiplos valores. Um exemplo a propriedade BorderIcons com o sinal + indicando subpropriedades. Tipos com Editor de Propriedades As propriedades que so acompanhadas de um cone de reticncias (...) indicam que uma janela de dilogo ir auxiliar na escolha de seu(s) valor(es). Exemplo: Icon.

Manipulando Eventos
A guia Events permite o desenvolvedor definir um handler4 em Object Pascal para um determinado evento que pode ser disparado pelo usurio ou pelo sistema. Um evento uma ao disparada dentro de uma aplicao orientada a Objeto. Podemos citar as ocorrncias dos principais eventos que so disponibilizados na maioria dos componentes em Delphi: Evento OnClick OnDblClick
4

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

Manipulador de evento

25

OnEnter OnExit OnKeyPress

mouse. Quando o componente recebe o foco. Quando o componente perde o foco. Quando pressiona uma nica tecla de caractere.

Construo de um manipulador de evento para o objeto button.


Insira um componente button no Form, no necessrio mudar nenhuma propriedade. Selecione a object inspector a guia events e localize o evento OnClick. D um duplo clique no espao em branco do evento. Os componentes possuem um evento padro para a construo do cdigo, por isso possvel clicar no componente duas vezes para abrir um evento.

Selecione a guia events

Utilize o mouse e d um duplo clique no espao em branco, para abrir o evento desejado.

No Code Editor criada uma declarao do evento na clusula Interface e a implementao do procedimento na clusula Implementation. Como veremos com mais detalhes nos prximos captulos, todo cdigo em object pascal delimitado pelas palavras reservadas begin e end. Defina apenas as duas linhas de cdigo dentro dos delimitadores.
procedure TForm1.Button1Click(Sender: TObject); begin Form1.Caption := Curso de Delphi; Showmessage(Exemplo de caixa de dilogo); end;

Observe a construo do procedimento criado pelo prprio Delphi:

26

procedure TForm1.Button1Click(Sender: TObject); begin


Evento manipulado Name do form end; que define uma nova classe Name do objeto

Executando a aplicao
Para executar o programa e visualizar os dois comandos codificados no evento OnClick basta teclar F9 ou o cone Run.

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

UM POUCO MAIS SOBRE EVENTOS


A programao baseada em eventos (POE5), em resumo, tem a caracterstica de obedecer as aes do usurio. Se voc j programou em alguma linguagem para o sistema operacional MS-DOS sabe do que estamos falando. mais fcil programar com POE. Um programa estruturado difere em muito deste raciocnio porque seu escopo rgido e baseado em rotinas, ou seja, pode haver (e na maioria h) momentos em que o usurio deve seguir determinados passos orientados pelo programa; enquanto que na POE existe a execuo do evento associado ao do usurio ou do sistema. H dois tipos bsicos de eventos: Usurio So eventos disparados pelo usurio, por exemplo: OnClick, OnKeyPress, OnDblClik. Sistema So eventos que podem ocorrer baseados no sistema operacional, por exemplo: O evento OnTimer executa um procedimento a cada intervalo em milisegundos. O evento OnCreate ocorre quando uma instncia do objeto est sendo criada. importante notar que o usurio pode disparar mais de um evento em uma nica ao, na verdade isso ir ocorrer com freqncia, de maneira que devemos ter conscincia que os eventos obedecem uma ordem. Supondo a existncia de trs manipuladores de eventos para um objeto da classe Tbutton: OnMouseDown, OnEnter e OnClick. A ordem destes eventos ser: OnEnter OnMouseDown OnClick Isso uma observao importante no manuseio e na construo de manipuladores.
5

Programao Orientada a Eventos

27

VCL
Vamos considerar alguns objetos e suas principais propriedades e mtodos.

Objeto Form (Formulrio)


Paleta Standard Importncia: o principal componente container, pois, permite posicionar os demais componentes em si mesmo. literalmente a implementao do conceito de janelas do sistema operacional Windows.

Propriedades ActiveControl Align AutoScroll AutoSize BorderIcons BorderStyle

BorderWidth Caption ClientHeight / ClientWidth Color Cursor DefaultMonitor Enabled Font FormStyle

Permite definir qual o primeiro componente a receber foco assim que o formulrio criado. Altera o alinhamento e preenchimento do objeto. Permite habilitar as barras de rolagem. Determina se o controle ser automaticamente redimensionado. Determina os cones a serem exibidos na barra de ttulo do formulrio. Define o estilo da borda do formulrio. bsDialog Borda no redimensionvel, comum em caixa de dilogo bsSingle Borda simples e redimensionvel. bsNone Borda invisvel, no redimensionvel, sem botes de controle. bsSizeable Borda padro redimensionvel. Define a espessura da borda. Indica o rtulo exibido para o componente. Define a altura e largura da rea cliente. Define a cor de fundo de um componente. Indica a imagem exibida pelo ponteiro do mouse quando este ficar sobre o objeto. Associa o form a um monitor especfico em uma aplicao que utiliza vrios monitores. Define se o componente est habilitado ou no. Permite controlar os atributos do texto exibido em um componente. Determina o estilo do formulrio. fsNormal Definio padro do formulrio. fsMDIChild O formulrio ser uma janela-filha de uma aplicao MDI. fsMDIForm O formulrio ser o formulrio-pai de uma aplicao MDI. 28

Height HelpContext HelpFile Hint HorzScrollBar Icon KeyPreview

Left Menu Name PopupMenu Position ShowHint Tag

Top VertScrollBar Visible Width WindowMenu WindowState Mtodos Show ShowModal Close

fsStayOnTop O formulrio permanece sobre todos os outros formulrios do projeto, exceto aqueles que tambm tm a propriedade FormStyle igual a fsStayOnTop. Define a altura do objeto. Define o tpico do arquivo help que ser exibido ao pressionar a tecla F1. Define um arquivo de help especfico. Permite exibir um texto de auxlio no momento em que o ponteiro do mouse permanece sobre o controle. Define o comportamento de uma barra de rolagem horizontal. Define o cone que ser usado pelo formulrio. Define se o formulrio deve ou no responder a um pressionamento de tecla, atravs do evento OnKeyPress, por exemplo. Define a coordenada da extremidade esquerda de um componente. Permite escolher entre mais de um componente MainMenu. Define o nome interno que identifica o componente dentro da aplicao. Define o componente PopupMenu a ser utilizado pelo objeto. Permite definir o tamanho e posio de um formulrio no momento em que ele aparece na sua aplicao. Define se a string de auxlio deve ou no ser exibida quando o usurio mantm o ponteiro do mouse sobre um controle. A propriedade Tag uma varivel do tipo Longint que o Delphi coloca disposio do usurio, que pode atribuir o significado mais conveniente. Define a coordenada da extremidade superior de um componente. Define o comportamento de uma barra de rolagem vertical. Define se o componente aparece ou no na tela. Define a largura do objeto. Permite definir qual o menu responsvel por manipular as janelas-filhas de uma aplicao MDI. Define o estado de exibio de um formulrio.

Exibe o formulrio de manipulao no-modal. Exibe o formulrio de manipulao modal. Permite fechar o formulrio.

29

Objeto Button (Boto)


Paleta Standard Importncia: um dos objetos mais utilizados para confirmar e disparar rotinas associadas.

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

Envia o foco do windows para o componente.

Objeto Edit (Caixa de edio)


Paleta Standard Importncia: Um dos principais componentes para a entrada de dados do usurio do sistema.

Propriedades AutoSelect AutoSize

Define se o texto exibido pelo controle ser selecionado quando este receber o foco da aplicao. Para componentes TEdit a propriedade determina se a altura do controle ser redimensionada quando o tamanho da fonte for

30

BorderStyle CharCase HideSelection Maxlength PasswordChar Text

alterado. Determina o tipo da borda do componente. Determina o se tipo da fonte ser maiscula, minscula ou normal. Define se o texto perde a seleo ao perder o foco. Define um limite para a insero de caracteres. Define qual caractere ser usado para ocultar o texto inserido no componente. Permite manipular os caracteres inseridos no componente pelo usurio.

Mtodos Clear SetFocus

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

Objeto Label (Rtulo de orientao)


Paleta Standard Importncia: Orientar o usurio escolha de componentes bem como sua utilizao.

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

Sugesto: Exercicio 1

31

MAIS SOBRE A PALETA STANDARD


Objeto Memo (Memorando)
Paleta Standard Importncia: Permite o usurio entrar com dados do tipo TStrings, compara-se funcionalidade do software bloco de notas.

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

Objeto CheckBox (Caixa de verificao)


Paleta Standard Importncia: Permite verificar opes boolenas pr-definidas ou re-definidas pelo usurio.

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

32

Objeto RadioButton (Boto de radio)


Paleta Standard Importncia: Permite escolher entre um grupo, pelo menos uma opo.

Propriedades Define se o componente est ligado ou desligado. Checked

Objeto ListBox (Caixa de listagem)


Paleta Standard Importncia: Permite o usurio entrar ou manipular uma lista de dados.

Propriedades Define uma lista de Strings que aparece no componente. Items MultiSelect Permite selecionar vrios itens (Strings) no componente. Sorted Define se a lista de Strings ser ordenada ou no. Mtodos Clear Permite limpar o contedo da propriedade Items. LoadFromFile Permite carregar um arquvo para a propriedade Items. SaveToFile Permite salvar o contedo da propriedade Items para um arquivo.

Objeto ComboBox (Caixa de listagem em formato de cortina)


Paleta Standard Importncia: Permite o usurio entrar ou manipular uma lista de dados.

33

Propriedades Define uma lista de Strings que aparece no componente. Items Sorted Define se os dados sero ordenados. Define o texto atual da Combobox. Text Mtodos Clear Permite limpar o contedo da propriedade Items. LoadFromFile Permite carregar um arquvo para a propriedade Items. SaveToFile Permite salvar o contedo da propriedade Items para um arquivo.

Objeto GroupBox (Caixa de agrupamento)


Paleta Standard Importncia: Permite agrupar componentes e estabelecer um ttulo na propriedade Caption.

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

Objeto RadioGroup (Grupo de botes radio)


Paleta Standard Importncia: Permite estabelecer um grupo de botes de radio e manipula-los pela propriedade ItemIndex.

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

34

Objeto Panel (Painel)


Paleta Standard Importncia: Permite agrupar outros objetos e estabelecer um efeito visual nas aplicaes.

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

Objetos MainMenu e PopupMenu (Menu principal e Menu rpido)


Paleta Standard Importncia: Define os Menus utilizados pelo usurio pelo boto esquerdo (MainMenu) ou pelo boto direito (PopupMenu) do Mouse.

Propriedades Items Define um novo item de Menu. Images Define um objeto do tipo ImageList. O objeto MainMenu permite a construo de sub-menus atravs de seu construtor clicando no item com o boto direito e escolhendo a opo Create submenu. Pode-se tambm excluir ou incluir items aleatoriamente atravs do boto direito no item desejado. Para criar um separador de menus, utilize o operador de subtrao (-) e confirme com a tecla Enter.

Sugesto: Exerccio 2

35

A LINGUAGEM OBJECT PASCAL


Por mais recursos grficos que as linguagens orientadas a objetos possuam, em determinado momento no h como fugir do cdigo. A programao em Delphi definida atravs da Linguagem Object Pascal, uma extenso do Pascal proposto por Niklaus Wirth. Consideramos uma aplicao em Delphi baseada em um conjunto de arquivos, (citados anteriormente .DPR .PAS e .DFM) bsicos. Vamos examinar alguns arquivos de fundamental importncia:

O MDULO .DPR
Todo programa em Object Pascal possui um arquivo .DPR, considerado como arquivo de projeto, o seu formato composto inicialmente da seguinte definio:
program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.

A palavra program define o nome do programa, este nome ser alterado quando for gravado o arquivo .DPR do projeto. Na clusula uses, so listadas as units usadas pelo mdulo principal. As units (que sero vistas adiante) so responsveis pela capacidade de dividir o programa em uma viso modularizada. Em cada um, declaramos uma srie de objetos (funes, variveis, procedimento, etc...) que podem ser usados por outras units e pelo mdulo principal. Em seguida vem um conjunto de comandos (denominado comando composto) atravs de dois delimitadores begin e end.

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

36

Se considerarmos o cdigo uma unit com um componente Button e um manipulador de evento, teremos o seguinte cdigo:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin Form1.Caption := 'Curso de Delphi'; Showmessage('Exemplo de caixa de dilogo'); end; end.

Uma unit possui cinco partes:

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

Interface
Contm tudo o que a unit exporta: constantes, tipos, variveis, procedimentos, funes, etc... Na declarao dos procedimentos e funes que a unit exporta, deve constar apenas o cabealho (nome e parmetros). A declarao completa fica na parte da implementao.
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations }

37

end; var Form1: TForm1;

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

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

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

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

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

DECLARAO DE VARIVEIS
As variveis podem ser classificadas em: Globais: Quando so feitas diretamente na seo interface de uma unit (ou seja, fora dos procedimentos e funes). Pode-se ter varaveis pblicas e privadas. Locais: Quando feita a declarao dentro de um procedimento ou funo.

38

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

TIPOS PARA MANIPULAO DE VARIVEIS


Tipos de variveis Inteiras
Tipo Integer Cardinal Shortint Smallint Longint Int64 Byte Word Longword Faixa de Valores -2147483648.. 2147483647 0..4294967295 -128..127 -32768..32767 -2147483648.. 2147483647 -2^63..2^63-1 0..255 0..65535 0..4294967295 Formato 32 bits 32 bits, sem sinal 8 bits 16 32 64 8 bits, sem sinal 16 bits, sem sinal 32 bits, sem sinal

Tipos de nmeros Reais


Tipo Real Single Double Extended Comp Currency Faixa de Valores 2.9*10E-39..1.7*10E38 1.5*10E-45..3.4*10E38 5.0*10E-324..1.7*10E308 3.4*10E-4932..1.1*10E4932 -2*10E63+1..2*10E63-1 -9.22*10E14..9.22*10E14

Tipos de variveis booleanas


Tipo Boolean ByteBool WordBool LongBool Faixa de Valores False ou True * * *

Tipos de variveis de caracteres


Tipo Char ShortString String Valores Permite armazenar um caractere ASCII. Permite armazenar uma cadeia de at 255 caracteres. Permite armazenar uma cadeia ilimitada de caracteres.

Tipo genrico (Variant)


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

39

FUNES DE CONVERSO E MANIPULAO


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

Sendo soma uma varivel real. O tipo TDateTime internamente manipulado como tipo Ponto Flutuante.

EXPRESSES LGICAS
So expresses que retornam valor booleano (falso ou verdadeiro). Operador Operao not Negao and E lgico or OU lgico xor OU EXCLUSIVO lgico O operador not unrio, por exemplo: if not (X > Z) then Devemos usar parnteses ao compararmos expresses lgicas, por exemplo:
if (X > Z) or (W > Y) then

COMANDO IF
O comando condicional if pode ser composto de uma ou mais condies de processamento, por exemplo:
if (A > B) then B := B + 1; // ou INC(B);

40

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

if (A > B) begin B := B + X := B + end else begin A := A Y := Y + end;

then 1; A;

1; B;

No ltimo exemplo para representar um bloco de comandos em caso verdadeiro ou falso, utiliza-se dos delimitadores begin e end. O comando if-then-else considerado como nico, portanto, no h ponto e vrgula (;)antes da palavra reservada else.

COMANDO CASE
O comando case..of oferece uma alternativa para comandos if-then-else com um grande nmero de testes. Por exemplo:
case Key of A..z: Label1.Caption := Letras; 0..9: Label1.Caption := Nmeros; +, -, *, /: Label1.Caption := Operador else Label1.Caption := Caracter especial; end; //fim do case

COMANDO REPEAT
O comando repeat..until uma opo para estruturas de repetio. A grande diferena com o comando while o fato do comando repeat ser executado pelo menos uma vez.
repeat X := X + 1; INC(Z,3); //equivale a Z := Z + 3; DEC(AUX,2); until X >= 200;

COMANDO WHILE
O comando while..do tambm permite a construo de estruturas de repetio, com diferena de no executar o lao no incio do teste lgico.

41

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

COMANDO FOR
O comando for..do estabelece uma estrutura de repetio considerando um controle inicial e final. Pode ser construdo de maneira crescente ou decrescente.
for i:=0 to 500 do Label1.Caption := IntToStr(i); for i:=500 downto 100 do begin Label1.Caption := IntToStr(i); Edit1.Caption := IntToStr(i); end;

COMANDO BREAK
O comando break usado para alterar o fluxo normal de comandos de repetio, o controle desviado para o comando seguinte ao comando repetitivo.
frase := Edit1.Text; for i:=1 to length(frase) do begin if frase[I] = 'A' then break; aux := aux + frase[I]; end; Label1.caption := aux; //Label1 recebe o conteudo de frase at a letra A

COMANDO WITH
O comando with..do usado para abreviar a referncia a campos de registro, ou a mtodos, e propriedades de um objeto.
begin Form1.Caption := Senac; Form1.Color := ClBlue; Form1.Top := 95; end; //Equivalente : with Form1 do begin Caption := Senac; Color := ClBlue; Top := 95; end;

Sugesto: Exerccio 3

PROCEDURES E FUNES
Procedimentos e funes so blocos de cdigo (rotinas) em Object Pascal que podem ou no receber parmetros (valores) para processamento. Uma vez definida a rotina pode-se ativa-la de diversas partes do programa atravs de seu nome.

42

A grande diferena entre as formas de definio destas rotinas (se procedimentos ou funes) est no fato de que: Procedimento NO retorna valor. Funo Retorna valor.

DECLARAO E ATIVAO DE PROCEDIMENTO


Podemos declarar um procedimento da seguinte maneira maneira: Dentro da clusula private ou public, defina a declarao do procedimento:
procedure Soma(X, Y: String);

Com o cursor posicionado na mesma linha, pressione: CTRL+SHIFT+C e perceba que o prprio Delphi realiza a construo do procedimento dentro da clusula implementation. Esse recurso chamado Class Completion. Nossa tarefa apenas definir o cdigo a ser realizado pelo procedimento.
procedure TForm1.Soma(X, Y: String); begin Label1.Caption := FloatToStr(StrToFloat(X)+StrToFloat(Y)); end;

Supondo a existncia de dois componentes Edit, um componente Button e um componente Label, este cdigo pode ser ativado da seguinte forma:
procedure TForm1.Button1Click(Sender: TObject); begin Soma(Edit1.Text, Edit2.Text); end;

DECLARAO E ATIVAO DE FUNES


A construo de funes tem o mesmo raciocnio diferindo na caracterstica de retorno da funo. Podemos declarar um procedimento da seguinte maneira maneira: Dentro da clusula private ou public, defina a declarao da funo:
function Subtrai(X, Y: String): String;

Observe que agora, depois dos parmetros h um tipo de definio de retorno da funo (String). Pode-se utilizar a mesma dica de construo do procedimento, na linha da declarao tecle CTRL+SHIFT+C (Class Completion) e perceba que o prprio Delphi realiza a construo da funo dentro da clusula implementation. Nossa tarefa apenas definir o cdigo a ser realizado pela funo.
function TForm1.Subtrai(X, Y: String): String; begin result := FloatToStr(StrToFloat(X)-StrToFloat(Y));

43

end;

A palavra reservada result o recurso usado pela Object Pascal para estabelecer o retorno da rotina. No se deve declarar esta varivel, ela declarada no momento da utilizao da funo. Supondo a existncia de dois componentes Edit, um componente Button e um componente Label, esta funo pode ser ativada da seguinte forma:
function TForm1.Button2Click(Sender: TObject); begin Label1.Caption := Subtrai(Edit1.Text, Edit2.Text); end;

Neste caso, o Label recebe o result de subtrai, ou seja, a subtrao dos dados passados nos parmetros.

DECLARAES CRIADAS AUTOMATICAMENTE PELO DELPHI


Se voc um bom observador, percebeu que o Delphi tambm gera as declaraes e seus respectivos procedimentos quando voc deseja manipular um determinado evento.

CAIXAS DE DILOGO
Podemos utilizar alguns tipos de caixas de dilogo pr-definidas pelo Delphi facilitando em muito o desenvolvimento pela ferramenta:

ShowMessage
A caixa de dilogo ShowMessage declarada internamente pelo Delphi desta forma:
procedure ShowMessage(const Msg: string);

Onde o parmetro Msg um dado String. Exemplo:


ShowMessage(Um texto ou propriedade string ser exibida.);

MessageDlg
A caixa de dilogo MessageDlg declarada internamente pelo Delphi desta forma:
function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word;

Onde: const Msg: string DlgType: TmsgDlgType uma constante string ou propriedade deste tipo. mtWarning Contm um cone exclamao amarelo. mtError

44

Contm um cone vermelho de parada. mtInformation Contm um cone i azul. mtConfirmation Contm uma interrogao verde. mtCustom No contm BitMap. mbYes mbNo mbOK mbCancel mbAbort mbRetry Buttons: TMsgDlgButtons mbIgnore mbAll mbNoToAll mbYesToAll mbHelp Define um nmero para o help de contexto. Por padro, HelpCtx: Longint zero 0. O retorno da funo o tipo do boto como mr Desta maneira pode-se fazer testes lgicos como no exemplo:
if MessageDlg(Deseja sair?, mtConfirmation, [mbYes, mbNo], 0)=mrYes then

Application.MessageBox
Uma outra caixa de dilogo o mtodo MessageBox do objeto Application. Esta funo est definida da seguinte maneira:
function MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;

Onde: const Text Caption: PChar uma constante string ou propriedade deste tipo. Define uma string para o ttulo da janela. Define os botes, cones e a possibilidade de focar um determinado boto. Os valores para botes so: MB_ABORTRETRYIGNORE, MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO, MB_YESNOCANCEL Os valores para os cones so: MB_ICONEXCLAMATION, MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONASTERISK, MB_ICONQUESTION, MB_ICONSTOP, 45

Flags

MB_ICONERROR, MB_ICONHAND Os valores para a definio do boto default pode ser: MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_DEFBUTTON4 O retorno da funo o tipo do boto como id
(IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES)

Desta maneira pode-se fazer testes lgicos como no exemplo:


if Application.MessageBox('Texto','Ttulo',MB_YESNOCANCEL + MB_ICONINFORMATION + MB_DEFBUTTON2) = IdYes then

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

InputBox
A funo InputBox retorna um tipo String, que dado digitado pelo usurio na sua utilizao. Sua definio interna a seguinte:
function InputBox(const ACaption, APrompt, ADefault: string): string;

Onde: const ACaption APrompt ADefault Exemplo:


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

Define o ttulo da janela Define um rtulo para orientao dentro da caixa. Define um valor default para a caixa.

46

InputQuery
A funo InputQuery retorna um tipo Booleano, o dado digitado pelo usurio ser colocado em uma varivel do tipo string previamente declarada. Sua definio interna a seguinte:
function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean;

Exemplo:
if InputQuery('Ttulo', 'Descrio', aux) and (aux <> '') then

Neste exemplo acima, a janela s retornar verdade se houver algum valor digitado e o usurio clicar no boto OK, caso contrrio o retorno ser falso.

Exemplo
Vamos examinar uma unit e exemplicar os principais conceitos:
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); function Soma(X, Y: String): Integer; //definida pelo desenvolvedor private { Private declarations } aux: Integer; //varivel privada public { Public declarations } frase: String; //varivel pblica end; var Form1: TForm1; implementation {$R *.DFM} const MAX = 50; //definio de constante procedure TForm1.Button1Click(Sender: TObject); var titulo: String; //variavel local i: Integer; begin if (Edit1.Text <> '') and (Edit2.Text <> '') then //atribui variavel private - aux o retorno da funo soma aux := Soma(Edit1.Text,Edit2.Text); titulo := 'Curso de Delphi'; //atribui varivel local

47

frase := titulo+' Verso 5'; //atribui variavel public Form1.Caption := frase; //atribui propriedade Caption do form ShowMessage('A soma dos valores : '+IntToStr(Aux)); for i:=0 to MAX do Label1.Caption := IntToStr(i); end; function TForm1.Soma(X, Y: String): Integer; begin result := StrToInt(X)+StrToInt(Y); end; end.

Sugesto: Exerccio 4

CHAMADA DE FORMS
Uma caracterstica importante da apresentao dos formulrios em uma aplicao, o fato de ser apresentado como MODAL ou NO-MODAL. H dois mtodos para executar a visualizao, mas antes vamos entender como isso funciona. MODAL O foco fica preso no formulrio e no liberado para outro form at que ele seja fechado. O usurio pode ativar outra aplicao do Windows, mas no poder trabalhar em outra janela daquele programa cuja janela foi aberta como modal (at que seja fechada). NO MODAL O foco pode ser transferido para outra janela sem que esta precise ser fechada. Entendido este conceito, os mtodos que o Delphi utiliza para apresentar os forms so: Show para apresentar forms NO-MODAIS, ou ShowModal para apresentar forms MODAIS.

COMPONENTES (VCL)
Objeto BitBtn (Boto com figuras opcionais)
Paleta Additional Importncia: Permite inserir figuras para uma melhor orientao do usurio, alm de funes pr-definidas.

Propriedades Define um Bitmap para o componente. (Arquivo com extenso Glyph .BMP) Define o tipo de Bitmap exibido pelo usurio. Kind bkCustom

48

ModalResult

Bitmap definido pelo usurio. bkOk Boto OK padro, com uma marca de verificao na cor verde e propriedade Default igual a True. bkCancel Boto Cancel padro, com um x na cor vermelha e propriedade Cancel igual a True. bkYes Boto Yes padro, com uma marca de verificao na cor verde e propriedade Default igual a True. bkNo Boto No padro, com uma marca vermelha representando um crculo cortado e propriedade Cancel igual a True. bkHelp Boto de auxlio padro, com uma interrogao na cor cyan. Quando o usurio clica sobre o boto, uma tela de auxlio deve ser exibida (baseada no cdigo do desenvolvedor). bkClose Boto Close padro, com o desenho de uma porta. Quando o usurio clica sobre o boto, o formulrio a que ele pertence se fecha. bkAbort Boto Abort padro, com um x na cor vermelha e propriedade Cancel igual a True. bkRetry Boto Retry padro, com uma seta circular verde. bkIgnore Boto ignore padro, com o desenho de um homem verde se afastando. bkAll Boto All padro, com uma marca de verificao dupla na cor verde e propriedade default igual a True. Permite encerrar a execuo de um formulrio Modal quando o seu valor for diferente de mrNone.

Objeto SpeedButton (Boto para barra de cones)


Paleta Additional Importncia: Permite ao usurio manipular os botes individuais ou atravs do conceito de grupo.

Propriedades Define um Bitmap para o componente. Glyph GroupIndex Permite agrupar um conjunto de SpeedButtons quando ao serem selecionados, tiverem a propriedade diferente de zero. 49

AllowAllUp Flat Down

Permite que o componente possa ter o relevo suspenso ao ser clicado. S pode ser utilizado junto ao conceito de agrupamento. Define um efeito visual interessante. Permite determinar qual componente foi pressionado. S pode ser utilizado junto ao conceito de agrupamento.

Objeto MaskEdit (Caixa de edio com mscara)


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

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

Objeto Image (Imagem)


Paleta Additional Importncia: Permite inserir uma figura para uso geral na aplicao.

Propriedades AutoSize Permite alterar o tamanho do componente baseado no tamanho da figura. Define a figura a ser exibida. Picture Stretch Permite alterar o tamanho da figura baseado no tamanho do componente. Mtodos LoadFromFile Permite carregar um arquivo de figura na propriedade Picture. Para trabalhar com imagens jpg, necessrio acrescentar na clusula uses da interface a biblioteca jpeg.

50

Objeto - PageControl
Paleta Win32 Importncia: Permite definir guias para agrupar os demais componentes. Cada guia representa um componente TabSheet do tipo TTabSheet, uma espcie de sub-objeto do PageControl.

Propriedades ActivePage Permite determinar qual a guia foi selecionada pelo usurio. Para criar novas pginas, clique com o boto direito no componente PageControl e escolha New Page.

Objeto OpenDialog (Caixa de dilogo para abertura de arquivos)


Paleta Dialogs Importncia: Permite utilizar uma caixa de dilogo pronta com recursos padronizados pelo sistema operacional.

Propriedades DefaultExt Especifica a extenso a ser adicionada ao nome de um arquivo quando o usurio digita o nome de um arquivo sem a sua extenso. FileName Define o arquivo selecionado no componente. Filter Permite definir as mscaras de filtro de arquivo a serem exibidas. FilterIndex Define o filtro default a ser exibido na lista drop-down que define os tipos de arquivos selecionveis. InitialDir Define o diretrio default quando a caixa de dilogo aberta. Options Neste componente, options define uma srie de valores booleanos. Title Define o ttulo da caixa de dilogo. Os componentes da paleta dialogs so executados atravs do mtodo execute. Este mtodo uma funo que retorna um valor booleano, assim para exibir uma caixa de dilogo, podemos escrever:
if OpenDialog1.Execute then

Se o usurio escolher algum arquivo e confirmar a caixa, execute retorna verdadeiro, caso contrrio, falso.

51

Sugesto: Exerccio 5 Objeto ImageList (Lista de imagens)


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

Para incluir imagens no componente ImageList, clique 2 vezes rapidamente no componente e clique no boto Add. O Delphi possui um conjunto de cones e imagens em uma pasta padro6:
C:\Arquivos de programas\Arquivos comuns\Borland Shared\Images

Objeto RichEdit (Texto com formatao)


Paleta Win32 Importncia: Permite formatar o texto (Negrito, Itlico, Sublinhado, Fontes, etc...) para a leitura de outros editores compatveis com o padro RTF.

Propriedades Lines Define o texto exibido no componente. WantReturns Define a tecla Enter como quebra de linha. WantTabs Define a tecla Tab como tabulao ou mudana de foco. Caso falso pode-se utilizar CTRL+TAB para produzir o efeito desejado. WordWrap Define a quebra de linha automtica de texto. Mtodos Clear Permite limpar o contedo do componente. LoadFromFile Permite carregar um arquivo para a propriedade Lines. SaveToFile Permite salvar o contedo da propriedade Lines em um arquivo.

Caso voc tenha instalado o software nos diretrios sugeridos como padro.

52

Objeto ProgressBar (Barra de progresso)


Paleta Win32 Importncia: Permitir ao usurio ter um acompanhamento de uma rotina demorada.

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

Objeto Gauge (Barra de progresso)


Paleta Samples Importncia: Permitir ao usurio ter um acompanhamento de uma rotina demorada.

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

53

Objeto Animate (Animaes)


Paleta Win32 Importncia: Permite exibir um filme .AVI para ilustrar tarefas (rotinas) em andamento.

Propriedades CommonAVI Define o AVI a ser exibido. Active Liga e desliga a exibio do AVI. Repetitions Define um nmero inteiro correspondente ao nmero de repeties. Zero define repeties indefinidas.

Sugesto: Exerccio 6 Objeto DateTimePicker (Data e hora atravs de uma Combobox)


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

Propriedades CalColors Date DateFormat DateMode Kind MaxDate MinDate

Define as cores do calendrio. Define a data selecionada no componente. Define o formato da apresentao da data. Define o estilo da caixa de listagem. Define se o componente deve trabalhar com data ou hora. Define uma data mxima para uma faixa de valores. Define uma data mnima para uma faixa de valores.

54

Objeto MonthCalendar (Calendrio mensal)


Paleta - Win32 Importncia: Permite ao usurio escolher uma data atravs de um componente que possui um importante impacto visual e facilidade operacional.

Propriedades Date FirstDayOfWeek WeekNumbers

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

Objeto StatusBar (Barra de status)


Paleta Win32 Importncia: Um dos principais componentes de informaes sobre operaes gerais no sistema.

Propriedades AutoHint Permite exibir o hint do componente automaticamente na barra de status. Se no houver painis, a barra deve ter a propriedade SimplePanel ligada. SimplePanel Define que a barra de status ser sem divises. SimpleText Define o texto a ser exibido pela barra de status. Panels Permite a criao e edio de painis na barra de status. A propriedade SimplePanel deve estar desligada. Pode-se tambm dar um duplo clique na barra de status. Ao utilizar a propriedade AutoHint, pode-se definir o hint dos objetos com duas strings separadas por pipe (|). A primeira string ser utilizada como hint local, a segunda como hint na barra de status.

55

Objeto ToolBar (Barra de cones)


Paleta Win32 Importncia: Permite criar barras de cones de maneira rpida e simples.

Propriedades Flat Define um efeito visual com relevo atravs do mouse nos botes. Images Permite definir um objeto do tipo ImageList. HotImages Permite definir um objeto do tipo ImageList a ser usado no momento em que o mouse passa (ou clica) sobre o componente. ShowCaptions Permite exibir a propriedade caption dos botes. Para adicionar botes ou separadores na ToolBar, clique com o boto direito sobre o componente e escolha New Button ou New Separator.

Sugesto: Exerccio 7

TRATAMENTO DE EXCEES
Quando criamos e executamos nossos programas, estamos sujeitos situaes de erros em tempo de execuo, a isto denominamos exceo. As excees devem ser tratadas de maneira a no permitir: Travar a aplicao Emitir mensagens tcnicas ao usurio leigo Deixar o SO instvel Quando uma exceo ocorre, o fluxo de controle automaticamente transferido para blocos de cdigo denominados handlers7 de excees, definidos atravs de comandos especficos do Object Pascal. No Object Pascal, uma exceo uma classe. A definio de excees como classes permite agrupar excees correlatas. Esse agrupamento feito atravs da prpria hierarquia de classes, de modo que podemos ter vrias classes dependentes de uma nica. O que ativa o mecanismo de tratamento de erros atravs de excees o uso da unit SysUtils. Ela permite detectar os erros e convert-los em excees.

Handler = Manipulador de evento.

56

O COMANDO TRY-EXCEPT
Podemos tratar as excees atravs do comando try-except. Sua sintaxe:
try <comandos a serem executados> except <bloco de exceo> end; //finaliza o bloco

Os comandos a serem executados so tratados seqencialmente na ordem em que foram criados, caso no haja alguma exceo o bloco de exceo ignorado. O programa prossegue normalmente obedecendo aos eventos provocados pelo usurio. Caso ocorra alguma exceo, o fluxo de controle desviado para o bloco de exceo. importante lembrar que podemos inserir qualquer comando, inclusive fazer chamadas a procedimentos e funes que por sua vez, podem chamar outros procedimentos e funes. O bloco de exceo pode ser definido atravs de uma construo genrica, exemplo:
try Abre(Arq); while not Fim(Arq) do processa(Arq); except Showmessage (Houve um erro inesperado.); end; //bloco try

No exemplo acima tratamos os erros com uma mensagem genrica dentro de um um bloco try-except.

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

Podemos ainda definir utilizando a clusula on-do com um handler genrico usando else, da seguinte forma:

57

try Processa; except on Exceo1 do Trata1; on Exceo2 do Trata2; else TrataOutras; end;

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

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

EinvalidOp EinvalidPointer EoutOfMemory EoverFlow ErangeError

EstackOverflow Eunderflow EzeroDivide

O COMANDO TRY-FINALLY
H um outro comando cuja sintaxe comea com try. Este controle de finalizao nos permite lidar de forma estruturada com as situaes em que alocamos algum tipo de recurso e, haja o que houver, precisamos depois liber-lo.
<aloca o recurso> try <usa o recurso> finally <libera o recurso com ou sem exceo> end;

58

O comando funciona da seguinte forma: os comandos especificados aps o Try so executados seqencialmente. Se no ocorrer nenhuma exceo, os comandos especificados aps finally so executados, e o programa prossegue com a execuo normal, com o comando seguinte ao try-finally. Porm, se houver alguma exceo qualquer uma durante a execuo da lista de comandos do try, o trecho aps o finally executado e, no final, a exceo reativada. Em resumo: Os comandos do bloco finally sempre so executados, haja ou no alguma exceo durante a execuo dos comandos especificados aps o try.

59

CLASSES BSICAS

Exceo

EMathError

EIntError

EInOutError

EAccessViolation

EInvalidOp

EDivByZero

Excees de Entrada/Sada

EPrivilege

EZeroDivide

ERangeError

EInvalidCast

EStackOverflow

EOverFlow

EIntOverFlow

Excees Typecast EControlC Excees de Processador


EConvertError

EUnderFlow Excees de Ponto Flutuante

Excees de Matemtica de Inteiros

EOutOfMemory

EVariantError
EInvalidPointer

Excees de Converso

EAssertionFailed

Excees de Variantes

Excees de Pilha

Excees de Assero

BLOCOS TRY ANINHADOS


Blocos try aninhados permitem maior versatilidade na construo de blocos protegidos, lembrando que se a exceo ocorrer, os comandos inseridos em except sero executados. J os comandos inseridos em finally sero executados havendo ou no a ocorrncia de erros. Embora no prximo exemplo, no exista margem para excees dentro do lao for..do (a menos que seja digitado errado) podemos ter uma idia de como criar blocos aninhados para garantir a execuo de rotinas sujeitas a erros mais graves.

60

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

TRATAMENTO DE EXCEES DE FORMA GLOBAL


H no Delphi um objeto chamado Application criado sem a deciso do desenvolvedor em todo o projeto. Este objeto representa a applicao como um todo e possui um evento muito importante: OnException. Este evento permite manipular as excees em um nvel global, podemos afirmar que os tratamentos de erro atravs do comando try so tratamento locais. Na verso 5 do Delphi, os eventos deste objeto esto disponvel na paleta Win32, nas verses anteriores este objeto era manipulado apenas no Code Editor tendo o desenvolvedor o trabalho de declarar os procedimentos desejados. Como o objeto tem como finalidade generalizar e centralizar tratamentos, deve haver um nico objeto na aplicao. Paleta Additional Importncia: Permite a manipulao de excees em um nvel global para toda a aplicao.

A utilizao do evento OnException pode ser criado da seguinte forma, utilizao um if na varivel E (que recebe o erro atual) tomando uma deciso na condio verdadeira:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if E is EConvertError then ShowMessage('Erro de converso de dados.');

61

end;

Neste exemplo acima, em qualquer lugar do programa (e no apenas em uma determinada rotina) que venha a levantar um erro do tipo EConvertError, uma mensagem genrica ser exibida. Este objeto deve estar inserido ou no formulrio principal ou no formulrio especial denominado Data Module como veremos adiante.

TRATAMENTO DE EXCEES SILENCIOSAS


Podemos utilizar o comando Abort para gerar excees silenciosas, ou seja, sem nenhuma mensagem.
try Form1.Caption := FloatToStr(StrToFloat(Edit1.Text) / StrToFloat(Edit2.Text)); except on EZeroDivide do begin Beep; ShowMessage('Diviso por zero'); end; on EInvalidOp do ShowMessage('Operao invlida'); else Abort; end;

Sugesto: Exerccio 8

62

UM POUCO MAIS SOBRE COMPONENTES (VCL)


Objeto Timer (Temporizador)
Paleta System Importncia: Permite a execuo de rotinas em loop, em um intervalo prdefinido.

Propriedades Enabled Permite ligar o timer, ou seja, ele entra em um loop executando o evento OnTimer at que seja atribudo falso ou terminada a aplicao. Interval Define em milisegundos o intevalo de repetio do evento OnTimer.

Objeto FileListBox (Caixa de listagem de arquivos)


Paleta Win 3.1 Importncia: Permite listar arquivos de determinado diretrio.

Propriedades FileEdit Define uma caixa de edio (TEdit) que exibir o arquivo atualmente selecionado. FileName Define o nome do arquivo selecionado. Vlido em tempo de execuo. Mask Define mscaras de filtro (separadas por ponto e vrgula) para a exibio dos arquivos.

63

Objeto DirectoryListBox (Caixa de listagem de diretrios)


Paleta: Win 3.1 Importncia: Permite listar os diretrios do drive desejado.

Propriedades DirLabel Permite exibir o diretrio corrente com a propriedade Caption de um componente do tipo TLabel. FileList Permite a conexo com um componente TFileListBox.

Objeto - DriveComboBox (Caixa de listagem de drives)


Paleta: Win 3.1 Importncia: Permite listar os drives disponveis no computador.

Propriedades DirList Permite a conexo com um componente TDirectoryListBox.

Objeto FilterComboBox (Caixa de listagem de filtros)


Paleta: Win 3.1 Importncia: Permite estabelecer filtros para visualizao de arquivos.

Propriedades FileList Permite a conexo com um componente TFileListBox. Filter Permite definir as mscaras de filtro de arquivo a serem exibidas.

64

Delphi 5 Banco de Dados


Nilton Ren Alberto Brustolin

CAXIAS DO SUL 2002

65

Sumrio
BANCO DE DADOS ........................................................................................................................... 68 MODELAGEM BSICA .................................................................................................................. 68 Modelo Conceitual e Lgico ....................................................................................................... 68 Modelo Fsico ............................................................................................................................. 68 Relacionamentos........................................................................................................................ 69 Viso fsica do banco de dados .................................................................................................. 69 CONEXO AO BANCO DE DADOS.................................................................................................. 71 BDE ................................................................................................................................................ 71 COMPONENTES DE CONTROLE E ACESSO .............................................................................. 71 Exemplo ..................................................................................................................................... 72 OBJETOS TFIELD.......................................................................................................................... 74 APLICAO EM BANCO DE DADOS............................................................................................... 76 DATABASE DESKTOP................................................................................................................... 76 BDE CRIAO DO ALIAS........................................................................................................... 79 APLICAO UTILIZANDO BD EM DELPHI ................................................................................... 80 FrmPrincipal ............................................................................................................................... 80 DATA MODULE .............................................................................................................................. 80 FORMULRIO DE CADASTRO DE SETOR .................................................................................. 82 FrmCadSetor .............................................................................................................................. 82 MTODOS E PROPRIEDADES PARA MANIPULAO DE DADOS ............................................ 85 FUNES DE CONVERSO......................................................................................................... 87 OS ESTADOS DE UM DATASET................................................................................................... 87 FORMULRIO DE CADASTRO DE FUNCIONRIO...................................................................... 89 FrmCadFuncionario .................................................................................................................... 89 MSCARA PARA ENTRADA DE DADOS...................................................................................... 91 INTEGRAO DE DADOS ENTRE AS TABELAS ......................................................................... 92 ATRIBUINDO VALORES ATRAVS DE ONNEWRECORD .......................................................... 95 CONSISTINDO DADOS ATRAVS DE ONVALIDADE .................................................................. 95 FORMULRIO DE CADASTRO DE DEPENDENTES.................................................................... 96 FrmCadDependente ................................................................................................................... 96 ATRIBUINDO VALORES DEFAULT (ONNEWRECORD) ............................................................ 100 MTODOS DE PESQUISA........................................................................................................... 100 FORMULRIO DE CONSULTA DE FUNCIONRIOS.................................................................. 100 FrmConFuncionario .................................................................................................................. 100 DEFININDO CAMPOS REQUERIDOS E EXCEO LOCAL....................................................... 103 EXCLUSO COM CONSISTNCIA ............................................................................................. 103 EXCLUSO EM CASCATA .......................................................................................................... 105 UM POUCO MAIS SOBRE CONSULTAS .................................................................................... 106 FrmConSetFun ......................................................................................................................... 106 RELATRIOS............................................................................................................................... 108 FrmRelFunc.............................................................................................................................. 108 CAMPOS CALCULADOS ............................................................................................................. 110 RELATRIO MESTRE-DETALHE................................................................................................ 113 FrmRelSetFun .......................................................................................................................... 113 CONSULTAS E IMPRESSO ...................................................................................................... 116 INSTALLSHIELD.............................................................................................................................. 117 Set the Visual Design ............................................................................................................... 118 Specify Components and Files ................................................................................................. 121 Specify InstallShield Objects for Delphi 5 ................................................................................. 123 Select User Interface Components ........................................................................................... 125 Specify Folders and Icons ........................................................................................................ 126 Run Disk Builder....................................................................................................................... 127 INSTALLSHIELD PACKAGEFORTHEWEB .................................................................................... 130 TRANSAES ................................................................................................................................. 136

66

DELPHI & TRANSAES ............................................................................................................ 136 DELPHI & SQL ................................................................................................................................. 140 TCNICAS DE INTERFACE ............................................................................................................ 144 SPLASH SCREEN........................................................................................................................ 144 CRIANDO E DESTRUINDO FORMS............................................................................................ 147 MANIPULANDO CURSORES ...................................................................................................... 147 TOOLBAR ........................................................................................................................................ 149 APLICAES MDI ........................................................................................................................... 153 Criando um lista das janelas abertas ........................................................................................ 157 Mesclando Menus .................................................................................................................... 157 Reaproveitamento de cdigo .................................................................................................... 158

67

BANCO DE DADOS
Na maioria dos casos, as aplicaes que vamos construir com o Delphi, ou outra ferramenta visual, deve manipular um banco de dados. Um banco de dados pode ser visto de diferentes perspectivas, pode ser um arquivo ou pode ser um diretrio com vrios arquivos. Vamos entender essas diferenas um pouco mais adiante.

MODELAGEM BSICA
Se voc j tem alguma experincia com a teoria de banco de dados, tenha pacincia, vamos estudar rapidamente neste tpico alguns conceitos bsicos que independem da plataforma no desenvolvimento de banco de dados. O Modelo Conceitual procura abstrair a realidade independente da plataforma de harware ou software, uma viso global na construo da aplicao. O Modelo Lgico define as regras bsicas e quais os dados devem ser armazenados no banco e depende das caractersticas do software, tambm dependente do modelo conceitual. O Modelo Fsico implementa as definies do modelo lgico na prtica, ou seja, desenvolver o projeto definido anteriormente, depende dos recursos de software e hardware.

Modelo Conceitual e Lgico


A princpio vamos entender como podemos definir os dados que sero armazenados em um computador, atravs do conceito de entidade. Ao pensarmos em cadastrar dados de clientes, alunos, fornecedores, etc... temos exemplos de entidades. A entidade possui propriedades que sero identificados como os dados propriamente ditos, estas propriedades so chamadas de atributos8, ou seja: Entidade Atributos Alunos AluCodigo AluNome AluDataNasc Entidade Atributos Funcionario FunCodigo FunCPF FunTelefone

Modelo Fsico
No modelo fsico a entidade se chama tabela e os atributos se chamam campos. A linha de dados que deriva do conjunto de campos se chama registro. Exemplo: Tabela: Funcionario FunNome FunDataNasc Edileumar Jamaica 01/01/1975 Jorgina Alambradus 25/04/1979 Campos Registros

FunCodigo 1 2

necessrio definirmos nas entidades (tabelas) um campo que seja idenficador de cada registro ou seja, um dado que no deve repetir, identificando aquele registro como nico.
8

Os atributos devem ter um tipo de dados definido (Inteiro, AlfaNumrico, Data, etc..)

68

Exemplo: FunCodigo Esse campo recebe o nome de chave primria porque ele capaz de identificar aquele determinado registro como nico, alm disso, a tabela comea a ser ordenada pelos dados deste campo.

Relacionamentos
O conceito: Banco de Dados Relacional significa que as tabelas que compem o banco relacionam-se entre si. Um exemplo: A tabela Funcionarios tem um relacionamento com a tabela Dependentes. Relacionamento uma regra de associao entre duas ou mais entidades. O relacionamento pode ser representado atravs de cardinalidades, onde so definidas restries que as entidades devem obedecer. Existem trs tipos bsicos de relacionamentos: 1:1 , 1:N ou N:N. Existem regras a seguir, por exemplo: no relacionamento 1:N ou N:1 (este o relacionamento que mais utilizado), a chave primria (Primary Key PK) da entidade 1 deve aparecer como chave estrangeira (Foreign Key FK) na entidade N. Exemplo de uma notao em um software CASE:

No caso de um relacionamento N:N dever ser criada uma 3 tabela onde haver no mnimo as chaves primrias das entidades relacionadas. Estes atributos devem fazer parte da chave primria desta nova tabela e funcionar como chave estrangeira da tabela onde se originou o relacionamento. Exemplo de uma notao em um software CASE:

Viso fsica do banco de dados


O banco de dados pode ser visto (fisicamente) como um arquivo ou como um diretrio (pasta), isso depender da estrutura que o fabricante do banco de dados vai abordar, exemplo:

69

No produto Microsoft Access o banco de dados representado fisicamente como um nico arquivo (.MDB) contendo as tabelas e demais recursos. Para o Delphi o banco de dados representado pelo arquivo .MDB

Para tabelas do banco de dados Paradox cada tabela dar origem a um arquivo .DB e arquivos separados para ndices (.PX) entre outros recursos. No exemplo abaixo, a tabela (.DB) contm campos BLOB (figuras ou memorandos), estes dados sero armazenados em um arquivo .MB Neste caso, para o Delphi, o banco de dados o diretrio (pasta) onde se encontram os arquivos que compem o banco de dados.

70

CONEXO AO BANCO DE DADOS


O Delphi utiliza uma estrutura de camadas para fazer com que o front-end (formulrio) manipulado pelo usurio venha interagir com a base de dados. O caminho deve ser percorrido por uma srie de componentes configurados entre si, porm, h uma camada intermediria que no fica dentro do ambiente Delphi, nem diretamente preso ao banco, o BDE.

BDE
O BDE um conjunto de DLLs que deve acompanhar as aplicaes que fazem uso de seus recursos de acesso ao banco. nesta camada que so definidas caractersticas especficas de cada banco de dados, bem como sua localizao, ou seja, o front-end no acessa diretamente a base de dados, o BDE responsvel para estabelecer este funcionamento. Aplicao Delphi (Front-End) Borland DataBase Engine (BDE)

Bancos de Dados Locais

SQL Links

Drivers ODBC

Existem outras maneiras de acessarmos banco de dados SEM O BDE, a paleta InterBase disponvel a partir do Delphi 5 um bom exemplo.

COMPONENTES DE CONTROLE E ACESSO


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

Session: Aplicaes simples, trabalham com apenas um banco de dados. Porm o Delphi permite mais de uma conexo simultnea bancos de dados distintos, e tambm mais de uma conexo com o mesmo banco de dados. O controle global das conexes feito atravs do componente da classe TSession, criado automaticamente pelo Delphi na execuo do programa. Esse componente representa a sesso default da aplicao. DataBase: O componente DataBase responsvel pela conexo da aplicao a um banco de dados com a finalidade maior de implementar segurana (transaes) e

71

definir caractersticas de comunicao entre uma aplicao Delphi-Client/Server. Embora em aplicaes locais, sua utilizao explicita recomendada. DataSet: Existem trs componentes que descendem de uma classe chamada TDataSet e implementam importantes mtodos de manipulao de banco de dados alm de suas caractersticas especficas. De fato, no utilizamos a classe TDataSet diretamente, mas atravs dos componentes TTable, TQuery(SQL) e TStoreProc. Estes componentes esto na paleta DataAccess DataSource: O componente DataSource responsvel por conectar os componentes Data-Aware uma determinada tabela representada pelo DataSet. Este componente est na paleta DataAccess. Data-Aware: Os componentes Data-Aware so responsveis pela visualizao e manipulao direta dos dados. Todo componente Data-Aware tem uma propriedade para conectar-se ao DataSource correspondente tabela destino. Estes componentes esto na paleta DataControls.

Exemplo
Vamos exemplificar a utilizao de componentes bsicos de acesso e controle atravs de um exemplo baseado em uma tabela (arquivo de dados) j pronta, criada na instalao do Delphi. O objetivo entendermos o funcionamento destes componentes. 1. Crie uma nova aplicao e salve-a na pasta especificada pelo instrutor. O Formulrio: UFrmPeixes Projeto: Peixes 2. Insira dois componentes: Um DataSource e um Table. Configure suas propriedades de acordo com a orientao abaixo:
object TbPeixes: TTable DatabaseName = 'DBDEMOS' TableName = 'biolife.db' Active = True Name = TbPeixes end object DsPeixes: TDataSource AutoEdit = False DataSet = TbPeixes Name = DsPeixes end

3. Insira um componente DBGrid e configure-o:


object DBGrid1: TDBGrid Align = alBottom DataSource = DsPeixes end

4. Insira um componente DBImage e configure-o:


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

72

5. Insira um componente DBMemo e configure-o:


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

6. Insira um componente DBNavigator e configure-o:


object DBNavigator1: TDBNavigator DataSource = DsPeixes end

Uma sugesto do visual pode ser a seguinte: 7. Salve novamente e execute a aplicao. Podemos perceber que a aplicao funciona manipulando a tabela biolife.DB sem a necessidade de nenhuma linha de cdigo explcita. claro que este apenas um exemplo para entendermos o mecanismo de componentes de acesso e controle. Desse modo, veremos a seguir que linhas de cdigo sero necessrias para implementar funcionalidades especficas (pesquisas), ou mesmo bsicas como incluso, edio e remoo. Por ltimo, vamos personalizar o componente DBGrid para no exibir os campos Grafic e Notes (campos BLOB). Pode-se usar a propriedade Columns ou um duplo clique no componente DBGrid, O Editor de colunas exibido, clique no cone Add All Fields; os campos disponveis sero exibidos, selecione o campo desejado (Grafic) e clique em Delete Selected

73

OBJETOS TFIELD
Vamos criar uma outra aplicao e exemplificar um recurso muito importante na construo de aplicaes baseadas em banco de dados os campos persistentes. 1. Crie uma nova aplicao e salve-a na pasta especificada pelo instrutor. Os podem ser: O Formulrio: UFrmPaises Projeto: Paises 2. Insira dois componentes: Um DataSource e um Table. Configure suas propriedades de acordo com a orientao abaixo:
object TbPaises: TTable DatabaseName = 'DBDEMOS' TableName = 'country.db' Active = True Name = TbPaises end object DsPaises: TDataSource AutoEdit = False DataSet = TbPaises Name = DsPaises end

74

3. Agora, ao invs de colocarmos componentes data-aware (paleta DataControls) diretamente no form, vamos definir os campos persistentes atravs de um duplo clique componente Table surgir o editor de campos (Fields Editor). Clique com boto direito no editor e escolha Add all fields. A partir de agora, cada na tabela considerado objeto TField com suas propriedades individualizadas na Object Inspector. campo um

Mas, o melhor de tudo o fato de podermos arrastar os campos TField diretamente para o formulrio, e perceber que o Delphi se encarrega de construir o componente data-aware necessrio a cada campo. Isso realmente poupa muito tempo no desenvolvimento de aplicaes em banco de dados. Porm h a possibilidade de criar aplicativos que utilizem acesso banco sem data-aware, nosso estudo no vai enfocar esta metodologia. 4. Insira um componente DBNavigator e configure-o:
object DBNavigator1: TDBNavigator DataSource = DsPaises end

Uma sugesto para a disposio dos componentes pode ser: 5. Salve novamente e execute a aplicao. A principal vantagem dos campos persistentes a facilidade de criao e a definio de propriedades importantes como EditMask e Required por exemplo.

75

APLICAO EM BANCO DE DADOS


Vamos iniciar um pequeno projeto para exemplificar a construo de uma aplicao de banco de dados com todos os passos bsicos, que vo desde a construo das tabelas at a gerao de relatrios e instalao do aplicativo. O projeto ser de um banco de dados local e possui trs tabelas com a seguinte definio de campos e relacionamentos:

Para criarmos as tabelas devemos utilizar um gerenciador de banco de dados (Paradox, Access) ou algum programa especfico para esta tarefa. O Delphi instala um aplicativo para esta finalidade denominado DataBase DeskTop. Porm observe que so itens distintos: O Delphi no cria as tabelas, ele apenas usa o banco de dados.

DATABASE DESKTOP
Sua utilizao muito simples. Para criar as tabelas, basta clicar no comando File | New | Table.

Uma janela para definio do tipo do banco de dados ser exibida. Vamos trabalhar com o banco de dados Paradox.

76

Cada tabela em Paradox, significa um arquivo em disco com extenso .DB. Neste caso o conceito de banco de dados definido pelo diretrio onde esto as tabelas e no o nome do arquivo que o caso de outros bancos como Access, por exemplo.

A definio dos campos deve ser feita na prxima tela, onde: Field Name: Define o nome do campo da tabela. Type: Define o tipo de dados do campo. Tecle a barra de rolagem para obter uma lista dos possveis tipos. Size: Tamanho do tipo de dados definido no item Size. Alguns campos j so padronizados no permitindo a alterao. Key: Define se o campo chave primria. Tecle a barra de espao para ligar ou desligar. Um asterisco exibido para confirmao da chave ligada. Table properties: Define uma srie de itens como Validaes, Integridade referencial, e um item muito importante ndices Secundrios.

77

Para definir ndices secundrios, clique em Table properties e escolha Secondary Indexes e clique em Define. Na janela exibida selecione o campo desejado para criar o ndice secundrio, neste exemplo SetNome. Atravs da seta, selecione-o para a lista Indexed fields.

Clique em Ok e defina um nome para o ndice na prxima janela.

Aps definidos os campos e chaves secundrias, grave a tabela atravs do boto Save As... O diretrio ser definido pelo instrutor.

Crie as demais tabelas com o mesmo raciocnio.

78

BDE CRIAO DO ALIAS


Vamos explorar com mais detalhes o conceito e funcionamento da camada BDE. O BDE assim como o DataBase DeskTop instalado junto com o Delphi9. Execute o programa e examine a tela inicial. A tela dividida em duas partes bsicas: A listagem de Aliases do lado esquerdo e as configuraes de cada Alias no lado direito. Um conceito importantssimo a definio de Alias. Cada nome do lado esquerdo do BDE representa uma configurao para acesso a um determinado banco. Exemplo: O Alias BDDEMOS representa o diretrio C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data, o driver para acesso ao de banco (Paradox) entre outras configuraes. Dessa maneira o desenvolvedor utiliza o nome DBDEMOS dentro do Delphi porm o diretrio pode ser alterado no BDE sem maiores problemas. O Alias uma string que define o path e configuraes para acesso ao banco de dados.

Veremos adiante que sua instalao na mquina do usurio tambm ser necessria, caso a aplicao em Delphi utilize acesso a banco de dados.

79

Para criar um alias: Clique no menu Object e escolha New. (CTRL+N). Confirme o tipo de driver (Paradox). Defina um nome para o Alias (lado esquerdo). Defina o path atravs do boto reticncias. Clique no menu Object e escolha Apply, para confirmar as alteraes. Confirme a gravao.

APLICAO UTILIZANDO BD EM DELPHI


O prximo passo construir a aplicao no Delphi, acessando o banco de dados atravs do ALIAS do BDE. O projeto ter a funo bsica de manipular os dados das tabelas, localizalos atravs de consultas simples e emitir relatrios simples e compostos.

FrmPrincipal
Ao abrir uma nova aplicao, grave o projeto dentro de uma pasta: Empresa A primeira unidade como UfrmPrincipal E o projeto como Empresa No formulrio insira um componente MainMenu e crie os itens de Menu abaixo.

DATA MODULE
A definio dos componentes de acesso aos dados sero centralizados em um formulrio especial chamado Data Module. Este formulrio tem uma caracterstica bem especfica: um form invisvel e s recebe componentes invisveis10, ou seja, o usurio nem vai imaginar o DataModule e os componentes que ele recebe. A sua finalidade centralizar os componentes para que qualquer formulrio possa ter acesso aos dados, sem a necessidade de repetir os componentes de acesso em cada formulrio. Para criar um formulrio DataModule, clique em File | New. Na guia New, clique no cone DataModule e confirme OK.

10

Com relao ao usurio.

80

Salve o novo formulrio com o nome de UFrmDmEmpresa. Insira dois componentes: Um DataSource e um componente Table.

As propriedades podem ser configuradas como:


object TbSetor: TTable DatabaseName = 'Empresa' TableName = 'Setor.db' Active = True Name = TbSetor end object DsSetor: TDataSource AutoEdit = False DataSet = TbSetor Name = DsSetor End

DataSource AutoEdit DataSet

Permite habilitar os controles para editar os dados automaticamente. Permite definir o componente DataSet (Table ou Query ou StoreProc) 81

Table Active DataBaseNa me TableName

Permite abrir a tabela para permitir sua manipulao. Permite um path fixo ou um ALIAS para acesso ao banco de dados. Permite escolher uma tabela aps a definio da propriedade DataBaseName.

O mesmo procedimento pode ser feito para as outras duas tabelas. Um par de componentes de acesso e as respectivas propriedades listadas acima.

FORMULRIO DE CADASTRO DE SETOR


FrmCadSetor
Crie um novo formulrio e insira dois componentes Panel, um alinhado na parte inferior e outro na rea cliente. Salve o form. O nome do arquivo ser: UFrmCadSetor. A propriedade Name do form ser: FrmCadSetor Uma caracterstica importante na construo de aplicaes utilizando banco de dados a possibilidade de trabalharmos com campos TFIELD exemplificados anteriormente, ou seja, campos que so considerados como objetos dentro da aplicao, sendo assim estes campos possuem propriedades e eventos individuais atravs da object inspector ou por atribuies manipulando cdigo. Vamos explorar um pouco mais da funcionalidade deste recurso. Campos TFIELD so chamados de campos persistentes e sua criao extremamente simples. No DataModule, localize o objeto Table referente tabela desejada. Um duplo clique no objeto Table, exibir a janela de manipulao dos campos Um clique dentro da janela com o boto direito exibir o speed menu. Escolha a opo Add All Fields.

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

82

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

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

Embora o Delphi faa esta tarefa de maneira automtica, importante saber disto? Claro! Se voc por falta de cuidado, executar vrios forms sem salvar fazendo referncias entre eles, esta clusula utilizar os nomes padres (Unit1, Unit2, etc...) e quando voc resolver salvar... o Delphi passa a no encontrar mais estas referncias de nomes antigos. Neste caso pode-se manipular o Code Editor e em algumas situaes, apenas apagar o nome errado, a referncia correta ser refeita. Pode-se fechar o editor de campos persistentes. Uma diferena visual que tem destaque agora so os controles de manipulao de dados que foram inseridos automaticamente pelo Delphi.

83

Embora se paream com um componente j visto anteriormente (Edit) estes componentes so provenientes da paleta Data Controls e tem o nome de DBEdit, ou seja, um controle especfico para manipulao de dados provenientes de um banco de dados. J nos referimos a estes controles nos primeiros exemplos do captulo de Banco de Dados. DBEdit DataSource DataField

Permite conectar o controle fonte de dados. Permite especificar um campo da tabela referenciada em DataSource.

Insira um componente DBNavigator e modifique suas propriedades:


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

Insira seis componentes BitBtn, e configure apenas as propriedades Name, Caption e Glyph. Uma sugesto visual pode ser vista a seguir:

84

MTODOS E PROPRIEDADES PARA MANIPULAO DE DADOS


Para percorrer os registros de uma tabela podemos utilizar os seguintes mtodos: First Prior Next Last MoveBy(N) Move o cursor para o primeiro registro do dataset. Move o cursor para o registro anterior (se houver). Move o cursor para o prximo registro (se houver). Move o cursor para o ltimo registro do dataset. Move o cursor para frente ou para trs, conforme o valor do parmetro N, que um valor inteiro, positivo ou negativo.

Para controlar o incio e fim da tabela podemos utilizar as propriedades: BOF : Boolean EOF : Boolean Por exemplo:
Table1.First; While not Table1.EOF do begin comando1; comando2; ... Table1.Next; end;

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

Um incoveniente com relao ao cdigo acima que os controles data-aware (data controls) sero atualizados no monitor medida em que o mtodo Next percorre a tabela, gerando uma visualizao indesejada e perda de tempo com a sua atualizao. Neste caso, pode-se utilizar os mtodos DisableControls e EnableControls.
Table1.DisableControls; try Table1.First; while not Table1.EOF do begin comando1; comando2; ... Table1.Next; end; finally Table1.EnableControls; end;

Em nosso exemplo atual, no formulrio de Cadastro de Setores, os cdigos para percorrer o dataset foram implementados de maneira automtica atravs do componente DBNavigator. Porm nada impede a criao de botes independentes e a definio de handlers de controle para navegao retirando o DBNavigator. Para alterar (editar) os valores de um dataset podemos utilizar o seguinte mtodo:

85

Edit

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

Exemplo:
Table1.Edit;

Para inserir um novo registro em um dataset podemos utilizar dois mtodos: Append Insert Exemplo:
Table1.Append; Ou Table1.Insert;

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

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


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

Remove o registro corrente.

Para confirmar (gravar) as alteraes11 no dataset podemos utilizar o mtodo: Post Exemplo:
Table1.Append; ... Table1.Post; Table1.Edit; ... Table1.Post;

Confirma as alteraes em um dataset.

Para acessar o valor em um campo atravs de TField podemos utilizar a propriedade Fields ou o mtodo FieldByName. Fields FieldByName Faz referncia a um campo especfico atravs de um array. Faz referncia a um campo atravs de seu nome.

Para cancelar algum comando enviado ao banco de dados, utiliza-se o mtodo cancel. Cancel Exemplo:
Table1.Append; ... Table1.Cancel; Table1.Edit; ... Table1.Cancel;

Confirma as alteraes em um dataset.

11

Inseres so consideradas alteraes.

86

FUNES DE CONVERSO
Tanto a propriedade Fields como o mtodo FieldByName utilizam funes de converso para acesso aos campos.

Exemplo:
Label1.Caption := Table1.Fields[0].AsString; Label2.Caption := Table1.FieldByName(SetNome).AsString; Edit1.Text := Table1.FieldByName(SetLocal).Value;

OS ESTADOS DE UM DATASET
Os datasets trabalham com estados. Em cada estado uma determinada operao pode ser vlida, outras no. A manipulao do dataset atravs de mtodos e funes agem nestes estados em todo o tempo provocando mudanas. Uma viso geral sobre os estados12 de um dataset pode ser vista a seguir:
Insert Append

Inativo
Close Open

Insert
Post Cancel

Browse
Edit Cancel Post

Edit Vamos utilizar no formulrio FrmCadSetor a prtica destes conceitos. Antes, troque o DBEdit1 referente ao cdigo para um componente DBText configure as propriedades DataSource para a tabela Setor e DataField para o campo SetCodigo. O BitBtn referente sada do form pode ter sua propriedade Cancel verdadeira. O BitBtn referente confirmao das operaes pode ter sua propriedade Default verdadeira e a propriedade Enabled como falso.

12

O estado de pesquisa no foi considerado neste exemplo.

87

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

unit UFrmCadSetor; {A interface no foi impressa} implementation uses UDMEmpresa; {$R *.DFM} procedure TFrmCadSetor.BbtSairClick(Sender: TObject); begin FrmCadSetor.Close; end; {Para criar o procedimento TrataBotoes, digite sua declarao (sem TFrmCadSetor) na clusula private e utilize CTRL+SHIFT+C Para todos os demais, selecione o objeto e utilize a object inspector} procedure TFrmCadSetor.TrataBotoes; begin BbtInserir.Enabled := not BbtInserir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; DbNavigator1.Enabled := not DbNavigator1.Enabled; end; procedure TFrmCadSetor.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if DmEmpresa.TbSetor.State in [dsEdit, dsInsert] then if MessageDLG('Existem dados pendentes,'+#13+'deseja grav-los?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then CanClose := False else begin DmEmpresa.TbSetor.Cancel; TrataBotoes; CanClose := True; end; end; procedure TFrmCadSetor.BbtInserirClick(Sender: TObject); var ProxNum: Integer;

88

begin TrataBotoes; DmEmpresa.TbSetor.Last; ProxNum := DmEmpresa.TbSetor.FieldByName('SetCodigo').AsInteger + 1; DmEmpresa.TbSetor.Append; DmEmpresa.TbSetor.FieldByName('SetCodigo').AsInteger := ProxNum; DbEdit2.SetFocus; end; procedure TFrmCadSetor.BbtEditarClick(Sender: TObject); begin DmEmpresa.TbSetor.Edit; TrataBotoes; end; procedure TFrmCadSetor.BbtRemoverClick(Sender: TObject); begin if DmEmpresa.TbSetor.RecordCount = 0 then ShowMessage('Tabela vazia!') else if MessageDLG('Tem certeza que deseja remover o setor: '+#13+ DmEmpresa.TbSetor.FieldByName('SetNome').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DmEmpresa.TbSetor.Delete; end; procedure TFrmCadSetor.BbtCancelarClick(Sender: TObject); begin DmEmpresa.TbSetor.Cancel; TrataBotoes; end; procedure TFrmCadSetor.BbtConfirmarClick(Sender: TObject); begin DmEmpresa.TbSetor.Post; TrataBotoes; end; end.

Antes de prosseguir com o prximo formulrio, necessrio inserir a Biblioteca DB na clusula uses da interface. Consulte a dica COMO SABER QUAL BIBLIOTECA INSERIR NA USES ? para mais informaes.

FORMULRIO DE CADASTRO DE FUNCIONRIO


FrmCadFuncionario
Vamos iniciar a construo do formulrio de Cadastro de Funcionrio. No menu File escolha o comando New Form. H um cone para o mesmo comando na SpeedBar. Grave este novo formulrio com o nome de: UFrmCadFuncionario A propriedade Name do form dever ser FrmCadFuncionario

89

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

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

Columns

Define em quantas colunas os dados da propriedade items sero

90

Items Values

ordenados. Define os itens a serem exibidos no componente. Define os valores a serem armazenados na tabela.

Pode-se excluir o DBEdit responsvel pelo campo Sexo e alinhar o DBRadioGroup em seu lugar. Um outro componente que pode exibir um conjunto de dados pr-definidos o DBComboBox. Insira o componente no formulrio e modifique suas propriedades:
object DBComboBox1: TDBComboBox DataSource = DmEmpresa.DsFuncionario DataField = 'FunEstado' Items.Strings = AC AL AP AM BA CE DF ES GO MA MT MS MG PA PB PR PE PI RJ RN RS RO RR SC SP SE TO end

Exclua o DBEdit responsvel pelo Estado e alinhe o DBComboBox em seu lugar.

MSCARA PARA ENTRADA DE DADOS


Podemos definir mscaras para a entrada dos dados nos campos Data de Nascimento e CEP. Porm, esta definio no feita diretamente no componente data-aware e sim no objeto TField. Selecione o DataModule. Duplo clique no componente TbFuncionario. Selecione o campo persistente FunDataNasc Na object inspector selecione a propriedade EditMask.

91

Configure a mscara desejada. Exemplo:

H uma srie de exemplos pr-definidos, escolha o tipo Date e observe que foram acrescentados dois zeros (pelo desenvolvedor) para exibir o ano da data. necessrio configurar no Windows: Painel de Controle | Configuraes Regionais | Data/Hora para exibir os quatro dgitos no ano. Consulte o boto Help para verificar a simbologia de cada caracter na mscara. A mscara para o campo CEP pode ser a seguinte: 99\.999\-999;0;_ O CEP pode ficar sem a opo de salvar os caracteres literais. A data deve ter esta opo. Save Literal Characters permite salvar ou no, (neste caso do CEP) os separadores . e - na tabela.

INTEGRAO DE DADOS ENTRE AS TABELAS


Vamos acrescentar alguma funcionalidade para que o usurio no precise de saber o cdigo do setor, ele poder selecionar uma caixa de listagem atravs do nome do setor por exemplo. Acrescente um DBLookupComboBox ao Form e faa as modificaes necessrias, a sugesto visual a seguinte:

92

Configure o DBLookupComboBox com as propriedades a seguir:


object DBLookupComboBox1: TDBLookupComboBox ListSource = DmEmpresa.DsSetor ListField = 'SetNome' KeyField = 'SetCodigo' DataSource = DmEmpresa.DsFuncionario DataField = 'SetCodigo' end

Onde: ListSource ListField

Permite conectar o controle fonte origem dos dados. Permite especificar um campo da tabela referenciada em ListSource. KeyField Permite especificar o campo chave da tabela origem dos dados. DataSource Permite conectar o controle fonte destino dos dados. DataField Permite especificar o campo chave estrangeira da tabela destino. Uma sugesto de implementao para o cdigo fonte do formulrio para Cadastro de Funcionrio o seguinte:
unit UFrmCadFuncionario; {A interface no foi impressa} implementation uses UDMEmpresa; {$R *.DFM} procedure TFrmCadFuncionario.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if DmEmpresa.TbFuncionario.State in [dsEdit, dsInsert] then if MessageDLG('Existem dados pendentes,'+#13+'deseja grav-los?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then CanClose := False else begin DmEmpresa.TbFuncionario.Cancel;

93

TrataBotoes; CanClose := True; end; end; {Para criar o procedimento TrataBotoes, digite sua declarao (sem TFrmCadFuncionario) na clusula private e utilize CTRL+SHIFT+C Para todos os demais, selecione o objeto e utilize a object inspector} procedure TFrmCadFuncionario.TrataBotoes; begin BbtInserir.Enabled := not BbtInserir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; DbNavigator1.Enabled := not DbNavigator1.Enabled; end; procedure TFrmCadFuncionario.BbtInserirClick(Sender: TObject); var ProxNum: Integer; begin TrataBotoes; DmEmpresa.TbFuncionario.Last; ProxNum := DmEmpresa.TbFuncionario.FieldByName('FunCodigo').AsInteger + 1; DmEmpresa.TbFuncionario.Append; DmEmpresa.TbFuncionario.FieldByName('FunCodigo').AsInteger := ProxNum; DbEdit3.SetFocus; end; procedure TFrmCadFuncionario.BbtEditarClick(Sender: TObject); begin DmEmpresa.TbFuncionario.Edit; TrataBotoes; end; procedure TFrmCadFuncionario.BbtRemoverClick(Sender: TObject); begin if DmEmpresa.TbFuncionario.RecordCount = 0 then ShowMessage('Tabela vazia!') else if MessageDLG('Tem certeza que deseja remover o funcionrio: '+#13+ DmEmpresa.TbFuncionario.FieldByName('FunNome').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DmEmpresa.TbFuncionario.Delete; end;

procedure TFrmCadFuncionario.BbtCancelarClick(Sender: TObject); begin DmEmpresa.TbFuncionario.Cancel; TrataBotoes; end; procedure TFrmCadFuncionario.BbtConfirmarClick(Sender: TObject); begin DmEmpresa.TbFuncionario.Post; TrataBotoes; end; procedure TFrmCadFuncionario.BbtSairClick(Sender: TObject); begin

94

FrmCadFuncionario.Close; end; end.

ATRIBUINDO VALORES ATRAVS DE ONNEWRECORD


Ainda no Cadastro de Funcionrios, observe que o componente DBRadioGroup no tem a propriedade ItemIndex para iniciar o cadastro com uma das opes (Fem ou Mas) selecionada. Isso ocorre porque os componentes data-aware refletem o contedo da tabela. Neste caso, para definir um valor padro, v at o Data Module selecione a tabela (Funcionario, neste exemplo) e na Object Inspector na guia Events selecione o evento OnNewRecord ou seja, a cada novo registro, vamos atribuir um valor direto para tabela, se o componente reflete o contedo da tabela, ele vai j indicar o valor default.
procedure TDmEmpresa.TbFuncionarioNewRecord(DataSet: TDataSet); begin TbFuncionario.FieldByName('FunSexo').AsString := 'F'; end;

CONSISTINDO DADOS ATRAVS DE ONVALIDADE


Um exemplo de consistncia pode ser utilizado no campo FunDataNasc com o seguinte raciocnio: se a data digitada pelo usurio for maior do que a data atual, subtende-se que o funcionrio cadastrado ainda no nasceu... Para criar esta regra de validao v at o Data Module e clique duas vezes na tabela (Funcionario, neste exemplo) chamando os TFields. Selecione o TField FunDataNasc e na Object Inspector selecione o evento OnValidade. Crie o seguinte cdigo para o evento:
procedure TDmEmpresa.TbFuncionarioFunDataNascValidate(Sender: TField); begin if TbFuncionarioFunDataNasc.Value > Date then raise Exception.Create('Data menor do que a atual!'); end;

Neste exemplo a exceo est sendo ativada pelo comando raise, poderamos tratar esta situao com o comando Abort que gera uma exceo silenciosa, ou seja, uma exceo sem mensagem. O evento OnValidade ocorre quando um valor atribudo ao campo. Por exemplo uma atribuio direta:
TbFuncionarioFunNome.Value := Edileumar;

dispara o evento OnValidade para o TField correspondente ao campo FunNome da tabela Funcionario. Quando utilizamos controles data-aware esse evento ocorre quando o foco sai do componente e o usurio fez alguma alterao enquanto o foco estava no componente.

95

O evento tambm pode ocorrer durante o processamento do mtodo Post, se existir alguma alterao pendente a ser feita pelos componentes data-aware.

FORMULRIO DE CADASTRO DE DEPENDENTES


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

FrmCadDependente
Clique no menu File | New Form... Grave a unit com o nome: UFrmCadDependente A propriedade Name do form ser: FrmCadDependente

Configure o componente DBNavigator:


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

Crie uma mscara para o campo Data de Nascimento atravs do objeto TField correspondente. Insira dois componentes DBRadioGroup, um para o Sexo e outro para o Parentesco. A configurao do DBRadioGroup para o campo Sexo pode ser a seguinte:
object DBRadioGroup1: TDBRadioGroup Caption = 'Se&xo' Columns = 2 DataSource = DmEmpresa.DsDependente DataField = 'DepSexo' Items.Strings = Feminino Masculino Values.Strings =

96

F M end

A configurao do DBRadioGroup para o campo Parentesco pode ser a seguinte:


object DBRadioGroup2: TDBRadioGroup Caption = '&Parentesco' Columns = 4 DataSource = DmEmpresa.DsDependente DataField = 'DepParentesco' Items.Strings = Cnjuge Filho(a) Pai Me Values.Strings = 1 2 3 4 end

Lembre-se que na definio da tabela, o campo parentesco foi definido como Integer... Porqu? Armazenar um nmero ocupa menos espao do que uma string; e o componente pode exibir uma string e armazenar um outro tipo de dados. Vamos entender mais adiante que o inverso tambm verdadeiro, por exemplo: Quando for necessrio emitir um relatrio vamos ler um nmero e imprimir uma string. Insira dois DBText e altere suas propriedades DataSource e DataField. Um deles deve exibir o cdigo do dependente que ser gerado pelo algoritmo. O outro (DBText2) deve exibir o nome do funcionrio da tabela funcionrio. O SpeedButton ser utilizado adiante, ele deve ficar com a propriedade Enabled falsa e dever ser includo no procedimento tratabotoes. Uma sugesto visual pode ser vista a seguir:

O cdigo para implementar as funes dos BitBtns pode ser visto a seguir:

97

unit UFrmCadDependente; {A interface no foi impressa} implementation uses UDMEmpresa; {$R *.DFM} procedure TFrmCadDependente.BbtInserirClick(Sender: TObject); var ProxNum: Integer; begin TrataBotoes; DmEmpresa.TbDependente.Last; ProxNum := DmEmpresa.TbDependente.FieldByName('DepCodigo').AsInteger + 1; DmEmpresa.TbDependente.Append; DmEmpresa.TbDependente.FieldByName('DepCodigo').AsInteger := ProxNum; DbEdit2.SetFocus; end; {Para criar o procedimento TrataBotoes, digite sua declarao (sem TFrmCadFuncionario) na clusula private e utilize CTRL+SHIFT+C Para todos os demais, selecione o objeto e utilize a object inspector} procedure TFrmCadDependente.TrataBotoes; begin BbtInserir.Enabled := not BbtInserir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; DbNavigator1.Enabled := not DbNavigator1.Enabled; SpeedButton1.Enabled := not SpeedButton1.Enabled; end; procedure TFrmCadDependente.BbtEditarClick(Sender: TObject); begin DmEmpresa.TbDependente.Edit; TrataBotoes; end; procedure TFrmCadDependente.BbtRemoverClick(Sender: TObject); begin if DmEmpresa.TbDependente.RecordCount = 0 then ShowMessage('Tabela vazia!') else if MessageDLG('Tem certeza que deseja remover o dependente: '+#13+ DmEmpresa.TbDependente.FieldByName('DepNome').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DmEmpresa.TbDependente.Delete; end; procedure TFrmCadDependente.BbtCancelarClick(Sender: TObject); begin DmEmpresa.TbDependente.Cancel; TrataBotoes; end; procedure TFrmCadDependente.BbtConfirmarClick(Sender: TObject); begin DmEmpresa.TbDependente.Post; TrataBotoes; end;

98

procedure TFrmCadDependente.BbtSairClick(Sender: TObject); begin FrmCadDependente.Close; end; procedure TFrmCadDependente.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if DmEmpresa.TbDependente.State in [dsEdit, dsInsert] then if MessageDLG('Existem dados pendentes,'+#13+'deseja grav-los?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then CanClose := False else begin DmEmpresa.TbDependente.Cancel; TrataBotoes; CanClose := True; end; end; procedure TFrmCadDependente.DBEdit2Exit(Sender: TObject); begin if FrmCadDependente.DBEdit2.Text <> '' then if not DmEmpresa.TbFuncionario.FindKey([FrmCadDependente.DBEdit2.Text]) then begin ShowMessage('Cdigo invlido'); FrmCadDependente.DBEdit2.SetFocus; end; end; end.

99

ATRIBUINDO VALORES DEFAULT (ONNEWRECORD)


Para inicializar os campos Sexo e Parentesco com valores pr-definidos devemos chamar o Data Module e selecionar a tabela (Dependente), na Object Inspector selecione o evento OnNewRecord e defina o cdigo necessrio.
procedure TDmEmpresa.TbDependenteNewRecord(DataSet: TDataSet); begin //H diferena entre f e F TbDependente.FieldByName('DepSexo').AsString := 'F'; TbDependente.FieldByName('DepParentesco').AsInteger := 2; end;

Vamos definir um formulrio para localizar o funcionrio caso o operador do micro no saiba (e provavelmente no saber) o cdigo do funcionrio.

MTODOS DE PESQUISA
Utilizaremos mtodos de pesquisa para encontrar os dados da tabela Funcionrio. Basicamente os mtodos FindKey e FindNearest. Estes mtodos fazem procura em campos indexados, ou seja, o campo a ser pesquisado deve ter um ndice deve estar ordenado por ele. A diferena bsica que FindKey realiza uma pesquisa exata, enquanto FindNearest realiza uma pesquisa parcial, FindKey uma funo que retorna um valor boolean e FindNearest um procedimento. Para modificar a estrutura de ndices da tabela, utiliza-se a propriedade IndexName da tabela desejada. Exemplo:
//utiliza o ndice secundrio DmEmpresa.TbFuncionario.IndexName := 'IndSetNome'; DmEmpresa.TbFuncionario.FindNearest([Edit2.Text]); //utiliza o ndice primrio DmEmpresa.TbFuncionario.IndexName := ''; DmEmpresa.TbFuncionario.FindKey([Edit1.Text]);

FORMULRIO DE CONSULTA DE FUNCIONRIOS


FrmConFuncionario
Clique em File | New Form Grave o nova unit como UFrmConFuncionario A propriedade Name do form ser: FrmConFuncionario Insira os componentes necessrios, altere suas propriedades. Faa a referncia ao Data Module manualmente atravs do comando File | Use Unit... Configure o DBGrid para acessar a tabela Funcionario e exibir apenas o cdigo e o nome do funcionrio, mudanas visuais podem ser feitas nas propriedades TileFont e Options.

100

Um exemplo de algumas propriedades que podem ser alteradas:


object DBGrid1: TDBGrid Cursor = crHandPoint TabStop = False Align = alBottom BorderStyle = bsNone DataSource = DmEmpresa.DsFuncionario ReadOnly = True TitleFont.Style = [fsBold] end

A propriedade Name dos BitBtns sero o prefixo Bbt + o caption (sem espao e sem acento). A implementao do cdigo do formulrio FrmConFuncionario pode ser vista logo a seguir:
unit UFrmConFuncionario; {A interface no foi impressa} implementation uses UDMEmpresa; {$R *.DFM} procedure TFrmConFuncionario.BbtPesquisaCodigoClick(Sender: TObject); begin if Edit1.Text <> '' then DmEmpresa.TbFuncionario.FindKey([Edit1.Text]); end; procedure TFrmConFuncionario.Edit1Enter(Sender: TObject); begin Edit2.Clear; DmEmpresa.TbFuncionario.IndexName := ''; end; procedure TFrmConFuncionario.Edit2Enter(Sender: TObject); begin Edit1.Clear; DmEmpresa.TbFuncionario.IndexName := 'IndFunNome'; end; procedure TFrmConFuncionario.Edit2Change(Sender: TObject); begin if Edit2.Text <> '' then

101

DmEmpresa.TbFuncionario.FindNearest([Edit2.Text]); end; procedure TFrmConFuncionario.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then BbtPesquisaCodigo.Click else if ( (Key in ['0'..'9'] = FALSE) and (Word(Key) <> VK_BACK) ) then Key := #0; end; procedure TFrmConFuncionario.BbtSairClick(Sender: TObject); begin FrmConFuncionario.Close; end; procedure TFrmConFuncionario.FormClose(Sender: TObject; var Action: TCloseAction); begin DmEmpresa.TbFuncionario.IndexName := ''; DmEmpresa.TbDependente.FieldByName('FunCodigo').AsInteger := DmEmpresa.TbFuncionario.FieldByName('FunCodigo').AsInteger; FrmCadDependente.DBEdit2.SetFocus; end; end.

102

DEFININDO CAMPOS REQUERIDOS E EXCEO LOCAL


Podemos definir alguns campos que devem, obrigatoriamente, serem preenchidos pelo usurio, por exemplo: No formulrio de Cadastro de Dependentes os campos FunCodigo e DepNome so muito importantes e poderiam, na sua ausncia tornar o banco inconsistente. Vamos utilizar um exemplo com a tabela Dependente. Para definir campos requeridos e evitar inconsistncia de campos em branco: Chame o Data Module. Escolha a tabela desejada (TbDependente) e clique duas vezes para chamar os TFields. Escolha o campo TField desejado (FunCodigo, neste exemplo) e na Object Inspector defina Required como True. Defina o mesmo recurso para o nome do Dependente. Neste momento, se o usurio tentar gravar o registro sem digitar o cdigo do funcionario ou o nome do dependente ser levantada uma exceo da classe EDatabaseError que dever ser tratada pelos conceitos vistos no curso. O evento OnClick do boto confirmar no cadastro de dependentes pode ser (atualizado) implementado como o exemplo abaixo:
procedure TFrmCadDependente.BbtConfirmarClick(Sender: TObject); begin try DmEmpresa.TbDependente.Post; TrataBotoes; except on E: EDataBaseError do Showmessage('Campo obrigatrio sem preencher! ' + #13+#13 + E.Message); end; end;

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

EXCLUSO COM CONSISTNCIA


Antes de excluir em cascata, vamos exemplificar uma situao em que: havendo a chave primria como chave estrangeira na outra tabela, no se pode excluir o registro. Neste projeto, o exemplo o seguinte: Se houver uma ocorrncia do cdigo do setor (chave primria) da tabela setor na tabela funcionrio (chave estrangeira) no vamos deletar o setor. A funo locate vai localizar na tabela funcionrio no campo SetCodigo o valor do campo SetCodigo da tabela setor passado como parmetro. Caso encontre, a funo retorna um valor booleano verdadeiro.

103

A alterao no cdigo do boto remover do form Cadastro de Setor pode ser visto a seguir:
procedure TFrmCadSetor.BbtRemoverClick(Sender: TObject); begin if DmEmpresa.TbSetor.RecordCount = 0 then ShowMessage('Tabela vazia!') else if DmEmpresa.TbFuncionario.Locate('SetCodigo', DmEmpresa.TbSetor.FieldByName('SetCodigo').AsInteger,[]) then ShowMessage('Este setor possui funcionrios,'+#13+ 'favor realoc-los antes de deletar.') else if MessageDLG('Tem certeza que deseja remover o setor: '+#13+ DmEmpresa.TbSetor.FieldByName('SetNome').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DmEmpresa.TbSetor.Delete; end;

A funo locate declarada internamente da seguinte forma:


function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;

Onde: KeyFields KeyValues Options Permite definir o(s) campo(s) a serem pesquisados. Permite definir o(s) valore(s) a serem pesquisados. Permite definir se os valores a serem pesquisados sero parciais e/ou diferenciados de maiscula e minscula. [loCaseInsensitive, loPartialKey]

if DmEmpresa.TbFuncionario.Locate('SetCodigo', DmEmpresa.TbSetor.FieldByName('SetCodigo').AsInteger,[]) then

Neste exemplo acima, estamos pesquisando na tabela TbFuncionario o campo SetCodigo o valor que est na tabela TbSetor no campo SetCodigo. A pesquisa exata.

104

EXCLUSO EM CASCATA
Pense nesta situao: Ao excluir um funcionario, o cdigo correspondente na tabela dependente no ser mais vlido, ou seja, o dependente ter um cdigo (FunCodigo) que no existe mais. Nosso objetivo ento ser deletar o(s) dependente(s) do funcionrio deletado.
procedure TDmEmpresa.TbFuncionarioBeforeDelete(DataSet: TDataSet); begin if TbDependente.Locate('FunCodigo', TbFuncionario.FieldByName('FunCodigo').AsInteger,[]) then begin //desabilitar os controles data aware TbDependente.DisableControls; {Aplicar e ligar o filtro para que a tabela considere apenas os registros que tem a chave estrangeira com o cdigo do funcionario a ser deletado} TbDependente.Filter := 'FunCodigo='+TbFuncionario.FieldByName('FunCodigo').AsString; TbDependente.Filtered := True; //Enquanto nao e o fim da tabela, delete os registros filtrados while not TbDependente.Eof do TbDependente.Delete; //Retirar o filtro para que a tabela possa considerar os outros registros TbDependente.Filter := ''; TbDependente.Filtered := False; end; end; procedure TDmEmpresa.TbFuncionarioAfterDelete(DataSet: TDataSet); begin //Habilitar os controles data aware aps a deleao do funcionario TbDependente.EnableControls; end;

As propriedades Filter e Filtered funcionam da seguinte forma: Deve-se atribuir um valor (critrio) propriedade filter.
TbDependente.Filter := DepSexo=F;

Depois ligar o filtro para que o critrio tenha efeito.


TbDependente.Filtered := True;

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

105

Isto utilizado em nosso exemplo porque h o evento OnChange no DBEdit2 do Cadastro de Dependentes, ou seja, quando os registros da tabela dependentes forem deletados, o cdigo do funcionrio a ser deletado no existir na tabela dependentes, o evento OnChange do data aware DBEdit2 ser disparado e mudar o registro da tabela funcionrio de posio. Quando o cdigo for deletar o funcionrio, deletar o funcionrio errado. Para evitar isso, desabilitamos os controles no momento da deleo dos dependentes e habilitamos no momento aps a deleo do funcionrio.

UM POUCO MAIS SOBRE CONSULTAS


Vamos criar uma consulta para saber quais funcionrios trabalham em determinado setor e ter a opo de imprimir seu resultado.

FrmConSetFun
Crie um novo formulrio e grave-o com o nome de UFrmConSetFun Insira os componentes necessrios:

Para acessar as tabelas necessrias, use o comando File | Use Unit e selecione o DataModule. O componente DBLookupComboBox ser usado apenas para listar o contedo de um campo de determinada tabela. Neste exemplo as propriedades alteradas sero:
object DBLookupComboBox1: TDBLookupComboBox ListSource = DmEmpresa.DsSetor ListField = 'SetNome' KeyField = 'SetCodigo' end

Ao contrrio do que poderamos pensar, as propriedades DataSource e DataField neste componente no sero alteradas. Elas representam uma tabela destino para o envio de dados da tabela origem, a tabela origem foi configurada atravs das 3 propriedades acima. Ento os nomes dos setores sero listados no DBLookupComboBox e os respectivos funcionrios sero listados no DBGrid, esta a idia bsica. Configure o DBGrid nas suas propriedades: 106

object DBGrid1: TDBGrid Align = alBottom DataSource = DmEmpresa.DsFuncionario end

Na propriedade Columns defina apenas duas colunas: FunCodigo e FunNome. O procedimento para imprimir ser visto aps a construo dos relatrios. Os demais procedimentos sero os seguintes:
unit UFrmConSetFun; {A interface no foi impressa} implementation uses UDMEmpresa, UFrmRelSetFun; {$R *.DFM} procedure TFrmConSetFun.DBLookupComboBox1Click(Sender: TObject); begin with DmEmpresa do begin TbFuncionario.Filter := 'SetCodigo='+ TbSetor.FieldByName('SetCodigo').AsString; TbFuncionario.Filtered := True; end; DBGrid1.DataSource := DmEmpresa.DsFuncionario; end; procedure TFrmConSetFun.FormClose(Sender: TObject; var Action: TCloseAction); begin with DmEmpresa do begin TbFuncionario.Filter := ''; TbFuncionario.Filtered := False; end; DBGrid1.DataSource := nil; end; procedure TFrmConSetFun.BbtSairClick(Sender: TObject); begin FrmConSetFun.Close; end; end.

A propriedade DataSource do DBGrid foi preenchida em tempo de projeto para auxiliar nas configuraes, porm dever ficar vazia aps a constuo e testes finais. Ela ser preenchida em tempo de execuo para que no liste os funcionrios assim que o form exibido.

107

RELATRIOS
Vamos abordar inicialmente a construo de um formulrio simples que exibir os dados de uma tabela apenas. Da mesma forma que para manipular a base da dados utilizamos componentes data aware da paleta Data Controls. Para manipular relatrios vamos utilizar componentes da paleta Qreport13. Mais informaes (tcnicas) sobre o QuickReport podem ser encontradas no site da QuSoft (www.qusoft.com).

FrmRelFunc
Crie um formulrio novo e salve-o com o nome: UFrmRelFunc Insira um componente QuickRep e no se preocupe com o alinhamento do componente no form. Uma propriedade muito importante do QuickRep : Bands. Pois esta propriedade define as reas teis (bandas) para a utilizao do relatrio. Estas bandas sero objetos do tipo TQRBand que recebem outros objetos para exibio dos dados. Defina as seguintes bandas para este exemplo:

HasColumnHeader Define a rea para os dados que sero repetidos em todas as pginas como rtulo das colunas. HasDetail Define a rea para os dados (de uma tabela) a serem exibidos. HasPageFooter Define a rea rodap do relatrio. HasPageHeader Define a rea cabealho do relatrio. HasSummary Define a rea de sumrio, exibida na ltima pgina do relatrio. HasTitle Define a rea para o ttulo do formulrio exibido apenas na primeira pgina. Insira os demais componentes em suas respectivas bandas: QRSysData, QRLabel, QRDBText.

13

Quick Report.

108

Para os componentes QRSysData altere a propriedade Data para o valor desejado. Para os componentes QRLabel altere as propriedades Alignment, AlignToBand e Font. Para os componentes QRDBText no altere nenhuma propriedade ainda. Embora seja perfeitamente possvel utilizar o DataModule para ser a fonte de componentes de dados nos relatrios vamos utilizar uma metodologia diferente. Os componentes de acesso sero instanciados nos prprios relatrios. Insira um componente Table. Configure suas propriedades:
object TbFunc: TTable DatabaseName = 'Empresa' TableName = 'Funcionario.db' Active = True Name = TbFunc end

Configure os demais componentes: Para os componentes QRLabel altere a propriedade Caption. Para os componentes QRDBText altere as propriedades DataSet e DataField.

109

O componente QRDBText3 ter um tratamento diferenciado como veremos adiante. Selecione o componente QuickRep1 e configure sua propriedade DataSet. Com o boto direito do mouse no componente QuickRep e escolha Preview. Um exemplo pode ser visto ainda em tempo de projeto. Para fazer a chamada do relatrio no menu principal, deve-se chamar o mtodo Preview do QuickRep da seguinte forma:
FrmRelFunc.QuickRep1.Preview;

CAMPOS CALCULADOS
Voc deve lembrar-se que o campo sexo definido como um campo AlfaNumrico de uma posio F ou M. Mas queremos que saia a string Feminino ou Masculino no relatrio, vamos utilizar um campo calculado para realizar esta tarefa. Campos calculados servem para calcular alguma rotina em tempo de execuo. Este clculo no obrigatoriamente uma expresso de clculo matemtico, pode ser uma condio de atribuio aps um teste lgico, por exemplo. No relatrio, selecione o DataSet - Table, d um duplo clique. No editor de campos persistentes utilize o boto direito do mouse e clique em Add All Fields para adicionarmos todos os campos. Com o boto direito novamente, clique dentro do editor e escolha New Field...

110

Uma nova janela ser exibida. Preecha os items Name e Type, confirme a janela. Um novo campo chamado SexoExtenso dever surgir no editor.

O campo calculado funciona apenas em tempo de execuo realizando o cdigo que deve ficar no evento OnCalcFields da tabela desejada. Selecione a tabela TbFunc e escreva o cdigo no evento (OnCalcFields) indicado:
procedure TFrmRelFunc.TbFuncCalcFields(DataSet: TDataSet); begin { TbFuncFunSexo e TbFuncSexoExtenso so os Names dos campos persistentes. Poderia ser usado a propriedade FieldByName ou Fields para acessar os campos.} if TbFuncFunSexo.Value = 'F' then TbFuncSexoExtenso.AsString := 'Feminino' else TbFuncSexoExtenso.AsString := 'Masculino'; end;

111

Selecione o QRDBText destinado ao campo sexo e altere suas propriedades DataSet e DataField. Lembrando que o campo DataField ser o campo calculado SexoExtenso. Para a banda Summary insira um componente QRLabel e um componente QRSysData. Altere o Caption do QRLabel para Total de funcionrios. E altere a propriedade data do QRSysData para qrsDetailCount. Em cada banda pode-se alterar as fontes e a propriedade Frame para causar um efeito de diviso importante.

A largura das bandas define a distncia entre os registros.

112

RELATRIO MESTRE-DETALHE
Um relatrio composto de mais de uma tabela onde h um relacionamento explcito atravs de uma chave primria e uma estrangeira denominado Mestre-Detalhe. A tabela que fornece a chave primria a tabela Mestre a tabela que trabalha com a chave estrangeira a tabela Detalhe. Por exemplo vamos criar um relatrio entre Setor e Funcionrio, para cada setor (chave primria) pode haver: zero, um ou vrios funcionrios (a tabela funcionrio tm o campo SetCodigo como chave estrangeira). Ser exibido da tabela Mestre: o cdigo e o nome do Setor, da tabela Detalhe: o nome do funcionrio.

FrmRelSetFun
Crie um novo formulrio e grave-o como UfrmRelSetFun. Insira os componentes: 1 QuickRep. 1 DataSource 2 TTables Configure os componentes (da tabela mestre) como a seguir:
object TbSetor: TTable DatabaseName = 'Empresa' TableName = 'Setor.DB' Active = True Name = TbSetor end object DsSetor: TDataSource AutoEdit = False DataSet = TbSetor Name = DsSetor end

Antes de definir o relacionamento, necessrio um ndice secundrio pelo campo chave estrangeira na tabela detalhe. Se o ndice ainda no existe, crie agora atravs do DataBase Desktop, seu nome ser IndSetCodigo

113

Para definirmos um relacionamento (explcito) do tipo Mestre-Detalhe selecione a tabela detalhe (TbFuncionario) preencha as propriedades bsicas.
object TbFuncionario: TTable Active = True DatabaseName = 'Empresa' TableName = 'Funcionario.db' Name = TbFuncionario MasterSource = DsSetor end

A propriedade MasterFields ser preechida pela caixa de dilogo onde: Available Indexes Detail Fields Master Fields Representa o ndice secundrio (da tabela funcionrio) pela chave estrangeira (SetCodigo). a chave estrangeira. a chave primria.

Clique em Add e confirme a janela com Ok.

114

Defina as bandas e insira os componentes necessrios visualizao dos dados:

A banda Detail se refere tabela Mestre (TbSetor) A banda Sub Detail se refere tabela Detalhe (TbFuncionario) A banda Sub Detail deve ter a propriedade DataSet ligada tabela detalhe. Ligue os componentes QRDB s suas respectivas tabelas e campos. O componente QuickRep deve ter a propriedade DataSet ligada tabela mestre.

115

CONSULTAS E IMPRESSO
Como foi referenciado anteriormente, na consulta de setor e funcionrios (FrmConSetFun) havia um boto para imprimir a consulta.
procedure TFrmConSetFun.BbtImprimirClick(Sender: TObject); begin with FrmRelSetFun do begin TbSetor.Filter := 'SetCodigo='+ DmEmpresa.TbSetor.FieldByName('SetCodigo').AsString; TbSetor.Filtered := True; QuickRep1.PreviewModal; TbSetor.Filter := ''; TbSetor.Filtered := False; end; end;

116

INSTALLSHIELD
O programa InstallShield permite gerar um procedimento automatizado para a instalao da sua aplicao em outros computadores por usurios experientes ou no. Vamos exemplificar a utilizao do programa gerando a instalao do projeto empresa. Utilizaremos a verso InstallShield Express for Delphi514. Ao executar o programa, uma tela de entrada semelhante figura abaixo deve abrir.

Onde as opes acima representam: Opo Objetivo Open na existing Setup Permite abrir um projeto j gravado anteriormente. Project Open your last Setup Abrir o ltimo projeto criado. Project Create a new Setup Project Criar um novo projeto de instalao. Vamos fazer inicialmente uma distino entre Projeto em Delphi e Projeto de Instalao do InstallShield. Projeto em Delphi um conjunto de arquivos (.DPR, .PAS, .DFM, ...) que sero compilados e seu resultado ser o arquivo .EXE para a execuo do programa. Projeto de instalao um arquivo .IWZ que gravar as configuraes para a instalao do aplicativo (.EXE + Banco de Dados + BDE). Na janela inicial, escolha a opo Create a new Setup Project. Uma prxima janela deve ser preenchida com as seguintes informaes:

14

Embora esta verso seja encontrada no CD de instalao do Delphi necessrio instal-la separadamente do processo de instalao do Delphi.

117

Definir um nome para o projeto de instalao Pode-se (ou no) criar uma subpasta para organizar os novos arquivos gerados

Confirme o processo. Ateno no arquivo que ser gerado. Escolha uma pasta inicial para gravar o projeto de instalao

Aps o preenchimento e confirmao da janela acima, uma janela principal ser exibida em forma de um caderno para a manipulao de items separados em grupos principais:

Pode-se conferir a pasta e o arquivo de projeto

Set the Visual Design

118

Clique no item Application Information. E preencha os items abaixo:

Onde: Item da janela Application Name: Application Executable: Version: Company: Default Destination Directory: Finalidade Define um nome para o aplicativo. Define o arquivo executvel do aplicativo. Define a verso do aplicativo, importante para atualizaes futuras. Nome da empresa de desenvolvimento do software. Define o diretrio de destino padro.

Os termos entre < > so definidos pelo InstallShield da seguinte forma: <ProgramFilesDir> <INSTALLDIR> <WINDIR> <WINSYSDIR> <CommonFilesDir> <FONTDIR> Define a pasta Arquivos de Programas Define o caminho (path) completo escolhido pelo usurio no momento da instalao. Define a pasta do Windows na mquina destino. Define a pasta System do Windows, muito usada para receber arquivos do tipo DLL. Define a pasta Arquivos Comuns, subpasta de Arquivos de Programas. Define a pasta onde so armazenados os arquivos .TTF no Windows, ou seja, as fontes.

Maiores informaes, clique no boto Ajuda dentro da janela.

Ainda na mesma janela, clique na guia Main Window.

119

Onde: Main Title Logo BitMap Background Color Define um ttulo durante a instalao. Define um arquivo de bitmap utilizado durante a instalao, provavelmente o logotipo de sua empresa. Defina a cor de fundo da tela durante a instalao.

E na ltima guia: Features deixe ligado a opo Automatic Uninstaller. Essa opo define o item de desinstalao no Windows atravs do Painel de Controle | Adicionar ou Remover Programas. Confirme esta janela com o boto OK.

120

Specify Components and Files


Na janela principal selecione o item Groups and Files

Para definir um novo grupo. Clique no sinal + para visualizar o arquivo que j faz parte da instalao. Insere arquivos em determinado grupo. Define propriedades do grupo

J temos um grupo padro chamado Program Files. Este grupo contm um nico arquivo, o executvel. Porm para que a aplicao Delphi (que use banco de dados) funcione corretamente, no micro do usurio deve haver alm do executvel, os arquivos do banco de dados e a camada BDE. Vamos definir neste momento um grupo para o banco de dados. Clique no boto New Group. A prxima figura vai ilustrar estas opes. Digite um nome para o grupo, neste exemplo ser DB Defina a pasta de destino, neste exemplo ser: <DATABASEDIR> ou seja, o usurio dever escolher uma pasta, o InstallShield ento utilizar a configurao do path os arquivos de dados. A definio deste path sero definidas adiante. O mtodo de atualizao ser o de nunca atualizar, pois em um upgrade do software, podemos enviar arquivos de dados vazios ou diferentes do que o usurio j est utilizando.

121

Escolha o diretrio padro de destino

Confirme a janela acima com OK. Uma nova pasta (grupo) deve ser exibido na janela anterior. Selecione o grupo DB e clique em Insert Files. Encontre a pasta onde esto os arquivos do banco de dados e selecione-os (pelo teclado pode-se usar CTRL+A)

Confirme a janela acima. A janela anterior deve listar dois grupos com seus respectivos arquivos.

122

Confirme a janela com OK. Dos arquivos bsicos para a instalao temos o executvel e o banco de dados j definidos em grupos. Falta configurar agora a camada BDE.

Specify InstallShield Objects for Delphi 5


Clique no item General Options da janela principal do InstallShield.

Assim que voc selecionar o item BDE, uma nova janela dever ser exibida.

Sempre utilize a opo Full BDE Installation para evitar conflitos de BDE local com BDE global. A registry do Windows suporta apenas uma configurao de BDE. Avance para a prxima tela:

123

Vamos definir o nome do Alias da aplicao. Deve ser o mesmo nome utilizado pelo projeto em Delphi

Neste exemplo, o Alias tem o nome de empresa. (O mesmo nome utilizado no BDE do projeto!)

Confirme o nome e clique em OK para confirmar. A prxima ser exibida com apenas um item booleano para escolha:

Sempre confirme a gravao da configurao, ligando o checkbox disponvel na janela. Avance para a prxima etapa.

124

Clique em Avanar e em Concluir no ltimo passo do processo. Na janela onde selecionamos o BDE clique em OK.

Select User Interface Components


Na janela principal, clique em Dialog Boxes. Onde: Objetivo Define uma figura no incio do processo de instalao. Atravs Welcome Bitmap da guia Settings pode ser escolhido um Bitmap de 16 cores. Define uma janela com informaes padronizadas na lingua Welcome Message Inglesa. Permite exibir uma mensagem padronizada de lincea atravs Software Licence de uma arquivo texto (TXT). Configure o arquivo atravs da guia Agreement Settings. Permite exibir uma mensagem genrica atravs de uma arquivo Readme Information texto (TXT). Configure o arquivo atravs da guia Settings. Permite exibir uma caixa de dilogo para preenchimento do User Information usurio. Choose Destination Define a pasta onde ser instalada a aplicao. A pasta padro Location de sugesto para o usurio est definida na guia Settings. Item

125

Define a pasta onde ser instalada a base de dados. A pasta padro de sugesto deve ser definida atravs da guia Settings. Por exemplo <INSTALLDIR>\DB Choose Database Location Dessa forma, o indicador <DATABASEDIR> instalar os arquivos no path que foi definido pelo usurio (<INSTALLDIR>) e no subdiretrio \DB. O ALIAS ser automaticamente criado e apontado para este subdiretrio. Define tipos de setup possveis. Define quais os items podem ser instalados na situao de setups personalizados. Define em qual grupo de programas sero instalados os cones. Exibe um resumo do tipo de setup, pasta a ser utilizada e usurio. Uma das principais janelas, define a progresso da instalao. Importante para que o usurio no pense que a mquina possa estar travada e tomar alguma medida para solucionar o problema. Define uma figura no fim do processo de instalao. Atravs da guia Settings pode ser escolhido um Bitmap de 16 cores ou um WMF15. Exibe uma janela de finalizao de todo o processo. Na guia Settings pode-se escolher outras opes.

Setup Type Custom Setup Select Program Folder Start Copying Files

Progress Indicator

Billboards Setup Complete

Specify Folders and Icons


Clique no item General Settings. Na guia General pode-se definir parmetros para a aplicao (caso seje necessrio) e o modo de exibio do cone, se o programa ser executado Normal, Maximizado ou Minimizado. Caso a opo Normal esteja selecionada, a opo WindowState do formulrio principal da aplicao ser usado. H a possibilidade de criar outros cones para representar outros arquivos, alm do executvel (atual). Ao mudar o item Description, o cone Add Icon ficar disponvel. Na guia Advanced pode-se definir uma tecla de atalho e qual o folder o cone deve estar localizado no ambiente Windows, onde: Item Default Folder Programs Menu Folder Start Menu Folder Desktop Folder Objetivo Insere o cone no grupo padro de instao de programas. Ex: Iniciar | Programas | Empresa | cone Empresa. Insere o cone no grupo programas do prprio Windows. Ex: Iniciar | Programas | cone Empresa. Insere o cone no menu do boto Iniciar. Insere o cone na rea de trabalho. (Desktop)

15

Windows Metal Files. Arquivo padro do recurso clip-art da Microsoft.

126

Startup Folder

Send To Folder

Insere o cone no grupo Iniciar. Ex: Iniciar | Programas | Iniciar | cone Empresa. Obs. Todo cone contido neste grupo executado na abertura do Windows. Insere o cone no Menu Rpido do Windows, chamado atravs do boto direito Enviar para | cone Empresa

Run Disk Builder


Esta janela permite a criao dos arquivos para a mdia que pode ser um disquete de 3 , um zip drive ou um CD-ROM entre os mais populares. H tambm opes para disquete de 720 Kb. importante notar nos passos do processo se houve algum warning (cuidado) ou error . O nico trabalho definir qual a mdia e clicar no boto Build. Neste exemplo, arquivos para quatro disquetes foram gerados. O BDE ocupa trs disquetes. Subtende-se que a aplicao (EXE + Banco de dados) ocupa um disco.

O ltimo passo ser copiar os arquivos de instalao gerados por todo o processo, para a mdia desejada. A opo 9 do menu Cheklist | Create Distribution Media permitir esta tarefa. Como a seguir:

127

Na barra de cones, h um cone para o mesmo comando.

Se voc no deseja gerar os discos a partir desta janela, pode-se abrir o gerenciador em: Iniciar | Programas | Windows Explorer e visualizar a estrutura de pastas criadas pelo InstallShield:

No exemplo acima, foram criados dois tipos de Disk Builder: Uma opo com disquetes de 1.44 e outra com CD-ROM. Note que foram criadas pastas separadas para cada opo. Os 128

arquivos encontram-se separados e disponveis para manipulao do desenvolvedor, podendo ser copiados para a mdia desejada. Agora, vamos pensar na seguinte situao: Preciso enviar o projeto atravs da Internet ou de uma mdia, atravs de um nico arquivo. Poderamos compactar os arquivos utilizando um compactador popular como zip ou arj mas veremos a seguir uma opo mais profissional.

129

INSTALLSHIELD PACKAGEFORTHEWEB
A empresa InstallShield possui um produto chamado InstallShield PackageForTheWeb que permite compactar nossos arquivos em um executvel apenas. Este software pode ser encontrado no site da empresa em: http://www.installshield.com/ no link produtos. Ele descrito como PackageForTheWeb is available to all customers courtesy of InstallShield. Ou seja, s fazer o download e utilizar o software. Para exemplificar sua utilizao, vamos utilizar (aproveitar) o arquivo de projeto (.IWZ) anterior criado atravs do InstallShield Express.

Ao executar o software (PackageForTheWeb) uma tela inicial descrevendo seu objetivo e endereo na web exibido. Clique em Avanar. O arquivo de projeto do InstallShield PackageForTheWeb ter a extenso .PFW Na prxima janela podemos escolher entre trs opes: Item Create a new PackageForTheWeb project Open an existing PackageForTheWeb project Import an InstallShield Professional or Express project Objetivo Caso no tenhamos um projeto criado pelo InstallShield, podemos criar um projeto PFW independente atravs desta opo. Permite editar um projeto j existente. (.PFW)

Permite importar o arquivo de projeto (.IWZ) do InstallShield Express criado anteriormente.

130

Permite escolher o arquivo IWZ existente.

Escolha a opo de importar, localize o arquivo do projeto .IWZ e clique em Avanar.

Preencha a janela acima com informaes que julgar necessrias e clique em Avanar. Na prxima janela pode-se escolher entre a gerao de um arquivo executvel (self-extract) para disparar o processo ou apenas empacotar os arquivos em um arquivo .CAB. A escolha do idioma pode ser escolhido na combobox.

131

Clique em Avanar.

Nesta janela, podemos exibir uma caixa de dilogo (tipo MessageDlg) no incio do processo para que o usurio possa abandonar ou prosseguir. A caixa de bem vindo padro do software uma opo que pode ser customizada atravs de um arquivo do tipo .RTF16 A opo Display licence tambm permite a incluso de um arquivo de extenso RTF. A senha (Password) pode ser definida nesta janela. Esta senha apenas para autorizar o processo de descompactao e instalao. Clique em Avanar. A prxima janela uma das principais para entendermos a facilidade adicional deste programa com relao a outro processo de compactao.
16

Rich Text File Padro que permite formatos (negrito, itlico,font, etc...) em um arquivo gravado como ASCII

132

Aps a descompactao, o InstallShield vai disparar o processo de instalao atravs do arquivo SETUP.EXE j criado no InstallShield Express, e aps a instalao os arquivos descompactados (temporrios) devem ser deletados. Clicar em Avanar.

H uma nova tecnologia de assinatura digital que pode ser obtida via Internet. No vamos abordar este item. Clique em Avanar.

133

Pode-se definir uma pasta especfica.

Nesta janela vamos definir o nome do projeto. Este nome ser usado para o arquivo de projeto (PFW) e o arquivo executvel self-extract (EXE). O diretrio para a gerao destes arquivos pode ser definido pelos cones de pastas. Neste exemplo, crie uma subpasta Unico abaixo da pasta Instalar. Clique em Avanar.

Esta uma janela para conferir as opes que foram definidas anteriormente. Clique em Avanar.

134

O processo vai construir o arquivo self-extract e o arquivo de projeto (PFW). Clique no sinal de + caso queira verificar os arquivos fazem parte do executvel. Clique em Concluir. Para conferir o resultado abra o programa Windows Explorer e abra a pasta onde foram gerados os arquivos. Podemos enviar apenas um arquivo (Empresa.exe) para realizar o processo de instalao de maneira mais simples possvel.

135

TRANSAES
Transaes um recurso muito utilizado em aplicaes client/server. Nosso enfoque ser introdutrio, no sentido de despertar voc como desenvolvedor, a utilizar esta tecnologia na construo de aplicaes robustas. A transao uma definio que aborda o seguinte aspecto: Um processo iniciado com uma transao deve obrigatoriamente terminar, com ou sem sucesso. Este processo pode ser um conjunto rotinas que s tero valor se executadas em sequncia. O conceito bsico pode ser ilustado como a seguir: Processo

Incio da transao

Rotina1

Rotina2

Rotina3

Fim da transao

Caso alguma rotina tenha algum problema ou acontea um imprevisto como queda de energia, a transao no ser terminada. Em bancos de dados que implementam este tipo de segurana17, assim que o micro ligado e o banco aberto, atravs do arquivo de LOG a transao no finalizada ter que voltar atrs na situao anterior ao incio, mantendo o banco de dados consistente. Vamos utilizar este conceito no Delphi atravs tabelas paradox lembrando que nem todos os recursos da transao (como arquivo de LOG) so implementados pelo banco.

DELPHI & TRANSAES


Os comandos para implementar a transao so mtodos do objeto DataBase. Este componente representa o banco de dados, sendo nico na aplicao. Todas as tabelas devem se conectar ao DataBase. Mtodo StartTransaction RollBack Commit Definio Define o incio da transao. Define o trmino sem sucesso da transao. Define o trmino com sucesso da transao.

Session

DataBase

DataSet

DataSource

Data-Aware

17

SQL-Server, Oracle e Interbase so exemplos de bancos de dados cliente/servidor.

136

Inicie uma nova aplicao. Grave o projeto em uma pasta chamada Trans Nome atual Unit1 Project1 UFrmTrans Transacao Novo nome

Embora no seja obrigatrio (ainda mais neste exemplo com uma tabela), vamos inserir um formulrio DataModule, atravs do comando File | New... (Data Module) Nome atual Unit1 UDm No DataModule, insira os componentes DataBase, Table e DataSource. Vamos utilizar as tabelas criadas no projeto empresa, bem como seu ALIAS. Configure o componente DataBase nas propriedades indicadas:
object Database: TDatabase AliasName = 'Empresa' DatabaseName = 'BancoEmpresa' SessionName = 'Default' TransIsolation = tiDirtyRead end

Novo nome

Onde: Propriedade AliasName DatabaseName SessionName TransIsolation

Definio Define o nome do ALIAS no BDE. Define um nome para o ALIAS da aplicao. Define o nome da Sesso utilizada para acesso ao banco. Define o nvel de isolamento suportado pelo banco de dados.

Configure os componentes Table e DataSource:


object DsSetor: TDataSource DataSet = TbSetor end object TbSetor: TTable Active = True DatabaseName = 'BancoEmpresa' TableName = 'Setor.DB' end

O DataModule permite confirmar a hierarquia dos componentes atravs da rvore de items do lado esquerdo da janela.

Note que o componente Table vai acessar o banco atravs do ALIAS (interno) BancoEmpresa.

137

Crie os campos persistentes com um duplo clique no componente Table. Arraste-os para o formulrio FrmTrans e crie uma interface bsica com os componentes (Buttons, DBNavigator) j vistos anteriormente.

O cdigo fonte com a implementao de transaes est descrito a seguir:


unit UFrmTrans; {A interface no foi impressa} implementation uses UDm; {$R *.DFM} procedure TFrmTrans.BbtSairClick(Sender: TObject); begin FrmTrans.Close; end; procedure TFrmTrans.TrataBotoes; begin BbtInserir.Enabled := not BbtInserir.Enabled; BbtEditar.Enabled := not BbtEditar.Enabled; BbtRemover.Enabled := not BbtRemover.Enabled; BbtCancelar.Enabled := not BbtCancelar.Enabled; BbtConfirmar.Enabled := not BbtConfirmar.Enabled; BbtSair.Enabled := not BbtSair.Enabled; DbNavigator1.Enabled := not DbNavigator1.Enabled; end;

138

procedure TFrmTrans.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Dm.TbSetor.State in [dsEdit, dsInsert] then if MessageDLG('Existem dados pendentes,'+#13+'deseja grav-los?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then CanClose := False else begin Dm.TbSetor.Cancel; Dm.Database.Rollback; TrataBotoes; CanClose := True; end; end; procedure TFrmTrans.BbtInserirClick(Sender: TObject); var ProxNum: Integer; begin Dm.TbSetor.Last; ProxNum := Dm.TbSetor.FieldByName('SetCodigo').AsInteger + 1; Dm.Database.StartTransaction; Dm.TbSetor.Append; Dm.TbSetor.FieldByName('SetCodigo').AsInteger := ProxNum; DbEdit2.SetFocus; TrataBotoes; end; procedure TFrmTrans.BbtEditarClick(Sender: TObject); begin Dm.Database.StartTransaction; Dm.TbSetor.Edit; TrataBotoes; end; procedure TFrmTrans.BbtRemoverClick(Sender: TObject); begin if Dm.TbSetor.RecordCount = 0 then ShowMessage('Tabela vazia!') else if MessageDLG('Tem certeza que deseja remover o setor: '+#13+ Dm.TbSetor.FieldByName('SetNome').AsString +' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Dm.TbSetor.Delete; end; procedure TFrmTrans.BbtCancelarClick(Sender: TObject); begin Dm.TbSetor.Cancel; Dm.Database.Rollback; TrataBotoes; end; procedure TFrmTrans.BbtConfirmarClick(Sender: TObject); begin Dm.TbSetor.Post; Dm.Database.Commit; TrataBotoes; end; end.

139

DELPHI & SQL


SQL uma linguagem da mesma forma que Object Pascal, Basic ou C++, a grande diferena que SQL voltada totalmente para o Banco de Dados independente do Front End (Delphi, VB ou C++Builder). Obviamente, seus aspectos e particularidades devem ser estudados em um curso parte. Nosso objetivo aqui ter um entendimento de como o Delphi pode manipular o cdigo SQL. Atravs do SQL possvel manipularmos diferentes bancos de dados (Oracle, SQL-Server, DB2) utilizando uma nica linguagem e no necessitando de aprender todos18 os comandos ao mudar de banco de dados. Um dos recursos mais utilizados da linguagem o comando SELECT, sua utilizao obedece uma estrutura definida como abaixo:
SELECT [DISTINCT] * | column_list FROM table_reference [WHERE predicates] [ORDER BY order_list] [GROUP BY group_list] [HAVING having_condition]

Os items definidos entre [] so opcionais. Exemplo:


SELECT * FROM employee WHERE HireDate < 01/01/1990 ORDER BY HireDate SELECT EmpNo,FirstName, LastName FROM employee WHERE (HireDate < 01/01/1990) AND (Salary > 50000) ORDER BY FirstName Selecione todos os campos Da tabela employee Onde a data menor do que 01/01/1990 Ordenada pelo campo data Selecione somente os 3 campos Da tabela employee Onde a data menor do que 01/01/1990 E o salrio maior do que 50000 Ordenada pelo campo FirstName

As clusulas Group By e Having no sero abordadas. Elas so utilizadas para estabelecer grupos e agregao. O Delphi permite a manipulao de comandos em SQL atravs de um componente DataSet chamado TQuery. Vamos exemplificar uma aplicao utilizando consultas19 em SQL.

18 19

Em cada banco de dados h uma extenso do SQL para manipular recursos especficos. Sinnimo de pesquisa.

140

Salve um novo projeto dentro de uma pasta com o nome de SQL. Unit1 Project1 UFrmEmpregadoSQL EmpregadoSQL

Conforme a figura a seguir, insira os componentes necessrios. Observe que os componentes utilizados (exceo - DBGrid) no so componentes data-aware (Paleta-Data Controls) porque no estamos inserindo ou editando os dados, mas passando parmetros para a consulta.

MaskEdit

TQuery

DBGrid

O componente TQuery pode ser configurado como a seguir:


object QrEmp: TQuery DatabaseName = 'DBDEMOS' SQL.Strings = SELECT * FROM employee Active = True Name = QrEmp end

O componente DataSource pode ser configurado como a seguir:


object DsEmp: TDataSource AutoEdit = False DataSet = QrEmp Name = DsEmp end

Os componentes Buttons devem ter sua propriedade Name de acordo com a orientao na figura anterior.

TQuery - Propriedades 141

Active Define se o dataset est ativo. DatabaseName Define o alias ou path fixo para o banco de dados. SQL Define a string SQL. TQuery - Mtodos Close Fecha o dataset. ExecSQL Executa o cdigo SQL definido na propriedade SQL sem retornar um cursor. Utilizado em INSERT, UPDATE, DELETE, e CREATE TABLE. Open Executa o cdigo SQL definido na propriedade SQL com retorno de cursor. SQL.Add Adiciona uma string propriedade SQL. SQL.Clear Limpa a lista (TStrings) da propriedade SQL. Aps definido a disposio dos componentes defina os cdigos para cada evento da unit como a seguir:
unit UFrmEmpregadoSQL; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables, Mask, ExtCtrls, AppEvnts; type TFrmEmpregadoSQL = class(TForm) DsEmp: TDataSource; QrEmp: TQuery; DBGrid1: TDBGrid; GroupBox1: TGroupBox; Edit1: TEdit; BtnPesquisaCodigo: TButton; Edit2: TEdit; BbtPesquisaNome: TButton; GroupBox2: TGroupBox; MaskEdit1: TMaskEdit; BbtMostraTodos: TButton; BbtPesquisaData: TButton; RadioGroup1: TRadioGroup; Panel1: TPanel; procedure BtnPesquisaCodigoClick(Sender: TObject); procedure BbtPesquisaNomeClick(Sender: TObject); procedure BbtMostraTodosClick(Sender: TObject); procedure BbtPesquisaDataClick(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var FrmEmpregadoSQL: TFrmEmpregadoSQL; implementation {$R *.DFM}

procedure TFrmEmpregadoSQL.BbtPesquisaCodigoClick(Sender: TObject);

142

begin if Edit1.Text <> '' then begin QrEmp.Close; QrEmp.SQL.Clear; QrEmp.SQL.Add('SELECT * FROM employee'); QrEmp.SQL.Add('WHERE EmpNo = :Codigo'); QrEmp.ParamByName('Codigo').AsInteger := StrToInt(Edit1.Text); QrEmp.Open; end; end;

A passagem de parmetros para o cdigo em SQL ser definido atravs do caracter

:
procedure TFrmEmpregadoSQL.Edit1KeyPress(Sender: TObject; var Key: Char); begin if ((Key in ['0'..'9'] = False) and (Word(Key) <> VK_BACK)) then Key := #0; end; procedure TFrmEmpregadoSQL.BbtPesquisaNomeClick(Sender: TObject); begin if Edit2.Text <> '' then begin QrEmp.Close; QrEmp.SQL.Clear; QrEmp.SQL.Add('SELECT EmpNo,FirstName,LastName,Salary FROM employee'); QrEmp.SQL.Add('WHERE UPPER(FirstName) LIKE :Nome'); QrEmp.ParamByName('Nome').AsString := UpperCase(Edit2.Text) + '%'; QrEmp.Open; end; end; procedure TFrmEmpregadoSQL.BbtMostraTodosClick(Sender: TObject); begin QrEmp.Close; QrEmp.SQL.Clear; QrEmp.SQL.Add('SELECT * FROM employee'); QrEmp.Open; end; procedure TFrmEmpregadoSQL.BbtPesquisaDataClick(Sender: TObject); begin QrEmp.Close; QrEmp.SQL.Clear; QrEmp.SQL.Add('SELECT FirstName, LastName, HireDate FROM employee'); case RadioGroup1.ItemIndex of 0: QrEmp.SQL.Add('WHERE HireDate > :Data'); 1: QrEmp.SQL.Add('WHERE HireDate < :Data'); 2: QrEmp.SQL.Add('WHERE HireDate = :Data'); end;//case try QrEmp.ParamByName('Data').AsDate := StrToDate(MaskEdit1.Text); QrEmp.Open; except ShowMessage('Dados invlidos!'); end;//bloco try end; end.

143

TCNICAS DE INTERFACE
SPLASH SCREEN
As telas de apresentao (Splash Screen) so muito utilizadas em diversos programas do windows, exemplo Delphi, Word, Excel, etc... uma janela de propaganda que vista no inicio, durante o carregamento dos recursos daquele programa para a memria principal. Vamos criar uma tela de entrada para demonstrar este recurso: Crie uma nova aplicao e grave os arquivos com os nomes:
Pasta - Splash Unit1 UFrmPrincipal Project Splash

A propriedade Name do formulrio deve ter o mesmo nome da Unit sem a letra U. Crie outro formulrio (File | New Form) e grave-o com o nome UFrmSegundo . Crie agora, um terceiro formulrio e grave-o com o nome UFrmSplash . Modifique as seguintes propriedades deste formulrio:
object FrmSplash: TFrmSplash BorderStyle = bsNone Caption = 'FrmSplash' ClientHeight = 230 ClientWidth = 265 Color = clBtnFace Position = poScreenCenter end;

144

Dentro deste formulrio insira um componente image e modifique suas propriedades:


object Image1: TImage Align = alClient Picture = {insira uma figura a seu gosto} end;

Pode-se inserir componentes Labels por cima do componente Image, basta ajustar a propriedade Transparent para true. Nota-se que apesar do formulrio FrmSplash ser exibido antes do formulrio principal ele pode ser criado a qualquer momento, atravs da alterao na implementao de cdigo a seguir. Agora, clique no Menu Project | Options e na lista Auto-Create forms selecione o formulrio FrmSplash. Atravs do cone > mude o formulrio para a lista Available forms. Todo formulrio criado pelo padro do Delphi carregado para a memria no momento da execuo do programa, sendo definida a ordem atravs da lista AutoCreate. Isso no quer dizer que os formulrio devem ser chamados nesta ordem, mas que todos os formulrios referenciados em Auto-Create sero criados na memria principal automaticamente e todos que esto na lista Available forms estaro disponveis para serem carregados em no momento definido pelo usurio.

Confirme a janela e clique no Menu Project View Source. A guia do arquivo de projeto (DPR) dever ser exibida no Code Editor. Vamos alterar o cdigo do arquivo DPR para a seguinte disposio:

145

(No necessrio digitar os comentrios.)


program Splash; uses Forms, Windows, UFrmPrincipal in 'UFrmPrincipal.pas' {FrmPrincipal}, UFrmSegundo in 'UFrmSegundo.pas' {FrmSegundo}, UFrmSplash in 'UFrmSplash.pas' {FrmSplash}; {$R *.RES} begin Application.Initialize; {Cria o formulario atraves do metodo da propria classe} FrmSplash := TFrmSplash.Create(Application); //Exibe o formulario FrmSplash.Show; {Atualiza o form para exibir os componentes inseridos: Image, Labels, etc} FrmSplash.Refresh; Application.CreateForm(TFrmPrincipal, FrmPrincipal); Application.CreateForm(TFrmSegundo, FrmSegundo); {Caso queira exibir o formulario por um tempo minimo pode-se usar a funo Sleep que 'congela o sistema' por um determinado tempo mensurado em milisegundos. Acrescentar a biblioteca Windows na clausula USES} Sleep(2000); {Libera a memoria destruindo o formulario de splash} FrmSplash.Free; {Disponibiliza a aplicao para a interao com o usuario} Application.Run; end.

Com esse raciocnio, o formulrio Splash ser exibido inicialmente porm no ser o Main Form (formulrio principal) da aplicao, sendo destrudo aps os formulrios serem carregados para a memria.

146

CRIANDO E DESTRUINDO FORMS


Como j foi visto neste exemplo anterior, os formulrio so, por padro, auto-criados pelo Delphi. Isso pode trazer alguns incovenientes em projetos maiores, imagine o Delphi ao iniciar o arquivo executvel tentar carregar 50 formulrios para a memria principal... O primeiro passo tirar o formulrio da lista Auto-Create e passa-lo para a lista Available forms atravs do menu Project | Options. Depois devemos definir o cdigo de chamada do form e de liberao de memria do form chamado. Supondo o seguinte exemplo: Dois formulrios: um chamado UFrmPrincipal e outro UFrmSegundo, sendo que o principal faz uma chamada ao form secundrio atravs de um button, o cdigo seria o seguinte:
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmSegundo := TFrmSegundo.Create(Application); FrmSegundo.ShowModal;//ou atravs do mtodo Show end;

No formulrio chamado (FrmSegundo) dever ser criado um cdigo para liberar a memria quando este for fechado.
procedure TFrmSegundo.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;

A varivel Action define qual a ao o formulrio deve tomar ao ser fechado. O default para formulrios SDI o valor caHide, ou seja, o formulrio apenas oculto permanecendo na memria principal, mudamos este comportamento atravs do valor caFree. Uma outra tcnica para o mesmo objetivo seria definir a liberao de memria em um bloco try como a seguir:
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmSegundo := TFrmSegundo.Create(Application); try FrmSegundo.ShowModal; finally FrmSegundo.Free; end;//do bloco finally end;

Este cdigo acima s funciona com formulrios Modais, pois o mtodo Show permite a execuo das prximas linhas de cdigo aps a sua chamada, trazendo um efeito indesejado neste exemplo.

MANIPULANDO CURSORES

147

uma tcnica comum no sistema operacional windows mudar o cursor dependendo da ao do usurio e da rotina a ser executada. Quando a rotina passvel de demora, necessrio trocar o cursor para o smbolo de ampulheta, para que o usurio no clique novamente na chamada da rotina ou pense que a mquina est travada, por exemplo. H no Delphi um objeto chamado Screen. Este objeto controla os cursores e criado automaticamente pelo Delphi, o desenvolvedor no precisa cria-lo explicitamente. Os cursores so so declarados como do tipo TCursor e podem ser manipulados como o exemplo seguir:
procedure TFrmPrincipal.Button2Click(Sender: TObject); var CursorAnterior : TCursor; begin CursorAnterior := Sceen.Cursor; Screen.Cursor := crHourGlass; try Rotina.Demorada; finally Screen.Cursor := CursorAnterior; end;//do bloco finally end;

O bloco try..finally foi utilizado para garantir que se algum cdigo (errado ou no) for executado dentro do bloco try, o cursor deve voltar ao smbolo anterior ao smbolo da ampulheta (crHourGlass ) que foi guardado na varivel CursorAnterior.

148

TOOLBAR
A Toolbar fornece uma barra de ferramentas com botes prprios e recursos personalizados. Os botes inseridos na Toolbar so do tipo TToolButton, considerados objetos internos da Toolbar. Vamos exemplificar sua utilizao atravs de um exemplo: Crie uma nova aplicao e grave os arquivos com os nomes:
Pasta - Toolbar Unit1 UFrmToolBar Project Toolbar

Os componentes inseridos sero:

Toolbar

Image

StatusBar

O componente Toolbar alinha-se automaticamente na parte superior do formulrio da mesma maneira que a barra de Status alinha-se na parte inferior. O componente Image pode ter a propriedade Align definida como alClient e a propriedade Center como True. Para inserir botes na barra Toolbar, clique com o boto direito na barra e escolha New Button, para inserir um separador de botes escolha New Separator.

Insira 3 botes e separadores como no exemplo a seguir.

149

Para o objeto ImageList1 defina trs figuras cinzas clicando em Add... como abaixo: As figuras podem ser FileOpen.bmp, Tools.bmp, Doorshut.bmp Encontradas no diretrio padro20 de figuras do Delphi. Para excluir uma figura da lista, clique em Delete.

Para o objeto ImageList2 defina as mesmas figuras, porm coloridas. Para o objeto PopUpMenu1 defina dois menus atravs do construtor:

Caption Distorcer Normal

Name MnpDistorcer MnpNormal

20

C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Buttons

150

Para o objeto ToolBar defina as propriedades:


object ToolBar1: TToolBar ButtonHeight = 25 ButtonWidth = 24 Flat = True HotImages = ImageList2 Images = ImageList1 end; Images define as figuras que sero atribudas aos botes na visualizao inicial do

componente. HotImages define as figuras que sero atribudas aos botes no momento em que o mouse passa nestes componentes caso a propriedade Flat esteja ligada, gerando um efeito semelhante barra de cones do Internet Explorer. O segundo boto da Toolbar (ToolButton2) deve ter as suas propriedade
object ToolButton2: TToolButton DropdownMenu = PopupMenu1 Style = tbsDropDown end

Defina a propriedade Hint para os trs botes segundo o raciocnio: Objeto ToolButton1 ToolButton2 ToolButton3 Finalidade Abrir um arquivo de imagem Distorcer ou no a figura Fechar o programa Hint Abre arquivo de imagem Permite distorcer a imagem Sair do aplicativo

Para a barra de status defina:


object StatusBar1: TStatusBar AutoHint = True SimplePanel = True end

Defina os manipuladores de eventos necessrios segundo a unit abaixo:


unit UFrmToolbar; {A interface no foi impressa} implementation {$R *.DFM} procedure TFrmToolBar.ToolButton1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end;

151

procedure TFrmToolBar.ToolButton4Click(Sender: TObject); begin FrmToolBar.Close; end; procedure TFrmToolBar.MnpDistorcerClick(Sender: TObject); begin Image1.Stretch := True; MnpDistorcer.Checked := True; MnpNormal.Checked := False; end; procedure TFrmToolBar.MnpNormalClick(Sender: TObject); begin Image1.Stretch := False; MnpNormal.Checked := True; MnpDistorcer.Checked := False; end; end.

152

APLICAES MDI
Uma interface MDI (Multiple Document Interface) possibilita a visualizao de mais de um documento ou objeto simultaneamente. Aplicaes MDI so constituidas geralmente de dois ou mais formulrios: o formulrio principal (MDIform) que geralmente constitui a janela principal do programa e seus filhos (MDIchild) localizados dentro de sua rea de trabalho. Em aplicaes MDI, voc geralmente precisa mostrar mltiplas instncias de um classe de formulrio. Um formulrio filho de MDI deve ser criado para ser exibido e deve ser destrudo para no mais exib-lo. Com uma nova aplicao vamos iniciar uma aplicao MDI que possa abrir vrios arquivos de figuras selecionados pelo usurio. Salve o projeto em uma pasta chamada ImagemMDI Nome atual Unit1 Project1 Altere as propriedades do form:
object FrmPai: TFrmPai Width = 447 Height = 309 Caption = 'FrmPai' FormStyle = fsMDIForm Position = poScreenCenter end

Novo nome UFrmPai ImagemMDI

Insira no formulrio um componente OpenPictureDialog e um componente MainMenu Contrua os seguintes Menus atravs do construtor do MainMenu: Caption &Arquivo &Abrir &Sair Name MnuArquivo MnuAbrir MnuSair ShortCut Ctrl+A Ctrl+T

Troque a propriedade Name do componente MainMenu para MnuPai Salve todo o projeto. (Atualizar)

153

Insira mais um formulrio e salve-o: Nome atual Unit1 Modifique a seguinte propriedade:
object FrmFilho: TFrmFilho FormStyle = fsMDIChild end

Novo nome UFrmFilho

Insira um componente Image no formulrio FrmFilho e modifique as seguintes propriedades:


object Image1: TImage Align = alClient Center = True end

Salve todo o projeto. (Atualizar) Execute a aplicao e visualize o formulrio FrmFilho que j se encontra dentro de FrmPai. Note que formulrios filhos de MDI no tem a opo de existir (ter sido criado) e no ser exibido (o que possvel para formulrios comuns). O default do ambiente Delphi criar automaticamente uma instncia de cada form do projeto. por isto que existem as referncias de criao no cdigo dentro do arquivo de projeto (DPR). Menu Project | View Source
begin Application.Initialize; Application.CreateForm(TFrmPai, FrmPai); Application.CreateForm(TFrmFilho, FrmFilho); Application.Run; end.

Como desejamos que a aplicao rode inicialmente sem nenhuma janela filha aberta, devemos alterar este comportamento. Para que o formulrio MDIFilho no seja criado automaticamente com o projeto, devemos especificar no projeto que o mesmo no autocreate. Para isso basta usar a opo de menu Project | Options e alterar para FrmFilho em Avaliable forms. Como na figura a seguir. Desta maneira, o Form estar disponvel, porm no ser criado automaticamente pelo programa. Aps a confirmao, podemos notar que o cdigo no arquivo de projeto (DPR) tambm foi alterado.

154

Seleciona-se o form do lado esquerdo e utiliza-se este cone

A maneira de criarmos o form FrmImagem dever ser feita em tempo de execuo atravs de cdigo fazendo uma chamada ao mtodo CreateForm do objeto Application. Exemplo:
begin comando1; comando2; Application.CreateForm(TFrmFilho, FrmFilho); end;

Desta maneira, defina o seguinte cdigo para objeto MnuAbrir


procedure TFrmPai.MnuAbrirClick(Sender: TObject); begin if OpenPictureDialog1.Execute then//abre a caixa de dialogo begin Application.CreateForm(TFrmFilho, FrmFilho); //carrega a figura para o componente ImgImagem FrmFilho.Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); FrmFilho.Caption := OpenPictureDialog1.FileName;//muda o caption end; end;

155

Defina o seguinte cdigo para MnuSair


procedure TFrmMain.MnuSairClick(Sender: TObject); begin FrmPai.Close; end;

Execute a aplicao e tente fechar as janelas filhas. possvel? Ao contrrio de outros tipos de forms, um form MDIChild no fecha automaticamente quando executamos seu mtodo Close. Entretanto no evento OnClose de qualquer form temos um parmetro Action que nos permite definir uma ao especifica: Action CaNone CaHide Comportamento O form no fechar nenhuma ao ser tomada. O form apenas escondido, no sendo mais exibido porm ainda existir em memria. Este o comportamento default de forms comuns. O form ser destrudo e no simplesmente escondido. O form ser minimizado, e no fechado. Este o default para forms filhos de MDI.

caFree caMinimize

Para forar um MDIChild a fechar devemos alterar o parmetro Action para caFree em seu evento OnClose. Vamos acrescentar o seguinte cdigo no evento OnClose do form FrmImagem
procedure TFrmFilho.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := CaFree; end;

(12) Vamos adicionar dois itens de menu ao MnuPai como no exemplo: Items: Caption &Janelas &Em Cascata &Lado a Lado

Name MnuJanelas MnuEmCascata MnuLadoaLado

ShortCut

No evento OnClick do item MnuEmCascata definir o cdigo:


procedure TFrmPai.MnuEmCascataClick(Sender: TObject); begin Cascade; end;

No evento OnClick do item MnuLadoaLado definir:


procedure TFrmPai.MnuLadoaLadoClick(Sender: TObject); begin Tile; end;

156

Criando um lista das janelas abertas


Altere a propriedade WindowMenu do form FrmPai para MnuJanelas. Com isto faremos que uma lista das janelas filhas abertas fique disponvel sob o Menu Janelas do formulrio FrmPai.

Mesclando Menus
Outro recurso interessante de aplicaes MDI a possibilidade de mesclar os menus da janela filha (FrmFilho) com a janela pai (FrmPai). Vamos adicionar um objeto MainMenu no formulrio FrmFilho, chamando-o de MnuFilho. Items: Caption &Imagem &Ajustar a janela Name MnuImagem MnuAjustar

Contrutor do objeto MainMenu com os objetos MenuItem

Objeto MainMenu com a propriedade Name: MnuFilho

Para o evento OnClick de MnuAjustar definir:


procedure TFrmFilho.MnuAjustarClick(Sender: TObject); begin //Checked mostra um 'v' (marcador) para controle lig/des. MnuAjustar.Checked := not MnuAjustar.Checked; //Permite distorcer a imagem para ocupar todo o espao Image1.Stretch := not Image1.Stretch; end;

Porm se executarmos a aplicao vamos notar que o Menu da janela filha sobreps o Menu da janela pai. A posio do Menu das janelas filhas em relao aos da janela MDI determinada pela propriedade GroupIndex de cada um. Se desejamos que o Menu MnuFilho aparea entre os menus MnuArquivo e MnuJanela (do formulrio FrmPai), devemos atribuir-lhes valores para a propriedade GroupIndex conforme abaixo: 157

Menu MnuArquivo MnuImagem MnuJanelas

GroupIndex 0 1 2

Reaproveitamento de cdigo
Pode-se inserir uma ToolBar no formulrio FrmPai para facilitar ainda mais a manipulao do aplicativo pelo usurio. Se na ToolBar os botes tero os mesmos comandos dos items de Menu (Abri, Fechar), uma sugesto que na ToolBar seja reaproveitado o cdigo j escrito nos items de menu da seguinte maneira: Crie a ToolBar, os botes desejados e selecione um dos botes. Na Object Inspector selecione o evento OnClick daquele boto e no d um duplo clique, abra a caixa combo do evento OnClick e escolha um procedimento j pronto:

Objeto selecionado Para reaproveitar cdigo, abra a caixa combo disponvel nos eventos desejados.

MnuAbriClick um evento criado atravs do objeto MainMenu

158

EXERCCIOS
EXERCCIO 1
Objetivo: Abordar a maneira com que o Delphi trabalha com os objetos e elementos bsicos em Object Pascal. Introduzir a tcnica de manipulao de propriedades e eventos. Componentes utilizados: Label, Edit e Button. Enfoque: Quando o usurio digitar uma string, este texto dever ser exibidono ttulo formulrio e em uma mensagem de caixa de dilogo. Abra o Delphi ou se j aberto, clique no comando File New Application. Perceba que inicialmente j temos um formulrio a nossa disposio, seu nome (atravs da propriedade Name) Form1. Salve o projeto antes de prosseguir criando uma pasta chamada Exercicio1 e dentro desta pasta, gravar a unidade e o arquivo de projeto. Nome atual Unit1 Project1 UFrmInicio Inicio Novo nome

De acordo com o ttulo da janela nomear a(s) unit e depois, o projeto

Criar a pasta incio

Aps ter gravado, insira os seguintes componentes no form: 1 Label, 1 Edit e 2 Buttons. Uma sugesto para a disposio dos objetos pode ser vista a seguir:

159

Modifique as propriedades dos componentes como a seguir:


object FrmInicio: TFrmInicio Width = 216 Height = 172 ActiveControl = Edit1 Caption = FrmInicio Position = poScreenCenter Name = FrmInicio end object Label1: TLabel Caption = &Digite: FocusControl = Edit1 end object Edit1: TEdit MaxLength = 10 end object Button1: TButton Cursor = crHandPoint Caption = &Confirma Default = True Hint = Clique aqui para executar a tarefa ShowHint = True end object Button2: TButton Cursor = crHandPoint Caption = &Sair Cancel = True end

Exemplo:
Propriedade Name object FrmInicio: TFrmInicio Width = 216 Height = 172 end Outras propriedades

Para definirmos manipuladores para os objetos Buttons, faa o seguinte passo: Selecione o Button1 (Caption Confirma) e na janela Object Inspector selecione a guia Events. Identifique o evento: OnClick dando um duplo clique no espao em branco. Um procedimento no Editor de Cdigo dever ser exibido. Insira o cdigo entre o begin e o end. Como no exemplo abaixo:
procedure TFrmInicio.Button1Click(Sender: TObject); begin {O ttulo do formulrio recebe uma frase concatenada com uma string digitada pelo usurio} FrmInicio.Caption := 'Projeto Incio '+Edit1.Text;

160

{Uma frase ser exibida atravs de uma caixa de dilogo padro} ShowMessage('Voc digitou: '+Edit1.Text); Edit1.Clear; //O mtodo Clear limpa a propriedade Text do objeto end;

Para o Button2 repita o mesmo processo e insira o cdigo:


procedure TFrmInicio.Button2Click(Sender: TObject); begin FrmInicio.Close; end;

Salve seu projeto novamente para atualiz-lo e atravs do comando RUN compile-o e faa os testes necessrios.

EXERCCIO 2
Objetivo: Abordar a maneira com que o Delphi trabalha com os objetos e elementos bsicos em Object Pascal. Revisar componentes vistos em sala e apresentar uma tcnica de atribuio de cdigo entre componentes bem como sua manipulao. Componentes utilizados: Label, Edit, Button, CheckBox e RadioGroup. Enfoque: O usurio dever digitar uma string no componente Edit, este texto dever ser exibido no Label(2). O CheckBox dever habilitar ou no a digitao e o RadioGroup vai manipular o tamanho da fonte do componente Label. Iniciar uma nova aplicao e salv-la em uma pasta chamada Exercicio2. Nome atual Unit1 Project1 UFrmFrase Frase Novo nome

Troque o nome do objeto form para FrmFrase. Em nosso curso ser uma regra: O nome do Form ser o nome da Unit sem a letra U.

Insira os objetos como o exemplo a seguir:

161

Label1 CheckBox1

RadioGroup1

Os objetos podem ter as seguintes propriedades alteradas:


object FrmFrase: TFrmFrase ActiveControl = Edit1 BorderStyle = bsDialog Caption = Formulrio Exerccio 2 Width = 341 Height = 236 Name = FrmFrase end object Label1: TLabel Caption = &Digite um texto: FocusControl = Edit1 end object Label2: TLabel Width = 305 Height = 25 AutoSize = False Caption = {deixe vazio} end object Edit1: TEdit Text = {deixe vazio} end object CheckBox1: TCheckBox Hint = Permite habilitar o componente de entrada de dados Caption = Digitao Checked = True ShowHint = True end object RadioGroup1: TRadioGroup Caption = Tamanho da fonte: Columns = 3 ItemIndex = 0 Items.Strings = Normal Maior Menor end object Button1: TButton

162

Hint = Clique para fechar o programa Cancel = True Caption = &Sair ShowHint = True end

Para definir os manipuladores de eventos, identifique os procedimentos abaixo: NO digite a linha da procedure, apenas o cdigo dentro do begin e end.
procedure TFrmFrase.CheckBox1Click(Sender: TObject); begin Edit1.Enabled := CheckBox1.Checked; end; procedure TFrmFrase.Edit1Change(Sender: TObject); begin Label2.Caption := Edit1.Text; end; procedure TFrmFrase.RadioGroup1Click(Sender: TObject); begin if RadioGroup1.ItemIndex = 0 then Label2.Font.Size := 8 else if RadioGroup1.ItemIndex = 1 then Label2.Font.Size := 12 else Label2.Font.Size := 6; end; procedure TFrmFrase.Button1Click(Sender: TObject); begin FrmFrase.Close; end;

Salve seu projeto novamente para atualiz-lo e atravs do comando RUN compile-o e faa os testes necessrios.

163

EXERCCIO 3
Utilizando os conceitos vistos, crie um aplicativo que possa efetuar as quatro operaes aritmticas bsicas, somar, subtrair, dividir e multiplicar. Os dados sero nmeros reais que o usurio deve digitar. A quantidade de objetos, a disposio visual e a escolha dos manipuladores sero de escolha do desenvolvedor. Objetivo: Abordar a maneira com que o Delphi trabalha com diversas funes de converso e operaes aritmticas internas. Componentes utilizados: escolha do desenvolvedor Enfoque: O usurio dever digitar dois valores e aps escolher um operador aritmtico realizar o clculo. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio3 Nome atual Unit1 Project1 UFrmMiniCalc MiniCalc Novo nome

EXERCCIO 4
Objetivo: Abordar a maneira com que o Delphi trabalha com objetos tendo um enfoque maior no cdigo em Object Pascal utilizando recurso de reaproveitamento de cdigo. Componentes utilizados: Edit, Button, CheckBox, RadioGroup, ComboBox e Memo. Enfoque: O usurio dever digitar um caminho e arquivo vlido no Edit, este texto dever ser utilizado para carregar o arquivo (texto) no Memorando. Pode-se trocar a fonte pelo ComboBox e mudar o formato atravs do CheckBox. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio4 Nome atual Unit1 Project1 UFrmTexto Texto Novo nome

164

Insira os componentes e alinhe-os.

Modifique as propriedades conforme a orientao abaixo:


object FrmTexto: TFrmTexto ActiveControl = Edit1 BorderStyle = bsSingle Caption = Visualiza Texto ASCII Position = poScreenCenter Name = FrmTexto end object Edit1: TEdit Hint = Digite um caminho e nome de arquivo ShowHint = True Text = {deixe vazio} end object Memo1: TMemo Lines.Strings = {deixe vazio} Cursor = crNo ReadOnly = True end object ComboBox1: TComboBox Text = {deixe vazio} end object GroupBox1: TGroupBox Caption = Formato da fonte end object CheckBox1: TCheckBox Caption = Negrito end object CheckBox2: TCheckBox Caption = Itlico end object CheckBox3: TCheckBox Caption = Sublinhado end

165

object Button1: TButton Caption = &Carrega Arq. Default = True end object Button2: TButton Cancel = True Caption = &Sair end

Ao declarar21 o cabealho da procedure FormataTexto na seo Interface, podese utilizar na mesma linha, o atalho CTRL+SHIFT+C para declar-la na seo Implementation. Defina os cdigos para cada evento segundo o cdigo fonte abaixo:
unit UFrmTexto; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

{No digite as declaraes da interface}


type TFrmTexto = class(TForm) Edit1: TEdit; Memo1: TMemo; ComboBox1: TComboBox; GroupBox1: TGroupBox; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure FormShow(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure CheckBox3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } procedure FormatoTexto; public { Public declarations } end; var FrmTexto: TFrmTexto; implementation {$R *.DFM}

procedure TFrmTexto.Button1Click(Sender: TObject);


21

Somente devemos declarar procedures ou funes manuais. As demais funes que possuem Sender como parmetro so declaradas automaticamento pelo Delphi, atravs da Object Inspector ou DuploClick no objeto (Evento Padro). A ordem de construo dos eventos no faz a menor diferena

166

begin if Edit1.Text <> '' then Memo1.Lines.LoadFromFile(Edit1.Text) else ShowMessage('Digite um caminho e'+#13+ 'um nome de arquivo vlido'+#13+ 'Exemplo: C:\autoexec.bat'); end;

procedure TFrmTexto.ComboBox1Change(Sender: TObject); begin Memo1.Font.Name := ComboBox1.Text; end; {Para criar o procedimento FormatoTexto, digite sua declarao (sem TFrmTexto) na clusula private e utilize CTRL+SHIFT+C Para todos os demais, selecione o objeto e utilize a object inspector} procedure TFrmTexto.FormatoTexto; begin if (CheckBox1.Checked and CheckBox2.Checked and CheckBox3.Checked) then Memo1.Font.Style := [fsBold, fsItalic, fsUnderline] else if (CheckBox1.Checked and CheckBox2.Checked) then Memo1.Font.Style := [fsBold, fsItalic] else if (CheckBox1.Checked and CheckBox3.Checked) then Memo1.Font.Style := [fsBold, fsUnderline] else if (CheckBox2.Checked and CheckBox3.Checked) then Memo1.Font.Style := [fsItalic, fsUnderline] else if (CheckBox1.Checked) then Memo1.Font.Style := [fsBold] else if (CheckBox2.Checked) then Memo1.Font.Style := [fsItalic] else if (CheckBox3.Checked) then Memo1.Font.Style := [fsUnderline] else Memo1.Font.Style := []; end; procedure TFrmTexto.FormShow(Sender: TObject); begin ComboBox1.Items.AddStrings(Screen.Fonts); ComboBox1.Text := ComboBox1.Items.Strings[0]; Memo1.Font.Name := ComboBox1.Text; end; procedure TFrmTexto.CheckBox1Click(Sender: TObject); begin FrmTexto.FormatoTexto; end; procedure TFrmTexto.CheckBox2Click(Sender: TObject); begin FrmTexto.FormatoTexto; end; procedure TFrmTexto.CheckBox3Click(Sender: TObject); begin FrmTexto.FormatoTexto; end;

procedure TFrmTexto.Button2Click(Sender: TObject);

167

begin FrmTexto.Close; end; procedure TFrmTexto.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Deseja realmente sair?',mtConfirmation,[mbYes,mbNo],0) = mrYes then CanClose := True else CanClose := False; end; end.

Salve seu projeto novamente para atualiz-lo e atravs do comando RUN compile-o e faa os testes necessrios.

EXERCCIO 5
Objetivo: Abordar a maneira com que o Delphi trabalha com objetos tendo um enfoque maior na diversidade de componentes. Componentes utilizados: PageControl, BitBtn, Memo, Image, MainMenu, PopupMenu, OpenDialog, OpenPictureDialog, SpeedButton. Enfoque: O usurio dever escolher entre carregar um texto ou uma figura dependendo da guia de trabalho. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio5 Nome atual Unit1 Project1 Novo nome UFrmTextoFigura TextoFigura

A propriedade Name do form dever ser FrmTextoFigura Insira os seguintes objetos na guia TabSheet1.

168

Insira os seguintes objetos na guia TabSheet2. No insira os componentes invisveis novamente.

SpeedButton2 Image1

Construa o menu principal (MainMenu) com os seguintes items: Caption Name &Arquivo MnuArquivo &Fechar MnuFechar &Sair MnuSair ShortCut Ctrl+F Alt+F4

169

Contrua o menu rpido (PopupMenu) com os seguintes items: Caption Abrir Fechar Name MnpAbrir MnpFechar

Selecione os dois componentes SpeedButton na TabSheet2 e defina a propriedade GroupIndex de ambos com o valor 1 Selecione o componente Memo1 e defina a propriedade PopupMenu com o valor PopupMenu1 Selecione o componente Image1 e defina a propriedade PopupMenu com o valor PopupMenu1 Selecione o componente OpenDialog1 e defina a propriedade Filter como na ilustrao. As demais propriedades esto definidas como:
object OpenDialog1: TOpenDialog Filter = InitialDir = 'c:\' Title = 'Abrir arquivo texto' end

Defina captions e figuras para os objetos BitBtn. Defina figuras para os SpeedButtons. Os demais detalhes de acabamento so de escolha do desenvolvedor. Agora, identifique os eventos abaixo e construa os cdigos indicados, fazendo os comentrios que julgar necessrio.
implementation {$R *.DFM} procedure TFrmTextoFigura.BitBtn1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Memo1.Lines.LoadFromFile(OpenDialog1.FileName); TabSheet1.Caption := ExtractFileName(OpenDialog1.FileName); end; end;

170

procedure TFrmTextoFigura.BitBtn2Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); TabSheet2.Caption := ExtractFileName(OpenPictureDialog1.FileName); SpeedButton1.Down := True; Image1.Stretch := False; end; end; procedure TFrmTextoFigura.SpeedButton1Click(Sender: TObject); begin Image1.Stretch := False; end; procedure TFrmTextoFigura.SpeedButton2Click(Sender: TObject); begin Image1.Stretch := True; end; procedure TFrmTextoFigura.MnuFecharClick(Sender: TObject); begin if PageControl1.ActivePage = PageControl1.Pages[0] then Memo1.Lines.Clear else Image1.Picture := nil; end; procedure TFrmTextoFigura.MnpAbrirClick(Sender: TObject); begin if PageControl1.ActivePage = PageControl1.Pages[0] then BitBtn1.Click else BitBtn2.Click; end; procedure TFrmTextoFigura.MnpFecharClick(Sender: TObject); begin {Pode-se reaproveitar cdigo atravs da object inspector tambem} MnuFechar.Click; end; procedure TFrmTextoFigura.MnuSairClick(Sender: TObject); begin FrmTextoFigura.Close; end; procedure TFrmTextoFigura.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Deseja sair?',mtConfirmation,[mbYes,mbNo],0) = mrYes then CanClose := True else CanClose := False; end;

171

EXERCCIO 6
Objetivo: Abordar a maneira com que o Delphi trabalha com objetos revisando conceitos j abordados. Componentes utilizados: MainMenu, OpenDialog, RichEdit, Animate, ProgressBar. Enfoque: O usurio dever escolher um arquivo .RTF e ao carregar o arquivo, o processo vai atualizar a ProgressBar de acordo com o nmero de caracteres. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio6 Nome atual Unit1 Project1 UFrmRichText RichText Novo nome

Insira os componentes e organize-os. A sugesto pode ser vista a seguir:

Animate

ProgressBar

Insira duas figuras na ImageList atravs de um duplo clique. As figuras devem representar as funes (Abrir e Fechar) No objeto MainMenu crie os seguintes items: Caption Name Abrir MnuAbrir Fechar MnuFechar Para o objeto Animate, configure as seguintes propriedades:
object Animate1: TAnimate Active = False CommonAVI = aviFindFile Visible = False end

Para inserir figuras nos items de Menu, selecione o MainMenu (1 click) e na propriedade Images defina o objeto ImageList correspondente. Depois, d um duplo clique no MainMenu. Nos items de menu (dentro do construtor) defina na propriedade ImageIndex a figura desejada. 172

O aplicativo tem dois eventos basicamente. Implemente-os como a seguir.


implementation {$R *.DFM} procedure TFrmRichText.MnuAbrirClick(Sender: TObject); var i:integer; begin if OpenDialog1.Execute then begin RichEdit1.Visible := False; RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName); ProgressBar1.Max := Length(RichEdit1.Lines.Text); Animate1.Visible := True; Animate1.Active := True; for i:=0 to Length(RichEdit1.Lines.Text) do ProgressBar1.Position := i; Animate1.Active := False; Animate1.Visible := False; ProgressBar1.Position := 0; RichEdit1.Visible := True; FrmRichText.Caption := ('O total de caracteres : '+ IntToStr(Length(RichEdit1.Lines.Text))); end; end; procedure TFrmRichText.MnuFecharClick(Sender: TObject); begin FrmRichText.Close; end;

EXERCCIO 7
Objetivo: Abordar a maneira com que o Delphi trabalha com objetos revisando conceitos j abordados. Componentes utilizados: MonthCalendar, DateTimePicker, MaskEdit, StatusBar. Enfoque: O usurio dever escolher uma data em qualquer um dos dois componentes, poder tambm digit-la no MaskEdit. A data ser exibida na Barra de Status por extenso atravs da funo FormatDateTime.

173

Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio7 Nome atual Unit1 Project1 UFrmData Data Novo nome

Insira os componentes e identifique os eventos em seguida.

MaskEdit

StatusBar

implementation {$R *.DFM} procedure TFrmData.MonthCalendar1Click(Sender: TObject); begin StatusBar1.SimpleText := FormatDateTime('dddd, dd "de" mmmm "de" yyyy',MonthCalendar1.Date); DateTimePicker1.Date := MonthCalendar1.Date; MaskEdit1.Text := DateToStr(MonthCalendar1.Date); end; procedure TFrmData.DateTimePicker1Change(Sender: TObject); begin StatusBar1.SimpleText := FormatDateTime('dddd, dd "de" mmmm "de" yyyy',DateTimePicker1.Date); MonthCalendar1.Date := DateTimePicker1.Date; MaskEdit1.Text := DateToStr(DateTimePicker1.Date); end; procedure TFrmData.MaskEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then {Se o usurio teclar ENTER, ento} begin StatusBar1.SimpleText := FormatDateTime('dddd, dd "de" mmmm "de" yyyy',StrToDate(MaskEdit1.Text)); MonthCalendar1.Date := StrToDate(MaskEdit1.Text); DateTimePicker1.Date := StrToDate(MaskEdit1.Text); end; end;

EXERCCIO 8

174

Abra o exerccio 5 e trate os possveis erros atravs de tratamento local (try-except). Abra o exerccio 7 e trate os possveis erros atravs do tratamento global (objeto ApplicationEvents).

EXERCCIO 9
Objetivo: Abordar a maneira com que o Delphi trabalha com objetos revisando conceitos j abordados. Componentes utilizados: StatusBar, FilterComboBox, FileListBox, DirectoryListBox, DriveComboBox, Image, Timer. Enfoque: O usurio dever escolher um arquivo BMP na caixa de listagem, sendo este exibido no componente Image. As horas sero exibidas em uma parte da StatusBar. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio9 Nome atual Unit1 Project1 UFrmFigura Figura Novo nome

Insira os componentes e modifique suas propriedades em seguida.

Image

object FilterComboBox1: TFilterComboBox Hint = 'Escolha um tipo de arquivo' FileList = FileListBox1 Filter = 'Bitmap|*.BMP | Jpeg|*.JPG | cones|*.ICO' end object DriveComboBox1: TDriveComboBox Hint = Escolha um drive DirList = DirectoryListBox1 end

StatusBar

object DirectoryListBox1: TDirectoryListBox Hint = Escolha uma pasta para visualizar mais arquivos FileList = FileListBox1 end object FileListBox1: TFileListBox

175

Cursor = crHandPoint Hint = Clique para visualizar um arquivo end object StatusBar1: TStatusBar AutoHint = True SimplePanel = False end

Para o objeto StatusBar, crie dois painis na propriedade Panels. O primeiro dever ter a largura (width) de 350. Identifique os eventos e implemente o cdigo a seguir:
implementation {$R *.DFM} procedure TFrmFigura.FormShow(Sender: TObject); begin FileListBox1.Mask := FilterComboBox1.Mask; end; procedure TFrmFigura.FileListBox1Change(Sender: TObject); begin if FileListBox1.FileName <> '' then Image1.Picture.LoadFromFile(FileListBox1.FileName); end; procedure TFrmFigura.Timer1Timer(Sender: TObject); begin StatusBar1.Panels[1].Text := DateTimeToStr(Now); end;

176

EXERCCIO 10
Objetivo: Manipular objetos com enfoque maior em operaes internas. Componentes utilizados: GroupBox, Label, Edit, MaskEdit, BitBtn. Enfoque: O usurio dever preencher os dados bsicos e ao clicar no boto, a aplicao deve calcular os items identificados do lado esquerdo. Eventuais excees devem ser tratatadas para evitar mensagens tcnicas ou falta de orientao ao usurio. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio10 Nome atual Unit1 Project1 Insira os seguintes componentes: UFrmJuros Juros Novo nome

Inserir mscara

Pode-se trocar a sugesto do objeto MaskEdit para um DateTimePicker. Crie agora uma rotina para calcular: Juros dirios: o valor dos juros mensal dividido por 30. Dias atrasados: a diferena entre as datas de pagamento e vencimento. Valor pagar: Prestao + (juros dirio/100 * dias atrasados * prestao) Identificar se o usurio pagou adiantado, se pagou, no haver descontos, o valor a pagar ser a prestao. Eventuais excees devem ser tratatadas para evitar mensagens tcnicas ou falta de orientao ao usurio.

EXERCCIO 11
Objetivo: Manipular objetos com enfoque maior em operaes internas. 177

Componentes utilizados: escolha do desenvolvedor. Enfoque: O usurio dever preencher os dados bsicos (altura atual e peso). Ao clicar no boto, a aplicao deve calcular o peso ideal informando quanto a pessoa deve engordar, emagrecer ou manter o peso. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio11 Nome atual Unit1 Project1 UFrmPeso Peso Novo nome

Supondo uma regra, a implementao ser a seguinte: Peso_ideal = Altura_atual 1,05 O usurio dever entrar com dois dados: Altura atual e peso atual. O programa deve calcular o peso ideal e exibir sua resposta de acordo com a diferena entre o Peso atual e o Peso ideal.

EXERCCIO 12
Objetivo: Manipular objetos com enfoque maior em operaes internas. Componentes utilizados: GroupBox, ListBox, Edit, MaskEdit, BitBtn, Label. Enfoque: O usurio dever preencher os dados bsicos. Ao clicar no boto, a aplicao deve calcular o salrio bruto. Atravs de uma nova aplicao, grave o projeto dentro de uma pasta chamada Exercicio12 Nome atual Unit1 Project1 Orientaes gerais: Permitir a entrada dos seguintes dados (GroupBox Dados Bsicos): O nome do funcionrio, o salrio base, a data de admisso, o nmero de dependentes e selecionar o cargo do funcionrio. Permitir a entrada dos seguintes dados (GroupBox Base de Clculo): O valor em Real pago por cada dependente, o valor em porcentagem do Tempo de servio do funcionrio. Exibir os seguintes dados (GroupBox Valores Calculados): O clculo dos dependentes do funcionrio (N de dependentes * Valor em Real pago por dependente), o clculo do tempo de servio (Quantidade de anos na empresa * Valor em porcentagem do Tempo de servio do funcionrio em relao ao salrio base), o clculo do cargo (de acordo com o cargo selecionado, o valor em porcentagem do cargo em relao ao salrio base). UFrmSalario Salario Novo nome

178

Exemplo e sugesto visual a seguir:

179

EXERCCIOS Avanados
1. Faa um bloco de notas simples (no necessrio gravar o arquivo), aonde o usurio ir poder selecionar o fonte, cor, alinhamento e estilo (Negrito, Itlico e/ou sublinhado) do texto. 2. Faa uma calculadora cientfica que possua alm das quatro operaes bsicas, as operaes de raiz e potncia com qualquer expoente, as todas relaes trigonomtricas (seno, coseno, tangente, arco seno, arco coseno e arco tangente) e o inverso (1/X). Alm disso a calculadora deve ter uma memria auxiliar com as funes de adiciona um valor a memria (M+), subtrai um valor da memria (M-), l o valor da memria (MR) e limpa a memria (MC). 3. Faa um jogo da velha utilizando botes, ou seja, cada boto representa um campo do jogo, quando todos os campos estiverem completos o jogo deve indicar o ganhador ou se houve empate. 4. Uma empresa necessita um programa que auxilie na escolha para a contratao de um funcionrio especializado. Para isso ela designou algumas regras de pontuao para a avaliao do currculo de cada candidato. O candidato que obtiver a melhor pontuao o mais indicado para o cargo. As regras de pontuao so as seguintes: - O Candidato que tiver entre 25 e 30 anos, obtm 10 pontos. Para cada ano a mais ou a menos desta faixa, o candidato perde um ponto. - O candidato com curso de graduao na rea do cargo, obtm 20 pontos. - O candidato com curso de mestrado ou doutorado na rea do cargo, obtm 30 pontos. - O candidato com experincia profissional, durante mais de dois anos, na rea do cargo, obtm 20 pontos. A partir destas informaes, faa um programa em que o usurio entrar com os dados de cada candidato, e o sistema ir informando a pontuao dos mesmos. O sistema ainda deve armazenar em memria o candidato melhor colocado, para no final quando o usurio apertar um boto, mostrar os dados do candidato melhor colocado.

5. O sistema que possui a janela ao lado, deve ler o nome (EditNome) e o sobrenome (EditSobrenome) de uma pessoa, e quando o usurio clicar no boto, o sistema deve concatenar os dois e exibir no campo completo (EditCompleto). Monte o evento responsvel por est funo. No esquea do nome do evento, bem como os seus parmetros de entrada e sada.

180

6. No sistema que possui a janela ao lado, o usurio deve digitar uma data no campo EditData. Logo aps ele deve apertar o boto de validao da data (Valida), e por fim deve apertar o boto (Extenso), para escrever no campo EditDataExtenso a data por extenso. Se o usurio apertar o boto extenso anter de validar a senha, o sistema deve retornar uma mensagem de erro. A validao da data tem o seguinte formato 1<=dia<=30, 1<=ms<=12 e 1900<=ano<=2000. Monte os mtodos onclick dos botes, no esquecendo do nome dos mesmos, bem como dos parmetros de entrada e sada. 7. Num sistema hipottico, o programador criou uma classe chamada TMinhaClasse. Esta classe possui trs mtodos, o construtor (chamado create), o SetaPosicao (o qual possui dois parmetros de entrada, que correspondem a posio na janela aonde o objeto ser desenhado) e o desenha (desenha o objeto da classe TMinhaClasse). Est classe ainda possui trs propriedades, a cor (cor do objeto), a fonte (fonte de letra utilizado pelo objeto) e a visibilidade (se for TRUE o componente est visvel se for FALSE ele est invisvel). Neste Sistema hipottico, existe um objeto da classe TMinhaClasse chamado MeuObjeto, este objeto deve ser inicializada no momento da criao do form, com a cor (RED), na posio da janela (100,150) e a sua visibilidade deve ser TRUE. O sistema ainda possui dois botes. Quando o button1 for clicado, o fonte de letra do MeuObjeto deve ser igual a do button1. E quando o button2 for clicado, o fonte de letra do MeuObjeto deve ser igual a do button2. Monte estes trs mtodos/eventos, no esquecendo do nome dos mesmos, bem como dos parmetros de entrada e sada. 8. form ao lado contm trs componentes do tipo TradioButton de nomes RBAzul, RBVerde e RBVerm, um componente do tipo Tlabel de nome LBLmens e um componente do tipo Tmemo de nome Memo1. O objetivo deste programa quando for selecionada uma cor, uma mensagem de qual cor foi selecionada deve aparecer no LBLmens e a cor do texto de Memo1 deve ser alterada. Quando Memo1 for selecionado, deve aparecer em LBLmens a mensagem Modo de edio. 9. Em um sistema existe a necessidade de criarmos um form especial para a realizao de perguntas simples (respostas do tipo Sim e No). Este novo form tem todas os mtodos e propriedades de um form normal, mais os eventos onclick dos botes sim e no, um mtodo especial para a mostrar o form (mostra) e um mtodo para indicar qual foi a resposta (resposta). A execuo deste form se dar pela chamada do mtodo mostra, o qual ter como parmetro de entrada a pergunta a ser mostrada no form. Quando um dos botes for apertado o form deve ser

181

fechado e a resposta deve ser armazenada em uma varivel. O mtodo resposta apenas retorna a resposta armazenada para a ultima pergunta. Para isso crie uma classe TPergunta, que herda a classe Tform e crie estes quatro mtodos. (Obs.: A classe tambm deve ser descrita). 10. No form ao lado, existem pelo menos 1000 nomes j cadastrados no componente ComboBox1. No componente Edit1, o usurio do sistema ir escrever um nome. Quando o usurio apertar o Boto (Button1), uma lista de todos os nomes de ComboBox1 que comeam pelo nome de Edit1 deve ser exibida no componente Memo1. - Dicas para utilizao do componente ComboBox: Nmero de nomes: ComboBox.items.count; Lista de nomes: ComboBox.items.Strings[ndice] (0<=ndice<Nmero de nomes). - Dica para a utilizao do componente Memo: Inserir linhas: Memo.lines.Add(String da linha); 11. O form ao lado contm trs componentes do tipo TradioButton de nomes RB10, RB12 e RB14, um componente do tipo Tlabel de nome LBLmens e um componente do tipo Tmemo de nome Memo1. O objetivo deste programa quando for selecionado um tamanho, uma mensagem de qual tamanho foi selecionado deve aparecer no LBLmens e o tamanho do fonte de letra de Memo1 deve ser alterado. Quando Memo1 for selecionado, deve aparecer em LBLmens a mensagem Modo de edio. 12. Em um sistema existe a necessidade de criarmos um form especial para a realizao da pergunta especfica de um nome de um cliente. Este novo form tem todas os mtodos e propriedades de um form normal, mais os eventos onclick dos botes Ok e cancela, um mtodo especial para a mostrar o form (mostra) e um mtodo para indicar qual foi o nome escrito (NomeEscrito). A execuo deste form se dar pela chamada do mtodo mostra. Se o boto de Ok for pressionado, o form deve ser fechado(ou ficar invisvel) e a resposta deve ser armazenada em uma varivel. Se o boto pressionado for o cancela, o form tambm deve ser fechado e a resposta deve ser zerada(). O mtodo NomeEscrito dever retornar o nome armazenado pela ultima vez. Para isso crie uma classe TNome, que herda a classe Tform e crie estes quatro mtodos. (Obs.: A classe tambm deve ser descrita). 13. No form ao lado, existem pelo menos 1000 nomes j cadastrados nos componentes ComboBox1 e no ComoBox2. Quando o usurio apertar o Boto (Button1), uma lista de todos os nomes que aparecem em ComboBox1 e ComboBox2, deve ser exibidos no componente Memo1.

182

Dicas para utilizao do componente ComboBox: Nmero de nomes: ComboBox.items.count; Lista de nomes: ComboBox.items.Strings[ndice] (0<=ndice<Nmero de nomes). Dica para a utilizao do componente Memo: Inserir linhas: Memo.lines.Add(String da linha);

14. No cadastro de funcionrios ao lado necessrio realizar dois tipos de consultas. Uma consulta pelo nome do funcionrio e outra pelo cargo do funcionrio. O Banco de dados indexado apenas pelo cargo e pelo cdigo do funcionrio. Faa nos eventos on click de cada boto os sistemas de consulta desejados.

15. Um banco necessita de um controle simples das suas contas correntes. Para isso crie uma classe especfica chamada Tconta. A classe dever ter como propriedades o nome do cliente, o nmero da conta, o saldo e o limite da conta. A classe dever ter ainda os mtodos para incluso do cliente (nome, nmero e limite da conta) e depsito, retirada e saldo da conta corrente. O mtodo de retirada deve testar se o cliente tem saldo disponvel (saldo+limite), caso contrrio a operao no deve ser realizada e a classe deve retornar uma mensagem de falta de saldo. OBS. 1: No esquecer de incluir a classe, bem como todos os seus mtodos. OBS. 2: A classe no visual. 16. O sistema ao lado composto de um campo de imagem, dois botes, uma caixa de dilogo para abertura de figuras e outra para a gravao. Quando o usurio clicar no boto ler, o sistema deve selecionar um arquivo e coloca-lo no campo imagem. Quando o usurio clicar no boto gravar, o sistema deve selecionar um nome de arquivo e gravar a figura armazenada no campo imagem. Monte os eventos de cada um dos botes. 17. No cadastro de funcionrios ao lado necessrio realizar dois tipos de consultas. Uma consulta pelo nome do funcionrio e outra pelo cargo do funcionrio. O Banco de dados indexado apenas por nome e sobrenome do funcionrio. Faa nos eventos on click de cada boto os sistemas de consulta desejados. 18. Um banco necessita de um controle simples das suas cadernetas de poupana. Para isso crie uma classe especfica chamada TCaderneta. A classe dever ter como propriedades o nome do cliente, o

183

nmero da conta e o saldo. A classe dever ter ainda os mtodos para incluso do cliente (nome e nmero da conta) e depsito, retirada e saldo da caderneta de poupana. O banco possui um limite mnimo para manter a caderneta de poupana aberta. O mtodo de retirada deve testar se o cliente tem saldo disponvel. Caso a retirada seja maior que o saldo, a operao no deve ser realizada e a classe deve retornar uma mensagem de falta de saldo. Caso o saldo restante seja menor que o limite mnimo, a classe deve realizar a operao, mas deve colocar uma mensagem avisando que o saldo est muito baixo. OBS. 1: No esquecer de incluir a classe, bem como todos os seus mtodos. OBS. 2: A classe no visual. 19. O sistema ao lado composto de um campo de imagem, dois botes, uma caixa de dilogo para abertura de figuras e outra para a gravao. Quando o usurio clicar no boto ler, o sistema deve selecionar um arquivo e coloca-lo no campo imagem. Quando o usurio clicar no boto gravar, o sistema deve selecionar um nome de arquivo e gravar a figura armazenada no campo imagem. Monte os eventos de cada um dos botes. 20. No cadastro de funcionrios ao lado necessrio realizar dois tipos de consultas. Uma consulta pelo nome do funcionrio e outra pelo cargo do funcionrio. O Banco de dados indexado apenas pelo cargo e pelo cdigo do funcionrio. Faa nos eventos on click de cada boto os sistemas de consulta desejados.

21. Um banco necessita de um controle simples das suas contas correntes. Para isso crie uma classe especfica chamada Tconta. A classe dever ter como propriedades o nome do cliente, o nmero da conta, o saldo e o limite da conta. A classe dever ter ainda os mtodos para incluso do cliente (nome, nmero e limite da conta) e depsito, retirada e saldo da conta corrente. O mtodo de retirada deve testar se o cliente tem saldo disponvel (saldo+limite), caso contrrio a operao no deve ser realizada e a classe deve retornar uma mensagem de falta de saldo. OBS. 1: No esquecer de incluir a classe, bem como todos os seus mtodos. OBS. 2: A classe no visual.

22. No Form1 ao lado existem duas tabelas TB1 e TB2, relacionados a elas existem dois DataSource DS1 e DS2 respectivamente. TB1 contm dados dos clientes, sendo um destes o nome do cliente (Nome). J em TB2 esto os dados de produtos, sendo

184

um destes o nome do produto (NomeProd). Quando o Boto 1 (Button1) for clicado, o campo de edio para banco de dados (DBEdit1), deve passar a apontar para o campo nome do cliente(Nome) da tabela 1(TB1) e o navegador deve apontar para a tabela (TB1). Quando o Boto 2 (Button2) for clicado (DBEdit1) deve passar a apontar para o campo nome do produto (NomeProd ) da tabela 2 (TB2), e o navegador deve apontar para a tabela (TB2).

185

Anexo A - Componentes
Form - Elemento bsico no desenvolvimento Delphi formando o alicerce sobre, o qual um aplicativo construdo. Propriedades Descrio Active Indica quando o formulrio esta ativo. ActiveControl Determina o controle que receber o foco quando o formulrio ativado AutoScroll Adiciona barras de rolagens automaticamente quando um formulrio redimensionado de forma a cobrir componentes HorzScrollBar Adiciona Barra de rolagem Horizontais quando necessrio VertScrollBar Adiciona Barra de rolagem Verticais quando necessrio BorderIcons Define quais cones de controle sero visveis [biSystemMenu, biMinimize, biMaximize, biHelp] BorderStyle Estilo da borda da janela [bsDialog, bsSingle, bsNone, bsSizeable, bsToolWindow, bsSizeToolWin] FormStyle Tipo da janela [fsNormalfs, MDIChild, fsMDIForm, fsStayOnTop] Icon cone da janela Menu Indica qual o componente menu do formulrio ser apresentado Position Permite controlar a posio e tamanho dos formulrios na execuo [poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly, poScreenCenter] WindowState Estado da janela (normal, minimizado ou maximizado) Eventos Descrio OnCreate O formulrio criado OnShow Antes de mostrar a janela OnCloseQuery chamada para validar se a janela pode ser fechada OnClose Ocorre quando a janela fechada OnActivate Ocorre quando a janela torna-se ativa OnDeactivate Ocorre quando a janela perde o foco OnResize Ocorre quando a janela muda de tamanho Mtodos Descrio Show Mostra uma janela no-modal ShowModal Ativa uma janela modal Close Fecha a janela Refresh Redesenha a Janela Button - Componente utilizado para representar aes Propriedades Descrio Cancel Dispara o evento OnClick do boto quando a tecla ESC pressionada Default Dispara o evento OnClick do boto quando a tecla ENTER pressionada ModalResult Associa o boto a opo de fechamento de um Form modal BitBtn - Boto contendo uma Legenda e um BitMap, possui as propriedades e mtodos do SpeedButton

186

Propriedades Descrio Kind Seleciona um BitMap padro para o boto Style Indica a aparncia do boto (win3.11, win95, winxx) SpeedButton - Boto contendo um BitMap, normalmente utilizado na construo de barra de ferramentas Propriedades Descrio Glyph BitMap exibido pelo boto LayOut Posio do BitMap no Boto Margin Indica o espao entre a borda do boto e o BitMap Spacing Indica o espao entre o BitMap e o Texto do boto Down Estado do boto (Pressionado ou no) GroupIndex Indica quais botes pertencero ao mesmo grupo AllowAllUp Permite que todos os botes de um grupo possam estar no pressionados Mtodos Descrio Click Ativa o evento OnClick do boto Label - Utilizado para exibir rtulos Propriedades Descrio Alignment Alinhamento do texto no componente AutoSize Define se o tamanho do componente ser automaticamente ajustado ao tamanho da legenda WordWrap Retorno automtico Transparent Define se o componente ser transparente FocusControl Nome do componente que receber o foco ShowAccelChar Indica se & ser far ou no parte da legenda Edit - Utilizado para entrada de dados texto em uma nica linha. Propriedades Descrio Text Armazena a entrada de dados AutoSelect Indica se o texto ser ou no selecionado quando o componente receber o foco MaxLength Nmero mximo de caracteres permitidos CharCase Define se as letras aparecero em maisculo, minsculo ou normal PasswordChar Caracter utilizado para esconder os dados digitados (Senhas) ReadOnly Define se ser permitido alterar o texto SelLength Comprimento da seleo SelStart Inicio da seleo SelText Texto selecionado

MaskEdit - Permite entrada de dados texto em uma linha, utilizando uma mscara de edio. Possui todas as propriedades do componente Edit Propriedades Descrio EditMask Mscara de edio A propriedade EditMask consiste em uma mscara de edio permitindo definir quais os possveis caracteres e a formatao para a propriedade Text.

187

Essa mscara consiste de trs partes separadas por ;. A primeira parte a mscara propriamente dita, a segunda parte indica se os caracteres literais sero armazenados na propriedade text (0 - no armazena; 1 - armazena). A terceira parte indica qual o caracter utilizado representar os espaos a serem digitados no texto Estes so os caracteres especiais que podem compor a mscara de edio Caracter Descrio ! Espaos em branco no aparecero > Todos os caracteres seguintes sero maisculos at que aparea o caracter < < Todos os caracteres seguintes sero minsculos at que aparea o caracter > \ Indica um caracter literal L Somente caracter alfabtico L Obrigatoriamente um caracter alfabtico (A-Z, a-z) A Somente caracter alfanumrico A Obrigatoriamente caractere alfanumrico ( A-Z, a-z, 0-9) 9 Somente caracter numrico 0 Obrigatoriamente caracter numrico C permite um caracter C Obrigatoriamente um caracter # Permite um caracter numrico ou sinal de mais ou de menos, mas no os requer. : Separador de horas, minutos e segundos / Separador de dias, meses e anos Memo - Permite entrada de dados texto em mltiplas linhas. Propriedades Descrio Alignament Indica como ser o alinhamento do texto Lines Armazena as linhas de texto WantReturns Define se a tecla ENTER ser tratada pelo Formulrio ou pelo Memo WantTab Define se a tecla TAB ser tratada pelo Formulrio ou pelo Memo WordWrap Indica se a linha digitada ser quebrada, automaticamente, de acordo com o tamanho do componente ScrollBar Indica se Memo ter barras de rolagem Mtodos Descrio Clear Limpa o memo ClearSelection Limpa o texto selecionado no memo Obs: Muitos componentes possuem propriedades do Tipo TStrings, essa classe permite armazenar e manipular uma lista de Strings. Toda propriedade do tipo TStrings permite acesso indexado aos itens da listas (Propriedade[indce]) TString Propriedades Count Mtodos Add Insert Delete Clear

Descrio Nmero de linhas Descrio Adiciona uma nova linha no final da lista Insere uma nova linha numa posio especificada Apaga uma linha Apaga toda a lista 188

IndexOf LoadFromFile SaveToFile

Retorna o ndice do item e -1 caso no encontre Carrega de um arquivo texto Salva para um arquivo texto

CheckBox - Utilizado para obter informaes lgicas independentes Propriedades Descrio AllowGrayed Determina se o checkbox ter duas ou trs possibilidades Checked Determina se o checkbox est selecionado State Estado atual do checkbox (cbUnchecked, cbChecked, cbGrayed) RadioButton - Utilizado para obter informaes lgicas mutuamente exclusivas Propriedades Descrio Checked Determina se o RadioButton esta selecionado GroupBox - Utilizados para agrupar componentes, sobre determinado ttulo.

RadioGroup - Componente que agrupa e controla RadioButtons Propriedades Descrio Columns Nmero de colunas de botes de rdio Items Valores dos botes de rdio. Items[n] acessa o n-simo componente ItemIndex Item selecionado. (-1 nenhum, comea em 0)

Panel - Utilizados para agrupar componentes e criar barras de ferramentas. Propriedades Descrio BevelInner Estilo interno da superfcie do Panel BevelOuter Estilo externo da superfcie do Panel BevelWidth Distncia entre as superfcies externas e internas BorderStyle Estilo da Borda BorderWidth Largura da borda

ScrollBox - Semelhante ao componente GrupoBox, sendo que, possui barras de rolagem Propriedades Descrio HorzScrollBar Barra Horizontal (Increment, Tracking e Visible) VertScrollBar Barra Vertical (Increment, Tracking e Visible)

Bevel - Define linhas, retngulos e molduras nas janelas. Propriedades Descrio Shape Tipo de figura a ser desenhada Style Define alto e baixo relevo

ListBox - Utilizado para escolher em uma lista grande de opes. Propriedades Descrio Columns Nmero de colunas da lista MultiSelect Define se ser permitida a seleo de mltiplos itens

189

ExtendedSelect Define se a seleo poder ser estendida pelo uso das teclas Shift e Ctrl IntegralHeight Define se os itens podero aparecer parcialmente ou somente por completo Items Valores dos itens da lista ItemIndex Item selecionado. (-1 no existe item selecionado e o 1 0) Selected De acordo com o ndice indica se um item em particular esta selecionado. SelCount Indica quantos itens esto selecionado Sorted Define se os itens aparecero ordenados ComboBox - Rene as caractersticas de Edit e ListBox. Propriedades Items DropDownCount Text Style Descrio Valores a serem exibidos na lista Nmero de itens visveis da lista Contedo texto digitado na ComboBox csDropDown - permite edio e exibe os itens mediante solicitao csDropDownList - no permite edio e mostra itens no edit ao pressionar a 1 letra do item. CsSimple - permite edio e exibe a lista Define se os itens aparecero ordenados

Sorted

CheckListBox Possui toda a funcionalidade do ListBox exibindo uma CheckBox p/ cada item Propriedades Descrio Checked[n] Retorna true se o item n estiver selecionado State[n] Retorna o estado do item n : [cvUnchecked, cbChecked, cbGrayed] Eventos Descrio OnClickChecke Quando um item marcado ou desmarcado d ScrollBar - Permite a escolha de um valor numrico dentro de uma faixa. Propriedades Min Max Position LargeChange SmallChange Kind Eventos OnEditMask Descrio Valor mnimo possvel Valor mximo possvel Posio Atual Incremento da posio quando o click na barra Incremento da posio quando o click na seta Se a barra vertical ou horizontal Descrio Permite atribuir uma mscara a clula. A linha e a coluna da clula editada so recebidas pelo evento e mascar representada pelo parmetro Value

StringGrid e DrawGrid - Utilizado para entrada ou exibio de dados no formato de tabela.

190

Propriedades ColCount RowCount Col Row DefaultColWidth DefaultRowHeight DefaultDrawing FixedCol FixedRow GridLineWidth Options Cells[col,lin]

Descrio Nmero de colunas Nmero de linhas Coluna corrente Linha Corrente Largura das colunas Altura das linhas Define se o desenho das clulas ser automtico ou manual Quantidade de Linhas Fixas Quantidade de colunas fixas Espessura das Linhas divisrias Define caractersticas do Grid. goEditing e goTabs Permite acessar as clulas da Grid, por coluna e linha, sendo que a primeira linha e coluna tm valores 0.

Image - Exibe uma imagem. Propriedades Descrio Picture Arquivo Bitmap, cone ou Windows Metafile exibido Center Centraliza a figura no componente Stretch Define se o tamanho da figura deve ser ajustado ao do componente Transparente Torna o fundo visvel ou opaco Shape - Exibe uma figura geomtrica Propriedades Brush Pen Shape Descrio Cor e preenchimeto da figura Cor e preenchimento da borda Figura geomtrica

Splitter Permite o redimensionamento de componente em tempo de execuo Propriedades Beveled MinSize Descrio Exibe o componente com aparncia 3D Tamanho mnimo para os componentes

TabControl - Contem guias, as quais podem ser utilizadas para alterar outros componentes Propriedades MultiLine Tabs TabPositon HotTrack TabIndex ScrollOpposite Eventos OnChange Descrio Permite mltiplas linhas para as guias Guias Posio das orelhas em cima ou embaixo Destaca a orelha quando o curso do mouse esta em cima da mesma Guia ativa Transfere as orelhas das linhas anteriores selecionada para a outra extremidade do Componente Descrio Quando uma guia selecionada

191

PageControl - Contem pginas, as quais, podem possuir diversos componentes. Para inserir uma nova pgina d um clique com o boto direito do mouse e escolha NewPage. Cada pgina criada um objeto do tipo TTabSheet e possui a seguintes propriedades : Caption, PageIndex e TabVisible, onde PageIndex indica a ordem de apresentao de cada pgina e TabVisible permite exibir ou ocultar as pginas. Propriedades MultiLine ActivePage PageIndex Eventos OnChange Descrio Permite mltiplas linhas para as pginas Pgina ativa ndice da pgina ativa Descrio Quando uma pgina selecionada

ImageList Representa uma coleo de imagens do mesmo tramanho, sua principal funo armazenar imagens para outros componentes, onde cada imagem pode ser refrenciada atravs de seu ndice no vetor de imagens. Propriedades Descrio Count Nmero de imagens na lista

RichEdit Componente para editar texto no formato Rich Text, esse componente permite diferentes formataes para o seu texto, diferenciando-o do componente Memo. Possui todas a propriedades do memo. Propriedades Descrio HideScrollBar Somente exibe as barras de rolagem quando necessrio HideSelection Indica se o texto continuara com a indicao de selecionado mesmo que o componente perca o foco SelAttributes Formatao do Texto selecionado. Color - Cor dos caracteres Name - Nome da fonte usada Size - Tamanho da Fonte Style - Estilo da Fonte [fsBold,fsItalic, fsUnderline,fsStrikeout] TrackBar - Componente utilizado para seleo de valores inteiros dentro de uma faixa Propriedades Orientation Min Max Position TickStyle TickMarks PageSize LineSize SelStart SelEnd Descrio Orientao vertical ou horizontal valor mnimo valor mximo Posio corrente Estilo de exibio das marcaes Aparncia do indicador Determina o incremento que deve ser dado quando as teclas PgUp e PgDn forem pressionadas Determina o incremento que deve ser dado quando as setas forem pressionadas Posio de inicio do preenchimento Posio de trmino do preenchimento 192

ProgressBar - Componente para indicar visualmente o andamento da execuo de tarefas Propriedades Min Max Step Position Mtodos StepIt StepBy Descrio valor mnimo valor mximo incremento que deve ser dado a propriedade position em cada mudana Posio corrente Descrio Incrementa Position de Step unidades Incrementa Position de n unidades

UpDown - Utilizado normalmente associado a outro componente para realizar incremento em dados numricos Propriedades Descrio Associate Indica o componente associado AlignButton Indica o alinhamento do UpDown em relao ao componente associado (udLeft, udRight) Min Valor mnimo Max Valor mximo Orientation Orientao do componente (UdHorizontal, udVertical) Wrap Salto do valor mnimo para o mximo e vice-versa Increment Incremento dado ao componente associado ArrowKeys Indica que o componente recebe os incrementos das teclas de SETAS Positon Valor corrente Thousands Indica se ir aparecer o separdor de milhar Wrap Salto altomtico de Max para Min e vice-versa HotKey - Obtm em tempo de execuo teclas de atalho e podem ser utilizadas para definir as teclas de atalho para outros componentes quem tenham a propriedade ShortCut Propriedades Descrio HotKey Combinao de teclas para a HotKey InvalidKeys Especifica as teclas invlidas para modificadores [hcNone , hcShift, hcCtrl, hcAlt, hcShiftCtrl, hcShiftAlt, hcCtrlAlt, hcShiftCtrlAlt] Modifiers Teclas modifocadoras [hkShift, hkCtrl, hkAlt, hkExt] Animate Componente capaz de exibir um AVI, o qual representa um formato de arquivo multimdia com imagens e sons, mas este componente apenas exibe as imagens. Propriedades Descrio Active Indica se a animao esta sendo exibida ou no AutoSize Ajusta automaticamente o tamanho do componente ao tamanho da imagem Center Centraliza a animao FileName Nome do arquivo AVi 193

FrameCount Repetitions

Nmero de Frames da animao Nmero de repeties quando a animao for executada. O valor zero indica repeties indefinidas

DateTimePicket Componente que permite a seleo visual de uma datas ou horas Propriedades Time Date DateMode DateFormat Kind ShowCheckbox Check Descrio Hora selecionada Data Selecionada A forma como a data poder ser selecionada [dmComboBox, dmUpDown] Formato da Data [dfShort, dfLong] Seleciona o componente para Data ou Hora [dtkDate, dtkTime] Exibe um CheckBox Indica se o CheckBox esta selecionado

TreeView - Permite exibio de dados em forma hierrquica. Este componente possui mtodos e eventos que permitem controle e modificao da sua estrutura em tempo de execuo. Propriedades Descrio Items Define os itens da hierarquia. Ident Recuo dos sus-itens ShowLines Determina se haver uma linha ligando os sub-itens ShowRoot Determina se haver uma linha ligando os itens razes ShowButtons Indica se o boto a esquerda do item ser visvel HideSelect Indica se quando o componente perder o foco a seleo continuar ativa SortedType nsNone no ordenado nsData os itens so ordenados quando os dados so alterados nsText os itens so ordenados quando o Caption alterado. nsBoth a ordenao e feita em ambos os casos Selected Item selecionado. Podemos acessar o contedo selecionado atravs de Select.Text;

ListView - Componente que permite exibir de vrias maneiras uma lista de itens. Propriedades ViewStyle Descrio Determina se os itens devem ser apresentados em colunas com cabealhos e sub-itens, verticalmente ou horizontalmente, com cones grandes ou pequenos Lista de Imagens (TImagesList) contendo a bitmaps a serem exibidos e somente usada quando a propriedade ViewStyle vsIcon Lista de Imagens (TImagesList) contendo a bitmaps a serem 194

LargeImages

SmallImages

Items Columns ShowColumnHeaders ColumnClick IconOptions

SortedType

Selected

exibidos e somente usada quando a propriedade ViewStyle vsSmallIcon Items a serem exibidos Cabealhos das colunas da Lista Exibe os cabealhos das colunas Indica se os cabealhos das colunas tero a aparncia de botes Opes de exibio dos cones quando ViewStyle for vsIcon ou vsSmallIcons Arrangement alinhado no topo ou esquerda do ListView AutoArrange os cones so alinhados automaticamente WrapText a propriedade caption ser quebrada nsNone no ordenado nsData os itens so ordenados dados so alterados nsText os itens so ordenados quando o Caption alterada. nsBoth a ordenao e feita em ambos os casos Item selecionado. Podemos acessar o contedo selecionado atravs de Select.Captiont;

HeaderControl - Utilizado para exibir barra de ttulos ajustveis e cabealhos. Podemos abrir o editor de sees atravs do boto direito do mouse. Propriedades Descrio Sections[n] Cabealhos do componente, possuindo as seguintes propriedades : Text, With, Min, Max, Style, Alignment, AllowClick e Index. Onde uma seo em particular pode ser acessada atravs do seu ndice HotTrack Diferencia o cabelho quando o mouse esta sobre este Eventos Descrio OnSectionClick Clique sobre uma seo OnSectionResize A seo tem seu tamanho alterado

StatusBar - Utilizado para criar barra de Status para exibir informaes sobre a aplicao. Podemos abrir o editor de paines atravs do boto direito do mose Propriedades Descrio SimplePanel Indica se o StatusBar possuir um ou vrios panels SimpleText Texto exibido caso SimplePanel igual a TRUE SizeGrip Indicador de tamanho padro do Windows Panels Painis do StatusBar, cada panel permite a exibio de informao. Os painis so acessados como elementos de um vetor (Panels[n]) e possuem as seguintes propriedades : Text, Width, Style, Bevel, Alignment ToolBar Componete utilizado para criar barras de ferramentas. Para adicionar botes e sepradores usamos o boto direito do mouse. Este um componente container e podemos colocar outros componentes no seu interior, os quais sero automaticamente alinhados. Cada boto adicionado possui as seguinte propriedades :

195

ImageIndex, Style[tbsButton, tbsCheck, tbsDivide, tbsDropDown, tbsSeparator] e Indeterminate Propriedades Descrio Flat Os botes ficam tero a aparncia do Office 97 Images Componente ImageList que conter as figuras dos botes Buttons[n] Acessa os botes atravs do ndice n CoolBar Componete utilizado para criar barras de ferramentas que podem ser arrastadas e reposicionadas. Podemos editar as faixas atravs do boto direito do mouse. Propriedades Descrio Bands Armazenas as Faixas (Cool bands) BandBorderStyle Indica o estilo da borda entre os CollBands BitMap BitMap exibindo no fundo do componente FixedOrder Indica se o usurio poder modificar a ordem dos CollBands FixedSize Indica se o usurio poder modificar o tamanho dos CollBands ShowText Indica se o valor da propriedade Text de cada TollBand ser exibido ao lado de sua faixa Vertical Indica se os CollBand sero verticais Images Coleo de desenhos exibidos ao lado de cada CoollBand

Dilogos Comuns
Grupo de caixas de dilogo comuns a muitos programas. Parte integrante do Windows, so atualizadas com a atualizao do Windows. Necessitam pouca ou nenhuma programao para serem utilizadas. Facilitam a padronizao em tarefas comuns. Depois de serem executados os Dilogos Comuns armazenam em suas propriedades as escolhas do usurio. Mtodo Descrio Execute Ativa a caixa de dilogo e retorna True caso o dialogo comum seja encerrado com o boto OK.

OpenDialog, SaveDialog, OpenPictureDialog e SavePictureDialog - Caixas de dilogo para abrir e salvar arquivo Propriedades Descrio FileName Nome do arquivo DefaultExt Extenso padro para os arquivos Filter Define os tipos de arquivos que podem ser abertos ou salvos FilterIndex Nmero do filtro default InitialDir Diretrio inicial Title Ttulo da janela Options Define caractersticas da janela de abrir ou salvar FontDialog - Caixa de dilogo de escolha de fonte. Propriedades Descrio Device Define se deve utilizar fontes para tela, impressora ou ambos MinFontSize Tamanho mnimo da fonte MaxFontSize Tamanho mximo da fonte Options Define caractersticas das fontes 196

Evento OnApply

Descrio Ocorre aps o usurio pressionar o boto apply e antes da janela fechar

ColorDialog - Caixa de dilogo para escolha de cor. Propriedades Descrio Options Define caractersticas da caixa de dilogo PrintDialog - Caixa de dilogo de impresso. Propriedades Descrio Copies Nmero de cpias inicial PrintToFile Define se a impresso ser direcionada para arquivo PrintRange Faixa de pginas a ser impressa (todas ou somente o selecionado) FromPage Pgina inicial ToPage Pgina final MinPage Menor nmero de pgina que o usurio pode escolher MaxPage Maior nmero de pgina que o usurio pode escolher Options Define caractersticas da caixa de dilogo PrintSetupDialog - Acessa caixa de dilogo de configurao de impressora. FindDialog e ReplaceDialog - Caixas de dilogo de pesquisa e substituio de texto. Propriedades Descrio FindText Texto a pesquisar ReplaceText Texto a substituir (somente em ReplaceDialog) Options Define caractersticas da caixa de dilogo Evento Descrio OnFind Ocorre aps o usurio pressionar o boto Find Next OnReplace Ocorre Quando o usurio pressiona o boto Replace (em ReplaceDialog) Mtodo Descrio CloseDialog Fecha a caixa de dilogo

MainMenu e PopupMenu - Usado para criao de barras de menus, onde o MainManu representa o Menu suspenso presente nos aplicativos e o PopupMenu represnta o menu instatneo (boto direito do mouse) associado aos componentes atravs da propriedade PopupMenu. Propriedades Descrio Items Itens do menu, utiliza o MenuEditor Eventos Descrio OnPopup Ocorre quando o menu popup ativado MenuEditor - Utilizado para definio dos itens e sub-itens do menu Operaes : Inserir, Deletar e Criar SubItems MenuItem - Item do menu. Propriedades Descrio

197

Caption Checked Visible Enabled ShortCut Break GroupIndex RadioItem Eventos OnClick

Texto do item Se o item esta marcado ou no Se o item esta visvel ou no Se o item esta ativado ou desativado Tecla de atalho Indica quebra de coluna Indica que o item do menu pertence a um grupo Indica que o item de menu funcionra como um Radio, ou seja, dentro do mesmo grupo apenas um item estr selecionado. Descrio Quando o item de menu selecionado, usado para executar a funo do item

198

DICAS
CRIAR UM HOTLINK
Podemos criar um link para a Internet dentro do Delphi atravs da funo ShellExecute. Supondo que a propriedade Caption de um label seja um endereo web vlido (http://www.fulanodetal.com.br) podemos inserir em seu evento OnClick o seguinte cdigo:
ShellExecute(Handle, 'open', pchar(Label1.Caption), nil, '',SW_SHOWNORMAL);

necessrio incluir a biblioteca ShellAPI na clusula uses da Inteface.

ENVIAR UM MAIL
Podemos utilizar a funo ShellExecute para abrir o programa de mail do usurio e preparar seu envio.
ShellExecute(Handle, open, mailto:fulano@provedor.com.br, nil, ,SW_SHOWNORMAL);

Caso queira colocar um subject padro na construo do e-mail utilize a palavra subject da seguinte forma:
ShellExecute(Handle, open, mailto:fulano@provedor.com.br ?subject=Pergunta, nil, ,SW_SHOWNORMAL);

necessrio incluir a biblioteca ShellAPI na clusula uses da Inteface.

EXECUTANDO UM PROGRAMA DE ACORDO COM A EXTENSO DE UM ARQUIVO


ShellExecute um funo API comparada a um canivete suio, vamos utiliz-la novamente para chamar um programa atravs da extenso do arquivo passado como parmetro. Os parmetros de ShellExecute so 6: Um manipulador de janela, que o pai do processo disparado. Uma ao a executar, que pode ser open, para abrir, print, para imprimir, ou explore, para abrir uma janela do Explorer no diretrio desejado. Um ponteiro (tipo Pchar em Delphi) para o nome do programa ou diretrio. Parmetros para a aplicao. Diretrio inicial. Modo de abertura do programa Exemplo:
ShellExecute(Handle, open, exemplo.doc, nil, nil, SW_SHOWNORMAL);

necessrio incluir a biblioteca ShellAPI na clusula uses da Inteface.

COMO SABER QUAL BIBLIOTECA INSERIR NA USES?

199

Quando o Delphi no declarar automaticamente determinada classa na sesso uses, um erro dever ocorrer no processo de compilao. O nome do parmetro ou funo dever estar em evidencia no rodap do Code Editor em uma janela chamada Message View. Clique em Search | Browse Symbol e digite a palavra procurada, a unit onde ela se encontra dever aparecer. Digite este nome na clusula uses. Ou, pode-se para o cursor (piscando) na palavra e teclar F1, o help tambm exibe a unit.

DATAS
As datas so um tipo de dados TDateTime, internamente so armazenadas como nmeros de ponto flutuante (Double). A parte inteira indica a data, em nmero de dias, contados a partir de 30/12/1899 e a fracionria, as horas. Pelo fato de serem armazenadas como Double, pode-se subtrair, somar e estabelecer comparaes. Por exemplo:
var DataIni, DataFim : TDateTime; Dif : Single; begin Dif := DataFim DataIni; //diferena em dias entre as datas DataIni := DataIni+10; //acrescenta + 10 dias na data end;

Para saber a hora de determinada data, multiplica-se a parte fracionria por 24:
Frac(DataIni) * 24;

Podemos ainda comparar as datas com os operadores < e >. Caso no seja necessrio a comparao com a hora, basta converter a data para um inteiro e efetuar a comparao:
if Trunc(Data1) < Trunc(Data2) then

A formatao de data pode ser feita atravs da funo FormatDateTime.


function FormatDateTime(const Format: string; DateTime: TDateTime): string;

Exemplo:
Label1.Caption := FormatDateTime('dddd, d "de" mmmm "de" yyyy', date);

SAIR DE UMA APLICAO


O Delphi fornece diferentes mtodos para sair de uma aplicao. O ideal utilizar o mtodo Close. Porm, h casos em que Close no atenderia necessidade do desenvolvedor, nestes casos pode-se chamar Halt ou Application.Terminate. Halt um procedimento do Pascal e provoca o trmino da aplicao, no se importando com arquivos abertos. J o mtodo Terminate do objeto Application obriga o fechamento de todos os arquivos abertos e a destruio de todas a forms criadas.

REDUZINDO TESTES IF
A expresso:
if A = 10 then B := True

200

else B := False;

Pode ser reduzida a apenas uma linha:


B := A = 10;

A = 10 uma operao boleana, que retorna True se A igual a 10 e False caso contrrio. Neste caso estamos atribuindo varivel B o resultado da comparao, TRUE ou FALSE.

HINTS COM DUAS OU MAIS LINHAS


A object inspector permite Hint com apenas uma linha. Para gerar Hints com mais linhas pode-se em tempo de execuo configurar a propriedade Hint da seguinte forma:
Edit1.Hint := Primeira linha do hint#13segunda linha do hint;

Pode-se tambm em tempo de projeto clicar na form com o boto direito e escolher a opo View as Text, procurar o objeto e a hint desejada e alter-la:
Hint := Primeira linha do hint#13segunda linha do hint;

Para voltar ao Form clique com o boto direito e escolha View as Form.

SUBSTITUIR A TECLA TAB POR ENTER NA MUDANA DE FOCO


Setar a propriedade KeyPreview da Form para True Setar a propriedade Default de todos os botes da Form para False Criar um evento OnKeyPress para a Form como este:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) and not (Activecontrol is TMemo) then begin //desabilita o processamento posterior da tecla key := #0; //simula o envio da tecla tab Perform(WM_NEXTDLGCTL,0,0); end; end;

CONES
O Delphi possui um conjunto de cones e imagens em uma pasta padro:
C:\Arquivos de programas\Arquivos comuns\Borland Shared\Images

EXECUTAR UM PROGRAMA
Para executar um programa use a API WinExec.

201

WinExec(calc.exe, SW_SHOWNORMAL);

LINKS
Alguns links interessantes:

Nacionais
http://www.clubedelphi.com.br/ http://www.marcosferreira.eti.br/oraculo.htm http://www.delphibahia.eti.br/ http://www.drdelphi.com.br http://www.inprise.com.br/

Internacionais
http://www.marcocantu.com/ http://www.drbob42.com/home.htm http://www.delphi3000.com/ http://homepages.borland.com/torry/ http://delphi.about.com/compute/delphi/ http://delphi.icm.edu.pl/

VIRTUAL KEYS
Para manipular teclas diversas, pode-se utilizar os eventos OnKeyDown ou OnKeyUp testando o valor do parmetro Key que representa a tecla pressionada. Para gerar um evento global, configure a propriedade KeyPreview do Form para True e no manipulador de eventos (do form), crie o seguinte cdigo:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_F2: ShowMessage('F2'); VK_F3: ShowMessage('F3'); end; end;

Obviamente, no exemplo acima deve-se trocar ShowMessage pelo comando desejado. Os valores possveis para teclas virtuais esto listadas abaixo. Estas constantes esto na unit Windows.

202

{ Virtual Keys, Standard Set } {$EXTERNALSYM VK_LBUTTON} VK_LBUTTON = 1; {$EXTERNALSYM VK_RBUTTON} VK_RBUTTON = 2; {$EXTERNALSYM VK_CANCEL} VK_CANCEL = 3; {$EXTERNALSYM VK_MBUTTON} VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON } {$EXTERNALSYM VK_BACK} VK_BACK = 8; {$EXTERNALSYM VK_TAB} VK_TAB = 9; {$EXTERNALSYM VK_CLEAR} VK_CLEAR = 12; {$EXTERNALSYM VK_RETURN} VK_RETURN = 13; {$EXTERNALSYM VK_SHIFT} VK_SHIFT = $10; {$EXTERNALSYM VK_CONTROL} VK_CONTROL = 17; {$EXTERNALSYM VK_MENU} VK_MENU = 18; {$EXTERNALSYM VK_PAUSE} VK_PAUSE = 19; {$EXTERNALSYM VK_CAPITAL} VK_CAPITAL = 20; {$EXTERNALSYM VK_KANA } VK_KANA = 21; {$EXTERNALSYM VK_HANGUL } VK_HANGUL = 21; {$EXTERNALSYM VK_JUNJA } VK_JUNJA = 23; {$EXTERNALSYM VK_FINAL } VK_FINAL = 24; {$EXTERNALSYM VK_HANJA } VK_HANJA = 25; {$EXTERNALSYM VK_KANJI } VK_KANJI = 25; {$EXTERNALSYM VK_CONVERT } VK_CONVERT = 28; {$EXTERNALSYM VK_NONCONVERT } VK_NONCONVERT = 29; {$EXTERNALSYM VK_ACCEPT } VK_ACCEPT = 30; {$EXTERNALSYM VK_MODECHANGE } VK_MODECHANGE = 31; {$EXTERNALSYM VK_ESCAPE} VK_ESCAPE = 27; {$EXTERNALSYM VK_SPACE} VK_SPACE = $20; {$EXTERNALSYM VK_PRIOR} VK_PRIOR = 33; {$EXTERNALSYM VK_NEXT} VK_NEXT = 34; {$EXTERNALSYM VK_END}

VK_END = 35; {$EXTERNALSYM VK_HOME} VK_HOME = 36; {$EXTERNALSYM VK_LEFT} VK_LEFT = 37; {$EXTERNALSYM VK_UP} VK_UP = 38; {$EXTERNALSYM VK_RIGHT} VK_RIGHT = 39; {$EXTERNALSYM VK_DOWN} VK_DOWN = 40; {$EXTERNALSYM VK_SELECT} VK_SELECT = 41; {$EXTERNALSYM VK_PRINT} VK_PRINT = 42; {$EXTERNALSYM VK_EXECUTE} VK_EXECUTE = 43; {$EXTERNALSYM VK_SNAPSHOT} VK_SNAPSHOT = 44; {$EXTERNALSYM VK_INSERT} VK_INSERT = 45; {$EXTERNALSYM VK_DELETE} VK_DELETE = 46; {$EXTERNALSYM VK_HELP} VK_HELP = 47; { VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) } { VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) } {$EXTERNALSYM VK_LWIN} VK_LWIN = 91; {$EXTERNALSYM VK_RWIN} VK_RWIN = 92; {$EXTERNALSYM VK_APPS} VK_APPS = 93; {$EXTERNALSYM VK_NUMPAD0} VK_NUMPAD0 = 96; {$EXTERNALSYM VK_NUMPAD1} VK_NUMPAD1 = 97; {$EXTERNALSYM VK_NUMPAD2} VK_NUMPAD2 = 98; {$EXTERNALSYM VK_NUMPAD3} VK_NUMPAD3 = 99; {$EXTERNALSYM VK_NUMPAD4} VK_NUMPAD4 = 100; {$EXTERNALSYM VK_NUMPAD5} VK_NUMPAD5 = 101; {$EXTERNALSYM VK_NUMPAD6} VK_NUMPAD6 = 102; {$EXTERNALSYM VK_NUMPAD7} VK_NUMPAD7 = 103; {$EXTERNALSYM VK_NUMPAD8} VK_NUMPAD8 = 104; {$EXTERNALSYM VK_NUMPAD9} VK_NUMPAD9 = 105; {$EXTERNALSYM VK_MULTIPLY} VK_MULTIPLY = 106;

203

{$EXTERNALSYM VK_ADD} VK_ADD = 107; {$EXTERNALSYM VK_SEPARATOR} VK_SEPARATOR = 108; {$EXTERNALSYM VK_SUBTRACT} VK_SUBTRACT = 109; {$EXTERNALSYM VK_DECIMAL} VK_DECIMAL = 110; {$EXTERNALSYM VK_DIVIDE} VK_DIVIDE = 111; {$EXTERNALSYM VK_F1} VK_F1 = 112; {$EXTERNALSYM VK_F2} VK_F2 = 113; {$EXTERNALSYM VK_F3} VK_F3 = 114; {$EXTERNALSYM VK_F4} VK_F4 = 115; {$EXTERNALSYM VK_F5} VK_F5 = 116; {$EXTERNALSYM VK_F6} VK_F6 = 117; {$EXTERNALSYM VK_F7} VK_F7 = 118; {$EXTERNALSYM VK_F8} VK_F8 = 119; {$EXTERNALSYM VK_F9} VK_F9 = 120; {$EXTERNALSYM VK_F10} VK_F10 = 121; {$EXTERNALSYM VK_F11} VK_F11 = 122; {$EXTERNALSYM VK_F12} VK_F12 = 123; {$EXTERNALSYM VK_F13} VK_F13 = 124; {$EXTERNALSYM VK_F14} VK_F14 = 125; {$EXTERNALSYM VK_F15} VK_F15 = 126; {$EXTERNALSYM VK_F16} VK_F16 = 127; {$EXTERNALSYM VK_F17} VK_F17 = 128; {$EXTERNALSYM VK_F18} VK_F18 = 129; {$EXTERNALSYM VK_F19} VK_F19 = 130; {$EXTERNALSYM VK_F20} VK_F20 = 131; {$EXTERNALSYM VK_F21} VK_F21 = 132; {$EXTERNALSYM VK_F22} VK_F22 = 133; {$EXTERNALSYM VK_F23} VK_F23 = 134; {$EXTERNALSYM VK_F24}

VK_F24 = 135; {$EXTERNALSYM VK_NUMLOCK} VK_NUMLOCK = 144; {$EXTERNALSYM VK_SCROLL} VK_SCROLL = 145; { VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys. Used only as parameters to GetAsyncKeyState() and GetKeyState(). No other API or message will distinguish left and right keys in this way. } {$EXTERNALSYM VK_LSHIFT} VK_LSHIFT = 160; {$EXTERNALSYM VK_RSHIFT} VK_RSHIFT = 161; {$EXTERNALSYM VK_LCONTROL} VK_LCONTROL = 162; {$EXTERNALSYM VK_RCONTROL} VK_RCONTROL = 163; {$EXTERNALSYM VK_LMENU} VK_LMENU = 164; {$EXTERNALSYM VK_RMENU} VK_RMENU = 165; {$EXTERNALSYM VK_PROCESSKEY} VK_PROCESSKEY = 229; {$EXTERNALSYM VK_ATTN} VK_ATTN = 246; {$EXTERNALSYM VK_CRSEL} VK_CRSEL = 247; {$EXTERNALSYM VK_EXSEL} VK_EXSEL = 248; {$EXTERNALSYM VK_EREOF} VK_EREOF = 249; {$EXTERNALSYM VK_PLAY} VK_PLAY = 250; {$EXTERNALSYM VK_ZOOM} VK_ZOOM = 251; {$EXTERNALSYM VK_NONAME} VK_NONAME = 252; {$EXTERNALSYM VK_PA1} VK_PA1 = 253; {$EXTERNALSYM VK_OEM_CLEAR} VK_OEM_CLEAR = 254;

204

CONFIRMAO DE GRAVAO DE REGISTROS EM PARADOX


O Paradox utiliza um buffer para a gravao dos registros, descarregando-os depois no disco. Para forar a gravao diretamente utilize a API DbiSaveChanges
Table1.Post; DbiSaveChanges(Table1.Handle); necessrio incluir as bibliotecas dbiTypes, dbiProcs na clusula uses da Inteface.

DISPARANDO SONS DO SISTEMA (MULTIMDIA)


Para utilizar os sons do sistema, utilize a funo PlaySound.
PlaySound(pChar('SYSTEMSTART'),0,SND_ASYNC);

Outros sons: SYSTEMSTART SYSTEMEXIT SYSTEMHAND SYSTEMASTERISK SYSTEMQUESTION SYSTEMEXCLAMATION SYSTEMWELCOME SYSTEMDEFAULT necessrio incluir as biblioteca mmsystem na clusula uses da Inteface

LIMITE EM TABELAS PARADOX


Uma tabela em Paradox pode ter problemas acima de aproximadamente 750.000 registros. Com relao ao espao em disco a tabela pode chegar 131 megas. Acima disto, os problemas devem se agravar. Fonte: http://www.undu.com

206

GARANTINDO UMA INSTNCIA DO APLICATIVO


Para que seu aplicativo no seja executado vrias vezes, utilize o seguinte cdigo no arquivo de projeto (DPR). A funo FindWindow procura se h outra tela da classe passada como parmetro, se houver, traz para frente e no cria a aplicao novamente.
program Project1; uses Forms,Windows, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin if FindWindow('TForm1','Form1') <> 0 then SetForegroundWindow(FindWindow('TForm1','Form1')) else begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end.

necessrio incluir a biblioteca windows na clusula uses do arquivo DPR.

PERMITIR APENAS NMEROS EM UM TEDIT


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if ((Key in ['0'..'9'] = False) and (Word(Key) <> VK_BACK)) then Key := #0; end;

Se algum cuida saber alguma coisa, ainda no sabe como convm saber. Ap. Paulo

207

APNDICE
INTRODUO ORIENTAO A OBJETOS
Mais do que popular, a orientao a objetos uma metodologia que ganhou espao no mercado, e ao que tudo indica, veio para ficar. Vamos abordar alguns conceitos importantes para o inicio do estudo da ferramenta Delphi, seria importante que na sua vida profissional voc possa aprofundar-se mais nestes e outros conceitos que pelo enfoque, no sero abordados. Uma referencia bibliogrfica no final da apostila ir ajuda-lo(a) a encontrar mais informaes a respeito. Independente da ferramenta (Delphi, C++Builder, PowerBuilder, entre outras), a orientao a objetos uma teoria da dcada de 70 que veio ser implementada com grande destaque nas ferramentas visuais. Essa tcnica baseada no conceito de classes. Classe um tipo abstrado de dados, ou seja, um novo tipo criado pelo desenvolvedor22 que pode conter mtodos e propriedades. como compararmos um tipo classe com um tipo record. Com o tipo classe possvel implementar um conjunto de recursos OO23, sendo um dos principais chamado herana, que uma poderosa maneira de reaproveitamento de cdigo. Considerando simplesmente a ttulode exemplo vamos criar a classe base TSerVivo com as seguintes caractersticas e tipos de dados: Tamanho : Single Cor : String Forma(Obeso, Magro) : String e que pode possuir as seguintes aes: Alimentar Respirar Um exemplo de herana seria criar as classes TSerHumano e TAnimais como descendente de TSerVivo, desta forma, a classe descendente herda todas as caractersticas e aes criadas na classe ascendente podendo acrescentar particularidades sua estrutura, exemplo:

22 23

Na verdade, vamos trabalhar com classes prontas definidas pelo Delphi. Orientao Objeto

208

TSerHumano Tamanho : Single Cor : String Forma : String Vestimenta : String CorCabelo: String Sexo : Char Alimentar Respirar Falar Caminhar

TAnimais Tamanho : Single Cor : String Forma : String NPatas : Integer Cauda : Boolean Alimentar Respirar EmitirSom

Os objetos so variveis do tipo classe, onde as caractersticas so consideradas propriedades, e as rotinas chamadas pelos objetos24 so denominadas mtodos. As aes disparadas pelo usurio ou pelo sistema no componente sero chamados eventos. Eles so de extrema importncia pois definem quando um conjunto de comandos ser executado. Ainda exemplificando, podemos utilizar as propriedades atribuindo valores de acordo com o tipo de dados definido (no estamos considerando a sintaxe completa em Object Pascal) e utilizar os mtodos apenas chamando o nome da rotina.
Edileumar,Jorgina Cachorro : TSerHumano; : TAnimais;

begin Edileumar.Tamanho := 1.70; Edileumar.Forma := Magro; Edileumar.Sexo := M; Jorgina.Tamanho := 1.60; Jorgina.Sexo := F; Jorgina.CorCabelo := Castanhos; Edileumar.Falar; Jorgina.Caminhar; Cachorro.Tamanho := 0.60; Cachorro.Cauda := True; Cachorro.Alimentar; end;

Observe que as propriedades recebem valores e os mtodos executam rotinas (procedimentos ou funes) sobre o objeto que o invocou. Alguns mtodos podem receber parmetros. O que acontece no Delphi que existe uma gigantesca estrutura de classes onde TObject a classe base das demais classes. Apesar de no ser necessrio manipular este recurso diretamente, importante saber seu funcionamento bsico.

24

Aes disparadas pelo usurio ou sistema sero chamados de eventos.

209

Voc ver as declaraes de classe dentro do Delphi como abaixo, um formulrio com dois componentes (objetos) button e um componente edit ser declarado assim:
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; private { Private declarations } public { Public declarations } end;

Essa introduo vem apenas ilustrar os principais conceitos: Propriedades, eventos e mtodos, sendo amplamente utilizados durante o curso. A herana um recurso importante implementado na OO, no sendo o nico, obviamente. Polimorfismo, encapsulamento entre outros, so conceitos que a principio voc no precisa saber para manipular a ferramenta (Delphi), mas em um futuro prximo ser muito importante.

210

REFERNCIA BIBLIOGRFICA
Dominando o Delphi 2 A Bblia Marco Cant Makron Books, 1996 Dominando o Delphi 5 A Bblia Marco Cant Makron Books, 2000 Delphi 5 Passo a Passo Lite Ncleo Tcnico e Editorial Makron Books Makron Books, 2000 Estudo Dirigido de Delphi 4.0 Jos A. N. G. Manzano, Sandro S. V. Mendes rica, 1998 365 Dicas de Delphi Bruno Sonnino Makron Books

211

Potrebbero piacerti anche