bíblia delphi

Upload: sergio-sousa

Post on 13-Jul-2015

162 views

Category:

Documents


3 download

TRANSCRIPT

Borland

Desvendando o Caminho das Pedras

Fernando Anselmo

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Dez 1995 - Mai 1997

Desvendando o Caminho das PedrasCopyright

1995-97 Fernando Antonio F. Anselmo.

Todos os nomes dos produtos citados so marcas registradas da Borland International, Inc. Outros produtos citados so marcas registradas no respectivo cabealho As vrias Marcas Registradas que aparecem no decorrer deste livro. Mais do que simplesmente listar esses nomes e informar quem possui seus direitos de explorao, ou ainda imprimir o logotipo das mesmas, o autor declara estar utilizando tais nomes apenas para fins editoriais, em benefcio exclusivo do dono da marca registrada, sem inteno de infringir as regras de sua utilizao.

ii

SUMRIODesvendando o Caminho das Pedras i

INTRODUODelphi, como Soluo para Desenvolvedores 7

CAPTULO IConceito de Programao Orientada a Objeto Orientao a Objeto Object Pascal Smbolos Especiais Palavras Reservadas Nmeros Constantes Expresses Identificadores Declaraes Blocos de Procedimentos ou Funes Caractersticas de Objetos Programando com objetos Delphi Renomeando os objetos e os componentes Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO IIConhecendo o Delphi Elementos Visveis Form Code Editor Component Palette Object Inspector SpeedBar Elementos no Visveis Project Manager Menu Designer Fields Editor Repositrio de Objetos Estrutura de Aplicaes com o Delphi 2.0 Implementao efetiva Objetos Data Module Dicionrio de Dados Escalvel Herdando os Formulrios Ferramentas Auxiliares de SQL Monitor SQL SQL Explorer InterBase NT - Banco de Dados Relacional Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO IIIProjeto Piloto iii Erro! Indicador no definido.

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

Criando o Modelo Relacional Trabalhando com DataBase Engine Configuration Criando o Alias Trabalhando com DataBase DeskTop Criando o Banco de Dados via Estrutura Criando os Relacionamentos via Estrutura Criando o Banco de Dados via SQL Observaes da utilizao do SQL com o dBase

CAPTULO IVTrabalhando com o Menu Metendo a Mo na Massa Criando a janela do menu Inserindo os Cdigos Iniciais Iniciando os comandos do Menu Colocando os comandos para o Auxlio Criando a janela Sobre o Sistema Criando e alterando os objetos Associando o form Sobre o Sistema ao menu Criando a janela Splash Criando o acesso a Base de Dados Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO VJanela para as Tabelas Reabrindo o seu Projeto Alterando as Janelas Criadas DataModules ? Modificando as Tabelas e as Ligaes Alterando os campos da tabela Codificando o DataModule Controlando a duplicao dos Campos-Chave Finalizando o DataModule Alterando o Formulrio Modificando os Labels e Campos Objeto DBNavigator Modificando os Paineis Modificando a Janela Criando o terceiro Painel Programando no formulrio Preservando as reas de Memria Criando Funes Globais Alterando o Menu para receber o formulrio Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO VITrabalhando com janela Pai X Filha Criando a janela automaticamente Sobre os DataModules Trabalhando com as Tabelas Trabalhando com os Campos Controlando o DataModule Contadores Validando os Campos Alterando a Janela Criada iv Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

Organizando os Panels Modificando os campos e Labels Organizando os Panels Modificando a Janela Trabalhando com Grids Finalmente, a programao Consulta Trabalhando com a rea de Transferncia Utilizando o objeto OpenDialog Criando o formulrio para o cadastro das msicas Criando novos Procedimentos Globais Alterando o Menu para receber o formulrio

CAPTULO VIITrabalhando com consultas Criando consultas para tabelas Trabalhando com Grids Programando no formulrio Enviando e recebendo variveis Alterando o formulrio fCateg Alterando o formulrio fBasico Criando consultas para o cadastro Consultas SQL Realizando Consultas com Filtros Programando o formulrio Criando o formulrio Gerente do Filtro Programando o formulrio Editando os registros Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO VIIIRelatrios Trabalhando com o ReportSmith Criando relatrio com o ReportSmith Organizando os campos do relatrio Associando o relatrio ao aplicativo Programando o formulrio Imprimindo atravs do Formulrio Criando o Cdigo Trabalhando com o QuickReport Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO IXMultimdia O que multimdia ? Delphi and Multimedia Objeto TMediaPlayer Colocando as propriedade em modo Runtime Pesquisando variveis em modo RunTime Inserindo o multimdia para o Sistema Desenvolvimento do CD Player Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

CAPTULO Xv

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido. Erro! Indicador no definido.

Novos Componentes Criando Componentes A Classe TComponent Um Componente Simples Adicionando o Componente a Palheta Criando Propriedades Mtodos de Acesso Criando novos tipos Pensando em Objetos Construindo um Objeto Finalmente

APNDICE ADocumentao Hardware/Software requeridos 168 168

APNDICE BConverso de Campos Tipos de Dados para o InterBase 169 170

APNDICE CAplicao rpida com o Objeto Query 171

APNDICE DImprimindo um Formulrio 173

APNDICE ETrabalhando com Mscaras 175

APNDICE FTrabalhando com Importao e Exportao 177

APNDICE GDoze melhores dicas para o Delphi 180

vi

IntroduoBem-vindo ao Delphi, o mais novo produto de alta performance da Borland. Delphi um produto nico em sua categoria combinando cdigos totalmente compilveis, ferramentas visuais e tecnologia para a composio de bases de dados escalveis, possui facilidades para um rpido desenvolvimento em plataforma Windows e aplicaes Client/Server. Este trabalho ser seu guia para uma rpida aprendizagem no desenvolvimento de sistemas que gerencie bancos de dados. O Delphi encontrado em dois produtos: Delphi Client/Server, de alta performance e facilidade para o desenvolvimento de aplicaes e suporte a bancos de dados do tipo Cliente/Servidor. Delphi Desktop, de alta performance e facilidade para o desenvolvimento de aplicaes e suporte a bancos de dados locais, permitindo total portabilidade verso Client/Server.

Apresento-lhes a seguir algumas informaes detalhadas para um perfeito desenvolvimento visual, sendo que ao final de cada captulo prtico exibido o cdigo fonte completo seguido de um resumo dos principais comandos mostrados. Ao final deste estudo voc encontrar apndices que lhe ajudaro a resolver pequenos problemas do dia-a-dia.

Delphi, como Soluo para DesenvolvedoresMuitas vezes nos perguntamos, e somos questionados, no porque de adotar o Delphi como a linguagem para o desenvolvimento de sistemas ? Inicialmente, necessrio conhecer que o Delphi oferece um rpido caminho para o desenvolvimento de aplicaes nos ambientes: Windows , Windows 95 e Windows NT ; Bancos de dados do tipo Cliente/Servidor: Oracle , Informix , InterBase, SyBase Microsoft SQL Server ; Alta performance, em sistemas crticos; Base de Dados locais e aplicaes do tipo network; Ambiente grfico, visual e multimdia.

e

Mas o que possvel fazer com ele ? possvel criar, dentre outros, os seguintes tipos de aplicaes em Delphi : Us-lo como a linguagem de desenvolvimento para bancos do tipo Cliente/Servidor; Ambiente heterogneo para captura e envio de informaes em diversos tipos de arquivos de dados;

7

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Um pacote corporativo de aplicaes inteligentes e interpretadores de dados. Incorporando DLLs e EXEs externos; Pacotes multimdia com desenho e animao; Genricos utilitrios do Windows ; Criao de bibliotecas (DLL) para leitura por outras aplicaes.

Mas porque arriscar em um ambiente novo quando existe no mercado linguagens mais difundidas ? No mundo inteiro Delphi foi testado, e em 15 meses de vida produziu os seguintes resultados: Delphi est sendo utilizado no momento por mais de 1.500 lugares incluindo as maiores corporaes, consultores e organizaes de treinamento; Eleito pela Byte Magazines como Best of Comdex Award; Vrios livros escritos; Grupos de discusso e peridicos com dicas de desenvolvimento na WorldWibe (Consulte s listas da InterNet atravs da palavra DELPHI); Dezenas de bibliotecas e ferramentas para o suporte em Delphi; Dezenas de artigos em publicaes do mundo inteiro, tais como PC Week, InfoWorld, Computer Reseller News, PC Magazine, Windows Sources e muitas outras.

Por tudo aqui exposto fica claro que este no produto demonstra uma inovao para uma criao em alta performance de aplicaes. Todos os recursos que voc precisar para o desenvolvimento de seus produtos esto agora disponveis. Feliz desenvolvimento. Fernando Antonio F. Anselmo Sempre que voc localizar este smbolo significa que existe uma nota que lhe ajudar em caso de dvida.

8

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo IConceito de Programao Orientada a ObjetoPara compreendermos melhor a novo ambiente de desenvolvimento da Borland o Delphi necessrio que voc, aprenda e, tenha em mente os conceitos de POO (Programao Orientada a Objetos), no confunda os conceitos com POE (Programao Orientada a Eventos) muito difundido com o Access 2.0 (um ambiente baseado em Objetos), mas ao longo deste captulo voc vai notar as sensveis diferenas que existem entre esses dois conceitos. A POO e a POE so facilmente confundidas, mas lembre-se a POO contm a POE mas a POE no contm a POO, um objeto pode existir mesmo que no exista nenhum evento associado a ele, mas um evento no pode existir se no houver um objeto a ele associado. Outra caracterstica que pode causar confuso so ambientes Orientados a Objetos e ambientes Baseados em Objetos. Em ambiente Orientado a Objetos consegue-se criar e manipular objetos enquanto que o Baseado em Objetos no possivel a criao de objetos apenas a sua manipulao. A POO um conceito desenvolvido para facilitar o uso de cdigos de desenvolvimento em interfaces grficas. Sendo a Borland, uma das primeiras a entrar neste novo conceito, possui suas principais linguagens de programao (tais como Object Pascal e C++), totalmente voltadas para este tipo de programao. A POO atraiu muitos adeptos principalmente pelo pouco uso de cdigo que o projeto (diferente de sistema) carrega no programa fonte, ao contrrio das linguagens mais antigas como o Clipper87 muito utilizado no final da dcada de 90 e incio da dcada de 90. O resultado desta limpeza no cdigo resulta que a manuteno do projeto tornase muito mais simples.

