Você está na página 1de 152

CINCIA DA COMPUTAO - DELPHI

APOSTILA : DELPHI

Disciplina : LINGUAGENS E TCNICAS DE PROGRAMAO - III

Curso : Cincia da Computao

UFPR

PROF. : RIX MORATO

ANO 2005
LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.1

CINCIA DA COMPUTAO - DELPHI

NDICE APRESENTAO 1. INTRODUO 2. AMBIENTE INTEGRADO DE DESENVOLVIMENTO DELPHI


2.1 Barra de Menus 2.2 SPEEDBAR 2.3 PALHETA DE COMPONENTES 2.3 O FORMULRIO 2.3.1 Alignment Palette(Palheta de Alinhamento) 2.4 CODE EDITOR 2.5 OBJECT INSPECTOR 2.6 Object TreeView 2.7 PROJECT MANAGER 2.8 CONFIGURAES DO PROJETO 2.9 CONFIGURAES DO AMBIENTE 2.10 IMAGE EDITOR

7 7 7
7 7 8 8 8 9 9 10 10 11 11 12

3. INTRODUO PROGRAMAO 3. INTRODUO PROGRAMAO


3.1 Metodologia de Programao no DELPHI 3.2 Gerenciamento de Projetos 3.2.1 Principais Arquivos de um Projeto Delphi 3.2.2 Normas Usadas para otimizar o desenvolvimento de sistemas 3.3 Primeiro Projeto 3.4 Segundo Projeto

12 13
13 13 13 13 14 15

4. A

LINGUAGEM OBJECT PASCAL

17
17 17 17 18 18

Object Pascal Algumas Observaes Sobre Comandos Comentrios 4.1 Composio de Programas Escritos em OBJECT PASCAL. 4.2 SMBOLOS ESPECIAIS USADOS NA LINGUAGEM.

4.3 TIPOS E DECLARAES DE VARIVEIS


4.3.1 Declarao de Variveis

19
19

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.2

CINCIA DA COMPUTAO - DELPHI


4.3.2 Tipos de Variveis 4.3.3 Vetores / Matrizes 4.3.3.1 Matrizes Comuns 4.3.3.2 Matrizes Dinmicas 4.3.3.3 Matrizes de Strings 4.3.4 Tipo Record - Registros 4.4 Constantes 4.5 Operadores 4.5.1 OPERADORES ARITMTICOS 4.5.2 OPERADORES RELACIONAIS 4.5.3 OPERADORES LGICOS 4.5.4 CONJUNTOS 4.5.5 STRINGS 4.5.6 DATA - HORA 4.5.7 PRIORIDADES NAS EXPRESSES USADAS NO PASCAL. 4.6 Comandos 4.6.1 Comando de Atribuio 4.6.2 Comandos de Deciso 4.6.2.1 Comando IF ... Then ... Else 4.6.2.2 Comando Case 4.6.3 Estruturas de Repetio 4.6.3.1 Comando FOR 4.6.3.2 Comando WHILE 4.6.3.3 Comando Repeat ... Until 4.6.3.4 Comandos Break / Continue ( Desvios dentro da repetio) 4.6.4 Comandos de desvio 4.6.4.1 GOTO 4.6.4.2 EXIT 4.6.5 Comandos para Entrada e Sada de Dados (Padro- Janela DOS) 4.7 Sub-Rotinas Procedures e Functions 4.8 Procedimentos e Funes Predefinidas usuais do Object Pascal 4.8.1 Manipulao de strings 4.8.2 Manipulao Nmerica 4.8.3 MANIPULAO DE TIPOS ESCALARES 4.8.4 Controle de memria 4.8.5 INTERAGINDO COM O SISTEMA OPERACIONAL 4.9 Desenvolvimento de Units 4.10 Mdulos em Object Pascal 4.10.1 Introduo e Objetivos da Modularizao 4.10.2 Tipos de Mdulos 4.10.3 Units e DLLs 4.10.4 Procedures e Functions 4.10.5 Contruo de Units 4.10.6 Contruo de DLLs 20 21 21 22 23 23 25 25 25 25 25 25 26 26 26 27 27 27 27 27 28 28 28 29 29 29 29 30 30 30 31 32 35 40 40 40 42 43 43 44 45 45 46 48

5. UTILIZANDO COMPONENTES
5.1 PGINA STANDARD 5.2 PGINA ADICIONAL 5.3 PGINA WIN32 5.4 PGINA DIALOG

50
50 50 51 51

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.3

CINCIA DA COMPUTAO - DELPHI


5.5 PGINA SYSTEM 5.6 PGINA INTERNET 5.7 Interface Grfica com o Usurio 5.7.1 Projeto de Telas 5.7.2 Objetos usuais para o projeto das Telas 51 52 52 52 52

6. CAIXAS DE MENSAGENS, ENTRADA DE DADOS E DIALOGOS


6.1 Caixas de Mensagem 6.1.1 MESSAGEDLG 6.1.2 MESSAGEDLGPOS 6.1.3 SHOWMESSAGE 6.1.4 SHOWMESSAGEPOS 6.1.5 MESSAGEBOX 6.2 Caixas de Entrada de Dados 6.2.1 INPUBOX 6.2.2 INPUQUERY 6.3 Caixas de Dilogo

70
70 70 71 71 71 71 72 72 72 73

7. PROJETANDO BARRAS DE MENUS


7.1 Exemplo de Projeto da Barra de Menu em uma aplicao 7.2 Definindo ShortCuts (Atalhos para os itens do Menu) 7.3 Construindo Sub-Menus 7.4 Removendo e Reposicionando opes de Menu

73
73 76 77 77

8. MENU POP-PUP
8.1 Exemplo de Projeto usando Popup Menu

77
77

9. EXPLORANDO O OBJECT INSPECTOR


9.1 Eventos 9.2 Propriedades

80
80 81

10. FORMULRIOS MDI E SDI ( MULTIPLE E SINGLE DOCTO INTERFACE)


10.1 Formulrio SDI Single Document Interface 10.2 Formulrio MDI Multiple Document Interface

81
81 83

11. UTILIZANDO A REA DE TRANSFERNCIA


11.1 Objetivo 11.2 Manipulando Textos 11.3 Manipulando Figuras

84
84 84 85

12. ENTRADA, SADA E IMPRESSO


12.1 Arquivos de Texto Exemplo de um Editor de Textos Simples

87
87 87

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.4

CINCIA DA COMPUTAO - DELPHI


12.1.1 Arquivos de Inicializao O Objeto TInifile Criando um Arquivo de Configurao Lendo o Arquivo de Configurao Modificando um Arquivo .INI Outras Operaes com Arquivos .INI Manipulao de Arquivos 12.2 Arquivos Binrios 12.2.1 Arquivos com Tipo Exemplo de Projeto Cadastro de Clientes 12.2.2 Arquivos sem Tipo Exemplo de Projeto de Troca de espaos por vrgulas em arquivos sem tipo 12.3 Impresso 12.3.1 Impresso Bsica com Pascal 12.3.2 Impresso com objeto Tprinter Exemplo de projeto para Imprimir um Arquivo Texto via objeto Printer 89 89 89 90 90 91 91 91 91 92 101 101 102 103 103 103

13. APLICAES DE BANCO DE DADOS


13.1 Objetivo 13.2 Borland Database Engine (BDE) 13.3 Pgina DataAccess e BDE 13.4 Pgina DataControls 13.5 Modelo de Acesso a Banco de Dados 13.6 DataSource 13.7 Componente Table 13.7 Desenvolvendo uma aplicao com o componente Table 13.8 Componente Query 13.8.1 Fundamentos do componente Query 13.8.2 SQL - Structured Query Language 13.9 Desenvolvendo uma aplicao com o componente Query 13.10 Desenvolvendo a navegao entre registros. 13.11 Dbnavigator 13.12 Campos Calculados 13.13 Pesquisa de Registros 13.14 Pesquisa com Intervalos 13.15 DBLOOKUP COMBO BOX 13.16 QUERIES PARAMETRIZADAS

106
106 106 106 107 107 108 108 109 111 111 112 119 120 123 124 126 127 128 130

14. QUICK REPORT


Construindo uma caixa de configurao de relatrios Construindo um Relatrio Rpido Explorando o componente QRBAND Explorando o Componente QRDBText

132
132 133 135 136

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.5

CINCIA DA COMPUTAO - DELPHI 15. PROGRAMAO ORIENTADA A OBJETOS


Objetivo Classes, Objetos e Mtodos Evento e sua relao com Classes Propriedades e sua relao com as Classes Herana Encapsulamento Exemplo da Construo uma Classe

136
136 136 137 137 137 137 138

16. ANEXO: CLASSES E COMPONENTES 17. ANEXO : FUNES DE DATA/HORA, STRINGS,FORMATAO E CONVERSO DE TIPOS 17. ANEXO : TECLAS DE ATALHO PARA TRABALHAR MAIS RPIDO DURANTE O DESENHO E A CODIFICAO BIBLIOGRAFIA

141

149

151 152

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.6

CINCIA DA COMPUTAO - DELPHI

Apresentao
Esta apostila destinada as pessoas que desejam obter conhecimentos bsicos da linguagem de programao orientada a eventos e a objetos DELPHI. Os assuntos so abordados de forma sinttica, procurando a medida do possvel apresent-los com clareza e simplicidade. Todas as criticas e sugestes sero bem recebidas no intudo de aprimorar este trabalho.

1. INTRODUO
A linguagem PASCAL ( nome dado em homenagem ao matemtico BLAISE PASCAL) foi criada em 1968 por Niklaus Wirth, do Institut fur Informatik de Zurich, tem como principais caractersticas: Ser uma linguagem adequada ao ensino de programao, isto , estruturada, bem organizada e compreensvel. Permitir uma implementao confivel e eficiente em grandes computadores ou em pequenos computadores. Simplicidade, incluindo os avanos da cincia de computao atingidos na poca. Baseada no ALGOL 60, de modo a criar bons hbitos de programao.

Em 1.983 a software house americana Borland International lanou o Turbo Pascal para microcomputadores. O turbo Pascal consegue em um ambiente, colocar um editor de textos, bastante parecido com o Wordstar e um compilador de um passo bastante veloz, com a desvantagem de que apenas um erro localizado pr vez, e tambm oferece facilidades para a depurao de programas e programao orientada o objetos. O Delphi uma linguagem de programao orientada a eventos e a objetos (OBJECT PASCAL), criada pela BORLAND, voltada para o ambiente Windows 95/98, NT, com capacidade para gerar aplicaes em arquitetura Cliente/Servidor ou Local. O Delphi baseia-se na programao visual onde o programador utiliza-se de diversos cones para recriar todos os objetos presentes na tela do Windows, tais como: Botes de Presso, Pop-Ups, Caixas de Listagem, Botes de Rdio, etc; o que facilita a utilizao dos programas para os usurios dos programas at mesmo para os iniciantes. Alm de todas facilidades que esta linguagem apresenta, vale dizer, que ela herda muitos recursos e estruturas prprias do Turbo Pascal, o que torna o Delphi uma linguagem extremamente prtica e clara. Todas as regras para a estruturao do cdigo dos programas foram recriadas semelhana do Turbo Pascal, tornando os programas muito organizados e fceis de ler e entender. Podemos arriscar a dizer que ao mesmo tempo em que o Delphi marca o retorno da Borland ao segmento das linguagens de programao , representando de certa forma a retomada e evoluo do excelente Turbo Pascal. O Delphi uma linguagem de programao que permite compilao e linkedio de suas aplicaes, gerando um arquivo executvel (EXE) real, dispensando o uso de RunTime.

2. AMBIENTE INTEGRADO DE DESENVOLVIMENTO DELPHI


Os principais recursos do ambiente de programao Delphi so: a Barra de Menus, Speedbar, a Palheta de Componentes, o Project Maneger, o Formulrio, a Janela Code Editor, Object TreeView, as caixas de configurao do ambiente e do projeto e o Image Editor.

2.1 Barra de Menus

Atravs da barra de menu o usurio ter acesso a todos os recursos do Delphi. Os menus seguem at certo ponto a padronizao do Windows. Com isto queremos dizer que, dentro do menu File (Arquivo), voc encontrar opes para Abrir, Salvar e Fechar arquivos, etc; portanto de forma semelhante aos demais programas voltados para Windows. Alm disso, caso voc queira acessar aos menus do Delphi atravs do teclado, dever pressionar a tecla ALT seguido de F . Caso Voc precise de qualquer ajuda adicional, clique no menu Help/Help Topics.

2.2 SPEEDBAR LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.7

CINCIA DA COMPUTAO - DELPHI

A Speedbar contm cones que foram considerados como de uso comum, justamente para que os programadores Delphi no precisem acessar constantemente barra de menus. Em caso de dvida sobre a funo de qualquer cone na tela do Delphi, basta mover o mouse sobre o cone que surgir um texto descritivo. Todo item da Speedbar possui uma tecla de atalho correspondente, portanto, se voce j tiver o costume de utilizar de teclas de atalho poder dispensar o uso do mouse.

2.3 PALHETA DE COMPONENTES

Est a principal barra de ferramentas do Delphi. Atravs dela voc tem acesso a todos os recursos que permitiro construir visualmente a sua aplicao. Na pgina Standard, por exemplo, voc tem acesso a objetos como: caixas de textos, combos, botes de rdio, caixas de verificao, campos de textos, e muito mais. Para utilizar qualquer um destes objetos basta selecionlo com o mouse e arrast-lo para o formulrio de sua aplicao.

2.3 O FORMULRIO

O Formulrio o ponto central de qualquer aplicao Delphi e constitui a rea de programao e a tela da aplicao em desenvolvimento. O formulrio equivalente s janelas dos programas Windows. A partir de um formulrio voc constri a janela da sua aplicao. Nesta janela voc deve posicionar os componentes ou objetos desejados (Combos, Caixas de listagem, etc) e escrever os cdigos associados aos eventos selecionados dos componentes. Tudo o que colocado e realizado para o formulrio, fica gravado num arquivo (.DFM) anexado ao projeto da aplicao. Embora este arquivo esteja em formato binrio, possvel abr-lo no Delphi e ler o seu contedo.

2.3.1 Alignment Palette(Palheta de Alinhamento)

Centraliza Alinhamento horizontal horizontalmente na janela Alinha para o canto esquerdo Alinha para cima

Espaos iguais na horizontal Alinha para o canto direito Alinha para baixo

Alinha Centralizando na vertical

Centraliza verticalmente Espaos iguais na vertical na janela

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.8

CINCIA DA COMPUTAO - DELPHI 2.4 CODE EDITOR

A janela Code Editor propriamente o lugar onde o cdigo do programa, ser escrito. O cdigo dos eventos, definidos no formulrio atravs dos mais variados componentes, ser necessrio para fazer com que o Delphi responda as aes do usurio. Em outras palavras quando o usurio clicar sobre um boto do formulrio, os comandos executados sero escritos no Code Editor. O cdigo escrito em Pascal, ou seja o programa, ser gravado num arquivo com extenso (.PAS) que ser designado UNIT. Estes arquivos so armazenados no padro ASCII podendo ser acessados atravs de qualquer editor de textos no Windows. bom saber que nem tudo o que estiver escrito na UNIT ser por iniciativa prpria do usurio. O Delphi nos auxilia escrevendo sozinho a maior parte do cdigo e insere nos lugares certos aqueles comandos que o programador deseja acrescentar.

2.5 OBJECT INSPECTOR

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.9

CINCIA DA COMPUTAO - DELPHI


Atravs desta importantssima janela auxiliar o Delphi permite que voc altere certos atributos dos componentes e dos formulrios usados na aplicao. Alguns dos atributos ou propriedades poderiam ser: a cor do texto, a cor do fundo, o tipo de letra, etc. (PROPRIEDADES) Alm disso atravs do Object Inspector que podemos programar o que dever acontecer quando o usurio da aplicao clicar sobre um boto , selecionar uma opo no formulrio, etc. (EVENTOS).

2.6 Object TreeView

O Object TreeView uma forma alternativa para visualizao e seleo dos componentes de um Form. Os Componentes so apresentados numa rvore de acordo com o agrupamento lgico entre eles. O Object Treeview, o Form Designer e o Object Inspector trabalham de forma sincronizada, de modo que quando um componente selecionado em uma dessas janelas, a mesma seleo exibida nas outras duas.

2.7 PROJECT MANAGER

Uma vez que muito comum termos vrios Fomulrios e Units numa nica aplicao e compartilharmos cdigos, o Delphi organiza todos num nico arquivos, extenso (.DPR) chamado PROJETO. Mais tarde o projeto ser transformado no arquivo executvel responsvel pelo funcionamento de toda a sua aplicao. Um projeto formado pela interface visual (formulrio) juntamente com o cdigo (Unit) que ativa a interface. Cada projeto pode ter vrios formulrios permitindo a construo de aplicaes com vrias janelas.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.10

CINCIA DA COMPUTAO - DELPHI


As UNITS podem ser armazenadas separadamente e adicionadas ou retiradas do projeto conforme necessrio. No entanto, se for retirado ou adicionado qualquer formulrio, sua Unit o acompanhar. Sempre que voc modificar qualquer formulrio ou unit, poder escolher a opo Save All no menu File. Com isto poupar o trabalho de salvar cada formulrio ou unit alterada separadamente. Cada projeto ser formado pelo conjunto dos arquivos DFM e PAS que podem ser visualizados e manipulados atravs do comando View/Project Manager.

2.8 CONFIGURAES DO PROJETO

O ambiente de desenvolvimento do Delphi permite que sejam feitas algumas configuraes relativas a cada projeto. Dentre estas opes podemos destacar a criao automtica dos formulrios do projeto, definio do ttulo e do cone da aplicao, os mtodos de compilao e linkedio, etc. Normalmente as opes padro so as mais recomendveis para a maioria das aplicaes. Para visualizar a caixa de dilogo de configuraes clique em Project/Options. Logo abaixo, veja as descries sintetizadas sobre as funes das principais opes de configurao. Guia Form: permite que sejam definidos os formulrios que sero autocriados durante o incio da execuo da aplicao. A autocriao do formulrio permite que o mesmo seja reconstrudo e exibido na tela. J que cada formulrio autocriado consome recursos do equipamento, comumente apenas o primeiro formulrio (Principal) definido como autocriado. Guia Application: possibilita a definio do ttulo e do cone da aplicao quando na forma de um arquivo executvel no Windows. Guia Compiler: permite o ajuste de diretivas de compilao e depurao de erros, bem como ajustes na maneira como sero detectados erros em tempo de execuo. Guia Linker: permite a configurao do uso da memria e a definio dos arquivos de sada contendo o mapeamento da memria. Guia Diretories/Condicional: permite a definio do diretrio de sada para o executvel da aplicao e do diretrio de procura para os arquivo fontes. Guia Version Info: quando a Version Info includa, se o usurio clicar com o boto direito do mouse no cone do programa e selecionar a opo Properties (Propriedades) as informaes fornecidas sero mostradas. Guia Packages: especifica Design-time packages utilizados para instalar componentes na interface do ambiente de desenvolvimento do Delphi e para criar propriedades especiais para personalizar componentes.

2.9 CONFIGURAES DO AMBIENTE


Atravs da caixa de dilogo de configuraes do ambiente, disponvel no menu Tools/Options, pode-se de um modo geral, controlar funes de depurao, compilao, gravao automtica do projeto, cor e tipo da letra nos cdigos dos programas, aparncia dos formulrios, etc. Logo abaixo, veja as descries sintetizadas sobre as funes das principais opes de configurao.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.11

CINCIA DA COMPUTAO - DELPHI


Guia Preferences: permite o ajuste das opes mais comuns do ambiente Delphi, tais como as de autogravao do projeto e layout de tela, as de definio de aparncia e funcionamento do formulrio no que concerne ao Grid. Guia Editor: permite a configurao do uso da tecla TAB e BACKSPACE para indentaes, do limite da memria para operaes de Undo, do destaque automtico de palavras reservadas no cdigo fonte dos programas, etc. Guia Colors: permite a configurao do sistema de cores para o cdigo fonte dos programas. A ttulo de exemplo, possvel colorir de vermelho todas as palavras reservadas da linguagem e de azul todo o restante do texto.

2.10 IMAGE EDITOR


o Image Editor um software acessvel pelo menu Tool/Image Editor , sendo fundamental para o programador que deseja criar ou personalizar cones, bitmaps e cursores na sua aplicao.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.12

CINCIA DA COMPUTAO - DELPHI

3. INTRODUO PROGRAMAO
Neste captulo voc ter uma viso geral do funcionamento da programao no Delphi, desde a etapa de elaborao/codificao do projeto, at a compilao e execuo.

3.1 Metodologia de Programao no DELPHI


A maneira de programao no Delphi, bem como nas linguagens para ambiente Windows, tende a ser diferenciada a ponto de termos necessidade de definirmos um roteiro para a elaborao das aplicaes. Veja a seguir um resumo da metodologia de programao: Elaborao da Interface Visual: criao do visual dos formulrios atravs da alocao adequada de objetos (botes de presso, combos, caixas de listagem, botes de rdio, Menu, Barra de Ferramentas, etc). Configurao dos objetos: ajuste dos atributos ou propriedades de cada objeto alocado aplicao atravs do uso da janela Object Inspector/ Properties. Codificao: criao do cdigo do formulrio que ficar armazenado na Unit. Para isto, so selecionados os eventos dos objetos aos quais sero anexados os blocos de cdigos, isto feito atravs da janela Object Inspector/Events. O Delphi automaticamente abre o espao para programao na Janela Code Editor. Teste/Depurao: verificao do correto funcionamento do programa bem como checagem dos erros possveis em tempo de execuo. Nesta etapa o programador dispe de diversos recursos que vo desde as ferramentas para checagem da sintaxe do cdigo, at ferramentas de compilao, linkedio e depurao em tempo de execuo. Gerao do Executvel: depois de cumpridas as etapas precedentes, deve-se gerar o arquivo executvel a partir do projeto desenvolvido. Este arquivo executvel que ser distribudo ao cliente numa etapa final, sendo extremamente rpidos em sua execuo e pequenos em tamanho. Alm do programa executvel, existe tambm a possibilidade da criao de uma DLL a partir do projeto. DLLs so bibliotecas de ligao dinmica, somente se incorporando ao executvel no momento da execuo do mesmo; o que possibilita a utilizao da mesma em diversas aplicaes simultaneamente e por diversas linguagens diferentes.

3.2 Gerenciamento de Projetos 3.2.1 Principais Arquivos de um Projeto Delphi


Arquivo Arquivo de Projeto Unit Extenso .DPR .PAS Descrio Este aquivo criado em tempo de desenvolvimento, o principal fonte do programa onde existe a declarao Program. Units so arquivos fontes em Object Pascal. Existe tres possibilidades de existncia de Units: Forms : Todas Units so criadas automticamente quando um novo formulrio ou Data Module criado. Units Genricas: So units que possuem funes teis em geral. Componentes: So units criadas pelo Delphi quando um novo componente criado. Este arquivo contm a representao binria da aparncia visual do Form.(Delphi Form Module) As Units depois de compiladas recebem a extenso DCU Estes arquivos possuem dados binrios (cone da aplicao, verso,...) e so linkados ao executvel da aplicao Armazena as configuraes especificas do projeto. Cpias de Backup so criadas automticamente para os diversos arquivos que trabalham com o Delphi. um arquivo gerado pela compilao de um projeto do tipo Library. O Arquivo Executvel gerado pela linkedio de todos os arquivos compilados do projeto.

Arquivo de Form Unit Compilada Arquivo de Recursos Arquivo de Opes do Projeto Arquivos de Backup

.DFM .DCU .RES .DOF (DPR) ~DP (PAS) ~PA (DFM) ~DF .DLL .EXE

Dinamic Link Libraries Arquivo Executvel

3.2.2 Normas Usadas para otimizar o desenvolvimento de sistemas


Padronizao de Nomes Nomes de Arquivos do Projeto Ex: Clientes.DPR, CadastroClientes.Pas, ConsultaClientes.Pas, ... , a dica colocar nomes de arquivo que signifiquem algo. Nomes de Objetos Ex.: FrmPrincipal, FrmConfiguracao, EditNome, LabelNome,...

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.13

CINCIA DA COMPUTAO - DELPHI Tabela com sugestes para padronizao de nome de objetos usuais
Objeto Formulrio Caixa de Texto Label Boto de Comando Caixa de Verificao Frame Boto de Opo Caixa de Lista Combo Box Menu Timer Prefixo Form Edit Label Button CheckBox GroupBox RadioGroup ListBox ComboBox Menu Timer Exemplo FormCliente EditNome LabelMensagem ButtonExecutar CheckBox GravaSempre GroupBoxDados RadioGroupEstadoCivil ListBoxCidade ComboBoxBancos MenuAbrir TimerHora

Nomes de Variveis A dica colocar nomes de arquivo que signifiquem algo. Modularizao Modularize seu projeto e procure no misturar funcionalidades diferentes na mesma unit. Diretrios Utilizar um diretrio para cada projeto Delphi.

3.3 Primeiro Projeto


Este primeiro projeto ter o objetivo de familiariz-lo na programao Delphi que se caracteriza por ser orientada a eventos e a objetos. Desenvolveremos um projeto simples, composto de apenas um formulrio. Para iniciar, abra o Delphi, no Windows, clicando em Iniciar / Programas / Delphi. Note que o Delphi j abriu um novo projeto chamado de Project1 composto de uma Unit chamada Unit1 e de um formulrio chamado Form1. Siga os passos abaixo: Acione a janela Object Inspector e na guia Properties, frente da propriedade Name, escreva FrmPrimeiroProjeto. No Form1 criaremos um boto de presso. Para isto v at a palheta de componentes Standard e clique em Button. Leve o mouse at o meio do formulrio e d um clique. Observe que um boto de presso ter sido criado com a legenda Button1. Acione a janela Object Inspector e na guia Properties, frente da propriedade Caption, escreva &Fechar e frente da proriedade Name escreva CmdFechar.

Agora devemos escrever o cdigo que ser executado quando o boto for pressionado. Para isto, selecione a guia Events no Object Inspector e dar um clique duplo sobre o evento OnClick ou clique duplo sobre o boto fechar (apesar de rpido este mtodo mais limitado). Digite o cdigo na figura seguinte. Ele ser o responsvel por fechar o formulrio e finalizar o funcionamento do nosso primeiro projeto quando este estiver sendo executado.

Mtodo Close para fechar o formulrio

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.14

CINCIA DA COMPUTAO - DELPHI


Para executarmos o projeto basta pressionar a tecla F9 ou escolher a opo Run no menu Run. O Delphi ir compilar o projeto e execut-lo. Caso haja algum tipo de erro, ele o apontar no cdigo da Unit.

3.4 Segundo Projeto


O Segundo Projeto uma continuao do primeiro, incluindo alguns novos componentes e novos comandos: Vamos modificar o Formulrio de modo que ele se apresente como na figura a seguir:

O Objetivo deste programa fazer com que o usurio digite o seu primeiro nome e sobrenome nas caixas de edio prprias e clique no boto Mostrar Nome para mostrar o Nome Completo na caixa Nome Completo. Logo a seguir o usurio poder mudar a cor do nome completo atravs dos botes Azul, Vermelho e Verde. Alocar no formulrio os componentes ou objetos via palheta de componentes Standard: 6 Botes de Presso 3 caixas de textos 3 labels Ajustar as Propriedades Name, Caption e Text dos objetos atravs da Janela Object Inspector e guia Properties. Tipo de Componente Boto de Presso Name CmdFechar CmdApagar CmdMostrar CmdAzul CmdVermelho CmdVerde TxtPNome TxtSobreNome TxtNome LblPNome LblSobreNOme LblNome FrmSegundoProjeto Caption / Text &Fechar Apagar Nome Mostrar Nome Azul Vermelho Verde

Caixa de Texto

Label

Formulrio

Digite o primeiro nome Digite o sobre nome Nome Completo Segundo Projeto

Em seguida salve o projeto clicando no menu File/Save All ou Save Project As. Ateno, primeiro o Delphi solicita um nome para a Unit (sugesto: SegundoProjeto) e, depois o nome para o projeto (sugesto: Projeto2). Aps a construo do formulrio, queremos alert-lo para um procedimento da maior importncia no desenvolvimento de qualquer aplicao. Quando voc insere qualquer componente no formulrio, ele recebe um nome interno que utilizado como referncia durante a programao. Acontece que os nomes do Delphi inicialmente sugere no so ideais para uma aplicao com vrios componentes. Da necessrio que voc clique em cada um dos objetos e no Object Inspector, d nomes padronizados e sugestivos aos componentes atravs da propriedade Name. Depois de criada a interface visual e ajustadas as propriedades, vamos adicionar o cdigo necessrio para a execuo do projeto. Para os botes Mostra Nome e Apaga Nome, no evento OnClick:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.15

CINCIA DA COMPUTAO - DELPHI

Ao clicar no boto CmdApagar, o contedo das caixas de edio TxtPNome, TxtSobreNome e TxtNome (Mtodo Clear) sero eliminados liberando espao para uma nova digitao, a cor do texto da caixa TxtNome (Propriedade Color) ser restaurada para preto e o foco ser dirigido para a caixa TxtPNome (Mtodo SetFocus). Ao clicar no boto CmdMostrar, a caixa TxtNome receber como contedo, o contedo das caixas TxtPNome e TxtSobreNome. A referncia ao contedo das caixas feita atravs do uso de uma propriedade chamada Text, encontrada no Object Inspector. Para os botes Azul, Vermelho e Verde, no evento OnClick:

Ao clicar em qualquer um destes trs botes, a cor do nome completo mostrado na caixa Nome Completo ser imediatamente alterada. Este efeito obtido porque atravs das propriedades Font e Color atribuimos uma cor de fonte diferente ao contedo (Text) no TxtNome. Por fim, clique numa rea vazia do formulrio, v pgina Events no Object Inspector e d um clique duplo no evento OnCreate. Queremos que no momento em que o projeto for executado e o formulrio for criado (transformado internamente numa janela Windows), surja uma caixa de dilogo com uma mensagem para o usurio. A caixa de dilogo surgir antes da janela do formulrio. Para isto, digite o cdigo abaixo e execute o projeto:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.16

CINCIA DA COMPUTAO - DELPHI

Com estes dois projetos voc j deve ter percebido que a programao Delphi bastante diferente da programao procedural na qual se baseiam linguagens como o Clipper e o antigo Turbo Pascal. Nelas os cdigos de programao so escritos de cima para baixo e percebe-se claramente o nicio e o fim do programa. A nova filosofia de programao Delphi muda bastante o estilo tradicional ao permitir que a programao deixe de ser de cima para baixo e se concentre apenas nos pontos fundamentais. Voc j observou que nos exemplos descritos anteriormente a maior parte do cdigo foi escrita pelo Delphi, bastando apenas complet-la.

4. A LINGUAGEM OBJECT PASCAL


Agora que voc tem uma idia da aparncia de uma aplicao Delphi, viu como utilizar alguns componentes e escreveu cdigos para manipulao de eventos, voc estar mais a vontade para aprofundar-se no estudo desta nova linguagem de programao do Delphi conhecida como Object Pascal. Assim, alm de ter o contato com conceitos fundamentais como constantes, variveis, estruturas de repetio condicional, tambm comear a entender como trabalhar com a programao orientada a objetos.

Object Pascal
Nunca demais enfatizar que a chave da programao Delphi consiste em reconhecer que ele geralmente processa um cdigo apenas em resposta a eventos. Pense num programa como um conjunto de elementos independentes que acordam apenas em resposta a eventos que forma ensinados a reconhecer. Tambm vale a pena dizer, que mesmo que voc conhea uma linguagem de programao convencional, no tente obrigar seus programas Delphi a se adaptarem s estruturas dela. Caso imponha hbitos antigos de programao enfrentar problemas. No pense num programa Delphi executando seus comandos de cima para baixo.

Algumas Observaes Sobre Comandos


Quando voc digita certos comandos no Delphi ele automaticamente reconhece e negrita as palavras-chave. Alm disto, destaca de maneira bem diferenciada os comentrios ao longo do cdigo. Com exceo do que for escrito entre apstrofes , letras maisculas e espaamentos so ignorados. Sempre aconselhvel apegar-se a um mtodo padronizado de escrita de cdigo. As declaraes de comandos no utilizam linhas numeradas e normalmente cada comando est numa linha prpria. Desde que o comando esteja com a sintaxe correta, voc poder descobr-lo ao longo de vrias linhas; esta tcnica especialmente utilizada com comandos longos, pois as linhas so limitadas em 126 caracteres. Um ponto e vrgula o separador de comandos. Cada comando tem apenas um ponto e vrgula, salvo algumas excees. A declarao END de seu programa tem um ponto porque indica que o programa acabou no havendo mais nenhuma declarao abaixo.

Comentrios
muito comum que seja solicitado ao programador pequenas alteraes no cdigo dos programas. Tais alteraes so muito mais simples de serem feitas quando o programador dispes de meios para lembrar-se de certos comandos. Portanto, os comentrios so sempre teis no cdigo fonte como forma de auxiliar o programador na leitura e na compreenso da finalidade dos comandos no programa.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.17

