Você está na página 1de 1417

BORLAND

DELPHI 7
CURSO COMPLETO

Marcelo Leo
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

Pirataria crime contra os direitos autorais, com penas para os infratores de acordo com a Lei 9.610 de 19 de fevereiro de 1998.
Este e-book no pode ser vendido e/ou distribudo em CD-ROM, DVD-ROM ou por programas de compartilhamento P2P. A forma correta de obter este arquivo adquirindo-o atravs dos sites da Editora Axcel (www.axcel.com.br) e de Jlio Battisti (www.juliobattisti.com.br). Se voc adquiriu este documento atravs dos meios legais descritos acima, no distribua ou venda este produto. Voc estar cometendo um crime contra o autor da obra. Se voc adquiriu este e-book por intermdio de terceiros, regularize sua situao entrando em contato pelo e-mail editora@axcel.com.br, para que no seja alvo das penalizaes previstas em Lei. Usar cpia ilegal tambm crime de violao dos direitos autorais.

REPRODUO PROIBIDA PELA LEI

DO DIREITO AUTORAL.

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO

DEDICATRIA
minha esposa Beatriz e aos meus filhos Thiago e Lucas, minhas constantes e principais fontes de estmulo e carinho.

AGRADECIMENTOS
A todos que sempre me apoiaram ao longo desta dura jornada e a todos que me acompanham no diaa-dia e, ainda que de forma indireta, colaboraram para que este trabalho fosse concludo. Aos meus pais Pery e May Leo, pelos exemplos de carinho e dedicao; aos meus irmos Pery Jr, Ernesto e Andr pela eterna amizade; aos meus super tios Mara e Nestor Vieira e aos meus super sogros Srgio e Marly, pelo incondicional apoio; Beth Ruth Castro da Silveira, pelo apoio e pacincia. Ao competente pessoal da Axcel Books, pelo trabalho srio e competente. Ao Jos Eugnio, Jos Rubens, Mariana Lima, Tertius e a todo pessoal da Borland Latin America, pelo apoio e profissionalismo. Ao pessoal do Clube Delphi: Gladstone, Luciano, Jlio, Rosngela, Vincius e demais integrantes, pelo apoio, amizade e incentivo. Ao meu amigo e conselheiro Professor Slvio Macieira, amigo de todas as horas, obrigado pela sua amizade! Aos amigos do CDEM 2002, pela pacincia e amizade. A fim de evitar o risco de cometer injustias por algum esquecimento, no vou listar a enorme relao de amigos e amigas que sempre me prestigiam com a sua valorosa amizade. Graas a deus, a lista completa de Amigos do Marcelo Leo ocuparia um livro inteiro. Mas vale acrescentar alguns nomes aos listados na edio anterior: Alexander Mazolii, ureo Pinheiro Ruffier, Edgar Gurgel, Edson Belm, Emerson Moraes, rico Fagundes Lisboa, Guto Garcia, Luiz Felipe Estrella, Regina Clia, Renato Pitta.

SOBRE O AUTOR
Marcelo Leo engenheiro formado pelo Instituto Militar de Engenharia (IME) e Mestre em Cincias pela mesma instituio. Atualmente professor e coordenador do Curso de Graduao em Engenharia do Instituto Militar de Engenharia, professor do Curso de Graduao em Informtica da Universidade Estcio de S, tendo coordenado o Campus Penha desta universidade, alm de ministrar cursos de informtica em diversas empresas de treinamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

III

BORLAND DELPHI 7 CURSO COMPLETO

SUMRIO
PARTE I: FUNDAMENTOS ................................................................................................................................ 1 CAPTULO 1: INTRODUO .............................................................................................................................. 2 Fundamentos em: Ferramentas de Desenvolvimento ........................................................................ 4 As Origens das Ferramentas RAD ........................................................................................................................ 4 CAPTULO 2: O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7 ........................................................... 9 Fundamentos em: Composio do Ambiente de Desenvolvimento ................................................ 10 Apresentao do Ambiente de Desenvolvimento Integrado do Delphi 7 ....................................................... 10 Formulrios Os Elementos de Criao da Interface com o Usurio .............................................................. 14 Controles e Componentes ................................................................................................................................ 15 Propriedades ................................................................................................................................................. 16 Mtodos ........................................................................................................................................................ 17 Eventos ......................................................................................................................................................... 18 O Object Inspector ............................................................................................................................................ 18 Alterando o Valor de uma Propriedade no Object Inspector ....................................................................... 19 Definindo Procedimentos Associados a Eventos ......................................................................................... 20 O Conceito de Projeto de uma Aplicao ......................................................................................................... 22 Iniciando um Novo Projeto .............................................................................................................................. 28 Salvando o Projeto Recm-criado ..................................................................................................................... 29 Fechando um Projeto ........................................................................................................................................ 31 Manipulando Grupos de Projetos ..................................................................................................................... 32 O Code Explorer ............................................................................................................................................... 35 Desabilitando o Recurso de Ancoragem de Janelas .......................................................................................... 36 Garantindo a Visibilidade de uma Janela ......................................................................................................... 37 CAPTULO 3: FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL .............................................................................. 39 Fundamentos em: Estrutura de uma Unidade de Cdigo (Unit) ..................................................... 40 Examinando o Cdigo de uma Unidade de Cdigo (Unit) Gerado Pelo Delphi 7 .......................................... 40 Examinando as Sees de uma Unit ................................................................................................................. 41 Acessando Tipos e Variveis Definidos em Outras Units ................................................................................. 42 Fundamentos em: Declarao de Variveis ....................................................................................... 42 O Conceito de Variveis .................................................................................................................................... 42 Atribuindo um Valor a uma Varivel ................................................................................................................ 43 Tipos de Dados Predefinidos na Linguagem Object Pascal .............................................................................. 43 Tipos de Variveis Inteiras ............................................................................................................................ 43 Tipos de Variveis Reais ................................................................................................................................ 44 Tipos de Variveis Booleanas ....................................................................................................................... 44 Tipos de Variveis Para Manipulao de Caracteres .................................................................................... 44 Tipos de Variveis Para Manipulao de Arquivos ...................................................................................... 45 Tipo Genrico de Variveis ............................................................................................................................... 46 Comentrios ...................................................................................................................................................... 46 Comentrios de uma nica linha ................................................................................................................ 46 Comentrios de mltiplas linhas ................................................................................................................. 46 Definindo Novos Tipos de Dados ..................................................................................................................... 46 Tipos de Dados Enumerados ........................................................................................................................ 47 Conjuntos ..................................................................................................................................................... 47 Variveis Compostas .................................................................................................................................... 49 Vetores (Arrays) ............................................................................................................................................ 49 Operadores Aritmticos .................................................................................................................................... 51 Tipos Ordinais ................................................................................................................................................... 52 Escopo e Tempo de Vida das Variveis ......................................................................................................... 52 Variveis Locais ................................................................................................................................................. 52 Variveis Globais a uma Unidade de Cdigo ................................................................................................... 53 Criao de Variveis Globais a uma Aplicao ............................................................................................ 53 Adicionando uma Nova Unit ao Projeto Para Armazenamento de Variveis Globais ................................ 53 Fundamentos em: Blocos de Comandos, Estruturas Condicionais e de Repetio ........................ 54

IV

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Alterando o Fluxo de Execuo do Programa ................................................................................................... 54 Blocos de Comandos ......................................................................................................................................... 55 Estruturas Condicionais .................................................................................................................................... 55 Estrutura Condicional if-then-else ............................................................................................................... 55 Estrutura Condicional Case Of .................................................................................................................... 56 Testes Condicionais .......................................................................................................................................... 56 Os Operadores Relacionais ........................................................................................................................... 56 Estruturas de Repetio ..................................................................................................................................... 57 Laos For ....................................................................................................................................................... 57 Laos While .................................................................................................................................................. 58 Laos Repeat ................................................................................................................................................. 58 Condies Compostas ...................................................................................................................................... 59 Operadores Lgicos da Linguagem Object Pascal ........................................................................................ 59 Fundamentos em: Funes e Procedimentos ..................................................................................... 59 A Estratgia de Dividir Para Conquistar ........................................................................................................... 60 Procedimentos (Procedures) ............................................................................................................................. 60 Funes ............................................................................................................................................................. 61 Funes e Procedimentos Para Manipulao de Arquivos Representados por Variveis ................................. 62 Funes e Procedimentos Para Manipulao Direta de Arquivos .................................................................... 63 Fundamentos em: Classes e Objetos ................................................................................................... 63 Uma Nova (Mas J No To Nova) Abordagem ............................................................................................... 64 As Classes e os Objetos ...................................................................................................................................... 64 O Conceito de Classes ....................................................................................................................................... 64 Mtodos de uma Classe ................................................................................................................................ 65 Mtodos sem Parmetros ............................................................................................................................. 67 O Objeto Formulrio e a Classe TForm ........................................................................................................ 68 O Conceito de Herana de Classes ............................................................................................................... 69 Tipos de Mtodos e Campos ........................................................................................................................ 70 Procedimentos Associados a Eventos ............................................................................................................... 71 Pare e Reflita Antes de Prosseguir ..................................................................................................................... 72 CAPTULO 4: PLANEJANDO A SUA APLICAO ................................................................................................... 73 Fundamentos em: Planejamento de Aplicaes ................................................................................ 74 Planejando o seu Trabalho ................................................................................................................................ 74 A Importncia de um Bom Planejamento ........................................................................................................ 74 Planejando o Nosso Aplicativo-exemplo .......................................................................................................... 75 Padronizando a Nomenclatura dos Componentes .......................................................................................... 76 Adicionando um Item a uma To-Do Lists ......................................................................................................... 77 Fundamentos em: To-Do Lists ............................................................................................................. 77 Organizando o seu Trabalho com as Ferramentas To-Do List .......................................................................... 77 Editando um Item de uma To-Do Lists ............................................................................................................. 78 Excluindo um Item de uma To-Do Lists ........................................................................................................... 79 Configurando as Informaes Exibidas em uma To-Do Lists ........................................................................... 79 Configurando Como as Informaes Devem Ser Ordenadas em uma To-Do Lists .................................................................................................................. 80 Adicionando um Item a uma To-Do Lists Diretamente no Cdigo-fonte ....................................................... 80 Copiando a Relao de Itens de uma To-Do List .............................................................................................. 81 Filtrando a Relao de Itens de uma To-Do List .............................................................................................. 82 CAPTULO 5: CRIANDO O FORMULRIO PRINCIPAL DA APLICAO ....................................................................... 83 Fundamentos em: Manipulao de Formulrios .............................................................................. 84 Os Formulrios Elementos Para a Construo da Interface em Aplicaes Desenvolvidas em Delphi 7 ....................................................................................... 84 O Objeto Formulrio .................................................................................................................................... 84 Propriedades com um Conjunto de Valores Predefinidos ........................................................................... 85 Alterando as Propriedades do Objeto Formulrio ........................................................................................ 88 Definindo um cone Para o Formulrio Principal da Aplicao .................................................................. 89 Inserindo Componentes em um Formulrio ............................................................................................... 90 Inserindo um Componente Para Exibio de Imagens no Formulrio Principal ........................................ 90 Renomeando um Componente ................................................................................................................... 92 Reposicionando um Componente ............................................................................................................... 92 Redimensionando um Componente ........................................................................................................... 93 Alterando a Fonte do Texto Exibido em um Componente ......................................................................... 96

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO


Selecionando Vrios Componentes Simultaneamente ................................................................................ 96 Alinhando Componentes ............................................................................................................................. 97 Analisando o Cdigo Gerado Pelo Delphi ................................................................................................... 99 Testando a sua Aplicao .................................................................................................................................. 99 Finalizando a Execuo do Aplicativo ............................................................................................................ 100 CAPTULO 6: PROJETANDO UM MENU PARA A SUA APLICAO .......................................................................... 101 Fundamentos em: Criao de Menus ................................................................................................ 102 Menus Elementos Indispensveis ao Formulrio Principal de uma Aplicao ........................................... 102 Incluindo um Menu na sua Aplicao ............................................................................................................ 102 Acessando o Editor de Menus .................................................................................................................... 103 Criando Itens de Menu .............................................................................................................................. 105 Criando um Separador de Itens em um Menu ............................................................................................... 107 Criando Teclas Aceleradoras Para Itens de Menu ........................................................................................... 108 Criando Outros Itens de Menu ....................................................................................................................... 108 Incluindo um Menu Pop-up na sua Aplicao ............................................................................................... 109 Criando Itens de Menu em um Menu Pop-up ........................................................................................... 110 Criando Submenus no Menu Pop-up ........................................................................................................ 112 Associando Eventos a Itens de Menu ......................................................................................................... 114 Definindo Procedimentos Associando Eventos Para Itens de Menu Pop-up ............................................ 115 CAPTULO 7: MANIPULANDO FORMULRIOS E CAIXAS DE DILOGO .................................................................... 117 Fundamentos em: Criao de Caixas de Dilogo ............................................................................ 118 Caixas de Dilogo Elementos de Interface Que Do Vida ao seu Aplicativo ..................................................................................................................... 118 Criando uma Caixa de Dilogo de Direitos Autorais ..................................................................................... 118 Personalizando a Caixa de Dilogo de Direitos Autorais ............................................................................... 119 Exibindo uma Caixa de Dilogo ..................................................................................................................... 120 O Componente Boto de Comando ............................................................................................................... 122 Principais Propriedades do Componente Boto de Comando .................................................................. 123 CAPTULO 8: FUNDAMENTOS DO PROJETO DE APLICATIVOS DE BANCO DE DADOS ................................................. 125 Fundamentos em: Mecanismos de Acesso a Bancos de Dados ....................................................... 126 Mecanismos de Acesso a Bancos de Dados ..................................................................................................... 126 Fundamentos em: Conceitos Fundamentais Sobre Bancos de Dados ............................................ 127 Conceitos Fundamentais ................................................................................................................................ 127 Custos .............................................................................................................................................................. 128 Planejando seu Banco de Dados ..................................................................................................................... 128 CAPTULO 9: FUNDAMENTOS DE BANCOS DE DADOS ........................................................................................ 129 Fundamentos em: Criao de Tabelas do Interbase ....................................................................... 130 Conceitos Fundamentais ................................................................................................................................ 130 Criando um Banco de Dados no Interbase ..................................................................................................... 130 Criando Tabelas com o Database Desktop ...................................................................................................... 133 Definindo Nomes Para os Campos dos Registros de uma Tabela .............................................................. 136 Definindo Tipos Para os Campos dos Registros de uma Tabela ................................................................. 138 Definindo os Tamanhos Para os Campos dos Registros de uma Tabela .................................................... 139 Definindo Campos de Preenchimento Obrigatrio ................................................................................... 141 Criando ndices .......................................................................................................................................... 141 Salvando uma Tabela .................................................................................................................................. 144 Inserindo Dados em uma Tabela Atravs do Database Desktop ................................................................ 144 Construindo as Demais Tabelas do Aplicativo ............................................................................................... 148 Criando a Tabela Atividades ....................................................................................................................... 148 Criando ndices Para a Tabela de Atividades ............................................................................................. 149 Salvando a Tabela Atividades ..................................................................................................................... 149 Incluindo Registros na Tabela de Atividades ............................................................................................. 149 Criando a Tabela de Matrculas ...................................................................................................................... 150 Criando ndices Para a Tabela de Matrculas ............................................................................................. 150 CAPTULO10: CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS ................................................................................... 151 Criao de Formulrios Para Acesso a Dados .................................................................................. 152 Utilizando os Componentes DatasetProvider e ClientDataset ....................................................................... 159 O Componente DBEdit ................................................................................................................................... 164

VI

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Definindo Mscaras Para os Campos .............................................................................................................. 164 Significado dos Caracteres Usados na Propriedade EditMask .................................................................... 165 O Componente MaskEdit ............................................................................................................................... 167 Fazendo a Tecla Enter Funcionar Como Tab .................................................................................................. 167 O Componente DBCombobox ....................................................................................................................... 168 Propriedades do Controle DBComboBox .................................................................................................. 168 Propriedades do Objeto Items (da Classe TStrings) ................................................................................... 169 Mtodos do Objeto Items (da classe TStrings) ........................................................................................... 169 Destacando o Componente Que Recebe o Foco ............................................................................................. 171 CAPTULO 11: CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS ....................................... 173 Criao de Data Modules ................................................................................................................... 174 Os Objetos do Tipo DataModule .................................................................................................................... 174 Os Objetos de Acesso ao Banco de Dados ...................................................................................................... 178 O Componente ClientDataset ................................................................................................................... 178 O Componente DataSource ....................................................................................................................... 180 O Componente SimpleDataset .................................................................................................................. 180 Inserindo os Demais Componentes de Acesso ............................................................................................... 181 Para a tabela de Atividades: ........................................................................................................................ 182 Para a tabela de Matrculas: ........................................................................................................................ 182 Definindo ndices nos Componentes de Acesso ............................................................................................ 183 Criando um ndice Simples ........................................................................................................................ 183 Criando um ndice Composto ................................................................................................................... 184 Criando Chaves Primrias .......................................................................................................................... 184 CAPTULO 12: CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS .................... 187 Criao de Formulrios de Cadastro ................................................................................................ 188 Criando o Formulrio de Cadastro de Atividades .......................................................................................... 188 Criando um Formulrio Para Cadastrar Novas Matrculas ............................................................................. 192 Definindo o Formulrio ............................................................................................................................. 192 Criando o Formulrio ................................................................................................................................. 193 Inserindo os Componentes no Formulrio ................................................................................................ 193 Trabalhando com Campos Calculados ...................................................................................................... 196 CAPTULO 13: CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES ............................................. 199 Criao de Formulrios Para Alterao de Dados .......................................................................... 200 O Conceito de Templates de Componentes ................................................................................................... 200 Criando os Templates de Componentes ......................................................................................................... 201 Criando o Formulrio de Alterao de Scios ................................................................................................ 202 Criando o Formulrio de Alterao de Atividades.......................................................................................... 204 O Componente DBNavigator ......................................................................................................................... 205 CAPTULO 14: CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS ............................ 209 Criao de Formulrios Para Excluso de Dados ........................................................................... 210 Criando um Template de Formulrio ............................................................................................................. 210 Criando Formulrios a Partir de um Template ............................................................................................... 213 Criando o Formulrio de Excluso de Scios ................................................................................................. 213 Criando o Formulrio de Excluso de Atividades ...................................................................................... 215 A Linguagem SQL ........................................................................................................................................... 216 Criando o Formulrio de Excluso de Matrculas .......................................................................................... 217 CAPTULO 15: CRIANDO FORMULRIOS PARA CONSULTA DE SCIOS, ATIVIDADES E MATRCULAS ............................ 223 Criao de Formulrios Para Consulta de Dados ........................................................................... 224 Criando um Formulrio Para a Consulta de Dados dos Scios ...................................................................... 224 Criando um formulrio Para a Consulta de Dados das Atividades ................................................................ 225 Criando um Formulrio Para a Consulta de Dados das Matrculas ............................................................... 226 CAPTULO 16: CRIANDO ROTINAS DE BACKUP E RESTAURAO ......................................................................... 227 Cpia de Arquivos .............................................................................................................................. 228 Conceitos Fundamentais ................................................................................................................................ 228 Criando um Formulrio de Backup ................................................................................................................ 228 PARTE II: KNOW-HOW ............................................................................................................................. 233 CAPTULO 17: CRIAO DE RELATRIOS COM O RAVE REPORTS ........................................................................ 235 Know-How em: Criao de Relatrios com o Rave Reports .......................................................... 236

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

VII

BORLAND DELPHI 7 CURSO COMPLETO


Introduo ...................................................................................................................................................... 236 O Componente RvProject .......................................................................................................................... 236 Criando um Relatrio de Scios ................................................................................................................. 236 Criando um Relatrio de Atividades .......................................................................................................... 242 Criando um Relatrio de Matrculas .......................................................................................................... 244 CAPTULO 18: INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO .............................................. 247 Know-How em: Criao de Arquivos de Help ................................................................................. 248 Criando um Arquivo de Help ......................................................................................................................... 248 Definindo uma Pgina de ndice .................................................................................................................... 248 Criando um Arquivo RTF ........................................................................................................................... 249 Criando uma Pgina Para Cada Tpico ..................................................................................................... 250 Criando Strings de Contexto ..................................................................................................................... 250 Criando uma Palavra-chave Para um Tpico ............................................................................................. 252 Criando um Ttulo Para um Tpico ........................................................................................................... 252 Associando um Nmero de Pgina a um Tpico ....................................................................................... 253 Estabelecendo a Conexo Entre Tpicos ................................................................................................... 254 Criando um Arquivo de Projeto de Help ................................................................................................... 256 Criando e Compilando o Arquivo de Projeto de Help com o Microsoft Help Workshop ........................ 257 Associando o Arquivo de Help sua Aplicao ......................................................................................... 260 Associando um Componente a um Tpico do Arquivo de Help ............................................................... 261 Exibindo o Arquivo de Help em Resposta a um Item de Menu ................................................................ 262 CAPTULO 19: PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7 ................................................................. 263 KNOW-HOW em: Programao Procedural em Linguagem Object Pascal .................................. 264 Apresentao do Problema ............................................................................................................................. 265 Utilizando o Ambiente do Delphi 7 Para o Pascal Procedural ....................................................................... 266 KNOW-HOW em: Fundamentos da Programao Orientada a Objetos ........................................ 269 A Filosofia da Programao Orientada a Objetos ........................................................................................... 269 Anlise do Cdigo-fonte ................................................................................................................................. 271 A Implementao de uma Classe .................................................................................................................... 272 Anlise do Cdigo-fonte ................................................................................................................................. 274 KNOW-HOW em: Herana de Classes ............................................................................................... 274 O Conceito de Herana de Classes ................................................................................................................. 275 Mtodos Construtores .................................................................................................................................... 277 Mtodos Destrutores ....................................................................................................................................... 278 Visibilidade dos Campos e Mtodos de uma Classe ....................................................................................... 279 Campos e Mtodos Pblicos (public) ......................................................................................................... 279 Campos e Mtodos Privados (private) ....................................................................................................... 280 Campos e Mtodos Protegidos (protected) ................................................................................................ 280 Sobreposio de Mtodos ............................................................................................................................... 281 Mtodos Estticos, Virtuais e Dinmicos ........................................................................................................ 282 Mas e os Mtodos Dinmicos? O Que Significam? ........................................................................................ 284 Mtodos Abstratos .......................................................................................................................................... 284 Mtodos de Classe ........................................................................................................................................... 285 Propriedades .................................................................................................................................................... 285 Referncia: a Classe TObject ........................................................................................................................... 287 Principais Mtodos da Classe TObject ....................................................................................................... 288 KNOW-HOW em: Converso de Tipos ............................................................................................... 294 O Conceito de Converso de Tipos ................................................................................................................ 294 O Operador Is .................................................................................................................................................. 294 O Operador As ................................................................................................................................................. 295 Converso Explcita Entre Tipos ..................................................................................................................... 295 O Identificador Self ......................................................................................................................................... 296 KNOW-HOW em: Tratamento de Excees ...................................................................................... 296 Tcnica ............................................................................................................................................................ 296 O Conceito de Excees .................................................................................................................................. 296 Referncia: a Classe Exception ........................................................................................................................ 298 Definio da Classe Exception ................................................................................................................... 298 Campos Internos da Classe Exception ....................................................................................................... 298 Mtodos Pblicos da Classe Exception ...................................................................................................... 299 Propriedades da Classe Exception .............................................................................................................. 302 Classes Derivadas por Herana da Classe Exception ................................................................................. 302

VIII 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
O Mecanismo Utilizado na Gerao de Excees ...................................................................................... 302 KNOW-HOW em: Manipulao de Listas de Objetos ....................................................................... 304 Apresentao do Problema ............................................................................................................................. 304 Referncia: a Classe TList ................................................................................................................................ 305 Definio da Classe TList ........................................................................................................................... 305 Propriedades da Classe TList ...................................................................................................................... 305 Principais Mtodos da Classe TList ............................................................................................................ 306 Exemplo de Utilizao ................................................................................................................................ 309 Definio da Interface ................................................................................................................................ 309 Codificao do Exemplo ............................................................................................................................ 311 KNOW-HOW em: Sobrecarga de Mtodos ........................................................................................ 322 O Conceito de Sobrecarga de Mtodos ........................................................................................................... 323 KNOW-HOW em: Definio de Parmetros Default Para uma Funo ou Procedimento ......... 324 O Conceito de Parmetro Default Para uma Funo ou Procedimento ......................................................... 324 CAPTULO 20: O CONCEITO DE COMPONENTES ............................................................................................... 327 KNOW-HOW em: Definio de Componentes .................................................................................. 328 O Conceito de Componentes ......................................................................................................................... 329 Exibindo uma Propriedade no Object Inspector ............................................................................................ 331 O Sistema de Mensagens do Windows ........................................................................................................... 331 A Classe TCanvas ............................................................................................................................................ 335 Principais Propriedades da Classe TCanvas ............................................................................................... 336 Principais Mtodos da Classe TCanvas ...................................................................................................... 337 Principais Propriedades da Classe TPen ..................................................................................................... 341 Principais Propriedades da Classe TBrush .................................................................................................. 343 O Componente Shape ..................................................................................................................................... 343 CAPTULO 21: CRIAO DE COMPONENTES .................................................................................................... 347 KNOW-HOW em: Criao de Componentes ..................................................................................... 348 Apresentao do Problema ............................................................................................................................. 348 Criando o Esqueleto do Novo Componente .................................................................................................. 350 Definio de Novas Propriedades ................................................................................................................... 352 Criando uma Nova Propriedade ..................................................................................................................... 353 Instalando o Novo Componente .................................................................................................................... 354 Sobrecarregando o Mtodo Construtor da Classe Ancestral do Componente ............................................... 356 Redefinindo Mtodos da Classe-base .............................................................................................................. 358 Definindo um Novo Evento Para o Componente .......................................................................................... 360 O Tipo TNotifyEvent ....................................................................................................................................... 361 Definindo um Mtodo de Leitura Para uma Propriedade .............................................................................. 362 KNOW-HOW em: Criao de Componentes Associados a Bancos de Dados .................................. 364 Apresentao do Problema ............................................................................................................................. 365 Criando o Esqueleto do Novo Componente .................................................................................................. 365 Definindo as Novas Propriedades Para o Componente.................................................................................. 366 Refletindo Alteraes Feitas no Campo .......................................................................................................... 369 Refletindo Alteraes Feitas no Componente ................................................................................................ 371 Notificando o Componente da Remoo de um DataSource ........................................................................ 374 Criando uma Propriedade que Permita Tratar a Tecla Enter Como Tab ........................................................ 376 KNOW-HOW em: Criao de Controles ActiveX .............................................................................. 379 Apresentao do Problema ............................................................................................................................. 379 Convertendo o Componente NumEdit em um Controle ActiveX ................................................................ 379 CAPTULO 22: MECANISMOS DE ACESSO A BANCO DE DADOS ............................................................................ 393 KNOW-HOW em: Fundamentos dos Mecanismos de Acesso a Bancos de Dados .......................... 394 Os Mecanismos de Acesso a Bancos de Dados ............................................................................................... 394 KNOW-HOW em: Classes Fundamentais de Acesso a Bancos de Dados A Classe TDataset ....... 395 A Classe TDataSet ............................................................................................................................................ 395 Principais Propriedades da Classe TDataSet ............................................................................................... 397 Principais Mtodos da Classe TDataSet ...................................................................................................... 401 Principais Eventos da Classe TDataSet ....................................................................................................... 406 A Classe TCustomConnection ........................................................................................................................ 411 Principais Propriedades da Classe TCustomConnection ........................................................................... 411 Principais Mtodos da Classe TCustomConnection .................................................................................. 411 Principais Eventos da Classe TCustomConnection ................................................................................... 413

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

IX

BORLAND DELPHI 7 CURSO COMPLETO


CAPTULO 23: BANCO DE DADOS COMPONENTES DE ACESSO VIA BDE ............................................................ 415 KNOW-HOW em: CLasses Fundamentais de Acesso a Bancos de Dados via BDE As Classes TBDEDataset e TDBDataset ........................................................... 416 A Classe TBDEDataSet ..................................................................................................................................... 416 Principais Propriedades da Classe TBDEDataSet ........................................................................................ 417 Principais Mtodos da Classe TBDEDataSet ............................................................................................... 417 A Classe TDBDataSet ....................................................................................................................................... 418 Principais Propriedades da Classe TDBDataSet .......................................................................................... 418 A Classe TDatabase ......................................................................................................................................... 419 Principais Propriedades da Classe TDatabase ................................................................................................. 419 Principais Mtodos do Componente Database .......................................................................................... 421 A Classe TSession ............................................................................................................................................ 422 Principais Propriedades da Classe TSession ............................................................................................... 422 Principais Mtodos da Classe TSession ...................................................................................................... 424 Eventos do Componente Session ............................................................................................................... 427 KNOW-HOW em: CLasses de Acesso Direto a Bancos de Dados via BDE As Classes TTable e TQuery ............................................................................................................... 427 A Classe TTable ............................................................................................................................................... 428 Principais Propriedades da Classe TTable ................................................................................................... 428 Principais Mtodos da Classe TTable ......................................................................................................... 430 A Classe TQuery .............................................................................................................................................. 434 Principais Propriedades da Classe TQuery ................................................................................................. 435 Principais Mtodos da Classe TQuery ........................................................................................................ 436 A Classe TUpdateSQL ...................................................................................................................................... 437 Principais Propriedades da Classe TUpdateSQL ......................................................................................... 437 Principais Mtodos da Classe TUpdateSQL ................................................................................................ 438 Exemplos de Aplicao ................................................................................................................................... 438 Indexao de Tabelas Acessadas Pelo Componente Table ......................................................................... 438 Exemplo de Aplicao ..................................................................................................................................... 439 Filtrando os Registros de uma Tabela Acessada Pelo Componente Table .................................................. 442 Estabelecendo um Relacionamento Entre Tabelas Representadas Pelo Componente Table ..................... 454 Pesquisando Registros em Tabelas Representadas Pelo Componente Table .............................................. 458 Criao de Tabelas em Run-time ................................................................................................................ 463 Componentes e Mtodos de Navegao .................................................................................................... 473 Traduo da Mensagem Delete Record do Componente Table ................................................................. 480 Exemplo de Utilizao do Componente TSession ..................................................................................... 481 Consulta a Bancos de Dados via Declaraes SQL Definidas em Run-Time ............................................. 487 Utilizao de Parmetros em Declaraes SQL .......................................................................................... 491 Utilizao do Recurso de Cached Updates ................................................................................................. 495 Exemplo de Utilizao do Componente TUpdateSQL .............................................................................. 500 KNOW-HOW em: Aplicao de Senhas a Tabelas do Tipo Paradox ............................................... 506 Definindo Senhas Para uma Tabela do Tipo Paradox ..................................................................................... 507 Definindo Senhas Auxiliares Para uma Tabela do Tipo Paradox .................................................................... 508 Inibindo a Exibio da Caixa de Dilogo Enter Password Durante a Execuo do seu Aplicativo ............................................................................................ 509 Protegendo Sua Aplicao Mediante Definio de uma Senha ...................................................................... 509 CAPTULO 24: BANCO DE DADOS COMPONENTES DE ACESSO VIA ADO ............................................................ 511 KNOW-HOW em: CLasses Fundamentais de Acesso a Bancos de Dados via ADO A Classe TCustomADODataset e os Componentes TADOConnection, TRDSConnection e TADODataset e TADOCommand ...................................................................... 512 O Componente TADOConnection ................................................................................................................. 512 Principais Propriedades da Classe TADOConnection ................................................................................ 512 Principais Mtodos da Classe TADOConnection ....................................................................................... 514 Principais Eventos da Classe TADOConnection ........................................................................................ 516 O Componente TRDSConnection .................................................................................................................. 517 Principais Propriedades da Classe TRDSConnection ................................................................................. 517 Principais Mtodos da Classe TRDSConnection ........................................................................................ 517 Principais Eventos da Classe TRDSConnection ......................................................................................... 517 A Classe TCustomADODataset ....................................................................................................................... 518 Principais Propriedades da Classe TCustomADODataSet .......................................................................... 518 Principais Mtodos da Classe TCustomADODataset ................................................................................. 521

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Principais Eventos da Classe TCustomADODataset .................................................................................. 524 A Classe TADOCommand ............................................................................................................................... 525 Principais Propriedades da Classe TADOCommand .................................................................................. 525 Principais Mtodos da Classe TADOCommand ......................................................................................... 526 Principais Eventos da Classe TADOCommand .......................................................................................... 527 A Classe TADODataset .................................................................................................................................... 527 Principais Propriedades da Classe TADODataSet ....................................................................................... 527 Principais Mtodos da Classe TADODataset .............................................................................................. 528 Principais Eventos da Classe TADODataset ............................................................................................... 528 KNOW-HOW em: Classes de Acesso Direto a Bancos de dados via BDE As Classes TADOTable e TADOQuery ................................................................................................ 528 A Classe TADOTable ........................................................................................................................................ 529 Principais Propriedades da Classe TADOTable ........................................................................................... 529 Principais Mtodos da Classe TADOTable .................................................................................................. 530 Principais Eventos da Classe TADOTable ................................................................................................... 530 A Classe TADOQuery ...................................................................................................................................... 530 Principais Propriedades da Classe TADOQuery ......................................................................................... 530 Principais Mtodos da Classe TADOQuery ................................................................................................ 530 Principais Eventos da Classe TADOQuery ................................................................................................. 531 Exemplos de Aplicao ................................................................................................................................... 531 Estabelecendo uma Conexo a Bancos de Dados do MS Acess com o Componente ADOConnection ... 531 Acessando tabelas do Access com o Componente ADOComando ............................................................ 534 Acessando Tabelas do Access com o Componente ADODataset ............................................................... 534 Acessando tabelas do Access com o Componente ADOTable ................................................................... 535 Acessando tabelas do Access com o Componente ADOQuery .................................................................. 536 Diferenas na Utilizao dos Componentes Table x ADOTable, e Query x ADOQuery ....................................................................................................... 536 Definio do ndice Corrente ..................................................................................................................... 536 Pesquisando Registros em Tabelas Representadas Pelo Componente ADOTable ............................................................................................. 537 Criao de Tabelas em Run-time ................................................................................................................ 537 Componentes e Mtodos de Navegao .................................................................................................... 537 Utilizao de Parmetros em Declaraes SQL .......................................................................................... 537 CAPTULO 25: BANCO DE DADOS COMPONENTES DE ACESSO VIA DBEXPRESS ................................................... 539 KNOW-HOW em: Componentes de Acesso a Bancos de Dados via DBExpress .............................. 540 O Componente TSQLConnection .................................................................................................................. 540 Principais Propriedades da Classe TSQLConnection ................................................................................. 540 Principais Mtodos da Classe TSQLConnection ........................................................................................ 542 Principais Eventos da Classe TSQLConnection ......................................................................................... 543 A Classe TCustomSQLDataset ......................................................................................................................... 543 Principais Propriedades da Classe TCustomSQLDataSet ........................................................................... 544 Principais Eventos da Classe TCustomSQLDataset .................................................................................... 544 A Classe TSQLDataSet ..................................................................................................................................... 544 Principais Propriedades da Classe TSQLDataSet ........................................................................................ 545 KNOW-HOW em: Classes de Acesso Direto a Bancos de Dados via DBExpress As Classes TSQLTable, TSQLQuery e TSQLStoredProc .......................................................................................................... 545 A Classe TSQLTable ......................................................................................................................................... 546 Principais Propriedades da Classe TSQLTable ............................................................................................ 546 Principais Mtodos da Classe TSQLTable ................................................................................................... 547 Principais Eventos da Classe TSQLTable .................................................................................................... 547 A Classe TSQLQuery ....................................................................................................................................... 547 Principais Propriedades da Classe TSQLQuery ........................................................................................... 547 Principais Mtodos da Classe TSQLQuery ................................................................................................. 547 Principais Eventos da Classe TSQLQuery ................................................................................................... 548 A Classe TSimpleDataset ................................................................................................................................. 548 Principais Propriedades da Classe TSimpleDataset .................................................................................... 548 Principais Mtodos da Classe TSimpleDataset ........................................................................................... 549 Principais Eventos da Classe TSimpleDataset ............................................................................................ 549 CAPTULO 26: BANCO DE DADOS COMPONENTES DE ACESSO VIA INTERBASE EXPRESS ......................................... 551 KNOW-HOW em: Componentes de Acesso a Bancos de Dados via Interbase Express ................. 552

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XI

BORLAND DELPHI 7 CURSO COMPLETO


O Componente TIBDatabase .......................................................................................................................... 552 Principais Propriedades da Classe TIBDatabase ......................................................................................... 552 Principais Mtodos da Classe TIBDatabase ................................................................................................ 554 Principais Eventos da Classe TIBDatabase ................................................................................................. 555 O Componente TIBTransaction ...................................................................................................................... 555 Principais Propriedades da Classe TIBTransaction ..................................................................................... 555 Principais Mtodos da Classe TIBTransaction ............................................................................................ 556 Principais Eventos da Classe TIBTransaction ............................................................................................. 558 A Classe TIBCustomDataset ............................................................................................................................ 558 Principais Propriedades da Classe TIBCustomDataset ............................................................................... 559 Principais Mtodos da Classe TIBCustomDataset ...................................................................................... 560 Principais Eventos da Classe TIBCustomDataset ....................................................................................... 561 A Classe TIBDataSet ........................................................................................................................................ 561 Principais Propriedades da Classe TIBDataSet ........................................................................................... 561 Principais Mtodos da Classe TIBDataset ................................................................................................... 562 Principais Eventos da Classe TIBDataset .................................................................................................... 562 KNOW-HOW em: Classes de Acesso Direto a Bancos de dados via Interbase Express As Classes TIBTable, TIBQuery e TIBUpdateSQL ................................................................................ 563 A Classe TIBTable ............................................................................................................................................ 563 Principais Propriedades da Classe TIBTable ............................................................................................... 563 Principais Mtodos da Classe TIBTable ...................................................................................................... 565 Principais Eventos da Classe TIBTable ....................................................................................................... 567 A Classe TIBQuery ........................................................................................................................................... 567 Principais Propriedades da Classe TIBQuery .............................................................................................. 567 Principais Mtodos da Classe TIBQuery ..................................................................................................... 568 Principais Eventos da Classe TIBQuery ...................................................................................................... 568 A Classe TIBUpdateSQL .................................................................................................................................. 568 Principais Propriedades da Classe TIBUpdateSQL ..................................................................................... 569 Principais Mtodos da Classe TIBUpdateSQL ............................................................................................ 569 CAPTULO 27: BANCOS DE DADOS CLIENTE/SERVIDOR .................................................................................... 571 KNOW-HOW em: Fundamentos dos Bancos de Dados Cliente/Servidor ...................................... 572 Apresentao do Problema ............................................................................................................................. 572 O Administrador do Servidor de Banco de Dados .......................................................................................... 572 Cadastrando um Novo Usurio ...................................................................................................................... 574 Alterando os Dados de um Usurio J Cadastrado ......................................................................................... 575 Removendo um Usurio Cadastrado .............................................................................................................. 575 O Utilitrio Interactive SQL ............................................................................................................................ 576 Criando um Banco de Dados no Interbase a Partir do Utilitrio Interactive SQL ......................................... 576 Conectando-se a um Banco de Dados do Interbase ................................................................................... 578 Tipos de Dados Definidos Pelo Interbase ....................................................................................................... 578 Criando uma Tabela no Interbase ................................................................................................................... 579 Aplicando Restries aos Campos de uma Tabela .......................................................................................... 580 Removendo uma Tabela do Banco de Dados .................................................................................................. 580 Criando ndices em uma Tabela ..................................................................................................................... 580 Concedendo Privilgios a um Outro Usurio ou Banco de Dados ................................................................. 581 Removendo Privilgios ................................................................................................................................... 582 Vises (Views) ................................................................................................................................................. 582 O Conceito de Transaes ............................................................................................................................... 583 Incluindo Registros com o Comando INSERT ................................................................................................ 583 Atualizando Registros em uma Tabela ............................................................................................................ 584 Removendo Registros de uma Tabela ............................................................................................................. 584 Ordenando os Registros de uma Tabela .......................................................................................................... 585 TRIGGERS ....................................................................................................................................................... 585 STORED PROCEDURES (Procedimentos Armazenados) ................................................................................ 586 Linguagem de Codificao do Interbase ........................................................................................................ 587 Declarao de Variveis no Interbase ......................................................................................................... 587 Atribuio de Valores a Variveis no Interbase .......................................................................................... 588 Definio de Comentrios no Interbase .................................................................................................... 588 Estruturas Condicionais do Interbase ........................................................................................................ 588 Estruturas de Repetio do Interbase ......................................................................................................... 588

XII 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Criao de Novos Tipos no Interbase ........................................................................................................ 589 Metadados de um Banco de Dados ................................................................................................................. 589 Concatenando Dados Provenientes de Vrias Tabelas ................................................................................... 590 Criando um Backup de um Banco de Dados do Interbase ............................................................................. 591 Recuperando um Banco de Dados a Partir de um Backup ............................................................................. 591 Criando um Alias Para um Banco de Dados do Interbase .............................................................................. 592 CAPTULO 28: ACESSANDO BANCOS DE DADOS CLIENTE/SERVIDOR ................................................................... 593 KNOW-HOW em: Acesso a Bancos de Dados Cliente/Servidor ...................................................... 594 Apresentao do Problema ............................................................................................................................. 594 Acessando Banco de Dados Cliente-Servidor do Interbase em uma Aplicao Delphi via BDE .................... 594 Principais Propriedades do Componente StoredProc ................................................................................ 595 Principais Mtodos do Componente StoredProc ....................................................................................... 596 Principais Eventos do Componente IBoredProc ........................................................................................ 597 Exemplo de Aplicao ................................................................................................................................ 597 Acessando Banco de Dados do Interbase em uma Aplicao Delphi via Interbase Express .......................... 600 Principais Propriedades do Componente IBSToredProc ............................................................................ 601 Principais Mtodos do Componente IBStoredProc .................................................................................... 601 Principais Eventos do Componente IBStoredProc ..................................................................................... 602 Exemplo de Aplicao ................................................................................................................................ 603 Acessando Banco de Dados do Interbase em uma Aplicao Delphi via DBExpress ..................................... 605 Principais Propriedades do Componente SQLSToredProc ......................................................................... 605 Principais Mtodos do Componente SQLStoredProc ................................................................................ 606 Principais Eventos do Componente SQLStoredProc .................................................................................. 606 Exemplo de Aplicao ................................................................................................................................ 606 CAPTULO 29: PROGRAMAO GRFICA ........................................................................................................ 609 KNOW-HOW em: Definio de Desenhos em Run-Time ................................................................. 610 A Classe TCanvas ............................................................................................................................................ 610 O Componente Shape ..................................................................................................................................... 611 Desenhando em um Formulrio ..................................................................................................................... 611 KNOW-HOW em: Definio de Desenhos de Forma Interativa ..................................................... 620 Desenhando de Forma Interativa ................................................................................................................... 621 A Classe TBitmap ............................................................................................................................................ 626 Modos de Mapeamento .................................................................................................................................. 630 Funes Para Transformao de Coordenadas ............................................................................................... 632 Funo SetWindowExtEx ........................................................................................................................... 632 Funo SetViewportExtEx .......................................................................................................................... 633 CAPTULO 30: TCNICAS DE IMPRESSO ........................................................................................................ 635 KNOW-HOW em: Impresso Direta no Windows ............................................................................ 636 Principais Propriedades da Classe TPrinter ..................................................................................................... 637 Aborted ....................................................................................................................................................... 637 Canvas ........................................................................................................................................................ 637 Copies ......................................................................................................................................................... 637 Fonts ........................................................................................................................................................... 637 Orientation ................................................................................................................................................. 637 PageHeight ................................................................................................................................................. 637 PageNumber ............................................................................................................................................... 637 PageWidth .................................................................................................................................................. 637 PrinterIndex ............................................................................................................................................... 638 Printers ....................................................................................................................................................... 638 Printing ....................................................................................................................................................... 638 Title ............................................................................................................................................................. 638 Principais Mtodos da Classe TPrinter ........................................................................................................... 638 BeginDoc .................................................................................................................................................... 638 EndDoc ....................................................................................................................................................... 638 NewPage ..................................................................................................................................................... 639 Exemplo de Utilizao da Classe TPrinter ...................................................................................................... 639 Criando a Interface da Aplicao ............................................................................................................... 639 Codificando a Aplicao ............................................................................................................................ 641 Imprimindo o Contedo Exibido por um Componente Memo .................................................................... 643 Criando a Interface da Aplicao ............................................................................................................... 643 Codificando a Aplicao ............................................................................................................................ 643

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XIII

BORLAND DELPHI 7 CURSO COMPLETO


CAPTULO 31: CRIAO DE DLLS ............................................................................................................... 649 KNOW-HOW em: Criao de DLLs .................................................................................................... 650 Introduo ...................................................................................................................................................... 650 Procedimentos Bsicos Necessrios Criao de uma DLL em Delphi ......................................................... 650 Chamando uma DLL a Partir de Outra Aplicao .......................................................................................... 652 O Formulrio Principal da Aplicao ......................................................................................................... 653 Arquivo de Cdigo Associado ao Formulrio ............................................................................................ 653 Exibindo Formulrios a Partir de uma DLL .................................................................................................... 654 Carregamento Explcito de uma DLL ............................................................................................................. 656 CAPTULO 32: MANIPULAO DE ARQUIVOS, STRINGS E FONTES EM DELPHI ....................................................... 657 KNOW-HOW em: Manipulao de Arquivos .................................................................................... 658 Manipulao Direta de Arquivos Associados a uma Varivel ......................................................................... 658 KNOW-HOW em: Manipulao de Strings ....................................................................................... 662 Principais Funes Para a Manipulao de Strings ......................................................................................... 663 Principais Funes Para a Manipulao de Strings de Terminao Nula ....................................................... 670 StrLower ...................................................................................................................................................... 674 StrNew ........................................................................................................................................................ 675 StrPCopy ..................................................................................................................................................... 675 KNOW-HOW em: Manipulao de Listas de Strings ....................................................................... 676 A Classe TStrings ............................................................................................................................................. 676 Referncia: A Classe TStrings .......................................................................................................................... 676 Definio da Classe TStrings ...................................................................................................................... 676 Propriedades da Classe TStrings ................................................................................................................. 677 Mtodos da Classe TStrings ........................................................................................................................ 679 Componentes que Definem Propriedades Como Objetos da Classe TStrings ............................................... 682 KNOW-HOW em: Manipulao de Fontes ........................................................................................ 683 Referncia: a Classe TFont .............................................................................................................................. 683 Definio da Classe TFont .......................................................................................................................... 683 Propriedades da Classe TFont ..................................................................................................................... 684 Exemplo de Utilizao das Classes TFont e TStrings Para Manipulao de Arquivos Texto ASCII ................ 685 Criando a Interface da Aplicao ............................................................................................................... 685 Codificando a Aplicao ............................................................................................................................ 687 Exemplo de Utilizao das Classes TFont e TStrings Para Manipulao de Arquivos RTF............................. 696 Criando a Interface da Aplicao ............................................................................................................... 696 Codificando a Aplicao ............................................................................................................................ 698 CAPTULO 33: MANIPULAO DE THREADS EM DELPHI ................................................................................... 705 KNOW-HOW em: Threads .................................................................................................................. 706 O Conceito de Threads ................................................................................................................................... 706 Unidade de Cdigo Associada: ................................................................................................................... 707 A Classe TThread ........................................................................................................................................ 708 Implementando a Classe TPBThread ......................................................................................................... 711 Redefinindo o Cdigo da Unit Associada ao Formulrio .......................................................................... 712 CAPTULO 34: IMPLEMENTAO DA TECNOLOGIA COM EM DELPHI ................................................................... 715 KNOW-HOW em: Tecnologia COM .................................................................................................... 716 A Tecnologia COM .......................................................................................................................................... 716 Adicionando e Implementando um Mtodo Interface IUtilitario .............................................................. 720 Compilando e Registrando o Objeto COM no seu Sistema ........................................................................... 725 Criando uma Aplicao que Utilize o Objeto COM ....................................................................................... 725 A Tecnologia OLE ............................................................................................................................................ 726 CAPTULO 35: APLICAES MULTICAMADAS .................................................................................................. 727 KNOW-HOW em: Aplicaes Multicamadas .................................................................................... 728 Apresentando a Tecnologia ............................................................................................................................. 728 A Camada de Armazenamento de Informaes ........................................................................................ 728 A Camada Intermediria a Camada Servidora ........................................................................................ 728 Criando a Camada de Interface com o Usurio (a aplicao-cliente) ....................................................... 731 CAPTULO 36: TCNICAS TEIS PARA A CRIAO DA INTERFACE COM O USURIO ................................................ 737 KNOW-HOW em: Parametrizao de Strings de Auxlio ............................................................... 738 Utilizao das Strings de Auxlio (Hints) ........................................................................................................ 738 Alterando a Cor de Fundo do Texto Exibido na String de Auxlio ............................................................ 738

XIV 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Alterando o Tempo de Incio e Trmino de Exibio da String de Auxlio ............................................... 739 Alterando o Tempo de Exibio Entre Strings de Auxlio Distintas .......................................................... 739 Exibindo uma String de Auxlio Composta por Vrias Linhas .................................................................. 739 KNOW-HOW em: Mltiplas Instncias ............................................................................................ 740 Apresentao do Problema ............................................................................................................................. 740 KNOW-HOW em: Reinicializao do sistema a partir de uma aplicao ..................................... 741 Apresentao do Problema ............................................................................................................................. 741 KNOW-HOW em: Manipulao da data e hora do sistema ............................................................ 741 O Tipo TDateTime .......................................................................................................................................... 742 Obtendo a Data e Hora do Sistema ............................................................................................................ 742 Convertendo um Valor do Tipo Data/Hora em uma String ...................................................................... 743 Convertendo uma String em um Valor do Tipo Data/Hora ...................................................................... 743 Obtendo o Dia da Semana Correspondente a uma Data ........................................................................... 743 Funes Especiais de Converso de Data/Hora .......................................................................................... 743 KNOW-HOW em: Personalizao de Formulrios com a Definio de um Pano de Fundo ........ 744 Inserindo um Pano de Fundo em um Formulrio .......................................................................................... 744 KNOW-HOW em: Desenvolvimento de Aplicaes MDI ................................................................. 745 Criando Aplicaes MDI ................................................................................................................................. 745 Criando a Janela Principal de uma Aplicao MDI ................................................................................... 746 Criando uma Janela-filha de uma Aplicao MDI ..................................................................................... 746 Destruindo Uma Janela-Filha de uma Aplicao MDI ............................................................................... 746 Organizando a Exibio das Janelas-filhas ................................................................................................. 747 Mesclando Menus ...................................................................................................................................... 747 Codificando a Aplicao ................................................................................................................................. 748 KNOW-HOW em: Operaes de Drag-drop em Componentes ........................................................ 751 Apresentao do Problema ............................................................................................................................. 751 Descrio das Tcnicas de Drag & Drop ..................................................................................................... 751 Exemplo de Utilizao ................................................................................................................................ 752 Definio da Interface ................................................................................................................................ 752 Codificao do Exemplo ............................................................................................................................ 754 CAPTULO 37: INTERNACIONALIZAO DE APLICATIVOS CRIADOS COM O DELPHI .................................................. 757 KNOW-HOW em: Internacionalizao de Aplicativos .................................................................... 758 O Ambiente Integrado de Traduo do Delphi 7 ........................................................................................... 758 Incorporando os Recusos do Ambiente Integrado de Traduo ao seu Projeto de Aplicativo ....................................................................................................... 758 Traduzindo Constantes e Expresses .............................................................................................................. 763 Definindo o Idioma Corrente ......................................................................................................................... 765 Utilizando o Translation Repository .......................................................................................................... 766 CAPTULO 38: CRIANDO APLICAES PARA A INTERNET .................................................................................. 769 KNOW-HOW em: Desenvolvimento de Aplicaes CGI com WebBroker ...................................... 770 Procedimentos Bsicos Necessrios Criao de Aplicaes CGI .................................................................. 770 Uma Aplicao CGI Bastante Elementar ........................................................................................................ 771 Exibindo a Data e a Hora do Sistema em uma Pgina HTML ........................................................................ 776 Respondendo a Entrada de Dados de Formulrios HTML .............................................................................. 777 O Componente PageProducer .................................................................................................................... 780 O Componente DataSetTableProducer ...................................................................................................... 782 O Componente QueryTableProducer ......................................................................................................... 788 KNOW-HOW em: Desenvolvimento de Aplicaes CGI com WebSnap ....................................................... 791 Criando o Mdulo Principal de uma Aplicao WebSnap ............................................................................. 792 Adicionando um Grid Para Exibio dos Registros ........................................................................................ 796 Adicionando Botes Para a Edio dos Registros do Grid .............................................................................. 798 Criando uma Pgina com um Formulrio Para Edio dos Registros ............................................................ 799 Conectando as Pginas ................................................................................................................................... 801 Testando a Aplicao ...................................................................................................................................... 801 Tratando Erros ................................................................................................................................................. 803 Criando uma Pgina de Login ........................................................................................................................ 803 Definindo as Pginas que Requerem Login .................................................................................................... 805 Definindo Direitos de Acesso a Usurios ........................................................................................................ 805 KNOW-HOW em: Desenvolvimento de Aplicaes CGI com Intraweb ........................................................ 806 Fundamentos da Tecnologia IntraWeb ........................................................................................................... 807 Criando a Aplicao ........................................................................................................................................ 807

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XV

BORLAND DELPHI 7 CURSO COMPLETO


Criando o Formulrio Principal da Aplicao ............................................................................................ 807 Criando o Formulrio de Cadastro ............................................................................................................ 811 Criando o Formulrio de Alterao ............................................................................................................ 813 Criando o Formulrio de Excluso ............................................................................................................. 814 Testando a Aplicao ...................................................................................................................................... 816 PARTE III: REFERNCIA ............................................................................................................................. 819 CAPTULO 39: FUNES MATEMTICAS DISPONVEIS CAPTULO 40: CLASSES, CONTROLES
E EM

DELPHI ....................................................................... 820

COMPONENTES ...................................................................................... 829

CAPTULO 41: PROPRIEDADES ..................................................................................................................... 977 CAPTULO 42: MTODOS .......................................................................................................................... 1229 CAPTULO 43: EVENTOS ........................................................................................................................... 1339 NDICE REMISSIVO .................................................................................................................................. 1383

XVI 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INTRODUO

Parte
Fundamentos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INTRODUO

Captulo
Introduo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo ser feita uma breve apresentao dos fatos que antecederam o surgimento das ferramentas de desenvolvimento RAD, dentre as quais se destaca o prprio Delphi, e da importncia dessas ferramentas no mercado desenvolvedor. importante destacar que o Delphi, agora na verso 7, no mais uma simples ferramenta para desenvolvimento de aplicaes com interface grfica e baseada na linguagem Object Pascal. O Delphi 7 , na realidade, um ambiente de desenvolvimento que integra diversas tecnologias.

FUNDAMENTOS EM: FERRAMENTAS DE DESENVOLVIMENTO


PR-REQUISITOS
Noes bsicas de desenvolvimento de software. Experincia na utilizao do sistema operacional Windows.

METODOLOGIA
Apresentao do problema: A escolha de uma ferramenta capaz de acelerar o processo de desenvolvimento de software.

AS ORIGENS DAS FERRAMENTAS RAD


Nos ltimos anos, o surgimento dos sistemas operacionais com interface grfica fez com que as tarefas relacionadas ao desenvolvimento de softwares comerciais sofressem transformaes radicais. Inicialmente, o desenvolvimento de sistemas para o ambiente Windows requeria a utilizao da linguagem C na qual esto implementadas as funes da API do Windows. O desenvolvimento de uma aplicao extremamente simples, que exibisse apenas uma janela com alguma mensagem esttica, requeria cerca de dezenas de linhas de cdigo em linguagem C. O desenvolvimento de aplicaes mais complexas, por sua vez, exigia centenas (se no milhares) de linhas de cdigo em linguagem C apenas para criar os elementos de interface com o usurio. Dessa maneira, o desenvolvedor levava um tempo enorme apenas codificando a interface do sistema cuja finalidade simplesmente obter informaes do usurio ou exibir informaes referentes ao resultado de algum processamento , em vez de se dedicar mais ao cdigo associado a um sistema especfico. Considere, por exemplo, a seguinte situao: um desenvolvedor foi encarregado de criar um sistema para controle de estoque de uma empresa. No seria mais lgico se dedicar mais codificao das rotinas destinadas a solucionar os problemas intrnsecos ao sistema do que se preocupar em criar janelas e botes de comando? Evidentemente que sim! Paralelamente ao problema decorrente da extensa codificao necessria criao da interface, a linguagem C tambm no uma linguagem de programao orientada a objetos caracterstica desejada s linguagens modernas o que levaria a uma mudana radical nas tcnicas de modelagem e desenvolvimento de sistemas. Alm disso, muitos desenvolvedores consideravam a linguagem C extremamente difcil em comparao com o Basic e o Pascal (do qual se originou o Delphi), por exemplo. Com o surgimento de ambientes de desenvolvimento baseados na linguagem C++ (uma das primeiras linguagens a suportar as caractersticas da programao orientada a objetos), como o Borland C++ e o Microsoft Visual C++, as tcnicas de programao orientada a objetos passaram a ser incorporadas com mais facilidade

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INTRODUO
no desenvolvimento dos novos sistemas. A linguagem C++, por ser uma extenso da linguagem C (s vezes denominada por alguns autores como C com Classes), podia acessar diretamente as funes da API do Windows e j oferecia uma srie de classes que definiam os principais elementos de interface. Continuava, no entanto, a existir uma certa distncia entre a codificao do aplicativo e a criao da interface com o usurio. A interface com o usurio era desenhada em um editor de recursos e a sua associao ao cdigo era feita de forma indireta, em uma tabela de respostas a eventos definida no cdigo da aplicao. Essa lacuna comeou a ser preenchida com o surgimento das primeiras ferramentas para desenvolvimento rpido de aplicativos, tambm denominadas ferramentas RAD (Rapid Application Development). Essas ferramentas permitiam associar, de maneira simples e rpida, um elemento de interface e o cdigo da aplicao. Uma das primeiras ferramentas a adotar o conceito RAD foi o Visual Basic for Windows, da Microsoft. Ao adotar uma linguagem simples como o Basic e facilitar a associao entre cdigo e elementos de interface (por meio da incorporao das tcnicas de programao orientada a eventos), o Visual Basic reuniu os requisitos bsicos para se tornar, inicialmente, uma das ferramentas de desenvolvimento de maior sucesso do mercado. Havia, no entanto, algumas limitaes. Uma aplicao desenvolvida em Visual Basic requeria a utilizao de algumas DLLs cuja distribuio era indesejvel, e o desempenho dos aplicativos gerados no era to bom quanto o das aplicaes desenvolvidas em C++. Alm disso, o Visual Basic no suportava os requisitos de uma linguagem de programao orientada a objetos (o que, no entanto, j ocorre a partir da verso do produto para a plataforma .NET, que incorporou profundas modificaes na linguagem). Os desenvolvedores Windows passaram ento a ser obrigados a optar entre desempenho final e velocidade de desenvolvimento. Aqueles que optassem pelos ambientes de desenvolvimento baseados na linguagem C++ ganhavam no desempenho das aplicaes geradas, mas necessitavam de prazos superiores aos daqueles que optavam pelo Visual Basic. Foi ento que a Borland surpreendeu o mercado com o lanamento do Borland Delphi (ainda na verso 1.0 para desenvolvimento de aplicaes para o Windows 3.x) uma ferramenta que aliava a facilidade do Visual Basic ao poder da linguagem Object Pascal, cujo compilador apresentava o mesmo desempenho do Borland C++. O Delphi apresentava (e ainda apresenta) uma biblioteca de componentes inteiramente desenvolvida em Object Pascal a VCL (Visual Component Library) , na qual cada componente era representado por uma classe. Alm disso, a linguagem Object Pascal suportava os requisitos bsicos de programao orientada a objetos (excetuando-se apenas os recursos de herana mltipla que pode ser simulada e sobrecarga de operadores e funes esse ltimo recurso j incorporado desde a verso 4 do produto). Alm disso, a Borland disponibilizou o cdigo-fonte dos componentes da VCL, o que permitiu aos desenvolvedores compreender sua estrutura hierrquica e codificao, e tambm facilitou a expanso dessa biblioteca mediante a criao de novos componentes (desenvolvidos por terceiros). Essa estratgia impulsionou o surgimento de um novo mercado o mercado de desenvolvedores de componentes. Ao mesmo tempo em que incorpora ao Delphi os componentes padres para criao de interface, a Borland permite que terceiros desenvolvam componentes capazes de realizar tarefas especficas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Esse mercado se desenvolveu com tanta rapidez e eficincia que alguns desses componentes desenvolvidos por terceiros, como o Rave Reports (para a criao de relatrios), o TChart (para gerao de grficos), e o Intraweb (para desenvolvimento RAD para WEB) passaram a integrar o pacote oficial do Delphi. Atualmente existe uma infinidade de componentes, e muitos so comercializados pela Internet. A maioria destes possui uma verso de avaliao, e muitos podem ser adquiridos com o cdigo-fonte completo. Por terem sido desenvolvidos em Object Pascal, no precisam de nenhuma DLL ou arquivo adicional, e so facilmente integrados ao ambiente de desenvolvimento do Delphi (que tambm suporta componentes ActiveX, mas sem as vantagens dos componentes nativos denominao dada aos componentes desenvolvidos em Object Pascal). Existem ainda os componentes Freeware, que podem ser utilizados sem custo algum. Recomendo que voc use e abuse dos componentes existentes no mercado, de forma a acelerar o processo de desenvolvimento dos seus aplicativos. No se esquea, no entanto, de adquirir legalmente os componentes que utilizar, pois, alm dos aspectos legais envolvidos, a justa remunerao estimula os desenvolvedores de componentes a prosseguir no seu trabalho. Infelizmente, a falta de respeito aos direitos autorais se manifesta em grande escala por todo o mundo, e o Brasil no exceo. Devemos ter em mente, no entanto, que a prtica da pirataria tende a desestimular os desenvolvedores de solues, e no futuro voc pode se tornar uma vtima do seu prprio crime, ao no encontrar para uma futura verso do Delphi um componente que possa simplificar o seu trabalho de desenvolvimento (componente este que havia sido desenvolvido para verses anteriores do produto). Esse tipo de argumento se aplica ao prprio Delphi, comercializado em diversas verses, a preos compatveis para cada finalidade. A fim de facilitar o desenvolvimento de aplicaes multiplataforma, a Borland passou a incluir, desde a verso 6 do Delphi, uma nova biblioteca de componentes denominada CLX e usada pelo Kylix (a ferramenta RAD da Borland para o desenvolvimento de aplicaes para o ambiente Linux). A CLX baseada na biblioteca Qt da Troll Tech, que realmente multiplataforma, e seus componentes so muito semelhantes queles existentes na VCL. Conseqentemente, o desenvolvedor que for capaz de, utilizando o Delphi 7 como ferramenta de desenvolvimento, criar aplicaes para o ambiente Windows baseadas na CLX, no ter nenhuma dificuldade em migrar suas aplicaes para o ambiente Linux, caso empregue o Kylix como ferramenta de desenvolvimento para aquele sistema operacional. Um alerta aos iniciantes: programao no sinnimo de criao de interface! Nos ltimos anos, tenho observado que muitas pessoas (principalmente os iniciantes em programao) esto confundindo um pouco as coisas. Desenvolver um aplicativo requer mais do que apenas construir uma bela interface, e o objetivo das ferramentas RAD exatamente esse: simplificar a criao da interface para permitir que o desenvolvedor se atenha mais anlise, projeto e codificao do sistema. A interface, como o prprio nome diz, serve para a comunicao entre o usurio e o sistema, e corresponde apenas a uma parcela do seu desenvolvimento. Desenvolver uma aplicao requer conhecimento de tpicos como, por exemplo, algoritmos, lgica de programao e teoria de Bancos de Dados. Devemos considerar que a formao de um desenvolvedor no se faz da noite para o dia, e a programao apenas um dos ingredientes dessa formao.

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INTRODUO
Embora tenha me esforado para redigir meus livros de forma didtica e precisa, de maneira a poder oferecer informao atualizada aos nossos leitores, a rapidez com que a informtica evolui fora-nos a escrever e publicar livros em tempo recorde! Conseqentemente, eventuais erros de redao ou digitao podem vir a ocorrer, mas que de forma alguma comprometem o entendimento do assunto. Reforo o argumento de que programao uma atividade que exige muito raciocnio, estando distante de ser uma atividade mecnica. De qualquer maneira, estarei disposio para resolver dvidas referentes ao livro pelo endereo eletrnico mrleao@rio.com.br. Gostaria de concluir esse captulo parabenizando o leitor por adotar o Delphi 7 como ferramenta de desenvolvimento. Conforme ser mostrado ao longo do livro, o Delphi 7 ferramenta de desenvolvimento robusta e capaz de atender s necessidades de desenvolvedores de qualquer porte desde aqueles que desenvolvem aplicativos mais simples (com acesso a bancos de dados locais) at aqueles que esto comprometidos com o desenvolvimento de solues corporativas e para a Internet.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7

Captulo
O Ambiente de Desenvolvimento Integrado do Delphi 7

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo ser apresentado o ambiente de desenvolvimento integrado do Delphi 7. Sero mostrados os conceitos fundamentais de formulrios, controles, componentes, propriedades, mtodos e eventos, cuja compreenso indispensvel ao desenvolvimento de uma boa aplicao.

FUNDAMENTOS EM: COMPOSIO DO AMBIENTE DE DESENVOLVIMENTO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows.

METODOLOGIA
Apresentao dos elementos que compem o ambiente de desenvolvimento integrado do Delphi 7.

APRESENTAO DO AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


Neste captulo ser apresentado o ambiente de desenvolvimento do Delphi 7 e os conceitos fundamentais utilizados na criao da interface de um aplicativo. As figuras que se seguem apresentam o ambiente de desenvolvimento integrado do Delphi 7, tal como se apresenta quando voc o inicializa pela primeira vez.

Figura 2.1: Ambiente de desenvolvimento integrado do Delphi 7.

10 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7

As figuras exibidas neste livro foram capturadas com o sistema operacional Windows XP, mas os procedimentos e as janelas so muito semelhantes nas outras verses deste sistema operacional (95/98/Me/NT/2000). O ambiente de desenvolvimento integrado do Delphi 7 composto pelas seguintes reas de trabalho: a) Uma janela principal, onde se encontram: Uma barra de ttulos, que exibe o ttulo do projeto corrente. Quando voc inicia um novo projeto, este recebe o nome default Project1, como mostra a figura anterior. Uma barra de menus, que d acesso aos principais comandos e configuraes do ambiente de desenvolvimento integrado do Delphi 7. Uma caixa de ferramentas, composta de vrios botes reunidos em trs grupos, e que fornecem atalho para a execuo de diversas tarefas, como ser mostrado ao longo do texto. Uma caixa combo que permite selecionar a configurao desejada para a sua rea de trabalho. Uma paleta de componentes, composta por diversas pginas nas quais os componentes esto reunidos por categoria. Estes componentes so os objetos utilizados na criao da interface do programa, no desenvolvimento de aplicaes para o ambiente Windows. Estas pginas da paleta de componentes apresentam algumas diferenas quando a aplicao se baseia na VCL ou na CLX. A VCL, por ser desenvolvida exclusivamente para o ambiente Windows, possui mais componentes que a CLX (que precisa atender ao requisito de ser multiplataforma). Logo, se voc for desenvolver uma aplicao exclusivamente para o ambiente Windows, dever dar preferncia utilizao da VCL. Caso a aplicao venha a ser multiplataforma (compilada no Delphi para o ambiente Windows e no Kylix para o ambiente Linux), dever dar preferncia utilizao da CLX. b) Uma janela chamada Object Inspector, que d acesso s principais propriedades e eventos de um componente. Esta janela composta por: Uma caixa de seleo de objetos, utilizada para selecionar o objeto cujas propriedades e eventos desejamos alterar. Duas guias, intituladas Properties e Events, que do acesso s pginas de propriedades e de eventos, respectivamente. Os nomes das propriedades e dos eventos podem ser organizados em ordem alfabtica ou por categoria, alm de se poder ocultar a exibio de determinados tipos de propriedades e eventos. Esta versatilidade permite otimizar ainda mais a utilizao do ambiente de desenvolvimento. c) Uma janela chamada Form1, criada automaticamente pelo Delphi 7. O que o Delphi 7 chama de formulrios so as janelas usadas no desenvolvimento de aplicaes. Em geral, uma aplicao composta por diversas janelas (ou, como descrito anteriormente, por vrios formulrios). Uma janela denominada Code Editor mostrada na figura a seguir , inicialmente sobreposta pelo formulrio Form1, na qual ser digitado o cdigo da aplicao. Para alternar entre o Editor de Cdigos e o formulrio, basta pressionar seguidamente a tecla de funo F12.

d)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

11

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.2: O Editor de Cdigos do Delphi 7.

Para que uma aplicao se comporte da maneira desejada, torna-se necessria a incluso de linhas de cdigo que definam o comportamento do programa, como resposta a aes do usurio ou do sistema operacional. Embora o Delphi 7 facilite muito o trabalho de codificao de um aplicativo, sempre ser necessrio incluir algumas linhas de cdigo, como ser mostrado ao longo do livro, no desenvolvimento dos nossos aplicativos-exemplo. Repare que, inicialmente, a janela do Editor de Cdigos possui uma outra janela ancorada ao longo da sua extremidade esquerda. Esta janela, chamada Code Explorer, e que pode ser reposicionada dentro do ambiente de desenvolvimento integrado do Delphi 7, permite uma melhor movimentao pelo cdigo da aplicao, principalmente quando os arquivos de cdigo se tornam mais extensos. Em sua barra de ttulos, a janela do Code Editor apresenta o nome do arquivo em que est armazenado o cdigo que est sendo editado no momento. Inicialmente, conforme mostrado na figura anterior, esse arquivo denominado Unit1. Logo abaixo da sua barra de ttulos so exibidas as guias correspondentes aos arquivos de cdigo que esto abertos. Na figura anterior, como apenas o arquivo unit1 est aberto, s existe uma guia, identificada pelo nome Unit1 (essa a situao existente quando se inicia um novo projeto). Ao editar o cdigo do seu programa, voc pode aplicar as tcnicas de copiar, recortar e colar texto usando as combinaes de tecla Ctrl+C, Ctrl+X e Ctrl+V, como se faz em muitos editores de texto, ou empregar os itens correspondentes no menu Edit da janela principal do ambiente de desenvolvimento. e) Uma janela chamada Object TreeView mostrada na figura a seguir que permite selecionar rapidamente um componente inserido no formulrio, estando os nomes dos componentes exibidos

12 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


visualmente em uma estrutura hierrquica. Esta janela muito til quando se deseja alterar as propriedades de um componente cuja seleo pode ser dificultada pela existncia de outros componentes sobrepostos e que ocupem boa parte da sua regio visvel.

Figura 2.3: A Janela Object TreeView.

importante destacar que o ambiente de desenvolvimento do Delphi 7 completamente configurvel. Voc pode ancorar janelas em outras, alm de arrast-las e reposicion-las de forma que o ambiente seja configurado para acelerar ao mximo a sua produtividade. Existem ainda outras janelas, usadas principalmente na depurao de aplicativos, e que sero discutidas em um captulo posterior. A janela principal usada para a edio do trabalho, personalizao do ambiente, gerenciamento de documentos, etc. Os elementos que compem a janela principal podem ser tratados como barras de ferramentas independentes (mas internas janela principal), isto , podem ser arrastados, reposicionados, etc. dentro da janela principal. Voc pode selecionar os elementos que devem ser exibidos na janela principal. Para isso, basta executar o seguinte procedimento: 1. Pressionar o boto direito do mouse sobre qualquer rea livre da janela principal (geralmente na rea superior direita dessa janela, prximo ao menu Help) para exibir o menu pop-up mostrado na figura a seguir, na qual se pode selecionar os elementos da janela principal que devem ou no ser exibidos.

Figura 2.4: Exibindo o menu pop-up da janela principal do ambiente de desenvolvimento do Delphi 7.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

13

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Voc tambm pode selecionar o item Customize desse menu, para exibir a caixa de dilogo Customize, mostrada na figura a seguir.

Figura 2.5: A caixa de dilogo Customize.

Essa caixa de dilogo apresenta ainda as guias Commands e Options, que permitem que se definam opes para a janela principal. Utilizando-se da guia Commands dessa caixa de dilogo, voc pode adicionar novos botes s barras de ferramentas da janela principal. Para isso, basta executar os seguintes procedimentos: 1. Exiba a caixa de dilogo Customize, executando os procedimentos descritos anteriormente. 2. Selecione a guia Commands dessa caixa de dilogo. 3. Selecione uma das categorias na lista da esquerda (lista Categories). Os comandos correspondentes so exibidos na lista da direita (Commands). 4. Selecione o comando que deseja acessar por meio de um boto de comando e o arraste para a janela principal, na posio em que o boto deve ser inserido. Caso o comando possua um bitmap associado, este ser exibido no boto a ser criado; caso contrrio, o texto do comando ser exibido (e as dimenses do boto sero maiores). Para remover o boto de comando, basta selecion-lo e arrast-lo para fora da barra de ferramentas. Utilizando a guia Options dessa caixa de dilogo, voc pode definir se os botes de comando devem ou no exibir strings de auxlio e se estas devem ou no exibir as teclas de atalho correspondentes ao comando. Para isso, basta selecionar as opes correspondentes.

FORMULRIOS OS ELEMENTOS DE CRIAO DA INTERFACE COM O USURIO


Quando voc inicia o ambiente de trabalho do Delphi 7 ou comea a desenvolver uma nova aplicao, aparece um formulrio default denominado Form1, criado automaticamente pelo ambiente, no qual voc pode comear a construir a interface visual do seu programa.

14 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


O que o Delphi 7 chama de formulrio , na realidade, uma janela de uma aplicao, que pode ser a sua janela principal, uma caixa de dilogo, etc. Um formulrio apresenta uma rea de trabalho, denominada rea-cliente, na qual podem ser includos os controles e componentes que proporcionaro maior funcionalidade sua aplicao. A figura a seguir mostra o formulrio default criado pelo Delphi 7.

Figura 2.6: O formulrio default criado pelo Delphi 7.

Os procedimentos necessrios personalizao de um formulrio sero apresentados posteriormente, medida que forem apresentados os procedimentos necessrios criao da interface.

CONTROLES E COMPONENTES
Os componentes so os objetos utilizados para criar a interface do programa com o usurio e executar tarefas especficas do sistema operacional. Os controles so os componentes que podem permanecer visveis durante a execuo do aplicativo. Fica evidente, portanto, que os componentes podem ser divididos em dois grandes grupos: os componentes no-visuais e os componentes visuais os controles. Como exemplo de componentes no-visuais podem ser citados os que permitem a exibio das caixas de dilogo padro do sistema (encontradas na pgina Dialogs da paleta de componentes) e o temporizador (encontrado na pgina System da paleta de componentes do Delphi 7), usado para gerar mensagens do sistema a intervalos de tempo predefinidos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

15

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Como exemplo de controles podemos citar as caixas de texto, rtulos, caixas de lista e botes de comando, entre muitos outros que sero mostrados ao longo do livro. Em suma, os controles so os componentes visuais com os quais o usurio poder interagir durante a execuo do aplicativo. Os componentes no-visuais, por outro lado, permanecem invisveis durante a execuo da aplicao (o usurio no os enxerga), embora realizem tarefas importantes. Os controles e componentes esto distribudos, de acordo com a sua funcionalidade, pelas diversas pginas da paleta de componentes (Figura 2.7), situada na janela principal do Delphi 7.

Figura 2.7: A paleta de componentes do Delphi 7.

As pginas da paleta de componentes exibidas no Delphi 7 dependem da biblioteca de componentes utilizada. As pginas de componentes da VCL e da CLX no so exatamente iguais, mas a maneira de utiliz-las a mesma. As diferenas dizem respeito existncia ou no de determinadas pginas (A CLX, por ser multiplataforma, no possui uma pgina chamada Win32 na sua paleta de componentes) e componentes especficos, bem como localizao de determinados componentes. O temporizador (componente Timer) um exemplo de componente disponvel nas duas bibliotecas, mas em pginas diferentes da paleta de componentes. importante destacar que, inicialmente, nem todas as guias esto visveis. Para navegar pelas guias da paleta de componentes, use os botes de seta situados no seu canto superior direito. Para selecionar uma das pginas, basta clicar com o boto esquerdo do mouse sobre a guia correspondente. Quando o nmero de componentes de uma pgina exceder a sua capacidade de exibio, use os botes de seta situados nas extremidades da pgina para exibir os componentes que estiverem ocultos. Outra opo alterar a resoluo atual do seu monitor, de forma a tornar possvel a exibio simultnea de um maior nmero de componentes por pgina. Normalmente, em uma resoluo de 800 x 600, todos os componentes podem ser acessados sem qualquer dificuldade, o que no ocorre no caso em que se adota uma resoluo de 640 x 480. Cada controle ou componente tem propriedades, mtodos e eventos associados. As propriedades de um controle ou componente definem o seu aspecto e algumas das suas principais caractersticas. Os mtodos so funes ou procedimentos intrnsecos ao controle ou componente, e so capazes de realizar alguma tarefa especfica quando executados. Os eventos, por sua vez, so acontecimentos associados a um controle ou componente. As definies de propriedades, mtodos e eventos sero detalhadas nos tpicos a seguir.

PROPRIEDADES
Os controles e componentes, junto com os formulrios, so objetos predefinidos da linguagem Object Pascal (a linguagem de programao utilizada pelo Delphi 7) e apresentam algumas caractersticas muito semelhantes s dos objetos que diariamente manipulamos. Vamos aproveitar essas semelhanas na definio das caractersticas dos objetos da linguagem Object Pascal e eleger como objeto de

16 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


comparao um monitor de vdeo, objeto que todos ns, programadores, conhecemos e com o qual estamos habituados a trabalhar. Todo e qualquer objeto tem propriedades que o caracterizam e o diferenciam dos demais. Entre as propriedades de um monitor de vdeo, podemos destacar: O seu tamanho (definido em polegadas). A cor do seu gabinete. Assim como o monitor de vdeo, um formulrio (e todos os demais objetos da linguagem) tambm tem propriedades que o diferenciam, tais como: A sua cor, que definida pelo valor armazenado na sua propriedade Color. O seu tamanho, definido pelo valor armazenado nas suas propriedades Height (altura) e Width (largura). A definio ou alterao de um valor para uma propriedade pode ser feita de duas formas: Na fase de projeto, usando-se o Object Inspector (que ser visto em um tpico posterior, ainda neste captulo). Durante a execuo do aplicativo, mediante a incluso de uma linha de cdigo com a seguinte sintaxe:
nome_do_objeto.nome_da_propriedade:= valor;

Esse um tpico exemplo de comando de atribuio, e o sinal de igualdade precedido por dois-pontos , nesse caso, denominado operador de atribuio. Os operadores da linguagem Object Pascal sero apresentados no prximo captulo.

MTODOS
Todo objeto na vida real tem alguma funcionalidade e, no caso do monitor de vdeo, por exemplo, essa funcionalidade consiste em mostrar a imagem correspondente a um sinal enviado pela placa de vdeo do sistema. Entretanto, para que isso acontea, necessrio que o monitor de vdeo saiba como transformar o sinal emitido pela placa de vdeo em imagem, isto , deve existir um mtodo para se fazer isso (no caso do monitor de vdeo, existem circuitos eletrnicos que se encarregam dessa tarefa). Assim como o monitor de vdeo, os objetos utilizados no desenvolvimento de uma aplicao com o Delphi 7 tambm tero mtodos que os tornaro capazes de realizar determinadas tarefas. Diferentemente do que ocorre com as propriedades, que tambm podem ser definidas na fase de projeto, a chamada a um mtodo s pode ser feita durante a execuo do aplicativo, mediante a incluso de uma linha de cdigo com a seguinte sintaxe:
nome_do_objeto.nome_do_mtodo;

Conforme ser descrito posteriormente (no captulo referente programao orientada a objetos), um mtodo pode ou no receber parmetros, sendo, na realidade, uma funo ou procedimento que definida para o objeto (para ser mais exato, um mtodo definido internamente a uma classe, da qual

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

17

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


o objeto uma instncia, mas por enquanto vamos deixar de lado esses preciosismos de definio, de forma a no confundir o prezado leitor). Em alguns casos, pode ser necessria a passagem de parmetros na chamada a um mtodo.

EVENTOS
No tpico anterior vimos que todo objeto tem mtodos, que so caractersticas que representam a sua funcionalidade. Normalmente, os mtodos so executados em resposta a algum acontecimento (um evento). No caso do monitor de vdeo, por exemplo, quando o usurio alterna entre aplicaes do Windows (quando ocorre o evento de alternar entre aplicaes), os mtodos necessrios atualizao da imagem so executados. Da mesma forma que no monitor de vdeo, os objetos que usamos no desenvolvimento dos nossos aplicativos com o Delphi 7 tambm apresentam eventos associados. Cada objeto tem a capacidade de responder a um determinado conjunto de eventos, e essa resposta a um evento feita mediante a definio de um procedimento associado a esse evento, e esse procedimento pode ser facilmente acessado por meio do Object Inspector. Sempre que um determinado evento ocorre, a aplicao verifica se existe um procedimento associado a esse evento e, em caso positivo, o procedimento a ele associado executado. Considere, por exemplo, um boto de comando, objeto bastante comum nas aplicaes desenvolvidas para o ambiente Windows. Quando um usurio seleciona um boto (clicando sobre este com o boto esquerdo do mouse), diz-se que ocorreu o evento de clicar sobre o boto com o boto esquerdo do mouse. Quando esse evento ocorre, o usurio espera alguma resposta (afinal de contas, se o boto est l, deve servir para alguma coisa). Associado a esse evento, deve haver um procedimento a ser executado sempre que isso ocorrer. importante lembrar que, ao ocorrer esse evento, a aplicao verifica se existe um procedimento associado. Se houver, esse procedimento executado, se no, a aplicao no faz nada. Cabe a voc o desenvolvedor definir um procedimento associado a esse evento e codificar os comandos a serem executados nesse procedimento. Nos prximos tpicos, sero apresentados os passos necessrios definio de procedimentos associados a eventos.

O OBJECT INSPECTOR
Essa janela, que fornece acesso direto s propriedades e eventos associados a um componente, tem: Uma caixa de seleo de objetos, que identifica o objeto selecionado. Pginas de eventos (acessada selecionando-se a guia Events com o boto esquerdo do mouse) e de propriedades (acessada selecionando-se a guia Properties com o boto esquerdo do mouse).

18 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


A Figura 2.8 mostra a pgina de propriedades do objeto Form1.

Figura 2.8: A pgina Properties do Object Inspector no Delphi 7.

ALTERANDO O VALOR DE UMA PROPRIEDADE NO OBJECT INSPECTOR


Voc pode alterar o valor de uma propriedade de um componente executando os seguintes procedimentos: 1. Selecione o componente, clicando sobre ele com o boto esquerdo do mouse ou por meio da caixa de seleo de objetos do Object Inspector. 2. Selecione a pgina Properties do Object Inspector, se ela j no estiver selecionada. 3. Clique no campo direita da propriedade a ser alterada. 4. Defina o novo valor da propriedade. Quando se altera a propriedade de um componente usando-se o Object Inspector, diz-se que essa propriedade est sendo alterada na fase de projeto do aplicativo. Quando essa alterao for feita mediante a incluso de uma linha de cdigo (conforme descrito anteriormente), diz-se que a propriedade est sendo alterada durante a execuo do aplicativo. Conforme descrito anteriormente, voc pode optar por exibir as propriedades em ordem alfabtica ou agrupadas por categoria, bastando selecionar a opo correspondente no item Arrange do menu popup que exibido quando voc pressiona o boto direito do mouse sobre o Object Inspector, como mostra a Figura 2.9. Voc tambm pode selecionar as propriedades que devem estar visveis, bastando marcar ou desmarcar a opo correspondente no item View do menu pop-up apresentado na figura anterior. Alm disso, o Object Inspector exibe, em sua extremidade inferior, o nmero de propriedades ou eventos ocultos (ou a frase All Shown indicando que todos esto sendo exibidos).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

19

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.9: O menu pop-up do Object Inspector.

DEFININDO PROCEDIMENTOS ASSOCIADOS A EVENTOS


A Figura 2.10 mostra a pgina Events do object Inspector, usada para definir procedimentos associados a eventos para um objeto.

Figura 2.10: A pgina Events do Object Inspector.

Para alguns componentes, algumas propriedades consideradas muito importantes tambm so exibidas na pgina de eventos do Object Inspector.

20 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


Voc pode definir um procedimento associado a um evento de um objeto da seguinte forma: 1. Selecione o objeto clicando sobre ele com o boto esquerdo do mouse ou por meio da caixa de seleo de objetos. 2. Selecione a pgina Events do Object Inspector, se ela j no estiver selecionada. 3. D um duplo clique no espao em branco exibido direita do nome do evento cujo procedimento dever ser definido. Ser exibida a janela do Code Editor, com o cursor situado no ponto em que deve ser inserido o cdigo associado quele evento. A Figura 2.11 mostra a janela exibida quando se cria o procedimento associado ao evento OnActivate do objeto Form1. 4. Digite o trecho de cdigo a ser executado quando o evento ocorrer.

Figura 2.11: Definindo o procedimento associado a um evento.

Observe que o cabealho e o corpo principal do procedimento so gerados automaticamente. Qualquer cdigo a ser executado em resposta a esse evento dever ser escrito entre as palavras begin e end (no as apague). Como mostra a Figura 2.12, alm de criar o cabealho e o corpo principal da funo, o compilador ainda inseriu uma declarao do procedimento dentro da definio da classe TForm1 (Calma! Se voc no sabe o que uma classe, no precisa se assustar, pois isso ser visto no prximo captulo).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

21

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.12: Declarao do procedimento associado a um evento.

O CONCEITO DE PROJETO DE UMA APLICAO


Normalmente, uma aplicao desenvolvida para o ambiente Windows tem diversas janelas e caixas de dilogo, cada uma com sua finalidade especfica (entrada de dados, mensagens de advertncia, exibio de grficos, etc.) e diversos arquivos de cdigo. Dessa maneira, fica claro que o desenvolvimento de uma aplicao com o Delphi 7 exigir a utilizao de diversos formulrios e arquivos de cdigo. Como a quantidade de formulrios e arquivos de cdigos de uma aplicao pode tornar difcil o seu gerenciamento por parte do programador, o Delphi 7 utiliza o conceito de Projeto de uma aplicao. Quando voc inicia o desenvolvimento de uma aplicao, est, na realidade, criando um projeto. Quando voc adiciona um formulrio ou arquivo de cdigo para a aplicao, est, na realidade, adicionando arquivo(s) ao projeto. O Projeto chama para si a responsabilidade de gerenciar a aplicao, facilitando o trabalho do programador. Conforme descrito anteriormente, quando voc inicia um novo projeto de aplicao no Delphi 7, ele recebe o nome de Project1 (o nome do projeto exibido na barra de ttulo da janela principal) e ser armazenado no arquivo project1.dpr, a menos que voc o renomeie, selecionando o item Save Project As do menu File e redefinindo os nomes dos arquivos de cdigo e de projeto nas caixas de dilogo correspondentes. Alm do arquivo de projeto, o Delphi 7 cria tambm um formulrio (denominado Form1) e uma unidade de cdigo, denominada unit1 e armazenada no arquivo unit1.pas (a menos que voc o renomeie, selecionando o item Save As do menu File ou definindo esse nome na caixa de dilogo Save Unit1 As, exibida ao se salvar o projeto).

22 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


Um projeto de aplicao tem a sua definio armazenada em um arquivo com a extenso DPR e pode ser visualizado selecionando-se o item View Source do menu Project. A Figura 2.13 mostra o cdigo do arquivo project1.dpr, criado automaticamente pelo Delphi 7. Observe que agora existem dois arquivos de cdigo abertos no Code Editor (sendo que um deles o arquivo de projeto). Voc pode exibir um arquivo selecionando a guia correspondente.

Figura 2.13: O cdigo do arquivo de projeto.

Na primeira linha, tem-se a palavra-chave program seguida do nome do projeto (nome do arquivo de projeto). Se voc salvar esse projeto com um outro nome, esse outro nome ser mostrado logo aps a palavra-chave program (em vez de Project1). O programador iniciante no deve manipular diretamente o arquivo de projeto. Mesmo no desenvolvimento de aplicativos avanados, raramente se faz necessria a manipulao direta desse arquivo, ficando todo o gerenciamento do projeto por conta do prprio ambiente. Em seguida pode-se verificar a clusula Uses reproduzida a seguir. Na VCL:
uses Forms, Unit1 in Unit1.pas {Form1};

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

23

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Na CLX
uses QForms, Unit1 in Unit1.pas {Form1};

Essa clusula permite que o arquivo de projeto acesse as definies armazenadas nos arquivos Forms.pas (no caso da VCL) ou QForms.pas (no caso da CLX) e Unit1.pas. Repare que, enquanto a VCL usa a unit Forms, a CLX usa a unit QForms. Em geral, o prefixo Q identifica que a unit pertence biblioteca CLX. Em seguida verifica-se a presena da seguinte linha de cdigo:
{$R *.res}

Esta linha de cdigo, exibida normalmente em itlico, representa uma diretiva de compilao, e indica ao compilador que, associado a este projeto, deve existir um arquivo de recursos (resources) com o mesmo nome do arquivo de projeto e extenso .res, e que se este arquivo no existir, dever ser criado. Por fim, verifica-se a existncia do seguinte trecho de cdigo (que o cdigo principal do arquivo de projeto, responsvel pela execuo do aplicativo):
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.

Nesse trecho de cdigo usa-se o objeto Application (que uma instncia da classe TApplication) que representa a aplicao. O mtodo Initialize do objeto Application, executado na linha de cdigo reproduzida a seguir, responsvel pela inicializao da aplicao.
Application.Initialize;

O mtodo CreateForm do objeto Application carrega um formulrio na memria (esse mtodo recebe como parmetros a classe e o nome do formulrio). Nesse caso, como o projeto recm-criado j possui automaticamente um formulrio chamado Form1, da classe TForm1, a criao desse formulrio feita na execuo da seguinte linha de cdigo:
Application.CreateForm(TForm1, Form1);

A execuo da aplicao se inicia com a execuo do mtodo Run do objeto Application, o que ocorre mediante a execuo da seguinte linha de cdigo:
Application.Run;

Se voc examinar o cdigo do arquivo unit1.pas criado pela VCL, mostrado a seguir, ver que esse cdigo faz referncia ao objeto Form1:

24 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} end.

Na primeira linha, tem-se a palavra-chave unit seguida do nome da unit (nome da unidade de cdigo). Se voc salvar o arquivo dessa unit com um outro nome, esse outro nome ser mostrado logo aps a palavra-chave unit (em vez de unit1). Alm disso, pode-se observar a seguinte linha de cdigo:
{$R *.DFM}

Essa linha de cdigo representa uma diretiva de compilao e indica ao Delphi 7 que, associado a essa unit, existe um arquivo de mesmo nome, mas com a extenso DFM. Um arquivo com a extenso DFM armazena uma descrio textual do formulrio. Para acessar o arquivo unit1.dfm, por exemplo, basta executar os seguintes procedimentos: 1. Selecione o formulrio, clicando sobre este com o boto esquerdo do mouse. 2. Pressione o boto direito do mouse, para exibir o menu pop-up mostrado na Figura 2.14. Nunca altere o nome do arquivo no qual a unit est armazenada usando as ferramentas disponveis no sistema operacional. Sempre que precisar alterar o nome do arquivo no qual uma unit est armazenada, use as opes disponveis no ambiente de desenvolvimento (usando, por exemplo, o item Save as do menu File ou o boto correspondente da barra de ferramentas).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

25

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.14: Exibindo o menu pop-up de um formulrio.

3. Selecione o item View as Text do menu pop-up. Pronto! Ser exibida a descrio textual do formulrio, como mostra a Figura 2.15.

Figura 2.15: Visualizando a descrio textual de um formulrio.

At a verso 4 do Delphi esse arquivo, que contm a descrio textual do formulrio, era armazenado com uma formatao especial e no podia ser visualizado em outros editores de texto. Nas ltimas verses, este arquivo passou a ser armazenado, por default, como um arquivo ASCII, desde que a opo correspondente (Text DFM) esteja selecionada no menu pop-up do formulrio.

26 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


No caso da CLX, o arquivo Unit1.pas apresenta a seguinte definio:
unit Unit1; interface uses SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms, QDialogs, QStdCtrls; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.xfm} end.

Repare na diferena entre os nomes das units bsicas acessadas pela VCL e pela CLX. Alm disso, a diretiva de compilao {$R *.xfm} indica que, associado a essa unit, existe um arquivo de mesmo nome, mas com a extenso xfm (mantenha a extenso em letras minsculas, pois caso voc venha a recompilar sua aplicao no Kylix, isto faz diferena). Podemos ento concluir que, em qualquer das bibliotecas de componentes, todo formulrio tem uma unidade de cdigo associada (um arquivo com a extenso PAS) e possui a sua descrio visual armazenada em um arquivo com a extenso DFM (no caso da VCL) ou xfm (no caso da CLX) que armazena a sua descrio textual. Para retornar situao anterior (representao visual do formulrio), bastando executar os seguintes procedimentos: 1. Selecione o arquivo com a descrio textual do formulrio. 2. Pressione o boto direito do mouse, para exibir o menu pop-up mostrado na Figura 2.16. 3. Selecione o item View As Form do menu pop-up. Pronto! Ser exibida novamente a representao visual do formulrio. Ao fazer o backup de um projeto de aplicao, voc dever copiar: Os arquivos de cdigo (extenso .pas). Os arquivos de descrio textual de formulrio (extenso .dfm no caso da VCL ou .xfm no caso da CLX). O arquivo de projeto (extenso .dpr). Alm dos arquivos do banco de dados, se for o caso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

27

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.16: Exibindo o menu pop-up de um arquivo de formulrio.

INICIANDO UM NOVO PROJETO


Sempre que voc for iniciar o desenvolvimento de uma nova aplicao usando o Delphi 7 como ferramenta de desenvolvimento, dever iniciar um novo projeto. recomendvel que o seu projeto e todos os seus arquivos sejam salvos em uma pasta prpria. Nesta parte do livro, ser desenvolvida uma aplicao para cadastrar os scios de um clube, e suas respectivas atividades. Para salvar nosso projeto e seus arquivos, ser criada uma pasta denominada Clube. Dessa maneira, devemos iniciar um novo projeto, referente a essa nova aplicao. Para iniciar um novo projeto, execute um dos seguintes procedimentos: 1. Selecione o item New/Application do menu File, para criar uma aplicao baseada na VCL. Ou: 1. Selecione o item New/CLX Application do menu File, para criar uma aplicao baseada na CLX. Ou: 1. Selecione o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items (Figura 2.17). Ou:

28 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7

Figura 2.17: A caixa de dilogo New Items do Delphi 7.

1. Selecione o item Application, na pgina New desta caixa de dilogo, para criar uma aplicao baseada na VCL. 2. Selecione o item CLX Application, na pgina New desta caixa de dilogo, para criar uma aplicao baseada na CLX. 3. Clique em OK, para fechar a caixa de dilogo. Ser ento criado um novo projeto chamado Project1, armazenado no arquivo Project1.dpr; um formulrio denominado Form1, armazenado no arquivo unit1.dfm (no caso da VCL) ou unit1.xfm (no caso da CLX) e um arquivo de cdigo associado ao formulrio Form1, denominado Unit1.pas. Esses so os nomes default fornecidos pelo ambiente de desenvolvimento, mas voc deve salvar o seu projeto e os seus arquivos de cdigo com nomes mais fceis de se memorizar. Antes de iniciar o desenvolvimento de uma aplicao, voc deve planej-la com cuidado, principalmente no que se refere aos nomes dos arquivos a serem manipulados pela aplicao. Um arquivo com o cdigo referente ao cadastro de um scio, por exemplo, pode ser armazenado com o nome UnitCadastroSocio.pas. Repare que o nome de um arquivo deve ser o mais descritivo possvel, de maneira a facilitar uma futura manuteno do sistema. Se aps iniciar o desenvolvimento da aplicao voc desejar alterar o nome de um arquivo de cdigo aps referenci-lo em outros arquivos, ser necessrio alterar explicitamente todas as referncias a este arquivo.

SALVANDO O PROJETO RECM-CRIADO


Para salvar um projeto recm-criado, execute um dos seguintes procedimentos: 1. Selecione o item Save Project As do menu File. Ou: 1. Na caixa de ferramentas, selecione o cone correspondente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

29

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Inicialmente ser exibida a caixa de dilogo Save Unit1 As (Figura 2.18), para que sejam definidos o nome e a pasta da primeira unidade de cdigo do programa (que o ambiente chamou de Unit1). Salve essa unidade de cdigo com um nome fcil de se memorizar, como UnitPrincipal, por exemplo.

Figura 2.18: Salvando a primeira unidade de cdigo.

Sempre que voc mandar salvar as alteraes de projetos, ser solicitado que voc atribua nomes a todas as units que foram criadas desde a ltima vez em que o projeto foi salvo, e que ainda no foram renomeadas (isto , ainda esto com o nome default gerado pelo ambiente). Aps definir um nome para a primeira unidade de cdigo e fechar a caixa de dilogo Save Unit1 As com o boto Salvar, ser exibida a caixa de dilogo Save Project1 As (Figura 2.19), para que voc defina o nome e a pasta do arquivo de projeto. Salve esse projeto com um nome fcil de se memorizar, mas que seja diferente dos nomes atribudos aos arquivos de cdigo (voc no pode dar o mesmo nome a uma unit e a um arquivo de projeto). Nesse caso, adotamos o nome Clube, como mostra a figura a seguir.

Figura 2.19: Salvando o arquivo de projeto.

30 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7

FECHANDO UM PROJETO
Ao terminar de executar seu trabalho, voc deve fechar o ambiente de desenvolvimento integrado. Antes disso, no entanto, voc deve salvar as alteraes realizadas no projeto. Para salvar todas as alteraes realizadas, basta executar um dos seguintes procedimentos: 1. Selecione o item Save All do menu File. Ou: 1. Na caixa de ferramentas, selecione o cone correspondente. Para fechar o projeto, basta executar um dos seguintes procedimentos: 1. Selecione o item Close do menu File. Ou: 1. Selecione o item Close All do menu File. Se voc alterar o projeto atual ou um dos arquivos de cdigo e no salv-lo antes de tentar executar os passos anteriores, ser apresentada uma caixa de dilogo como as das Figuras 2.20 e 2.21, perguntando se as alteraes devem ser salvas. Caso no tenha sido definido um nome para o projeto e para cada uma das suas unidades de cdigo, tambm sero apresentadas as caixas de dilogo Save Unit1 As e Save Project1 As, descritas anteriormente.

Figura 2.20: Confirmando se as alteraes feitas no projeto devem ser salvas.

Figura 2.21: Confirmando se as alteraes feitas no arquivo devem ser salvas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

31

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

MANIPULANDO GRUPOS DE PROJETOS


O Delphi 7 permite que voc rena vrios projetos em uma nova entidade, denominada Grupo de Projeto. Essa caracterstica muito til quando voc possui vrios projetos inter-relacionados e deseja manipullos simultaneamente no ambiente de desenvolvimento. Para criar um novo grupo de projeto, voc deve executar os seguintes procedimentos: 1. Selecione o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items (Figura 2.22).

Figura 2.22: A caixa de dilogo New Items.

2. Selecione o item Project Group, na pgina New desta caixa de dilogo. 3. Clique em OK, para fechar a caixa de dilogo. Ser exibida a caixa de dilogo Project Manager, mostrada na figura a seguir.

Figura 2.23: A caixa de dilogo Project Manager.

32 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


Nessa caixa de dilogo voc pode: Adicionar um novo projeto ao grupo de projetos atual. Adicionar um projeto existente ao grupo de projetos atual. Para adicionar um novo projeto ao grupo de projetos atual, voc deve executar os seguintes procedimentos: 1. Selecionar o boto New na janela do Project Manager. Ou: 1. Selecionar o boto direito do mouse com o nome do grupo de projetos selecionado, para exibir o menu pop-up dessa janela. 2. Selecionar o item Add New Project desse menu pop-up, como mostrado na figura a seguir. Ser exibida a caixa de dilogo New Items, na qual voc deve selecionar o item Application e o boto OK. Repare que, aps adicionar um novo projeto, este ser exibido na caixa de dilogo Project Manager, como indicado na figura a seguir. Repare que o novo projeto (Project1) possui uma unit chamada Unit1, qual correspondem um arquivo de cdigo (chamado Unit1.pas) e um formulrio (chamado Form1).

Figura 2.24: Adicionando o novo projeto (Project1) ao grupo de projetos atual.

Para adicionar um projeto existente ao grupo de projetos atual, voc deve executar os seguintes procedimentos: 1. Selecionar o boto direito do mouse com o nome do grupo de projetos selecionado, para exibir o menu pop-up dessa janela. 2. Selecionar o item Add Existing Project desse menu pop-up, como mostrado na figura a seguir. Ser exibida a caixa de Open Project, na qual voc dever selecionar o projeto a ser includo no grupo de projetos atual e o boto Abrir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

33

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.25: Adicionando um projeto existente ao grupo de projetos atual.

No Delphi 7, voc pode adicionar ou remover unidades de cdigo em um projeto simplesmente arrastando o seu cone a partir do Windows Explorer para o local adequado na janela do Project Manager. A figura a seguir apresenta a janela do gerenciador de projetos (Project Manager) aps a incluso de um novo projeto (Project1.exe) e um projeto existente (Clube.exe).

Figura 2.26: Manipulando vrios projetos com o Project Manager.

Para remover um projeto do grupo de projetos atual, voc deve executar os seguintes procedimentos: 1. Selecionar o projeto que se quer remover na janela do Project Manager. 2. Selecionar o boto Remove na janela do Project Manager.

34 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7


Ou: 1. Selecionar o projeto que se quer remover na janela do Project Manager. 2. Selecionar o boto direito do mouse com o nome do grupo de projetos selecionado, para exibir o menu pop-up dessa janela. 3. Selecionar o item Remove Project desse menu pop-up. Ser exibida a caixa de dilogo de confirmao mostrada na figura a seguir, na qual voc deve selecionar o boto OK para finalizar esta tarefa.

Figura 2.27: A caixa de dilogo de confirmao.

O CODE EXPLORER
Conforme descrito anteriormente, inicialmente existe outra janela ancorada ao longo da borda esquerda da janela do Editor de Cdigos. Essa janela (denominada Code Explorer) pode ser destacada do Code Editor, bastando, para isso, selecionar a barra horizontal situada no topo da janela e arrast-la para fora da janela do Editor de Cdigos. A figura a seguir mostra a janela do Code Explorer, aps ser destacada do Editor de Cdigos.

Figura 2.28: A janela do Code Explorer, destacada da janela do Editor de Cdigos.

Voc pode ancorar essa janela em qualquer janela do ambiente, como no Object Inspector, por exemplo. Para isso, basta selecionar a barra horizontal superior da janela do Code Explorer com o boto esquerdo do mouse, arrast-la e solt-la na janela em que deseja ancor-la. A figura a seguir mostra a janela do Code Explorer ancorada no Object Inspector.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

35

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.29: A janela do Code Explorer, ancorada na janela do Object Inspector.

Conforme descrito anteriormente, a janela do Code Explorer exibe uma rvore hierrquica que mostra os tipos, classes, propriedades, variveis e rotinas globais, alm dos nomes das units listadas na clusula Uses da unit corrente. O Code Explorer permite que se acesse o trecho de cdigo no qual definido um tipo de dado ou declarada uma funo dando-se um duplo clique com o boto esquerdo do mouse sobre o item desejado na rvore hierrquica do Code Explorer. Esse recurso muito til quando se est trabalhando com unidades de cdigo extensas, nas quais se deseja localizar o trecho de cdigo no qual declarado um tipo, uma varivel, ou implementada uma funo. Alm disso, a janela do Code Explorer possui o recurso de pesquisa incremental, isto , voc pode localizar um item, digitando o seu nome quando a janela do Code Explorer possui o foco.

DESABILITANDO O RECURSO DE ANCORAGEM DE JANELAS


Existem situaes em que voc pode preferir mover uma janela pelo ambiente de desenvolvimento sem que esta possa ser ancorada em alguma outra. Para desabilitar esse recurso, voc deve executar os seguintes procedimentos: 1. Selecionar a janela para a qual deseja desabilitar esse recurso. 2. Selecionar o boto direito do mouse sobre essa janela, para exibir o seu menu pop-up. 3. Desmarcar o item Dockable desse menu pop-up.

36 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 O AMBIENTE DE DESENVOLVIMENTO INTEGRADO DO DELPHI 7

GARANTINDO A VISIBILIDADE DE UMA JANELA


Existem situaes em que voc pode preferir manter uma janela permanentemente visvel no ambiente de desenvolvimento, evitando a sua sobreposio por outras janelas. Para habilitar esse recurso, voc deve executar os seguintes procedimentos: 1. Selecionar a janela para a qual deseja habilitar esse recurso. 2. Selecionar o boto direito do mouse sobre essa janela, para exibir o seu menu pop-up. 3. Selecionar o item Stay on Top desse menu pop-up, como mostrado na figura a seguir.

Figura 2.30: Selecionando o item Stay on Top do Object Inspector.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

37

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

38 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

Captulo
Fundamentos da Linguagem Object Pascal

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

39

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero examinados o cdigo gerado pelo ambiente de desenvolvimento do Delphi 7, e os conceitos de variveis, classes e objetos da linguagem Object Pascal a linguagem de programao empregada pelo ambiente de desenvolvimento do Delphi 7. Os conceitos apresentados ajudaro a esclarecer algumas dvidas que o leitor ainda possa ter aps a leitura do captulo anterior.

FUNDAMENTOS EM: ESTRUTURA DE UMA UNIDADE DE CDIGO (UNIT)


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7.

METODOLOGIA
Apresentao e descrio dos elementos que compem uma unit.

EXAMINANDO O CDIGO DE UMA UNIDADE DE CDIGO (UNIT) GERADO PELO DELPHI 7


No final do captulo anterior, iniciamos o projeto do aplicativo-exemplo que ser desenvolvido ao longo desta primeira parte do livro. Por enquanto, a aplicao o projeto Clube consiste em um nico formulrio e seu arquivo de cdigo associado (que foi salvo com o nome UnitPrincipal.pas). A seguir, apresentamos os arquivos de cdigo gerados pelo Delphi 7, com os quais trabalharemos ao longo deste captulo. Arquivo de cdigo gerado pela VCL:
unit UnitPrincipal; interface unit UnitPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} end.

40 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


Arquivo de cdigo gerado pela CLX:
unit UnitPrincipal; interface uses SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms, QDialogs, QStdCtrls; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.xfm} end.

Inicialmente observa-se a palavra reservada unit seguida do nome do arquivo em que a unit est armazenada (j discutido no captulo anterior). Nos prximos tpicos, ser detalhado o significado de cada uma das outras linhas de cdigo, automaticamente geradas pelo Delphi 7, e sero apresentados os tipos de dados predefinidos da linguagem Object Pascal.

EXAMINANDO AS SEES DE UMA UNIT


Na linha seguinte que define o nome da unit, tem-se a palavra-chave interface, que, juntamente com a palavra-chave implementation, define as duas principais sees de uma unit. Na seo Interface so declarados os tipos de dados, classes, variveis, funes e procedimentos que podem ser acessados por outras units. Na seo Implementation so declarados os tipos de dados, classes, variveis, funes e procedimentos que no podem ser acessados por outras units. Nessa seo tambm so implementadas as funes e procedimentos cujo cabealho declarado na seo Interface. Alm dessas duas sees, voc pode incluir, opcionalmente, mais duas, denominadas Initialization e Finalization. Na seo Initialization so includos comandos de atribuies de valores a variveis, que devem ser processados assim que a aplicao for inicializada. A seo Finalization, por outro lado, armazena os comandos que devem ser executados quando a aplicao finalizada (estas duas sees no so criadas automaticamente pelo Delphi 7).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

41

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

ACESSANDO TIPOS E VARIVEIS DEFINIDOS EM OUTRAS UNITS


Aps a palavra-chave interface, tem-se o seguinte trecho de cdigo: Numa unit gerada com o uso da VCL:
uses uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

Numa unit gerada com o uso da CLX:


uses SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms, QDialogs, QStdCtrls;

A palavra uses outra palavra reservada da linguagem Object Pascal e define as units que sero utilizadas pela unit corrente. Repare que o ambiente j incluiu diversas units nessa clusula uses. No caso da VCL, por exemplo, foi includa a unit Windows (na qual esto armazenadas as declaraes das funes da API do Windows). Se voc remover a unit Windows da clusula uses da unit, no ter mais acesso s funes da API do Windows. Voc tambm pode, opcionalmente, incluir uma clusula uses na seo Implementation de uma unit. Isso evita problemas como referncia circular e impede que as units referenciadas nessa clusula uses sejam acessadas por outros usurios (lembre-se de que nada que declarado na seo Implementation pode ser visto por outras unidades de cdigo que usam essa unit).

FUNDAMENTOS EM: DECLARAO DE VARIVEIS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7.

METODOLOGIA
Apresentao e descrio dos conceitos de variveis, bem como dos tipos predefinidos da linguagem Object Pascal.

TCNICA
Apresentao dos procedimentos necessrios declarao de variveis e tipos na linguagem Object Pascal.

O CONCEITO DE VARIVEIS
Em um programa de computador, dados so armazenados em variveis. Na linguagem Object Pascal, a declarao de uma varivel de um determinado tipo feita na seo var de uma unit (ou de uma funo ou procedure, no caso de se desejar criar uma varivel local, conforme ser visto posteriormente) e obedece seguinte sintaxe:
var Nome_varivel: Tipo_da_varivel;

Voc pode declarar simultaneamente mais de uma varivel de um mesmo tipo. Nesse caso, os nomes das variveis devem vir separados por vrgulas, obedecendo seguinte sintaxe:

42 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


var Nome_varivel1, Nome_varivel2,..., Nome_variveln: Tipo_da_varivel;

Nos trechos de cdigo exemplificados anteriormente, a palavra reservada var (que j existe na unit gerada) foi includa apenas para tornar mais claro o contexto em que uma varivel declarada.

Os nomes das variveis devem comear com uma letra ou um caractere sublinhado (_), seguidos por uma seqncia de letras, dgitos ou caracteres sublinhados, e no podem conter espaos em branco ou caracteres especiais como $,%, acentuao e operadores aritmticos.

ATRIBUINDO UM VALOR A UMA VARIVEL


Para atribuir um valor a uma determinada varivel, voc deve usar o comando de atribuio da linguagem Object Pascal, que apresenta a seguinte sintaxe:
nome_variavel:= valor;

Nesse caso, conforme descrito anteriormente, o sinal de igualdade precedido de dois-pontos denominado operador de atribuio. O programador novato no deve estranhar a utilizao da seguinte linha de cdigo:
X := X + 1;

Evidentemente, se nesse caso o sinal de igual estivesse realmente representando a igualdade entre dois valores, essa equao seria matematicamente absurda. Entretanto, se considerarmos que, nesse caso, esse sinal est funcionando como um operador de atribuio, a expresso anterior passa a ter sentido, pois, nesse caso, estamos atribuindo varivel X o valor armazenado nessa varivel, acrescido de uma unidade. Essa expresso deve ser entendida da seguinte maneira: Obtenha o valor armazenado na varivel X, acrescente uma unidade a esse valor e atribua o resultado varivel X. Conseqentemente, analisando-a como um comando de atribuio, essa expresso passa a ter sentido.

TIPOS DE DADOS PREDEFINIDOS NA LINGUAGEM OBJECT PASCAL


Na linguagem Object Pascal esto definidos os seguintes tipos de dados predefinidos (tipos de variveis):

TIPOS DE VARIVEIS INTEIRAS


Tipo Integer Cardinal Shortint Faixa de Valores 2147483648..2147483647 0..4294967295 128..127 Formato 32 bits 32 bits, sem sinal 8 bits

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

43

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Tipo Smallint Longint Int64 Byte Word Longword

Faixa de Valores 32768..32767 2147483648..2147483647 2^63..2^631 0..255 0..65535 0..4294967295

Formato 16 32 64 8 bits, sem sinal 16 bits, sem sinal 32 bits, sem sinal

TIPOS DE VARIVEIS REAIS


Tipo Real48 Single Double Extended Comp Currency Faixa de Valores 2.9 x 10^39 .. 1.7 x 10^38 1.5 x 10^45 .. 3.4 x 10^38 5.0 x 10^324 .. 1.7 x 10^308 3.6 x 10^4951 .. 1.1 x 10^4932 2^63+1 .. 2^63 1 922337203685477.5808.. 922337203685477.5807 Dgitos Significativos 1112 78 1516 1920 1920 1920 Tamanho (Bytes) 6 4 8 10 8 8

O tipo genrico Real equivalente a double.

TIPOS DE VARIVEIS BOOLEANAS


Tipo Boolean ByteBool WordBool LongBool Faixa de Valores False ou True (0 ou 1) * * *

(*) Esses tipos so definidos apenas por questo de compatibilidade com outras linguagens de programao. Uma varivel booleana pode assumir apenas os valores ordinais 0 e 1, ao passo que os demais tipos podem assumir quaisquer valores ordinais. Nesses casos, a expresso ser falsa se seu valor ordinal for 0, e verdadeira quando esse valor for diferente de 0 (como ocorre nas linguagens C e C++).

TIPOS DE VARIVEIS PARA MANIPULAO DE CARACTERES


Na linguagem Object Pascal, caracteres e strings literais so delimitados por aspas simples. Para a manipulao de textos, compostos de um ou mais caracteres, a linguagem Object Pascal apresenta os tipos de variveis listados a seguir:

44 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


Char: Tipo alfanumrico que pode armazenar um caractere ASCII. AnsiChar: Tipo alfanumrico que pode armazenar um caractere ASCII (8 bits). WideChar: Tipo alfanumrico que pode armazenar um caractere Unicode (16 bits). ShortString: Tipo alfanumrico que tem como contedo uma cadeia de at 255 caracteres. AnsiString: Tipo alfanumrico que tem como contedo uma cadeia ilimitada de caracteres (Char). WideString: Tipo alfanumrico que tem como contedo uma cadeia ilimitada (na verdade h um limite, definido pela memria disponvel) de caracteres (WideChar). A linguagem Object Pascal suporta ainda as strings de terminao nula, cujo trmino indicado pelo caractere #0 (NULL). Esse tipo de string deve ser utilizado apenas em casos em que for realmente necessrio, em chamadas das funes que necessitam de parmetros do tipo PChar (ponteiro para caractere) como, por exemplo, quando se utilizam, no caso de se estar usando a VCL, chamadas a funes da API do Windows ou funes exportadas por DLLs criadas em outras linguagens para este ambiente. Voc pode manipular esse tipo de dado criando arrays do tipo Char, AnsiChar e WideChar, nas quais o caractere NULL ser armazenado na posio que indica o final da string. Outra alternativa consiste em utilizar as funes de manipulao de string, a serem vistas posteriormente.

TIPOS DE VARIVEIS PARA MANIPULAO DE ARQUIVOS


Para a manipulao de arquivos, a linguagem Object Pascal apresenta a palavra reservada File, que pode ser usada para criar um tipo a ser utilizado para representar um arquivo. O tipo File consiste em uma seqncia linear de valores de um determinado tipo (que pode ser qualquer tipo de varivel, exceto o prprio tipo File), incluindo-se uma classe ou um tipo estruturado definido pelo programador. Para criar uma varivel para representar um arquivo destinado a armazenar valores de um determinado tipo, deve-se incluir uma linha de cdigo com a seguinte sintaxe, na seo var de uma unit (ou de procedure ou funo, no caso de varivel local):
nome_da_varivel: File of Tipo;

Por exemplo, para criar uma varivel denominada arq_real, para representar um arquivo destinado a armazenar nmeros reais, deve ser usada a seguinte declarao:
arq_real: File of Real;

Para armazenar texto no formato ASCII, existem os tipos predefinidos Text e TextFile. Os dois so equivalentes. Nesse caso, a declarao correspondente seria:
arq_text: TextFile;

Existem funes especficas para manipulao de arquivos, que sero abordadas ainda neste captulo, aps os tpicos correspondentes s funes e procedimentos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

45

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

TIPO GENRICO DE VARIVEIS


A linguagem Object Pascal apresenta um tipo genrico de varivel, denominado Variant, e que ser descrito a seguir. O tipo Variant pode armazenar qualquer tipo predefinido de varivel durante a execuo do aplicativo. Esse tipo foi introduzido na verso 2.0 do Borland Delphi, mas apresenta como desvantagens um maior consumo de memria para armazenar um valor e de tempo para executar uma operao. Deve ser utilizado quando no se conhece, a priori, o tipo de valor que ser armazenado na varivel. Cabe a voc, desenvolvedor, considerar as vantagens e desvantagens de se utilizar variveis desse tipo.

COMENTRIOS
Os comentrios constituem pores de texto cuja finalidade documentar o cdigo de um programa, sendo eventualmente empregado como recurso para a depurao de programas. A linguagem Object Pascal admite dois tipos de comentrios:

COMENTRIOS DE UMA NICA LINHA


Este tipo de comentrio identificado por duas barras inclinadas. A partir destas duas barras, tudo o que for escrito na mesma linha ser tratado como um comentrio. Exemplo:
// isto um comentrio de uma nica linha

COMENTRIOS DE MLTIPLAS LINHAS


A linguagem Object Pascal admite dois tipos de comentrios de mltiplas linhas. A primeira opo consiste em colocar o texto entre chaves de abertura { e de fechamento }. Exemplo:
{ isto um comentrio de mltiplas linhas }

A segunda opo consiste em colocar o texto entre os seguintes identificadores: Parnteses-asterisco para incio do comentrio e asterisco-parnteses para o seu trmino.
(* isto um comentrio de mltiplas linhas *)

DEFININDO NOVOS TIPOS DE DADOS


Logo aps a clusula uses da seo Interface de uma unit, aparece a palavra-chave type. Esse identificador usado para definir novos tipos de dados, conforme ser descrito nos tpicos a seguir.

46 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

TIPOS DE DADOS ENUMERADOS


Um tipo de dado enumerado consiste em um grupo com um nmero finito de elementos, separados por vrgulas e inseridos entre um par de parnteses. Por exemplo, para se criar um tipo de dado enumerado chamado semana, cujos elementos so os dias da semana, deve-se incluir a seguinte linha de cdigo aps a palavra-chave type:
semana = (Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado);

Esse tipo de dado ainda apresenta uma caracterstica interessante: seus elementos tm uma relao de ordem, isto , Domingo menor que Segunda, que menor que Tera, e assim por diante. Podemos, ento, declarar uma varivel denominada dia, do tipo semana, incluindo a sua declarao aps a palavra-chave var:
var dia: semana;

Essa varivel pode, portanto, receber qualquer um dos valores definidos no seu tipo, como, por exemplo:
dia:= Quarta;

CONJUNTOS
Um conjunto muito parecido com um tipo de dado enumerado, mas, nesse caso, a ordem dos elementos no importante. Alm disso, uma varivel de um tipo definido como um conjunto pode armazenar vrios elementos de um conjunto (podendo inclusive no armazenar qualquer dos elementos caso em que se obtm um conjunto vazio). Para criar um tipo de dado como um conjunto, voc deve incluir, aps a palavra reservada type, uma linha de comando com a seguinte sintaxe:
nome_do_tipo = set of tipo_j_definido;

A palavra reservada set indica que est sendo criado um conjunto baseado em um tipo ordinal j definido (pode ser um dos tipos fundamentais da linguagem Object Pascal, ou um tipo definido pelo desenvolvedor). Por exemplo, para criar um tipo conjunto denominado letras, poderamos considerar o seguinte trecho de cdigo:
type letras = set of Char;

Podemos, ento, declarar uma varivel denominada consoante, do tipo letras, incluindo a sua declarao aps a palavra-chave var, como exemplificado a seguir.
var consoante: letras;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

47

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


A atribuio de valores a uma varivel definida como um conjunto feita colocando-se os elementos do conjunto entre colchetes, como mostrado a seguir.
consoante:= [b,c, d, f, g, h, j, l, m, n, p, q, r, s, t, v, x, z] ;

Para criar um conjunto vazio, basta incluir o seguinte trecho de cdigo:


letras:= [ ];

Voc pode realizar operaes sobre conjuntos, tal qual se faz na matemtica. Apresentamos, a seguir, as operaes definidas para o tipo Set:

Operador + * <= >= = <> in

Significado unio diferena interseo subconjunto superconjunto igualdade desigualdade pertinncia

Exemplo Letras1 + Letras2 ou [a, b] + [c, d] Letras1 Letras2 ou [a, b] [c, d] Letras1 * Letras2 ou [a, b] * [a, e] Letras1 <= Letras2 ou [a, b] <= [a, d] Letras1 >= Letras2 ou [a, b] >= [a, d] Letras1 = Letras2 ou [a, b] = [a, d] Letras1 <> Letras2 ou [a, b] <> [a, d] char in Letras1 ou a in [a, d]

A operao de unio retorna um conjunto cujos elementos esto contidos em qualquer dos operandos. A operao de diferena retorna um conjunto cujos elementos esto contidos no primeiro operando, mas no esto presentes no segundo. A operao de interseo retorna um conjunto cujos elementos esto obrigatoriamente contidos simultaneamente nos dois operandos. A operao de subconjunto corresponde ao est contido que aprendemos na matemtica colegial, e retorna true ou false, conforme o primeiro operando seja ou no um subconjunto do segundo operando, isto , se todo e qualquer elemento do primeiro operando est presente no segundo. A operao de superconjunto corresponde ao contm que aprendemos na matemtica colegial, e retorna true ou false, conforme o primeiro operando seja ou no um superconjunto do segundo operando, isto , se todo e qualquer elemento do segundo operando est presente no primeiro. A operao de igualdade retorna true ou false. Retorna true se todo elemento do primeiro operando estiver presente no segundo e vice-versa, retornando false em caso contrrio. A operao de desigualdade retorna true ou false. Retorna true se ao menos um elemento do primeiro operando no estiver presente no segundo e vice-versa, retornando false em caso contrrio.

48 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


O operador in verifica se o elemento representado pelo primeiro operando est presente no conjunto representado pelo segundo operando, retornando false em caso contrrio.

VARIVEIS COMPOSTAS
A linguagem Object Pascal permite que se definam tipos compostos de variveis, denominados registros, aos quais pertence um conjunto de variveis de tipos distintos. Isso feito mediante a incluso de um trecho de cdigo na seo type de uma unit, e que apresenta a seguinte sintaxe:
nome_do_tipo = varivel1: varivel2: ...... variveln: end; Record primeiro_tipo; segundo_tipo; n-zimo_tipo;

As variveis varivel1, varivel2, ..., variveln contidas no registro so denominadas campos do registro. Podem ser de qualquer tipo, inclusive objetos de classes definidas no ambiente ou pelo prprio desenvolvedor (a definio de uma classe ser apresentada nos prximos tpicos). Para declarar uma varivel desse tipo, devemos proceder da mesma forma que faramos se quisssemos declarar uma varivel de qualquer tipo predefinido, bastando que se inclua, aps a palavra reservada var, uma linha de cdigo como:
Nome_varivel: nome_do_tipo;

Para acessar um campo de uma varivel composta, devemos usar a chamada notao de ponto, que pode ser descrita como:
nome_da_variavel.nome_do_campo;

Por exemplo, para criar um tipo de varivel composta chamada materia, poderamos definir o seguinte trecho de cdigo, aps a palavra reservada type:
materia= Record Livro_Texto: string; carga_horaria: integer; end;

Podemos, ento, declarar uma varivel chamada matematica, do tipo materia, incluindo a sua declarao aps a palavra reservada var:
var matematica: materia;

Para atribuir valores aos seus campos, basta incluir as seguintes linhas de cdigo:
matematica.Livro_Texto:= Matematica para Principiantes; matematica.carga_horaria:= 75;

VETORES (ARRAYS)
Os vetores ou arrays so grupos de variveis com mesmo nome, mas diferenciados por um ndice, sendo teis para armazenar uma grande quantidade de dados de um mesmo tipo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

49

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Para criar um tipo de dado como um vetor, voc deve incluir, aps a palavra reservada type, uma linha de comando com a seguinte sintaxe:
nome_do_tipo: array[i1..i2] of tipo_da_varivel;

Onde i1 e i2 determinam os valores mnimo e mximo do ndice, respectivamente. Por exemplo, para criar um tipo chamado letras como um vetor, poderamos definir o seguinte trecho de cdigo:
type letras = array[1..23] of Char;

Podemos, ento, declarar uma varivel denominada alfabeto, do tipo letras, incluindo a sua declarao aps a palavra reservada var, como mostra o trecho de cdigo a seguir.
var alfabeto: letras;

A atribuio de valores a uma varivel definida como um vetor feita independentemente para cada um dos seus elementos, indicando-se o seu ndice entre colchetes, como mostramos a seguir.
alfabeto[1]:= a; alfabeto[2]:= b; alfabeto[3]:= c;

A linguagem Object Pascal tambm suporta diretamente o conceito de arrays dinmicos (cujas dimenses podem ser alteradas durante a execuo do aplicativo). A declarao de um array dinmico feita mediante a incluso de uma linha de cdigo que apresenta a seguinte sintaxe:
var A : array of integer; // Declara um array unidimensional de inteiros. B : array of array of real; // Declara um array bidimensional de nmeros reais. C : array of array of array of char; // Declara um array tridimensional de caracteres.

A simples declarao no aloca memria para o array, o que feito mediante uma chamada ao procedimento SetLength. Esse procedimento, declarado na unit System, recebe como parmetros o nome do array e as suas novas dimenses. Poderamos, por exemplo, alocar memria para os arrays descritos anteriormente mediante a incluso do seguinte trecho de cdigo:
SetLength(A,20); SetLength(B,20,5); SetLength(C,20,10,15);

importante deixar claro para o leitor que, para arrays dinmicos, o ndice de cada dimenso comea em 0, e no em 1, como poderia indicar a nossa intuio. Para atribuir um valor a um elemento do array multidimensional C, deve-se utilizar a seguinte linha de cdigo:
C[4,3,7]:= k;

50 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


O procedimento SetLength tambm pode ser usado para definir o nmero de caracteres de uma string definida como ShortString e para redimensionar um array durante a execuo do aplicativo (nesse caso, os valores existentes no array so preservados quando sua dimenso aumenta). Para liberar a memria alocada para um array, existem duas alternativas: Atribuir o valor nil varivel que representa o array. Passar o nome da varivel que define o array em uma chamada ao procedimento Finalize (tambm definido na unit System).

OPERADORES ARITMTICOS
Na linguagem Object Pascal, voc pode realizar operaes aritmticas sobre variveis, e os seguintes operadores esto disponveis:

Operador * / + div mod

Significado Multiplicao Diviso (entre duas variveis reais) Soma (ou concatenao, no caso de strings) Subtrao Diviso (entre duas variveis inteiras) Resto da diviso entre duas variveis inteiras

Voc pode realizar uma operao aritmtica entre duas variveis e atribuir o resultado a uma terceira varivel, mediante a incluso de uma linha de cdigo com a seguinte sintaxe:
variavel3:= varivel1 op variavel2;

Onde op um dos operadores aritmticos descritos anteriormente. importante respeitar a precedncia dos operadores, que pode ser alterada mediante a utilizao de parnteses. A seguir apresentamos a ordem de precedncia dos diversos operadores:

Operador @, not *, /, div, mod, and, shl, shr, as +, , or, xor =, <>, <, >, <=, >=, in, is

Ordem de Precedncia 1 2 3 4

Os operadores + e -, quando aplicados a um nico operando (como operadores unrios, indicando o sinal de um nmero ou varivel), possuem ordem de precedncia igual a 1.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

51

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Alguns desses operadores ainda no foram apresentados, e sero vistos ao longo do livro. O operador @, por exemplo, utilizado para obter o endereo de uma varivel (e que provavelmente ser atribudo a uma varivel do tipo ponteiro). Operadores com maior precedncia (os primeiros da tabela) so executados antes dos de menor precedncia. Operadores com mesma ordem de precedncia em uma expresso so executados da esquerda para a direita. A expresso seguinte, por exemplo, resultaria no valor 28:
X := 8 + 5 * 4;

Caso voc queira que a adio seja executada antes da multiplicao, deve incluir parnteses para alterar a ordem de precedncia, como a seguir (o resultado, nesse caso, seria a atribuio do valor 52 varivel X):
X := (8 + 5) * 4;

TIPOS ORDINAIS
Definem-se como ordinais os tipos de variveis cujos valores tm uma relao de ordem entre si. Dentre os tipos ordinais podem-se destacar os tipos integer e char, por exemplo. Entre duas variveis de um mesmo tipo ordinal podem-se estabelecer comparaes do tipo menor que (<), maior que (>), etc. Existem funes especficas para os tipos ordinais, que sero abordadas ainda neste captulo, aps os tpicos correspondentes s funes e procedimentos.

ESCOPO E TEMPO DE VIDA DAS VARIVEIS


Define-se como escopo de uma varivel o conjunto de trechos de cdigo nos quais a varivel visvel (isto , pode ser acessada).

VARIVEIS LOCAIS
Na linguagem Object Pascal, quando uma varivel for declarada dentro de uma funo ou procedimento, ela somente ser visvel dentro da prpria rotina (procedimento ou funo), isto , ter escopo local. Se, em outra funo ou procedimento, voc declarar uma varivel com o mesmo nome, uma no tomar conhecimento da existncia da outra, no havendo relao alguma entre elas, ou qualquer tipo de interferncia. Conseqentemente, os dados tratados dentro de um procedimento ou funo esto protegidos contra intervenes externas. Quando uma varivel definida em uma funo ou procedimento, diz-se que essa varivel tem o escopo da funo ou procedimento (a varivel local funo ou procedimento), excetuando-se o caso em que a varivel definida como um parmetro que passado por referncia (precedido pela palavra reservada var).

52 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


A criao de variveis locais a procedimentos ser descrita no tpico correspondente.

VARIVEIS GLOBAIS A UMA UNIDADE DE CDIGO


Existem situaes em que necessrio compartilhar dados entre funes ou procedimentos dentro de uma mesma unidade de cdigo (unit). Voc precisa, nesse caso, de variveis que sejam acessveis (visveis) em toda a unidade de cdigo (unit). Essas variveis so ditas globais unit e devem ser declaradas aps a palavra reservada var na seo Interface da unit (antes da palavra reservada implementation). Quando voc quiser que uma varivel declarada com o escopo de uma unit seja acessada por outra unit, essa ltima unit deve incluir o nome da primeira (que contm a declarao da varivel) em sua clusula uses. D preferncia s variveis locais em seus programas, que, dessa maneira, ficaro mais estruturados, legveis e com dados protegidos contra alteraes acidentais. Precisando compartilhar dados entre sub-rotinas ou procedimentos, d preferncia s variveis com escopo de uma unit. S permita que uma unit acesse os dados das variveis declaradas em outra quando isso for estritamente necessrio e lembre-se de que, se existirem duas variveis com o mesmo nome e escopos diferentes, todas as referncias ao nome da varivel sero referncias varivel declarada localmente.

CRIAO DE VARIVEIS GLOBAIS A UMA APLICAO


Variveis globais so aquelas que so acessveis (visveis) em todas as units, funes e procedimentos. Para declarar um conjunto de variveis globais a uma aplicao, proceda da seguinte forma: 1. Crie uma nova unit para a sua aplicao. 2. Inclua o nome dessa unit na clusula uses de todas as outras units. Pronto! As variveis declaradas na seo Interface dessa unit sero acessadas em todo o cdigo da aplicao. recomendvel que voc salve essa unit com um nome fcil de ser memorizado, como global.pas, por exemplo. O tpico seguinte mostra como adicionar uma unit para armazenar as variveis globais de uma aplicao.

ADICIONANDO UMA NOVA UNIT AO PROJETO PARA ARMAZENAMENTO DE VARIVEIS GLOBAIS


Um projeto de aplicao no composto apenas por formulrios, mas tambm inclui unidades de cdigo (as units). Quando voc cria um novo formulrio, o ambiente cria automaticamente uma unit associada a esse formulrio. Nada impede, no entanto, que voc inclua no projeto da sua aplicao novas unidades de cdigo que sejam independentes de formulrios. Essas unidades de cdigo podem ser usadas para armazenar tipos especiais de classes, funes, procedimentos e variveis. No caso da VCL, por exemplo, as units Windows.pas e System.pas definem uma quantidade enorme de funes e no esto associadas a nenhum formulrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

53

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Para criar uma unit independente, proceda da seguinte forma: 1. Selecione a opo New/Other do menu File do Delphi 7. Ser exibida a caixa de dilogo New Items (Figura 3.1). 2. Selecione a guia New. 3. Selecione o cone correspondente opo Unit. 4. Clique no boto OK, para fechar a caixa de dilogo. Ser criada uma nova unit (independente de qualquer formulrio), na qual podem ser definidas as novas classes, funes e procedimentos.

Figura 3.1: A caixa de dilogo New Items do Delphi 7.

FUNDAMENTOS EM: BLOCOS DE COMANDOS, ESTRUTURAS CONDICIONAIS E DE REPETIO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7.

METODOLOGIA
Apresentao e descrio dos elementos de sintaxe necessrios criao dos blocos de comandos e das estruturas condicionais e de repetio.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao dos blocos de comandos e das estruturas condicionais e de repetio da linguagem Object Pascal.

ALTERANDO O FLUXO DE EXECUO DO PROGRAMA


Desde os primrdios da computao, as estruturas condicionais e de repetio tm sido fundamentais para que o fluxo dos sistemas possa variar em funo de determinadas condies. Essas estruturas esto presentes na totalidade das linguagens de programao, e a linguagem Object Pascal no seria uma exceo.

54 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

BLOCOS DE COMANDOS
Na linguagem Object Pascal, um bloco de comandos constitudo por um conjunto de linhas de cdigo, que comea com a palavra reservada begin e termina com a palavra reservada end, seguida de um ponto-e-vrgula (;). Um bloco de comandos definido pela sintaxe:
begin {Instrues do Bloco de comandos} end;

A palavra reservada end s no deve ser seguida por um ponto-e-vrgula nas seguintes situaes: Antes da palavra reservada else, em uma estrutura condicional do tipo if-then-else (a ser abordada nos prximos tpicos). No final de uma unit (o end que encerra uma unit seguido por um ponto).

ESTRUTURAS CONDICIONAIS
Existem situaes em que se deseja executar um trecho de cdigo, apenas se uma determinada condio for verdadeira, e um outro trecho de cdigo, caso a condio testada seja falsa. Na linguagem Object Pascal, isso obtido utilizando-se as estruturas condicionais if-then-else e case of, descritas a seguir.

ESTRUTURA CONDICIONAL IF-THEN-ELSE


A estrutura condicional if-then-else da linguagem Object Pascal apresenta a seguinte sintaxe:
if (condio) then begin {Bloco de comandos executados se a condio for verdadeira} end else begin {Bloco de comandos executados se a condio for falsa} end;

Caso voc no queira executar qualquer comando se a condio for falsa, basta suprimir o trecho de cdigo correspondente clusula else, como mostrado no trecho de cdigo a seguir.
if (condio) then begin {Bloco de comandos executados se a condio for verdadeira} end;

Nunca coloque um ponto-e-vrgula antes da palavra reservada else. Isso gerar um erro de compilao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

55

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Nos casos em que um bloco de comando formado por uma nica linha de cdigo, podem-se suprimir as palavras begin e end, como mostram os trechos de cdigo a seguir.
if (condio) then {Comando executado se a condio for verdadeira} else {Comando executado se a condio for falsa};

e:
if (condio) then {Comandos executados se a condio for verdadeira}

ESTRUTURA CONDICIONAL CASE OF


A estrutura condicional case of da linguagem Object Pascal tem a seguinte sintaxe:
case <expresso> of Valor_1: <Bloco de comandos> Valor_2: <Bloco de comandos> ........................... Valor_n: <Bloco de comandos> else: <Bloco de comandos> end;

Nesse caso, se a expresso testada for igual a um dos valores especificados (Valor_1, Valor_2,..., Valor_n), ser executado o bloco de comandos a ele correspondente. Caso nenhum desses valores seja igual ao definido pela expresso testada, o bloco de comandos correspondente palavra reservada else ser executado.

A expresso avaliada em uma estrutura condicional case of deve ser de um tipo ordinal.

TESTES CONDICIONAIS
Nos tpicos anteriores foram apresentadas as estruturas condicionais da linguagem Object Pascal. Nessas estruturas, a condio a ser testada deve retornar o valor False (falso) ou True (verdadeiro). Quando a condio a ser testada uma varivel booleana, a sua verificao imediata. Existem situaes, no entanto, em que o resultado da condio advm de uma relao entre dois operandos. Quando for esse o caso, devem-se usar os operadores relacionais da linguagem Object Pascal, mostrados nos tpicos a seguir.

OS OPERADORES RELACIONAIS
A linguagem Object Pascal tem os seguintes operadores relacionais:

56 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

Operador = (igual): <> (diferente): < (menor): <= (menor ou igual): > (maior): >= (maior ou igual): in (pertinncia):

Finalidade Usado para testar se dois valores so iguais. Usado para testar se dois valores so diferentes. Usado para testar se um valor menor do que outro. Usado para testar se um valor menor ou igual a outro. Usado para testar se um valor maior do que outro. Usado para testar se um valor maior ou igual a outro. Verifica se um valor pertence ou no a um conjunto.

O trecho de cdigo a seguir, por exemplo, compara o valor de duas variveis e exibe uma mensagem em funo do resultado obtido.
if (a < b) then Showmessage(a menor que b) else Showmessage(a maior ou igual a b);

ESTRUTURAS DE REPETIO
Quando um mesmo tipo de comando (ou bloco de comandos) precisa ser executado repetidamente, podese economizar a sua codificao usando-se uma das estruturas de repetio da linguagem Object Pascal. A linguagem Object Pascal tem os seguintes tipos de estruturas de repetio: Laos For Laos While Laos Repeat

LAOS FOR
Essa estrutura de repetio bastante til quando se deseja que a execuo de um bloco de comandos seja repetida um nmero predeterminado de vezes. Essa estrutura apresenta a seguinte sintaxe:
for contador:= valor_inicial to valor_final do <bloco de comandos>

Onde: contador: uma varivel ordinal enumervel, normalmente inteira. valor_inicial: o valor inicial do contador, geralmente um nmero inteiro. valor_final: o valor final assumido pelo contador, geralmente um nmero inteiro. bloco de comandos: uma seqncia de comandos que comea com a palavra reservada begin e termina com a palavra reservada end.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

57

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Desse modo, a varivel inteira contador varia desde o valor inicial at o valor final, em incrementos unitrios e, para cada incremento, executa o bloco de comandos que se inicia na linha seguinte. Caso se queira que o contador assuma valores decrescentes, deve-se usar a seguinte sintaxe:
for contador:= valor_inicial downto valor_final do <bloco de comandos>

Nesse caso, evidentemente, o valor inicial deve ser superior ao valor final. O contador pode ser qualquer tipo ordinal enumervel. O cdigo abaixo, por exemplo, perfeitamente vlido (embora possa no ser muito til).
for contador:= a to z do Showmessage(contador);

A varivel contador, nesse caso, deve ser declarada como sendo do tipo char.

LAOS WHILE
Essa estrutura de repetio bastante til quando se deseja que a execuo de um bloco de comandos seja repetida enquanto uma determinada condio for verdadeira. Essa estrutura de repetio apresenta a seguinte sintaxe:
while <condio> do <bloco de comandos>

Observe que, se a condio for falsa na primeira vez em que a estrutura de repetio for acessada, o bloco de comandos no ser executado nenhuma vez. Essa estrutura de repetio muito til quando se quer, por exemplo, ler as informaes a partir de um arquivo, pois, nesse caso, no se sabe previamente quantas iteraes sero necessrias para ler todo o seu contedo. O seguinte trecho de cdigo pode ser usado:
while not Eof(F1) do begin Read(F1, Ch); Write(F2, Ch); end;

Onde F1 e F2 so variveis de arquivo e Eof uma funo que retorna o valor True, se for alcanado o final do arquivo, e False, em caso contrrio. Portanto, enquanto houver registros a serem lidos no arquivo, isto , enquanto a condio Eof(F1) for falsa (e not Eof(F1) for verdadeira), o bloco de cdigo ser executado, lendo dados de F1 e gravando-os em F2.

LAOS REPEAT
Essa estrutura de repetio bastante til quando se pretende que a execuo de um bloco de comandos seja repetida enquanto uma determinada condio for verdadeira, mas se impe que esse bloco de comandos seja executado ao menos uma vez. Nesse caso, ao contrrio do que ocorre nos laos While,

58 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


a condio testada aps a primeira execuo do bloco de comandos, garantindo que ele seja executado ao menos uma vez. Essa estrutura de repetio apresenta a seguinte sintaxe:
repeat <bloco de comandos> until condio;

CONDIES COMPOSTAS
Existem situaes em que uma condio a ser testada , na realidade, uma combinao de duas ou mais condies. Normalmente, uma condio composta testada usando-se os operadores lgicos da linguagem Object Pascal, apresentados no prximo tpico.

OPERADORES LGICOS DA LINGUAGEM OBJECT PASCAL


A linguagem Object Pascal tem os seguintes operadores lgicos:

Operador not and or xor

Significado Negao e lgico ou lgico ou lgico exclusivo

A tabela a seguir mostra o resultado de expresses em que so usados os operadores lgicos.

Operando A True True False False

Operando B True False True False

not A False False True True

A and B True False False False

A or B True True True False

A xor B False True True False

FUNDAMENTOS EM: FUNES E PROCEDIMENTOS


PR-REQUISITOS
Noes bsicas da utilizao dos ambientes de desenvolvimento do Delphi 7.

METODOLOGIA
Apresentao e descrio dos conceitos e elementos de sintaxe necessrios criao dos procedimentos e funes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

59

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


TCNICA
Apresentao e descrio dos procedimentos necessrios criao de procedimentos e funes na linguagem Object Pascal.

A ESTRATGIA DE DIVIDIR PARA CONQUISTAR


O conceito de procedimentos e funes advm da necessidade de se subdividir um sistema complexo em unidades menores, denominadas sub-rotinas (denominao genrica dada aos procedimentos e funes). Essa estratgia, popularmente conhecida como dividir para conquistar, facilita a manuteno de um sistema e a reutilizao de cdigo em diversos aplicativos. Nos prximos tpicos sero apresentados os procedimentos necessrios definio dos procedimentos e funes na linguagem Object Pascal.

PROCEDIMENTOS (PROCEDURES)
Normalmente, os procedimentos so usados para dividir um programa em blocos menores de cdigo e para armazenar trechos de cdigo utilizados diversas vezes no programa (em vez de se digitar o mesmo trecho de cdigo em cada ponto do programa no qual a sua presena se faz necessria, basta que se inclua uma chamada ao procedimento). Normalmente, o cabealho de um procedimento composto pela palavra reservada procedure, seguida do nome do procedimento, uma lista de parmetros e um ponto-e-vrgula. A definio de um procedimento na linguagem Object Pascal obedece seguinte sintaxe:
procedure nome_do_procedimento (parmetro_1: tipo_1, ,...,parmetro_n: tipo_n) var {declarao de variveis locais ao procedimento} begin {Corpo do procedimento} end;

A palavra reservada var indica o incio do trecho de cdigo em que so declaradas as variveis locais ao procedimento. A declarao de variveis locais termina na linha anterior da palavra reservada begin, que inicia o corpo do procedimento propriamente dito, e que termina com a palavra reservada end, seguida de um ponto-e-vrgula. Um exemplo de procedure muito utilizada no Delphi 7, quando se quer exibir uma mensagem simples para o usurio, a procedure ShowMessage, cuja declarao mostrada a seguir.
procedure ShowMessage(const Msg: string);

Essa procedure tem como nico parmetro uma string a ser exibida em uma caixa de dilogo. Para exibir a mensagem Al pessoal, basta incluir a seguinte linha de cdigo:
Showmessage(Delphi 7);

A mensagem ser exibida em uma caixa de dilogo simples, como mostra a figura a seguir.

60 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

Figura 3.2: Exibindo uma mensagem com a procedure ShowMessage.

O quadro de dilogo gerado pela procedure Showmessage exibe, na sua barra de ttulos, o nome do aplicativo, alm de um boto com o texto OK, usado para fechar a caixa de dilogo. Esse exemplo foi elaborado com um novo projeto, inicialmente denominado Project1.

FUNES
Na linguagem Object Pascal, uma funo muito semelhante a um procedimento, com a diferena de que a chamada a uma funo deve retornar um valor como resultado, e este pode ser atribudo a uma varivel. Alm disso, o resultado de uma chamada a funo pode ser diretamente incorporado a uma expresso aritmtica. Normalmente, o cabealho de uma funo composto pela palavra reservada function, seguida pelo nome da funo, uma lista de parmetros, um sinal de dois-pontos, do tipo de retorno e um ponto-e-vrgula. A definio de uma funo na linguagem Object Pascal obedece seguinte sintaxe:
function nome_da_funo (parmetro_1:tipo_1;...;parmetro_n:tipo_n): tipo_de_retorno; var {declarao de variveis locais funo} begin {Corpo da funo} result:= valor; end;

A palavra reservada var indica o incio do trecho de cdigo em que so declaradas as variveis locais funo. A declarao de variveis termina na linha anterior da palavra reservada begin. A palavra reservada begin inicia o corpo da funo propriamente dita, que termina com a palavra reservada end, seguida de um ponto-e-vrgula. O valor a ser retornado deve ser atribudo a result (uma varivel interna criada automaticamente pelo ambiente) ou ao prprio nome da funo, como indicado. Um grupo de funes bastante til no Delphi 7 o das funes que permitem a converso de tipos. Por exemplo, para converter um nmero real em uma string, deve ser utilizada a funo FloatToStr, que tem o seguinte cabealho:
function FloatToStr(Value: Extended): string;

Como voc pode observar, essa funo recebe um parmetro do tipo Extended e retorna uma string.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

61

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Para converter uma string em um nmero real, deve ser utilizada a funo StrToFloat, que tem o seguinte cabealho:
function StrToFloat(const S: string): Extended;

Nesse caso, a funo recebe um parmetro do tipo string e retorna um nmero real. Tanto para procedimentos como para funes, a clusula var s deve ser includa se voc realmente declarar uma varivel local funo. Caso no se declare nenhuma varivel local, a clusula var deve ser omitida, ou dar origem a um erro de compilao.

FUNES E PROCEDIMENTOS PARA MANIPULAO DE ARQUIVOS REPRESENTADOS POR VARIVEIS


A relao a seguir apresenta as principais funes para manipulao de arquivos representados por uma varivel: Append (var F): Abre o arquivo representado pela varivel F, apenas para escrita no final do arquivo. AssignFile(var F; FileName: string): Associa varivel F o arquivo cujo nome passado como segundo parmetro. CloseFile (var F): Fecha o arquivo representado pela varivel F. EOF (var F): Retorna True, se o arquivo representado pela varivel F est posicionado no seu final, e False, em caso contrrio. Erase (var F): Apaga o arquivo representado pela varivel F. FileSize (var F): Retorna o tamanho, em bytes, do arquivo representado pela varivel F. Read (F, V1 [, V2, ..., Vn]): L elementos de dados em um arquivo representado pela varivel F e os armazena nas variveis v1, v2, ..., vn. Readln ([var F: Text;] V1 [, V2, ..., Vn]): L elementos de dados em uma linha de um arquivo de texto representado pela varivel F e os armazena nas variveis v1, v2, ..., vn. Caso no sejam fornecidos parmetros, o arquivo passa para a linha seguinte. Rename (var F; NewName): Renomeia como NewName o arquivo representado pela varivel F. Reset (var F [: File; RecSize: Word]): Esse procedimento abre o arquivo representado pela varivel F. O parmetro RecSize opcional e especifica o tamanho do registro usado na transferncia de dados. Se for omitido, o valor default 128 usado. Se o arquivo no existir, ocorrer um erro no processamento. Se o arquivo j estiver aberto, ele fechado e reaberto, sendo posicionado no seu incio. Se F representar um arquivo de texto, ele aberto apenas para leitura. Rewrite (var F [: File; RecSize: Word]): Esse procedimento cria o arquivo representado pela varivel. Se o arquivo j existir, seu contedo ser apagado, mesmo que j esteja aberto. Write (F, V1 [, V2,..., Vn]): Escreve, em um arquivo representado pela varivel F, elementos de dados armazenados nas variveis v1, v2, ..., vn. Writeln ([var F: Text;] V1 [, V2, ..., Vn]): Escreve, em uma linha de um arquivo de texto representado pela varivel F, elementos de dados armazenados nas variveis v1, v2, ..., vn.

62 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


Caso no sejam fornecidos parmetros, o arquivo escreve uma linha em branco e passa para a linha seguinte.

FUNES E PROCEDIMENTOS PARA MANIPULAO DIRETA DE ARQUIVOS


A relao a seguir apresenta as principais funes para manipulao direta de arquivos (no associados a uma varivel): ChangeFileExt (const FileName, Extension: string): Muda para Extension a extenso do arquivo cujo nome e/ou path completo so definidos pela string FileName. DeleteFile (const FileName: string): Apaga o arquivo cujo nome e/ou path completo so definidos pela string FileName. Retorna False, se o arquivo no existe, e True, em caso contrrio. ExpandFileName (const FileName: string): Retorna em uma string o path completo e o nome do arquivo definido pela string FileName. ExtractFileDir (const FileName: string): Retorna em uma string o diretrio do arquivo cujo nome e/ou path completo so definidos pela string FileName. ExtractFileDrive (const FileName: string): Retorna em uma string o drive do arquivo cujo nome e/ou path completo so definidos pela string FileName. ExtractFileExt (const FileName: string): Retorna em uma string a extenso do arquivo cujo nome e/ou path completo so definidos pela string FileName. ExtractFileName (const FileName: string): Retorna em uma string apenas o nome do arquivo cujo nome e/ou path completo so definidos pela string FileName. ExtractFilePath (const FileName: string): Retorna em uma string apenas o path completo do arquivo cujo nome e/ou path completo so definidos pela string FileName. FileExists (const FileName: string): Retorna True, se o arquivo cujo nome e/ou path completo so definidos pela string FileName existe, e False, em caso contrrio. FileSearch (const Name, DirList: string): Pesquisa, pelos diretrios definidos no parmetro DirList, um arquivo cujo nome definido pela string Name. O parmetro DirList uma string em que os diretrios de pesquisa devem ser separados por vrgulas. Se o arquivo for encontrado, a funo retorna o path completo do arquivo. RenameFile (const OldName, NewName: string): Renomeia para NewName o arquivo cujo nome definido pela string OldName, retornando True, se a operao realizada com sucesso, e False, em caso contrrio.

FUNDAMENTOS EM: CLASSES E OBJETOS


PR-REQUISITOS
Noes bsicas da utilizao dos ambientes de desenvolvimento do Delphi 7.

METODOLOGIA
Apresentao e descrio dos conceitos de classes e objetos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

63

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


TCNICA
Apresentao e descrio dos procedimentos necessrios criao de classes e objetos na linguagem Object Pascal.

UMA NOVA (MAS J NO TO NOVA) ABORDAGEM


As tcnicas de programao orientada a objetos so a ltima palavra em programao, mudando a forma de concepo de um sistema. A programao orientada a objetos permite que um sistema seja subdividido em entidades denominadas objetos, capazes de representar um sistema de uma forma muito semelhante quela pela qual encaramos o mundo ao nosso redor. Como essa tecnologia se baseia no conceito de classes e objetos, os prximos tpicos apresentam os procedimentos necessrios sua implementao na linguagem Object Pascal.

AS CLASSES E OS OBJETOS
A linguagem Object Pascal uma linguagem de programao orientada a objetos. A expresso POO (Programao Orientada a Objetos) tem tirado o sono de muitos programadores iniciantes, principalmente quando estes resolvem aprender programao orientada a objetos em textos que abordam o tema sob um aspecto bastante filosfico (e pouco didtico). Como este livro se destina a ensinar ao leitor como desenvolver aplicativos utilizando o Delphi 7 como ferramenta de desenvolvimento, e como foge aos nossos objetivos escrever um tratado sobre POO, nos prximos tpicos procuraremos abordar de maneira didtica e sucinta apenas os conceitos bsicos da POO necessrios ao entendimento dos exemplos apresentados ao longo desta primeira parte do livro. Na segunda parte do livro, abordaremos mais detalhadamente as tcnicas de programao orientada a objetos.

O CONCEITO DE CLASSES
Nos tpicos anteriores, mostramos como criar uma varivel composta em Object Pascal. Como voc deve se lembrar, uma varivel composta tem diversos campos, que podem ser de qualquer tipo predefinido da linguagem ou previamente criados pelo programador. Naquele tpico, vimos que, para criar um tipo de varivel composta denominada materia, com os campos Livro_Texto e carga_horaria, bastava incluir o seguinte trecho de cdigo na seo type da unit:
materia= Record Livro_Texto: string; carga_horaria: integer; end;

Vimos tambm que, para declarar uma varivel denominada matematica, do tipo materia, bastava incluir a sua declarao aps a palavra reservada var:

64 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


var matematica: materia;

Uma classe, por sua vez, tem muitas semelhanas com uma varivel composta, pois uma classe tambm pode ter diversos campos. A definio de um tipo de classe pode ser feita de forma bastante semelhante de um tipo de varivel composta, bastando que se substitua a palavra reservada Record por Class. Dessa maneira, se quisssemos criar uma classe denominada materia em vez de um tipo composto chamado materia, bastaria incluir o seguinte trecho de cdigo aps a palavra reservada type:
materia= Class Livro_Texto: string; carga_horaria: integer; end;

Agora teramos uma classe denominada materia, em vez de um tipo de varivel composta chamada materia. Podemos, ento, declarar um objeto denominado matematica, da classe materia, incluindo a sua declarao aps a palavra reservada var:
var matematica: materia;

Repare que, at o presente momento, pouca coisa mudou. A diferena bsica que anteriormente crivamos um tipo de varivel e declarvamos uma varivel daquele tipo. Agora criamos uma determinada classe e declaramos um objeto daquela classe. Podemos, ento, concluir que uma classe est para um tipo de varivel assim como um objeto de uma determinada classe est para uma varivel de determinado tipo! (os puristas da POO dizem que um objeto uma instncia de uma classe). Para acessar os campos de um objeto da classe, basta que se utilize a notao de ponto, descrita anteriormente para as variveis compostas. Para atribuir valores aos campos do objeto matematica (da classe materia), basta incluir as seguintes linhas de cdigo:
matematica.Livro_Texto:= Matematica para Principiantes; matematica.carga_horaria:= 75;

Alguns puristas da POO preferem dizer que um objeto uma instncia de uma classe. Na minha opinio, o importante que voc entenda o conceito de classes e objetos, razo pela qual no estou me atendo rigorosamente aos termos tcnicos da Programao Orientada a Objetos.

MTODOS DE UMA CLASSE


No tpico anterior, vimos as semelhanas existentes entre tipos de variveis compostas e classes, e transformamos a varivel composta materia em uma classe.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

65

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Por enquanto voc no deve ter percebido qualquer vantagem na utilizao de classes, pois tudo o que fizemos com classes at o momento poderia ser feito com uma varivel composta. Neste tpico, com a apresentao do conceito de criao de mtodos, essas vantagens comearo a aparecer. Suponha que se queira criar uma funo capaz de obter a carga horria semanal de uma matria, uma vez conhecida a sua carga horria total. Poderamos, a princpio, criar uma funo que recebesse como argumentos a carga horria total da matria e o nmero de semanas de aula, retornando como resposta o valor da carga horria semanal. Essa funo poderia ser definida como mostra o trecho de cdigo a seguir:
function carga_semanal (disciplina: materia; semanas: integer): integer; begin result:= (disciplina.carga_horaria div semanas); end;

A funo anterior deve ser implementada na seo Implementation de uma unit, sendo apenas o seu cabealho reproduzido na funo interface, pelas razes expostas no prximo pargrafo. Caso se queira que outras unidades de cdigo (units) que incluem o nome da unit na qual essa funo foi definida em sua clusula uses possam utilizar essa funo, o cabealho da funo deve ser definido na seo Interface da sua unit. Essa funo precisa de dois parmetros: um objeto da classe matria e um nmero inteiro, que representa o nmero de semanas de um perodo letivo. Como resultado, a funo retorna a carga horria semanal, obtida dividindo-se a carga horria total (que um campo do objeto) pelo nmero de semanas do perodo letivo. Repare que a funo foi definida externamente classe e que um objeto da classe um dos parmetros da funo. Que tal se essa funo fizesse parte da nossa classe? aqui que comeam as diferenas entre uma classe e uma varivel composta. Para que a funo anterior faa parte da classe, basta defini-la (ou declar-la) na prpria definio da classe, como mostra o trecho de cdigo a seguir:
type materia= Class Livro_Texto: string; carga_horaria: integer; function carga_semanal (disciplina: materia; semanas: integer): integer; end;

A implementao da funo, no entanto, deve ser feita fora da classe, na seo Implementation da unit, como mostra o trecho de cdigo a seguir (correspondente a uma unit do Delphi 7):
implementation {$R *.DFM}

66 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


function materia.carga_semanal (disciplina: materia; semanas: integer): integer; begin result:= (disciplina.carga_horaria div semanas); end;

Repare, contudo, que agora o nome da funo precedido pelo nome da classe, indicando que essa funo pertence classe, isto , a funo um mtodo da classe. Mas as coisas podem ficar ainda melhores! Como a funo agora um mtodo da classe, ela enxerga os campos da classe. Dessa maneira, no h mais a necessidade de se passar um objeto da classe como parmetro da funo, e esse mtodo pode ser redefinido como mostrado nos trechos de cdigo a seguir:
type materia= Class Livro_Texto: string; carga_horaria: integer; function carga_semanal (semanas: integer): integer; end; .......................................... implementation {$R *.DFM} f unction materia.carga_semanal (semanas: integer): integer; begin result:= (carga_horaria div semanas); end;

A est mais uma vantagem de se empregar um mtodo! Ao contrrio das funes externas classe, um mtodo conhece e pode acessar todos os campos da classe. Para executar um mtodo de uma classe, basta chamar o nome do mtodo usando-se a mesma notao de ponto utilizada para acessar os campos da classe (devendo, no entanto, incluir os parmetros necessrios chamada do mtodo), como mostra o trecho de cdigo a seguir:
var matematica: materia; horas_por_semana: integer;

.............................................
horas_por_semana:= matematica.carga_semanal(15);

MTODOS SEM PARMETROS


Ao longo do livro, voc ver algumas chamadas a mtodos que no tm parmetros. Isso ocorre quando todos os valores a serem manipulados pelo mtodo so campos da classe, e no h necessidade de se passar qualquer parmetro para o mtodo. No exemplo descrito nos tpicos anteriores, se horas_por_semana e semanas fossem campos da classe, esse mtodo no precisaria de parmetros, como mostra o trecho de cdigo a seguir:
type materia= Class Livro_Texto: string; carga_horaria, horas_por_semana, semanas: integer;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

67

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


function carga_semanal: integer; end;

..........................................
implementation {$R *.DFM} function materia.carga_semanal: integer; begin horas_por_semana:= (carga_horaria div semanas); end;

Nesse caso, para executar o mtodo, basta que se inclua a seguinte linha de cdigo (neste caso, nenhum parmetro necessrio na chamada do mtodo):
matematica.carga_semanal;

Onde, como descrito nos tpicos anteriores, matematica um objeto da classe materia. Entretanto, nos casos em que uma funo no precisa retornar um valor, mais conveniente que se defina o mtodo como uma procedure em vez de uma funo. Dessa maneira, poderamos redefinir o mtodo como mostra o trecho de cdigo a seguir:
type materia= Class Livro_Texto: string; carga_horaria, horas_por_semana, semanas: integer; procedure carga_semanal; end; .......................................... implementation {$R *.DFM} procedure materia.carga_semanal: integer; begin horas_por_semana:= (carga_horaria div semanas); end;

Embora nesse caso o uso de uma funo no gere um erro de compilao, a utilizao de uma procedure evita que o Delphi 7 exiba a mensagem de advertncia Return value of function materia.carga_horaria might be undefined.

O OBJETO FORMULRIO E A CLASSE TFORM


Examinando novamente o cdigo gerado pelo Delphi 7, notamos a seguinte declarao de classe no arquivo UnitPrincipal.pas:
type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end;

68 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL


Fazendo uma analogia com a definio da classe materia analisada nos tpicos anteriores, observa-se que esse trecho de cdigo corresponde declarao de uma nova classe, chamada TForm1. A diferena que, aps a palavra reservada class, aparece entre parnteses a palavra TForm. Mas o que significa isso? Isso tem a ver com o conceito de herana, tambm muito importante na programao orientada a objetos. Esse conceito, bastante importante, ser discutido nos prximos tpicos, junto com o significado das palavras reservadas private e public. Bom, por enquanto vamos nos concentrar apenas no fato de que TForm1 uma nova classe. Se continuarmos a examinar o cdigo gerado pelo Delphi 7, veremos ainda a seguinte declarao, na seo var da unit:
var Form1: TForm1;

Como voc j deve ter percebido, essa declarao indica que Form1 um objeto da classe TForm1. Esse objeto nada mais nada menos que o formulrio criado automaticamente pelo Delphi 7, e do qual voc j tomou conhecimento desde o incio do segundo captulo. Mas o que TForm? TForm uma classe, definida na unit Forms (no caso da VCL) ou Qforms (no caso do CLX), e que representa um formulrio vazio (sem nenhum controle ou componente). Ento voc deve estar se perguntando: no seria mais fcil trabalhar com a classe TForm, em vez de criar uma nova classe, chamada TForm1? Bem, a resposta seria positiva se voc quisesse trabalhar com um formulrio vazio. Acontece que esse, provavelmente, no o seu caso; afinal de contas, para que serve um formulrio (janela) vazio? No prximo tpico abordaremos o conceito de herana de classes, e acredito que as coisas comearo a ficar mais claras.

O CONCEITO DE HERANA DE CLASSES


Um dos conceitos mais importantes da programao orientada a objetos o de herana de classes. Por meio da herana, podemos criar uma nova classe baseada em uma classe j existente. Quando uma classe derivada de uma j existente, diz-se que essa nova classe herda os campos e mtodos de uma classe-base. Dessa maneira, a forma mais genrica de declarao de uma classe obedece sintaxe abaixo:
nome_da_classe = class(nome_da_classe_base) private { Campos e mtodos privados} public { Campos e mtodos public end;

Mas voc deve estar se perguntando: qual a classe-base da classe materia, definida nos tpicos anteriores? A resposta a seguinte: a linguagem Object Pascal possui uma classe, denominada TObject, que a me de todas as classes. Por esta razo, quando voc deriva uma classe diretamente de TObject, no

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

69

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


precisa declarar explicitamente a classe-base, pois o ambiente do Delphi 7 assume a classe TObject como a classe-base default. Desse modo, as declaraes de classe a seguir so equivalentes:
materia= Class Livro_Texto: string; carga_horaria, horas_por_semana, semanas: integer; procedure carga_semanal; end;

Ou:
materia= Class(TObject) Livro_Texto: string; carga_horaria, horas_por_semana, semanas: integer; procedure carga_semanal; end;

Podemos ento concluir que, ao se criar uma nova classe sem especificar uma classe-base, estamos na realidade criando uma classe derivada de TObject. No caso anterior, o Delphi 7 criou uma nova classe chamada TForm1, derivada de TForm. A razo de se criar uma nova classe que, como ser visto posteriormente, medida que inserirmos componentes e controles em nosso formulrio, esses objetos passaro a ser um campo da nova classe (um campo pode ser qualquer tipo j definido, inclusive um objeto de uma outra classe). Nos tpicos a seguir, sero apresentados os tipos de mtodos e campos de uma classe.

TIPOS DE MTODOS E CAMPOS


Na linguagem Object Pascal, uma classe pode ter os seguintes tipos de mtodos e campos: Pblicos (public). Privados (private). Protegidos (protected). Alm dos campos dos tipos citados anteriormente, existem ainda os tipos published e automated. O tipo published semelhante ao tipo public, mas seu valor pode ser visualizado no Object Inspector (e ser visto em maiores detalhes no captulo referente criao de componentes). O tipo automated tambm tem as mesmas regras de visibilidade do tipo public e geralmente usado em classes derivadas da classe TAutoObject (definida na unit OleAuto).

MTODOS E CAMPOS PBLICOS


Os mtodos e campos pblicos de uma classe so definidos aps a palavra reservada public e podem ser acessados em qualquer ponto de um programa. Na linguagem Object Pascal, os campos de uma classe so public por default (isto , se nada for especificado, o campo ser considerado public).

70 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 FUNDAMENTOS DA LINGUAGEM OBJECT PASCAL

MTODOS E CAMPOS PRIVADOS


Os mtodos e campos privados de uma classe so definidos aps a palavra reservada private e s podem ser acessados na unit em que a classe foi definida.

MTODOS E CAMPOS PROTEGIDOS


Os mtodos e campos protegidos de uma classe so definidos aps a palavra reservada protected e s podem ser acessados na unit em que a classe foi definida ou, em outra unit, pelas classes dela derivadas. Ao longo do livro, ao lidarmos com controles e componentes, usaremos eventualmente o termo propriedade quando nos referirmos a um campo de um objeto, seja esse campo visvel ou no no Object Inspector.

PROCEDIMENTOS ASSOCIADOS A EVENTOS


Se voc observou atentamente o procedimento associado ao evento OnActivate de um formulrio, mostrado no captulo anterior, viu que o Delphi 7 cuidou de quase tudo. Mesmo assim, bom que voc entenda o significado de cada trecho de cdigo em um procedimento, para se sentir mais vontade ao escrever o cdigo do seu aplicativo. Vamos examinar atentamente o cdigo do procedimento, que novamente exibido a seguir.
procedure TForm1.FormActivate(Sender: TObject); begin end;

Inicialmente, temos na primeira linha o cabealho do procedimento, que comea com a palavra reservada procedure, seguida do nome da classe do objeto (TForm1), de um ponto e do indicativo do evento (FormActivate Ativao de formulrio), alm de uma lista de parmetros (Sender: TObject) e de um ponto-e-vrgula, que indica o fim do cabealho do procedimento. Abaixo do cabealho vem o corpo do procedimento, limitado pelas palavras reservadas begin e end, entre as quais deve ser digitado o cdigo do procedimento (nesse caso, o cdigo que definir o comportamento do nosso aplicativo em resposta ocorrncia do evento). Alm disso, se voc observar o incio do arquivo de cdigo, ver que o Delphi 7 tambm incluiu na definio do objeto TForm1 a declarao da procedure, como mostra o trecho de cdigo a seguir, extrado do arquivo de cdigo.
type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

71

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Pode-se concluir, portanto, que o procedimento associado ao evento OnActivate, denominado FormActivate , nesse caso, um mtodo da classe TForm1. Essa procedure tem apenas o parmetro Sender, que identifica o objeto que gerou o evento e, exceto em situaes em que vrios objetos compartilham o mesmo evento, no precisa ser diretamente manipulado pelo programador.

PARE E REFLITA ANTES DE PROSSEGUIR


Uma ltima recomendao: antes de passar diretamente aos prximos captulos, verifique se realmente compreendeu os fundamentos da linguagem Object Pascal. Lembre-se de que ambientes de desenvolvimento como o do Delphi 7 facilitam muito o seu trabalho, principalmente no que se refere criao da interface, mas no desenvolve o sistema para voc. Cabe a voc, desenvolvedor, codificar a aplicao de forma a resolver um elenco de questes. No se iluda! Programar no o mesmo que desenhar uma belssima interface. O trabalho de criao de interface, embora extremamente importante, no representa o corao de um sistema. No prximo captulo falaremos sobre a importncia de um bom planejamento requisito indispensvel ao sucesso de um empreendimento. Leia-o com ateno, pois os aspectos discutidos podero lhe ser muito teis.

72 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 PLANEJANDO A SUA APLICAO

Captulo
Planejando a sua Aplicao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

73

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo ser mostrada a importncia de se planejar uma aplicao antes de iniciar o seu desenvolvimento.

FUNDAMENTOS EM: PLANEJAMENTO DE APLICAES


PR-REQUISITOS
Disciplina de trabalho e capacidade organizacional.

METODOLOGIA
Apresentao e descrio dos fatores que influenciam o sucesso no desenvolvimento de uma aplicao.

PLANEJANDO O SEU TRABALHO


Um bom planejamento indispensvel ao sucesso de um empreendimento. Nos prximos tpicos, sero descritos alguns aspectos julgados importantes ao planejamento do trabalho de um desenvolvedor.

A IMPORTNCIA DE UM BOM PLANEJAMENTO


Antes de iniciar a codificao e o desenho da interface da sua aplicao, importante que voc reserve um tempo para o seu planejamento. Esse planejamento, embora possa parecer suprfluo para algumas pessoas, pode reduzir bastante o tempo despendido no desenvolvimento da sua aplicao. Graas facilidade e rapidez com que se pode construir a interface de uma aplicao com o Delphi 7, muitos programadores comeam a desenhar a interface sem se preocupar com um planejamento prvio da sua aplicao e, no meio do processo de desenvolvimento, descobrem que muita coisa poderia ser modificada (e, nesse caso, as correes podem consumir um tempo muito maior do que aquele gasto no seu planejamento). A fim de evitar esse tipo de problema, recomendvel que se reserve algum tempo para discutir aspectos importantes da aplicao, como, por exemplo: Que menus devem ser includos na tela principal da aplicao? E quais devem ser os itens de cada menu? O programa ter uma barra de ferramentas? E uma barra de status? Que botes devem ser includos na barra de ferramentas? Que informaes devem ser exibidas na barra de status? Como ser o pano de fundo da tela principal da aplicao? Ser utilizada uma cor padro ou um bitmap? O programa efetuar acesso a tabelas de bancos de dados? Em caso afirmativo, qual o tipo de banco de dados a ser empregado (Access, Paradox, MySQL, dBASE, Interbase, Oracle, etc.)? Haver algum relacionamento entre essas tabelas? Desktop ou Client/Server? Ser uma aplicao multiplataforma (desenvolvida com a CLX)?

74 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 PLANEJANDO A SUA APLICAO


Que relatrios sero gerados pela aplicao? Como deve ser o help on-line da aplicao? Que itens devem ser includos e como esses itens devem estar relacionados? Quantas janelas e caixas de dilogo deve ter a aplicao? Qual a funo de cada uma delas? Como ser o instalador do aplicativo? Ser utilizado o InstallShield Express, um outro produto comercial ou ser desenvolvido um instalador para a aplicao? Como voc deve ter percebido, o elenco de questes muito grande (e olhe que relacionamos apenas poucos itens). Se voc planejar direitinho o seu trabalho, o desenvolvimento da aplicao ser mais rpido e menos sujeito a erros. No caso do desenvolvimento em equipe, esse planejamento fundamental, pois a diviso de tarefas s deve ser feita aps uma perfeita definio dos seus objetivos especficos.

PLANEJANDO O NOSSO APLICATIVO-EXEMPLO


O aplicativo-exemplo que ser desenvolvido ao longo desta primeira parte do livro ser destinado a gerenciar o cadastro de scios de um clube fictcio. Os conceitos de programao apresentados, no entanto, se aplicam a outros tipos de aplicaes, pois as tcnicas apresentadas na construo da interface e para acesso a bancos de dados permanecem as mesmas. Nossa aplicao dever permitir: O cadastro de novos scios. A alterao de dados de um scio. A excluso de um scio. A consulta de dados dos scios. O cadastro de novas atividades. A alterao de dados de uma atividade. A excluso de uma atividade. A consulta de dados das atividades. O cadastro de novas matrculas em atividades. A excluso de matrculas em atividades. A consulta de dados das matrculas em atividades. A definio dos objetivos acima o primeiro passo a ser dado no planejamento da nossa aplicao. Com base nesses objetivos, podem-se definir: Os menus necessrios nossa aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

75

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


As tabelas necessrias ao armazenamento dos dados: tabelas com os dados dos scios, das atividades e das matrculas. As janelas que devem compor a aplicao: uma janela para cadastro de scios, outra para cadastro de atividades e janelas para matrculas em atividades, etc Alm disso, deve ser prevista uma caixa de dilogo com informaes sobre direitos autorais do programa. Os relatrios que devem ser gerados pela aplicao. Os itens a serem includos no nosso arquivo de help. Esses itens sero detalhados nos prximos captulos, na medida em que forem apresentadas as tcnicas utilizadas na sua elaborao.

PADRONIZANDO A NOMENCLATURA DOS COMPONENTES


Ao criar a interface da sua aplicao, voc incluir diversos componentes nos vrios formulrios que a compem. Cada formulrio, controle ou componente ter um nome (definido na sua propriedade Name) pelo qual ser referenciado no cdigo da aplicao. Quando voc inicia uma nova aplicao (um novo projeto), o Delphi 7 cria automaticamente um formulrio denominado Form1. Se voc criar um segundo formulrio, ele ser denominado Form2 e assim por diante. Imagine agora que a sua aplicao possua quinze formulrios (o que no tanta coisa assim). J imaginou ter de se lembrar qual a funo de Form1, Form2, ..., Form15? Quando se inserem componentes em um formulrio, ocorre a mesma coisa. Se voc colocar quatro caixas de texto em um formulrio, a primeira ser denominada Edit1, a segunda Edit2 e assim por diante. Para facilitar as suas tarefas como desenvolvedor de aplicaes, voc deve estabelecer uma conveno para os nomes dos seus formulrios e componentes. Pode ser qualquer uma, desde que seja de fcil entendimento. Alguns autores recomendam a utilizao de prefixos (que indicam o tipo do componente) seguidos de um nome que identifique claramente a que se destina o componente. Eu, por exemplo, costumo chamar de FormPrincipal o formulrio principal de uma aplicao. Com relao a componentes do tipo Label, usados apenas para exibir textos estticos, s altero seu nome quando preciso modificar alguma das suas propriedades no cdigo do aplicativo. Uma caixa de texto na qual o usurio deve digitar seu nome costumo denominar EditNome, por exemplo. Mas, conforme j disse anteriormente, no h uma regra rgida para os nomes dos componentes. A melhor regra aquela que mais facilita o seu trabalho. O importante que voc defina uma e a utilize de forma coerente. No caso em que o desenvolvimento feito em equipe, a utilizao de uma conveno ainda mais importante.

76 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 PLANEJANDO A SUA APLICAO

FUNDAMENTOS EM: TO-DO LISTS


PR-REQUISITOS
Experincia prvia no desenvolvimento de aplicaes com Delphi, e na manipulao do seu ambiente de desenvolvimento.

METODOLOGIA
Apresentao do problema: Utilizao das TO-DO Lists na organizao e planejamento durante o desenvolvimento de aplicaes com o Delphi 7.

TCNICA
Apresentao dos procedimentos necessrios utilizao do recurso de TO-DO Lists.

ORGANIZANDO O SEU TRABALHO COM AS FERRAMENTAS TO-DO LIST


Desenvolver um bom aplicativo requer, antes de mais nada, um bom planejamento e uma prvia organizao das tarefas a serem desempenhadas, e justamente esta a funo das To-Do Lists, presentes no Delphi 7. Sua funo consiste em registrar atividades que devem ser realizadas no desenvolvimento de um projeto de aplicativo. Uma referncia a uma atividade pode ser adicionada a um projeto na prpria janela que relaciona as To-Do Lists ou diretamente no cdigo-fonte da aplicao. A figura a seguir apresenta a janela de gerenciamento das To-Do Lists de um projeto, exibida quando se seleciona o item To-Do List do menu View do ambiente de desenvolvimento integrado do Delphi 7:

Figura 4.1: A janela de gerenciamento das To-Do Lists.

Cada Projeto possui a sua prpria relao de To-Do Lists a ele associada.

ADICIONANDO UM ITEM A UMA TO-DO LISTS


Para adicionar um item a uma To-Do Lists, voc deve executar os seguintes procedimentos: 1. Exibir a janela de To-Do Lists do projeto. 2. Selecionar o boto direito do mouse sobre esta janela e, no menu pop-up que ser exibido, selecionar o item Add, para exibir a caixa de dilogo Add To-Do Item, mostrada na figura a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

77

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 4.2: A caixa de dilogo Add To-Do Item.

Nesta caixa de dilogo, devero ser fornecidas as seguintes informaes: Um texto descritivo da ao a ser realizada (Text). A prioridade desta tarefa (Priority). O responsvel pela tarefa (Owner). Voc pode digitar um novo nome ou selecionar um nome j existente. A sua categoria (Category). Voc pode digitar uma nova categoria ou selecionar um nome j existente. 3. Aps fornecer as informaes necessrias, selecionar o boto Ok para fechar esta caixa de dilogo e criar o novo item.

EDITANDO UM ITEM DE UMA TO-DO LISTS


Para editar um item de uma To-Do Lists, voc deve executar os seguintes procedimentos: 1. Exibir a janela de To-Do Lists do projeto. 2. Selecionar o boto direito do mouse sobre um item desta janela e, no menu pop-up que ser exibido, selecionar o item Edit, para exibir a caixa de dilogo Edit To-Do item, mostrada na figura a seguir.

Figura 4.3: A caixa de dilogo Edit To-Do Item.

Nesta caixa de dilogo, podero ser alteradas as informaes j fornecidas na criao do item, alm de poder indicar que a tarefa j foi realizada (o que feito marcando-se a caixa de verificao Done).

78 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 PLANEJANDO A SUA APLICAO


3. Aps fornecer as informaes necessrias, selecionar o boto Ok para fechar esta caixa de dilogo.

EXCLUINDO UM ITEM DE UMA TO-DO LISTS


Para excluir um item de uma To-Do Lists, voc deve executar os seguintes procedimentos: 1. Exibir a janela de To-Do Lists do projeto. 2. Selecionar o item a ser removido. 3. Pressionar o boto Del ou selecionar o boto direito do mouse sobre esta janela e, no menu pop-up que ser exibido, selecionar o item Delete.

CONFIGURANDO AS INFORMAES EXIBIDAS EM UMA TO-DO LISTS


Para configurar as informaes a serem exibidas em uma TO-DO Lists, voc deve executar os seguintes procedimentos: 1. Exibir a janela de TO-DO Lists do projeto. 2. Selecionar o boto direito do mouse sobre esta janela e, no menu pop-up que ser exibido, selecionar o item Table Properties, para exibir a caixa de dilogo mostrada na figura a seguir.

Figura 4.4: A caixa de dilogo Table Properties.

Esta caixa de dilogo apresenta duas pginas, uma referente s caractersticas gerais da tabela de itens, como mostrado na figura anterior, e outra na qual se pode configurar cada uma das suas colunas, como mostrado na prxima figura.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

79

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 4.5: A pgina Column da caixa de dilogo Table Properties.

Nesta pgina pode-se definir, para cada coluna: Seu ttulo (Title). Sua largura (Width) em porcentagem da largura total. Sua altura (Height) em pixels. Se o texto pode ser quebrado em mais de uma linha (Wrap). Se a coluna deve estar visvel (Visible). Seu alinhamento (horizontal e vertical). A fonte usada na exibio do texto correspondente.

CONFIGURANDO COMO AS INFORMAES DEVEM SER ORDENADAS EM UMA TO-DO LISTS


Para configurar como as informaes devem ser ordenadas em uma To-Do Lists, voc deve executar os seguintes procedimentos: 1. Exibir a janela de To-Do Lists do projeto. 2. Selecionar o boto direito do mouse sobre esta janela e, no menu pop-up que ser exibido, selecionar o item Sort, para exibir os subitens pelos quais a lista pode ser ordenada, selecionandose ento o item desejado.

ADICIONANDO UM ITEM A UMA TO-DO LISTS DIRETAMENTE NO CDIGO-FONTE


Para adicionar um item a uma To-Do Lists diretamente no cdigo-fonte, voc deve executar os seguintes procedimentos:

80 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 PLANEJANDO A SUA APLICAO


1. No Editor de cdigo, selecione o boto direito do mouse e, no menu suspenso que ser exibido, selecione o item Add To-Do item. Ser exibida a caixa de dilogo Add To-Do item, na qual dever ser selecionado o item desejado e o boto Ok, para inserir a referncia a este item no cdigo-fonte, que dever ficar como apresentado a seguir (o cdigo-fonte se refere ao procedimento associado ao evento OnClick de um boto chamado BotaoTeste, criado apenas para ilustrar o uso das TO-DO Lists):
procedure TFormPrincipal.BotaoTesteClick(Sender: TObject); begin { TODO 2 -oMarcelo -cInterface : Iniciar a interface } end;

Repare que ser criado um novo item na TO-DO List Neste caso seria melhor no t-lo criado anteriormente. A diferena est no fato de que o item recm-criado est diretamente vinculado ao cdigo-fonte e, ao ser posteriormente editado e marcado como concludo, o cdigo-fonte ser automaticamente alterado para:
procedure TFormPrincipal.BotaoTesteClick(Sender: TObject); begin { DONE 2 -oMarcelo -cInterface : Iniciar a interface } end;

Voc tambm pode digitar diretamente as informaes no cdigo-fonte, usando comandos com a seguinte sintaxe:
{TODO|DONE [n] [-o<owner>] [-c<category>] : <to-do item text>}

Onde: n indica a prioridade do item. TODO: indica que a tarefa representada por este item no foi completada. DONE: indica que a tarefa representada por este item foi completada. -o owner: o nome do responsvel pela tarefa. -c category: a categoria da tarefa representada pelo item.

Os itens digitados no cdigo-fonte so automaticamente adicionados To-Do List.

COPIANDO A RELAO DE ITENS DE UMA TO-DO LIST


Voc pode copiar a relao de itens de uma To-Do List como texto ou no formato HTML. Para isto, basta selecionar o boto direito do mouse sobre esta janela e, no menu pop-up que ser exibido, selecionar o item Copy As para exibir os subitens, selecionando-se ento o item desejado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

81

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

FILTRANDO

RELAO DE ITENS DE UMA TO-DO LIST

Voc pode filtrar a relao de itens de uma To-Do List. Para isto, basta selecionar o boto direito do mouse sobre a janela TO-DO Lists e, no menu pop-up que ser exibido, selecionar o item Filter para exibir os subitens, selecionando-se ento a opo desejada.

82 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO

Captulo
Criando o Formulrio Principal da Aplicao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

83

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos necessrios criao do formulrio principal do nosso aplicativo-exemplo. Sero apresentadas as principais propriedades de um formulrio, os procedimentos necessrios definio dos seus valores e a incluso de componentes para a criao da interface.

FUNDAMENTOS EM: MANIPULAO DE FORMULRIOS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos da codificao na linguagem Object Pascal. Noes bsicas de programao orientada a objetos, principalmente os conceitos de propriedades, mtodos e eventos (apresentados nos captulos anteriores).

METODOLOGIA
Apresentao e descrio das principais caractersticas de um formulrio.

TCNICA
Apresentao dos procedimentos necessrios configurao de formulrios.

OS FORMULRIOS ELEMENTOS PARA A CONSTRUO DA INTERFACE EM APLICAES DESENVOLVIDAS EM DELPHI 7


Conforme descrito anteriormente, os formulrios so as janelas que iro compor a interface da sua aplicao. Este nome pode parecer no muito adequado, mas j est consagrado na literatura, e iremos adot-lo. Nos prximos tpicos voc aprender a definir as principais caractersticas do formulrio principal de uma aplicao desenvolvida em Delphi 7.

O OBJETO FORMULRIO
Um dos principais objetos utilizados no desenvolvimento de aplicaes com o Delphi 7 o objeto formulrio (Form). Como j foi visto no Captulo 2, sempre que iniciamos uma nova aplicao (um novo projeto), o Delphi 7 cria um formulrio vazio, que pode ser usado como o formulrio principal da aplicao. Como todo objeto que se preza, um formulrio possui propriedades, mtodos e eventos. Dentre as propriedades de um formulrio, podem-se destacar: BorderStyle: Determina o estilo de borda do formulrio. BorderIcons: Determina os cones a serem habilitados na extremidade superior direita da barra de ttulos do formulrio. Caption: Armazena o texto exibido na barra de ttulos do formulrio.

84 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


Color: Define a cor do formulrio. Font: Define a fonte do texto exibido no formulrio. Height: Define a dimenso vertical (altura) de um formulrio. Icon: Define o cone a ser exibido quando o formulrio for minimizado. Left: Define a posio de um formulrio, em relao extremidade esquerda da tela. Menu: Define o menu associado ao formulrio. Name: Define o nome pelo qual o objeto referenciado no cdigo da aplicao. PopupMenu: Define o menu flutuante associado ao formulrio. Position: Define o posicionamento do formulrio na tela. Windowstate: Determina o estado de exibio do formulrio (maximizado, minimizado ou normal). Top: Define a posio de um formulrio, em relao extremidade superior da tela.

PROPRIEDADES COM UM CONJUNTO DE VALORES PREDEFINIDOS


Existem propriedades que s podem assumir alguns valores predefinidos. Esse o caso, por exemplo, da propriedade Position de um formulrio, descrita no tpico anterior. Nesses casos, o valor da propriedade pode ser selecionado a partir de uma lista exibida quando se clica com o boto esquerdo do mouse sobre a seta exibida direita do valor da propriedade, como mostra a figura a seguir.

Figura 5.1: Definindo o valor da propriedade Position no Object Inspector.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

85

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

PROPRIEDADES QUE CONTM SUBPROPRIEDADES


Existem algumas propriedades que representam um conjunto de valores. Como foi mostrado no Captulo 3, um conjunto armazena seus elementos entre colchetes. Esse o caso, por exemplo, da propriedade BorderIcons de um formulrio. Uma observao mais atenta mostra que o Object Inspector exibe, esquerda do nome dessa propriedade, um pequeno sinal de +. Esse sinal indica que essa propriedade , neste caso, um conjunto, cujos elementos podem ser definidos (habilitados) de forma independente. Para acessar cada um desses elementos, que denominaremos subpropriedades, basta dar um duplo clique com o boto esquerdo do mouse sobre o sinal +. Nesse caso, cada subpropriedade poder ser definida de maneira independente, como mostra a figura a seguir. Repare ainda que o sinal + foi substitudo por -. Dando-se um duplo clique sobre o sinal -, as subpropriedades ficaro novamente ocultas, e o sinal - ser substitudo por +.

Figura 5.2: Acessando subpropriedades no Object Inspector.

Observe ainda que cada uma dessas propriedades exibe uma lista de valores possveis (nesse caso, True e False). Existem ainda casos em que os valores dessas subpropriedades podem ser definidos em uma caixa de dilogo. Esse o caso, por exemplo, da propriedade Font de um formulrio. Nessas situaes, alm do sinal de + exibido esquerda do nome da propriedade, o Object Inspector apresenta reticncias (...) direita do valor da propriedade. Clicando-se sobre essas reticncias, exibese uma caixa de dilogo na qual se podem definir os valores das subpropriedades.

86 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


As figuras a seguir mostram a propriedade Font, e a caixa de dilogo utilizada para atribuir valores s suas subpropriedades.

Figura 5.3: Acessando a propriedade Font no Object Inspector.

Figura 5.4: A caixa de dilogo Font.

Conforme veremos ao longo do livro, essa situao ocorre em muitas propriedades de diversos componentes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

87

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

ALTERANDO AS PROPRIEDADES DO OBJETO FORMULRIO


Vamos iniciar a criao da interface visual da nossa aplicao. Para isso, execute os seguintes procedimentos: 1. Abra o projeto Clube.dpr, criado anteriormente. 2. Selecione o formulrio principal, inicialmente denominado Form1. 3. Atribua os seguintes valores para as principais propriedades do formulrio principal, diretamente no Object Inspector: BorderStyle: bsSingle (esse estilo impede que o formulrio seja redimensionado). BorderIcons: [biSystemMenu,biMinimize]. Caption: .Cadastro de Scios. Height: 700. Name: FormPrincipal. Position: poScreenCenter. Width: 1100. As propriedades cujo valor no for alterado permanecero com o seu valor default.

Os valores das propriedades Height e Width foram definidos considerando-se uma resoluo de 1280 por 1024. Caso a resoluo a ser adotada seja diferente, reajuste estes valores de forma proporcional.

Seu formulrio deve ficar com o aspecto mostrado na figura a seguir.

Figura 5.5: Aspecto inicial do formulrio principal da aplicao.

88 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO

DEFININDO UM CONE PARA O FORMULRIO PRINCIPAL DA APLICAO


Para definir um cone para o formulrio, voc deve executar os seguintes procedimentos: 1. Selecione o formulrio. 2. Selecione as reticncias exibidas direita da propriedade Icon no Object Inspector. Ser exibida a caixa de dilogo Picture Editor, mostrada na figura a seguir.

Figura 5.6: A caixa de dilogo Picture Editor.

3. Selecione o boto Load desta caixa de dilogo. Ser exibida a caixa de dilogo Load Picture, mostrada na Figura 5.7, na qual dever ser selecionado o cone desejado. Nesse exemplo, a imagem selecionada est no arquivo C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Icons\Handshak.ico do Windows. A localizao deste arquivo pode, no entanto, no ser a mesma no seu computador, dependendo de como foi feita a sua instalao do Delphi 7. Neste caso, recomenda-se pesquisar a sua localizao. 4. Selecione o boto Abrir, para fechar a caixa de dilogo Load Picture.

Figura 5.7: A caixa de dilogo Load Picture.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

89

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


5. Selecione o boto OK, para fechar a caixa de dilogo Picture Editor. Pronto! Voc acaba de definir um cone para o seu formulrio. Voc no precisa distribuir o arquivo de cone com a aplicao, pois o cone incorporado diretamente ao seu executvel (voc pode verificar isso analisando a descrio textual do formulrio).

INSERINDO COMPONENTES EM UM FORMULRIO


Para criar a interface da sua aplicao, voc precisar inserir controles e componentes em seus formulrios. Para inserir um componente em um formulrio, basta que se execute um dos seguintes procedimentos: D um duplo clique com o boto esquerdo do mouse sobre o seu cone na paleta de componentes. Isso faz com que o componente seja exibido centralizado no formulrio com o seu tamanho default. Ou: Selecione o cone correspondente na paleta de componentes e depois d um clique com o boto esquerdo do mouse sobre o formulrio. Isso faz com que o componente seja exibido com o seu tamanho default e com a sua extremidade superior esquerda situada na posio definida pelo ponteiro do mouse. Ou: Selecione o componente desejado na paleta de componentes (clicando uma nica vez sobre o seu cone), pressione o boto esquerdo do mouse sobre o formulrio e, mantendo o boto esquerdo do mouse pressionado, arraste-o de forma a definir o tamanho do componente. Isso permite que se definam simultaneamente o tamanho e a posio do componente durante a sua insero no formulrio. Para inserir mais de um componente de um mesmo tipo em um formulrio, pressione a tecla Shift ao selecion-lo na paleta de componentes. Isso faz com que, ao se clicar novamente sobre o formulrio, seja criado um novo componente, sem a necessidade de selecion-lo outra vez na paleta. Para cancelar o processo de insero mltipla, basta selecionar qualquer outro componente da paleta. Observe que os componentes so distribudos por vrias pginas da paleta de componentes (Standard, Additional, Data Access, Data Controls, etc.), e antes de selecionar um componente necessrio que a pgina onde o mesmo se encontra esteja selecionada (o que feito clicando-se com o boto esquerdo do mouse sobre o nome da pgina).

INSERINDO UM COMPONENTE PARA EXIBIO DE IMAGENS NO FORMULRIO PRINCIPAL


Para incluir um componente capaz de exibir imagens gravadas em arquivos, execute os seguintes procedimentos: 1. Selecione a pgina Additional da paleta de componentes.

90 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


2. Selecione o sexto componente da paleta. 3. Clique com o boto esquerdo do mouse sobre o formulrio. 4. O componente ser exibido no formulrio, como mostra a figura a seguir.

Figura 5.8: Inserindo um componente para exibio de imagens no formulrio.

Entre as principais propriedades desse componente, possvel destacar: AutoSize: Essa propriedade define se o componente ser ou no automaticamente redimensionado para se adaptar ao tamanho da imagem a ser exibida (definida na sua propriedade Picture) e s pode assumir os valores False (falso) e True (verdadeiro). Height: Define a dimenso vertical (altura) do componente. Left: Define a posio do componente em relao extremidade esquerda do formulrio. Name: Define o nome com o qual o objeto referenciado no cdigo da aplicao. Picture: Define a imagem a ser exibida pelo componente. Stretch: Essa propriedade define se a imagem ser ou no automaticamente redimensionada e, para se adaptar ao tamanho do componente, s pode assumir os valores False (falso) e True (verdadeiro). Entretanto, definir o valor de Stretch como True pode provocar distores na imagem. Top: Define a sua posio, em relao extremidade superior do formulrio. Width: Define a dimenso horizontal (largura) do componente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

91

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

O valor definido na propriedade AutoSize prevalece sobre o definido na propriedade Stretch.

SELECIONANDO UM COMPONENTE INSERIDO EM UM FORMULRIO


Para selecionar um componente inserido em um formulrio, basta clicar sobre este com o boto esquerdo do mouse. Quando um componente selecionado, apresenta pequenos quadrados pretos ao seu redor. Esses pequenos quadrados pretos so denominados marcas de seleo e indicam que o componente est selecionado. A figura anterior mostra o componente de exibio de imagens selecionado e suas marcas de seleo. Quando um componente inserido em um formulrio, ele automaticamente selecionado. A seleo de um componente permite que ele seja movimentado e redimensionado com o mouse e que as suas propriedades sejam alteradas diretamente no Object Inspector.

RENOMEANDO UM COMPONENTE
O nome dado a um componente, definido pela sua propriedade Name, o nome pelo qual este componente ser referenciado no cdigo da aplicao. Para renomear um componente, execute os seguintes procedimentos: 1. Selecione o componente com o mouse. 2. Altere o valor da sua propriedade Name diretamente no Object Inspector. Executando os passos anteriores, mude o valor da propriedade Name do componente de exibio de imagens para Logotipo.

REPOSICIONANDO UM COMPONENTE
Para movimentar um componente com o mouse, execute os seguintes procedimentos: 1. Pressione o boto esquerdo do mouse sobre o componente e, mantendo o boto pressionado, movimente o mouse, arrastando o componente. medida que voc movimenta o componente, os valores das suas propriedades Left e Top so exibidos junto ao ponteiro do mouse. 2. Quando o componente estiver situado na posio desejada, libere o boto esquerdo do mouse. Por exemplo: selecione com o mouse o componente inserido no formulrio no tpico anterior e verifique o valor das suas propriedades Left e Top no Object Inspector. Movimente o componente executando os passos descritos anteriormente e, aps coloc-lo em uma nova posio, verifique os novos valores das suas propriedades Left e Top. Como voc j deve ter constatado, os valores das propriedades Left e Top so automaticamente atualizados quando voc termina de movimentar o componente. Isso ocorre porque as propriedades

92 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


Left e Top definem a posio do componente em relao ao canto superior esquerdo do formulrio. A propriedade Left mede, em pixels, a distncia da extremidade esquerda do componente em relao extremidade esquerda do formulrio. A propriedade Top mede, em pixels, a distncia da extremidade superior de um componente em relao extremidade superior do formulrio (no caso de um formulrio, essas propriedades so definidas em relao tela). A recproca tambm verdadeira, isto , se voc selecionar um componente e alterar os valores das suas propriedades Left e Top no Object Inspector, o componente ser deslocado para uma nova posio no formulrio. Reposicione o componente de exibio de imagens inserido no formulrio, executando os seguintes procedimentos: 1. Selecione o componente. 2. No Object Inspector, atribua o valor 260 sua propriedade Top e 469 sua propriedade Left. Voc tambm pode reposicionar um componente que esteja selecionado, usando as combinaes de tecla Ctrl + uma das teclas de movimentao do teclado (seta para esquerda, seta para direita, etc.).

REDIMENSIONANDO UM COMPONENTE
Para redimensionar um componente com o mouse, execute os seguintes procedimentos: 1. Selecione o componente com o boto esquerdo do mouse. 2. Posicione o ponteiro do mouse sobre uma das marcas de seleo do componente, at que ele se torne uma seta dupla. 3. Pressione o boto esquerdo do mouse e movimente o seu ponteiro, redimensionando o componente. medida que voc redimensiona o componente, os valores das suas propriedades Height e Width so exibidos junto ao ponteiro do mouse (esse recurso no estava disponvel nas verses anteriores, e simplifica bastante a tarefa de se redimensionar um componente no formulrio). 4. Quando o componente estiver com o tamanho desejado, libere o boto esquerdo do mouse. Selecione, com o mouse, o componente de exibio de imagens que foi inserido no formulrio e verifique, no Object Inspector, o valor das suas propriedades Height e Width. Redimensione o componente executando os passos descritos anteriormente e, aps redimension-lo, verifique os novos valores das suas propriedades Height e Width. Como voc j deve ter constatado, os valores das propriedades Height e Width so automaticamente atualizados quando voc termina de redimensionar o componente. Isso ocorre porque as propriedades Height e Width definem respectivamente os valores, em pixels, da altura e largura do componente. A recproca tambm verdadeira, isto , se voc selecionar um componente e alterar os valores das suas propriedades Height e Width no Object Inspector, o componente ser redimensionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

93

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Redimensione o componente de exibio de imagens inserido no formulrio, executando os seguintes procedimentos: 1. Selecione o componente. 2. No Object Inspector, atribua o valor 139 sua propriedade Height e 153 sua propriedade Width. Voc tambm pode redimensionar um componente que esteja selecionado, usando as combinaes de tecla Shift + uma das teclas de movimentao do teclado (seta para esquerda, seta para direita, etc.).

EXIBINDO UMA IMAGEM


Para definir a imagem a ser exibida, o que feito definindo-se um valor para a propriedade Picture do componente Logotipo, execute os seguintes procedimentos: 1. Selecione o componente Logotipo. 2. No Object Inspector, selecione a sua propriedade Picture. 3. D um clique com o boto esquerdo do mouse sobre as reticncias (...) exibidas do lado direito da propriedade. Ser exibida a caixa de dilogo Picture Editor. 4. Para definir a figura a ser exibida, selecione o boto Load, que exibe a caixa de dilogo Load Picture, descrita anteriormente. 5. Selecione o arquivo C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\ splash\16color\Athena.bmp e clique no boto Open. 6. Selecione o boto OK na caixa de dilogo Picture Editor.

Figura 5.9: Exibio da imagem no componente.

94 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


O componente exibir a figura selecionada (Figura 5.9). No Object Inspector ser informado apenas o tipo de imagem a ser exibida pelo componente (TBitmap, TIcon, etc.), e no o diretrio e nome do arquivo. Isso se deve ao fato de que a imagem ser realmente armazenada no formulrio, e no apenas referenciada por ele. Altere a propriedade AutoSize do componente para True, para que a imagem seja totalmente visvel. Caso voc esteja trabalhando com outra resoluo, pode centralizar o componente selecionando-o e, com o boto direito do mouse, acessar a opo Position->Align do menu pop-up associado ao componente. Na caixa de dilogo que ser exibida, selecione a opo Center in window tanto para o alinhamento horizontal como para o alinhamento vertical. Estes procedimentos sero detalhados adiante, no tpico Alinhando Componentes.

EXIBINDO UM TEXTO NO FORMULRIO


Para exibir em um formulrio um texto que no deve ser alterado pelo usurio da aplicao, deve-se usar o componente Label, o quarto componente da pgina Standard da paleta de componentes. A principal propriedade desse componente a propriedade Caption, que define o texto que ser exibido. Para inserir um label no seu formulrio, execute os seguintes procedimentos: 1. Selecione a pgina Standard da paleta de componentes. 2. Selecione o componente Label. 3. Clique com o boto esquerdo do mouse sobre o formulrio. 4. Altere o valor da sua propriedade Caption para Fundamentos do Delphi 7 diretamente no Object Inspector. 5. No Object Inspector, atribua o valor 468 sua propriedade Left e 550 sua propriedade Top. O componente ser exibido no formulrio, como mostra a Figura 5.10.

Figura 5.10: Incluso de um rtulo no formulrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

95

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

ALTERANDO A FONTE DO TEXTO EXIBIDO EM UM COMPONENTE


Se voc no alterou as configuraes padres do ambiente e seguiu corretamente os passos descritos no tpico anterior, a fonte do texto exibido no rtulo inserido no formulrio ser a fonte default do ambiente, sem nenhum efeito especial. Vamos alterar algumas das suas caractersticas, de forma a tornar mais atraente o aspecto do formulrio principal da nossa aplicao. Como descrito anteriormente, a propriedade Font de um componente pode ser alterada selecionando este componente e clicando-se com o boto esquerdo do mouse sobre os trs pontinhos que so exibidos direita do valor da propriedade, para exibir a caixa de dilogo Font, mostrada na Figura 5.4. Altere as caractersticas da fonte para tamanho 24, estilo Negrito Itlico, efeito sublinhado e cor azul-marinho. Seu formulrio dever ficar com o aspecto mostrado na figura a seguir.

Figura 5.11: Redefinindo a fonte do rtulo no formulrio.

SELECIONANDO VRIOS COMPONENTES SIMULTANEAMENTE


Para selecionar mais de um componente de uma nica vez, execute os seguintes procedimentos: 1. Selecione o primeiro componente com o boto esquerdo do mouse. 2. Pressione a tecla Shift enquanto seleciona os demais componentes. Voc tambm pode desenhar com o mouse um retngulo que circunscreva todos os componentes a serem selecionados. Para isso, basta executar os seguintes procedimentos: 1. Pressione o boto esquerdo do mouse quando o seu ponteiro estiver sobre o ponto que definir o primeiro vrtice do retngulo no formulrio.

96 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO


2. Mantendo o boto esquerdo do mouse pressionado, arraste o seu ponteiro para a posio que definir o outro vrtice do retngulo ( medida que se arrasta o ponteiro do mouse, um retngulo pontilhado desenhado automaticamente). 3. Libere o boto esquerdo do mouse. Aps concluir o passo anterior, todos os componentes situados dentro do retngulo ou interceptados por ele estaro selecionados. Voc tambm pode selecionar todos os componentes presentes em um formulrio, selecionando o item Select All do menu Edit do Delphi 7.

ALINHANDO COMPONENTES
Quando inserimos vrios componentes em um formulrio, dificilmente conseguimos coloc-los em uma disposio bem organizada. Felizmente, o Delphi fornece um recurso que permite que os componentes sejam facilmente alinhados. Para ajustar a posio dos componentes Label1 e Logotipo, execute os seguintes procedimentos: 1. Selecione o componente Label1 e, pressionando a tecla Shift, selecione o componente Logotipo. Os dois componentes exibiro marcas de seleo. 2. Selecione o item Align do menu Edit. Ser exibida a caixa de dilogo Alignment, mostrada na Figura 5.12.

Figura 5.12: A caixa de dilogo Alignment.

Essa caixa de dilogo apresenta dois grupos de botes, um denominado Horizontal e outro denominado Vertical, com as seguintes opes: No change: A posio do(s) componente(s) no se altera na direo especificada. Essa opo est disponvel nos dois grupos de botes. Left sides: Os componentes so alinhados pela sua extremidade esquerda, tomando por base a extremidade esquerda do primeiro componente selecionado. Essa opo s existe no grupo Horizontal.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

97

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Centers: Os componentes so alinhados pelos seus centros, tomando por base o centro do primeiro componente selecionado. Essa opo est disponvel nos dois grupos de botes. Right sides: Os componentes so alinhados pela sua extremidade direita, tomando por base a extremidade direita do primeiro componente selecionado. Essa opo s existe no grupo Horizontal. Space equally: Os componentes so distribudos de forma que os seus centros se mantenham eqidistantes. Essa opo est disponvel nos dois grupos de botes. Center in window: O(s) componente(s) (so) centralizado(s) na janela. Essa opo est disponvel nos dois grupos de botes. Observao: se voc selecionar um nico componente, este ser centralizado na janela, mas, se voc selecionar um grupo de componentes, o centro desse grupo que ser alinhado com o centro do formulrio. Tops: Os componentes so alinhados pela sua extremidade superior, tomando por base a extremidade superior do primeiro componente selecionado. Essa opo s existe no grupo Vertical. Bottoms: Os componentes so alinhados pela sua extremidade inferior, tomando por base a extremidade inferior do primeiro componente selecionado. Essa opo s existe no grupo Vertical. 3. Como desejamos alinhar horizontalmente os componentes pelos seus pontos mdios, selecione a opo Centers, no grupo Horizontal, e No change, no grupo Vertical. 4. Clique no boto OK para fechar a caixa de dilogo. Para centralizar horizontalmente os componentes em conjunto no formulrio, execute os passos anteriores e selecione a opo Center in Window, nos grupos Horizontal e Vertical da caixa de dilogo Alignment. Seu formulrio deve ficar com o aspecto indicado na Figura 5.13.

Figura 5.13: Aspecto do formulrio aps o alinhamento dos componentes.

Repare que os valores armazenados nas propriedades Left e Top dos componentes devem ter sido alterados.

98 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CRIANDO O FORMULRIO PRINCIPAL DA APLICAO

ANALISANDO O CDIGO GERADO PELO DELPHI


Se voc analisar o cdigo da unit correspondente ao formulrio, ver a seguinte definio de classe:
type TFormPrincipal = class(TForm) Logotipo: TImage; Label1: TLabel; private { Private declarations } public { Public declarations } end;

Repare que a classe TFormPrincipal apresenta, entre seus campos, um componente do tipo TImage e outro do tipo TLabel, que no existem na classe TForm. Lembra-se do conceito de herana? A classe TFormPrincipal, derivada de TForm, herda suas propriedades e mtodos, e ainda acrescenta novas propriedades e mtodos (inexistentes em TForm).

TESTANDO A SUA APLICAO


At que nosso aplicativo est ficando com uma boa aparncia, porm est faltando algo muito comum em todos os aplicativos Windows: um menu. Vamos inclu-lo no prximo captulo, mas antes vamos fazer um pequeno teste da nossa aplicao. O Delphi permite que voc execute o seu aplicativo a partir de seu prprio ambiente de desenvolvimento. Isso permite que o comportamento e o desempenho da sua aplicao sejam analisados sem a necessidade de sair do ambiente do Borland Delphi 7, otimizando-se o tempo gasto no desenvolvimento da aplicao. Para testar seu aplicativo, basta executar um dos seguintes procedimentos: Selecionar o item Run do menu Run. Ou: Pressionar a tecla de funo F9. Ou: Na caixa de ferramentas, selecionar o boto que exibe uma seta verde. Repare que esse boto apresenta uma seta direita que permite selecionar o projeto a ser executado (no caso de se estar trabalhando com um grupo de projetos). Ao iniciar a sua execuo, o formulrio deve apresentar o aspecto da Figura 5.14. Em princpio, pode parecer que no se tem l grande coisa, apenas uma janela com um ttulo, uma imagem e nada mais. Tudo bem, no criamos nenhuma aplicao espetacular, mas sem escrever uma nica linha de cdigo j temos uma aplicao que consiste em uma janela principal com uma barra de ttulos, botes Maximizar (que nesse caso foi desabilitado por ns), Minimizar, Finalizao e um menu de sistema.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

99

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 5.14: Execuo do aplicativo a partir do ambiente de desenvolvimento.

Voc pode reposicionar a janela, clicando com o boto esquerdo do mouse sobre a sua barra de ttulos e, mantendo o boto esquerdo pressionado, arrast-la para a posio desejada, alternar para outra aplicao e posteriormente retornar. Tudo isso sem a necessidade de qualquer codificao, a no ser aquela gerada pelo prprio Delphi. De qualquer maneira, isso refora os argumentos de que a criao da interface apenas uma fase do desenvolvimento de um aplicativo.

FINALIZANDO A EXECUO DO APLICATIVO


Para finalizar o aplicativo, execute um dos seguintes procedimentos: Selecione o boto Finalizar (aquele quadradinho com um x no seu interior), situado na extremidade direita da barra de ttulos. Ou: Selecione o item Fechar no menu de sistema. Ou: Selecione o item Program Reset no menu Run (essa opo s vlida quando voc inicializa a aplicao com base no ambiente de desenvolvimento do Borland Delphi). Ou: Pressione simultaneamente as teclas Ctrl e F12 (essa opo s vlida quando voc inicializa a aplicao com base no ambiente de desenvolvimento do Borland Delphi).

100 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO

Captulo
Projetando um Menu Para a sua Aplicao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

101

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo, voc ver como simples a incluso de menus nas janelas formulrios da sua aplicao com o Delphi 7, e como associar eventos a itens de um menu.

FUNDAMENTOS EM: CRIAO DE MENUS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Incluso e manipulao de componentes em um formulrio.

METODOLOGIA
Apresentao e descrio das principais caractersticas de um menu.

TCNICA
Apresentao dos procedimentos necessrios incluso de um menu no formulrio principal da sua aplicao.

MENUS ELEMENTOS INDISPENSVEIS AO FORMULRIO PRINCIPAL DE UMA APLICAO


Dificilmente encontramos uma aplicao com interface grfica que no exiba um menu em sua janela principal, e seus aplicativos no devem fugir a essa (quase) regra; afinal de contas seus usurios esperam poder acessar alguns dos recursos dos seus aplicativos por meio dos menus existentes na janela principal. Nos prximos tpicos mostraremos como simples incluir essa caracterstica aos aplicativos desenvolvidos com o Delphi 7.

INCLUINDO UM MENU NA SUA APLICAO


A incluso de um menu em uma aplicao feita por meio da insero de um componente MainMenu no seu formulrio principal. O componente MainMenu est situado na pgina Standard da paleta de componentes ( o segundo componente desta pgina) e fornece acesso a um editor de menus. Para inserir um componente do tipo MainMenu no formulrio principal da aplicao, execute os seguintes procedimentos: 1. Exiba o formulrio principal. 2. Selecione o componente MainMenu, na pgina Standard da paleta de componentes, clicando nele com o boto esquerdo do mouse. 3. Clique novamente sobre o formulrio, no ponto em que o componente deve ser inserido. O componente MainMenu inserido no formulrio, como mostra a Figura 6.1. 4. Usando o Object Inspector, altere a propriedade Name do componente para MenuPrincipal. O componente MainMenu um exemplo de componente no-visual, isto , no estar visvel durante a execuo do aplicativo. Ele apenas representa um menu e fornece acesso a um editor de menus; nesse caso, portanto, a sua posio no formulrio no de grande relevncia.

102 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO

Figura 6.1: Insero de um componente MainMenu no formulrio principal da aplicao.

Observe que, quando voc inseriu o componente MainMenu no formulrio, o ambiente atribuiu o valor MainMenu1 sua propriedade Name e atribuiu esse mesmo valor propriedade Menu do formulrio (indicando que o menu que ser exibido no formulrio o representado por este componente). Quando posteriormente voc alterou o valor da propriedade Name do componente MainMenu para MenuPrincipal, o ambiente de desenvolvimento fez a alterao correspondente na propriedade Menu do formulrio. A criao dos menus e itens de menus no Delphi 7 feita em um editor de menus. No prximo tpico ser mostrado como acessar o editor de menus.

ACESSANDO O EDITOR DE MENUS


Para acessar o editor de menus, execute os seguintes procedimentos: 1. Selecione o componente MenuPrincipal, criado no tpico anterior. 2. D um duplo clique com o boto esquerdo do mouse sobre o componente MainMenu. O editor de menus exibido, com o primeiro menu selecionado, pronto para ser editado, como mostra a Figura 6.2.

Figura 6.2: O editor de menus.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

103

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


3. Selecione o Object Inspector e altere o valor da propriedade Name do objeto que est em destaque (um retngulo que representa o primeiro menu) para MenuSistema. 4. Usando o Object Inspector, altere o valor da propriedade Caption para &Sistema. 5. Selecione novamente o editor de menus. Como voc pode ver na Figura 6.3, foi criado o menu Sistema em que a letra S aparece sublinhada. Se voc j est acostumado a usar aplicativos Windows, sabe que uma letra sublinhada em um menu funciona como uma tecla de atalho, que permite que o menu seja acessado pressionando-se simultaneamente as teclas Alt e a tecla correspondente letra sublinhada. Foram criados tambm dois novos espaos: um espao direita, que permite a criao de um novo menu, e um espao sob o menu Sistema, para que se criem itens desse menu.

Figura 6.3: Criao do menu Sistema.

Os itens de menu (que so objetos da classe TMenuItem) possuem uma propriedade chamada AutoHotKeys que, se configurada corretamente, impede que dois itens de menu possuam a mesma tecla de atalho.

Esta propriedade pode assumir um dos valores a seguir: maAutomatic: Caso dois itens de menu possuam a mesma tecla de atalho, a do ltimo item automaticamente redefinida durante a execuo do aplicativo. maManual: Caso dois itens de menu possuam a mesma tecla de atalho, a do ltimo item redefinida mediante uma chamada ao mtodo RethinkHotKeys da classe TMenuItem. maParent: A redefinio das teclas de atallho de itens de menu segue a regra estabelecida pelo seu componente-pai. No caso de itens de menu, por exemplo, ser adotado o valor configurado na propriedade de mesmo nome do componente MainMenu ou PopupMenu que o contm. Voc tambm pode acessar o editor de menus clicando com o boto direito do mouse sobre o componente MenuPrincipal e selecionando o item Menu Designer no menu pop-up exibido. Outra opo consiste em selecionar no Object Inspector a propriedade Items do componente MainMenu. Crie ainda os seguintes menus para o nosso aplicativo-exemplo: Menu Scios Name: MenuSocios Caption: &Scios

104 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO


Menu Atividades Name: MenuAtividades Caption: &Atividades Menu Matrcula Name: MenuMatricula Caption: &Matrcula Menu Relatrios Name: MenuRelatorios Caption: &Relatrios Menu Help Name: MenuHelp Caption: &Help

Repare que a propriedade Name no pode conter acentuao, o que j no ocorre com a propriedade Caption.

A figura a seguir apresenta o aspecto do formulrio principal da aplicao, aps a incluso destes menus.

Figura 6.4: Aspecto do formulrio principal da aplicao, aps a incluso de todos os menus.

CRIANDO ITENS DE MENU


Como vimos no tpico anterior, a criao de menus e itens de menu feita usando-se o editor de menus do ambiente de desenvolvimento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

105

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Um item de menu , na realidade, um objeto da classe TMenuItem, cujas principais propriedades de um item de menu so: Caption: Uma cadeia de caracteres que define o texto exibido pelo item de menu. Checked: Uma varivel booleana que define se o item de menu deve ou no exibir uma marca de verificao, indicando que alguma opo est ativa. No Microsoft Word, por exemplo, uma marca de verificao no item Rgua do menu Exibir indica que a rgua est sendo exibida. Enabled: Uma varivel booleana que define se o item de menu est ou no habilitado. Quando essa propriedade tem o valor False, o item de menu est desabilitado e apresenta um aspecto acinzentado. GroupIndex: Essa propriedade define como os menus das janelas-filhas so mesclados com os menus da janela principal em uma aplicao MDI. ImageIndex: Define o ndice correspondente imagem do componente Imagelist associado ao componente MenuPrincipal que ser exibido com o item de menu. Caso no se queira exibir nenhuma imagem com o menu, o valor dessa propriedade deve ser igual a -1. Name: Define o nome pelo qual o objeto referenciado no cdigo da aplicao (lembre-se de que no Delphi um item de menu um objeto da classe TMenuItem). RadioItem: Uma varivel booleana que define se a marca de verificao de um item de menu deve ser uma marca circular. ShortCut: Essa propriedade define a combinao de teclas que executa a mesma ao que um item de menu. Essa combinao de teclas denominada tecla aceleradora de um item de menu. Em nossa aplicao, devemos oferecer ao usurio a possibilidade de incluir novos scios, atividades e matrculas, exclu-los ou alterar os seus dados cadastrais, e a cada uma dessas opes pode corresponder um item de menu. Alm disso, deve ser capaz de fazer cpia (backup) e restaurao destes dados. Para criar um item Backup no menu Sistema, execute os seguintes procedimentos: 1. Selecione o espao em branco que foi criado sob o menu Sistema. 2. Selecione o Object Inspector e altere o valor da sua propriedade Name para SistemaBackup. 3. Usando o Object Inspector, altere o valor da propriedade Caption para &Backup. 4. Selecione novamente o editor de menus.

Figura 6.5: Criao do item Backup no menu Sistema.

106 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO


Como voc pode ver na Figura 6.5, foi criado o item Backup no menu Sistema. Tambm foi includo um espao sob o item, para que seja criado um novo item de menu. Para criar os itens Restaurar e Finalizar deste menu, voc deve proceder de forma semelhante, definindo as seguintes propriedades para cada um dos itens.

Item Restaurar Finalizar

Name SistemaRestaurar SistemaFinalizar

Caption &Restaurar... &Finalizar...

A Figura 6.6 mostra o estado atual do nosso menu, aps a criao de mais esses dois itens.

Figura 6.6: Estado atual do menu Sistema.

CRIANDO UM SEPARADOR DE ITENS EM UM MENU


Para criar um separador de itens entre os itens Restaurar e Finalizar do menu Sistema, execute os seguintes procedimentos: 1. Selecione o item Finalizar do menu Sistema. 2. Pressione a tecla Ins para criar um novo item entre os itens Restaurar e Finalizar. Selecione o Object Inspector e altere o valor da propriedade Name deste novo item para Separador. 3. Usando o Object Inspector, altere o valor da propriedade Caption para - (isso mesmo, um sinal de subtrao, usado para criar um separador entre itens de menu). Pronto! Est criado o separador de itens de menu, como pode ser verificado na figura a seguir.

Figura 6.7: Criando um separador de itens de menu.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

107

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Os itens de menu (que so objetos da classe TMenuItem) possuem uma propriedade chamada AutoLineReduction que, se configurada corretamente, impede a incluso de dois separadores contguos, ou de um separador isolado no final de um menu.

Esta propriedade pode assumir um dos valores a seguir: maAutomatic: Caso haja separadores contguos, os excedentes sero automaticamente removidos durante a execuo do aplicativo. maManual: Caso haja separadores contguos, os excedentes sero removidos durante a execuo do aplicativo mediante uma chamada ao mtodo RethinkLines da classe TMenuItem. maParent: A remoo de separadores contguos segue a regra estabelecida pelo seu componentepai. No caso de itens de menu, por exemplo, ser adotado o valor configurado para o componente MainMenu ou PopupMenu que o contm.

CRIANDO TECLAS ACELERADORAS PARA ITENS DE MENU


Para criar teclas aceleradoras para itens de menus, basta definir corretamente sua propriedade ShortCut no Object Inspector. Desta maneira, para definir como Ctrl+X as teclas aceleradoras do item Finalizar do menu sistema, execute os seguintes procedimentos: 1. Acesse o editor de menus. 2. Selecione o item Finalizar deste menu. 3. No Object Inspector, altere o valor da propriedade ShortCut deste item para Ctrl+X. A figura a seguir apresenta o aspecto deste menu, aps a criao das teclas aceleradoras para o item Finalizar do menu Sistema.

Figura 6.8: Criao das teclas aceleradoras para o item Finalizar do menu Sistema.

CRIANDO OUTROS ITENS DE MENU


Devemos ainda criar os itens dos demais menus do nosso aplicativo-exemplo, seguindo os procedimentos que sero apresentados ainda neste tpico.

108 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO


Para criar um item Cadastrar no menu Scios, execute os seguintes procedimentos: 1. Acesse o editor de menus e selecione o espao em branco que foi criado sob o menu Scios. 2. Selecione o Object Inspector e altere o valor da sua propriedade Name para SociosCadastro. 3. Usando o Object Inspector, altere o valor da propriedade Caption para &Cadastro. 4. Selecione novamente o editor de menus. Para criar os itens Alterao,Excluso e Consulta deste menu, voc deve proceder de forma semelhante, definindo as seguintes propriedades para cada um dos itens.

Item Alterao Excluso Consulta

Name SociosAlteracao SocioExclusao SocioConsulta

Caption &Alterao... &Excluso &Consulta

uma conveno de que, em programas desenvolvidos para o ambiente Windows, itens de menu que provoquem a exibio de caixas de dilogo terrminem com trs pontinhos.

Execute procedimentos semelhantes para criar os itens Cadastro, Alterao, Excluso e Consulta do menu Atividades. Para o menu Matrculas, crie os itens Cadastro, Excluso e Consulta. Para o menu Relatrios, crie os itens Scios, Atividades e Matrculas. Para o menu Help, crie os itens Tpicos e Sobre.

INCLUINDO UM MENU POP-UP NA SUA APLICAO


A incluso de um menu pop-up em uma aplicao feita por meio da insero de um componente PopupMenu no seu formulrio principal (o componente PopupMenu est situado na pgina Standard da paleta de componentes e o terceiro componente desta pgina). Para inserir um componente do tipo PopupMenu no formulrio principal da aplicao, execute os seguintes procedimentos: 1. Selecione o formulrio principal. 2. Selecione o componente PopupMenu, na pgina Standard da paleta de componentes. 3. Clique novamente com o mouse sobre o formulrio, no ponto em que o componente deve ser inserido. O componente PopupMenu inserido no formulrio, como mostra a Figura 6.9. 4. Usando o Object Inspector, altere a propriedade Name do componente para PopupPrincipal.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

109

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 6.9: Insero de um componente PopupMenu no formulrio principal da aplicao.

5. Usando o Object Inspector, altere a propriedade PopupMenu do componente FormPrincipal para PopupPrincipal.

CRIANDO ITENS DE MENU EM UM MENU POP-UP


A criao de itens em um menu pop-up feita por meio de um editor de menus vinculado a este componente, acessado da mesma forma que no caso do menu principal da aplicao. Para criar itens do menu pop-up, execute os seguintes procedimentos: 1. Selecione o componente PopupPrincipal, criado no tpico anterior. 2. D um duplo clique com o boto esquerdo do mouse sobre o componente PopupMenu. O editor de menus pop-up exibido, com o primeiro item selecionado, pronto para ser editado, como mostra a Figura 6.10.

Figura 6.10: Acessando o editor de menus com base no menu pop-up.

3. Altere os valores das suas propriedades Name e Caption para PopupSistema e &Sistema, respectivamente.

110 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO


4. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up, como mostra a Figura 6.11.

Figura 6.11: Criando o menu Sistema no menu pop-up.

5. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up. 6. Altere os valores de suas propriedades Name e Caption para PopupScios e &Scios, respectivamente. 7. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up. 8. Altere os valores de suas propriedades Name e Caption para PopupAtividades e &Atividades, respectivamente. 9. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up. 10. Altere os valores de suas propriedades Name e Caption para PopupMatriculas e &Matrculas, respectivamente. 11. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up. 12. Altere os valores de suas propriedades Name e Caption para PopupRelatorios e &Relatrios, respectivamente. 13. Pressione o boto de seta para baixo, para exibir o espao destinado ao prximo menu pop-up. 14. Altere os valores de suas propriedades Name e Caption para PopupHelp e &Help, respectivamente. Seu menu pop-up ficar com o aspecto da Figura 6.12.

Figura 6.12: Criando o menu pop-up.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

111

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

CRIANDO SUBMENUS NO MENU POP-UP


No tpico anterior criamos os menus pop-up da nossa aplicao. Para incluir os seus itens, no entanto, teremos que introduzir o conceito de submenu. Para inserir os itens do menu Sistema no submenu correspondente, execute os seguintes procedimentos: 1. Selecione o menu Sistema do menu pop-up e pressione o boto direito, para exibir o menu suspenso mostrado na Figura 6.13.

Figura 6.13: Exibindo o menu suspenso do editor de menus.

2. Selecione o item Create Submenu, e o submenu ser criado, como mostra a Figura 6.14. A seta exibida ao lado da palavra Sistema foi includa automaticamente pelo editor de menus. 3. Altere os valores das propriedades Name e Caption desse item para PopupSistemaBackup e &Backup, respectivamente.

Figura 6.14: Criando um submenu no menu pop-up do editor de menus.

4. Pressione o boto de seta para baixo, para criar um novo item. 5. Altere os valores das suas propriedades Name e Caption para PopupSistemaRestaurar e &Restaurar, respectivamente. 6. Pressione o boto de seta para baixo, para criar um novo item e crie um separador de itens de menu. 7. Pressione o boto de seta para baixo, para criar um novo item. 8. Altere os valores das suas propriedades Name e Caption para PopupSistemaFinalizar e &Finalizar, respectivamente.

112 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO


Seu menu pop-up deve estar como o da Figura 6.15.

Figura 6.15: Criando itens em um submenu no menu pop-up do editor de menus.

Repita os passos anteriores para criar os demais submenus. Para o menu pop-up Scios, inclua os seguintes itens no seu submenu.

Item Cadastro Alterao Excluso Consulta

Name PopupSociosCadastro PopupSociosAlteracao PopupSocioExclusao PopupSocioConsulta

Caption &Cadastro... &Alterao... &Excluso &Consulta

Para o menu pop-up Atividades, inclua os seguintes itens no seu submenu.

Item Cadastro Alterao Excluso Consulta

Name PopupAtividadesCadastro PopupAtividadesAlteracao PopupAtividadesExclusao PopupAtividadesConsulta

Caption &Cadastro... &Alterao... &Excluso &Consulta

Para o menu pop-up Matriculas, inclua os seguintes itens no seu submenu.

Item Cadastro Excluso Consulta

Name PopupMatriculasCadastro PopupMatriculasExclusao PopupMatriculasConsulta

Caption &Cadastro... &Excluso &Consulta

Para o menu pop-up Relatrios, inclua os seguintes itens no seu submenu.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

113

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Item Scios Atividades Matrculas

Name PopupRelatoriosSocios PopupRelatoriosAtividades PopupRelatoriosMatriculas

Caption &Scios... &Atividades &Matrculas

Para o menu pop-up Help, inclua os seguintes itens no seu submenu.

Item Tpicos Sobre

Name PopupHelpTopicos PopupHelpSobre

Caption &Tpicos &Sobre

ASSOCIANDO EVENTOS A ITENS DE MENU


A associao de um evento a um item de menu feita de forma semelhante associao de um evento a qualquer outro componente ou formulrio (lembra-se da criao de um procedimento associado ao evento OnActivate de um formulrio, feita no Captulo 2?). A nica diferena que os itens de menu no so vistos como um componente inserido em um formulrio e, para selecionar um deles, voc precisa usar a caixa de seleo de objetos do Object Inspector ou o editor de menus. Vamos agora criar um evento associado ao item Finalizar do menu Sistema. Como o prprio nome indica, queremos que esse item de menu finalize a execuo da aplicao; logo devemos incluir a seguinte linha de cdigo no procedimento associado ao evento OnClick desse item de menu:
Application.Terminate;

Como esse o formulrio principal da aplicao e, ao se fechar o formulrio principal de uma aplicao, esta encerrada, poderamos alternativamente incluir a seguinte linha de cdigo, em vez da mostrada anteriormente:
FormPrincipal.Close;

Para criar o procedimento associado ao evento OnClick do item Finalizar do menu Sistema, basta executar os seguintes procedimentos: 1. Na caixa de seleo de objetos do Object Inspector, selecione o objeto SistemaFinalizar, como mostra a Figura 6.16. 2. Selecione a pgina Events do Object Inspector, se ela j no estiver selecionada. 3. D um duplo clique no campo direita do evento a ser definido (no caso, o evento OnClick). 4. Inclua a linha de cdigo acima, como mostra a Figura 6.17.

114 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 PROJETANDO UM MENU PARA A SUA APLICAO

Figura 6.16: Selecionando o objeto SistemaFinalizar no Object Inspector.

Agora sua aplicao pode ser finalizada selecionando-se o item Finalizar do menu Sistema ou por meio da combinao de teclas Ctrl+X. Execute a aplicao e verifique o seu funcionamento.

Figura 6.17: Incluso de uma linha de cdigo no procedimento associado ao evento OnClick de um item de menu.

DEFININDO PROCEDIMENTOS ASSOCIANDO EVENTOS PARA ITENS DE MENU POP-UP


A associao de um evento a um item de menu pop-up feita de forma semelhante associao de um evento a um item de menu.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

115

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Se voc tiver um item de menu pop-up que deva realizar a mesma tarefa de um item de menu comum, basta estabelecer uma correspondncia entre o procedimento associado ao evento OnClick desse ltimo e o evento OnClick do item de menu pop-up. A isso denominamos compartilhamento de eventos (dois objetos compartilham um mesmo evento). Esse o caso, por exemplo, do item Finalizar do menu pop-up Sistema. Para criar o procedimento associado ao evento OnClick do item Finalizar do menu pop-up Sistema, faa o seguinte: 1. Na caixa de seleo de objetos do Object Inspector, selecione o objeto PopupSistemaFinalizar, como mostra a Figura 6.18. 2. Selecione a pgina Events do Object Inspector, se ela j no estiver selecionada. 3. Associe o evento OnClick desse objeto ao evento OnClick do objeto SistemaFinalizar, como mostra a Figura 6.19. Dessa forma, o mesmo procedimento estar associado aos eventos OnClick dos objetos SistemaFinalizar e PopupSistemaFinalizar.

Figura 6.18: Selecionando o objeto PopupSistemaFinalizar no Object Inspector.

Figura 6.19: Definindo o procedimento associado ao evento OnClick do objeto PopupSistemaFinalizar.

116 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 MANIPULANDO FORMULRIOS E CAIXAS DE DILOGO

Captulo
Manipulando Formulrios e Caixas de Dilogo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

117

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentadas as tcnicas de manipulao de caixas de dilogo, exemplificadas por meio da criao de uma caixa de dilogo usada para exibir informaes sobre direitos autorais.

FUNDAMENTOS EM: CRIAO DE CAIXAS DE DILOGO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores).

METODOLOGIA
Apresentao e descrio das principais caractersticas de uma caixa de dilogo.

TCNICA
Apresentao dos procedimentos necessrios exibio de caixas de dilogo a partir da janela principal de uma aplicao.

CAIXAS DE DILOGO ELEMENTOS DE INTERFACE QUE DO VIDA AO SEU APLICATIVO


Geralmente uma aplicao com interface grfica composta por vrias janelas e caixas de dilogos (que o Delphi 7 chama de formulrios). Neste captulo sero apresentados os procedimentos necessrios criao de uma caixa de dilogo bastante simples e sua exibio a partir da seleo de um item de menu.

CRIANDO UMA CAIXA DE DILOGO DE DIREITOS AUTORAIS


Para criar uma caixa de dilogo de direitos autorais, voc pode usar um dos formulrios predefinidos do Delphi 7, executando os seguintes procedimentos: 1. Selecione o item New/Other do Delphi 7. Ser exibida a caixa de dilogo New Items, tambm denominada Repositrio de Objetos.

Figura 7.1: Seleo da opo About box da caixa de dilogo New Items.

118 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 MANIPULANDO FORMULRIOS E CAIXAS DE DILOGO


2. Selecione a opo About box na pgina Forms da caixa de dilogo New Items, como mostra a Figura 7.1. 3. Clique no boto OK, para fechar essa caixa de dilogo e criar o novo formulrio. Ser criada a caixa de dilogo About, mostrada na Figura 7.2.

Figura 7.2: A caixa de dilogo About.

Altere as propriedades Name e Caption desse formulrio para FormSobre e Informaes Gerais, respectivamente. Repare que essa caixa de dilogo j possui os seguintes componentes: Um componente do tipo boto de comando, que o ambiente chamou de OkButton. Um componente de exibio de imagens, que o ambiente chamou de ProgramIcon. Quatro componentes do tipo Label para exibio de texto, que o ambiente chamou de ProductName, Version, Copyright e Comments. Um componente chamado Panel1, usado para criar um painel no formulrio. No prximo tpico mostraremos os procedimentos necessrios personalizao desta caixa de dilogo.

PERSONALIZANDO A CAIXA DE DILOGO DE DIREITOS AUTORAIS


Para personalizar a sua caixa de dilogo de direitos autorais, execute os seguintes procedimentos: 1. Altere o valor da propriedade Caption de ProductName para Cadastro de Scios. 2. Altere o valor da propriedade Caption do label Version para Verso 1.0. 3. Altere o valor da propriedade Caption do label Copyright para Direitos Autorais. 4. Altere o valor da propriedade Caption do label Comments para o nome do autor do programa. 5. Altere o valor da propriedade WordWrap do label Comments para False. 6. Defina como True o valor da propriedade AutoSize de todos os labels (j deve estar definido).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

119

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


7. Centralize horizontalmente todos os labels, usando a caixa de dilogo Alignment, apresentada no Captulo 5. 8. Defina como True a propriedade AutoSize do componente ProgramIcon. 9. Carregue a imagem do arquivo Earth.bmp na propriedade Picture do componente ProgramIcon. 10. Salve o arquivo de cdigo associado a este formulrio com o nome UnitSobre.pas, usando o item Save As do menu File. Seu formulrio deve ficar como o da Figura 7.3.

Figura 7.3: Aspecto final do formulrio de direitos autorais.

EXIBINDO UMA CAIXA DE DILOGO


No tpico anterior criamos uma caixa de dilogo chamada FormSobre, contendo informaes de direitos autorais. No entanto, surge agora um pequeno problema: como exibir esse formulrio? evidente que esse formulrio dever ser exibido quando o usurio selecionar o item Sobre do menu Help. Um formulrio (ou uma caixa de dilogo) pode ser exibido de duas formas: como uma caixa de dilogo modal ou como uma caixa de dilogo no-modal. Uma caixa de dilogo modal aquela que no permite que se execute qualquer ao no programa fora da caixa de dilogo at que esta seja fechada, ao passo que uma caixa de dilogo no-modal no impe essa restrio. Um exemplo de caixa de dilogo modal a caixa de dilogo Abrir do Microsoft Word, acessada por meio do item Abrir do menu Arquivo. Um exemplo de caixa de dilogo no-modal a caixa de dilogo Localizar do Microsoft Word, acessada por meio do item Localizar do menu Edit. Um objeto formulrio apresenta dois mtodos (herdados da classe TForm), denominados Show e ShowModal, que podem ser usados para exibi-lo. Para exibir uma caixa de dilogo modal, basta executar o mtodo ShowModal do formulrio, enquanto, para exibir uma caixa de dilogo no-modal, basta executar o seu mtodo Show. Inicialmente, temos de definir se essa caixa de dilogo ser modal ou no-modal. Neste exemplo, vamos optar por uma caixa de dilogo modal, como geralmente acontece na maioria das aplicaes.

120 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 MANIPULANDO FORMULRIOS E CAIXAS DE DILOGO


No nosso caso queremos que, quando o item Sobre do menu Help for selecionado, essa caixa de dilogo seja exibida como uma caixa de dilogo modal. Temos ento a seguinte situao: quando o usurio selecionar o item Sobre do menu Help (quando ocorrer o evento OnClick desse item de menu), a caixa de dilogo deve ser exibida como uma caixa de dilogo modal (o mtodo ShowModal do formulrio deve ser executado). Dessa maneira, devemos incluir a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Sobre do menu Help do formulrio principal da aplicao:
FormSobre.ShowModal;

Para incluir essa linha de cdigo no procedimento associado ao evento OnClick do item Sobre do menu Help, basta executar os seguintes procedimentos: 1. Exiba o formulrio FormPrincipal e selecione o objeto HelpSobre (que um item de menu), usando a caixa de seleo de objetos do Object Inspector. 2. Selecione a pgina Events do Object Inspector, se ela j no estiver selecionada. 3. D um duplo clique no campo direita do evento a ser definido (no caso, o evento OnClick). 4. Inclua a linha de cdigo acima, como mostra a Figura 7.4.

Figura 7.4: Incluso de uma linha de cdigo no procedimento associado ao evento OnClick de um item de menu.

5. Associe esse procedimento ao evento OnClick do item Sobre do menu pop-up criado no captulo anterior. Tente executar a sua aplicao. Infelizmente ela no compilar de imediato e ser exibida uma mensagem de advertncia (Figura 7.5), informando que o formulrio FormPrincipal faz referncia ao formulrio FormSobre, declarado na unit UnitSobre, mas cujo nome no est includo na clusula uses da unit

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

121

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


que declarou o formulrio Principal, e esta caixa de dilogo pergunta se voc deseja inclu-la. Selecione o boto Yes, e o ambiente de desenvolvimento far as alteraes necessrias.

Figura 7.5: Mensagem de advertncia do Delphi.

Tente executar outra vez a sua aplicao. Agora o programa funcionar normalmente e, quando o usurio selecionar o item Sobre do menu Help, a caixa de dilogo ser exibida como uma caixa de dilogo modal, como mostra a Figura 7.6.

Figura 7.6: Exibindo uma caixa de dilogo modal.

No prximo tpico, vamos examinar o componente boto de comando, includo automaticamente no formulrio quando o mesmo foi criado, usando a caixa de dilogo New Items.

O COMPONENTE BOTO DE COMANDO


O boto de comando um dos objetos vistos com maior freqncia nos aplicativos com interface grfica. Ele apresenta formato retangular e normalmente se espera que algo acontea quando selecionado com o boto esquerdo do mouse.

122 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 MANIPULANDO FORMULRIOS E CAIXAS DE DILOGO


O boto de comando (um objeto da classe TButton) est localizado na pgina Standard da paleta de componentes ( o stimo componente desta pgina), e suas principais propriedades so apresentadas a seguir.

PRINCIPAIS PROPRIEDADES DO COMPONENTE BOTO DE COMANDO


Entre as principais propriedades de um boto de comando, possvel destacar: Cancel: Essa propriedade, que pode assumir os valores True (verdadeiro) e False (False), indica se o boto deve associar o seu evento OnClick ao pressionamento da tecla Esc isto , se voc definir o seu valor como True, pressionar a tecla Esc ser equivalente a selecionar o componente com o boto esquerdo do mouse. Caption: Essa propriedade define o texto a ser exibido pelo boto. Default: Essa propriedade, que pode assumir os valores True (verdadeiro) e False (False), indica se o boto deve associar o seu evento OnClick ao pressionamento da tecla Enter isto , se voc definir o seu valor como True, pressionar a tecla Enter ser equivalente a selecionar o componente com o boto esquerdo do mouse. Enabled: Essa propriedade, que pode assumir os valores True (verdadeiro) e False (Falso), indica se o boto est habilitado. Quando o boto est desabilitado (a propriedade Enable tem o valor False), apresenta um aspecto acinzentado e no pode ser selecionado. Font: Define a fonte do texto exibido na propriedade Caption. ModalResult: Essa propriedade usada para encerrar a execuo de um quadro de dilogo modal. Voc pode definir qualquer uma das constantes predefinidas do Delphi, como mrNone, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrYes, mrNo e mrAll. Quando voc criou o formulrio FormSobre, o ambiente atribuiu o valor mrOk propriedade ModalResult do componente OkButton. Dessa maneira, quando esse boto for selecionado com o boto esquerdo do mouse, o formulrio ser fechado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

123

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

124 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 FUNDAMENTOS DO PROJETO DE APLICATIVOS DE BANCO DE DADOS

Captulo
Fundamentos do Projeto de Aplicativos de Banco de Dados

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

125

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo, voc ser apresentado aos fundamentos do projeto de aplicativos de bancos de dados com o Delphi 7. Sero apresentados os fundamentos do mecanismo de acesso a bancos de dados multiplataforma denominado DBExpress, incorporado na verso 6 do Delphi.

FUNDAMENTOS EM: MECANISMOS DE ACESSO A BANCOS DE DADOS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Utilizao de utilitrios para o ambiente Windows.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados ao desenvolvimento de aplicaes que acessem bancos de dados, e seus mecanismos de acesso.

TCNICA
Apresentao dos mecanismos de acesso a bancos de dados presentes no Delphi 7.

MECANISMOS DE ACESSO A BANCOS DE DADOS


Um dos fatores que impulsionaram o sucesso das verses anteriores do Delphi foi a capacidade de se criar uma aplicao capaz de acessar diferentes tipos de bancos de dados, com praticamente nenhuma alterao na sua interface. Uma mesma aplicao poderia ser desenvolvida para acessar tabelas Paradox e, com pequenas alteraes, acessar tabelas do Interbase, do Access, SQL Server ou qualquer outro dos principais bancos de dados disponveis no mercado. A escalabilidade de aplicaes era uma realidade. Isso se deve ao fato de, desde o lanamento da sua primeira verso, uma aplicao desenvolvida em Delphi no acessar diretamente um banco de dados, mas faz-lo atravs de uma camada intermediria, denominada mecanismo de acesso. Inicialmente, o nico mecanismo de acesso disponvel era o Borland Database Engine BDE um conjunto de DLLs desenvolvido pela prpria Borland. A aplicao acessava o BDE e este acessava o banco de dados. A partir da verso 5, o Borland Delphi passou a incluir componentes especiais, que permitiam que a aplicao acessasse outro mecanismo de acesso a banco de dados o ADO (Activex Data Objects) da Microsoft. Alm disso, foram tambm includos componentes para acesso nativo (e exclusivo) ao interbase (denominados Interbase Express). O lanamento da verso 6 do Delphi (junto com o Kylix) trouxe um novo mecanismo de acesso denominado DBExpress presente nos dois ambientes de desenvolvimento e que facilita o desenvolvimento de aplicaes multiplataforma. O Delphi 6, no entanto, continuava a oferecer suporte ao BDE e ao ADO, e estes mecanismos continuam presentes na verso 7. Embora este livro tambm aborde o acesso a bancos de dados via BDE e ADO, inicialmente ser abordado o DBExpress, por ser multiplataforma e se tratar da nova aposta da Borland no que se refere a mecanismos

126 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 FUNDAMENTOS DO PROJETO DE APLICATIVOS DE BANCO DE DADOS


de acesso a bancos de dados (a Borland j anuncia, inclusive, que deixar de dar suporte ao BDE, embora este ainda esteja presente).

FUNDAMENTOS EM: CONCEITOS FUNDAMENTAIS SOBRE BANCOS DE DADOS


PR-REQUISITOS
Noes bsicas sobre dados e informaes.

METODOLOGIA
Apresentao e descrio dos termos fundamentais relacionados criao e acesso a bancos de dados.

CONCEITOS FUNDAMENTAIS
Um banco de dados consiste em uma forma organizada de armazenamento de informaes, mas seu conceito no representa uma inovao da era da informtica. H muito tempo as corporaes (empresas, escolas, hospitais, rgos governamentais, etc.) que necessitam manipular grande quantidade de informaes armazenam dados de forma organizada e, antes que os custos da implantao de sistemas informatizados cassem a nveis compatveis com a realidade econmica das pequenas e mdias empresas, estas organizavam seus dados e informaes em enormes arquivos de ao. A informatizao trouxe, entre outros benefcios, a impressionante reduo do espao necessrio ao armazenamento dessas informaes e uma maior rapidez em sua consulta e pesquisa. Atualmente, muitas empresas disponibilizam um mesmo conjunto de informaes em um banco de dados acessvel localmente, pela Internet ou atravs de uma Intranet. Antes da informatizao, esses bancos de dados consistiam em enormes arquivos de ao utilizados para armazenar dados dos scios, dados de atividades, etc. Os dados dos scios, por exemplo, eram guardados em fichas armazenadas em ordem alfabtica, e cada ficha continha uma srie de campos nos quais eram guardadas informaes como nome, endereo, CPF, etc. Quando se cadastrava um novo scio, uma nova ficha (um novo registro) deveria ser preenchida e armazenada (inserida) no local correto. Qualquer operao de busca de informaes deveria ser feita dessa forma, e o armazenamento incorreto de uma ficha produzia enormes transtornos. O mesmo era vlido para as informaes das atividades, matrculas, etc. Embora os antigos arquivos de ao tenham sido substitudos, muitos dos seus conceitos permanecem vlidos. Os dados dos scios continuam a ser armazenados em arquivos, porm estes so agora arquivos de dados armazenados em meios magnticos especiais (disquetes, discos rgidos, CDs-ROM, Zip disks, DVDs, etc.). Esses arquivos tambm contm fichas, que passaram a ser denominadas registros, e em cada registro (como nas fichas) existem diversos campos. No caso do nosso arquivo de scios, por exemplo, cada registro ser usado para armazenar as informaes de um determinado scio, com um campo para o nome, outro para o endereo, etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

127

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

CUSTOS
Ao se desenvolver um aplicativo que acesse bancos de dados deve-se considerar tambm os custos envolvidos na aquisio de licenas que permitam a sua utilizao de forma legal. Estes custos, no entanto, podem ser considerados elevados para pequenas empresas, e para estas situaes h a alternativa de se empregar bancos de dados gratuitos, como a verso OpenSource do Interbase e o MySQL. Neste livro abordaremos em nossos exemplos o Interbase, que por ser um produto da Borland e estar presente no prprio CD do Delphi, certamente estar ao alcance de nossos leitores.

PLANEJANDO SEU BANCO DE DADOS


Como j enfatizamos no Captulo 4, um planejamento adequado fundamental para o desenvolvimento de uma boa aplicao. Neste livro, adotamos como exemplo o desenvolvimento de uma aplicao para gerenciamento de dados referentes aos scios de um clube. Numa organizao deste tipo, comum que se armazenem informaes a respeito dos scios, atividades e matrculas. Vejamos agora como estes dados devem ser organizados: cada scio do clube pode se matricular em zero, uma ou mais atividades. Podemos ento concluir que um scio pode estar relacionado a vrias atividades. A recproca tambm verdadeira, pois numa nica atividade podem estar matriculados mais de um scio. Neste caso, diz-se que h uma relao de N x N entre scios e atividades, e desta forma no seria muito razovel armazenar todos os dados de um scio juntamente com os dados de cada uma das atividades (e viceversa), pois estaramos armazenando repetidamente (vrias vezes) uma grande quantidade de informaes. A concluso a que se chega que os dados dos scios e das atividades devem ser armazenados em tabelas distintas, e cada scio deve ter um cdigo exclusivo, que o diferencie dos demais. Na linguagem de banco de dados, um campo exclusivo em uma tabela (cujo valor no pode ser repetido) denominado chave primria. Toda tabela deve ter ao menos um campo definido como chave primria, e quando isto no for possvel pode-se usar mais de um campo, definindo-se o que se chama de uma chave primria composta. O mesmo se aplica s atividades. Alm disso, para cada scio devem-se armazenar, alm do seu cdigo exclusivo, dados como o seu nome, seu CPF e seu endereo. Da mesma forma, para cada atividade devem-se armazenar tambm sua descrio e o valor da atividade. Alm das tabelas que armazenam os dados dos scios e das atividades, devemos ainda criar uma tabela para armazenar os dados das matrculas. Nesta tabela devem ser definidos campos para armazenar o cdigo do scio e da atividade, (criando, desta forma, um relacionamento entre os scios e as atividades. Agora que j fizemos um esboo de como os dados sero armazenados, veremos no prximo captulo como criar as tabelas que sero usadas no nosso aplicativo. Nesta edio do livro optei por criar, nesta primeira parte, uma aplicao extremamente simples, de modo a facilitar a assimilao dos conceitos fundamentais, sem a necessidade de se digitar cdigos extensos e sujeitos a erros.

128 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Captulo

Fundamentos de Bancos de Dados

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

129

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo voc aprender a criar as tabelas do Interbase que sero acessadas pela nossa aplicao. A opo pelo Interbase considerou o fato de que h uma verso que acompanha o prprio Delphi, e por ser multiplataforma, facilitando a migrao, para o ambiente Linux, de aplicaes desenvolvidas com base na biblioteca CLX e nesta base de dados.

FUNDAMENTOS EM: CRIAO DE TABELAS DO INTERBASE


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Utilizao de utilitrios para o ambiente Windows.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados ao desenvolvimento de tabelas para bancos de dados do Interbase.

TCNICA
Apresentao dos procedimentos necessrios criao de tabelas do tipo Interbase com o Database Desktop, utilitrio para criao de tabelas que acompanha o Delphi 7.

CONCEITOS FUNDAMENTAIS
Nesta primeira parte do livro so apresentados os procedimentos necessrios ao desenvolvimento de aplicaes que acessam localmente tabelas do Interbase.

CRIANDO UM BANCO DE DADOS NO INTERBASE


O Interbase um banco de dados cliente-servidor. Nada nos impede, no entanto, de utiliz-lo como um banco de dados Desktop (ou local). Para criar um banco de dados chamado Clube no Interbase, voc deve executar os seguintes procedimentos: 1. Iniciar o aplicativo IBConsole, disponvel no grupo de programas Interbase do Windows, e cuja tela principal apresentada na Figura 9.1. 2. Selecione o item Local Server, no painel esquerdo do IBConsole, como mostrado na Figura 9.2. 3. D um duplo clique sobre o item selecionado ou selecione o item Login do menu Server, para exibir a caixa de dilogo Server Login mostrada na Figura 9.3. 4. Nesta caixa de dilogo, voc deve, inicialmente, usar o nome de usurio (username) SYSDBA e a senha (password) masterkey, que j esto preconfigurados. 5. Selecione o boto Login para fechar esta caixa de dilogo e se conectar ao servidor local.

130 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Figura 9.1: A tela principal do IBConsole.

Figura 9.2: Selecione o item Local Server no painel esquerdo do IBConsole.

Figura 9.3: A caixa de dilogo Server Login.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

131

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Um servidor pode conter diversos bancos de dados. Repare que neste caso a conexo foi feita ao servidor, e no a um banco de dados.

6. Selecione o item Create Database, do menu Database, para exibir a caixa de dilogo mostrada na figura a seguir, na qual so fornecidas as informaes necessrias criao do banco de dados. Voc dever informar o nome do banco de dados (com extenso gdb, que a extenso padro para um banco de dados do Interbase) a ser criado e um alias (neste caso, CLUBE).

Figura 9.4: A caixa de dilogo Create Database.

7. Selecione o boto Ok, para fechar a caixa de dilogo e criar o banco de dados. O painel esquerdo do IBConsole mostra o banco de dados que acabou de ser criado (identificado pelo seu alias), como mostra a Figura 9.5.

Figura 9.5: Criao do banco de dados CLUBE.

132 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS


8. Com o banco de dados CLUBE selecionado, selecione o item Disconnect do menu Database. Ser exibida uma mensagem solicitando uma confirmao para fechar o banco de dados, como mostra a Figura 9.6.

Figura 9.6: Mensagem de confirmao.

CRIANDO TABELAS COM O DATABASE DESKTOP


O Database Desktop um utilitrio independente que acompanha o Borland Delphi 7, mas que pode ser acessado a partir de seu ambiente de desenvolvimento. Ser utilizado por estar disponvel e por simplificar o processo de criao de tabelas de bancos de dados do Interbase para o ambiente Windows. Para iniciar o Database Desktop a partir do ambiente de desenvolvimento integrado do Borland Delphi 7, basta selecionar o item Database Desktop no menu Tools. Ser exibida a janela principal do Database Desktop, como mostra a Figura 9.7.

Figura 9.7: A janela principal do Database Desktop.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

133

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Antes de criarmos uma tabela para o nosso banco de dados, devemos criar um Alias (nome alternativo) para o mesmo, o que pode ser feito a partir do prprio Database Desktop. Este alias no deve ser confundido com aquele usado pelo IBConsole. Para criar um alias para o banco de dados Clube com o Database Desktop, execute os seguintes procedimentos: 1. Selecione o item Alias Manager no menu Tools do Database Desktop. Ser exibida a caixa de dilogo mostrada na Figura 9.8.

Figura 9.8: A caixa de dilogo Alias Manager do Database Desktop.

2. Selecione o boto New para criar um novo Alias, e configure-o como mostrado na Figura 9.9. 3. Selecione o boto Ok, para criar o alias. Ser mostrada a mensagem de confirmao mostrada na Figura 9.10. Selecione Yes para confirmar a sua criao.

Figura 9.9: Configurando o Alias na caixa de dilogo Alias Manager do Database Desktop.

134 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Figura 9.10: Confirmando a criao do Alias.

Para criar uma tabela com o Database Desktop, execute os seguintes procedimentos: 1. Selecione o item New do menu File. Ser exibido um submenu, com as opes QBE Query, SQL File e Table, como mostra a Figura 9.11.

Figura 9.11: O submenu exibido quando o item New do menu File selecionado.

2. Selecione o item Table do submenu File. Ser exibida a caixa de dilogo Create Table, como mostra a Figura 9.12.

Figura 9.12: A caixa de dilogo Create Table.

A caixa de dilogo Create Table permite que voc selecione os seguintes tipos de tabela: Paradox 7

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

135

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Paradox 5.0 for Windows Paradox 4 Paradox 3.5 Visual dBASE dBASE for Windows dBASE IV dBASE III+ FOXPRO MS ACCESS SYBASE MSSQL INFORMIX INTRBASE DB2 ORACLE 3. Selecione a opo INTRBASE, como mostrado na figura anterior, e depois clique no boto OK. Ser exibida a caixa de dilogo Create INTRBASE Table, na qual podem ser definidos os campos que iro compor um registro da tabela (Figura 9.13).

Figura 9.13: A caixa de dilogo Create INTRBASE Table.

DEFININDO NOMES PARA OS CAMPOS DOS REGISTROS DE UMA TABELA


Para cada campo em um registro deve ser definido um nome (coluna Field Name), o tipo de dado que ser armazenado no campo (coluna Type), seu tamanho (coluna Size) e o nmero de casas decimais (Dec).

136 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS


Vamos comear a definir os nomes dos campos para a tabela que armazenar os dados dos scios. Repare que, quando iniciamos a criao da nossa tabela, a coluna Field Name do primeiro campo aparece em destaque, indicando que o seu valor j pode ser digitado. Para definir o nome do primeiro campo, que armazenar o cdigo do scio, execute os seguintes procedimentos: 1. Digite a expresso CodigoSocio. 2. Pressione a tecla de seta para baixo. Pronto! Repare que neste momento a coluna Field Name do segundo campo aparece em destaque, como mostra a Figura 9.14.

Figura 9.14: A caixa de dilogo Create INTRBASE Table aps a definio de um nome para o primeiro campo.

Repita os passos anteriores para definir os seguintes nomes para os campos subseqentes da tabela: Nome, Sobrenome, Endereo, Complemento, Bairro, Cidade, Estado, CEP, Telefone e CPF. Aps definir todos os nomes para os campos, a caixa de dilogo Create INTRBASE Table dever ter a aparncia mostrada na Figura 9.15.

Figura 9.15: A caixa de dilogo Create INTRBASE Table aps a definio de um nome para todos os campos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

137

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

DEFININDO TIPOS PARA OS CAMPOS DOS REGISTROS DE UMA TABELA


Conforme mencionado anteriormente, cada campo de um registro deve armazenar um valor de um determinado tipo. Para tabelas do tipo INTRBASE, os seguintes tipos podem ser utilizados: SHORT: Inteiros entre -32768 e 32767. LONG: Inteiros entre -2,147,483,648 e 2,147,483,648. FLOAT: Real de preciso simples (at 7 dgitos significativos de preciso). DOUBLE: Real de preciso dupla (at 15 dgitos significativos de preciso). VARCHAR(n): Armazena at n caracteres. DATE: Data BLOB: Objeto binrio de tamanhoVarivel. CHAR(n): Armazena n caracteres. (mximo 32767).

Os tipos disponveis podem variar de um banco de dados para outro, e inclusive entre verses distintas de um mesmo banco de dados.

Para definir o tipo do campo CodigoCliente como LONG, execute os seguintes procedimentos: 1. Selecione com o boto esquerdo do mouse a coluna Type do campo CodigoSocio. 2. Digite LONG. ou: 1. No menu pop-up exibido quando se pressiona o boto direito do mouse (Figura 9.16), selecione a opo LONG. 2. Pressione a tecla de seta para baixo.

Figura 9.16: Menu pop-up, usado para selecionar um tipo para um campo.

138 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS


Repita os passos anteriores para definir os demais campos como alfanumricos (do tipo VARCHAR). Alguns leitores podem pensar que o campo CEP, por exemplo, deveria ser definido como um campo numrico, pois armazena um grupo de nmeros. Cabe salientar, no entanto, que, se o campo fosse definido como numrico, no poderia armazenar caracteres especiais como um hfen (-), que geralmente separa os cinco primeiros dgitos dos trs ltimos em um CEP, nem poderia ser criada uma mscara para exibio do campo (as mscaras de exibio sero vistas mais adiante). Alm disso, como no ser feita nenhuma operao aritmtica sobre os valores armazenados neste campo, no h nenhum inconveniente em defini-lo como alfanumrico. Esta observao tambm se aplica aos campos CPF e Telefone. Aps definir os tipos de todos os campos, a caixa de dilogo Create INTRBASE Table dever apresentar o aspecto mostrado na Figura 9.17.

Figura 9.17: A caixa de dilogo Create INTRBASE Table aps a definio de tipos para todos os campos.

DEFININDO OS TAMANHOS PARA OS CAMPOS DOS REGISTROS DE UMA TABELA


Aps definir o tipo de cada campo, deve-se definir o seu tamanho especificando-se o valor desejado na coluna Size. Os campos alfanumricos (VARCHAR) podem armazenar at 32767 caracteres. Logo, devemos armazenar na sua coluna Size o nmero mximo de caracteres que ser permitido ao usurio digitar em um campo deste tipo. Na nossa tabela de clientes, o primeiro campo do tipo LONG, razo pela qual no ser atribudo um valor para o seu tamanho na coluna Size. Para definir o tamanho do campo Nome em 15 caracteres, execute os seguintes procedimentos: 1. Selecione com o boto esquerdo do mouse a coluna Size do campo Nome. 2. Digite o valor 15. 3. Pressione a tecla de seta para baixo, para passar para o prximo campo. A caixa de dilogo Create Paradox INTRBASE dever ficar com o aspecto indicado na Figura 9.18.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

139

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 9.18: A caixa de dilogo Create INTRBASE Table aps a definio do tamanho para o campo Nome.

Repita os passos anteriores, definindo os seguintes valores para os tamanhos dos demais campos: Sobrenome: 25. Endereo: 25. Complemento: 10. Bairro: 20. Cidade: 20. Estado: 2. CEP: 8. Telefone: 10. CPF: 11. A caixa de dilogo Create INTRBASE Table dever ficar com o aspecto indicado na Figura 9.19.

Figura 9.19: A caixa de dilogo Create INTRBASE Table aps a definio de tamanho para os campos.

140 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Definimos um tamanho igual a 10 para o campo telefone, considerando-se a nova modalidade de ligao interurbana. Um telefone do Rio de Janeiro poderia, por exemplo, ser cadastrado como (21)2345-6789, e no armazenaremos os caracteres no-numricos.

DEFININDO CAMPOS DE PREENCHIMENTO OBRIGATRIO


Para que os dados armazenados em um registro possuam significado, necessrio que seja fornecida uma quantidade mnima de informaes, isto , alguns campos devem ser obrigatoriamente preenchidos. No faria muito sentido, por exemplo, cadastrar um scio sem armazenar o seu nome e sobrenome, razo pela qual estes campos devero ser preenchidos pelo usurio. Para definir o campo Nome como um campo de preenchimento obrigatrio, execute os seguintes procedimentos: 1. Selecione o campo Nome, clicando sobre o mesmo com o boto esquerdo do mouse. 2. Marque a caixa de verificao Required Field, como mostra a Figura 9.20. Repita os passos anteriores para definir os campos CodigoSocio e sobrenome como campos de preenchimento obrigatrio.

Figura 9.20: A caixa de dilogo Create INTRBASE Table aps a definio do campo Nome como um campo de preenchimento obrigatrio.

CRIANDO NDICES
Quando desejamos ordenar ou filtrar os registros de uma tabela por um determinado campo (ou grupo de campos), devemos associ-lo a um ndice. Cada ndice deve ter um nome que o identifique, como por exemplo ind_Nome para um ndice correspondente ao Nome de um cliente. recomendvel que se atribuam aos ndices nomes fceis de memorizar, para auxiliar durante a fase de codificao do aplicativo. Um ndice pode ser simples, no caso de s corresponder a um campo, ou composto, no caso de se referir a mais de um campo. No caso da tabela scios, vamos definir os seguintes ndices:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

141

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Socios_Nome: Um ndice composto, correspondente aos campos Nome e Sobrenome. Socios _Bairro: Um ndice simples, correspondente ao campo Bairro. Socios _Cidade: Um ndice simples, correspondente ao campo Cidade. Para definir o ndice Socios _Nome, execute os seguintes procedimentos: 1. Selecione o boto Define Indexes. da caixa de dilogo Create INTRBASE Table., para exibir a caixa de dilogo Define Secondary Index, mostrada na Figura 9.21.

Figura 9.21: A caixa de dilogo Define Index.

2. Selecione com o mouse o campo Nome na caixa de lista Fields. 3. Pressione a tecla Shift e, mantendo-a pressionada, selecione o campo Sobrenome (para selecionar um campo sem desmarcar outros que j tenham sido previamente selecionados, mantenha pressionada a tecla Ctrl). A Figura 9.22 mostra os campos selecionados na caixa de lista Fields. 4. Selecione com o boto esquerdo do mouse o pequeno boto que exibe uma seta para a direita, para movimentar os campos selecionados para a caixa de lista Indexed Fields, como mostra a Figura 9.23.

Figura 9.22: Selecionando os campos de um ndice.

142 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Figura 9.23: Movendo campos para a caixa de lista Indexed Fields.

5. Selecione o boto OK, e ser exibida a caixa de dilogo Save Index As, na qual deve ser digitado o nome do ndice, como mostra a Figura 9.24.

Figura 9.24: Definindo o Nome do ndice.

Repare que a caixa de dilogo anterior exibe a expresso<Table>_, indicando que devemos apenas completar o nome do ndice, pois o termo <Table> ser substitudo pelo nome da tabela. Neste caso, por exemplo, bastar informar <Table>_Nome.

Repita os passos anteriores para definir os ndices simples Socios_Bairro e Socios_Cidade descritos anteriormente. Repare que, aps a sua definio, os nomes dos ndices so exibidos na caixa de dilogo Create INTRBASE Table, como mostra a Figura 9.25.

Figura 9.25: A caixa de dilogo Create INTRBASE Table aps a definio dos ndices.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

143

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

SALVANDO UMA TABELA


Para salvar a tabela de clientes, execute os seguintes procedimentos: 1. Selecione o boto Save As na caixa de dilogo Create INTRBASE Table para exibir a caixa de dilogo Save Table As, na qual devem ser definidos um nome para a tabela e o alias correspondente ao banco de dados no qual ser armazenada, como mostra a Figura 9.26. No nosso exemplo, demos o nome Socios para a tabela e a armazenamos no banco de dados representado pelo alias Clube. 2. Clique no boto Salvar.

Figura 9.26: Salvando uma tabela com a caixa de dilogo Save Table As.

Se for exibida uma caixa de dilogo de Login, preencha com o username e password descritos anteriormente.

Pronto! Sua tabela foi salva.

Aps salvar a tabela, o Interbase coloca todas as informaes de nomes de campos e de ndices em letras maisculas.

INSERINDO DADOS EM UMA TABELA ATRAVS DO DATABASE DESKTOP


Como j foi dito anteriormente, o Database Desktop um utilitrio independente, que permite a criao e o gerenciamento de tabelas de bancos de dados. Embora voc esteja desenvolvendo um aplicativo que ser capaz de fazer este tipo de gerenciamento de uma maneira mais personalizada, nada o impede de incluir uma massa de dados atravs do Database Desktop para testar alguns aspectos do seu aplicativo, antes mesmo de implementar toda a sua funcionalidade. Caso queira inserir registros na sua tabela, basta coloc-la em modo de edio, o que pode ser feito executando-se os seguintes procedimentos:

144 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS


1. Selecione o item Table do submenu Open do menu File do Database Desktop. Ser exibida a caixa de dilogo Open Table, mostrada na Figura 9.27, na qual dever ser selecionada a tabela a ser aberta clicando no boto Abrir (No esquea de especificar o Alias Clube).

Figura 9.27: Abrindo uma tabela com a caixa de dilogo Open Table.

2. Selecione o item Edit Data do menu Table, ou pressione a tecla de funo F9, para colocar a tabela em modo de edio, conforme indicado na Figura 9.28.

Figura 9.28: Colocando a tabela em modo de Edio.

Vamos incluir em nossa tabela os seguintes dados, referentes a trs clientes (fictcios, naturalmente): Cliente 1: CodigoCliente: 1 Nome: Augusto. Sobrenome: Campos da Silva.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

145

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Endereo: Rua dos Andradas 435. Complemento: Apto 905. Bairro: Cascadura. CEP: 22089-157. Cidade: Rio de Janeiro. Estado: RJ. Telefone: (21) 25768495 CPF: 85725415608. Cliente 2: CodigoCliente: 2 Nome: Cludia. Sobrenome: Moreira Bastos. Endereo: Avenida Santa Ceclia 387. Complemento: Bl. B, 101. Bairro: Itaim. CEP: 05980555. Cidade: So Paulo. Estado: SP. Telefone: (11)37629645 CPF: 15954235704. Cliente 3: CodigoCliente: 3 Nome: Paulo. Sobrenome: Aroeira dos Santos. Endereo: Avenida Guanabara 87. Complemento: Bairro: Graja. CEP: 22587344. Cidade: Rio de Janeiro. Estado: RJ. Telefone: (21)21225489 CPF: 68575454601.

146 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS


Para digitar os dados do primeiro cliente, faa o seguinte: 1. Digite o nmero 1 no campo CodigoCliente 2. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Nome. 3. Digite a palavra Augusto no campo Nome. 4. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Sobrenome. 5. Digite a expresso Campos da Silva no campo. 6. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Endereco. 7. Digite a expresso Rua dos Andradas 435 no campo. 8. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Complemento. 9. Digite a expresso Apto 905 no campo. 10. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Bairro. 11. Digite a expresso Cascadura no campo. 12. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Cidade. 13. Digite Rio de Janeiro no campo. 14. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Estado. 15. Digite RJ no campo. 16. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo CEP. 17. Digite a expresso 22089157 no campo. 18. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo Telefone. 19. Digite a expresso 2125788495 no campo. 20. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o campo CPF. 21. Digite a expresso 85725415608 no campo. 22. Pressione a tecla Enter ou a tecla de seta para a direita para passar para o prximo registro. Repita os procedimentos anteriores para inserir os dados dos outros dois clientes. Aps inserir os dois novos registros, sua tabela deve ficar com o aspecto mostrado na Figura 9.29.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

147

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 9.29: Aspecto da tabela aps a incluso dos trs registros.

CONSTRUINDO AS DEMAIS TABELAS DO APLICATIVO


Neste tpico sero apresentadas as caractersticas das demais tabelas que compem o nosso aplicativo. Alm da tabela Socios, sero necessrias as seguintes tabelas: Atividades, para armazenar os dados das atividades. Matriculas, para armazenar os dados das matrculas de scios em atividades.

CRIANDO A TABELA ATIVIDADES


Executando os procedimentos descritos nos tpicos anteriores, crie uma tabela chamada Atividades no banco de dados Clube, com os seguintes campos:

Nome do Campo CodigoAtividade Nome Valor

Tipo LONG VARCHAR Numeric

Tamanho

Dec

25 8 2

Aps a definio dos campos indicados anteriormente, esta tabela deve apresentar, no Database Desktop, o aspecto mostrado na Figura 9.30.

148 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 FUNDAMENTOS DE BANCOS DE DADOS

Figura 9.30: Criao da tabela Atividades.

Defina todos os campos desta tabela como campos requeridos.

CRIANDO NDICES PARA A TABELA DE ATIVIDADES


Para a tabela Atividades crie o seguinte ndice, executando os procedimentos descritos nos tpicos anteriores: Atividade_Nome, para o campo Nome.

SALVANDO A TABELA ATIVIDADES


Salve a tabela no banco de dados representado pelo Alias CLUBE, com o nome Atividades, seguindo os mesmos passos descritos anteriormente para salvar a tabela Clientes.

INCLUINDO REGISTROS NA TABELA DE ATIVIDADES


Coloque a tabela criada no tpico anterior em modo de edio e inclua os seguintes registros: Atividade 1: CodigoAtividade: 1 Nome: Natao. Valor: 30.00 Atividade 2: CodigoAtividade: 2 Nome: Musculao. Valor: 25.00 Atividade 3: CodigoAtividade: 3

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

149

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Nome: Basquete. Valor: 40.00

CRIANDO A TABELA DE MATRCULAS


Executando os procedimentos descritos nos tpicos anteriores, crie uma tabela chamada Matriculas no banco de dados Clube, com os seguintes campos:

Nome do Campo Socio Atividade

Tipo

Tamanho LONG

Dec

LONG

Defina estes dois campos como campos requeridos. Nesta tabela o campo Socio, do tipo LONG, armazenar o cdigo do scio desta matrcula. Desta maneira, se precisarmos obter dados a respeito do scio, basta consultar na tabela de scios o registro cujo valor do campo CodigoSocio seja igual ao valor armazenado no campo Socio do registro corrente na tabela Matriculas. Veremos mais adiante como se estabelece um relacionamento entre tabelas, usando um campo como ligao entre elas. O mesmo se aplica ao campo Atividade.

CRIANDO NDICES PARA A TABELA DE MATRCULAS


Para a tabela de Matrculas crie os seguintes ndices, executando os procedimentos descritos nos tpicos anteriores: Matriculas_Socio, para o campo Socio. Matriculas_Atividade, para o campo Atividade. Pronto! As tabelas do nosso banco de dados j esto criados, e no prximo captulo sero apresentados os componentes que permitem o acesso a estas tabelas a partir de aplicaes desenvolvidas com o Delphi 7.

150 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Captulo

10

Criao de um Formulrio Para Manipulao de Tabelas de Bancos de Dados com o DBExpress

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

151

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos necessrios criao de um formulrio para acesso a banco de dados no Delphi 7 usando como mecanismo de acesso o DBExpress. Sero utilizados os componentes das paletas Data Access e DBExpress (que, como j descrito anteriormente, um mecanismo de acesso a dados multiplataforma).

CRIAO DE FORMULRIOS PARA ACESSO A DADOS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Noes bsicas sobre bancos de dados.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao de formulrios para acesso a bancos de dados.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de formulrios para acesso a dados com o Delphi 7. Para criar um formulrio para acessar os dados da tabela de Scios, voc deve executar os seguintes procedimentos: 1 Abra o projeto Socio.dpr. 2 Selecione o item New/Form do menu File do Delphi 7. Ser criado um formulrio em branco. 3. Altere a propriedade Name deste formulrio para FormCadastraSocios. 4. Altere a propriedade Caption deste formulrio para Cadastro de Scios. 5. Coloque um componente SQLConnection, situado na pgina DBExpress da paleta de componentes ( o primeiro componente desta pgina). Este um componente no-visual (logo, sua posio no formulrio indiferente), e representa um banco de dados acessado pelo formulrio. 6. D um duplo clique sobre este componente para exibir a caixa de dilogo Connection Editor, mostrada na Figura 10.1 (esta caixa de dilogo tambm pode ser exibida selecionando o item Edit Connection Properties no menu pop-up exibido quando voc seleciona o componente com o boto direito do mouse). 7. Crie uma nova conexo chamada Clube, selecionando o boto com o smbolo + desta caixa de dilogo. Ser exibida a caixa de dilogo New Connection, mostrada na Figura 10.2 8. Configure esta caixa de dilogo como mostrado na Figura 10.3 e selecione o boto Ok para fech-la. Repare, como mostrado na caixa de dilogo apresentada na figura a seguir, que a nova conexo foi selecionada para ser configurada. Configure esta conexo como indicado, e selecione o boto Ok. Repare na Figura 10.3 que, para este exemplo, foi criada uma conexo chamada Clube, tendo sido configuradas, na caixa de dilogo DBExpress Connection Editor, as propriedades DriverName, Database, UserName e Password.

152 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Figura 10.1: A caixa de dilogo DBExpress Connection Editor.

Figura 10.2: A caixa de dilogo New Connection.

Figura 10.3: Criao da nova conexo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

153

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Caso voc queira usar uma conexo j definida para outro banco de dados do Interbase, basta alterar as propriedades da conexo, usando a caixa de dilogo Value List editor, exibida quando voc seleciona os trs pontinhos existentes direita da propriedade Params do componente, mostrada na Figura 10.4.

Figura 10.4: A caixa de dilogo Value List editor.

9. Atribua o valor True propriedade Connected do componente. Se a propriedade LoginPrompt deste componente estiver configurada como True, ser exibida a caixa de dilogo Database Login (na qual devero ser informados o nome do usurio UserName, e senha password). Caso contrrio, ser feita uma tentativa de conexo com os valores default de User_Name e Password j fornecidos. 10. Aps estabelecer a conexo ao banco de dados (definindo a propriedade Connected como True), altere o valor da propriedade Name do componente SQLConnection para SQLConnectionClube. 11. Insira no formulrio um componente SQLTable, tambm situado na pgina DBExpress ( o quinto componente desta pgina). 12. Altere o valor da propriedade Connection deste componente para SQLConnectionClube. 13. Defina SOCIOS como o valor da propriedade TableName deste componente. 14. Altere o valor da propriedade Name deste componente para SQLTableSocios. 15. Altere para True o valor da sua propriedade Active.

O componente SQLTable um componente no-visual, e que representa a tabela de Scios no formulrio.

16. Coloque um componente DataSource (disponvel como o primeiro componente da pgina Data Access da paleta de componentes) no formulrio e atribua o valor SQLTableSocios sua propriedade Dataset. Este componente responsvel pela ligao entre os componentes de acesso a dados e os componentes de visualizao (apresentados a seguir). 17. Altere o valor da propriedade Name deste componente para DataSouceSocios.

154 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS
Seu formulrio dever ficar com o aspecto mostrado na figura a seguir.

Figura 10.5: Aspecto do formulrio, aps a incluso dos componentes de acesso a dados, com o componente Datasource selecionado.

Pronto! J esto colocados os componentes de acesso a dados. Posteriormente abordaremos esta categoria de componentes em maiores detalhes.

Como os componentes inseridos at o momento so componentes no-visuais, sua posio no formulrio irrelevante.

18. Insira um componente Label (pgina Standard da paleta de componentes) no formulrio, e altere o valor da sua propriedade Caption para Cdigo. 19. Insira um componente DBEdit (quarto componente da pgina Data Controls da paleta de componentes) no formulrio. Este componente, vinculado a uma tabela atravs de um componente Datasource, representa um dos campos do registro corrente. Suas principais propriedades so Name (que define o nome do componente), Datasource (que define o nome do componente Datasource ao qual est vinculado) e DataField (que define o nome do campo acessado pelo componente). Altere o valor da propriedade Name deste componente para DBEditCodigoSocio. 20. Altere o valor da propriedade Datasource deste componente para DatasourceClientes. 21. Altere o valor da propriedade DataField deste componente para CodigoSocio. Repare que, neste momento, o valor deste campo correspondente ao primeiro registro exibido. 22. Repita os procedimentos anteriores de forma semelhante para cada um dos outros campos da tabela Clientes. Disponha os componentes de forma semelhante mostrada na figura a seguir (ou com o layout que voc julgar mais conveniente).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

155

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 10.6: Aspecto do formulrio, aps a incluso dos componentes de visualizao.

23. Selecione o item Save As do menu File e salve-o com o nome UnitCadastroSocios.pas. 24. Inclua um boto de comando do tipo BitBtn (boto de figura, situado na pgina Additional da paleta de componentes) no formulrio. 25. Altere os valores das propriedades Kind e ModalResult deste componente para bkCustom e mrNone, respectivamente. 26. Altere os valores das propriedades Name, Caption e Default deste boto de comando para BotaoCadastrar, &Cadastrar e False, respectivamente. 27. Inclua um segundo boto de comando do tipo BitBtn (boto de figura, situado na pgina Additional da paleta de componentes) no formulrio. 28. Altere o valor da propriedade Kind deste componente para bkClose. 29. Altere os valores das propriedades Name e Caption deste boto de comando para BotaoFechar e &Fechar, respectivamente. O fato de se definir o valor da propriedade Kind deste componente como bkClose far com que, ao ser selecionado este boto, o formulrio seja fechado. Alm disso, se voc alterar o valor da propriedade Kind depois de alterar o valor da propriedade Caption, o valor desta ltima propriedade ser alterado para &Close. 30. Reposicione e redimensione os botes, de maneira que o mesmo fique com um aspecto semelhante ao apresentado na Figura 10.7. 31. Defina da seguinte maneira o procedimento associado ao evento OnShow deste formulrio:
procedure TFormCadastraSocios.FormShow(Sender: TObject); begin DBEditCodigoSocio.SetFocus; SQLTableSocios.Open;

156 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS
SQLTableSocios.Append; end;

Neste procedimento, executado sempre que o formulrio exibido, so executados os mtodos Open e Append do componente SQLTableSocios, da classe SQLTable. O mtodo Open ativa o acesso tabela. O mtodo Append adiciona um novo registro em branco. Evidentemente, o mtodo Open no necessrio se mantivermos a propriedade Active do componente como True. Desta forma, altere o valor da propriedade Active do componente SQLTableSocios para False. Faa o mesmo para a propriedade Connected do componente SQLConnectionClube.

Figura 10.7: Aspecto do formulrio, aps a incluso dos botes de comando.

Atribuir o valor True propriedade Active do componente SQLTable equivale a executar o mtodo open deste componente. Ao atribuir o valor True propriedade Active do componente SQLTableSocios este tentar estabelecer a conexo atravs do componente SQLConnectionClube. Se a propriedade Connected deste componente estiver definida como False, o aplicativo tentar redefini-la como True. 32. Defina da seguinte maneira o procedimento associado ao evento OnClick do componente BotoCadastrar:
procedure TFormCadastraSocios.BotaoCadastrarClick(Sender: TObject); begin SQLTableSocios.Post; SQLTableSocios.Append; DBEditCodigoSocio.SetFocus; end;

O mtodo Post responsvel por gravar o ltimo registro criado pelo mtodo Append. Aps a gravao do registro, um novo registro criado com outra chamada ao mtodo Append. O mtodo SetFocus do componente DBEdit responsvel por redirecionar o foco da aplicao (o cursor) para o componente DBEditCodigoSocio. 33. Defina da seguinte maneira o procedimento associado ao evento OnClose do formulrio:
procedure TFormCadastraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin SQLTableSocios.Delete; end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

157

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Desta maneira, o ltimo registro criado por um mtodo Append, mas no gravado com um mtodo Post, ser apagado. 34. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item cadastro do menu Scios.
FormCadastraSocios.Showmodal.

35. Compile a aplicao. Ser exibida a mensagem de erro mostrada na figura a seguir, indicando que a unit unitCadastraSocios no foi includa na clusula uses da unit referente ao formulrio principal. Selecione o boto Yes.

Figura 10.8: Mensagem de erro.

36. Execute e teste a aplicao. Ao selecionar o item Cadastro do menu Socios, ser exibida a mensagem de erro mostrada na figura a seguir:

Figura 10.9: Mensagem de erro.

Esta mensagem indica que a aplicao est tentando editar uma tabela atravs de um componente disponvel apenas para leitura. Esta a primeira diferena do DBExpress para os demais mecanismos de acesso: O DBExpress (ao contrrio do BDE e do ADO) unidirecional, e no permite a edio direta dos registros (exceto em comandos SQL) apenas a sua consulta, e desde que esta seja feita de forma unidirecional. Para contornar este problema, devem-se utilizar os componentes DatasetProvider e ClientDataset (pgina Data Access da paleta de componentes), que em conjunto armazenam e gerenciam na memria o conjunto de registros acessados pelo componente SQLTable, e podem editar estes conjunto de registros (devendo posteriormente aplicar estas alteraes ao banco de dados, mediante uma chamada ao mtodo Applyupdates do componente ClientDataset). No prximo tpico, sero apresentados os procedimentos necessrios utilizao dos componentes DatasetProvider e ClientDataset.

158 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

UTILIZANDO OS COMPONENTES DATASETPROVIDER E CLIENTDATASET


Para contornar o problema apresentado no tpico anterior, voc dever executar os seguintes procedimentos: 1. Inclua um componente DatasetProvider no formulrio. 2. Altere as propriedades Name e Dataset deste componente para DatasetProviderSocios e SQLTableSocios, respectivamente. 3. Inclua um componente ClientDataset no formulrio. 4. Altere as propriedades Name e ProviderName deste componente para ClientDatasetSocios e DatasetProviderSocios, respectivamente. 5. Altere a propriedade Dataset do componente DatasourceSocios para ClientDatasetSocios. 6. Defina como True o valor da propriedade Active do componente ClientDatasetSocios. Aps realizar estas alteraes, o formulrio dever ficar como mostrado na figura a seguir.

Figura 10.10: Aspecto do formulrio, aps a incluso e configurao dos componentes DatasetProvider e ClientDataset.

7. Redefina da seguinte maneira o procedimento associado ao evento OnShow deste formulrio:


procedure TFormCadastraSocios.FormShow(Sender: TObject); begin DBEditCodigoSocio.SetFocus; ClientDatasetSocios.Open; ClientDatasetSocios.Append; end;

8. Redefina da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoCadastrar:


procedure TFormCadastraSocio.BotaoCadastrarClick(Sender: TObject); begin ClientDatasetSocios.Post; ClientDatasetSocios.Append; DBEditCodigoSocio.SetFocus; end;

Desta forma, uma cpia dos registros ser manipulada localmente pelo componente ClientDataset.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

159

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


9. Redefina da seguinte maneira o procedimento associado ao evento OnClose do formulrio:
procedure TFormCadastraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin ClientDatasetSocios.Delete; ClientDatasetSocios.ApplyUpdates(0); end;

importante destacar, neste caso, a chamada ao mtodo ApplyUpdates do componente ClientDataset, responsvel por efetivar no banco de dados as alteraes realizadas no conjunto de registros manipulados localmente pelo componente. Lembre-se de que, ao ativar a conexo com o banco de dados, este componente recebeu uma cpia dos registros armazenados na tabela, e todas as incluses, excluses e alteraes foram feitas nesta cpia. O mtodo ApplyUpdates responsvel por gravar estas alteraes no banco de dados, recebendo como parmetro um nmero inteiro que identifica o nmero de erros permitidos em tal operao (entenda por erros as inconsistncias entre os registros obtidos inicialmente e aqueles existentes no banco de dados no momento em que sero efetivamente registradas tais alteraes (neste caso, definido como igual a zero). 10. Selecione o componente ClientDatasetSocios com o boto direito do mouse, para exibir o seu menu pop-up, como mostrado na figura a seguir.

Figura 10.11: Acessando o menu pop-up do componente ClientDataset.

11. Selecione o item Fields Editor neste menu pop-up, para exibir a janela do editor de campos, mostrada na figura a seguir.

160 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Figura 10.12: Acessando o editor de campos do componente ClientDataset.

12. Selecione com o boto direito do mouse a rea branca desta janela para exibir o menu pop-up do Field Editor, mostrado na figura a seguir.

Figura 10.13: Acessando o menu pop-up do editor de campos do componente ClientDataset.

13. Neste menu popup, selecine o item Add All Fields. Sero criados os objetos que representam os campos, como mostrado na Figura 10.14. 14. A classe TFormCadastraSocios passa a incluir, entre seus campos, objetos que representam os campos da tabela, como mostrado no trecho de cdigo reproduzido a seguir:
TFormCadastraSocios = class(TForm) SQLConnectionClube: TSQLConnection;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

161

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


SQLTableSocios: TSQLTable; DataSourceSocios: TDataSource; Label1: TLabel; DBEditCodigoSocio: TDBEdit; BotaoCadastrar: TBitBtn; BotaoFechar: TBitBtn; DataSetProviderSocios: TDataSetProvider; ClientDataSetSocios: TClientDataSet; ClientDataSetSociosCODIGOSOCIO: TIntegerField; ClientDataSetSociosNOME: TStringField; ClientDataSetSociosSOBRENOME: TStringField; ClientDataSetSociosENDERECO: TStringField; ClientDataSetSociosCOMPLEMENTO: TStringField; ClientDataSetSociosBAIRRO: TStringField; ClientDataSetSociosCIDADE: TStringField; ClientDataSetSociosESTADO: TStringField; ClientDataSetSociosCEP: TStringField; ClientDataSetSociosTELEFONE: TStringField; ClientDataSetSociosCPF: TStringField; procedure FormShow(Sender: TObject); procedure BotaoCadastrarClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;

Repare que o campo CEP, por exemplo, representado pelo objeto ClientDataSetSociosCEP, do tipo TstringField.

Figura 10.14: Incluindo os objetos que representam os campos da tabela no editor de campos do componente ClientDataset.

15. Inclua componentes Labels e DBEdits correspondentes aos demais campos da tabela de Scios. Para isso, selecione no Fields Editor os objetos que representam os demais campos e arraste estes componentes para o formulrio, como mostrado nas Figuras 10.15 e 10.16. Reposicione e redimensione estes componentes para que seu formulrio fique com o aspecto mostrado na Figura 11.17. Atribua nomes adequados aos diversos componentes DBEdit, como DBEditSobrenomeSocio, DBEditEnderecoSocio, etc., para facilitar sua identificao no cdigo da aplicao.

162 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Figura 10.15: Arrastando os objetos que representam os demais campos da tabela de Scios a partir do editor de campos para o formulrio.

Figura 10.16: Criando os objetos para acessar os demais campos da tabela de Scios a partir do formulrio.

Figura 10.17: Criando os componentes para acessar os demais campos da tabela de Scios a partir do formulrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

163

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

O COMPONENTE DBEDIT
Este componente, usado anteriormente, exibe o valor de um campo do registro corrente e permite que o usurio altere o seu valor. Entre as propriedades deste componente, podemos destacar: DataSource: Esta propriedade define o componente que nos fornecer a conexo a um componente que representa uma tabela ou um banco de dados. Name: Esta propriedade define o nome pelo qual o componente ser referenciado no programa. DataField: Esta propriedade especifica o campo da tabela cujo valor ser exibido. No nosso exemplo, temos diversos controles deste tipo, todos com a propriedade DataSource igual a DataSourceSocios e cuja propriedade DataField vale, respectivamente: Nome, Sobrenome, Endereo, Complemento, Bairro, Cidade, Estado, CEP, Telefone e CPF. Neste caso, como usamos o Fields Editor, estas propriedades foram configuradas automaticamente quando os componentes foram criados no formulrio. O componente que exibe o valor do campo Nome, por exemplo, possui as seguintes propriedades: DataSource: DataSourceSocios DataField: Nome Name: DBEditNomeSocio

DEFININDO MSCARAS PARA OS CAMPOS


Uma deficincia que este formulrio apresenta a seguinte: nada impede que o usurio digite um valor como abcde-fgh ou xasdr-auy, no campo CEP, pois ambos so strings de caracteres e podem ser armazenadas em campos alfanumricos. Para restringir os caracteres que o usurio pode digitar em um componente que representa um campo de uma tabela, devemos definir uma mscara para este campo. Para definir uma mscara para um campo, voc deve atribuir um valor propriedade EditMask do objeto que representa o campo (criado com o editor de campos). Estes objetos esto definidos na classe do formulrio, mas no sero visualizados como componentes, embora voc possa acess-los atravs do Object Inspector para definir suas propriedades (como a propriedade EditMask, por exemplo). 1. Usando a caixa de seleo de objetos do Object Inspector, selecione o objeto ClientDataSetSociosCEP, como mostra a Figura 10.18. Uma vez selecionado o objeto que representa o campo, o prximo passo consiste em definir um valor para a sua propriedade EditMask. A propriedade EditMask constituda de trs partes, separadas por ponto-e-vrgula. A primeira parte representa a mscara propriamente dita; a segunda parte define se apenas os caracteres digitados (valor igual a 0 o default) ou toda a mscara deve ser armazenada na tabela (valor igual a 1); a terceira parte especifica o caractere usado para representar espaos em branco (o default _).

164 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Figura 10.18: Selecionando o objeto ClientDataSetSociosCEP.

SIGNIFICADO DOS CARACTERES USADOS NA PROPRIEDADE EDITMASK


A seguir so mostrados os caracteres que podem ser usados na definio da propriedade EditMask: !: Se um! aparecer na mscara, caracteres em branco no so armazenados como dados. >: Se um > aparecer na mscara, todos os caracteres seguintes estaro em letras maisculas, at que seja encontrado um caractere igual a <. <: Se um < aparecer na mscara, todos os caracteres seguintes estaro em letras minsculas, at que seja encontrado um caractere igual a >. <>: Significa que as letras maisculas e minsculas sero armazenadas como digitadas pelo usurio. \: Os caracteres que seguem este sinal sero tratados como caracteres literais. L: Este caractere faz com que apenas caracteres alfabticos (a-z e A-Z) sejam aceitos nesta posio. l: Este caractere faz com que apenas caracteres alfabticos (a-z e A-Z) sejam aceitos nesta posio, mas aceita que sejam omitidos. A: Este caractere faz com que apenas caracteres alfanumricos (0-9, a-z e A-Z) sejam aceitos nesta posio. a: Este caractere faz com que apenas caracteres alfanumricos (0-9, a-z e A-Z) sejam aceitos nesta posio, mas aceita que sejam omitidos. C: Este caractere faz com que quaisquer caracteres sejam aceitos nesta posio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

165

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


c: Este caractere faz com que quaisquer caracteres sejam aceitos nesta posio, mas aceita que sejam omitidos. 0: Este caractere faz com que apenas caracteres numricos (0-9) sejam aceitos nesta posio. 9: Este caractere faz com que apenas caracteres numricos (0-9) sejam aceitos nesta posio, mas aceita que sejam omitidos. #: Este caractere faz com que apenas caracteres numricos (0-9) e sinais de mais (+) ou menos (-) sejam aceitos nesta posio, mas aceita que sejam omitidos. :: Este caractere (dois-pontos) usado para separar horas, minutos e segundos em dados horrios. Se outro caractere separador de horas, minutos e segundos for definido nos atributos internacionais do Painel de Controle do seu sistema, este ser usado em lugar de dois-pontos. /: Este caractere usado para separar meses, dias e anos que representam dados de datas. Se outro caractere separador de meses, dias e anos for definido nos atributos internacionais do Painel de Controle do seu sistema, este caractere ser usado em lugar do caractere /. ;: O ponto-e-vrgula usado para separar os pontos de uma mscara. _: O caractere _ insere espaos em branco na caixa de edio. Voc tambm pode definir o valor da propriedade EditMask atravs do Editor de mscaras. Para acessar este editor, selecione com o mouse as reticncias (...) exibidas do lado direito da propriedade no Object Inspector. Ser exibida a caixa de dilogo Input Mask Editor, como mostra a Figura 10.19.

Figura 10.19: A caixa de dilogo Input Mask Editor.

Esta caixa de dilogo apresenta as seguintes caractersticas: Permite que voc selecione uma das mscaras j disponveis na lista Sample Masks. Permite que voc personalize a mscara na caixa de texto Input Mask. Permite que voc especifique o caractere usado para representar espaos em branco na caixa de texto Character for Blanks. Permite que voc defina se toda a mscara deve ser armazenada na tabela ou apenas os dados digitados pelo usurio, atravs da caixa de verificao Save Literal Characters. Permite que voc teste a mscara, digitando valores na caixa de texto Test Input.

166 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS
Permite que voc carregue um arquivo de mscaras (extenso .dem) e armazene seus dados na lista de mscaras disponveis selecionando o boto Masks. Experimente criar o seu prprio arquivo de mscaras, disponibilizando-as atravs da caixa de dilogo Input Mask Editor. Para definir uma mscara para o campo CEP, atribua o valor 00000\-999;0; propriedade EditMask do objeto ClientDataSetSociosCEP. Esta mscara permite que se digitem todos os caracteres ou apenas os cinco primeiros. Outro campo que deve ter mscara o campo CPF. Defina da seguinte forma a mscara deste campo: Atribua o valor 000.000.000-00;0; propriedade EditMask do objeto ClientDatasetSociosCPF. Experimente acrescentar um novo registro e verifique que os campos para os quais foram definidas mscaras no permitem a digitao de caracteres invlidos.

O COMPONENTE MASKEDIT
Em situaes em que voc precisa definir uma mscara para um texto a ser digitado pelo usurio, mas este texto no ser armazenado em um campo de um registro, possvel usar o componente MaskEdit, que tambm possui a propriedade EditMask. O componente MaskEdit est localizado na pgina Additional da paleta de componentes.

FAZENDO A TECLA ENTER FUNCIONAR COMO TAB


Os usurios que necessitam digitar uma grande quantidade de dados geralmente preferem navegar pelos diversos controles utilizando a tecla Enter em vez da tecla Tab. Para incorporar essa funcionalidade ao nosso aplicativo, devemos definir um procedimento associado ao evento OnKeyPress dos diversos controles com os quais o usurio dever interagir. Esse procedimento normalmente recebe, como um dos seus parmetros, uma varivel chamada Var (passada por referncia) que armazena o cdigo da tecla pressionada. Para verificar se a tecla pressionada foi a tecla Enter, basta verificar se o valor armazenado nessa varivel igual a #13. Em caso positivo, deve-se atribuir o valor #0 a essa varivel (de forma a evitar que se escute um bip desagradvel) e utilizar o procedimento SelectNext para transferir o foco para o prximo controle (prximo de acordo com o valor da propriedade TabOrder). Este procedimento recebe como parmetros: O controle atual. Um valor booleano, indicando se o prximo controle ser o que possui o valor da sua propriedade TabOrder imediatamente superior ao do controle atual (true) ou imediatamente inferior ao do controle atual (false). Um valor booleano, indicando se o prximo controle dever ou no ter o valor da sua propriedade TabStop igual a True.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

167

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Dessa maneira, basta codificar da seguinte forma o procedimento associado ao evento OnKeyPress do componente DBEditCodigoSocio, procedimento este que dever ser compartilhado pelos demais componentes DBEdit do formulrio.
procedure TFormCadastraSocios.DBEditCodigoClienteKeyPress( Sender: TObject; var Key: Char); begin if (key = #13) then begin Key := #0; SelectNext((Sender as TWinControl),True,True); end; end;

Compartilhe este evento tambm com o componente BotaoCadastrar e defina como False a propriedade TabStop do componente BotaoFechar.

No esquea de configurar adequadamente a propriedade TabStop dos diversos componentes.

O COMPONENTE DBCOMBOBOX
Nosso formulrio j est funcionando corretamente, mas poderemos aperfeio-lo ainda mais se considerarmos que, ao invs de exigir do usurio que digite um valor para o campo Estado, podemos dar a ele a possibilidade de selecionar este valor a partir de uma lista contendo todos os estados da federao o que pode ser feito utilizando-se o componente DBCombobox, situado na pgina Data Controls da paleta de componentes.

PROPRIEDADES DO CONTROLE DBCOMBOBOX


O componente DBCombobox, da mesma forma que o componente DBEdit, possui as mesmas propriedades Datasource e Datafield que definem a tabela e o campo ao qual est vinculado. Entre as outras principais propriedades deste componente, podem-se destacar: ItemIndex: Define o ndice da string selecionada da lista. O primeiro item possui o ndice 0, o segundo possui o ndice 1, etc., at o n-simo item, que possui ndice n-1. Left e Top: Definem a posio do componente no formulrio. Name: Esta propriedade define o nome pelo qual o objeto ser referenciado no cdigo da aplicao. Height e Width: Definem as dimenses do componente. Style: Define o estilo do componente. Esta propriedade pode assumir os valores descritos na tabela a seguir:

Valor TACsDropDown: TAcsSimple:

Significado Cria uma lista drop-down com uma caixa de edio na qual o usurio pode digitar texto. Cria uma caixa de edio sem uma lista drop-down.

168 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS

Valor TAcsDropDownList: TAcsOwnerDrawFixed: TAcsOwnerDrawVariable:

Significado Cria uma lista drop-down sem uma caixa de edio. Cria uma lista drop-down sem caixa de edio em que os itens podem ser qualquer objeto definido pelo usurio e no apenas strings, sendo que todos eles tm altura fixa. Cria uma lista drop-down sem caixa de edio em que os itens podem ser qualquer objeto definido pelo usurio e no apenas strings, sendo que eles no tm altura fixa.

Text: Define o texto que est sendo exibido na caixa de texto do componente. Items: Esta propriedade consiste em uma lista de strings, que associa uma linha de texto a cada um dos itens da lista. Esta propriedade pode ser alterada mediante a incluso de um trecho de cdigo ou diretamente no Object Inspector.

PROPRIEDADES DO OBJETO ITEMS (DA CLASSE TSTRINGS)


Entre as propriedades do objeto Items, podem-se destacar: Sorted: Esta propriedade declarada como uma varivel booleana e define se os itens esto ordenados alfabeticamente. Count: Esta propriedade declarada como uma varivel inteira e define o nmero de strings na lista.

MTODOS DO OBJETO ITEMS (DA CLASSE TSTRINGS)


Entre os mtodos do objeto Items, podem-se destacar: Add: Adiciona uma string lista. Para adicionar a string exemplo na lista de strings exibida por um componente do tipo DBComboBox chamado DBComboBox1, basta incluir uma linha de cdigo como:
DBComboBox1.Items.Add(exemplo);

Clear: Deleta todas as strings da lista. Para deletar todas as strings na lista de strings exibida por um componente do tipo DBComboBox chamado DBComboBox1, basta incluir uma linha de cdigo como:
DBComboBox1.Items.Clear;

Delete: Remove uma string da lista. Para remover a string selecionada na lista de strings exibida por um componente do tipo DBComboBox chamado DBComboBox1, basta incluir uma linha de cdigo como:
DBComboBox1.Items.Delete(DBComboBox1.ItemIndex);

Insert: Insere uma string na lista, em uma posio predeterminada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

169

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Para inserir a string exemplo na primeira posio da lista de strings exibida por um componente do tipo DBComboBox chamado DBComboBox1, basta incluir uma linha de cdigo como:
DBComboBox1.Items.Insert(0,exemplo);

LoadFromFile: Carrega a lista de strings a ser armazenada a partir de um arquivo. Para colocar o texto armazenado no arquivo dados.dat na lista de strings exibida por um componente do tipo DBComboBox chamado DBComboBox1, basta incluir uma linha de cdigo como:
DBComboBox1.Items.LoadFromFile(dados.dat);

SaveToFile: Salva a lista de strings em um arquivo. Para colocar a lista de strings armazenada no componente em um arquivo chamado dados.dat, basta incluir uma linha de cdigo como:
DBComboBox1.Items.SaveToFile(dados.dat);

A propriedade chamada Items na realidade, uma lista de strings (objeto da classe TStrings) que permite armazenar uma relao de valores que podem ser selecionados pelo usurio. Neste caso, queremos armazenar nesta lista de strings as siglas de cada um dos 27 estados da federao, relacionadas a seguir:
AC AL AM AP BA CE DF ES GO MA MG MT MS PA PB PE PI PR RJ RN RR RO RS SC SE SP TO

Para substituir o componente DBEditEstadoSocio pelo componente DBCombobox, voc dever executar os seguintes procedimentos: 1. Selecionar o componente DBEditEstadoSocio e pressionar a tecla Del, para remov-lo. 2. Incluir um componente DBCombobox (o oitavo componente da pgina Data Controls) no local anteriormente ocupado pelo componente DBEditEstadoSocio.

170 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 CRIAO DE UM FORMULRIO PARA MANIPULAO DE TABELAS DE BANCOS DE DADOS COM O DBEXPRESS
3. Alterar a propriedade Name deste componente para DBComboboxEstadoSocio. 4. Selecionar as reticncias exibidas direita da propriedade Items deste componente para exibir a caixa de dilogo String List Editor e digitar as siglas dos 27 estados. 5. Alterar o valor da propriedade Style deste componente para csDropDownList. 6. Utilizando a caixa de dilogo Edit Tab Order (mostrada na figura a seguir e exibida selecionandose o item Tab Order no menu pop-up do formulrio), ordenar os componentes como indicado.

Figura 10.20: A caixa de dilogo Edit Tab Order.

7. Compartilhar com este componente o procedimento associado ao evento OnKeyPress do componente DBEditCodigoSocio (que j est sendo compartilhado pelos demais componentes). Desta maneira, a tecla Enter funcionar como Tab tambm para este componente.

DESTACANDO O COMPONENTE QUE RECEBE O FOCO


Para que o usurio no se perca durante a digitao de informaes, seria interessante destacar o componente que possui o foco da aplicao. Isto pode ser feito codificando-se adequadamente os procedimentos associados ao evento OnEnter e OnExit do componente. O evento OnEnter ocorre sempre que o componente recebe o foco (nada tem a ver com a tecla Enter, como pode ser sugerido pelo seu nome). J o evento OnExit ocorre sempre que o componente perde o foco. Desta maneira, seria interessante alterarmos a cor do componente quando o mesmo recebe o foco, e devolver a sua cor original quando o foco sai do componente. Isto pode ser feito definindo-se da seguinte maneira os procedimentos associados aos Eventos OnEnter e OnExit do componente DBEditCodigoCliente (a serem compartilhados pelos demais componentes DBEdit). No componente DBCombobox no precisa, pois far isso automaticamente, e se tentar trat-lo com um DBEdit, provocar um erro.
procedure TFormCadastraSocios.DBEditCodigoSocioEnter(Sender: TObject); begin (Sender as TDBEdit).Color := clActiveCaption;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

171

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


(Sender as TDBEdit).Font.Color := clCaptionText; end; procedure TFormCadastraSocios.DBEditCodigoSocioExit(Sender: TObject); begin (Sender as TDBEdit).Color := clWindow; (Sender as TDBEdit).Font.Color := clWindowText; end;

Gostaria de, neste ponto, fazer uma observao importante. Voc j deve ter reparado que, na maioria dos procedimentos associados a eventos, existe um parmetro denominado Sender. Este parmetro muito til quando compartilhamos procedimentos associados a eventos entre diversos componentes, pois identifica qual destes componentes disparou o evento o que muito importante quando precisamos alterar as propriedades do componente que disparou o evento (pois precisamos identificlo). Como o parmetro Sender definido como sendo um objeto da classe TObject, precisamos tratlo como sendo um objeto da classe do componente que disparou o evento o que pode ser feito usando-se o operador de converso As. Pronto! Agora nosso formulrio de Cadastro de Clientes est mais interessante e funcional, e deve apresentar o aspecto mostrado na figura a seguir.

Figura 10.21: Aspecto final do formulrio de Cadastro de Scios.

172 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS

Captulo

11

Criao de um Repositrio Para Componentes de Acesso a Dados

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

173

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo ser apresentado o Data Module, um repositrio de objetos destinado a armazenar componentes para acesso a bancos de dados, e as vantagens da sua utilizao.

CRIAO DE DATA MODULES


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores) e os componentes bsicos de acesso a dados da pgina DBExpress da paleta de componentes. Noes Bsicas sobre bancos de dados.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao e utilizao de objetos Data Module.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de Data Modules para armazenamento de componentes de acesso a dados.

OS OBJETOS DO TIPO DATAMODULE


No captulo anterior foram apresentados os procedimentos necessrios criao de um formulrio no qual foram inseridos os componentes responsveis por acessar a tabela de dados dos Scios. Esta abordagem apresenta a desvantagem de que, caso vrios formulrios acessem uma mesma tabela, todos devero conter estes componentes de acesso. Neste caso, uma boa alternativa consiste em empregar um Data Module. Os objetos do tipo DataModule servem como um repositrio para o armazenamento de componentes no-visuais de acesso a bancos de dados, permitindo que estes sejam acessados pelo formulrio da aplicao, centralizando o acesso a dados por parte da aplicao. Para criar um Data Module, voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Data Module do menu File do Delphi 7. Ou: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items, selecionar o item correspondente ao Data Module e o boto Ok. Ser ento criado um Data Module, como mostrado na figura a seguir. 2. Altere a propriedade Name deste DataModule para Dados. 3. Selecione o item Save as, do menu File, e salve a unidade de cdigo associada a este DataModule com o nome UnitDados.pas. Embora o objeto DataModule no seja um formulrio comum, para exibi-lo devem ser executados os mesmos procedimentos usados para exibir qualquer formulrio.

174 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS

Figura 11.1: O objeto DataModule.

4. Exiba o formulrio de Cadastro de Scios e selecione os diversos componentes de acesso, como mostrado na figura a seguir.

Figura 11.2: Selecionando os componentes de acesso a dados no formulrio de Cadastro de Scios.

5. Selecione o item Cut do menu Edit do ambiente de desenvolvimento do Delphi 7. 6. Exiba novamente o Datamodule. 7. Selecione o item Paste do menu Edit do ambiente de desenvolvimento do Delphi 7. Os componentes de acesso sero includos no formulrio, como mostrado na figura a seguir.

Figura 11.3: Copiando os componentes de acesso a dados do formulrio de cadastro de scios para o Datamodule.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

175

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Caso seja necessrio, reposicione os diversos componentes no Datamodule.

8. Exiba novamente o formulrio de Cadastro de Scios e selecione o item Use Unit do menu File do ambiente de desenvolvimento do Delphi 7. Ser exibida a caixa de dilogo Use Unit, mostrada na figura a seguir.

Figura 11.4: A caixa de dilogo Use Unit.

9. Nesta caixa de dilogo, selecione a unit UnitDados e o boto Ok. 10. Selecione cada um dos componentes DBEdit e o DBCombobox e altere a propriedade Datasource de cada um deles para Dados.DatasourceSocios. 11. Na unit UnitCadastraSocios, troque cada referncia a ClientDatasetSocios para Dados.ClientDatasetSocios. Isto se deve ao fato de que, a partir de agora, o componente ClientDataSocios um campo interno ao objeto Dados, e da a necessidade da sua qualificao. Desta maneira, os procedimentos associados a eventos na unit UnitCadastraSocios passaro a ter a seguinte codificao:
procedure TFormCadastraSocios.FormShow(Sender: TObject); begin DBEditCodigoSocio.SetFocus; Dados.ClientDatasetSocios.Open; Dados.ClientDatasetSocios.Append; end; procedure TFormCadastraSocios.BotaoCadastrarClick(Sender: TObject); begin Dados.ClientDatasetSocios.Post; Dados.ClientDatasetSocios.Append; DBEditCodigoSocio.SetFocus;

176 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS


end; procedure TFormCadastraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.ClientDatasetSocios.Delete; Dados.ClientDatasetSocios.ApplyUpdates(0); end; procedure TFormCadastraSocios.DBEditCodigoSocioKeyPress(Sender: TObject; var Key: Char); begin if (key = #13) then begin Key := #0; SelectNext((Sender as TWinControl),True,True); end; end; procedure TFormCadastraSocios.DBEditCodigoSocioEnter(Sender: TObject); begin (Sender as TDBEdit).Color := clActiveCaption; (Sender as TDBEdit).Font.Color := clCaptionText; end; procedure TFormCadastraSocios.DBEditCodigoSocioExit(Sender: TObject); begin (Sender as TDBEdit).Color := clWindow; (Sender as TDBEdit).Font.Color := clWindowText; end;

Para exibir o objeto DataModule criado nos tpicos anteriores, execute os seguintes procedimentos: 1. Selecione a opo Forms no menu View. Ser apresentada a lista de formulrios disponveis (Figura 11.5).

Figura 11.5: Selecionando um formulrio ou objeto DataModule.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

177

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


2. Selecione Dados e depois o boto OK. Ser exibido o objeto Dados (o DataModule).

OS OBJETOS DE ACESSO AO BANCO DE DADOS


Observando novamente a Figura 11.3, verificamos que os seguintes componentes foram inseridos no objeto DataModule: Um componente que representa a conexo ao banco de dados. Este componente denominado SQLConnection, e foi abordado anteriormente. Um componente que representa uma tabela de um banco de dados. Este componente denominado SQLTable, e s permite acesso unidirecional aos registros da tabela. Um componente que faz a ligao entre o componente SQLTable e o componente ClientDataset, que permitir o acesso bidirecional aos registros da tabela. Este componente denominado DatasetProvider. Este componente se conecta ao componente SQLTable atravs da sua propriedade Dataset. Um componente ClientDataset, que como j foi dito permitir o acesso bidirecional aos registros da tabela, e permitindo a sua edio local (na memria), a ser posteriormente efetivada no banco de dados, mediante uma chamada ao seu mtodo ApplyUpdates. Este componente se conecta ao componente DatasetProvider atravs da sua propriedade ProviderName. Um componente que estabelece a conexo entre o componente que representa uma tabela de um banco de dados e os componentes destinados sua visualizao. Este componente denominado DataSource, e se conecta ao componente SQLTable atravs da sua propriedade Dataset.

O COMPONENTE CLIENTDATASET
Conforme visto no tpico anterior, o componente ClientDataset representa uma tabela de um banco de dados, permitindo a sua edio local e com acesso bidirecional, o que no permitido pelo componente SQLTable. Este componente possui um cursor ou ponteiro que indica o registro corrente da tabela na memria, isto , aquele registro com o qual se est trabalhando localmente no momento.

PRINCIPAIS PROPRIEDADES DO COMPONENTE CLIENTDATASET


Entre as principais propriedades de um componente do tipo ClientDataset, podemos destacar: Active: Esta propriedade definida como uma varivel booleana, e define se uma tabela est ou no ativa na memria. Definir Active como True ou False equivale a chamar os seus mtodos Open e Close, respectivamente (estes mtodos sero descritos a seguir). BOF: Esta propriedade declarada como uma varivel booleana. Quando o seu valor for igual a True, indica que o cursor est posicionado no primeiro registro da tabela na memria. ProviderName: Esta propriedade serve para informar o nome do componente DatasetProvider ao qual pertence est conectado. EOF: Esta propriedade declarada como uma varivel booleana. Quando o seu valor for igual a True, indica que o cursor est posicionado no ltmo registro da tabela na memria.

178 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS


Fields: Esta propriedade um array que armazena, em cada um dos seus elementos, o valor armazenado em cada um dos campos do registro corrente da tabela representada pelo componente. O valor do primeiro campo est armazenado em Fields[0], o do segundo campo em Fields[1], etc., de maneira que o valor armazenado no n-simo campo est em Fields[n-1]. IndexName: Esta propriedade armazena o nome do ndice corrente da tabela na memria. Name: Esta propriedade, como em qualquer objeto, define o nome pelo qual o componente ser referenciado no programa. RecordCount: Esta propriedade armazena o nmero de registros existentes na tabela.

PRINCIPAIS MTODOS DO COMPONENTE CLIENTDATASET


Alm das propriedades descritas no tpico anterior, este componente tambm tem mtodos que nos permitem manipular os registros de uma tabela na memria. Entre estes mtodos, podemos destacar: Append: Este mtodo acrescenta um registro em branco no final da tabela na memria. Cancel: Este mtodo desfaz as alteraes feitas no registro corrente (desde que estas alteraes ainda no tenham sido gravadas, ainda que localmente na memria). Close: Este mtodo bloqueia o acesso a uma tabela na memria (equivale a definir o valor da propriedade Active como False). Delete: Este mtodo deleta (remove) o registro corrente da tabela na memria. Edit: Este mtodo permite a edio dos campos do registro corrente na memria. FieldByName: Este mtodo retorna o valor armazenado em um campo do registro corrente na memria, cujo nome passado como parmetro na forma de uma string. Por exemplo, para obter o valor armazenado no campo Nome do registro corrente da tabela Scios na memria, que representado pelo componente ClientDatasetSocios, e atribu-lo a uma varivel s do tipo string, basta incluir a seguinte linha de cdigo:
s:= ClientDatasetSocios.FieldByName(Nome).AsString;

First: Este mtodo coloca o primeiro registro da tabela na memria como o registro corrente (move o cursor para o primeiro registro da tabela na memria). Last: Este mtodo coloca o ltimo registro da tabela na memria como o registro corrente (move o cursor para o primeiro registro da tabela na memria). Next: Este mtodo coloca o prximo registro da tabela na memria como o registro corrente (move o cursor para o prximo registro da tabela na memria). Open: Este mtodo abre uma tabela na memria, tornando-a ativa e fornecendo acesso aos seus registros (equivale a definir o valor da propriedade Active como True). Post: Este mtodo realiza a gravao do registro corrente na memria. Prior: Este mtodo coloca o registro anterior da tabela na memria como o registro corrente (move o cursor para o registro anterior da tabela na memria). Refresh: Este mtodo atualiza os dados exibidos pelos registros da tabela na memria.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

179

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Existem outros mtodos, usados para aplicar filtros a uma tabela e para realizar pesquisas em registros, que sero vistos posteriormente. A ordem dos registros definida pelos campo(s) que forma(m) o ndice corrente da tabela.

O COMPONENTE DATASOURCE
Este componente de importncia fundamental no desenvolvimento de aplicativos de bancos de dados com o Delphi, pois ele quem se encarrega de fazer a conexo entre os componentes de visualizao (a serem vistos posteriormente) e os componentes de acesso (no nosso caso, as tabelas que compem o banco de dados). Exemplificando: para acessar a tabela Scios, representada na memria por um componente do tipo ClientDatasetSocios, precisamos incluir um componente DataSource para realizar a conexo entre a tabela na memria e os componentes que exibiro os valores armazenados nos campos dos seus registros (os componentes de visualizao). Os componentes de visualizao que desejarem acessar esta tabela na memria no o faro diretamente, mas atravs do componente DataSource, que serve como uma ponte entre estes e as tabelas.

PRINCIPAIS PROPRIEDADES DO COMPONENTE DATASOURCE


Entre as principais propriedades de um componente do tipo DataSource, podemos destacar: DataSet: Esta propriedade usada para definir o componente cuja conexo desejamos estabelecer. Name: Esta propriedade, como em qualquer objeto, define o nome pelo qual o componente ser referenciado no programa. Desta maneira, qualquer componente que queira acessar os dados da tabela Scios na memria, que representada por SQLCientDatasetSocios, deve faz-lo atravs do componente DataSourceSocios (o componente Datasource empregado neste exemplo). Fica ento estabelecida a seguinte regra: para cada tabela que quisermos acessar, representada por um componente do tipo ClientDataset (ou qualquer outro que represente uma tabela, como o SQLTable, Table no caso do BDE, ADOTable no caso do ADO, IBTable no caso do IBX, etc.), devemos incluir um componente do tipo DataSource cuja propriedade DataSet igual ao valor da propriedade Nome do componente que representa a tabela.

O COMPONENTE SIMPLEDATASET
Este componente foi incorporado a esta verso do Delphi (substituindo o componente SQLClientDataset incorporado na verso 6), e tem por finalidade substituir os componentes SQLConnection, SQLTable, DatasetProvider e ClientDataset. Na verdade, ele incorpora um componente SQLDataset, que ser visto posteriormente. Nestes exemplos, no eliminaremos a necessidade de uso do componente SQLConnection (no caso o componente SQLConnectionClube), pois vrios componentes usaro a conexo definida por este componente. Este componente o ltimo da pgina DBExpress da paleta de componentes, e para utiliz-lo para acessar a tabela Scios, execute os seguintes procedimentos:

180 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS


1. Exiba o Datamodule Dados. 2. Selecione simultaneamente os componentes SQLTableSocios, DatasetProviderSocios e ClientDatasetSocios. 3. Selecione a tecla Del, para remover os componentes selecionados. 4. Insira um componente SimpleDataset no Datamodule e configure da seguinte maneira as suas principais propriedades: Name: SimpleDatasetSocios. Connection: SQLConnectionClube. Subpropriedade CommandType da propriedade Dataset: ctTable. Subpropriedade Command da propriedade Dataset: SOCIOS. Subpropriedade Active da propriedade Dataset: True. 5. Altere a propriedade Dataset do componente DatasourceSocios para SimpleDatasetSocios. 6. Redefina da seguinte maneira os procedimentos associados a eventos da unit UnitCadastraSocios que referenciavam o componente ClientDatasetSocios:
procedure TFormCadastraSocios.FormShow(Sender: TObject); begin DBEditCodigoSocio.SetFocus; Dados.SimpleDatasetSocios.Open; Dados.SimpleDatasetSocios.Append; end; procedure TFormCadastraSocios.BotaoCadastrarClick(Sender: TObject); begin Dados.SimpleDatasetSocios.Post; Dados.SimpleDatasetSocios.Append; DBEditCodigoSocio.SetFocus; end; procedure TFormCadastraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetSocios.Delete; Dados.SimpleDatasetSocios.ApplyUpdates(0); end;

7. Usando o Fields Editor, selecione o item Add All Fields de seu menu pop-up para adicionar objetos para representar todos os campos desta tabela. 6. Redefina a propriedade EditMask para os objetos que representam os campos CEP e CPF, como descrito no captulo anterior.

INSERINDO OS DEMAIS COMPONENTES DE ACESSO


Para que as demais tabelas possam ser acessadas pelo nosso aplicativo, devemos incluir no Datamodule os componentes SimpleDataset e DataSource necessrios. Para isso, basta executar os seguintes procedimentos:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

181

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

PARA A TABELA DE ATIVIDADES:


1. Inclua um componente SimpleDataset e atribua os seguintes valores s suas principais propriedades: Name: SimpleDatasetAtividades. Connection: SQLConnectionClube. Subpropriedade CommandType da propriedade Dataset: ctTable. Subpropriedade Command da propriedade Dataset: ATIVIDADES. Subpropriedade Active da propriedade Dataset: True. 2. Inclua um componente DataSource e atribua os seguintes valores s suas principais propriedades: Name: DatasourceAtividades. Dataset: SimpleDatasetAtividades. 3. Usando o Fields Editor, selecione o item Add All Fields de seu menu pop-up para adicionar objetos para representar todos os campos desta tabela. 4. Atribua o valor ########.00 s propriedades EditFormat e DisplayFormat do objeto que representa o campo VALOR desta tabela. Isto far com que o nmero seja sempre exibido com duas casas decimais (estas propriedades definem a mscarade campos numricos).

PARA A TABELA DE MATRCULAS:


1. Inclua um componente SimpleDataset e atribua os seguintes valores s suas principais propriedades: Name: SimpleDatasetMatriculas. Connection: SQLConnectionClube. Subpropriedade CommandType da propriedade Dataset: ctTable. Subpropriedade Command da propriedade Dataset: MATRICULAS. Subpropriedade Active da propriedade Dataset: True. 2. Inclua um componente DataSource e atribua os seguintes valores s suas principais propriedades: Name: DatasourceMatriculas. Dataset: SimpleDatasetMatriculas. 3. Usando o Fields Editor, selecione o item Add All Fields de seu menu pop-up para adicionar objetos para representar todos os campos desta tabela. Aps a incluso destes componentes, seu Datamodule dever ficar com o aspecto mostrado na Figura a seguir:

Figura 11.6: Aspecto do objeto Datamodule aps a incluso dos demais componentes de acesso.

182 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS


Se necessrio, redimensione o Datamodule para que todos os componentes possam ser visualizados simultaneamente.

DEFININDO NDICES NOS COMPONENTES DE ACESSO


O componente SimpleDataset permite a definio de ndices locais, que so conjuntos de dois ou mais campos pelos quais os dados podem ser ordenados. Um ndice pode ser simples (quando formado por um nico campo) ou composto (quando formado por dois ou mais campos). Neste tpico sero apresentados os procedimentos necessrios criao de ndices simples e compostos.

CRIANDO UM NDICE SIMPLES


Quando consultarmos a tabela de atividades, ser interessante que estes dados estejam ordenados alfabeticamente pelos nomes das atividades. Neste caso, devemos criar um ndice simples, baseado no campo Nome. Para criar este ndice, voc deve executar os seguintes procedimentos: 1. Selecione o componente SimpleDatasetAtividades. 2. No Object Inspector, selecione os trs pontinhos direita da propriedade IndexDefs, para exibir a janela de edio de ndices, mostrada na figura a seguir.

Figura 11.7: A janela de edio de ndices.

3. Selecione o boto direito do mouse para exibir o menu pop-up desta janela e, neste menu, selecione o ndice Add, para criar um novo ndice na memria. Este ndice ser representado por um objeto da classe TIndexDefs, como mostrado na figura a seguir.

Figura 11.8: Criando um objeto da classe TIndexDefs.

4. Altere a propriedade Name deste objeto para indNome, usando o Object Inspector. 5. Defina como NOME a propriedade Fields deste objeto no Object Inspector. Isto indica que este ser um ndice simples, formado pelo campo Nome.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

183

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


6. Altere para indNome a propriedade indexName do componente SimpleDatasetAtividades, usando o Object Inspector. Pronto! Seu ndice simples foi criado!

CRIANDO UM NDICE COMPOSTO


Quando consultarmos a tabela de scios, ser interessante que estes dados estejam ordenados alfabeticamente pelos seus nomes. Neste caso, devemos criar um ndice composto, baseado no campo Nome e Sobrenome. Para criar este ndice, voc deve executar os seguintes procedimentos: 1. Selecione o componente SimpleDatasetSocios. 2. No Object Inspector, selecione os trs pontinhos direita da propriedade IndexDefs, para exibir a janela de edio de ndices. 3. Selecione o boto direito do mouse para exibir o menu pop-up desta janela e, neste menu, selecione o ndice Add, para criar um novo ndice na memria. Este ndice ser representado por um objeto da classe TIndexDefs. 4. Altere a propriedade Name deste objeto para indNome, usando o Object Inspector. 5. Defina como NOME;SOBRENOME (Os dois campos separados por um ponto-e-vrgula) a propriedade Fields deste objeto no Object Inspector. Isto indica que este ser um ndice composto, formado pelos campos Nome e Sobrenome. 6. Altere para indNome a propriedade indexName do componente SimpleDatasetSocios, usando o Object Inspector. Pronto! Seu ndice composto foi criado!

CRIANDO CHAVES PRIMRIAS


Existem situaes em que dois registros no podem ter o mesmo valor em um determinado campo (ou grupo de campos), e neste caso dizemos que este campo (ou estes campos) formam uma chave primria simples (composta). No caso das tabelas de Scios e de Atividades, por exemplo, o campo referente a seu cdigo deve ser nico. Ou seja, devemos ter uma chave primria definida pelo campo CodigoSocio na tabela de scios e CodigoAtividade na tabela de Atividades. No caso da tabela de matrculas, devemos ter uma chave primria composta formada pelos campos Scio e Atividade (de modo a evitar que um mesmo scio seja matriculado duas vezes em uma mesma atividade).

CRIANDO UMA CHAVE PRIMRIA NA TABELA DE SCIOS


Para criar uma chave primria formada pelo campo CodigoSocio na tabela de Scios, voc deve executar os seguintes procedimentos:

184 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 CRIAO DE UM REPOSITRIO PARA COMPONENTES DE ACESSO A DADOS


1. Selecione o componente SimpleDatasetSocios. 2. No Object Inspector, selecione os trs pontinhos direita da propriedade IndexDefs, para exibir a janela de edio de ndices. 3. Selecione o boto direito do mouse para exibir o menu pop-up desta janela e, neste menu, selecione o ndice Add, para criar um novo ndice na memria. Este ndice ser representado por um objeto da classe TIndexDefs. 4. Altere a propriedade Name deste objeto para indCodigoSocio, usando o Object Inspector. 5. Defina como CODIGOSOCIO a propriedade Fields deste objeto no Object Inspector. 6. Altere para True o valor da subpropriedade ixPrimary da propriedade Options deste objeto, usando o Object Inspector. 7. Altere para True o valor da subpropriedade ixUnique da propriedade Options deste objeto, usando o Object Inspector. 8. Redefina da seguinte maneira o procedimento associado ao evento OnShow do formulrio:
procedure TFormCadastraSocios.FormShow(Sender: TObject); begin Dados.SimpleDatasetSocios.IndexName := indCodigoSocio; DBEditCodigoSocio.SetFocus; Dados.SimpleDatasetSocios.Open; Dados.SimpleDatasetSocios.Append; end;

Desta maneira, o ndice ser trocado ao se exibir o formulrio. 9. Redefina da seguinte maneira o procedimento associado ao evento OnClose do formulrio:
procedure TFormCadastraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetSocios.Delete; Dados.SimpleDatasetSocios.ApplyUpdates(0); Dados.SimpleDatasetSocios.IndexName := indNomeCompleto; end;

10. Redefina da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoCadastrar:
procedure TFormCadastraSocios.BotaoCadastrarClick(Sender: TObject); begin try Dados.SimpleDatasetSocios.Post; Dados.SimpleDatasetSocios.Append; except ShowMessage(Este Cdigo J Foi Cadastrado); end; DBEditCodigoSocio.SetFocus; end;

Desta maneira, o ndice ser novamente trocado ao se fechar o formulrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

185

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

CRIANDO UMA CHAVE PRIMRIA NA TABELA DE ATIVIDADES


Para criar uma chave primria formada pelo campo CodigoAtividade na tabela de Atividades, voc deve executar os seguintes procedimentos: 1. Selecione o componente SimpleDatasetAtividade. 2. No Object Inspector, selecione os trs pontinhos direita da propriedade IndexDefs, para exibir a janela de edio de ndices. 3. Selecione o boto direito do mouse para exibir o menu pop-up desta janela e, neste menu, selecione o ndice Add, para criar um novo ndice na memria. Este ndice ser representado por um objeto da classe TIndexDefs. 4. Altere a propriedade Name deste objeto para indCodigoAtividade, usando o Object Inspector. 5. Defina como CODIGOATIVIDADE a propriedade Fields deste objeto no Object Inspector. 6. Altere para True o valor da subpropriedade ixPrimary da propriedade Options deste objeto, usando o Object Inspector. 7. Altere para True o valor da subpropriedade ixUnique da propriedade Options deste objeto, usando o Object Inspector.

CRIANDO UMA CHAVE PRIMRIA COMPOSTA NA TABELA DE MATRCULAS


Para criar uma chave primria composta formada pelos campos SOCIO e ATIVIDADE na tabela de Matriculas, voc deve executar os seguintes procedimentos: 1. Selecione o componente SimpleDatasetMatricula. 2. No Object Inspector, selecione os trs pontinhos direita da propriedade IndexDefs, para exibir a janela de edio de ndices. 3. Selecione o boto direito do mouse para exibir o menu pop-up desta janela e, neste menu, selecione o ndice Add, para criar um novo ndice na memria. Este ndice ser representado por um objeto da classe TIndexDefs. 4. Altere a propriedade Name deste objeto para indMatricula, usando o Object Inspector. 5. Defina como SOCIO:ATIVIDADE a propriedade Fields deste objeto no Object Inspector. 6. Altere para True o valor da subpropriedade ixPrimary da propriedade Options deste objeto, usando o Object Inspector. 7. Altere para True o valor da subpropriedade ixUnique da propriedade Options deste objeto, usando o Object Inspector.

186 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS

Captulo
Criao de Formulrios Para Cadastro de Fornecedores, Produtos e Pedidos

12

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

187

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos necessrios criao de formulrios de cadastro de atividades e matrculas.

CRIAO DE FORMULRIOS DE CADASTRO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Criao de formulrios e utilizao dos componentes bsicos de interface. Utilizao de componentes para acesso a bancos de dados.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao de formulrios de cadastro.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de formulrios de cadastro.

CRIANDO O FORMULRIO DE CADASTRO DE ATIVIDADES


Para criar um formulrio de cadastro de atividades, execute os seguintes procedimentos: 1. Abra o projeto Clube.dpr, se ele j no estiver aberto no ambiente de desenvolvimento. 2. Crie um novo formulrio, selecionando o item New/Form do menu File do Delphi 7. 3. Altere as propriedades Name e Caption deste formulrio para FormCadastraAtividades e Cadastro de Atividades, respectivamente. 4. Salve a unit associada a este formulrio com o nome UnitCadastraAtividades. 5. Selecione o componente SimpleDatasetAtividades do Datamodule, conforme indicado na Figura 12.1.

Figura 12.1: Selecionando o componente SimpleDatasetAtividades do Datamodule.

6. Pressione o boto direito do mouse com o componente SimpleDatasetAtividades selecionado, para exibir o seu menu pop-up.

188 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS


7. Selecione o item Fields Editor deste menu pop-up. Ser exibida a caixa de dilogo do Fields Editor. 8. Pressione o boto direito do mouse sobre a rea branca do Fields Editor, para exibir o menu pop-up. 9. Selecione o item Add All Fields deste menu pop-up. Todos os campos sero exibidos na caixa de dilogo do Fields Editor, como mostrado na Figura 12.2.

Figura 12.2: Exibindo os campos da tabela no Fields Editor.

Conforme j descrito anteriormente, ao adicionar os campos da tabela no Fields Editor, o Delphi automaticamente cria objetos para representar estes campos. 10. Arraste os objetos do Fields Editor para o formulrio FormCadastraAtividades para criar os componentes Labels e DBEdits vinculados aos campos da tabela, como mostrado na figura a seguir.

Figura 12.3: Arraste os objetos do Fields Editor para o formulrio FormCadastraAtividades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

189

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Ao liberar o boto esquerdo do mouse ser exibida a mensagem mostrada na figura a seguir, informando que FormCadastraAtividades no inclui a unit Dados, e perguntando se deseja inclu-la. Selecione o boto Yes.

Figura 12.4: Mensagem de advertncia.

Isto provoca a incluso do nome da unit que contm o Datamodule Dados (UnitDados) na clusula uses da unit UnitCadastraAtividades. 11. Altere a propriedade Caption do Label referente ao cdigo da atividade para CDIGO DA ATIVIDADE. 12. Renomeie os componentes de visualizao dando-lhes os nomes DBEditCodigoAtividade, DBEditNomeAtividade e DBEditValorAtividade. 13. Coloque um boto de comando com figura (BitBtn) para Cadastro, e defina da seguinte maneira as suas principais propriedades: Kind: bkCustom. ModalResult: mrNone Name: BotaoCadastrar Caption: &Cadastrar Height: 50 Width: 100 14. Para que estes dados sejam gravados na tabela quando o usurio selecionar este boto, devemos definir da seguinte maneira o procedimento associado ao evento OnClick deste boto.
procedure TFormCadastraAtividades.BotaoCadastrarClick(Sender: TObject); begin try Dados.SimpleDatasetAtividades.Post; Dados.SimpleDatasetAtividades.Append; except ShowMessage(Este Cdigo J Foi Cadastrado); end; DBEditCodigoSocio.SetFocus; end;

15. Defina da seguinte maneira o procedimento associado ao evento OnShow deste formulrio:
procedure TFormCadastraAtividades.FormShow(Sender: TObject); begin Dados.SimpleDatasetAtividades.IndexName := indCodigoSocio; DBEditCodigoSocio.SetFocus; Dados.SimpleDatasetAtividades.Open; Dados.SimpleDatasetAtividades.Append; end;

190 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS


Desta maneira, o ndice ser trocado ao se exibir o formulrio. 16. Defina da seguinte maneira o procedimento associado ao evento OnKeyPress do componente DBEditCodigoAtividade, a ser compartilhado pelos demais componentes DBEdit:
procedure TFormCadastraAtividades.DBEditCodigoAtividadeKeyPress( Sender: TObject; var Key: Char); begin if (key = #13) then begin Key := #0; SelectNext((Sender as TWinControl),True,True); end; end;

17. Defina da seguinte maneira o procedimento associado ao evento OnClose deste formulrio:
procedure TFormCadastraAtividades.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetAtividades.Delete; Dados.SimpleDatasetAtividades.ApplyUpdates(0); Dados.SimpleDatasetAtividades.IndexName := indNomeCompleto; end;

Desta maneira, o ndice ser novamente trocado ao se fechar o formulrio. 18. Defina da seguinte maneira o procedimento associado ao evento OnEnter do componente DBEditCodigoAtividade, a ser compartilhado pelos demais componentes DBEdit:
procedure TFormCadastraAtividades.DBEditCodigoAtividadeEnter( Sender: TObject); begin (Sender as TDBEdit).Color := clActiveCaption; (Sender as TDBEdit).Font.Color := clCaptionText; end;

19. Defina da seguinte maneira o procedimento associado ao evento OnExit do componente DBEditCodigoAtividade, a ser compartilhado pelos demais componentes DBEdit:
procedure TFormCadastraAtividades.DBEditCodigoAtividadeExit( Sender: TObject); begin (Sender as TDBEdit).Color := clWindow; (Sender as TDBEdit).Font.Color := clWindowText; end;

20. Inclua mais um boto de comando com figura e defina suas principais propriedades como indicado a seguir: Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

191

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Seu formulrio dever ficar com o aspecto mostrado na figura a seguir.

Figura 12.5: Aspecto final do formulrio para Cadastro de Atividades.

21. Defina da seguinte maneira o procedimento associado ao evento OnClick do item Cadastrar do menu Atividades, e compartilhe este procedimento com o evento OnClick do item Cadastrar do submenu Atividades do menu pop-up:
procedure TFormPrincipal.AtividadesCadastroClick(Sender: TObject); begin FormCadastraAtividades.ShowModal; end;

Ao recompilar a aplicao, ser exibida uma mensagem de advertncia perguntando se o nome da unit do novo formulrio deve ser includo na clusula uses da unit UnitPrincipal. Responda yes a esta mensagem e recompile o projeto.

CRIANDO UM FORMULRIO PARA CADASTRAR NOVAS MATRCULAS


Neste tpico veremos como criar um formulrio para acrescentar novas matrculas.

DEFININDO O FORMULRIO
Este formulrio ser usado para acrescentar um nova matrcula de um scio numa atividade tabela de matrculas. Como j descrito anteriormente, esta tabela possui os seguintes campos: CodigoScio. Este campo, do tipo inteiro, armazena o cdigo de scio que ser matriculado. CodigoAtividade. Este campo, do tipo inteiro, armazena o cdigo da atividade na qual o scio ser matriculado. Estes campos poderiam ser acessados atravs de um componente do tipo DBEdit. No entanto, o valor armazenado neles deve ser igual a um dos valores j armazenados no campo CodigoScio (para o campo referente ao scio que est sendo matriculado) da tabela de Scios, ou igual a um dos valores j armazenados no campo CodigoAtividade (para o campo referente atividade na qual o scio ser matriculado) da tabela de Atividades. Desta forma evitamos que se selecione um scio ou uma atividade no cadastrados. Para resolver este problema, podemos apresentar uma lista de opes usando um componente do tipo DBLookupComboBox, que ser apresentado nos prximos tpicos.

192 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS

CRIANDO O FORMULRIO
Para criar o formulrio, execute os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7. Ser criado um formulrio default, chamado Form1. 2. Altere o valor da propriedade Name do formulrio para FormCadastraMatriculas. 3. Altere o valor da sua propriedade Caption para Cadastro de Matrculas. 4. Salve a unit associada a este formulrio com o nome UnitCadastraMatriculas. 5. Inclua a unit UnitCadastraMatriculas na clusula uses da unit UnitPrincipal.

INSERINDO OS COMPONENTES NO FORMULRIO


Para incluir os controles no formulrio, execute os seguintes procedimentos: 1. Insira no formulrio um componente do tipo Label e defina como Scio o valor da sua propriedade Caption. 2. Insira no formulrio um segundo componente do tipo Label e defina como Atividade o valor da sua propriedade Caption. 3. Inclua o nome da unit UnitDados na clusula uses da unit associada a este formulrio. 4. Insira no formulrio um componente do tipo DBLookupCombobox (da pgina Data Controls), posicione-o abaixo do componente Label cuja propriedade Caption foi definida como Scio e defina os seguintes valores para as suas principais propriedades: Name: DBLookupComboboxSocio. DataSource: Dados.DatasouceMatriculas. DataField: Socio. ListSource: Dados.DatasouceSocios. ListField: Nome. KeyField: CodigoSocio. Para definir o scio que est sendo matriculado, optou-se por usar um componente do tipo DBLookupComboBox, que permite exibir em uma lista drop-down os valores armazenados em um campo dos registros de uma tabela e gravar um valor correspondente ao item selecionado em um campo do registro corrente de uma segunda tabela. Este componente trabalha, portanto, com duas tabelas: uma tabela-fonte a partir da qual so obtidos os valores a serem exibidos na lista e uma segunda tabela (tabela-destino), na qual ser gravado, em um campo do registro corrente, um valor que vai depender do item selecionado na lista. Para acessar duas tabelas, tm de ser usados, evidentemente, dois componentes do tipo DataSource, que so especificados nas propriedades ListSource (para a tabela-fonte) e DataSource (para a tabeladestino) do componente DBLookupCombobox. 5. Insira no formulrio um segundo componente do tipo DBLookupCombobox, posicione-o abaixo do componente Label cuja propriedade Caption foi definida como Atividade e defina os seguintes valores para as suas principais propriedades:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

193

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Name: DBLookupComboboxAtividade. DataSource: Dados.DatasouceMatriculas. DataField: Atividade. ListSource: Dados.DatasouceAtividades. ListField: Nome. KeyField: CodigoAtividade.

PROPRIEDADES DO COMPONENTE DBLOOKUPCOMBOBOX


Entre as principais propriedades deste componente, podem-se destacar: Name: Define o nome pelo qual o objeto ser referenciado no cdigo da aplicao. Left e Top: Definem a posio do componente no formulrio. Height e Width: Definem as dimenses do componente. DataSource: Define o componente que estabelece a conexo com a tabela-destino. ListSource: Define o componente que estabelece a conexo com a tabela-fonte. KeyField: Define o campo de ligao entre as tabelas. Esta propriedade define o campo da tabela-fonte cujo valor do registro corrente ser armazenado num campo do registro corrente da tabela-destino (o nome do campo ser o especificado na propriedade DataField). O registro corrente da tabela-fonte ser o correspondente ao item selecionado na lista. DataField: Esta propriedade define o campo do registro corrente da tabela-destino, no qual ser gravado o valor do campo especificado na propriedade KeyField do registro corrente da tabela-fonte. ListField: Define o campo dos registros da tabela-fonte, cujos valores sero exibidos na lista drop-down do componente. 6. Coloque um boto de comando com figura (BitBtn) para Cadastro, e defina da seguinte maneira as suas principais propriedades: Kind: bkCustom. ModalResult: mrNone Name: BotaoCadastrar Caption: &Cadastrar Height: 50 Width: 100 7. Para que estes dados sejam gravados na tabela quando o usurio selecionar este boto, devemos definir da seguinte maneira o procedimento associado ao evento OnClick deste boto.
procedure TFormCadastraMatriculas.BotaoCadastrarClick(Sender: TObject); begin try Dados.SimpleDatasetMatriculas.Post; Dados.SimpleDatasetMatriculas.Append; except ShowMessage(Este Scio J Foi Cadastrado Nesta Atividade); end; DBLookupComboBoxSocio.SetFocus; end;

Desta maneira, o ndice ser novamente trocado ao se fechar o formulrio. 8. Defina da seguinte maneira o procedimento associado ao evento OnShow deste formulrio:

194 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS


procedure TFormCadastraMatriculas.FormShow(Sender: TObject); begin Dados.SimpleDatasetMatriculas.IndexName := indMatrcula; Dados.SimpleDatasetMatriculas.Open; Dados.SimpleDatasetMatriculas.Append; end;

Desta maneira, o ndice ser trocado ao se exibir o formulrio. 9. Defina da seguinte maneira o procedimento associado ao evento OnKeyPress do componente DBLookupComboboxSocio, a ser compartilhado pelos componente DBLookupComboboxSocio.
procedure TFormCadastraMatriculas.DBLookupComboBoxSocioKeyPress( Sender: TObject; var Key: Char); begin if (key = #13) then begin Key := #0; SelectNext((Sender as TWinControl),True,True); end; end;

10. Defina da seguinte maneira o procedimento associado ao evento OnClose deste formulrio:
procedure TFormCadastraMatriculas.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetMatriculas.Delete; Dados.SimpleDatasetMatriculas.ApplyUpdates(0); Dados.SimpleDatasetMatriculas.IndexName := indSocio; end;

11. Inclua mais um boto de comando com figura e defina suas principais propriedades como indicado a seguir: Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100 Seu formulrio dever ficar com o aspecto mostrado na figura a seguir.

Figura 12.6: Aspecto final do formulrio para Cadastro de Atividades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

195

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


12. Defina da seguinte maneira o procedimento associado ao evento OnClick do item Cadastrar do menu Matriculas, e compartilhe este procedimento com o evento OnClick do item Cadastrar do submenu Matriculas do menu pop-up:
procedure TFormPrincipal.MatriculasCadastroClick(Sender: TObject); begin FormCadastraMatriculas.ShowModal; end;

13. Use a caixa de dilogo Edit Tab Order para que os componentes sejam ordenados na forma mais adequada para a digitao das informaes. Repare que ao exibir o formulrio e selecionar a seta direita do componente DBLookupComboboxSocio, apenas o nome de um scio exibido. Isto ocorre porque, em nossa tabela, o nome e o sobrenome de um scio foram armazenados em campos distintos. E como resolver o caso de vrios scios com o mesmo nome? Neste caso, a soluo consiste em empregar o recurso de campos calculados, apresentado no tpico a seguir.

TRABALHANDO COM CAMPOS CALCULADOS


Um campo calculado um tipo especial de campo de uma tabela, cujo valor depende dos valores armazenados em outros campos. Este campo s existe durante a execuo do aplicativo, reduzindo desta maneira a quantidade de espao em disco a ser ocupado pela tabela. Podemos ento criar um campo calculado na tabela de Scios, chamado NomeCompleto, cujo valor ser obtido pela unio dos valores armazenados nos campos Nome e Sobrenome. Para criar este campo calculado, execute os seguintes procedimentos: 1. Exiba o objeto Dados (o DataModule). 2. Selecione o componente SimpleDatasetSocios. 3. Redefina como False o valor da propriedade Active deste componente. 4. Pressione o boto direito do mouse, para exibir o menu pop-up do componente. 5. Selecione o item Fields Editor do menu pop-up, para exibir o Editor de campos. 6. Pressione o boto direito do mouse, para exibir o menu pop-up do Fields Editor. 7. Selecione o item New Field do menu pop-up, para exibir a caixa de dilogo New Field, mostrada na figura a seguir.

Figura 12.7: Criando um campo calculado.

196 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 CRIAO DE FORMULRIOS PARA CADASTRO DE FORNECEDORES, PRODUTOS E PEDIDOS


8. Preencha os campos da caixa de dilogo New Field como indicado na figura anterior. 9. Clique em OK, para fechar a caixa de dilogo e criar o novo campo. 10. Redefina como True o valor da propriedade Active deste componente. 11. Defina da seguinte maneira o procedimento associado ao evento OnCalcFields do componente SimpleDatasetSocios:
procedure TDados.SimpleDataSetSociosCalcFields(DataSet: TDataSet); begin SimpleDatasetSociosNomeCompleto.AsString := SimpleDatasetSociosNome.AsString + +SimpleDatasetSociosSobrenome.AsString; end;

A linha de cdigo anterior faz com que o valor armazenado no campo NomeCompleto seja obtido pela concatenao do valor armazenado no campo Nome, com uma string composta por um espao em branco e o valor armazenado no campo Sobrenome. No esquea de incluir a string composta por um espao em branco, para que seja inserido um espao entre o nome e o sobrenome do scio. Esta string tambm ser til quando criarmos um formulrio para a consulta de dados de scios. 12. Redefina como NomeCompleto a propriedade ListField do componente DBLookupComboboxSocio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

197

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES

Captulo

13

Criando Formulrios Para Alterao de Scios e Atividades

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

199

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos necessrios criao de formulrios para alterao dos dados de Scios e Atividades. Sero utilizados muitos dos procedimentos descritos nos captulos anteriores. Portanto, importante que estes tenham sido perfeitamente compreendidos pelo leitor.

CRIAO DE FORMULRIOS PARA ALTERAO DE DADOS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Criao de formulrios e utilizao dos componentes bsicos de interface. Utilizao de componentes para acesso a bancos de dados e de visualizao.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao de Templates de Componentes para agrupar componentes a serem utilizados em vrios Formulrios.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de Templates de Componentes.

O CONCEITO DE TEMPLATES DE COMPONENTES


Existem situaes em que um mesmo grupo de componentes usado em diversos formulrios. Neste captulo, por exemplo, criaremos formulrios para a alterao dos dados dos scios e atividades. Para que isso seja possvel, devemos, em cada formulrio, incluir vrios componentes que acessem os diversos campos de cada uma das tabelas. Acontece que este trabalho j foi feito na criao de formulrios de cadastro, e seria razovel aproveitar o trabalho j realizado. A fim de facilitar o trabalho do desenvolvedor, o Delphi apresenta o conceito de Templates de Componentes entidades capazes de armazenar um conjunto de componentes (e os procedimentos associados a seus eventos) como um tipo especial de componente. Neste captulo, criaremos trs formulrios com uma caracterstica comum: permitir alterao de registros. Conseqentemente, cada um destes formulrios possuir: Os componentes de visualizao e labels criados nos respectivos formulrios de Cadastro. Uma caixa de texto para que o usurio possa pesquisar o registro a ser alterado pelo Nome do Scio ou Atividade. Um boto a ser utilizado para fechar o formulrio. Um componente DBNavigator, para permitir uma navegao rpida entre os registros.

200 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES

CRIANDO OS TEMPLATES DE COMPONENTES


Para criar o Template de Componentes de Visualizao da tabela de Scios usando os componentes j existentes no formulrio de cadastro de Scios, voc dever executar os seguintes procedimentos: 1. Exibir o formulrio FormCadastraSocios. 2. Selecionar todos os componentes Label, DBEdit e DBComboBox existentes neste formulrio. 3. Selecionar o item Create Component Template do menu Component, para exibir a caixa de dilogo mostrada na figura a seguir, na qual devero ser fornecidas as informaes necessrias criao do template.

Figura 13.1: A caixa de dilogo Component Template Information, usada para manipular componentes de acesso tabela de scios.

4. Nesta caixa de dilogo devero ser informados: Um nome para o template. O nome da pgina da paleta de componentes na qual o cone do Template ser exibido como se fosse um componente. Neste exemplo digitaremos o nome de uma pgina inexistente na paleta de componentes, e que ser ento automaticamente criada pelo ambiente de desenvolvimento. Um cone para o Template (neste exemplo, estamos usando o cone do componente Label). Digite as informaes mostradas na figura anterior e selecione o boto OK, para fechar esta caixa de dilogo e criar o Template de Componentes. Ser criada uma pgina chamada Clube na paleta de componentes, para armazenar o Template recm-criado. Para criar o Template de Componentes para a tabela Atividades usando os componentes j existentes no formulrio de cadastro de Atividades, voc dever executar os seguintes procedimentos: 1. Exibir o formulrio FormCadastraAtividades. 2. Selecionar todos os componentes Label e DBEdit existentes neste formulrio. 3. Selecionar o item Create component Template do menu Component, para exibir a caixa de dilogo mostrada na figura a seguir, na qual devero ser fornecidas as informaes necessrias criao do template.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

201

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 13.2: A caixa de dilogo Component Template Information, usada para manipular componentes de acesso tabela de atividades.

4. Digite as informaes mostradas na figura anterior e selecione o boto OK, para fechar esta caixa de dilogo e criar o Template de Componentes.

CRIANDO O FORMULRIO DE ALTERAO DE SCIOS


Para criar o formulrio de alterao de scios, voc deve executar os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7, para criar um novo formulrio. 2. Altere o valor das suas propriedades Name e Caption para FormAlteraSocios e Alterao de Dados dos Scios, respectivamente. 3. Salve a unit associada a este formulrio com o nome UnitAlteraClientes. 4. Inclua o nome das units UnitDados e DB na clusula uses da unit associada ao formulrio recm-criado. 5. Inclua o Template SociosTemplate no formulrio. Repare que todos os componentes sero criados de uma s vez, bem como os procedimentos associados a seus eventos. A incluso de um Template segue os mesmos procedimentos necessrios incluso de um componente. 6. Inclua um boto de comando com figura na parte inferior do formulrio, e defina da seguinte maneira as suas principais propriedades: Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100 7. Inclua um componente Caixa de Texto (Edit) no formulrio, e altere o valor da sua propriedade Name para EditPesquisa, apague o valor digitado na sua propriedade Text e codifique da seguinte maneira o procedimento associado ao seu evento OnChange:
procedure TFormAteraSocios.EditPesquisaChange(Sender: TObject); begin Dados.SimpleDatasetSocios.Locate(NOME,VarArrayOf([EditPesquisa.Text]),[loPartialKey,LocaseInsensitive]); end;

Para evitar erros de compilao mantenha todo o comando digitado em uma nica linha.

202 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES


8. Defina da seguinte maneira o procedimento associado ao evento OnShow do formulrio:
procedure TFormAteraSocios.FormShow(Sender: TObject); begin Dados.SimpleDatasetSocios.Open; EditPesquisa.Clear; end;

9. Defina da seguinte maneira o procedimento associado ao evento OnClose do formulrio:


procedure TFormAlteraSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetSocios.ApplyUpdates(0); end;

10. Inclua prximo ao componente EditPesquisa um componente Label no formulrio e altere o valor da sua propriedade Caption para DIGITE O NOME A SER PESQUISADO, respectivamente. 11. Inclua um componente DBNavigator (pgina Data Controls) no formulrio e defina da seguinte maneira as suas principais propriedades: Name: DBNavigatorSocios DataSource: Dados.DatasourceSocios VisibleButtons: [nbFirst,nbPrior,nbNext,nbLast] 12. Reposicione os componentes no formulrio, de maneira que este fique com um aspecto semelhante ao apresentado na figura a seguir.

Figura 13.3: Aspecto do formulrio para alterao dos dados dos scios.

13. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 14. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Alterao do menu Scios, e compartilhe este procedimento com o evento OnClick do item Alterao do submenu Scios do menu pop-up do formulrio.
FormAlteraSocios.ShowModal;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

203

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

CRIANDO O FORMULRIO DE ALTERAO DE ATIVIDADES


Para criar o formulrio de alterao de atividades, voc deve executar os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7, para criar um novo formulrio. 2. Altere o valor das suas propriedades Name e Caption para FormAlteraAtividades e Alterao de Atividades, respectivamente. 3. Salve a unit associada a este formulrio com o nome UnitAlteraAtividades. 4. Inclua os nomes das units UnitDados e DB na clusula uses da unit associada ao formulrio recm-criado. 5. Inclua o Template AtividadesTemplate no formulrio. Repare que todos os componentes sero criados de uma s vez, bem como os procedimentos associados a seus eventos. 6. Inclua outro boto de comando com figura na parte inferior do formulrio, e defina da seguinte maneira as suas principais propriedades: Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100 7. Inclua um componente Caixa de Texto (Edit) no formulrio, e altere o valor da sua propriedade Name para EditPesquisa, apague o valor digitado na sua propriedade Text e codifique da seguinte maneira o procedimento associado ao seu evento OnChange:
procedure TFormAlteraAtividades.EditPesquisaChange(Sender: TObject); begin Dados.SimpleDatasetAtividades.Locate(NOME,VarArrayOf([EditPesquisa.Text]),[loPartialKey,LocaseInsensitive]); end;

8. Defina da seguinte maneira o procedimento associado ao evento OnShow do formulrio:


procedure TFormAlteraAtividades.FormShow(Sender: TObject); begin Dados.SimpleDatasetAtividades.Open; EditPesquisa.Clear; end;

9. Defina da seguinte maneira o procedimento associado ao evento OnClose do formulrio:


procedure TFormAlteraAtividades.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetSocios.ApplyUpdates(0); end;

10. Inclua prximo ao componente EditPesquisa um componente Label no formulrio e altere o valor da sua propriedade Caption para DIGITE O NOME A SER PESQUISADO. 11. Inclua um componente DBNavigator no formulrio e defina da seguinte maneira as suas principais propriedades: Name: DBNavigatorAtividades DataSource: Dados.DatasourceAtividades VisibleButtons: [nbFirst,nbPrior,nbNext,nbLast]

204 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES


12. Reposicione os componentes no formulrio, de maneira que este fique com um aspecto semelhante ao apresentado na figura a seguir.

Figura 13.4: Aspecto do formulrio para alterao dos Dados das Atividades.

13. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 14. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Alterao do menu Atividades, e compartilhe este procedimento com o evento OnClick do item Alterao do submenu Atividades do menu pop-up do formulrio.
FormAlteraAtividades.ShowModal;

O COMPONENTE DBNAVIGATOR
Este controle permite a manipulao direta dos registros de uma tabela. Este controle permite que o usurio manipule os registros de uma tabela do banco de dados e seus botes possuem os seguintes significados (da esquerda para a direita): Exibir o primeiro registro da tabela. Exibir o registro anterior da tabela. Exibir o prximo registro da tabela. Exibir o ltimo registro da tabela. Insere um registro em branco na tabela. Deleta (exclui) o registro corrente da tabela. Permite a edio do registro corrente da tabela. Grava o registro corrente da tabela. Cancela a edio do registro corrente do banco de dados. Atualiza a exibio dos registros da tabela. Entre as propriedades deste componente, podemos destacar: DataSource: Esta propriedade define o componente que nos fornecer a conexo que desejamos estabelecer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

205

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Name: Esta propriedade define o nome pelo qual o componente ser referenciado no programa. ShowHint: Essa propriedade uma varivel booleana que define se o componente deve ou no exibir strings de auxlio quando o ponteiro do mouse estiver sobre cada um dos seus botes. Hints: Essa propriedade um objeto da classe TStrings e define as strings de auxlio dos diversos botes exibidos pelo componente DBNavigator (permitindo a sua personalizao). Para personalizar as strings de auxlio dos controles DBNavigator includos nos formulrios, execute os seguintes procedimentos: 1. Selecione o componente DBNavigator, clicando sobre o mesmo com o boto esquerdo do mouse. 2. Selecione a propriedade Hints diretamente no Object Inspector. 3. Clique com o boto esquerdo do mouse sobre as reticncias (...) exibidas do lado direito da propriedade no Object Inspector. Ser exibida a caixa de dilogo String List Editor. 4. Digite as expresses mostradas na figura a seguir.

Figura 13.5: Configurando as strings de auxlio para o componente DBNavigator.

5. Selecione o boto OK, para fechar a caixa de dilogo. Nessa caixa de dilogo, cada string digitada em uma linha corresponde string de auxlio de um boto. A primeira linha corresponde ao primeiro boto (da esquerda para a direita); a segunda linha, ao segundo boto e assim por diante. Os mtodos correspondentes a cada um desses botes, disponveis para os objetos da classe TSimpleDataset, so: Primeiro Registro: Mtodo First. Registro Anterior: Mtodo Prior. Prximo Registro: Mtodo Next. ltimo Registro: Mtodo Last. Inserir Registro: Mtodo Append. Deletar Registro: Mtodo Delete.

206 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 CRIANDO FORMULRIOS PARA ALTERAO DE SCIOS E ATIVIDADES


Editar Registro: Mtodo Edit. Gravar Registro: Mtodo Post. Cancelar Edio do Registro: Mtodo Cancel. Atualizar a Exibio do Registro: Mtodo Refresh. ShowHint: Esta propriedade definida como uma varivel booleana e define se uma string de auxlio deve ou no ser exibida quando o usurio mantiver o ponteiro do mouse sobre um controle. Se o seu valor for False, nenhuma string de auxlio ser exibida durante a execuo do aplicativo. VisibleButtons: Define os botes que devem ser exibidos no controle. Voc pode alterar essa propriedade mediante a incluso de uma linha de cdigo ou modificando os valores das subpropriedades de VisibleButtons diretamente no Object Inspector. Para exibir essas subpropriedades, d um duplo clique com o boto esquerdo do mouse sobre o sinal (+) exibido esquerda do nome da propriedade VisibleButtons. As subpropriedades so exibidas (podendo ser diretamente alteradas) e o sinal (+) substitudo por (-). Dando um duplo clique com o boto esquerdo do mouse sobre o smbolo (-), as subpropriedades so novamente ocultadas. Para exibir um boto, atribua o valor True subpropriedade correspondente, e False em caso contrrio. Lembre-se: a existncia de um sinal de (+) imediatamente esquerda do nome de uma propriedade no Object Inspector indica que essa propriedade tem subpropriedades. Cada subpropriedade (de cima para baixo) corresponde a um dos botes (da esquerda para a direita). Neste exemplo, apenas os quatro primeiros botes foram habilitados, usando a propriedade VisibleButtons.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

207

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

208 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS

Captulo

14

Criando Formulrios Para Excluso de Scios, Atividades e Matrculas

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

209

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos necessrios criao de formulrios para excluso dos dados de Scios, Atividades e Matrculas. Sero utilizados muitos dos procedimentos descritos nos captulos anteriores. Portanto, importante que estes tenham sido perfeitamente compreendidos pelo leitor.

CRIAO DE FORMULRIOS PARA EXCLUSO DE DADOS


PR-REQUISITOS
Noes bsicas da utilizao dos ambientes de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Criao de formulrios e utilizao dos componentes bsicos de interface. Utilizao de componentes para acesso a bancos de dados e de visualizao.

METODOLOGIA
Apresentao e descrio dos procedimentos necessrios criao de Templates de formulrios Templates. Apresentao e descrio dos principais conceitos relacionados criao de Formulrios Para Excluso de Dados.

TCNICA
Descrio dos procedimentos necessrios criao de formulrios Para Excluso.

CRIANDO UM TEMPLATE DE FORMULRIO


Neste captulo, criaremos trs formulrios com uma caracterstica comum: Excluir um registro selecionado. Conseqentemente, cada um destes formulrios possuir: Um DBGrid conectado a uma tabela atravs da qual sero visualizados os diversos registros. Um boto a ser utilizado para excluir o registro selecionado. Uma caixa de texto para que o usurio possa pesquisar o registro a ser excludo pelo Nome do Scio ou Atividade. Um boto a ser utilizado para fechar o formulrio. Para criar um template de formulrio para excluso de registro, voc deve executar os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7, para criar um novo formulrio. 2. Inclua um componente DBGrid (primeiro componente da pgina Data Controls da paleta de componentes) no formulrio. 3. Defina como True a propriedade ReadOnly deste DBGrid, diretamente no Object Inspector. 4. Defina como True a subpropriedade RowSelect da propriedade Options deste componente, diretamente no Object Inspector. 5. Inclua um boto de comando com figura (o segundo componente da pgina Additional) na parte inferior do formulrio, e defina da seguinte maneira as suas principais propriedades:

210 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS

Name: Caption:

BotaoExcluir &Excluir

Glyph: Localize o arquivo Trash.bmp (no Delphi 7 este arquivo costuma estar em c:\Arquivos de programas\Arquivos comuns\Borland shared\Images\Buttons\Trash.bmp, a menos que voc tenha alterado o diretrio default de instalao). Height: 50 Width: 100 Default: False Kind: bkCustom ModalResult: mrNone 6. Inclua outro boto de comando com figura na parte inferior do formulrio, e defina da seguinte maneira as suas principais propriedades: Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100 7. Inclua um componente Caixa de Texto (Edit) no formulrio, e altere o valor da sua propriedade Name para EditPesquisa. 8. Apague o texto existente na propriedade Text do componente EditPesquisa. 9. Inclua um componente Label no formulrio e altere o valor da sua propriedade Caption para Digite o Nome a ser Pesquisado. 10. Altere as propriedades Name e Caption do formulrio para FormExclusao e Excluso de , respectivamente. 11. Reposicione os componentes no formulrio, de maneira que este fique com um aspecto semelhante ao apresentado na Figura 14.1.

Figura 14.1: Aspecto do formulrio a ser usado como template.

12. Inclua o nome da unit UnitDados na clusula uses da unit associada a este formulrio. 13. Selecione o boto direito do mouse sobre o formulrio para exibir o seu menu pop-up, conforme mostrado na Figura 14.2.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

211

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 14.2: Exibindo o menu pop-up do Formulrio.

14. Neste menu pop-up, selecione o item Add To Repository, como indicado na figura anterior, para exibir a caixa de dilogo de mesmo nome, reproduzida na Figura 14.3.

Figura 14.3: A caixa de dilogo Add To Repository.

15. Digite um ttulo para este template na caixa de texto Title, desta caixa de dilogo, como indicado na figura anterior. Este ser o nome exibido na caixa de dilogo New Items, quando se desejar criar um novo formulrio usando este template. 16. Digite uma descrio para este template na caixa de texto Description, desta caixa de dilogo, como indicado na figura anterior. Esta descrio tem por finalidade documentar o objetivo do template. 17. Na caixa combo Page digite o nome da pgina da caixa de dilogo New Items na qual o template ser exibido, ou selecione um dos nomes disponveis. 18. Digite o nome do autor deste template na caixa de texto Author, desta caixa de dilogo, como indicado na figura anterior. 19. Opcionalmente, voc pode definir um cone alternativo para representar este template. Para isto, basta selecionar o boto Browse, clicando sobre o mesmo com o boto esquerdo do mouse, e especificar o nome do arquivo do cone na caixa de dilogo que ser exibida. 20. Selecione o boto Ok para fechar esta caixa de dilogo. Ser exibida uma mensagem, reproduzida na figura a seguir, indicando que a unit deve ser salva.

212 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS

Figura 14.4: Mensagem indicando que a unit deve ser salva.

21. Selecione yes nesta caixa de dilogo. Ser exibida a caixa de dilogo Save Unit1 As, na qual dever ser fornecido um nome para a unit. D o nome UnitTemplateExclusao para esta unit, como mostrado na figura a seguir e selecione o boto Salvar, para fechar esta caixa de dilogo.

Figura 14.5: A caixa de dilogo Save Unit1 As.

Pronto! O Template foi criado e poder ser usado na criao dos formulrios de excluso, conforme ser mostrado nos prximos tpicos.

CRIANDO FORMULRIOS A PARTIR DE UM TEMPLATE


Neste tpico, mostraremos os procedimentos necessrios criao de formulrios de excluso a partir do template criado no tpico anterior.

CRIANDO O FORMULRIO DE EXCLUSO DE SCIOS


Para criar o formulrio de excluso de scios a partir do template criado no tpico anterior, voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o template criado no tpico anterior, como mostrado na Figura 14.4.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

213

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 14.6: A caixa de dilogo New Items.

Repare que esta caixa de dilogo possui a guia Clube (referente ao projeto) e CLUBE (referente ao Template).

2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormExclusaoSocios e Excluso de Scios, respectivamente. 4. Altere a propriedade Datasource do DBGrid para Dados.DatasourceSocios. 5. Inclua a unit DB na clusula Uses da unit associada ao formulrio. 6. Defina da seguinte maneira o procedimento associado ao evento OnChange do componente EditPesquisa:
procedure TFormExclusaoSocios.EditPesquisaChange(Sender: TObject); begin Dados.SimpleDatasetSocios.Locate(NOME,VarArrayOf([EditPesquisa.Text]),[loPartialKey,LocaseInsensitive]); end;

Este cdigo faz com que seja efetuada uma pesquisa aproximada pelo nome do cliente. 7. Defina da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoExcluir:
procedure TFormExclusaoSocios.BotaoExcluirClick(Sender: TObject); begin if MessageDlg(Confirma a Excluso do Registro?,mtConfirmation,mbOkCancel,0) = mrOk then Dados.SimpleDataSetsocios.Delete; end;

Desta maneira, ser enviada uma mensagem de confirmao antes que o registro seja efetivamente excludo. 8. Defina da seguinte maneira o procedimento associado ao evento OnClose deste formulrio:
procedure TFormExclusaoSocios.FormShow(Sender: TObject); begin

214 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS


Dados.SimpleDatasetSocios.Open; end;

9. Defina da seguinte maneira o procedimento associado ao evento OnShow deste formulrio:


procedure TFormExclusaoSocios.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetSocios.ApplyUpdates(0); end;

10. Salve a unit associada a este formulrio com o nome UnitExlusaoSocios. 11. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 12. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Excluso do menu Scios, e compartilhe este procedimento com o evento OnClick do item Excluir do submenu Scios do menu pop-up do formulrio.
FormExclusaoSocios.ShowModal;

CRIANDO O FORMULRIO DE EXCLUSO DE ATIVIDADES


Para criar o formulrio de excluso de atividades a partir do template criado no tpico anterior, voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o template criado no tpico anterior. 2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormExclusaoAtividades e Excluso de Atividades, respectivamente. 4. Altere a propriedade Datasource do DBGrid para Dados.DatasourceAtividades. 5. Defina da seguinte maneira o procedimento associado ao evento OnShow do formulrio:
procedure TFormExclusaoAtividades.FormShow(Sender: TObject); begin Dados.SimpleDatasetAtividades.Open; EditPesquisa.Clear; end;

6. Inclua a unit DB na clusula Uses da unit associada ao formulrio. 7. Defina da seguinte maneira o procedimento associado ao evento OnChange do componente EditPesquisa:
procedure TFormExclusaoAtividades.EditPesquisaChange(Sender: TObject); begin Dados.SimpleDatasetAtividades.Locate(NOME,VarArrayOf([EditPesquisa.Text]),[loPartialKey,LocaseInsensitive]); end;

Este cdigo faz com que seja efetuada uma pesquisa aproximada pelo nome da atividade.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

215

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


8. Defina da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoExcluir:
procedure TFormExclusaoAtividades.BotaoExcluirClick(Sender: TObject); begin if MessageDlg(Confirma a Excluso do Registro?,mtConfirmation,mbOkCancel,0) = mrOk then Dados.SimpleDataSetAtividades.Delete; end;

Desta maneira, ser enviada uma mensagem de confirmao antes que o registro seja efetivamente excludo. 9. Salve a unit associada a este formulrio com o nome UnitExclusaoAtividades. 10. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 11. Defina da seguinte maneira o procedimento associado ao evento OnClose deste formulrio:
procedure TFormExclusaoAtividades.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetAtividades.ApplyUpdates(0); end;

12. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Excluso do menu Atividades, e compartilhe este procedimento com o evento OnClick do item Excluso do submenu Atividades do menu pop-up do formulrio.
FormExclusaoAtividades.ShowModal;

A LINGUAGEM SQL
SQL a abreviatura de Structured Query Language (Linguagem Estruturada de Consulta). Nos ltimos anos, a linguagem SQL se transformou numa linguagem padro para a consulta e acesso a registros de bancos de dados, sendo convencionalmente subdividida em: Uma linguagem de manipulao de dados (DML Data Manipulation Language). Uma linguagem de controle de dados (DCL Data Control Language). Uma linguagem de definio de dados (DDL Data Definition Language). Embora existam vrios dialetos para a linguagem SQL, uma tentativa de padronizao foi feita com a definio da linguagem SQL ANSI-92. Este livro no tem por objetivo apresentar ao leitor uma descrio completa da linguagem SQL, mas isto no nos impede de mostrar como os seus comandos podem ser executados a partir de um aplicativo desenvolvido com o Delphi 7. Para executar comandos SQL em um aplicativo desenvolvido com o Delphi 7, voc pode usar o componente SimpleDataset com o qual j est trabalhando, mas deve no entanto considerar as seguintes modificaes: Sua propriedade CommandTupe dever ser definida como ctQuery, e no como ctTable. Sua propriedade CommandText dever definir o comando SQL a ser executado.

216 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS

CRIANDO O FORMULRIO DE EXCLUSO DE MATRCULAS


Para criar o formulrio de excluso de matrculas a partir do template criado no tpico anterior, seguiremos um procedimento um pouco diferenciado. Como a tabela de matrculas s armazena os cdigos do scio e das atividades, e seria difcil pesquisar um scio ou uma atividade por um destes campos, faremos o acesso atravs de um comando SQL (uma linguagem padro para acesso a bancos de dados). Ser apresentado tambm o conceito de relacionamento entre tabelas na memria. Desta maneira, para criar o novo formulrio voc dever executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o template criado no tpico anterior. 2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormExclusaoMatriculas e Excluso de Matrculas, respectivamente. 4. Inclua um componente SimpleDataset no formulrio (e no no DataModule, pois este componente no ser compartilhado entre vrios formulrios) e atribua os seguintes valores s suas principais propriedades: Name: SimpleDatasetConsulta. Subpropriedade CommandType da Propriedade Dataset: ctQuery Subpropriedade Command da Propriedade Dataset: Defina esta propriedade como mostrado na caixa de dilogo Command Text Editor mostrada na Figura a seguir, exibida quando se selecionam os trs pontinhos direita do nome da propriedade. Subpropriedade Active da Propriedade Dataset: True.

Figura 14.7: A caixa de dilogo Command Text Editor.

Repare que esta caixa de dilogo define o seguinte comando SQL:


Select SOCIOS.CODIGOSOCIO, SOCIOS.NOME AS NOME, SOCIOS.SOBRENOME AS SOBRENOME, ATIVIDADES.CODIGOATIVIDADE, ATIVIDADES.NOME As ATIVIDADE FROM SOCIOS, ATIVIDADES, MATRICULAS WHERE SOCIOS.CODIGOSOCIO = MATRICULAS.SOCIO AND ATIVIDADES.CODIGOATIVIDADE =

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

217

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


MATRICULAS.ATIVIDADE ORDER BY SOCIOS.NOME, SOCIOS.SOBRENOME

Vamos analisar este cdigo:


Select SOCIOS.CODIGOSOCIO, SOCIOS.NOME AS NOME, SOCIOS.SOBRENOME AS SOBRENOME, ATIVIDADES.CODIGOATIVIDADE, ATIVIDADES.NOME As ATIVIDADE FROM SOCIOS, ATIVIDADES, MATRICULAS

Este trecho de cdigo seleciona (SELECT) os campos CodigoSocio da tabela Scios (SOCIOS.CODIGOSOCIO), Nome da tabela Scios (SOCIOS.NOME AS NOME), Sobrenome da tabela Scios (SOCIOS.SOBRENOME AS SOBRENOME), CodigoAtividade da tabela Atividades (ATIVIDADES.CODIGOATIVIDADE), e campo Nome da tabela Atividades (ATIVIDADES.NOME AS ATIVIDADE). Repare que, quando se manipulam vrias tabelas em um cdigo Select, o acesso a um campo de uma tabela segue a sintaxe Nome_Tabela.Nome_Campo. O conector As d um nome alternativo para cada um dos campos selecionados.
FROM SOCIOS, ATIVIDADES, MATRICULAS

Este trecho de cdigo informa os nomes das tabelas a partir das quais ser montada a consulta.
WHERE SOCIOS.CODIGOSOCIO = MATRICULAS.SOCIO AND ATIVIDADES.CODIGOATIVIDADE = MATRICULAS.ATIVIDADE

Este trecho de cdigo define as condies que devem ser obedecidas por estes campos. Os campos selecionados so descritos no trecho de cdigo anterior (SELECT) e desde que (WHERE) as seguintes condies sejam satisfeitas: O valor armazenado no campo CodigoSocio da tabela Scios deve ser igual ao campo SOCIO da tabela MATRICULAS.
E (AND)

O valor armazenado no campo CodigoAtividade da tabela Atividades deve ser igual ao campo ATIVIDADE da tabela MATRICULAS.
ORDER BY SOCIOS.NOME, SOCIOS.SOBRENOME

Este trecho de cdigo define que os registros retornados (satisfazendo as condies anteriores) devero ser ordenados pelos campos Nome e Sobrenome da tabela Scios. 5. Inclua um componente Datasource neste formulrio e atribua os seguintes valores para as suas principais propriedades: Name: DatasourceConsulta. Dataset: SimpleDatasetConsulta. 6. Inclua um segundo componente SimpleDataset neste formulrio e atribua os seguintes valores s suas principais propriedades: Name: SimpleDatasetExclusao. Subpropriedade CommandType da Propriedade Dataset: ctTable. Subpropriedade Command da Propriedade Dataset: Matriculas. Propriedade Mastersource: DatasourceConsulta.

218 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS


Propriedade Masterfield: Definida selecionando os trs pontinhos direita da propriedade para exibir a caixa de dilogo Field Link Editor, como mostrado nas figuras a seguir. Repare que voc deve selecionar os campos que estabelecero o relacionamento e o boto Add. Subpropriedade Active da Propriedade Dataset: True.

Figura 14.8: Selecionando o primeiro relacionamento.

Figura 14.9: Selecionando o segundo relacionamento.

7. Altere a propriedade Datasource do DBGrid para DatasourceConsulta. 8. Defina da seguinte maneira o procedimento associado ao evento OnShow do formulrio:
procedure TFormExclusaoMatriculas.FormShow(Sender: TObject); begin SimpleDataSetConsulta.Open; SimpleDataSetExclusao.Open; EditPesquisa.Clear; end;

9. Inclua a unit DB na clusula Uses da unit associada ao formulrio. 10. Defina da seguinte maneira o procedimento associado ao evento OnChange do componente EditPesquisa:
procedure TFormExclusaoMatriculas.EditPesquisaChange(Sender: TObject); begin Dados.SimpleDatasetConsulta.Locate(Nome,VarArrayOf([EditPesquisa.Text]),[loPartialKey,LocaseInsensitive]); end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

219

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Este cdigo faz com que seja efetuada uma pesquisa aproximada pelo nome do scio. 11. Defina da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoExcluir:
procedure TFormExclusaoMatriculas.BotaoExcluirClick(Sender: TObject); begin if MessageDlg(Confirma a Excluso do Registro?,mtConfirmation,mbOkCancel,0) = mrOk then begin SimpleDataSetExclusao.Delete; SimpleDataSetConsulta.Refresh; end; end;

Desta maneira, ser enviada uma mensagem de confirmao antes que o registro seja efetivamente excludo. 12. Salve a unit associada a este formulrio com o nome UnitExlusaoMatriculas. 13. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 14. Defina da seguinte maneira o procedimento associado ao evento OnClose deste formulrio:
procedure TFormExclusaoMatriculas.FormClose(Sender: TObject; var Action: TCloseAction); begin Dados.SimpleDatasetExclusao.ApplyUpdates(0); end;

15. D um duplo clique com o boto esquerdo do mouse sobre o DBGrid, para exibir a janela Columns Editor (editor de colunas) do DBGrid, como mostrado na figura a seguir.

Figura 14.10: O editor de colunas do Componente DBGrid.

16. Exiba o menu pop-up desta janela e selecione o item Add All Fields, para criar objetos que representam os campos exibidos nas colunas do DBGrid, como mostrado na Figura 14.11. Estes objetos permitem que se configure de forma independente cada uma das colunas do DBGrid. 17. Remova os objetos correspondentes aos campos CODIGOSOCIO e CODIGOATIVIDADE, selecionando-se e pressionando a tecla Del. Desta forma, o DBGrid s exibir as colunas correspondentes aos campos Lookup.

220 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 CRIANDO FORMULRIOS PARA EXCLUSO DE SCIOS, ATIVIDADES E MATRCULAS


18. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Excluso do menu Matrculas, e compartilhe este procedimento com o evento OnClick do item Excluso do submenu Matrculas do menu pop-up do formulrio.
FormExclusaoMatriculas.ShowModal;

Figura 14.11: O editor de colunas do componente DBGrid.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

221

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

222 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 CRIANDO FORMULRIOS PARA CONSULTA DE SCIOS, ATIVIDADES E MATRCULAS

Captulo

15

Criando Formulrios Para Consulta de Scios, Atividades e Matrculas

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

223

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo vamos criar formulrios destinados consulta dos dados dos scios, atividades e matrculas. Estes formulrios sero muito semelhantes queles criados para excluso, exceto pela inexistncia de um boto de excluso. Podemos ento cri-los a partir dos formulrios de consulta, excluindo o boto Excluir em cada um deles.

CRIAO DE FORMULRIOS PARA CONSULTA DE DADOS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Criao de formulrios e utilizao dos componentes bsicos de interface. Utilizao de componentes para acesso a bancos de dados e de visualizao.

METODOLOGIA
Apresentao e descrio dos conceitos relacionados criao de formulrios para consulta de dados.

TCNICA
Apresentao e descrio dos procedimenttos relacionados criao de formulrios para consulta de dados a partir de formulrios criados para excluso.

CRIANDO UM FORMULRIO PARA A CONSULTA DE DADOS DOS SCIOS


Este formulrio ser criado a partir do formulrio criado para excluso de scios, e para isso voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o Formulrio de excluso de scios j existente, como mostrado na figura a seguir.

Figura 15.1: A caixa de dilogo New Items.

224 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 CRIANDO FORMULRIOS PARA CONSULTA DE SCIOS, ATIVIDADES E MATRCULAS

Repare que neste caso estamos usando a guia Clube (referente ao projeto) e no a guia CLUBE (referente ao Template). Repare ainda a seleo da opo inherit, que indica que ser usado o mecanismo de herana de formulrios.

2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormConsultaSocios e Consulta de Scios, respectivamente. 4. Defina como False a Propriedade Visible do componente BotaoExcluir.

Repare que, como este formulrio foi criado a partir do formulrio FormExclusaoSocios usando o mecanismo de herana, no possvel excluir o componente BotaoExcluir, a menos que isso fosse feito no prprio formulrio ancestral (no o caso). A redefinio de valores de propriedade, no entanto, permitida. A existncia deste mecanismo verificada na seguinte linha de cdigo, extrada da unit deste formulrio:
type TFormConsultaSocios = class(TFormExclusaoSocios)

Repare que os diversos componentes esto todos definidos no formulrio ancestral. No caso do captulo anterior, em que foi criado um template independente, a opo Copy pode ser usada na caixa de dilogo New Items, e neste caso foram criadas cpias do formulrio criado como template, desvinculados de qualquer herana com o formulrio original. 5. Salve a unit associada a este formulrio com o nome UnitCONSULTASocios. 6. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 7. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Consulta do menu Scios, e compartilhe este procedimento com o evento OnClick do item Consulta do submenu Scios do menu pop-up do formulrio.
FormConsultaSocios.ShowModal;

CRIANDO UM FORMULRIO PARA A CONSULTA DE DADOS DAS ATIVIDADES


Este formulrio ser criado a partir do formulrio criado para excluso de atividades, e para isso voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o Formulrio de excluso de atividades j existente 2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormConsultaAtividades e Consulta de Atividades, respectivamente. 4. Defina como False a Propriedade Visible do componente BotaoExcluir. 5. Salve a unit associada a este formulrio com o nome UnitConsultaAtividades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

225

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


6. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 7. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Consulta do menu Atividades, e compartilhe este procedimento com o evento OnClick do item Consulta do submenu Atividades do menu pop-up do formulrio.
FormConsultaAtividades.ShowModal;

CRIANDO UM FORMULRIO PARA A CONSULTA DE DADOS DAS MATRCULAS


Este formulrio ser criado a partir do formulrio criado para excluso de Matrculas, e para isso voc deve executar os seguintes procedimentos: 1. Selecionar o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. Nesta caixa de dilogo, voc deve selecionar o Formulrio de excluso de Matrculas j existente 2. Selecione o boto OK para fechar esta caixa de dilogo e criar o novo formulrio. 3. Altere as propriedades Name e Caption do formulrio recm-criado para FormConsultaMatriculas e Consulta de Matrculas, respectivamente. 4. Defina como False a Propriedade Visible do componente BotaoExclui. 5. Salve a unit associada a este formulrio com o nome UnitConsultaMatriculas. 6. Inclua o nome da unit associada a este formulrio na clusula uses da unit associada ao formulrio FormPrincipal. 7. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Consulta do menu Matrculas, e compartilhe este procedimento com o evento OnClick do item Consulta do submenu Matrculas do menu pop-up do formulrio.
FormConsultaMatriculas.ShowModal;

226 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 CRIANDO ROTINAS DE BACKUP E RESTAURAO

Captulo
Criando Rotinas de Backup e Restaurao

16

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

227

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo vamos criar as rotinas de backup e restaurao de nossos arquivos de dados. Este procedimento muito importante, tendo em vista que no raro acontecerem situaes em que ocorrem perdas de dados devido a fatores indesejveis como corte no fornecimento de energia eltrica ou falha no sistema operacional, dentre outras causas possveis. Evidentemente os procedimentos so muito limitados, devendo-se usar tcnicas de compresso de arquivos em aplicaes mais sofisticadas.

CPIA DE ARQUIVOS
PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Delphi 7. Conhecimentos bsicos sobre a linguagem Object Pascal (j apresentados nos captulos anteriores). Criao de formulrios e utilizao dos componentes bsicos de interface.

METODOLOGIA
Apresentao e descrio dos comandos da linguagem pascal que permitem a realizao de cpias de arquivos.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de formulrios para cpia e restaurao de arquivos.

CONCEITOS FUNDAMENTAIS
Para efetuar cpias de arquivos, o Delphi 7 fornece acesso a uma funo chamada CopyFileTo, definida na unit IdGlobal, que permite que esta tarefa seja executada de maneira simples e rpida. Esta funo recebe como parmetros: Uma string que define o nome do arquivo a ser copiado (incluindo seu path). Uma string que define o nome do arquivo de destino para o qual a cpia ser feita (incluindo seu path). Esta funo multiplataforma, e retorna False se o arquivo de destino j existir. Logo, deve-se inicialmente testar se o referido arquivo j existe e, em caso positivo, apag-lo.

CRIANDO UM FORMULRIO DE BACKUP


Para criar um formulrio de Backup, voc dever executar os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7, para criar um novo formulrio. 2. Altere os valores das suas propriedades Name e Caption para FormBackup e Backup de Dados respectivamente. 3. Coloque um label no formulrio e defina sua propriedade Caption como Digite o Nome do Arquivo de Destino (incluindo seu path). 4. Inclua um componente Caixa de Texto (pgina Standard) no formulrio e defina os seguintes valores para as suas principais propriedades.

228 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 CRIANDO ROTINAS DE BACKUP E RESTAURAO

Name: Text

EditDestino (Deixe em Branco)

5. Inclua um componente Boto de Comando com figura no formulrio e defina os seguintes valores para as suas principais propriedades. Name: BotaoCopiar Caption: &Copiar Glyph: c:\Arquivos de programas\Arquivos comuns\Borland shared\Images\Buttons\ Floppy.bmp. Height: 50 Width: 100 6. Inclua um segundo componente Boto de Comando com figura no formulrio e defina os seguintes valores para as suas principais propriedades. Name: BotaoFechar Kind: bkClose Caption: &Fechar Height: 50 Width: 100 Seu formulrio dever ficar com o aspecto indicado na figura a seguir.

Figura 16.1: Aspecto final do formulrio de backup.

7. Inclua o nome da unit IdGlobal na clusula uses da unit associada a este formulrio. 8. Defina da seguinte maneira o procedimento associado ao evento Onclick do componente BotaoCopiar:
procedure TFormBackup.BotaoCopiarClick(Sender: TObject); var origem, destino: string; begin origem := ExtractFilePath(Application.Exename)+C:\DB\Clube.gdb;; destino := EditDestino.Text; if FileExists(destino) then DeleteFile(destino); if (CopyFileTo(origem,destino)) then ShowMessage(Backup Efetuado com Sucesso) else ShowMessage(Cpia No Efetuada); end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

229

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS


A funo ExtractFilePath retorna na forma de uma string o diretrio completo do arquivo cujo nome passado como parmetro, tambm na forma de uma string. Para obter o nome do arquivo executvel da aplicao, basta usar o mtodo ExeName do objeto Application (que representa a aplicao). Observe que inicialmente so declaradas duas variveis do tipo string, destinadas a armazenar os nomes dos arquivos de origem e de destino, a serem usadas na chamada da funo CopyFileTo. 9. Salve a unit associada a este arquivo de cdigo com o nome UnitBackup. 10. Inclua o nome desta unit na clusula uses da unit associada ao formulrio FormPrincipal (o formulrio principal da aplicao). 11. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Backup do menu Sistema, e compartilhe este procedimento com o evento OnClick do item Backup do submenu Sistema do menu pop-up do formulrio.
FormBackup.ShowModal;

Para criar um formulrio de Restaurao de dados, voc dever executar os seguintes procedimentos: 1. Selecione o item New/Form do menu File do Delphi 7, para criar um novo formulrio. 2. Altere os valores das suas propriedades Name e Caption para FormRestaura e Recuperao de Dados respectivamente. 3. Coloque um label no formulrio e defina sua propriedade Caption como Digite o Nome do Arquivo de Origem (incluindo seu path). 4. Inclua um componente Caixa de Texto (pgina Standard) no formulrio e defina os seguintes valores para as suas principais propriedades.

Name: Text

EditOrigem (Deixe em Branco)

5. Inclua um componente Boto de Comando com figura no formulrio e defina os seguintes valores para as suas principais propriedades. Name: BotaoCopiar Caption: &Copiar Glyph: c:\Arquivos de programas\Arquivos comuns\Borland shared\Images\Buttons\ Floppy.bmp. Height: 50 Width: 100 6. Inclua um segundo componente Boto de Comando com figura no formulrio e defina os seguintes valores para as suas principais propriedades. Name: BotaoFechar Kind: bkClose

230 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 CRIANDO ROTINAS DE BACKUP E RESTAURAO


Caption: &Fechar Height: 50 Width: 100 Seu formulrio dever ficar com o aspecto indicado na Figura 16.2.

Figura 16.2: Aspecto final do formulrio de Recuperao de Dados.

7. Inclua o nome da unit IdGlobal na clusula uses da unit associada a este formulrio. 8. Defina da seguinte maneira o procedimento associado ao evento Onclick do componente BotaoCopiar:
procedure TFormRestaura.BotaoCopiarClick(Sender: TObject); var origem, destino: string; begin origem := Editorigem.Text; destino := ExtractFilePath(Application.Exename)+C:\DB\Clube.gdb;; if FileExists(destino) then DeleteFile(destino); if (CopyFileTo(origem,destino)) then ShowMessage(Recuperao Efetuada com Sucesso) else ShowMessage(Cpia No Efetuada); end;

9. Salve a unit associada a este arquivo de cdigo com o nome UnitRestaura. 10. Inclua o nome desta unit na clusula uses da unit associada ao formulrio FormPrincipal (o formulrio principal da aplicao). 11. Inclua a seguinte linha de cdigo no procedimento associado ao evento OnClick do item Restaurar do menu Sistema, e compartilhe este procedimento com o evento OnClick do item Restaurar do submenu Sistema do menu pop-up do formulrio.
FormRestaura.ShowModal;

Evidentemente estamos supondo que o backup esteja sendo feito para um meio de armazenamento secundrio de grande capacidade, como um ZipDisk ou um SuperDisk. Uma opo alternativa seria a utilizao de componentes disponveis no mercado, que gerenciam a compactao de arquivos (no formato .zip) e possuem mtodos capazes de gerenciar cpia de arquivos para mltiplos disquetes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

231

BORLAND DELPHI 7 CURSO COMPLETO PARTE I: FUNDAMENTOS

232 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS

Parte
Know-How

II

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

233

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

234 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS

Captulo
Criao de Relatrios com o Rave Reports

17

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

235

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Neste captulo, sero apresentados os componentes que integram o pacote do Rave Reports (utilizado para a criao de relatrios em aplicaes desenvolvidas com o Borland Delphi 7), e os procedimentos necessrios criao de relatrios com esses componentes.

KNOW-HOW EM: CRIAO DE RELATRIOS COM O RAVE REPORTS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Borland Delphi 7. Conceitos bsicos sobre a utilizao de componentes de acesso a bancos de dados.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao de relatrios com o conjunto de componentes Rave Reports.

TCNICA
Apresentao dos procedimentos necessrios criao de relatrios com o conjunto de componentes Rave Reports.

INTRODUO
O Rave Reports , na realidade, um conjunto de componentes situados na pgina Rave da paleta de componentes, que permite a criao de relatrios de forma simples e rpida.

O COMPONENTE RVPROJECT
O componente RvProject (o primeiro componente da pgina Rave da paleta de componentes) de fundamental importncia na criao de relatrios com o Rave Reports, pois fornece acesso direto a um ambiente de desenvolvimento intrnseco criao de relatrios.

CRIANDO UM RELATRIO DE SCIOS


Para criar um relatrio com os dados dos scios, voc deve executar os seguintes procedimentos: 1. Crie um novo Datamodule, executando os procedimentos j descritos nos captulos anteriores, e altere sua propriedade Name para Relatrios (lembre-se que um Datamodule um repositrio de objetos no-visuais, e no serve apenas para armazenar componentes de acesso a dados). 2. Inclua um componente RvProject neste Datamodule, e altere o valor da sua propriedade Name para RvClube. 3. Inclua um componente RvDatasetConnection neste Datamodule, e altere o valor da sua propriedade Name para RvDatasetConnectionSocios. 4. Inclua a unit UnitDados na clusula uses da unit associada a este Datamodule. 5. Atribua o valor Dados.SimpleDatasetSocios propriedade Dataset do componente RvDatasetConnectionSocios. Seu Datamodule dever ficar com o aspecto mostrado na figura a seguir.

236 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS

Figura 17.1: Iniciando a criao de um relatrio.

6. D um duplo clique com o boto esquerdo do mouse sobre o componente RvClube. Ser exibido o ambiente de desenvolvimento do Rave Reports, mostrado na figura a seguir.

Figura 17.2: O ambiente de desenvolvimento do Rave Reports.

Repare que este ambiente apresenta sua prpria paleta de componentes, seu prprio Object Inspector, etc. 7. Selecione o item New Data Object do menu File do ambiente do Rave Reports, para exibir a caixa de dilogo Data Connection, mostrada na Figura 17.3. 8. Nesta caixa de dilogo, selecione o item Direct Data View e o boto Next. Sero exibidas as conexes de dados disponveis (no momennto s h uma), como mostra a Figura 17.4. 9. Selecione a nica conexo disponvel e o boto Finish. Selecione e expanda a opo Data View Dictionary, no lado direito do ambiente do Rave Reports. Selecione o item Dataview1 e altere para DataviewSocios a sua propriedade Name. Repare que foram inseridos objetos correspondentes aos diversos campos da tabela Scios, como mostrado na figura a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

237

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 17.3: A caixa de dilogo Data Connections.

Figura 17.4: Exibindo as conexes de dados disponveis na caixa de dilogo Data Connections.

Figura 17.5: Exibindo os objetos correspondentes opo Data View Dictionary.

238 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS


10. Selecione e expanda a opo Repot Library, no lado direito do ambiente do Rave Reports. Selecione o item Report1 e altere para RelatSocios a sua propriedade Name. 11. Inclua um componente Region (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea da pgina do relatrio (rea central do ambiente de desenvolvimento do Rave Reports) e faa com que este componente ocupe toda a rea disponvel, como mostrado na figura a seguir. Este componente permite que sejam adicionadas bandas (faixas) ao relatrio.

Figura 17.6: Incluindo um componente Region.

12. Inclua um componente Band (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea superior do componente Region1. 13. Selecione os trs pontinhos direita da propriedade BandStyle para exibir a caixa de dilogo Band Style Editor, mostrada na Figura 17.7. 14. Marque a opo Body Header e o boto Ok para fechar esta caixa de dilogo. 15. Altere para 0,990 o valor da propriedade Height. 16. Inclua nesta banda um componente Text (pgina Standard da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua os seguintes valores s suas principais propriedades: Name: Ttulo Text: Relatrio de Clientes Font: Arial, Bold Italic, sublinhada, tamanho 20. Top: 0,080

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

239

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 17.7: A caixa de dilogo Band Style Editor.

17. Centralize horizontalmente este componente na banda, selecionando o item Center Horizontally na pgina Alignment da paleta de componentes do ambiente de desenvolvimento do Rave Reports. 18. Coloque mais trs componentes Text e defina a propriedade Text de cada um deles como Cdigo, Nome e Sobrenome, respectivamente. Defina para estes componentes a mesma fonte e cuide de seu alinhamento. Seu relatrio dever ficar com o aspecto mostrado na figura a seguir.

Figura 17.8: Incluso de componentes do tipo Text.

19. Inclua um componente DataBand (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) abaixo da banda existente. Esta banda ser a banda na qual sero exibidos os dados dos registros das tabelas.

240 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS


20. Atribua o valor DataviewSocios propriedade Dataview desta banda. 21. Nesta banda, coloque trs componentes DataText (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua o valor DataviewSocios propriedade Dataview de cada um destes componentes. 22. Configure a propriedade Datafield de cada um destes componentes como CODIGOSOCIO, NOME e SOBRENOME, respectivamente. 23. Selecione o item Save do menu File do ambiente de desenvolvimento do Rave Reports e salve o arquivo de projeto de relatrio com o nome RelatClube, no mesmo diretrio do seu projeto. 24. Para Pr-visualizar o relatrio, selecione Execute Report do menu File do ambiente de desenvolvimento do Rave Reports. Ser exibida a caixa de dilogo Output Options mostrada na figura a seguir.

Figura 17.9: A caixa de dilogo Output Options.

25. Nesta caixa de dilogo, selecione a opo Preview e o boto Ok para Pr-visualizar o relatrio, como mostrado na Figura 17.10. 26. Salve a unit associada ao Datamodule Relatrios com o nome UnitRelatorios, e inclua o nome desta unit na clusula uses da unit do formulrio principal da aplicao. 27. No Delphi 7, Atribua o valor RelatClube.rav propriedade ProjectFile do componente RvClube. 28. Defina da seguinte maneira o procedimento associado ao evento OnClick do item Scios do menu Relatrio, a ser compartilhado pelo item Scios do submenu Relatrios do menu pop-up.
procedure TFormPrincipal.RelatorioSociosClick(Sender: TObject); begin Relatorios.RvClube.SelectReport(RelatSocios,False); Relatorios.RvClube.Execute; end;

A primeira linha de cdigo seleciona o relatrio a ser exibido (podemos ter vrios relatrios relacionados a um nico componente RvProject) e a segunda manda executar o relatrio selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

241

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 17.10: Pr-visualizando o Relatrio.

CRIANDO UM RELATRIO DE ATIVIDADES


Para criar um relatrio com os dados das atividades, voc deve executar os seguintes procedimentos: 1. Inclua no Datamodule Relatrios mais um componente RvDatasetConnection, e altere o valor da sua propriedade Name para RvDatasetConnectionSocios. 2. Atribua o valor Dados.SimpleDatasetAtividades propriedade Dataset do componente RvDatasetConnectionAtividades. 3. D um duplo clique com o boto esquerdo do mouse sobre o componente RvClube. Ser exibido o ambiente de desenvolvimento do Rave Reports. 4. Selecione o item New Report do menu File do ambiente do Rave Reports, para criar um novo relatrio. 5. Selecione e expanda a opo Repot Library, no lado direito do ambiente do Rave Reports. Selecione o item Report2 e altere para RelatAtividades a sua propriedade Name. 6. Selecione o item New Data Object do menu File do ambiente do Rave Reports, para exibir a caixa de dilogo Data Connection. 7. Nesta caixa de dilogo, selecione o item Direct Data View e o boto Next. Sero exibidas as conexes de dados disponveis. 8. Selecione a conexo correspondente tabela de atividades.

242 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS


9. Inclua um componente Region (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea da pgina do relatrio (rea central do ambiente de desenvolvimento do Rave Reports) e faa com que este componente ocupe toda a rea disponvel. 10. Inclua um componente Band (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea superior do componente Region1. 11. Selecione os trs pontinhos direita da propriedade BandStyle para exibir a caixa de dilogo Band Style Editor. 12. Marque a opo Body Header e o boto Ok para fechar esta caixa de dilogo. 13. Altere para 0,990 o valor da propriedade Height. 14. Inclua nesta banda um componente Text (pgina Standard da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua os seguintes valores s suas principais propriedades: Name: Ttulo Text: Relatrio de Atividades Font: Arial, Bold Italic, sublinhada, tamanho 20. Top: 0,080 15. Centralize horizontalmente este componente na banda, selecionando o item Center Horizontally na pgina Alignment da paleta de componentes do ambiente de desenvolvimento do Rave Reports. 16. Coloque mais trs componentes Text e defina a propriedade Text de cada um deles como Cdigo, Nome e Valor, respectivamente. Defina para estes componentes a mesma fonte e cuide de seu alinhamento. 17. Inclua um componente DataBand (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) abaixo da banda existente. Esta banda ser a banda na qual sero exibidos os dados dos registros das tabelas. 18. Atribua o valor DataviewAtividades propriedade Dataview desta banda. 19. Nesta banda, coloque trs componentes DataText (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua o valor DataviewAtividades propriedade Dataview de cada um destes componentes. 20. Configure a propriedade Datafield de cada um destes componentes como CODIGOATIVIDADE, NOME e VALOR, respectivamente. 21. Defina da seguinte maneira o procedimento associado ao evento OnClick do item Atividades do menu Relatrio, a ser compartilhado pelo item Atividades do submenu Relatrios do menu pop-up.
procedure TFormPrincipal.RelatorioAtividadesClick(Sender: TObject); begin Relatorios.RvClube.SelectReport(RelatAtividades,False); Relatorios.RvClube.Execute; end;

22. Selecione o item Save do menu File do ambiente de desenvolvimento do Rave Reports para salvar as alteraes no projeto de relatrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

243

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

CRIANDO UM RELATRIO DE MATRCULAS


Para criar um relatrio com os dados das matrculas, voc deve executar os seguintes procedimentos: 1. Inclua no Datamodule Relatrios mais um componente RvDatasetConnection, e altere o valor da sua propriedade Name para RvDatasetConnectionMatriculas. 2. Inclua a unit UnitExclusaoMatriculas na clusula uses da unit associada ao Datamodule Relatrios. 3. Atribua o valor FormExclusaoMatriculas.SimpleDatasetConsulta propriedade Dataset do componente RvDatasetConnectionMatriculas. 4. D um duplo clique com o boto esquerdo do mouse sobre o componente RvClube. Ser exibido o ambiente de desenvolvimento do Rave Reports. 5. Selecione o item New Report do menu File do ambiente do Rave Reports, para criar um novo relatrio. 6. Selecione e expanda a opo Report Library, no lado direito do ambiente do Rave Reports. Selecione o item Report3 e altere para RelatMatriculas a sua propriedade Name. 7. Selecione o item New Data Object do menu File do ambiente do Rave Reports, para exibir a caixa de dilogo Data Connection. 8. Nesta caixa de dilogo, selecione o item Direct Data View e o boto Next. Sero exibidas as conexes de dados disponveis. 9. Selecione a conexo correspondente tabela de Matrculas. 10. Inclua um componente Region (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea da pgina do relatrio (rea central do ambiente de desenvolvimento do Rave Reports) e faa com que este componente ocupe toda a rea disponvel. 11. Inclua um componente Band (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) na rea superior do componente Region1. 12. Selecione os trs pontinhos direita da propriedade BandStyle para exibir a caixa de dilogo Band Style Editor. 13. Marque a opo Body Header e o boto Ok para fechar esta caixa de dilogo. 14. Altere para 0,990 o valor da propriedade Height. 15. Inclua nesta banda um componente Text (pgina Standard da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua os seguintes valores s suas principais propriedades: Name: Ttulo Text: Relatrio de Matrculas Font: Arial, Bold Italic, sublinhada, tamanho 20. Top: 0,080 16. Centralize horizontalmente este componente na banda, selecionando o item Center Horizontally na pgina Alignment da paleta de componentes do ambiente de desenvolvimento do Rave Reports.

244 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 CRIAO DE RELATRIOS COM O RAVE REPORTS


17. Coloque mais trs componentes Text e defina a propriedade Text de cada um deles como Nome, Sobrenome e Atividade, respectivamente. Defina para estes componentes a mesma fonte e cuide de seu alinhamento. 18. Inclua um componente DataBand (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) abaixo da banda existente. Esta banda ser a banda na qual sero exibidos os dados dos registros das tabelas. 19. Atribua o valor DataviewMatriculas propriedade Dataview desta banda. 20. Nesta banda, coloque trs componentes DataText (pgina Report da paleta de componentes do ambiente de desenvolvimento do Rave Reports) e atribua o valor DataviewMatriculas propriedade Dataview de cada um destes componentes. 21. Configure a propriedade Datafield de cada um destes componentes como NOME, SOBRENOME e ATIVIDADE, respectivamente. 22. Defina da seguinte maneira o procedimento associado ao evento OnClick do item Matrculas do menu Relatrio, a ser compartilhado pelo item Matrculas do submenu Relatrios do menu pop-up.
procedure TFormPrincipal.RelatorioMatriculasClick(Sender: TObject); begin Relatorios.RvClube.SelectReport(RelatMatrculas,False); Relatorios.RvClube.Execute; end;

23. Selecione o item Save do menu File do ambiente de desenvolvimento do Rave Reports para salvar as alteraes no projeto de relatrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

245

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

246 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

Captulo

18

Incorporando o Recurso de Help On-Line Nossa Aplicao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

247

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Neste captulo sero apresentados os procedimentos necessrios incorporao do recurso de Help On-Line ao seu aplicativo.

KNOW-HOW EM: CRIAO DE ARQUIVOS DE HELP


PR-REQUISITOS
Noes bsicas da utilizao do ambiente de desenvolvimento do Borland Delphi 7. Conceitos bsicos sobre a utilizao de utilitrios para o ambiente Windows.

METODOLOGIA
Apresentao e descrio dos principais conceitos relacionados criao de Arquivos de Help com o Word e o Microsoft Help Compiler.

TCNICA
Apresentao e descrio dos procedimentos necessrios criao de Arquivos de Help com o Word e o Microsoft Help Compiler.

CRIANDO UM ARQUIVO DE HELP


Para criar um arquivo de Help voc deve usar um editor capaz de manipular arquivos no formato RTF, como por exemplo o Word for Windows. Neste captulo vamos usar o Word XP para criar o nosso arquivo de Help.

DEFININDO UMA PGINA DE NDICE


A maioria dos arquivos de Help On-Line apresenta uma pgina de ndice, onde so mostrados os ttulos das principais sees ou tpicos do arquivo. No nosso caso, apenas para exemplificar, vamos criar uma pgina com o ttulo ndice do Programa de Cadastro dos Scios do Clube e os seguintes tpicos: Cadastrando um Novo Scio Alterando os Dados de um Scio Excluindo um Scio Consultando um Scio Cadastrando uma Nova Atividade Alterando os Dados de uma Atividade Excluindo uma Atividade Consultando uma Atividade Efetuando uma Matrcula Removendo uma Matrcula Consultando Matrculas Relatrios A figura a seguir mostra o aspecto da pgina criada, usando o Microsoft Word 2000.

248 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

Figura 18.1: Criando a pgina de tpicos.

CRIANDO UM ARQUIVO RTF


Para criar um arquivo RTF, voc deve executar os seguintes procedimentos: 1. Criar um documento no Word, como a pgina de tpicos mostrada anteriormente. 2. Selecione o item Salvar Como, do menu Arquivo. Ser exibida a caixa de dilogo Salvar como, mostrada na figura a seguir.

Figura 18.2: Salvando um arquivo no formato rtf.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

249

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


3. Nesta caixa de dilogo digite o nome do arquivo e selecione a opo Rich Text Format (rtf) na caixa combo Salvar como tipo:.

CRIANDO UMA PGINA PARA CADA TPICO


Cada tpico deve ser digitado em uma pgina distinta, como mostra a figura a seguir.

Figura 18.3: Definindo uma pgina para cada tpico.

CRIANDO STRINGS DE CONTEXTO


Cada tpico de um arquivo de Help deve ser identificado por uma string de contexto. o valor definido para esta string de contexto que ser usado para que este tpico seja acessado a partir de outro. Vamos definir Cad_Socios como a string de contexto para o tpico Cadastrando um Novo Scio. Para criar uma string de contexto, voc deve executar os seguintes procedimentos: 1. Posicione o cursor no incio da pgina que representa o tpico cuja string de contexto est sendo definida. 2. Selecione o item Notas... do submenu Referncia do menu Inserir do Word XP. Ser exibida a caixa de dilogo Nota de Rodap e Nota de Fim, mostrada na prxima figura.

250 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

Figura 18.4: A caixa de dilogo Nota de rodap e nota de fim.

3. Nesta caixa de dilogo, selecione a opo Notas de rodap. 4. Digite o caractere # na caixa de texto direita da opo Personalizada. 5. Selecione o boto OK, para fechar a caixa de dilogo. 6. Digite a string de contexto na nota de rodap, logo aps o sinal #, criado no passo anterior, como mostra a figura a seguir.

Figura 18.5: Definindo uma string de contexto para um tpico.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

251

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Uma string de contexto no pode conter espaos em branco e deve ter, no mximo, 255 caracteres.

CRIANDO UMA PALAVRA-CHAVE PARA UM TPICO


Cada tpico em um arquivo de Help deve possuir uma palavra-chave (que pode ser um texto com espaos em branco), que a palavra pela qual o tpico poder ser pesquisado pelo Help do Windows. O processo de criao de uma palavra-chave idntico ao de criao de uma string de contexto, exceto que o caractere a ser digitado na caixa de texto direita da opo Personalizada, na caixa de dilogo Nota de rodap e nota de fim, ser um K ao invs de um #. Normalmente se escolhe um texto significativo, que neste caso pode ser Cadastro de Scios. Se voc executar os passos descritos no tpico anterior para a criao desta palavra-chave, a sua pgina de tpico dever ficar com o aspecto mostrado na figura a seguir.

Figura 18.6: Definindo uma palavra-chave para um tpico.

CRIANDO UM TTULO PARA UM TPICO


Cada tpico de um arquivo de Help deve possuir um ttulo pelo qual o tpico ser referenciado pelo Help do Windows, quando selecionada a sua palavra-chave aps uma pesquisa pelo Help. O processo de criao de um ttulo idntico ao de criao de uma string de contexto, exceto que o caractere a ser digitado na caixa de texto direita da opo Personalizada na caixa de dilogo Nota de rodap e nota

252 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO


de fim ser um $ ao invs de um #. Normalmente se escolhe um texto significativo, que neste caso pode ser Cadastrando Novos Scios. Se voc executar os passos descritos nos tpicos anteriores para a criao deste ttulo, a sua pgina de tpico dever ficar com o aspecto mostrado na prxima figura.

Figura 18.7: Definindo um ttulo para um tpico.

ASSOCIANDO UM NMERO DE PGINA A UM TPICO


Cada tpico de um arquivo de Help deve possuir um nmero de pgina, que estabelece a sua localizao numa seqncia de pginas a serem percorridas pelo usurio com os botes << e >> no Help do Windows. O processo de criao de um nmero de pgina idntico ao de criao de uma string de contexto, exceto que o caractere a ser digitado na caixa de texto direita da opo Personalizada na caixa de dilogo Nota de rodap e nota de fim ser um + ao invs de um #. O nmero de pgina pode ser precedido por uma seqncia de caracteres que define um grupo de pginas, desde que terminado por dois-pontos (:). Se voc executar os passos descritos nos tpicos anteriores para a criao do nmero de pgina Topicos:001, a sua pgina de tpico dever ficar com o aspecto mostrado na Figura 18.8. Crie voc mesmo as demais pginas de tpicos, executando os procedimentos descritos anteriormente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

253

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 18.8: Definindo um ttulo para um tpico.

ESTABELECENDO A CONEXO ENTRE TPICOS


Se voc j utilizou o arquivo de Help das principais aplicaes desenvolvidas para o ambiente Windows, j deve ter percebido que algumas palavras so exibidas sublinhadas e na cor verde. Quando voc seleciona estas palavras com o mouse, ocorre um salto para um outro tpico de um arquivo de Help. Para implementar o salto para a pgina de tpico Cadastrando um Novo Scio. quando o usurio selecionar este nome na pgina de ndice, basta executar os seguintes procedimentos: 1. Selecione o texto Cadastrando um Novo Scio na pgina de ndice. 2. Aplique o formato de duplo sublinhado ao texto selecionado no passo anterior. 3. Imediatamente aps o texto selecionado e formatado no passo anterior, digite a string de contexto do tpico para onde ocorrer o salto, selecione-a e aplique o formato de texto escondido. Sua pgina de ndices dever ficar com o aspecto mostrado na prxima figura. Crie voc mesmo as conexes para os demais tpicos, executando os passos descritos anteriormente. Pronto! Est estabelecida a conexo entre tpicos do Help! Caso voc no esteja enxergando o texto oculto como mostra a Figura 18.9, marque a opo Texto Oculto na guia Exibir da caixa de dilogo Opes do Word XP, exibida quando se seleciona o item Opes, do menu Ferramentas (Figura 18.10).

254 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

Figura 18.9: Definindo uma conexo para um tpico.

Figura 18.10: A pgina Exibir da caixa de dilogo Opes do Word XP.

Crie as demais pginas de tpicos e defina as strings de auxlio, palavras-chave, ttulo e numerao como indicado. Defina a numerao da pgina de ndice como Tpico:001.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

255

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

CRIANDO UM ARQUIVO DE PROJETO DE HELP


Alm do arquivo com a extenso rtf, voc precisa criar um arquivo de projeto (Help Project File), que armazenar as informaes a serem usadas pelo compilador de arquivos de Help. Este arquivo deve ter a extenso HPJ (no ser criado no Word) e o seu nome ser o nome do arquivo de Help, tendo este ltimo a extenso EXE. Um arquivo de projeto de Help composto de vrias sees, descritas a seguir:
A seo OPTIONS possui a seguinte sintaxe: [OPTIONS] CONTENTS = string_de_contexto TITLE = title COMPRESS = nvel_de_compresso ERRORLOG = Nome_do_arquivo_de_descrio_de_erros

A primeira linha define a string de contexto do tpico principal do arquivo de Help (na realidade, o Help On-Line de uma aplicao pode ser composto por vrios arquivos). Se esta linha for omitida, o primeiro tpico do primeiro arquivo de ajuda ser assumido como tpico principal. A segunda linha define o texto exibido na barra de ttulos do arquivo de Help. A terceira linha define o tipo de compresso do arquivo. O nvel de compresso pode assumir um dos valores definidos na tabela a seguir:

Valor FALSE MEDIUM HIGH 0 1 NO TRUE YES

Velocidade de Compilao Rpida Mdia Lenta Rpida Lenta Rpida Lenta Lenta

Tamanho do arquivo Grande (sem compresso) Mdio (compresso mdia) Pequeno (compresso alta) Grande (sem compresso) Pequeno (compresso alta) Grande (sem compresso) Pequeno (compresso alta) Pequeno (compresso alta)

Se esta linha for omitida, no haver compresso. A quarta linha define o arquivo no qual sero gravadas as mensagens de erros de compilao. Se esta linha for omitida, as mensagens de erro sero exibidas na tela mas no sero enviadas para nenhum arquivo. A seo CONFIG possui a seguinte sintaxe:
[CONFIG] BrowseButtons()

Esta linha, se includa, faz com que os botes << e >> sejam exibidos, permitindo ao usurio percorrer uma seqncia de pginas do arquivo de Help.

256 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO


A seo FILES possui a seguinte sintaxe:
[FILES] arquivo_1 com extenso rtf. .............. arquivo_n com extenso rtf.

Nesta seo so listados os arquivos que vo compor o arquivo de Help.

Voc pode criar este arquivo em um editor de texto ou usando o Microsoft Help Workshop, como mostrado no prximo tpico.

CRIANDO E COMPILANDO O ARQUIVO DE PROJETO DE HELP COM O MICROSOFT HELP WORKSHOP


Para compilar o arquivo de Help com o Microsoft Help Workshop, voc deve executar os seguintes procedimentos: 1. Execute o programa HCW.EXE, situado no subdiretrio c:\Arquivos de Programas\Borland\\ Delphi 7\Help\Tools. Ser exibida a seguinte tela de abertura:

Figura 18.11: A tela de abertura do Microsoft Help Workshop.

2. Selecione o item New do menu File. Ser exibida a caixa de dilogo New (Figura 18.12). 3. Selecione a opo Help Project. 4. Selecione o boto OK, para fechar a caixa de dilogo. Ser exibida a caixa de dilogo Project File Name (Figura 18.13).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

257

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 18.12: A caixa de dilogo New.

Figura 18.13: A Caixa de dilogo Project File Name.

5. Digite o nome do arquivo de projeto. 6. Selecione o boto Salvar, para fechar a caixa de dilogo. Ser criado o esqueleto do arquivo de projeto, como mostra a Figura 18.14.

Figura 18.14: Criando o arquivo de projeto.

7. Selecione o boto Files, para exibir a caixa de dilogo Topic Files (Figura 18.15).

258 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

Figura 18.15: A caixa de dilogo Topic Files.

8. Selecione o boto Add, para exibir a caixa de dilogo Abrir (Figura 18.16).

Figura 18.16: A caixa de dilogo Abrir.

9. Selecione o arquivo desejado. 10. Clique em Open para fechar a caixa de dilogo Abrir. 11. Clique em OK para fechar a caixa de dilogo Topic Files. Seu arquivo ser includo no projeto, como mostra a figura a seguir. 12. Selecione o boto Save and Compile, para salvar e compilar o arquivo de projeto de Help. Pronto! Voc acaba de criar o arquivo Clube.hlp (o arquivo de help do seu aplicativo).

Voc pode configurar as diversas sees do arquivo de projeto de Help selecionando o boto correspondente na janela principal do Microsoft Help Workshop.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

259

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 18.17: Adio do arquivo Clube.rtf no arquivo de projeto.

ASSOCIANDO O ARQUIVO DE HELP SUA APLICAO


Para criar um Help sensvel ao contexto, execute os seguintes procedimentos a partir do ambiente do Delphi 7: 1. Abra o seu projeto de aplicao. 2. Selecione o item Options do menu Project. Ser exibida a caixa de dilogo Project Options. 3. Selecione a pgina Application na caixa de dilogo Project Options. 4. Digite o path e o nome do arquivo de Help na caixa de texto Help file, como mostra a Figura 18.18.

Figura 18.18: A caixa de dilogo Project Options.

5. Selecione o boto OK para fechar a caixa de dilogo Project Options.

260 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 INCORPORANDO O RECURSO DE HELP ON-LINE NOSSA APLICAO

ASSOCIANDO UM COMPONENTE A UM TPICO DO ARQUIVO DE HELP


Cada componente do Borland Delphi 7 possui uma propriedade chamada HelpContext, qual deve ser atribudo um valor inteiro. Para associar um tpico a um componente, deve-se atribuir um valor inteiro (001, por exemplo) e criar uma correspondncia entre a string de contexto e este nmero na seo [MAP] do arquivo de projeto (esta seo ainda no havia sido mencionada).
Exemplo: [MAP] Cad_Socios

002

Para associar um nmero a uma string de contexto, voc deve executar os seguintes procedimentos: 1. Abra o arquivo de projeto, selecionando o item Open no menu File do Microsoft Help Workshop. 2. Selecione o boto Map. Ser exibida a caixa de dilogo Map. Selecione o boto Add para exibir a caixa de dilogo Add Map Entry (Figura 18.19).

Figura 18.19: A caixa de dilogo Add Map Entry.

3. Digite os valores adequados nas caixas de texto Topic ID e Mapped numeric value. 4. Selecione o boto OK para fechar a caixa de dilogo. Ser exibida a caixa de dilogo Map, mostrada na figura a seguir.

Figura 18.20: A caixa de dilogo Map.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

261

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


5. Selecione o boto Save and Compile, para salvar e recompilar o arquivo de projeto de Help. 6. Atribua o valor 002 propriedade HelpContext do componente desejado.

EXIBINDO O ARQUIVO DE HELP EM RESPOSTA A UM ITEM DE MENU


Para que o arquivo de Help seja exibido quando o usurio selecionar o item Ajuda, do menu Help, ou pressionar a tecla de funo F1, basta executar os seguintes procedimentos: 1. Incluir a seguinte linha de cdigo no procedimento associado ao evento OnClick do item de menu:
WinHelp(FormPrincipal.handle,C:\loja\loja.hlp,HELP_CONTENTS,0);

2. Atribuir o valor F1 propriedade ShortCut do item de menu.

A funo WinHelp uma funo da API do Windows que requer os seguintes parmetros: O handle da janela. Uma string com o path completo e o nome do arquivo de Help. O tipo de Help. Um inteiro (geralmente pode ser usado o valor 0).

Assim, quando o usurio selecionar o item Ajuda, do menu Help, ou pressionar a tecla de funo F1, ser exibida a tela do arquivo de Help associado aplicao.

262 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

Captulo
Programao Orientada a Objetos em Delphi 7

19

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

263

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Nos ltimos anos, as tcnicas de programao orientada a objetos vm ocupando lugar de destaque no cenrio de desenvolvimento de aplicaes, principalmente aps o surgimento de novas linguagens que passaram a incorporar esse recurso, como o C++ e o Object Pascal (a linguagem de programao utilizada pelo Delphi 7). Inicialmente, importante salientar que as tcnicas de programao orientada a objetos no constituem apenas um novo estilo de codificao, mas uma nova maneira de se abordar um problema a ser resolvido com o uso do computador. As linguagens de programao procedurais, predominantes anteriormente, tratavam os dados de um problema e os procedimentos que manipulavam esses dados como entidades distintas. Geralmente os dados eram passados como parmetros a estes procedimentos (a menos que fossem definidos como variveis globais). Era ntida, portanto, a separao entre dados e funes como entidades distintas. As linguagens de programao orientadas a objetos, por outro lado, tm como caracterstica principal a capacidade de reunir os dados e as funes que operam sobre estes dados em uma nova e nica entidade denominada classe. Desta maneira, as funes e os procedimentos (denominados mtodos no linguajar da Programao Orientada a Objetos) definidos internamente classe passam a ter a capacidade de acessar diretamente estes dados, que no precisam mais ser passados como parmetros. Esta abordagem representa uma viso muito mais prxima da realidade, uma vez que, no nosso cotidiano, lidamos o tempo todo com objetos que renem caractersticas (as propriedades que os definem) e funcionalidades (caracterizadas pelos seus mtodos) em uma nica entidade. Este captulo trata dos princpios da filosofia da programao orientada a objetos, comparando-os aos da programao estruturada, tradicionalmente utilizada no desenvolvimento de programas por meio do Pascal Procedural. Inicialmente abordamos a programao estruturada em Object Pascal, para posteriormente apresentar ao leitor as caractersticas da programao orientada a objetos, de forma a tornar mais claras as diferenas entre as duas abordagens evidente que no pretendemos esgotar este assunto, pois existem livros inteiramente dedicados anlise e programao orientada a objetos, mas pretende-se dar ao leitor os conhecimentos necessrios ao desenvolvimento de sistemas em Object Pascal (a linguagem de programao orientada a objetos do Delphi).

KNOW-HOW EM: PROGRAMAO PROCEDURAL EM LINGUAGEM OBJECT PASCAL


PR-REQUISITOS

Experincia em programao estruturada com verses anteriores da linguagem Pascal.


METODOLOGIA

Apresentao do problema: Criao de um programa que utilize o Pascal procedural utilizando-se o ambiente de desenvolvimento integrado
do Delphi 7.

264 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


TCNICA

Utilizao do ambiente de desenvolvimento integrado do Delphi 7 para criar aplicaes tipo Console.

APRESENTAO DO PROBLEMA
Este tpico se destina a apresentar os procedimentos necessrios ao desenvolvimento de aplicaes tipo console com o Delphi 7, e sua incluso decorre da necessidade de apresentarmos, nos tpicos que se seguem, os fundamentos da programao orientada a objetos sem a necessidade de nos referirmos aos elementos de criao da interface grfica de uma aplicao. Alm disso, gostaria de iniciar este captulo relatando um fato bastante interessante, mas que pode parecer um tanto estranho para os analistas, programadores e demais profissionais de informtica. Nos ltimos anos, minha experincia acadmica e profissional tem demonstrado que, apesar de toda a evoluo dos sistemas operacionais com interface grfica (como o Windows 95/98/Me/2000/NT/XP, por exemplo), os currculos escolares de muitas faculdades e universidades brasileiras tm evitado a incluso de disciplinas que abordem exclusivamente a utilizao de ambientes e linguagens visuais de programao, como o Delphi, o C++ Builder, o Visual Basic, etc. Esse fato se deve, entre outras causas, aos seguintes fatores:

Muitos professores ainda no aceitaram ou assimilaram os novos conceitos que envolvem as


tcnicas de programao orientada a objetos e a eventos.

As linguagens visuais de programao, ao simplificarem demasiadamente os procedimentos


necessrios criao da interface com o usurio, muitas vezes fazem com que o aluno diminua o seu interesse pelas importantssimas tcnicas de codificao (lgica, algoritmos, anlise, etc.), colocando-as em segundo plano. importante salientar, entretanto, que as linguagens visuais de programao foram desenvolvidas com o objetivo de minimizar o tempo gasto no desenvolvimento dessa interface, justamente para que o analista ou programador dedique a maior parte do seu tempo s tarefas de codificao e implementao relacionadas soluo de um determinado problema (que o objetivo de qualquer programa automatizar a soluo de um dado problema). H pouco tempo, antes do surgimento destas linguagens visuais, o desenvolvimento de um programa extremamente simples para o ambiente Windows formado por uma nica janela requeria cerca de 80 linhas de cdigo-fonte escrito em linguagem C. A criao da interface, ento, exigia um enorme esforo de programao. Conseqentemente, as linguagens de programao procedurais (como o C e o Pascal) tm predominado nos currculos universitrios (principalmente nos primeiros anos do curso). importante lembrar, no entanto, que a linguagem Object Pascal , na realidade, uma evoluo da linguagem Pascal e que o ambiente de desenvolvimento do Delphi 7 permite a codificao e a compilao de programas desenvolvidos utilizando-se o Pascal como linguagem de programao no estilo procedural. O objetivo deste tpico ser, portanto, mostrar como codificar e compilar programas escritos em linguagem Pascal, usando o ambiente de desenvolvimento do Delphi 7. Nos tpicos subseqentes, ao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

265

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


abordarmos a filosofia da programao orientada a objetos, as diferenas entre estas duas abordagens ficaro muito mais claras.

UTILIZANDO O AMBIENTE DO DELPHI 7 PARA O PASCAL PROCEDURAL


Neste tpico sero apresentados os procedimentos necessrios utilizao do ambiente de desenvolvimento do Delphi 7 para a criao de aplicaes que utilizem o Pascal como linguagem de programao procedural. Esses tipos de aplicaes no tero formulrios (janelas), botes de comando ou qualquer outro tipo de componente da interface padro do ambiente Windows, sendo definidas pelo Delphi 7 como aplicaes do tipo console (sero executadas em uma janela padro do DOS). Para criar uma aplicao do tipo console, proceda da seguinte maneira: 1. Selecione o item New/Other do menu File do Delphi 7, para exibir a caixa de dilogo New Items. 2. Selecione o item Console Application na pgina New desta caixa de dilogo, conforme indicado na figura a seguir. 3. Selecione o boto Ok, para fechar esta caixa de dilogo.

Figura 19.1: Criando uma aplicao tipo console com o Delphi.

A aplicao tipo console ser criada com um nico arquivo (arquivo de projeto, com extenso dpr), e cujo cdigo gerado reproduzido a seguir.
program Project1; {$APPTYPE CONSOLE} uses sysutils; begin end.

4. Salve o seu projeto com o nome Console.dpr, usando o tem Save Project As do menu File. 5. O cdigo-fonte do seu arquivo de projeto dever ficar como indicado a seguir.
program console;

266 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


program Console; {$APPTYPE CONSOLE} uses sysutils; begin end.

No caso de um programa desenvolvido com o Pascal padro, o incio do programa definido pela palavrachave program, seguida pelo nome do programa e pelas instrues delimitadas entre o primeiro begin e o ltimo end (que acompanhado de um ponto, e no de um ponto-e-vrgula, pois encerra a unit). Apenas para exemplificar o funcionamento de uma aplicao do tipo console, redefina o cdigo do seu programa da maneira indicada a seguir.
program Console; {$APPTYPE CONSOLE} uses sysutils; begin Writeln(Exemplo de Aplicativo Tipo Console); Readln; end.

Execute esta aplicao, e ver a janela mostrada na figura a seguir.

Figura 19.2: Executando uma aplicao tipo console com o Delphi 7.

importante salientar, no entanto, que no caso do Delphi 7, este tipo de aplicao de 32 bits do Windows (e no uma aplicao de 16 bits do DOS), e conseqentemente pode chamar qualquer funo definida pela API do Windows 95/98/Me/2000/NT/XP. Experimente, por exemplo, redefinir este programa da maneira mostrada a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

267

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


program Console; {$APPTYPE CONSOLE} uses Dialogs; begin ShowMessage(Exemplo de Aplicao Tipo Console); end.

A funo ShowMessage tpica do ambiente Windows, mostrando que, embora seja do tipo Console, no uma aplicao DOS (embora possua a cara e interface do DOS). Execute esta aplicao, e ver a janela mostrada na figura a seguir.

Figura 19.3: Acessando uma funo da API do Windows em uma aplicao tipo console criada com o Delphi 7.

O objetivo deste tpico foi mostrar que o ambiente de desenvolvimento do Delphi 7 pode ser usado no desenvolvimento de aplicaes do tipo console, utilizando-se o Pascal como linguagem de programao procedural. Desta maneira, se voc possui qualquer aplicao desenvolvida utilizando-se o Pascal tradicional, pode recompil-la a partir do ambiente do Delphi 7, executando os procedimentos descritos neste tpico (talvez tenha alguma dificuldade no caso de utilizao de algumas bibliotecas grficas). Dessa maneira no necessrio manter instalados simultaneamente, em um mesmo equipamento, o Delphi 7 e uma verso antiga do compilador Turbo Pascal. Nos prximos tpicos, a comparao entre a programao estruturada e a programao orientada a objetos ser feita, inicialmente, utilizando aplicaes tipo console, e nestas situaes este tpico poder ser bastante til.

268 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

KNOW-HOW EM: FUNDAMENTOS DA PROGRAMAO ORIENTADA A OBJETOS


PR-REQUISITOS

Conhecimento das tcnicas de programao estruturada. Conhecimento da sintaxe bsica da linguagem Pascal. Familiaridade com o ambiente de desenvolvimento integrado do Borland Delphi 7.
METODOLOGIA

Apresentao dos conceitos fundamentais da programao orientada a objetos. Comparao dos procedimentos adotados na programao estruturada e na programao orientada a objetos.
TCNICA

Criao de classes e objetos com o Borland Delphi 7.

A FILOSOFIA DA PROGRAMAO ORIENTADA A OBJETOS


Nos anos 80, as tcnicas de programao estruturada se destacaram como uma nova estratgia para o desenvolvimento de programas, adotando a tcnica de dividir para conquistar na qual um problema era subdividido em problemas menores, denominados mdulos, procedimentos, funes ou sub-rotinas (a terminologia variava principalmente em funo da linguagem de programao utilizada) cada uma destinada a realizar uma determinada tarefa. O problema era, logo, resolvido utilizando-se um mdulo principal, que recorria a estes mdulos secundrios sempre que fosse necessrio executar uma determinada tarefa. Dessa maneira, o programa principal tinha como funo o gerenciamento da soluo global tornando-o mais claro e necessitando de uma menor codificao. A partir das tcnicas de programao estruturada surgiram as bibliotecas de funes, que poderiam ser compartilhadas entre vrios programas e no caso do Pascal bastava que se fornecesse o arquivo compilado protegendo-se desta maneira o cdigo-fonte da biblioteca. Esta filosofia de programao, no entanto, apresentava uma caracterstica que ainda dificultava a abordagem do problema a ser resolvido de uma forma mais prxima do mundo real: o fato de que os dados e as funes que operavam sobre estes dados eram tratados como entidades inteiramente distintas. Consideremos, apenas para relembrar estes conceitos, o cdigo apresentado a seguir escrito em Pascal Procedural e destinado a calcular o imposto de renda (pessoa fsica). Este um exemplo bastante simples, mas nosso objetivo aqui no ensinar programao procedural, mas comparar a sintaxe utilizada na sua implementao com a utilizada na soluo do mesmo problema usando as tcnicas de programao orientada a objetos a serem apresentadas posteriormente. As frmulas utilizadas para o clculo do imposto no correspondem s utilizadas atualmente pela Receita Federal, tendo sido includas apenas a ttulo de exemplificao portanto no as incorpore diretamente no cdigo-fonte de seus programas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

269

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


program ImpostoDeRenda; {$APPTYPE CONSOLE} type TContribuinte = record rendimento, imposto : double; end; var Contribuinte : TContribuinte; procedure calcula_imposto(var um_contribuinte : TContribuinte); begin with um_contribuinte do begin if (rendimento < 900.0) then imposto := 0.0; if (rendimento > 1800) then imposto := 0.275*rendimento-360.0; if (rendimento >= 900)and(rendimento <= 1800) then imposto := 0.15*rendimento -135.0; end; end; begin write(Digite o valor do rendimento:); readln(contribuinte. rendimento); calcula_imposto(contribuinte); writeln(imposto:,contribuinte.imposto); readln; end.

Observe que no Delphi 7, a janela para edio de cdigos (O Code Editor) apresenta sua esquerda uma outra janela denominada Code Browser, como mostrado na figura a seguir, e que exibe os procedimentos, tipos, objetos e variveis definidos na unit que est sendo editada (mesmo se tratando de uma aplicao tipo console).

Figura 19.4: A janela do editor de cdigos, com a janela do Code Browser incorporada.

270 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

Esta janela pode ser desacoplada do editor de cdigos e visualizada de forma independente, bastando para isso selecionar a sua barra de ttulos e arrastar a janela para outra regio do ambiente de desenvolvimento.

No prximo tpico ser apresentada uma anlise deste cdigo, escrito por meio do Pascal procedural.

ANLISE DO CDIGO-FONTE
Conforme descrito anteriormente, nesse programa (escrito em Pascal Procedural) os dados so entidades totalmente distintas das funes. Nesse caso particular, os dados so declarados no seguinte trecho de cdigo:
var Contribuinte : TContribuinte;

onde TContribuinte um tipo composto (registro) definido na seo type da unit que rene duas variveis chamadas rendimento e imposto (denominadas campos). Os tipos compostos j existem h muito tempo na linguagem pascal, e no so uma inovao do Delphi 7. A nica sub-rotina deste programa a funo calcula_imposto, que recebe como parmetro uma varivel do tipo TContribuinte (sub-rotina esta reproduzida a seguir).
procedure calcula_imposto(var um_contribuinte : TContribuinte); begin with um_contribuinte do begin if (rendimento < 900.0) then imposto := 0.0; if (rendimento > 1800) then imposto := 0.275*rendimento - 360.0; if (rendimento >= 900)and(rendimento <= 1800) then imposto := 0.15*rendimento -135.0; end; end;

Observe a utilizao do parmetro var, caracterizando que a varivel passada por referncia, e no por valor. Desta maneira, garantimos que estamos trabalhando com a varivel original, e no com uma cpia da mesma. O programa principal muito simples, e dispensa maiores comentrios, pois realiza apenas a leitura das informaes solicitadas, chama a funo calcula_imposto e exibe o resultado final na tela. Dessa maneira pode-se constatar que, conforme j dissemos anteriormente, na programao procedural os dados e as funes so entidades distintas. evidente que, neste exemplo muito simples, a varivel Contribuinte possui escopo global, e por esta razo poderamos alter-la diretamente na sub-rotina, no havendo a necessidade de utilizao do parmetro especificado. Esta, no entanto, uma prtica de programao desaconselhvel, principalmente se levarmos em conta a possibilidade de se incluir a procedure calcula_imposto em uma biblioteca de funes codificada em uma unit independente. O objetivo da programao orientada a objetos, por outro lado, consiste primordialmente em reunir os dados, as funes e procedimentos que operam sobre estes dados em uma nica entidade ou tipo,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

271

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


denominada classe. Uma classe, portanto, ser um novo tipo da linguagem na qual estaro reunidos dados e funes (ou procedimentos).

A IMPLEMENTAO DE UMA CLASSE


Na linguagem Object Pascal, a definio de uma classe feita em um trecho de cdigo que obedece seguinte sintaxe:
type Nome_da_classe = Class Nome_do_dado_1 : tipo_1; .. Nome_do_dado_n : tipo_n; Cabealho_da_funo_1; .. Cabealho _da_funo_n; end;

onde tipo pode ser qualquer tipo bsico definido pela linguagem, criado pelo programador ou, at mesmo, outras classes previamente definidas. Repare que agora estamos definindo um novo tipo, no qual internamente so declaradas variveis e funes. Pode-se dizer, sem muito preciosismo, que a definio de uma classe estende a definio de um registro, permitindo a incorporao de funes ao tipo que est sendo criado. Por conveno, os nomes das classes definidas na linguagem Object Pascal comeam com a letra T, e neste livro seguiremos esta conveno. importante caracterizar que, na definio do tipo, as funes e os procedimentos so declarados mas no implementados. A implementao das funes e dos procedimentos declarados internamente a uma classe, e que no jargo da programao orientada a objetos so denominados mtodos, feita na seo Implementation da unit em que a classe definida, devendo, no entanto, o nome do mtodo ser precedido pelo nome da classe e obedecer seguinte sintaxe:
function Nome_da_Classe.Nome_do_Mtodo(parmetros) begin // Cdigo do mtodo end;

ou
procedure Nome_da_Classe.Nome_do_Mtodo(parmetros) begin // Cdigo do mtodo end;

evidente que um mtodo, assim como uma funo ou procedimento, tambm pode no ter parmetros. No caso do exemplo anterior, poderamos, portanto, criar uma classe denominada TContribuinte, como mostrado a seguir.
type TContribuinte = Class

272 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


rendimento, imposto : double; procedure calcula_imposto; end;

A implementao do mtodo calcula_imposto, por sua vez, poderia ser feita da seguinte maneira:
procedure TContribuinte.calcula_imposto; begin if (rendimento < 900.0) then imposto := 0.0; if (rendimento > 1800) then imposto := 0.275*rendimento -360.0; if (rendimento >= 900)and(rendimento <= 1800) then imposto := 0.15*rendimento -135.0; end;

Repare que, neste caso, no h a necessidade de se passar qualquer parmetro. Isso se deve ao fato de que, por ser definido internamente a uma classe, um mtodo pode acessar diretamente todos os seus campos. Conseqentemente, o mtodo calcula_imposto acessa diretamente o campo rendimento, e este no precisa ser passado como parmetro. O Delphi 7 possui um recurso que permite a gerao automtica do cdigo bsico de um mtodo na seo Implementation da unit, bastando para isso que se pressione, simultaneamente as teclas Ctrl, Shift e C. O mesmo se aplica definio de propriedades para uma classe, conforme ser visto posteriormente. Esse recurso, denominado Complementao Automtica de Classes, acelera muito o trabalho de codificao por parte do programador, reduzindo-se tambm a possibilidade de erros de digitao. Antes de utilizarmos uma varivel, objeto ou instncia de uma classe, devemos alocar memria para o mesmo. A alocao de memria para um objeto feita executando-se um mtodo especial da classe, denominado mtodo construtor. Em geral (mas no obrigatoriamente) esse mtodo denominado Create, e pode ou no possuir parmetros. Voc pode definir vrios mtodos construtores para uma classe, com nomes e parmetros distintos, e decidir qual deve ser usado na alocao de memria para um objeto ou instncia da classe. Essa memria que foi alocada deve ser posteriormente liberada, antes de se finalizar a execuo do programa, e isso feito executando-se um outro mtodo especial da classe, denominado mtodo destrutor. Em geral, esse mtodo denominado Destroy, e pode ou no possuir parmetros. O programa anterior poderia, portanto, ser recodificado da seguinte maneira (usando uma classe ao invs de um registro):
program imposto_renda; {$APPTYPE CONSOLE} type TContribuinte = Class rendimento, imposto : double; procedure calcula_imposto; end; var Contribuinte : TContribuinte; procedure TContribuinte.calcula_imposto; begin

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

273

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


if (rendimento < 900.0) then imposto := 0.0; if (> 1800) then imposto := 0.275*rendimento -360.0; if (rendimento >= 900)and(rendimento <= 1800) then imposto := 0.15*rendimento -135.0; end; begin Contribuinte := TContribuinte.Create; write(Digite o valor do rendimento:); readln(contribuinte. rendimento); contribuinte.calcula_imposto; writeln(imposto:,contribuinte.imposto); Contribuinte.Destroy; readln; end.

ANLISE DO CDIGO-FONTE
Nesse exemplo, a varivel Contribuinte , na realidade, um objeto ou instncia (terminologia largamente empregada na programao orientada a objetos) da classe TContribuinte, mas no nenhum pecado cham-la de varivel (embora os puristas da programao orientada a objetos possam querer me crucificar por causa disso). Repare que, no trecho principal do programa, alterou-se a linha de cdigo em que o procedimento para clculo do imposto executado. No programa escrito anteriormente, utilizando as tcnicas de programao estruturada, o procedimento para clculo do imposto era uma entidade independente dos dados que deve manipular, e precisava receber, como parmetro, uma varivel do tipo composto TContribuinte. O programa escrito utilizando as tcnicas de programao orientada a objetos, por sua vez, define esse procedimento como um mtodo da classe TContribuinte. Dessa maneira, a chamada desse procedimento (que nesse caso no possui parmetros) feita a partir de um objeto dessa classe, como mostra a linha de cdigo a seguir:
contribuinte.calcula_imposto;

Alm disso, foram includas duas outras linhas de cdigo, em que os mtodos construtor e destrutor da classe so executados. Repare que o mtodo construtor executado a partir da classe propriamente dita, enquanto o destrutor executado a partir do objeto ou instncia da classe. Nesse ponto, uma dvida deve estar presente na mente do prezado leitor: como os mtodos construtor e destrutor podem ser executados, se no foram sequer definidos para a classe? A resposta a essa pergunta ser dada no prximo tpico, em que abordaremos uma das caractersticas mais importantes da programao orientada a objetos o mecanismo de herana de classes.

KNOW-HOW EM: HERANA DE CLASSES


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal. Familiaridade com o ambiente de desenvolvimento integrado do Delphi 7.

274 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


METODOLOGIA

Apresentao do conceito de herana da programao orientada a objetos.


TCNICA

Implementao do mecanismo de herana de classes com o Delphi 7.

O CONCEITO DE HERANA DE CLASSES


Uma das principais vantagens da programao orientada a objetos, e muito divulgada na literatura especializada sobre o assunto, reside na reutilizao de cdigo atravs do mecanismo de herana. Esse mecanismo permite que se definam novas classes (chamadas classes derivadas) a partir de uma classe fundamental (denominada classe-base). Esse tipo de abordagem permite que a implementao da nossa soluo para um determinado problema seja feita de uma maneira muito mais apropriada, e semelhante ao problema real. Considere novamente o problema de elaborao de um programa para o clculo do imposto de renda. No mundo real, existem dois tipos de contribuinte pessoa fsica e pessoa jurdica. Esses dois tipos, no entanto, dispem de algumas caractersticas em comum: ambos tm imposto a pagar, e devem ter um mtodo para o clculo desse imposto. Podemos ento imaginar uma classe-base, denominada classe TContribuinte, a partir da qual sero derivadas por herana duas outras classes, denominadas TPessoa_Fisica e TPessoa_Juridica. Conseqentemente, podemos definir, para a classe-base TContribuinte, campos chamados rendimento e imposto, do tipo double, e um mtodo chamado calcula_imposto. O esqueleto dessa classe apresentado a seguir.
type TContribuinte = Class rendimento, imposto : double; procedure calcula_imposto; end;

A definio de uma classe derivada a partir de uma classe-base feita mediante a utilizao de um cdigo com a seguinte sintaxe:
Nome_Classe_Derivada = Class(Nome_Classe_Base) // Definio dos campos e mtodos da classe derivada end;

Caso no seja especificado o nome de uma classe-base, ser usada como tal a classe TObject, que a classebase de todas as classes definidas na linguagem Object Pascal. Se voc analisar o diagrama de hierarquia de objetos do Delphi 7, ver que a classe TObject exibida isoladamente no topo dessa hierarquia. Dessa maneira, a classe TContribuinte poderia ser redefinida da seguinte maneira, em que o nome da classe-base (TObject) exibido de maneira explcita.
type TContribuinte = Class(TObject)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

275

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


rendimento, imposto : double; procedure calcula_imposto; end;

Na unit System (definida pelo arquivo System.pas), a classe TObject definida da seguinte maneira:
TObject = class constructor Create; procedure Free; class function InitInstance(Instance: Pointer): TObject; procedure CleanupInstance; function ClassType: TClass; class function ClassName: ShortString; class function ClassNameIs(const Name: string): Boolean; class function ClassParent: TClass; class function ClassInfo: Pointer; class function InstanceSize: Longint; class function InheritsFrom(AClass: TClass): Boolean; class function MethodAddress(const Name: ShortString): Pointer; class function MethodName(Address: Pointer): ShortString; function FieldAddress(const Name: ShortString): Pointer; function GetInterface(const IID: TGUID; out Obj): Boolean; class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; class function GetInterfaceTable: PInterfaceTable; function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; virtual; procedure AfterConstruction; virtual; procedure BeforeDestruction; virtual; procedure Dispatch(var Message); virtual; procedure DefaultHandler(var Message); virtual; class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; destructor Destroy; virtual; end;

Observe que essa classe j define os mtodos Create e Destroy. Conseqentemente, as classes dela derivadas por herana (como, por exemplo, a classe TContribuinte) herdaro esses mtodos da classe TObject. Isso esclarece a questo colocada no tpico anterior, em que se utilizaram os mtodos Create e Destroy sem que os mesmos houvessem sido explicitamente declarados na classe. Esses mtodos foram definidos na classe-base (TObject), podendo ser utilizados nas classes dela derivadas por herana. Repare ainda que alguns mtodos se iniciam com palavras reservadas especiais, como:

Constructor, no caso do mtodo construtor da classe. Destructor, no caso do mtodo destrutor da classe. Class, que ocorre em diversos mtodos.
O significado de cada uma dessas palavras reservadas ser descrito nos prximos tpicos. No comentaremos o significado das palavras reservadas procedure e function, por considerarmos o seu conhecimento obrigatrio a todos aqueles que j tm alguma experincia com a linguagem pascal (incluindo-se neste grupo aqueles que j leram a primeira parte deste livro). Dessa maneira, a definio das classes TContribuinte, TPessoa_Juridica e TPessoa_Fisica pode ser feita da seguinte maneira:
TContribuinte = Class(TObject) imposto : double;

276 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


rendimento: double; procedure calcula_imposto; end; TPessoa_Juridica = Class(TContribuinte) end; TPessoa_Fisica = Class(TContribuinte) end;

Essas classes, portanto, herdam os campos imposto e o mtodo calcula_imposto da classe-base TContribuinte. Alm disso, herdam tambm os mtodos definidos na classe TObject. No jargo da programao orientada a objetos diz-se que as classes TPessoa_Fisica e TPessoa_Juridica so especializaes da classe TContribuinte. Quando voc declarar uma instncia de uma classe, aquela armazenar, na realidade, o endereo de um objeto dessa classe, podendo no entanto armazenar tambm o endereo de uma classe dela derivada por herana. Caso nenhum endereo seja referenciado, o seu valor ser igual a nil (nulo). Consideremos, por exemplo, a linha de cdigo a seguir, em que declaramos uma instncia da classe TContribuinte:
Contribuinte : TContribuinte;

Essa instncia a varivel contribuinte pode armazenar o endereo de um objeto da classe TContribuinte ou de qualquer das classes dela derivadas por herana. Dessa maneira, as linhas de cdigo a seguir so igualmente vlidas:
Contribuinte := TContribuinte.Create; Contribuinte := TPessoa_Fisica.Create; Contribuinte := TPessoa_Juridica.Create;

A recproca, no entanto, no verdadeira: voc no pode declarar um objeto de uma classe e referenciar um objeto da sua classe-base.

MTODOS CONSTRUTORES
Um construtor um mtodo especial de uma classe, que tem por finalidade alocar a memria para um objeto que est sendo criado (ou instanciado, no jargo da Programao Orientada a Objetos) e, opcionalmente, atribuir valores iniciais aos campos do objeto. Uma classe pode ter mais do que um mtodo construtor e, se voc no definir explicitamente um construtor para essa classe, o construtor da sua classe-base ser utilizado. A definio de um construtor utiliza a palavra-chave constructor em vez de procedure ou function. Alm disso, um construtor pode ter parmetros e chamar o construtor da classe-base. Dessa maneira, a palavrachave constructor que indica ao compilador que deve alocar a memria necessria para o objeto. Embora no especifique um tipo de retorno, um construtor retorna um novo objeto da classe. A chamada ao mtodo construtor deve ser feita a partir da definio da classe, e no a partir de uma instncia ou

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

277

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


objeto da classe. Por essa razo, nos tpicos anteriores, a chamada do mtodo Create foi feita a partir da classe TContribuinte, e no a partir do objeto Contribuinte. Alguns autores costumam identificar uma classe como uma fbrica de objetos. Nesse caso, o mtodo construtor seria uma mquina existente na fbrica, e que retorna um objeto da classe sempre que posta em funcionamento. Caso voc execute um construtor a partir de uma instncia da classe, nenhuma memria ser alocada e no ser retornado um novo objeto da classe apenas o cdigo definido no corpo do construtor ser executado (esta, no entanto, no uma prtica aconselhvel voc deve chamar o construtor a partir da definio da classe e no a partir de uma instncia ou objeto).

MTODOS DESTRUTORES
Um destrutor um mtodo especial de uma classe, que tem por finalidade liberar a memria alocada para um objeto ou instncia da classe. Uma classe pode ter mais do que um mtodo destrutor e, se voc no definir explicitamente um destrutor para essa classe, o destrutor da sua classe-base ser utilizado. A definio de um mtodo destrutor usa a palavra-chave destructor em vez de procedure ou function. Alm disso, um mtodo destrutor pode ter parmetros e chamar o mtodo destrutor da classe-base. Se voc est criando uma nova classe derivada de uma classe-base e est sobrecarregando ou redefinindo o seu mtodo destrutor, a ltima instruo a ser colocada no corpo do novo mtodo destrutor deve ser aquela que chama o destrutor da classe-base, principalmente se o destrutor da classe-base executa algumas tarefas importantes relacionadas liberao de memria alocada para um objeto. No caso de uma classe derivada de TObject, no entanto, isso no necessrio, pois seu mtodo destrutor no realiza nenhuma tarefa importante, como mostra o trecho de cdigo a seguir (extrado da unit System.pas):
destructor TObject.Destroy; begin end;

Geralmente, mais seguro chamar o mtodo Free do que o mtodo Destroy de uma classe, uma vez que Free verifica se o objeto realmente existe na memria e, em caso positivo, executa o mtodo Destroy. Esse mtodo tambm declarado como uma procedure na classe TObject, e sua implementao (definida na unit System.pas da VCL do Delphi 7) reproduzida a seguir.
procedure TObject.Free; asm TEST EAX,EAX JE @@exit MOV ECX,[EAX] MOV DL,1 CALL dword ptr [ECX].vmtDestroy @@exit: end;

Esse cdigo, na realidade, est escrito em Assembler, e verifica se existe memria alocada para o objeto antes de executar o seu destrutor.

278 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Voc no deve se preocupar em compreender o significado desse cdigo, afinal de contas voc no est lendo um texto sobre Assembler. O importante compreender que, mesmo que no exista memria alocada para o objeto, a execuo desse mtodo no provocar um erro em run-time. Para compreender a diferena existente entre a utilizao dos mtodos Free e Destroy, crie uma aplicao bastante simples, composta por um nico formulrio, no qual so inseridos uma caixa de texto (chamada Edit1) e um boto de comando. No procedimento associado ao evento OnClick do boto de comando digite a seguinte linha de cdigo:
Edit1.Free;

Execute a aplicao e selecione o boto. A caixa de texto ser eliminada do formulrio, e se voc selecionar novamente o boto de comando nada de anormal acontecer. Por outro lado, se voc substituir a linha de cdigo anterior pela apresentada a seguir, o componente caixa de texto ser eliminado do formulrio quando o boto de comando for selecionado pela primeira vez. Entretanto, caso voc selecione novamente o boto de comando, a execuo da aplicao ser interrompida e uma mensagem de erro ser exibida. Isso se deve ao fato de que o mtodo Destroy, ao contrrio do mtodo Free, no verifica se realmente existe memria alocada para o objeto antes de tentar destru-lo.
Edit1.Destroy;

Mas ateno: o mtodo Free verifica se existe memria alocada para o objeto, isto , se o valor referenciado pelo objeto diferente de nil antes de executar o mtodo Destroy para destruir o objeto. Contudo, cabe a voc garantir que, aps destruir o objeto, esse apontar para um endereo nulo, isto , nil. Para garantir que isso ocorra, no entanto, voc deve atribuir o valor nil instncia aps executar o seu mtodo Free, no caso de estar implementando esses mtodos da classe.

VISIBILIDADE DOS CAMPOS E MTODOS DE UMA CLASSE


Define-se como visibilidade dos campos e mtodos de uma classe o conjunto de trechos de cdigo em que os mesmos podem ser acessados. Na linguagem Object Pascal, os mtodos e campos de uma classe podem ser classificados como pblicos (public), privados (private) ou protegidos (protected). No caso de classes que representam componentes, temos ainda o tipo published (no traduzirei esse termo), que ser abordado no captulo relativo criao de componentes. As classes derivadas da classe TAutoObject (usadas em automao OLE) tambm podero ter campos do tipo automated. Por enquanto, vamos nos concentrar apenas nos trs primeiros tipos: public, private e protected.

CAMPOS E MTODOS PBLICOS (PUBLIC)


Os campos e mtodos pblicos de uma classe so aqueles que podem ser acessados em qualquer trecho de um programa no qual um objeto ou instncia da classe definido. No Delphi 7 os campos de uma classe so public por default, isto , caso no haja qualquer declarao explcita em relao a um campo de uma classe, este ser considerado como um campo pblico.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

279

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Dessa maneira, as duas declaraes a seguir so equivalentes:
type T Contribuinte = Class imposto : double; rendimento: double; procedure calcula_imposto; end; type TContribuinte = Class public imposto : double; rendimento: double; procedure calcula_imposto; end;

CAMPOS E MTODOS PRIVADOS (PRIVATE)


Os campos e mtodos privados de uma classe so aqueles que s podem ser acessados por outros mtodos da classe, isto , s so visveis dentro da classe, no podendo ser acessados nem mesmo nas classes dela derivadas por herana. Na declarao da classe, os mtodos e campos privados devem ser precedidos da palavra-chave private, como mostrado no trecho de cdigo a seguir.
type TContribuinte = Class public imposto : double; rendimento: double; procedure calcula_imposto; private // Campos e mtodos privados devem ser definidos aqui. end;

Existe, no entanto, uma exceo a essa regra: uma classe pode acessar os campos e mtodos privados de outras classes que tenham sido definidas na mesma unit.

CAMPOS E MTODOS PROTEGIDOS (PROTECTED)


Os campos e mtodos protegidos de uma classe so aqueles que s podem ser acessados por outros mtodos da classe ou de classes dela derivadas isto , s so visveis dentro da prpria classe ou das classes que forem dela derivadas por herana. Na declarao da classe, os mtodos e campos protegidos devem ser precedidos da palavra-chave protected, como mostrado no trecho de cdigo a seguir.
type TContribuinte = Class public imposto : double; rendimento: double; procedure calcula_imposto; private // Campos e mtodos privados devem ser definidos aqui. protected // Campos e mtodos protegidos devem ser definidos aqui. end;

280 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

SOBREPOSIO DE MTODOS
Existem situaes em que, ao criarmos uma classe, desejamos sobrepor o mtodo existente na classebase. Quando desejamos simplesmente substituir o mtodo j existente na classe-base basta que se defina, na classe derivada, um mtodo com o mesmo nome do mtodo a ser sobreposto. Desse modo, a classe derivada passar a ignorar a existncia de um mtodo de mesmo nome na classe-base. Nada impede, no entanto, que voc ainda acesse o mtodo de mesmo nome da classe-base, desde que o nome do mtodo seja precedido pela palavra reservada inherited. Para compreender esse mecanismo, codifique uma aplicao tipo console da maneira indicada a seguir.
program Exemplo; {$APPTYPE CONSOLE} uses Dialogs; type TClasseBaseTeste = class procedure ExibeMensagem; end; TClasseDerivadaTeste = class(TClasseBaseTeste) procedure ExibeMensagem; end; procedure TClasseBaseTeste.ExibeMensagem; begin ShowMessage(Classe Base); end; procedure TClasseDerivadaTeste.ExibeMensagem; begin ShowMessage(Classe Derivada); inherited ExibeMensagem; end; var Teste : TClasseDerivadaTeste; {$R *.RES} begin Teste := TClasseDerivadaTeste.Create; writeln(Digite Qualquer tecla); Readln; Teste.ExibeMensagem; Teste.Free; end.

Execute essa aplicao e verifique que, embora o mtodo ExibeMensagem da classe-base tenha sido sobreposto na classe derivada, pode ainda ser chamado em um mtodo da classe derivada usando a palavra reservada inherited. Experimente trocar a ordem das linhas de cdigo do mtodo ExibeMensagem da classe derivada, e verifique que a ordem de exibio de mensagens alterada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

281

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

MTODOS ESTTICOS, VIRTUAIS E DINMICOS


Os mtodos considerados at o momento so denominados estticos, que so aqueles cujo endereo determinado pelo compilador durante a compilao do programa e gerao do arquivo executvel. Existem situaes, no entanto, em que no sabemos de antemo que tipo de objeto ser apontado por uma determinada varivel (lembre-se de que uma varivel de uma determinada classe pode armazenar um objeto dessa classe ou de qualquer classe dela derivada por herana). Nesse caso, para que o programa possa definir durante a sua execuo que mtodo deve ser chamado, devemos declarar o mtodo como virtual. Consideremos novamente uma aplicao console bastante simples, com o cdigo apresentado a seguir.
program Exemplo; {$APPTYPE CONSOLE} uses Dialogs; type TClasseBaseTeste = class procedure ExibeMensagem; end; TClasseDerivadaTeste = class(TClasseBaseTeste) procedure ExibeMensagem; end; procedure TClasseBaseTeste.ExibeMensagem; begin ShowMessage(Classe Base); end; procedure TClasseDerivadaTeste.ExibeMensagem; begin ShowMessage(Classe Derivada); end; var Teste : TClasseBaseTeste; {$R *.RES} begin Teste := TClasseDerivadaTeste.Create; writeln(Digite Qualquer tecla); Readln; Teste.ExibeMensagem; Teste.Free; end.

Nesse caso, embora a varivel Teste seja declarada como um objeto da classe TClasseBaseTeste, no programa principal referencia um objeto da classe TClasseDerivadaTeste o que perfeitamente legal, pois, conforme discutido anteriormente, uma instncia ou objeto de uma determinada classe pode referenciar um objeto dessa classe ou de qualquer classe dela derivada por herana (embora a recproca no seja correta).

282 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Entretanto, ao executar esse cdigo verifica-se que o mtodo executado o definido na classe-base, e no o definido na classe derivada. Isto se deve utilizao de mtodos estticos, cujo endereo determinado na fase de compilao e nessa fase a varivel Teste declarada como um objeto da classe TClasseBaseTeste (embora durante a execuo da aplicao ela venha a referenciar um objeto da classe TClasseDerivadaTeste). Conseqentemente, o programa executar sempre o mtodo da classe-base, pois durante a compilao definiu-se Teste como um objeto da classe TBaseTeste. A soluo para esse problema est justamente na utilizao de mtodos virtuais cujo endereo definido durante a execuo do aplicativo (e no durante a sua compilao). Para declarar um mtodo como virtual, deve-se acrescentar a palavra-chave virtual, seguida de um ponto-e-vrgula, ao final da declarao do mtodo na classe-base. Nas classes derivadas em que esse mtodo for sobrecarregado, deve-se acrescentar a palavra-chave override (em vez de virtual), seguida de um ponto-e-vrgula, ao final da declarao do mtodo. Dessa maneira, o programa anterior poderia ser recodificado da seguinte maneira:
program Exemplo; uses Dialogs; type TClasseBaseTeste = class procedure ExibeMensagem;virtual; end; TClasseDerivadaTeste = class(TClasseBaseTeste) procedure ExibeMensagem;override; end; procedure TClasseBaseTeste.ExibeMensagem; begin ShowMessage(Classe Base); end; procedure TClasseDerivadaTeste.ExibeMensagem; begin ShowMessage(Classe Derivada); end; var Teste : TClasseBaseTeste; begin Teste := TClasseDerivadaTeste.Create; writeln(Digite Qualquer tecla); Readln; Teste.ExibeMensagem; Teste.Free; end.

Se voc executar essa aplicao, ver que o mtodo correto chamado. Nesse caso, no entanto, nada impede que o mtodo da classe-base continue a ser acessado pelo mtodo de mesmo nome da classe derivada usando-se a palavra reservada inherited mas, nesse caso, o mtodo correto ser chamado!

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

283

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Diferentemente do que ocorreu no exemplo anterior, ao encontrar a palavra-chave virtual na definio do mtodo ExibeMensagem, o compilador ficou ciente de que o endereo do mtodo a ser executado ser determinado durante a execuo do aplicativo, e no durante a sua compilao e isso vai depender do tipo de classe realmente referenciado pelo objeto.

MAS E OS MTODOS DINMICOS? O QUE SIGNIFICAM?


A finalidade dos mtodos dinmicos a mesma dos mtodos virtuais, isto , so funcionalmente equivalentes. A nica diferena diz respeito otimizao feita pelo compilador. Ao utilizar mtodos virtuais, melhora-se o desempenho em detrimento do tamanho do cdigo gerado. Por outro lado, a utilizao de mtodos dinmicos reduz o tamanho do cdigo em detrimento do desempenho. Para utilizar o recurso de mtodos dinmicos, basta recodificar o programa-exemplo como mostrado a seguir.
program Exemplo; {$APPTYPE CONSOLE} uses Dialogs; type TClasseBaseTeste = class procedure ExibeMensagem;dynamic; end; TClasseDerivadaTeste = class(TClasseBaseTeste) procedure ExibeMensagem;override; end; procedure TClasseBaseTeste.ExibeMensagem; begin ShowMessage(Classe Base); end; procedure TClasseDerivadaTeste.ExibeMensagem; begin ShowMessage(Classe Derivada); end; var Teste : TClasseBaseTeste; {$R *.RES} begin Teste := TClasseDerivadaTeste.Create; writeln(Digite Qualquer tecla); Readln; Teste.ExibeMensagem; Teste.Free; end.

MTODOS ABSTRATOS
Os mtodos abstratos formam um tipo especial de mtodo, que so declarados em uma classe-base, mas s so implementados nas classes dela derivadas por herana.

284 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Esse tipo de mtodo til quando se quer definir um mtodo que dever ser implementado em todas as classes derivadas de uma classe-base. Um mtodo declarado como abstrato ao se acrescentar a palavra-chave abstract ao final da sua declarao. Entretanto, um mtodo s pode ser declarado como abstrato se previamente declarado como virtual ou dinmico. O trecho de cdigo a seguir mostra a declarao de um mtodo abstrato.
type Figura = class procedure Desenha; virtual; abstract; ... end;

Voc pode sobrecarregar um mtodo abstrato da mesma forma que sobrecarrega um mtodo virtual ou dinmico. A nica restrio que, nesse caso, no se pode usar a palavra reservada inherited para chamar o mtodo de mesmo nome da classe-base (j que nesta ele no foi implementado).

MTODOS DE CLASSE
Conforme pode ser verificado na definio da classe TObject, a declarao de alguns de seus mtodos comea com a palavra reservada class. Quando a declarao de um mtodo inicia com essa palavra reservada, isso significa que esse mtodo intrnseco definio da classe e no pode, no entanto, acessar os campos e mtodos da classe. Esses mtodos sero descritos no prximo tpico, que discute em mais detalhes a classe TObject.

PROPRIEDADES
Nos tpicos anteriores foram apresentados os conceitos de campos e mtodos de uma classe. Conforme j descrito anteriormente, os campos armazenam valores que definem as caractersticas de um objeto e os mtodos implementam a sua funcionalidade. Existem situaes, no entanto, em que no se quer permitir o acesso direto aos campos de uma classe, ainda que esses sejam definidos como pblicos. Nesse caso, uma opo natural seria a utilizao de mtodos destinados a ler e atribuir valores aos campos da classe. Consideremos, por exemplo, a seguinte definio para a classe TContribuinte.
type TContribuinte = Class public rendimento:double; imposto : double; procedure calcula_imposto; private // Campos e mtodos privados devem ser definidos aqui. protected // Campos e mtodos protegidos devem ser definidos aqui. end;

Nesta definio, imposto um campo pblico, e conseqentemente pode ter o seu valor diretamente alterado, o que no caracteriza uma boa prtica de programao, pois o valor do imposto deve sempre

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

285

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


ser calculado, e no ter um valor atribudo de forma direta (os puristas da orientao a objetos dizem que este campo deve ser encapsulado). Uma soluo natural, portanto, seria implementar o mtodo calcula_imposto como uma funo em vez de um procedimento, redefinindo a classe da maneira indicada a seguir.
TContribuinte = Class public rendimento:double; function calcula_imposto:double; private // Campos e mtodos privados devem ser definidos aqui. imposto : double; protected // Campos e mtodos protegidos devem ser definidos aqui. end;

Nesse caso, o campo imposto passa a ser privado, e no pblico. A sua implementao correspondente seria:
function TContribuinte.calcula_imposto:double; begin if (rendimento < 900.0) then imposto := 0.0; if (rendimento > 1800) then imposto := 0.275*rendimento -360.0; if (rendimento >= 900)and(rendimento <= 1800) then imposto := 0.15*rendimento -135.0; result := imposto; end;

Dessa maneira, se Contribuinte um objeto da classe TContribuinte, a obteno do valor do imposto pode ser feita utilizando-se a seguinte linha de cdigo, onde valor_do_imposto uma varivel global do tipo double:
valor_do_imposto := Contribuinte.calcula_imposto;

O Delphi 7, no entanto, permite uma soluo alternativa, que consiste em empregar o conceito de propriedades. Uma propriedade consiste em um meio de comunicao entre um campo interno e privado da classe e o cdigo que utiliza um objeto dessa classe. Para o programador que utiliza a classe, uma propriedade funcionalmente equivalente a um campo, mas para quem definiu a classe um campo e uma propriedade so entidades distintas. Por conveno, os campos internos das classes definidas pela VCL e pela CLX (as bibliotecas de classes do Delphi 7) so privados e seus nomes comeam com a letra F (de Field). As propriedades, por sua vez, tm o mesmo nome de um campo da classe, omitindo-se a letra F inicial. O componente Label, por exemplo, um objeto da classe TLabel, que tem uma propriedade chamada Left. Embora voc, usurio da classe, acesse essa propriedade da mesma maneira que acessa um campo pblico qualquer, est na realidade acessando um meio de comunicao com um outro campo interno e privado da classe, chamado FLeft.

286 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


No caso da classe TContribuinte, por exemplo, poderamos ter um campo privado chamado Fimposto e uma propriedade chamada imposto. A definio de uma propriedade, no entanto, feita mediante a incluso de uma linha de cdigo que apresenta a seguinte sintaxe:
property nome_propriedade : tipo read metodo_ leitura write metodo_ escrita;

Como pode ser visto na definio anterior, uma propriedade deve ter um tipo e pode ter um mtodo de leitura e um mtodo de escrita. Quando se omite o nome do mtodo de escrita, a propriedade do tipo read-only (apenas de leitura) e quando se omite o mtodo de leitura a propriedade do tipo write-only (apenas de escrita). Existem situaes, no entanto, que, em vez de se definir um mtodo de leitura e um mtodo de escrita, coloca-se em seu lugar o nome do campo em que o valor da propriedade ser armazenado. Nesses casos, diz-se que a propriedade acessa diretamente o valor de um campo, sem que se use qualquer mtodo especfico. Conforme ser visto posteriormente, os mtodos de acesso so teis para validar o valor atribudo a uma propriedade. A propriedade imposto poderia, portanto, ser definida da seguinte maneira:
property imposto : double read calcula_imposto;

Nesse caso, imposto definida como uma propriedade apenas de leitura (repare que foi omitida a clusula write).
A classe TContribuinte seria, portanto, redefinida da seguinte maneira: TContribuinte = Class public rendimento:double; function calcula_imposto:double; property imposto : double read calcula_imposto; private // Campos e mtodos privados devem ser definidos aqui. Fimposto : double; protected // Campos e mtodos protegidos devem ser definidos aqui. end; function TContribuinte.calcula_imposto:double; begin if (rendimento < 900.0) then Fimposto := 0.0; if (rendimento > 1800) then Fimposto := 0.275*rendimento -360.0; if (rendimento >= 900)and(rendimento <= 1800) then Fimposto := 0.15*rendimento -135.0; result := Fimposto; end;

No prximo tpico apresentaremos a classe TObject, que a me de todas as classes definidas na linguagem Object Pascal.

REFERNCIA: A CLASSE TOBJECT


Conforme descrito nos tpicos anteriores, a classe TObject a classe-base de todas as classes implementadas no Delphi 7, isto , toda classe derivada por herana, ainda que indiretamente, da classe TObject.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

287

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


importante, portanto, que voc como desenvolvedor conhea detalhadamente as caractersticas dessa classe, conforme ser mostrado nos prximos tpicos.

PRINCIPAIS MTODOS DA CLASSE TOBJECT


Apresentamos a seguir uma descrio dos principais mtodos definidos na classe TObject. Como a maioria desses mtodos est implementada em Assembler, no discutiremos sua implementao apenas descrevemos a finalidade de cada um deles.

AfterConstruction
Declarao
procedure AfterDestruction; virtual;

Esse mtodo um mtodo virtual, executado automaticamente aps a finalizao do ltimo mtodo construtor da classe.

BeforeDestruction
Declarao
procedure BeforeDestruction; virtual;

Esse mtodo um mtodo virtual, executado automaticamente antes da inicializao do primeiro mtodo destrutor da classe.

Create
Declarao
constructor Create;

Esse mtodo o mtodo construtor da classe, conforme indicado pela palavra reservada constructor, e tem por finalidade alocar a memria necessria a um objeto ou instncia da classe. Como qualquer construtor, executado como se fosse um mtodo da classe (embora, por ser um mtodo construtor, no seja precedido pela palavra reservada class).

ClassInfo
Declarao
class function ClassInfo: Pointer;

Como pode ser verificado a partir da sua declarao, este um mtodo de classe e, por ser uma funo, deve retornar um valor, que nesse caso ser um Pointer (ponteiro para um endereo de memria sem uma qualificao de tipo). A Unit TypInfo define, no entanto, alguns tipos compostos que simplificam a utilizao da informao retornada por esse mtodo. Dentre esses tipos compostos destaca-se:

288 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


TTypeInfo = record Kind: TTypeKind; Name: ShortString; {TypeData: TTypeData} end; PtypeInfo: ^TtypeInfo.

O tipo TTypeInfo possui os campos Kind e Name, que retornam respectivamente um valor que indica o tipo de dado armazenado em um endereo e o nome do tipo ou Classe do valor armazenado nesse endereo, respectivamente.

O tipo PtypeInfo representa um ponteiro para um valor do tipo TtypeInfo. O tipo TTypeKind (definido como um tipo enumerado em Pascal) tambm declarado na unit
TypeInfo, sendo sua definio reproduzida a seguir.
TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface);

Logo, para obter informaes sobre uma classe atravs do mtodo ClassInfo, voc precisa:

Declarar uma varivel do tipo PtypeInfo (que ser um ponteiro). Armazenar nessa varivel o valor retornado pelo mtodo ClassInfo. Utilizar as informaes armazenadas nos campos dessa varivel.

ClassName
Declarao
class function ClassName: ShortString;

Como pode ser verificado a partir da sua declarao, esse um mtodo de classe e, por ser uma funo, deve retornar um valor, que nesse caso ser uma string que armazenar o nome da classe.

ClassNameIs
Declarao
class function ClassNameIs(const Name: string): Boolean;

Como pode ser verificado a partir da sua declarao, esse um mtodo de classe e, por ser uma funo, deve retornar um valor que nesse caso ser true ou false dependendo do texto definido na string passada como parmetro. Se o texto passado como parmetro for igual ao nome da classe, esse mtodo retornar true. Caso contrrio, retornar o valor False.

ClassParent
Declarao
class function ClassParent: TClass;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

289

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Como pode ser verificado a partir da sua declarao, esse um mtodo de classe e, por ser uma funo, deve retornar um valor que nesse caso ser uma referncia sua classe-base. Observe que o valor retornado por esse mtodo do tipo TClass, declarado da seguinte maneira na unit System.pas:
TClass = class of TObject;

Isso significa que TClass , na realidade, uma varivel que pode armazenar o nome de um tipo de classe, que pode ser a classe TObject, ou qualquer classe dela derivada por herana. Embora esse mtodo no seja til para a classe TObject (que no possui classe-base) pode ser empregada nas demais classes dela derivadas por herana. No caso de TObject, esse mtodo retorna nil.

ClassType
Declarao
function ClassType: TClass;

Como pode ser verificado pela sua declarao, esse mtodo retorna a classe do objeto, e usado internamente pelo Delphi 7 no emprego dos operadores Is e As, a serem descritos posteriormente.

CleanupInstance
Declarao
procedure CleanupInstance;

Esse mtodo automaticamente executado a partir do mtodo Free, e no deve ser chamado diretamente pelo cdigo da sua aplicao. Esse mtodo atribui uma string vazia a campos do tipo string e o valor Unassigned a campos do tipo Variant da classe.

Dispatch
Declarao
procedure Dispatch(var Message);

Esse mtodo responsvel por disparar a execuo de outros mtodos da classe que sejam capazes de manipular mensagens do Windows, baseado no valor passado pelo parmetro Message. Caso nenhum dos mtodos definidos pela classe (ou pelas suas classes ancestrais) seja capaz de manipular a mensagem indicada pelo parmetro Message, o mtodo DefaultHandler da classe ser executado. Isso permite que se d um tratamento s mensagens que no so manipuladas diretamente pelos objetos da classe (o conceito de mensagens ser apresentado posteriormente).

DefaultHandler
Declarao
procedure DefaultHandler(var Message); virtual;

290 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Como pode ser verificado, esse um mtodo virtual, e que pode ser sobrecarregado nas classes derivadas por herana. Conforme descrito no tpico anterior, esse mtodo automaticamente chamado pelo mtodo Dispatch, sempre que a mensagem no for diretamente manipulada por um dos mtodos da classe.

Destroy
Declarao
destructor Destroy; virtual;

Esse mtodo o mtodo destrutor da classe, conforme indicado pela palavra reservada destructor, e tem por finalidade liberar a memria reservada para um objeto (memria esta alocada pelo seu construtor). Como pode ser verificado, esse um mtodo virtual e que pode ser sobrecarregado nas classes derivadas. Conforme descrito anteriormente, geralmente mais seguro executar o mtodo Free, que verifica se o valor armazenado na instncia da classe igual a nil, e s executa o mtodo Destroy se existir memria alocada para o objeto.

FieldAddress
Declarao
function FieldAddress(const Name: ShortString): Pointer;

Esse mtodo retorna, na forma de um Pointer (ponteiro para um endereo de memria sem uma qualificao de tipo), o endereo de um campo do objeto da classe, cujo nome passado como parmetro na forma de uma string. Caso no exista o campo cujo nome passado como parmetro, o mtodo retornar nil.

Free
Declarao
procedure Free;

Esse mtodo, conforme j descrito anteriormente, verifica se existe memria alocada para uma instncia de uma classe, antes de chamar o mtodo destrutor da classe. Lembre-se de que cabe a voc incluir, na implementao do cdigo da sua aplicao, uma linha de cdigo que atribua o valor nil instncia da classe aps a execuo do mtodo Free (isso no necessrio para objetos da VCL e da CLX).

FreeInstance
Declarao
procedure FreeInstance; virtual;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

291

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Esse mtodo libera a memria alocada previamente para uma instncia de uma classe atravs de uma chamada ao seu mtodo NewInstance (a ser descrito a seguir). Esse mtodo no precisa ser manipulado diretamente pelo cdigo da sua aplicao. Entretanto, caso voc tenha sobrecarregado o mtodo NewInstance da classe, deve tambm sobrecarregar esse mtodo, codificando as alteraes necessrias manuteno da compatibilidade entre esses mtodos.

NewInstance
Declarao
class function NewInstance: TObject; virtual;

Esse mtodo um mtodo de classe, e responsvel por alocar a memria necessria a uma nova instncia da classe, retornando o endereo de memria a partir do qual estar armazenada esta instncia recm-criada. Para obter a quantidade de memria a ser alocada para a nova instncia, esse mtodo chama o mtodo InstanceSize da classe, e para criar a nova instncia executa o mtodo InitInstance. Esse mtodo chamado automaticamente pelo construtor da classe, e o cdigo da sua aplicao no deve incluir uma chamada explcita a esse mtodo.

InitInstance
Declarao
class procedure InitInstance(Instance: Pointer): TObject;

Esse mtodo um mtodo de classe, e responsvel por criar a instncia da classe propriamente dita (a ser retornada pelo construtor). Voc no precisa incluir uma chamada explcita a esse mtodo no cdigo da sua aplicao, pois isso feito pelo mtodo NewInstance. Entretanto, caso voc sobrecarregue o mtodo NewInstance, deve incluir, como ltimo comando a ser executado por esse mtodo, uma chamada ao mtodo InitInstance.

InstanceSize
Declarao
class function InstanceSize: Longint;

Esse um mtodo de classe, e determina a quantidade de bytes de memria necessrios para armazenar uma instncia da classe. Geralmente esse mtodo usado internamente pelos mtodos responsveis pela alocao de memria para um objeto, e posterior liberao dessa memria, quando o objeto for destrudo. Se voc possuir um formulrio com um componente chamado Edit1, da classe TEdit e um boto de comando chamado Button1 (da classe TButton) pode descobrir o nmero de bytes ocupados para cada

292 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


um desses componentes incluindo as seguintes linhas de cdigo no procedimento associado ao evento OnClick desse boto de comando:
ShowMessage(IntToStr(Edit1.InstanceSize)); ShowMessage(IntToStr(Button1.InstanceSize));

Ao executar este procedimento, voc descobrir que Edit1 e Button1 ocupam 496 e 484 bytes, respectivamente.

MethodAddress
Declarao
class function MethodAddress(const Name: ShortString): Pointer;

Esse um mtodo de classe, e retorna, na forma de um Pointer (ponteiro para um endereo de memria sem uma qualificao de tipo), o endereo de um mtodo cujo nome passado como parmetro na forma de uma string. Caso no exista o mtodo cujo nome passado como parmetro, o mtodo retornar nil. Geralmente esse mtodo usado internamente pelo Delphi 7, e normalmente no dever ser includa uma chamada explcita a esse mtodo no cdigo da sua aplicao.

MethodName
Declarao
class function MethodName(Address: Pointer): ShortString;

Esse um mtodo de classe, e retorna, na forma de uma string, o nome do mtodo cujo endereo passado como parmetro, na forma de um Pointer (ponteiro para um endereo de memria sem uma qualificao de tipo). Repare que esse mtodo executa a tarefa inversa do mtodo MethodAddress. Caso no exista o mtodo cujo endereo passado como parmetro, o mtodo retornar uma string vazia. Geralmente esse mtodo usado internamente pelo Delphi 7, e normalmente no dever ser includa uma chamada explcita a esse mtodo no cdigo da sua aplicao.

InheritsFrom
Declarao
class function InheritsFrom(AClass: TClass): boolean;

Este um mtodo de classe, e determina se a classe cujo tipo passado como parmetro ou no um ancestral da classe a partir da qual o mtodo executado Evidentemente, se voc passar TObject como parmetro, esse mtodo retornar sempre o valor true, pois todas as classes so derivadas, ainda que indiretamente, da classe TObject.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

293

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

KNOW-HOW EM: CONVERSO DE TIPOS


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7 . Familiaridade com os ambientes de desenvolvimento integrado do Delphi 7.
METODOLOGIA

Apresentao do conceito de converso de tipos.


TCNICA

Implementao do mecanismo de converso de tipos, usando os operadores Is, As e a converso explcita entre classes.

O CONCEITO DE CONVERSO DE TIPOS


A converso de tipos permite que se trate um objeto de uma classe como uma instncia de uma das suas classes-base. Essa tcnica muito til nas seguintes situaes:

Quando se quer realizar uma mesma operao sobre objetos de classes distintas, mas que possuem uma caracterstica semelhante, presente
em uma classe-base comum.

Quando se quer compartilhar um procedimento (que pode estar ou no associado a um evento) entre vrios objetos.
Nesse caso, a soluo consiste em tratar os vrios objetos como se fossem uma instncia da classe-base da qual todas so derivadas (direta ou indiretamente). Para verificar se um objeto uma instncia de uma classe derivada de uma classe-base, deve-se utilizar o operador Is. Para tratar um objeto como uma instncia de uma das suas classes-base, deve-se utilizar o operador As. Os operadores Is e As, bem como a converso explcita entre classes, sero apresentados nos prximos tpicos.

O OPERADOR IS
Existem situaes em que, durante a execuo de um programa, voc precisa verificar se um objeto uma instncia de uma determinada classe, ou de uma das classes dela derivadas por herana. Nesse caso, voc pode utilizar o operador Is, usando a seguinte sintaxe:
<nome_objeto> Is <nome_classe> Considere, a ttulo de exemplificao, o seguinte trecho de cdigo: if (nome_objeto Is nome_classe) then // Cdigo executado se a expresso verdadeira else // Cdigo executado se a expresso falsa

294 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Nesse caso, se o objeto cujo nome nome_objeto for uma instncia da classe nome_classe ou de uma das classes dela derivadas por herana, a expresso ser verdadeira, e retornar o valor true. evidente, portanto, que se nome_classe for igual a TObject, essa expresso retornar sempre o valor true, independente do objeto analisado.

O OPERADOR AS
O operador As permite que um objeto de uma determinada classe seja tratado como uma instncia de uma das suas classes-base. A utilizao do operador As segue esta sintaxe:
<nome_objeto> As <nome_classe>

Em geral, o operador As utilizado para acessar um mtodo ou propriedade da classe-base. Nesse caso, deve-se colocar a expresso anterior entre parnteses, como indicado a seguir:
(nome_objeto As nome_classe).nome_mtodo (nome_objeto As nome_classe).nome_propriedade

Considere, por exemplo, que voc queira limpar o texto exibido em todos os controles do tipo TEdit e TDBEdit existentes em um formulrio, quando o usurio selecionar um boto de comando. Essa situao comum, por exemplo, em formulrios de cadastro de clientes, de produtos, fornecedores ou qualquer outra entidade. Para obter esse resultado, basta definir da seguinte maneira o procedimento associado ao evento OnClick desse boto de comando:
procedure TForm1.Button1Click(Sender: TObject); var i:integer;

begin
for i:= 0 to Componentcount-1 do if Components[i] is TCustomEdit then (Components[i] as TCustomEdit).Text := ; end;

Nesse cdigo, executa-se um looping pelos componentes inseridos no formulrio (definidos pela sua propriedade Components). Para cada um dos componentes, verifica-se se o mesmo um objeto de uma classe derivada da classe TCustomEdit, usando-se para isso o operador Is. Caso o componente seja um objeto de uma classe derivada da classe TCustomEdit, utiliza-se o operador As para efetuar uma converso de tipo e atribuir uma string nula sua propriedade Text.

CONVERSO EXPLCITA ENTRE TIPOS


Como alternativa ao operador As pode-se empregar a converso explcita entre tipos, atravs da qual um objeto tratado como uma instncia de uma das suas classes-base.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

295

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


A converso explcita de tipos segue a seguinte sintaxe:
(Classe-Base)nome_objeto

Em geral, a converso explcita entre tipos utilizada para acessar um mtodo ou propriedade da classe-base. Nesse caso, deve-se colocar a expresso anterior entre parnteses, como indicado a seguir:
((Classe-Base)nome_objeto).nome_mtodo ((Classe-Base)nome_objeto).nome_propriedade

O cdigo apresentado no tpico anterior poderia, portanto, ser reescrito da seguinte maneira:
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:= 0 to Componentcount-1 do if Components[i] is TCustomEdit then (TCustomEdit(Components[i])).Text := ; end;

O IDENTIFICADOR SELF
O identificador Self pode ser utilizado para referenciar a instncia corrente de uma classe em um dos seus mtodos ( semelhante ao identificador this do C++). Por incrvel que parea, isso praticamente tudo o que voc precisa saber sobre esse identificador. Diversos exemplos de utilizao desse identificador sero apresentados ao longo do livro, o que tornar ainda mais fcil a compreenso do seu significado.

KNOW-HOW EM: TRATAMENTO DE EXCEES


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7.
METODOLOGIA

Apresentao do conceito de Exceo e da classe Exception.

TCNICA
Discusso das propriedades e mtodos da classe Exception e das principais classes dela derivadas por herana. Implementao de novas excees.

O CONCEITO DE EXCEES
Excees so erros que ocorrem durante a execuo do seu programa, mas que podem ser tratadas em um bloco de cdigo do tipo tryexceptend. Dessa maneira, seu cdigo pode tratar os erros ocorridos durante a execuo do programa, evitando que a execuo da aplicao seja encerrada de forma brusca.

296 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Para proteger um determinado trecho de cdigo implementado na sua aplicao, deve-se utilizar um bloco tryexceptend, que apresenta a seguinte sintaxe:
try // Bloco de cdigo a ser executado except // Bloco de cdigo a ser executado caso haja algum erro na execuo do bloco de // cdigo anterior end;

Considere, por exemplo, um formulrio no qual existam duas caixas de texto, denominadas EditNum1 e EditNum2, nas quais devem ser digitados dois nmeros reais. Alm disso, considere que esse formulrio possui um boto de comando no qual foi digitado o seguinte cdigo no procedimento associado ao seu evento OnClick:
ShowMessage(FloatToStr(StrToFloat(EditNum1.Text)/StrToFloat(EditNum2.Text)));

Esse cdigo exibe em uma mensagem o resultado da diviso dos valores digitados nas duas caixas de texto. Caso voc execute essa aplicao, digite o valor 4 na primeira caixa de texto e 0 na segunda; ao selecionar o boto de comando ser gerada uma mensagem de erro com o texto:
Floating point division by zero.

Experimente, no entanto, redefinir o trecho de cdigo do procedimento associado ao evento OnClick do boto de comando da seguinte maneira:
try ShowMessage(FloatToStr(StrToFloat(EditNum1.Text)/StrToFloat(EditNum2.Text))); except ShowMessage(Voc digitou valores incorretos); EditNum1.Text := ; EditNum2.Text := ; end;

Nesse caso, se ocorrer algum problema durante a execuo do programa, seja na converso das strings em valores numricos ou na diviso dos nmeros, uma mensagem mais amigvel ser exibida. Alm disso, o contedo das caixas de texto ser apagado. Voc pode, no entanto, definir um tratamento para cada tipo de erro. Para isso, basta redefinir da seguinte maneira o cdigo do procedimento associado ao evento OnClick do boto de comando:
try ShowMessage(FloatToStr(StrToFloat(EditNum1.Text)/StrToFloat(EditNum2.Text))); except On EZeroDivide do begin ShowMessage(Voc digitou valores incorretos); EditNum1.Text := ; EditNum2.Text := ; end; On EconvertError do begin ShowMessage(Erro de Converso); EditNum1.Text := ;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

297

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


EditNum2.Text := ; end; end;

Nesse caso, verifica-se o tipo de erro usando-se a clusula:


on <tipo de exceo> do

Com essa clusula, voc pode definir uma resposta para cada um dos diversos tipos de erros que possam ser gerados durante a execuo do seu aplicativo.

REFERNCIA: A CLASSE EXCEPTION


A classe Exception, codificada na unit SysUtils e reproduzida a seguir, derivada por herana da classe TObject e a classe-base para todas as classes que manipulam excees no Delphi 7. Repare que essa classe no segue a conveno padro do Delphi 7, pela qual o nome de uma classe deve comear com um T.

DEFINIO DA CLASSE EXCEPTION


Reproduzimos a seguir o trecho de cdigo responsvel pela definio da classe Exception.
Exception = class(TObject) private FMessage: string; FHelpContext: Integer; public constructor Create(const Msg: string); constructor CreateFmt(const Msg: string; const Args: array of const); constructor CreateRes(Ident: Integer; Dummy: Extended = 0); constructor CreateResFmt(Ident: Integer; const Args: array of const); constructor CreateHelp(const Msg: string; AHelpContext: Integer); constructor CreateFmtHelp(const Msg: string; const Args: array of const; AHelpContext: Integer); constructor CreateResHelp(Ident: Integer; AHelpContext: Integer); constructor CreateResFmtHelp(Ident: Integer; const Args: array of const; AHelpContext: Integer); property HelpContext: Integer read FHelpContext write FHelpContext; property Message: string read FMessage write FMessage; end;

CAMPOS INTERNOS DA CLASSE EXCEPTION


Conforme pode ser verificado na sua definio, a classe Exception possui os seguintes campos internos, cuja visibilidade definida como private:
FMessage: string; FHelpContext: Integer;

FMessage
Esse campo, do tipo string, define o texto a ser exibido na caixa de dilogo que mostrada quando ocorre um erro definido por essa exceo.

298 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

FHelpContext
Esse campo, do tipo inteiro, armazena o valor que identifica o tpico do arquivo de help on-line associado a essa classe.

MTODOS PBLICOS DA CLASSE EXCEPTION


Create
Declarao
constructor Create (const Msg: string);

Esse um dos mtodos construtores da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetro uma string que ser mostrada na caixa de dilogo exibida quando a exceo ocorrer durante a execuo do programa. Como j foi descrito anteriormente, uma classe pode definir mais de um mtodo construtor, o que ocorre justamente na definio da classe Exception. Como pode ser verificado na codificao do mtodo (reproduzida a seguir), o valor passado como parmetro no construtor da classe armazenado no campo interno FMessage.
constructor Exception.Create(const Msg: string); begin FMessage := Msg; end;

CreateFmt
Declarao
constructor CreateFmt (const Msg: string; const Args: array of const)

Este outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetros uma string que ser mostrada na caixa de dilogo exibida quando a exceo ocorrer durante a execuo do programa, e um array contendo cdigos de formatao para essa string. Como pode ser verificado na codificao do mtodo (reproduzida a seguir), os valores passados como parmetros nesse construtor da classe so passados como parmetros em uma chamada da funo Format, e a string resultante da execuo dessa funo armazenada no campo interno FMessage.
constructor Exception.CreateFmt(const Msg: string; const Args: array of const); begin FMessage := Format(Msg, Args); end;

Os cdigos de formatao so apresentados no item Format Stringsdo Help On-line do Delphi 7.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

299

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

CreateFmtHelp
Declarao
constructor CreateFmtHelp (const Msg: string; const Args: array of const; AHelpContext: Integer);

Este outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetros uma string que ser mostrada na caixa de dilogo exibida quando a exceo ocorrer durante a execuo do programa, um array contendo cdigos de formatao para essa string e um inteiro identificando o tpico do arquivo de help on-line a ser associado classe. Como pode ser verificado na codificao do mtodo (reproduzida a seguir), os dois primeiros valores passados como parmetros nesse construtor da classe so passados como parmetros em uma chamada da funo Format, e a string resultante da execuo dessa funo armazenada no campo interno FMessage. O terceiro parmetro, por sua vez, armazenado no campo interno FhelpContext.
constructor Exception.CreateFmtHelp(const Msg: string; const Args: array of const; AHelpContext: Integer); begin FMessage := Format(Msg, Args); FHelpContext := AHelpContext; end;

CreateHelp
Declarao
constructor CreateHelp (const Msg: string; AHelpContext: Integer);

Este outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetros uma string que ser mostrada na caixa de dilogo exibida quando a exceo ocorrer durante a execuo do programa e um inteiro identificando o tpico do arquivo de help on-line a ser associado classe. A diferena entre esse construtor e o descrito no tpico anterior est no fato de que a string no formatada, no havendo portanto uma chamada funo Format. A codificao deste mtodo reproduzida a seguir.
constructor Exception.CreateHelp(const Msg: string; AHelpContext: Integer); begin FMessage := Msg; FHelpContext := AHelpContext; end;

CreateRes
Declarao
constructor CreateRes (Ident: Integer; Dummy: Extended = 0);

Este outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetro um inteiro que identifica uma string armazenada no arquivo de recursos do seu aplicativo.

300 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Nesse caso, a string a ser armazenada no campo interno FMessage obtida executando-se a funo LoadStr, que retorna a string armazenada no arquivo de recursos identificada pelo valor passado como parmetro. A codificao deste mtodo reproduzida a seguir.
constructor Exception.CreateRes(Ident: Integer); begin FMessage := LoadStr(Ident); end;

CreateResFmt
Declarao
constructor CreateResFmt(Ident: Integer; const Args: array of const);

Esse outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetros um inteiro que identifica uma string armazenada no arquivo de recursos do seu aplicativo e um array contendo cdigos de formatao para essa string. Nesse caso, a string a ser armazenada no campo interno FMessage obtida executando-se a funo Format, passando como parmetro a string resultante de uma chamada funo LoadStr (que retorna a string armazenada no arquivo de recursos identificada pelo valor passado como parmetro). A codificao deste mtodo reproduzida a seguir.
constructor Exception.CreateResFmt(Ident: Integer; const Args: array of const); begin FMessage := Format(LoadStr(Ident), Args); end;

CreateResFmtHelp
Declarao
constructor CreateResFmtHelp(Ident: Integer; const Args: array of const ; AHelpContext: Integer);

Este outro mtodo construtor da classe (responsvel pela alocao da memria necessria aos objetos da classe), e recebe como parmetros um inteiro que identifica uma string armazenada no arquivo de recursos do seu aplicativo, um array contendo cdigos de formatao para essa string e um valor inteiro que identifica o cdigo do arquivo de help associado a essa classe. A diferena entre esse mtodo e o descrito no tpico anterior est na incluso do terceiro parmetro, que identifica o cdigo do arquivo de help associado classe, e cujo valor ser armazenado no campo interno FhelpContext. A codificao deste mtodo reproduzida a seguir.
constructor Exception.CreateResFmtHelp(Ident: Integer; const Args: array of const; AHelpContext: Integer); begin

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

301

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


FMessage := Format(LoadStr(Ident), Args); FHelpContext := AHelpContext; end;

PROPRIEDADES DA CLASSE EXCEPTION


HelpContext
A propriedade HelpContext definida pela seguinte linha de cdigo:
property HelpContext: Integer read FHelpContext write FHelpContext;

Conforme pode ser verificado, o valor atribudo propriedade HelpContext diretamente armazenado no campo FHelpContext. Da mesma forma, ao se tentar obter o valor dessa propriedade, esse tambm obtido diretamente do campo FHelpContext. Repare que, nesse caso, no se definiu nenhum mtodo de leitura ou de escrita, e conseqentemente a propriedade acessa diretamente o valor armazenado em um campo interno da classe.

Message
A propriedade Message definida pela seguinte linha de cdigo.
property Message: string read FMessage write FMessage;

Conforme pode ser verificado, o valor atribudo propriedade Message diretamente armazenado no campo FMessage. Da mesma forma, ao se tentar obter o valor dessa propriedade, esse tambm obtido diretamente do campo FMessage. Repare que, nesse caso, tambm no se definiu nenhum mtodo de leitura ou de escrita, e conseqentemente a propriedade acessa diretamente o valor armazenado em um campo interno da classe.

CLASSES DERIVADAS POR HERANA DA CLASSE EXCEPTION


A classe Exception a classe-base de todas as classes criadas para manipular excees. O Delphi 7 define vrias classes destinadas a manipulao de excees (derivadas de Exception), como pode ser verificado no cdigo-fonte da unit SysUtils. Muitas dessas classes, no entanto, no implementam nenhum campo adicional ou sobrecarregam qualquer dos mtodos definidos na classe-base. Nesses casos, essas classes servem apenas como um alias ou apelido para a classe Exception, a serem utilizadas em determinadas situaes. N prximo tpico ser apresentada a sintaxe necessria gerao de uma exceo.

O MECANISMO UTILIZADO NA GERAO DE EXCEES


Para gerar uma exceo deve-se usar o comando raise, seguido pela execuo do mtodo construtor da classe correspondente exceo a ser gerada.

302 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Considere, por exemplo, a definio da seguinte exceo, denominada ERendimento Error:
ERendimento Error = Class(Exception);

Essa classe pode ser usada para exibir uma mensagem de erro para o usurio da classe, sempre que se tentar atribuir um valor incorreto para o campo. Para isso, podemos redefinir a classe TContribuinte (j definida anteriormente) da maneira mostrada a seguir.
TContribuinte = Class private // Campos e mtodos privados devem ser definidos aqui. FRendimento : double; Fimposto : double; public procedure SetRendimento (valor : double); function calcula_imposto:double; property rendimento : double read FRendimento write SetRendimento; property imposto : double read calcula_imposto; protected // Campos e mtodos protegidos devem ser definidos aqui. end; function TContribuinte.calcula_imposto:double; begin if (FRendimento < 900.0) then Fimposto := 0.0; if (FRendimento > 1800) then Fimposto := 0.25*rendimento -315.0; if (FRendimento >= 900)and(FRendimento <= 1800) then Fimposto := 0.15*rendimento -135.0; result := Fimposto; end; procedure TContribuinte.SetRendimento (Valor : double); begin if valor < 0 then raise ERendimentoError.Create(Rendimento No pode ser Negativo) else FRendimento := valor; end;

Dessa maneira, se voc tentar atribuir um valor negativo propriedade rendimento de uma instncia da classe TContribuinte, ser exibida uma caixa de dilogo com a mensagem Rendimento No pode ser Negativo (ainda bem!). As excees permitem, portanto, que se faa um tratamento diferenciado em funo do tipo de erro que provoca uma interrupo na execuo normal de um programa. Voc pode tratar o erro descrito anteriormente em um bloco try..except semelhante ao mostrado no seguinte trecho de cdigo, onde valor uma varivel do tipo double:
try contribuinte1.rendimento := valor; except on ERendimento Error do ShowMessage(Rendimento No pode ser Negativo); end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

303

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

KNOW-HOW EM: MANIPULAO DE LISTAS DE OBJETOS


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7.
METODOLOGIA

Apresentao da classe TList, que permite a manipulao de listas de objetos.


TCNICA

Implementao de classes derivadas da classe TList, de forma a ilustrar o mecanismo de manipulao de listas de objetos.

APRESENTAO DO PROBLEMA
Considere a seguinte situao: sua aplicao define uma determinada classe, e precisa manipular uma lista de objetos dessa classe. Vamos considerar novamente a classe TPessoa_Fisica, derivada da classe TContribuinte, qual ser acrescida o campo nome, do tipo string, como a seguir:
TPessoa_Fisica = Class(TContribuinte) nome: string; end;

Caso a sua aplicao necessite manipular uma lista de contribuintes do tipo pessoa fsica, a princpio seria necessrio criar uma nova classe com essa finalidade. A fim de facilitar o trabalho do desenvolvedor, o Delphi 7 inclui entre as diversas classes disponveis a classe TList, que declara a maioria dos mtodos necessrios manipulao de listas de objetos. importante, no entanto, ressaltar que uma instncia de uma classe armazena, na realidade, um endereo para um objeto da classe, e no o objeto propriamente dito embora o Delphi 7 torne o acesso ao objeto da classe to transparente que muitos consideram que o objeto esteja sendo acessado diretamente. Quando manipulamos um objeto (ou instncia) de uma classe estamos na realidade acessando o endereo ocupado pelo objeto a questo que o Delphi 7 trata de desreferenciar o ponteiro. J que o ambiente de desenvolvimento tratou de simplificar essa tarefa, no vamos nos deter em explicar a aritmtica de ponteiros definida na linguagem Object Pascal seria complicar aquilo que j foi simplificado na contramo da produtividade desejada por aqueles que utilizam o Delphi 7 como ferramenta de desenvolvimento. importante, no entanto, que esse conceito fique bem claro pelo leitor: embora tudo se passe como se estivssemos acessando diretamente uma instncia da classe, o nome do objeto armazena na realidade o endereo do objeto. Conforme ser visto a seguir, a classe TList manipula endereos de objetos, e no armazena os objetos propriamente ditos. Podemos portanto pensar em criar a classe TListaContribuinte a partir da classe TList, aproveitando as caractersticas j disponveis para essa classe. Apresentamos a seguir a descrio das principais propriedades, mtodos e eventos da classe TList.

304 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

REFERNCIA: A CLASSE TLIST


A classe TList, codificada na unit Classes e reproduzida a seguir, derivada por herana da classe TObject e a classe-base para todas as classes que manipulam listas de objetos no Delphi 7.

DEFINIO DA CLASSE TLIST


Reproduzimos a seguir o trecho de cdigo responsvel pela definio da classe TList.
TList = class(TObject) private FList: PPointerList; FCount: Integer; FCapacity: Integer; protected function Get(Index: Integer): Pointer; procedure Grow; virtual; procedure Put(Index: Integer; Item: Pointer); procedure SetCapacity(NewCapacity: Integer); procedure SetCount(NewCount: Integer); public destructor Destroy; override; function Add(Item: Pointer): Integer; procedure Clear; dynamic; procedure Delete(Index: Integer); class procedure Error(const Msg: string; Data: Integer); virtual; procedure Exchange(Index1, Index2: Integer); function Expand: TList; function First: Pointer; function IndexOf(Item: Pointer): Integer; procedure Insert(Index: Integer; Item: Pointer); function Last: Pointer; procedure Move(CurIndex, NewIndex: Integer); function Remove(Item: Pointer): Integer; procedure Pack; procedure Sort(Compare: TListSortCompare); property Capacity: Integer read FCapacity write SetCapacity; property Count: Integer read FCount write SetCount; property Items[Index: Integer]: Pointer read Get write Put; default; property List: PPointerList read FList; end;

PROPRIEDADES DA CLASSE TLIST


Apresentamos a seguir a descrio das propriedades definidas para a classe TList.

Capacity
Essa propriedade declarada como uma varivel inteira, e retorna o nmero de objetos que podem ser referenciados na lista. Essa propriedade retorna o nmero de objetos que a lista capaz de referenciar, e no o nmero de objetos que realmente esto sendo endereados pela lista, o que definido pela sua propriedade Count (a ser vista a seguir). Inicialmente (quando a lista criada) o seu valor igual a 0, mas alterado durante a manipulao da lista.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

305

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Count
Essa propriedade declarada como uma varivel inteira, e retorna o nmero de objetos referenciados na lista e no o nmero de objetos que podem vir a ser endereados pela mesma, o que definido pela sua propriedade Capacity, descrita anteriormente. O valor da propriedade Count pode ser inferior ao definido pela propriedade Capacity, pois a lista pode, eventualmente, enderear ponteiros nulos (que armazenam o valor nil). Para remover essas referncias a endereos nos quais no est armazenado nenhum objeto, deve-se utilizar o mtodo Pack da classe, a ser descrito posteriormente.

Items
Essa propriedade armazena, na forma de um array, as referncias a todos os objetos endereados pela lista. Esse array inicia com o ndice 0 e, conseqentemente, o endereo do primeiro objeto referenciado pela lista estar armazenado em Items[0].

List
Essa propriedade armazena, na forma de um array, os endereos de todos os objetos da lista (as variveis do tipo Pointer que armazenam os endereos dos objetos referenciados pela lista).

PRINCIPAIS MTODOS DA CLASSE TLIST


Add
Declarao
function Add(Item: Pointer): Integer;

Esse mtodo adiciona uma referncia a um objeto no final da lista, e retorna um valor inteiro que retorna o ndice dessa referncia no array (esse ndice comea em zero).

Clear
Declarao
procedure Clear; dynamic;

Esse mtodo remove todas as referncias a objetos da lista, e atribui o valor 0 s propriedades Count e Capacity.

Delete
Declarao
procedure Delete(Index: Integer);

306 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Esse mtodo remove da lista o endereo do objeto cujo ndice passado como parmetro. Conseqentemente, o ndice das referncias a objetos cujo ndice atual superior ao da referncia removida da lista tem o seu valor reduzido em uma unidade.

Destroy
Declarao
destructor Destroy; override;

Este o mtodo destrutor da classe, responsvel por remover todas as referncias a objetos da lista. Aconselha-se utilizar o mtodo Free (herdado da classe TObject) em vez do mtodo Destroy, pois, conforme j descrito anteriormente, o mtodo Free verifica se o valor do endereo igual a nil antes de chamar o mtodo destrutor da classe. importante destacar que esse mtodo no destri os objetos propriamente ditos, mas sim as suas referncias na lista. Para destruir cada objeto, deve-se chamar seu prprio mtodo construtor.

Error
Declarao
class procedure Error(const Msg: string; Data: Integer); virtual;

Este mtodo deve ser usado para gerar uma exceo caso ocorra algum erro durante a manipulao dos objetos da lista, e recebe como parmetros uma string e um valor inteiro que pode ser usado para indicar a causa do erro.

Exchange
Declarao
procedure Exchange(Index1, Index2: Integer);

Esse mtodo troca a posio na lista das referncias a dois objetos cujos ndices so passados como parmetros.

Expand
Declarao
function Expand: TList;

Esse mtodo expande a capacidade da lista. Se Count = Capacity, o valor da propriedade Capacity incrementado de acordo com as seguintes regras:

Se o valor da propriedade Capacity maior do que 8, seu valor incrementado em 16 unidades. Se o valor da propriedade Capacity maior do que 4 e menor ou igual a 8, seu valor
incrementado em 8 unidades.

Se o valor da propriedade Capacity menor do que 4, seu valor incrementado em 4 unidades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

307

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

First
Declarao
function First: Pointer;

Esse mtodo retorna em um ponteiro o endereo do primeiro objeto referenciado pela lista.

IndexOf
Declarao
function IndexOf(Item: Pointer): Integer;

Esse mtodo retorna o ndice da referncia a objeto cujo endereo passado como parmetro.

Insert
Declarao
procedure Insert(Index: Integer; Item: Pointer);

Esse mtodo insere, na posio da lista definida pelo ndice cujo valor passado como primeiro parmetro, o endereo do objeto a ser referenciado, que passado como segundo parmetro na forma de um ponteiro. Conseqentemente, o ndice dos objetos cujo ndice atual igual ou superior ao do objeto inserido na lista tem o seu valor incrementado em uma unidade.

Last
Declarao
function Last: Pointer;

Esse mtodo retorna em um ponteiro o endereo do ltimo objeto referenciado pela lista.

Move
Declarao
procedure Move(CurIndex, NewIndex: Integer);

Esse mtodo move a referncia ao objeto definida pelo ndice passado como primeiro parmetro para a posio indicada pelo ndice passado como segundo parmetro.

Pack
Declarao
procedure Pack;

308 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Esse mtodo remove todos os itens que no referenciam qualquer objeto, isto , que armazenam o valor nil, para o incio da lista e reduz o valor da propriedade Count para o nmero de objetos realmente referenciados pela lista. Esse mtodo, no entanto, no libera a memria usada para armazenar os ponteiros cujo valor nil (o que pode ser feito atribuindo-se propriedade Capacity o valor armazenado na propriedade Count).

Remove
Declarao
function Remove(Item: Pointer): Integer;

Esse mtodo remove da lista a referncia ao objeto cujo endereo passado como parmetro na forma de um ponteiro, retornando o ndice do objeto cuja referncia na lista foi removida. Conseqentemente, o ndice das referncias a objetos cujo ndice atual superior ao do objeto removido da lista tem o seu valor reduzido em uma unidade.

Sort
Declarao
procedure Sort(Compare: TListSortCompare);

Esse mtodo ordena os itens da lista usando o algoritmo QuickSort, usando como valor para definir essa ordenao o retornado pela funo passada como parmetro. Essa funo deve receber como parmetros dois ponteiros que referenciam itens da lista e retorna:

Um valor negativo (< 0), se o objeto referenciado por item1 , segundo o critrio de ordenao
definido no corpo da funo, menor do que o objeto referenciado por item2.

Um valor nulo (= 0), se o objeto referenciado por item1 , segundo o critrio de ordenao
definido no corpo da funo, igual ao objeto referenciado por item2.

Um valor positivo (> 0), se o objeto referenciado por item1 , segundo o critrio de ordenao
definido no corpo da funo, maior do que o objeto referenciado por item2. O cabealho da funo usada na ordenao dos itens da lista definido pelo tipo TListSortCompare, indicado a seguir.
type TListSortCompare = function (Item1, Item2: Pointer): Integer;

EXEMPLO DE UTILIZAO
Nesse tpico apresentaremos um exemplo de utilizao de uma classe derivada da classe TList.

DEFINIO DA INTERFACE
Inicialmente dever ser definida uma nova aplicao, composta por um formulrio no qual sero inseridos vrios componentes, com as propriedades descritas a seguir:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

309

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Formulrio:
Name: FormListaObjetos Caption: Formulrio Para a Manipulao de Listas de Objetos Position: poScreenCenter

Boto de Figura:
Name: BotaoFechar Kind: bkClose Caption: &Fechar

GroupBoxes:
Name: GroupBoxDados Caption: Dados do Contribuinte Name: GroupBoxOperacoes Caption: Operaes Sobre a Lista Name: GroupBoxPesquisa Caption: Digite o Nome do Contribuinte a Pesquisar Objetos a serem inseridos dentro do GroupBox GroupBoxDados:

Labels:
Name: LabelNome Caption: Nome: Name: LabelRendimento Caption: Rendimento: Name: LabelImposto Caption: Imposto: Name: LabelValorImposto Caption: 0.0

Caixas de Texto:
Name: EditNome Text: Name: EditRendimento Text: Objetos a serem inseridos dentro do GroupBox GroupBoxOperacoes:

Botes de Comando:
Name: BotaoAdiciona Caption: Adiciona

310 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Name: BotaoInsere Caption: Insere Name: BotaoRemove Enabled: False Caption: Remove Name: BotaoOrdena Caption: Ordena Name: BotaoPrimeiro Caption: Primeiro Name: BotaoAnterior Caption: Anterior Name: BotaoProximo Caption: Prximo Name: BotaoUltimo Caption: ltimo Objetos a serem inseridos dentro do GroupBox GroupBoxPesquisa:

Caixas de Texto:
Name: EditPesquisa Text: Reposicione e redimensione estes componentes para que o formulrio fique com o aspecto mostrado na figura a seguir.

Figura 19.5: Aspecto do formulrio usado no exemplo de manipulao de listas.

CODIFICAO DO EXEMPLO
Ser criada uma classe chamada TListaContribuinte, destinada a manipular uma lista de objetos da classe TPessoa_Fisica, na qual sero includos mtodos no existentes em sua classe ancestral (TList).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

311

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


A definio dessa classe deve ser feita na seo type da unit associada a esse formulrio, mediante a incluso das seguintes linhas de cdigo:
TContribuinte = Class private // Campos e mtodos privados devem ser definidos aqui. FRendimento : double; Fimposto : double; public procedure SetRendimento (valor : double); function calcula_imposto:double; property rendimento : double read FRendimento write SetRendimento; property imposto : double read calcula_imposto; protected // Campos e mtodos protegidos devem ser definidos aqui. end; ERendimento = Class(Exception); TPessoa_Fisica = class(TContribuinte) nome: string; end; TListaContribuinte = class(TList) procedure PesquisaNome(Nome:String); destructor Destroy;override; end;

Repare que inclumos ainda as definies das classes TContribuinte (ancestral da classe TPessoa_Fisica) e ERendimentoError (exceo manipulada pela classe TContribuinte). Repare ainda que, nesse caso, optamos por manter o campo rendimento definido na classe TContribuinte, de maneira a aproveitar o cdigo j escrito em tpicos anteriores. O nico campo acrescentado na definio da classe TPessoa_Fisica foi o campo nome, do tipo string. A classe TListaContribuinte, derivada por herana da classe TList, acrescenta na sua definio os mtodos PesquisaNome e Destroy (que sobrecarrega o mtodo de mesmo nome definido na classe-base). Para criar o corpo principal de um mtodo da classe, basta selecionar simultaneamente as teclas Ctrl, Shift e C aps digitar as declaraes dos mtodos na definio da classe. O ambiente de desenvolvimento vai gerar automaticamente o corpo principal dos mtodos na seo Implementation da unit. Declare as seguintes variveis na seo var da unit:
ListaContribuinte : TListaContribuinte; indiceatual : integer;

O objeto ListaContribuinte, da classe TListaContribuinte, ser usado para representar a lista que manipular os objetos. A varivel indiceatual, do tipo inteiro, ser usada para armazenar o ndice do objeto cujos valores so exibidos no momento.

312 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Para alocar a memria necessria ao objeto ListaContribuinte, deve-se fazer uma chamada ao seu mtodo construtor no procedimento associado ao evento OnCreate do formulrio, que deve ser codificado da seguinte maneira:
procedure TFormListaObjetos.FormCreate(Sender: TObject); begin ListaContribuinte := TListaContribuinte.Create; end;

Para liberar a memria alocada ao trmino da execuo da aplicao, basta definir da seguinte maneira o procedimento associado ao evento OnDestroy do formulrio:
procedure TFormListaObjetos.FormDestroy(Sender: TObject); begin ListaContribuinte.Free; end;

Para permitir ao usurio adicionar um elemento lista, deve-se definir da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoAdicionar:
procedure TFormListaObjetos.BotaoAdicionaClick(Sender: TObject); var Contribuinte: TPessoa_Fisica; begin Contribuinte := TPessoa_Fisica.Create; Contribuinte.Nome := EditNome.Text; Contribuinte.rendimento := StrToFloat(EditRendimento.Text); ListaContribuinte.Add(Contribuinte); indiceatual := ListaContribuinte.Count-1; LabelValorImposto.Caption:=FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); BotaoRemove.Enabled := True; end;

Repare que esse procedimento declara uma instncia local da classe TPessoa_Fisica, e que a chamada ao seu mtodo Create retorna uma nova instncia da classe, o que feito mediante a incluso da seguinte linha de cdigo:
Contribuinte := TPessoa_Fisica.Create;

Em seguida, atribuem-se valores aos campos Nome e rendimento da classe, o que feito mediante a incluso das seguintes linhas de cdigo:
Contribuinte.Nome := EditNome.Text; Contribuinte.rendimento := StrToFloat(EditRendimento.Text);

A adio do objeto lista feita mediante uma chamada ao mtodo Add da classe TListaContribuinte, mediante a incluso da seguinte linha de cdigo:
ListaContribuinte.Add(Contribuinte);

Por fim, o valor do ndice atual e o texto exibido no label LabelValorImposto so atualizados, o que feito mediante a incluso das seguintes linhas de cdigo:
indiceatual := ListaContribuinte.Count-1; LabelValorImposto.Caption:=FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

313

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Repare a converso explcita de tipos empregada nesse cdigo. Isso se deve ao fato de que a propriedade Items da classe TList (e conseqentemente da classe TListaContribuinte) nos fornece os endereos dos objetos manipulados pela lista e, como sabemos que os objetos so da classe TPessoa_Fisica, podemos realizar essa converso com segurana. Para permitir que o usurio possa remover posteriormente os objetos adicionados lista, deve-se habilitar o componente BotaoRemove, o que feito mediante a incluso da seguinte linha de cdigo:
BotaoRemove.Enabled := True;

Para permitir ao usurio inserir um elemento na lista, deve-se definir da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoInsere:
procedure TFormListaObjetos.BotaoInsereClick(Sender: TObject); var Contribuinte: TPessoa_Fisica; begin Contribuinte := TPessoa_Fisica.Create; Contribuinte.Nome := EditNome.Text; Contribuinte.rendimento := StrToFloat(EditRendimento.Text); ListaContribuinte.Insert(indiceatual, Contribuinte); BotaoRemove.Enabled := True; end;

Esse cdigo muito semelhante ao definido para o procedimento associado ao evento OnClick do componente BotaoAdiciona, exceto que se utiliza nesse caso o mtodo Insert em vez do mtodo Add da classe TListaContribuinte. Para permitir ao usurio remover um elemento na lista, deve-se definir da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoRemove:
procedure TFormListaObjetos.BotaoRemoveClick(Sender: TObject); begin ListaContribuinte.Delete(indiceatual); if indiceatual > ListaContribuinte.Count-1 then indiceatual := ListaContribuinte.Count-1; if ListaContribuinte.Count > 0 then begin EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text:=FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]). rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end else begin EditNome.Clear; EditRendimento.Clear; LabelValorImposto.Caption := ; BotaoRemove.Enabled := False; end; end;

importante, inicialmente, verificar que esse procedimento s ser executado se a propriedade Enabled do componente for igual a True.

314 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Inicialmente remove-se o objeto atual da lista (e cujo ndice identificado pela varivel indiceatual) mediante uma chamada ao mtodo Delete da classe TListaContribuinte, o que feito mediante a incluso da seguinte linha de cdigo:
ListaContribuinte.Delete(indiceatual);

Em seguida, verifica-se se o valor armazenado na varivel ndice atual est dentro dos limites possveis para o ndice do array, o que feito mediante a incluso da seguinte linha de cdigo:
if indiceatual > ListaContribuinte.Count-1 then indiceatual := ListaContribuinte.Count-1;

Por fim, verifica-se se ainda existem elementos na lista (analisando-se o valor da propriedade Count do objeto ListaContribuinte), e atualizam-se corretamente os valores exibidos nas caixas de texto e no label LabelValorImposto, o que feito mediante a incluso do seguinte trecho de cdigo:
if ListaContribuinte.Count > 0 then begin EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text:=FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]). rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end else begin EditNome.Clear; EditRendimento.Clear; LabelValorImposto.Caption := ; BotaoRemove.Enabled := False; end;

Repare que, se no houver mais objetos na lista, o boto BotaoRemove desabilitado, mediante a incluso da seguinte linha de cdigo:
Enabled := False;

Para permitir ao usurio exibir os dados armazenados no primeiro objeto da classe, deve-se definir da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoPrimeiro:
procedure TFormListaObjetos.BotaoPrimeiroClick(Sender: TObject); begin ListaContribuinte.First; indiceatual := 0; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end;

Inicialmente, faz-se uma chamada ao mtodo First da classe TListaContribuinte, mediante a incluso da seguinte linha de cdigo:
ListaContribuinte.First;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

315

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Em seguida atualizam-se o valor da varivel indiceatual que deve ser igual ao ndice do primeiro elemento da lista isto , 0, o que feito mediante a incluso da seguinte linha de cdigo:
indiceatual := 0;

Por fim, atualizam-se os valores exibidos nas caixas de texto e no label LabelValorImposto, o que feito mediante a incluso das seguintes linhas de cdigo:
EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto);

Os procedimentos associados ao evento OnClick dos componentes BotaoProximo, BotaoUltimo e BotaoAnterior tm codificao semelhante, sendo sua definio reproduzida a seguir.
procedure TFormListaObjetos.BotaoAnteriorClick(Sender: TObject); begin if indiceatual > 0 then indiceatual := indiceatual-1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]). rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.BotaoProximoClick(Sender: TObject); begin if indiceatual < ListaContribuinte.Count-1 then indiceatual := indiceatual+1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.BotaoUltimoClick(Sender: TObject); begin ListaContribuinte.Last; indiceatual := ListaContribuinte.Count-1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end;

O nico cuidado que se deve ter na codificao desses procedimentos se refere a garantir que os limites do ndice do array sejam respeitados. O mtodo PesquisaNome da classe TListaContribuinte deve ser capaz de retornar o ndice do objeto manipulado pela lista cujo valor armazenado no campo Nome seja igual ao da string passada como parmetro. Apresenta-se a seguir a codificao desse mtodo:
procedure TListaContribuinte.PesquisaNome(Nome: String); var i : integer;

316 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


begin First; indiceatual := 0; for i := 0 to Count-1 do begin if TPessoa_Fisica(Items[i]).Nome = Nome then begin indiceatual := i; Exit; end; end; end;

Nesse procedimento, define-se uma varivel local i a ser usada no loop de pesquisa. Inicialmente define-se o objeto corrente como sendo o primeiro objeto manipulado pela lista, mediante uma chamada ao mtodo First da classe TListaContribuinte, o que feito mediante a incluso da seguinte linha de cdigo:
First;

Alm disso, atribui-se o valor 0 varivel ndice atual:


indiceatual := 0;

Por fim, efetua-se um looping pelos objetos referenciados pela lista, at que se encontre um objeto cujo valor armazenado no campo Nome igual ao da string passada como parmetro (atribuindo-se o valor atual do contador varivel indiceatual).
for i := 0 to Count-1 do begin if TPessoa_Fisica(Items[i]).Nome = Nome then begin indiceatual := i; Exit; end; end;

Repare que nesse caso implementou-se uma pesquisa exata, e no uma pesquisa aproximada. Para permitir ao usurio ordenar os objetos referenciados pela lista, deve-se definir da seguinte maneira o procedimento associado ao evento OnClick do componente BotaoOrdena:
procedure TFormListaObjetos.BotaoOrdenaClick(Sender: TObject); begin ListaContribuinte.Sort(Compara); end;

O cdigo desse procedimento consiste apenas em uma chamada ao mtodo Sort da classe TListaContribuinte, o que feito mediante a incluso da seguinte linha de cdigo:
ListaContribuinte.Sort(Compara);

Falta ainda definir a funo a ser usada pelo algoritmo QuickSort. Nesse caso, definiu-se uma funo denominada Compara, e implementada da seguinte maneira:
function Compara(indice1, indice2: Pointer): integer;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

317

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


begin result:=AnsiCompareText(TPessoa_Fisica(indice1).Nome,TPessoa_Fisica(indice2).Nome); end;

Repare que essa funo utiliza a funo AnsiCompareText, definida na unit SysUtils, e que compara duas strings sem levar em considerao se a letra est em caixa alta ou caixa baixa. Por fim, falta apresentar a definio do mtodo destrutor da classe TListaContribuinte, cuja codificao reproduzida a seguir:
destructor TListaContribuinte.Destroy; var i : integer; begin for i:= 0 to Count-1 do begin TPessoa_Fisica(Items[i]).Destroy; end; end;

Repare que esse mtodo responsvel por liberar a memria alocada para todos os objetos referenciados pela lista. Para simplificar a digitao de novos valores pelo usurio, os procedimentos associados ao evento OnEnter das caixas de texto EditNome e EditRendimento devem ser implementados da seguinte maneira:
procedure TFormListaObjetos.EditNomeEnter(Sender: TObject); begin EditNome.Clear; LabelValorImposto.Caption := 0.0; end; procedure TFormListaObjetos.EditRendimento Enter(Sender: TObject); begin EditRendimento.Clear; end;

Apresentamos a seguir o cdigo completo da unit Ulista:


unit Ulista; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls; type TFormListaObjetos = class(TForm) GroupBoxDados: TGroupBox; LabelNome: TLabel; EditNome: TEdit; LabelRendimento: TLabel; EditRendimento: TEdit; GroupBoxOperacoes: TGroupBox; BotaoAdiciona: TButton; BotaoInsere: TButton; BotaoRemove: TButton; BotaoOrdena: TButton; BotaoPrimeiro: TButton; BotaoAnterior: TButton; BotaoProximo: TButton; BotaoUltimo: TButton; BotaoFechar: TBitBtn;

318 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


LabelImposto: TLabel; LabelValorImposto: TLabel; GroupBoxPesquisa: TGroupBox; EditPesquisa: TEdit; procedure FormCreate(Sender: TObject); procedure BotaoAdicionaClick(Sender: TObject); procedure BotaoInsereClick(Sender: TObject); procedure BotaoOrdenaClick(Sender: TObject); procedure BotaoPrimeiroClick(Sender: TObject); procedure BotaoAnteriorClick(Sender: TObject); procedure BotaoProximoClick(Sender: TObject); procedure BotaoUltimoClick(Sender: TObject); procedure EditPesquisaChange(Sender: TObject); procedure EditNomeEnter(Sender: TObject); procedure EditRendimento Enter(Sender: TObject); procedure BotaoRemoveClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; TContribuinte = Class private // Campos e mtodos privados devem ser definidos aqui. FRendimento : double; Fimposto : double; public procedure SetRendimento (valor : double); function calcula_imposto:double; property Rendimento : double read FRendimento write SetRendimento; property imposto : double read calcula_imposto; protected // Campos e mtodos protegidos devem ser definidos aqui. end; ERendimento Error = Class(Exception); TPessoa_Fisica = class(TContribuinte) nome: string; end; TListaContribuinte = class(TList) procedure PesquisaNome(Nome:String); destructor Destroy;override; end; function Compara(indice1, indice2 : Pointer):integer; var FormListaObjetos: TFormListaObjetos; ListaContribuinte : TListaContribuinte; indiceatual : integer; implementation {$R *.DFM} { TListaContribuinte } function Compara(indice1, indice2: Pointer): integer; begin result := AnsiCompareText(TPessoa_Fisica(indice1).Nome,TPessoa_Fisica(indice2).Nome);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

319

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


end; destructor TListaContribuinte.Destroy; var i : integer; begin for i:= 0 to Count-1 do begin TPessoa_Fisica(Items[i]).Destroy; end; end; procedure TListaContribuinte.PesquisaNome(Nome: String); var i : integer; begin First; indiceatual := 0; for i := 0 to Count-1 do begin if TPessoa_Fisica(Items[i]).Nome = Nome then begin indiceatual := i; Exit; end; end; end; procedure TFormListaObjetos.FormCreate(Sender: TObject); begin ListaContribuinte := TListaContribuinte.Create; end; function TContribuinte.calcula_imposto:double; begin if (FRendimento < 900.0) then Fimposto := 0.0; if (FRendimento > 1800) then Fimposto := 0.25*rendimento -315.0; if (FRendimento >= 900)and(FRendimento <= 1800) then Fimposto := 0.15*rendimento -135.0; result := Fimposto; end; procedure TContribuinte.SetRendimento (Valor : double); begin if valor < 0 then raise ERendimentoError.Create(Rendimento No pode ser Negativo) else FRendimento := valor; end; procedure TFormListaObjetos.BotaoAdicionaClick(Sender: TObject); var Contribuinte: TPessoa_Fisica; begin Contribuinte := TPessoa_Fisica.Create; Contribuinte.Nome := EditNome.Text; Contribuinte.Rendimento := StrToFloat(EditRendimento.Text); ListaContribuinte.Add(Contribuinte); indiceatual := ListaContribuinte.Count-1; LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); BotaoRemove.Enabled := True; end;

320 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


procedure TFormListaObjetos.BotaoInsereClick(Sender: TObject); var Contribuinte: TPessoa_Fisica; begin Contribuinte := TPessoa_Fisica.Create; Contribuinte.Nome := EditNome.Text; Contribuinte. rendimento := StrToFloat(EditRendimento.Text); ListaContribuinte.Insert(indiceatual, Contribuinte); BotaoRemove.Enabled := True; end; procedure TFormListaObjetos.BotaoOrdenaClick(Sender: TObject); begin ListaContribuinte.Sort(Compara); end; procedure TFormListaObjetos.BotaoPrimeiroClick(Sender: TObject); begin ListaContribuinte.First; indiceatual := 0; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.BotaoAnteriorClick(Sender: TObject); begin if indiceatual > 0 then indiceatual := indiceatual-1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.BotaoProximoClick(Sender: TObject); begin if indiceatual < ListaContribuinte.Count-1 then indiceatual := indiceatual+1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.BotaoUltimoClick(Sender: TObject); begin ListaContribuinte.Last; indiceatual := ListaContribuinte.Count-1; EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.EditPesquisaChange(Sender: TObject); begin ListaContribuinte.PesquisaNome(EditPesquisa.Text); EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

321

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end; procedure TFormListaObjetos.EditNomeEnter(Sender: TObject); begin EditNome.Clear; LabelValorImposto.Caption := 0.0; end; procedure TFormListaObjetos.EditRendimento Enter(Sender: TObject); begin EditRendimento.Clear; end; procedure TFormListaObjetos.BotaoRemoveClick(Sender: TObject); begin ListaContribuinte.Delete(indiceatual); if indiceatual > ListaContribuinte.Count-1 then indiceatual := ListaContribuinte.Count-1; if ListaContribuinte.Count > 0 then begin EditNome.Text := TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).Nome; EditRendimento.Text := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).rendimento); LabelValorImposto.Caption := FloatToStr(TPessoa_Fisica(ListaContribuinte.Items[indiceatual]).calcula_imposto); end else begin EditNome.Clear; EditRendimento.Clear; LabelValorImposto.Caption := ; BotaoRemove.Enabled := False; end; end; procedure TFormListaObjetos.FormDestroy(Sender: TObject); begin ListaContribuinte.Free; end; end.

Evidentemente esse exemplo pode ser ainda mais incrementado pelo leitor, pois nosso objetivo aqui foi apresentar as tcnicas fundamentais relacionadas manipulao de listas de objetos. Um dos problemas que deve ter sido verificado pelo leitor a ausncia de persistncia de dados, ou seja, os dados so manipulados apenas em memria e perdidos aps o trmino da aplicao.

KNOW-HOW EM: SOBRECARGA DE MTODOS


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7.
METODOLOGIA

Apresentao do conceito de sobrecarga de mtodos.

322 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7

O CONCEITO DE SOBRECARGA DE MTODOS


Conforme voc j deve ter verificado, muitas classes tm diversos construtores, cada um com um nome distinto (um exemplo tpico o da classe Exception, j apresentada). Isso decorre do fato de que, at a verso 3, o Delphi no permitia a utilizao do recurso de sobrecarga de mtodos (j existente h muito tempo no C++) recurso este que permite que se definam vrios mtodos de mesmo nome, mas com uma lista de parmetros distintos (em quantidade e/ou tipo). A classe TContribuinte, por exemplo, poderia definir dois mtodos construtores, recodificando a classe da seguinte maneira:
TContribuinte = Class private // Campos e mtodos privados devem ser definidos aqui. FRendimento : double; Fimposto : double; public constructor Create;overload; constructor Create(rendimento_inicial : double);overload; procedure SetRendimento (valor : double); function calcula_imposto:double; property rendimento : double read FRendimento write SetRendimento; property imposto : double read calcula_imposto; protected // Campos e mtodos protegidos devem ser definidos aqui. end;

As implementaes dos mtodos seriam feitas da seguinte maneira:


constructor TContribuinte.Create(rendimento_inicial: double); begin inherited Create; rendimento := rendimento_inicial; end; constructor TContribuinte.Create; begin inherited Create; rendimento := 0.0; end;

Repare que, agora, a classe possui dois mtodos de mesmo nome, mas com uma lista de parmetros distinta. A nica exigncia que deve ser atendida ao se sobrecarregar um mtodo consiste em incluir na sua declarao a palavra reservada overload, conforme exemplificado anteriormente. importante destacar que esse recurso pode ser aplicado a qualquer mtodo da classe, e no apenas aos seus construtores, e que os cdigos dos mtodos sobrecarregados podem ser inteiramente distintos. Nesse caso, as duas linhas de cdigo a seguir so igualmente vlidas:
Contribuinte := TContribuinte.Create;

e
Contribuinte := TContribuinte.Create(1000.00);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

323

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


A diferena que, no primeiro caso, a instncia da classe ao ser criada atribui o valor 0.0 ao campo rendimento, enquanto que, no segundo caso, esse campo recebe o valor passado como parmetro.

O recurso de sobrecarga tambm pode ser empregado em funes e procedimentos que no sejam mtodos de uma classe.

KNOW-HOW EM: DEFINIO DE PARMETROS DEFAULT PARA UMA FUNO OU PROCEDIMENTO


PR-REQUISITOS

Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7.
METODOLOGIA

Apresentao do conceito de definio de parmetros default em uma funo ou procedimento.

O CONCEITO DE PARMETRO DEFAULT PARA UMA FUNO OU PROCEDIMENTO


Outro recurso bastante interessante do Delphi 7 o associado definio de uma funo ou procedimento com parmetros default. Esse recurso permite que aos ltimos parmetros da lista de parmetros de uma funo ou procedimento seja definido um valor default. Dessa maneira, se um valor no for especificado para esses parmetros na chamada da funo ou procedimento, esses assumiro os seus valores default. Considere, por exemplo, a seguinte funo, destinada a retornar o valor da soma de trs nmeros inteiros: Declarao:
function Soma(valor1, valor2, valor3 : integer):integer;

Implementao:
function Soma(valor1, valor2, valor3 : integer):integer; begin result := valor1+valor2+valor3; end;

Caso se queira definir o valor 0 como valor default para os dois ltimos parmetros, essa funo deveria ser redeclarada da seguinte maneira (no altere a sua implementao):
function Soma(valor1 : integer; valor2 : integer = 0; valor3 : integer = 0):integer;

Dessa maneira, as chamadas da funo a seguir so equivalentes:

324 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PROGRAMAO ORIENTADA A OBJETOS EM DELPHI 7


Total := Soma(10,0,0); Total := Soma(10,0); Total := Soma(10);

Com os recursos de sobrecargas de mtodos e de definio de valores default, o Object Pascal se torna uma linguagem de programao orientada a objetos ainda mais completa.

Evidentemente, esses recursos tambm se aplicam a mtodos de classes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

325

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

326 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES

Captulo
O Conceito de Componentes

20

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

327

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Ao utilizar o Delphi 7 como uma ferramenta de desenvolvimento de aplicaes, trabalhamos intensamente com os componentes fornecidos por essa ferramenta. Como j deve ser do seu conhecimento, o Delphi 7 fornece componentes capazes de realizar as mais diversas tarefas, como por exemplo: Criar elementos de interface como menus pull-down, menus pop-up, botes de comando, caixas de texto, etc. Representar caixas de dilogo padro do Windows, com as quais nosso usurio j est habituado, em funo da sua experincia prvia decorrente da utilizao de outras aplicaes. Acessar tabelas de bancos de dados, atravs dos mtodos fornecidos pelos componentes e mediante a utilizao de declaraes SQL. Exibir os valores armazenados nos campos dos registros de uma tabela. Criar relatrios. Incorporar recursos de multimdia sua aplicao. Existem situaes, no entanto, em que os componentes oferecidos pelo ambiente de desenvolvimento no so suficientes para atender a todas as nossas necessidades, embora sejam capazes de atend-las parcialmente. Nesses casos, tm-se a opo de instalar componentes desenvolvidos por terceiros ou criar novos componentes a partir de componentes j existentes, incorporando apenas as caractersticas necessrias a atender completamente s nossas necessidades. O objetivo deste captulo ser, portanto, apresentar ao leitor o mecanismo de definio de componentes, de forma a torn-lo apto a estender as potencialidades oferecidas pelos componentes j disponibilizados pelo ambiente de desenvolvimento do Delphi 7. A criao de novos componentes ser objeto de um captulo especfico.

KNOW-HOW EM: DEFINIO DE COMPONENTES


PR-REQUISITOS
Conhecimento da sintaxe bsica da linguagem Pascal e dos fundamentos da programao orientada a objetos em Delphi 7.

METODOLOGIA
Apresentao do conceito de componentes. Definio dos conceitos de propriedades e eventos. Apresentao da classe TCanvas.

TCNICA
Discusso dos conceitos relacionados definio de um componente. Implementao de procedimentos capazes de responder a mensagens do sistema operacional.

328 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES

O CONCEITO DE COMPONENTES
Os componentes so, na realidade, objetos ou instncias de classes que tm algumas caractersticas adicionais s existentes nas classes definidas no captulo anterior. Diferentemente do que ocorre com as instncias das classes definidas anteriormente, os componentes podem ter algumas das suas caractersticas manipuladas durante a fase de projeto de um aplicativo, isto , a partir do prprio ambiente de desenvolvimento integrado do Delphi 7, e isso normalmente feito alterando-se algumas das suas propriedades diretamente no Object Inspector. O prprio componente pode ser visualizado e manipulado diretamente com o mouse (e algumas das suas caractersticas visuais, como tamanho e posio, podem ser diretamente alteradas pelo mouse). Alm disso, durante a execuo do aplicativo, alguns componentes podem responder a aes diretas do usurio ou do sistema operacional, ou seja, so capazes de responder s mensagens disparadas pelo sistema operacional. O usurio do componente pode ainda definir um trecho de cdigo a ser executado quando o componente responder a essa mensagem, o que geralmente feito definindo-se procedimentos associados a eventos (onde se define genericamente por evento uma ao do usurio ou do sistema operacional). Exemplificando: Quando um componente precisa ser redesenhado na tela, o sistema operacional envia ao componente uma mensagem identificada como WM_Paint. Alm disso, alguns componentes possuem um evento chamado OnPaint, cujo procedimento associado ser executado sempre que o componente precisar responder a essa mensagem. Alguns componentes, no entanto, s podem ser visualizados na fase de projeto do aplicativo, como por exemplo aqueles que representam as caixas de dilogo padres do Windows. Esse tipo de componente, na realidade, representa uma determinada funcionalidade do sistema operacional, que foi transformada em componente para facilitar o trabalho do programador. O mesmo ocorre com os componentes utilizados para representar tabelas, em aplicaes que acessam bancos de dados. Se voc examinar o diagrama da hierarquia de objetos do Delphi 7, ver que todas as classes usadas na definio de componentes so classes derivadas, direta ou indiretamente, da classe TPersistent, definida na unit Classes. A classe TPersistent incorpora a funcionalidade bsica a todas as classes cujas instncias devem ser capazes de ler e armazenar suas caractersticas em um meio auxiliar de armazenamento, que pode ser a memria RAM ou um disco magntico. Na realidade, os mtodos fornecidos por essa classe so todos virtuais ou dinmicos, podendo portanto ser sobrecarregados nas classes dela derivadas por herana, de forma a ampliar a sua funcionalidade. Alm dos componentes propriamente ditos, todas as classes cujos objetos precisam incorporar o conceito de persistncia so derivadas diretamente da classe TPersistent. Dentre as classes derivadas diretamente da classe TPersistent, podem-se destacar: TCanvas: Utilizada para representar uma superfcie de desenho, incorporando boa parte da funcionalidade presente na GDI (Graphical Device Interface) do Windows.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

329

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


TClipboard: Utilizada para representar a rea de transferncia do Windows. TStrings: Definida como classe-base de muitas outras classes destinadas manipulao de listas de strings. A classe TComponent, derivada diretamente da classe TPersistent, tambm uma classe-base de todos os componentes definidos na linguagem Object Pascal, e implementa algumas caractersticas e funcionalidades comuns a todos os componentes, como por exemplo: Exibir uma imagem na paleta de componentes do ambiente de desenvolvimento integrado do Delphi 7. Exibir o componente em um formulrio. Incorporar e gerenciar outros componentes. Nesse caso, diz-se que esse componente o proprietrio dos componentes nele inseridos. Dessa maneira, todos os componentes so derivados diretamente ou indiretamente da classe TComponent. Dentre as classes derivadas diretamente de TComponent, podem-se destacar: TApplication: Essa classe permite a definio de instncias que representam uma aplicao. TBatchMove: Os objetos dessa classe so usados para efetuar transferncia de registros entre tabelas. TCommomDialog: Usada como classe-base de todas as classes usadas na representao das caixas de dilogo padres do Windows. TDataSet: Usada como classe-base para todas as classes destinadas a acessar as tabelas de um banco de dados. TMenu: Usada para definir o menu principal de uma aplicao. Uma caracterstica comum a essas classes o fato de que os componentes por elas representados no so visveis durante a execuo do aplicativo. O componente SQLDataset (derivado da classe TDataset), por exemplo, pode ser manipulado durante a fase de projeto de uma aplicao, mas no exibido durante a execuo do aplicativo. Analisando-se novamente o diagrama de hierarquia de objetos do Delphi 7, pode-se verificar que todos os componentes que apresentam esse tipo de componente so derivados de TComponent, mas no possuem a classe TControl como uma das suas classes-base. Dessa maneira, pode-se concluir: Componentes cujas instncias no devem ser visualizadas durante a execuo do aplicativo devem ser representados por classes derivadas direta ou indiretamente da classe TComponent, mas no devem ser derivadas da classe TControl. Por ltimo, pode-se verificar a partir do diagrama de hierarquia de objetos do Delphi 7 que existe ainda uma classe chamada TControl, derivada de TComponent, da qual so derivadas muitas outras classes que representam os principais componentes de construo da interface. A principal caracterstica dessa classe reside na incorporao da funcionalidade necessria para que os objetos das classes dela derivadas por herana possam ser visualizados durante a execuo do aplicativo. Dessa maneira, pode-se concluir: Componentes cujas instncias devem ser visualizadas durante a execuo do aplicativo devem ser representados por classes derivadas da classe TControl.

330 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


A classe TControl, por sua vez, possui duas subclasses principais, denominadas TGraphicControl e TwinControl. A classe TGraphicControl utilizada como classe-base para as classes que representam componentes que devem exibir texto e grfico, mas que no devem receber o foco da aplicao durante a sua execuo, isto , componentes que no so selecionados quando se pressiona seguidamente a tecla Tab, nem podem conter outros componentes. A classe TwinControl (definida como sinnimo da classe TWidget na CLX), por sua vez, utilizada como classe-base para as classes que representam componentes que devem ter as seguintes caractersticas: So capazes de receber o foco da aplicao durante a sua execuo. Podem conter outros controles. Possuem um handle que os identifica.

EXIBINDO UMA PROPRIEDADE NO OBJECT INSPECTOR


No captulo anterior foi apresentado o conceito de propriedade, definida como sendo um meio de comunicao entre um campo interno e privado da classe e o cdigo que utiliza um objeto dessa classe. Normalmente, para que uma propriedade possa ser acessada pelo cdigo da aplicao, esta deve ser definida na seo public de uma classe. No caso de um componente, para que uma propriedade possa ter o seu valor visualizado e alterado no Object Inspector, voc deve defini-la na seo published da classe que representa o componente, seo esta que no havia sido abordada at o momento, e ser visto em maiores detalhes no captulo referente criao de componentes.

O SISTEMA DE MENSAGENS DO WINDOWS


Conforme descrito anteriormente, um componente deve ser capaz de responder a determinadas mensagens do Windows, o que normalmente feito definindo-se procedimentos associados a um evento que tenha sido configurado para responder a essa mensagem. O Delphi 7 define uma srie de constantes numricas, relacionadas na unit messages.pas, que identificam as diversas mensagens que podem ser enviadas a um componente pelo sistema operacional. A Mensagem WM_Paint do Windows, por exemplo, codificada da seguinte maneira pela VCL do Delphi 7:
WM_PAINT = $000F;

As principais mensagens relacionadas com o pressionamento de teclas e movimentao do mouse para aplicaes desenvolvidas em Delphi 7 com a VCL so codificadas como mostrado a seguir:
WM_MOUSEFIRST = $0200; WM_MOUSEMOVE = $0200; WM_LBUTTONDOWN = $0201;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

331

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


WM_LBUTTONUP = $0202; WM_LBUTTONDBLCLK = $0203; WM_RBUTTONDOWN = $0204; WM_RBUTTONUP = $0205; WM_RBUTTONDBLCLK = $0206; WM_MBUTTONDOWN = $0207; WM_MBUTTONUP = $0208; WM_MBUTTONDBLCLK = $0209; WM_MOUSEWHEEL = $020A; WM_MOUSELAST = $020A;

No caso do Windows, para definir em uma classe um mtodo que responda a uma mensagem do sistema operacional, basta codific-lo com a seguinte sintaxe:
Procedure <cdigo_mensagem_sem_undescore>(var Nome_Parmetro: TMessage);message <cdigo_da_mensagem>;

Onde: < cdigo_mensagem_sem_undescore> exatamente isso: o cdigo da mensagem sem o undescore. Conseqentemente, se quisermos definir um mtodo que responda mensagem WM_PAINT, ele ser denominado WMPaint. Nome_Parmetro o nome de um parmetro passado por referncia, e de um tipo definido como um registro que identifica a mensagem a ser manipulada, e definida na unit Messages. Message uma palavra reservada utilizada para identificar que esse procedimento ser executado em resposta a uma mensagem do sistema operacional. <cdigo_da_mensagem> o cdigo da mensagem propriamente dita. Para responder a uma mensagem WM_PAINT, por exemplo, um componente deve definir um mtodo chamado WMPaint, que apresenta o seguinte cabealho:
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

As classes TWinControl e TGraphicControl, por exemplo, implementam esse mtodo, embora o faam de maneira diferente, como mostram os trechos de cdigo que implementam esses mtodos, reproduzidos a seguir.
procedure TWinControl.WMPaint(var Message: TWMPaint); var DC, MemDC: HDC; MemBitmap, OldBitmap: HBITMAP; PS: TPaintStruct; begin if not FDoubleBuffered or (Message.DC <> 0) then if ControlCount = 0 then inherited else PaintHandler(Message) else begin DC:= GetDC(0); MemBitmap:= CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom); ReleaseDC(0, DC); MemDC:= CreateCompatibleDC(0); OldBitmap:= SelectObject(MemDC, MemBitmap); try DC:= BeginPaint(Handle, PS); Perform(WM_ERASEBKGND, MemDC, MemDC);

332 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


Message.DC:= MemDC; WMPaint(Message); Message.DC:= 0; BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY); EndPaint(Handle, PS); finally SelectObject(MemDC, OldBitmap); DeleteDC(MemDC); DeleteObject(MemBitmap); end; end; end; procedure TGraphicControl.WMPaint(var Message: TWMPaint); begin if Message.DC <> 0 then begin Canvas.Lock; try Canvas.Handle:= Message.DC; try Paint; finally Canvas.Handle:= 0; end; finally Canvas.Unlock; end; end; end;

Alguns exemplos de tipos definidos como registro (tipo composto) na unit Messages so apresentados a seguir. Para representar mensagens geradas pelo pressionamento de uma tecla:
TWMKey = record Msg: Cardinal; CharCode: Word; Unused: Word; KeyData: Longint; Result: Longint; end;

Para representar mensagens geradas pelo mouse:


TWMMouse = record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end;

Para representar a mensagem WM_Paint:


TWMPaint = record Msg: Cardinal;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

333

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


DC: HDC; Unused: Longint; Result: Longint; end;

Algumas mensagens especficas so representadas como um alias (nome alternativo) para os registros descritos anteriormente, como exemplificado a seguir:
TWMLButtonDblClk = TWMMouse; TWMLButtonDown = TWMMouse; TWMLButtonUp = TWMMouse; TWMMButtonDblClk = TWMMouse; TWMMButtonDown = TWMMouse; TWMMButtonUp = TWMMouse; TWMMouseMove = TWMMouse; TWMRButtonDblClk = TWMMouse; TWMRButtonDown = TWMMouse; TWMRButtonUp = TWMMouse; TWMChar = TWMKey; TWMKeyDown = TWMKey; TWMKeyUp = TWMKey; TWMSysChar = TWMKey; TWMSysKeyDown = TWMKey; TWMSysKeyUp = TWMKey;

No discutiremos neste livro a codificao desses mtodos, que executam diversas funes da API do Windows. O objetivo desse tpico mostrar como so implementados os mtodos que respondem a mensagens do sistema operacional. Repare que, como a classe TGraphicControl j implementa o mtodo Paint, tenta execut-lo a partir do procedimento definido como resposta mensagem WM_PAINT, o que no ocorre no caso do mesmo mtodo para a classe TWinControl, que no implementa o mtodo Paint. Entretanto, a classe TCustomControl, derivada da classe TWinControl e que implementa o mtodo Paint, define seu procedimento WMPaint da maneira descrita a seguir:
procedure TCustomControl.WMPaint(var Message: TWMPaint); begin PaintHandler(Message); end;

Esse mtodo executa o mtodo PaintHandler, definido na classe-base, e que por sua vez executa o mtodo PaintWindow, que na classe TCustomControl implementado da seguinte forma:
procedure TCustomControl.PaintWindow(DC: HDC); begin FCanvas.Lock; try FCanvas.Handle:= DC; try Paint; finally FCanvas.Handle:= 0; end; finally FCanvas.Unlock; end; end;

334 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


Repare que esse mtodo chama o mtodo Paint. O importante neste ponto compreender que: Para responder mensagem WM_PAINT do Windows, uma classe deve implementar o mtodo WMPaint da maneira descrita anteriormente. Se uma classe implementa o mtodo Paint, este deve ser chamado a partir do seu mtodo WMPaint, ou por qualquer mtodo chamado a partir deste.

A CLASSE TCANVAS
Muitos componentes (como os representados pela classe TGraphicControl ou de classes dela derivadas por herana) tm um campo interno chamado FCanvas, e uma propriedade chamada Canvas, da classe TCanvas, que representa a superfcie de desenho do componente. Neste tpico apresentaremos algumas propriedades e mtodos da classe TCanvas, fundamentais compreenso dos procedimentos envolvidos na criao de componentes. Para o Windows, qualquer rea a ser manipulada na tela (ou na impressora) tratada como uma superfcie de desenho. Para simplificar a vida do programador, o Delphi 7 possui uma classe, denominada TCanvas, que representa uma superfcie de desenho retangular sobre a qual podero ser feitos desenhos, exibidos textos, etc. Em um Canvas existe um sistema de coordenadas cartesianas em que a origem est situada no canto superior esquerdo, as abscissas crescem da esquerda para a direita e as ordenadas de cima para baixo (ao contrrio do sistema cartesiano convencional). Conforme ser visto posteriormente, no captulo referente programao grfica, existem funes da GDI do Windows que permitem que se altere a orientao de eixos do Canvas, bem como o posicionamento da origem desse sistema. A figura a seguir apresenta a orientao de eixos em um Canvas, conforme descrito anteriormente.

0 X

Figura 20.1: Sistema de coordenadas da tela.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

335

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Guarde bem este conceito: um canvas um objeto da classe TCanvas, que define uma regio retangular da tela, e que possui, entre seus mtodos, as principais funes da GDI do Windows. O desenho de linhas em um Canvas feito usando uma caneta imaginria, que na realidade um objeto da classe TPen (outra classe definida pelo Delphi 7), e o preenchimento de superfcies feito usando-se um pincel imaginrio, que na realidade um objeto da classe TBrush. Dentre as principais propriedades de um objeto da classe TPen a caneta imaginria destacam-se aquelas que definem a sua espessura, a sua cor, modo e estilo de desenho. Para um objeto da classe TBrush, suas principais propriedades so aquelas que definem a sua cor e estilo.

PRINCIPAIS PROPRIEDADES DA CLASSE TCANVAS


Dentre as principais propriedades da classe TCanvas, destacam-se:

Brush
A propriedade Brush de um objeto da classe TCanvas , na realidade, um objeto da classe TBrush, e define as caractersticas do pincel utilizado no preenchimento de superfcies como retngulos e elipses, por exemplo.

CanvasOrientation
Essa propriedade, apenas de leitura, uma varivel do tipo Tcanvas e pode assumir um dos seguintes valores: coLeftToRight: Orientao da esquerda para a direita. coRightToLeft: Orientao da direita para a esquerda.

ClipRect
Essa propriedade um objeto da classe TRect, e permite restringir a rea de desenho a uma poro retangular do Canvas.

CopyMode
Essa propriedade definida como uma varivel inteira, e define como imagens grficas devem ser desenhadas no Canvas: Uma relao dos valores possveis e seus efeitos ser apresentada no captulo de programao grfica.

Font
Essa propriedade um objeto da classe TFont, e define a fonte utilizada na exibio de textos no Canvas.

Handle
Essa propriedade retorna o handle do Canvas, e utilizada apenas quando se precisa utilizar funes grficas da GDI do Windows que no foram incorporadas pela VCL do Delphi 7 ou pela CLX como mtodos da classe TCanvas.

336 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES

LockCount
Essa propriedade definida como uma varivel inteira, e define quantas vezes o canvas foi protegido contra a interveno de outras threads, mediante chamadas ao seu mtodo Lock.

Pen
A propriedade Pen de um objeto da classe TCanvas , na realidade, um objeto da classe TPen, e define as caractersticas da caneta utilizada no desenho de linhas e do contorno de figuras como retngulos e elipses, por exemplo.

PenPos
Essa propriedade uma varivel do tipo TPoint, e define a posio atual da caneta no Canvas. Atribuir um valor propriedade PenPos equivale a executar o mtodo MoveTo do Canvas.

Pixels [x,y]
Essa propriedade define a cor do pixel situado nas coordenadas (x,y) do Canvas.

TextFlags
Essa propriedade definida como uma varivel inteira, e define como um texto deve ser desenhado no Canvas. Uma relao dos valores possveis e seus efeitos ser apresentada no captulo de programao grfica.

PRINCIPAIS MTODOS DA CLASSE TCANVAS


Dentre os principais mtodos da classe TCanvas, destacam-se:

Arc
Declarao
procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

Esse mtodo desenha na superfcie do Canvas um arco coincidente com o permetro da elipse cujo retngulo circunscrito definido pelos pontos (X1,Y1) e (X2,Y2). O arco comea no ponto de interseo desse retngulo com a linha que une o centro da elipse ao ponto (X3,Y3) e segue no sentido anti-horrio at o ponto de interseo desse retngulo com a linha que une o centro da elipse ao ponto (X4,Y4).

BrushCopy
Declarao
procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: TColor);

Esse mtodo copia uma poro retangular de um bitmap (Source) para uma rea retangular do canvas (Dest), substituindo uma das cores do bitmap (Color) pela definida para a propriedade Brush do canvas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

337

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Chord
Declarao
procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

Esse mtodo desenha uma curva fechada, definida pela interseo entre uma linha e uma elipse. A Elipse definida pelos dois primeiros pontos e a linha, pelos dois ltimos.

CopyRect
Declarao
procedure CopyRect(Dest: TRect; Canvas: TCanvas; Source: TRect);

Esse mtodo copia uma rea retangular de um Canvas para outra rea retangular do Canvas corrente (que executa o mtodo).

Draw
Declarao
procedure Draw(X, Y: Integer; Graphic: TGraphic);

Esse mtodo copia uma imagem grfica (que pode ser um cone, um bitmap ou um metafile) para o Canvas corrente, sendo a extremidade superior esquerda da imagem colocada no ponto de coordenadas X e Y (passadas como parmetros).

DrawFocusRect
Declarao
procedure DrawFocusRect(const Rect: TRect);

Esse mtodo desenha um retngulo no Canvas, com o estilo comumente usado para indicar que o componente recebeu o foco da aplicao.

Ellipse
Declarao
procedure Ellipse(X1, Y1, X2, Y2: Integer); overload; procedure Ellipse(const Rect: TRect); overload;

Esse mtodo desenha no Canvas uma elipse cujo retngulo circunscrito definido pelos pontos (X1,Y1) e (X2,Y2) ou por uma rea retngular (Rect). Para desenhar um crculo, basta que o retngulo circunscrito seja um quadrado, isto , (Y2 - Y1) deve ser igual a (X2 - X1). Repare que este mtodo um mtodo sobrecarregado.

FillRect
Declarao
procedure DrawFocusRect(const Rect: TRect);

338 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


Esse mtodo preenche uma rea retangular do Canvas (passada como parmetro) com o pincel (brush) corrente.

LineTo
Declarao
procedure LineTo(X, Y: Integer);

Esse mtodo desenha no Canvas uma linha que comea na posio atual da caneta imaginria e termina na posio definida pelas coordenadas (X,Y), que passa a ser a posio atual da caneta imaginria.

Lock
Declarao
procedure Lock;

Esse mtodo impede que outras threads desenhem sobre o Canvas.

MoveTo
Declarao
procedure MoveTo(X, Y: Integer);

Esse mtodo move a caneta imaginria para a posio do Canvas definida pelas coordenadas (X,Y).

PolyBezier
Declarao
procedure PolyBezier(const Points: array of TPoint);

Esse mtodo desenha uma curva de Bezier, com base no conjunto de pontos fornecido como parmetro.

Pie (X1, Y1, X2, Y2)


Declarao
procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Longint);

Esse mtodo desenha no Canvas um setor elptico cujo retngulo circunscrito definido pelos pontos (X1,Y1) e (X2,Y2), preenchendo-o com o pincel definido na propriedade Brush do Canvas.

Polygon
Declarao
procedure Polygon(Points: array of TPoint);

Esse mtodo desenha no Canvas um polgono fechado usando a caneta imaginria definida na propriedade Pen do Canvas e preenchendo-o com o pincel imaginrio definido pela propriedade Brush do Canvas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

339

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Polyline
Declarao
procedure Polyline(Points: array of TPoint);

Esse mtodo desenha uma poligonal aberta unindo os pontos que compem o array passado como parmetro. Para desenhar uma poligonal fechada, basta que as coordenadas do primeiro e do ltimo ponto do array sejam coincidentes.

Rectangle
Declarao
procedure Rectangle(X1, Y1, X2, Y2: Integer); overload; procedure Rectangle(const Rect: TRect); overload;

Esse mtodo desenha no Canvas um retngulo definido pelos pontos (X1,Y1) e (X2,Y2), ou por uma varivel do tipo Trect (repare que este um mtodo sobrecarregado) preenchendo-o com o pincel definido na propriedade Brush do Canvas.

RoundRect
Declarao
procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);

Esse mtodo desenha no Canvas um retngulo de cantos arredondados definido pelos pontos (X1,Y1) e (X2,Y2), sendo os cantos concordados por uma elipse de eixos iguais a X3 e Y3.

StretchDraw
Declarao
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );

Esse mtodo copia, na rea retangular definida pelo parmetro Rect do canvas corrente, uma imagem definida pelo parmetro Graphic.

TextExtent
Declarao
function TextExtent(const Text: string): TSize;

Esse mtodo retorna, nos campos cx e cy de uma varivel do tipo TSize, as dimenses (largura e altura, em pixels) que uma string ocupa ao ser desenhada no canvas corrente.

TextHeight
Declarao
function TextHeight(const Text: string): Integer;

340 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


Esse mtodo retorna a altura, em pixels, que a string passada como parmetro ocupa no Canvas.

TextOut
Declarao
procedure TextOut(X, Y: Integer; const Text: string);

Esse mtodo exibe no Canvas uma string definida pelo parmetro Texto, na posio definida pelas coordenadas (X,Y). Essas coordenadas definem o vrtice superior esquerdo do retngulo circunscrito ao texto, usando a fonte corrente do Canvas (definida pela sua propriedade Font).

TextWidth
Declarao
function TextWidth(const Text: string): Integer;

Esse mtodo retorna a largura, em pixels, que a string definida pelo parmetro Texto ocupa no Canvas.

Unlock
Declarao
procedure Unlock;

Esse mtodo permite que outras threads desenhem sobre o Canvas. Deve ser chamado sempre que outras threads houvessem sido impedidas de desenhar no Canvas aps uma chamada do mtodo Lock. Apresentam-se a seguir as principais propriedades da classe TPen.

PRINCIPAIS PROPRIEDADES DA CLASSE TPEN


Dentre as principais propriedades da classe TPen, destacam-se:

Color
Essa propriedade um objeto da classe TColor, e define a cor atual da caneta imaginria. Voc pode usar uma das constantes predefinidas do Delphi 7 (clBlack, clWhite, clBlue, clYellow, etc.).

Style
Essa propriedade define como a linha ser desenhada, e pode assumir um dos valores apresentados a seguir.

Valor psSolid psDash psDot

Significado Desenha uma linha slida. Desenha uma linha tracejada. Desenha uma linha pontilhada.
continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

341

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Valor psDashDot psDashDotDot psClear psInsideFrame

Significado Desenha uma linha no estilo trao-ponto. Desenha uma linha no estilo trao-dois pontos. Desenha uma linha invisvel. Desenha uma linha slida, mas cuja cor pode sofrer leves variaes, quando sua propriedade width tiver valor maior do que 1.

Mode
Essa propriedade define como a cor atual da caneta interage com a cor corrente do Canvas, e pode assumir um dos valores apresentados a seguir: pmBlack: A linha desenhada na cor preta, independente da cor existente no Canvas. pmWhite: A linha desenhada na cor branca, independente da cor existente no Canvas. pmNop: A cor atual do canvas permanece inalterada. A caneta se comporta de forma transparente. pmNot: A cor utilizada pela caneta ser a inversa da presente no Canvas. pmCopy: A caneta desenha linhas com a cor especificada na sua propriedade Color. pmNotCopy: A caneta desenha linhas com a cor especificada na sua propriedade Color. pmMergePenNot: A caneta desenha linhas com a cor resultante da combinao entre a cor da propriedade Color da caneta e a inversa da presente no Canvas. pmMaskPenNot: A caneta desenha linhas com a cor resultante da combinao das cores comuns entre a cor da propriedade Color da caneta e a inversa da presente no Canvas. pmMergeNotPen: A caneta desenha linhas com a cor resultante da combinao entre a cor inversa da propriedade Color da caneta e a cor presente no Canvas. pmMaskNotPen: A caneta desenha linhas com a cor resultante da combinao entre a cor inversa da definida pela propriedade Color da caneta e a da cor de fundo do Canvas. pmMerge: A caneta desenha linhas com a cor resultante da combinao entre a cor definida pela propriedade Color da caneta e a da cor de fundo do Canvas. pmNotMerge: Cor inversa da definida com pmMerge. pmMask: A caneta desenha linhas com a cor resultante da combinao entre a cor definida pela propriedade Color da caneta e a da cor de fundo do Canvas. PmNotMask: Cor inversa da definida com pmMask. PmXor: A caneta desenha linhas com a cor resultante da combinao entre as cores presentes na propriedade Color da caneta e na cor de fundo do Canvas, mas no em ambas. PmNotXor: Cor inversa da definida com pmXor.

342 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES

Width
Essa propriedade armazena um valor inteiro que define a espessura da linha desenhada pela caneta imaginria. Apresentam-se a seguir as principais propriedades da classe TBrush.

PRINCIPAIS PROPRIEDADES DA CLASSE TBRUSH


Dentre as principais propriedades da classe TBrush, destacam-se:

Bitmap
Essa propriedade permite que se defina um bitmap de 8 x 8 pixels como padro de preenchimento do pincel imaginrio. Se for atribudo um bitmap de dimenses maiores, apenas a regio de 8 x 8 pixels situada no canto superior esquerdo do bitmap ser considerada.

Color
Essa propriedade um objeto da classe TColor, e define a cor atual do pincel imaginrio.

Style
Essa propriedade define o estilo de preenchimento do pincel imaginrio, com os seguintes valores:

TValor bsSolid bsClear bsBDiagonal bsFDiagonal bsCross bsDiagCross bsHorizontal bsVertical

Significado Preenchimento Total (Slido) Transparente Hachura em diagonal, com inclinao //// Hachura em diagonal, com inclinao \\\\ Hachuras Ortogonais cruzadas Hachuras Diagonais cruzadas Hachuras Horizontais Hachuras Verticais

O COMPONENTE SHAPE
O componente Shape, situado na pgina Additional da paleta de componentes, utilizado para desenhar formas geomtricas em um formulrio ou outro componente que permita a incluso de outros componentes em seu interior (como um Panel, por exemplo), e, diferentemente de outros componentes, permite que suas propriedades Brush e Pen sejam definidas durante o projeto da aplicao alterando os seus valores diretamente no Object Inspector. A ttulo de ilustrao, apresentamos a seguir a definio da classe TShape e a implementao do seu mtodo Paint, extrados do arquivo ExtCtrls.pas:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

343

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


TShape = class(TGraphicControl) private FPen: TPen; FBrush: TBrush; FShape: TShapeType; procedure SetBrush(Value: TBrush); procedure SetPen(Value: TPen); procedure SetShape(Value: TShapeType); protected procedure Paint; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published procedure StyleChanged(Sender: TObject); property Align; property Brush: TBrush read FBrush write SetBrush; property DragCursor; property DragMode; property Enabled; property ParentShowHint; property Pen: TPen read FPen write SetPen; property Shape: TShapeType read FShape write SetShape default stRectangle; property ShowHint; property Visible; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDrag; end;

Observe que essa classe herda o campo interno FCanvas e a propriedade Canvas da sua classe-base, TGraphicControl.
procedure TShape.Paint; var X, Y, W, H, S: Integer; begin with Canvas do begin Pen := FPen; Brush := FBrush; X := Pen.Width div 2; Y := X; W := Width - Pen.Width + 1; H := Height - Pen.Width + 1; if Pen.Width = 0 then begin Dec(W); Dec(H); end; if W < H then S := W else S := H; if FShape in [stSquare, stRoundSquare, stCircle] then begin Inc(X, (W - S) div 2); Inc(Y, (H - S) div 2); W := S; H := S; end;

344 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 O CONCEITO DE COMPONENTES


case FShape of stRectangle, stSquare: Rectangle(X, Y, X + W, Y + H); stRoundRect, stRoundSquare: RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); stCircle, stEllipse: Ellipse(X, Y, X + W, Y + H); end; end; end;

Conforme descrito anteriormente, o mtodo Paint de um componente executado sempre que o mesmo precisa ser redesenhado em um formulrio. Repare que, no mtodo Paint do componente Shape, so feitas vrias chamadas a mtodos da sua propriedade Canvas (que um objeto da classe TCanvas). Repare ainda que no mtodo Paint do componente Shape, os valores das propriedades Brush e Pen do Canvas so definidos como sendo iguais aos definidos nos campos FBrush e FPen, que so na realidade objetos da classe TBrush e TPen, e que armazenam internamente os valores definidos pelas propriedades Brush e Pen, respectivamente. Existem componentes, no entanto, que no permitem que se acessem suas propriedades Brush e Pen na fase de projeto, mas apenas durante a execuo do aplicativo. Esses componentes, no entanto, como aqueles representados pelas classes TPaintBox, TImage e TPrinter, possuem um evento chamado OnPaint, para o qual podemos definir um procedimento associado, e nesse procedimento definir o cdigo referente a qualquer desenho a ser feito no seu Canvas. Para que um desenho seja permanentemente visualizado em um formulrio ou componente, o cdigo que o define deve ser digitado no procedimento associado ao evento OnPaint do formulrio ou componente. Se esse cdigo no for includo no evento OnPaint e a regio do formulrio ou componente que exibe o desenho for sobreposta por outra janela, este no ser restaurado na tela quando a regio correspondente se tornar visvel novamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

345

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

346 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES

Captulo
Criao de Componentes

21

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

347

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


O amplo conjunto de usurios do Delphi pode ser subdividido em dois grandes grupos: um grupo de desenvolvedores de aplicaes e um grupo de desenvolvedores de componentes e ferramentas, que tm por objetivo ampliar as caractersticas e funcionalidades j disponveis no ambiente de desenvolvimento do Borland Delphi. Neste captulo sero apresentados os procedimentos necessrios criao de componentes com o Borland Delphi, o que pode ser feito sem que seja necessria a utilizao de qualquer ferramenta adicional, pois os novos componentes podem ser criados usando-se a prpria linguagem Object Pascal. Alm disso, conforme ser descrito posteriormente, os componentes desenvolvidos em Object Pascal podem ser transformados em controles ActiveX e utilizados em outros ambientes de desenvolvimento que suportam essa tecnologia. Conforme ser mostrado nos tpicos subseqentes, voc pode criar um componente inteiramente original ou partir de um componente j existente, usando o conceito de herana da linguagem Object Pascal. Nesse caso, voc poder adicionar novas caractersticas ao componente ancestral ou redefinir algumas de suas funcionalidades.

KNOW-HOW EM: CRIAO DE COMPONENTES


PR-REQUISITOS
Fundamentos da programao orientada a objetos com o Delphi 5. Experincia prvia na utilizao de componentes no desenvolvimento de aplicaes com Delphi.

METODOLOGIA
Apresentao do problema: Utilizao dos conceitos de herana e polimorfismo na criao de novos componentes.

TCNICA
Apresentao dos procedimentos necessrios criao de novos componentes.

APRESENTAO DO PROBLEMA
Ao longo dos ltimos captulos, voc trabalhou intensamente com componentes, selecionando-os nas diversas pginas da paleta de componentes, inserindo-os em formulrios e alterando algumas das suas propriedades diretamente no Object Inspector. Esses componentes so, na verdade, objetos de classes previamente definidas na Visual Component Library VCL (a biblioteca de componentes do Delphi). O que diferencia um componente de uma classe comum justamente o fato de que os componentes podem ser manipulados na fase de projeto do aplicativo, ao passo que as classes comuns s podem ser manipuladas via cdigo. Existem situaes, no entanto, em que precisamos adaptar um componente j existente de forma a adequ-lo s nossas necessidades. Considere, por exemplo, que nossas aplicaes utilizem constantemente caixas de texto (componentes da classe TEdit) nas quais devem ser digitados apenas nmeros inteiros.

348 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


Existe uma soluo natural, e que consiste em codificar adequadamente os procedimentos associados aos principais eventos desse componente. Poderamos, por exemplo, inserir em um formulrio um componente caixa de texto e definir da seguinte maneira os procedimentos associados aos seus principais eventos:
procedure TFormNumerico.EditNumeroInteiroChange(Sender: TObject); var indice : word; posinal : string; begin indice := Pos(-,TEdit(Sender).text); if indice > 1 then begin posinal := TEdit(Sender).Text; Delete(posinal, indice, 1); TEdit(Sender).Text := -+posinal; end; indice := Pos(+,TEdit(Sender).text); if indice > 1 then begin posinal := TEdit(Sender).Text; Delete(posinal, indice, 1); TEdit(Sender).Text := ++posinal; end; end; procedure TFormNumerico.EditNumeroInteiroKeyPress(Sender: TObject; var Key: Char); begin if (not (key in [0..9',-,+,#8]))or((key in [+,-]) and (Pos(key,TEdit(Sender).text)>0)) then key := #0; end;

O procedimento associado ao evento OnKeyPress do componente verifica se a tecla pressionada pelo usurio corresponde a um dos caracteres vlidos, que so os dgitos (0 a 9) e os sinais + e -. Como a tecla pressionada passada para o procedimento associado ao evento pelo parmetro Key, basta verificar se a tecla representada por esse parmetro pertence ao conjunto de valores permitidos, o que feito nas linhas de cdigo reproduzidas a seguir.
if (not (key in [0..9',-,+,#8]))or((key in [+,-]) and (Pos(key,TEdit(Sender).text)>0)) then key := #0;

Essa linha de cdigo verifica se a tecla representada pelo parmetro Key pertence ao conjunto de valores permitidos e, caso essa condio no seja satisfeita, anula a entrada fornecida pelo usurio. Portanto, caso a tecla seja invlida, atribui-se o valor #0 ao parmetro Key, anulando-se a ao do usurio (isso possvel, pois o parmetro Key passado por referncia, como indica o modificador var includo na relao de parmetros do procedimento). Repare que, no caso das teclas + e -, deve-se ainda verificar se o caractere correspondente j existe na propriedade Text do componente, o que feito verificando-se o valor retornado pela funo Pos (que retorna a posio de um conjunto de caracteres em uma string) no procedimento associado ao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

349

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


evento OnChange do componente. Se essa funo retornar um valor positivo, indica que o sinal j est includo na string representada pela propriedade Text do componente. O procedimento associado ao evento OnChange do componente verifica se existe um caractere +ou - na sua propriedade Text, e, em caso positivo, verifica se a mesma foi inserida no meio da string. Em caso positivo, a remove da posio corrente da string e a recoloca no seu incio, o que feito no seguinte trecho de cdigo: Para o caractere -:
indice := Pos(-,TEdit(Sender).text); if indice > 1 then begin posinal := TEdit(Sender).Text; Delete(posinal, indice, 1); TEdit(Sender).Text := -+posinal; end;

Para o caractere +:
indice := Pos(+,TEdit(Sender).text); if indice > 1 then begin posinal := TEdit(Sender).Text; Delete(posinal, indice, 1); TEdit(Sender).Text := ++posinal; end;

indice e posinal so variveis locais ao procedimento.

Evidentemente, se nossa aplicao utilizar muitos componentes caixas de texto com essas caractersticas, ou se muitas aplicaes necessitarem dessa funcionalidade, ser mais adequado criar um novo componente capaz de incorporar essas funcionalidades, ou criar um template para este componente. Nos prximos tpicos sero apresentados os procedimentos necessrios criao de templates e criao desse componente, que neste ser representado por uma classe derivada da classe TEdit, e que ser denominada TNumEdit.

CRIANDO O ESQUELETO DO NOVO COMPONENTE


Para criar o novo componente, voc deve executar os seguintes procedimentos: 1. Selecione o item New Component do menu Component, para exibir a caixa de dilogo New Component, mostrada na Figura 21.1. Nessa caixa de dilogo devero ser especificados:

350 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


O nome da classe-base (Ancestor Type), da qual o novo componente ser derivado por herana. Nesse caso, estaremos criando um novo componente cujas definies sero armazenadas em uma classe derivada de TEdit. Logo, a classe TEdit dever ser especificada nesse campo. Repare que existem duas opes, correspondentes VCL (StdCtrls) e CLX (QStdCtrls), e neste exemplo ser adotada a primeira opo. O nome da classe que representar o novo componente (Class Name). Para essa classe, ser atribudo o nome TNumEdit. A pgina da paleta de componentes na qual o componente ser inserido (Palette Page). Neste exemplo, criaremos uma paleta denominada Axcel. O nome da unit onde ser definida a classe do componente (Unit file name). Usaremos o Nome NumEdit.Pas, que ser o nome default. O nome dos diretrios de pesquisa (Search Path).

Figura 21.1: A caixa de dilogo New Component.

2. Selecione o boto Ok para fechar essa caixa de dilogo, criar a unit do componente e exibi-la no editor de cdigos, como mostrado a seguir.
unit NumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TNumEdit = class(TEdit) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

351

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


procedure Register; begin RegisterComponents(AXCEL, [TNumEdit]); end; end.

Outra opo seria selecionar o item New do menu File para exibir a caixa de dilogo New Items, o item Component da pgina New dessa caixa de dilogo e o boto Ok.

Nesse arquivo de cdigo, verifica-se que a nova classe, TNumEdit, ser derivada por herana da classe TEdit, como mostra o trecho de cdigo a seguir, em que a mesma definida:
type TNumEdit = class(TEdit)

Repare ainda que foi definido o procedimento Register, e nesse procedimento feita uma chamada a um outro procedimento, denominado RegisterComponents. A procedure RegisterComponents recebe como parmetro o nome da pgina da paleta de componentes na qual os novos componentes sero inseridos (se a pgina indicada no existir, a mesma ser criada), e um array de componentes. Voc pode registrar vrios componentes de uma nica vez para uma nica pgina da paleta de componentes. Nesse caso, o nome de todos os componentes a serem exibidos nessa paleta dever ser includo nesse array de componentes. Caso a unit defina mais de um componente, e esses componentes sejam instalados em paletas distintas, o procedimento Register dever fazer vrias chamadas procedure RegisterComponents.

Embora o procedimento Register possa conter vrias chamadas ao procedimento RegisterComponents, s pode haver um procedimento Register em cada unit.

DEFINIO DE NOVAS PROPRIEDADES


No captulo referente programao orientada a objetos, vimos que uma classe engloba, em uma nica entidade, dados (denominados campos) e funes (denominadas mtodos). O mesmo se aplica aos componentes (que so um tipo especial de classe), mas nesse caso alguns campos podem ter os seus valores alterados diretamente no Object Inspector, atravs das suas propriedades. Podemos concluir, portanto, que uma propriedade serve como um meio de comunicao entre um campo de um componente e o programador, na fase de projeto do aplicativo. Se considerarmos, por exemplo, um componente Label (da classe TLabel), sabemos que esse componente tem uma propriedade chamada AutoSize, que pode apresentar o valor True ou False. Na realidade, a propriedade AutoSize um meio de comunicao entre voc (o programador) e o campo FAutoSize da

352 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


classe TLabel. Voc define o valor na propriedade AutoSize, mas na verdade quem armazena esse valor o campo FAutoSize da classe TLabel. Se voc observar o cdigo-fonte desses componentes no arquivo StdCtrl.pas, ver que o campo FAutoSize est definido na seo private da classe TCustomLabel, e a propriedade AutoSize est definida na seo protected dessa mesma classe. Ocorre, no entanto, que a classe TLabel derivada, por herana, da classe TCustomLabel (e, conseqentemente, herda a sua propriedade AutoSize, atravs da qual acessar o campo FAutoSize). Alm disso, a classe TLabel redefine a propriedade AutoSize na seo published da classe que representa o componente, seo esta cuja definio ser vista no tpico a seguir. Se voc observar o diagrama de hierarquia de classes da VCL, ver que existem diversas classes cujo nome comea com a palavra TCustom, e que declaram algumas propriedades como protected, tornadas published em classes delas derivadas por herana.

CRIANDO UMA NOVA PROPRIEDADE


Neste tpico sero apresentados os procedimentos necessrios criao de uma nova propriedade. Conforme j foi dito anteriormente, o componente NumEdit poder ser usado, opcionalmente, para permitir apenas a digitao de nmeros inteiros, e isso ser definido mediante a atribuio de um valor adequado a uma propriedade do componente que chamaremos de Numerico. Essa propriedade ser do tipo booleana e poder, portanto, receber apenas os valores True e False. Normalmente, conforme dito no tpico anterior, o valor de uma propriedade armazenado em um campo privado da classe e, dessa maneira, a propriedade serve apenas como uma interface ou meio de comunicao entre o campo e o desenvolvedor. Convencionalmente, os campos internos dos componentes costumam ter o mesmo nome das propriedades, precedidos pela letra F (de Field). Nesse caso, portanto, se a propriedade ser denominada Numerico, o campo respectivo poder ser denominado FNumerico (repare que no estamos acentuando esses nomes, seguindo portanto as mesmas regras estabelecidas para a definio de nomes de variveis). A criao da propriedade propriamente dita, no entanto, ser feita na seo published da classe do componente, mediante a incluso de uma linha de cdigo que apresenta a seguinte sintaxe:
property nome_propriedade : tipo read metodo_ leitura write metodo_ escrita;

Como pode ser visto na definio anterior, uma propriedade pode ter um mtodo de leitura e um mtodo de escrita. Quando se omite o nome do mtodo de escrita, a propriedade do tipo read-only (apenas de leitura) e seu valor pode ser apenas lido. Existem situaes, no entanto, que, em vez de se definir um mtodo de leitura e um mtodo de escrita, coloca-se em seu lugar o nome do campo em que o valor da propriedade ser armazenado. Nesses casos, diz-se que a propriedade acessa diretamente o valor de um campo, sem que se use qualquer mtodo especfico. No caso da propriedade Numerico, sua definio ser inicialmente feita mediante a incluso da seguinte linha de cdigo na seo published da classe:
property Numerico : boolean read FNumerico write FNumerico;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

353

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


A definio da classe, portanto, passaria a ter a forma apresentada a seguir.
TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; protected { Protected declarations } public { Public declarations } published { Published declarations } property Numerico : boolean read FNumerico write FNumerico; end;

No se esquea de incluir, na seo private da classe que representa o componente, a definio do campo que armazenar internamente o valor da propriedade.

INSTALANDO O NOVO COMPONENTE


Antes de incrementar ainda mais o nosso componente, vamos instal-lo e analisar o funcionamento da propriedade recm-criada. Para instalar o componente, selecione o item Install Component do menu Component. Ser exibida a caixa de dilogo Install Component, apresentada na figura a seguir. Nesse caso, o componente ser instalado no pacote dclusr.dpk (para instalar o componente em um novo pacote, selecione a guia Into new package e preencha corretamente seus diversos campos).

Figura 21.2: A caixa de dilogo Install Component.

Aps preencher corretamente as informaes dessa caixa de dilogo, selecione o boto OK. Ser exibida a caixa de dilogo de confirmao mostrada na figura a seguir.

Figura 21.3: A caixa de dilogo de confirmao.

354 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


O componente ser instalado no pacote especificado, como mostra a figura a seguir.

Figura 21.4: Instalando o componente em um pacote.

Durante a instalao sero exibidas algumas mensagens informativas. Basta selecionar o boto Ok dessas caixas de dilogo para dar prosseguimento ao processo.

Nesse caso, o componente foi inserido no pacote dclusr.dpk, que possui exatamente esta finalidade armazenar a definio de componentes criados pelo desenvolvedor. O componente estar instalado e estar disponvel na pgina Axcel da paleta de componentes, como mostra a figura a seguir.

Figura 21.5: A nova pgina da paleta de componentes.

Caso o componente no tenha sido instalado, selecione os botes Compile e Install na janela Package do pacote correspondente.

Repare que, como no foi definido um bitmap especfico para o componente, o bitmap do seu componente ancestral foi automaticamente utilizado (nesse caso, o bitmap definido para o componente TEdit). Posteriormente sero apresentados os procedimentos necessrios definio de um bitmap para o novo componente. Se voc colocar o cursor do mouse sobre o bitmap que identifica o componente na paleta, ser exibida uma string de auxlio com o nome do componente (no caso, NumEdit). Coloque o componente em um formulrio e verifique que a nova propriedade j est disponvel no Object Inspector, como mostra a figura a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

355

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

Figura 21.6: Visualizando a nova propriedade no Object Inspector.

Repare que o valor default dessa propriedade False. Para alterar esse valor default, voc deve sobrecarregar o construtor da classe-base e definir o novo valor. Isso ser feito da maneira descrita no tpico apresentado a seguir. Evidentemente, a alterao do valor dessa propriedade ainda no provoca nenhum efeito, pois o componente ainda no foi codificado para reagir a alterao de valores da propriedade Numerico. Nos prximos tpicos, esses aspectos sero tratados em maiores detalhes.

SOBRECARREGANDO O MTODO CONSTRUTOR DA CLASSE ANCESTRAL DO COMPONENTE


A definio de um novo construtor, sobrecarregando o construtor da sua classe ancestral e utilizando o conceito de polimorfismo (apresentado no captulo referente programao orientada a objetos), feita mediante a utilizao do seguinte trecho de cdigo:
type TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } property Numerico : boolean read FNumerico write FNumerico; end;

A implementao do construtor deve ser feita na seo implementation da unit, como apresentado a seguir:

356 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


constructor TNumEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FNumerico := True; Text := 0; end;

Repare que a primeira coisa que o construtor faz chamar o mtodo construtor da classe-base. Em seguida, define as propriedades Numerico e Text como True e 0, respectivamente (afinal de contas, no seria lgico que o valor default da propriedade Text desse componente fosse NumEdit1). Reinstale novamente o componente. Voc ver que agora o valor default da propriedade Numerico ser igual a True. Para reinstalar o componente, voc deve executar os seguintes procedimentos: 1. Selecionar o item Install Packages do menu Components. Ser exibida a caixa de dilogo Project Options, na qual dever ser selecionado o item Borland Delphi User, conforme indicado na figura a seguir.

Figura 21.7: A caixa de dilogo Project Options.

2. Selecione o boto Edit dessa caixa de dilogo. Ser exibida uma caixa de dilogo solicitando uma confirmao, e indicando que a caixa de dilogo Project Options ser fechada. 3. Ser exibida a caixa de dilogo do editor de pacotes. Selecione o boto Compile dessa caixa de dilogo, para recompilar o pacote. Dessa maneira, a partir desse momento, a propriedade Numerico ter o valor default igual a True e a proprieade Text o valor 0. Entretanto, se voc observar a descrio textual de um formulrio aps a incluso desse componente, ver que a descrio do objeto feita da seguinte maneira (os valores numricos podem variar um pouco):
object NumEdit1: TNumEdit Left = 208 Top = 168

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

357

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Width = 121 Height = 21 TabOrder = 0 Text = 0 Numerico = True End

Para que o valor default da propriedade Numerico do componente TNumEdit no seja armazenado na descrio textual do formulrio que o contm, torna-se necessrio redefinir a declarao da propriedade na definio da classe, como mostra o trecho de cdigo a seguir.
property Numerico : boolean read FNumerico write Fnumerico default True;

Repare que definir um valor default para a propriedade (ou campo) diferente de definir um valor default para a sua descrio textual no formulrio. A declarao de um valor default para o campo feita no construtor, ao passo que a definio de um valor default para definir a incluso ou no do valor da propriedade na descrio textual do formulrio que contm o componente feita na prpria definio da propriedade. Dessa maneira, se o valor da propriedade Numerico for igual a True, sua definio no ser mais includa na descrio textual do formulrio.

REDEFININDO MTODOS DA CLASSE-BASE


Nesse componente, como desejamos que o usurio s possa digitar valores numricos inteiros caso a propriedade Numerico seja igual a True, precisamos redefinir os mtodo KeyPress e Change existentes na classe-base, a serem implementados como mostrados nos trechos de cdigo apresentados a seguir.
procedure TNumEdit.KeyPress(var Key : Char); begin if FNumerico then begin if (not (key in [0..9',-,+,#8]))or((key in [+,-]) and (Pos(key,Text)>0)) then key := #0; end; inherited KeyPress(Key); end; procedure TNumEdit.Change; var indice : word; posinal : string; valorconvertido : integer; begin if FNumerico then begin indice := Pos(-,Text); if indice > 1 then begin posinal := Text; System.Delete(posinal, indice, 1); Text := -+posinal; end; indice := Pos(+,Text); if indice > 1

358 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


then begin posinal := Text; System.Delete(posinal, indice, 1); Text := ++posinal; end; try valorconvertido := StrToInt(Text); except on EConvertError do begin Numerico := False; end; end; end; inherited Change; end;

Com a implementao desse mtodo definida dessa maneira, caso o usurio insista em digitar um caractere invlido no componente na fase de projeto do aplicativo, o valor da propriedade Numerico ser redefinido como false. A redefinio da classe por completa apresentada a seguir.
type TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; protected { Protected declarations } procedure KeyPress(var Key : Char);override; procedure Change;override; public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } property Numerico : boolean read FNumerico write FNumerico default True; end;

A partir de ento, se o valor da propriedade Numerico for igual a True, apenas valores numricos podero ser digitados no componente durante a execuo de um aplicativo que o utilize. Dessa maneira, a utilizao do componente TNumEdit evita que se tenha de codificar os procedimentos associados aos eventos OnKeyPress e OnChange para cada caixa de texto, e exatamente este o objetivo de se criar novos componentes automatizar tarefas realizadas com freqncia no desenvolvimento dos seus aplicativos. Alm disso, da forma como foi definido, esse componente ainda pode ser utilizado como uma caixa de texto comum, bastando para isso que se defina como False o valor da sua propriedade Numerico. Considere agora a situao em que se prefere dar ao usurio a capacidade de definir o que deve ser feito caso a converso descrita anteriormente no seja possvel. O que fazer nesse caso? Que tal criarmos um evento que deve ser disparado quando isso ocorrer, e deixar a cargo do usurio a tarefa de tomar uma deciso? Embora este exemplo possa parecer meio simplrio, ao menos ajuda a esclarecer didaticamente o processo de definio de novos eventos para um componente. Alm disso, veremos como usar mtodos de leitura e escrita na definio de novas propriedades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

359

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

DEFININDO UM NOVO EVENTO PARA O COMPONENTE


Neste tpico definiremos um novo evento para o componente TNumEdit, cujo procedimento associado ser executado sempre que o usurio alterar para True o valor da propriedade Numerico do componente, mas o texto exibido pelo componente no puder ser convertido em nmero. Inicialmente, deve-se considerar o fato de que um evento , na realidade, uma propriedade. Isso mesmo: um evento uma propriedade especial, que aponta para uma funo a ser executada! O tipo mais bsico de evento o do tipo TNotifyEvent, cujo procedimento associado ter como parmetro uma nica varivel chamada Sender, da classe TObject. No nosso caso, definiremos um evento chamado OnErroConversao, alterando a definio da nossa classe como a seguir.
type TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; FOnErroConversao : TNotifyEvent; protected { Protected declarations } procedure KeyPress(var Key : Char);override; procedure Change;override; public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } property Numerico : boolean read FNumerico write Fnumerico default True; property OnErroConversao : TNotifyEvent read FOnErroConversao write FOnErroConversao; end;

Repare que, por ser uma propriedade, o evento OnErroConverso tambm possui um campo interno associado, denominado FOnErroConversao. No entanto, esse evento dever ser disparado quando o usurio alterar o valor da propriedade Numerico, e apenas se isso ocorrer durante a execuo do aplicativo. Dessa forma, devemos definir um mtodo de escrita para essa varivel, de modo a tratar esse fato. Um mtodo de escrita deve ter um nico parmetro, e este deve ser do mesmo tipo da propriedade acessada. Podemos ento definir, atravs do seguinte cdigo, um mtodo denominado AtribuiValor para a classe TNumEdit:
procedure TNumEdit.AtribuiValor(NovoValor : boolean); var valorconvertido : Integer; begin FNumerico := NovoValor; if not(NovoValor) then exit; try valorconvertido := StrToInt(Text); except on EConvertError do begin if (csdesigning in ComponentState) then Text := 0 else

360 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


if Assigned(FOnErroConversao) then FOnErroConversao(Self); end; end; end;

Nesse procedimento, verifica-se se o valor da propriedade Numerico est sendo alterada na fase de projeto do aplicativo, verificando-se se a propriedade ComponentState (que um conjunto) contm entre seus elementos a constante csdesigning que indica que a propriedade est sendo alterada na fase de projeto do aplicativo. A classe ter, conseqentemente, a sua definio alterada para:
type TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; FOnErroConversao : TNotifyEvent; protected { Protected declarations } procedure KeyPress(var Key : Char);override; procedure Change;override; procedure AtribuiValor(NovoValor : boolean); public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } property Numerico : boolean read FNumerico write AtribuiValor default True; property OnErroConversao : TNotifyEvent read FOnErroConversao write FOnErroConversao; end;

Repare que agora o valor da propriedade Numerico escrito no campo FNumerico atravs de um mtodo chamado AtribuiValor. Voc pode agora recompilar o pacote que contm este novo componente, incluir um componente NumEdit no formulrio e definir, da seguinte maneira, o procedimento associado ao seu evento OnErroConversao:
procedure TForm1.NumEdit1ErroConversao(Sender: TObject); begin NumEdit1.text := 0; end;

Dessa maneira, sempre que neste exemplo ocorrer um erro de converso durante a execuo do aplicativo, o valor da propriedade Text de NumEdit1 ser igual a 0. Isso foi definido pelo usurio do componente, que poder no ter acesso ao seu cdigo-fonte, mas poder decidir o que deve ser feito pelo programa quando houver um erro de converso.

O TIPO TNOTIFYEVENT
O tipo TNotifyEvent est definido da seguinte maneira na unit Classes:
type TNotifyEvent = procedure (Sender: TObject) of object;

Caso voc queira, pode definir outros tipos de eventos, como descrito a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

361

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


type TMeuEvento = procedure of object;

Nesse caso, se essa definio fosse includa antes da definio da classe TNumEdit, voc poderia definir FOnErroConversao como:
FOnErroConversao : TMeuEvento;

E a propriedade OnErroConversao teria de ser redefinida como:


property OnErroConversao : TMeuEvent read FOnErroConversao write FOnErroConversao;

No mtodo AtribuiEvento, a chamada do procedimento associado ao evento seria feita da seguinte maneira:
if Assigned(FOnErroConversao) then FOnErroConversao;

Repare que, nesse caso, no existiro mais parmetros a passar, pois voc usou o tipo TMeuEvento em vez de TNotifyEvent! Nada o impede, no entanto, de definir outros eventos com parmetros distintos. Repare os procedimentos associados a diversos eventos de um formulrio, e verifique as diferenas existentes em suas listas de parmetros.

DEFININDO UM MTODO DE LEITURA PARA UMA PROPRIEDADE


Nos tpicos anteriores foram apresentados os procedimentos necessrios definio de um mtodo de escrita para uma propriedade. A definio de um mtodo de leitura segue procedimentos semelhantes, devendo-se considerar, no entanto, que: Enquanto um mtodo de escrita um procedimento, um mtodo de leitura deve ser uma funo, cujo tipo de retorno deve ser o mesmo tipo definido para a propriedade. Enquanto um mtodo de escrita deve possuir um parmetro, uma funo no deve possuir nenhum (excetuando-se o caso de propriedades definidas como arrays). Dessa maneira, um mtodo de leitura definido de maneira bastante simples, com o objetivo de obter o valor da propriedade Numerico, poderia ser implementado da seguinte maneira:
function TNumEdit.LeValor : boolean; begin result := FNumerico; end;

Repare que esse mtodo bastante simples, e pouco acrescenta ao mtodo de acesso direto, pois apenas retorna o valor armazenado no campo FNumerico da classe. Nosso objetivo, contudo, foi mostrar os procedimentos necessrios definio de um mtodo de leitura para uma propriedade de um componente. No Delphi, os mtodos de leitura e de escrita costumam ter os seus nomes iniciados com as palavras Get e Set, respectivamente. Esta , no entanto, apenas uma conveno, pois, conforme mostrado anteriormente, os mtodos podem ter qualquer nome vlido, de acordo com as regras da linguagem Object Pascal. De qualquer forma, nos prximos tpicos seguiremos as convenes do Delphi. Apresenta-se a seguir o cdigo final da unit que define a classe TNumEdit:

362 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


unit NumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TNumEdit = class(TEdit) private { Private declarations } FNumerico : boolean; FOnErroConversao : TNotifyEvent; protected { Protected declarations } procedure KeyPress(var Key : Char);override; procedure Change;override; procedure AtribuiValor(NovoValor : boolean); function LeValor : boolean; public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } property Numerico : boolean read Levalor write AtribuiValor default True; property OnErroConversao : TNotifyEvent read FOnErroConversao write FOnErroConversao; end; procedure Register; implementation function TNumEdit.LeValor : boolean; begin result := FNumerico; end; procedure TNumEdit.AtribuiValor(NovoValor : boolean); var valorconvertido : Integer; begin FNumerico := NovoValor; if not(NovoValor) then exit; try valorconvertido := StrToInt(Text); except on EConvertError do begin if (csdesigning in ComponentState) then Text := 0 else if Assigned(FOnErroConversao) then FOnErroConversao(Self); end; end; end; procedure TNumEdit.KeyPress(var Key : Char); begin if FNumerico then begin if (not (key in [0..9',-,+,#8]))or((key in [+,-]) and (Pos(key,Text)>0)) then key := #0; end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

363

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


inherited KeyPress(Key); end; procedure TNumEdit.Change; var indice : word; posinal : string; valorconvertido : integer; begin if FNumerico then begin indice := Pos(-,Text); if indice > 1 then begin posinal := Text; System.Delete(posinal, indice, 1); Text := -+posinal; end; indice := Pos(+,Text); if indice > 1 then begin posinal := Text; System.Delete(posinal, indice, 1); Text := ++posinal; end; try valorconvertido := StrToInt(Text); except on EConvertError do begin Numerico := False; end; end; end; inherited Change; end; constructor TNumEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FNumerico := True; Text := 0; end; procedure Register; begin RegisterComponents(KnowHow, [TNumEdit]); end; end.

KNOW-HOW EM: CRIAO DE COMPONENTES ASSOCIADOS A BANCOS DE DADOS


PR-REQUISITOS
Fundamentos da programao orientada a objetos com o Delphi 7.

364 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


Experincia prvia na utilizao de componentes no desenvolvimento de aplicaes com Delphi 7. Fundamentos bsicos da criao de componentes em Delphi 7.

METODOLOGIA
Apresentao do problema: Associao de um componente ao valor armazenado em um campo de uma tabela de um banco de dados.

TCNICA
Apresentao dos procedimentos necessrios criao de componentes associados a bancos de dados.

APRESENTAO DO PROBLEMA
Nos tpicos anteriores foram apresentados os procedimentos necessrios criao de novos componentes com o Delphi 7. Existem situaes, no entanto, em que o valor exibido pelo componente deve refletir o valor armazenado em um campo de uma tabela. Alm disso, qualquer alterao feita no valor exibido pelo componente deve ser refletida no valor armazenado na tabela. Nos tpicos subseqentes, sero apresentados os procedimentos necessrios converso do componente TNumEdit, descrito e desenvolvido nos tpicos anteriores, em um componente associado a um banco de dados (ou, como costuma-se denominar na linguagem object Pascal, um componente data-aware) que ser denominado TDBNumEdit.

CRIANDO O ESQUELETO DO NOVO COMPONENTE


O novo componente ser denominado TDBNumEdit, e ser derivado diretamente do componente TNumEdit. Para criar o esqueleto desse novo componente, basta executar os procedimentos descritos no incio deste captulo, e salvar a unit na qual ser armazenada a definio do componente com o nome DBNumEdit.pas. Inicialmente, esse arquivo apresentar o cdigo reproduzido a seguir.
unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit; type TDBNumEdit = class(TNumEdit) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations }

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

365

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


end; procedure Register; implementation procedure Register; begin RegisterComponents(AXCEL, [TDBNumEdit]); end; end.

Como j deve ser do seu conhecimento, os componentes associados a um banco de dados costumam apresentar as seguintes propriedades: DataSource: Que identifica o objeto da classe TDataSource ao qual o componente est vinculado. DataField: O nome do campo da tabela cujo valor do registro corrente ser exibido e/ou editado pelo componente. A princpio, seria natural que se criassem dois campos internos, denominados FDataSource (do tipo TDataSource) e FDataField (do tipo string) para armazenarem internamente os valores dessas propriedades. Ocorre no entanto que, para simplificar o desenvolvimento de componentes associados a bancos de dados, a Borland incorporou biblioteca de classes do Delphi uma classe chamada TFieldDataLink, a partir da qual poderemos criar um objeto responsvel pela associao do componente ao banco de dados. A classe TFieldDataLink possui, entre outras, as seguintes propriedades: DataSource: Que identificar o componente da classe TDataSource ao qual o nosso componente ser vinculado. FieldName: Que identificar o nome do campo ao qual o nosso componente ser vinculado. Conseqentemente, em vez de criarmos campos internos para armazenar os valores das propriedades DataSource e DataField do nosso componente, podemos utilizar as propriedades DataSource e FieldName de um objeto da classe TFieldDataLink (a ser criado e destrudo pelo nosso componente) nos mtodos de acesso dessas propriedades. Alm disso, como a classe TFieldDataLink est definida na unit dbctrls, o nome dessa unit dever ser includo na clusula uses da unit que define a classe TBDNumEdit, e o mesmo se aplica unit db, na qual est definida a classe TDataSource.

DEFININDO AS NOVAS PROPRIEDADES PARA O COMPONENTE


Conforme descrito anteriormente, as propriedades DataSource e DataField do componente sero armazenadas em um objeto da classe TFieldDataLink. Conseqentemente, precisamos definir um campo interno como um objeto dessa classe, incluindo-se a seguinte linha de cdigo na seo private da classe que define o componente:
FDataLink : TFieldDataLink;

366 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


Alm disso, como as propriedades DataSource e DataField sero na realidade armazenadas em propriedades do objeto FDataLink, precisamos definir mtodos de leitura e de escrita para essas propriedades, o que pode ser feito incluindo-se as seguintes linhas de cdigo na seo private da classe que define o componente (e usando as denominaes Get para leitura e Set para escrita):
function GetDataSource : TDataSource; Procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string);

As propriedades so definidas incluindo-se as seguintes linhas de cdigo na seo public da classe que define o componente:
property DataSource : TDataSource read GetDataSource write SetDataSource; property DataField : string read GetDataField write SetDataField;

Os mtodos de leitura e escrita devero ser implementados como mostrados nos trechos de cdigo apresentados a seguir.
function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string); begin FDataLink.FieldName := Value; end;

Conforme descrito anteriormente, nosso componente ser responsvel por criar e destruir o objeto FDataLink, o que deve ser feito sobrecarregando-se os mtodos construtor e destrutor do componente. No mtodo construtor devero ser includas as seguintes linhas de cdigo:
inherited Create(AOwner); FDataLink := TFieldDataLink.Create;

Lembre-se de que o mtodo construtor um mtodo virtual, e que estamos sobrecarregando o mtodo construtor da classe-base. No mtodo destrutor devero ser includas as seguintes linhas de cdigo:
FDataLink.Free; inherited Destroy;

Apresenta-se a seguir o cdigo da unit que define a classe TDBNumEdit, aps terem sido feitas as alteraes descritas anteriormente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

367

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit, dbCtrls, db; type TDBNumEdit = class(TNumEdit) private { Private declarations } FDataLink : TFieldDataLink; function GetDataSource : TDataSource; procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent);override; destructor Destroy;override; published { Published declarations } property DataSource : TDataSource read GetDataSource write SetDataSource; property DataField : string read GetDataField write SetDataField; end; procedure Register; implementation constructor TDBNumEdit.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; inherited Create(AOwner); end; destructor TDBNumEdit.Destroy; begin FDataLink.Free; inherited Destroy; end; function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string); begin FDataLink.FieldName := Value; end;

368 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


procedure Register; begin RegisterComponents(KnowHow, [TDBNumEdit]); end; end.

REFLETINDO ALTERAES FEITAS NO CAMPO


Uma das caractersticas do nosso componente deve ser a capacidade de refletir as alteraes feitas no campo da tabela a ela associada. Para facilitar a implementao dessa caracterstica, a classe TFieldDataLink tem o evento OnDataChange, cujo procedimento associado executado sempre que o valor armazenado no campo alterado. Entretanto, como essa classe no define um componente, seus eventos no podem ser acessados atravs do Object Inspector, e a associao de um procedimento a esse evento deve ser feita mediante uma adequada codificao. Nesse caso, devem-se executar os seguintes procedimentos: 1. Definir um mtodo para o componente, a ser associado ao evento OnDataChange do objeto FDataLink, da classe TFieldDataLink. Neste exemplo, criaremos um mtodo chamado DataChange, responsvel por atualizar o texto exibido pelo componente. Esse mtodo deve ser declarado na seo private da classe que define o componente, e implementado da seguinte maneira:
procedure TDBNumEdit.DataChange(Sender : TObject); begin try Text := FDataLink.Field.Text; except Text := 0; end; end;

Inclumos um tratamento de exceo para o caso de no haver sucesso na associao desejada. 2. Associar esse procedimento ao evento OnDataChange do objeto FDataLink, o que pode ser feito incluindo-se a seguinte linha de cdigo no mtodo construtor do componente:
FDataLink.OnDataChange := DataChange;

Apresenta-se a seguir o cdigo da unit que define a classe TDBNumEdit, aps terem sido feitas as alteraes descritas anteriormente.
unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit, dbCtrls, db;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

369

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


type TDBNumEdit = class(TNumEdit) private { Private declarations } FDataLink : TFieldDataLink; function GetDataSource : TDataSource; procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string); procedure DataChange(Sender : TObject); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent);override; destructor Destroy;override; published { Published declarations } property DataSource : TDataSource read GetDataSource write SetDataSource; property DataField : string read GetDataField write SetDataField; end; procedure Register; implementation procedure TDBNumEdit.DataChange(Sender : TObject); begin try Text := FDataLink.Field.Text; except Text := 0; end; end; constructor TDBNumEdit.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; inherited Create(AOwner); FDataLink.OnDataChange := DataChange; end; destructor TDBNumEdit.Destroy; begin FDataLink.Free; inherited Destroy; end; function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string);

370 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


begin FDataLink.FieldName := Value; end; procedure Register; begin RegisterComponents(KnowHow, [TDBNumEdit]); end; end.

REFLETINDO ALTERAES FEITAS NO COMPONENTE


Uma das caractersticas do nosso novo componente deve ser a capacidade de refletir no campo associado as alteraes feitas no valor por ele exibido. Para facilitar a implementao dessa caracterstica, a classe TFieldDataLink tem o evento OnUpdateData, cujo procedimento associado executado sempre que o valor armazenado no campo deve ser modificado. Nesse caso a associao de um procedimento a esse evento tambm deve ser feita mediante uma adequada codificao. Nesse caso, devem-se executar os seguintes procedimentos: 1. Definir um mtodo para o componente, a ser associado ao evento OnUpdateData do objeto FDataLink, da classe TFieldDataLink. Neste exemplo, criaremos um mtodo chamado UpdateData, responsvel por atualizar no campo o texto exibido pelo componente. Esse mtodo deve ser declarado na seo private da classe que define o componente, e implementado da seguinte maneira:
procedure TDBNumEdit.UpdateData(Sender : TObject); begin try FDataLink.Field.Text := Text; except begin FDataLink.Edit; FDataLink.Field.Text := Text; end; end; end;

Nesse mtodo, caso ocorra uma exceo na tentativa de se atualizar o campo, o objeto FDataLink colocado em modo de edio e a alterao efetivada. 2. Associar esse procedimento ao evento OnUpdateData do objeto FDataLink, o que pode ser feito incluindo-se a seguinte linha de cdigo no mtodo construtor do componente:
FDataLink.OnUpdateData := UpdateData;

3. Sobrecarregar o mtodo Change da classe-base, de maneira que o valor armazenado no campo seja alterado sempre que o usurio alterar o texto exibido pelo componente. A implementao do mtodo Change deve ser feita da maneira apresentada a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

371

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Repare que esse mtodo responsvel por chamar os mtodos Modified e UpdateRecord do objeto FDataLink, este responsvel por gerar o seu evento OnUpdateData e conseqentemente executar o procedimento a ele associado.
procedure TDBNumEdit.Change; begin FDataLink.ModiFied; inherited Change; try FDataLink.Edit; FDataLink.UpdateRecord; except end; end;

Apresenta-se a seguir o cdigo da unit que define a classe TDBNumEdit, aps terem sido feitas as alteraes descritas anteriormente.
unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit, dbCtrls, db; type TDBNumEdit = class(TNumEdit) private { Private declarations } FDataLink : TFieldDataLink; function GetDataSource : TDataSource; procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string); procedure DataChange(Sender : TObject); procedure UpdateData(Sender : TObject); procedure Change;override; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent);override; destructor Destroy;override; published { Published declarations } property DataSource : TDataSource read GetDataSource write SetDataSource; property DataField : string read GetDataField write SetDataField; end; procedure Register; implementation procedure TDBNumEdit.Change; begin FDataLink.ModiFied; inherited Change; try FDataLink.Edit; FDataLink.UpdateRecord; except

372 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


end; end; procedure TDBNumEdit.UpdateData(Sender : TObject); begin try FDataLink.Field.Text := Text; except begin FDataLink.Edit; FDataLink.Field.Text := Text; end; end; end; procedure TDBNumEdit.DataChange(Sender : TObject); begin try Text := FDataLink.Field.Text; except Text := 0; end; end; constructor TDBNumEdit.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; inherited Create(AOwner); FDataLink.OnDataChange := DataChange; FDataLink.OnUpdateData := UpdateData; end; destructor TDBNumEdit.Destroy; begin FDataLink.Free; inherited Destroy; end; function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string); begin FDataLink.FieldName := Value; end; procedure Register; begin RegisterComponents(KnowHow, [TDBNumEdit]); end; end.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

373

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

NOTIFICANDO O COMPONENTE DA REMOO DE UM DATASOURCE


Da forma como nosso componente est implementado, se removermos o componente DataSource do formulrio, a propriedade DataSource do componente no apresentar nenhum valor (o que est correto) mas o valor da propriedade DataField no alterado (o que est errado). A soluo desse problema consiste em sobrecarregar o mtodo Notification do seu componente ancestral. Esse mtodo executado sempre que um componente inserido ou movido do formulrio, e recebe como parmetros: Um ponteiro para o componente que foi inserido ou removido. Uma varivel do tipo TOperation, que identifica a operao realizada sobre o componente. Neste exemplo, devemos remover o valor exibido na propriedade DataField sempre que o DataSource associado for removido, o que pode ser feito implementando-se da seguinte maneira o mtodo Notification do componente:
procedure TDBNumEdit.Notification(AComponent : TComponent;Operation : TOperation); begin if (Operation = opRemove)and(AComponent is TDataSource)and(FDataLink.DataSource = nil) then FDataLink.FieldName := ; end;

Apresenta-se a seguir o cdigo da unit que define a classe TDBNumEdit, aps terem sido feitas as alteraes descritas anteriormente.
unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit, dbCtrls, db; type TDBNumEdit = class(TNumEdit) private { Private declarations } FDataLink : TFieldDataLink; function GetDataSource : TDataSource; procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string); procedure DataChange(Sender : TObject); procedure UpdateData(Sender : TObject); procedure Change;override; protected { Protected declarations } procedure Notification(AComponent : TComponent;Operation : TOperation);override; public { Public declarations } constructor Create(AOwner: TComponent);override; destructor Destroy;override; published { Published declarations } property DataSource : TDataSource read GetDataSource write SetDataSource;

374 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


property DataField : string read GetDataField write SetDataField; end; procedure Register; implementation procedure TDBNumEdit.Notification(AComponent : TComponent;Operation : TOperation); begin if (Operation = opRemove)and(AComponent is TDataSource)and(FDataLink.DataSource = nil) then FDataLink.FieldName := ; end; procedure TDBNumEdit.Change; begin FDataLink.ModiFied; inherited Change; try FDataLink.Edit; FDataLink.UpdateRecord; except end; end; procedure TDBNumEdit.UpdateData(Sender : TObject); begin try FDataLink.Field.Text := Text; except begin FDataLink.Edit; FDataLink.Field.Text := Text; end; end; end; procedure TDBNumEdit.DataChange(Sender : TObject); begin try Text := FDataLink.Field.Text; except Text := 0; end; end; constructor TDBNumEdit.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; inherited Create(AOwner); FDataLink.OnDataChange := DataChange; FDataLink.OnUpdateData := UpdateData; end; destructor TDBNumEdit.Destroy; begin FDataLink.Free; inherited Destroy; end; function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

375

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string); begin FDataLink.FieldName := Value; end; procedure Register; begin RegisterComponents(KnowHow, [TDBNumEdit]); end; end.

CRIANDO UMA PROPRIEDADE QUE PERMITA TRATAR A TECLA ENTER COMO TAB
Normalmente os usurios de aplicaes desenvolvidas para o ambiente Windows, principalmente aqueles acostumados a utilizar aplicaes desenvolvidas para o ambiente MS-DOS, preferem utilizar a tecla Enter em vez da tecla Tab, para alterar o componente que recebe o foco. Como j deve ser do seu conhecimento, essa caracterstica pode ser implementada incluindo-se o seguinte trecho de cdigo no procedimento associado ao evento OnKeyPress do componente:
if key = #13 then begin Key := #0; Perform(WM_NEXTDLGCTL,0,0); end;

Com essa codificao, ao se pressionar a tecla Enter o foco ser deslocado para o prximo componente (seguindo-se a ordem estabelecida para a propriedade TabOrder dos componentes). Evidentemente, seria muito mais simples incluir essa caracterstica em uma propriedade do componente. Neste exemplo, definiremos para o componente DBNumEdit uma propriedade chamada TabEnter, do tipo booleano, que se for igual a true (seu valor default) far com que, ao se pressionar a tecla Enter, o prximo componente receba o foco. Para implementar essa propriedade devemos redefinir da seguinte maneira a unit que define o componente:
unit DBNumEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NumEdit, dbCtrls, db; type TDBNumEdit = class(TNumEdit)

376 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


private { Private declarations } FDataLink : TFieldDataLink; FTabEnter : boolean; function GetDataSource : TDataSource; procedure SetDataSource(Value : TDataSource); function GetDataField : string; procedure SetDataField(Value : string); procedure DataChange(Sender : TObject); procedure UpdateData(Sender : TObject); procedure Change;override; procedure KeyPress(var Key : Char);override; protected { Protected declarations } procedure Notification(AComponent : TComponent;Operation : TOperation);override; public { Public declarations } constructor Create(AOwner: TComponent);override; destructor Destroy;override; published { Published declarations } property DataSource : TDataSource read GetDataSource write SetDataSource; property DataField : string read GetDataField write SetDataField; property TabEnter : boolean read FTabEnter write FTabEnter default True; end; procedure Register; implementation procedure TDBNumEdit.KeyPress(var Key : Char); Begin if (key = #13) and (TabEnter) then begin Key := #0; (Parent as TComponent).Perform(WM_NEXTDLGCTL,0,0); end else inherited KeyPress(Key); end; procedure TDBNumEdit.Notification(AComponent : TComponent;Operation : TOperation); begin if (Operation = opRemove)and(AComponent is TDataSource)and(FDataLink.DataSource = nil) then FDataLink.FieldName := ; end; procedure TDBNumEdit.Change; begin FDataLink.ModiFied; inherited Change; try FDataLink.Edit; FDataLink.UpdateRecord; except end; end; procedure TDBNumEdit.UpdateData(Sender : TObject); begin try FDataLink.Field.Text := Text; except begin

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

377

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


FDataLink.Edit; FDataLink.Field.Text := Text; end; end; end; procedure TDBNumEdit.DataChange(Sender : TObject); begin try Text := FDataLink.Field.Text; except Text := 0; end; end; constructor TDBNumEdit.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; inherited Create(AOwner); FDataLink.OnDataChange := DataChange; FDataLink.OnUpdateData := UpdateData; end; destructor TDBNumEdit.Destroy; begin FDataLink.Free; inherited Destroy; end; function TDBNumEdit.GetDataSource : TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBNumEdit.SetDataSource(Value : TDataSource); begin FDataLink.DataSource := Value; end; function TDBNumEdit.GetDataField : string; begin Result := FDataLink.FieldName; end; procedure TDBNumEdit.SetDataField(Value : string); begin FDataLink.FieldName := Value; end; procedure Register; begin RegisterComponents(KnowHow, [TDBNumEdit]); end; end.

Repare que, como queremos que o mtodo Perform seja executado no formulrio (ou objeto) que contm o componente, o cdigo correto :
(Parent as TComponent).Perform(WM_NEXTDLGCTL,0,0);

e no simplesmente

378 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


Perform(WM_NEXTDLGCTL,0,0);

Esta ltima linha de cdigo no surtiria nenhum efeito. Repare ainda que foi necessrio sobrecarregar o mtodo KeyPress da classe-base.

Esta ltima propriedade poderia ser definida na classe TNumEdit. Neste caso, estaria tambm presente na classe TDBNumEdit, derivada por herana da classe TNumEdit.

KNOW-HOW EM: CRIAO DE CONTROLES ACTIVEX


PR-REQUISITOS
Fundamentos da programao orientada a objetos com o Delphi 7. Experincia prvia na criao de componentes com o Delphi 7.

METODOLOGIA
Apresentao do problema: Criao de controles ActiveX a partir de componentes desenvolvidos em Delphi 7.

TCNICA
Apresentao dos procedimentos necessrios criao de Controles ActiveX.

APRESENTAO DO PROBLEMA
Conforme descrito nos tpicos precedentes, a criao de componentes usando-se a linguagem Object Pascal no oferece maiores dificuldades. Considere agora a seguinte situao: voc precisa desenvolver uma aplicao usando uma outra ferramenta de desenvolvimento que no o Delphi 7, e nessa aplicao precisa utilizar um componente (no disponvel no ambiente) cujas caractersticas sejam idnticas s existentes em um componente desenvolvido em Object Pascal. Se esse ambiente de desenvolvimento manipular controles ActiveX, e entre as caractersticas desejadas para o componente no se inclurem aquelas relacionadas manipulao de bancos de dados, a sua tarefa ser bastante simples, pois o Delphi 7 permite que se converta, de forma simples e rpida, um componente Delphi em um controle ActiveX (desde que esse componente no seja data-aware). A ttulo de exemplificao, apresentaremos nos tpicos subseqentes os procedimentos necessrios converso do componente NumEdit em um controle ActiveX.

CONVERTENDO O COMPONENTE NUMEDIT EM UM CONTROLE ACTIVEX


Para transformar o componente NumEdit em um controle ActiveX, voc deve executar os seguintes procedimentos: 1. Selecione o item New do menu File para exibir a caixa de dilogo New Items.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

379

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


2. Selecione o item ActiveX Control da pgina ActiveX dessa caixa de dilogo, como mostrado na figura a seguir.

Figura 21.8: A caixa de dilogo New Items.

3. Selecione o boto Ok, para fechar essa caixa de dilogo e exibir a caixa de dilogo ActiveX Control Wizard, mostrada na figura a seguir.

Figura 21.9: A caixa de dilogo ActiveX Control Wizard.

Nessa caixa de dilogo, devem-se definir: O nome da classe que define o componente a partir do qual ser gerado o controle ActiveX. O nome do controle ActiveX que ser gerado. O nome da unit na qual ser implementado o controle. O nome do projeto responsvel pela gerao do controle ActiveX. O modelo de Thread empregado. 4. Selecione o boto Ok, para fechar essa caixa de dilogo. Caso o projeto corrente no corresponda a uma biblioteca ActiveX, ser exibida a mensagem de advertncia mostrada na figura a seguir. Selecione o boto Ok para gerar o novo projeto.

380 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES

Figura 21.10: A mensagem de advertncia.

Ser ento criada a unit responsvel pela gerao do controle ActiveX, cujo cdigo reproduzido a seguir.
unit NumEditImpl1; {$WARN SYMBOL_PLATFORM OFF} interface uses Windows, ActiveX, Classes, Controls, Graphics, Menus, Forms, StdCtrls, ComServ, StdVCL, AXCtrls, NumEditXControl1_TLB, NumEdit; type TNumEditX = class(TActiveXControl, INumEditX) private { Private declarations } FDelphiControl: TNumEdit; FEvents: INumEditXEvents; procedure ChangeEvent(Sender: TObject); procedure ClickEvent(Sender: TObject); procedure DblClickEvent(Sender: TObject); procedure ErroConversaoEvent(Sender: TObject); procedure KeyPressEvent(Sender: TObject; var Key: Char); protected { Protected declarations } procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override; procedure EventSinkChanged(const EventSink: IUnknown); override; procedure InitializeControl; override; function DrawTextBiDiModeFlagsReadingOnly: Integer; safecall; function Get_AlignDisabled: WordBool; safecall; function Get_AutoSelect: WordBool; safecall; function Get_AutoSize: WordBool; safecall; function Get_BevelInner: TxBevelCut; safecall; function Get_BevelKind: TxBevelKind; safecall; function Get_BevelOuter: TxBevelCut; safecall; function Get_BorderStyle: TxBorderStyle; safecall; function Get_CanUndo: WordBool; safecall; function Get_CharCase: TxEditCharCase; safecall; function Get_Color: OLE_COLOR; safecall; function Get_Ctl3D: WordBool; safecall; function Get_DoubleBuffered: WordBool; safecall; function Get_DragCursor: Smallint; safecall; function Get_DragMode: TxDragMode; safecall; function Get_Enabled: WordBool; safecall; function Get_Font: IFontDisp; safecall; function Get_HideSelection: WordBool; safecall; function Get_ImeMode: TxImeMode; safecall; function Get_ImeName: WideString; safecall; function Get_MaxLength: Integer; safecall; function Get_Modified: WordBool; safecall; function Get_Numerico: WordBool; safecall; function Get_OEMConvert: WordBool; safecall; function Get_ParentColor: WordBool; safecall; function Get_ParentCtl3D: WordBool; safecall;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

381

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


function Get_PasswordChar: Smallint; safecall; function Get_ReadOnly: WordBool; safecall; function Get_SelLength: Integer; safecall; function Get_SelStart: Integer; safecall; function Get_SelText: WideString; safecall; function Get_Text: WideString; safecall; function Get_Visible: WordBool; safecall; function Get_VisibleDockClientCount: Integer; safecall; function IsRightToLeft: WordBool; safecall; function UseRightToLeftReading: WordBool; safecall; function UseRightToLeftScrollBar: WordBool; safecall; procedure _Set_Font(var Value: IFontDisp); safecall; procedure Clear; safecall; procedure ClearSelection; safecall; procedure ClearUndo; safecall; procedure CopyToClipboard; safecall; procedure CutToClipboard; safecall; procedure InitiateAction; safecall; procedure PasteFromClipboard; safecall; procedure SelectAll; safecall; procedure Set_AutoSelect(Value: WordBool); safecall; procedure Set_AutoSize(Value: WordBool); safecall; procedure Set_BevelInner(Value: TxBevelCut); safecall; procedure Set_BevelKind(Value: TxBevelKind); safecall; procedure Set_BevelOuter(Value: TxBevelCut); safecall; procedure Set_BorderStyle(Value: TxBorderStyle); safecall; procedure Set_CharCase(Value: TxEditCharCase); safecall; procedure Set_Color(Value: OLE_COLOR); safecall; procedure Set_Ctl3D(Value: WordBool); safecall; procedure Set_DoubleBuffered(Value: WordBool); safecall; procedure Set_DragCursor(Value: Smallint); safecall; procedure Set_DragMode(Value: TxDragMode); safecall; procedure Set_Enabled(Value: WordBool); safecall; procedure Set_Font(const Value: IFontDisp); safecall; procedure Set_HideSelection(Value: WordBool); safecall; procedure Set_ImeMode(Value: TxImeMode); safecall; procedure Set_ImeName(const Value: WideString); safecall; procedure Set_MaxLength(Value: Integer); safecall; procedure Set_Modified(Value: WordBool); safecall; procedure Set_Numerico(Value: WordBool); safecall; procedure Set_OEMConvert(Value: WordBool); safecall; procedure Set_ParentColor(Value: WordBool); safecall; procedure Set_ParentCtl3D(Value: WordBool); safecall; procedure Set_PasswordChar(Value: Smallint); safecall; procedure Set_ReadOnly(Value: WordBool); safecall; procedure Set_SelLength(Value: Integer); safecall; procedure Set_SelStart(Value: Integer); safecall; procedure Set_SelText(const Value: WideString); safecall; procedure Set_Text(const Value: WideString); safecall; procedure Set_Visible(Value: WordBool); safecall; procedure SetSubComponent(IsSubComponent: WordBool); safecall; procedure Undo; safecall; end; implementation uses ComObj; { TNumEditX } procedure TNumEditX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); begin {TODO: Define property pages here. Property pages are defined by calling DefinePropertyPage with the class id of the page. For example,

382 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


DefinePropertyPage(Class_NumEditXPage); } end; procedure TNumEditX.EventSinkChanged(const EventSink: IUnknown); begin FEvents := EventSink as INumEditXEvents; end; procedure TNumEditX.InitializeControl; begin FDelphiControl := Control as TNumEdit; FDelphiControl.OnChange := ChangeEvent; FDelphiControl.OnClick := ClickEvent; FDelphiControl.OnDblClick := DblClickEvent; FDelphiControl.OnErroConversao := ErroConversaoEvent; FDelphiControl.OnKeyPress := KeyPressEvent; end; function TNumEditX.DrawTextBiDiModeFlagsReadingOnly: Integer; begin Result := FDelphiControl.DrawTextBiDiModeFlagsReadingOnly; end; function TNumEditX.Get_AlignDisabled: WordBool; begin Result := FDelphiControl.AlignDisabled; end; function TNumEditX.Get_AutoSelect: WordBool; begin Result := FDelphiControl.AutoSelect; end; function TNumEditX.Get_AutoSize: WordBool; begin Result := FDelphiControl.AutoSize; end; function TNumEditX.Get_BevelInner: TxBevelCut; begin Result := Ord(FDelphiControl.BevelInner); end; function TNumEditX.Get_BevelKind: TxBevelKind; begin Result := Ord(FDelphiControl.BevelKind); end; function TNumEditX.Get_BevelOuter: TxBevelCut; begin Result := Ord(FDelphiControl.BevelOuter); end; function TNumEditX.Get_BorderStyle: TxBorderStyle; begin Result := Ord(FDelphiControl.BorderStyle); end; function TNumEditX.Get_CanUndo: WordBool; begin Result := FDelphiControl.CanUndo; end; function TNumEditX.Get_CharCase: TxEditCharCase;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

383

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


begin Result := Ord(FDelphiControl.CharCase); end; function TNumEditX.Get_Color: OLE_COLOR; begin Result := OLE_COLOR(FDelphiControl.Color); end; function TNumEditX.Get_Ctl3D: WordBool; begin Result := FDelphiControl.Ctl3D; end; function TNumEditX.Get_DoubleBuffered: WordBool; begin Result := FDelphiControl.DoubleBuffered; end; function TNumEditX.Get_DragCursor: Smallint; begin Result := Smallint(FDelphiControl.DragCursor); end; function TNumEditX.Get_DragMode: TxDragMode; begin Result := Ord(FDelphiControl.DragMode); end; function TNumEditX.Get_Enabled: WordBool; begin Result := FDelphiControl.Enabled; end; function TNumEditX.Get_Font: IFontDisp; begin GetOleFont(FDelphiControl.Font, Result); end; function TNumEditX.Get_HideSelection: WordBool; begin Result := FDelphiControl.HideSelection; end; function TNumEditX.Get_ImeMode: TxImeMode; begin Result := Ord(FDelphiControl.ImeMode); end; function TNumEditX.Get_ImeName: WideString; begin Result := WideString(FDelphiControl.ImeName); end; function TNumEditX.Get_MaxLength: Integer; begin Result := FDelphiControl.MaxLength; end; function TNumEditX.Get_Modified: WordBool; begin Result := FDelphiControl.Modified; end;

384 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


function TNumEditX.Get_Numerico: WordBool; begin Result := FDelphiControl.Numerico; end; function TNumEditX.Get_OEMConvert: WordBool; begin Result := FDelphiControl.OEMConvert; end; function TNumEditX.Get_ParentColor: WordBool; begin Result := FDelphiControl.ParentColor; end; function TNumEditX.Get_ParentCtl3D: WordBool; begin Result := FDelphiControl.ParentCtl3D; end; function TNumEditX.Get_PasswordChar: Smallint; begin Result := Smallint(FDelphiControl.PasswordChar); end; function TNumEditX.Get_ReadOnly: WordBool; begin Result := FDelphiControl.ReadOnly; end; function TNumEditX.Get_SelLength: Integer; begin Result := FDelphiControl.SelLength; end; function TNumEditX.Get_SelStart: Integer; begin Result := FDelphiControl.SelStart; end; function TNumEditX.Get_SelText: WideString; begin Result := WideString(FDelphiControl.SelText); end; function TNumEditX.Get_Text: WideString; begin Result := WideString(FDelphiControl.Text); end; function TNumEditX.Get_Visible: WordBool; begin Result := FDelphiControl.Visible; end; function TNumEditX.Get_VisibleDockClientCount: Integer; begin Result := FDelphiControl.VisibleDockClientCount; end; function TNumEditX.IsRightToLeft: WordBool; begin Result := FDelphiControl.IsRightToLeft; end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

385

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


function TNumEditX.UseRightToLeftReading: WordBool; begin Result := FDelphiControl.UseRightToLeftReading; end; function TNumEditX.UseRightToLeftScrollBar: WordBool; begin Result := FDelphiControl.UseRightToLeftScrollBar; end; procedure TNumEditX._Set_Font(var Value: IFontDisp); begin SetOleFont(FDelphiControl.Font, Value); end; procedure TNumEditX.ChangeEvent(Sender: TObject); begin if FEvents <> nil then FEvents.OnChange; end; procedure TNumEditX.Clear; begin FDelphiControl.Clear; end; procedure TNumEditX.ClearSelection; begin FDelphiControl.ClearSelection; end; procedure TNumEditX.ClearUndo; begin FDelphiControl.ClearUndo; end; procedure TNumEditX.ClickEvent(Sender: TObject); begin if FEvents <> nil then FEvents.OnClick; end; procedure TNumEditX.CopyToClipboard; begin FDelphiControl.CopyToClipboard; end; procedure TNumEditX.CutToClipboard; begin FDelphiControl.CutToClipboard; end; procedure TNumEditX.DblClickEvent(Sender: TObject); begin if FEvents <> nil then FEvents.OnDblClick; end; procedure TNumEditX.ErroConversaoEvent(Sender: TObject); begin if FEvents <> nil then FEvents.OnErroConversao; end; procedure TNumEditX.InitiateAction; begin FDelphiControl.InitiateAction; end;

386 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


procedure TNumEditX.KeyPressEvent(Sender: TObject; var Key: Char); var TempKey: Smallint; begin TempKey := Smallint(Key); if FEvents <> nil then FEvents.OnKeyPress(TempKey); Key := Char(TempKey); end; procedure TNumEditX.PasteFromClipboard; begin FDelphiControl.PasteFromClipboard; end; procedure TNumEditX.SelectAll; begin FDelphiControl.SelectAll; end; procedure TNumEditX.Set_AutoSelect(Value: WordBool); begin FDelphiControl.AutoSelect := Value; end; procedure TNumEditX.Set_AutoSize(Value: WordBool); begin FDelphiControl.AutoSize := Value; end; procedure TNumEditX.Set_BevelInner(Value: TxBevelCut); begin FDelphiControl.BevelInner := TBevelCut(Value); end; procedure TNumEditX.Set_BevelKind(Value: TxBevelKind); begin FDelphiControl.BevelKind := TBevelKind(Value); end; procedure TNumEditX.Set_BevelOuter(Value: TxBevelCut); begin FDelphiControl.BevelOuter := TBevelCut(Value); end; procedure TNumEditX.Set_BorderStyle(Value: TxBorderStyle); begin FDelphiControl.BorderStyle := TBorderStyle(Value); end; procedure TNumEditX.Set_CharCase(Value: TxEditCharCase); begin FDelphiControl.CharCase := TEditCharCase(Value); end; procedure TNumEditX.Set_Color(Value: OLE_COLOR); begin FDelphiControl.Color := TColor(Value); end; procedure TNumEditX.Set_Ctl3D(Value: WordBool); begin FDelphiControl.Ctl3D := Value; end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

387

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


procedure TNumEditX.Set_DoubleBuffered(Value: WordBool); begin FDelphiControl.DoubleBuffered := Value; end; procedure TNumEditX.Set_DragCursor(Value: Smallint); begin FDelphiControl.DragCursor := TCursor(Value); end; procedure TNumEditX.Set_DragMode(Value: TxDragMode); begin FDelphiControl.DragMode := TDragMode(Value); end; procedure TNumEditX.Set_Enabled(Value: WordBool); begin FDelphiControl.Enabled := Value; end; procedure TNumEditX.Set_Font(const Value: IFontDisp); begin SetOleFont(FDelphiControl.Font, Value); end; procedure TNumEditX.Set_HideSelection(Value: WordBool); begin FDelphiControl.HideSelection := Value; end; procedure TNumEditX.Set_ImeMode(Value: TxImeMode); begin FDelphiControl.ImeMode := TImeMode(Value); end; procedure TNumEditX.Set_ImeName(const Value: WideString); begin FDelphiControl.ImeName := TImeName(Value); end; procedure TNumEditX.Set_MaxLength(Value: Integer); begin FDelphiControl.MaxLength := Value; end; procedure TNumEditX.Set_Modified(Value: WordBool); begin FDelphiControl.Modified := Value; end; procedure TNumEditX.Set_Numerico(Value: WordBool); begin FDelphiControl.Numerico := Value; end; procedure TNumEditX.Set_OEMConvert(Value: WordBool); begin FDelphiControl.OEMConvert := Value; end; procedure TNumEditX.Set_ParentColor(Value: WordBool); begin FDelphiControl.ParentColor := Value; end;

388 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES


procedure TNumEditX.Set_ParentCtl3D(Value: WordBool); begin FDelphiControl.ParentCtl3D := Value; end; procedure TNumEditX.Set_PasswordChar(Value: Smallint); begin FDelphiControl.PasswordChar := Char(Value); end; procedure TNumEditX.Set_ReadOnly(Value: WordBool); begin FDelphiControl.ReadOnly := Value; end; procedure TNumEditX.Set_SelLength(Value: Integer); begin FDelphiControl.SelLength := Value; end; procedure TNumEditX.Set_SelStart(Value: Integer); begin FDelphiControl.SelStart := Value; end; procedure TNumEditX.Set_SelText(const Value: WideString); begin FDelphiControl.SelText := String(Value); end; procedure TNumEditX.Set_Text(const Value: WideString); begin FDelphiControl.Text := TCaption(Value); end; procedure TNumEditX.Set_Visible(Value: WordBool); begin FDelphiControl.Visible := Value; end; procedure TNumEditX.SetSubComponent(IsSubComponent: WordBool); begin FDelphiControl.SetSubComponent(IsSubComponent); end; procedure TNumEditX.Undo; begin FDelphiControl.Undo; end; initialization TActiveXControlFactory.Create( ComServer, TNumEditX, TNumEdit, Class_NumEditX, 1, , 0, tmApartment); end.

O cdigo do arquivo de projeto reproduzido a seguir (podendo ser renomeado).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

389

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


library NumEditXControl1; uses ComServ, NumEditXControl1_TLB in NumEditXControl1_TLB.pas, NumEditImpl1 in NumEditImpl1.pas {NumEditX: CoClass}; {$E ocx} exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.TLB} {$R *.RES} begin end.

5. Selecione o item Build All Projects (ou Build NumEditXControl1) do menu Project para gerar o arquivo NumEditXControl.ocx, no qual est definido o controle ActiveX. 6. Selecione o item Register ActiveX Server do menu Run, para registrar o controle no sistema operacional. Caso o componente seja registrado com sucesso, ser exibida a caixa de dilogo mostrada na figura a seguir.

Figura 21.11: Registrando o Controle Activex.

O controle gerado pode ento ser usado por qualquer ambiente de desenvolvimento que suporte controles ActiveX, como o Microsoft Visual Basic 5.0, por exemplo. A figura a seguir mostra a incluso do controle no ambiente de desenvolvimento do Microsoft Visual Basic 6.0. A Figura 21.12 mostra a janela de propriedades do Microsoft Visual Basic 6.0 para o controle recm-criado. O controle ActiveX recm-criado apresenta as mesmas caractersticas definidas para o componente usado no Delphi.

390 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 CRIAO DE COMPONENTES

Figura 21.12: Incluso do controle no ambiente de desenvolvimento do Microsoft Visual Basic 6.0.

Figura 21.13: A janela de propriedades do Microsoft Visual Basic 6.0 para o controle recm-criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

391

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW

392 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 22 MECANISMOS DE ACESSO A BANCO DE DADOS

Captulo
Mecanismos de Acesso a Banco de Dados

22

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

393

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Neste captulo sero apresentados tpicos gerais relacionados aos procedimentos necessrios ao acesso a bancos de dados a partir de uma aplicao desenvolvida em Delphi 7, usando os mecanismos de acesso disponveis.

KNOW-HOW EM: FUNDAMENTOS DOS MECANISMOS DE ACESSO A BANCOS DE DADOS


PR-REQUISITOS
Conhecimentos bsicos relacionados organizao de informaes. Conhecimentos bsicos relacionados utilizao de componentes.

METODOLOGIA
Apresentao dos conceitos fundamentais dos mecanismos de acesso a bancos de dados, e sua terminologia.

OS MECANISMOS DE ACESSO A BANCOS DE DADOS


Ao lanar a sua primeira ferramenta RAD para o desenvolvimento de aplicaes para o ambente Windows (o Delphi 1.0) h alguns anos atrs, a Borland procurou apresentar ao mercado uma ferramenta que no simplificasse apenas a criao da interface com o usurio da aplicao, mas tambm a forma pela qual esta aplicao acessaria os diferentes formatos de bancos de dados existentes no mercado. A Borland desejava que as aplicaes criadas pudessem acessar diferentes bases de dados sem que fossem necessrias grandes alteraes na codificao dos aplicativos criados, e isto foi possvel graas introduo de um mecanismo de acesso a bancos de dados tambm desenvolvido pela Borland o Borland Database Engine (BDE). Este mecanismo foi um dos grandes responsveis pelo sucesso alcanado pelo Delphi como ferramenta de desenvolvimento (alm de fatores mencionados em captulos anteriores, como facilidade de criao de interface, orientao a objetos, etc.). Apesar do grande sucesso alcanado pelo BDE, muitos desenvolvedores que utilizavam bancos de dados da Microsoft (como o Access e o SQL Server) reclamavam a ausncia do suporte tecnologia Activex Data Objects (ADO), presente na maioria dos computadores que executavam suas tarefas sobre o sistema operacional Windows. Por esta razo o Delphi, a partir da sua verso 5, criou componentes com a finalidade especfica de acessar bancos de dados via ADO, sem que fosse ento necessria a instalao do BDE (supondo evidentemente que o suporte a ADO estivesse instalado nas mquinas onde a aplicao fosse ser executada se no seria necessria a sua instalao). Alm disso, a verso 5 passava a incluir tambm um conjunto de componentes com a finalidade de permitir o desenvolvimento de aplicaes cliente-servidor que obtivessem acesso nativo a bases de dados do Interbase sem a necessidade de instalao do BDE conjunto este denominado Interbase Express.

394 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 22 MECANISMOS DE ACESSO A BANCO DE DADOS


A verso 6 do Delphi trouxe um novo mecanismo de acesso multiplataforma denominado DBExpress, mais leve do que o BDE, mas que s permite o acesso a sistemas gerenciadores de bancos de dados SQL, no oferecendo suporte a bancos de dados locais baseados em arquivos, como o Paradox e o DBase, por exemplo. A verso 7 do Delphi trouxe um aprimoramento do DBExpress, e o congelamentodo Borland Database Engine, para o qual no devero ser oferecidas novas verses ou atualizaes, ou suporte tcnico. Desta maneira, nosso estudo sobre bancos de dados ser inicialmente subdividido nos seguintes captulos: Desenvolvimento de Aplicaes para acesso a Bancos de Dados via BDE. Desenvolvimento de Aplicaes para acesso a Bancos de Dados via ADO. Desenvolvimento de Aplicaes para acesso a Bancos de Dados via DBExpress. Desenvolvimento de Aplicaes para acesso a Bancos de Dados via Interbase Express. importante caracterizar, no entanto, que a portabilidade de uma aplicao no fica comprometida com a existncia de tantas opes, uma vez que a interface da aplicao poder ser integralmente aproveitada ao se alternar de uma tecnologia para outra sendo necessrio apenas modificar os componentes de acesso base de dados, geralmente situados em um repositrio chamado Datamodule, cuja finalidade justamente armazenar estes componentes, e alterar algumas poucas propriedades.

KNOW-HOW EM: CLASSES FUNDAMENTAIS DE ACESSO A BANCOS DE DADOS A CLASSE TDATASET


PR-REQUISITOS
Fundamentos da programao orientada a objetos com o Delphi 7. Experincia prvia na utilizao de classes e componentes no desenvolvimento de aplicaes com Delphi 7.

METODOLOGIA
Apresentao das classes e componentes fundamentais de acesso a bancos de dados, juntamente com uma descrio das suas propriedades, mtodos e eventos.

TCNICA
Descrio da classe TDataset, para acesso a bancos de dados. Inicialmente ser apresentada a classe TDataSet, a partir da qual so derivadas, por herana, as classes mais utilizadas para acessar os bancos de dados a serem manipulados por uma aplicao desenvolvida em Delphi, atravs dos diversos mecanismos de acesso.

A CLASSE TDATASET
Observando-se o diagrama de hierarquia de classes da VCL, verifica-se que, no topo das classes de acesso a bancos de dados, encontra-se a classe TDataSet. Dela so derivadas:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

395

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


A classe TTable, que representa uma tabela acessada via BDE. A classe TADOTable, que representa uma tabela acessada via ADO. A classe TIBTable, que representa uma tabela do Interbase acessada via Interbase Express. A classe TSQLTable, que representa uma tabela acessada via DBExpress. A classe TClientDataSet,que representa uma tabela acessada diretamente pela aplicao (sendo esta tabela armazenada no formato binrio, no mesmo computador em que a aplicao executada), ou em uma aplicao distribuda. Pode ser usada tambm para permitir, em conjunto com um componente DatasetProvider, acesso bidirecional (em memria) a bancos de dados acessados atravs de um mecanismo de acesso unidirecional. A classe TSQLSimpleDataSet, que permitie acesso bidirecional (em memria) a bancos de dados acessados atravs do mecanismo de acesso unidirecional DBExpress. Consiste em reunir, em uma nica classe, objetos das classes TSQLDataset, DatasetProvider e ClientDataset, e substitui a classe TClientDataset da verso 6. A classe TQuery, que permite o acesso a uma ou mais tabelas via declaraes SQL, atravs do Borland Database Engine. A classe TADOQuery, que permite o acesso a uma ou mais tabelas via declaraes SQL, atravs da tecnologia ADO. A classe TIBQuery, que permite o acesso a uma ou mais tabelas via declaraes SQL, atravs da tecnologia Interbase Express. A classe TSQLQuery, que permite o acesso a uma ou mais tabelas via declaraes SQL, atravs da tecnologia DBExpress. A classe TStoredProc, que permite executar procedimentos armazenados em um banco de dados acessado atravs do Borland Database Emgine. A classe TADOStoredProc, que permite executar procedimentos armazenados em um banco de dados acessado atravs da tecnologia ADO. A classe TIBStoredProc, que permite executar procedimentos armazenados em um banco de dados acessado atravs da tecnologia Interbase Express. A classe TSQLStoredProc, que permite executar procedimentos armazenados em um banco de dados acessado atravs da tecnologia DBExpress. A classe TSQLDataset, que uma generalizao das classes TSQLTable, TSQLQuery e TSQLStoredProc, e que permite acessar diretamente uma tabela, uma ou vrias tabelas via declaraes SQL, ou executar procedimentos armazenados em um banco de dados acessado atravs da tecnologia DBExpress. Um objeto da classe TDataSet, ou de qualquer das classes dela derivadas por herana, tem por objetivo representar tabelas a serem acessadas pela aplicao, sendo uma tabela definida, de forma genrica, por um conjunto de informaes organizadas em linhas (registros da tabela) e colunas (campos da tabela). No caso de declaraes SQL, tambm poder ser retornado um conjunto de registros, ainda que provenientes de vrias tabelas.

396 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 22 MECANISMOS DE ACESSO A BANCO DE DADOS


Dessa maneira, o acesso a tabelas definidas em um banco de dados ser feito sempre atravs de um componente derivado da classe TDataSet. A classe TDataSet, no entanto, implementa a funcionalidade genrica para acesso a tabelas, sem incorporar as funes da API do Borland Database Engine (o mecanismo de acesso a banco de dados criado pela Borland), os mtodos da biblioteca ADO da Microsoft, do Interbase Express ou qualquer outro mecanismo de acesso. Estes mtodos so implementados nas classes dela derivadas por herana. Nos prximos tpicos, sero apresentadas as principais propriedades e mtodos da classe TDataSet. Sempre que nos referirmos ao termo Tabela, este dever ser entendido como um conjunto de registros, ainda que retornados por uma declarao SQL.

PRINCIPAIS PROPRIEDADES DA CLASSE TDATASET


Apresenta-se a seguir uma descrio das principais propriedades da classe TDataSet. Desta maneira, podemos descrever estas propriedades de uma nica vez, ao invs de falar sobre elas cada vez que abordarmos uma das classes derivadas da classe TDataSet.

ACTIVE
Essa propriedade definida como uma varivel booleana, e define se a tabela (ou conjunto de tabelas) associada ao componente est ou no ativa. Conforme ser visto posteriormente, atribuir o valor true a essa propriedade equivale a executar o mtodo Open do componente. Da mesma forma, atribuir o valor false a essa propriedade equivale a executar o mtodo Close do componente.

AUTOCALCFIELDS
Essa propriedade definida como uma varivel booleana, e define se o procedimento associado ao evento OnCalcFields do componente deve ser executado sempre que houver uma alterao nos dados armazenados na tabela representada pelo componente. Os campos calculados so aqueles cujo valor pode ser diretamente obtido em funo dos valores armazenados em outros campos da tabela, razo pela qual no precisam ser armazenados permanentemente na tabela. A definio da frmula utilizada para o clculo dos valores desses campos feita no procedimento associado ao evento OnCalcFields do componente, conforme ser exemplificado posteriormente.

BOF
Essa propriedade definida como uma varivel booleana, e define se o registro corrente o primeiro registro da tabela representada pelo componente. uma propriedade apenas de leitura, e tem o valor true em cada uma das seguintes situaes: Quando se estabelece o acesso tabela representada pelo componente, definido-se como True o valor da sua propriedade Active, ou aps uma chamada ao seu mtodo Open.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

397

BORLAND DELPHI 7 CURSO COMPLETO PARTE II: KNOW-HOW


Aps uma chamada ao mtodo First do componente. Aps uma chamada ao mtodo Prior do componente, quando o registro corrente j o primeiro registro da tabela.

EOF
Essa propriedade definida como uma varivel booleana, e define se o registro corrente o ltimo registro da tabela representada pelo componente. uma propriedade apenas de leitura, e tem o valor True em cada uma das seguintes situaes: Quando se estabelece o acesso tabela representada pelo componente, definido-se como True o valor da sua propriedade Active (ou aps uma chamada ao seu mtodo Open) e a tabela no possui nenhum registro armazenado. Aps uma chamada ao mtodo Last do componente. Aps uma chamada ao mtodo Next do componente, quando o registro corrente j o ltimo registro da tabela.

FIELDCOUNT
Essa propriedade definida como uma varivel inteira, e define o nmero de campos da tabela representada pelo componente. uma propriedade apenas de leitura, e no pode ter o seu valor diretamente alterado pelo usurio. importante salientar que essa propriedade retorna o nmero de campos acessado pelo componente que no necessariamente igual ao nmero de campos reais da tabela representada pelo componente. Uma forma de se alterar o nmero de campos acessados pela tabela consiste em utilizar o Fields Editor, que permite que se definam os campos da tabela que sero realmente acessados pelo componente.

FIELDS
Essa propriedade definida como uma array de objetos da classe TField, e permite o acesso a campos individuais do registro corrente da tabela representada pelo componente. Nesse caso, o primeiro campo representado pelo ndice 0, sendo o n-zimo campo representado pelo ndice n-1. importante lembrar que esses campos so aqueles realmente acessados pelo componente, e no so necessariamente todos os campos da tabela por ele representada.