Orientao a ObjetoAntes de comearmos a falar realmente de linguagem orientada a objetos e necessrio que voc possua os conceitos bsicos da orientao a objetos, so eles: Objeto - qualquer estrutura modular que faz parte de um produto. Uma janela por exemplo, um objeto de uma casa, de um carro ou de um software com interface grfica para o usurio. Atributos - So as caractersticas do objeto, como cor e tamanho, a janela, por exemplo, tem atributos como o modelo, tamanho, abertura simples ou dupla, entre outros. Encapsulao - um mecanismo interno do objeto escondido do usurio. Uma pessoa pode abrir uma janela girando a tranca sem precisar saber o que h dentro dela.

9

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Ao - a operao efetuada pelo objeto. Todas as janelas, por exemplo, controlam a iluminao e temperatura ambiente, dependendo do seu design. Herana - um objeto novo nem sempre criado do zero. Ele pode herdar atributos e aes de outros j existentes. Um basculante herda atributos das janelas e das persianas. Polimorfismo - a capacidade de objetos diferentes reagirem segundo a sua funo a uma ordem padro. O comando abre, por exemplo, faz um objeto entrar em ao, seja ele uma janela, uma porta ou uma tampa de garrafa. Ligao - quando um objeto conecta a sua ao a outro. Um sensor de claridade, por exemplo, ativa o acendimento automtico da iluminao de rua. Embutimento - Permite a um objeto incorporar funes de outros, como um liqidificador que mi carne com a mudana do tipo da lmina.

Object PascalObject Pascal uma linguagem Orientada a Objetos no pura mas hbrida por possuir caractersticas de programao no s visual mas tambm escrita, para os programadores que j conhecem tcnicas de estruturas de programao, com o C, Basic, Pascal ou xBASE entre outras linguagens a Object Pascal providncia uma migrao de forma natural oferecendo um produto de maior complexibilidade. Object Pascal fora a voc executar passos lgicos isto torna mais fcil o desenvolvimento no ambiente Windows de aplicaes livres ou que utilizam banco de dados do tipo Cliente/Servidor, trabalha com o uso de ponteiros para a alocao de memria e todo o poder de um cdigo totalmente compilvel. Alm disso possibilita a criao e reutilizao (vantagem de re-uso to sonhado com a Orientao a Objetos) de objetos e bibliotecas dinmicas (Dynamic Link Libraries - DLL). Object Pascal contm todo o conceito da orientao a objetos incluindo encapsulamento, herana e polimorfismo. Algumas extenses foram includas para facilitar o uso tais como conceitos de propriedades, particulares e pblicas, e tipos de informaes em modo run-time, manuseamento de excees, e referncias de classes. O resultado de toda esta juno faz com que Object Pascal consiga suportar as facilidades de um baixo nvel de programao, tais como: Controle e acesso das subclasses do Windows (API); Passar por cima das mensagens de loop do Windows ; Mensagens semelhantes as do Windows ; Cdigo puro da linguagem Assembler. [AL1] Comentrio:

Como deu para perceber a base de toda a programao Delphi a linguagem Object Pascal, ento neste captulo trataremos exclusivamente deste tipo de programao.

Smbolos EspeciaisA Object Pascal aceita os seguintes caracteres ASCII:

10

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Letras - do Alfabeto Ingls: A at Z e a at z. Dgitos - Decimal: 0 at 9 e HexaDecimal: 0 at 9 e A at F (ou a at f) Brancos - Espao (ASCII 32) e todos os caracteres de controle ASCII (ASCII 0 at ASCII 31), incluindo final de linha e Enter (ASCII 13). Especiais - Caracteres: + - * / = < > [ ] . , ( ) : ; ^ @ { } $ # Smbolos - Caracteres: = := .. (* *) (. .) //

O colchetes esquerdo ( [ ) e equivalente ao (. e o colchetes direito ( ] ) e equivalente a .). A chave esquerda ( { ) e equivalente ao (* e a chave direita ( } ) e equivalente a *).

Palavras ReservadasA Object Pascal se utiliza das seguintes palavras reservadas, no podendo as mesmas serem utilizadas ou redefinidas:And Array As Asm Begin Case Class Const Constructor Destructor Div Do Downto Else End Except Exports File Finnaly For Function Goto If Implementation In Inherited Initialization Inline Interface Is Label Library Mod Nil Not Object Of On Or Packed Procedure Program Property Raise Record Repeat Set Shl Shr String Then To Try Type Unit Until Uses Var While With Xor

Uma outra lista a seguir, apresenta as diretivas que so utilizadas em contextos de identificao de objetos:Absolute Abstract Assembler At Cdecl Default Dynamic Export External Far Forward Index Interrupt Message Name Near Nodefault Override Private Protected Public Published Read Resident Stored Virtual Write

11

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Nmeros possvel definir variveis e constantes de tipos de Inteiro ou Real atravs de qualquer decimal ordinrio ( 0 a 9 ), mas a Object Pascal tambm aceita a notao Hexadecimal utilizados com o prefixo dollar ( $ ) ou a notao cientfica ( E ).

ConstantesUma constante um identificador com valor(es) fixo(s). Um bloco de declaraes constante possui a seguinte expresso: [Declarao Constante] [Identificador] (=) [constante] (;) A lista abaixo apresenta um conjunto de funes que podem ser utilizadas para a declarao das constantes:Ab Chr Hi High Length Lo Low Odd Ord Pred Ptr Round SizeOf Succ Swap Trunc

Alguns exemplos para a definio de Constantes:const Min = 0; Max = 100; Centro = (Max - Min) div 2; Beta = Chr(225); NumLetras = Ord('Z') - Ord('A') + 1; MensOla = 'Instruo invlida'; MensErro = ' Erro: ' + MensOla + '. '; PosErr = 80 - Length(MensErro) div 2; Ln10 = 2.302585092994045684; Ln10R = 1 / Ln10; DigNumericos = ['0'..'9']; LetrasAlpha = ['A'..'Z', 'a'..'z']; AlphaNum = LetrasAlpha + DigNumericos;

ExpressesAs expresses em Object Pascal (como em qualquer linguagem) formada por operadores e operandos; os operadores so divididos em quatro categorias bsicas:nicos Multiplicativos Adicionais Relacionais @, Not >, /, div, mod, and, shl, shr, as +, -, or, xor =, < >, , < =, > =, in, is

As expresses obdecem as regras bsicas de lgica para a precedncia da execuo das operaes.

12

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

IdentificadoresIdentificadores podem ser constantes, tipos, variveis, procedures, funes, unidades, programas e campos de registros. No existe limite de caracteres para o nome de um identificador mas apenas os 63 primeiros caracteres so significantes (no podendo ser idntico ao nome das palavras reservadas). O nome de um identificador deve ser iniciado por Letras ou o carcter underscore ( _ ). O resto formado por Letras, Dgitos, carcter underscore (ASCII $5F). No permitido a utilizao de espaos para a formao do nome.

Exemplo de identificadores vlidos: Form1, SysUtils.StrLen, Label1.Captionwith... do...;Delimita um determinado bloco de declaraes para um identificador especfico evitando a declarao deste identificador. A sintaxe do comando : WITH {nome do identificador} DO {comandos};. Ex: begin { ... comandos iniciais ... } with form1 do begin Caption := Teste; BorderStyle := bsSizable; end; end;

Equivalente a Form1.Caption Equivalente a Form1.BorderStyle

array [ ... ] of ...;Define um conjunto de variveis ou constantes de um mesmo tipo. A sintaxe do comando : array [{quantidade de ocorrencias}] of {Tipo};. Os arrays so controlados por trs funes:Funo Low High SizeOf Valor de Retorno Primeiro elemento Aponta para o ltimo elemento Tamanho do array

Ex: const t: array [1..50] of Char { Declara 50 elementos para o tipo Char } var s : array[1..100] of Real { Declara 100 elementos para o tipo real } ind: Integer; begin for Ind := Low(s) to High(s) do s[Ind] := 0; { Zera os elementos do array S } if SizeOf(t) = C then exit; { Se o ltimo elemento do array T for C sai do bloco } { ... outros comandos... } end;

13

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

DeclaraesDeclaraes descrevem aes de um algortmo a serem executadas.

begin... end;Prende um conjunto de declaraes em um bloco de comandos determinado. A sintaxe do comando : BEGIN {comandos} END;. Ex: begin { ... comandos iniciais ... } begin { ... bloco 1 ... } end; begin { ... bloco 2 ... } end; { ... comandos finais ... } end;

if... then... else...;Esta expresso escolhe entre o resultado de uma condio booleana o caminho verdadeiro (then) ou falso (else). A sintaxe do comando : IF {condio} THEN {bloco de comandos} ELSE {bloco de comandos};. Ex: begin { ... comandos iniciais ... } if x > 2 then { ... Bloco verdadeiro ... } else { ... Bloco falso ... }; end;

goto... ;Transfere a execuo de um programa para o ponto determinado pelo Label. A sintaxe do comando : GOTO {Label};. Ex: label primeiro; begin { ... comandos iniciais ... } if x = 2 then goto primeiro; { ... outros comandos ... } Primeiro: { ... comandos do Primeiro ... } end;

14

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

case... of... else... end;Consiste de uma lista de declaraes que satizfaz a condio de um seletor de expresses, se nenhuma parte da lista satisfizer ao seletor executa os comandos do sub-comando else. Para o seletor sero vlidos os tipos definidos, tipo Inteiros ou LongInt. A sintaxe do comando : CASE {seletor} OF {Expresso 1}: {comando da expresso 1}; {Expresso 2}: {comando da expresso 2}; {Expresso n}: {comando da expresso n} ELSE {comando}; end;. Ex: begin { ... comandos iniciais ... } case x of 1: { ... Bloco para x = 1 ... } 2, 3: { ... Bloco para x = 2 ou X = 3... } 4..6: { ... Bloco para 4 ) que est na lista Auto-create forms para a lista Available forms (para no ocupar espao em memria uma janela que s ser utilizada uma nica vez, criaremos esta janela via comandos), clique sobre o boto OK. 2. No menu principal selecione a opo View e Project Source (estamos agora acessando o programa principal que controla todas os outros formulrios ou units). 3. Aps o comando begin adicione as seguintes linhas:F_Splash := TF_Splash.Create(Application); F_Splash.Show; F_Splash.Refresh;

Cria o form como parte da aplicao. Chama o form de modo no modal. Mostra o form e devolve o controle para aaplicao.

4. Antes do comando Application.Run; adicione a linha:F_Splash.Free;

Libera o form da aplicao.

Saia do Code Editor e salve o formulrio e o projeto. Rode o projeto, qualquer problema compare com o cdigo abaixo:

program CDDA; uses Fmenu in 'FMENU.PAS' {F_Menu}, FSobre in 'FSOBRE.PAS' {F_Sobre}; {$R *.RES} begin F_Splash := TF_Splash.Create(Application); F_Splash.Show; F_Splash.Refresh;

53

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Application.Initialize; Application.HelpFile := 'C:\Sistema\CadDisco\Guia.hlp'; Application.CreateForm(TF_Menu, F_Menu); Application.CreateForm(TF_Sobre, F_Sobre); F_Splash.Free; Application.Run; end.

Voc pode mover o comando SplashScreen.Free; para o evento OnShow do form F_Menu. Isto far com que a janela Splash s desaparea quando o menu for ativado. Infelizmente para os usurios do Delphi 1.0 esta caracterstica de herana no havia sido implementada ento, faz-se necessrio a construo da tela fSplash atravs de uma cpia da tela fSobre com a utilizao do comando Save As....

Criando o acesso a Base de Dados bem verdade que o nosso sistema se encontra na base Paradox, mas como escrevi no comeo do trabalho com o Delphi possvel modificar o repositrio de dados sem precisar alterar uma s linha do sistema produzido. No captulo a respeito das tabelas tambm vimos a impossibilidade de algumas aes produzidas por clusulas SQL no serem bem vindas em base de dados no totalmente compatveis com a estrutura do SQL, ento se faz necessrio identificar uma base padro de uma base SQL. No menu principal insira o objeto DataBase pgina Data Access, e altere as seguintes propriedades:Propriedade AliasName DataBaseName Name Valor AliasDisco BaseDisco DBDisco Descrio Nome do Sinnimo Nome do banco de dados Nome do objeto

, encontrado na Component Palette na

Insira agora os cdigos que permitir a abertura e o fechamento da base de dados: Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para a Code Editor e localize o procedimento FormCreate associado ao evento OnCreate:

procedure TF_Menu.FormCreate(Sender: TObject); begin Application.OnHint := ShowHint; DBDisco.Connected := True; Inicia o Banco de Dados end;

A partir do prximo captulo entraremos realmente no que o Delphi capaz com tabelas, mas antes, necessrio que os conceitos ensinados anteriormente estejam bem fixados, se alguma coisa deu errada, releia o captulo, ou ento confira o cdigo do F_Menu:

54

Borlandunit fMenu; interface

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, DBTables, DB; type TF_Menu = class(TForm) MainMenu1: TMainMenu; Arquivo1: TMenuItem; Consulta1: TMenuItem; Relatorio1: TMenuItem; Auxilio1: TMenuItem; Tabela1: TMenuItem; Cadastro1: TMenuItem; N6: TMenuItem; Sair1: TMenuItem; ItemTabela1: TMenuItem; ItemConsulta1: TMenuItem; ItemConsulta2: TMenuItem; ItemRelatorio1: TMenuItem; ItemRelatorio2: TMenuItem; N12: TMenuItem; ConfImpressora1: TMenuItem; ItemAuxilio2: TMenuItem; ItemAuxilio3: TMenuItem; ItemAuxilio4: TMenuItem; N14: TMenuItem; ItemAuxilio1: TMenuItem; LinhaStatus: TStatusBar; DBDisco: TDatabase; procedure FormCreate(Sender: TObject); procedure Sair1Click(Sender: TObject); procedure ItemAuxilio2Click(Sender: TObject); procedure ItemAuxilio3Click(Sender: TObject); procedure ItemAuxilio4Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ItemAuxilio1Click(Sender: TObject); private procedure ShowHint (Sender: TObject); public { Public declarations } end; var F_Menu: TF_Menu; implementation {$R *.DFM} uses fSobre; procedure TF_Menu.ShowHint (Sender: TObject);

55

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin LinhaStatus.Panels.Items[0].Text := Application.hint; end; procedure TF_Menu.FormCreate(Sender: TObject); begin Application.OnHint := ShowHint; DBDisco.Connected := True; end; procedure TF_Menu.Sair1Click(Sender: TObject); begin DBDisco.Connected := False; Close; end; procedure TF_Menu.ItemAuxilio2Click(Sender: TObject); begin Application.HelpCommand(HELP_CONTENTS, 0); end; procedure TF_Menu.ItemAuxilio3Click(Sender: TObject); const EmptyString: pChar = ''; begin Application.HelpCommand(HELP_PARTIALKEY, LongInt(EmptyString)); end; procedure TF_Menu.ItemAuxilio4Click(Sender: TObject); begin Application.HelpCommand(HELP_HELPONHELP, 0); end; procedure TF_Menu.FormDestroy(Sender: TObject); begin Application.HelpCommand(HELP_QUIT, 0); end; procedure TF_Menu.ItemAuxilio1Click(Sender: TObject); begin F_Sobre.ShowModal; end; end.

Caso o seu sistema no seja migrado para nenhum banco de dados no padro SQL (do tipo ORACLE , SYBASE ,...) no existe nenhuma necessidade em se utilizar o objeto DataBase, mas a utilizao ou no do objeto no afeta o tempo de acesso ao sistema, ento porque no prepar-lo para uma eventual mudana?

56

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo VJanela para as TabelasTabelas primrias de informao requerem entradas de dados simples, no nosso caso temos a tabela de categoria, a criao de janelas para a sua manipulao de seus dados no um bicho de sete cabeas como voc ver a seguir.

Reabrindo o seu Projeto Se assim que voc finalizou o captulo anterior voc saiu do Delphi, precisa agora reativar o projeto. Para tanto: 1. No menu principal clique em File e Open.... 2. O sistema desenvolvido encontrado no diretrio C:\SISTEMA\CADDISCO, com a extenso .DPR. Neste momento voc est pronto para o trabalho, vamos criar a nossa janela: 3. Clique no menu principal a opo File e New..., em New Items, mude a pgina para Forms e clique no objeto entitulado Database Form, agora siga as telas:

1. O tipo a ser criada. Form Options: Create a simple form Uma janela simples DataSet Options: Create a form using TTables objects Usando o objeto tabela Boto Next.

2. A tabela a ser usada para a janela. Drive or Alias name: AliasDisco Table Name: categor.db Boto Next

3. Campos a serem inseridos

4. Formao dos campos

57

BorlandBoto >> Boto Next

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Vertical Boto Next

5. Posio dos Labels Left - A esquerda Boto Next

6. Completo Gera a tela como form principal - No O Que gerar: Form e DataModule Boto Finish

Alterando as Janelas CriadasSe voc seguiu direito as orientaes anteriores, ento voc est com um belo princpio de janela em suas mos. Digo um belo princpio porque voc h de concordar comigo que a janela gerada no nenhum pouco amigvel para o nosso usurio, programando h um certo tempo com o Delphi descobri um padro de janela que meus usurios gostaram, mas voc poder futuramente tambm encontrar o seu prprio padro de janela, ento vamos a algumas alteraes: Se voc est utilizando o Delphi 1.0, a nica diferena ser nos DataModules, no se preocupe coloque todas as instrues em um nico formulrio.

DataModules ?Uma das principais novidades que acompanham o Delphi 2.0 a possibilidade de criao de DataModules, estas janelas especiais funcionam como uma espcie de repositrio de dados, no so visualizveis em tempo de execuo. possvel colocar em um nico DataModule todo o modelo relacional e todos os outros formulrios do sistema acessando-o. Acesse inicialmente o objeto DataModule1 para as alteraes que se seguem.

Modificando as Tabelas e as LigaesOs objeto que contm as tabelas e as ligaes de tabela so objetos invisveis quando o aplicativo est rodando portanto no se preocupe muito com a posio que ele ocupar. Tabela no Delphi est contida no objeto (Table), encontrado na Component Palette na pgina Data Access, este objeto no a tabela em si, mas um ponteiro para a tabela, portanto

58

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

voc poder usar duplicaes da mesma tabela, sem que isso afete a integridade de seu banco de dados. Alterando as propriedades da Table: 1. Altere na propriedade DataBaseName, nome do banco de dados BaseDisco, caso voc no encontre na lista o BaseDisco, abra o objeto F_Menu e tente novamente. 2. Verifique se a propriedade TableName est apontada para a tabela: CATEGOR.DB, retire o .DB (visando a compatibilidade com outras bases) 3. Coloque a propriedade IndexFieldNames no nome do ndice primrio da tabela. SIG_CATEG. 4. Altere a propriedade Name para TabCategor, ou seja, Tab + Nome da tabela externo (sem a sua extenso), isto facilitar a identificao da Table e a qual DataSource que ela pertence.. 5. Outra propriedade interessante da Table Active, ela define se a tabela est ou no ativada para o uso. Alteraremos esta propriedade via cdigo, portanto no se preocupe muito com ela neste instante, o ideal e deix-la false, i. inativa. As Ligaes da Tabela no Delphi realizada atravs do objeto (DataSource), encontrado na Component Palette na pgina Data Access, este objeto faz a ligao de sua tabela externa com os campos do formulrio. Alterando as propriedades do DataSource: 1. Note que a propriedade DataSet est com o nome alterado (TabCategor), est propriedade define a table ou query (falemos nelas mais tarde) que ser ligada. 2. Altere a propriedade Name para DsCategor, ou seja, Ds + Nome da tabela externo (sem a sua extenso), como dito antes, isto facilitar a identificao do DataSource e a qual Table ele pertence.

Alterando os campos da tabelaOs campos da tabela devero ser alterados para conterem as crticas, lembre-se, os campos presentes no DataModule so apenas uma mscara para os campos da tabela. D um duplo clique sobre o TabCategor, ser aberta a janela do FieldsEditor. Marque o campo SIG_CATEG e altere as seguintes propriedades:Valor Sigla True >AA;0;_ Descrio Nome do campo a ser mostrado na tela Se o campo ou no requerido para insero de dados na tabela Cria uma mscara de edio para o campo, para alterar esta propriedade clique no boto

Propriedade DisplayLabel Required EditMask

Outras propriedades importantes a serem levadas em considerao so:Alignment: Alinhamento dentro do campo: Centralizado, esquerda ou direita;

59

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

DisplayWidth: Tamanho do campo disponvel para insero de dados; FieldName: Nome do campo na tabela, externo; Name: Nome do campo dentro do formulrio, interno; ReadOnly: Se um campo s de leitura; Size: Tamanho do campo na tabela; e Visible: Campo ou no visvel.

Veja mais observaes sobre as mscaras no apndice E. Marque o campo DES_CATEG e altere apenas a propriedade DisplayLabel para Descrio.

Troque a propriedade Name do objeto DataModule1 para DM_Modelo.Veja como ficou a viso final do objeto DM_Modelo, segue abaixo:

Codificando o DataModuleVoc j deve ter notado que para o Delphi a escrita de cdigos bastante reduzida e bem dividida entre os eventos e com a criao dos DataModules o cdigo ainda fica mais reduzido, diferentemente para os usurios de Delphi 1.0. Todas as crticas e controles para as tabelas ficaro no DataModule enquanto que o formulrio se preocupar com o manuseamento dos campos. Cdigo para efetivar as modificaes na tabela para as bases SQL, clique no boto (Toggle Form/Unit) da SpeedBar, at ter a viso novamente para o DM_Modelo, d um clique simples no objeto TabCategor (marcando-o) e na Object Inspector, na pgina Events, d um duplo click sobre o evento AfterPost:

procedure TDM_Modelo.TabCategorAfterPost(DataSet: TDataSet); begin if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL begin F_Menu.DBDisco.Commit; Gravando as alteraes da tabela F_Menu.DBDisco.StartTransaction; Reinicia o modo de transaes end; end;

60

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O objeto que controla o banco de dados faz parte da Unit fMenu ento necessrio fazer uso desta Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):{$R *.DFM} uses fMenu;

Para as bases de formato SQL existem trs declaraes bsicas:1. StartTransaction - Inicia um bloco de controle para as declaraes; 2. Commit - Termina o bloco de controle gravando as alteraes feitas nas tabelas; e 3. RollBack - Termina o bloco de controle cancelando quaisquer modificaes feitas nas tabelas.

Controlando a duplicao dos Campos-Chave aconselhvel no permitir que o usurio duplique os cdigos de categoria, para tanto: 1. Crie um novo objeto Table com as mesmas propriedades do objeto TabCategor (clique sobre o objeto e digite Ctrl+C e Ctrl+V, elimine as referncias aos eventos), alterando a propriedade Name para TabCategorConf. 2. No objeto TabCategorSIG_CATEG, localize-o atravs da Object Inspector, d um duplo click sobre o evento OnValidateprocedure TDM_Modelo.TabCategorSig_CategValidate(Sender: TField); begin if DSCategorState in [dsEdit, dsInsert] then Verifica se o modo de insero ou edio de dados if TabCategorConf.FindKey([TabCategorSIG_CATEG]) then Pesquisa o campo digit.na tab.criada begin F_Categ.EditSIG_CATEG.SetFocus; Altera a posio do cursor para o objeto EditSIG_CATEG raise Exception.Create('Sigla da categoria duplicado'#10+ Caso j exista mostra 'Click no boto "Localiza" em caso de dvida'); mensagem de erro end; end;

Note que existe uma referncia para o objeto F_Categ (Ser o formulrio de Categoria) precisamos ento fazer uso de sua Unit, para tanto coloque-a abaixo da diretiva de compilao:{$R *.DFM} uses fMenu, { Menu Principal do Sistema } fCateg; { Cadastro de Categorias }

A declarao #10, funciona como um Enter dentro da mensagem, isto far com que esta mensagem tenha duas linhas. O segundo objeto Table foi criado pois a primeira tabela estar em modo de edio ou insero de registros e no poder ser desposicionada para a verificao, ento a verificao se o registro existe ser feita neste segundo objeto.

61

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O comando raise impede que o registro duplicado seja adicionado na tabela, no modo run-time este comando provocar um erro de classe exception que travar o projeto, no se preocupe, digite F9 e prossiga com os testes, quando o projeto for compilado e rodado atravs do .EXE o erro no travar o projeto mostrando somente a mensagem definida. Um ltimo detalhe para o DataModule que temos que prever que a cada novo registro o cursor deve se posicionar no primeiro campo do registro, para o incio da digitao: 1. Marque o objeto TabCategor, e d um duplo click sobre o evento OnNewRecord:

procedure TDM_Modelo.TabCategorNewRecord(DataSet: TDataSet); begin F_Categ.EditSig_Categ.SetFocus; Altera a posio do cursor para o objeto EditSig_Categ end;

Finalizando o DataModuleSalve o DataModule com o nome de DMModelo. Confira o cdigo completo para o DataModule:unit DMModelo; interface uses SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables; type TDM_Modelo = class(TDataModule) TabCategorSig_Categ: TStringField; TabCategorDes_Categ: TStringField; DSCategor: TDataSource; TabCategor: TTable; TabCategorConf: TTable; StringField1: TStringField; StringField2: TStringField; procedure TabCategorAfterPost(DataSet: TDataSet); procedure TabCategorSig_CategValidate(Sender: TField); procedure TabCategorNewRecord(DataSet: TDataSet); private { private declarations } public { public declarations } end; var DM_Modelo: TDM_Modelo; implementation {$R *.DFM} uses fMenu, { Menu Principal do Sistema } fCateg; { Cadastro de Categorias }

62

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

procedure TDM_Modelo.TabCategorAfterPost(DataSet: TDataSet); begin if F_Menu.DBDisco.IsSQLbased then begin F_Menu.DBDisco.Commit; F_Menu.DBDisco.StartTransaction; end; end; procedure TDM_Modelo.TabCategorSig_CategValidate(Sender: TField); begin if DSCategor.State in [dsEdit, dsInsert] then if TabCategorConf.FindKey([TabCategorSIG_CATEG]) then begin F_Categ.EditSIG_CATEG.SetFocus; raise Exception.Create('Sigla da categoria duplicado'#10+ 'Click no boto "Localiza" em caso de dvida'); end; end; procedure TDM_Modelo.TabCategorNewRecord(DataSet: TDataSet); begin F_Categ.EditSig_Categ.SetFocus; end; end.Comandos e suas funes, por ordem de apario: Uses - Faz o uso de determinada unidade de procedimentos e biblioteca de funes. [DataSource].State - Define o estado em que se encontra determinado objeto DataSource. [Objeto].SetFocus - Posiciona o cursor no objeto definido. raise - Cria um erro de classe exception que no permitir que qualquer outra ao prossiga at a mesma ser resolvida.

Alterando o FormulrioCom o DataModule concludo vamos atacar a janela que ser mostrada para o nosso usurio, chame objeto Form2 (chame-o atravs da Project Manager - opo do menu View | Project Manager). Antes de fazermos quaisquer modificao vamos inicialmente alterar o nome da janela, para tanto pressione a tecla F11 (aparecer a Object Inspector para o objeto Form2) altere a propriedade Name para F_Categ. Outra modificao importante e trocar a referncia do comando Uses abaixo da diretiva de compilao que estava referenciado ao antigo nome do objeto DataModule (Unit1), troque-o para:{$R *.DFM} uses

63

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

DMModelo; { Referencia ao DataModule }

Modificando os Labels e CamposOs Labels, representados pelo objeto (Label), encontrado na Component Palette na pgina Standard, so as etiquetas de cada campo que aparece a esquerda dos campos. Alterando as propriedades dos Labels: 1. Altere a propriedade Caption de SIG_CATEG e DES_CATEG para &Sigla: e &Descrio:, respectivamente. 2. Modifique a propriedade Fonte de ambos para MS Sans Serif, Negrito, 8 e Castanho; e a propriedade AutoSize para True. Para selecionar simultaneamente vrios objetos, marque o primeiro objeto, segure a tecla SHIFT e marque os demais.

Qualquer problema para dimensionar o tamanho de objetos use a tecla SHIFT + Setas. Qualquer problema para acertar a posio de objetos use a tecla CTRL + Setas.Uma propriedade interessante a FocusControl ela indicar um controle para a posio do cursor. Ex.: Caso seja digitado ALT+S o cursor se posicionar no objeto EditSig_Categ ou Caso seja digitado ALT+D o cursor se posicionar no objeto EditDes_Categ. Os Campos de Edio, representados pelo objeto (DBEdit), encontrado na Component Palette na pgina Data Controls, so os que recebero o contedo dos campos da tabela. Alterando as propriedades do campo Cdigo: 1. Modifique a propriedade Fonte (de ambos os campos) para MS Sans Serif, Normal, 8 e azul marinho. 2. Verifique as propriedades DataSource e DataField, nome da ligao com DM_ Modelo.DSCategor e o nome do campo Sig_Categ, respectivamente. 3. A propriedade Name, nome do campo, montada com Edit + Nome externo do campo. EditSig_Categ. Alterando as propriedades do campo Descrio: 4. Verifique as propriedades DataSource e DataField, nome da ligao com DM_Modelo.DSCategor e o nome do campo Des_Categ, respectivamente. 5. A propriedade Name, nome do campo, montada com Edit + Nome externo do campo. EditDes_Categ.

64

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Objeto DBNavigatorO objeto para o controle da tabela, representada pelo objeto (DBNavigator), encontrado na Component Palette na pgina Data Controls, e apresentada pr uma barra de funes que ligada ao DataSource controla a navegao dos campos, adio de novos registros, edio e excluso de registros, o cancelamento ou a confirmao de uma modificao e a atualizao do banco de dados (quando em rede):

Apresentada pelos botes: nbFirst (primeiro), nbPrior (anterior), nbNext (prximo), nbLast (ltimo), ndInsert (inserir), ndDelete (excluir), nbEdit (editar), nbPost (confirmar), nbCancel (cancelar) e nbRefresh (atualizar dados). Alterando as propriedades da barra de navegao: 1. Confira a propriedade DataSource verificando para o nome da ligao com DM_Modelo.DSCategor 2. A propriedade ConfirmDelete far com seja exibida uma mensagem, confirmando ou no a excluso. 3. Altere a propriedade Hints, clicando em modo:Primeiro Anterior Prximo ltimo Inserir Excluir Editar Confirmar Cancelar Atualizar dados

, digite o nome de cada boto do seguinte

4. Clique no boto OK e altere a propriedade ShowHint para true, isto far com que embaixo de cada boto da barra, sobreposto pelo cursor, seja mostrado uma caixa como uma tarja amarela com a contedo da propriedade Hint. 5. Voc poder definir quais botes devero aparecer na barra utilizando a propriedade VisibleButtons, para tanto clique no sinal de + que aparece a esquerda da opo e defina true ou false para os botes que sero ou no mostrados.

Modificando os PaineisExistem dois objetos Panel criados automaticamente: o primeiro superior, abriga o objeto DBNavigator, o segundo ocupando o restante da janela, abriga um objeto do tipo ScrollBox, labels e campos. Alterando as propriedades do primeiro painel:

65

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1. Altere a propriedade Alignment, alinhamento da propriedade Caption do painel, para taLeftJustify. 2. Coloque na propriedade Caption o nome Categoria. 3. Modifique a propriedade Fonte para MS Sans Serif, Itlico, 14 e azul marinho. Arrume a barra de navegao de modo que no cubra a descrio, se for o caso aumente o tamanho da janela. Alterando as propriedades do segundo painel: 1. Aumente ou diminua o tamanho da janela e note que este painel diminue e aumenta com ela, isto se deve a propriedade Align estar no modo alClient, altere esta propriedade (temporariamente) para alNone.

Para conseguir ver a tela de propriedades deste painel, clique em quaisquer das bordas, pois sobre este painel existe um outro objeto denominado ScrollBox tambm no modo alClient.

Modificando a JanelaA janela est um pouco escondida atrs dos objetos painis criados, aps alterar a propriedade Align do segundo painel, estique um pouco a janela para baixo e clique nela. Alterando as propriedades da janela: 1. Retire as opes biMinimize e biMaximize da propriedade BorderIcons. 2. Altere na propriedade BorderStyle para bsSingle. 3. Mude a propriedade Caption para Tabela. 4. Se voc no o fez, mude a propriedade Name para F_Categ, ou seja F_ + Nome da tabela externo (sem a sua extenso), isto facilitar a identificao entre o form e sua unit. 5. Verifique a propriedade Position (posio da janela) ela deve estar com o valor ScreenCenter (centralizado). 6. Salve o formulrio com o nome fCateg e salve o projeto.

Criando o terceiro PainelCriaremos agora um terceiro painel para comportar alguns botes

Criando e alterando o painel:1. Crie um objeto Panel, clique no objeto (Panel), encontrado na Component Palette na pgina Standard, e clique no objeto F_Categ, altere as seguintes propriedades:Propriedade Valor Descrio

66

BorlandAlign Caption Height

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

alBottom 41

Alinhamento dentro do form, todo no rodap Label do objeto Altura do objeto

Os botes que criaremos faro duas funes: 1.Sair da janela e 2.Localizao rpida de um determinado registro.

Criando o primeiro boto:1. Marque o objeto panel3 criado, click no objeto BitBtn Component Palette na pgina Additional, e click no panel3. 2. Altere as seguintes propriedades para o boto:Propriedade Kind Valor bkClose Descrio Determina a classe a ser utilizada pelo boto, automaticamente ser alterado as propriedades: Caption, Glyph e ModalResult Label do objeto Tipo de letra a ser mostrada no objeto, para alterar esta propriedade clique no boto Height Hint Left Name ShowHint Width 25 Retorna ao menu principal 312 ButFechar True 89 Altura Ajuda on-line para o objeto especfico Alinhamento a esquerda Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tamanho do objeto

, encontrado na

Caption Font

&Fechar MS Sans Serif, Normal, 8, Preto

Criando o segundo boto:1. Crie um segundo boto, alterando as seguintes propriedades:Propriedade Caption Font Glyph Height Hint Left Name ShowHint Font Width Valor &Localizar MS Sans Serif, Normal, 8, Preto Descrio Label do objeto Tipo de letra a ser mostrada no objeto

[DiretrioDelphi]\IMAGES\BUTTONS\ Imagem a ser mostrada no objeto FIND.BMP 25 Localiza determinado registro na tabela 24 ButLocalizar True MS Sans Serif, Normal, 8, Preto 89 Altura do objeto Ajuda on-line para o objeto especfico Alinhamento a esquerda Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tipo de letra a ser mostrada no objeto Tamanho do objeto

Alterando novamente as propriedades do segundo painel: 1. Recoloque a propriedade Align do objeto Panel2 para alClient e Salve o form e o projeto.

67

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Seu trabalho final deve ter ficado deste modo:

Programando no formulrioAgora vem a parte de cdigo. Ao final deste tpico voc observar que o trabalho maior ficou pr conta de organizar e arrumar os objetos do que com o cdigo em si, i.e., orientao a objetos.

Preservando as reas de MemriaCom o Delphi possvel trabalhar de duas maneiras, a primeira permitir que o Delphi crie todos os objetos em memria aguardando simplesmente que estes sejam chamados, mas isto implica que a mquina Client deva ter uma boa quantidade de memria para suportar os objetos que sero ali colocados, a segunda maneira e criarmos estes objetos via cdigo permitindo que o Delphi crie o mnimo possvel, o problema que isto implica e na demora quanto da chamada de um formulrio, em mdia 50 segundos para ativar o formulrio1. prefervel trabalhar com o segundo modo uma vez que para entrar em determinado formulrio o nosso usurio s o far uma nica vez. Inicialmente retiraremos da rea de criao automtica o formulrio de categoria e o formulrio Sobre o sistema, para tanto, a partir do menu principal clique em Project | Options..., clique na pgina Forms e envie no objetos F_Categ e F_Sobre (clique sobre o primeiro, segure a tecla Shift e clique no segundo e no terceiro e em seguida clique no boto com o sinal de >) que est na lista Auto-create forms para a lista Available forms, clique sobre o boto OK (processo semelhante foi realizado para o formulrio F_Splash).

1

Este tempo com base em uma mquina 486 DX2 com 8 Mb de memria.

68

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Altere agora a instruo do formulrio F_Menu, evento OnClick para o objeto ItemAuxilio1, para criarmos o objeto F_Sobre e aps a sua chamada destru-lo da rea de memria:

procedure TF_Menu.ItemAuxilio1Click(Sender: TObject); begin with TF_Sobre.Create(Self) do Cria o formulrio em memria begin ShowModal; Chama o formulrio atravs da rea aberta Free; Libera a rea aberta end; end;

Cdigo para ativar a Base de dados e as tabelas quando no DataModule, retorne ao formulrio F_Categ: 1. Clique no boto Editor. (Toggle Form/Unit) da SpeedBar, at voc alternar para o Code

procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } procedure inicio; Criando a chamada para um procedimento pblico. end; var F_Categ: TF_Categ;

69

Borlandimplementation {$R *.DFM} uses FMenu, DMModelo;

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Menu Principal do Sistema } { Referencia ao DataModule }