CINCIA DA COMPUTAO - DELPHI


H duas maneiras de fazer comentrios no Delphi: escrevendo seus comentrios entre chaves {}, ou escrevendo-os entre parntesis e asteriscos (* *). Por exemplo:

4.1 Composio de Programas Escritos em OBJECT PASCAL.


" A arte de programar consiste na arte de organizar e dominar a complexidade " ( Dijkstra ). O programa principal escritos em Pascal so divididos em trs partes: - Cabealho - Declaraes - Comandos PROGRAM <identificador>; USES <biblioteca1>,<biblioteca2>,...; CONST ...; LABEL ...; TYPE ...; VAR ...; PROCEDURE ...; FUNCTION ...; BEGIN comandos; END. . Cabealho do Programa. PROGRAM . rea de Declaraes: . Clusula USES Identifica as bibliotecas (units) usadas programa. . Definio de Constantes ( CONST ) Declara constantes que sero usadas no programa. . Identificao de Rtulos ( LABEL ) Identifica os rtulos que sero referenciados no comando GOTO. . Definio de tipos ( TYPE ) . Declarao de Variveis. ( VAR ) . rea de definies de Procedimentos e Funes PROCEDURE FUNCTION . Comandos BEGIN comandos;... ...... END.

pelo

4.2 SMBOLOS ESPECIAIS USADOS NA LINGUAGEM.


# - Procede um valor inteiro de 0 a 255, representando o caractere correspondente da tabela ASCII. Exemplo: WRITE (#7); { ALARME } $ - Procede um valor hexadecimal. Exemplo: WRITE (LST,$D); { ALIMENTAO DE PAPEL } - Delimitador de constantes alfanumricas. Exemplo: WRITE (RELAO DE ALUNOS APROVADOS);

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.18

CINCIA DA COMPUTAO - DELPHI


()- Modificar a prioridade de operadores aritmticos/lgicos envolver parmetros de subprogramas e valores na rea de declaraes. , - Separar identificadores nos comandos e declaraes. Exemplo : SALDO , MEDIA : REAL; WRITE ( SALDO, MEDIA); .. - Indica um faixa de valores. Exemplo: CASE X of 1..3 : WRITE(1.FAIXA ); 4..8 : WRITE(2.FAIXA ); 9..15: WRITE(3.FAIXA ); END; : - Procede o identificador de tipo das declaraes de variveis, lista de parmetros e definies de funes e comando case.

Exemplo: FUNCTION TESTE ( X:INTEGER ) : INTEGER; := - Atribuio de valores. Exemplo : TOTAL := 0; ; - Delimitador de comandos, termina declaraes, definies e cabealhos. = - Usado como operador relacional, associa tambm tipos ou Exemplos: CONST INDICE = 1.3452; TYPE VET = ARRAY [ 1..50 ] OF INTEGER; [] - Usado na identificao de um elemento em uma matriz e na definio de conjuntos. constantes aos seus identificadores.

Exemplo: IF TECLA IN [ A .. Z ] THEN WRITE (DIGITOU UMA LETRA MAIUSCULA ); ^ - Define um identificador como ponteiro (POINTER), ou indica um caractere de controle. Exemplo: var key : char; begin readln(Key); CASE Key of ^G : writeln('DIGITOU CTRL-G '); ^D,^A : writeln('DIGITOU CTRL-D OU CTRL-A '); End; readln; end. (* *) {} - Usado para envolver comentrios dentro do programa.

4.3 TIPOS E DECLARAES DE VARIVEIS


4.3.1 Declarao de Variveis
Sempre que desenvolvemos nossas aplicaes, surge a necessidade de armazenarmos temporariamente certas informaes. Para isto utilizamos variveis. No Delphi podemos Ter diversos tipos de variveis com caractersticas de armazenamento prprias. Tais variveis devem ser sempre bem definidas antes de tentarmos utiliz-las. Ao definir ou declarar uma varivel, indique seu nome seguido do tipo de informao que deseja que ela armazene. As variveis esto dispostas em cinco grupos: Numricas : Podem ser nmeros inteiros ou reais, formadas pelos dgitos de 0 a 9, sinais + podendo tambm conter o . para determinar a casa decimal. Alfanumricas: Podem ser formadas pr qualquer tipo de caractere da tabela ASCII. Lgicas : Podem assumir apenas dois valores: TRUE para valores verdadeiros ou FALSE para falsos. e -

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.19

CINCIA DA COMPUTAO - DELPHI


Data/Hora: Ponteiros : Podem armazenar data e hora, permitindo um processamento simples de data/hora. Podem armazenar apenas endereos de memria.