procedure TF_ Categ.Inicio; begin if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.StartTransaction; DM_Modelo.TabCategor.Open; Screen.Cursor := crDefault; ShowModal; end;

Inicio do procedimento Se a base de dados padro SQL Inicia o modo de transaes Ativa a Tabela Faz o cursor ficar no formato de Seta Mostra o formulrio F_Categ

A propriedade cursor no exemplo foi atribuda a unidade Screen que atribui ao sistema o modelo do cursor, mas possvel tambm atribuir um determinado cursor a um objeto especfico, a propriedade pode ser alterada para os diversos tipos de cursores default do windows com as figuras que se seguem:

No necessrio colocar o comando Close para o objeto butFechar pois a propriedade Kind far isto automtico. Cdigo para encerrar as tabelas do DataModule quando for dada sada no formulrio, observe que o usurio no deve poder estar inserindo ou editando registros: 1. No objeto F_Categ, localize-o atravs da Object Inspector, d um duplo click sobre o evento OnClose:

procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction); begin if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then Verifica se o estado do objeto begin DataSource Edio ou insero MessageDlg('Cancele a edio (ou insero) da Categoria antes de fechar!', mostra mensagem mtInformation, [mbOK], 0); de informao Action := caNone; Cancela a sada da janela Exit; Sai da procedure end; Screen.Cursor := crHourGlass; Faz o cursor virar uma ampulheta

70

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

TabCategor.Close; if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.Commit; end;

Fecha a tabela Se a base de dados padro SQL Encerra o modo de transaes gravandoas alteraes no banco de dados

A funo MessageDlg faz parte da Unit Dialogs ento necessrio fazer uso desta Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):{$R *.DFM} uses FMenu, DMModelo, Dialogs;

{ Menu Principal do Sistema } { Referencia ao DataModule } { Utilizado para o controle da funo MessageDlg }

Cdigo para localizar determinado registro, observe que se o usurio no deve estar inserindo ou editando registros: 1. D um duplo Click sob o objeto ButLocalizar:

procedure TF_Categ.ButLocalizarClick(Sender: TObject); var Declarao de variveis ObjPesquisa: String; Cria a varivel ObjPesquisa do tipo String begin if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then begin MessageDlg('Cancele a edio (ou insero) da Categoria antes de localizar!', mtInformation, [mbOK], 0); Exit; end; ObjPesquisa := DM_Modelo.TabCategorSig_Categ.Value; Atribui a ObjPesquisa o valor do campo de tabela Sig_Categ if InputQuery('Entre com a sigla da categoria', 'Sigla',ObjPesquisa) then Solicita a digitao do cdigo a ser procurado if not DM_Modelo.TabCategor.FindKey([ObjPesquisa]) then Pesquisa o campo digitado na tabela MessageDlg('Sigla da Categoria no encontrada.', Caso no seja encontrado informa mtInformation, [mbOK], 0); end;

A funo InputQuery tambm faz parte da Unit Dialogs. O mtodo FindKey faz parte do Objeto TTable.Criando Funes GlobaisUma funo ou um procedimento global e uma srie de comandos comuns a um sistema como um todo, em linguagem Pascal quase que proibido (no proibido pois a linguagem permite) a utilizao de um mesmo conjunto de comandos repetidas vezes, note que para o nosso formulrio temos os mesmos comandos em chamadas diferentes:procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction); begin if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then begin MessageDlg('Cancele a edio (ou insero) da Categoria antes de fechar!',

Aqui Aqui

71

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

mtInformation, [mbOK], 0); Action := caNone; Exit; end; ... end; procedure TF_Categ.ButLocalizarClick(Sender: TObject); var ObjPesquisa: String; begin if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then begin MessageDlg('Cancele a edio (ou insero) da Categoria antes de localizar!', mtInformation, [mbOK], 0); Exit; end; ... end;

Aqui

Aqui Aqui Aqui

Podemos ento retirar o trecho e criarmos uma funo isolada que criticar o estado da edio devolvendo a mensagem, modificando o trecho diferente, ficando desta maneira (no esquea de declarar a funo na rea PRIVATE):private function CriticaEdicao(AntesDe: String) : boolean; public procedure inicio; end;

Cria a funo na rea particular

var ... ... ... function TF_Categ.CriticaEdicao(AntesDe: String) : boolean; Recebe o tipo da mensagem begin if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then Verifica o estado begin MessageDlg('Cancele a edio (ou incluso) da categoria antes de ' + AntesDe, mtError, [mbOK], 0); Monta e envia a mensagem Result := True; Devolve que enviou a mens. end else Result := False; Devolve que no enviou a mens. end; procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction); begin if CriticaEdicao('fechar' ) then Substitui pela chamada a funo begin Action := caNone; Exit; end; ... end; procedure TF_Categ.ButLocalizarClick(Sender: TObject);