O nome da varivel deve ser nico em cada bloco do programa e deve conter at 255 caracteres, podendo ser composto pr letras, nmeros e sublinhado _ , porm serve sempre iniciar com uma letra e no pode ser uma palavra reservada pelo Object Pascal. aconselhvel que defina o nome da varivel de forma que esta ns lembre a funo que ela ter no contexto do programa. Alm disso, o nome de uma varivel no deve conter smbolos especiais (p.e. &%#@!), , nem ser igual ao nome de uma palavra reservada do Object Pascal. O formato de declarao de variveis deve ter a seguinte sintaxe:

VAR
nome_da_varivel [, nome_da_varivel ...] : tipo; Exemplo: Var Nome, SobreNome : String; Idade : Integer; N_Pessoas : Byte; Veja abaixo as palavras reservadas do Object Pascal: And Case Div Except Function Inherited Label Object Program Set To Uses As Class Do Exports Goto Inline Libray Of Property Shl Try Var Asm Const Downto File If Initialization Mod Or Raise Shr Type While Array Constructor Else Finally Implementation Interface Nil Packed Record String Unit With Begin Destructor End For In Is Not Procedure Repeat Then Until xor

4.3.2 Tipos de Variveis Categorias


Lgicos Boolean Inteiros Shortint Byte Smallint Word Integer Cardinal Longint Ponto Flutuante Real Single Double Extended Comp

Tipos

Finalidade
Variveis booleanas que contm True ou False. Valores True ou False. Ocupa 1 byte. Utilizados para trabalhar com nmeros inteiros dispensando o ponto decimal; as operaes com inteiros so muito rpidas. Abrange inteiros entre 128 e 127. Ocupa 1 byte. Abrange inteiros entre o a 255. Ocupa 1 byte. Abrange inteiros entre 32768 a 32767. Ocupa 2 bytes. Abrange inteiros entre 0 a 65535. Ocupa 2 bytes. Abrange inteiros entre -2147483648 a 2147483647. Ocupa 4 bytes. Abrange inteiros entre 0 a 2147483647. Ocupa 4 bytes. Abrange inteiros entre -2147483648 a 2147483647. Ocupa 4 bytes. Destinadas operaes que podem utilizar tanto nmeros inteiros quanto nmeros com casas decimais. Abrange reais entre 2.9x10-39 a 1.7x1038 com 11 a 12 dgitos significativos e ocupa 6 bytes. Abrange reais entre 1.5x10-45 a 3.4x1038 com 7 a 8 dgitos significativos e ocupa 4 bytes. Abrange reais entre 5.0x10-324 a 1.7x10308 com 15 a 16 dgitos significativos e ocupa 8 bytes. Abrange reais entre 3.4x10-4932 a 1.1x104932 com 19 a 20 dgitos significativos e ocupa 10 bytes. Abrange reais entre 9.2x1018 a 9.2x1018 com 19 a 20 dgitos significativos e ocupa 8 bytes. O tipo Comp , na verdade, um grande inteiro e no um real. A razo de estar incluido nesta tabela que ele implementado no mesmo estilo dos tipos de ponto flutuante. Na verdade, trata-se de um inteiro de 64 bits. Tem uma preciso de 4 casas decimais, e armazenado como um inteiro de 64 bits. Usado para manusear valores monetrios. Variveis prprias para armazenar textos ou qualquer outros valores que no devero ser utilizados em operaes matemticas. Armazena apenas caracteres ASCII. Ocupa 1 byte. Comporta 255 caracteres da tabela ASCII.

Currency Caracteres Char ShortString

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.20

CINCIA DA COMPUTAO - DELPHI


String[Tamanho] String AnsiString TDateTime Variant O tipo string e uma seqncia de caracteres com tamanho dinmico variando entre 1 a 255 bytes ou at ~3Gb. Comporta at ~3Gb caracteres da tabela ASCII. Armazena data e hora ocupando 8 bytes. Permite fazer operaes com datas. Flexvel o tipo definido em funo do valor atribuido a varivel, podem ser numrica (inteiro ou ponto flutuante) ou alfanumrica (string).

Data/Hora Variant

Exemplo: VAR INDICE RESP VALOR PALAVRA S_N DIA, MES, ANO QUANTIDADE BYTE; CHAR; REAL; STRING[20]; : BOOLEAN; : WORD; : INTEGER; : : : :

4.3.3 Vetores / Matrizes

4.3.3.1 Matrizes Comuns


Matrizes so tipos especiais de variveis que comportam diversos dados do mesmo tipo. A referncia a cada um deles se d atravs de referncia a ndices. Cada dado de uma matriz possui um ndice exclusivo. Matrizes so declaradas abaixo da clusula Type ou abaixo da clusula Var. Sintaxe: IDENTIFICADOR : ARRAY [ Li .. Ls ] OF <TIPO> ; Li : Limite inferior do ndice. Ls : Limite superior do ndice. Nmero de elementos = Ls - Li + 1. Exemplos: VET +---+---+---+---+---+ | 1 | 2 | 3 | 4 | 5 | +---+---+---+---+---+ VET : ARRAY [ 1..5 ] OF INTEGER; NDICE: . literal ou identificador cujo valor seja um inteiro positivo . deve estar entre colchetes e aps o nome do vetor. Type Alfabeto = array [1..26] of string; { Esta matriz comporta 26 elementos diferentes sendo cada um deles uma varivel do tipo String } Var Numeros : array [1..7] of byte = (10, 20, 30, 40, 50, 60, 70); Meses:array[1..12] of string[3] = ('JAN','FEV','MAR','ABR','MAI','JUN','JUL','AGO','SET','OUT','NOV', 'DEZ'); BiDimensional : array [1..5, 1..3] of integer; VendasPeriodo : array [1995..1999, 1..12] of currency; Atribuio : Meses [3] := MAR; VendasPeriodo [1999, 10] := 15600.00; Exemplo: program Project1; uses Forms; {$R *.RES} var x : array[1..10] of string; i : integer;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.21

CINCIA DA COMPUTAO - DELPHI


begin for i := 1 to 10 do begin write('Texto-',i:2,': ');readln(x[i]); end; for i:=10 downto 1 do begin writeln(x[i]); end; readln; end.

4.3.3.2 Matrizes Dinmicas


O uso de matrizes dinmicas altamente recomendvel no Delphi. E isto se d porque as matrizes possuem tamanho varivel ao invs de fixo, e isto particularmente vantajoso quando se necessita pass-las como parmetros para uma procedure ou function. Veja o exemplo abaixo: program Project1; uses Forms; {$R *.RES} Procedure Armazena (Numeros: array of integer); { Note que o limite no foi especificado } Var I : Integer; Total : Integer; Begin Total := 0; For I := 0 to High (Numeros) do { O comando High fornece o ndice mximo da matriz recebida na procedure } Total := Total + Numeros [I]; Writeln('Somatorio dos elementos do vetor: ',total); Readln; End; // Ao utilizarmos a procedure, teramos no programa: Var Dados : array [1..5] of integer = (12, 56, 78, 34, 77); { Os nmeros entre parntesis so exemplos de um contedo possvel para a matriz Dados } Begin Armazena (Dados); { Armazena a chamada procedure que passa como parmetro todos os valores da matriz } End.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.22

CINCIA DA COMPUTAO - DELPHI

4.3.3.3 Matrizes de Strings


Uma varivel do tipo String tambm pode ser tratada e considerada como uma matriz de at 255 ocorrncias. Isto se d porque cada caractere componente de uma String, pode ser tratado separadamente atravs de referncia a seu ndice. Por exemplo: program VarStr; uses Forms; {$R *.RES} var teste : string; i : byte; begin teste := 'Face / Fumec'; writeln(teste); for i:=1 to length(teste) do begin writeln(upcase(teste[i])); end; readln; end.

4.3.4 Tipo Record - Registros


O Record um tipo especial de varivel que capaz de agrupar vrios tipos de variveis na memria. Suas caractersticas so semelhantes s de um registro de um banco de dados, uma vez que estes podem conter campos de diversos tipos de dados. O Record utilizado preferencialmente para agrupar variveis que se relacionam. Exemplos: Declarao de Registro de dados pessoaisl: TYPE TPES = RECORD NOME : STRING[30]; ENDERECO : STRING[40]; BAIRRO : STRING[15]; CIDADE : STRING[20]; CEP : STRING[8]; IDADE : BYTE; SEXO : CHAR; END; VAR REGPES : TPES;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.23

CINCIA DA COMPUTAO - DELPHI


Declarao de Registro de dados de Clientes: TYPE TCLI = RECORD RAZAOSOC : STRING[30]; ENDERECO : STRING[40]; BAIRRO : STRING[15]; CIDADE : STRING[20]; CEP : STRING[8]; TELEF : STRING[10]; CGC : STRING[14]; END; VAR REGCLI : TCLI; Acesso aos campos do registro: Um campo pode ser trabalhado normalmente como uma varivel e a referencia e feita da seguinte forma: Exemplo: REGCLI.RAZAOSOC := 'EMPRESA ABC'; REGPES.IDADE := 25; WITH REGPES DO BEGIN With usado para facilitar NOME := 'CARLOS EDUARDO'; ENDERECO := 'RUA XYZ'; variveis do registro. CEP := '30480000' END; Vetor de Registros: E um vetor em que cada elemento um registro. Exemplos: Vetor de nome dos meses do ano e quantidade de dias do ms. TYPE R = RECORD MES : STRING[9]; DIAS : BYTE; END; V = ARRAY [1..12] OF R; VAR TABMES : V; I : BYTE; BEGIN TABMES[1].MES := 'JANEIRO'; TABMES[1].DIAS := 31; TABMES[2].MES := 'FEVEREIRO' TABMES[2].DIAS := 28; TABMES[3].MES := 'MARCO'; TABMES[3].DIAS := 31; TABMES[4].MES := 'ABRIL'; TABMES[4].DIAS := 30; TABMES[5].MES := 'MAIO'; TABMES[5].DIAS := 31; TABMES[6].MES := 'JUNHO'; TABMES[6].DIAS := 30; TABMES[7].MES := 'JULHO'; TABMES[7].DIAS := 31; TABMES[8].MES := 'AGOSTO'; TABMES[8].DIAS := 31; TABMES[9].MES := 'SETEMBRO'; TABMES[9].DIAS := 30; TABMES[10].MES := 'OUTUBRO'; TABMES[10].DIAS := 31; TABMES[11].MES := 'NOVEMBRO'; TABMES[11].DIAS := 30; TABMES[12].MES := 'DEZEMBRO'; TABMES[12].DIAS := 31; FOR I := 1 TO 12 DO WRITELN('O MES DE ',TABMES[I].MES,' TEM , TABMES[I].DIAS,' DIAS.');

a referncia as

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.24

CINCIA DA COMPUTAO - DELPHI


END.

4.4 Constantes
Constantes so valores especiais que geralmente so definidos no nicio do programa e, se destinam a armazenar informaes ou valores que no se alteram ao longo da execuo do programa. Veja abaixo um exemplo de declarao de constantes no Delphi. Const PI = 3.1416; Linguagem : String = Delphi; dia : array [0..6] of String[9] = ('Domingo' , 'Segunda' , 'Tera' , 'Quarta' , 'Quinta' , 'Sexta',

'Sbado');

As declaraes de constantes no alocam recursos do sistema. De fato, isto somente ocorre quando elas forem utilizadas na aplicao. Contudo, a constante Linguagem ter um tratamento diferente, uma vez que ela uma constante tipada, ou seja, seu tipo (string) j foi previamente definido.

4.5 Operadores
So sinais responsveis pela modificao no fluxo do programa ou no contedo de variveis. Eles so extremamente teis e amplamente utilizados. A ttulo de exemplificao vale mencionar o operador de atribuio := que necessrio para determinar o contedo das variveis ( por Exemplo: A := 1; ).

4.5.1 OPERADORES ARITMTICOS


+ * / DIV : : : : : ADIO DE NMEROS INTEIROS OU REAIS. SUBTRAO DE NMEROS INTEIROS OU REAIS. MULTIPLICAO DE NMEROS INTEIROS OU REAIS. DIVISO DE NMEROS INTEIROS OU REAIS. DIVISO ENTRE NMEROS INTEIROS COM O RESULTADO TAMBM INTEIRO. Exemplo : X := A DIV B; : RESTO DA DIVISO ENTRE NMEROS INTEIROS. Exemplo : X := A MOD B;

MOD

4.5.2 OPERADORES RELACIONAIS


Podem ser usados com todos os tipos, normalmente, so usados em expresses lgicas, retornando sempre um resultado lgico TRUE ou FALSE. = <> > < >= <= : IGUAL. : DIFERENTE. : MAIOR QUE. : MENOR QUE. : MAIOR OU IGUAL A. : MEMOR OU IGUAL A.

4.5.3 OPERADORES LGICOS


NOT : INVERTE O RESULTADO DE UMA EXPRESSO LGICA. Exemplo: IF NOT S_N THEN X:=1; : SOMENTE RESULTA EM VERDADEIRO SE AMBOS OPERANDOS FOREM VERDADEIROS. Exemplo : IF ( X > 0 ) AND ( Y > 0 ) THEN Z :=0; : VERDADEIRO QUANDO PELO MENOS UM DOS OPERANDOS FOR VERDADEIRO. Exemplo : IF ( A = B ) OR ( C = D ) THEN EXIT; : S VERDADEIRO SE APENAS UM DOS OPERANDOS FOR VERDADEIRO Exemplo : IF ( A = B ) XOR ( C = D ) THEN EXIT;

AND

OR

XOR

4.5.4 CONJUNTOS
IN : VERDADEIRO SE O OPERANDO PERTENCER AO CONJUNTO. Exemplo : IF LETRA IN [A .. E , a .. e] THEN

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.25

CINCIA DA COMPUTAO - DELPHI


EXIT;

4.5.5 STRINGS
+ : PERMITE A CONCATENAO ENTRE STRINGS. Exemplo : ESCOLA := FACE + - + FUMEC ;

4.5.6 DATA - HORA


+ : Permite adicionar um nmero a uma data obtendo uma data resultante. Exemplo : Data_Vencimento := Date + Prazo; : Permite Subtrair duas datas obtendo a diferena em dias. Exemplo : Dias := Data_Vencimento - Date;

Exemplo: program Project1; uses Forms, sysutils; {$R *.RES} var DT : string; begin Readln(DT); Writeln(Formatdatetime('DDDDDD',strtodatetime(DT))); Writeln(formatfloat('###,##0',date - strtodatetime(DT))); readln; end.

4.5.7 PRIORIDADES NAS EXPRESSES USADAS NO PASCAL.


1 2 3 4 EXPRESSES DENTRO DE PARNTESES. OPERADOR UNRIO MENOS. OPERADOR NOT. OPERADORES : * , / , DIV , MOD e AND .

5 - OPERADORES : + , - , OR e XOR . 6 - OPERADORES RELACIONAIS : = , < , > , <> , <= , >= e IN .

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.26

CINCIA DA COMPUTAO - DELPHI 4.6 Comandos 4.6.1 Comando de Atribuio


Permite atribuir a uma varivel o resultado de uma expresso , valor de uma outra varivel ou uma constante.

Sintaxe: <varivel> := <Expresso | Varivel | Constantel>; 4.6.2 Comandos de Deciso 4.6.2.1 Comando IF ... Then ... Else
O comando IF um dos comandos mais importantes e bsicos da programao Object Pascal. Ele utilizado para determinar o fluxo do programa a partir de determinada condio. Caso a situao pela qual o programa estiver passando confirme uma dada condio, o programa executar os comandos abaixo da clusula Then; caso contrrio, executar as instrues abaixo da clusula Else. A clusula Else, em funa das necessidades do programa pode ser omitida. Neste caso, se a situao da execuo do programa no satisfazer a condio estabelecida no IF, prosseguir no seu funcionamento normal. ALTERNATIVA SIMPLES IF <ExpL> THEN <comando simples>;

ALTERNATIVA SIMPLES IF <ExpL> THEN BEGIN <comando-1>; <comando-2>; <comando-3>; ... END; ALTERNATIVA COMPOSTA IF <ExpL> THEN <comando> ELSE <comando> ; ALTERNATIVA COMPOSTA IF <ExpL> THEN BEGIN <comandos>; END ELSE BEGIN <comandos>; ... END;

4.6.2.2 Comando Case


O Case uma estrutura que permite que o programador avalie o valor de uma determinada varivel. A avaliao sempre realizada em relao a constante ou intervalos de valores. Poderamos dizer que o Case funciona de maneira similar ao IF, embora do ponto de vista prtico, seja completamente diferente, pois permite obter o mesmo efeito de vrios comandos IF em funcionamento conjunto com apenas um comando Case. Sintaxe: ALTERNATIVA DE MLTIPLA ESCOLHA CASE <Expr> OF <val>,<val>,...<val>: <comando>; <val>,<val>,...<val>: BEGIN <comandos>; END; [ELSE ----

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.27

CINCIA DA COMPUTAO - DELPHI


<comandos> ]; END; Exemplo: Case NotaFinal of 100 : Begin ShowMessage (Aprovado Excelente); Contador := Contador + 1; End; 80..99 : ShowMessage (Aprovado); 0..79 : ShowMessage (Reprovado); End;

4.6.3 Estruturas de Repetio


muito comum para o programador surgir situaes em que se faz necessrio a repetio de determinado conjunto de comandos. Na verdade estas situaes nos levam a utilizar comandos muito interessantes que sem dvida sero capazes de resolver o problema. Contudo para que seja assim, muito importante que o programador determine at quando deseja que os comandos sejam repetidos. Existem algumas opes: (1) um nmero determinado de vezes e (2) at que determinada condio seja atendida.

4.6.3.1 Comando FOR


A estrutura FOR permite que um conjunto de comandos sejam executados num determinado nmero de vezes. O Nmero de vezes armazenado em uma varivel inteira de controle da repetio. Sintaxe: REPETIO PARA-FAA // PASSO = 1

FOR <v> := <i> TO <f> DO < comando >; FOR <v> := <i> TO <f > DO BEGIN < comandos >; END; FOR <v> := <i> DOWNTO <f> DO BEGIN < comandos >; END; Exemplo: Var I : Byte; Begin

// PASSO = 1

// PASSO = -1

For I := 1 to 10 do Begin ShowMessage (Esta a mensagem nmero: + IntToStr(I)); End; End;

4.6.3.2 Comando WHILE


A estrutura do comando while tambm possibilita a repetio de um conjunto determinado de comandos. No entanto, diferentemente do For, permite a definio de condies para o trmino da repetio que no esto limitadas necessariamente a uma contagem. S condies so verificadas no inicio do processamentoe, uma vez satisfeitas, os comandos internos a ela comeam a ser repetidos at que alguma situao permita negar as condies iniciais. Sintaxe: REPETIO ENQUANTO-FAA WHILE <ExpL> DO <comando>; WHILE <ExpL> DO BEGIN <comando-1>; <comando-2>; ... END; Exemplo: Var Digitos : Integer ; Terminas : Boolean ; Begin

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.28

CINCIA DA COMPUTAO - DELPHI


Digitos :=0; Termina := True; While Termina do Begin Digitos := Digitos + 1; If Digitos = 100 then Termina := False; End; End.

4.6.3.3 Comando Repeat ... Until


O comando Repeat funciona de maneira anloga ao comando While. Na verdade entre eles existe apenas duas diferenas: (1) ao invs do Repeat verificar se as condies da repetio esto sendo atendidas no nicio de seu processamento, ele as verifica ao final da repetio; (2) dispensa o uso dos comandos Begin e End. Sintaxe: REPETIO REPITA-AT REPEAT <comandos>; UNTIL <ExpL>; Exemplo: Var Digitos : Integer ; Terminas : Boolean ; Begin Digitos :=0; Termina := False; Repeat Digitos := Digitos + 1; If Digitos = 100 then Termina := True; Until Termina; End.

4.6.3.4 Comandos Break / Continue ( Desvios dentro da repetio)


Estes comandos, exceo daqueles demonstrados at agora, no so de repetio condicional, mas possuem importante papel junto estes. Eles so usados em apenas duas situaes: (1) quando se deseja interromper o processamento de um estrutura de repetio - Break; (2) quando for necessrio garantir a continuidade do processamento de uma estrutura de repetio - Continue. Exemplo: Var I : Integer; Begin For I := 1 to 3 do If (I mod 2) <> 0 then Continue; For I := 1 to 3 do If (I mod 2) = 0 then Break; End;

4.6.4 Comandos de desvio


Outro recurso que existe na linguagem Object Pascal a capacidade de desviar no cdigo, isto a capacidade de pular para outra parte do cdigo, quando necessrio.

4.6.4.1 GOTO
A instruo GOTO permite que voc salte de onde est no programa para uma linha rotulada especfica. Exemplo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.29

CINCIA DA COMPUTAO - DELPHI 4.6.4.2 EXIT


Use o comando EXIT para sair do bloco corrente. Se o bloco corrente o programa principal EXIT faz o programa terminar. Se o bloco corrente est aninhado, EXIT faz com que o bloco mais externo continue na instruo imediatamente aps a que passou o controle para o bloco aninhado. Se o bloco corrente uma procedure ou funo, EXIT provoca a saida da funo ou procedure para continuar aps o ponto em que foi chamado. Exemplo: PROCEDURE Teste ( X : Integer) ; BEGIN IF X = 0 then EXIT; ... ... END;

4.6.5 Comandos para Entrada e Sada de Dados (Padro- Janela DOS)


COMANDO DE ENTRADA DE DADOS (TECLADO) READ (<var>,<var>,...<var>); COMANDO DE SADA DE DADOS (VDEO) WRITE (<var>,<val>,<expr>,..); COMANDO DE ENTRADA DE DADOS (TECLADO) READLN (<var>,<var>,...<var>); COMANDO DE SADA DE DADOS (VDEO) WRITELN (<var>,<val>,<expr>,..);

4.7 Sub-Rotinas Procedures e Functions


Uma problemtica pode surgir durante a programao: como evitar a repetio da escrita de comandos que realizam um conjunto rotineiro de aes. Em decorrncia desta problemtica que em muitos casos durante a programao, surge uma idia que a soluciona: o uso de procedimentos (procedures) e funes (functions). A nica diferena real entre as duas construes que as funes tem um valor de retorno, enquanto os procedimentos no retornam um valor. Modelo geral de um programa Object Pascal: program ... ; { Cabealho do Programa }

uses ... ;
label ... ; const ... ; type ... ; var ... ;

{ Especificao Uses }
{ Labels } { Constantes } { Tipos } { Variveis }

procedure ... ; { Procedures } function ... ; { Functions }


begin comando; ... end. { comandos }

Sintaxe Procedures: Procedure identificao; Declaraes; Begin Comandos; End; Procedure identificao ( parmetros ); Declaraes; Begin Comandos; End; Exemplos: { Esta Procedure possui parmetros } Procedure Mensagem1 (Var Msg : String);

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.30

CINCIA DA COMPUTAO - DELPHI


Begin ShowMessage (Msg); End; { Esta Procedure no possui parmetros } Procedure Mensagem2; Begin ShowMessage (Bem Vindo ao Delphi); End;

Exibe Caixa de Mensagem

Chamada da Procedure no programa: Mensagem1 (Esta mensagem aparecer no vdeo e o parmetro da procedure); Mensagem2; Sintaxe Functions: Function identificao : Tipo; Declaraes; Begin Comandos; End; Function identificao ( parmetros ) : Tipo; Declaraes; Begin Comandos; End; Exemplos: Function SomaNumeros (Var N1, N2 : Integer) : Integer; Begin { esta a rea de cdigo da funo } SomaNumeros := N1 + N2; End; Chamada da Function no programa: X := SomaNumeros (2,3); { os parmetros da function tm que ser nmeros inteiros }

Tipo do Valor Retornado

Parmetros de Referncia
Nos exemplos acima muito importante observar que tanto os procedimentos quanto as funes podem receber parmetros ou no. Os parmetros so informaes passadas que so necessrias para o funcionamento de uma subrotina e podem ser passados por valor ou referncia quando expressos atravs da palavra-chave Var. Exemplo: Function PROD(X : real; var Y : real) : real; begin PROD := X * Y; X := 1; Y := 1; end;

{--* PROGRAMA PRINCIPAL *--} begin A := 2; B := 10; writeln (PROD (A,B)); end.

As variveis A e Y ocupam o mesmo endereo.

4.8 Procedimentos e Funes Predefinidas usuais do Object Pascal

A linguagem Pascal coloca disponvel aos usurios um conjunto de funes e procedimentos distribudos em UNITS (as units so rotinas compiladas separadamente do programa principal), com a finalidade de facilitar e agilizar a programao.

Funes e Procedures predefinidas usuais

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.31

CINCIA DA COMPUTAO - DELPHI

4.8.1 Manipulao de strings 4.8.1.1 CHR

Retorna o caratere correspondente ao cdigo ASCII fornecido. Unit System function Chr(x : Byte) : Char; Exemplo:

Uses ....., Printers; Var P : TextFile; Begin AssignPrn(P); Rewrite(P); { Envia um form feed para a impressora } Writeln(P, chr(12) , Testando a Impressora); CloseFile(P); End;

4.8.1.2 CONCAT Concatenar os strings especificados. Unit System function Concat(s1, s2 [, s3, ..., sn] : string) : string;

Exemplo: var S: string; begin S := Concat('ABC', 'DEF'); end;

{ 'ABCDEF' }

4.8.1.3 COPY Retorna um substring de um string , isto , retorna uma parte se S, desde inicio e com o tamanho especificado. Unit System function Copy(s : string; inicio, tamanho : Integer) : string; Exemplo: var s, s1 : string; begin s := 'ABCDEF'; s1 := Copy(s, 2, 3) { 'BCD' } end; 4.8.1.4 DELETE Elimina parte do string S; comea em inicio com o tamanho especificado.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.32

CINCIA DA COMPUTAO - DELPHI


Unit System procedure Delete(var s : string; inicio, tamanho : Integer); Exemplo: var s: string; begin s := 'Honest Abe Lincoln'; Delete(s,8,4); WriteLn(s); { 'Honest Lincoln' } end.

4.8.1.5 INSERT Insere um string origem em s apartir da posico inicio. Unit System procedure Insert(origem : string; var s : string; inicio: Integer); Exemplo: var s: string; begin s := 'Honest Lincoln'; Insert('Abe ', s, 8); WriteLn(s); { 'Honest Abe Lincoln' } end. 4.8.1.6 LENGTH Retorna o nmero de caracteres do string. Unit System function Length(s : string) : Integer; Exemplo: var S : string; begin read(S); write(length(S)); end. 4.8.1.7 POS Retorna a posio do inicio do string s1 dentro do string s2. (retorna 0 se no encontrar) Unit System function Pos(s1,s2 : string) : Byte; Exemplo: var s: string; begin s := ' 123.50'; { Converte espaos para zeros } while Pos(' ', s) > 0 do s[Pos(' ', s)] := '0'; end.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.33

CINCIA DA COMPUTAO - DELPHI


4.8.1.8 UPPERCASE - LOWERCASE Uppercase - Retorna o String com letras maisculas. Lowercase - Retorna o String com letras minsculas. Unit SysUtils function UpperCase(const S: string): string; function LowerCase(const S: string): string; Exemplo: Uses Sysutils; var s : string; i : Integer; begin Write('Digite um string: '); ReadLn(s); WriteLn('Converso do string para maisculo: ',Uppercase(s)); Readln; end. 4.8.1.9 STR

Transforma um nmero em representao string; x pode ser inteiro ou real; S passa a conter representao string de x com a largura e casas decimais especificadas. Unit System procedure Str(x [ : tamanho [ : decimais ]]; var s : string);

Exemplo: var F : string; N : integer; begin N:=1492; str(N:7,F); write(F); end.

(* ' 1492' *)

4.8.1.10 VAL Converte string S em numero n. A posio de qualquer erro no string S reportada no parmetro cdigo. Se cdigo = 0, a converso foi feita com sucesso. Unit System procedure Val(s : string; var n; var codigo : Integer); Exemplo: Program conver; var X : string; Y,Z : integer; begin X:='9876'; Val(X,Y,Z); writeln(Y); writeln(Z); readln; end.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.34

CINCIA DA COMPUTAO - DELPHI

4.8.1.11 TRIM TRIMLEFT - TRIMRIGHT Trim - Retira espaos a esquerda e direita da string TrimLeft - Retira espaos a esquerda da string TrimRight - Retira espaos a direita da string Unit SysUtils function Trim(const S: string): string; function TrimLeft(const S: string): string; function TrimRight(const S: string): string; Exemplo: If Trim(EditNome.Text) = then Begin ShowMessage(Falta Informar o Nome); EditText.SetFocus; Exit; End;

4.8.1.12 ORD Retorna o cdigo ASCII do caractere da vativel x. Unit System function Ord(x:char) : Longint;

Exemplo: program MINUSCULA; var I:integer; (* MINUSC retorna um string com caracteres Minusculos*) function MINUSC(C : STRING) : STRING; var I : integer; begin for I := 1 to length(C) do if (ord(C[I]) >= 65) and (ord(C[I]) <= 90) then C[I] := chr(ord(C[I])+32); MINUSC := C; end; begin writeln(MINUSC('ABCDEFGHIJKLMNOPQRSTUVWXYZ')); writeln(MINUSC('FACE FUMEC.')); readln; end.

4.8.2 Manipulao Nmerica 4.8.2.1 ABS Retorna o valor absoluto de x.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.35

CINCIA DA COMPUTAO - DELPHI


Unit System function Abs(x) : (Mesmo tipo do parmetro) Exemplo: var r: real; i: Integer; begin r := Abs(-2.3); i := Abs(-157); end.

{ 2.3 } { 157 }

4.8.2.2 EXP Retorna o valor de e(e=2.7182818285E+00) elevado a potncia x. Unit System function Exp(x : real) : real; Exemplo: begin WriteLn('e = ',Exp(1.0)); end. 4.8.2.3 LN Retorna o logaritmo natural de x (base e=2.7182818285E+00). Unit System function Ln(x : real) : real; Exemplo: program exponencial; var I : integer; { funo para calcular um exponencial } function pot (X,Y : real) : real; begin pot:=exp(Y*ln(X)); end; { Programa Principal } begin for I:=1 to 10 do begin writeln (I:2 , '**' , 3 ,' = ',pot(I,3):0:2); end; readln; {X**Y}

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.36

CINCIA DA COMPUTAO - DELPHI


end.

4.2.8.4 FRAC Retorna a parte fracionaria de x. Unit System function Frac(x : real) : real; Exemplo: var S : string; begin str(Frac(123.456):7:3,S); { 0.456 } Writeln(S); str(Frac(-123.456):7:3,S); { -0.456 } Writeln(S); readln; end.

4.8.2.5 INT Retorna a parte inteira de x. Unit System

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.37

CINCIA DA COMPUTAO - DELPHI

function Int(x : real) : real; Exemplo: var r: real; begin r := Int(123.456); { 123.0 } r := Int(-123.456); { -123.0 } end. 4.8.2.6 ROUND Retorna o valor de x arredondado para um inteiro. Unit System function Round(x : real) : Longint; Exemplo: begin WriteLn(1.4, ' arredonda para ', Round(1.4)); WriteLn(1.5, ' arredonda para ', Round(1.5)); WriteLn(-1.4, ' arredonda para ', Round(-1.4)); WriteLn(-1.5, ' arredonda para ', Round(-1.5)); Readln; end.

4.8.2.7 TRUNC Retorna a parte inteira de x descartando a parte decimal. Unit System function Trunc(x : real) : Longint; Exemplo: begin WriteLn(1.4, ' truncar para ', Trunc(1.4)); WriteLn(1.5, ' truncar para ', Trunc(1.5)); WriteLn(-1.4, ' truncar para ', Trunc(-1.4)); WriteLn(-1.5, ' truncar para ', Trunc(-1.5)); Readln; end.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.38

CINCIA DA COMPUTAO - DELPHI

4.8.2.8 SQR Retorna o quadrado de x. Unit System function Sqr(x) : (Mesmo tipo do parmetro) Exemplo: writeln (O quadrado de x = , SRQ(X));

4.8.2.9 SQRT Retorna a raiz quadrada de x function Sqrt(x : real): real; Exemplo: begin WriteLn('5 ao quadrado = ', Sqr(5)); WriteLn('A raiz quadrada de 2 = ', Sqrt(2.0)); end.

4.8.2.10 ODD Retorna true se o valor de X e um nmero impar. Unit System function ODD(X:longint):boolean;

Exemplo: If ODD(X) then Write(X um nmero Impar);

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.39

CINCIA DA COMPUTAO - DELPHI

4.8.3 MANIPULAO DE TIPOS ESCALARES 4.8.3.1 PRED Funo encarregada de reconhecer o elemento, que antecede X no conjunto considerado. O resultado e do mesmo tipo do parmetro X. Unit System function PRED(x) : <mesmo tipo do parmetro> ; Exemplo: var x : char; begin x:=C; write(PRED(x)); { B } end. 4.8.3.2 SUCC Funo encarregada de reconhecer o elemento, que sucede X no conjunto considerado. O resultado e do mesmo tipo do parmetro X. Unit System function SUCC(x) : <mesmo tipo do parmetro> ;

Exemplo: var x : char; begin x:=C; write(SUCC(x)); { D } end. 4.8.4 Controle de memria 4.8.4.1 SIZEOF Retorna o nmero de bytes ocupados pelo argumento. Unit System function SizeOf(var) : Integer; Exemplo: var s : string[35]; begin write(sizeof(S)); Readln; end. 4.8.5 INTERAGINDO COM O SISTEMA OPERACIONAL 4.8.5.1 CHDIR ChDir muda the diretrio corrente. Unit { 36 }

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.40

CINCIA DA COMPUTAO - DELPHI


System procedure ChDir(S: string);

A procedure ChDir modifica o diretrio corrente para o caminho especificado em S. Exemplo: begin {$I-} { mudar para o diretrio especificado em Edit1 } ChDir(Edit1.Text); if IOResult <> 0 then ShowMessage('Diretrio no foi encontrado'); end; 4.8..5.2 GETDIR Retorna o path do diretrio ativo do drive especificado (acionador default=0,A=1,B=2,...). Retorna -1 se o drive no estiver presente. Unit System procedure GetDir(D: Byte; var S: string); Usar GetDir para determinas o diretrio correnteno drive especificado no parmetro D. D pode receber os valores abaixo: Value 0 1 2 3 Exemplo: var s : string; begin GetDir(0,s); { 0 = Current drive } writeln('Drive e diretrio corrente: ' + s); readln; end. Drive Default A B C

4.8.5.3 MKDIR Cria um subdiretrio especificado em PATH. Unit System

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.41

CINCIA DA COMPUTAO - DELPHI


Procedure MKDIR (path : string); Exemplo: Mkdir(\tp\fontes\tmp);

4.8.5.4 RMDIR Remove o diretrio especificado em path que esteja vazio. Procedure RMDIR (path:string); Exemplo: Rmdir (\ tp\fontes\tmp);

4.9 Desenvolvimento de Units


Consistem em grupos de procedimentos e funes comuns a diversos programas que ao invs de serem recompilados a todo momento, o Object pascal mantm na forma de linguagem de mquina. O Formato de uma Unidade A unidade construda de modo semelhante a um programa principal Delphi : Unit Nome_da_Unidade; Interface Uses ... Const ... Type ... Var ... Procedure ... Function ... Implementation Uses ... Label ... Const ... Type ... Var ... Procedure ... Function ... Initialization {opcional} Begin ... End; Finalization {opcional} Begin ... End; A seo Interface da unidade vem primeiro. Aqui voc define todas as variveis, constantes, tipos ou outros itens que deseja tornar disponveis para o projeto ou para outras unidades com esta unidade em sua instruo uses. Todos itens da seo interface esto disponveis para qualquer programa que tenha seu nome de unidade em sua instruo uses. Isto d a voc a opo de incluir estruturas predefinidas para ajudar outro projetista a usar sua unidade. O prximo item colocado na seo interface so os cabealhos de todas as procedures e funes implementadas em sua unidade. assim que o Delphi controla o que est disponvel para a aplicao a partir de sua unidade. Agora voc pode implementar as funes e procedures que descreveu na seo Implementation. Na seo implementation, voc coloca as variveis, constantes, etc., que sero usadas por funes ou procedures, dentro dessa seo. As variveis definidas aqui no podem ser usadas fora dessa seo. Voc tambm pode criar procedures e funes que so usadas localmente pelas procedures e funes especificadas na seo interface. Como ltimo item na seo implementation, voc implementa as funes e procedures que descreveu na seo interface. As listas de parmetros devem combinar exatamente, ou a unidade no ser compilada. Existem duas outras sees opcionais que voc pode Ter em uma unidade: Initialization e finalization. A primeira a seo initialization (opcional) , na qual voc pode definir variveis e outras coisas mais deste tipo. O problema que, como a seo interface no tem rea executvel, voc no pode inicializar essas variveis com um valor. A seo initialization d oportunidade de fazer isso. Aqui, voc pode inicializar suas variveis, estruturas de registros, variveis de arquivo, e tudo mais que poderia usar um valor inicial. Isso permite que voc prepare as coisas como antes. A seo finalization (opcional) exatamente o oposto da seo initialization. Ela permite que voc realize alguma limpeza antes de desligar a aplicao. Ela permite que voc feche arquivos, desfaa a alocao de memria e realize outras atividades de limpeza.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.42

CINCIA DA COMPUTAO - DELPHI


Exemplo: A Unidade exemplificada a baixo ilustra a forma de uma unidade. Ela define as funes e procedures que esto disponveis para o usurio da unidade na seo interface. Na seo implementation, voc cria realmente os itens que anunciou na seo interface. Para chamar essa unidade, voc deve simplesmente inclu-la na seo uses de seu programa principal. Unit Teste; Interface Function AddTwoNumbers(One, Two : Integer) : Integer; Function SubtractTwoNumbers(One, Two : Integer) : Integer; Function MultiplyTwoNumbers ( One, Two : Integer ) : Integer; Procedure Mensagem; Implementation Function AddTwoNumbers (One, Two : Integer) : Integer; Begin AddTwoNumbers := One + Two; End; Function SubractTwoNumbers (One, Two : Integer) : Integer; Begin SubtractTwoNumbers := One - Two; End; Function MultiplyTwoNumbers ( One, Two : Integer ) : Integer; Begin MultiplyTwoNumbers := One * Two; End; Procedure Mensagem; Begin ShowMessage (Bem Vindo ao Delphi); End; End. Program Principal; Uses Teste; ... End.

Chamada da Unit Teste.

4.10 Mdulos em Object Pascal


Assuntos: Introduo e Objetivos da Modularizao Tipos de Mdulos Program Unit Library Procedures e Functions Construo de Units Construo de DLLs Exerccios

4.10.1 Introduo e Objetivos da Modularizao


A linguagem Object Pascal permite a construo de programas Executveis e DLLs (Dynamic Link Libraries) Biblioteca de Linkagem Dinmica. Este dois arquivos so o resultado da compilao de programas fontes. Modularizao: um conceito antigo vem da programao estruturada. (Units) A idia bsica agrupar tipos, constantes, variveis e procedimentos por assunto e facilitar a sua reutilizao. Para cada formulrio no aplicativo criado uma Unit. Cada componente criado colocado em uma Unit. O Delphi vem com um vasto conjunto de Units trazendo funes e classes para as mais variadas situaes. A medida que vamos trabalhando com o Delphi, vamos guardando o que est em cada Unit. Por exemplo, no caso de procurarmos funes bsicas de manipulao de strings ou arquivos, devemos procurar nas Units System e Sysutils.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.43

CINCIA DA COMPUTAO - DELPHI 4.10.2 Tipos de Mdulos


Os Programas Fontes podem ser organizados em arquivos de diferentes tipos, que recebem a denominao geral de mdulos. Tipos de Mdulos: Program Unit Library 4.10.2.1 Mdulo Program O mdulo Program o mdulo principal do aplicativo. Sua estrutura bastante simples no uso dirio do Delphi e incluindo automticamente pelo Delphi. Exemplo: program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. 4.10.2.2 Mdulo Unit A Unit a pea importante na organizao do aplicativo, facilitando o trabalho de desenvolvimento. Sees bsicas: Interface : Identifica o que ser exportado, de forma a ser utilizado em outros mdulos. Implementation : Contm declaraes e o cdigo das funes e procedures Initialization Finalization Exemplo: Unit Teste; Interface uses Sysutils; Procedure Proc1; Implementation Procedure Proc1; begin { Aqui coloca o cdigo} end; end. 4.10.2.3 Mdulo Library Um mdulo Library o mdulo principal de uma DLL(Dynamic Link Library) Uma Biblioteca tem como finalidade servir de biblioteca comum de funes a vrios programas e deve, portanto exportar functions e procedures. Exemplo: Library Teste; uses Sysutils, Classes; Procedure Proc1; export; begin { Aqui coloca o cdigo} end; Exports Proc1;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.44

CINCIA DA COMPUTAO - DELPHI


end.

4.10.3 Units e DLLs


As DLLs so funcionalmente equivalentes as UNITs, pois representam uma coleo de funes externas ao mdulo principal da aplicao. A diferena se encontra no modo atravs do qual a biblioteca linkada.

4.10.4 Procedures e Functions


Procedures e Functions permitem que o programador divida um programa em pedaos menores, evitando redundncia, facilitando o desenvolvimento e a manuteno. Tanto procedures como as functions possuem regras bem definidas para a sua declarao e uso. 4.10.4.1 Declarao de Procedures e Funes Cabealho da Procedure Nome da Procedure Nmero e Lista de Argumentos Conveno de chamada da procedure ( Define como os parmetros so passados em tempo de execuo) Declaraes Constantes, tipos, variveis locais, Bloco de Comandos Begin ... End. A declarao de uma funo se assemelha muito com a de uma procedure, com a diferena de uma funo poder retornar um valor. Exemplo de Procedure: Procedure Test ( Arg1 : integer; Arg2 : String ) ; Stdcall; Var I : Integer; Begin I := Abs(Arg1); Repeat S := S + IntToStr(I); Dec(I); Until ( I = 0); End; Podemos verificar partes da declarao acima: Nome da Procedure : Procedure Test (...

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.45

CINCIA DA COMPUTAO - DELPHI


Nmero e Lista de Argumentos: ... Test ( Arg1 : integer; Arg2 : String ) ; Stdcall; Conveno de chamada da procedure: : ...String ) ; Stdcall; O Delphi suporta cinco tipos diferentes de convees de chamada de procedures ou funes: Register; Pascal; Stcall; Cdecl; Safecall; As convenes de chama se diferenciam em tres reas: Ordem de passagem de parmetros ( Esquerda-Direita ; Direita-Esquerda ) Responsabilidade de remoo dos parmetros da pilha Uso dos registradores para a passagem de parmetros As convenes pascal e cdecl so mais usadas para a chamada de funes em DLLs escritas em C, C++ ou qualquer outra linguagem. As convenes stdcall e safecall so mais usadas para a chamada de funes as API do Windows. Parmetros de procedures e functions Parmetros por valor Atua como uma varivel local a procedure/Function O modo de chamada deve ser feito atravs de varivel ou contantes (Passagem por valor). Procedure ABC( Arg1 : Integer); Parmetros por Referncia Deve ser usado sempre que a proc./func. precisar retornar valores. O modo de chamada deve ser feito atravs de varivel ( Passagem por endereo). Procedure Test ( Var Arg1 : Integer); Parmetros por Constantes Similar ao parmetro por referncia (passagem por endereo) , mas o compilador no permite que o valor do parmetro seja modificado pela funo ou procedure. Procedure ABC( Const Arg1 : Integer); Parmetros por OUT Similar ao parmetro por referncia (passagem por endereo) , Usado para sada de dados da funo ou procedure. Procedure ABC( OUT Arg1 : Integer); Exemplo de declarao de Funo: Function Test ( Const Arg1 : Integer ; Arg2 : String ) : String; Begin Result := Arg2 + IntToStr(Arg1); End;

4.10.5 Contruo de Units


Construir uma Unit com o nome RotGer contendo inicialmente uma Funo para retornar uma string Replicar, com Q ocorrncias da String X. Function Replicar(X : String; Q : Byte): string;

Selecionar no Delphi a opo File/New...UNIT

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.46

CINCIA DA COMPUTAO - DELPHI

unit RotGer; interface Uses Sysutils; Function Replicar(X : String; Q : Byte): string; implementation Function Replicar(X : String; Q : Byte): string; { Funo para retornar uma string Replicar, com Q ocorrncias da String X } Var Resp : String; I : Byte; begin Resp := ''; for I := 1 to Q do Resp := Resp + X; Replicar := Resp; end; end.

Procedimentos para incluir a UNIT RotGer no desenvolvimento de um aplicativo Inciar o desenvolvimento Menu Delphi - opo New Application Incluir a Unit RotGer no projeto Menu Delphi - opo Add Project... Incluir o nome da Unit RotGer na clasula Uses da Unit do Formulrio da aplicao. Chamar a funo Replicar na rea de cdigo da aplicao. Desenho do aplicativo para chamar a Unit RotGer

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.47

CINCIA DA COMPUTAO - DELPHI

Cdigo do aplicativo para chamar a funo Replicar da Unit RotGer da Unit do formulrio interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,RotGer, StdCtrls; type ... end; var Form1: TForm1; implementation procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Replicar(Edit1.Text,StrToInt(Edit2.Text))); end; end.

4.10.6 Contruo de DLLs

Construir uma DLL com o nome RotGer contendo inicialmente uma Funo para retornar uma string Replicar, com Q ocorrncias da String X. Function Replicar(X : PChar; Q : Byte): PChar; Selecionar no Delphi a opo File/New...DLL

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.48

CINCIA DA COMPUTAO - DELPHI

Library RotGer; Uses Sysutils; Function Replicar(X : PChar; Q : Byte): PChar; StdCall; Export; { Funo para retornar uma string Replicar, com Q ocorrncias da String X } Var Resp , X1: String; I : Byte; Begin X1 = StrPas(X); Resp := ''; for I := 1 to Q do Resp := Resp + X1; Replicar := Pchar(Resp); end; Exports Replicar Name Replicar; end.

Desenho do aplicativo para chamar a DLL RotGer

Cdigo do aplicativo para chamar a DLL RotGer unit UChamaRotGerDLL; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type ... end; var Form1: TForm1; implementation {$R *.DFM} Function Replicar(X : PChar; Q : Byte): PChar; StdCall; External 'RotGer.DLL'; procedure TForm1.Button1Click(Sender: TObject); begin

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.49

CINCIA DA COMPUTAO - DELPHI


ShowMessage(Replicar(Pchar(Edit1.Text),StrToInt(Edit2.Text))); end; end.

5. Utilizando Componentes
Objetivo
Aps uma introduo ao uso do ambiente geral da linguagem Object Pascal, estamos printos para entrar numa parte muito importante do Delphi, o uso dos componentes. A programao visual usando componentes a caracterstica fundamental deste ambiente de desenvolvimento. Nosso objetivo ser portanto, o de mostrar como utilizar algumas de suas caractersticas. Iniciaremos fazendo uma breve descrio de cada componente, para que mais adiante voc possa estar mais familiarizado com eles.

5.1 PGINA STANDARD

10 11 12 13 14

Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Nome ou Rtulo Main Menu Popup Menu Label Edit Memo Button CheckBox Radio Buttons ListBox ComboBox ScroolBar GroupBox RadioGroup Panel

Finalidade Projeta Barras de Menu no estilo dos programas Windows. Projeta Menus de Atalho (Smente acessveis atravs do boto direito do mouse). Permite identificar outros componentes ou mostrar mensagens fixas no formulrio. Disponibiliza uma espao no formulrio, para entrada de dados. Disponibiliza uma ampla rea para digitao de textos. Define botes de presso. Utilizado para entrada de dados com apenas duas possibilidades. Permite a seleo de opes mutuamente exclusivas. Projeta Caixas de Listagem. Projete uma caixa de listagem com opes suspensas. Geralmente associada a outro componente, permite selecionar, analgicamente, um valor numa faixa de escolhas. Agrupa Botes de Rdio para que se comportem como uma unidade. Associa automticamente GroupBox e Rdio Buttons. Utilizado para projetar Barras de Ferramentas e Barras de Status.

5.2 PGINA ADICIONAL

10

11 12

13

Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13

Nome ou Rtulo BITBTN SpeedButton MaskEdit StringGrid DrawGrid Image Shape Bevel ScrollBox ChekListBox Splitter StaticText Chart

Finalidade Projeta um boto de comando com grfico. Define cones para uma barra de ferramentas. Formata a digitao e a exibio de dados. til para criar uma tabela que mostre o contedo de strings. Arranja vrias imagens num formato tabular. Projeta um objeto para mostrar imagens de diversos formatos. Projete figuras geomtricas. Projeta quadros chanfrados. Projeta um container redimensionvel. Mostra uma lista com rolagem similar caixa de listagem com um checkbox frente de cada item. Adiciona um divisor de tela no formulrio redimensionvel em tempo de execuo. Controle no editvel, til para fornecer feedback sobre o estado atual de uma aplicao. Permite a criao de grficos variados em tempo real.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.50

CINCIA DA COMPUTAO - DELPHI 5.3 PGINA WIN32

10

11 12

13

14

15

16

Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Nome ou Rtulo TabControl PageControl ImageList RichText TrackBar ProgressBar UpDown HotKey Animate DateTimePicker TreeView ListView HeaderControl StatusBar ToolBar CoolBar

Finalidade Projeta um container com vrias pginas com abas no topo. Cria caixas de dilogo com abas (como no Object Inspector) Projeta caixa de listagem para imagens de mesmo tamanho. Disponibiliza um campo Memo no formato RichText. Define uma barra com uma faixa de valores ajustveis. Projeta uma barra de progresso preenchida da esquerda para direita Projeta cones para incrementar ou decrementar valores. Associa um componente, uma tecla de atalho. Trs cones animados padronizados pelas operaes de manipulao de arquivos. Disponibiliza um calendrio para seleo de datas. Projeta uma caixa de listagem com as opes em forma de tpicos. Projeta uma caixa de listagem com as opes colunadas. Fornece uma rea de texto redimensionvel. Define uma rea de barra de status. Gera barra de ferramentas com controle automtico de tamanho e posio dos cones. Gera barra de ferramentas redimensionvel e mvel.

5.4 PGINA DIALOG

10

Nmero do cone 1 2 3 4 5 6 7 8 9 10

Nome ou Rtulo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog FontDialog ColorDialog PrintDialog PrinterSetupDialog FindDialog ReplaceDialog

Finalidade Exibe caixa de abertura de arquivos. Exibe caixa de salvamento de arquivos. Exibe caixa de abertura de figuras. Exibe caixa de salvamento para arquivos de figuras. Exibae caixa de formatao de fontes. Exibe caixa de formatao de cores. Exibe caixa de controle de impresso. Exibe caixa de configurao de impresso. Exibe caixa de dialgo para localizao de textos. Exibe caixa de dialgo para localizao e substituio de textos.

5.5 PGINA SYSTEM

8 Finalidade Ativa umcdigo aps um intervalo de tempo definido. Projeta uma rea para desenhos e grficos. Disponibiliza recursos para reproduo multimdia. Estabelece um cliente OLE. Estabelece um cliente DDE. Especifica o que ser enviado do cliente para o servidor numa ligao DDE. Instala um servidor DDE. Especifica o que ser enviado do servidor ao cliente.

Nmero do cone 1 2 3 4 5 6 7 8

Nome ou Rtulo Timer PaintBox MediaPlayer OLEContainer DDEClientCOnv DDEClientItem DDEServerConv DDEServerItem

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.51

CINCIA DA COMPUTAO - DELPHI 5.6 PGINA INTERNET


1 2 3 4 5 6 7 8 10 11 12 13 14 15

Nmero do cone 8 9 10 11 12 13 14 15

Nome ou Rtulo FTP HTML HTTP NNTP POP SMTP TCP UDP

Finalidade Facilita o acesso para servios de protocolo de transferncia de arquivos na Internet. Transferindo arquivos entre mquinas remota e local. Implementa um visualizador de HTML. Permite obter documentos HTTP se nenhuma visualizao ou nenhum processamento de imagem for necessrio. Permite o acesso ao Networking News Transfer Protocol. Possibilitanto novos recursos para leitura e gravao. Baixa correspondncia de UNIX ou de outros servidores que suportem o protocolo POP3. Permite o acesso STMP servidores de correspondncias. Implementa protocolo para controle de transmisso para aplicaes C/S, provendo acesso rpido a servios de rede TCP. Prov acesso rpido ao protocolo User Datagram para servios em rede.

5.7 Interface Grfica com o Usurio


Uma das principais vantagens de ser um usurio Windows que a maioria das aplicaes que ele usa, tem aparncia e comportamento semelhantes.

5.7.1 Projeto de Telas


As Telas que apresentamos para os usurios podem ter vrios efeitos, como inspirao ou distrao. Projetar as telas do aplicativo procurando inspirar o usurio sem distra-lo de sua tarefa. Projeto de Telas - Algumas Diretrizes: Contedo Tudo que est na tela tem um motivo de estar aqui? Esttica Agrupamento, Dimensionamento, Espaamento e Alinhamento. Navegabilidade Facilidade operacional

5.7.2 Objetos usuais para o projeto das Telas


Objetos Usuais - Fundamentos Propriedades Conjunto de parmetros ajustveis em tempo de projeto ou tempo de execuo para adequar o objeto as necessidades do aplicativo (aparncia e comportamento).

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.52

CINCIA DA COMPUTAO - DELPHI


Exemplo de ajuste de propriedade via cdigo: Form1.Color := clWhite ; Eventos Os Objetos possuem rotinas de tratamento de eventos associados, cabendo ao programador selecionar os eventos de interesse da aplicao e inserir os comandos necessrios nas rotinas de tratamento dos eventos selecionadas.

Exemplo de Procedure de Evento: procedure TForm1.FormActivate(Sender: TObject); begin ShowMessage('Teste'); end; Mtodos Conjunto de comandos (funes ou procedures ) declaradas dentro do objeto que executam tarefas do objeto, cabendo ao programador selecionar as de interesse do aplicativo. Exemplo de Mtodos: Form1.Hide ; // Ocultar Form1 Form2.Close ; // Fechar Form2 5.7.2.1 Formulrio O Formulrio o objeto principal da interface visual pois comporta-se com um container dos demais objetos visuais.

Barra de Ttulo - Formulrio Serve para identificar o formulrio e tambm acomodar botes de controle do formulrio. Menu de Controle do Formulrio Menu que aparece quando clica com o mouse no cone do Formulrio e com os itens Restaurar, Mover, Tamanho, Minimizar, Maximizar e Fechar. Propriedades usuais para o Formulrio BorderIcons

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.53

CINCIA DA COMPUTAO - DELPHI


Ajustar os botes de controle do formulrio para o aplicativo. SubPropriedades: biSystemMenu: desabilita ou habilita o menu de controle da janela biMinimize: desabilita ou habilita o boto minimizar. biMaximize:desabilita ou habilita o boto maximizar. biHelp: se BorderStyle bsDialog ou biMinimize e biMaximize foram excluidos, um ponto de interrogao aparece na barra de ttulo do formulrio e quando pressionado o formato do cursor modificado para crHelp. (?). BorderStyle Ajustar a borda do formulrio para o aplicativo. bsSingle: no permite redimensionar o formulrio. bsSizeable: permite redimensionar o formulrio. bsNone : formulrio sem borda. Caption Ajusta o Ttulo do Formulrio. Color Ajusta a cor do fundo. Icon Seleciona o arquivo que contm o cone p/ o formulrio. Position poDesigned: O formulrio aparece posicionado na tela com as dimenses (altura e largura) e posio especificada em tempo de projeto. poScreenCenter: O formulrio aparece posicionado no centro da tela com as dimenses feitas em tempo de projeto. WindowState wsNormal: O formulrio aparece no estado normal. wsMinimized: O Formulrio aparece minimizado wsMaximized: O formulrio aparece maximizado. Eventos usuais para o Formulrio OnActivate: Prprio de formulrios, permite a escrita de cdigos que sero executados todas as vezes que o formulrio recebe o foco. OnCloseQuery: Aciona o cdigo correspondente quando houver tentativas de fechar o formulrio. OnClose: Aciona o cdigo correspondente quando o formulrio for efetivamente fechado. OnHide: Aciona o cdigo correspondente quando o formulrio for ocultado. OnCreate: Referente ao momento que o formulrio exibido a primeira vez. Geralmente associa-se um cdigo que deve ser executado apenas uma nica vez, quando o formulrio criado. OnDeactivate: Prprio de formulrios, permite a execuo de cdigos que sero executados quando a janela do formulrio for posicionada em segundo plano. OnCanReSize: Aciona o cdigo correspondente quando houver tentativas de redimensionar o formulrio. OnReSize: Aciona o cdigo correspondente quando o formulrio for redimensionado. Mtodos usuais para o Formulrio Close Comando para Fechar o Formulrio. Close chama o mtodo CloseQuery para determinar se o formulrio pode ser fechado. Se CloseQuery retornar False, a o comando close cancelado, caso contrrio ocorrer o evento OnClose. Nota: Quando o formulrio principal da aplicao fechado a aplicao terminada. Ex: FrmCliente.Close; Hide Comando para ocultar o Formulrio. Hide passa a propriedade Visible para False. procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := True; Hide; // Ocultar o formulrio end; procedure TForm1.Timer1Timer(Sender: TObject); begin Visible := True; // Mostrar o Formulrio Timer1.Enabled := False; end; Formulrio no modal aquele que, aps a sua abertura, permite a ativao de outras janelas s quais se sobrepe. Mtodo Show Abrir um formulrio no modal. Ex: FrmProdutos.Show; // Abrir o Formulrio FrmProdutos Formulrios modais, no permitem a ativao de outras janelas enquanto o usurio no fech-lo. Mtodo ShowModal Abrir um formulrio modal. Ex: FrmLogin.ShowModal; // Abrir o Formulrio FrmLogin Exerccios

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.54

CINCIA DA COMPUTAO - DELPHI


Elaborar um aplicativo com um formulrio, que abra uma caixa de dilogo pedindo confirmao de sada com dois botes (Sim, No), no seu fechamento.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Application.MessageBox ('Confirma a sada do aplicativo?', 'Sada do Aplicativo', Mb_YesNo + Mb_DefButton2) = IDYes then Canclose := True else CanClose := False; end; Dicas Para Formulrios. Como Criar Forms Em Tempo de Execuo Para voc economizar memria, deve-se criar os forms de sua aplicao somente no momento da execuo. Na criao do Form voc define se ele MODAL ou NO MODAL. Para Isso observe os seguintes cdigos: Form2 => MODAL procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); {Carrega form na memria} Form2.ShowModal; {Mostra form em modo exclusivo} Form2.Free; {Libera Memria} end; Form2 => NO MODAL procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); {Carrega form na memria} Form2.Show; {Mostra form em modo no exclusivo} end; //No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; {Libera Memria} end; Descobrindo se um form no modal j est criado Quando um form ou outro objeto no existe, ou seja, ainda no foi criado, a varivel usada para instanciar o objeto est "nil". If form2 = nil then {form2 no criado ainda ou j foi fechado} // Lembre-se de fazer o form2, no seu evento close, receber nil. form2 := nil; // Assim ele estar fechado e no existir mais. procedure TForm1.Button1Click(Sender: TObject); begin if Form2 <> nil then exit; Application.CreateForm(TForm2, Form2); Form2.Show; {Mostra form em modo no exclusivo} end; //No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; {Libera Memria} Form2 := nil; end;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.55

CINCIA DA COMPUTAO - DELPHI


Exerccio: Mostrar um Form de LogOn antes do Form principal. * Crie um novo Projeto. Este certamente ter o Form1. * Adicione um novo Form (Form2). * Coloque no Form2 dois botes TBitBtn. * Mude a propriedade Kind do BitBtn1 para bkOK. * Mude a propriedade Kind do BitBtn2 para bkCancel. * V no menu "Project/Options" na aba "Forms" e passe o Form2 de "Auto-create Forms" para "Available Forms". * Abra o arquivo Project.dpr (menu Project/View Source). * Altere o contedo deste arquivo conforme abaixo: program Project1; uses Forms, Controls, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.RES} begin Form2 := TForm2.Create(Application); // Criao do Form2 if Form2.ShowModal = mrOK then // Abertura e fechamento c/ o boto ok? begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end. 5.7.2.2 Caixa de Textos Edit Controle usado para entrada ou sada de dados, incluso, alterao ou exibio de textos. Propriedades usuais para o Edit Font Ajustar a cor do texto, Nome da Fonte, Tamanho, Estilo. Enable Se False s permite sada de dados e o campo no recebe foco. MaxLength Se maior do que Zero define o mximo de caracteres permitidos em uma entrada de dados. ReadOnly Se true apesar do campo receber foco o usurio no consegue alterar seu contedo. Text : Recebe o contudo da caixa de texto. Left e Top Coordenadas de posicionamento da caixa de texto no formulrio. Left - Distncia da margem esquerda do formulrio at a margem esquerda da caixa de texto, Top - distncia do topo do formulrio at o topo caixa de texto. Height e Width Define as dimenses da caixa de texto (Height : Altura, Width: Largura). Visible Se false a caixa de texto desaparece do formulrio. Eventos usuais para o Edit OnChange: Ocorre quando o contedo da caixa de texto for alterado. Exemplo: procedure TForm1.Edit1Change(Sender: TObject); begin if trim(edit1.text) <> '' then button1.Enabled := true // Habilita Boto else button1.Enabled := false; // Desabilita Boto end; OnEnter, OnExit: OnEnter : Ocorre quando a caixa de texto recebe o foco. OnExit : Ocorre quando a caixa de texto perde o foco. Exemplo: procedure TForm1.Edit1Enter(Sender: TObject); begin Edit1.Color := clYellow; // Altera cor do fundo end; procedure TForm1.Edit1Exit(Sender: TObject); begin

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.56