72

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

var ObjPesquisa: String; begin if CriticaEdicao('localizar' ) then Exit; ... end;

Substitui pela chamada a funo

Note que j ganhamos uma certa vantagem, ao invs de termos que alterar em dois lugares diferentes s teremos que alterar em um nico lugar, mas ainda no est perfeito pois devemos lembrar que um sistema normalmente no composto por apenas uma tabela, sem contar a parte do cadastro, ento se seguirmos o mesmo padro de construo de formulrios para outras tabelas continuaremos a repetir vrios comandos, ento vamos fazer que a nossa funo sirva para a critica de edio de qualquer tabela, para isto precisamos enviar tambm o DataSource que pesquisar o estado e uma outra varivel do tipo String para dizermos de qual tabela estamos falando para cancelar a edio, v para o objeto F_Menu e crie a seguinte funo (no esquea de declarar na rea PUBLIC):private procedure ShowHint (Sender: TObject); public function CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean; end; var ... ... { Funo Critica Edio Recebe: DSOrigem: DataSouce para investigar o estado DoQue: Nome real da Tabela AntesDe: Funo a executar do tipo Fechar, Localizar... Devolve: True - Se o DataSource est em estado de edio ou insero False - Se o DataSource est em estado de navegao } function TF_Menu.CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean; begin if DSOrigem.State in [dsEdit, dsInsert] then begin MessageDlg('Cancele a edio (ou incluso) ' + DoQue + ' antes de ' + AntesDe, mtError, [mbOK], 0); Result := True; end else Result := False; end;

Aqui

Altere agora o objeto F_Categ eliminando a funo CriticaEdicao e modificando as chamadas:private { comandos particulares } public procedure inicio; end; var F_Categ: TF_Categ;

Elimine

73

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

... ... Elimine as linhas da funo ... ... procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction); begin if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'fechar' ) then Substitua aqui begin Action := caNone; Exit; end; ... end; procedure TF_Categ.ButLocalizarClick(Sender: TObject); var ObjPesquisa: String; begin if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', localizar' ) then Exit; ... end;

Substitua aqui

Alterando o Menu para receber o formulrioAgora finalmente vamos rodar nosso projeto mas antes precisamos chamar o formulrio atravs do menu principal para isto: 1. Abra o objeto F_Menu: no menu principal escolha View e Project Manager, marque o objeto F_Menu e clique sobre o boto View form. 2. Clique em Arquivo, Tabela e Categoria, coloque o seguinte cdigo:procedure TF_Menu.Categoria1Click(Sender: TObject); begin Screen.Cursor := crHourGlass; Faz do cursor uma ampulheta F_Categ := TF_Categ.Create(Application); Cria o formulrio em memria F_Categ.Inicio; Chama o formulrio atravs da rea aberta F_Categ.Free; Libera a rea aberta Screen.Cursor := crDefault; Faz do cursor uma seta end;

3. O objeto F_Categ faz parte da Unit fCateg ento necessrio fazer o uso desta Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):{$R *.DFM} uses fSobre, { Janela do Sobre o Sistema } fCateg; { Cadastro da Tabela de Categoria }

4. Saia do Code Editor e salve o formulrio e o projeto. 5. Rode o projeto e teste o formulrio de categoria, insira algumas categorias, tente provocar o erro de duplicao, tente inserir um registro com o cdigo vazio e localizar um registro.

74

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

6. Se alguma coisa deu errada, releia o captulo, ou ento confira todo o cdigo:unit fcateg; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, StdCtrls, Forms, DBCtrls, DB, Mask, ExtCtrls, Buttons; type TF_Categ = class(TForm) ScrollBox: TScrollBox; Label1: TLabel; EditSig_Categ: TDBEdit; Label2: TLabel; EditDes_Categ: TDBEdit; DBNavigator: TDBNavigator; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; ButFechar: TBitBtn; ButLocalizar: TBitBtn; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ButLocalizarClick(Sender: TObject); private { private declarations } public procedure inicio; end; var F_Categ: TF_Categ; implementation {$R *.DFM} uses fMenu, DMModelo, Dialogs;

{ Menu Principal do Sistema } { Referencia ao DataModule } { Utilizado para o controle da funo MessageDlg }

procedure TF_Categ.Inicio; begin if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.StartTransaction; DM_Modelo.TabCategor.Open; Screen.Cursor := crDefault; ShowModal; end; procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction); begin if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'Fechar' ) then begin

75

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Action := caNone; Exit; end; Screen.Cursor := crHourGlass; DM_Modelo.TabCategor.Close; if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.Commit; end; procedure TF_Categ.ButLocalizarClick(Sender: TObject); var ObjPesquisa: String; begin if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'Localizar' ) then Exit; ObjPesquisa := DM_Modelo.TabCategorSig_Categ.Value; if InputQuery('Entre com a Sigla da categoria','Sigla',ObjPesquisa) then if not DM_Modelo.TabCategor.FindKey([ObjPesquisa]) then MessageDlg('Sigla da Categoria no encontrada.',mtInformation,[mbOK],0); end; end.Comandos e suas funes, por ordem de apario: [Tabela].Open - Ativa um objeto Table equivalente a Active := True. [Form].ShowModal - Ativa o objeto Form, no permitindo que nenhum outro objeto Form anterior seja ativado, at que o mesmo seja desativado. Exit - Sai da funo ou procedimento. [Tabela].Close - Desativa um objeto Table equivalente a Active := False. Var - Define uma cadeia de variveis locais. InputQuery - Mostra uma caixa de dilogo para leitura e entrada de variveis do tipo String. [Tabela].FindKey - Funo que realiza uma pesquisa indexada no objeto Table, atravs do ndice definido, retorna True se encontrou ou False se fim de arquivo

76

Captulo VITrabalhando com janela Pai X FilhaSe voc at agora no sentiu dificuldade em criar e entender o trabalho com tabelas livres, no sentir tambm dificuldade em criar o formulrio para receber este caso, ao contrrio, aconselho que voc releia e refaa o captulo anterior. Em nosso projeto, cada registro na tabela de msica s existir se houver um correspondente na tabela bsico, ento a tabela bsico pai (mestre) da tabela msica que sua filha (detalhe). Esta teoria acima explicada no conceito de modelo relacional de dados (MER). O Delphi incorpora este modelo mesmo para banco de dados no-relacionais, caso estivssemos utilizando o dBase em nosso projeto.

Criando a janela automaticamente Se assim que voc finalizou o captulo anterior voc saiu do Delphi, reative o seu projeto. Agora que voc est pronto para o trabalho, vamos criar a nossa janela: 1. Clique no menu principal a opo File e New..., em New Items, mude a pgina para Forms e clique no objeto entitulado Database Form, parece cpia do captulo anterior? cuidado leia as instrues abaixo:

1. O tipo a ser criada. Form Options: Create a master/detail form Uma janela mestre e detalhes DataSet Options: Create a form using TTables objects Usando o objeto tabela Boto Next.

2. A tabela mestre a ser usada para a janela. Drive or Alias name: AliasDisco Table Name: basico.dbf Boto Next

77

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

3. Campos a serem inseridos Boto >> Boto Next

4. Formao dos campos Vertical Boto Next

5. Posio dos Labels Left - A esquerda Boto Next

6. A tabela detalhe a ser usada para a janela. Drive or Alias name: AliasDisco Table Name: musica.dbf Boto Next

7. Campos a serem inseridos Boto >> Boto Next

8. Formao dos campos Grid Boto Next

9.

10.

78

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Montagem da chave de ligao Available Indexes : Primary Detail Fields : COD_DISCO Master Fields : COD_DISCO Boto Add Joined Fields COD_DISCO -> COD_DISCO Boto Next

Completo Gera a tela como form principal - No O Que gerar: Form e DataModule Boto Finish

Sobre os DataModulesComo eu disse no captulo anterior possvel criar um nico DataModule abrangendo o modelo relacional completo, basta para isto voc fazer o formulrio que est chamando o DataModule controlar o comando Open e Close das tabelas. No farei desta maneira pois isto ao mesmo tempo que simplificaria o meu trabalho dificultaria o seu entendimento, que o de uma pessoa que estivesse aprendendo o Delphi neste momento, ento para este trabalho adotarei um DataModule para cada cadastro.

Trabalhando com as TabelasChame o objeto DataModule1 criado, a nossa primeira providncia ser a de alterar a propriedade Name do objeto para DM_Basico, observe que foi criado dois objetos Table, o primeiro est apontado para a tabela BASICO e o segundo para a tabela MUSICA, note que para este segundo as propriedades MasterSource e MasterFields esto presas pelo primeiro objeto, este o relacionamento entre ambas. Vamos antes criarmos alguns pequenos detalhes: Crie trs objetos Table , encontrado na Component Palette pgina Data Access, e um

objeto DataSource , encontrado na Component Palette pgina Data Access, e altere as seguintes propriedades: Para o objeto Table1 (J existente):Propriedade DatabaseName TableName Name Valor BaseDisco (se este valor no estiver disponvel chame o objeto F_Menu) BASICO TabBasico Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas Nome externo da tabela Nome do objeto Nome do campo indexado

IndexFieldNames NOM_DISCO

Para o objeto DataSource1 (J existente):Propriedade DataSet Name Valor TabBasico DSBasico Descrio Nome da tabela vinculada Nome do objeto

Para o objeto Table2 (J existente):Propriedade DatabaseName Valor BaseDisco Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas

79

BorlandTableName Name MasterSource MasterFields

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

MUSICA TabMusica DSBasico COD_DISCO

Nome externo da tabela Nome do objeto Nome do campo indexado Nome do DataSource Mestre Campo de ligao da tabela Mestre

IndexFieldNames COD_DISCO

Para o objeto DataSource2 (J existente):Propriedade DataSet Name Valor TabMusica DSMusica Descrio Nome da tabela vinculada Nome do objeto

Para o objeto Table3 (Criado):Propriedade DatabaseName TableName Name ReadOnly Valor BaseDisco BASICO TabBasicoConf True Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas Nome externo da tabela Nome do objeto Nome do campo indexado Somente para leitura

IndexFieldNames NOM_DISCO

Para o objeto Table4 (Criado):Propriedade DatabaseName TableName Name MasterSource MasterFields ReadOnly Valor BaseDisco CATEGOR TabCategor DSBasico SIG_CATEG True Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas Nome externo da tabela Nome interno da tabela Nome do campo indexado Nome do DataSource Mestre Campo de ligao da tabela Mestre Somente para leitura

IndexFieldNames SIG_CATEG