CINCIA DA COMPUTAO - DELPHI


Edit1.Color := clWindow; // Altera cor do fundo end; OnKeyPress : Ocorre quando o usurio pressiona uma tecla durante o preenchimento do campo (caixa de texto). Exemplo: procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin // Mudar o foco para o prximo campo se pressionar <ENTER> // Na rotina de tratamento de evento o programador tem acesso a // tecla pressionada if Key = chr(13) then Edit2.Setfocus; end; Mtodos usuais para o Edit Clear Comando para limpar a caixa de texto. Ex: Edit1.Clear ; SetFocus Comando para colocar o foco na caixa de texto. Ex: Edit1.SetFocus ; 5.7.2.3 Caixa de Textos Memo Controle usado para entrada ou sada de dados, incluso, alterao ou exibio de textos com mltiplas linhas.

Propriedades usuais para o Memo As propriedades do Edit so vlidas para o Memo. Lines Contm linhas individuais dentro da caixa de texto de mltiplas linhas. ScrollBars Determina a presena da barra de Scroll no controle: (ssNone, ssHorizontal, ssVertical, ssBoth). Memo1.Lines.Clear Comando para limpar todas as linhas da caixa de texto. Ex: Memo1.Lines.Clear; Memo1.Lines.Append(const S: string) Comando para inserir uma linha no final no final da caixa de texto. Ex: Linhas := Memo1.Lines.Append('FUMEC'); Memo1.Lines.Add(const S: string): Integer Comando para inserir uma linha no final retornando o index da linha colocada. Ex: Linhas := Memo1.Lines.Add('FUMEC'); Memo1.Lines.LoadFromFile(const FileName:string) Carrega a caixa de texto com as linhas gravadas no arquivo texto especificado. Ex: Memo1.Lines.LoadFromFile(Exemplo.Pas); Memo1.Lines.SaveToFile(const FileName: string) Gravar o contedo da caixa de texto no arquivo texto especificado. Memo1.Lines.Text Retorna uma String com todo o contedo da caixa de texto. Memo1.Lines.Strings[Index: Integer] Retorna uma String c/ dados da linha da posio Index. Exerccio Elaborar um aplicativo para Abrir e visualizar o contedo de Arquivo Texto via componente Memo. Funes: Abertura, leitura, visualizao e fechamento de arquivo texto. Formatao: Possibilidade de alterar a Fonte , Estilo, Tamanho, Efeitos e Cor do Texto).

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.57

CINCIA DA COMPUTAO - DELPHI


5.7.2.4 Rtulo ou Label Componente usado para sada de dados ou nome de campos em formulrios. Propriedades usuais para o Label Alignment Controle horizontal do texto dentro do Label. type TAlignment = (taLeftJustify, taRightJustify, taCenter); AutoSize : (False ou True) Determina quando o tamanho do label automaticamente dimensionado para acomodar o texto. Cursor Especifica a imagem usada para representar o ponteiro do mouse quando ele passa sobre a regio do controle. Valores : crDefault usa o cursor default do windows usualmente crArrow.

FocusControl Determina o controle associado com o label para recepo de foco via tecla de atalho. Hint Contm o texto que pode aparecer quando o usurio move o mouse sobre o controle. ShowHint : ( True ou False) Determina se o controle pode mostrar o Help Hint quando o mouse move sobre o controle. Mtodos usuais para o Label OnClick Ocorre quando o usurio clica no controle. OnMouseMove Ocorre quando o usurio move o mouse sobre o controle Exerccio Elaborar um aplicativo para testar as propriedades Hint, ShowHint, FocusControl, Cursor e eventos OnClick e OnMoveMouse do controle Label.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.58

CINCIA DA COMPUTAO - DELPHI


Cdigo - Evento OnMouseMove procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Label1.Hint := DateTimeToStr(Now); Label1.ShowHint := true; end; Cdigo - Evento OnClick procedure TForm1.Label2Click(Sender: TObject); begin WinExec('Start http://www.fumec.com.br',0); end; 5.7.2.5 Boto de Comando Button Componente usado solicitar uma ao do aplicativo. Propriedades usuais para o Button ModalResult Determina quando e como o boto fecha um formulrio modal secundrio. Ajustando a propriedade ModalResult uma maneira simples de fechar um formulrio modal atravs do click no boto, a propriedade ModalResult do formulrio ajustada com o mesmo valor da propriedade ModalResult do boto selecionado.

Exerccio Elaborar um aplicativo para testar a propriedade ModalResult para o Componente Button e Formulrio Modal.

Cdigo - Evento OnClick procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; // Abrir Form2 Modal if form2.ModalResult = mrYes // Qual boto Fechou Form2 ? then ShowMessage('Fechou formulrio com Sim') else ShowMessage('Fechou formulrio com No'); end; 5.7.2.6 Boto de Comando c/ imagem - BitBtn

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.59

CINCIA DA COMPUTAO - DELPHI


Controle com imagem (Bitmap), usado solicitar uma ao do aplicativo. Propriedades usuais para o BitBtn Glyph :Especifica o bitmap que aparece no boto.

5.7.2.7 Boto de Opo RadioButton Usado dentro de um grupo de botes de opo para mostrar uma mltipla escolha, na qual o usurio s pode selecionar uma opo de cada vez.

Propriedades usuais p/ o RadioButton Checked : (True ou False) Determina se a opo representada pelo boto de rdio foi selecionada. Caption Especifica um texto string para identificar o boto de rdio para o usurio.

5.7.2.8 Frame GroupBox Usado para relacionar controles no formulrio, comportando com um container de controles. Propriedades usuais p/ o GroupBox Enabled : (True ou False) Desabilitar o GroupBox e todos os controles internos. Visible : (True ou False) Ocultar o GroupBox e todos os controles internos. Caption Especifica um texto string para identificar o GroupBox.

5.7.2.9 Caixa de Verificao CheckBox Usado para criar uma caixa que o usurio pode facilmente indicar se algum tem verdadeiro ou falso, ou para mostrar mltiplas opes quando o usurio pode escolher mais de uma ao mesmo tempo.

Propriedades usuais p/ o CheckBox

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.60

CINCIA DA COMPUTAO - DELPHI


Checked : (True ou False) Determina se a opo representada pelo CheckBox foi selecionada. Caption Especifica um texto string para identificar o CheckBox para o usurio. 5.7.2.10 Caixa de Lista de Itens (ListBox) O componente ListBox mostra uma lista de tens na qual o usurio pode ver uma lista de itens com scroll e ordenados, selecionar um tem ou mais tens, podendo tambm incluir ou excluir tens.

Propriedades usuais para o ListBox

Items Contm tens individuais (Strings) que aparecem dentro da Lista. MultiSelect : (True ou False) Determina se o usurio pode selecionar um ou mais de um tem ao mesmo tempo. Selected[Index: Integer]: Boolean; Indica quando um determinado tem foi selecionado. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o ListBox ListBox1.Items.Clear Comando para limpar todos os tens da lista. Ex: ListBox1.Items.Clear; ListBox1.Items.Append(const S: string) Comando para inserir um tem no final no final da lista. Ex: ListBox1.Items.Append('FUMEC'); ListBox1.Items.Add(const S: string): Integer Comando para inserir um tem no final da lista retornando o index do tem colocado. ListBox1.Items.IndexOf(const S: string): Integer Retorna a posio da 1a. Ocorrncia do Item na lista. Caso o tem no exista ser retornado -1. ListBox1.Items.LoadFromFile(const FileName:string) Carrega a lista com os tens gravadas no arquivo texto especificado. Ex: ListBox1.Items.LoadFromFile(Itens.txt); ListBox1.Items.SaveToFile(const FileName: string) Gravar o contedo da lista no arquivo texto especificado. ListBox1.Items.Strings[Index: Integer] Retorna uma String c/ dados do tem da posio Index. ListBox1.Items.Delete(Index: Integer) Exclui o tem da posio Index na lista. Exerccio Elaborar um aplicativo para verificar quais os tens de uma lista o usurio selecionou. O usurio poder indicar se deseja selecionar um ou vrios tens na lista.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.61

CINCIA DA COMPUTAO - DELPHI

Cdigo - Evento OnClick RadioButton procedure TForm1.RadioButton1Click(Sender: TObject); begin ListBox1.MultiSelect := True; end; procedure TForm1.RadioButton2Click(Sender: TObject); begin ListBox1.MultiSelect := False; end; Cdigo - Evento OnClick Button procedure TForm1.Button1Click(Sender: TObject); var I : integer; Resp : String; begin if Listbox1.MultiSelect // Lista com Mltiplas Selees then begin if ListBox1.SelCount = 0 then exit; Resp := 'Os tens abaixo foram selecionados:' + chr(13)+chr(10); for i := 0 to listbox1.items.Count - 1 do begin if listbox1.Selected[I] then Resp := Resp + ListBox1.Items.Strings[I] + chr(13)+chr(10); end; Showmessage(Resp); end else if ListBox1.itemindex >= 0 then // Lista com Seleo simples Showmessage('Opo Selecionada pelo Usurio: ' + trim(ListBox1.Items.Strings[ListBox1.ItemIndex])); end; Exerccio Elaborar um aplicativo para incluir e excluir tens em um ListBox a partir de um string de um Edit, excluir tambm tens selecionados na ListBox, gravar a lista ou carregar a lista a partir do arquivo texto Itens.txt.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.62

CINCIA DA COMPUTAO - DELPHI


Cdigo - Salvar e Carregar a Lista Arquivo texto Itens.txt procedure TForm1.BitBtn2Click(Sender: TObject); begin if ListBox1.Items.Count > 0 then ListBox1.Items.SaveToFile('Itens.txt'); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin if FileExists('Itens.txt') then ListBox1.Items.LoadFromFile('Itens.txt'); end; Cdigo - Incluir e excluir tens na lista via Edit procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Append(Edit1.Text); end; procedure TForm1.Button3Click(Sender: TObject); begin While ListBox1.Items.Indexof(Edit1.text) <> -1 do ListBox1.Items.Delete (ListBox1.Items.Indexof(Edit1.text)); end; Cdigo para excluir tens selecionados na lista procedure TForm1.Button2Click(Sender: TObject); Label Inicio; Var I : Integer; begin if ListBox1.Items.Count > 0 then Exit; INICIO: For I := 0 to ListBox1.Items.Count -1 do if ListBox1.SelCount > 0 then if ListBox1.selected[I] then begin ListBox1.Items.Delete(I); GOTO INICIO; end; end; 5.7.2.11 Caixa de Verificao CheckListBox Usado para criar uma lista, sendo que cada tem comporta-se como uma caixa de verificao que o usurio pode facilmente indicar se algum tem verdadeiro ou falso, podendo marcar mais de um tem ao mesmo tempo.

Propriedades usuais para o CheckListBox Items Contm tens individuais (Strings) que aparecem dentro da Lista. Checked[Index: Integer]: Boolean; Indica quando um determinado tem foi marcado. Selected[Index: Integer]: Boolean; Indica quando um determinado tem foi selecionado. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o CheckListBox

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.63

CINCIA DA COMPUTAO - DELPHI


Mesmos mtodos do ListBox. Exerccio Elaborar um aplicativo para incluir no Memo todos os itens marcados na CheckListBox ao dar o clique no boto OK. Ajustar o aplicativo para marcar/desmarcar uma opo com um duplo ckick do mouse sob a opo selecionada.

Cdigo - Evento OnClick do Boto procedure TForm1.BitBtn1Click(Sender: TObject); Var I : Integer; begin Memo1.Lines.clear; For I := 0 to CheckListBox1.Items.Count - 1 do if CheckListBox1.Checked[I] then Memo1.Lines.append(CheckListBox1.items.strings[I]); end; Cdigo - Evento OnDlbClick do CheckListBox procedure TForm1.CheckListBox1DblClick(Sender: TObject); begin if CheckListBox1.Checked[CheckListBox1.ItemIndex] then CheckListBox1.Checked[CheckListBox1.ItemIndex] := false else CheckListBox1.Checked[CheckListBox1.ItemIndex] := true; end; 5.7.2.12 Caixa de Texto + Lista ComboBox Uma combinao de caixa de lista de itens ( List Box) e caixa de texto (Edit). O usurio pode escolher um item dentro da lista ou digitar um valor na caixa de texto.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.64

CINCIA DA COMPUTAO - DELPHI

Propriedades usuais para o ComboBox Items Contm tens individuais (Strings) que aparecem dentro da Lista. Style Determina a forma e o funcionamento do ComboBox. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o ComboBox Mesmos mtodos do CheckListBox.

Exerccio Elaborar um aplicativo para incluir no ComboBox (Style csDropDownList) uma tabela de Histricos a partir do arquivo Historicos.txt e mostrar qual o histrico que o usurio selecionou.

Cdigo - Evento OnClick do Boto procedure TForm1.BitBtn1Click(Sender: TObject); begin if ComboBox1.ItemIndex = -1 then exit; ShowMessage('Opo Selecionada: ' + ComboBox1.Items.Strings[ComboBox1.Items.IndexOf(ComboBox1.Text)]); // ComboBox1.Text ); Melhor Alternativa end; Cdigo - Evento OnActivate do Form procedure TForm1.FormActivate(Sender: TObject);

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.65

CINCIA DA COMPUTAO - DELPHI


begin if FileExists('Historicos.txt') then ComboBox1.Items.LoadFromFile('Historicos.txt'); end; 5.7.2.13 Componente Image Usar Image para exibir uma imagem. Propriedades usuais para o Image Picture Especifica a imagem que aparece no objeto image. Mtodos usuais para o Image Picture.LoadToFile(const FileName:string) Carrega uma imagem a partir de um arquivo (bmp (bitmap), ico (cone), wmf (metafile) ). 5.7.2.14 Caixa de Textos com Formatao-MaskEdit Controle usado para entrada ou sada de dados, incluso, alterao ou exibio de textos com formatao e validao. Propriedades usuais para o MaskEdit MaskEdit : A propriedade definida a partir de 3 campos separados por ponto-e-vrgula: 1) Mscara : permite restringir o contedo e especificar a sua forma. 2) Indicativo se os literais que fazem parte da mscara vo ser incorporado aos dados. 3) Qual o caracter que ser usado indicar o local de colocao de dados no campo.
C aracteres da M scara

! (E xclam ao ) > (M aior q ue) < (M enor Q ue) < > (M eno r e M aio r Q ue) \ (B arra Invertid a) L (L etra L M aiscula) l (L etra l M inscula) A (L etra A M aiscula) a (L etra a M inscula) C (L etra C M aiscula) c (L etra c M inscula) 0 (Z ero ) 9 (N o ve) #

D escrio C aracteres em b ranco no so arm azenad o s T o d o s o s caracteres estaro em m aisculo s at q ue ap area o caractere < . T o d o s o s caracteres estaro em m insculos at que aparea o caractere > . T o do s os caracteres estaro arm azenad o s co m o fo ram d igitad o s p elo usurio . O s caracteres ap s a b arra so tratad o s co m o literais. F az co m q ue ap enas os caracteres alfab ticos sejam aceitos na p osio o nde se enco ntra o L , m as o s caracteres n o p o d em ser o m itid o s p elo usurio . F az co m q ue ap enas os caracteres alfab ticos sejam aceitos na p osio o nde se enco ntra o l, m as os caracteres po d em ser o m itid os p elo usurio . F az co m q ue ap enas o s caracteres alfanum rico s sejam aceito s na p o sio o nd e se enco ntra o A , m as o s caracteres n o p od em ser om itid o s pelo usurio. Q uaisq uer caracteres p o dem ser aceitos na p osio o nde se encontra a letra C , m as o s caracteres n o p o d em ser o m itid o s p elo usurio . F az co m q ue ap enas o s caracteres alfanum rico s sejam aceito s na p o sio o nd e se enco ntra o A , m as o s caracteres n o p od em ser om itid o s pelo usurio. Q uaisq uer caracteres p o dem ser aceitos na p osio o nde se enco ntra a letra C , m as o s caracteres p o d em ser o m itid os p elo usurio . F az co m q ue ap enas os caracteres num ricos sejam aceitos na p osio o nd e se enco ntra o Z ero , m as o s caracteres n o p od em ser om itid o s p elo usurio. F az co m q ue ap enas os caracteres num ricos sejam aceitos na p osio o nd e se enco ntra o N o ve, m as o s caracteres p o dem ser o m itido s pelo usurio . F az co m q ue ap enas os caracteres num ricos e sinais de ad io (+ ) o u sub trao (-) sejam aceito s na po sio ond e se enco ntra o # , m as os caracteres po d em ser o m itido s pelo usurio . U sad o p ara sep ara H o ras, M inutos e S egund o s. U sad o p ara sep ara D ias, M eses e A no s. U sad o p ara inserir esp ao s na caixa d e ed io

: (D ois P o nto s) / (B arra N orm al) _ (U nd er_ S co re)

AutoSelect: Para True todo o texto ser selecionado automticamente quando o controle MaskEdit receber o foco.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.66

CINCIA DA COMPUTAO - DELPHI

Exerccio Elaborar um aplicativo para receber o Nome , Data de Admisso e o Salrio do Empregado usando o componente MaskEdit para formatar e ajudar a validao. Nome : Campo Obrigatrio , tamanho mximo de 25 , converter para maisculo via mscara. Data de Admisso: Campo Obrigatrio e com data Vlida no formato dd/mm/aaaa e menor que a data corrente. Salrio : Campo Obrigatrio com o tamanho mximo de 7 dgitos e 2 decimais.

Configurao - EditMask Nome, Data e Salrio

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.67

CINCIA DA COMPUTAO - DELPHI

Cdigo procedure TForm1.ButtonOKClick(Sender: TObject); begin // Verificar o Nome if trim(MaskEditNome.Text) = '' then begin ShowMessage('Falta Nome do Funcionrio'); MaskEditNome.SetFocus; Exit; end; // Verificar a Data if trim(MaskEditAdmissao.Text) = '/ /' then begin ShowMessage('Falta informar a data de admisso'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar a Data if length(trim(MaskEditAdmissao.Text)) < 10 then begin ShowMessage('Informar a Data no formato dd/mm/aaaa'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar a Data Try StrToDate(MaskEditAdmissao.Text); Except on EconvertError do begin ShowMessage('Data de Admisso Invlida'); MaskEditAdmissao.SetFocus; Exit; end; end; // Verificar a Data if StrToDate(MaskEditAdmissao.Text) > date then begin ShowMessage('Data de Admisso Maior que a Data Corrente'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar o Salrio if (trim(MaskEditSalario.Text) = '') or (StrToFloat(MaskEditSalario.Text) = 0 ) then begin ShowMessage('Falta o Salrio do Funcionrio'); MaskEditSalario.SetFocus; Exit; end; // Mostrar os Dados ShowMessage('Nome: ' + MaskEditNome.Text + chr(13) + chr(10) + 'Admisso : ' + FormatDateTime('dd/mm/yyyy',strtodate(MaskEditAdmissao.Text)) + chr(13) + chr(10) + 'Salrio : ' + FormatFloat('R$ ##,###.#0',StrToFloat(MaskEditSalario.Text)/100));

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.68

CINCIA DA COMPUTAO - DELPHI


Execuo

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.69

CINCIA DA COMPUTAO - DELPHI

6. Caixas de Mensagens, Entrada de Dados e Dialogos


de fundamental importncia a boa interao entre uma aplicao e seu usurio. Muitas vezes a garantia desta boa interao se traduz pelas facilidades que o usurio encontra para lidar com a aplicao. Esta facilidade, por sua vez, pode ser definida pelo uso apropriado de caixas de mensagens, sempre informando o que est acontecendo, e de caixas de entrada de dados, o que importante para evitar a omisso de informaes. A partir disso, gostaramos de demonstrar procedimentos e funes no Delphi para entrada de dados e para o tratamento de mensagens.

6.1 Caixas de Mensagem


As caixas de Mensagens so particularmente teis para informar o usurio sobre um determinado processo que est ocorrendo durante o funcionamento da aplicao ou, sobre um processo cuja ocorrncia depende de decises tomadas pelo prprio usurio. Tais caixas so amplamente utilizadas para mostrar erros ou mensagens de advertncia e informao. O Delphi possui cinco comandos para a construo de caixas de dilogo.

6.1.1 MESSAGEDLG
Exibe uma mensagem personalizada, numa caixa de dilogo com um ou mais botes de presso ( por exemplo , botes Ok e Cancelar ou, ainda, Sim e No) e, com um cone ilustrativo. Sintaxe: MESSAGEDLG (Mensagem, cone Ilustrativo, Tipos de Botes, HelpCtx); Onde: cone Ilustrativo: Valor MtInformation MtError MtWarning MtConfirmation MtCustom Tipos de Botes: Valor MbYes MbNo MbOK MbCancel MbHelp MbAbort MbRetry MbAll Significado Um boto com um tick verde e a palavra Yes na superfcie. Um boto com um smbolo de proibido e a palavra No na superfcie. Um boto com um tick verde e a palavra OK na superfcie. Um boto com um X vermelho e a palavra Cancel na superfcie. Um boto com um ? vermelho e a palavra Help na superfcie. Um boto com um tick vermelho a palavra Abort na superfcie. Um boto com um homem verde e a palavra Retry na superfcie. Um boto com dois ticks verdes e a palavra All na superfcie. Significado I Azul representativo de uma mensagem informativa. Sinal vermelho de parada, indicando uma operao ilegal sendo executada. ! Amarela representativa de uma operao de risco que exige ateno. ? Verde Iniciativa da necessidade de uma deciso do usurio. No possui nenhum cone ilustrativo.

Valor Retornado para os Botes: Valor MrYes MrNo MrOK MrCancel MrHelp MrAbort MrRetry MrAll Significado Selecionou o boto Yes. Selecionou o boto No. Selecionou o boto OK. Selecionou o boto Cancel. Selecionou o boto Help. Selecionou o boto Abort. Selecionou o boto Retry. Selecionou o boto All.

HelpCtx: Parmetro que define qual a tela de ajuda apropriada para a caixa, se esta a possuir. O zero indica que esta caixa no tem uma tela de ajuda associada. Exemplos: MessageDlg (Bem Vindo ao Object Pascal!, MtInformation, [MbOK], 0); MessageDlg (Confirma Atualizao ?, MtConfirmation, [MbYes, MbNo], 0);

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.70

CINCIA DA COMPUTAO - DELPHI

IF MessageDLg (Finalizar ?, MtWarning, [MbYes, MbNo], 0) = MrYes then Form1.Close;

6.1.2 MESSAGEDLGPOS
Similar a MessageDlg. A nica diferena que sua posio deve ser definida pelo usurio, no ficando obrigatrio a caixa de mensagem no centro da tela. Sintaxe: MESSAGEDLGPOS (Mensagem, cone Ilustrativo, Tipos de Botes, HelpCtx, PosX, PosY);

6.1.3 SHOWMESSAGE
Exibe uma caixa de mensagem simples com o boto OK. Sintaxe: SHOWMESSAGE (Mensagem); Exemplo: ShowMessage (Programas Delphi so mais produtivos!);

6.1.4 SHOWMESSAGEPOS
Exibe uma caixa de mensagem simples com o boto OK especificando a posio da caixa na tela.. Sintaxe: SHOWMESSAGEPOS (Mensagem, PosX, PosY); Exemplo: ShowMessagePos (Delphi um produto da Borland, 150, 300);

6.1.5 MESSAGEBOX
Como vimos, algumas caixas de mensagens permite utilizao de vrios botes de presso, cuja finalidade permitir a interao com o usurio. No obstante, a legenda de tais botes escrita em ingls, o que pode gerar algumas incovenincias para o desenvolvedor. Uma maneira de contornar o problema utilizar este comando. Alm disso, ele permite que voc defina o ttulo e o texto da caixa. Sintaxe: Application.MessageBox (Mensagem, Ttulo, Tipo de Botes); Exemplo: IF Application.MessageBox ('Finalizar o Aplicativo?', 'Sada do Aplicativo',Mb_YesNoCancel) = IdYes then Form1.Close;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.71

CINCIA DA COMPUTAO - DELPHI

6.2 Caixas de Entrada de Dados


Caixas de Entrada de Dados podem ser muito importantes uma vez que se constituem numa forma prtica de solicitar a participao direta do usurio via teclado. No Delphi, estas caixas podem ser automatizadas atravs de dois comandos:

6.2.1 INPUBOX
Exibe uma caixa na qual voc define o ttulo, um texto explicativo e um valor padro digitado, cabendo ao usurio fornecer ou no uma string. Se o usurio pressionar o boto Cancel o valor digitado no ser atribudo a varivel. Sintaxe: InputBox ( Ttulo, Texto Explicativo, Valor Padro); Exemplo : Escola := InputBox (Informaes de Entrada, Identificao da Escola:, Face-Fumec);

6.2.2 INPUQUERY
Exibe uma caixa na qual voc define o ttulo, um texto explicativo, uma varivel para receber o valor digitado. A funo retorna True se o usurio pressionou o boto OK. Sintaxe: InputQuery ( Ttulo, Texto Explicativo, Varivel para Recepo de Dados); Exemplo: procedure TForm1.FormActivate(Sender: TObject); Var Escola : String; begin Escola := 'Face-Fumec'; if Inputquery ('Informaes de Entrada', 'Identificao da Escola:', Escola) then ShowMessage ('Pressionou OK' + Digitou: + Escola); end;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.72

CINCIA DA COMPUTAO - DELPHI

6.3 Caixas de Dilogo


A Guia Dialogs, contm dez componentes usados para criar as vrias caixas de dilogo comuns no Windows. As caixas de Dilogo so usadas para especificar arquivos ou selecionar ajustes. O uso das caixas de dilogo fornecidas no Delphi pode economizar tempo e ajudar a dar uma aparncia e um comportamento consistente aos seus aplicativos. Esses componentes esto descritos apenas brevemente na tabela abaixo. Consulte a ajuda on line ou os manuais do Delphi para obter mais informaes sobre cada um deles.

10

Nmero do cone 1 2 3 4 5 6 7 8 9 10

Nome ou Rtulo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog FontDialog ColorDialog PrintDialog PrinterSetupDialog FindDialog ReplaceDialog

Finalidade Exibe caixa de abertura de arquivos. Exibe caixa de salvamento de arquivos. Exibe caixa de abertura de figuras. Exibe caixa de salvamento para arquivos de figuras. Exibe caixa de formatao de fontes. Exibe caixa de formatao de cores. Exibe caixa de controle de impresso. Exibe caixa de configurao de impresso. Exibe caixa de dialgo para localizao de textos. Exibe caixa de dialgo para localizao e substituio de textos.

7. Projetando Barras de Menus


Agora vamos dedicar construes de barras de menus. Este um dos mais importantes elementos da interface com usurio de qualquer aplicativo Windows. A ttulo de exemplificao do recurso, construiremos um pequeno aplicativo para edio de textos que facilitar sua compreenso.

7.1 Exemplo de Projeto da Barra de Menu em uma aplicao


Para construirmos uma barra de menu, precisaremos, primeiro, de um novo projeto (clique no menu File/New aplication) e, depois, no componente MainMenu na pgina Standard. D um clique neste componente e em seguida no interior do formulrio. Clique duplo sobre o cone do MainMenu no seu formulrio, isto ativar o Menu Designer, observe-o na figura abaixo:

O primeiro item do menu ainda no foi definido. A partir do momento em que o definirmos o Menu Designer ir destacar um prximo item. Para definirmos o item Arquivo, basta digitarmos esta palavra na propriedade Caption do menu; o Delphi se encarregar de inseri-l corretamente. Caso voc digite &Arquivo, o item ter com tecla de atalho a letra sublinhada, ajuste tambm a propriedade Name do menu com um nome padronizado como MnuArquivo .

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.73

CINCIA DA COMPUTAO - DELPHI

Neste instante, temos definidos vrios menus que sero teis no aplicativo que estamos desenvolvendo. Definiremos agora as opes de cada um. Para isto, clique no menu Arquivo do formulrio e, clique no item em branco logo abaixo. Agora digite as opes deste menu da maneira como elas se apresentam na figura seguinte:

Importante: Para obter o efeito da linha separadora das opes Arquivo e Sair, no item abaixo de Novo, digite (-) hfen.

Defina tambm as opes do menu Editar. Siga a figura abaixo:

Uma vez construdo o menu principal do aplicativo, construiremos sua tela e escreveremos seu cdigo. Comeando pela tela do formulrio, na pgina Standard, selecione o componente Memo e clique no formulrio (veja a figura abaixo).

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.74

CINCIA DA COMPUTAO - DELPHI

At agora, embora tenhamos o menu aplicativo pronto, suas opes no executam absolutamente nada. Para resolvermos este problema necessrio que ao serem clicadas, portanto ao ativarem o evento OnClick, executem um cdigo correspondente. Para escrever o cdigo de cada opo, basta selecionar a opo desejada a partir do prprio formulrio. O Delphi o remeter, no Code Editor, precisamente ao evento OnCLick do boto selecionado. Escreveremos inicialmente o cdigo das opes Arquivo/Novo e Arquivo/Sair. Veja a seguir:

Nosso prximo passo ser escrever o cdigo para as opes do Menu Editar. Comearemos com as trs ltimas opes para depois tratarmos da primeira opo. Veja o cdigo abaixo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.75

CINCIA DA COMPUTAO - DELPHI

Por fim, a opo Editar Fonte. Seu objetivo ser o de permitir a mudana do estilo de letra do texto escrito no campo Memo. Para realizar isto, precisamos, primeiro, que voc insira no formulrio o componente FontDialog da pgina Dialog. E logo depois escreva o cdigo abaixo no evento OnClick da opo Editar Fonte.

7.2 Definindo ShortCuts (Atalhos para os itens do Menu)

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.76

CINCIA DA COMPUTAO - DELPHI


Como de conhecimento dos usurios de aplicativos windows, todos eles possuem ShortCuts que so teclas de atalho atravs das quais pode-se acessar a qualquer opo sem usar o mouse. No aplicativo desenvolvido nas pginas anteriores, o uso de shortcuts foi proposto atravs do acrscimo do caracter & antes das iniciais das opes do menu. Contudo isto apenas pode no ser suficiente. Para completar a tarefa, definindo tambm combinaes de teclas que executem instantaneamente comandos do menu precisamos: Clique duplo no cone do Menu Designer; Clicar em uma das opes do menu para especificao do shortcut; Indicar a combinao de teclas que ativar a opo atravs da propriedade ShorCut no Object Inspector.

7.3 Construindo Sub-Menus


Atravs do Menu Designer, o Delphi permite que cada opo do menu principal contenha um ou vrios sub-menus. Para definlos: Clique duplo no Menu Designer; Clique na opo a qual deseja associar um sub-menu; Clique novamente, com o boto direito e selecione a opo Create SubMenu.

7.4 Removendo e Reposicionando opes de Menu


Estas duas operaes so particularmente importantes durante a etapa de desenvolvimento da barra de menus. E isto porque voc pode querer reorganizar a barra de menus mesmo depois de pronta. Para remover uma opp de menu, selecione-a e pressione a tecla DELETE ou SHIFT+DELETE. Para reposicionar itens do menu, clique e arraste-os do lugar original para o lugar desejado.

8. Menu Pop-Pup
um Menu que aparece quando o usurio aperta o boto direito do mouse na aplicao

8.1 Exemplo de Projeto usando Popup Menu


O Exemplo de Popup Menu projeta um menu que acionado ao pressionar o boto direito do mouse na caixa de texto Valor-1 e no Boto de presso OK.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.77

CINCIA DA COMPUTAO - DELPHI

Para construirmos o Menu Popup, precisaremos, primeiro, de um novo projeto (clique no menu File/New aplication) e, depois, no componente PopupMenu na pgina Standard. D um clique neste componente e em seguida no interior do formulrio. Clique duplo sobre o cone do PopupMenu no seu formulrio, isto ativar o PopupMenu Designer, observe-o na figura abaixo:

A Propriedade PopMenu usada para associar o componente ao PopupMenu.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.78

CINCIA DA COMPUTAO - DELPHI

Executando o Exemplo:

A Janela de Cdigo para acionar o PopupMenu e executar o cdigo associado as opes do PopMenu.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.79

CINCIA DA COMPUTAO - DELPHI

9. Explorando o Object Inspector


O Object Inspector uma das janelas componentes do Delphi de maior importncia no contexto do desenvolvimento de aplicaes. Atravs dela podemos alterar as caractersticas dos objetos nos formulrios e programar os eventos sobre os quais tero efeitos. Desejamos agora detalhar certos pontos como forma de familiariz-lo um pouco mais com este recurso.

Propriedades

Eventos

9.1 Eventos LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.80

CINCIA DA COMPUTAO - DELPHI


Como vimos os eventos so as respostas que o programa d aes do usurio sobre ele. Assim, quando queremos que determinado cdigo seja executado quando o usurio clicar um boto do formulrio, devemos escrev-lo no evento OnClick do boto. Alm do evento OnClick, existem muitos outros que se tornam disponveis para determinados componentes. Vejamos abaixo algumas descries: OnActivate: Prprio de formulrios, permite a escrita de cdigos que sero executados todas as vezes que a janela do formulrio tornar-se visvel. OnCLick: Executa o cdigo a partir de um clique na superfcie de determinado objeto. OnCloseQuery: Aciona o cdigo correspondente quando houver tentativas de fechar o formulrio. OnClose: Aciona o cdigo correspondente quando o formulrio for efetivamente fechado. OnCreate: Referente ao momento que o formulrio exibido a primeira vez. Geralmente associa-se um cdigo que deve ser executado apenas uma nica vez, caso o formulrio no seja recriado. OnDeactivate: Prprio de formulrios, permite a execuo de cdigos que sero executados quando a janela do formulrio for posicionada em segundo plano. OnDestroy: Prpria da programao orientada a objetos (OOP), executa um cdigo quando os recursos do sistema reservados para uma instncia de objeto forem desalocados. OnHide: Aciona o cdigo correspondente quando o formulrio for ocultado. OnKeyDown, OnKeyPress, OnKeyUp: Executam cdigos referentes a leituras do teclado. OnDragDrop, OnDragOver: Executam cdigos associados a operaes de arraste. OnMouseDown, OnMouseMove, OnMouseUp: Executam cdigos referentes a operaes de clique e de movimentao do mouse.

9.2 Propriedades
As propriedades so atributos dos objetos/componentes com os quais podemos interagir. Sua importncia vital para a programao Delphi uma vez que, o estado de cada propriedade pode e, as vezes, precisa ser regulado atravs de comandos apropriados. O bom uso das propriedades determina em boa parte, o bom uso do Delphi. Cada objeto ou componente tem propriedades especificas para as suas finalidades. Suas configuraes podem ser feitas mediante o Object Inspector ou mediante linhas de cdigo. Por exemplo, para mudar a legenda de um boto de presso. J as configuraes alteradas atravs de linhas de comando so da maior importncia durante o tempo de execuo do projeto. Muitas vezes tais mudanas podem ser necessrias. Um exemplo seria mudar a fonte de um texto em funo de ajustes promovidos pelo usurio atravs de uma caixa de dilogo adequada. Caso voc deseje aprofundar-se na programao Delphi, um primeiro e importantssimo passo seria o de observar com ateno as propriedades exibidas no Object Inspector enquanto clica em cada objeto alocado na janela do formulrio em uso e tentar compreender a importncia de cada propriedade. Para manipular o estado de uma propriedade no Object Inspector, basta dar um clique na lacuna ou edit frente e observar se ela trs sub-opes. Caso seja mostrado um combo, isto significar que a propriedade permite certo nmero de possibilidades de ajustes. Caso seja mostrado apenas um edit, voc dever digitar alguma coisa (p.e. a propriedade Caption que define a legenda de um boto de presso). Caso observe um sinal (+) frente do nome da propeiedade, isto significar que o acesso s sub-opes se d atravs de um clique duplo sobre o nome da propriedade. Para manipular o estado de uma propriedade atravs de linhas de comando , voc dever trabalhar um pouco com programao orientada objetos. Por exemplo, para definir um boto de presso em estado desativado ser necessrio o cdigo: Boto1.Enabled := False; Traduzindo numa regra geral: NomeDoObjeto.NomeDaPropriedade := NovoValor ou Estado;

10. Formulrios MDI e SDI ( Multiple e Single Docto Interface)


At agora, nos concentramos em apresent-lo ao Delphi no que tange ao uso de um formulrio simples. Contudo, podemos supor que em aplicaes mais complexas voc pode desejar lanar mo de mais de um formulrio; o que na verdade, acaba sendo uma prtica bem comum. Portanto, levando isto em conta, desejamos expor aqui algumas tcnicas para o desenvolvimento de uma aplicao composta por vrios formulrios.

10.1 Formulrio SDI Single Document Interface


SDI ou Single Document Interface, uma abordagem para a criao de formulrios que permite a construo de diversas janelas, ou formulrios, modais ou no modais, que podem ser sobrepostas. Uma janela no-modal aquela que, aps a sua abertura, permite a ativao de outras janelas s quais se sobrepe. J as janelas modais, no permitem esta operao enquanto o usurio no fech-la.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.81

CINCIA DA COMPUTAO - DELPHI


Vamos desenvolver uma aplicao simples que permita mostrar melhor a utilizao de formulrios SDI. Siga as instrues abaixo: 1. 2. Crie uma nova aplicao atravs do comando File/New application. Construa o formulrio abaixo, dando os nomes: CmdVerde, CmdAmarelo, CmdAzul e CmdFechar, respectivamente, para os quatro botes;

3. 4.

Para criar cada uma das trs janelas( verde, amarela e azul); clique em File/New Form e, na propriedade Color do formulrio, selecione a cor correspondente janela criada. No evento OnCLick dos botes de presso, escreva o cdigo abaixo e , a seguir, execute a aplicao.

Veja abaixo o exemplo da aplicao:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.82

CINCIA DA COMPUTAO - DELPHI 10.2 Formulrio MDI Multiple Document Interface


MDI ou Multiple Document Interface, uma abordagem para a criao de formulrios que permite construir uma janela, ou formulrio principal que funciona como um container para outras janelas. Estas outras janelas sero abertas dentro dos limites da janela principal e , somente estaro disponveis a partir dela. Se a janela principal for fechada, todas as demais em seu interior o sero. Para ilustramos melhor, faremos uma iluso ao Microsoft Word, onde podemos trabalhar com vrios documentos dispostos em janelas diferentes; ao fecharmos e o Word, todos os documentos que estavam sendo utilizados so automaticamente fechados. Desenvolveremos, semelhana da aplicao anterior, uma nova aplicao para demonstrar a utilizao da abordagem MDI. Siga os passos abaixo: 1. 2. Crie uma nova aplicao atravs do comando File/New application; Utilizando tambm o componente MainMenu, da pgina Standard, construa o formulrio abaixo:

3. 4. 5.

Defina na propriedade FormStyle deste formulrio, a opo fsMDIForm. Isto indica que este formulrio ser considerado o principal. Clique em File/New Form e dedina sua propriedade FormStyle para fsMDIChild. Isto indica que este novo formulrio ser um sub-formulrio (filho) do principal. No evento OnClick da opo Nova, no menu Janela, escreveremos o cdigo (veja listagem abaixo) responsvel pela criao e utilizao de diversos sub-formulrios, a partir da execuo desta aplicao MDI.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.83

CINCIA DA COMPUTAO - DELPHI


6. O cdigo listado abaixo, contm os comandos necessrios ao evento Onclick da opes: Organizar em Cascata e Organizar Lado a Lado.

7. Por fim, para garantir o bom funcionamento completo desta aplicao, devemos introduzir o cdigo abaixo no evento OnClose do Form2. Este cdigo garantir que as janelas ou sub-formulrios criados semelhana do Form2, desaloquem recursos que utilizam do sistema, no momento em que forem fechadas.

Finalmente, agora poderemos executar a aplicao e colher seus resultados. Contudo, cabe uma observao final: lembre-se dos comandos utilizados no evento OnClick da opo Nova, pois podero ser teis para desenvolver aplicaes que, embora utilizem vrios sub-formulrios, os criem e exibam em momentos diferentes e atravs de outros comandos acionados pelo usurio.

11. Utilizando a rea de Transferncia


11.1 Objetivo
Acreditamos ser de grande importncia, no contexto das aplicaes que voc desenvolver a partir do Delphi, a manipulao de informaes atravs dos recursos oferecidos pela rea de Transferncia (ClipBoard) do Windows 95. Tais recursos compreendem os comandos: copiar, recortar e colar.

11.2 Manipulando Textos


Preparamos um exemplo a seguir que visa ilustrar uma das situaes mais comuns na utilizao da rea de transferncia. O nosso exemplo fornece uma aplicao composta por um campo memo cuja finalidade, ser permitir ao usurio a digitao de um texto qualquer e; de alguns botes cujo objetivo ser demonstrar os recursos de cpia, recorte e colagem aplicados em textos. Para iniciarmos o desenvolvimento desta aplicao, clique no menu File/New application e, em seguida, construa o formulrio abaixo. Ateno, aos trs botes de presso do formulrio, daremos respectivamente (na propriedade Name) os nomes de CmdCopiar, CmdRecortar e CmdColar.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.84

CINCIA DA COMPUTAO - DELPHI

Agora devemos escrever o cdigo correspondente a cada um dos botes de presso de modo que, possam enviar ou resgatar informaes pela rea de Transferncia. Veja o cdigo a seguir:

Observao: a respeito do cdigo acima, vale dizer que utilizamos a propriedade Enabled dos botes, como forma de controlarmos o acesso do usurio. Da maneira como fizemos, aproximamos o funcionamento destes trs botes do padro estabelecido pelo programa Windows. Assim, se o usurio j tiver utilizado os botes copiar ou recortar, estes ficaro desabilitados, ao passo que o boto colar estar habilitado e, vice-versa.

11.3 Manipulando Figuras


O uso da rea de Transferncia no Delphi no se restringe a textos. Pode ser de grande importncia para uma aplicao. O envolvimento de figuras (particularmente Bitmaps) em operaes de transferncia. Para isto, devemos utilizar um componente especial chamado Image, que possibilitar reservarmos um espao no formulrio para a figura que ser manipulada. Assim sendo, preparamos outra aplicao que ilustrar melhor as tcnicas utilizadas. Para iniciarmos o desenvolvimento desta aplicao:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.85

CINCIA DA COMPUTAO - DELPHI


1. 2. 3. 4. Clique no menu File/New application: Insira o componente OpenDialog na pgina Dialog. Atravs dele abriremos o arquivo que contm uma figura. Insira dois componentes Image atravs da pgina Adicional e, na propriedade Name de ambos, defina os nomes: AreaDaImagem e ImagemColada. Insira os botes de presso dando-lhes o nome de CmdAbrir, CmdCopiar e CmdColar. Veja figura abaixo.

5.

Escreva o cdigo referente ao CmdAbrir:

6.

Escreva o cdigo a seguir referente aos dois botes de presso restantes:

Antes de concluir o programa, no se esquea de acrescentar a clusula Unit a biblioteca ClipBrd.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.86

CINCIA DA COMPUTAO - DELPHI

12. Entrada, Sada e Impresso


Este captulo focaliza a transferncia de informaes para dentro e para fora de suas aplicaes. Voc aprender sobre I/O de arquivo, incluindo vrios modos de passar, armazenar e recuperar informaes em arquivos de disco. Voc tambm aprender sobre os fundamentos do registro de seu trabalho em papel a impresso. Um arquivo nada mais do que um conjunto organizado de dados, armazenado em disco rgido, disquete, CD-ROM, fita ou outro meio. Existem dois tipos bsicos de arquivos: Texto e Binrio.

12.1 Arquivos de Texto


Os arquivos de textos so simples arquivos contendo caracteres ASCII puros. Os dados de um arquivo texto normalmente so armazenados e recuperados em ordem sequencial, uma linha por vez, e cada linha termina com os caracteres de retorno de carro (#13 ou $D ou Chr(13)) e avano de linha (#10 ou $A ou Chr(10)). Como os dados so manipulados sequencialmente, fazer pesquisas em arquivos grandes ou mudanas em arquivo de texto pode ser bastante ineficaz. Entretanto, existem muitas situaes, como a exportao de dados para um formato padro, o arquivo de texto pode ser a melhor opo. Para usar um arquivo de texto necessrio declarar uma varivel do tipo TextFile. Var Texto : TextFile;

Veja algumas funes e procedures que voc precisa conhecer para trabalhar com arquivos de texto, e depois construa um programa que armazena e l dados em um arquivo de texto. Sintaxe AssignFile(NomeInterno, NomeExterno) Rewrite(NomeInterno) Reset(NomeInterno) Readln(NomeInterno,NomeLinha) Writeln(NomeInterno,NomeLinha) CloseFile(NomeInterno) EOF(NomeInterno) Tipo Proc Proc Proc Proc Proc Proc Func Descrio Associar o Nome interno do arquivo ao Nome Externo. Cria e abre um novo arquivo. O arquivo existente com o mesmo nome ser sobrescrito. Abre um arquivo existente. O arquivo de texto aberto no modo read-only. L a linha de texto corrente de um arquivo de texto aberto. Cada linha termina com a combinao CR/LF. Escreve uam linha de texto no arquivo aberto, com uma combinao CR/LF no final. Termina de atualizar o arquivo corrente e fecha o arquivo. Permite identificar o final do arquivo, retornando um valor booleano.

Exemplo de um Editor de Textos Simples


Vamos agora escrever um editor de textos simples chamado WinEdit para aplicar os assuntos mencionados anteriormente. Nesse exemplo, use os componentes Memo, OpenDialog, SaveDialog e MainMenu. Ajuste as propriedades dos componentes de acordo com a tabela abaixo:

Componente
Memo Name Lines Align ScrollBar Name Filter Name Filter Filter Filter Name Filter Filter Name Filter Name Filter Filter Filter Name Filter Filter DefaultExt

Propriedade

Valor
MemEditor Vazio alClient ssVertical DlgAbrir Arquivos de Textos *.txt Todos Arquivos *.* DlgSalvar Arquivos de Textos *.txt Todos Arquivos *.* Txt

OpenDialog

SaveDialog

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.87

CINCIA DA COMPUTAO - DELPHI


Formulrio: ,

Janela de Cdigo para o item de Menu Abrir:

Janela de Cdigo do Item de Menu Salvar:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.88

CINCIA DA COMPUTAO - DELPHI

Janela de Cdigo do Item de Menu Sair:

12.1.1 Arquivos de Inicializao O Objeto TInifile


Para manipular arquivos .INI, o Delphi oferece o objeto Tinifile. O Objeto TIniFile, declarado na unit Inifiles, permite que sua aplicao escreva e leia um arquivo .INI. Para usar o objeto TIniFile, voc deve adicionar a unit Inifiles clusulas uses de sua aplicao.

Criando um Arquivo de Configurao


Use o mtodo Create para criar memria para um objeto do tipo TIniFile, passando como parmetros o nome do arquivo a ser criado. NomeObjeto := TIniFile.Create(NomedoArquivo.INI); Pode ser informado o junto ao nome o caminho de onde se encontra o arquivo, mas o padro armazenar o arquivo .INI no subdiretrio do Windows. Para criar as sees, as entradas e os valores das entradas, utilize os seguintes mtodos: WriteBool - Para criar um valor booleano; WriteInteger - Para criar um valor inteiro; WriteString - Para criar uma string. Use o mtodo Free para liberar a memria utilizada pelo objeto TIniFile criado: NomeObjeto.Free; O exemplo abaixo cria, ao clicar no boto Button1, um arquivo .INI chamado NovoJogo, com duas sees: Opcoes (com duas entradas) e Configuracao (com uma entrada):

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.89

CINCIA DA COMPUTAO - DELPHI


Procedure TForm1.Button1Click(Sender:TObject); Var IniJogo : TIniFile; Begin IniJogo := TIniFile.Create(NOVOJOGO.INI); IniJogo.WriteBool(Opcoes,Som,True); IniJogo.WriteInteger(Opcoes,Nivel,3); IniJogo.WriteString(Configuracao,Nome,Oliveira); IniFile.Free; End; O arquivo de configurao NOVOJOGO.INI armazenado no diretrio \Windows, e possui o seguinte formato: [Opcoes] Som=1 Nivel=3 [Configuracao] Nome=Oliveira Quando voc for distribuir sua aplicao, no esquea de oferecer o arquivo .INI. Outra opo criar o arquivo .INI atravs de um programa de instalao do seu aplicativo, oferecendo ao usurio a possibilidade de personalizar o arquivo .INI ja na instalao.

Lendo o Arquivo de Configurao


Quando seu aplicativo for executado, deve ler o arquivo .INI existente. Isto pode ser feito, por exemplo, no evento OnCreate do Formulrio, ou na seo Inicialization. Para ler um arquivo .INI, utilize os mtodos: ReadBool - Para ler uma entrada com valores booleanos; ReadInteger - Para ler uma entrada com valores inteiros; ReadString - Para ler uma entrada com valores string. Atribua o resultado da leitura a variveis globais (criadas na clusula var da seo interface da unit do formulrio principal), que podem ser utilizadas por toda a aplicao, quando necessrio. No esquea de adicionar a unit do formulrio principal a clusula uses da seo implementation quando for utilizar as variveis. O exemplo abaixo l as entradas do arquivo NOVOJOGO.INI, mostrando para o usurio em Labels: Var Form1 : Tform1; Vsom : Boolean; Vnivel : Integer; Vnome : String; IniJogo : Tinifile; Implementation {$R *.DFM} Procedure TForm1.FormCreate(Sender:TObject); Begin Label1.Caption := Nvel+InttoStr(Vnivel); If Vsom then Label2.Caption := Som Ligado); else Label2.Caption := Som Desligado); Label3.Caption := Nome : + Vnome; End; Initialization Begin IniJogo := TIniFile.Create(NOVOJOGO.INI); Vsom := IniJogo.ReadBool(Opcoes,Som,False); Vnivel := IniJogo.ReadInteger(Opcoes,Nivel,-1); Vnome := IniJogo.ReadString(Configuracao,Nome,); IniFile.Free; end;

Modificando um Arquivo .INI


Voc pode utilizar os mtodos WriteString, WriteBool e WriteInteger para modificar as entradas de um arquivo .INI j existente. Por exemplo o formato de mode estabelecido no WIN.INI, seo [Intl], entrada sCurrency, para R$: Procedure TForm1.Button1Click(Sender:TObject); Var IniMoeda : TIniFile; Begin IniMoeda := TIniFile.Create(WIN.INI); IniMoeda.WriteString(Intl,sCurrency,R$); IniMoeda.Free; End;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.90

CINCIA DA COMPUTAO - DELPHI Outras Operaes com Arquivos .INI


Atravs do mtodo ReadSection, voc l todas as entradas de um seo de um arquivo .INI para um objeto da classe Tstring, como ListBox, ComboBox ou Memo: ReadSection(Const Seo:String; ListaEntradas: TStrings); A constante Seo determina a seo que ser lida. O parmetro ListaEntradas corresponde ao objeto do tipo TString que armazenar as entradas (por exemplo, ListBox1.Items). Atravs do mtodo ReadSectionValues, voc l todas as entradas e seus valores de uma seo do arquivo .INI para um objeto da classe TString, como ListBox, ComboBox ou Memo: ReadSectionValues(Const Seo:String; ListaEntradas: TStrings); A constante Seo determina a seo que ser lida. O parmetro ListaEntradas corresponde ao objeto do tipo TString que armazenar as entradas (por exemplo, memo1.lines). Voc pode usar a propriedade Values de uma string ou lista de strings para acessar uma string especfica na lista de string. Para apagar uma seo inteira de uma arquivo .INI use o mtodo EraseSection. A propriedade FileName contm o nome do arquivo .INI que est sendo manipulado pelo objeto TIniFile.

Manipulao de Arquivos
Alguns comandos podem ser uteis para manipular o arquivo .INI :

GetDir
Retorna o diretrio corrente do drive especificado. D pode assumir os seguintes valores: 0 - Default 1-A 2-B 3-C Sintaxe: GetDir(D: Byte; var S: String);

FileExists
A funo FileExist retorna True se o arquivo especificado existe. Sintaxe: FileExists(const FileName: string): Boolean;

DeleteFile
A funo DeleteFile apaga o arquivo especificado do disco. Se o arquivo no poder ser apagado ou no existir retorna falso. Sintaxe: DeleteFile(const FileName: string): Boolean;

12.2 Arquivos Binrios


O outro tipo de arquivo o binrio. Todos os tipos de arquivos que no so de texto se encaixam nessa categoria. Um arquivo binrio simplesmente um arquivo contendo as informaes binrias escritas nele pelo programa. Contudo ao contrrio do arquivo texto, um arquivo aberto como binrio, permite que seu programa leia, arquivo de texto, arquivos de programa, bitmaps, etc. Nesse modo, voc fica responsvel por determinar como vo ser manipulados os dados, quando isto for necessrio. Existem dois arquivos binrios: com tipo e sem tipo.

12.2.1 Arquivos com Tipo


So arquivos para os quais voc decidiu sobre o seu formato ou estrutura e o tipo de dados a serem armazenados, como inteiros, reais, strings e seus comprimentos, etc. Um bom exemplo disso, seria um programa do tipo caderno de endereos. Crie um programa simples para demonstrar isso. Primeiro, crie um novo projeto, salvando a unidade como Uclientes.Pas e o Projeto como Pclientes.Dpr. Em seguida, crie sua estrutura de registro na seo implementation, colocando o cdigo a seguir, imediatamente abaixo de {$R *.DFM}: Type TRClientes = record Nome : String[40]; Endereco : String[40]; Cidade : String[20]; Estado : String[2]; CEP : String[8]; End; Voc criou seu prprio tipo, chamado TRClientes. Esse exemplo usa apenas strings, mas voc poderia usar qualquer outro tipo de varivel (por exemplo, inteiro, real, byte, etc.) em seu tipo de registro. Use este novo tipo para criar algumas variveis para seu programa. Em seguida, imediatamente abaixo do cdigo anterior, insira o seguinte: Var ArqClientes : File of TRClientes; { Nome Interno do Arquivo }

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.91

CINCIA DA COMPUTAO - DELPHI


RClientes : TRClientes; { Varivel para o registro }

ArqClientes uma varivel de arquivo de tipo TRClientes. As variveis de arquivo so usadas com muitas procedures e funes de I/O de arquivos. RClientes uma varivel do tipo TRClientes. Como seu novo tipo, TRClientes, um registro, RClientes se torna um buffer com a estrutura do tipo TRClientes. Isso permite que voc leia ou escreva os dados facilmente no buffer, com uma linha de cdigo, enquanto mantm certa ordem. Cada registro salvo no disco ter o mesmo tamanho, independente dos dados nele introduzidos. Isso tambm conhecido como registro de comprimento fixo e o que est pro trs dos arquivos com tipo. Antes de ir mais longe com o seu programa, d uma olhada nas funes e procedures que usar para trabalhar com arquivos com tipo. Sintaxe AssignFile(NomeInterno, NomeExterno) FileExists(NomeExterno) Rewrite(NomeInterno) Reset(NomeInterno) Read(NomeInterno,NomeLinha) Write(NomeInterno,NomeLinha) Seek(NomeInterno,Posio) FilePos(NomeInterno) FileSize(NomeInterno) EOF(NomeInterno) CloseFile(NomeInterno) Tipo Proc Func Proc Proc Proc Proc Proc Func Func Func Proc Descrio Associar o Nome interno do arquivo ao Nome Externo. Retorna True se o arquivo especificado existir, caso contrrio retorna False. Cria e abre um novo arquivo. O arquivo existente com o mesmo nome ser sobrescrito. Abre um arquivo existente. Ler registros do arquivo. Escrever registros do arquivo. Usada para mover o ponteiro do arquivo para o registro ou posio especificada dentro do arquivo aberto. Recupera a posio corrente do ponteiro do arquivo. Recupera o tamanho de um arquivo aberto em bytes. Retorna zero caso no exista nenhum registro. Permite identificar o final do arquivo, retornando um valor booleano. Termina de atualizar o arquivo corrente e fecha o arquivo.

Exemplo de Projeto Cadastro de Clientes


Anteriormente voc criou o projeto, inseriu um tipo chamado TRClientes e algumas variveis. Acrescente agora ao formulrio, tres Caixas de Edio, cinco Rtulos, um ComboBox, um MaskEdit, nove botes de comando, tres Frames (GroupBox) e um ListView. Veja o formulrio abaixo para o desenho:

Ajuste as propriedades dos Componentes de acordo a tabela abaixo: Componente Form1 Propriedade Name Caption Position BorderIcons.biMaximize BorderStyle Name Caption Enabled Valor FrmClientes Cadastro de Clientes PoScreenCenter False BsSingle FraDados Nenhuma Opo Selecionada False

GroupBox1

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.92

CINCIA DA COMPUTAO - DELPHI


Edit1 Name Text MaxLength Name Text MaxLength Name Text MaxLength Name MaxLength Text Items Name Text EditMask Name Caption Name Caption Hint ShowHint Name Caption Hint ShowHint Name Caption Hint ShowHint Name Caption Hint ShowHint Name Caption Hint ShowHint Name Caption Hint ShowHint Kind Name Caption Enabled Name Caption Hint ShowHint Name Caption Hint ShowHint Name Caption Hint ShowHint Kind Name Visible ViewStyle Hint ShowHint GridLines Columns[0].Caption Columns[0].Width Columns[1].Caption Columns[1].Width Columns[2].Caption Columns[2].Width TxtNome Vazio 40 TxtEndereco Vazio 40 TxtCidade Vazio 20 CmbUF 2 Vazio MG RJ SP MskCep Vazio ##.###-###;0;_ FraOpcoes Opes CmdIncluir &Incluir Incluso True CmdAlterar &Alterar Alterao True CmdExcluir &Excluir Excluso True CmdConsultar &Consultar Consulta de Clientes True CmdLArquivo &L. Arquivo Limpeza do Arquivo True CmdFechar &Fechar Sair do Aplicativo True BkClose FraAcao Ao False CmdOK &OK Saida ou Confirmao da Tarefa True CmdLimpar Lim&par Sada ou Limpeza do Box de Dados True CmdCancelar Cancela&r Sada ou Desistncia da Tarefa True BkClose LvwConsulta False VsReport Selecionar o Nome do Cliente para Alterao/Excluso False True Nome 200 Endereo 200 Cidade 130

Edit2

Edit3

ComboBox1

MaskEdit1

GroupBox2 Button1

Button2

Button3

Button4

Button5

BitBtn1

GroupBox3

Button6

Button7

BitBtn2

ListView1

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.93

CINCIA DA COMPUTAO - DELPHI


Columns[3].Caption Columns[3].Width Columns[4].Caption Columns[4].Width Columns[5].Caption Columns[5].Width Formulrio durante uma atualizao: UF 30 CEP 80 Cdigo 50

Formulrio durante uma Consulta ou Seleo de registro para Alterao/Excluso:

Listagem do Programa Fonte: unit UFrmClientes; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Buttons, ComCtrls; type TFrmClientes = class(TForm)

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.94

CINCIA DA COMPUTAO - DELPHI


FraOpcoes: TGroupBox; CmdIncluir: TButton; CmdAlterar: TButton; CmdExcluir: TButton; CmdConsultar: TButton; FraDados: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; CmdFechar: TBitBtn; FraAcao: TGroupBox; CmdLimpar: TButton; CmdCancelar: TBitBtn; TxtNome: TEdit; TxtEndereco: TEdit; TxtCidade: TEdit; CmbUF: TComboBox; MskCep: TMaskEdit; CmdCadastrar: TButton; LVwConsulta: TListView; CmdLArquivo: TButton; procedure CmdLimparClick(Sender: TObject); procedure TxtNomeKeyPress(Sender: TObject; var Key: Char); procedure CmdFecharClick(Sender: TObject); procedure CmdCadastrarClick(Sender: TObject); procedure CmdIncluirClick(Sender: TObject); procedure CmdCancelarClick(Sender: TObject); procedure CmdConsultarClick(Sender: TObject); procedure CmdAlterarClick(Sender: TObject); procedure CmdExcluirClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure LVwConsultaSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure CmdLArquivoClick(Sender: TObject); procedure LVwConsultaChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); private { Private declarations } public { Public declarations } end;

Type TRClientes = record Excluido : boolean; Nome : string[40]; Endereco : string[40]; Cidade : string[20]; UF : string[2]; Cep : string[8]; End; { Funes e Procedures do Usurio } Procedure LiberaDados; Procedure LiberaOpcoes; Procedure TelaRegistro; Procedure CarregaListView; var FrmClientes: TFrmClientes; ArqClientes : File of TRClientes; RClientes : TRClientes; Posicao : LongInt; PastaArquivo : String; CargaLista : Byte; implementation {$R *.DFM}

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.95

CINCIA DA COMPUTAO - DELPHI


{ Funes e Procedures do Usurio } Procedure LiberaDados; Begin with FrmClientes do begin FraDados.enabled := True; FraAcao.Enabled := True; FraOpcoes.Enabled := False; end; End; Procedure LiberaOpcoes; Begin with FrmClientes do begin FraDados.Caption := 'Nenhuma Opo Selecionada'; FraDados.enabled := false; FraAcao.Enabled := false; FraOpcoes.Enabled := true; end; End; Procedure TelaRegistro; Begin with FrmClientes do begin with RClientes do begin Nome := TxtNome.Text; Endereco := TxtEndereco.Text; Cidade := TxtCidade.Text; UF := CmbUF.Text; CEP := MskCep.Text; end; end; End; Procedure CarregaListView; Var I, P : LongInt; begin CargaLista := 1; FrmClientes.LVwConsulta.Items.Clear; { Limpa Componente } FrmClientes.LVwConsulta.SortType := stNone; {Restaura opo de Sort p/carga} P := 0; for I := 0 to FileSize(ArqClientes) - 1 do begin Seek(ArqClientes,I); Read(ArqClientes,RClientes); If Rclientes.Excluido then Continue; with FrmClientes do Begin LVwConsulta.Items.Add; LVwConsulta.Items.Item[P].Caption := RClientes.Nome; LVwConsulta.Items.Item[P].SubItems.Add(RClientes.Endereco); LVwConsulta.Items.Item[P].SubItems.Add(RClientes.Cidade); LVwConsulta.Items.Item[P].SubItems.Add(RClientes.UF); LVwConsulta.Items.Item[P].SubItems.Add(Formatfloat('##"."###"-"###',StrToFloat(RClientes.Cep))); LVwConsulta.Items.Item[P].SubItems.Add(IntToStr(I)); P := P + 1; end; end; FrmClientes.LVwConsulta.SortType := stText; { Classifica os itens } CargaLista := 0; end; procedure TFrmClientes.CmdLimparClick(Sender: TObject); begin { O Componente ListView est Visivel ? } If LVwConsulta.Visible then Begin FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.96

CINCIA DA COMPUTAO - DELPHI


FraDados.Visible := True; LiberaOpcoes; CmdIncluir.Setfocus; Exit End; { Limpar os Campos } TxtNome.Clear; TxtEndereco.Text := ''; TxtCidade.Text := ''; CmbUF.ItemIndex := -1; MskCep.Clear; If FraDados.Caption = 'INCLUSO' then begin TxtNome.Setfocus; end else begin LiberaOpcoes; CmdIncluir.Setfocus; end; end; procedure TFrmClientes.TxtNomeKeyPress(Sender: TObject; var Key: Char); begin if key = chr(13) then begin case FrmClientes.ActiveControl.TabOrder of 0 : FrmClientes.ActiveControl := TxtEndereco; 1 : FrmClientes.ActiveControl := TxtCidade; 2 : FrmClientes.ActiveControl := CmbUf; 3 : FrmClientes.ActiveControl := MskCep; 4 : FrmClientes.ActiveControl := CmdCadastrar; end; end; end; procedure TFrmClientes.CmdFecharClick(Sender: TObject); begin FrmClientes.Close; end; procedure TFrmClientes.CmdCadastrarClick(Sender: TObject); begin { O Componente ListView est Visivel ? } If LVwConsulta.Visible then Begin FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false; FraDados.Visible := True; LiberaOpcoes; CmdIncluir.Setfocus; Exit End; { Nome do Cliente } If Trim(TxtNome.Text) = '' then begin SHowMessage('Falta Preencher Nome do Cliente'); TxtNome.Setfocus; exit; end; { Endereo do Cliente } If Trim(TxtEndereco.Text) = '' then begin SHowMessage('Falta Preencher Endereo do Cliente'); TxtEndereco.Setfocus; exit; end; { Cidade do Cliente } If Trim(TxtCidade.Text) = '' then begin SHowMessage('Falta Preencher Cidade do Cliente');

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.97

CINCIA DA COMPUTAO - DELPHI


TxtCidade.Setfocus; exit; end; { UF do Cliente } If (trim(CmbUF.Text) = '') or (length(trim(CmbUF.Text)) <> 2) then begin SHowMessage('Falta Selecionar UF do Cliente'); CmbUF.Setfocus; exit; end; { CEP do Cliente } If length(Trim(MskCep.Text)) <> 8 then begin SHowMessage('Falta Preencher CEP do Cliente'); MskCep.Setfocus; exit; end; { Cadastrar Dados } If FraDados.Caption = 'INCLUSO' then { Incluso } Begin RClientes.Excluido := False; seek(ArqClientes,FileSize(ArqCLientes)); TelaRegistro; Write(ArqClientes,RClientes); end Else If FraDados.Caption = 'ALTERAO' then { Alterao } Begin seek(ArqClientes,Posicao); TelaRegistro; Write(ArqClientes,RClientes); end Else If FraDados.Caption = 'EXCLUSO' then { Excluso } Begin RClientes.Excluido := True; seek(ArqClientes,Posicao); Write(ArqClientes,RClientes); End;