Para o objeto DataSource3 (Criado):Propriedade DataSet Name Valor TabCategor DSCategor Descrio Nome da tabela vinculada Nome do objeto

Para o objeto Table5 (Criado): Posicione-o ao lado do objeto DSCateg.Propriedade DatabaseName TableName Name ReadOnly Valor BaseDisco CATEGOR TabCategorConf True Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas Nome externo da tabela Nome do objeto Nome do campo indexado Somente para leitura

IndexFieldNames SIG_CATEG

Os objetos na hora da execuo do formulrio ficaro invisveis, mas bom coloc-los em cantos estratgicos, isto evita a confuso.

80

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

A utilidade de cada objeto Table:TabBasico - Tabela mestre principal. TabBasicoConf - Tabela BASICO para realizar a validao do nome do CD. TabMusica - Tabela utilizada para mostrar as msicas cadastradas de cada disco. TabCategor - Tabela para mostrar a descrio da categoria. TabCategorConf - Tabela para validao da sigla da categoria.

Crie o objeto Query , encontrado na Component Palette pgina Data Access, que servir para calcular o cdigo automtico, calculando sempre o cdigo de maior valor, e altere as seguintes propriedades:Valor BaseDisco QryContador Select Max(COD_DISCO) from BASICO Descrio Nome do Banco de Dados ou a localizao do diretrio das tabelas Nome do Objeto Clusula SQL, selecione o maior valor do campo COD_DISCO da tabela BASICO

Propriedade DatabaseName Name SQL

O campo COD_DISCO criado, servir apenas como uma chave de ligao entre a tabela Basico e Musica, ser uma chave interna do nosso sistema e sua alimentao se far atravs deste objeto SQL criado pegando o maior valor e adicionando 1.

Trabalhando com os CamposPrecisamos inserir alguns campos, pois iremos precisar deles no trabalho com o cdigo e para o objeto DBGrid1, utilize o Fields Editor para inserir os campos que faltam: Para o objeto TabBasico:

COD_DISCO, Propriedade DisplayLabel: Cdigo; NOM_DISCO, Propriedade DisplayLabel: Nome; TIP_DISCO, Propriedade DisplayLabel: Tipo e EditMask: >AAA;0;_ FOT_CAPA, Propriedade DisplayLabel: Foto; e SIG_CATEG, Propriedade DisplayLabel: Categoria e EditMask: >AA;0;_

Para o objeto TabMusica:COD_DISCO, Propriedade Visible: False. NUM_FAIXA, Propriedade DisplayLabel: Faixa e DisplayWidth: 2; NOM_MUSICA, Propriedade DisplayLabel: Msica e DisplayWidth: 40; e NOM_AUTOR, Propriedade DisplayLabel: Autor; e TMP_MUSICA, Propriedade DisplayLabel: Tempo e EditMask: 00\:00;0;_

Para o objeto QryContador:De um duplo clique sobre o objeto aparecer a janela Fields Editor, clique com o boto direito e no menu que aparecer clique na opo Add Fields... e adicione o campo.

81

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Antes de iniciarmos a programao do DataModule compare como ficou o DataModule e salve-o com o nome de DMBasico:

Controlando o DataModuleAgora falta o cdigo, note que a maior parte uma repetio daquilo que j vimos anteriormente: Ativando as tabelas ao ser chamado DataModule: 1. Clique no objeto DMBasico e na Object Inspector na pgina Events d um duplo clique sobre o evento OnCreate e altere-o do seguinte modo:

procedure TDM_Basico.DM_BasicoCreate(Sender: TObject); begin if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL F_Menu.DBDisco.StartTransaction; Inicia o modo de transaes TabCategor.Open; Ativa as tabelas TabCategorConf.Open; TabMusica.Open; TabBasico.Open; TabBasicoConf.Open; end;

Cdigo para encerrar as transaes com a Base de Dados e fechar as tabelas quando for encerrado o DataModule. 1. Digite F11 e localize o objeto DM_Categ, na Object Inspector, na pgina Events, d um duplo click sobre o evento OnDestroy:

procedure TDM_Basico.DM_BasicoDestroy(Sender: TObject); begin TabBasico.Close; Fecha as tabelas TabBasicoConf.Close; TabMusica.Close; TabCategor.Close; TabCategorConf.Close; if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL F_Menu.DBDisco.Commit; Encerra o modo de transaes gravando as end; alteraes no banco de dados

82

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Lembre-se da utilizao do objeto F_Menu, ento preciso declarar a unidade a qual ele pertence com o comando USES (abaixo da diretiva de compilao):{$R *.DFM} uses fMenu; { Menu Principal }

Repare que no incio desta Unit tambm existe uma outra declarao Uses, aps a sesso interface, ento por que no colocar todas essas declaraes em um lugar s? 1o) O Delphi controlar (colocando ou removendo) as Units ali colocadas (dependendo dos objetos utilizados) e 2o) Todos os comandos declarados antes da declarao implementation (com exceo de eventos de criao do tipo onCreate), sero executados e objetos e units ficaro em memria esperando serem chamados, ento impraticvel colocar units que s sero utilizadas em tempo de execuo.

ContadoresO objeto query realiza consultas em modo SQL, no prximo captulo o utilizaremos para criarmos nossas consultas mas, neste momento ele ser utilizado para verificar qual o maior valor armazenado no campo cdigo. A cada novo registro devemos criar tambm um novo COD_DISCO (lembra do objeto QryContador). Alm disso, precisamos nos posicionar no primeiro campo do cadastro, isto ser realizado em dois eventos distintos: 1. Marque o objeto TabBasico, e d um duplo clique sobre o evento onNewRecord:

procedure TF_Basico.TabBasicoNewRecord(DataSet: TDataset); begin F_Basico.EditNOM_DISCO.SetFocus; Posiciona o cursor no objeto end;

Observe que foi utilizado o objeto F_Basico, ento preciso declarar a unidade a qual ele pertence com o comando USES (abaixo da diretiva de compilao):{$R *.DFM} uses fBasico; { Cadastro do Bsico } fMenu; { Menu Principal }

2. Digite F11 e d um duplo clique sobre o evento BeforePost:procedure TF_Basico.TabBasicoBeforePost(DataSet: TDataset); begin if DSBasico.State = dsInsert then Verifica se uma incluso na base begin QryContador.Active := False; Desativa a Query QryContador.Active := True; Ativa a Query with QryContador.Fields[0] do Observe os lembretes if IsNull then Se o valor do contador nulo TabBasicoCOD_DISCO.Value := 1 Atribui 1 ao campo COD_DISCO else Seno TabBasicoCOD_DISCO.Value := AsInteger + 1; Atribui ao campo COD_DISCO a adio

83

Borlandend; end;

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

de 1 ao valor do contador campo

O comando with utilizado como mtodo de taquigrafia, para no escrevermos vrias vezes o mesmo nome de um determinado objeto. Porque no colocarmos todo o cdigo no evento onNewRecord ? Por causa do controle multi-usurio, imagine, um indivduo A inicia a incluso de um CD, e um indivduo B tambm inicia outra incluso, como o cdigo do indivduo A ainda no foi gravado no banco, ser dado o mesmo cdigo para o indivduo B, isto no acontecer se o cdigo for calculado momentos antes de ser gravado o registro, com o caso do evento BeforePost. Para confirmarmos as alteraes para a base SQL, pressione novamente a tecla F11 e na pgina Events, d um duplo click sobre o evento AfterPost:

procedure TDM_Basico.TabBasicoAfterPost(DataSet: TDataSet); begin if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL begin F_Menu.DBDisco.Commit; Gravando as alteraes da tabela F_Menu.DBDisco.StartTransaction; Reinicia o modo de transaes end; end;

Validando os CamposPara no acontecer um duplicao dos nomes dos CDs, utilizaremos para a crtica a mesma idia do que aconteceu com o formulrio de Categoria: 1. Marque o objeto TabBasicoNOM_DISCO, e d um duplo clique sobre o evento OnValidate:procedure TDM_Basico.TabBasicoNom_DiscoValidate(Sender: TField); begin if DSBasico.State in [dsEdit, dsInsert] then Se o modo de insero ou edio if TabBasicoConf.FindKey([TabBasicoNOM_DISCO]) then Pesquisa o campo digitado begin F_Basico.EditNOM_DISCO.SetFocus; Altera a posio do cursor raise Exception.Create('Nome do CD duplicado'#10+ Caso j exista mostra mensagem 'Click no boto "Localiza" em caso de dvida'); de erro e impede o cadastro end; end;

Para que o nosso usurio escolha somente as categorias existentes: 1. Marque o objeto TabBasicoSIG_CATEG, e d um duplo clique sobre o evento OnValidate:

procedure TDM_Basico.TabBasicoSig_CategValidate(Sender: TField); begin if DSBasico.State in [dsEdit, dsInsert] then if not (TabCategorConf.FindKey([TabBasicoSIG_CATEG])) then Observe o comando NOT begin F_Basico.EditSIG_CATEG.SetFocus; raise Exception.Create('Sigla da categoria no existe'#10+

84

Borlandend; end;

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

'Click no boto "Localiza Categoria" em caso de dvida');

Com o DataModule o nosso trabalho j est concludo, salve o objeto e confirme o cdigo:unit DMBasico; interface uses SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables; type TDM_Basico = class(TDataModule) TabMusicaCod_Disco: TFloatField; TabMusicaNum_Faixa: TFloatField; TabMusicaNom_Musica: TStringField; DSBasico: TDataSource; TabBasico: TTable; TabMusica: TTable; DSMusica: TDataSource; TabBasicoConf: TTable; TabCategor: TTable; TabCategorConf: TTable; DSCategor: TDataSource; TabBasicoCod_Disco: TFloatField; TabBasicoNom_Disco: TStringField; TabBasicoTip_Disco: TStringField; TabBasicoFot_Capa: TBlobField; TabBasicoSig_Categ: TStringField; QryContador: TQuery; QryContadorMAXOFCOD_DISCO: TFloatField; procedure DM_BasicoCreate(Sender: TObject); procedure DM_BasicoDestroy(Sender: TObject); procedure TabBasicoNewRecord(DataSet: TDataSet); procedure TabBasicoBeforePost(DataSet: TDataSet); procedure TabBasicoAfterPost(DataSet: TDataSet); procedure TabBasicoNom_DiscoValidate(Sender: TField); procedure TabBasicoSig_CategValidate(Sender: TField); private { private declarations } public { public declarations } end; var DM_Basico: TDM_Basico; implementation {$R *.DFM} uses fBasico, { Cadastro do Bsico }

85

BorlandfMenu;

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Menu Principal }