ShowMessage(FraDados.Caption +' - Arquivo Atualizado'); { Limpar o Formulrio } if FraDados.Caption = 'INCLUSO' then CmdLimpar.Click else CmdCancelar.Click; end; procedure TFrmClientes.CmdIncluirClick(Sender: TObject); begin FraDados.Caption := 'INCLUSO'; LiberaDados; TxtNome.Setfocus; end; procedure TFrmClientes.CmdCancelarClick(Sender: TObject); begin { O Componente ListView est Visivel } If LVwConsulta.Visible then Begin FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false; FraDados.Visible := True; LiberaOpcoes; CmdIncluir.Setfocus; Exit End; { Cancelar as Atualizaes } CmdLimpar.Click;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.98

CINCIA DA COMPUTAO - DELPHI


LiberaOpcoes; CmdIncluir.setfocus; end; procedure TFrmClientes.CmdConsultarClick(Sender: TObject); begin FrmClientes.Caption := FrmClientes.Caption + ' [Consulta]'; LiberaDados; FraDados.Visible := false; FraDados.Caption := 'CONSULTA'; LVwConsulta.visible := true; LVwConsulta.ShowHint := False; CarregaListView; end; procedure TFrmClientes.CmdAlterarClick(Sender: TObject); begin FrmClientes.Caption := FrmClientes.Caption + ' [Alterao]'; LiberaDados; FraDados.Visible := false; FraDados.Caption := 'ALTERAO'; LVwConsulta.visible := true; LVwConsulta.ShowHint := True; CarregaListView; end; procedure TFrmClientes.CmdExcluirClick(Sender: TObject); begin FrmClientes.Caption := FrmClientes.Caption + ' [Excluso]'; LiberaDados; FraDados.Visible := false; FraDados.Caption := 'EXCLUSO'; LVwConsulta.visible := true; LVwConsulta.ShowHint := True; CarregaListView; end; procedure TFrmClientes.FormCreate(Sender: TObject); begin { Abertura do Arquivo } GetDir(0,PastaArquivo); {Retorna a Pasta do Drive Default} PastaArquivo := PastaArquivo + '\Clientes.rnd'; AssignFile(ArqClientes, PastaArquivo); if not FileExists(PastaArquivo) then begin Rewrite(ArqClientes); end else begin Reset(ArqClientes); Seek(ArqClientes,FileSize(ArqClientes)); end; end; { Para Verso 4 ou superior } procedure TFrmClientes.LVwConsultaSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin IF FraDados.Caption = 'CONSULTA' then exit; IF Selected then begin TxtNome.Text := Item.Caption; TxtEndereco.Text := Item.SubItems.Strings[0]; TxtCidade.Text := Item.SubItems.Strings[1]; CmbUF.Text := Item.SubItems.Strings[2]; MskCep.Text := Copy(Item.SubItems.Strings[3],1,2) + Copy(Item.SubItems.Strings[3],4,3) + Copy(Item.SubItems.Strings[3],8,3); Posicao := StrToInt(Item.SubItems.Strings[4]); LVwConsulta.Visible := false; FraDados.Visible := True;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.99

CINCIA DA COMPUTAO - DELPHI


LiberaDados; End; end;

procedure TFrmClientes.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; CloseFile(ArqClientes); end; procedure TFrmClientes.CmdLArquivoClick(Sender: TObject); Var ArqNovo : File of TRClientes; PastaArquivo1 : String; I, P : LongInt; begin If Application.MessageBox('Confirma a limpeza do Cadastro de Clientes?','Cadastro de Clientes', Mb_YesNo) = IdNo then Exit; { Abertura do Arquivo Novo para sada } GetDir(0,PastaArquivo1); {Retorna a Pasta do Drive Default} PastaArquivo1 := PastaArquivo1 + '\Clientes.tmp'; AssignFile(ArqNovo, PastaArquivo1); Rewrite(ArqNovo); P := 0; for I := 0 to FileSize(ArqClientes) - 1 do begin Seek(ArqClientes,I); Read(ArqClientes,RClientes); If Rclientes.Excluido then Continue; {Ignora registros excluidos} Seek(ArqNovo,P); Write(ArqNovo,RClientes); P := P + 1; end; CloseFile(ArqClientes); {Fechar Arquivo Velho} CloseFile(ArqNovo); {Fechar Arquivo Novo} Erase(ArqClientes); {Eliminar Arquivo Velho} Rename(ArqNovo,PastaArquivo); {Renomear Arquivo Novo} Reset(ArqClientes); {Reabrir Arquivo Novo} ShowMessage('Limpeza de Arquivo Concluida'); end;

{ Adaptao para Verso 3 } procedure TFrmClientes.LVwConsultaChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); begin If FraDados.Caption = 'CONSULTA' then exit; IF CargaLista = 1 then exit; { Acessa os campos do item ListView e move para Frame de Dados de Atualizao} TxtNome.Text := Item.Caption; TxtEndereco.Text := Item.SubItems.Strings[0]; TxtCidade.Text := Item.SubItems.Strings[1]; CmbUF.Text := Item.SubItems.Strings[2]; MskCep.Text := Copy(Item.SubItems.Strings[3],1,2) + Copy(Item.SubItems.Strings[3],4,3) + Copy(Item.SubItems.Strings[3],8,3); Posicao := StrToInt(Item.SubItems.Strings[4]); FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false; FraDados.Visible := True; LiberaDados; end; end.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.100

CINCIA DA COMPUTAO - DELPHI 12.2.2 Arquivos sem Tipo


Os arquivos sem tipo do mais flexibilidade em como voc trabalha com eles. Basicamente voc pode pular para qualquer posio, mudar um byte ou um bloco inteiro, salvar os dados e fechar o arquivo. Quando voc escreve seu cdigo, no tem uma estrutura rgida com que se preocupar e seu cdigo pode trabalharcom o tipo de arquivo que se queira, e de qualquer modo desejado. Entretanto , h um problema. Voc deve escrever seu cdigo para determinar exatamente onde, no arquivo, deseja trabalhar. Isto feito atravs de ponteiros de arquivo, de algum conhecimento do arquivo e de certa inteligncia. Os tamanhos de registros podem variar e fica totalmente por conta do programador onde est um registro ou parte dos dados e qual o seu tamanho. aconselhvel muito cuidado ao se trabalhar com arquivos sem tipo, mas eles podem ser muito teis. Caso voc tivesse um arquivo muito grande e quisesse substituir todos os espaos por vrgulas? Voc poderia escrever um programa simples em Delphi, que leria um bloco por vez, em um buffer, procuraria os espaos no buffer e os tranformaria em vrgulas no processo salvando as mudanas no disco. Novamente, no importaria se um arquivo texto ou binrio, nem como os dados foram armazenados, ou seja, no existe restries sobre como trabalhar com dados em arquivos sem tipo. Procedures e Funes para trabalhar com arquivos sem tipo: Sintaxe AssignFile(NomeInterno, NomeExterno) FileExists(NomeExterno) Rewrite(NomeInterno, TamanhoRegistro) Tipo Proc Func Proc Descrio Associar o Nome interno do arquivo ao Nome Externo. Retorna True se o arquivo especificado existir, caso contrrio retorna False. Cria e abre um novo arquivo. O arquivo existente com o mesmo nome ser sobrescrito. Se o tamanho no for informado ser assumido 128 bytes. Abre um arquivo existente. Se o tamanho no for informado ser assumido 128 bytes. L, em um buffer, um bloco de dados do disco. Escreve, um bloco de dados da memria no disco. Usada para mover o ponteiro do arquivo para o registro ou posio especificada dentro do arquivo aberto. Recupera a posio corrente do ponteiro do arquivo. Recupera o tamanho de um arquivo aberto em bytes. Retorna zero caso no exista nenhum registro. Permite identificar o final do arquivo, retornando um valor booleano. Termina de atualizar o arquivo corrente e fecha o arquivo.

Reset(NomeInterno,TamanhoRegistro) BlockRead(NomeInterno,NomeBuffer,TamanhoDoB loco,BytesLidos) BlockWrite(NomeInterno,NomeBuffer,TamanhoDo Bloco,BytesGravados) Seek(NomeInterno,Posio) FilePos(NomeInterno) FileSize(NomeInterno) EOF(NomeInterno) CloseFile(NomeInterno)

Proc Proc Proc Proc Func Func Func Proc

Exemplo de Projeto de Troca de espaos por vrgulas em arquivos sem tipo


O Formulrio:

O Programa Fonte : unit UTroca; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.101

CINCIA DA COMPUTAO - DELPHI


type TForm1 = class(TForm) DlgAbrir: TOpenDialog; CmdAbrir: TButton; CmdProcessar: TButton; CmdSair: TButton; TxtArquivo: TEdit; Label1: TLabel; procedure CmdAbrirClick(Sender: TObject); procedure CmdProcessarClick(Sender: TObject); procedure CmdSairClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PastaArquivo : String; Arquivo : File; Buffer : array[1..1024] of byte; Posicao : longint; BytesLidos : integer;

implementation {$R *.DFM} procedure TForm1.CmdAbrirClick(Sender: TObject); begin If DlgAbrir.Execute then begin PastaArquivo := DlgAbrir.FileName; TxtArquivo.Text := DlgAbrir.FileName; end; end; procedure TForm1.CmdProcessarClick(Sender: TObject); var X : Integer; begin AssignFile(Arquivo,PastaArquivo); Reset(Arquivo,1); While not Eof(Arquivo) do Begin Posicao := FilePos(Arquivo); BlockRead(Arquivo,Buffer,Sizeof(Buffer),BytesLidos); For X := 1 to BytesLidos do begin If Buffer[X] = 32 then Buffer[X] := 44; end; Seek(Arquivo,Posicao); BlockWrite(Arquivo,Buffer,BytesLidos); end; CloseFile(Arquivo); ShowMessage('Processamento Concluido'); end; procedure TForm1.CmdSairClick(Sender: TObject); begin Application.Terminate; end; end.

12.3 Impresso
Esta seo ensina como voc imprime sem usar as ferramentas acessrias, como QuickReport. O QuickReport ser abordado em outro captulo. Aqui voc aprender dois modos de imprimir diretamente dos programas Delphi, o que pode evitar sobrecarga, se

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.102

CINCIA DA COMPUTAO - DELPHI


voc no precisa dos recursos de um gerador de relatrios ou de outro acessrio de impresso. Vo aprender os metodos de impresso bsicos, nos quais envia uma linha ou string de texto por vez, para a impressora. Esta seo tambm examinar os objetos de impressora disponveis no Delphi. Usando o objeto impressora, voc pode imprimir textos. Voc ver como usar as caixas de dilogo de impressoras e como imprimir imagens grficas, junto com todas as informaes bsicas de que precisa saber para inserir recursos completos em suas aplicaes.

12.3.1 Impresso Bsica com Pascal


A impresso bsica envolve simplesmente a criao de uma varivel de arquivo e sua atribuio para a impressora. Ento voc usa uma instruo Writeln para enviar o texto para impressora. Esse tipo de impresso primitivo , mas eventualmente pode ser usado para imprimir listas simples, que no exija imagens grficas, fontes e outras formataes disponveis no Windows. O cdigo a seguir usa uma instruo writeln para imprimir: Uses ....., Printers; Var P : TextFile; Begin AssignPrn(P); Rewrite(P); Writeln(P, Testando a Impressora); CloseFile(P); End;

12.3.2 Impresso com objeto Tprinter


No possvel examinar todas as propriedades, mtodos, etc, do objeto impressora. Contudo, esta seo desenvolve alguns programas que demonstram o uso do objeto impressora. No Delphi , voc usa o objeto impressora para acessar a interface de impressora do windows. A unidade Printers do Delphi contm a varivel Printer, que declarada como uma instncia do objeto Tprinters. Printer : Tprinter; Para usar o objeto Tprinter, voc deve inserir a unidade Printers na clusula uses de seu cdigo, pois ela no colocada automticamente pelo Delphi. Uma vez feito isso, voc pode usar Printer para referenciar as propriedades do objeto Tprinter. Algumas Propriedades e Mtodos do Objeto TPrinter Propriedade/Mtodo Canvas Descrio Canvas onde a pgina ou documento construdo na memria, antes de ser impresso. Canvas tem propriedades que permitem desenhar e colocar o texto nela. Um mtodo do objeto Tcanvas, permite que o texto seja enviado para Canvas. Usado para iniciar uma tarefa de impresso. Usado para finalizar uma tarefa de impresso. A impressoreal no ocorre at que uma chamada para EndDoc seja feita. Retorna a altura da pgina em Pixels. Fora uma nova pgina na impressora. Retorna o nmero da pgina que est sendo impressa.

TextOut BeginDoc EndDoc PageHeight NewPage PageNumber

Suponha, por exemplo, que voc queira imprimir um texto usando o objeto impressora. O cdigo poderia ser: Printer.BeginDoc; Printer.Canvas.TextOut(200,100, Testando a Impressora); Printer.EndDoc;

Esse cdigo faz o texto Testando a Impressora ser impresso a partir do (200) pixel a direita e do (100) para baixo da pgina (Canvas).

Exemplo de projeto para Imprimir um Arquivo Texto via objeto Printer


Crie um programa para seleo de um arquivo texto e seu envio para a impressora. Inserir os componentes no formulrio e ajustar suas propriedades bsicas.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.103

CINCIA DA COMPUTAO - DELPHI


O Formulrio :

O Programa Fonte: unit UImpressora; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Printers; type TForm1 = class(TForm) DlgAbrir: TOpenDialog; LblMsg1: TLabel; CmdAbrir: TButton; CmdImprimir: TButton; DlgImpressora: TPrintDialog; DlgFonte: TFontDialog; LblMsg2: TLabel; CmdFonte: TButton; procedure CmdAbrirClick(Sender: TObject); procedure CmdFonteClick(Sender: TObject); procedure CmdImprimirClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Arquivo : String; implementation {$R *.DFM} procedure TForm1.CmdAbrirClick(Sender: TObject); begin if DlgAbrir.Execute then begin Arquivo := DlgAbrir.FileName; LblMsg1.Caption := 'Pronto para imprimir: ' + Arquivo; end; end; procedure TForm1.CmdFonteClick(Sender: TObject); begin Dlgfonte.Execute; end; procedure TForm1.CmdImprimirClick(Sender: TObject); Var Arq : TextFile; Linha, NumeroPagina : String; CTLinhas, TamanhoLinha, LinhasPorPagina, TamanhoFonte, TamanhoPagina, NumeroCopia, TotalCopias, PosY, PosX : Integer; begin

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.104

CINCIA DA COMPUTAO - DELPHI


If DlgImpressora.Execute then begin AssignFile(Arq, Arquivo); TotalCopias := DlgImpressora.Copies; For NumeroCopia := 1 to TotalCopias do begin Reset(Arq); Printer.BeginDoc; { Atribuio de Valores de Partida } CTLinhas := 0; PosX := 100; {Margem Direita em Pixels} PosY := 100; { Topo da Pgina em Pixels } Printer.Canvas.Font.Size := DlgFonte.Font.Size; Printer.Canvas.Font.Name := DlgFonte.Font.Name; Printer.Canvas.Font.Style := DlgFonte.Font.Style; TamanhoPagina := Printer.PageHeight - 200; { Margem Superior Margem Inferior} TamanhoFonte := abs(Printer.Canvas.Font.Height); { Calcula o nmero de linhas por pgina com base no tamanho da pgina e no tamanho da fonte, somando 10 Pixels para deixar algum espao entre as linhas } LinhasPorPagina := TamanhoPagina Div (TamanhoFonte + 10); CTLinhas := 1000; { Valor Inicial para forar o Cabealho da 1. pgina} { Calcula o espaamento entre linhas em pixels } TamanhoLinha := Printer.PageHeight Div LinhasPorPagina; NumeroPagina := IntToStr(Printer.PageNumber); LblMsg1.Caption := 'Imprimindo Documento: ' + ' Pgina: ' + NumeroPagina; While Not Eof(Arq) do Begin Readln(Arq, Linha); If CTLinhas >= LinhasPorPagina then begin if CTLinhas <> 1000 then Printer.NewPage; PosY := 100; CTLinhas := 0; NumeroPagina := IntToStr(Printer.PageNumber); Printer.Canvas.TextOut(20,0,'Pg.: ' + NumeroPagina + ' - Arquivo: ' + DlgAbrir.FileName); LblMsg1.Caption := 'Imprimindo Documento: ' + ' Pgina: ' + NumeroPagina; end; Printer.Canvas.TextOut(PosX,PosY,Linha); PosY := PosY + TamanhoLinha; CTLinhas := CTLinhas + 1; end; CloseFile(Arq); Printer.EndDoc; LblMsg1.Caption := 'Impresso Concluida! ' + 'Pginas Impressas: ' + NumeroPagina; LblMsg2.Caption := 'Controle de Cpias: ' + IntToStr(NumeroCopia) + '/' + IntToStr(TotalCopias); end; end; end; end. Concluso: Esse Cdigo permite que o usurio selecione um arquivo texto a ser impresso, atravs de uma caixa de dilogo padro do Windows acionando o boto Abrir. O boto Fonte permite que os usurios selecionem a fonte a ser usada ao imprimir, atravs da caixa de Dilogo Font padro do Windows. Em seguida o boto Imprimir apresenta a caixa de dilogo padro do Windows, dando acesso a todos os recursos encontrados l.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.105

CINCIA DA COMPUTAO - DELPHI

13. Aplicaes de Banco de Dados


13.1 Objetivo
Nosso objetivo neste captulo ser fornecer uma viso geral do extenso suporte para construo de aplicaes de banco de dados que, por sua vez, um dos principais recursos do ambiente de programao Delphi. Uma de suas mais importantes vantagens com relao ao desenvolvimento de aplicaes relacionadas a este assunto, a rapidez e facilidade com que os programadores podero construir suas aplicaes. No Delphi, o programador no precisar gastar horas escrevendo cdigos extensos para manipular um banco de dados. E isso se d porque o Delphi traz diversos componentes distribudos nas pginas DataAccess e DataControl que se traduzem em programao orientada a objetos e, consequentemente, em grande ganho de tempo. Consideraremos para efeito deste captulo, que o leitor j possui os necessrios conhecimentos no que se refere a banco de dados e tabelas. Inicialmente, introduziremos explicaes a cerca da dinmica do Delphi no que se refere ao acesso a dados. Em seguida, apresentaremos os componentes especficos para banco de dados. E, por fim, desenvolveremos alguns exemplos do funcionamento destes componentes.

13.2 Borland Database Engine (BDE)


O Delphi utiliza-se de uma abordagem que permite a utilizao de tabelas e de banco de dados de diversas origens, podemos dizer que, o Delphi permite o acesso a dados: ASCII, Dbase, Paradox, Oracle, Interbase, Informix, Sybase, Microsoft SQL Server e todos formatos via ODBC. Esta abordagem alm de dar grande versatilidade linguagem devido a variedade de fontes de dados acessveis, permite o desenvolvimento de aplicaes para bases de dados locais e, para bases de dados em arquitetura Cliente/Servidor. Esta abordagem, na verdade, guarda um pequeno segredo: os aplicativos Delphi no tem acesso direto s bases de dados que utilizam. O acesso se d indiretamente atravs de uma interface chamada Borland Database Engine (BDE). Veja a ilustrao seguinte acerca do funcionamento do BDE.

Aplicativo Delphi Borland Database Engine

Dbase

Paradox

Outros

SQL Links

ODBC

Interbase

Informix

Outros

Driver ODBC

Outros Drivers

O uso do BDE, por no permitir o acesso direto aos dados, traz apenas um pequeno inconveniente: ao instalar o aplicativo Delphi nos computadores clientes, voc ter de instalar tambm o BDE ( o programa de instalo do BDE distribuido gratuitamente pela Borland) para que os aplicativos de banco de dados funcionem corretamente. O Delphi possui componentes prprios para aplicaes de banco de dados. Eles concentram-se nas pginas DataAccess e DataControl. Os componentes contidos na primeira pgina reservam-se para operaes de interao e manipulao de dados. J os componentes da Segunda pgina so destinados ao uso visual atravs de formulrios. Veja a seguir uma rpida descrio de cada componente.

13.3 Pgina DataAccess e BDE

8 Finalidade

Nmero do cone

Nome ou Rtulo

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.106

CINCIA DA COMPUTAO - DELPHI


1 2 3 4 5 6 7 8 DataSource Table Query StoredProc Database Session BatchMove UpdateSQL Permite o acesso aos dados. Sempre est associado com componentes: Table, Query ou StoredProc. Representa a tabela utilizada pela aplicao. Liga-se necessariamente a um componente DataSource. Representa os dados de uma tabela filtrados atravs de comandos SQL. Deve estar ligado a um DataSource. Fornece acesso a rotinas especficas de um banco de dados atravs de comandos SQL enviados diretamente para o servidor. Utilizado para conexo a banco de dados remotos em aplicativos cliente/servidor. Utilizado para controle global da conexo a banco de dados. Importante para operaes em lote em um ou mais banco de dados. Fornece suporte para operaes de atualizao em dataset.

13.4 Pgina DataControls

2 1 2 3 4 5 6 7e8 9 10 11 12 13 14 15

10

11

12

13

14

15

DBGrid DBNavigator DBText DBEdit DBMemo DBImage DBListBox e DBComboBox DBCheckBox DBRadioGroup DBLookUpListBox DBLookUpComboBox DBRichEdit DBCtrlGrid DBChart

Permite a visualizao, atualizao ou excluso de todos os dados de uma tabela. Possibilita a interao do usurio com os dados de uma tabela atravs de botes de navegao e de manipulao de registros. Similar ao componente Label, exibe o contedo de campos num controle no editvel. Exibe o contedo do campo permitindo edies. Exibe e permite alteraes em extensos campos de textos. Exibe figuras armazenadas em registros de uma tabela. Permite a seleo de um nico valor de um conjunto de valores especificados. Constri uma caixa de verificao associada a um campo boleano. Fornece um conjunto de opes de seleo exclusiva a partir de dados de uma tabela. Permite a seleo numa caixa de listagem, de um nico valor de um conjunto de valores especificados provenientes de uma tabela. Permite a seleo combo ou pop-up, de um nico valor de um conjunto de valores especificados provenientes de uma tabela. Permite edio de um campo memo do tipo Rich Text. Permite a utilizao de vrios componentes relacionados a dados numa nica grade multi-registro. Cria um grfico em tempo de execuo a partir de dados armazenados em tabela.

13.5 Modelo de Acesso a Banco de Dados


Veja no esquema abaixo, a relao entre os componentes DataControl e DataAccess mencionados acima, quando envolvidos na dinmica de acesso a um banco de dados. DataControls DataAccess e BDE

DBGrid DBEdit DBCheck DataSource

Table Query StoredProc Banco de Dados

BDE

Durante nossa abordagem sobre o desenvolvimento de aplicaes de banco de dados, nos concentraremos em dois componentes fundamentais expostos acima: Table e Query. Faremos uso do termo DataSet para designarmos genericamente, os dados correspondentes a cada um deles quando relacionados a um banco de dados. Assim, ao utilizarmos o componente Table, o DataSet equivale a todos os registros do banco de dados associado. Por outro lado, ao utilizarmos o componente Query, o DataSet ser o conjunto dos registros selecionados atravs de comando SQL.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.107

CINCIA DA COMPUTAO - DELPHI 13.6 DataSource


O DataSource um componente fundamental para o funcionamento de aplicaes de banco de dados. Sem o uso deste componente, no ser possvel efetuar a conexo entre os componentes DataControl dos formulrios da aplicao e, o BDE, como pode ser observado no esquema anterior. Assim, caso utilize os componentes Table, Query e StoreProc, reserve um DataSource para cada um ( por exemplo, se voc tiver um componente Table e dois componentes Query, precisar de trs DataSource). A conexo entre o DataSource e seu componente correspondente, se d atravs da propriedade DataSet do DataSource. Esta propriedade lista todos os DataSets disponveis.

13.7 Componente Table


O uso do componente Table de extrema importncia, uma vez que permite designar o banco de dados e a tabela utilizada pela aplicao. Tal componente far referncia a todo o conjunto de campos e registros da tabela em questo. Ao utiliz-lo voc precisa indicar o nome do banco de dados atravs da propriedade DataBaseName. Se o banco de dados no possui um Alias, ser necessrio informar o diretrio em que esto seus arquivos. Tambm necessrio definir o nome da tabela a ser utilizada. Faa isto atravs da propriedade TableName. Este nome poder ser o Alias ou o prprio nome do arquivo.

Table -Propriedades e Metodos - Navegao nos Registros


FIRST - Acessa o Primeiro registro. LAST - Acessa o Ultimo registro. NEXT - Acessa o Prximo registro PRIOR - Acessa o registro anterior. BOF - Retorna True se a posio do registro corrente est antes do primeiro registro. EOF - Retorna True se a posio do registro corrente est aps o ltimo registro. MoveBy(n) - Avana ou retroce n Registros na tabela. GetBookmark - Retorna a posio do registro corrente da tabela. GotoBookmark(posio) - Ler o registro via Bookmark. Exemplo: Var GuardaPosicao : TBookmark; Begin GuardaPosicao := Table1.GetBookmark; x.x.x.x.x.x.x.x.x Table1.GotoBookmark(GuardaPosicao);

Table -Propriedades e Metodos Pesquisa Sequencial


Filter - Define a Expresso lgica do filtro de registros. Filtered - Ativa o Filtro . (True ou False) FindFirst - Localizando o primeiro registro que atenda a condio especificada na propriedade Filter em uma tabela. FindNext - Localizando o prximo registro que atenda a condio especificada na propriedade Filter em uma tabela. FindLast - Localizando o ltimo registro que atenda a condio especificada na propriedade Filter em uma tabela. FindPrior - Localizando o registro anterior que atenda a condio especificada na propriedade Filter em uma tabela.

Table -Propriedades e Metodos Pesquisa Indexada


IndexName - Define o nome do Index atual em uma tabela. FindKey - Ler um registro em uma tabela via index. Se a pesquisa der certo, FindKey posiciona o cursor no registro pesquisado e retorna True. Sintaxe: Table1.FindKey([Campo_Chave]) Exemplo: Table1.IndexName := Codigo; IF NOT Table1.FindKey([Edit1.Text]) THEN ShowMessage(Registro no Encontrado); FindNearest - Ler um registro mais prximo da Chave de Acesso em uma tabela via index. Se a pesquisa der certo, FindNearest posiciona o cursor no registro pesquisado ou o mais prximo. Sintaxe: Table1. FindNearest([Campo_Chave]) Exemplo: Table1.IndexName := Codigo; Table1. FindNearest([Edit1.Text]); Locate - Ler um registro em uma tabela via index ou sequencial dependendo da chave de pesquisa. Se a pesquisa der certo, Locate posiciona o cursor no registro pesquisado e retorna True. Sintaxe: Table1. Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Exemplo: with CustTable do Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);

Table -Propriedades e Metodos Atualizao da Tabela LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.108

CINCIA DA COMPUTAO - DELPHI


Append - Incluir um novo registro no buffer para edio e subseqente incluso na tabela. Edit - Copia o registro atual para o buffer para edio e subseqente alterao na tabela . Post - Salva o contedo do buffer para o RecordSet. Cancel - Cancela as modificaes no registro corrente se elas ainda no foram efetivadas (Post). Delete - Exclui o Registro corrente. Table1.FieldByName(Nome).Value - Faz referncia a um campo do registro do registro corrente. Open - Abrir a tabela. Close - Fechar a tabela Exemplo: Table1.Open; x.x.x.x.x.x Table1. Close; BeforePost - Ocorre antes da aplicao gravar as alteraes no registro corrente. Exemplo: procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin if datasource1.DataSet.FieldByName('codigo').asInteger = 0 then begin Showmessage('Falta codigo'); abort; end; if datasource1.DataSet.FieldByName('nome').asString = '' then begin Showmessage('Falta Nome'); abort; end; end; AfterPost - Ocorre aps a aplicao gravar as alteraes no registro corrente. Exemplo: procedure TForm1.TableAmigosAfterPost(DataSet: TDataSet); begin GroupBox1.Enabled := false; MaskEditCodigo.enabled := true; ShowMessage('Atualizao de Dados Concluida'); end; BeforeDelete - Ocorre antes da aplicao excluir o registro corrente. Exemplo: procedure TForm1.TableAmigosBeforeDelete(DataSet: TDataSet); begin if Messagedlg('Confirma a Excluso do Registro?',mtconfirmation,[mbyes,mbno],0) = mrno then begin Abort; end; end; AfterDelete - Ocorre antes da aplicao excluir o registro corrente. BeforeInsert Ocorre antes de entrar em estado de inserso de registro na tabela. BeforeEdit - Ocorre antes de entrar em estado de Edio de registro na tabela. AfterCancel Ocorre aps o cancelamento de uma atualizao na tabela. Exemplo: procedure TForm1.TableAmigosAfterCancel(DataSet: TDataSet); begin GroupBox1.Enabled := false; MaskEditCodigo.enabled := true; end; xxx...x

Eventos usuais para o Table

13.7 Desenvolvendo uma aplicao com o componente Table


Agora desejamos desenvolver uma aplicao que faa a conexo entre os componentes Table e DataSource. O objetivo da aplicao ser, atravs do banco de dados DBDemos ( que j vem com o Delphi), acessar a tabela BioLife. A partir do momento em que o acesso for efetuado, mostraremos os registros da tabela no componente DBGrid. Crie um novo projeto atravs do menu File/New Application e disponha os componentes DBGrid, Table e DataSource, conforme indicado no formulrio abaixo.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.109

CINCIA DA COMPUTAO - DELPHI

Atravs do Object Inspector, atribua s propriedades DataBaseName, TableName e Active (esta propriedade deve ser modificada por ltimo) do componente Table e; propriedade DataSet do componente DataSource, os valores indicados na figura seguinte.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.110

CINCIA DA COMPUTAO - DELPHI


Por fim, na propriedade DataSource do DBGrid, atribua: DataSource1. Isto far com que o DBGrid mostre os registros da tabela BioLife. Temso certeza de que isto acontecer, porque o DataSource1 faz uma referncia direta tabela em questo.

Confira a seguir a aparncia do formulrio ainda em fase de projeto.

13.8 Componente Query

13.8.1 Fundamentos do componente Query


O componente Query utilizado para selecionar determinado conjunto de dados a partir de uma tabela. Para utiliz-lo, necessrio o desenvolvimento de um pequeno cdigo em SQL. Este cdigo ser responsvel pela montagem do conjunto de dados. semelhana do componente Table, o Query tambm possui a propriedade DataBaseName. Por outro lado, a diferenciao entre tais componentes, do ponto de vista prtico, se d na propriedade TableName, inexistente na Query. Em seu lugar, o componente requisita um cdigo em SQL, cuja execuo trar dados que substituiro a necessidade de uma tabela. As Query so comumente utilizadas para execuo, atravs do servidor, de clusulas complexas de filtragem dos dados e, tambm, para unir tabelas e visualizar o resultado como se os dados pertencessem a uma nica tabela.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.111

CINCIA DA COMPUTAO - DELPHI

13.8.2 SQL - Structured Query Language


O que SQL? uma linguagem padronizada para manipulao de Banco de Dados. SQL definido pelo ANSI (American National Standards Institute), mas algumas implementaes possuem algumas extenses alm do padro.

Porque usar SQL? Facilidade de uso para recuperar e atualizar dados no Banco de Dados. Padro de mercado. Rapidez no desenvolvimento e manuteno dos Aplicativos.

Onde usar o SQL? Os comandos SQL so usados em componentes SQL localizado na guia Data Access da Palheta de Componentes do Delphi.

Organizao da SQL DDL - Linguagem de Definio de Dados Composta de comandos para criar e modificar a estrutura das tabelas e ndices que vo compor o Banco de Dados: CREATE - Criar tabelas e ndices DROP - Remover tabelas e ndices ALTER - Alterar a estrutura de uma tabela

DML - Linguagem de Manipulao de Dados Composta de comandos para atualizar e recuperar os dados das tabelas do Banco de Dados: SELECT - Recuperar dados no Banco de Dados INSERT - Incluir Dados no Banco de Dados UPDATE - Alterar Dados no Banco de Dados DELETE - Excluir Dados no Banco de Dados

SQL - Comando SELECT Descrio: Recupera uma linha ou parte da linha de uma tabela. Recupera multiplas linhas ou parte das linhas de uma tabela. Recupera linhas relacionadas ou parte das linhas a partir de duas ou mais tabelas.

SQL Sintaxe Comando SELECT SELECT [DISTINCT] * | <Lista de Campos> FROM <Lista de Tabelas> WHERE <Condio de Seleo> GROUP BY <Lista de Campos> HAVING <Condio de Seleo do Grupo> ORDER BY <Lista de Campos de ordenao> Operadores Aritmticos: +,-,*,/ Ex.: (Salario * 1.15) AS SalarioAtual Relacionais: > , < , = , <> , >= , <= Ex.: WHERE Codigo >= 120 Lgicos: AND , OR , NOT Ex.: WHERE (Depto = Informtica) AND (Salario > 1200) Outros operadores para expresses lgicas Faixa - BETWEEN val1 [NOT] BETWEEN val2 AND val3 Ex.: SALARIO BETWEEN 800 AND 1200

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.112

CINCIA DA COMPUTAO - DELPHI


Conjunto - IN valor [NOT] IN (Conjunto de valores) Ex.: UF IN ( MG , SP , RJ ) Similaridade de valores - LIKE (s strings) valor [NOT] LIKE mscara Caracteres especiais de substituio : % (mltiplo) , _ (Simples) Ex.: NOME LIKE A% PLACA LIKE _WB411_ Exemplos Comando SELECT SELECT * From Pessoal SELECT codigo,Nome,salario From Pessoal SELECT Nome,Depto,Salario From Pessoal SELECT Nome,Salario, Salario * 1.1 as SalNovo From Pessoal SELECT * FROM PESSOAL WHERE NOME = Jose da Silva SELECT * FROM PESSOAL WHERE CODFUNCAO IN ( 10 , 20 , 30 ) SELECT CODIGO,NOME FROM PESSOAL WHERE SUBSTRING(NOME FROM 1 FOR 1) BETWEEN A AND H SELECT * FROM PESSOAL WHERE NOME LIKE E%

Funes
CONCATENAO, LOWER , UPPER , TRIM , SUBSTRING Estatstica: AVG , COUNT , MAX , MIN , SUM Data: EXTRACT Converso de Tipos de Dados CAST STRING - Funo - Concatenao Objetivo: Concatenar dois ou mais Strings. Sintaxe: string1 || string2 || string3 Exemplos: Select Nome || , || Admissao as Empregado from Pessoal STRING - Funo LOWER Objetivo: Converte todos ao caracteres para minsculo. Sintaxe: LOWER(coluna_referncia ) Exemplos: Select Nome, Depto, Salario from Pessoal where Lower(Depto) = comercial STRING - Funo UPPER Objetivo: Converte todos ao caracteres para maisculo Sintaxe: UPPER(coluna_referncia ) Exemplos: Select Nome, Salario from Pessoal where Upper(Nome) = MARIA STRING - Funo SubString Objetivo: Extrair uma substring de uma String. Sintaxe: SUBSTRING(coluna_referncia FROM Inicio_index [FOR tamanho]) Exemplos: SELECT * FROM Pessoal Where SUBSTRING(Nome FROM 2 FOR 1) = a STRING - Funo TRIM Objetivo: Remover determinado caracter a esquerda, direita ou ambos de uma string. Sintaxe: TRIM([LEADING|TRAILING|BOTH] [trimmed_char] [FROM] coluna_referncia ) Strings:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.113

CINCIA DA COMPUTAO - DELPHI


Exemplos: TRIM(LEADING "_" FROM "_ABC_") => ABC_ TRIM(TRAILING "_" FROM "_ABC_") => _ABC TRIM(BOTH "_" FROM "_ABC_") => ABC TRIM(CIDADE) ESTATSTICA - Funo AVG Objetivo: Retorna a mdia aritmtica dos valores da coluna especificada ou da expresso especificada. Sintaxe: AVG ( [ALL] coluna_referncia | DISTINCT coluna_referncia )) ALL retorna a mdia de todos os valores da coluna. DISTINCT ignora valores repetidos no clculo da mdia referente a coluna especificada. Exemplos: Select AVG(Salario) as Salrio_Mdio from Pessoal ESTATSTICA - Funo Count Objetivo: Retorna o nmero de linhas que satisfaz a condio de pesquisa na Query. Sintaxe: COUNT(* | [ALL] coluna_referncia | DISTINCT coluna_referncia )) ALL retorna a contagem para todas as linhas. DISTINCT ignora valores repetidos no clculo das linhas referente a coluna especificada. Exemplos: Select Count(*) as Total_Empregados from Pessoal ESTATSTICA - Funo MAX Objetivo: Retorna o maior valor dos valores da coluna especificada ou da expresso especificada. Sintaxe: MAX ( [ALL] coluna_referncia | DISTINCT coluna_referncia )) ALL retorna o maior de todos os valores da coluna. DISTINCT ignora valores repetidos a seleo do maior valor referente a coluna especificada. Exemplos: Select MAX(Salario) as Maior_Salario from Pessoal ESTATSTICA - Funo MIN Objetivo: Retorna o menor valor dos valores da coluna especificada ou da expresso especificada. Sintaxe: MIN ( [ALL] coluna_referncia | DISTINCT coluna_referncia )) ALL retorna o menor de todos os valores da coluna. DISTINCT ignora valores repetidos a seleo do menor valor referente a coluna especificada. Exemplos: Select MIN(Salario) as Menor_Salario from Pessoal ESTATSTICA - Funo SUM Objetivo: Retorna a Soma dos valores da coluna especificada ou da expresso especificada. Sintaxe: SUM ( [ALL] coluna_referncia | DISTINCT coluna_referncia )) ALL retorna a soma de todos os valores da coluna. DISTINCT ignora valores repetidos a seleo do menor valor referente a coluna especificada. Exemplos: Select SUM(Salario) as Total_Salarios from Pessoal Exemplos Comando SELECT SELECT Count(*) as Total_Empregados, Avg(Salario) as Salario_Medio, Max(Salario) as Maior_Salario, Min(Salario) as Menor_Salario, Sum(Salario) as Total_Salarios From Pessoal

Estatstica -Totais com Quebra Group By e Having Group By Agrupa linhas com coluna de mesmo valor em uma simples linha. GROUP BY coluna_referncia [, coluna_referncia ...] Ex.: Select Filial, Depto , Count(*) as Empregados, Sum(Salario) as Total_Salarios from Pessoal Group By Filial, Depto Having Especifica critrios de seleo para um comando Select.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.114

CINCIA DA COMPUTAO - DELPHI


Having s pode ser usado quando: O comando tambm tem a clasula Group By. Uma ou mais colunas so resultantes de funes estatsticas. Ex.: Select Filial, Depto , Count(*) as Empregados, Sum(Salario) as Total_Salarios from Pessoal Group By Filial, Depto Having Sum(Salario) > 12000

Order By Ordenao Order By Classifica a linhas recuperadas de um comando SELECT ORDER BY coluna_referncia [ASC|DESC] [, coluna_referncia [ASC|DESC] ...] Ex.: Select Depto, Nome, Salario From Pessoal Order By Depto ASC , Salario DESC

Exemplos Comando SELECT SELECT Depto as Departamento, Count(*) as Total_Empregados, Avg(Salario) as Salario_Medio, Max(Salario) as Maior_Salario, Min(Salario) as Menor_Salario, Sum(Salario) as Total_Salarios From Pessoal GROUP BY Depto ORDER BY Depto Asc

Funes de Manipulao de Datas DATAS : Funo EXTRACT Objetivo: Extrair o Ano, Ms ou o Dia de uma Data. Sintaxe: EXTRACT (extract_field FROM coluna_referencia) Exemplos: EXTRACT(YEAR FROM DataVenda) AS YY EXTRACT(MONTH FROM DataVenda) AS MM EXTRACT(DAY FROM DataVenda) AS DD SELECT Depto, Nome, extract(day from admissao) as DiaAniversario from pessoal where extract(month from admissao) = 10 order by depto Funes para Converso de Tipos de Dados CONVERSO : Funo CAST Objetivo: Converso de um dado de um tipo para um tipo de dado especificado. Sintaxe: CAST(coluna_referencia AS data_tipo) Exemplos: CAST(DataVenda as CHAR(10)) CAST(10/05/1999 as DATE) CAST(CODVENDA as NUMERIC) Select * from Vendas Where DataVenda = CAST(10/05/1999 as DATE) O comando Select com outros comandos Select embutidos um comando Select que usa o resultado de outro comando Select embutido. Exemplos Comando SELECT Elaborar uma lista dos empregados que ganham o menor salrio pago pela empresa com o Nome, Departamento e o salrio, ordem de Depto e Nome. SELECT Depto as Departamento, Nome, Salario From Pessoal WHERE salario = (SELECT Min(Salario) from Pessoal) ORDER by Depto, Nome

Extrao de Dados de Mltiplas Tabelas


Consulta vrias tabelas - Equi-join Objetivo Joins varias tabelas baseado em valores de colunas comuns entre as tabelas, excluindo linhas que no atenderam as condies (non-matches). Sintaxe SELECT column_list FROM table_reference, table_reference [, table_reference...] WHERE condio [AND condio...] Exemplos Elaborar uma lista de empregados com o Nome, Funo do Empregado e o salrio, ordem de Nome. SELECT Nome, Funcao, Salario From Pessoal, Cargos WHERE Pessoal.CodFuncao = Cargos.CodFuncao ORDER by Nome

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.115

CINCIA DA COMPUTAO - DELPHI

Elaborar uma lista de empregados com o Nome, dependentes e grau de dependncia,ordem de Nome. Select Nome, Dependente, Desc_Dep from Pessoal, Depende, Cod_Dep Where (Pessoal.Codigo = Depende.Codigo) AND (Depende.CodDep = Cod_Dep.CodDep) Order By NOME

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.116

CINCIA DA COMPUTAO - DELPHI


Consulta vrias tabelas - INNER Objetivo Joins varias tabelas baseado em valores de colunas comuns entre as tabelas, excluindo linhas que no atenderam as condies (non-matches). Sintaxe SELECT column_list FROM table_reference [INNER] JOIN table_reference ON condio [[INNER] JOIN table_reference ON condio...] Exemplos Elaborar uma lista de empregados com o Nome, Funo do Empregado e o salrio, ordem de Nome. SELECT Nome, Funcao, Salario From Pessoal A INNER JOIN Cargos B ON A.CodFuncao = B.CodFuncao ORDER by Nome

Elaborar uma lista de empregados com o Nome, dependentes e grau de dependncia,ordem de Nome. Select Nome, Dependente, Desc_Dep from Pessoal INNER JOIN Depende ON (Pessoal.Codigo = Depende.Codigo) INNER JOIN Cod_Dep ON (Depende.CodDep = Cod_Dep.CodDep) Order By NOME

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.117

CINCIA DA COMPUTAO - DELPHI


Consulta vrias tabelas OUTER Objetivo Joins varias tabelas baseado em valores de colunas comuns entre as tabelas, incluindo linhas que no atenderam as condies (non-matches). Sintaxe SELECT column_list FROM table_reference LEFT | RIGHT | FULL [OUTER] JOIN table_reference ON condio [LEFT | RIGHT | FULL [OUTER] JOIN table_reference ON condio...] Exemplos Elaborar trs listas de Cargos com a Descrio do cargo (Funo), Nome do empregado, Departamento e Salrio em ordem de cargo (Funo). Estas listas devero conter : 1. Cargos desocupados (sem Empregado) . SELECT Funcao, Nome, Depto, Salario from Cargos LEFT OUTER JOIN Pessoal on Cargos.CodFuncao = Pessoal.CodFuncao Order By Funcao

2.

Empregados sem Cargo

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.118

CINCIA DA COMPUTAO - DELPHI


3. Os dois anteriores simultaneamente.

13.9 Desenvolvendo uma aplicao com o componente Query


No primeiro exemplo, mostramos como efetuar a conexo entre o componente Table e o DataSource (e o fizemos sem digitar um comando sequer). Contudo, chegou o momento de demonstrarmos como utilizar o componente Query em conjunto com o DataSource. Para isto, lanaremos mo da aplicao anterior, onde efetuaremos algumas pequenas mudanas, e de uma outra tabela chamada Country. Inicialmente, a partir do formulario da aplicao anterior, elimine o componente Table e DataSource, substituindo-os pelo componente Query e por um novo componente DataSource. E siga os passos descritos a seguir: 1. Selecione para a propriedade DataBaseName da Query, o banco de dados DBDemos e; para a propriedade Dataset do DataSource, Query1. Isto ser suficiente para efetuar a conexo entre os dois componentes e permitir o acesso aos dados via SQL. Caso tenha duvidas consulta a figura a seguir:

2.

Na propriedade DataSet do componente DBGrid, selecione DataSource1;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.119

CINCIA DA COMPUTAO - DELPHI


3. Voltando s propriedades do componente Query, escrevemos o cdigo SQL, que mostrar o conjunto de dados a ser exibido atravs do DBGrid. Nossa inteno que o conjunto de dados seja exposto apenas por pases da Amrica do Sul (ou melhor, South Amrica). Para escrever o cdigo, exposto a seguir, clique uma vez na propriedade SQL e, outra vez mais, no boto ...

4. 5.

Clique no boto Ok e, na propriedade Active, selecione a opo True. Execute a aplicao e compare os resultados com a figura a seguir.

13.10 Desenvolvendo a navegao entre registros.


At agora vimos que podemos utilizar facilmente os componentes Table e Query para acessar os dados de uma tabela. Alm disso, vimos tambm como visualizar os campos e registros atravs dos recursos do DBGrid. Contudo, apesar da facilidade do uso do DBGrid, o funcionamento de seus comandos de navegao entre registros totalmente automatizado pelas barras de rolagem. Seria interessante escrevermos um cdigo para uma nova aplicao que disponibilize os mesmos recursos de visualizao do DBGrid. NA verdade, prevemos apenas uma pequena diferena em relao ao DBGrid: ao invs de mostrarmos o contudo de vrios registros, mostraremos um registro por vez, o que no mbito de uma aplicao real pode vir a ser muito mais conveniente. O cdigo que ser desenvolvido poder aplicar-se tanto para manipulao de tabelas via Table, quanto para manipulao de tabelas via Query. Para o nosso exemplo optaremos pelo componente Table. Para comear, clique no menu File/New application. Em seguida prepare o formulrio acrescentando: um componente Table, um componente DataSource ,dois componentes DBEdit e quatro botes de presso. Para ficar fcil, consulte a figura abaixo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.120

CINCIA DA COMPUTAO - DELPHI

Os dois botes laterais (<< e >>) sero usados para mover para o primeiro ou para o ltimo registro da tabela, e os dois do meio (< e >), para mover para o registro anterior ou para o registro posterior. Para conseguirmos certos efeitos, devemos conhecer seis mtodos que devero estar associados ao evento OnCLick de cada boto de presso. So eles: FIRST: Posiciona o ponteiro da tabela diretamente no primeiro registro. LAST: Posiciona o ponteiro da tabela diretamente no ltimo registro. PRIOR: Move o ponteiro da tabela para o registro imediatamente anterior ao registro atual. NEXT: Move o ponteiro da tabela para o registro imediatamente posterior ao registro atual. Para aplic-los, voc dever, primeiro, efetuar a conexo entre os componentes Table e DataSource do formulrio. Em seguida ser necessrio associar a cada um dos DBEdits, a um campo da tabela Country do banco de dados DBDemos (escolhemos esta tabela arbitrariamente). A associao dos DBEdits a um campo da tabela feita: (1) atribuindo propriedade DataSource, o componente DataSource1 e depois, (2) atribuindo propriedade DataField o nome do campo desejado (para efeito do exemplo desta apostila, escolha os campos Continent e Name).

A seguir, escreva o cdigo relativo a cada um dos botes de presso com exposto abaixo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.121

CINCIA DA COMPUTAO - DELPHI

Utilizamos no cdigo dois mtodos extras, a saber: EOF e BOF. Eles so importantes uma vez que permitem detectar, respectivamente, quando nos posicionamos no primeiro ou no ltimo registro. Se nos posicionamos no primeiro registro, devemos desabilitar os botes CmdPrimeiro e CmdAnterior pois no tero nenhum efeito sobre a tabela. Por outro lado, se nos posicionamos no ltimo registro, devemos desabilitar os botes CmdUltimo e CmdProximo. Agora estamos prontos para compilar e executar a aplicao.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.122

CINCIA DA COMPUTAO - DELPHI

13.11 Dbnavigator

Caso voc no ache interessante ter todo o trabalho de programao do exemplo anterior, pode simplesmente usar o DBNavigator, que um componente reservado para operaes de manipulao e navegao entre registros. Atravs deste componente, alm de obtermos os mesmos resultados no que se refere a movimentao, temos a disposio recursos para incluso, alterao e excluso de registros. Para utiliz-lo basta inseri-lo no formulrio e, atravs da propriedade DataSet, conect-lo ao DataSource apropriado. Boto First Prior Next Last Insert Delete Edit Post Cancel Finalidade Move o registro corrente para o primeiro registro no DataSet , desabilita os botes First e Prior, e habilita os botes Next e Last se eles estiverem desabilitados. Move o registro corrente para o registro anterior em relao ao registro atual e habilita os botes Last e Next se eles estiverem desabilitados. Move o registro corrente para o prximo registro em relao ao registro atual e habilita os botes First e Prior se eles estiverem desabilitados. Move o registro corrente para o ltimo registro no DataSet , desabilita os botes Last e Next , e habilita os botes First e Prior se eles estiverem desabilitados. Inserso de um novo registro antes do registro corrente e coloca o DataSet no modo de Inserso. Elimina o registro corrente e coloca o prximo registro como registro corrente. Coloca o DataSet em estado de Edio para que o registro corrente possa ser modificado. Grava as modificaes feitas no registro corrente no banco de dados. Cancela a edio do registro corrente, reapresenta o registro na tela nas condies em que estava antes da edio, e desabilita o modo de Inserso e Edio se eles estiverem ativos.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.123

CINCIA DA COMPUTAO - DELPHI


Refresh Grava o buffer de dados associado com o DataSet. Para Componentes Query, este boto fica desabilitado a menos que a propriedade RequestLive seja igual a True.

13.12 Campos Calculados


At agora vimos como construir aplicaes para banco de dados que incluam apenas os campos de uma tabela de banco de dados fonte.Tais campos tinham seus contedos exibidos atravs do DBGrid. Mas, como podemos incluir novos campos ao DBGrid, tais como campos cujo contedo seja proveniente de clculos a partir dos dados existentes? Podemos acessar aos valores dos campos atravs de seus nomes ou nmeros: isto resolve parcialmente o problema uma vez que d margem utilizao de tcnicas de referncia aos valores dos campos, em clculos futuros. Veja: Table1.Fields[0].AsString Table1.FieldByName(Nome).AsString Alm disso, podemos criar outras referncias ao campo que sero envolvidos em clculos. Atravs do Fields Editor podemos criar campos especiais em tempo de projeto e manipul-los livremente em operaes matemticas. Nesse caso, voc pode definir diversas propriedades para esses campos. Essas propriedades afetam o comportamento dos componentes relacionados com os dados que as utilizam, tanto para visualizao como para edio. Quando voc define tais campos em tempo de projeto, eles so listados no Object Inspector, da mesma forma que qualquer outro componente. Como exemplo, construiremos uma nova aplicao que utilize o Fields Editor para calcular a densidade demogrfica de certos pases, a partir da tabela Country do banco de dados DBDemos. Portanto, primeiro, clique em File/New application e construa um formulrio que possua um componente DataSource e um DBGrid. Faa em seguida a conexo do Table e o DataSource com a tabela Country. Depois faa a conexo entre o DBGrid e o componente DataSource. Agora, atravs do Fields Editor, podemos personalizar o DBGrid, de modo a mostrar apenas os campos necessrios ao nosso exemplo. Isto pode ser feito atravs de um clique sobre o componente Table e, em seguida, um clique com o boto direito na tela

Fields Editor Clique Aqui


vazia do Fields Editor (veja a figura abaixo): A parir do menu de atalho que surgir, selecione a opo Add Fields. A figura a seguir mostra a caixa de dilogo relativa a esta opo, que lista todos os campos disponveis na tabela utilizada. Selecione apenas os campos: Name, Area e Population (utilize a tecla CTRL para selecion-los) e, clique no boto Ok. Com isso, o DBGrid passar a mostrar apenas o contedo dos campos selecionados.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.124

CINCIA DA COMPUTAO - DELPHI

Agora inseriremos um campo calculado que representar a densidade demogrfica. Para isto, clique com o boto direito na tela vazia do Fields Editor, e selecione a opo New Field. A caixa de dilogo que surgir permitir a criao de um campo especial para cculos ao qual daremos o nome de Densidade. Preencha os campos segundo ilustra a figura abaixo:

Em seguida construiremos a frmula matemtica que fornecer o valor para o novo campo. Isto deve ser feito no evento OnCalcFields do componente Table. O cdigo necessrio mostrado a seguir:

Podemos escrever este cdigo diretamente porque, quando voc usa o Fields Editor, alguns componentes relacionados com os campos so automaticamente includos no formulrio e no Code Editor. Cada vez que voc incluir ou remover campos no Fields Editor, poder ver o efeito de sua ao imediatamente no formulrio. Voc no ver os valores de um campo calculado, porque eles somente esto disponveis em tempo de execuo, uma vez que resultam da execuo de cdigo Pascal compilado. O formulrio exposto abaixo, mostra o funcionamento do campo calculado neste exemplo.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.125

CINCIA DA COMPUTAO - DELPHI

Observao: O mesmo procedimento para utilizao de campos calculados podem ser utilizados para Queries.

13.13 Pesquisa de Registros


Podemos melhorar nossos exemplos de aplicaes para banco de dados incluindo capacidades para pesquisa. Queremos ser capazes de informar um nome em uma caixa de edio e saltar para o registro correspondente. Esta a razo para o desenvolvimento de uma nova aplicao. Nesta aplicao faremos dois tipos de pesquisas: (1) Exata 2 (2) Inexata. A primeira permitir achar nomes idnticos ao nome informado e, a Segunda, permitir encontrar nomes parcialmente idnticos. Crie uma nova aplicao e construa o formulrio conforme ilustrado a seguir. Utilizaremos a tabela Country do banco de dados DBDemos, onde faremos pesquisas a partir de nomes de pases da Amrica do Sul.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.126

CINCIA DA COMPUTAO - DELPHI


Para nossa inteno de pesquisa, usamos para o boto Pesquisa Exata, o comando FindKey; e para o boto Pesquisa Inexata, o comando . O cdigo referente a cada um deles foi descrito no evento OnClick dos botes.

Estes comandos so suficientes para o nosso primeiro teste, contudo, tenha em mente que o componente Table pode fazer pesquisas somente com campos indexados. Por esta razo, voc precisa configurar a propriedade IndexFieldNames do componente Table para o valor apropriado.

13.14 Pesquisa com Intervalos


Vimos anteriormente como efetuar pesquisas entre registros a partir de uma informao especfica. Agora vamos demonstrar como efetuar pesquisas onde podem ser passadas duas informaes diferentes, correspondendo cada uma a um valor, inicial ou final, de um intervalo. Somente sero mostrados os registros cujos dados correspondam aos limites impostos pelos valores inicial e final. O Delphi possui um conjunto de mtodos especficos para esta operao, so eles: SetRange: define o valor inicial e o final do intervalo considerado. ApplyRange: Aplica o intervalo de pesquisa e a filtragem dos dados. CancelRange : Cancela o intervalo de pesquisa. Desenvolveremos uma nova aplicao cujo objetivo ser demonstrar a pesquisa com intervalos. Para isto utilizaremos a tabela BioLife do Banco de Dados DBDemos. Construa o formulrio como mostrado abaixo:

Escreva para o evento OnCLick dos botes de presso Aplicar e Cancelar (cuja propriedade Name de cada um possui os valores CmdAplicar e CmdCancelar) o cdigo abaixo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.127

CINCIA DA COMPUTAO - DELPHI

O campo que ser referenciado durante as pesquisas, deve ser um campo indexado e indicado atravs da propriedade IndexFieldNames . Compile e execute este projeto e informe para os edits valores numricos referentes ao contedo do campo Species No.

13.15 DBLOOKUP COMBO BOX


muito comum no desenvolvimento de aplicaes de banco de dados, utilizar vrias tabelas relacionadas. No Delphi, existem duas tabelas que ilustram a situao que estamos sugerindo. Tratamos das tabelas Customers e Order. A primeira contm dados referentes aos Clientes de uma empresa,sendo que cada um possui um nico cdigo de registro (campo CustNo). J a Segunda contm uma srie de pedidos de compra em nome dos vrios clientes cadastrados na primeira tabela. Cada pedido de compra possui um cdigo referente ao cliente que o solicitou. A utilidade do DBLookupComboBox se d quando precisamos manipular os dados de clientes e pedidos sem fazermos uso do cdigo de registro de cada cliente, o que no seria a maneira mais natural num programa de cadastro de novos pedidos. Para no trabalhar com o cdigo do cliente, colocamos este novo componente no formulrio alm dos componentes DBEdit. Veja como ficou:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.128

CINCIA DA COMPUTAO - DELPHI

Este novo componente pode ser conectado a duas fontes de dados (DataSource) ao mesmo tempo, uma com os dados reais e uma Segunda com os dados exibidos. Basicamente queremos conect-lo ao campo CustNo do DataSource1, mas deixar que ele mostre dados extrados de outra tabela, Custormer. Para obtermos este efeito no precisaremos digitar uma linha de comando sequer. Basta ajustarmos corretamente as propriedades DBLookupComboBox, Table e DataSource. Primeiramente, faremos a conexo entre o DataSource1 e o Table1 com o banco de dados DBDemos e com sua tabela Order. Em seguida, conectaremos o DBEdit1 e o DBEdit2 do formulrio, com o DataSource1. Faremos tambm a conexo entre o DataSOurce2 e o Table2 com o banco de dados DBDemos e com sua tabela Customers. Por fim, ajustaremos as propriedades do DBLookupComboBox conforme indicado abaixo e, mudaremos as propriedades Active dos componentes Table, para True. As ppropriedades KeyField, ListFIeld e ListSource sero necessrias para relacionar as duas tabelas. Note que KeyField indica o campo CustNo, que contm os cdigos dos clientes, presentes nas duas tabelas e fundamental para o relacionamento. Tambm observe que ListField, juntamente com ListSource, indicam o campo cujo contedo ser mostrado no ComboBox, bem como sua origem na tabela Customers. Veja abaixo o efeito destes comandos e note que o nome do cliente e seu cdigo so entrelaados, ou seja, alterando-se um , aletra-se o outro.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.129

CINCIA DA COMPUTAO - DELPHI 13.16 QUERIES PARAMETRIZADAS


O uso que podemos fazer de queries extremamente amplo e os recursos disponveis para filtragem de dados so timos. Basicamente, sabemos sobre queries, que elas se fundamentam em comandos SQL. Tais comandos podem ser digitados, em tempo de projeto, diretamente numa caixa de dilogo, que surge a partir da propriedade SQL do componente Query. Contudo, pode vir a ser til que o prprio usurio informe os parmetros que deseja ao invs de ns mesmos programadores, permitindo que query seja adaptada as necessidades do usurio. Vejamos agora como desenvolver um projeto que trabalhe com queries parametrizadas. Inicialmente crie uma nova aplicao e construa o formulrio exibido na figura seguinte. A seguir faa a conexo entre os componentes Query, DataSOurce e DBGrid. Utilizaremos o banco de dados DBDemos.

Ao clicar o boto Visualizar todos os Registros, os usurio ter acesso aos campos First_Name e Occupation da tabela Clients.

Para o boto Executar Query, criamos um cdigo um pouco mais complexo, cujo objetivo ser adaptar-se s informaes fornecidas pelo usurio atravs dos Edits.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.130

CINCIA DA COMPUTAO - DELPHI

Compile e execute esta aplicao lembrando-se que dever informar nos Edits, os dados que iro compor as condies da clasula Where da Query, antes de clicar no boto Executar Query.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.131

CINCIA DA COMPUTAO - DELPHI

14. QUICK REPORT


Uma das coisas fundamentais para qualquer linguagem de programao que manipula banco de dados so as ferramentas para criao de relatrios. Sem os relatrios no h como listar os dados do banco de dados de maneira adequada. Embora possa fazer uma listagem simples na tela, o visual e os efeitos de manipulao no so os mesmos daqueles disponveis atravs de ferramentas prprias para relatrios. O Delphi possui dois componentes para manipular relatrios: o ReportSmith e o QuickReport. O primeiro trs avanados recursos para criao de relatrios sofisticados envolvendo diversas tabelas e complexas estruturas relacionais, contudo sua utilizao, alm de complexa, s pode ser feita em detrimento da velocidade de processamento da aplicao. O QuickReport, por ser mais rpido e fcil de usar, trs recursos mais sintticos, no entanto incomparavelmente mais rpido. Abordaremos aqui algumas tcnicas para utilizao do QuickReport. Recomendamos contudo maiores pesquisas.

Construindo uma caixa de configurao de relatrios


de grande importncia para um relatrio, a existncia de uma caixa de configurao. Atravs desta caixa ser possvel efetuar alguns ajustes no relatrio antes dele ser impresso, tais como a orientao da impresso, o tamanho do papel, o tipo de direcionamento (video ou impressora), etc. Optamos portanto, em primeiro lugar construir tal caixa de configuraes a partir de um novo projeto. Veja o formulrio a seguir, e reconstrua-o .

Como voc pode ver, ao determinarmos a forma de visualizao e a orientao da impresso, devemos clicar no boto Prosseguir. Este boto ser o responsvel pelo funcionamento correto do QuickReport. Veja a seguir os comando do evento OnClick deste boto.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.132

CINCIA DA COMPUTAO - DELPHI


O cdigo acima merece alguns esclarecimentos: Os dois conjuntos de botes de seleo so usados para definir a forma de visualizao e a orientao da pgina. FrmReport e QuickRep1 so respectivamente o nome do formulrio no qual ser construido o relatrio e o nome interno do componente QuickReport que utilizaremos em seguida no formulrio FrmReport. A Propriedade Orientation um recurso prprio do QuickReport, e permite determinar a orientao do papel durante a impresso. Os mtodos Preview e Print ativam o modo de visualizao de prvia de pgina e impresso. Por fim, para que a unit relacionada a este formulrio possa funcionar corretamente, inclua sua clusula Uses duas bibliotecas extras: Printers e UfrmReport.

Construindo um Relatrio Rpido


Para construirmos um QuickReport, utilizaremos um assistente prprio. Este assistente incluir todos os componentes bsicos necessrios. Mais tarde ser possvel modific-los se for necessrio. Siga os passos abaixo: 1. 2. 3. Clique no menu File/New; Selecione a pgina Forms; Selecione QuickReportList;

Componente QRSysData (Ttulo)

Componente Master Table

Componente QuickReport

Incluir componentes QRLabel para Cabealho de Colunas

Componente SysData (Nmero da Pgina)

Incluir componentes QRDBText para os campos da Linha de Detalhe

O primeiro componente o componente QuickRep1, encontrado no formulrio QRListForm (Formulrio container para desenhar o relatrio), e inserido automaticamente . necessrio modificar umas propriedades para que o relatrio funcione. Alm disso, tambm precisaremos modificar as propriedades do componente Master Table para indicar o banco de dados DBDemos e a tabela Animals, fazendo tambm o relacionamento do componente QuickRep1 com o Master Table atravs da propriedade DataSet.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.133

CINCIA DA COMPUTAO - DELPHI

No esquea de mudar para True o valor da propriedade Active do componente Master Table. Veja a figura a seguir . Ela mostra o relatrio da maneira com que o usurio veja os dados. Para chegarmos a isto, utilizamos os componentes QRLabel, QRDBText, QRSysData, QRDBImage e QRBand ( inserido de forma automtica pelo assistente) no formulrio QRListForm.

Formulrio de Visualizao do relatrio em execuo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.134

CINCIA DA COMPUTAO - DELPHI

Para que voc possa inserir o nome do peixe, ser necessrio, na rea de Detalhe, inserir o componente QRDBText. Contudo o funcionamento correto deste componente, depende de certos ajustes em suas propriedades DataSource e DataField. O mesmo se aplica ao componente QRDBImage para mostrar a fotografia do peixe. O ttulo do relatrio e os ttulos das colunas: Nome do Peixe e Fotografia do ambiente foram escritos no espao destinado ao Titulo e cabealho de pgina, utilizando os componentes QRSysData (Titulo, Data, Hora, N Pgina, ... ) e QRLabel. A partir deste ponto, poderamos propor novas modificaes no relatrio, mas sabendo que todos os componentes e cdigos bsicos j esto devidamente colocados desejvel test-lo. Salve o projeto, compile-o e execute-o .

Explorando o componente QRBAND


O componente QRBand fundamental para a construo de um QuickReport. Ele permite abrir espaos especficos para determinados tipos de informaes. Podemos observar, aps o uso do assitente QuickReportList, que quatro reas foram criadas: Page Title (Pgina de Titulo), Page Header (rea de Cabealho), Detail (rea de Detalhe) e Page Footer (rea de Rodap). Page Title a rea para a digitao do titulo do relatrio e das informaes que aparecero uma nica vez. Page Header corresponde ao cabealho do relatrio e onde distribumos os ttulos das colunas e outras informaes que se repetem a cada pgina. Page Footer corresponde ao rodap do relatrio, e geralmente reservamos para a numerao de pginas e exibio de totais calculados. Detail a rea para listar as informaes dos campos da tabela. Atravs do componente QRBand possvel definir cada uma destas reas e, se for necessrio, outras ainda mais especficas. Ao inseri-lo no formulrio em branco podemos compreender melhor a sua propriedade BandType. Atravs dela podemos determinar um tipo especfico para o QRBand.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.135

CINCIA DA COMPUTAO - DELPHI

Explorando o Componente QRDBText