procedure TDM_Basico.DM_BasicoCreate(Sender: TObject); begin if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.StartTransaction; TabCategor.Open; TabCategorConf.Open; TabMusica.Open; TabBasico.Open; TabBasicoConf.Open; end; procedure TDM_Basico.DM_BasicoDestroy(Sender: TObject); begin TabBasico.Close; TabBasicoConf.Close; TabMusica.Close; TabCategor.Close; TabCategorConf.Close; if F_Menu.DBDisco.IsSQLbased then F_Menu.DBDisco.Commit; end; procedure TDM_Basico.TabBasicoNewRecord(DataSet: TDataSet); begin F_Basico.EditNOM_DISCO.SetFocus; end; procedure TDM_Basico.TabBasicoBeforePost(DataSet: TDataSet); begin if DSBasico.State = dsInsert then begin QryContador.Active := False; QryContador.Active := True; with QryContador.Fields[0] do if IsNull then TabBasicoCOD_DISCO.Value := 1 else TabBasicoCOD_DISCO.Value := AsInteger + 1; end; end; procedure TDM_Basico.TabBasicoAfterPost(DataSet: TDataSet); begin if F_Menu.DBDisco.IsSQLbased then begin F_Menu.DBDisco.Commit; F_Menu.DBDisco.StartTransaction; end; end; procedure TDM_Basico.TabBasicoNom_DiscoValidate(Sender: TField); begin if DSBasico.State in [dsEdit, dsInsert] then if TabBasicoConf.FindKey([TabBasicoNOM_DISCO]) then

86

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin F_Basico.EditNOM_DISCO.SetFocus; raise Exception.Create('Nome do CD duplicado'#10+ 'Click no boto "Localiza" em caso de dvida'); end; end; procedure TDM_Basico.TabBasicoSig_CategValidate(Sender: TField); begin if DSBasico.State in [dsEdit, dsInsert] then if not (TabCategorConf.FindKey([TabBasicoSIG_CATEG])) then begin F_Basico.EditSIG_CATEG.SetFocus; raise Exception.Create('Sigla da categoria no existe'#10+ 'Click no boto "Localiza Categoria" em caso de dvida'); end; end; end.

Alterando a Janela CriadaVamos novamente alterar a janela criada, como j foi dito, vou usar um padro de janela que achei como ideal, mas voc poder, futuramente, tambm encontrar o seu prprio padro, ento vamos as alteraes, antes, lembre-se, preciso entender e compreender totalmente o captulo anterior e o DataModule criado deve ter passado pela verificao sem erros, para verificar um objeto a partir do menu principal escolha as opes Project | Syntax Check. Deve ocorrer um erro na clusula Uses informando que a unidade fBasico no existe nem o objeto F_Basico no foi encontrado, ento antes de qualquer passo chame o objeto Form2 e altere a propriedade Name para F_Basico e salve o formulrio com o nome de fBasico, pode novamente verificar a unidade DMBasico que desta vez no haver problemas. Aproveite o objeto F_Basico para alterar a clusula uses logo abaixo da diretiva de compilao para:{$R *.DFM} uses DMBasico; { Referncia ao DataModule }

Organizando os PanelsVamos passar para as alteraes com objeto F_Basico. Os objetos da janela se encontram distribudos em trs objetos Panel, o primeiro (Panel1) guarda o objeto DBNavigator, o segundo (Panel2) guarda os labels e os campos do arquivo BASICO e o terceiro (Panel3) guarda o objeto DBGrid1 que controlar o arquivo MUSICA. Altere a propriedade Align do objeto Panel3, para alNone. Aumente a janela do modo que todos os campos do objeto mestre apaream.

87

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Coloque os objetos label4 e ImageFOT_CAPA a direita dos outros campos.Depois de tudo arrumado altere a propriedade AutoScroll no objeto ScrollBox para True depois para False, isto far com que a barra de rolagem vertical desaparea. Crie um quarto objeto Panel para colocar os botes, conforme as instrues do captulo anterior, para facilitar o trabalho chame o objeto F_Categ, atravs do Project Manaager, clique sobre o objeto Panel3 e pressione Ctrl+C chame novamente o objeto Form2 e pressione Ctrl+V, crie um terceiro boto e altere as seguintes propriedades:Propriedade Caption Font Glyph Height Hint Name ShowHint Width Valor &Msicas MS Sans Serif, Normal, 8, Preto [DiretrioDelphi]\IMAGES\BUTTON S\CDDRIVE.BMP 25 Cadastro e manuteno das msicas ButMusica True 89 Descrio Label do objeto Tipo de letra a ser mostrada no objeto Imagem a ser mostrada no objeto Altura do objeto Ajuda on-line para o objeto especfico Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tamanho do objeto

Reorganize os trs botes no objeto Panel4

Modificando os campos e Labels Exclua o label (objeto Label1) e o campo (objeto EditCOD_DISCO) que faz referncia ao COD_DISCO. Modifique a fonte dos campos e labels conforme descrito no captulo anterior. Altere as propriedades Caption dos Labels para: &Nome:, &Tipo:, Cate&goria: e &Capa: respectivamente Altere a propriedade AutoSize dos Labels para True Modifique a propriedade Stretch do objeto ImageFOT_CAPA para true, isto far com que a imagem da capa fique sempre de acordo com o tamanho do objeto.

Organizando os PanelsVamos organizar cada objeto Panel por partes: Objeto Panel1 Modifique o objeto DBNavigator conforme descrito no captulo anterior.

88

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Para a propriedade Hints, escreva novamente o auxlio para cada boto ou, chame o formulrio F_Categ e copie as descries da propriedade Hints com Ctrl+C e chame novamente o objeto DBNavigator e digite Ctrl+V dentro da propriedade. Modifique tambm o objeto Panel1 conforme descrito no captulo anterior e altere a propriedade Caption para CDs. Objeto Panel2

Altere as propriedades Height e Width para 216 do objeto ImageFOT_CAPA. Crie um novo objeto Label e altere as seguintes propriedades:Valor &Msicas: MS Sans Serif, Negrito, 8, Castanho DBGrid1 Descrio Label do objeto Tipo de letra a ser mostrada no objeto Controle do foco

Propriedade Caption Font FocusControl

Aumente o objeto Panel2 de forma a caber os outros objetos, organize os objetos da seguinte forma: Nome, Tipo, Categoria e Msicas, ao lado coloque a foto. Deixe o espao de um campo entre Categoria e Msicas. Remova o objeto EditTIP_DISCO e em seu lugar crie o objeto DBComboBox , encontrado na Component Palette pgina Data Controls, e altere as seguintes propriedades:Valor DM_Basico.DSBasico TIP_DISCO MS Sans Serif, Normal, 8, Azul Marinho Selecione o tipo AAA; AAD; ADD; e DDD ComboTIP_DISCO True Descrio DataSource vinculado Campo de tabela Tipo de letra a ser mostrada no objeto Ajuda on-line para o objeto especfico Itens que aparecero como opes do COMBO BOX, coloque um em cada linha. Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line

Propriedade DataSource DataField Font Hint Items Name ShowHint

No objeto Label3 recoloque a propriedade FocusControl apontando para o objeto ComboTIP_DISCO. Objeto Panel3

Marque o objeto DBGrid1 e altere as propriedades Align para alNone e BorderStyle para bsSingle, pressione Ctrl+X marque o objeto ScrollBox e pressione Ctrl+V, acerte o objeto de forma que este caiba abaixo do objeto Label1 (Msicas:). Elimine o objeto Panel3, clique sobre ele e pressione Del.

Modificando a Janela Altere as propriedades BorderIcons, BorderStyle e Position conforme descrito no captulo anterior.

89

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Mude a propriedade Caption para Cadastro. Altere a propriedade Align do objeto Panel2 para alClient e acerte as posies no formulrio. Salve o formulrio e salve o projeto. No espao deixado entre os labels de Categoria e Msica, crie o objeto DBText , encontrado na Component Palette pgina Data Controls, que servir para mostrar o nome da categoria selecionada, altere as seguintes propriedades:Valor DM_Basico.DSCategor DES_CATEG MS Sans Serif, Normal, 8, Castanho Descrio DataSource vinculado Campo de tabela Tipo de letra a ser mostrada no objeto

Propriedade DataSource DataField Font

Crie agora trs objetos SpeedButton Additional:

, encontrado na Component Palette pgina

Para o objeto SpeedButton1: Posicione-o ao abaixo do label Capa.Propriedade Glyph Height Hint Name ShowHint Width Valor Descrio [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto ONS\ANIMATN.BMP 25 Cpia imagem da rea de tranferncia ButPaste True 25 Altura do objeto Ajuda on-line para o objeto especfico Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tamanho do objeto

Para o objeto SpeedButton2: Posicione-o ao abaixo do objeto EditCOD_CATEGPropriedade Glyph Valor Descrio [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto ONS\LANTERNA.BMP (veja dica) 25 Pesquisa determinada categoria ButLocCateg True 25 Altura do objeto Ajuda on-line para o objeto especfico Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tamanho do objeto

Height Hint Name ShowHint Width

Para o objeto SpeedButton3: Posicione-o ao lado do objeto ButLocCategPropriedade Glyph Height Hint Valor Descrio [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto ONS\CRDFILE2.BMP 25 Insere registro na tabela de Altura do objeto Ajuda on-line para o objeto especfico

90

BorlandName ShowHint Width

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

categoria ButInsCateg True 25 Nome do objeto Mostrar o contedo da propriedade hint sob a forma de uma caixa de ajuda on-line Tamanho do objeto

A funo de cada boto est explicada na propriedade hint, para os objetos ButLocCateg e ButInsCateg iremos nos aproveitar dos formulrios j construdos anteriormente. Provavelmente voc no ir encontrar o arquivo LANTERNA.BMP solicitado para o segundo boto, teremos de cri-lo: 1. Salve o formulrio e feche o projeto, localize (no diretrio demos do Delphi) e abra o projeto [DiretrioDelphi]\DEMOS\DB\MASTAPP\MASTAPP.DPR 2. Atravs do Project Manager abra o formulrio SearchDlg. 3. Localize o objeto SearchButton e clique na propriedade Glyph. e nome proposto

4. Escolha o boto Save... e salve-o no diretrio ([DiretrioDelphi]\IMAGES\BUTTONS\ e LANTERNA.BMP).

5. Retorne ao nosso projeto descartando quaisquer aviso para salvar o MASTAPP.DPR.

Trabalhando com GridsFalemos agora de um objeto especial o Grid, especial por ser um dos objetos de todo o