O componente QRDBText necessrio para a mostrar os campos dos diferentes registros do banco de dados. atravs dele que se define o posicionamento das informaes e suas origens. Atravs da sua propriedade DataField, pode-se definir exatamente qual campo ter seu conteudo mostrado na tela. Com a propriedade DataSource, necessriamente definida antes de DataField, associa-se o componente a uma fonte de dados, por sua vez, conectada a uma tabela.

15. Programao Orientada a Objetos


Objetivo
Neste capitulo nosso objetivo ser o de expandir a sua noo a respeito da programao visual no Delphi. Foi mostrado que a criao de formulrios funcionais comea introduzindo o conceito de programao orientada a eventos, onde programa-se diretamente a partir do formulrio e nos pontos em que as aes do usurio sobre ele so importantes e devem ser consideradas. Mesmo com todas as vantagens desta tcnica, a programao Delphi no se resume apenas nisso. Um ponto fundamental e de seu interesse a programao orientada a objetos. Para cumprirmos esta meta, voc no precisa ser profundo conhecedor de OOP (Object-Oriented Programming). Na verdade a maior parte do cdigo relacionado escrita automticamente. Mas saber os detalhes da linguagem e de sua implementao o ajudar a entender como funciona e a dominar verdadeiramente o Delphi. Por exemplo importante conhecer mais profundamente trs conceitos fundamentais em OOP que so usados pelo Object Pascal: Classes, Herana, Encapsulamento e Polimorfismo. A partir do que foi exposto, importante expor alguns conceitos e termos que sero importantes para a compreenso do Delphi enquanto sendo uma linguagem OOP.

Classes, Objetos e Mtodos


As classes so utilizadas pelo programador para organizar o cdigo fonte e pelo compilador para gerar o aplicativo. A definio de uma classe se inicia a partir da palavra reservada Class. Numa anlise simplificada, uma classe um tipo de dado Record aprimorado e capaz de suportar, alm de definies de variveis, definies de procedures e functions. Tais procedures e functions internas uma classe so denominadas de Mtodos. Estes mtodos so declarados e utilizados de maneira muito semelhante quela referente a procedures e functions comuns. A existncia de mtodos inicialmente prprios de uma classe e, ao mesmo tempo, compartilhveis (da forma como acontece no Delphi) permite o desenvolvimento de aplicaes que no contenham linhas de cdigo densamente repetidas. A ttulo de

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.136

CINCIA DA COMPUTAO - DELPHI


esclarecimento, saiba que todas as classes do Delphi, que tm finalidades especficas, dependem ou mantm estreita ligao com os mtodos originais da classe Tobject. J as variveis do tipo classe, so conhecidas como Objetos ou Instncias de uma classe; no caso destas variveis, vale dizer que no apenas representam segmentos de memria prprios para o armazenamento de informaes, mas entidades reais com as quais o programador ir interagir no desenvolvimento do projeto.

Evento e sua relao com Classes


Os eventos, como pudemos ver, se relacionam com as coisas que acontecem durante o funcionamento da aplicao. Os eventos so a representao ou, at mesmo a repercusso, das aes do usurio. Por exemplo, pode ser importante saber se o usurio deu um clique num determinado boto, pois talvez tenhamos relacionado a ele um cdigo que deva ser executado. Os mtodos correspondem as procedures e functions que podem ser executadas a partir de um dado evento. Os mtodos so estruturas internas amplamente utilizadas e somente definidas dentro de uma clase.Portanto as classes tem a uma importncia capital. Quando se controi ou se utiliza uma classe qualquer, ampliam-se as possibilidades de resposta a eventos provocados pelo usurio.

Propriedades e sua relao com as Classes


Um projetista de Delphi usa as propriedades de um componente para ler ou definir certos atributos semelhante aos campos arazenados em uma Classe. Entretanto, as propriedades podem disparar cdigo a ser executado. Por exemplo, quando voc muda a propriedade Shape do componente Tshape, este altera realmente a figura. Deve haver um mecanismo que diz ao componente para que mude a figura, quando a propriedade for alterada. Em outras palavras, uma propriedade pode assumir duas personalidades: ela pode ser contituda de dados que afetam o funcionamento de um componente ou pode disparar uma ao.

Herana
muito comum precisarmos de uma verso ligeiramente diferente de uma classe existente. Por exemplo, s vezes poderia ser til adicionar ou alterar um mtodo existente. Mudando o cdigo original, voc pode criar problemas de funcionamento para as Units que utilizam-se dele. Uma pssima alternativa poderia ser a de copiar o cdigo referente quela Classe e , aps fazer as alteraes necessrias, dar a classe um novo nome. Isto no recomendvel uma vez que a duplicao de mtodos poderia gerar inconsistncias com os dados utilizados. A sada protanto seria definir uma nova classe que possa aproveitar todo o cdigo de uma classe sem, claro, duplic-lo, e efetuar as devidas mudanas apenas em sua estrutura. Esta tcnica chamada de herana ou derivao. Para herdar as caractersticas de uma classe existente, necessrio indic-la na declarao da nova classe: Type TnovoForm = Class (TForm) End; A definio acima indica que a classe recm criada TnovoForm herda todos os mtodos, e elementos da classe Tform. Na verdade, por sua vez, TForm herda tambm uma srie de caractersticas da classe Tobject.

Encapsulamento
Durante o desenvolvimento de uma classe segundo uma boa abordagem orientada a objetos, o programador deve definir quais os objetos e mtodos estaro disponveis mais tarde para diversas aplicaes e, quais devero permanecer ocultos sob pena de prejudicar o bom funcionamento da classe. A tcnica de ocultamento de variveis e mtodos conhecida como encapsulamento. Certas palavras chaves devem ser utilizadas durante o desenvolvimento de uma classe, como forma de restringir o acesso completo a certos objetos e mtodos. Basicamente estas palavras chaves so: private e public. A primeira define objetos e mtodos no disponveis fora da unit em que a classe foi desenvolvida. A segunda refere-se a objetos e mtodos disponveis totalmente a patir de qualquer aplicao. Por exemplo, observe a declarao da classe abaixo: Type TnovaClasse = Class(TObject) Private X,Y, Z : Integer; Function Exemplo1(Valor : Integer): Integer; Public Nome: String; Procedure Exemplo2 (N : String); Function Exemplo3 : Boolean; End;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.137

CINCIA DA COMPUTAO - DELPHI


Os objetos X, Y, Z e o mtodo Exemplo1, esto encapsulados na classe TnovaClasse. J o objeto Nome e os mtodos Exemplo2 e Exemplo3, esto disponveis para qualquer utilizao.

Exemplo da Construo uma Classe


Nossa inteno ser a de esclarec-lo um pouco mais a respeito de orientao a objetos atravs da construo de uma classe. Para isto, importante que voc saiba que no precisaremos necessariamente de um formulrio, mas apenas de uma Unit. Todo o cdigo desenvolvido numa unit poder ser aproveitado posteriormente a partir de um formulrio. Para comearmos, clique no menu File/Close all e, em seguida no menu File/New. Na pgina New, clique em Unit e, depois, clique no boto OK. Observe que a unit criada pelo Delphi aparece com quatro palavras chaves: Unit, Interface, Implementation e end. Unit: especifica sua frente o nome da unit ou do arquivo onde o cdigo fonte ser escrito. Este nome obrigatrio e pode ser definido quando a unit for armazenada em disco sob a forma de arquivo. Interface: permite definir o que ser visvel a outras units ou aplicaes. Na Interface o programador pode declarar constantes, tipos de dados, variveis, procedimentos e funes. Este o lugar para o desenvolvimento da classe a que nos propomos desenvolver. Implementation: o que tiver sido declarado na interface pode ser acessado atravs do cdigo da implementation. As procedures e functions comuns so definidas aqui. Alm disso podemos fazer declaraes que no so acessveis a outras units e aplicaes. End: marca o final da unit. A partir desta clasula no deve ser escrito comando algum. Antes de construirmos a classe, importante que saibamos seu objetivo. Desejamos criar mtodos que permitam manipular uma determinada data no formato (dd/mm/aaaa). Esta Classe possuir uma propriedade com o nome SemanaData do tipo boolean que indicar a presena ou no do dia da semana na data por extenso respondida e um mtodo com o nome Data_Formatada que recebe uma data em uma string no formato dd/mm/aaaa e retorna a data por extenso no formato [dddd,] dd de mmmm de aaaa.

Veja o fonte da Unit:


unit UDatas; interface uses sysutils; { Disponibiliza a biblioteca de comandos Sysutils } Type

Tdata = class (Tobject)

{ Herana } }

Private { Encapsulamento Dia, Mes, Ano : Integer; SData : Boolean; Procedure Separa_Dados (DataCompleta : String); Public

{ Propriedade SemanaData }
Property SemanaData: Boolean read SData Write SData default False; Constructor Inicializa; Function Data_Formatada (Dt : String) : String; End; Var Meses : array [1..12] of string[9] = ('Janeiro','Fevereiro','Maro', 'Abril','Maio','Junho','Julho', 'Agosto','Setembro','Outubro', 'Novembro','Dezembro'); implementation Constructor TData.Inicializa; { Este construtor importante para evitar erros em tempo de execuo ocasionados por uma inicializao invlida dos objetos abaixo } Begin Dia := 0; Mes := 0; Ano := 0; End; Procedure TData.Separa_Dados(DataCompleta : String); Begin Dia := StrToInt(Copy(DataCompleta,1,2));

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.138

CINCIA DA COMPUTAO - DELPHI


Mes := StrToInt(Copy(DataCompleta,4,2)); Ano := StrToInt(Copy(DataCompleta,7,4)); {Separa os dados fornecidos pela string e, atribui a cada um deles aos seus respectivos objetos } End;

{ Mtodo Data_Formatada }
Function TData.Data_Formatada(Dt : String) : String; Begin Separa_Dados(DT); if not SData Then { Verifica o valor da propriedade SemanaData } Data_Formatada := IntToStr(Dia) + ' de ' + Meses[Mes] + ' de ' + IntToStr(Ano) else Data_Formatada := FormatDateTime('dddd',strtodate(Dt)) + ', ' + IntToStr(Dia) + ' de ' + Meses[Mes] + ' de ' + IntToStr(Ano); End; end. Digite o cdigo acima e salve (File/Save) a nova unit com o nome Udatas. Em seguida clique no menu File/Close all. Agora, criaremos um novo projeto contendo uam unit e um formulrio. Para isto, clique no menu File/New application. Estamos prontos para desenvolver um projeto que lhe permita compreender como utilizar a classe Tdata. Construa agora o formulrio segundo o exemplo abaixo:

Desenhe o formulrio acima colocando no formulrio os componentes EditBox, GroupBox, dois RadioButton, tres Label e dois Button. Em seguida ajuste as propriedades dos componentes conforme o desenho acima. Tela do aplicativo em execuo:

Veja abaixo o fonte do aplicativo:

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.139

CINCIA DA COMPUTAO - DELPHI


unit UObjeto; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, UDatas; type TForm1 = class(TForm) TxtData: TEdit; Label1: TLabel; CmdExecutar: TButton; Label2: TLabel; LblDataPorExtenso: TLabel; CmdFechar: TButton; GroupBox1: TGroupBox; OptSim: TRadioButton; OptNao: TRadioButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure CmdExecutarClick(Sender: TObject); procedure CmdFecharClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Data: TData; { Declarao do objeto Data } implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Data := Tdata.Inicializa; { Aloca recursos do sistema para a instncia do objeto TDATA } end; procedure TForm1.FormDestroy(Sender: TObject); begin Data.Free; { Desaloca recursos do sistema para TDATA } end; procedure TForm1.CmdExecutarClick(Sender: TObject); Var X : TDateTime; begin Try X := strtodate(TxtData.Text); Except On EConvertError do { Exceo por data invlida durante a converso } begin Showmessage('Data Invlida'); TxtData.setfocus; Exit; end; end; { Ajusta Propriedade SemanaData do Objeto Data } If OptSim.Checked then Data.SemanaData := true else Data.SemanaData := false; { Chama o mtodo Data_Formatada do Objeto Data } LblDataPorExtenso.Caption := Data.Data_Formatada(TxtData.Text); { Passa a string TxtData.Text como parmetro para a funo Data_Formatada da Classe Tdata.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.140

CINCIA DA COMPUTAO - DELPHI


O retorno da funo TData uma String que ser Mostrada no Rtulo. } end; procedure TForm1.CmdFecharClick(Sender: TObject); begin Form1.Close; end; end.

Observaes: Foi acrescentado unit, abaixo da clasula Var, o cdigo: Data : TData. Alm disso, na clasula Uses, adicione a unit UDatas. Agora, devemos incluir a unit TData, que foi salva separadamente, no projeto que estamos desenvolvendo. Sem esta etapa, o Delphi no poder utiliz-la uma vez que ela no faz parte do projeto. Para isto, clique no menu View/Project Manager. Em seguida clique no cone Add unit . Selecone o arquivo UDatas.pas e clique no boto Abrir . A partir de agora basta compilar e executar o projeto ( menu Run/Run ).

16. Anexo: Classes e Componentes


Classes Os mecanismos associados ao conceito de classes constituem a base sobre a qual apia-se a programao orientada a objetos.

Classes so implementadas por estruturas do tipo Class Trata-se da unio de dados e cdigo numa mesma estrutura . Extenso do tipo Record: Alm dos campos de dados incluem : Mtodos (Procedimentos e Funes sobre os dados).

Classe pode conter campos, mtodos e propriedades As propriedades parecem ser campos, mas no so. Na verdade elas definem mtodos que so automaticamente executados toda vez que o valor da propriedade lida ou alterada.

Classes e Objetos Uma vez declarada uma classe podemos declarar variveis dos respectivos tipos. A instncia da classe , que surge aps a chamada a um mtodo construtor e efetivamente ocupa espao na memria, d-se o nome genrico de objeto.

Mtodos construtores e destrutores Os Objetos so criados a partir da ativao de um mtodo construtor e so destrudos a partir da ativao de um mtodo destrutor. Os mtodos construtores e destrutores so declarados como se fossem procedimentos normais, porm no lugar da palavra procedure usada a palavra constructor e destructor. A forma de trabalhar com classes e respectivos objetos obedece uma seqncia: o A criao o O uso o A destruio do objeto

Criando um Objeto A criao do objeto ocorre quando o construtor ativado por meio de uma referncia ao nome da classe.

O que ocorre quando o construtor chamado Campos numricos, inteiros ou reais so inicializados com zero. Campos de tipo Pointer (inclusive os do tipo class) so inicializados com Nil. Os campos do tipo string so inicializados com vazio.

Usando um Objeto Os campos , mtodos ou propriedades do objeto so referenciados pela varivel do tipo class.

Implementando Mtodos

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.141

CINCIA DA COMPUTAO - DELPHI


Cada objeto possui sua prpria rea em que ficam armazenados os campos e os mtodos so compartilhados por todos os objetos da mesma classe. Procedure TNomeClasse.NomeMetodo(...); Function TNomeClasse.NomeMetodo(...) : TTipoDaFuncao;

O Parmetro Invisvel: Self Os mtodos possuem um parmetro invisvel chamado Self. O tipo do parmetro Self o mesmo da classe a que o mtodo pertence. Durante a execuo , Self uma referncia ao objeto usado na ativao do mtodo. Tudo se passa como se os mtodos fossem declarados da seguinte forma: o Procedure TNomeClasse.NomeMetodo (Self : TNomeClasse; ...);

Destruindo um objeto Os objetos so destrudos pela chamada a um mtodo destrutor. Quando um mtodo destrutor chamado, os seus comandos so executados para liberar a rea ocupada pelo objeto.

Exemplo: Type TVetor = Class V : Array Of String; // Vetor dinmico Max , Tam : Integer; Constructor Cria (I : Integer); Destructor Destroi; Procedure Incluir(S : String); Function Pesquisa(S : String ;Var P : Integer) : Boolean; End; Implementation { TVetor } Constructor TVetor.Cria(I: Integer); begin // Aloca array dinmico com capacidade p/ I itens SetLength(V,I); // inicializa indices de controle Max := I; Tam := 0; end; Destructor TVetor.Destroi; begin V := nil; // desaloca o array dinmico end; Herana a capacidade de criarmos novas classes a partir de classes existentes. Aproveitamos a funcionalidade anterior, adicionamos funcionalidade e modificamos comportamento, criando assim uma nova classe com parte de sua funcionalidade j testada, tornando-a assim mais confivel.

Exemplo: Type Tpilha = Class(TVetor) public FTopo : String; Constructor Cria(I : Integer); Procedure Empilhar(S : String); Procedure Desempilhar; Procedure Esvaziar; End; implementation { Tpilha } constructor Tpilha.Cria(I: Integer); begin Inherited Cria(I); // Chama o construtor herdado FTopo := ''; end; Polimorfismo a capacidade de tratarmos objetos de diferentes tipos de uma mesma maneira, desde que eles tenha um ancestral comum. No Delphi todos os objetos so derivados de um tipo bsico chamado TObject. Portanto, qualquer funo, expresso ou estrutura que lide com TObject poder lidar tambm com qualquer outro tipo de objeto.

Referncias para Classes Tipos que so referncias para classes permitem a realizao de operaes diretamente sobre as classes, ao invs de sobre as suas instncias.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.142

CINCIA DA COMPUTAO - DELPHI


Referncias para as classes podem ser teis nas seguintes situaes: o Do lado direito de um operador IS para a realizao de uma verificao dinmica de tipo. o Do lado direito de um operador AS para a realizao de uma converso de tipo com verificao de compatibilidade.

Encapsulamento A idia por trs do conceito de encapsulamento que quanto menos o usurio da classe souber sobre a implementao da classe, menos ser afetado por eventuais alteraes. Evitando que o desenvolvedor que usa a classe, crie cdigo dependente de informaes da implementao da classe.

Private Sees Private restringem o acesso s variveis, propriedades e mtodos nela declarados ao mdulo onde est definida a classe.

Protected Sees Protected restringem o acesso s variveis , propriedades e mtodos nela declarados ao mdulo onde est definida a classe e nas classes descendentes.

Public Published Sees Published no restringem o acesso s variveis , propriedades e mtodos da classe. Qualquer declarao nesta parte, alm do mesmo nvel de visualizao da seo public, gera RTTI Run Time Type Information, entre outras que as propriedades ou eventos da classe sejam manipulados atravs do Object Inspector do Delphi (Componentes). Sees Public no restringem o acesso s variveis , propriedades e mtodos da classe.

Exemplo: Type TCliente = Class Private FCodigo : LongInt; FNome : String; Protected Function GetCodigo : LOngInt; Function GetNome : String; Procedure SetCodigo(Value : LongInt); Procedure SetNome(Value : String); Public Constructor Create; Property Codigo : LongInt read GetCodigo Write SetCodigo; Property Nome : String SetNome; End; Implementation { TCliente } constructor TCliente.Create; begin FCodigo := 0; FNome := ''; end; function TCliente.GetCodigo: LongInt; begin Result := FCodigo ; end; function TCliente.GetNome: String; begin Result := FNome ; end; procedure TCliente.SetCodigo(Value: Integer); begin FCodigo := Value; end; procedure TCliente.SetNome(Value: String); begin FNome := Value; end; Biblioteca de Classes Uma biblioteca de classes um conjunto planejado de classes e construdo para ser utilizado em vrios projetos de desenvolvimento. As classes pertencentes ao conjunto so relacionadas entre si por herana ou simples utilizao mtua.

read GetNome Write

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.143

CINCIA DA COMPUTAO - DELPHI


Visual Component Library - VCL Uma biblioteca de classes que d ao Delphi todos os seus sofisticados recursos de desenvolvimento visual e banco de dados.

Parte da Hierarquia da VCL

Componentes Um Componente qualquer classe visual ou no que descenda de TComponent.

Componentes Personalizados So componentes construdos por voc ou qualquer desenvolvedor e no fazem parte do conjunto padro da VCL.Podemos adicionar componentes a VCL, escrevendo-os em Object Pascal.

Porque Construir Componentes? A idia compor uma aplicao atravs de fragmentos de cdigo, pr-construdos e customizveis. Desta forma uma aplicao robusta construda de forma mais confivel e rpida, pois supe-se que estes fragmentos de cdigo j tenham sido testados de modo a funcionar de forma correta e eficiente.

Componentes Viabilidade de Desenvolvimento 1. 2. 3. 4. Temos tempo o bastante para construir o componente de forma confivel? Temos certeza que no existe um componente na VCL que faz o que precisamos com a adio de uma poro de cdigo menor? Iremos utilizar o componente repetidas vezes atravs deste e outros projetos? Os esforos exigidos para construir o componente so justificados?

OOP para construo de componentes J vimos que um componente uma classe derivada de TComponent da VCL. Ao construirmos um componente estamos lidando com classes, enquanto o usurio de nosso componente ir lidar com o objeto. Para usurios o importante saber usar o componente, no importando como foram implementadas as diversas propriedades, mtodos e eventos do nosso componente.

Ancestral e Descendentes Ao construir um componente, necessrio saber o que as classes tm a oferecer, para poder decidir de qual classes o componente ir descender. necessrio saber tudo que o componente herdou e tirar o maior proveito destas caractersticas sem ter que rescrevlas. Todas as classes que esto acima do nvel hierrquico do ancestral imediato, so tambm ancestrais do componente.

Hierarquia de Classes Todo relacionamento ancestral-descendente cria uma rvore de dependncia chamada hierarquia de classes. A cada gerao de um descendende, a classe passa conter mais caracteristicas.

Mtodos - Tipos Estticos Virtual / Dynamic

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.144

CINCIA DA COMPUTAO - DELPHI


Virtual Abstract Overrride

Mtodo Esttico Todos os mtodos de classe so estticos, a no ser que se diga ao contrrio. Mtodos estticos funcionam como procedures ou functions normais. A principal vantagem desde tipo de mtodo a rapidez na chamada (Execuo). TMeuComponente = Class(TComponent) Procedure FacaAlgo; (.....) End;

Mtodo Virtual Chamar um mtodo virtual igual ao esttico , porm o endereo do mtodo no definido em tempo de compilao. A declarao de um mtodo virtual adiciona uma entrada na virtual method table (VMT) que guarda os endereos de todos os mtodos virtuais de uma classe. TMeuComponente = Class(TComponent) Function Data_Hora : TDateTime; Virtual; (.....) End;

Mtodo Dynamic Mtodos dinmicos so como mtodos virtuais, exceto pelo fato de que os mtodos dinmicos no possuem entrada na VMT da classe. Isto reduz a quantidade de memria usada para alocar o objeto, porm a chamada a mtodos dinmicos mais lenta que a mtodos virtuais. TMeuComponente = Class(TComponent) Procedure FacaAlgo; Dynamic; (.....) End;

Mtodo Override So mtodos que substituem mtodos virtuais da classe ancestral. Os mtodos Override devem ser declarados com o mesmo nome e os mesmos parmetros do mtodo virtual da classe ancestral.

Exemplo: Ancestral Classe TProjeto Type TProjeto = Class ..... Function CustoAtual : Double; Virtual; Function Info: String ; Virtual; End; Implementation ... Function TProjeto.CustoAtual : Double; Begin Result := 0.0; End; Function TProjeto.Info : String; Begin Result := ; End; .... End.

Descendente Classe TProjeto Type TProjetoSoftware = Class(TProjeto) ..... Function CustoAtual : Double; Override; Function Info: String ; Override; End;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.145

CINCIA DA COMPUTAO - DELPHI


TProjetoHardware = Class(TProjeto) Function CustoAtual : Double; Override; Function Info: String ; Override; End; Implementation Function TProjetoSoftware.CustoAtual : Double; Begin Result := (FCustoHora * FHoras) + CustoSuprimentos + CustoConsultoria; End; Function TProjetoHardware.CustoAtual : Double; Begin Result := (FCustoHora * FHoras) + CustoComponentes + CustoPlaca + + CustoMecanica + CustoDesign; End; .... End. Mtodo Virtual e Abstrato Quando a declarao de um mtodo incluiu, inclui alm da clasula virtual, a clasula abstract, a respectiva implementao no precisa e nem pode ser definida na classe ancestral. Na classe ancestral, a substituio Override dos mtodos virtuais abstratos obrigatria. TMeuComponente = Class(TComponent) Procedure FacaAlgo ; Virtual ; Abstract; (.....) End;

Mtodo Overrride Complementa o que feito no virtual Function TProjetoHardware.CustoAtual : Double; Begin // Obtem custo atual da classe superior Result := Inherited CustoAtual; // Completa com o custo atual da prpria classe Result := Result + CustoComponentes + CustoPlaca + CustoMecanica ; End; Procedure ClasseDerivada.Proc Begin Inherited Proc; // Ativa o Proc Herdado ... // Faz o que tem que fazer End; Classe pode conter propriedades As propriedades parecem ser campos, mas no so. Na verdade elas definem mtodos que so automaticamente executados toda vez que o valor da propriedade lida ou alterada . A vantagem mais importante do uso de propriedades a possibilidade destas aparecerem no Object Inspector, em tempo de desenvolvimento. Isto simplifica muito o trabalho do desenvolvedor, pois permite o controle de vrios parmetros da classe sem ter de pass-los ao construtor.

Declarao de Propriedades Property NomePropriedade : TipoPropriedade read Campo/Mtodo de Leitura [write Campo/Mtodo de Escrita] Protected FMax , FValor : Integer; // Campos Published Property Max : Integer read FMax Write FMax; Property Valor : Integer read FValor; // read-only Mtodo de Leitura - Propriedades um mtodo que controla o acesso de leitura.(Function) Type TAlgumComponente = Class(TComponent) Protected FCampo : Integer; Function GetCampo : Integer; Published Property Campo : Integer read GetCampo Write End;

FCampo;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.146

CINCIA DA COMPUTAO - DELPHI


Mtodo de Escrita - Propriedades um mtodo que controla o acesso de escrita.(Procedure) Type TAlgumComponente = Class(TComponent) Protected FCampo : Integer; Procedure SetCampo (Value : Integer); Published Property Campo : Integer read FCampo Write End; Publicando propriedades Herdadas Todos os componentes herdam propriedades de seus ancestrais e muitas destas propriedades herdadas podem ser protected ou public e no published. Para transferir uma propriedade herdada para um nvel de proteo mais amplo deve-se redeclarar a propriedade. TMeuComponente = Class(TComponent) Published Property Autosize; Property Caption; ... EVENTOS Eventos so partes importantes de componentes, embora o criador de componentes no necessite muito trabalho para implement-los. Um evento um link entre uma notificao do sistema, que o componente precisa responder, e o mtodo de manipulao desta ocorrncia. Este cdigo chamado de manipulador de evento (event handler) e deve ser escrito pelo usurio do componente. Com a manipulao de eventos, usurios conseguem dar inteligncia extra aos componentes.

SetCampo;

TIPOS PREDEFINIDOS DE EVENTOS TNotifyEvent Procedure (Sender : TOBject) Of Object; Ex: OnClick 2. TMouseEvent Procedure (Sender : TOBject; ...) Of Object; Ex: OnMouseDown 3. TDragOverEvent Procedure (Sender : TOBject; ...) Of Object; Ex: OnDragOver TIPOS DE EVENTOS PERSONALIZADO e declarao de eventos Type MeuTipoEvento = Procedure (Sender : TObject; ...) of Object; Declarao do Evento segue as regras de declarao de propriedades: Property NomeDoEvento : TTipoEvento read FCampoEvento write FCampoEvento; Registrando Componentes Registrar um componente a tarefa de fazer este componente vlido para o IDE (Integrated Development Environment). Uma vez que um componente est instalado, ele pode ser selecionado da palheta de componentes do Deplhi para ser usado nas aplicaes. O Registro de componentes baseado por unit. Se existir mais de um componente na mesma unit, estestes sero registrados em conjunto. 1.

Procedure Register Para registrar um componente adicione uma procedure Register unit do componente. A implentao desta procedure deve chamar a funo RegisterComponents para cada componente a ser registrado, passando o nome da pgina na qual o componente ser instaladoe o(s) nome(s) do(s) componente(s).

Procedure Register; Begin RegisterComponents(Testes , [TMeuComponente]); End;

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.147

CINCIA DA COMPUTAO - DELPHI


Exemplo: unit MeuContador; interface uses Windows, Messages, SysUtils, Classes; type TMeuContador = class(TComponent) private { Private declarations } protected { Protected declarations } FChegouAoMaximo: TNotifyEvent; FMax : Integer; public { Public declarations } FValor : Integer; Constructor Cria; Destructor Libera; Procedure Incrementa; Procedure Decrementa; published { Published declarations } Property Max : Integer read FMax Write FMax; Property Valor : Integer read FValor write FValor; Property OnChegouAoMaximo : TNotifyEvent read FChegouAoMaximo Write FChegouAoMaximo; end; procedure Register; implementation procedure Register; begin RegisterComponents('Teste', [TMeuContador]); end; { TMeuContador } constructor TMeuContador.Cria; begin Inherited; FChegouAoMaximo := nil; FValor := 0; end; procedure TMeuContador.Decrementa; begin Dec(FValor); if FValor < 0 then FValor := 0; end; procedure TMeuContador.Incrementa; begin Inc(FValor); if FValor = FMax then begin if Assigned(FChegouAoMaximo) then FChegouAoMaximo(Self); FValor := 0; end; end; destructor TMeuContador.Libera; begin FChegouAoMaximo := nil; Inherited; end; end.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.148

CINCIA DA COMPUTAO - DELPHI

17. Anexo : Funes de data/hora, Strings,formatao e converso de tipos


Rotina Date Now Time DayOfWeek DecodeDate Descrio Retorna a data do sistema Retorna a data e hora do sistema Retorna a hora do sistema Retorna o dia da semana de uma data especificada Decodifica um valor TDateTime em Words de dia, ms e ano

DecodeTime Decodifica um valor TDateTime em Words de hora, minuto, segundo e milissegundos EncodeDate Retorna um TDateTime a partir de Words de dia, ms e ano

EncodeTime Retorna um TDateTime a partir de Words de hora, minuto, segundo e milissegundos

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.149

CINCIA DA COMPUTAO - DELPHI

Rotina Chr StrToInt TryStrToInt IntToStr StrToIntDef IntToHex Round Trunc StrToFloat TryStrToFloat FloatToStr FormatFloat

Descrio Byte em Char String em Integer Integer em String String em Integer, com um valor default caso haja erro Nmero em String Hexadecimal Arredonda um nmero real em um Integer Trunca um nmero real em um Integer String em Real Real em string
Nmero real em string usando uma string de formato. X := FormatFloat($##,##0.00,Y);

DateToStr StrToDate TryStrToDate TimeToStr StrToTime TryStrToTime DateTimeToStr StrPas(x) StrToDateTime Pchar(x)
FormatDateTime

TDateTime em string de data, de acordo com as opes do Painel de Controle String de data em TDateTime TDateTime em String de Hora String de hora em TDateTime TDateTime em string de data e hora PChar para String String de data e hora em TDateTime String para PChar
TDateTime em string usando uma string de formato. X:=FormatDateTime('dddd dd/mmm/yyyy',date); Qualquer tipo em outro usando argumentos do tipo Variant. Ex: Varcast(X, Y, vtString); Variant em qualquer tipo. X:=VarAsType(Y,vtString);

VarCast VarAsType Val Str

String em nmero, real ou inteiro Nmero, real ou inteiro, em String

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.150

CINCIA DA COMPUTAO - DELPHI

17. Anexo : Teclas de Atalho para trabalhar mais rpido durante

o Desenho e a Codificao
Ctrl+Shift+i Selecione as linhas que quer alinhar direita, depois

pressione as teclas Ctrl+Shift ao mesmo tempo e a tecla i para cada espao direita.
Ctrl+Shift+u

Selecione as linhas que quer alinhar esquerda, depois pressione as teclas Ctrl+Shift ao mesmo tempo e a tecla u para cada espao esquerda. Para fazer o cut/copy em uma coluna de cdigo, pressione a tecla Alt e ao mesmo tempo selecione com o mouse ou as teclas o texto que pretender. Selecione os vrios componentes de um form ao pressionar a tecla shift e ao clicar nos componentes a selecionar. Move nas vrias direes o componente selecionado.

Alt+seleo

Shift+Mouse

Ctrl+Setas

Shift+Setas

Aumenta ou diminui o tamanho do componente selecionado.

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.151

CINCIA DA COMPUTAO - DELPHI

BIBLIOGRAFIA
. Delphi 6 Kylix Curso Completo Axcel Books do Brasil Marcelo Leo. . Delphi 5 Guia do Desenvolvedor Teixeira e Pacheco Campus. . Como programar em Delphi Makron Books Frank Engo . Aprenda em 14 dias Delphi Borland Press Editora Campus - Osier, Batson e Grobman . Delphi 4 Total Dominando a Ferramenta Brasport Mauricio Longo , Ronaldo Smith Jr. . Usando SQL no Delphi - Leandro Cristovo - Visual Books . Delphi 7 - Internet e Banco de Dados - Emerson Facunte - Brasport . Delphi 6 Programao Orientada a Objetos Faial Farhat de Carvalho - rica . Delphi 7 Dominando o Delphi 7 Marco Cant Makron Books

LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III

PAG.152