P. 1
Curso Delphi Com Access

Curso Delphi Com Access

|Views: 384|Likes:
Published by Felipe Mozer

More info:

Published by: Felipe Mozer on Sep 25, 2011
Copyright:Attribution Non-commercial
List Price: $4.99 Buy Now

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
See more
See less

11/27/2014

$4.99

USD

pdf

ipsgyn .

Curso Delphi 4.0 com MS-Access

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 1/178

Curriculum Vitae
I- Identificação
Nome: Fernando Antonio Fernandes Anselmo Data Nascimento: 17 de Agosto de 1966 Contato: fernandoanselmo@yahoo.com.br Site:http://orbita.starmedia.com/~anselmo32//programa/default.html

II- Resumo
Coordenação e desenvolvimento de atividades de análise, definição de projetos, experiência na definição e criação de algoritmos lógicos, codificação, compilação e teste de programas. Treinamento e iniciação de usuários em diversos ambientes, entre estes destacam-se Delphi, Java e ASP. Seus cursos são oferecidos pela MCI Informática e pela FINATEC. Possui larga experiência quanto ao levantamento de Informações, acompanhamento e análise do processamento dos programas desenvolvidos. Grande experiência em programação para ambientes Cliente/Servidor.

III- Formação
• Desenvolvimento WEB e JavaScript Promotor: Politec • Ambientação em SQL Server, Internet, Interdev e IIS 4.0 Promotor: EFATEC • ORACLE 7.0 - Para DBA Promotor: ORACLE do Brasil • SCO UNIX SYSTEM V Promotor : CT&S • Modelagem e Desenvolvimento de Sistemas Aplicativos Promotor : UsP - Universidade de São Paulo • Programação em Computadores Promotor : ETUC - Faculdade Católica de Tecnologia • Língua Inglesa Promotor : Fluency Idiomas • Formação básica no Segundo Grau com Habilitação em Química Colégio Santa Rosa de Lima

IV- Categoria Profissional

Cargo Atual: Analista de Sistemas Sênior (Líder de Projetos) Tempo de experiência: 11 anos

V- Experiência Profissional
a) Atividades Principais:

• Experiência no Desenvolvimento e Manutenção de Sistemas para Internet utilizando ASP, JAVA e HTML. • Domínio em SGBDR de 4a. geração, tais como ORACLE, MS-SQL Server, INTERBASE entre outros. • Ministra cursos destinados a profissionais Desenvolvedores da área de informática SENAC e MCI Informática • Escrevi os livros: "Delphi - O caminho das Pedras" e "Delphi & Access - O melhor de

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 2/178

dois mundos" • Grande experiência com sistemas em Delphi em especial para aplicações Intranet utilizando Delphi e objetos ActiveX.

b) Ambiente Operacional:

• Domínio dos ambientes operacionais Windows e Linux. • Conhecimentos do ambiente operacional Netware. • Noções em Ambientes de Grande Porte ADABAS, ROSCOE, NATURAL, COMPLETE, JCL, VM/CMS e CICS.

c) Histórico das Últimas Atividades Exercidas
1999/Atual - Politec Ltda Cargo: Analista de Sistemas Sênior - Contratado para auxiliar ao desenvolvimento do Sistema Justiça do Superior Tribunal de Justiça - STJ. - Ministrando aulas de Delphi, HTML, ASP e Java. 1994/1999 - FIA/USP Cargo: Líder de Projetos Ano 99 - Iniciei o desenvolvimento de Sistema Piloto em OutLook 98 para controlar os atendimentos ao usuário - Treinei em INTERNET sobre o modelo adotado pela Microsoft IIS 4.0, MTS e Interdev - Desenvolvi sistema em Delphi para controle de Biblioteca utilizando o banco de dados textual MicroIsis Ano 98 - Planejei e desenvolvi os sistemas em Delphi 4.0: Cadastro de Processos de Licitação, Controle de Help Desk para o atendimento ao usuário e Criação de diversos objetos para suporte as aplicações - Iniciei o desenvolvimento do Sistema de Cadastro Dinâmico para o Fechamento do Censo Escolar de 97 com o prazo de entrega previsto para 31/12/1997 Ano 97 - Treinei usuários do FNDE em Power Designer 6.0 - Ferramenta CASE e Delphi 3.0 Client / Server - Iniciei a criação de diversas "Templates" para a automação da ferramenta Power Designer na geração de sistemas na plataforma DELPHI 3.0. Ano 96 - Fui transferido para o contrato FIA/MEC - Fui responsável pelo desenvolvimento técnico com a criação de vários objetos em DELPHI para servir de apoio ao desenvolvimento dos sistemas. Ano 95 - Ministrei vários cursos de DELPHI desde o básico ao avançado. - Estudei mudanças para substituição da plataforma ACCESS / ORACLE e adoção a ferramenta de desenvolvimento de 4a. Geração Borland Delphi. Ano 94 - Fui contratado pela FIA/USP - Sendo lotado para trabalhar no IBAMA - Instituto Brasileiro do Meio-Ambiente e Recursos Naturais Renováveis. Para liderar a equipe de desenvolvimento.

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 3/178

1993/1994 - Politec Ltda Cargo: Analista de Sistemas - Desenvolvimento do Sistemas na plataforma Visual Basic e Natural for Windows. - Fui contratado pela POLITEC, para a manutenção e desenvolvimento do projeto JUSTIÇA, lotado no Superior Tribunal de Justiça. Inicia os trabalhos de manutenção e reajustes no sistema de controle e distribuição de processos jurídicos - desenvolvimento em ambiente NATURAL II / ADABAS. 1992/1993 - RCM Informática Cargo: Analista de Sistemas - A RCM, nesta época, era a representante na América do Sul pela comercialização do SGBD4 ZIM. Fui contratado para iniciar os trabalhos no sistema de Tele-Suporte para o Sistema de Arrecadação Comercial para o DNRC. 1990/1992 - FIA/USP Cargo: Programador a Analista de Sistemas Fui lotado para trabalhar na NOVACAP - Companhia Urbanizadora da Nova Capital do Brasil. Neste período desenvolvi diversos sistemas na plataforma Clipper e bancos padrão xBase e na nova plataforma Unix com banco ZIM. 1990 - Racional Informática Cargo: Programador Durante um período de treinamento de 1 mês, não cheguei a ser contratado em carteira, pois foi imediatamente contratado pela FIA/USP. Nesta empresa realizei os trabalhos de programação do Sistema Controle de Estoque e Mercadorias - Desenvolvido em ambiente DOS / dBASE III Plus. 1989/1990 - FTI - Fundação de Tecnologia Industrial Cargo: Programador Fui lotado para trabalhar no Ministério do Desenvolvimento da Indústria e do Comércio, desenvolvi em sistemas nas seguintes linguagens: Natural, COBOL, PL1, EASYTRIEVE Plus, JCL e Clipper. Outros Dados: 1988 - Primeiro emprego em Carteira na KRION Vídeo Clube na área de programação em Computadores em Ambiente dBASE III plus e planilha para contabilidade em Lótus 123. 1987 - Conclui com nota "A" o Estágio de Programação de Computadores no PRODASEN - Processamento de Dados do Senado Federal. 1986 - Contratado como "Free-lancer" pela ETUC - para ministrar cursos de COBOL e PL1. 1985 - Primeiro trabalho remunerado como substituto de um Digitador em férias no Banco do Nordeste do Brasil em máquinas PC.

VI- Local, data e assinatura

Assumo total responsabilidade que todas as informações prestadas são verdadeiras até a presente data. Fernando Antonio Fernandes Anselmo Brasília, sexta-feira 20 de setembro de 2002

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 4/178

Programção Orientada a Objetos
Pré-Requisitos: Windows 98 Delphi 4.0 versão Client/Server Suite BDE 5.00 MS-Access 97

Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.com.br

Prefácio
Para você poder compreender melhor o ambiente de desenvolvimento Delphi, é necessário que seja apresentado alguns conceitos da POO (Programação Orientada a Objetos). Não os confunda com POE (Programação Orientada a Eventos), muito difundido com a linguagem encontrada com o MS-Access, o Access-Basic (um ambiente baseado em Objetos). Vou tentar expor aqui as sensíveis diferenças que existem entre esses dois conceitos. A POO e a POE são facilmente confundidas, mas lembre-se, a POO contém a POE, mas a POE não contém a POO; um objeto pode existir mesmo que para ele não exista nenhum evento associado, mas é impossível existir um evento se não houver um objeto associado. Outra característica que pode causar confusão, são ambientes Orientados a Objetos e ambientes Baseados em Objetos. Em ambiente Orientado a Objetos existe a possibilidade da criação e manipulação de objetos, enquanto que o Baseado em Objetos esta possibilidade é totalmente inexistente o que existe é a simples manipulação ou no máximo uma derivação (criação de um a partir de outro já existente) dos objetos. A POO é um conceito desenvolvido para facilitar o uso de códigos de desenvolvimento em interfaces gráficas. Sendo a Inprise, uma das primeiras a entrar neste novo conceito, possui suas principais linguagens de programação (tais como Object Pascal e Object C), totalmente voltadas para este tipo de programação. A POO atraiu muitos adeptos principalmente pelo pouco uso de código que o Projeto (diferente de Sistema) carrega no programa fonte, ao contrário de linguagens mais antigas como o Clipper’87 muito utilizado no final da década de 80 e início da década de 90. O resultado desta “limpeza” resulta que uma manutenção no projeto é muito mais simples. Para entender o sistema POO, vamos tentar pensar simples, imagine que você acabou de adquirir uma caixa de bloquinhos de Lego, você pode criar várias coisas com eles, mas você possui um número limitado de peças, você pode aumentar sua coleção, aumentando também a possibilidade do número de coisas que você poderá criar, formando verdadeiras cidades de Lego. Depois do comercial, a POO é basicamente isto, adquirindo o Delphi você está adquirindo um ambiente totalmente flexível para a criação de um número de determinados sistemas, você pode aumentar sua produtividade simplesmente aumentando o número de objetos. Os conceitos que vou apresentar a seguir existem desde que foi sonhada a Orientação a Objetos, provavelmente você deve conhecer uma boa parte, se não, então é a hora de você se familiarizar com este ambiente.

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 5/178

Conceitos da Orientação a Objeto
Antes de começarmos a falar realmente de linguagem orientada a objetos e necessário que você possua os conceitos básicos da orientação a objetos, são 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 gráfica para o usuário. Atributos - São as características do objeto, como cor e tamanho, a janela, por exemplo, tem atributos como o modelo, tamanho, abertura simples ou dupla, entre outros. Encapsulação - é um mecanismo interno do objeto “escondido” do usuário. Uma pessoa pode abrir uma janela girando a tranca sem precisar saber o que há dentro dela. Ação - é a operação efetuada pelo objeto. Todas as janelas, por exemplo, controlam a iluminação e temperatura ambiente, dependendo do seu design. Herança - um objeto novo nem sempre é criado do zero. Ele pode “herdar” atributos e ações de outros já existentes. Um basculante herda atributos das janelas e das persianas. Polimorfismo - é a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. O comando “abre”, por exemplo, faz um objeto entrar em ação, seja ele uma janela, uma porta ou uma tampa de garrafa. Ligação - é quando um objeto conecta a sua ação a outro. Um sensor de claridade, por exemplo, ativa o acendimento automático da iluminação de rua. Embutimento - Permite a um objeto incorporar funções de outros, como um liquidificador que mói carne com a mudança do tipo da lâmina.

Linguagem Object Pascal
Object Pascal é uma linguagem Orientada a Objetos não é pura, mas, híbrida, por possuir características de programação não só visual mas também escrita, para os programadores que já conhecem técnicas de estruturas de programação, tais como C, Basic, Pascal ou xBASE entre outras linguagens a Object Pascal providência uma migração de forma natural oferecendo um produto de maior complexibilidade. Object Pascal força a executar passos lógicos. Isto torna mais fácil o desenvolvimento em ambiente gráficos (tais como o Windows), de aplicações livres, ou que utilizam banco de dados do tipo Cliente/Servidor. A linguagem trabalha com o uso de ponteiros para a alocação de memória e todo o poder de um código totalmente compilável. Além disso, possibilita a criação e reutilização (vantagem de re-uso tão sonhado com a Orientação a Objetos) de objetos e bibliotecas dinâmicas (Dynamic Link Libraries - DLL). Object Pascal contém todo o conceito da Orientação a Objetos, incluindo a herança, o encapsulamento e o polimorfismo. Algumas extensões foram incluídas para facilitar o uso tais como conceitos de propriedades, particulares e públicas, e tipos de informações em modo run-time, manuseamento de exceções, e referências de classes. O resultado de toda esta junção faz com que Object Pascal consiga suportar as facilidades de um baixo nível de programação, tais como: Controle e acesso das sub classes do Windows (API);

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 6/178

Passar por cima das mensagens de loop do Windows; Mensagens semelhantes as do Windows; Código puro da linguagem Assembler. Como deu para perceber a base de toda a programação Delphi é a linguagem Object Pascal nunca diga então que você programa em Delphi e sim que você programa em Object Pascal, assim como você nunca programou em Clipper mas em xBase, vamos aprender alguns conceitos básicos dentro deste tipo de programação.

Símbolos Especiais
A Object Pascal aceita os seguintes caracteres ASCII:
Letras - do Alfabeto Inglês: A até Z e a até z. Dígitos - Decimal: 0 até 9 e HexaDecimal: 0 até 9 e A até F (ou a até f) Brancos - Espaço (ASCII 32) e todos os caracteres de controle ASCII (ASCII 0 até ASCII 31), incluindo final de linha e Enter (ASCII 13). Especiais - Caracteres: + - * / = < > [ ] . , ( ) : ; ^ @ { } $ # Símbolos - Caracteres: <= >= := .. (* *) (. .) //

Importante - O colchetes esquerdo “[” e equivalente ao “(.” e o colchetes direito “]” e equivalente a “.)”. Importante - Os comentários são formados por chave esquerda “{” e equivalente ao “(*” e fechados com a chave direita “}” e equivalente a “*)”. O comentário de uma linha é o “//” (não é aceito pelo Delphi 1.0).
for i := 1 to 10 do for i := 1 to 10 do for i := 1 to 10 do // Este é o exemplo de um comentário apenas desta linha { Este é o exemplo de um comentário que pode ser em várias linhas } (*Este é o exemplo de um comentário que pode ser em várias linhas *)

☞ ☞

Palavras Reservadas
Object Pascal se utiliza das seguintes palavras reservadas, não podendo as mesmas serem utilizadas ou definidas:
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 são utilizadas em contextos de identificação de objetos:
Absolute Abstract Assembler At Cdecl Export External Far Forward Index Name Near Nodefault Override Private Published Read Resident Stored Virtual

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 7/178

Default Dynamic

Interrupt Message

Protected Public

Write

Números
É possível definir variáveis ou constantes com tipos Inteiros ou Numéricos de ponto flutuante, a diferença entre os diversos tipos permitidos se deve a capacidade de armazenamento e o espaço ocupado, veja a comparação nas tabelas abaixo: Para os tipos Inteiros
Tipo Integer Shortint Smallint Longint Int64 Cardinal Byte Word Longword Range -2147483648..2147483647 -128..127 -32768..32767 -2147483648..2147483647 -2^63..2^63-1 0..4294967295 0..255 0..65535 0..4294967295 Formato 32-bit + sinal 8-bit + sinal 16-bit + sinal 32-bit + sinal 64-bit + sinal 32-bit 8-bit 16-bit 32-bit

Para os tipos Ponto Flutuante
Tipo Real48 Real Single Double Extended Comp Currency Range 2.9 x 10^-39 .. 1.7 x 10^38 5.0 x 10^-324 .. 1.7 x 10^308 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 Dígitos Significantes 11-12 15-16 7-8 15-16 19-20 19-20 19-20 Tamanho em Bytes 6 8 4 8 10 8 8

var i : double; // Aqui crio uma variável i sendo Float z : integer; // Aqui crio uma variável z sendo Inteira t : real; // Aqui crio uma variável t sendo Real begin i := StrToFloat('10.23'); z := Round(i); t := i; end ;

Constantes
Uma constante é um identificador com valor(es) fixo(s). Um bloco de declarações constante possui a seguinte expressão: [Declaração Constante] [Identificador] (=) [constante] (;) A lista abaixo apresenta um conjunto de funções que podem ser utilizadas para a declaração das constantes:
Ab Chr Hi High Length Lo Low Odd Ord Pred Ptr Round SizeOf Succ Swap Trunc

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 8/178

Alguns exemplos para a definição de Constantes:
const Min = 0; Max = 100; Centro = (Max - Min) div 2; Beta = Chr(225); NumLetras = Ord('Z') - Ord('A') + 1; MensOla = 'Instrução inválida'; 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;

Expressões
As expressões em Object Pascal (como em qualquer linguagem) são formadas por operadores e operandos; os operadores são divididos em quatro categorias básicas:
Únicos Multiplicativos Adicionais Relacionais @, Not >, /, div, mod, and, shl, shr, as +, -, or, xor =, < >, <, >, < =, > =, in, is

As expressões obedecem as regras básicas de lógica para a precedência da execução das operações.

Identificadores
Identificadores podem ser constantes, tipos, variáveis, procedures, funções, unidades, programas e campos de registros. Não existe limite de caracteres para o nome de um identificador mas apenas os 63 primeiros caracteres são significantes (não podendo ser idêntico ao nome das palavras reservadas). O nome de um identificador deve ser iniciado por Letras ou o caracter underscore ( _ ). O resto é formado por Letras, Dígitos, caracter underscore (ASCII $5F). Não é permitido a utilização de espaços para a formação do nome.

☞ Importante - Exemplo de identificadores válidos: Form1, SysUtils.StrLen, Label1.Caption
with... do...;
Delimita um determinado bloco de declarações para um identificador específico evitando a declaração 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 variáveis ou constantes de um mesmo tipo. A sintaxe do comando é: array [{quantidade de ocorrências}] of {Tipo};. Os arrays são controlados por três funções:

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 9/178

Função 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;

Declarações
Declarações descrevem ações de um algorítmo a serem executadas.

begin... end;
Prende um conjunto de declarações 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 expressão escolhe entre o resultado de uma condição booleana o caminho verdadeiro (then) ou falso (else). A sintaxe do comando é: IF {condição} 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 execução de um programa para o ponto determinado pelo Label. A sintaxe do comando é: GOTO {Label};. Ex.:
label primeiro;

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 10/178

begin { ... comandos iniciais ... } if x = 2 then goto primeiro; { ... outros comandos ... } Primeiro: { ... comandos do Primeiro ... } end;

case... of... else... end;
Consiste de uma lista de declarações que satisfaz a condição de um seletor de expressões, se nenhuma parte da lista satisfizer ao seletor executa os comandos do sub-comando else. Para o seletor serão válidos os tipos definidos, tipo Inteiros ou LongInt. A sintaxe do comando é: CASE {seletor} OF {Expressão 1}: {comando da expressão 1}; {Expressão 2}: {comando da expressão 2}; {Expressão n}: {comando da expressão 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 <= x <= 6 ... } else { ... Bloco para x < 1 ou x > 6 ... }; end; end;

repeat... until;
Repete um determinado bloco de declarações até a condição booleana do subcomando until ser satisfeita. A sintaxe do comando é: REPEAT {comandos}; until {condição};. Ex.:
begin { ... comandos iniciais ... } x := 0; repeat x := x + 1 until (x = 2); end;

for... to (downto)... do...;
Incrementa em 1 uma determinada variável inteira, repetindo um bloco de comandos, até que esta atinja o valor final do intervalo, o subcomando downto realiza o incremento reverso. A sintaxe do comando é: FOR {variável} := {valor inicial} to (downto) {valor final} do {bloco de comandos};. Ex.:
begin { ... comandos iniciais ... } for i := 1 to 10 do { ... Comandos A ... } for s := 10 downto 1 do { ... Comandos B... } end;

// Executa o [comandos A] para i = 1,2,3,4,5,6,7,8,9 e 10 // Executa o [comandos B] para i = 10,9,8,7,6,5,4,3,2 e 1

while... do...;
Repete um bloco de comandos enquanto que determinada condição booleana seja satisfeita. A sintaxe do

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 11/178

comando é: WHILE {condição} DO {bloco de comandos};. Ex.:
begin { ... comandos iniciais ... } while i := 1 do { ... Bloco de comandos ... } end; // Repete o [Bloco de comandos] enquanto i = 1

break; ou continue...;
O comando break interrompe um bloco de repetição for, while ou repeat saindo do bloco. A sintaxe do comando é: BREAK; enquanto que o comando continue retorna a primeira instrução do bloco de repetição for, while ou repeat. A sintaxe do comando é: CONTINUE;. Ex.:
begin { ... comandos iniciais ... } for i := 1 to 10 do begin if i = 8 then break; {... comandos A...} if i = 5 then continue; {... comandos B ...} end; {... comandos C ...} end;

// Salta para os [comandos C] // Retorna para o comando for pulando os [comandos B]

Blocos de Procedimentos ou Funções
As procedures ou funções são declaradas na seção de tipos de declarações (abaixo do comando type) pertencendo ao objeto ou serem do tipo public (públicas - executadas por outras unidades) ou private (particulares - restritas a unidade local).

Procedure
procedure {cabeçalho}; var {declaração das variáveis}; {bloco de comandos};

O cabeçalho da procedure é composto pelo nome do procedimento e variáveis que serão recebidas (ou modificadas através da declaração var, ex.: “procedure teste(var x:string);”).
procedure soma(a,b: integer); var c: integer; begin c := a + b; end; // Início enviando as variáveis A e B do tipo inteiro. // Declaração de variáveis locais a procedure // Corpo do procedimento.

Function
function {cabeçalho} : {resultado}; var {declaração das variáveis}; {bloco de comandos};

As funções se diferem dos procedimentos pela obrigatoriedade do retorno de um resultado, podendo este resultado ser retornado pela declaração: {nome da função} := valor ou result := valor.
function soma(a,b: integer) : integer; begin soma := a + b; end; // Início enviando as variáveis A e B do tipo inteiro. // Corpo do procedimento. // ou result := a + b;

☞ Importante - Junto com o Delphi vem o manual Object Pascal Reference em formato .HLP, caso a
PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 12/178

linguagem seja novidade para você aconselho que você dê uma boa olhada (o Delphi 1.0 traz o mesmo manual, mas em formato .PDF), mas não se preocupe com o que foi explicado acima já está mais do que suficiente para um bom entendimento com o Object Pascal. Tudo o que vimos acima é o que normalmente temos em outras linguagens comuns, mas o caracteriza realmente a linguagem Orientada em Objetos é o trabalho e a manipulação com os mesmos.

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 13/178

Manual dos Objetos
Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.com.br
Pré-Requisitos: Windows 98 Delphi 4.0 versão Client/Server Suite BDE 5.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: AlignEdit.ZIP Card.ZIP ChessBrd.ZIP Date97.ZIP DbCmpList.ZIP DgFiltro.ZIP DgPrint.ZIP EditN.ZIP Moon.ZIP myLabel3D.ZIP PGridStr.ZIP PosEstado.ZIP PrtGrid.ZIP SelectDlgT.ZIP Semelha.ZIP sGridSQL.ZIP Tips.ZIP

Prefácio
Desde o começo do meu tempo de Delphiano, tenho feito duas coisas, criar objetos e colecionar objetos (FREEWARE) de terceiros, melhorando-os e adaptando-os as minhas necessidades, uma boa coleção de objetos é importante em qualquer construção de um projeto em uma linguagem Orientada a Objetos, aqui estou disponibilizando mais do que objetos, estou também disponibilizando este manual que ensina como utilizá-los corretamente e usá-los para o desenvolvimento eficaz de qualquer projeto ou aplicativo.

Para Instalá-los no Delphi 4.0
Aconselho que você crie um outro diretório (além do LIB tradicional do Delphi) para conter seus "outros" objetos, não fique alterando o diretório padrão do Delphi, por uma simples razão, quando você quiser criar um backup com seus objetos basta você copiar este novo diretório então crie por exemplo c:\arquivos de programas\borland\delphi4\lib1 para guardar seus objetos e descompacte nele todos os arquivos mencionados no início da apostila. Todos os objetos que são instalados no Delphi 4.0 Client/Server precisam estar embutidos em um Package, isto facilita na hora de transportar os objetos de um Delphi instalado em uma máquina qualquer para outro em outra máquina, fora o controle dos mesmos, aqui colocarei por ordem na Componnent Pallete que os objetos serão instalados, antes de instalar qualquer objeto dê uma olhada se ele depende da instalação de outro primeiro, para iniciar vamos instalar o primeiro objeto, vá em Component | Install Component... e na página Into new Package e será mostrada a seguinte janela:

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 14/178

Unit file name - Corresponde ao nome do fonte que contém o objeto (localize o arquivo Posestad.PAS) Search path - Caminhos disponíveis dos diversos objetos Package file name - Nome do Pacote que será instalado seu objeto (localize o diretório Lib1 e coloque o nome Colecao.DPK) Package description - Uma descrição do pacote (Coleção com meus objetos por exemplo) Após preenchido os dados necessários e pressionado o botão de OK uma janela se abrirá questionando se você deseja compilar e instalar o novo objeto, responda negativamente para siguirmos em frente instalando os outros objetos, você acabará com esta janela:

Agora para incorporarmos um novo Objeto ao Package basta apenas clicarmos no botão Add e adicionarmos os fontes mencionados. Ao final de todo o processo de instalação compilaremos todos os objetos instalados através do botão Compile. Vamos começar então:

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 15/178

Objetos Instalados na Component Pallete em Additional
PosEstado Objetivo: Objeto derivado do TPanel que verifica e mostra o estado e o número de registros de um objeto do tipo BDE ligado a um DataSource Propriedades: DataSource: Nome do DataSource que está ligado o BDE Funções ou procedimentos necessários para execução: Procedimento Atualiza - faz a verificação do estado e do numero de registros do objeto ligado ao DataSource. Fonte que deve ser instalado no pacote Posestad.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

PGridStr Objetivo: Enviar para a impressora o conteúdo de um objeto StringGrid. Propriedades: LeftMargin: margem a esquerda TopMargin: margem entre o início da página e o começo da impressão RightMargin: margem a direita BottomMargin: margem a ser deixada no final da página ColHeaderFont: Fonte do cabeçalho ColScale: Escala de impressão (Ex: 100 % a 0 %) TitleFont: Fonte do Título LinesFont: Fonte das linhas detalhe StringGrid: Objeto StringGrid a imprimir PrintMgrTitle: Título Title: Cabeçalho TitleAlignment: Alinhamento do Cabeçalho Orientation: Tipo de orientação do papel PrintToFile: Se ao invés de imprimir gera um arquivo FullPage: Página toda PrintFileName: Nome do arquivo a gerar PrintFileDir: Diretório do arquivo a gerar FromPage: Inicia na página EndPage: Até a página Border: Deve imprimir linhas em volta ColLines: Deve imprimir linhas entre as colunas RowLines: Deve imprimir linhas entre as linhas detalhe HorizontalGap: Distância horizontal entre as linhas detalhes VerticalGapPct: Distância vertical entre as linhas detalhes PageNumberPos: Posição do número da página PageNumberLabel: Label para o número da página (Ex: Pág:) DatePos: Posição da data atual DateLabel: Label para a data atual (Ex: Data:) Funções ou procedimentos necessários para execução: Procedimento Print - Inicia o processo de impressão

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 16/178

Procedimento PrintDialog - Mostra uma janela de configuração da impressão Procedimento SaveToFile - Gera direto para um arquivo determinado Fonte que deve ser instalado no pacote PGridStr.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

AlignEdit -

(Original de José María Ferri - jmferri@hotmail.com)

Objetivo: Objeto derivado do TEdit que o melhora proporciando um alinhamento do texto a Direita, a Esquerda ou Centralizado e modificação das cores do objeto caso esteje ou não em foco Propriedades: Alignment: Tipo do Alinhamento ColorOnFocus: Cor do objeto quando tiver o foco ColorOnNoFocus: Cor do objeto quando não tiver o foco TextOnFocus: Cor do texto quando o objeto tiver o foco TextOnNoFocus: Cor do texto quando o objeto não tiver o foco ExitOnReturn: Se deve sair do objeto com o pressionamento da tecla Enter Funções ou procedimentos necessários para execução: Nenhuma Fonte que deve ser instalados no pacote AlignEdit.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

myLabel3D Objetivo: Descendente do objeto TLabel que o adiciona a capacidade de ficar em 3D, ganhando sombras ou em degradê Propriedades: AStyle3D : Estilo do objeto AShadeRightBottom: TColor read FShadowColor write SetShadowColor default clGray; AShadeLeftTop : Cor do degradê em visão 3D AHShadeOffSet : Distância horizontal da sombra AVShadeOffSet : Distância vertical da sombra AShadeLTSet : se o degradê deve ficar Branco ou assumir a cor da propriedade AShadeLeftTop Funções ou procedimentos necessários para execução: Nenhuma Fonte que deve ser instalados no pacote MyLabel.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

EditN -

(Original de José.Mª Gías - sigecom@bbvnet.es)

Objetivo: Descendente do objeto TLabel que o adiciona a capacidade de ficar em 3D, ganhando sombras ou em degradê

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 17/178

Propriedades: ColorOnFocus: Cor de fundo quando o Edit tem o Foco ColorOnNotFocus: Cor de fundo quando o Edit não tem o Foco EditType: etString, etInteger, etFloat. Considerando os dados que conterá o Edit EditAlign: etAlignRight, etAlignLeft, etAlignCenter, etAlignNone. EditLengthAlign: Tamanho que deve alinhar dentro do objeto ValueInteger: Valor Inteiro do Edit, quando EditType = etInteger ValueFloat: Valor Float do Edit, quando EditType = etFloat EditPrecision: Permite definir a quantidade de casas decimais. Si o valor é maior de 0, formatará o valor, completando com zeros. KeyByTab: Tecla que a ser trocada pela tecla TAB (#9) o Enter é #13 FirstCharUpper: Converte em maiusculas o primeiro caracter de uma cadeia se EditType = etString WidthOnFocus: Permite definir uma altura do Edit diferente quando tem o Foco. Funções ou procedimentos necessários para execução: Procedimento SetInteger - Pode ser colocado um valor para o objeto diretamente quando a propriedade EditType for etInteger. Por Exemplo: EditN10.SetInteger(63565); Procedimento SetFloat - Pode ser colocado um valor para o objeto diretamente quando a propriedade EditType for etFloat. Por Exemplo: EditN9.SetFloat(-63,56); Fonte que deve ser instalados no pacote EditNew.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

Objetos Instalados na Component Pallete em Dialogs
Semelha Objetivo: Objeto derivado do TComponent que pesquisa registro através de um determinado valor inicial de um campo dentro de um objeto do tipo tTable, mostrando em uma janela se caso o valor não exista na tabela se existe valores semelhantes aquele informado, ao final retorna uma variável do tipo boolean informando se encontrou ou não o registro procurado. Propriedades: aVersao: Contém o número da versão do objeto Tabela: em qual objeto será pesquisada CmpDig: Filtro: Caso a tabela esteja com o filtro ativo PosCampo: Posição (propriedade Index do TField) do campo a pesquisar dentro na tabela TipoSQL: Se será pesquisado em uma base Access ou Paradox (padrão Ansi-SQL) Funções ou procedimentos necessários para execução: Função Execute - inicia a procura e devolve True caso seja encontrado o registro ou False. Fontes que devem ser instalados no pacote Semelha.pas Fsemelh.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

SelectDlgT Objetivo: Objeto derivado do TComponent que verifica através de um complexo conjunto de pesquisa determinado registro dentro de um objeto do tipo tTable, ao final retorna uma variável do tipo boolean informando se encontrou ou não o registro procurado.

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 18/178

Propriedades: aVersao: Contém o número da versão do objeto Tabela: em qual objeto será pesquisada NomeTela: o valor do Caption da janela de pesquisa, se nada for informado por default será: Procure pelo registro desejado... Filtro: Caso a tabela esteja com algum filtro TipoSQL: Tipo do SQL a utilizar se será utilizado em uma base Access ou Paradox (padrão Ansi-SQL) Funções ou procedimentos necessários para execução: Função Execute - inicia a janela e devolve True caso seja encontrado o registro ou False. Fontes que devem ser instalados no pacote SelecaoT.pas fSelectT.pas Objetos ao qual depende que sejam instalados primeiramente PosEstad Semelha

Tips Objetivo: Mostrar uma janela do tipo Dicas do Windows Propriedades mais importantes: AppName: nome da aplicação SaveShowAtStart: Se deve salvar para mostrar ou não SaveKey : String read FSaveKey write FSaveKey; Language: Linguagem do objeto (Português, Inglês ou Alemão) TipBackground: Cor de Fundo Header: Cabeçalho Title: Título TipHelp: Título da Dica ShowAtStart: Se deve mostrar ou não na próxima vez Tips: Dicas a serem mostradas, uma dica por linha, será escolhida por processo randômico TipsCount: Total de dicas Funções ou procedimentos necessários para execução: Procedimento Execute: Mostra a dica Fonte que deve ser instalados no pacote Tips.pas FormTips.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

dgPrint Objetivo: Auxilia o trato com o objeto PrtGrid mostrando uma janela prévia para a escolha das opções Propriedades: aVersao: Contém o número da versão do objeto Tabela: em qual objeto será pesquisada NomeTela: o valor do Caption da janela de pesquisa, se nada for informado por default será: Procure pelo

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 19/178

registro desejado... NomeRel: Título do relatório Filtro: Caso a tabela esteja com algum filtro Funções ou procedimentos necessários para execução: Procedimento Print - Inicia o processo de impressão Procedimento PrintDialog - Mostra uma janela de configuração da impressão Procedimento SaveToFile - Gera direto para um arquivo determinado Fontes que devem ser instalado no pacote fPrtGrid.pas dgPrint.pas Objeto ao qual depende que seja instalado primeiramente PosEstad PrintGrid

dgFiltro Objetivo: Permite que o usuário defina e configure a opção Filter do objeto tTable, pode ainda ser utilizado para criar cláusulas Where de comandos SQL. Propriedades: aVersao: Contém o número da versão do objeto Tabela: em qual objeto será pesquisada NomeTela: o valor do Caption da janela de pesquisa, se nada for informado por default será: Define um filtro para os Dados FiltroVe: Filtro na linguagem que o usuário entenda FiltroSQL: Filtro pronto para ser colocado na propriedade Filter TipoSQL: Tipo do SQL a utilizar se será utilizado em uma base Access ou Paradox (padrão Ansi-SQL) Funções ou procedimentos necessários para execução: Procedimento Execute - Inicia a janela e devolve True caso seja concluído o filtro ou False. Fontes que devem ser instalado no pacote fFiltro.pas dgFiltro.pas Objeto ao qual depende que seja instalado primeiramente Nenhum

Objetos Instalados na Component Pallete em Data Controls
GridSQL Objetivo: Ajuntar um objeto DBGrid a um objeto tQuery para mostrar o resultado de um SQL Propriedades: aVersao: Contém o número da versão do objeto CodSQL: SQL para o tQuery DatabaseName: Nome do DataBaseName LabPesq: Caption do Label que aparece acima do DBGrid servindo de rótulo LigaDes: Ativa e desativa a tQuery OpcaoGrid: Opções do DBGrid OpcaoGridCol: Opções das colunas do DBGrid

PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br - Página Nr. 20/178

Propriedades: LeftMargin: margem a esquerda LeftMargin: margem a esquerda TopMargin: margem entre o início da página e o começo da impressão RightMargin: margem a direita BottomMargin: margem a ser deixada no final da página ColHeaderFont: Fonte do cabeçalho ColScale: Escala de impressão (Ex: 100 % a 0 %) TitleFont: Fonte do Título LinesFont: Fonte das linhas detalhe DBGrid: Objeto StringGrid a imprimir PrintMgrTitle: Título Title: Cabeçalho TitleAlignment: Alinhamento do Cabeçalho Orientation: Tipo de orientação do papel PrintToFile: Se ao invés de imprimir gera um arquivo FullPage: Página toda PrintFileName: Nome do arquivo a gerar PrintFileDir: Diretório do arquivo a gerar FromPage: Inicia na página EndPage: Até a página Border: Deve imprimir linhas em volta ColLines: Deve imprimir linhas entre as colunas RowLines: Deve imprimir linhas entre as linhas detalhe HorizontalGap: Distância horizontal entre as linhas detalhes VerticalGapPct: Distância vertical entre as linhas detalhes PageNumberPos: Posição do número da página PageNumberLabel: Label para o número da página (Ex: Pág:) DatePos: Posição da data atual DateLabel: Label para a data atual (Ex: Data:) Funções ou procedimentos necessários para execução: Procedimento Print .br .Gera direto para um arquivo determinado Fonte que deve ser instalado no pacote PrtGrid.pas Objeto ao qual depende que seja instalado primeiramente Nenhum PrtGrid - (Original de Paul Rice) Objetivo: Enviar para a impressora o conteúdo de um objeto DbGrid.Funções ou procedimentos necessários para execução: Nenhum Fonte que deve ser instalado no pacote sGridSQL.Página Nr.com. 21/178 .pas Objeto ao qual depende que seja instalado primeiramente Nenhum PDF criado por: Idelson Pessoa da Silva – idelson@bol.Mostra uma janela de configuração da impressão Procedimento SaveToFile .Inicia o processo de impressão Procedimento PrintDialog .

br . Secundária) COD_CARGO SIG_CARGO DES_CARGO Propriedades: aVersao: Contém o número da versão do objeto CapLocaliza: Caption a ser usado no botão de localiza DataField: Nome do campo a inserir (No exemplo: CD_CARGO) DataSource: Nome do DataSource dono do DataField (No exemplo: dsFuncionário) TbSecundaria: Nome da Tabela Secundária a pesquisar (No exemplo: tbCargo) CriticaEd: Se deve ou não criticar o modo de Edição para a utilização do botão Localiza GlyphLoc: Glyph para o botão de localiza (No exemplo: Localize o BMP que mais lhe agradar) MensagemCodigo: Uma mensagem caso não encontre o campo código (No exemplo: Código do Cargo não cadastrado) MensagemSigla: Uma mensagem caso não encontre o campo sigla (No exemplo: Sigla do Cargo não cadastrada) MensagemDescricao: Uma mensagem caso não encontre o campo descrição (No exemplo: Cargo não cadastrado) NumGlyphsLoc: Número de Glyphs da imagem do botão de localiza PosCmpCodigoSec: Posição em FIELD.. em funcionário se cadastra o órgão ao qual o funcionário trabalha. { .INDEX do campo Descrição (No exemplo: 2) PosCmpSigla: Posição em FIELD.INDEX do campo Código (No exemplo: 0) PosCmpDescricao: Posição em FIELD.INDEX do campo Sigla (No exemplo: 1) TamEdtCodigo: Tamanho do Edit do campo Código TamEdtDescricao: Tamanho do Edit do campo Descrição TamEdtSigla: Tamanho do Edit do campo Sigla PosEdtCodigo: Posição a esquerda do campo Código PosEdtDescricao: Posição a esquerda do campo Descrição PosEdtSigla: Posição a esquerda do campo Sigla TopEdtCodigo: Posição do topo do campo Código TopEdtDescricao: Posição do topo do campo Descrição TopEdtSigla: Posição do topo do campo Sigla HintButLoc: Hint para o botão de Localiza (No exemplo: Localiza determinado Cargo) UsaLocaliza: Se vai ou não usar o botão de Localiza UsaDescricao: Se vai ou não usar o campo Descrição UsaSigla: Se vai ou não usar o campo Sigla Filtro: Caso a tabela esteja com algum filtro TipoSQL: Tipo do SQL a utilizar se será utilizado em uma base Access ou Paradox (padrão Ansi-SQL) Evento OnMudaFiltro: Se ocorrer alguma mudança no Filtro Funções ou procedimentos necessários para execução: ATENÇÃO ..Em programa as tabelas Secundárias devem ser abertas primeiras que a tabela Principal e para fechar proceda de forma contrária. } tbFuncionario. tbFuncionario. Ou Seja: tbCargo.pas PDF criado por: Idelson Pessoa da Silva – idelson@bol. conforme a seguinte estrutura: tbFuncionario (Tab. por exemplo.Open.com.Close. tbCargo. Fonte que deve ser instalado no pacote CmpTerc. veja nas propriedades o exemplo detalhado.Open. 22/178 . Primária) COD_FUNCIONARIO COD_CARGO { Outros Campos } tbCargo (Tab. este órgão será cadastrado utilizando este objeto.DBCmpList Objetivo: Substituir o DBLookupCombo quando em pesquisa em tabelas secundárias.Close.Página Nr.

23/178 .pas Objeto ao qual depende que seja instalado primeiramente Nenhum PDF criado por: Idelson Pessoa da Silva – idelson@bol. Hora e a Fase da Lua de devolve a data da próxima fase Função current_phase: recebe uma Data. Sobotka . J.Página Nr. Hora e a Fase da Lua de devolve a data da última fase Função next_phase: recebe uma Data.elvis@sway.pas Objeto ao qual depende que seja instalado primeiramente Nenhum Moon - (Original de Andreas Hörstemeier) Objetivo: Objeto derivado do TImage que através de um algorítmo astronômico calcula vários dados sobre a lua e o sol.Objeto ao qual depende que seja instalado primeiramente SelecaoT Semelha Objetos Instalados na Component Pallete em Jogos Card (Original de T.com.com) Objetivo: Objeto para produção de jogos de cartas Propriedades: Card: Utilizado para selecionar uma determinada carta SelectedCard: Determina se a carta vai ter aparência de selecionada ou não ShowCard: Determina o lado da carta Suit: Determina qual o Nipe da carta Funções ou procedimentos necessários para execução: Nenhuma Fonte que deve ser instalado no pacote Cards. Hora e devolve a Fase da Lua Função lunation: recebe uma Data e Hora e devolve a lunação da lua Função sun_diameter: recebe uma Data e Hora e devolve o diâmetro do Sol Função moon_diameter: recebe uma Data e Hora e devolve o diâmetro da Lua Função QLua: recebe uma Data e Hora e devolve a fase da lua em String Fonte que deve ser instalado no pacote Moon. ideal para sistemas exotéricos e agendas Propriedades: Date: Data e Hora para o cálculo MoonSize: Tamanho do Display Funções ou procedimentos necessários para execução: Função Julian_date: recebe uma Data e Hora e devolve a Data Juliana Função Sun_distance: recebe uma Data e Hora e devolve a distância da Terra ao Sol Função Moon_distance: recebe uma Data e Hora e devolve a distância da Terra à Lua Função Age_of_moon: recebe uma Data e Hora e devolve a idade da Lua Função function last_phase: recebe uma Data.br .

pas dtEdit97.pas dtFunc97.pas dtReg97.pas dtMisc97.pas dtPop97.bourmad@mygale.Todos estes objetos são originais de BOURMAD Mehdi .br .org e contém os seguintes objetos: Calendar97 .com. DateFromTo97 Objetivo: Função principal de todos é controlar variáveis e campos do tipo TDateTime.pas UBitMap. DbCalendar97 .pas Objeto ao qual depende que seja instalado primeiramente Nenhum PDF criado por: Idelson Pessoa da Silva – idelson@bol.pas dtEdDB97.pas dtProp97.pas dtCal97. DbDateEdit97 . 24/178 .Página Nr.Último movimento ambas do tipo inteiras Fonte que deve ser instalado no pacote ChessBrd. DateEdit97 . Propriedades mais importantes: AnimateMoves: Movimentos devem ser animados AnimateDelay: Se deve haver um tempo para a animação BoardLines: Linhas entre as casas e as bordas BoardBitmap: Imagem para da Borda BoardColor: Cor da Borda ComputerPlaysBack: Computador joga com as pretas ComputerPlaysWhite: Computador joga com as brancas Position: Posição de todas as peças no tabuleiro Funções ou procedimentos necessários para execução: Procedimento NewGame: Inicializa um novo jogo Procedimento UpdateChessBoard: Recebe a posição do tabuleiro Variáveis FirstMove .Primeiro Movimento e LastMove .pas Objeto ao qual depende que seja instalado primeiramente Nenhum Objetos Instalados na Component Pallete em Freeware Coleção Date97. ideal para ser colocado no sobre do sistema como opção para o usuário.ChessBrd - (Original de Daniel Terhell) Objetivo: Jogar uma partida de Xadrez em um dos objetos mais incríveis que já vi. facilitando o manuseamento das mesmas Fonte que deve ser instalado no pacote dtCabDb97.pas dtEdFt97.

este tipo de SQL para este banco não é totalmente compatível com o SQL Padrão ANSI... Você usa o predicado para restringir o número de registros que retornam. ] [HAVING. Os nomes dos campos dos quais os dados serão recuperados.. ] [WITH OWNERACCESS OPTION] A instrução SELECT tem as partes abaixo: Parte predicado * tabela campo1.br .Página Nr.]campo2 [AS alias2] [. ] [ORDER BY. O Nome do banco de dados que contém as tabelas em expressãotabela se não PDF criado por: Idelson Pessoa da Silva – idelson@bol.. ] [GROUP BY. Os nomes que serão usados como títulos de colunas em vez dos nomes originais das colunas na tabela...]campo1 [AS alias1] [. [tabela.* | [tabela. alias2 expressãotabela bancodedadosexterno Descrição Um dos seguintes predicados: ALL..]]} FROM expressãotabela [. eles serão recuperados na ordem listada. Especifica que todos os campos da tabela ou tabelas especificadas são selecionados. o padrão será ALL. O nome da tabela que contém os campos dos quais os registros são selecionados...com.br Pré-Requisitos: Windows 98 Delphi 4. campo2 incluir alias1.] [IN bancodedadosexterno] [WHERE.. Se nenhum for especificado. DISTINCTROW ou TOP. Se você mais de um campo. que é o oficial na maioria dos bancos de dados.. O nome da tabela ou tabelas contendo os dados que você quer recuperar. Instrução SELECT Instrui o programa principal do banco de dados para retornar a informação como um conjunto de registros. Sintaxe SELECT [predicado { * | tabela. 25/178 .. .0 versão Client/Server Suite BDE 5. .com.Principais Instruções em SQL Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. então algumas cláusulas podem não funcionar em outros gerenciadores de bancos de dados.00 MS-Access 97 Prefácio Esta apostila foi desenvolvida com o auxílio on-Line do banco MS-ACCESS. DISTINCT.

SELECT é normalmente a primeira palavra em uma instrução SQL. inclua pelo menos uma função SQL. Todos os campos na lista de campos SELECT devem ser incluídos na cláusula GROUP BY ou incluídos como argumentos em uma função aggregate SQL. Ao criar um objeto Recordset.estiver no banco de dados atual. O exemplo abaixo usa o título Contagem para nomear o objeto Field retornado no objeto Recordset resultante: SELECT COUNT(FuncionárioID) AS Contagem FROM Funcionários. você precisará usar a cláusula AS para fornecer um nome alternativo para o objeto Field. os valores Null não são avaliados em qualquer função aggregate SQL. A instrução SELECT não muda os dados no banco de dados. Valores de resumo são omitidos se não houver qualquer função aggregate SQL na instrução SELECT.Departamento. o programa principal de banco de dados do Jet usa o nome do campo da tabela como o nome do objeto Field no objeto Recordset. Comentários Para executar esta operação.br . O exemplo abaixo seleciona todos os campos na tabela Funcionários: SELECT * FROM Funcionários. PDF criado por: Idelson Pessoa da Silva – idelson@bol. A maior parte das instruções SQL são instruções SELECT. um campo na lista de campos GROUP BY pode fazer referência a qualquer campo em qualquer tabela listada na cláusula FROM. Você pode usar outras cláusulas na instrução SELECT para restringir e organizar posteriormente os seus dados retornados.Departamento = Supervisores. fornecida a instrução SELECT.Página Nr. A não ser que contenha dados Memo ou OLE Object. seleciona as linhas que satisfazem o critério e classifica ou agrupa as linhas resultantes na ordem especificada.Departamento. (ponto). preceda-o com o nome da tabela e o operador . No entanto. Mesmo que o campo não esteja incluído na instrução SELECT. A instrução SQL seleciona Departamento da tabela Funcionários e NomeSupv da tabela Supervisores: SELECT Funcionários. use a palavra reservada AS. Se o nome de um campo estiver incluído em mais de uma tabela na cláusula FROM. o campo Departamento está nas tabelas Funcionários e Supervisores. Sempre que você usar funções aggregate ou consultas que retornem nomes de objetos Field ambíguos ou duplicados.com. Os valores Null nos campos GROUP BY são agrupados e não omitidos. Se você quiser um nome de campo diferente ou um nome que não esteja implícito na expressão usada para gerar o campo. O exemplo abaixo usa o título Nasc para nomear o objeto Field retornado no objeto Recordset resultante: SELECT DataNasc AS Nasc FROM Funcionários. o programa principal de banco de dados procura a tabela ou tabelas especificadas. extrai as colunas escolhidas. A sintaxe mínima da instrução SELECT é: SELECT campos FROM tabela Você pode usar um asterisco (*) para selecionar todos os campos na tabela. O programa principal de banco de dados do Jet não pode agrupar campos Memo ou OLE Objects. 26/178 . Use a cláusula WHERE para excluir linhas que você não quer agrupadas e use a cláusula HAVING para filtrar os registros após eles terem sido agrupados. No exemplo abaixo. Supervisores.NomeSupv FROM Funcionários INNER JOIN Supervisores WHERE Funcionários. Cláusula GROUP BY GROUP BY é opcional.

cláusula FROM Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela "Funcionários". um usuário for impedido de criar ou anexar a uma tabela. Cláusula WITH OWNERACCESS OPTION A declaração WITH OWNERACCESS OPTION é opcional. SELECT Sobrenome. Nome FROM Funcionários Esse exemplo seleciona todos os campos da tabela "Funcionários". Esta opção exige que você tenha acesso ao arquivo System. Uma cláusula HAVING pode conter até 40 expressões vinculadas por operadores lógicos. O padrão ordem de classificação é ascendente (A a Z. Os registros são classificados primeiro pelo primeiro campo listado depois de ORDER BY. como And ou Or. um erro ocorrerá. O programa principal de banco de dados do Jet não classifica campos deste tipo. 9 a 0). Os registros que tiverem valores iguais naquele campo são classificados pelo valor no segundo campo listado e assim por diante. Você pode incluir campos adicionais na cláusula ORDER BY. HAVING determina quais registros são exibidos: SELECT CategoriaID. SELECT Sobrenome.Cláusula HAVING HAVING é opcional. adicione a palavra reservada DESC ao final de cada campo que você quiser classificar em ordem descendente. Nome FROM Funcionários ORDER BY Sobrenome. SELECT Sobrenome. Salário FROM Funcionários ORDER BY Salário DESC. Exemplo da instrução SELECT. por outro lado. Para classificar em ordem descendente (Z a A. HAVING é semelhante a WHERE. Sum(UnidadesNoEstoque) FROM Produtos GROUP BY CategoriaID HAVING Sum(UnidadesNoEstoque) > 100 AND LIKE "BOS*". Entretanto. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 0 a 9). O exemplo abaixo seleciona salários e os classifica em ordem descendente SELECT Sobrenome. Se você quiser reforçar as configurações de segurança do grupo de trabalho e as permissões dos usuários. que determina quais registros são selecionados. É realmente útil em implementações de multiusuários seguras. se você quiser exibir seus dados na ordem classificada. Salário FROM Funcionários ORDER BY Sobrenome WITH OWNERACCESS OPTION. Os dois exemplos abaixo classificam os nomes dos funcionários pelo sobrenome. você poderá usar WITH OWNERACCESS OPTION para habilitá-lo a executar uma consulta construção de tabela ou consulta anexação. Depois que os registros são agrupados com GROUP BY. Se você especificar um campo que contém dados Memo ou OLE Objects na cláusula ORDER BY. ORDER BY é normalmente o último item em uma instrução SQL.br .com. Nome FROM Funcionários ORDER BY Sobrenome ASC. você deve utilizar ORDER BY.Página Nr. Cláusula ORDER BY ORDER BY é opcional. O exemplo abaixo habilita o usuário a ver as informações de salário (mesmo que não tenha outra permissão para ver a tabela Folha de Pagamentos) desde que o proprietário da consulta tenha tal permissão: SELECT Sobrenome. 27/178 . Nome.mda associado ao banco de dados. Se. não inclua a declaração WITH OWNERACCESS OPTION. Sobrenome.

Não altera o valor original dos salários. 'tem um salário de'. Avg(Salário) AS [Salário Médio]. SELECT Título. Esse exemplo seleciona os departamentos que tenham mais de 100 funcionários. mostra Sobrenome e Salário no primeiro e último campos. Salário FROM Funcionários. Sum(Unidades) AS Tbc FROM ItensEmEstoque GROUP BY Item. Count([Departamento]) FROM Funcionários GROUP BY Departamento HAVING Count(Departamento) > 100.Página Nr. Esse exemplo coloca o título Nome no topo da coluna "Sobrenome". 28/178 . Esse exemplo mostra qual seria o salário se cada funcionário recebesse um aumento de 10 porcento.* FROM Funcionários. SELECT Departamento. Cor. A seqüência de caracteres "tem um salário de" é retornada como o campo do meio de cada registro. Count(Título) FROM Funcionários WHERE Departamento = 'Produção' GROUP BY Título HAVING Count(Título) > 50. SELECT Count(*) AS [Total de Funcionários]. Salário * 1. Salário FROM Funcionários.SELECT Funcionários. Count([Departamento]) AS Tbc FROM Funcionários GROUP BY Departamento. SELECT Título.br . SELECT Count(CódigoPostal) AS Tcp FROM Clientes. Para cada registro. Max(Salário) AS [Salário Máximo] FROM Funcionários. calcula o número de funcionários do departamento de Vendas que têm este título. SELECT Sobrenome. SELECT Sobrenome. SELECT Item.1 AS Proposto FROM Funcionários. Esse exemplo mostra o número de funcionários e os salários médio e máximo. O título Salário é exibido no topo da coluna "Salário". Para cada título de função único. Exemplo de cláusula GROUP BY Esse exemplo cria uma lista de nomes de departamentos únicos e o número de funcionários em cada um destes departamentos. Esse exemplo conta o número de registros que têm uma entrada no campo "CódigoPostal" e nomeia o campo retornado como "Tcp". Exemplo de cláusula HAVING Esse exemplo seleciona os títulos de cargos do departamento de Produção atribuídos a mais de 50 funcionários.com. SELECT Departamento. Salário AS Atual. Exemplo de cláusula ORDER BY PDF criado por: Idelson Pessoa da Silva – idelson@bol. Esse exemplo calcula o número de itens em estoque para cada combinação de número e cor do item. SELECT Sobrenome AS Nome. Count(Título) AS Tbc FROM Funcionários WHERE Departamento = 'Vendas' GROUP BY Título.

]])] SELECT [origem. Para uma descrição do caminho. . se estiverem após um argumento destino ou os nomes dos campos dos quais se deve obter os dados..Página Nr. O caminho para um banco de dados externo. LEFT JOIN ou RIGHT JOIN ou de uma consulta gravada. Sintaxe Consulta anexação de vários registros: INSERT INTO destino [IN bancodedadosexterno] [(campo1[. Os nomes dos campos aos quais os dados devem ser anexados. em ordem descendente (Z-A). SELECT CategoriaID. SELECT Sobrenome. campo2 expressãodetabela Descrição O nome da tabela ou consulta em que os registros devem ser anexados. 29/178 . Cada valor é inserido no campo que corresponde à posição do valor na lista: Valor1 é inserido no campo1 do novo registro.br .. Esse exemplo ordena..As instruções SQL mostradas abaixo usam a cláusula ORDER BY para classificar os registros em ordem alfabética e depois por categoria. O nome da tabela ou consulta de onde os dados devem ser copiados. valor1.. PreçoUnit FROM Produtos ORDER BY CategoriaID. NomeProduto. por categoria ID e depois por nome do produto.. . campo2[.]campo1[. consulte a cláusula IN. Isto é referido como consulta anexação. Este argumento pode ser um único nome de tabela ou uma combinação resultante de uma operação INNER JOIN.]) A instrução INSERT INTO tem as partes abaixo: Parte destino bancodedadosexterno origem campo1. ProdutoNome. campo2[. .. valor2[.]])] VALUES (valor1[.. O nome da tabela ou tabelas das quais registros são inseridos. Esse exemplo ordena os registros pelo sobrenome. Os valores para inserir em campos específicos do novo registro.com. primeiro.. valor2 no campo2 e assim por diante. Você deve separar os valores com uma vírgula e colocar os campos de textos entre aspas (" "). campo2[. Instrução INSERT INTO Adiciona um ou vários registros a uma tabela. se estiverem após um argumento origem.] FROM expressãodetabela Consulta anexação de um único registro: INSERT INTO destino [(campo1[. Nome FROM Funcionários ORDER BY Sobrenome DESC. . valor2 PDF criado por: Idelson Pessoa da Silva – idelson@bol.

Se você omitir a lista de campo. não Null ao campo ou campos da chave primária. precede a instrução SELECT. Esse exemplo cria um novo registro na tabela "Funcionários" INSERT INTO Funcionários (Nome. "Pereira". Para achar quais registros serão anexados. FROM como é mostrado acima na sintaxe consulta anexação de vários registros. você deve acrescentar valores únicos.30. Esse exemplo seleciona todos os estagiários de uma tabela hipotética "Estagiários" que foram contratados há mais de 30 dias e adiciona seus registros à tabela "Funcionários". Se você anexar registros a uma tabela com um campo Counter e quiser numerar novamente os registros anexados. As tabelas que contêm os registros que você anexa não são afetadas pela operação de consulta anexação. "Estagiário"). Neste caso. não inclua o campo Counter em sua consulta.. o valor padrão ou Null é inserido nas colunas omitidas. Se sua tabela de destino contém uma chave primária. Exemplo de instrução INSERT INTO Esse exemplo seleciona todos os registros de uma tabela hipotética "Novos Clientes" e os adiciona à tabela "Clientes" (quando não são designadas colunas individuais. INSERT INTO Funcionários SELECT Estagiários.* FROM Estagiários WHERE DataContrato < Now() . Use uma instrução adicional INSERT INTO com uma cláusula VALUES para cada registro adicional que você quiser criar. seu código especifica o nome e o valor de cada campo do registro.Comentários Você pode usar a instrução INSERT INTO para adicionar um único registro a uma tabela usando a sintaxe de consulta anexação de um único registro como mostrado acima. Inclua o campo Counter na consulta se quiser manter os valores originais do campo. caso contrário. Quando você não especifica cada campo. Os registros são adicionados no final da tabela. INSERT INTO é opcional. o programa principal de banco de dados do Microsoft anexa a qualquer e a todas as tabelas especificadas pela consulta. Neste caso. Em lugar de acrescentar registros existentes de outra tabela. antes de você executar a consulta anexação. 30/178 .* FROM [Novos Clientes]. o programa principal de banco de dados do Jet não anexará os registros.br . PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. a cláusula SELECT especifica os campos para acrescentar à tabela destino especificada. Você precisa especificar cada um dos campos do registro para os quais um valor deve ser designado e um valor para este campo. INSERT INTO Clientes SELECT [Novos Clientes].. primeiro execute e veja os resultados de uma consulta seleção que use o mesmo critério de seleção. Use a cláusula IN para anexar registros a uma tabela de outro banco de dados. a cláusula VALUES deve incluir um valor para cada campo na tabela.Sobrenome. você pode especificar o valor de cada campo em um único registro novo usando a cláusula VALUES. Uma operação de consulta anexação copia os registros de uma ou mais tabelas em outra.Página Nr. Se uma consulta for especificada. A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. um erro ocorrerá em INSERT. mas quando incluída. Título) VALUES ("André". Você também pode usar INSERT INTO para anexar um conjunto de registros de outra tabela ou consulta usando a cláusula SELECT . Caso contrário. os nomes das colunas das tabelas SELECT devem corresponder exatamente aos da tabela INSERT INTO).

com.FornecedorID SET PreçoUnit = PreçoUnit * . 31/178 . Uma expressão que determina o valor a ser inserido em um campo específico nos registros atualizados.br . As tabelas "Produtos" e "Fornecedores" têm uma relação um para vários. UPDATE Funcionários SET RelatórioPara = 5 WHERE RelatórioPara = 2.95 WHERE NomeEmpresa = 'Tokyo Traders' AND Suspenso = No. UPDATE não gera um conjunto de resultados. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Uma expressão que determina quais registros devem ser atualizados. UPDATE Fornecedores INNER JOIN Produtos ON Fornecedores. Sintaxe UPDATE tabela SET valornovo WHERE critério. Esse exemplo aumenta o "PreçoUnit" de todos os produtos não suspensos do fornecedor 8 em 10 porcento. Comentários UPDATE é especialmente útil quando você quer alterar muitos registros ou quando os registros que você quer alterar estão em várias tabelas. UPDATE Produtos SET PreçoUnit = PreçoUnit * 1.1 WHERE FornecedorID = 8 AND Suspenso = No. Frete = Frete * 1.Página Nr. Exemplo de instrução UPDATE Esse exemplo muda os valores no campo "RelatórioPara" para 5 para todos os registros de funcionários que atualmente têm valores de RelatórioPara de 2.Declaração UPDATE Cria uma consulta atualização que altera os valores dos campos em uma tabela especificada com base em critérios específicos. examine primeiro os resultados da consulta seleção que use os mesmos critérios e então execute a consulta atualização. Esse exemplo reduz o PreçoUnit de todos os produtos não suspensos fornecidos pela Tokyo Traders em 5 porcento.03 WHERE PaísEmbarque = 'RU'. Se você quiser saber quais resultados serão alterados. Você pode alterar vários campos ao mesmo tempo.FornecedorID = Produtos. O exemplo abaixo aumenta o Valor do Pedido em 10 por cento e o valor do Frete em 3 por cento para embarques do Reino Unido: UPDATE Pedidos SET ValorPedido = ValorPedido * 1. A instrução UPDATE tem as partes abaixo: Parte tabela valornovo critério Descrição O nome da tabela cujos os dados você quer modificar. Só os registros que satisfazem a expressão são atualizados.1.

primeiro examine os resultados de uma consulta seleção que use o mesmo critério e então. Se você quiser excluir valores de um campo específico. poderá recuperá-los a partir dos seus backups. DELETE *FROM Funcionários WHERE Título = 'Estagiário'.* tabela critério Comentários DELETE é especialmente útil quando você quer excluir muitos registros.Instrução DELETE Cria uma consulta exclusão que remove registros de uma ou mais tabelas listadas na cláusula FROM que satisfaz a cláusula WHERE. quando você usa DELETE. O nome da tabela da qual os registros são excluídos. se você eliminar a tabela.br . Por exemplo.Página Nr. Para eliminar uma tabela inteira do banco de dados. Excluir um registro em Clientes faz com que os registros correspondentes em Pedidos sejam excluídos se a opção de exclusão em cascata for especificada. Sintaxe DELETE [tabela. apenas os dados são excluídos. Descrição O nome opcional da tabela da qual os registros são excluídos.com. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Se você excluir os registros errados. você não poderá desfazer a operação. Importante Após remover os registros usando uma consulta exclusão. Se quiser saber quais arquivos foram excluídos. a estrutura é perdida. como atributos de campo e índices. Você pode usar DELETE para remover registros de tabelas que estão em uma relação um por vários com outras tabelas. 32/178 . crie uma consulta atualização que mude os valores para Null. Por outro lado. nas relações entre as tabelas Clientes e Pedidos. A estrutura da tabela e todas as propriedades da tabela. Quando a cláusula FROM inclui apenas uma tabela. Operações de exclusão em cascata fazem com que os registros das tabelas que estão no lado "vários" da relação sejam excluídos quando os registros correspondentes do lado "um" da relação são excluídos na consulta. Exemplo de instrução DELETE Esse exemplo exclui todos os registros de funcionários cujo título seja Estagiário. você pode usar o método Execute com uma instrução DROP. As tabelas "Funcionários" e "FolhadePagamento" têm uma relação um por um.*] FROM tabela WHERE critério A instrução DELETE tem as partes abaixo: Parte tabela. Uma expressão que determina qual registro deve ser excluído. permanecem intactos. a tabela Clientes está do lado "um" e a tabela Pedidos está no lado "vários" da relação. não é necessário indicar o nome da tabela na instrução DELETE. Uma consulta de exclusão exclui registros inteiros e não apenas dados em campos específicos. Esse exemplo exclui todos os registros de funcionários cujo título seja Estagiário e que também tenham um registro na tabela "FolhadePagamento". Mantenha os backups de seus dados. execute a consulta exclusão. Entretanto.

Isto é muito mais restritivo. para recuperar registros na consulta principal que satisfaçam a comparação com quaisquer registros recuperados na subconsulta. Uma expressão para a qual o resultado definido da subconsulta é procurado. Ela deve estar entre parênteses. O exemplo abaixo retorna todos os produtos com um desconto de 25 por cento ou mais: SELECT * FROM Produtos WHERE ProdutoID IN (SELECT ProdutoID FROM PedidoDetalhes WHERE Desconto >= . você usa uma instrução SELECT para fornecer um conjunto de um ou mais valores específicos para avaliar as expressões das cláusulas WHERE ou HAVING. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Em uma subconsulta. O exemplo abaixo retorna todos os produtos cujo preço unitário é maior que o preço de qualquer produto vendido com um desconto de 25 por cento ou mais: SELECT * FROM Produtos WHERE PreçoUnit > ANY (SELECT PreçoUnit FROM PedidoDetalhes WHERE Desconto >= .25).FuncionárioID = FolhadePagamento. DELETE ou UPDATE ou dentro de uma outra subconsulta.Página Nr. Use o predicado ALL para recuperar apenas os registros na consulta principal que satisfaçam a comparação com todos os registros recuperados na subconsulta. Se você mudou ANY para ALL no exemplo acima.25). Use o predicado IN para recuperar apenas os registros na consulta principal para os quais alguns registros na subconsulta contêm um valor igual.* FROM Funcionários INNER JOIN FolhaDePagamento ON Funcionários.br . Comentários Você pode usar uma subconsulta em vez de uma expressão na lista de campo de uma instrução SELECT ou em uma cláusula WHERE ou HAVING. Use o predicado ANY ou SOME. Subconsultas SQL Uma subconsulta é uma instrução SELECT aninhada dentro de uma instrução SELECT. a consulta retornaria apenas os produtos cujo preço unitário fosse maior que o de todos os produtos vendidos com um desconto de 25 por cento ou mais.Título = 'Estagiário'.com.FuncionárioID WHERE Funcionários. que são sinônimos.DELETE Funcionários. INSERT. Uma instrução SELECT de acordo com as mesmas regras e formato de qualquer outra instrução SELECT. Sintaxe Você pode usar três formas de sintaxe para criar uma subconsulta: comparação [ANY | ALL | SOME] (instruçãosql) expressão [NOT] IN (instruçãosql) [NOT] EXISTS (instruçãosql) Uma subconsulta tem as partes abaixo: Parte comparação expressão instruçãosqlt Descrição Uma expressão e um operador de comparação que compara a expressão com o resultado da subconsulta. 33/178 .

Título = T1. UPDATE servico SET efetuado = 2 WHERE numero_servico = ANY (SELECT servico.Título = Funcionários. Esse exemplo lista o nome e preço unitário de todos os produtos cujo preço unitário seja igual ao do Licor de Cacau. Título. Nome. O exemplo abaixo retorna os nomes dos funcionários cujos salários sejam iguais ou superiores à média de salários de todos os funcionários na mesma função.numero_servico).FuncionárioID).De maneira contrária. SELECT Nome. Salário FROM Funcionários T1 WHERE Salário >= (SELECT AVG(Salário) FROM Funcionários WHERE Funcionários.numero_servico ORDER BY servico. SELECT Sobrenome. No exemplo acima. Sobrenome FROM Funcionários AS E WHERE EXISTS (SELECT * FROM Pedidos AS O WHERE O.Título) Order by Title. 34/178 . Nome.parecer_tecnico) Is Not Null)) GROUP BY servico. Altera o campo Efetuado do arquivo de serviços para 2 caso o mesmo tenha parecer técnico da entidade encaminhanhamento diferente de nulo. Exemplos de subconsultas SQL Esse exemplo lista o nome.numero_servico FROM servico INNER JOIN encaminhamento ON (servico. Salário FROM Funcionários AS T1 WHERE Salário >= (SELECT Avg(Salário) FROM Funcionários WHERE T1. PreçoUnit FROM Produtos WHERE PreçoUnit = (SELECT PreçoUnit FROM [Produtos] WHERE NomeProduto = "Licor de Cacau"). Esse exemplo lista os funcionários cujo salário seja maior que a média dos salários de todos os funcionários. SELECT NomeContato. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Isto também poderia ser feito com INNER JOIN. T1. Fone FROM Clientes WHERE ClienteID IN (SELECT ClienteID FROM Pedidos WHERE DataPedido BETWEEN #1/04/95# AND #1/07/95#). NomeEmpresa. Salário FROM Funcionários WHERE Título LIKE "*Repr Vendas*" AND Salário > ALL (SELECT Salário FROM Funcionários WHERE (Título LIKE "*Gerente*") OR (Título LIKE "*Diretor*")). Título.ano_servico) WHERE (((servico. SELECT NomeProduto. Nome. Título. numero_servico) AND (servico.Página Nr. título e salário de todos os representantes de vendas cujos salários sejam superiores aos de todos os gerentes e diretores. Esse exemplo lista a empresa e o contato de cada empresa de todos os clientes que fizeram pedidos no segundo trimestre de 1995.com.FuncionárioID = E. ano_servico = encaminhamento. Algumas subconsultas são aceitas em consultas de tabela cruzada especialmente como predicados (as da cláusula WHERE). a palavra reservada AS é opcional. ContatoTítulo. SELECT Sobrenome.br .numero_servico = encaminhamento. Esse exemplo seleciona o nome de todos os funcionários que tenham registrado pelo menos um pedido.efetuado) Is Null) AND ((encaminhamento. Para a tabela Funcionários é dada o alias "T1": SELECT Sobrenome. Você também pode usar aliases de nomes de tabelas em uma subconsulta para fazer referência a tabelas listadas em uma cláusula FROM fora da subconsulta. Subconsultas como saída (as da lista SELECT) não são aceitas em tabelas de referência cruzada. Utilize o predicado EXISTS (com a palavra reservada NOT opcionalmente) em comparações true/false para determinar se a subconsulta retorna algum registro. você pode usar NOT IN para recuperar apenas os registros na consulta principal para os quais não existam registros com valores iguais na subconsulta.Título) ORDER BY Título.

Mas todos os problemas são facilmente resolvidos criando-se variáveis globais para definir qual tipo de banco estamos lidando. Paradox. para tanto faz-se necessário de: 1.o BDE 5.br . Porque trabalhar com o Access ? Bem. ou ainda pode-se dizer que ele é um padrão mundial. qual o nome correto da tabela e assim sucessivamente. 35/178 .5. poderia explicar que porque ele é o banco de dados mais fácil de se trabalhar tanto para nós (programadores) quanto para o usuário.00 MS-Access 97 Prefácio Antes de começarmos o nosso curso precisamos configurar o acesso ao banco de dados que será utilizado.com. entre no BDE Administrator e proceda a seguinte troca na página Configuration. a Microsoft para as versões MS-Access posteriores a 2. 2. então na verdade é preciso instalar o DAO (Data Access Objects). você também precisará instalar o link de conexão. MS-Access. O único problema que existe numa migração é quanto aos comandos SQL (Structure Query Language).0 (que o acesso era feito com o JET) prendeu o instalador do DAO com os aplicativos de desenvolvimento dela tais como: Visual Basic.DLL e a Biblioteca DAO 3. Existe algum problema em se migrar um sistema desenvolvido no Access para outro banco de dados. mas fico com a explicação de que entre todos os bancos de dados de pequeno porte (Inclui aí.5 é IDDA3532. e por aí vai.Conecção Delphi com o MS-Access Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. normalmente não é preciso mudar uma única linha de programação para se utilizar o mesmo sistema em bancos de dados completamente diferente (desde óbvio siga-se alguns passos básico). A ferramenta Delphi 4. A biblioteca DAO 3.C:\Arquivos de Programas\Borland\Common Files\BDE A conexão do Delphi com o MS-Access funciona da seguinte maneira BDE . MS-C++ e assim vai.0 é a IDDAO32. ☞Importante . entre outros) ele é o que melhor se comporta para o desenvolvimento inicial de qualquer projeto suportando as alterações feitas constantemente na base. ou então que muitos de nós o temos.DAO . O DAO se faz necessário pois precisamos levar o sistema para o nosso cliente. perda e recuperação dos índices.DLL) colocada no diretório do BDE .0 quanto com o 3.DLL (Que será a que utilizaremos) Mas antes de se criar qualquer alias de conexão.Banco Access. então para ter a "correta" licença de distribuição do DAO você precisa adquirir qualquer um desses aplicativos.5 (IDDA3532.00 Biblioteca de acesso DAO 3. o MDB. dBase.com. por exemplo ORACLE ? Não existe "quase" nenhum problema na migração de sistemas com o Delphi.00 pode operar tanto com o DAO 3. e do mesmo modo que você precisa instalar o sistema em Delphi. MS-J++. MS-Access. Você poderá acertar o Install Shield (conforme a apostila 4) para instalar todas as bibliotecas de acesso do DAO mas é necessário tê-las. BDE (Borland DataBase Engine) para a versão 5. o BDE client.Para definir qual será utilizado.0 versão Client/Server Suite BDE 5. conforme a figura: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Página Nr. voce precisa informar no BDE Administrator qual a DLL que sera' utilizada para o driver MSACCESS.br Pré-Requisitos: Windows 98 Delphi 4. pois infelizmente o Access possui um SQL próprio não comum aos outros bancos de dados.0 possui uma conexão direta com o Banco de Dados MS-Access 97.

com.Prontinho basta agora sair e entrar novamente do BDE Administrator e criamos nossos Aliases de conexão. 36/178 .Página Nr.br . PDF criado por: Idelson Pessoa da Silva – idelson@bol.

imprimi. fácil. você poderá mandar para seus amigos um simples executável com uma mensagem. o Menu (localizado no topo) dá acesso as opções. O Delphi é um ambiente de Desenvolvimento totalmente Baseado na Orientação a Objetos.com. PDF criado por: Idelson Pessoa da Silva – idelson@bol.Página Nr. para você que está começando e participando deste curso. com exercícios e truques que lhe ajudarão a senão dominar pelo menos a desvendar os mistérios desse maravilhoso ambiente.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: PASCOA2G. Vamos começar então: ☞ Conhecendo o Ambiente Abra o Delphi. Existe uma frase para o Delphi que sempre utilizo quando começo meus cursos é assim: Tudo o que parece difícil na verdade é fácil Tudo o que parece fácil na verdade é muito mais fácil. Deixa eu dar um conselho que eu aprendi a duras penas. 37/178 . Uma vez fiquei quase dois dias com um erro me incomodando. vamos a uma rápida explicação. selecionei algo prático.Apostila 01 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. o Delphi é composto por quatro ambientes de trabalho: 1. Isso sempre funcionou com o Delphi. mostrá-lo para um colega que conheça também Delphi. bem aí está seu ambiente de trabalho.br . Para o nosso primeiro contato com a ferramenta. pois ali você encontrará uma dica valiosa que poderá lhe ajudar a esclarecer várias dúvidas. útil e até mesmo bonitinho. Um abraço e bom trabalho. era um simples comando IF que tinha construído errado. não é puro (discutiremos isso no apêndice referente a Orientação a Objetos) mas por enquanto você precisa apenas saber que ele é uma ferramenta com um incrível poder na construção tanto de softwares complexos.br Pré-Requisitos: Windows 98 Delphi 4.Curso de Delphi 4.0 versão Client/Server Suite BDE 5. Parte superior composta pelo Menu. primeiramente gostaria de avisar que o curso é totalmente prático. e os Botões de Acesso Rápido (localizado na parte superior esquerda) que são uma abreviação dos comandos do menu.BMP Prefácio Salve. Component Pallete e Botões de Acesso Rápido (Speed Button): é exatamente o conjunto que está suspenso na área aberta.com. um cartão eletrônico. nascimentos e assim vai. Solicito que quando você encontrar a seguinte simbologia Importante pare e leia com a maior atenção. a Component Pallete (localizado na parte superior direita) contém todos os objetos (divididos em classes) que você utilizará para realizar seus projetos. revi linha a linha até que finalmente pedi para que um amigo do lado olhasse meu programa em menos de 1 segundo ele descobriu o erro.0 . tente sempre que acontecer algum erro. Aniversários. vou criar aqui um para a Páscoa mas é possível aproveitar a idéia para outros eventos também tais como Natal. quanto de sistemas de manipulação a bancos de dados.

Object Inspector: é uma janelinha lateral (chamada como a tecla F11) que contém as propriedades e os eventos dos objetos selecionados. 3. ela foi dividida em dois ambientes. Form: este objeto será sua prancheta de trabalho é nessa janela em branco (seria melhor dizer em cinza) que criaremos nossa comunicação entre o sistema e os nossos usuários. uma parte que funcionará como índice. PDF criado por: Idelson Pessoa da Silva – idelson@bol. nos mostrandos os objetos existentes. 38/178 . no Delphi você tem a capacidade de visualizar todo o código do seu formulário e não apenas uma determinada parte. Code Editor: é a área localizada atrás do "Form". 4.br . diferentemente das outras linguagens visuais. então é possível modificar as possições entre eles ou criar janelas suspensas basta para isso que você clique no canto (dessas partes duplas) segure e arraste. 2.Uma novidade do Delphi 4.com. elém dos procedimentos e funções criadas e uma outra que conterá nossas o código propriamente dito (em linguagem Object Pascal).0 é que todos eles estão colocados em janelas auto-arrastáveis.Página Nr. as bibliotecas utilizadas e as variáveis ou constantes disponíveis.

que será o nome do executável final) mude para Cartao.Após alterarmos a Cor (propriedade Color) e a Fonte (propriedade Font) todos os outros objetos criados em cima deste Form.. e coloque nela o ." e faça as seguintes alteções na janela de Fonts: 3. Tamanho: 10 3. para tanto. Na Component Pallete localize uma página chamada Standard e dentro dessa página localize o objeto Label (acredito que seja o terceiro) pressione a tecla SHIFT e clique no objeto (deve ter ficado um quadriculado azul em volta do objeto. 2.1. Aonde aparece Unit1. siga um passo atrás do outro.41.4. Label2. 39/178 . Vá na Object Inspector e localize o objeto Form1 (basta clicar no Combo Box para seleciona-lo)..BMP enviado (Seleciona determinada figura) 3.. Dê uma comparadinha no desenho para ver como está ficando: ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto Image (acredito que seja o sexto) e dê um clique no Form.Página Nr. (automaticamente o Delphi criou oito objetos chamados respectivamente Label1. Olhe na Object Inspector e verifique as propriedades do objeto Image1 criado. para padronizar vamos criar uma pasta com o nome CursoDelphi e dentro dela criaremos uma nova pasta chamada Cartão.1.Projeto 1 .2.1. Cor: Branco 3. mas antes de começar. Caption: Feliz Páscoa (Conteúdo da tarja do formulário) 3.Aonde aparece Project1. AutoSize: True (Fará com que o tamanho do objeto fique automaticamente do tamanho da figura selecionada) 2.. Dê uma salvadinha no seu projeto.um abaixo do outro e na área preta.dpr (o Delphi está se referindo do nome do projeto .3.com. vamos começar como uma receita de bolo.pas (o Delphi está se referindo do nome do formulário) mude para fCartao.Cartão Eletrônico Bem. Label6. e altere as seguintes propriedades: 3. Color: clBlack (Cor do formulário para preto) 3. Name: F_Cartao (Nome interno do formulário) 3. 4. Label4. Font: Clique nos ". Quando terminar clique dentro da Component Pallete na setinha para poder desmarcar o objeto Label.br . e altere as seguintes propriedades: 2.DPR 5. Position: poScreenCenter (Fará com que o formulário fique sempre centralizado quando for executado) Importante .2. Label7 e Label8) 6.BMP enviado: 1. Label5.: 4.. como se ficasse marcado) e dê oito cliques no Form .5.42.PAS 4.4. crie uma pasta que abrigará seu projeto. agora que estamos familiarizados com o ambiente. 7. BorderStyle: bsDialog (Fará com que a janela fique no formato padrão de uma janela de mensagens) 3. (automaticamente o Delphi criou um quadrado quadriculado que representa o objeto Image1).2.. automaticamente herdarão essas alterações. Picture: Clique nos ". no menu vá em File | Save All. Label3." (ou dê um duplo clique em cima do objeto criado) e localize o arquivo .

Página Nr. em sua gloria eterna e envolve com paz e amor este sacrifício em incenso. Oh Senhor. Font: Clique nos "." e faça as seguintes alteções na janela de Fonts: 8..11.3. Cor: Preto 8. Olhe na Object Inspector e verifique as propriedades do objeto Memo1 criado. E perdoa. Senhor.12. sua polícia ausente. seu presidente estratosférico.2. agora vamos criar dois objetos que servirão apenas como meros auxiliares: 7. todos os objetos que serão visíveis já estão aí..Bom." e copie o seguinte texto: Recebe. Lines: Clique nos ".. 8. Visible: False (Não mostrará o objeto em tempo de execução) PDF criado por: Idelson Pessoa da Silva – idelson@bol. seus senadores omissos.1. perdoa nós todos. 40/178 . Ou digite um outro texto que mais lhe agradar.br . perdoa o Brasil. Na Component Pallete na mesma página Standard clique no objeto Memo (acredito que seja o quinto) e dê um clique no Form (automaticamente o Delphi criou um quadrado que representa o objeto Memo1). Oh Senhor. seus deputados escondidos. mas anote o número de linhas (neste aqui temos 25 linhas) 8. perdoa a mim e a meu irmão que nada fizemos. e que não vimos a imagem de seu filho Cristo na Cruz. seus militares fantoches.com. Tamanho: 8 8.. sua igreja distraída. que sobe clamando por justiça por todos os meninos assassinados pelos pobres que morrem de fome pelas mulheres violentadas pelo povo roubado e explorado. que não agimos. e altere as seguintes propriedades: 8.

Caption := ''. 41/178 .FormShow(Sender: TObject).8. NumLinha := 0.com.1. sugiro que você maximize a área para trabalhar melhor. insira o seguinte código: procedure TF_Cartao.1.9 então o último número será o número total da sua lista . var i : Integer. Codificando Tudo pronto. se foi por ação de um mouse ou de um clique num botão. a idéia do cartão. que é ativado a cada segundo (através da propriedade Interval. para chamar os oito labels utilizaremos a variável ComponentCount para contar quantos componentes tem o formulário. vc terá 0. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. Aqui foi preciso rastrear todos os componentes do formulário através do comando Components[n].Página Nr. begin for i := ComponentCount .3. isso faz você saber quem foi que ativou tal evento. medida em milésimos de segundo) que simulará o movimento entre os labels. Pressione a tecla F12.7. Localize na Object Inspector o objeto F_Cartao. Então vamos começar a brincadeira: 10. mas vamos devagar. PDF criado por: Idelson Pessoa da Silva – idelson@bol. se você ainda não entendeu. e altere para o seguinte: private NumLinha: Integer. Na Component Pallete na página System clique no objeto Timer (acredito que seja o primeiro) e dê um clique no Form (automaticamente o Delphi criou um quadradinho com um relógio. 11. verificamos quais deles são label's e estes limparemos e iniciarmos a nossa variável NumLinha com 0.1 downto 0 do if (Components[I] is TLabel) then (Components[I] as TLabel). até você ter acesso a Code Editor.2. que por sinal é uma cópia do desenho do objeto). localize as seguintes linhas: private { Private declarations } public { Public declarations } end. é que ao ser executado a mensagem que está guardada dentro do objeto Memo1 rolará entre os oito labels (como se tivesse subindo) para isso foi criado um Temporizador (Objeto Timer1). sendo criada e destruída junto com ele.. ex: Lines.). mude para a página de eventos (Events) e localize o evento OnShow. A propriedade Interval controla a velocidade do objeto.9. Isto é iniciado do 0 (assim como todo Array no Delphi começa do 0. use aspas simples (nunca duplas) e sem espaços entre elas.4. então é preciso criar um FOR que vai do 0 até o (número total de componente-1) porque o primeiro é o 0 isto explicasse imaginando uma lista de 10 números começados pelo 0. aonde n é o número de cada componente.5. end. Items.6. limparemos os oito Labels para isso simplesmente utilizaremos uma string vazia.. public { Public declarations } end. agora é só meter a mão no programa. ☞Importante - Muitos dos procedimentos que o Delphi cria automaticamente (através dos eventos) requisitam a passagem de um objeto do tipo TObject (Sender: TObject). e assim vai. dê um duplo clique na área em branco.br . Neste evento que é disparado assim que o formulário se inicia. Você acaba de criar uma variável particular (Private) do tipo inteira (Integer) que servirá apenas a este formulário.

Caption := Monta.Caption := ''. Label6. Label3.Timer1Timer(Sender: TObject).Caption := ''. TDBText ou qualquer outro que você deseje. 42/178 . end. é verdade que estamos tratando apenas com 8 objetos label's mas e se amanhã utilizamos 20 ou 30 ?? Além do que isso pode-se dizer que é o primeiro passo para um recurso de MacroSubstituição. inc(NumLinha). poderiamos muito bem utilizar: Label1.Caption := ''.Caption := Monta. pode também ser utilizado para o TEdit.Caption := ''. dê um duplo clique na área em branco.Caption := ''. como foi utilizado com o TLabel. Label8.Caption := ''. Localize na Object Inspector o objeto Timer1.Caption := Monta. Label4.1 downto 0 do if (Components[I] is TLabel) then (Components[I] as TLabel). Label6.Caption := Monta. Label5. Label3. begin NumLinha := NumLinha .Caption := Monta.Caption := Monta. Label7. poderíamos aqui usar dois nomes ou Monta ou a palavra chave Result. fica muito deselegante. Label2. function Monta : String. Label5. Label1.br .Caption := Monta. Label2. entre os intervalos begin e end escreva: procedure TF_Cartao. TEditMask . ambos os nomes apontam para a mesma variável que tem como função fazer a devolução da String definida pela função (para maiores referências veja a apostila Programação Orientada a Objetos) no primeiro segundo que passar: Label1 até Label7 = Branco e o Label8 com o conteúdo da primeira linha do objeto Memo1. if NumLinha > 30 then NumLinha := 0.com. então: ☞Importante . end.Caption := ''. note que dentro da procedure colocamos uma função interna Monta que nos retornará o conteúdo de uma determinada linha do objeto Memo1.Página Nr.Caption := ''.Lines[NumLinha].☞ Importante . Mas isso além de ficar um tantinho mais inchado. Label4. begin result := Memo1. mude para a página de eventos (Events) e localize o evento OnTimer.7. Label8.Claro que ao invés de usarmos: for i := ComponentCount .Caption := ''. PDF criado por: Idelson Pessoa da Silva – idelson@bol.Caption := Monta. note que trabalhamos com 8 label's.Note que existe uma variável chamada Result ela é uma variável definida pela própria função (no caso tipo String). Label7. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. 12. Neste evento é que está toda a jogada do programa.

No próximo segundo que passar: Label1 até Label5 = Branco. Uma coisa que você pode (e deve fazer) é ir em Project | Options. Classes. interface uses Windows. ExtCtrls. Finalmente Na próxima apostila começaremos a desvendar os segredos dos bancos de dados. Enviando o projeto para um Amigo Prontinho agora basta apenas você compilar o projeto. depois -6. 1.os brancos são conseguidos pesquisando valores negativos dentro da propriedade Lines do objeto Memo1. e assim vai até chegar a 0 no primeiro segundo. Forms.No próximo segundo que passar: Label1 até Label6 = Branco. (Atenção: também não precisa mandar o Ícone que você escolheu para seu projeto o Delphi também se encarrega de colocá-lo no executável).br .. ☞Importante . na página Application atribua um título (Title) e um novo ícone (Icon) ao seu projeto. parente. até um total de 30 segundos.. Label6 com o conteúdo da primeira linha do objeto Memo1 e o Label7 com o conteúdo da segunda linha do objeto Memo1 e Label8 com o conteúdo da terceira linha do objeto Memo1 E assim vai aumentando segundo após segundo. acredito que deva caber num único disquete (Atenção: Não precisa mandar o . 2. então é preferível fazer o lote da montagem dos oito label's na mão mesmo. Realizando uma pequena otimização Anote antes desses passos qual foi o tamanho em Bytes que ficou o seu executável. colega ou amigo(a). Label7 com o conteúdo da primeira linha do objeto Memo1 e o Label8 com o conteúdo da segunda linha do objeto Memo1.Página Nr. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 43/178 . depois vá na página Compiler e desmarque todas as opções do Grupo Debugging (elas só servem para quando você estiver testando o aplicativo). Isto seria o correspondente: variável := variável + quanto.7] como resultado disto teremos primeiramente o valor -7. StdCtrls. se não for enviado será por default 1. aumentei mais 5 para ter um intervalo entre a última linha e o começo de uma nova montagem quando a variável monta linha é novamente reiniciada a zero. Mas não se preocupe esses macetes você aprenderá ao longo do nosso curso. Note que eu faço [NumLin := NumLin . esta função também pode ser: Inc(variável.aqui não adianta tentar usar o recurso da ComponentCount pois pode avacalhar na hora da montagem. ☞Importante .. Note que para adicionar 1 a variável NumLinha utilizo a função interna INC. (ou pressione CTRL+F9 e prontinho é só mandar o executável gerado para sua(seu) namorada(o). No início do programa do seu formulário deixe apenas as seguintes bibliotecas: unit fCartao. vá ao menu nas opções Project | Compile. Controls. [quanto]) aonde "quanto" representa o número que você quer adicionar a variável.BMP o Delphi já se encarrega de guardá-lo no executável).com. note aqui que são 25 linhas. e só de curiosidade o contrário da função INC é a função DEC. Dê uma compilada final escolhendo as opções Project | Build All Compare agora o tamanho do seu executável final.. 3.

BMP CENTRO.br Pré-Requisitos: Windows 98 Delphi 4. e o Delphi é um dos poucos ambientes que consegue fazer essa conexão de forma rápida e prática.br . (automaticamente o Delphi criou um quadrado quadriculado que representa o objeto Image1).2. Projeto 2 .BMP Prefácio Salve. em Orientação a Objetos não existem Sistemas e sim Projetos então acostume-se com isso) agora que já ficamos familiarizados com o Delphi este projeto será um pouco diferente criarei apenas uma parte dele caberá a você a conclusão do resto do projeto. como se isso já não fosse óbvio.0 . afinal o maior mistério com o Delphi é como ele trata Bancos de Dados. 44/178 ." e localize o arquivo BRASIL. Mas antes de nos enveredarmos no conceito de Banco de Dados vamos criar a nossa capa do aplicativo. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto Image (acredito que seja o sexto) e dê um clique no Form.BMP enviado (Seleciona determinada figura) PDF criado por: Idelson Pessoa da Silva – idelson@bol. 3. AutoSize: True (Fará com que o tamanho do objeto fique automaticamente do tamanho da figura selecionada) 3. após a construção de um Cartão você pode estar pensando o que virá a seguir ? Acertou se pensou no acesso a Banco de Dados. Ok ? Então vamos meter a mão na massa: 1.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: BRASIL. eu vou alargar um pouco e dar também a possibilidade de impressão da região escolhida. garanto que você achará bastante interessante o que estamos prestes a começar a desenvolver.com. Olhe na Object Inspector e verifique as propriedades do objeto Image1 criado.Curso de Delphi 4. e altere as seguintes propriedades: 3.com. Abra o Delphi. após a escolha de uma região o usuário poderá dentro desta escolher qual o estado ele deseja ter uma pequena descrição.BMP NORDESTE.Apostila 02 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. Picture: Clique nos ". 2.BMP NORTE. Uma das grandes vantagens do Delphi é o seu relacionamento com os diversos bancos de dados atualmente existentes. agora vamos começar nosso projeto (note que eu sempre falo a palavra Projeto ao invés de Sistema.Mapa Eletrônico (1a.1. Inicialmente será mostrado o mapa do Brasil para que o usuário possa escolher determinada região..BMP SULDESTE.Página Nr. Parte) Bem. Vamos a uma rápida explicação o que é este projeto.0 versão Client/Server Suite BDE 5.BMP SUL..

13. 11.1. Dê uma comparadinha no desenho para ver como ficou: PDF criado por: Idelson Pessoa da Silva – idelson@bol. isso fez com que três importantes propriedades se alterassem: 10.4.3.Página Nr.PAS 5. Para terminar nosso primeiro formulário desse projeto vá para a Component Pallete localize uma página chamada Additional e dentro dessa página localize o objeto BitBtn (acredito que seja o primeiro) clique no objeto e dê um clique no Form e altere as seguintes propriedades: 10. ☞ ☞Importante .2.1.2.2.12.Mostra os estados da Região Sudeste .Caption: &Fechar (apenas para "aportuguesar"o nosso aplicativo). isso significa que vários objetos (mesmo diferentes) possuem propriedades idênticas entre si.com. Name: F_Mapa (Nome interno do formulário) 4." e faça as seguintes alteções na janela de Fonts: 6. 10. altere agora a propriedade ShowHint para True.DPR 6. Na Component Pallete localize uma página chamada Standard e dentro dessa página localize o objeto Label (acredito que seja o terceiro) clique no objeto e dê um clique no Form e altere as seguintes propriedades: 6. Vá na Object Inspector e localize o objeto Form1 (basta clicar no Combo Box para selecioná-lo). Estilo: Negrito 6. Caption: Mapa Eletrônico (Conteúdo da tarja do formulário) 4.: 5. e altere as propriedades Name e Hint de cada um para. ImgCentro. como se ficasse marcado) e dê cinco cliques no Form .1. 10.de preferência um em cada região.12.1. Dê uma salvadinha no seu projeto.2. (Note que na Object Inspector não aparece o nome do objeto) e a propriedade Cursor para crHandPoint (isso fará com que o cursor em cima da figura seja alterado para uma mãozinha apontando). ImgSudeste e ImgSul (o que eu queria era que todos os cinco objetos ficassem marcados simultaneamente). Caption: Clique sobre a Região a consultar (Conteúdo que será mostrado) 7. Position: poScreenCenter (Fará com que o formulário fique sempre centralizado quando for executado) 5. praticaremos isso posteriormente.Hint . para tanto. Kind: bkClose.br . e altere as seguintes propriedades: 4. 45/178 .11.pas (o Delphi está se referindo do nome do formulário) mude para fMapa. respectivamente: Name ImgNorte ImgNordeste ImgCentro ImgSudeste ImgSul .Mostra os estados da Região Nordeste . Caption: assumiu o valor &Close. Cor: Castanho 6.Mostra os estados da Região Sul Importante .Isso pode ser usado para alterar diversas propriedades de objetos diferentes.. 9..4.Mostra os estados da Região Norte ..A próxima modificação tem a ver com Orientação a Objetos o termo é POLIMORFISMO. 8. Font: Clique nos ". Modal Result: apesar de não ter sofrido alteração internamente foi disparado uma Flag que fará com que quando este botão seja clicado o formulário se encerre automaticamente.. por exemplo a propriedade Caption de um objeto Form possui (basicamente) a mesma função da propriedade Caption de um objeto Label. Aonde aparece Project1. Na Component Pallete localize uma página chamada Additional e dentro dessa página localize o objeto Image (acredito que seja o sexto) pressione a tecla SHIFT e clique no objeto (deve ter ficado um quadriculado azul em volta do objeto. Aonde aparece Unit1.dpr (o Delphi está se referindo do nome do projeto .11. 10. BorderStyle: bsDialog (Fará com que a janela fique no formato padrão de uma janela de mensagens) 4. Clique no objeto ImgNorte segure a tecla SHIFT e clique em ImgNordeste. Glyph: ganhou uma imagem padrão de uma portinha de saída 10.Mostra os estados da Região Centro-Oeste . no menu vá em File | Save All. Quando terminar clique em qualquer região do formulário para desmarcar os objetos.que será o nome do executável final) mude para Mapa.

fSul. ele mostrará o mapa do Brasil e ao ser clicar em qualquer parte de uma determinada região ele disparará o mapa respectivo desta. ImgSudeste: TImage. // Chama o mapa da Região Norte // Chama o mapa da Região Nordeste // Chama o mapa da Região Sul PDF criado por: Idelson Pessoa da Silva – idelson@bol. mas pretendo aqui ensinar também alguns macetes interessantes. este será o nosso primeiro formulário. procedure ChamaRegiao(Sender: TObject). E faça as seguintes alterações implementation {$R *. fNordeste. private Agora localize a linha: implementation {$R *.br .Página Nr. 46/178 . sua função é simples. Codificando o mapa A codificação é um tanto simples.DFM} uses fNorte. ImgSudeste: TImage.DFM} end. private Inclua a seguinte chamada a um procedimento antes da parte private: ImgSul: TImage. aperte a tecla F12 até que você tenha a janela da Code Editor aberta e localize para mim as seguintes linhas: ImgSul: TImage.com. de uma série de sete.Bom.

end.Free. este comando serve para identificar minhas unidades externas.Create(Application) do try ShowModal. end. F_Norte. Prontinho agora vamos explicar essa procedure linda e maravilhosa que foi montada de propósito para você entenda algumas artimanhas da linguagem Pascal. Outra coisa que poderiamos fazer é. begin with aFormClass.fSudeste. 47/178 . ou seja.CriaForm(aFormClass: TFormClass). . begin if (Sender = ImgNorte) then CriaForm(TF_Norte) else if (Sender = ImgCentro) then CriaForm(TF_Centro) else if (Sender = ImgNordeste) then CriaForm(TF_Nordeste) else if (Sender = ImgSul) then CriaForm(TF_Sul) else if (Sender = ImgSudeste) then CriaForm(TF_Sudeste). finally Free. antes da palavra chave IMPLEMENTATION assim que o formulário é gerado tudo é compilado e salvaguardado em áreas de memória prontos para serem utilizados. mas em compensação a Unit fNorte (que criaremos posteriormente) não é armazenada.Create(Application) do try PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. Assim eu estou preservando vários blocos de memória para serem utilizados apenas quando realmente forem necessários. criamos um procedimento particular (lá no Private) para todas os outros procedimentos então ficaria assim: private procedure CriaForm(aFormClass: TFormClass). end. Isso funcionaria perfeitamente bem mas como são cinco objetos precisariamos repetir isso cinco vezes (imagine se fossem uns 20 ou 30). a Unit Windows (se você reparar ela está lá em cima) e jogada para uma área de memória. end. fCentro.br . // Depois do comando uses procedure TF_Mapa. end. e isso já não é tão bom assim em Pascal.Create(Application). F_Norte.ShowModal. begin with aFormClass. public .lá em cima) já tem um comando assim. // Chama o mapa da Região Sudeste // Chama o mapa da Região Centro-Oeste procedure TF_Mapa.Página Nr.ChamaRegiao(Sender: TObject). . antes de fazê-la poderiamos simplesmente em cada objeto TImage clicarmos no evento OnClick e para cada um colocarmos o seguinte código: (por exemplo para o objeto da Região Norte) begin F_Norte := TF_Norte. Antes de explicar esse procedimento deixa eu comentar porque criei uma nova declaração USES (note que na terceira linha da Unit . // Chama os outros Formulários procedure CriaForm(aFormClass: TFormClass).

Caption: Estados da Região Sul (Conteúdo da tarja do formulário) 14. Aonde aparece Unit1. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto Image (acredito que seja o sexto) e dê um clique no Form.. Repita os mesmos passos com as outras imagens das outras regiões. 13.1. Então resolvi fazer da maneira como eu coloquei.br . chamado CriaForm. Position: poScreenCenter (Fará com que o formulário fique sempre centralizado quando for executado) 15. end.PAS PDF criado por: Idelson Pessoa da Silva – idelson@bol.1. (automaticamente o Delphi criou um quadrado quadriculado que representa o objeto Image1). Observe que é quase tudo igual ao primeiro formulário criado. para tanto. Primeira Região Apenas para guiá-los mostrarei como criar o mapa da Região Sul (só tem três estados e não deve me dar muito trabalho :)) você deverá criar os formulários para as outras regiões. vamos agora ver o que acontece com cada região. e altere as seguintes propriedades: 14. Picture: Clique nos ". Isso também funcionaria perfeitamente bem mas como são cinco objetos precisariamos repetir isso cinco vezes (imagine novamente se fossem uns 20 ou 30). selecione atraves do Combo (aquela setinha apontada para baixo) o procedimento ChamaRegiao. A partir do Menu Principal clique em File | New Form e será disponibilizado um novo formulário. mas agora o pior que e serão vários procedimentos que teremos que olhar caso dê algum erro e isso já não é tão bom assim em Pascal.. Olhe na Object Inspector e verifique as propriedades do objeto Image1 criado. AutoSize: True (Fará com que o tamanho do objeto fique automaticamente do tamanho da figura selecionada) 13. vá para a página de eventos e para o evento OnClick. no menu vá em File | Save All. end.Página Nr.1. Name: F_Sul (Nome interno do formulário) 14.com.: 15.. e em cada objeto TImage clicarmos no evento OnClick e para cada um colocarmos o seguinte código: (por exemplo para o objeto da Região Norte) begin CriaForm(TF_Norte). 48/178 . Dê uma salvadinha no seu projeto.3. BorderStyle: bsDialog (Fará com que a janela fique no formato padrão de uma janela de mensagens) 14. Não adianta tentar rodar que ele deve acusar erro que as outras unidades ainda não existem. Este formulário já está pronto. finally Free.4. e altere as seguintes propriedades: 13.ShowModal. end. vamos aos passos: 12. Criei um único procedimento ChamaRegiao que receberá uma variável do tipo TObject (lembra da apostila anterior ? É o objeto que chama o procedimento) e para este procedimento coloquei um outro procedimento interno..BMP enviado (Seleciona determinada figura) 14. (Obs." e localize o arquivo SUL. Para ativar todo o conjunto aperte novamente a tecla F12 (para mostrar o formulário) e dê um clique simples sobre o objeto ImgNorte aperte a tecla F11 (para chamar a Object Inspector).2.2. Vá na Object Inspector e localize o objeto Form1 (basta clicar no Combo Box para selecioná-lo).pas (o Delphi está se referindo do nome do formulário) mude para fSul.

altere agora a propriedade ShowHint para True e Cursor para crHandPoint.Descreve o estado de Santa Catarina .Hint . Font: Clique nos ".br .de preferência um em cada região.2. Cor: Castanho 6. (Praticando o polimorfismo novamente) Clique no objeto ImgPR segure a tecla SHIFT e clique em ImgSC e ImgRS. 21. são eles respectivamente: Nome Interno Nome Externo F_Norte fNorte F_Nordeste fNordeste F_Centro fCentro F_Sudeste fSudeste Figura a usar NORTE.Descreve o estado do Paraná . Estilo: Negrito 16..BMP CENTRO. Na Component Pallete localize uma página chamada Standard e dentro dessa página localize o objeto Label (acredito que seja o terceiro) clique no objeto e dê um clique no Form e altere as seguintes propriedades: 16.Página Nr. 20. 49/178 . respectivamente: Name ImgPR ImgSC ImgRS . isso fez com que três importantes propriedades se alterassem: 20. 19. como se ficasse marcado) e dê cinco cliques no Form . Caption: &Fechar (apenas para "aportuguesar"o nosso aplicativo). Kind: bkClose. Caption: Clique sobre o Estado a consultar (Conteúdo que será mostrado) 17.BMP SUDESTE.com.11. Para terminar nosso primeiro formulário desse projeto vá para a Component Pallete localize uma página chamada Additional e dentro dessa página localize o objeto BitBtn (acredito que seja o primeiro) clique no objeto e dê um clique no Form e altere as seguintes propriedades: 20.16.Descreve o estado do Rio Grande do Sul 18.BMP PDF criado por: Idelson Pessoa da Silva – idelson@bol. Dê uma comparadinha no desenho para ver como ficou: Agora cabe a você criar mais quatro formulários. e altere as propriedades Name e Hint de cada um para.." e faça as seguintes alteções na janela de Fonts: 6. Na Component Pallete localize uma página chamada Additional e dentro dessa página localize o objeto Image (acredito que seja o sexto) pressione a tecla SHIFT e clique no objeto (deve ter ficado um quadriculado azul em volta do objeto.12.2.1.BMP NORDESTE. Quando terminar clique em qualquer região do formulário para desmarcar os objetos.1.

Importante . Selecione a página Forms lá você verá dois objetos ListBox. Não faça o procedimento com o F_Mapa. Então selecione os formulários: F_Norte. agora execute o projeto e veja como ele está ficando. Comigo aqui acabei conseguindo montar com uma exatidão fora do normal.Chamei de Nome Interno a propriedade Name dos formulários e Nome Externo como será o nome que você deve salvar cada formulário.Infelizmente com o Delphi não existe outro componente mais poligonal que o tImage. Mas precisamos dizer para o Delphi que não queremos que ele faça o serviço de Auto-Create. do lado esquerdo são os AutoCreate Forms e do lado direito estão os Available forms ou simplesmente formulários disponíveis. ele é o nosso Menu e ele precisa realmente ser criado automaticamente assim que o usuário iniciar o processo. Finalmente Existem várias maneiras de se mostrar o estado escolhido mas a que eu achei mais interessante utiliza o QuickReport (que vem com o Delphi) para fazer o serviço. então você pode colocar uns sobre os outros.br . isso facilita muito quando queremos lembrar o nome que precisamos utilizar. mas isso gera um tanto de prejuízo as áreas de memória (é óbvio que um projeto com 7 ou até 10 não é um caso sério. ☞ Tirando os formulários do Auto-Create O Delphi cria automaticamente todos os formulários que utilizamos. para tanto vá (a partir do menu principal) em View | Project Manager. Note que a única diferença entre eles está num simples apostrofe "_". até eu me assustei. F_Centro. esta janelinha é a que controla todas as unidades do seu projeto. PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. mas tem uma notícia boa o Delphi respeitará o objeto tImage criado por último. Mas faremos isto apenas na próxima apostila. 50/178 . Uma Dica: Para a região Centro-Oeste crie primeiro o Objeto do estado de Goiás e dentro dele coloque o objeto do estado do Distrito Federal. F_Nordeste. mas um projeto com 50 ou 70 já começa a dar uns erros muito estranhos) então lembra-se do procedimento CriaForm ele vai exatamente criar os nosso formulários para utilizarmos e depois destruí-los. F_Sudeste e F_Sul e clique no botão com o sinal > isso fará com que eles sejam despachados para o outro lado.☞ Importante . Clique no botão Options.Página Nr. Prontinho.

Página Nr.com.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: BASICO. SQL Server. Access. isso significa que a conversa entre sua Aplicação e o Banco não recebe interferencias externas a não ser do BDE (mas isso até o antigo Clipper precisava de suas ligações para seus acessos com os bancos xBase). formas de SQL) poderemos utilizar para nossa aplicação qualquer banco que acharmos mais fácil de manipularmos (tais como dBase. Importante .. Paradox.Note que eu não especifiquei qual o Banco de Dados.0 . a sua aplicação através dos objetos contidos na Component Pallete (localizado na parte superior direita) e na página chamada Data Access estão todos os objetos que fazem esta primeira conexão entre o Aplicativo e o BDE e este se comunica com o Banco de Dados.A conexão com o MS-Access funciona da seguinte forma: Entre o BDE e o Banco de Dados existe um aplicativo a mais de conexão.. mas com a grande vantagem que para determinados bancos o acesso é totalmente nativo. Interbase. Antes de recomeçarmos precisamos entender como funciona a conexão entre o Delphi e o Banco de Dados. ☞Importante .. ☞ Iniciando na Prática Bem se você ainda não fez. e pertence a Microsoft. Sybase.) e ao final (antes de entregar a aplicação para o usuário) fazermos um último teste com o banco de dados escolhido por ele (Oracle.0 versão Client/Server Suite BDE 5. a sigla significa Data Access Objects.Curso de Delphi 4.br Pré-Requisitos: Windows 98 Delphi 4.Apostila 03 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. Isto é realizado através de um conjunto de bibliotecas que a Inprise chamou de BDE (Borland DataBase Engine) ela trabalha assim como um ODBC de ligação. chamado DAO..MDB Prefácio Salve. Ilustradamente o acesso funciona da seguinte maneira: A coisa acontece da seguinte forma. então salvaguardando algumas regras do próprio banco (tais como o nome das tabelas. agora vamos concluí-lo.com.br .) para isso não precisaremos modificar uma única linha de código do nosso aplicativo. 51/178 . para ter o direito de uso e distribuição do produto você deve adquirir quaisquer das ferramentas de desenvolvimento da Microsoft. Para padronizar vamos criar uma pasta com o nome CursoDelphi e dentro dela criaremos uma nova pasta chamada Federação coloque PDF criado por: Idelson Pessoa da Silva – idelson@bol. na última apostila começamos a montar nosso pequeno mapa eletrônico. aconselho que você dê uma olhada no apêndice identificado por CONEXAO e faça as alterações sugeridas nele. Junto com essa apostila você está recebendo um banco de dados (formato MS-Access 97). é um conjunto de bibliotecas para o desenvolvimento com o banco de dados MS-Access.

O Alias é simplesmente uma conexão que se fará entre seu Aplicativo e o Banco de Dados ☞ Trabalhando com o TDatabase Antes de começarmos abra novamente o seu projeto. para isso a partir do Menu Principal clique em File | Open localize o arquivo Mapa.Página Nr. No formulário F_Mapa e coloque um objeto DataBase (que se encontra na Component Pallete na página Data Access) e altere as seguintes propriedades: AliasName para AlFedera (aquele que foi criado na apostila anterior) DataBaseName para dnFedera (nome da base de dados) Name para nmFedera Este objeto é o que fará a segunda conexão com o nosso banco de dados. Conexão: Entre os objetos DB com os objetos que o usuário utilizará (todos os que estão na página DataControls e alguns outros). 52/178 . tQuery.mdb e confirme as alterações em Object | Apply (ou simplesmente CTRL+A..com.DPR.Apesar de ser permitido não coloque acentos no seu Alias e procure não ultrapassar os oito caracteres isso além de manter a compatibilidade entre o Delphi 32 Bits e o Delphi 16 Bits também evita uma série de confusões. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 2. para lembrar a vocês: 1a. 3.dentro desta tudo que você recebeu. ou ainda clique no quarto botão da barra de ferramentas) 4. Conexão: Entre o Alias e o objeto tDataBase 3a..br . conforme a figura a seguir: 5. (ou simplesmente CTRL+N) e modifique a janelinha que aparece para: e pressione a tecla OK. Altere a propriedade DATABASE NAME para C:\CursoDelphi\Federação\basico. tStoreProc) 4a. Teste seu novo alias clicando em Object | Open (ou simplesmente clique no primeiro botão da barra de ferramentas) seu alias deve formar um quadradinho luminoso em volta do objeto. Feche-o em em Object | Close (ou simplesmente clique novamente no primeiro botão da barra de ferramentas) Se você está confuso com tudo isso não fique retorne aquela figura inicial sobre a conexão. Conexão: Entre o objeto tDataBase e os objetos DB (tTable. Se você não sabe como fazer vou dar uma canja siga os passos abaixo: 1. Graficamente então temos: Abra agora o aplicativo BDE Administrator e crie um Alias para o banco de dados enviado. Conexão: Entre o Banco de Dados e o Alias 2a. Mude o nome do seu novo alias para AlFedera Importante . A partir do BDE Administrator aberto vá em Object | New. pode-se dizer que estamos exatamente criando o quadradinho do BDE.

Agora precisamos simular as alterações de Conexão para tanto. isso significa que um evento qualquer é disparado quando outro evento é acionado. dê um duplo clique no evento OnClose: procedure TF_Mapa.Se você quer simular como será essa segunda conexão.Values['PASSWORD'] := ''. chame o objeto F_Mapa. begin LoginParams. e dê um duplo clique no evento OnShow para abrirmos esta conexão: procedure TF_Mapa. deixa eu abrir aqui um pequeno parenteses. Para fechar a conexão quando terminar nosso sistema. entre eles destacam-se: .Relatórios muito complexos eram uma Via-Crucis fazê-los . a geração de relatórios. mas era claro que ele não dava conta do recado por diversos motivos.0 a ferramenta para gerá-los era o Report Smith. 53/178 . na época do Delphi 1.Os relatórios ficavam separados do executável principal . quando surgiu o Delphi. end. LoginParams: TStrings). antes volte a propriedade Connected do objeto para false. LoginParams. altere a propriedade Connected do objeto para true e será mostrada a seguinte janela: Clique no botao Ok e prontinho seu banco estará conectado. begin nmFedera.Values['USER NAME'] := ''.FormClose(Sender: TObject. mas como todo paraíso tem seu inferno. na página de eventos de um duplo clique no evento OnLogin e vamos as alterações: procedure TF_Mapa. end.com.FormShow(Sender: TObject). Sobre o Quick Report O Quick Report é o gerador oficial do Delphi.Aqui executaremos mais um termo da Orientação a Objetos (lembram-se do POLIMORFISMO). O que acontece aqui é que quando o usuário executar o sistema esse disparará o evento OnShow do formulário e este disparará o evento OnLogin do objeto TDataBase. ou seja é como um efeito cascata. begin nmFedera.Connected := True. end. ☞ Importante . mas vamos evitar que essa janelinha apareça quando o usuário for usar nosso aplicativo. o Delphi também tinha o seu. perfeito até hoje na construção e desenvolvimento de softwares.Era preciso carregar um Run-Time do Report Smith juntamente com o projeto .Connected := False.Página Nr. o termo é AÇÃO. era uma das melhores ferramentas RAD para se trabalhar com bancos de dados. var Action: TCloseAction).Relatórios muito simples demoravam uma eternidade para rodá-los PDF criado por: Idelson Pessoa da Silva – idelson@bol.br .nmFederaLogin(Database: TDatabase.

no menu vá em File | Save All.com. Dê logo uma salvadinha no seu projeto. acabamos não fazendo o essencial que é ver primeiro como a ferramenta trabalha.TXT e .Importações em .O Quick é ruim . Na Component Pallete ache uma página entitulada QReport nela estão todos os objetos utilizados pelo Quick. PDF criado por: Idelson Pessoa da Silva – idelson@bol.HTML . e isso não é muito fácil de assimilarmos.entre milhares de outras coisas Aí.Biblioteca Printers (do próprio Delphi) Esta última deu origem a vários geradores de relatórios e o principal surgido foi o Quick Report que se tornou um mero coadjuvante do Delphi 2. Vocês verão que esse terrível monstro horroroso de duzentas cabeças (que cada dia cresce uma) na verdade não passa de um horroroso monstro terrível de duzentas e uma cabeças. Não pretendo dizer aqui que o Quick é o melhor gerador de relatórios que existe para o Delphi.pas (o Delphi está se referindo do nome do formulário) mude para fEstado. Bem vamos deixar de ladainha e começar a trabalhar. Vamos aos passos: 1. a própria Inprise abriu mão de um gerador dela (caso do Report Smith) para trocar por um de uma empresa de terceiro (QuSoft AS).. 54/178 . localize o objeto chamado QuickRep. entre elas aqui vale destacar: . o Quick é um gerador de relatórios totalmente orientado a objetos. para tanto. 2. acredito sempre que a melhor ferramenta é aquela que você domina e conhece.PAS 3.Fichas de Caixa.Página Nr. clique nele e em seguida click no formulário. Então para ajudá-los sempre tentarei utilizá-lo como uma ferramenta não só para gerar relatórios.. Aonde aparece Unit1. todos colocam milhares de substitutos.0 resolveu-se não mais distribuir o Report Smith tornando o Quick o gerador oficial do Delphi.1.Report Builder .Report Crystal . Construindo o formulário para uma região genérica Não pretendo aqui construir um formulário para cada região (teve gente que suspirou de alívio). em listas de discussão é comum você ver coisas como: .: 2.0 fazendo parceria com o Report Smith e em pouco tempo tornou-se óbvio que o Quick era muito superior ao Smith tanto que a partir da versão 3.Formulários de Consultas .Relatórios Analíticos . mas também para: . mas veja bem.Então os Delphianos da época procuravam alternativas. mas sim um único que servirá para qualquer região que o nosso usuário clicar. Balancetes e Outros. A partir do Menu Principal clique em File | New Form e será disponibilizado um novo formulário e altere logo a propriedade name para F_Estado.Relatórios complicados são impossíveis fazê-los . Será que isso tudo foi porque o Quick é ruim ? Acho que muitas vezes quando não conhecemos ou tentamos aprender uma ferramenta.É difícil de construir algo nele .br .

Título da Página. Linhas Detalhes. pois nossos (e qualquer) relatórios tem essas seções. Vamos para a Object Inspector e altere as seguintes propriedades: 6. localize o objeto chamado QrBand.2. clique nele e em seguida click dentro do objeto da objeto BdCabPagina criado anteriormente . BandType para rbPageHeader . clique nele e em seguida click dentro do objeto do QrEstado (não é dentro daquela primeira banda criada). 6.br . Dentro do Quick devemos usar os objetos do Quick (isso parece óbvio mas muita gente esquece disso) o correspondente ao objeto Label do Delphi que mostra um texto fixo no Quick é o QrLabel. 4.Essa é a propriedade que controla os tipos das seções no caso escolhemos uma Banda de Detalhe.41. 10. Na Component Pallete na página QReport.☞Importante . Font: Clique nos ". Estilo: Negrito 8.Município: Região: Descrição: PDF criado por: Idelson Pessoa da Silva – idelson@bol. AlignToBand para True . 8. Caption para Estado do Brasil 9. Rodapé da Página.42.. Tamanho: 16 8.5. localize o objeto chamado QrBand. e assim vai. Vamos para a Object Inspector e altere as seguintes propriedades: 10. clique nele e em seguida click dentro do objeto do QrEstado criado anteriormente. Última Página. ela será replicada a cada registro e dê uma esticadinha para baixo nela. 55/178 . vamos criar essas seções.43. Vamos para a Object Inspector e altere a propriedade Name para QrEstado ☞Importante . aumentando o tamanho (ou a propriedade Height) 11. Na Component Pallete na página QReport. Na Component Pallete na página QReport.Isso fará com o que foi definido na propriedade Alignment seja estendido para a banda (Então o QrLabel se alinhará centralizado dentro da banda) 8.44. Cor: Azul-Marinho 8. o Quick 1.O objeto vai ficar com a marcação azul e dê seis click's) dentro do objeto BdDetalhe.4.0) não criava esta área branca que vc está vendo.Qualquer gerador de relatório trabalha por seções. Vamos para a Object Inspector e altere as seguintes propriedades: 8. Name para BdCabPagina 6.com. ele se resumia a apenas alargar as proporções do formulário (propriedade Width e Height) para o tamanho de uma página da impressora.Essa é a propriedade que controla os tipos das seções no caso escolhemos uma Banda de Cabeçalho de Página. Name para BdDetalhe 10.1. ela aparecerá em todas as páginas. 5. localize o objeto chamado QrLabel.Foi criado nesse momento nossa área de trabalho. BandType para rbDetail . 7. são elas: Cabeçalho.3.2. o Quick as chama de Bandas.. Name para lbTitulo 8." e faça as seguintes alteções na janela de Fonts: 8. Página Inicial. agora altere a propriedade Caption de cada um respectivamente: Sigla: Nome: Capital: Núm.Página Nr.1.0 (distribuído com o Delphi 2. Alignment para taCenter (alinhamento centralizado) 8. Agora eu vou precisar dentro desta banda de seis (6) objetos QrLabel (é só apertar o objeto enquanto você segura a tecla SHIFT .1. Fonte: Times New Roman 8.2.

. centraliza verticalmente. centraliza horizontalmente.2.2. Todos eles serão organizados à direita. Continue com os objetos marcados e a partir do menu principal vá em View | Alignment Palette será mostrada a seguinte janela: Clique então no último botão da primeira linha. precisaremos de seis (6) objetos dentro do objeto BdDetalhe 16..2. 15.1. Conexão. DataBaseName para dnFedera (isto só aparecerá se o formulário F_Mapa estiver aberto) 14. acredito que a propriedade Width deve ficar em torno de 625 PDF criado por: Idelson Pessoa da Silva – idelson@bol. Cor: Castanho 12. Click nele e clique dentro do formulário e altere as seguinte propriedades: 14.13." e faça as seguintes alteções na janela de Fonts: 12.3. Fonte: Times New Roman 13. Estilo: Negrito 12. AutoStretch para True (permite que o objeto se estique verticalmente) 18. Vamos para a página Data Access e localize o objeto Query. SQL.. AutoSize para False (cancela o esticamento automatico horizontal) 18. ☞ Importante . Faremos agora a 3a..1. clique nos ".2.. Marque agora cada objeto e altere a propriedade DataField de cada um respectivamente: SIG_UF NOM_ESTADO NOM_CAPITAL NUM_MUNICIPIO NOM_REGIAO DES_REGIAO 18. WordWrap para True (só para confirmar . isso só serve para dois ou mais objetos marcados: Primeira Linha: à esquerda.br . clique nos ". Fonte: Times New Roman 16." e faça as seguintes alteções na janela de Fonts: 16. tamanho vertical.1. Está é a 4a. Conexão. tamanho horizontal. 56/178 . espaçamento vertical e à direita.Se você não conhece SQL (Structure Query Language) aconselho que você compre um bom livro.3. Agora estique esse objeto até o final.marcado com a propriedade DataField em DES_REGIAO) 18." e faça escreva: select * from Federacao 14.1.11.. Uma das principais facilidades do Quick é quanto a campos Memo (como é o caso do campo DES_REGIAO) altere as seguintes propriedades (do objeto QRDBText6 .permite que o objeto quebre as linhas) 19. ou veja a apostila referente aos comandos básicos. espaçamento horizontal e inferior 14. Cor: Azul 16.Página Nr.Vamos a uma rapidinha sobre os alinhamentos. Font.3.com. clique nos ". Agora marque todos os seis objetos (lembra-se) e aproveitando o Polimorfismo altere a propriedade Font. Segunda Linha: Superior. Name para QryEstado ☞ Importante . DataSet para QryEstado 17. Agora marque todos os seis objetos e aproveitando o Polimorfismo altere as seguintes propriedades: 16. Voltemos para a página QReport e localize o objeto QrDBText.12.

Codificando a Primeira Região Apenas para guiá-los mostrarei como criar os códigos do mapa da Região Sul você deverá criar os códigos para as outras regiões. 3.Uma enorme vantagem do Quick é você poder ver como fica seu relatório final mesmo sem precisar rodar o sistema. Está pronto.br .com.20. Vamos conectar o objeto QrEstado (TQuickRep) com o objeto QryEstado (TQuery). Observe que novamente é quase tudo igual. para tanto faça o seguinte: 1. private Inclua a seguinte chamada a um procedimento antes da parte private: ImgSC: TImage. 2. compare como ficou: ☞ Importante . para tanto localize o objeto QrEstado e altere a propriedade DataSet para QryEstado. ImgRS: TImage. Novamente no objeto QryEstado altere a propriedade Active para False. No objeto QryEstado altere a propriedade Active para True. ImgRS: TImage.DFM} PDF criado por: Idelson Pessoa da Silva – idelson@bol. Abra o formulário F_SUL e aperte a tecla F12 até que você tenha a janela da Code Editor aberta e localize para mim as seguintes linhas: ImgSC: TImage. private Agora localize a linha: implementation {$R *.Página Nr. 57/178 . procedure MostraEstado(Sender: TObject). Clique no objeto QrEstado e em seguida clique com o botão direito e será mostrado um menu e dentro dele clique em Preview.

Add('SELECT * FROM FEDERACAO WHERE (SIG_UF = ''' + Estado + ''')'). mas veja só.MostraEstado(Sender: TObject). Criei um único procedimento MostraEstado que receberá uma variável do tipo TObject e para este procedimento coloquei um outro procedimento interno. 58/178 . e sim PREVIEW do objeto QuickRep). 4.Clear. e 5.Preview. Free. esses três plicks ( ''' ) é tudo simples. SQL. Criação do Formulário F_Estado. end.DFM} uses fEstado. with F_Estado do begin with QryEstado do begin SQL.br . // Atenção é tudo aspas simples Open. Mostra na tela do relatório (note que não preciso do comando SHOWMODAL do formulário. ☞ Importante . se fizermos: VariavelString := 'Nome : Nando'. Prontinho veja que o procedimento que eu construí aqui é igualzinho ao do F_Mapa. 3. selecione atraves do Combo (aquela setinha apontada para baixo) o procedimento MostraEstado. end. procedure Mostra(Estado: String). end. QryEstado. end. Fecha a Query. QrEstado. PDF criado por: Idelson Pessoa da Silva – idelson@bol. chamado Mostra que realizará os seguintes passos: 1. nenhum é aspas duplas ( " ).No comando SQL. confuso né.Página Nr. Repita os mesmos passos com as outras imagens dos outros estados. E faça as seguintes alterações: implementation {$R *.com. Eliminação do F_Estado da memória.Create(Application). Pois dentro de uma string cada dois plicks simples ( '' ) conseguimos um plicks ( ' ). Organização do SQL para o estado selecionado criando a Query. begin F_Estado := TF_Estado. óbvio salvo alguns comandos. begin if (Sender = ImgPR) then Mostra('PR') else if (Sender = ImgSC) then Mostra('SC') else if (Sender = ImgRS) then Mostra('RS').Close. 2. vá para a página de eventos e para o evento OnClick.Add('SELECT * FROM FEDERACAO WHERE (SIG_UF = ''' + Estado + ''')'). Para ativar todo o conjunto aperte novamente a tecla F12 (para mostrar o formulário) e dê um clique simples sobre o objeto ImgPR aperte a tecla F11 (para chamar a Object Inspector). end.end. // Mostra o Estado procedure TF_Sul.

empacotar e distribuir nosso projeto. mas isto só será feito na próxima apostila. agora execute o projeto e bom divertimento com seu mapa eletrônico.com.A VariavelString terá em seu conteúdo o valor Nome : Nando.br . Então selecione os formulários: F_Estado e clique no botão com o sinal > e despache-o para o lado aonde estão os outros isolando novamente o nosso Menu pois lembrando que ele precisa ser criado automaticamente assim que o usuário iniciar o processo. PDF criado por: Idelson Pessoa da Silva – idelson@bol. A VariavelString terá em seu conteúdo o valor Nome : 'Nando'. Clique no botão Options. 59/178 .Página Nr. Selecione a página Forms lá você verá dois objetos ListBox. Prontinho. agora se fizermos: VariavelString := 'Nome : ''Nando'''. Finalmente Agora precisamos arrumar. Tirando o formulário F_Estado do Auto-Create Vá (a partir do menu principal) em View | Project Manager. Na próxima aprenderemos como distribuí-lo e gerar alguns macetes para otimização. do lado esquerdo são os Auto-Create Forms e do lado direito estão os Available forms ou simplesmente formulários disponíveis. Eu apenas acrescentei mais dois plicks simples entre a palavra Nando.

quando ele é independente de tratamento de banco de dados.Curso de Delphi 4.Página Nr. você se deslocava até a máquina do seu Cliente (que iria instalar o sistema) criava um diretório.0 . e instalava o BDE.Apostila 04 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. SETUP3. colocava o executável.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: GEOGRAPH.ICO. na última apostila montamos nosso segundo aplicativo o Mapa Eletrônico. Na página Compiler desmarque todas as opções dos grupos Debugging e Messages e clique no botão OK.BMP e LOGO. clique em Project | Build All para gerarmos o executável final.0 versão Client/Server Suite BDE 5. nele estava (dividido para caber em disquetes de 1.BMP. o interessante é com ele é que calmamente começamos a desvendar os segredos do trabalho com o Delphi associado a Bancos de Dados.br . aí a coisa complica um pouco.com. tudo bem é só mandar o executável (. mas acredito que após essa parte você começará a dominar uma importante ferramenta de distribuição para seus aplicativos. Mas ainda assim era um tanto primitivo.BMP. SPLASH. 2. principalmente quando você precisava mandar tudo para que o próprio cliente instalasse. Agora. Preparando o sistema para o Empacotamento Antes de gerarmos nossos discos de instalação vamos fazer algumas alterações no projeto então abra novamente o seu projeto.EXE) mas o problema começa quando ele utiliza o BDE. a partir do Menu Principal. O maior problema com o Delphi (depois de entendê-lo) é como distribuir seus aplicativos gerados. repararam como a maior parte dos livros evita em falar sobre o assunto ? O máximo com um aplicativo que arranha a superfície deste fantástico mundo. depois criava o alias.BMP Prefácio Salve.com. existia um diretório no CD do Delphi chamado REDIST. as tabelas. SETUP2. Utilizando o Install Shield No Delphi 1. prontinho agora feche o Delphi confirmando as modificações realizadas no projeto. 60/178 . SETUP1. pois o Delphi tem milhares de possibilidades para realizar esta tarefa. clique em Project | Options e vamos realizar dois serviços aqui: 1.br Pré-Requisitos: Windows 98 Delphi 4. Ou seja. para isso a partir do Menu Principal clique em File | Open localize o arquivo Mapa. Novamente a partir do Menu Principal.0 para distribuir o BDE era uma complicação.BMP. Com um certo tempo as pessoas aprenderam a gerar o Alias automático.DPR. O problema é que o assunto é muito mais do que se pode imaginar.44 Mb) o BDE. PDF criado por: Idelson Pessoa da Silva – idelson@bol.ico). testava e pronto estava instalado. Na página Application coloque o Título do nosso projeto (Mapa Eletrônico) e localize o ícone enviado (Geograph.

PDF criado por: Idelson Pessoa da Silva – idelson@bol. não tente utilizar o InstallShield que vem com o Delphi 2.0.0. Um aviso. o tipo (no caso de versões registradas) e o diretório que será criado.Página Nr.0 ou 4. O InstallShield não é que nem o Quick Report.0 para aplicações do Delphi 3.com.IWZ.Com o Delphi 2. você acabará com a seguinte janela: Esta é a tela inicial para a criação do seu projeto . após isso aperte o botão Create e iremos para a janela de construção do projeto: Esta tela foi dividida em nove grandes grupos. após sua instalação e execução. para explicar melhor vamos analizar grupo a grupo enquanto fazemos as alterações para a geração do nosso pacote. 61/178 .0 e o Delphi 4. você precisa instalá-lo em separado (ele vem no próprio CD do Delphi).br . Que acompanha também o Delphi 3.0 surgiu o InstallShield que foi mais aprimorado ainda nessa versão. ele é um produto da Stirling Technologies. nem vice-versa. informe o nome do projeto. apesar de todos serem de 32 Bits são de versões totalmente diferentes.

marque Partial BDE Installation e clique no botão Avançar..EXE). E finalmente escreva na lista de parâmetros opcionais para o Alias o seguinte: DATABASE NAME=[Program Files]\Basico. Set the Visual Design Neste grupo estão as informações iniciais do instalador: Na primeira parte (Application Information) você deve informar o nome da aplicação (mapa). o Logotipo da sua Empresa (localize o BitMap Enviado: Logo.Step 2 of 4 . em Path é o local que seu banco deverá ser instalado.Clique no botão New e informe o nome do nosso Alias (AlFedera) BDE Alias .. Oracle. 62/178 . ☞Importante .Aqui está todo o pulo do gato sobre a construção do BDE. aqui você definirá qual tipo de BDE será instalado. em Alias Name ele mostrará o Nome do seu alias. Na segunda parte (Advanced) você verá todas as bibliotecas que serão instaladas. teremos então que colocar na mão todos os arquivos necessários.Página Nr. aqui você escolherá o título principal (Mapa Eletrônico). então deixe desmarcado e sigamos em frente. BDE Driver Types .1. Select InstallShield Objects for Delphi Esta é o grupo que mais confunde as pessoas. Note que nesta parte é montado o Diretório que será instalado o sistema final (<ProgramFilesDir>\Curso\Mapa).não escolha nenhum. DB2 e SyBase padrão CT-Lib e os pacotes de objetos servem apenas para o caso de compilações parciais).\Mapa. mas aqui ele não se refere a possibilidade de instalação para Windows 3. agora vamos pensar um pouquinho. BDE Instalation Type . coloque: [Program Files]\ que será o diretório em que ficará sua aplicação.. nela você deve informar se quer que seu BDE seja configurado para aplicações Win16/Win32 ou somente Win32. mas se o usuário mudar o destino ? Aqui usaremos uma variável do Install.x ele apenas está se referindo ao . No Type selecione MSAccess.Step 4of 4 . 2. mas com um pouquinho de atenção a gente chega lá.CFG salvo (que é o arquivo de configuração do BDE 32. apenas clique no botão OK PDF criado por: Idelson Pessoa da Silva – idelson@bol.BMP). BDE Alias .Step 3 of 4 .Assim como o Logo.BMP você notará que no decorrer dessa montagem colocaremos vários Bitmap's. ista permissão é adquirida apenas com a compra de qualquer ferramenta de desenvolvimento Microsoft. o tipo do SQL Links ou se deseja carregar qualquer dos pacotes de objetos do Delphi.Esta e a tela mais enigmática do Install. (Observação: O SQL Links. localizar o executável que deverá ser instalado (C:\.mdb BDE Alias . BDE Alias . marque o BDE. infelizmente o Install não possui permissão para a distribuição da DAO 3. Query Engine Types . que é a responsável pela conexão nativa com o MS-Access.Aqui você define seu tipo de banco de dados.5. serve apenas para conexão com bancos do tipo MS-SQL.Marque a opção SQL Engine isto fará com que o BDE reconheça e envie para o gerenciados de banco de dados os comandos de SQL e clique no botão Avançar.Aqui você precisa apenas clicar no botão Concluir para finalizar todas as inclusões no BDE. a versão (1. a posição em que o logotipo ficará (Top Right .0) e o nome da sua empresa (Curso).com. Prontinho pode dar OK. aqui você escolherá se o usuário pode ou não desinstalar automaticamente o projeto. SyBase padrão DB-Lib. Na terceira parte (Features) preste muita atenção que este é o momento mais difícil.. Na segunda parte (Main Window) é a tela principal da instalação. Informix.Step 1 of 4 . InterBase. deixe todos desmarcados. você mesmo poderá gerá-los mas lembre-se que o InstallShield aceita apenas imagens com no máximo 16 cores.br .Em cima a direita) e a cor de fundo (Dithered Blue .degradê em azul). clique no botão Settings. Na primeira parte (General) são as informações principais.

DLL C:\Windows\System\MSJET35.TLB C:\Arquivos de Programas\Arquivos comuns\Microsoft Shared\DAO\DAO3032.DLL C:\Windows\System\MSREPL35.OLB C:\Windows\System\MSVCRT20. 3. Na pasta BDE/IDAPI Files localize e arraste o arquivo IDDA3532.DLL C:\Windows\System\MSWNG300.com. Select User Interface Components Este grupo é o que comandará a instalação propriamente dita.DLL C:\Windows\System\MSJT3032.DLL C:\Windows\System\VBAJET32.DLL C:\Windows\System\ODBC32.DLL C:\Windows\System\MSJINT35.DLL C:\Arquivos de Programas\Arquivos comuns\Microsoft Shared\DAO\DAO2535. 63/178 .DLL C:\Windows\System\VEN2232.DLL C:\Windows\System\MFC40. Vamos tratá-lo com calma e parte a parte: Welcome Bitmap .DLL C:\Windows\System\ODBCINT.DLL.DLL C:\Windows\System\CTL3D32. clique no botão Add Group e coloque as seguintes informações: Group Name: DAOSystem Destination Directory: <WINSYSDIR> Com o auxílio do botão Insert Files arraste os seguintes arquivos para esta pasta: C:\Windows\System\MSJTER35.DLL C:\Windows\System\MSRD2X35.DLL C:\Windows\System\MSRD2X32.DLL C:\Windows\System\STDOLE2.Página Nr.TLB C:\Arquivos de Programas\Arquivos comuns\Microsoft Shared\DAO\DAO2532.TLB C:\Windows\System\ODBCJT32.DLL C:\Windows\System\MSJINT32.DLL C:\Windows\System\ODBCTL32. é a primeira janela que será mostrada após iniciado o programa de instalação.br .DLL As próximas partes (Components e Setup Types) são utilizadas quando você estiver trabalhando com uma aplicação muito grande aonde existe a divisão em várias partes. Para o nosso caso deixe a opção marcada.e vamos em frente.DLL Group Name: DAO Destination Directory: <CommonFilesDir>\Microsoft Shared\DAO Com o auxílio do botão Launch Explorer arraste os seguintes arquivos para esta pasta: C:\Arquivos de Programas\Arquivos comuns\Microsoft Shared\DAO\DAO350. localize e arraste o arquivo BASICO. você poderá dar também a chance do seu cliente instalar apenas determinadas partes que o interesse. gerando a interface com o nosso cliente. 4.DLL C:\Windows\System\VBAR332. Marque a opções e clique na página Settings e localize o arquivo Splash. Vamos agora criar algumas pastas necessárias para a instalação do DAO.DLL C:\Windows\System\ODBCJI32. segurando e levando) para dentro desta pasta. pode fechar o Windows Explorer. Specify Components and Files Neste grupo você dirá o que o Install realmente levará no pacote: Na primeira parte (Group and Files) faça as seguintes inclusões: Na pasta Program Files aperte o botão Insert Files. PDF criado por: Idelson Pessoa da Silva – idelson@bol.DLL C:\Windows\System\VBAR2232.DLL C:\Windows\System\MSVCRT40.bmp enviado.DLL C:\Windows\System\VBDB32.DLL C:\Windows\System\OLEAUT32.MDB (clicando com o mouse sobre ele.Este é um bitmap de abertura.DLL Group Name: VBFiles Destination Directory: <WINSYSDIR> Com o auxílio do botão Launch Explorer arraste os seguintes arquivos para esta pasta: C:\Windows\System\OLEPRO32.

Para o nosso caso desmarque a opção.BMP. Para o nosso caso deixe a opção marcada. Como acertamos no BDE podemos deixá-la marcada para que o nosso cliente decida.Esta é uma janela de boas-vindas com uma mensagem para o nosso cliente sobre o sistema. ou se você prefere das regras de uso para o nosso aplicativo. Para o nosso caso deixe a opção desmarcada. bastando para isso alterar na página Settings. novamente você pode modificar o conteúdo criando um arquivo texto (formato . Vá para a página Settings e localize o diretório dos bitmaps enviados (SETUP1. 64/178 . nome da empresa e o número de registro do nosso software. Não queremos corromper essa área de registro do nosso cliente.com. para tanto na página Settings identifique o número identificador do sistema e o número do telefone ou então desmarque a opção. Make Registry Changes Esta página deve ser tratada com o carinho e o respeito que ela merece. Setup Type .Aqui é aonde nosso cliente poderá escolher qual o drive e a pasta que o sistema será instalado. aqui é possível colocar um para cada mídia instalada.São cartazes que fazem a propaganda do nosso software ou de outros que produzimos. Para o nosso caso deixe a opção marcada.Aqui são informações do nosso cliente: seu nome.BMP).BMP. Readme Information . Setup Complete . pois aqui faremos as modificações na área de register do Windows. Para o nosso caso deixe a opção marcada.TXT) e o localizando através da página Settings. mas não poderá modificar as instruções em Inglês (apenas na versão registrada). infelizmente ela é totalmente em inglês. qual a parte que ele quer que seja instalada.TXT) e o localizando através da página Settings. (para o nosso caso ela será colocada em C:\Arquivo de Programas\Curso\Mapa).Esta é uma subdivisão da parte anterior aonde o cliente escolherá (a partir da opção Customizado da janela anterior. basta apenas nomeá-los em SETUP1. então calma e muito sangue frio aqui.Aqui esta a famosa janela da Licença de uso.Em casos de sistemas muito grandes é aqui que o cliente decidirá qual o modo que ele quer que seja instalado o sistema.Aqui aparecerá uma janela que permitirá alterar o nome do grupo que será criado no Windows para colocar nossos ícones do projeto. mas não poderá modificar as instruções em Inglês (Apesar de que ela se reduz a um simples Information) se você quiser crie-o ou então desmarque a opção.Muitas empresas processam o registros dos softwares de forma automática. Software Licence Agreement . mas de qualquer forma deixe esta opção marcada.BMP e SETUP3. só pode ser modificada na versão registrada do produto.Uma barra que acompanhará o processo de instalação mostrando ao cliente o quanto falta (em percentual) para a conclusão da instalação. SETUP2. Para o nosso caso deixe a opção desmarcada.Aqui será mostrado o arquivo LeiaMe inicial. ou mostrar um arquivo Leiame final. User Information . Select Program Folder .É aqui que o cliente vê todas as opções que ele escolheu anteriormente. Para o nosso caso desmarque a opção. SETUP2. Online Registration . aqui você pode escolher se o cliente deve dar um Reboot na máquina (que é aconselhável). você pode modificar o conteúdo criando um arquivo texto (formato .Welcome Message . Compacto ou Customizado.BMP e assim sucessivamente dependendo do número de discos que produzimos. podendo voltar atrás e modificar algo antes da instalação propriamente dita. Start Copying Files . Custom Setup . PDF criado por: Idelson Pessoa da Silva – idelson@bol. Billboards .Página Nr. Choose Destination Location .br . bastando para isso que o cliente possua um Modem. Tudo. Para o nosso caso deixe a opção desmarcada. Progress Indicator .Este é o último passo do processo. Clique no botão OK para finalizar 5. Para o nosso caso deixe a opção marcada.

Agora crie a seguinte Chave na página Registry .DLL PDF criado por: Idelson Pessoa da Silva – idelson@bol. Na página Registry . 65/178 .Keys: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\DAO35 Crie o seguinte Valor para esta chave na página Registry .5 também precisamos repetir essa operação na máquina que será instalado o nosso sistema..Values: Value Type: String Value Name: Path Value Data: <CommonFilesDir>\Microsoft Shared\DAO\Dao3032.Values e clique no botão Add Values e proceda as seguintes alterações: Pronto. crie a chave SOFTWARE.Página Nr.Values: Value Type: String Value Name: Path Value Data: <CommonFilesDir>\Microsoft Shared\DAO\DAO350. clique no botão OK.Keys abra a chave HKEY_LOCAL_MACHINE e clique no botão Add Key.. clique nesta nova chave e vá repetindo a operação criando a seguinte estrutura: HKEY_LOCAL_MACHINE\SOFTWARE\Borland\DataBase Engine\Settings\DRIVERS\MSACCESS\INIT Deixe marcada a última chave INIT e clique na página Registry .br .Keys: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\DAO Crie o seguinte Valor para esta chave na página Registry .Como modificamos a versão do DAO em nosso BDEAdmin para 3.dll Crie a seguinte Chave na página Registry .com.

6. existe uma caixinha para marcar que está escrito: Place Icon and Start Programs Menu. ☞Importante . para o registro do aplicativo. tais como: Arquivos TXT .br .Não se esqueça que depois. Importante . escolha a midia que será gerado e clique no botão Build.Página Nr. criamos uma tecla de atalho rápido para sua execução ou até mesmo iniciá-lo quando o Windows for iniciado.44Mb) normalmente apenas o BDE ocupa 2. este grupo divide-se em: General . sob o ambiente Windows 95 ou superior.Se você instalar o sistema a partir da rede escolha a opção CD-Rom pois aí será uma única mídia. Specify Folders and Icons Aqui será mostrado os Ícones (dos Arquivos) que serão instalados dentro do grupo escolhido. entre outros.Aqui podemos modificar o destino dos nossos arquivos.Para o aplicativo iniciar assim que o Windows iniciar na página Advanced. o seu pacote na mídia selecionada. Finalmente Agora você já pode mandar todo o seu projeto para aquele cliente especial. ☞ Importante . ☞ Importante .Readme iniciais.Gere seu pacote em disquetes de 1. Create Distribution Media Neste último grupo você poderá copiar totalmente. para removê-lo. Advanced Settings . Para realizar a instalação siga essas instruções: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Aonde é possível adicionar novos ícones. Test the Installation Aqui você pode testar como ficou seu pacote. tudo foi informado e agora é o grande momento a geração do nosso pacote. ou parcialmente. lembre-se que antes eles devem ter sido colocados pelo grupo Specify Components and Files.5 disquetes então é comum sistemas darem de 3 ou superior. o ícone. Arquivos HLP . espere o término do processo e veja em quantas mídias foram geradas o seu pacote. calcule que seu sistema caberá em simples 7 disquetes. 66/178 . mas o melhor mesmo é você colocá-lo em disquetes e levá-lo para uma máquina que não tenha o Delphi instalado. acompanhando eventuais erros. basta apenas embalá-lo e despachar com as famosas instruções: Como Instalar O Mapa Eletrônico só pode ser consultado depois de instalado no seu Microcomputador. você precisa ir em Painel de Controle | Adicionar ou Remover Programas para que o Install proceda a retirada das entradas nas áreas de registro do Windows.com.Contendo um arquivo de auxílio para a aplicação. 9. 8. Run Disk Builder Pronto.44Mb e copie para os disquetes para proceder a instalação assim você poderá acompanhar a mudança das telas a cada disquete solicitado. Contando que o DAO normalmente ocupa 3 Disquetes ou mais. ☞ 7.Não se assuste com o número de disquetes (1. ☞ Importante .

com. 5.br . Introduza o disquete marcado como INICIAL na unidade de leitura 3. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Click sobre o botão OK e execute as instruções do Instalador. 67/178 . Ligue o Microcomputador ativando o Windows 2.Página Nr. Um abraço e até a próxima. Digite então A:\SETUP (ou no lugar do A. Clique no botão INICIAR e escolha a opção EXECUTAR 4. Acredito que seu usuário não errará esses 5 passos. a letra equivalente ao drive da sua unidade de leitura do disquete).1.

são apenas três letrinhas mas que confundem e complicam a vida da maioria dos programadores. BorderStyle: bsDialog (Fará com que a janela fique no formato padrão de uma janela de mensagens) 3. 1.. Position: poScreenCenter (Fará com que o formulário fique sempre centralizado quando for executado) 4. Olhe na Object Inspector e altere a propriedade Name para ListaAlias.1.INSERT . mas antes de começar crie uma pasta que abrigará seu projeto. garanto que será a diferença entre um sistema que apresentará facilidades imensas e dará poderes extraordinários para o nosso usuário.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: SQL. mas é uma imensa mão na roda para testarmos nossos aplicativos futuramente.Curso de Delphi 4.DELETE Na apostila em anexo.2. e altere as seguintes propriedades: 3. agora que estamos familiarizados com o ambiente SQL (espero que você tenha lido a apostila em anexo antes de começarmos). basicamente a linguagem SQL contém 4 comandos: .3.0 versão Client/Server Suite BDE 5. explica-se exatamente a função de cada comando. Caption: Executa instruções SQL (Conteúdo da tarja do formulário) 3. então vamos começar mais um projeto Projeto 3 .SELECT .com. temem o maior de todos os pesadelos: o SQL (Structured Query Language). um conselho dominando essa simples (porém complexa) linguagem. noto que a maioria das pessoas quando começam a programar em Delphi. no menu vá em File | Save All.Apostila 05 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.WRI Prefácio O nosso projeto para essa apostila será um tanto bobinho.: PDF criado por: Idelson Pessoa da Silva – idelson@bol. 3. Name: F_SQL (Nome interno do formulário) 3.Construtor de SQL Bem.0 .br Pré-Requisitos: Windows 98 Delphi 4. siga um passo atrás do outro. vamos para as nossas receitas de bolo. aqui vamos nos ater ao Delphi. por exemplo Gera SQL. para tanto.4.UPDATE . Dê uma salvadinha no seu projeto.Página Nr. Na Component Pallete localize uma página chamada Standard e dentro dessa página de um clique no objeto ListBox (acredito que seja o nono) e dê um clique no Form. Pegue outro objeto ListBox e dê um clique no Form e altere a propriedade Name para ListaTabela e altere a propriedade sorted para True isto fará a ordenação alfabetica dos nomes da lista.. Vá na Object Inspector e localize o objeto Form1 (basta clicar no Combo Box para selecioná-lo). enviada junto com esta.com.br . 68/178 . 2.

5.1. Glyph: Altere para cada um respectivamente: CHECK.2.. Aonde aparece Unit1.42. e elimine todo o seu conteúdo 6. DataSource: DataSource1 (faz a ligação com um objeto DataSource) 13.BMP 9.4.1. Cor: Castanho 3.. Caption: Altere para cada um respectivamente: Selecione o Alias: Tabelas Disponíveis: Digite a clausula SQL 9. Para finalizar na Component Pallete vá para a página Data Controls e localize agora o objeto DbGrid (acredito que seja o primeiro) e através da Object Inspector altere a propriedade: 12.. ShowHint: True 9.1. DataSet: Query1 (faz a ligação com um objeto Query ou Table) 12.2. coloque-os acima dos três objetos criados anteriormente." e faça as seguintes alterações na janela de Fonts: 3.41. 8. Quando terminar clique dentro da Component Pallete na setinha para poder desmarcar o objeto Label. Terminamos.BMP CLEAR.dpr (o Delphi está se referindo do nome do projeto .Página Nr. Label2 e Label3) 7. como se ficasse marcado) e dê três cliques no Form.PAS 4. Name: Altere para cada um respectivamente: ButExecuta ButLimpa 10. para tanto pressione a tecla SHIFT e clique no objeto Label (deve ter ficado um quadriculado azul em volta do objeto. Na Component Pallete novamente na página Standard e localize agora o objeto Memo (acredito que seja o quinto) e através da Object Inspector altere as seguintes propriedades: 5.DPR 5. Flat: True (faz com que o botão fique liso no form) 9.pas (o Delphi está se referindo do nome do formulário) mude para fSQL.que será o nome do executável final) mude para GerSQL. Hint: Altere para cada um respectivamente: Executa a instrução SQL Limpa a instrução SQL 9. Na Component Pallete vá para a página Data Access e localize agora o objeto Query (acredito que seja o terceiro) 11. Altere as seguintes propriedades para esses três objetos: 8. Precisamos agora de três objetos Label's. Na mesma página Data Access e localize agora o objeto DataSource (acredito que seja o primeiro) e através da Object Inspector altere a propriedade: 11. Lines: Clique nos ..3. Na Component Pallete vá para a página Addicional e localize agora o objeto SpeedButton (acredito que seja o segundo) e traga dois para o form e através da Object Inspector altere as seguintes propriedades: 9.br . 69/178 .2. Estilo: Negrito 8. (automaticamente o Delphi criou oito objetos chamados respectivamente Label1.1.1.com.1.4. Aonde aparece Project1. compare como ficou: PDF criado por: Idelson Pessoa da Silva – idelson@bol. Font: Clique nos ".

Count . basta apenas meter a mão no programa. exit. Este procedimento se encarregará de carregar o nosso objeto ListBox com a lista do nome de todos os Alias existentes e transferir o primeiro nome carregado para a propriedade Databasename do objeto Query1.SelCount = 0) then begin MessageDlg('Selecione primeiro algum Alias'.0). agora basta apenas digitar as instruções SQL no objeto MEMO1 e pressionar o botão para executá-lo. begin Session. end. Localize na Object Inspector o objeto F_SQL. insira o seguinte código: procedure TF_SQL.Items. // Mostra os itens da lista não resolvida Screen. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. Query1. dê um duplo clique na área em branco.com. var i : integer. begin if (ListaAlias. mude para a página de eventos (Events) e localize o evento OnShow. insira o seguinte código: procedure TF_SQL.Items).br . inicialmente será mostrado todos os alias que existem no BDE Administrator após a escolha de qualquer um deles.GetAliasNames(ListaAlias.Codificando Tudo pronto.mtError. 15. a idéia deste projeto apesar de simples pode parecer um pouco complicada.DataBaseName := ListaAlias.Página Nr. end. Localize na Object Inspector o objeto ListaAlias e na página de eventos (Events) localize o evento OnClick.FormShow(Sender: TObject).[mbOk]. 14. mas vamos devagar. dê um duplo clique na área em branco.Cursor := crHourGlass.1) do if ListaAlias.Selected[i] then begin PDF criado por: Idelson Pessoa da Silva – idelson@bol. serão mostradas as tabelas disponíveis. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. for i := 0 to (ListaAlias.ListaAliasClick(Sender: TObject).Items[0]. 70/178 .

SQL := Memo1. Modifica novamente o cursor para o formato padrão ☞Importante .1. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. except MessageDlg('Comando SQL está inválido'.'. end. try ExecSQL.Cursor := crDefault. esses três comandos indicados anteriormente diferentemente do comando SELECT não geram o que chamamos em SQL de uma cadeia de códigos. end. não gerando nenhuma espécie de retorno e para sorte o EXECSQL suporta o comando SELECT. Do primeiro ao último da lista (aonde o primeiro é 0 e o último é o número de elementos .GetTableNames(ListaAlias. insira o seguinte código: procedure TF_SQL. UPDATE e DELETE tive que usar de uns macetes que acabaram se tornando interessantes.Interrompe o laço mandando o comando para o próximo comando após o laço. mas para possibilitar que o usuário possa fazer uso dos comandos INSERT. mtInformation. Transfere o nome do alias para a propriedade Databasename da Query1 3. except end. begin with Query1 do begin if Active then Close.Lines. Modifica o cursor para o formato de uma ampulheta 3. Session.1.2. Exit . While e Repeat) são eles: Break . end. muito desses comandos sequer foram falados. end. Verifica se a query1 está aberta se estiver fecha ela 3.Items). Localize na Object Inspector o objeto ButExecuta e na página de eventos (Events) localize o evento OnClick. try Open.Existem dois comandos que cancelam laços de repetições (Comandos For.br . Verificação (de rotina) se realmente algum alias foi selecionado da lista 2. 16.1. eles não me dão uma resposta em uma lista.Página Nr. o evento é disparado assim que qualquer dos Alias da nossa lista for selecionado: 1. [mbOk]. mtError. ou seja. dê um duplo clique na área em branco. 0). ao invés disso preciso usar o comando EXECSQL que apenas dispara esses comandos para o banco de dados.with Query1 do if Active then Close.Interrompe o laço terminando o procedimento ou função.1) 3.4.1.Items[i].DataBaseName := ListaAlias. break. ListaTabela.. true. SQL. Screen.. 0).ButExecutaClick(Sender: TObject). PDF criado por: Idelson Pessoa da Silva – idelson@bol. [mbOk]. então vamos por partes. 71/178 .1. Não se preocupe em não entender nada aqui. Carrega a lista dos nomes das tabelas do alias selecionado 3. MessageDlg('Instrução Executada. Query1.''.3. então não posso utilizar-me do comando OPEN para eles.Clear. Interrompe o laço 4.Items[i]. Verifica se é este o alias selecionado e se for 3.1. false. Aqui até que poderia ser tudo simples.com. O comando Break só pode ser usado dentro de um laço de repetição enquanto que o comando Exit pode ser usado dentro de procedimentos ou funções livres de um laço de repetição. end. meu problema estava no seguinte.

1. Para sanar ambos os problemas construí um bloco de proteção try.. end. 17. Vamos dar uma olhada então como ficou a lógica do procedimento: 1.com. dê um duplo clique na área em branco...') transferindo automaticamente para a instrução entre o except.. a única função deste botão é limpar o conteúdo do objeto Memo1. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor..1. quando terminar o aplicativo verifica se o objeto Query1 ficou aberto. Automaticamente o Delphi criará para você a chamada ao evento e o transferirá para a Code Editor. Mostra uma mensagem dizendo que está tudo bem 5. Transfere o conteúdo das linhas do Memo1 para dentro do SQL da Query1 4.end. Agora ficou fácil.FormClose(Sender: TObject.... begin Memo1. Em caso de erro no bloco de proteção coloca uma mensagem de alerta Observação Interessante: Existe também o bloco de proteção try.Além desse problema o usuário poderia digitar um comando errado. na página de eventos (Events) localize o evento OnClick. begin with Query1 do if Active then Close. basta apenas você disparar F9 para continuar. que protege os comandos. algo como: Maria tinha um carneirinho.end.3. Aqui também é simples.. 18. insira o seguinte código: procedure TF_SQL.. Limpa o parâmetro lines da Query1 3. ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol. insira o seguinte código: procedure TF_SQL.finally..2. Abre um bloco de proteção 4.Você pode desativar isto. dê um duplo clique na área em branco.. ou Variavel_Inteira := 'Maria tinha um carneirinho.Clear. e em caso afirmativo fecha ele. escreva um código esquisito para o objeto Memo1 (por exemplo digite: Maria tinha um carneirinho. e clique no botão para executar o SQL note que automaticamente o Delphi interrompe a execução do programa e assume o controle.. esses comandos protegem os códigos que estão entre o try. Em caso de erro no bloco de proteção apenas segura e não faz nada 4. end.2.. var Action: TCloseAction).Lines. Executa o comando SQL 4.end.except. Localize na Object Inspector o objeto ButLimpa. o que me daria um erro que travaria totalmente meu aplicativo (causando uma falha do programa)... na página de eventos (Events) localize o evento OnClose. Ativa um novo bloco de proteção 4. Abre a Query1 4.. mas ainda aqui vale uma pequena observação.. Localize na Object Inspector o objeto F_SQL. e na página Preferences no bloco Debugging desative a opção Break on Exception. 72/178 .2. Finalmente Prontinho você já pode executar seu aplicativo. Verifica se a query1 está aberta se estiver fecha ela 2.br ... Importante .ButLimpaClick(Sender: TObject). para tanto a partir do Menu Principal vá em Tools | Environment Options.except e caso acontece erro em algum deles (por exemplo um comando assim: Variavel_Inteira := 10/0.2.. e acontecendo ou não o erro executa obrigatoriamente os comandos localizados entre o finally.Página Nr. não se preocupe isso acontece apenas em modo Run-Time se você executar o aplicativo fora do Delphi você não passará mais por isso e verá que seu aplicativo consegue controlar o erro eficazmente.end..

vou tentar algo mais "ousado" a partir de agora.com.br . mas teve um pequeno problema no caminho. 1º Dia de entrevistas com o usuário: Programação alimentar para o emagrecimento Um novo hábito em vez de uma nova dieta este é o lema da nossa empresa. esta empresa trabalha basicamente com o conceito de SPA (vulgarmente conhecidos como Campo de Concentração para Gordinhos). Portanto feche o Delphi e o micro. Já sabemos que 90% das pessoas que fazem uma dieta para emagrecer recuperam PDF criado por: Idelson Pessoa da Silva – idelson@bol. antes de começarmos devo dizer que este será o projeto mais longo e completo que já fizemos no decorrer deste curso. mas em compensação é a mais importante. Projeto 4 . a de hoje considero a mais chata.0 . mas a idéia basica de que se precisa é: De um cadastro organizado e completo de cada cliente. pegue papel e caneta e vamos ao trabalho. aquele cara que sentava atrás de um teclado e ficava simplesmente desenvolvendo programas maravilhosos que o usuário acabava achando confuso e complicado de usar. 73/178 .Curso de Delphi 4.com. Ela (a empresa) não sabe qual o tipo de sistema que quer. Com base nisso ao invés de me restringir a apenas ensinar macetes e dicas quentes. para quem gosta de colocar a mão na massa vai se decepcionar hoje. e De um acompanhamento pós-programa do Cliente. tentar dar uma visão do mundo externo para vocês com projetos reais. A seguir você encontrará a síntese dessas entrevistas.Página Nr. Começaremos desde a fase da entrevista com os usuários responsáveis até a finalização com a instalação dos módulos. Primeiramente.00 MS-Access 97 Prefácio Salve. que irá assegurar a manutenção do peso ideal após o final do tratamento. De um controle individual da criação dos programas alimentares. a primeira com o médico-diretor geral da Empresa que recebe e define o programa do cliente. Então foram realizadas três entrevistas. a segunda com o responsável pelos cardápios da alimentação e a terceira com o médico nutricionista da empresa responsável pelo acompanhamento pós-programa. atualmente não existe mais a figura do programador.Apostila 06 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. pois a única massa que usaremos será a cerebral. Vale uma pequena observação aqui: Apesar de todos os dados se aproximarem o máximo possível da realidade todas as empresas que serão abordadas e criadas aqui serão totalmente fictícias. caso numa dessas loucuras da vida a empresa exista (cada dia é criado uma nova mesmo) todos os dados foram criados exclusivamente por imaginação e não existe nenhuma relação com a realidade. portanto dividi este projeto em diversas apostilas.0 versão Client/Server Suite BDE 5. Então porque fazer um curso de Delphi (ou qualquer outra ferramenta) apenas para apenas aprendermos a linguagem ? Sendo que seria muito mais fácil consultar o manual.br Pré-Requisitos: Windows 98 Delphi 4. é importante ter em mente a necessidade de se chegar a um novo hábito alimentar. Iniciando A companhia Antes & Depois nos contratou para que criassemos um sistema que agilizaria o trabalho rotineiro.Analizando o SPA Antes & Depois Cia.

já que não leva em conta as grandes variações de gasto metabólico de uma pessoa para outra. churrascos e qualquer circunstância que o obrigue a sair da rotina. sempre dentro de um mesmo grupo. como jantares festivos. provavelmente tem um metabolismo que consome muita energia. que são utilizados apenas em trabalhos de pesquisa. Grupo 1 VEGETAIS DE BAIXÍSSIMO TEOR CALÓRICO ABOBRINHA ALFACE BRÓCOLIS ESCAROLA NABO REPOLHO TOMATE ACELGA ALMEIRÃO CARURU ESPINAFRE PEPINO SALSÃO AGRIÃO AZEDINHA CHICÓRIA MAXIXE PIMENTÃO SERRALHA AIPO BERTALHA COUVE NABIÇA RABANETE TAIOBA PDF criado por: Idelson Pessoa da Silva – idelson@bol. Equilíbrio. emagrece muito lentamente. Lembre-se que o objetivo principal é o desenvolvimento de um novo hábito alimentar. mesmo comendo pouco. Sempre haverá uma maneira de planejar uma alimentação adequada que se adapte ao seu estilo de vida. Comendo todo dia as mesmas coisas você não estaria evoluindo na busca de um comportamento alimentar diferente daquele que o levou a engordar. buscar sempre um resultado definitivo. Sabemos também que ficar engordando e emagrecendo é pior para a saúde do que simplesmente manter-se obeso. este método é muito falho. refeições rápidas. tentando desta forma obter resultados mais rápidos. É muito comum as pessoas saltarem refeições sempre que estão sem fome. almoço. o que não é recomendável. Para isso. mas não se deve ficar mais de 4 horas sem comer. A seguir você verá os 8 grupos básicos na composição de dietas para emagrecimento. uma vida profissional muito agitada ou porque jantam fora todas as noites. A alimentação deve ser voltada para o equilíbrio do metabolismo. que representavam um período de sacrifício. você precisará conhecer a composição dos alimentos. Através da tabela você poderá substituir os alimentos à vontade. Flexibilidade. onde o teor calórico e a proporção de carboidratos. Alimentação sob-medida. Tudo isso pode ser contornado. respeitando seus hábitos e seu paladar. elas devem estar distribuídas em proporções apropriadas. Além de conter uma quantidade adequada de calorias. colação (refeição ligeira entre o desjejum e o almoço). As pessoas deixavam inclusive de comparecer a festas e reuniões sociais que pudessem representar uma ameaça ao seu programa alimentar rigoroso. Uma parte importante do nosso gasto energético vem da própria metabolização dos alimentos. Por exemplo. onde as quantidades planejadas de cada alimento não precisam ser rigorosamente respeitadas nem o paciente é obrigado a evitar compromissos sociais onde alimentos "proibidos" serão servidos. você mesmo poderá elaborar seu cardápio. lanche.com. você estará apto a manipular sua alimentação para adaptá-la às mais diversas ocasiões. Emagrecer não é fechar a boca. Conhecendo as possibilidades de substituições que a tabela oferece. principalmente as mais gordurosas. Se você tem o hábito de dormir logo após o jantar. entre carboidratos. Algumas pessoas acham que não podem emagrecer porque têm um horário muito irregular. fome. proteínas e gorduras serão semelhantes (equivalentes). Esqueça aquela idéia antiga do emagrecimento através de dietas. maneiras práticas de se estimar quanto uma pessoa queima em calorias. A tendência mundial tem sido de recomendar programas alimentares flexíveis.desjejum (café da manhã). no entanto. Devemos. 2º Dia de entrevistas com o usuário: Como são montados os cardápios A tabela de alimentos equivalentes é uma lista de substituições. entre 1500 e 1800 Kcal. ou consumidas com moderação.br . Um programa de alimentação ideal deveria conter 6 refeições diárias . consultando a tabela de alimentos equivalentes ou o dicionário. Também é importante distribuir adequadamente as refeições. se o paciente já relata na consulta que. Além disso. 74/178 . mantendo-o sempre atrativo e saboroso. portanto. não é necessário incluir a ceia. Algumas comidas devem ser evitadas.depois todo o peso perdido. Existem. Infelizmente. Já uma pessoa que tenha engordado porque ingere uma quantidade exagerada de calorias e conta que emagreceu rapidamente durante um período de contenção alimentar. que permitirá a manutenção do peso dentro de uma faixa ideal. Sua alimentação deverá conter entre 1000 e 1200 Kcal para que o tratamento não seja muito demorado.Página Nr. Cada pessoa precisa de um determinado programa alimentar para emagrecer de forma saudável e equilibrada. Existem fórmulas para se calcular a quantidade de calorias a ser ingerida diariamente. Este paciente poderá emagrecer bem com uma quantidade de calorias maior. que deve ser sempre consultada para que a alimentação não se torne monótona. jantar e ceia. Este gasto energético só pode ser medido através de aparelhos sofisticados e caros. proteínas e gorduras. provavelmente seu gasto metabólico é baixo. Os horários não precisam ser obedecidos rigorosamente. fraqueza e mau humor.

MEIA FRUTA BANANA OURO .1 TERÇO DE BIFE ARROZ .4 COLH.MEIO PEQ.1 PEQUENA MAÇÃ . DE SOPA FARINHA .3 COLH. PÃES.MEIO COPO SALADA DE FRUTAS .1 MÉDIA ASPARGO CENOURA ERVILHA BERINGELA CHUCHU PALMITO BETERRABA COGUMELO QUIABO PDF criado por: Idelson Pessoa da Silva – idelson@bol.4 BAGOS JAMBO .25 GRAMAS CAMARÃO .Grupo 2 VEGETAIS DE BAIXO TEOR CALÓRICO (2 colheres das de sopa equivalem a 1 porção) ABÓBORA CEBOLA COUVE-FLOR VAGEM Grupo 3 FRUTAS ABACAXI .2 COLH.1 FATIA PASTEL . QUEIJOS E OVOS CABRITO .1 PEQUENA BANANA PRATA .4 COLH.3 COLHERES TANGERINA .1 PEQUENA CAJÁ-MANGA .2 MÉDIAS UVA .1 FATIA PÃO FRANCÊS . 75/178 . DE SOPA BATATA INGLESA .1 COLH.1 COLH.10 FRUTAS Grupo 4 CEREAIS.10 FRUTAS KIWI .1 MÉDIA MANGA .2 MÉDIOS FRAMBOESA . PIZZA .1 PEQUENA BISCOITO CREAM CRACKER .1 PEQUENO CARAMBOLA .1 MÉDIO LIMA DA PÉRSIA .1 MÉDIA PASSA .1 TERÇO DE BIFE FRANGO .br .2 COLH. DE SOPA MACARRÃO .2 EMPADA . DE SOPA MAISENA . PIPOCA . DE SOPA PÃO DE CENTEIO .1 FATIA PEQUENA NÊSPERA .2 MÉDIAS BANANA D'ÁGUA .MEIA FRUTA TÂMARA .1 PEQUENO CEREJA . DE SOPA GRÃO DE BICO .1 PEQUENA MEIXA .1 PEQUENA MAMÃO .2 COLH.1 TERÇO DE BIFE CAVIAR .1 PEQUENA PITANGA .10 FRUTASNECTARINA .2 CORN FLAKES .1 FATIA PÃO DE GRAHAM .3 COLH.1 TERÇO DE BIFE CARNEIRO .2 MÉDIOS CARNE SECA .1 PEQUENO MELÃO .6 FRUTAS FIGO .1 MÉDIO FRUTA-DE-CONDE . BISCOITOS E MASSAS AIPIM .1 MÉDIOCAQUI .1 COLH.10 FRUTAS GOIABA .1 FATIA PÃO INTEGRAL .Página Nr.MEIO COPO BANANA MAÇÃ .1 PEQUENA FAROFA . DE SOPA LASANHA .6 DAS PEQUENAS Grupo 5 CARNES.2 COLH.1 FATIA MÉDIA MORANGO . DE SOPA GERME DE TRIGO .2 COLH.MEIO BIFE FÍGADO .1 PACOTE PEQ. DE SOPA MILHO VERDE .1 MÉDIA BOLACHA ÁGUA E SAL .1 COLHER DE SOBREMESA DOBRADINHA .1 COPO PEQUENO AMORA .MEIA FRUTA JACA .1 PEQUENA JABUTICABA .4 FRUTAS LARANJA . DE SOPA BATATA DOCE .2 COLH.1 PEQUENA PÃO DE FORMA .2 COLH. DE SOPA ACEROLA .1 PEQUENA CAJU .1 PEQUENA MELANCIA . DE SOPA FONDUE DE QUEIJO .com.2 COLH.1 MÉDIO PIRÃO .1 MÉDIO ROMÃ .1 PEDAÇO MÉDIO AVEIA . DE SOPA LENTILHA .2 COLH.MEIA FRUTA GRAPEFRUIT .1 FATIA PEQUENA MARACUJÁ . DE SOPA NHOQUE .1 MÉDIA DAMASCO .1 PEDAÇO PEQUENO COELHO . DE SOPA FEIJÃO .1 FATIA PEQUENA TREMOÇOS . DE SOPA PANQUECA .1 RODELA PEQUENA ÁGUA DE COCO .3 PEQUENAS PERA . SOPA TORRADA .1 COLHER DE SOPA PÊSSEGO .3 COLH.

1 COPO LEITE INTEGRAL EM PÓ . Apenas os alimentos listados nos grupos 1 e 8 podem ser consumidos à vontade.1 PEDAÇO PEQUENO LULA .1 FATIA PEQUENA SIRI . por exemplo.1 BOLA Grupo 8 BEBIDAS. PDF criado por: Idelson Pessoa da Silva – idelson@bol. que é a quantidade de cada alimento listado em um grupo. os alimentos neles contidos podem ser consumidos sem restrições. que contêm mais carboidratos.1 FATIA REQUEIJÃO .1 COLHER DE CHÁ MANTEIGA .1 COLHER DE CHÁ ÓLEO VEGETAL .LAGOSTA .MEIO COPO PUDIM DIET .1 TERÇO DE BIFE AZEITONA . Não devem ser trocados alimentos de grupos diferentes.1 PORÇÃO PEQUENA OSTRAS .2 FRASCOS LEITE INTEGRAL .com.1 PEDAÇO PEQUENO PERU .1 COLHER DE CHÁ IOGURTE NATURAL .1 PORÇÃO MÉDIA QUEIJO . CONDIMENTOS E DIETÉTICOS DE BAIXÍSSIMO TEOR CALÓRICO ADOÇANTES CHÁ ERVA-DOCE LIMONADA REFRIG.1 COLHER DE CHÁ PATÊ .1 COLHER DE CHÁ BACON . DE SOPA MAIONESE LIGHT .2 FATIAS QUEIJO COTTAGE .1 COPO LEITE DESNATADO . A troca de um alimento do grupo 4 por um alimento do grupo 5.1 PEQUENA VACA .2 FATIAS FINAS OVO DE CODORNA .1 COLHER SORVETE DIET .2 COLHERES RICOTA . podendo desregular os mecanismos cerebrais de regulação do apetite. Mesmo nas refeições onde estes grupos não forem mencionados.2 FATIAS FINAS SALSICHA .1 TERÇO DE BIFE PEIXE .2 COLH. desde que seja mantida em todas as refeições pelo menos uma porção dos grupos 3 ou 4.1 PEDAÇO PEQUENO MEXILHÃO .MEIO COPO IOGURTE DIET .1 TERÇO DE BIFE POLVO . Por outro lado. já que seu teor calórico é considerado desprezível.1 PORÇÃO PEQUENA OVO DE GALINHA .1 PORÇÃO MÉDIA MORTADELA .1 UNIDADE PATO . você poderá consumir: 1 colher de arroz + 1 colher de farofa ou 2 fatias de pão de forma ou batata inglesa + 1 panqueca e assim por diante.1 COLH.1 PEQUENO LINGUIÇA .1 FATIA PEQUENA MAIONESE . Um exemplo: Se o seu programa alimentar tem no almoço 2 porções do grupo 4. implicaria em uma redução do teor de carboidratos da refeição. pode-se transferir um determinado alimento de uma refeição para outra. DIETÉTICOS ALHO CEBOLINHA GELATINA DIETÉTICA MATE SAL CAFÉ COMINHO HORTELÃ ORÉGANO SALSA CANELA CRAVO LIMÃO PIMENTA VINAGRE A unidade básica da tabela é chamada porção.br .MEIA POSTA PEQUENA PRESUNTO MAGRO . 76/178 .1 COLHER DE SOPA SALAME .3 UNIDADES PAIO .Página Nr.3 DE TAMANHO MÉDIO Grupo 6 GORDURAS AZEITE . DE CHÁ MARGARINA .4 MÉDIAS CREME DE LEITE . Se no almoço você também tem 3 porções do grupo 5. pode comer além daqueles alimentos: 1 bife de tamanho médio (cada porção corresponde a um terço de bife) ou 1 posta de peixe + 1 ovo ou 2 fatias de queijo (cada porção dá para 1 fatia) + 2 fatias de presunto e assim por diante.1 COLHER DE CHÁ Grupo 7 LEITES COALHADA .

por exemplo. 77/178 . Na tabela abaixo você encontra o teor calórico médio de alguns doces mais consumidos pelos brasileiros. além de serem pobres em calorias. temperos e bebidas cujo teor calórico é desprezível.com. No grupo 5 estão listados os alimentos constituídos por proteínas e gorduras. por possuir um elevado teor de gordura. No grupo 7 estão o leite e seus derivados. As bebidas alcoólicas estão listadas na tabela abaixo. Por serem menos gordurosos. no entanto. DOCE BALA BANANA CARAMELADA BIS BOLO DE FESTA BOMBA DE CHOCOLATE BOMBOM BRIGADEIRO CHICLETE CHOCOLATE EM BARRA DOCE DE LEITE QUANTIDADE 1 UNIDADE 1 UNIDADE 1 UNIDADE 1 FATIA 1 UNIDADE 1 UNIDADE 1 UNIDADE 1 UNIDADE 1 PEQUENO 2 COLHERES DE SOPA VALOR CALÓRICO 20 kCAL 450 kCAL 40 KCAL 200 kCAL 200 KCAL 120 kCAL 50 kCAL 20 kCAL 160 kCAL 200 kCAL QUANTIDADE 1 dose de 50 ml 1 copo com 300 ml 1 copo com 100 ml 1 copo com 50 ml 1 copo com 50 ml 1 copo com 50 ml 1 copo com 50 ml 1 copo com 100 ml 1 copo com 100 ml 1 copo com 100 ml 1 copo com 50 ml VALOR CALÓRICO 120 Kcal 140 Kcal 110 Kcal 120 Kcal 130 Kcal 120 Kcal 120 Kcal 90 Kcal 140 Kcal 70 Kcal 120 Kcal PDF criado por: Idelson Pessoa da Silva – idelson@bol. Deve ser evitado na medida do possível. Grupo 9 BEBIDAS ALCOÓLICAS BEBIDA Cachaça Cerveja Champanhe Conhaque Gim Rum Uísque Vinho branco seco Vinho branco doce Vinho tinto Vodka Grupo 10 DOCES O teor calórico dos doces é muito variável. com seus respectivos teores calóricos. enquanto os refrigerantes e temperos podem levar a problemas gástricos. Os queijos brancos. No grupo 8 estão listados vários alimentos. seu consumo excessivo pode trazer outros males à saúde. dependendo principalmente do seu conteúdo de gorduras.Página Nr. porque na cobertura ou no molho elas podem carregar grandes quantidades de gorduras e calorias. deve-se dar preferência aos desnatados. Os alimentos do grupo 3 são as frutas. como a ricota. porque é onde se armazena a gordura. O grupo 6 é o das gorduras. pode causar insônia quando ingerido em demasia. Crustáceos como o camarão e a lagosta são ricos em colesterol. O teor de gorduras.br . O café. assim como a gema dos ovos. Cuidado com a pele dos peixes e do frango. Não está relacionado o abacate. constituídas basicamente de carboidratos. porque seu valor nutritivo não é o mesmo. Elas não podem substituir nenhum alimento de outro grupo. assadas ou cozidas. é variável.Os grupos 1 e 2 apresentam a vantagem de acrescentar fibras à alimentação. o cottage e o próprio queijo tipo Minas são menos gordurosos que os outros. já que a fritura as torna mais gordurosas. Sempre que possível as carnes devem ser consumidas grelhadas. Cuidado com as massas e pizzas. Também os alimentos do grupo 4 são constituídos principalmente por carboidratos. Também as carnes brancas são menos gordurosas que as vermelhas. Apesar de não engordarem.

000 Kcal REFEIÇÃO Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia Cardápio com 1.800 Kcal REFEIÇÃO Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia PORÇÕES 1 do grupo 4 + 1 do grupo 5 + 1 do grupo 3 1 do grupo 3 1 do grupo 2 + 3 do grupo 5 + 1 do grupo 4 + 1 do grupo 3 1 do grupo 4 + 1 do grupo 5 1 do grupo 2 + 3 do grupo 5 + 1 do grupo 4 1 do grupo 3 PORÇÕES 1 do grupo 7 + 1 do grupo 4 + 1 do grupo 5 + 1 do grupo 3 1 do grupo 3 1 do grupo 2 + 3 do grupo 5 + 1 do grupo 4 + 1 do grupo 3 1 do grupo 4 2 do grupo 2 + 3 do grupo 5 + 1 do grupo 4 + 1 do grupo 6 + 1 do grup 3 1 do grupo 3 PORÇÕES 1 do grupo 7 + 1 do grupo 4 + 1 do grupo 5 + 1 do grupo 3 1 do grupo 3 2 do grupo 2 + 3 do grupo 5 + 2 do grupo 4 + 1 do grupo 3 2 do grupo 4 + 1 do grupo 5 2 do grupo 2 + 1 do grupo 6 + 3 do grupo 5 + 2 do grupo 4 + 1 do grup 3 1 do grupo 3 PORÇÕES 1 do grupo 7 + 1 do grupo 4 + 1 do grupo 5 + 1 do grupo 3 1 do grupo 3 2 do grupo 2 + 4 do grupo 5 + 2 do grupo 4 + 1 do grupo 3 2 do grupo 4 + 1 do grupo 5 + 1 do grupo 3 2 do grupo 2 + 4 do grupo 5 + 2 do grupo 4 + 1 do grupo 6 + 1 do grup 3 1 do grupo 7 + 1 do grupo 3 PORÇÕES 1 do grupo 4 + 1 do grupo 5 1 do grupo 3 1 do grupo 2 + 2 do grupo 5 + 1 do grupo 4 1 do grupo 3 1 do grupo 2 + 3 do grupo 5 + 1 do grupo 4 1 do grupo 3 PDF criado por: Idelson Pessoa da Silva – idelson@bol. É importante lembrar.200 Kcal REFEIÇÃO Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia Cardápio com 1. mesmo não contendo açúcar. como é o caso dos chocolates.Página Nr.br . no entanto. que muitos deles.GELATINA GELÉIA GOIABADA MILK SHAKE McDonald's MOUSSE DE CHOCOLATE PÊSSEGO EM CALDA PUDIM SONHO SUNDAE (McDonald's) SUSPIRO TORTA 1 CAIXA 70 kCAL 1 COLHER DE SOBREMESA 30 kCAL 1 PEDAÇO 80 KCAL 1 UNIDADE 340 kCAL 1 POTE PEQUENO 200 KCAL 1 METADE 80 kCAL 1 FATIA 250 kCAL 1 UNIDADE 150 KCAL 1 UNIDADE 260 kCAL 1 GRANDE 70 KCAL 1 FATIA 250 kCAL Sempre que possível. que não contêm açúcar. são altamente calóricos. 78/178 .500 Kcal REFEIÇÃO Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia Cardápio com 1.com. recomenda-se dar preferência aos dietéticos. Cardápio com 800 Kcal REFEIÇÃO Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia Cardápio com 1.

é o método mais prático para avaliar o grau de risco associado à obesidade. O Índice de Massa Corporal: Este índice pode ser obtido dividindo-se o peso corporal pelo quadrado da altura em metros. valorizados por quem tenta definir o peso ideal de um determinado indivíduo. principalmente por doenças pulmonares e desnutrição. entre 35 e 40 "obesidade moderada" e acima de 40 "obesidade mórbida". que pode ser obtida por métodos como a bioimpedância ou pela medida das dobras cutâneas.9 Kg/m2. Abaixo dos 20 Kg/m2 também se observam maiores índices de mortalidade. portanto. Entre 25 e 30 já se observa um aumento do risco. através da medida do percentual de gordura corporal. médias das faixas de peso ideal para cada grupo etário analisado. O cálculo do peso ideal deveria ser feito. PDF criado por: Idelson Pessoa da Silva – idelson@bol. o índice de massa corporal tem sido largamente utilizado para determinar a faixa ideal de peso.: Os grupos 1 e 8 podem ser utilizados à vontade. A faixa ideal.64). tem um IMC de 24. Como na maioria dos casos estes métodos não estão disponíveis. Por exemplo: uma pessoa que pese 67 Kg e meça 1. Entre 30 e 35 considera-se "obesidade leve". as tabelas de peso e altura ainda são largamente utilizadas em todo o mundo para estimar-se o peso ideal. segundo a Organização Mundial de Saúde é "Estado de bem-estar físico. As tabelas de peso e altura Apesar de muito sujeitas a erros.64m. Elas são derivadas de dados obtidos por companhias de seguro americanas.Página Nr. situa-se entre 20 e 25 Kg/m2.(67 divididos pelo quadrado de 1. Reparem que na tabela dos indivíduos mais idosos estes pesos já são bem mais altos. 79/178 . portanto.Obs. 3º Dia de entrevistas com o usuário: Conversa com o nutricionista O que é o peso ideal ? Peso ideal é aquele que propicia o máximo de saúde. idealmente. O indice de massa corporal por faixas de risco Veja aqui o gráfico que mostra o risco de morte de acordo com o índice de massa corporal. Estes 3 elementos devem ser. Estão nesta faixa.br .com. por exemplo. na verdade. O conceito atual de saúde. Os pesos chamados de "ideais" são. Os estudos populacionais mostram que o menor risco de mortalidade corresponde à faixa de IMC que vai dos 20 aos 25 Kg/m2. mental e social". ÍNDICE DE MASSA CORPORAL = PESO ( em Kg ) / ( ALTURA em metros ) 2 Apesar de não discriminar os componentes gordo e magro da massa corporal total. em qualquer horário e em qualquer cardápio. os portadores de anorexia nervosa. Os pacientes que aí se situam são rotulados como "sobrepesados" ou "com excesso de peso". Métodos de cálculo do peso ideal. As tabelas abaixo mostram os pesos de referência para cada um destes grupos. que as desenvolveram a partir da observação de dados de mortalidade e longevidade de sua população segurada.

78 1.9 78.83 1.65 1.70 1. Observações finais Além dessas três entrevistas foi constatado que o SPA Antes & Depois ainda mantêm PDF criado por: Idelson Pessoa da Silva – idelson@bol.57 1.65 1.7 52.com.9 66.60 1.Pesos de referência para adultos entre 21 e 55 anos ALTURA (em metros) 1.47 1.5 64.88 1.85 1.68 1.6 69.60 1.75 1.1 63.3 76.4 60.Página Nr.7 58.88 PESO para homens (em Kg) 68 70 71 72 74 78 78 77 80 84 81 88 95 PESO para mulheres (em Kg) 57 62 65 64 64 65 66 67 66 72 70 72 73 - Obs.8 62.63 1.50 1.3 71. 80/178 .9 55.9 PESO para mulheres (em Kg) 51.3 56.9 66.85 1.4 63.0 - Pesos de referência para adultos entre 55 e 74 anos ALTURA (em metros) 1.br .57 1.78 1.63 1.73 1.70 1.47 1.55 1.80 1. Os métodos utilizados para o cálculo do peso ideal de adultos não são adequados para indivíduos em fase de crescimento.55 1.52 1.9 73.80 1.50 1.9 75.75 1.2 67.5 64.68 1.52 1.8 53.6 68.0 59.83 1.2 67.9 70.3 61.91 PESO para homens (em Kg) 60.73 1.2 62.

3 Dias. Plano C (Completo) . baseado no plano de calorias indicado pelo nutricionista. Plano D (Especial de Reeducação) . 15% terceira re-incidência. baseado na seguinte tabela: 5% primeira re-incidência.alguns dados importantes: Manutenção periódica da Pasta do Cliente que contém: Dados para o envio de eventual correspondência de propaganda e promoções. Dependendo do plano adotado . A divisão do capital da empresa é realizada em cima do preço final do cliente. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Não são aceitos clientes menores de 21anos e maiores de 74 anos de idade.br . Finalmente Prontinho na próxima apostila.caso seja efetuado os planos A ou C) para despesas gerais.1 mês. 10% segunda re-incidência. 10% para o nutricionista (caso seja efetuado os planos B ou D ). e todo final de mês é criado um relatório de fechamento financeiro com a situação da empresa e a divisão do capital do mês. Histórico dos planos realizados pelo cliente no SPA. Descontos para clientes com re-incidência. 40% para o coordenador dos planos alimentares. Então aconselho a você que releia as entrevistas com calma e começe a pensar não apenas como uma chave de fenda mas como a caixa de ferramentas completa que não só senta na máquina e começa a programar mas analisa e verifica o que o usuário realmente necessita. Plano B (Reeducação) .Página Nr. criaremos nosso projeto físico baseado em tudo o que foi feito aqui. e dividido da seguinte maneira: 20% para o médico-presidente da empresa.1 Semana com acompanhamento periódico de 3 meses.com. o projeto físico servirá para montarmos nossa base de dados e termos uma idéia qual o caminho que seguirá nosso sistema. 30% (ou 40 % . Aumento de 1% nas próximas re-incidências até um máximo de 20%.acompanhamento nutricional e envio de um cardápio semanal personalizado e completo.4 Dias com acompanhamento periódico de 3 meses. 81/178 . Os planos da empresa são: Plano A (Anti-Stress) .

55 e 55 . então primeiramente. O paciente relata na consulta e sempre haverá uma maneira de planejar uma alimentação adequada. Existem fórmulas para se calcular a quantidade de calorias. Existe uma tabela de Descontos para clientes re-incidentes.com.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: BASICO. espero que todos vocês tenha gostado do rumo que tomou o nosso curso. Excluem-se menores de 21 e maiores de 74 anos. PDF criado por: Idelson Pessoa da Silva – idelson@bol. este método é muito falho.br . agora vem a fase que antigamente era designada exclusivamente para a nata da informática conhecida por: Analistas de Sistemas. Vale uma pequena observação aqui (copiada da apostila anterior. O Índice de Massa Corporal pode ser obtido dividindo-se o peso corporal pelo quadrado da altura em metros.Curso de Delphi 4. Acompanhamento do Cliente. Bem. caso numa dessas loucuras da vida a empresa exista (cada dia é criado uma nova mesmo) todos os dados foram criados exclusivamente por imaginação e não existe nenhuma relação com a realidade. principalmente porque esta vida é um eterno aprendizado. Existe uma tabela de alimentos. são programas já prontos e detalhados logicamente sem ter que usar qualquer conhecimento de um Analista de Sistemas. também espero que assim fique mais interessante e atual o uso de uma linguagem tão complexa como é o Delphi.Apostila 07 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.br Pré-Requisitos: Windows 98 Delphi 4.0 . não se dá muito bem e acaba vendendo cachorro-quente na porta da Igreja". Existem duas divisões entre 21 . 82/178 . Criação dos programas alimentares.com. ou qualquer outra ferramenta de desenvolvimento. pegue um quadro-negro e juntamente com sua equipe de desenvolvimento tente fazer um resumo de tudo o que foi dito nas entrevistas iniciais: Cadastro organizado e completo de cada cliente. É óbvio que experiência nunca vou conseguir passar para todos. e Cálculos de receitas e despesas através de demonstrativos mensais e resumo anual. Existe uma tabela para o Índice de Massa Corporal. e a única coisa que vai ter que fazer daqui para frente.74 anos. para ficar bem claro): Apesar de todos os dados se aproximarem o máximo possível da realidade todas as empresas que serão abordadas e criadas aqui serão totalmente fictícias. então quem acha que aprendendo Delphi. Cada cliente precisa de um determinado programa. mas vou tentar dar algumas dicas para vocês começarem a pegar o embalo. quantas vezes não sonhamos com esse maravilhoso e imponente título. Brain-Storm Na entrevista ouvimos algumas palavras chaves.0 versão Client/Server Suite BDE 5. pode começando a pensar seriamente a mudar de profissão.Página Nr.MDB Prefácio Salve. Já estamos com todos os dados da nossa empresa na mão. Existem cardápios formados através de uma regra. uma coisa devemos aprender: "Atualmente quem na área de informática não chuta nas onze.

mas isso não interessa para nosso sistema. Plano Adotado. até que o sistema esteje entregue e pronto. note que a entidade Cliente tem o atributo Cidade. Cidade. Observações do tratamento. Altura. Modelo Físico Terminada a fase de Preparação da Modelagem. Data. neste momento valem todas as regras de Normalização e outras técnicas aprendidas em qualquer bom Curso de Análise ou Livros disponíveis no mercado. Telefones de contato.Pense na entidade como única.Evite sempre códigos estranhos ao cliente para definir Chaves Únicas (aquelas que servirão de índices primários). O método que mostrei acima é conhecido por Brain-Storm (Tempestade Cerebral) a idéia é que você recolha os dados mais importantes e discuta em cima deles. está errado pois sempre nos referimos a um único registro da entidade. Bairro. Estado. Valor Total e Desconto concedido Entidade Resumo Mensal Atributos: Mes e Ano.Está técnica é melhor quando a equipe é formada por três ou mais pessoas. Preparação da Modelagem dos Dados A próxima fase é conhecida como Modelagem dos Dados. mas pessoalmente. . faça um jogo com você mesmo antes de ler os atributos de cada entidade (campos) propostos por mim. se achar que interessa discuta primeiro com o usuário. infelizmente você será um péssimo Analista. Data de pagamento. ou seja. o que pode futuramente virar uma outra entidade. é lógico que os clientes devem ter uma profissão. na entidade Cliente podemos usar o CPF. 83/178 . . debates e análises com a equipe e com o usuário.com. Endereço. uma coisa se você é do tipo que detesta o trabalho em grupo. Valor Nutricionista e Valor Despesa ☞ Importante . Peso medido e data de nascimento. por exemplo Clientes.Dicas Quentes: . mas prefiro adotar uma linguagem mais atual). como minha função é ensinar o Delphi não vou me ater a estes detalhes então vamos dar uma olhada no Modelo Físico pronto e depois farei alguns comentários necessários: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Não dê o nome de uma entidade no plural. aqui vamos definir nossas entidades (antigamente chamariamos de tabelas. validando e revalidando periodicamente todos os dados levantados.Não invente entidades ou atributos que não fazem parte do que foi levantado com os usuários. adote aquele que você sinta mais a vontade. Nome. Entidade Alimento Atributos: Número do Grupo. tente montar seus próprios atributos: Entidade Cliente Atributos: CPF. . Nome do Alimento e Quantidade Permitida Entidade Pasta do Cliente Atributos: CPF do Cliente. mas sempre deixe isso para a fase de normalização. Valor Coordenador. CEP. considero este o melhor. Alimentos pois além de gastar um byte a mais para o banco de dados. primeiro procure por campos únicos na própria entidade. como realmente vai ficar implantado nossa base de dados.Página Nr. é iniciado todo o trabalho para a construção de um modelo físico. pois 98% do trabalho é feito com discussões em grupo. Valor do Médico.br . Quantidade de Calorias. eMail. existem óbvio vários métodos de análises.

escolha chaves fáceis de lembrar.Data. escolha os tipos com lógica e utilidade. assim ao longo do tempo.3.) ☞Importante . VAL .. ... Ex: NOM . e após vários aperfeiçoamentos cheguei a uma regra que venho adotando: XXX_YYYYY . Quanto ao Tipo do Atributo: Uma dica que aprendi a muito tempo ainda vale até hoje.4. quer um exemplo então responda as seguintes perguntas: O que é mais útil e lógico um atributo CPF (NUM_CPF) ser Texto com 11 casas ou um Inteiro ? Se vamos fazer cálculos com a Altura do Cliente (ALT_CLIENTE) então definiremos o atributo como Texto ou Inteiro com casas decimais ? Se a observação do clientes (OBS_PASTA) pode variar muito o que é mais prático um campo Texto Variável ou um Texto fixo de 300 casas ? Todas as quantidades devem ser numéricas mesmo que não se façam cálculos com elas ? E como fica a Quantidade de Caloria (QTD_CALORIA) 3. NUM .2. Formação dos Nomes dos Atributos: O maior trabalho de uma empresa de desenvolvimento é formar o nome dos atributos.Não utilize. mesmo que o banco permita.br . Escolha das Chaves: Vou bater na mesma tecla pois acho ela importante..com. como foi o caso da entidade ALIMENTO que acabei optando por uma chave Auto Incremental (1. DAT . tipos de atributos AUTO INCREMENTAL pois esses PDF criado por: Idelson Pessoa da Silva – idelson@bol.Valor. no último caso escolha os tipos de atributos automáticos..Bem aqui valem algumas regras que aprendi ao longo do tempo: 1..aonde: XXX . 84/178 . Ex: Nome da Própria Entidade.Complemento do Atributo. YYYYY .5.Página Nr. pois sabemos que eles influenciarão no nome das variáveis.Três casas representativas do atributo. DES Descrição. Nomes Significativos. .Número. 2.Nome.

tais como ser mal interpretado ou de causar falsas expectativas. com gráficos sobre peso e massa coorporal Verificação do Caixa Mensal: Cálculo da arrecadação de um determinado mês Relatório Correspondência: envio de corrêspondencia a clientes Cardápio: montagem de determinado cardápio diário baseado no número de calorias informadas Divisão das Contas Mensal: fechamento das contas mensais e divisão dos lucros Analítico das Contas Anual: resumo anual de toda a divisão efetuada Finalmente Prontinho agora resta mostrar para o nosso usuário ter o carimbo de aprovação.campos não permitem sua modificação ou seu controle. movimentações.com. você evitará muitos aborrecimentos posteriores. Cadastro Cidade: terá a função de editar e coordenar o arquivo de cidades Grupo: terá a função de editar e coordenar o arquivo de grupos Alimento: terá a função de editar e coordenar o arquivo de alimentos Cliente: terá a função de editar e coordenar o arquivo de clientes Movimentação Entrada do Cliente: recepção para os clientes e montagem e definição dos planos nas pastas Saída do Cliente: fechamento da conta e da pasta do cliente Massa Corporal: Cálculo da Massa Corporal e pesagem atual de determinado cliente Consulta Pasta do Cliente: Verificação de determinado cliente. não se esquecendo de especificar prazos para a conclusão de cada módulo funcional descrito. Módulos Funcionais A última fase da Analise de um sistema é a documentação de todas as funções ou se você preferir pode chamar de Módulos Funcionais. começaremos a programar nosso sistema criando o menu e as telas de apoio. PDF criado por: Idelson Pessoa da Silva – idelson@bol. estes módulos normalmente são divididos em cadastros. 85/178 . fazendo isso e conseguindo a validação do usuário.Página Nr. consultas e relatórios impressos. Na próxima apostila. e esta fase também ajudará na elaboração das Opções do Menu. utilize campos INTEIROS e faça os cálculos do maior através de uma função genérica.br .

Esta apostila (tão aguardada) pode parecer simples a primeira vista. caracterizando-as como filhas que são exibidas dentro do contexto da janela principal.é aquele que permite a abertura de várias janelas. ou seja no meio de uma Fatura. bem hoje pretendo tratar aqui de um tema da maior importância. Muito usado em Editores de texto e Planilhas de cálculos. SDI (single document interface) . por isso mesmo que são os responsáveis pela maior polêmica. 86/178 .0 versão Client/Server Suite BDE 5. mas garanto-lhes que não é muito simples projetar uma casa sem começar pela sala. e sim Menus de Sistemas. se você se complicou com os dois sistemas imaginemos um Sistema de Estoque. não existindo nenhuma coorelação entre elas.com. também que gera a maior polêmica entre qualquer grupo de mais de um programador.br . assim como a Sala está para a casa. Um Menu está para um sistema. Muito usados em sistemas de grande porte. poderemos iniciar uma nova. e acrescente nele um Menu horroroso que só quem o programou entende e depois de um mês nem ele mais. Tipos de Sistema SDI ou MDI ? Vou falar rapidamente dos tipos de sistemas. ou popurlamente chamados de Telas de Entrada. Menus. ou outro meio.HLP IM0.br Pré-Requisitos: Windows 98 Delphi 4. para chamar uma outra janela) até que a Fatura seja encerrada. No sistema SDI . Também você deve ter notado que existem diferenças bárbaras em ambos os sistemas. vamos analisar as desvantagens: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Página Nr. pegue um sistema. cheio de "nove horas".BMP Prefácio Salve. pode ser aberto inclusive diversas cópias de uma mesma janela.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: PESO. existem basicamente dois tipos de sistemas: MDI (multiple document interface) . Existindo uma intensa movimentação entre elas.BMP até IM10. Não me refiro a Cardápios. ou então entrar na janela de Material para cadastrar (ou descobrir o código) de um determinado material.0 . no segundo caso o Menu pode ser uma simples janela que pode ser colocada no canto superior (como a barra do Office).Apostila 08 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. no primeiro caso o Menu deve ser máximizado para comportar as janelas filhas. Já deu para perceber a diferença básica entre os menus que são construídos para cada sistema. entre outras dezenas de outras vantagens.é aquele que permite a abertura de uma só janela de cada vez inibindo atuações nas áreas fora da mesma.A janela da Fatura pode ser aberta diversas vezes.A janela da Fatura é aberta e nela permanece (salvo que exista um botão.com.Curso de Delphi 4. o mais prático o possível. aonde existe um formulário que é a Fatura podemos tratá-la da seguinte maneira: No sistema MDI .

Tipos de Menus Ficou comprovado no ambiente Windows. lembre-se que cada formulário aberto vai para a área de memória. mas você poderá optar por qual sistema deseja adotar. (automaticamente o Delphi criou um botãozinho com o desenho dele. um deles inclusive imita o menu do botão Iniciar do Windows 95.com. além de muito fácil.O usuário pode começar a abrir diversas janelas de Faturas. e parece que com o Windows 98 isto virou um padrão oficial dos Menus. apesar de achar o MDI tentador. não é a toa que ele é o primeiro. (para padronizar comigo crie: C:\CursoDelphi\Peso) Antes de começarmos a criar nossos menus. O Delphi. a menos que o Programador tenha lembrado de colocar um botão para que ele acesse a tela de material. cadastrar ou pesquisar . No sistema SDI .BMP. 87/178 . vai chegar num momento que o sistema simplesmente não aguentará e seu usuário ganhará uma linda tela azul. Se você ainda não fez crie um diretório que abrigará seu sistema.Se o usuário precisar de cadastrar (ou descobrir o código de) um determinado material. primeiro muitos dos meus usuários são leigos. segundo porque o usuário é acostumado com eles (desde que se sigam regras) e terceiro porque são mais simples de se programarem.Página Nr. Palheta. causando assim o estouro da área de memória.BMP e assim sucessivamente. Access. abro um desafio aqui. estou me referindo dentro do Delphi ao 1o. seguiu uma tradição da família. que o Menu que melhor funciona é aquele que abre de cima para baixo. Dê um duplo clique no objeto criado e vamos entrar na ImageList. Objeto da 1a. seu irmão mais novo é o PopMenu. eu não teria como explicar-lhes (às cinco da manhã de sábado normalmente) que a aplicação deles caiu porque tinha vinte clientes na loja e ele resolveu abrir vinte janelas de Fatura. pois futuramente nosso próximo projeto será um sistema totalmente MDI. também em outros ambientes. Já vi muitos Menus interessantes. ou seja tanto faz em qual posição que você o coloque. peguem uma cópia dos VB's (ou FOX. deixe-me dizer-lhes um detalhe a mais. e sempre sua programação foi muito superior aos seus concorrentes. veja a figura: PDF criado por: Idelson Pessoa da Silva – idelson@bol. aquele menuzinho rápido que temos todas as vezes que clicamos com o botão direito em cima de um objeto. ele precisará cancelar a Fatura fechar a janela. dos mais diversos tipos. seu menu é tão fácil de programar que até mesmo me assusta. Desde a primeira versão do Pascal for Windows que a Borland (hoje Inprise) lançou esse tipo de menu. a partir do MS-Office 97. depois a IM1. agora peguem o velho Pascal for Windows e façam a mesma coisa. foram colocadas figurinhas no tamanho de 16x16 nos menus. fechar essa janela e voltar para a janela de Fatura e começar a digitar a Fatura tudo novamente. e me digam o que acharam. mas pessoalmente fico com os menus Pull-Down (é assim que são chamados) primeiro porque em qualquer aplicação do Windows (ou outro ambiente) eles estão lá. aquela área baixa (do 640 Kb) então nem adianta aumentar a memória. ou seja o objeto MainMenu. vamos lá. Pessoalmente eu prefiro meus sistemas no modo SDI. entrar na janela de Material. CA-Clipper) ou e tentem criar um menu lá. Para o Delphi é assim que ficam todos os objetos que são invisíveis durante o tempo de execução.No sistema MDI . então na Component Pallete localize uma página chamada Win32 e dentro dessa página de um clique no objeto ImageList (acredito que seja o terceiro) e dê um clique no Form. clique no botão Add e vá adicionando as imagens enviadas na ordem: primeiro a IM0. sigam o mestre: 1. ou um número excessivo de janelas.br . quando começar a rodar seu sistema este objeto ficará invisível).

4. (automaticamente o Delphi criou um botãozinho com o desenho dele. 3. 3. independente da cor. dê agora um clique duplo em cima do MainMenu1 criado.Hint: Pequeno auxílio para o item do menu.7. 3.Name: Todos os objetos tem que ter. mas essa propriedade deve ser visualizada através de um objeto do tipo StatusBar (localizado na Palheta Win32) 3. Vermelho ou Verde.Check: permite que você crie uma marca no item de menu.Caption: é o que o seu usário verá.9.Break: permite que você crie um submenu lateral (utilize a opção mbBreak para o primeiro e mbBarBreak para os filhos) 3. 3. utilize o caracter & para colocar atalhos nas opções (ex: &Arquivo) 3.6. Vamos agora entrar na Menu Editor. foram colocadas figurinhas no tamanho de 16x16 nos menus.10. me recuso a escrever sobre essa propriedade.0.Default: permite que uma das opções de um dos itens do submenu fique em negrito. que aparece em todos os objetos. 3.Página Nr.5.8. por exemplo um submenu assim: Cor de Fundo. 3.RadioItem: Seleciona dentre um grupo (determinado pela propriedade GroupIndex) um único item do menu. 3.Antes deixe-me avisá-lo que cada quadradinho criado representa um novo objeto (pertencente a classe tMenuItem) 3. determinante. então aqui você insere este tipo de figura.2.HelpContext: desloca automaticamente ao contexto selecionado ao ser chamado um arquivo de auxílio. agora é só começar a construir seu Menu. Abra o Delphi e na Component Pallete localize uma página chamada Standard e dentro dessa página de um clique no objeto MainMenu (acredito que seja o primeiro) e dê um clique no Form. os do grupo 2 estão habilitados e assim vai.ShortCut: Cria um atalho rápido através do menu. em conjunto com a propriedade Name. se o HelpContext for igual a 0 não envia para contexto nenhum. a Tag é uma variável inteira que você pode rotular para diversos usos como por exemplo transformar em Invisível todos os objetos que possuam a Tag igual a 10 ou pintar a fonte de azul-marinho PDF criado por: Idelson Pessoa da Silva – idelson@bol.11.2. 3. uma marca.1. 88/178 . assim você pode dizer os itens do grupo 1 estão desabilitados. este é um objeto que sou apaixonado vamos a algumas propriedades: 3.br . por exemplo CRTL+C ou CTRL+V 3. a opção em si.GroupIndex: cria para um determinado Grupo de submenu um indice. raça ou credo. assim você pode criar opções do tipo habilitado ou não.com.Tag: Outra propriedade. mais um objeto invisível). e parece que com o Windows 98 isto virou um padrão oficial dos Menus.BitMap: A partir do MS-Office 97. Dê um clique simples em cima do objeto criado e altere a seguinte propriedade: Images: ImageList1 (Define um objeto ImageList para ser utilizado como repositório de imagens). items: Azul.3.1. vou deixar vocês na dúvida.

ImageIndex: 0 Assim que você pressionar o Enter vai formar uma nova janela uma abaixo a Cadastro.todos os objetos da Tag 5. 3.12. clique nela e altere as seguintes propriedades: Caption: &Cadastro Hint: Informações principais do sistema. ainda com o curso posiciona em Cadastro clique com o botão direito e no menu que aparecerá clique com o botão direito do mouse na opção Create Submenu. e a medida que for criando crie as demais opções: Caption: &Cidade Hint: função de editar e coordenar o arquivo de cidades Caption: &Grupo Hint: função de editar e coordenar o arquivo de grupos Caption: &Alimentos Hint: função de editar e coordenar o arquivo de alimentos Caption: . Prontinho com todas essas informações acredito que você já está pronto (e ansioso) para construir nosso menu. Vamos lá então.br . 89/178 .Arquivos principais do sistema. ou se você prefere no primeiro Item de Menu altere as seguintes propriedades: Caption . Assim que você pressionar o Enter vai formar mais duas novas janelas uma lateral a Arquivo e uma logo abaixo dele. na janela abaixo. e será criada um item de menu lateral.&Arquivo Hint .Página Nr.com. Na primeira janelinha.(sinal de menos) O resultado será uma barra de separação PDF criado por: Idelson Pessoa da Silva – idelson@bol. clique nesse novo item e altere as seguintes propriedades.Visible: Permite que o objeto fique visível ou não em tempo de execução.

90/178 .) Isso produzirá o seguinte efeito: E vamos a última opção deste submenu: Caption: &Sair Hint: Retorna ao Windows ShortCut: Ctrl+S ImageIndex: 10 Prontinho a subopção Arquivo ficou da seguinte maneira: PDF criado por: Idelson Pessoa da Silva – idelson@bol.com.br .Caption: Cli&entes Hint: função de editar e coordenar o arquivo de clientes Volta para aquela área abaixo do cadastro e altere a propriedade Caption: (Você não está enchergando ruim não é o traço de menos mesmo.Página Nr.

☞ Importante .dpr (o Delphi está se referindo do nome do projeto . foi criado tipo um painel na parte inferior do formulário. Aonde aparece Unit1. Caption . Altere as seguinte propriedades: PDF criado por: Idelson Pessoa da Silva – idelson@bol.que será o nome do executável final) mude para Peso. Clique agora em qualquer área vázia do formulário e vamos alterar algumas propriedades: 5.2. não se lembra ? então aqui estão eles: (com os respectivos Caption's.: 4.3. Pode sair do Menu Editor e testar seu menu.Antes & Depois 5.1. Name ..As imagens aparecerão apenas fora do MenuEditor. com gráficos sobre peso e massa coorporal (ImageIndex: 4) &Verificação do Caixa Mensal: Cálculo da arrecadação de um determinado mês &Relatório: emissões na tela e em papel de um determinado momento dos arquivos &Correspondência: envio de corrêspondencia a clientes (ImageIndex: 9) Car&dápio: montagem de determinado cardápio diário baseado no número de calorias informadas &Divisão das Contas Mensal: fechamento das contas mensais e divisão dos lucros &Analítico das Contas Anual: resumo anual de toda a divisão efetuada Configura &Impressora: Verifica qual a impressora que será utilizada para as impressões (ImageIndex: 5) Au&xílio: chama o help on-line do sistema &Conteúdo: Conteúdo do auxílio on-line (ImageIndex: 6) &Tópicos do Auxílio: Chama os tópicos do Auxílio on-line (ImageIndex: 7) Como &Usar o Auxílio: Como ultilizar o auxílio do windows (ImageIndex: 8) &Sobre o Sistema: Informações sobre a execução do sistema 4. Aonde aparece Project1.F_Menu 5. 91/178 .br .1. Agora crie os outros submenus segundo definimos na apostila anterior. Na Component Pallete localize uma página chamada Win32 e dentro dessa página de um clique no objeto StatusBar (acredito que seja o décimo quarto) e dê um clique no Form.Página Nr.2.DPR 5.PAS 4. no menu vá em File | Save All.Sistema de Controle do SPA . WindowState .com. para tanto.pas (o Delphi está se referindo do nome do formulário) mude para fMenu.. Dê uma salvadinha no seu projeto.wsMaximized (fará com que o formulário se inicie no modo maximizado) 6. Hint's e caso tenham ImageIndex) &Movimentação: informações constantes do sistema &Entrada do Cliente: recepção para os clientes e montagem e definição dos planos (ImageIndex: 1) &Saída do Cliente: fechamento da conta do cliente (ImageIndex: 2) &Massa Corporal: Cálculo da Massa Corporal e pesagem atual do cliente (ImageIndex: 3) &Consulta: visões on-line dos arquivos &Pasta do Cliente: Verificação de determinado cliente.

public Agora abaixo da diretiva de compilação. e a terceira será uma propaganda fixa (isso é excelente quando queremos promover nossa SoftwareHouse).60 Alignment . Panels .taCenter 6.2..500 6.99:99:99 Width . begin BarraStat.DFM} procedure TF_Menu.BarraStat 6. Iniciando os programas do Menu Vamos começar agora a programar nosso Menu. Para capturar os hint dos objetos precisamos criar um procedimento particular que faça esse desvio. end. Na Component Pallete localize uma página chamada Dialogs e dentro dessa página de um clique no objeto PrinterSetupDialog (acredito que seja o oitavo) e dê um clique no Form.Hint.6. Na Component Pallete localize uma página chamada System e dentro dessa página de um clique no objeto Timer (acredito que seja o primeiro) e dê um clique no Form.Panels[0]. Name .. foi criado tipo um quadradinho representando o objeto.Clique nos . Width . insira o seguinte código: implementation {$R *. a segunda mostrará a hora atual do micro com a ajuda do objeto Timer. foi criado tipo um quadradinho representando o objeto. e clique três vezes no primeiro botãozinho (marcado com Add New (Ins) ) para criar 3 subpainéis e altere as seguintes propriedades de cada um: 6.2. Isto transferirá o Hint do objeto selecionado para o primeiro painel da Barra de Status.2.MontaHint(Sender: TObject). note que nela foram criados 3 painéis. 92/178 .taCenter 7.Página Nr. end. Para o segundo: Text . a primeira servirá para capturar os Hint de cada objeto do Menu (tMenuItem).1. mas precisamos iniciar. para tanto. aperte o botão F12 para ir para a Code Editor e localize a seguinte parte: private { Private declarations } public E coloque o seguinte código: private procedure MontaHint(Sender: TObject).Criado por: Curso de Delphi Alignment . Primeiramente vamos programar a Barra de Status. Para o primeiro: Text .Bem Vindo.1.com.2. 8..Text := Application.br .2.OnHint := MontaHint. PDF criado por: Idelson Pessoa da Silva – idelson@bol.. aperte a tecla F11 para chamar a Object Inspector e selecione o objeto F_Menu vá para a janela de eventos e dê um duplo clique para o evento OnCreate e coloque o seguinte código: procedure TF_Menu.FormCreate(Sender: TObject). Para o terceiro: Text . ou três divisões. begin Application.3.

end. contendo o número do contexto que foi designado como tópico de conteúdo.Timer1Timer(Sender: TObject). begin Close. e clique em Arquivo e Sair. como é o próprio Menu do Sistema..Now). mas. agora vamos tratar do segundo painel. particular identificado pelo número do contexto PDF criado por: Idelson Pessoa da Silva – idelson@bol. end. A cada segundo a hora será atualizada. O comando Close fará com que o formulário seja encerrado.Sair1Click(Sender: TObject). contendo o número do contexto. não se preocupe que isso não afetará em nada o desempenho do sistema. na página Applications altere as seguintes propriedades: Title: Controle do SPA HelpFile: Peso. aperte F12 para voltar a ter a visão do formulário. end. Utilização Mostra o auxílio a partir de tópico selecionado identificado a partir do número do contexto definido pela seção [MAP] do arquivo . A partir do Menu Principal vá em Project | Options. Normalmente passado 0.Panels[1]. coloque o seguinte código: procedure TF_Menu. O comando para chamar a Configuração da Impressora é simples. Inteiro longo. Bem agora vamos colocar alguns comandos básicos. Como todos os objetos da Pallete Dialogs basta apenas chamar o método Execute do objeto que todo o serviço está feito. inicialmente.Prontinho. begin BarraStat.Text := FormatDateTime('HH:MM:SS'.HPJ HELP_CONTENTS HELP_SETCONTENTS HELP_CONTEXTPOPUP Ignorado.HPJ Determina a chamada do tópico determinado através do uso da tecla F1 Mostra uma janela Pop-Up com um tópico definido pela seção [MAP] do arquivo . além de que diversos objetos tem a propriedade HelpContext que permite que o arquivo de ajuda seja acionado a partir da tecla F1 a partir de um tópico Pré-Definido. Clique em Arquivo e Configura Impressora e insira o seguinte código: procedure TF_Menu.. enquanto que para muitos softwares isso é algo do outro mundo.ConfiguraImpressora1Click(Sender: TObject). contendo o número do contexto. então o Sistema será encerrado.com. simplesmente executarmos alguns comandos préprogramados.br .HPJ Mostra o conteúdo do primeiro tópico definido pela seção [MAP] do arquivo . Inteiro longo. 93/178 . auxiliado pelo objeto PrinterSetupDialog. selecione novamente a Object Inspector e selecione o objeto Timer1 vá para a janela de eventos e dê um duplo clique para o evento OnTimer e coloque o seguinte código: procedure TF_Menu. Futuramente veremos como criar nosso arquivo de auxílio. Codificando o Auxílio Uma coisa interessante sobre o Delphi é como ele facilmente chama e executa arquivos . por enquanto vamos utilizar o arquivo enviado juntamente com esta apostila.HLP.Página Nr.Execute. begin PrinterSetupDialog1. no Delphi basta.HLP As palavras-chaves para o comando HelpCommand são: Comando HELP_CONTEXT Parâmetro Passado Inteiro longo.

0).TpicosdoAuxlio1Click(Sender: TObject).HelpCommand(HELP_HELPONHELP. aperte F12 e clique em Arquivo e Sair.HelpCommand(HELP_CONTENTS. Normalmente passado 0. Mostra um tópico pesquisado em uma lista de palavras chaves. caso a tecla F1 não ative o auxílio On-Line. e insira o seguinte código: procedure TF_Menu. Rode sua aplicação e teste os comandos do Auxílio.HelpCommand(HELP_QUIT. Se a palavra chave não for encontrada posiciona na palavra fonêtica mais perto. begin Application. Normalmente passado 0. Mostra um determinado tópico através de uma lista de palavras chaves. Vamos completar o comando de sair colocando também o encerramento do arquivo de auxílio. Ponteiro longo como uma string contendo o tópico designado. Esta palavra chave deve ser exatamente o texto procurado. Close. 0). E finalmente. Longint(EmptyString)). e coloque o seguinte código: procedure TF_Menu. Esta estrutura específica contém o tamanho e a posição da janela do help Ignorado. PDF criado por: Idelson Pessoa da Silva – idelson@bol. contém a macro para a execução Ponteiro longo para uma estrutura de TMULTIKEYHELP. Aperte F12 e clique em Auxílio e Tópicos do Auxílio. Mostra o auxílio de como usar o auxílio. mude a propriedade HelpContext do formulário para 1. variando o tamanho e a posição de acordo primário ou a janela secundária para ser mostrado. HELP_PARTIALKEY HELP_MULTIKEY Ponteiro longo para uma estrutura de TMULTIKEYHELP. 94/178 .br . end.HelpCommand(HELP_PARTIALKEY. 0).Página Nr. Se mesmo assim ainda não funcionou. provavelmente o seu menu está com a propriedade FormStyle em modo fsMDIForm. begin Application. end. const EmptyString: PChar = ''. aperte F12 e clique em Auxílio e Conteúdo. coloque-a no modo fsNormal. end. Com o dado passado. Ignorado. HELP_COMMAND HELP_SETWINPOS HELP_FORCEFILE HELP_HELPONHELP HELP_QUIT De posse desse nosso dicionário de comandos.Sair1Click(Sender: TObject). end.ComoUsaroAuxlio1Click(Sender: TObject). Mostra um help do windows com um mínimo de memória. Esta estrutura específica de caracteres e palavras chaves. complete com seguinte código antes do comando Close: procedure TF_Menu. begin Application. Normalmente passado 0. begin Application.Contedo1Click(Sender: TObject). e coloque o seguinte código: procedure TF_Menu. Mostra o tópico indentificado pela palavra chave ou uma chave da tabela alternada. Executa o WinHelp mostrando o arquivo de auxílio corrijido. Ignorado. aperte F12. clique em Auxílio e Como usar o Auxílio. Solicita o fechamento do auxílio ativo.HELP_KEY Ponteiro longo como uma string contendo o tópico designado. Executa um macro help.com. Ponteiro longo.

Finalmente Uma dica interessante é que o Fórmulário está associado ao Menu através da propriedade Menu. administrador. digitador).Página Nr. vamos criar as janelas auxiliares Splash e Sobre o Sistema. é que ela é possível de ser alterada em modo Run-Time. Na próxima apostila.com.br . 95/178 . PDF criado por: Idelson Pessoa da Silva – idelson@bol. então imagine que num mesmo formulário é possível ter vários Menus diferentes. cada um se adaptando a uma situação do usuário (financeiro.

com. Sobre o Sistema.0 .0 versão Client/Server Suite BDE 5. mas que bem feita pode ser como um Out-Door na estrada. 1. mas não se preocupe com o tempo. no Access e até mesmo o Delphi tem a sua janela Splash. 96/178 .3.BMP Prefácio Salve. essa janela vai acabar demorando o tempo suficiente para que o usuário possa ver as informações descritas nela e não se aborrecer. algumas bem incrementandas contendo os famosos "Ovos de Páscoa". sabe-se apenas que todo o sistema que se preza tem que ter a sua.bsNone . Altere as seguintes propriedades desta janela: 1. 1.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: IMGGER. trouxe uma coisa muito importante. e o sistema crescendo. ela está logo na nossa cara assim que entramos em qualquer desses aplicativos.A borda em volta da janela. a Splash é apenas uma janela pedindo para o usuário ter um pouco de paciência enquanto todo o sistema se inicia. Para começarmos abra o sistema e a partir do Menu Principal clique em File | New Form criando um novo formulário que será a nossa área de trabalho. note que todo o sistema ditos "for Windows" carregam consigo essas duas importantes e imprescindíveis janelas.Página Nr.A janela aparecerá centralizada no vídeo. Position . 2. as vezes pode até ser um joguinho. e a chamada janela inicial.BMP IMGICO. Splash Screen. vamos nessa então. incluindo a tarja azul desapareça. A Splash Screen e a Sobre o Sistema são janelas que a maioria dos programadores não dá a menor importância. Vou tentar ensinar aqui alguns macetes como se criar ambas as janelas com um pouco de incrementação. vamos aos passos: 1. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto PDF criado por: Idelson Pessoa da Silva – idelson@bol.Apostila 09 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. não precisa você ficar procurando por ela.1. rendendo-nos uma bela propaganda gratuita da nossa empresa.Curso de Delphi 4. Name . o ambiente Windows conseguiu trazer consigo mais do que simplesmente um ambiente gráfico de janelas. para que serve ? como surgiu ? como começou ? ninguém sabe.com.br Pré-Requisitos: Windows 98 Delphi 4.poScreenCenter . BorderStyle . tem gente que coloca um timer nelas para poder demorar ou então um simples comando For i := 1 to 10000 não façam isso.br . Splash Screen Inicialmente deixe-me dizer uma coisa. não a faça demorada demais pois a última coisa que o usuário precisa e de mais paciência. não isso não é nada do outro mundo. a apostila de hoje faz parte do chamado propaganda do sistema.F_Splash. aquela combinação maluca de teclas que antes de iniciarmos a janela Sobre é mostrado algo mais. inicialmente pode parecer que a janela pouco vai aparecer. alias foram duas. ouvimos e vimos falar de uma janela Splash desde a primeira vez que entramos no Word.2.

True . infelizmente ele não tem uma área para fazer isso automaticamente com uma janela Splash então teremos que colocar na mão. begin Brush.Produzido por .. Altere as seguinte propriedades: 2. localize o comando BEGIN e insira os seguintes comandos: begin PDF criado por: Idelson Pessoa da Silva – idelson@bol. ☞ Importante . Font .Página Nr.1.Peço por favor a maior atenção para o próximo passo pois mecheremos em áreas delicadas do nosso projeto.Image (acredito que seja o sexto) e dê um clique no Form. Na Component Pallete localize uma página chamada Standard e dentro dessa página de um clique no objeto Label (acredito que seja o terceiro) e dê um clique no Form.FormCreate(Sender: TObject). mas aonde então está o nosso Programa ? Quando você inclui um novo formulário ao projeto.2.. o resto é tudo UNIDADES de sistema. Picture . 97/178 ..True .2. já temos agora em nosso projeto a nossa Splash Screen mas ainda falta um pequeno toque. Transparent ...Isso fará com que a cor da posição 0. Caption .BMP (enviado) 2. 3. aparecerá escrito UNIT tal.0 seja a base para que a imagem fique transparente. Transparent . vamos as alterações. clique no formulário e selecione o evento OnCreate. então na verdade dentro da nossa Splash só aparecerá a Imagem e o Label. Este simples comando produzido no evento de criação fará com que todo o formulário fique também transparente.2. dê um duplo clique neste evento e digite o seguinte comando: procedure TF_Splash. Altere as seguinte propriedades: 3. agora precisamos chamá-la do nosso sistema. 3. então dentro da imagem aonde tiver cor semelhante ficará transparente. o Delphi se encarrega automaticamente de criar as chamadas a esta nova Unidade alterando por si só o nosso Programa.com.clique nos . e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Negrito Tamanho: 10 3.1. agora salve esse formulário com o nome de fSplash. A partir do menu principal clique em View | Project Source e aí está o nosso único PROGRAM do sistema todo. ele recebe exatamente o nome do nosso Projeto.Isso fará com que a cor de fundo do objeto Label fique transparente. pensam que estou mentindo ? Olhem na primeira linha de qualquer formulário. end. Prontinho de uma comparada e veja como ficou.Style := bsClear. clique no botão Load e localize o arquivo IMGGER.clique nos . um projeto em Pascal sempre existe apenas um ÚNICO programa. Antes de começarmos deixe-me dizer-lhes uma curiosidade sobre o Pascal..br . foi criado tipo um painel pontilhado no formulário.

3.Initialize.poScreenCenter .Application. Na Component Pallete localize uma página chamada Standard e dentro dessa página de um clique no objeto Panel (acredito que seja o último) e dê um clique no Form. begin F_Splash.Sobre o Sistema.hlp'. Name . Application. 2. F_Splash := TF_Splash. BorderStyle .Free antes do comando Application.. Caption . F_Splash.CreateForm(TF_Menu. F_Splash.1. Ou seja com estes três comandos..Borda interna rebaixada 2.HelpFile := 'Peso. BevelInner . SHOWMODAL .3.2.FormShow(Sender: TObject).Free. PDF criado por: Idelson Pessoa da Silva – idelson@bol. nos Criaremos a janela de Splash. ou seja o programa que o chamou ainda possui o controle da ação.1.BMP (enviado) 3. Sobre o Sistema A partir do Menu Principal clique em File | New Form criando um novo formulário que será a nossa área de trabalho. Application.2. clique no botão Load e localize o arquivo IMGICO. Altere as seguintes propriedades desta janela: 1.Update.2 .Espessura da borda ☞ Importante .bvRaised . chamaremos ela (não passando o controle para ela) e forçaremos sua aparição. Altere as seguinte propriedades: 3. você pode colocar o comando: F_Splash.A janela aparecerá centralizada no vídeo. 98/178 . ☞ Importante .3.0 seja a base para que a imagem fique transparente.br .bsDialog 1.1.clique em . antes de clicar nos objetos indicados clique primeiramente neste objeto Panel criado. end.. Altere as seguinte propriedades: 2. são eles: SHOW .Chama o formulário passando o controle da ação para ele até que ele seja finalizado.Run. desta maneira: {$R *. Não se esqueça de logo após a diretiva de compilação acrescentar a utilização da Unidade. Bem.Para os tópicos 3 e 4.Borda externa levantada 2. Application.Existem dois comandos para se chamar um Formulário. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto Image (acredito que seja o sexto) e dê um clique no objeto Panel.2.Run mas pessoalmente eu prefiro finalizá-la apenas quando o menu efetivamente for criado.Chama o formulário sem passar o controle para ele. 1.Show. BevelWidth . end. então dentro da imagem aonde tiver cor semelhante ficará transparente.com. vamos aos passos: 1.Isso fará com que a cor da posição 0. então chame o formulário do Menu e para o evento OnShow coloque o comando: procedure TF_Menu.Title := 'Controle do SPA'.F_Sobre. Application.True . agora só falta destruirmos nossa janela quando o sistema começar a execução. BevelOuter . 1.Create(Application).4 Position .bvLowered . feito isso. F_Menu). Picture .DFM} uses fSplash.. Transparent .Página Nr.

clique nos .. Coloque os próximos Oito labels na frente dos primeiros Sete (deixe o último sobrando) e altere a propriedade Font de todos para: Font . Caption . 6.Junho 4.2.2.2. Na Component Pallete ainda na página Standard e dentro dessa página traga quinze objetos Label (acredito que seja o terceiro) para dentro do objeto Panel. Objeto Label3: 4. Font .Para o tópico 6.1.clique nos . Font ..2.1.. e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Normal Tamanho: 8 Cor: Castanho 5. e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Normal Tamanho: 8 Cor: Castanho E a propriedade Caption para: Caption do 1: Endereço Internet: Caption do 2: EMail: Caption do 3: Versão Windows: Caption do 4: Versão do DOS: Caption do 5: CPU: Caption do 6: Memória Livre: Caption do 7: Espaço Livre: 6.Dados Técnicos 5.. Altere as seguinte propriedades: 6.. Caption . Caption . Font .4.. Font .clique nos .Copyright © Curso Delphi 1998 .Versão Beta 1 4.Sistema de Controle do SPA 4..3.clique nos .2.1.1.3. e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Itálico Tamanho: 8 Cor: Castanho 4. e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Negrito Tamanho: 8 Cor: Castanho ☞Importante .. Para os primeiros Sete labels (coloque um abaixo do outro) mudando a propriedade Font de todos para: Font .1.2. Na Component Pallete ainda na página Standard dentro dessa página de um clique no objeto GroupBox (acredito que seja o décimo segundo) e dê um clique no Form... e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Negrito Tamanho: 10 Cor: Castanho 4.3.2.clique nos ..2.clique nos .1. e altere as seguintes propriedades: Fonte: MS Sans Serif Estilo da Fonte: Normal PDF criado por: Idelson Pessoa da Silva – idelson@bol. Objeto Label2: 4. Caption . antes de clicar no objeto indicado clique primeiramente neste objeto GroupBox criado.Página Nr. 99/178 .1. Altere as seguinte propriedades: 5. Altere as seguinte propriedades: 4. Objeto Label1: 4..com.1. Na Component Pallete localize uma página chamada Standard e dentro dessa página traga três objetos Label (acredito que seja o terceiro) para dentro do objeto Panel.br .

const pEnderNET = 'http://www.com. Glyph e ModalResult.com Complete a propriedade Font de ambos para: Efeitos: Sublinhado Cursor de ambos para: crUpArrow 7. begin {$ifdef win32} ShellExecute(Handle. Kind . Finalmente na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto BitBtn (acredito que seja o primeiro) e dê um clique no form.EnderNETClick(Sender: TObject).br . nil. isto trocará também as propriedades: Caption.com/SiliconValley/Vista/3144'. nil. Altere as seguinte propriedades: 7. 100/178 .Página Nr.geocities.bkOK.com/SiliconValley/Vista/3144 do 2: fernandoans@geocities. mas vamos com calma. {$endif} end. PDF criado por: Idelson Pessoa da Silva – idelson@bol. pEnderNET. Compare agora como ficou a janela Sobre o Sistema Iniciando o programa da Sobre o Sistema Notou que colocaremos algumas informações bem sofisticadas tais como Versão do Windows e DOS entre outras. inicialmente clique no objeto EnderNet e para o evento OnClick insira o seguinte código: procedure TF_Sobre. 'open'. SW_SHOW).1.geocities.Tamanho: 8 Cor: Azul-marinho A propriedade Name para: Name do 1: EnderNet Name do 2: EMail Name do 3: WinVersion Name do 4: DOSVersion Name do 5: CPU Name do 6: FreeMemory Name do 7: FreeDisk Name do 8: FreeResources Dos dois primeiros objetos altere as seguintes propriedades: Caption para: do 1: http://www.

PROCESSOR_MIPS_R2000 : CPU. end.dwBuildNumber)]).dwAvailPhys/1024). 'MIPS R2000']). PROCESSOR_PPC_604 : CPU.Caption := format('Tot: %d KB Disp: %d KB'. Clique agora no objeto EMail e para o evento OnClick insira o seguinte código: procedure TF_Sobre.Caption := 'Windows 95'. {$endif} end.Caption := format('%d %s'.[SysInfo.[SysInfo.OsInfo.dwNumberOfProcessors.[SysInfo.[SysInfo.dwNumberOfProcessors.Caption := format('%d %s'. FreeDisk.%d Ver : %d'. 'Intel 80486']).dwOSVersionInfoSize := sizeof(TOSVERSIONINFO).[SysInfo. FreeResources. Novamente é realizado um comando via API para uma chamada ao OLE desta vez para iniciar o servidor de eMail corrente criando uma nova correspondência para o endereço eMail especificado.br . [OsInfo. 'ALPHA 21064']).EMailClick(Sender: TObject). 'Power PC 604']).Caption := format('%d. SW_SHOW).dwNumberOfProcessors. MemStat. PROCESSOR_PPC_620 : CPU.Caption := format('%d %s'. DiskNo: Integer. nil.[SysInfo. const pEMail = 'mailto:fernandoans@geocities. 'MIPS R4000']).Caption := format('%d %s'.[SysInfo. Clique agora no objeto F_Sobre e para o evento OnShow insira o seguinte código: procedure TF_Sobre. // Recursos livres DiskNo := 3.[SysInfo. GetVersionEx(OsInfo). PROCESSOR_PPC_603 : CPU.dwNumberOfProcessors.LOWORD(OsInfo. begin OsInfo.Caption := 'Windows NT'.dwNumberOfProcessors. 'Power PC 603']). // Memória Livre FreeMemory.dwPlatformId of VER_PLATFORM_WIN32s : WinVersion. 'Power PC 601']). as diretivas de compilação são para assegurar que o comando só seja executado em ambiente Win32.Este código fará com que seja executado um comando via API para uma chamada ao OLE para iniciar o Browser de Internet corrente com o comando a home-page especificada. nil. // Pega o processador GetSystemInfo(SysInfo). pEMail. 'Intel 80386']).Caption := format('%d %s'.dwMinorVersion. 'open'. // Versão do Windows case OsInfo. VER_PLATFORM_WIN32_WINDOWS : WinVersion.Caption := 'Windows 3. 101/178 .com'.[SysInfo.dwNumberOfProcessors. [Trunc(MemStat.[SysInfo.com. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 'MIPS R3000']). var OsInfo: TOSVERSIONINFO. 'Power PC 620']).dwMajorVersion.Caption := format('%d %s'. PROCESSOR_ALPHA_21064 : CPU. 'Intel Pentium']).dwNumberOfProcessors. VER_PLATFORM_WIN32_NT : WinVersion.dwNumberOfProcessors.dwNumberOfProcessors.Caption := format('%d %s'. PROCESSOR_PPC_601 : CPU.Caption := format('%d %s'.Caption := format('%d %s'. 'Intel 8086']). // Versão do DOS DosVersion.dwTotalPhys/1024)]).Caption := format('%d %s'.1'. PROCESSOR_INTEL_486 : CPU. SysInfo: TSYSTEMINFO.dwNumberOfProcessors.dwProcessorType of PROCESSOR_INTEL_860 : CPU. PROCESSOR_MIPS_R4000 : CPU.dwNumberOfProcessors. PROCESSOR_INTEL_PENTIUM : CPU.[SysInfo.Trunc(MemStat.Caption := ''.dwNumberOfProcessors. begin {$ifdef win32} ShellExecute(Handle.Caption := format('%d %s'. GlobalMemoryStatus(MemStat).dwLength := sizeof(TMEMORYSTATUS).Página Nr. PROCESSOR_MIPS_R3000 : CPU.[SysInfo.FormShow(Sender: TObject). MemStat: TMEMORYSTATUS. end. case SysInfo.Caption := format('%d %s'. PROCESSOR_INTEL_386 : CPU.Caption := ''.

const PROCESSOR_INTEL_860 = 860. inc(DiskNo). coloque então a declação dela no comando USES perto do comando INTERFACE.Trunc(DiskFree(DiskNo)/1024/1024)]).1). PROCESSOR_MIPS_R4000 = 4000. uma pequena observação.Caption + format('%s: %d MB '. var F_Sobre: TF_Sobre. desta maneira: {$R *. PROCESSOR_PPC_601 = 601. PROCESSOR_INTEL_PENTIUM = 586. clique em Auxílio | Sobre o Sistema e insira os seguintes códigos: procedure TF_Menu.repeat if DiskNo < 7 then FreeDisk. PROCESSOR_PPC_604 = 604.Caption := FreeResources. [Chr(DiskNo + Ord('A'). note que para capturar o processador me utilizei de determinadas constantes para facilitar o entendimento. begin F_Sobre := Tf_Sobre.br .com. F_Sobre. PROCESSOR_INTEL_386 = 386. end. Nota Importante: Note que para o formulário fMenu eu criei um novo comando USES enquanto que no formulário do fSobre eu apenas acrescentei no USES já existente. Pronto.DFM} uses fSplash. Não se esqueça de logo após a diretiva de compilação acrescentar a utilização desta nova Unidade. PROCESSOR_ALPHA_21064 = 21064. existe uma grande diferença entre ambos. F_Sobre. end. Basicamente são todos comandos API que fazem chamadas ao Windows solicitando as informações necessárias. Para que todos os comandos API funcionem precisamos ainda disponibilizar a utilização da Unidade: ShellAPI.Caption := FreeDisk. agora basta chamarmos novamente nosso formulário que contém o Menu e chamarmos a janela do Sobre para tanto chame o formulário. PROCESSOR_MIPS_R2000 = 2000. PROCESSOR_MIPS_R3000 = 3000.ShowModal. [Chr(DiskNo + Ord('A').Free. PROCESSOR_INTEL_486 = 486. 102/178 .Create(Application). fSobre.Caption + format('%s: %d MB '.SobreoSistema1Click(Sender: TObject). apenas perderia tempo explicando comando a comando quando seria muito mais proveitoso que você consulte o Help e verifique os comandos utilizados para fazer as capturas. PROCESSOR_PPC_603 = 603.Página Nr. no primeiro caso as PDF criado por: Idelson Pessoa da Silva – idelson@bol. localize o comando VAR e entre este comando e o comando End de finalização do comando Type crie as seguintes constantes: public { Public declarations } end.1).Trunc(DiskFree(DiskNo)/1024/1024)]) else FreeResources. until DiskFree(DiskNo)=-1. PROCESSOR_PPC_620 = 620. elas devem então serem criadas.

isto é feito pois o Delphi se utiliza da área de memória baixa para manter os endereços do objetos criados. e deve ser muito menos. quanto mais inserirmos no sistema mais demorado esta janela ficará.com. ou seja. pois o Windows também utiliza ela. pois o disponível para execução dos formulário é apenas aquela taxa de 640 Kb. vamos discutir o assunto de como juntar todas as nossas regras de negócio num único e simples DATA MODULE. se o usuário que chamar o FSobre então o sistema deve criá-lo. Precisamos então aliviar o máximo esta área.. PDF criado por: Idelson Pessoa da Silva – idelson@bol. e outros aplicativos também. Retirando os formulários da Área de Memória Falando em áreas de memória. no segundo caso todas as unidades inclusive a ShellApi estão com os endereços de memória reservado assim que o formulário é criado. os formulários só devem ser criados (a excessão óbvia do fMenu) quando o usuário necessitar deles.br . então não adianta ter um Pentium com 64 Megas de memória. ou seja o Delphi faz uso dos 640 Kb desta memória. 103/178 .Página Nr. na folha Forms selecione F_Splash e F_Sobre e clique no botão > mandando ambas para a área dos Avaliable Forms isto será feito com todas as outras janelas a exceção da DModelo que será o nosso DataModule. para isso no Menu Principal clique em Project | Options.unidades fSplash e fSobre não estão com os endereços fixados na área de memória no momento da criação do formulário.. Finalmente Pode executar o sistema e apreciar a propaganda da Splash e da Sobre. Na próxima apostila. novamente digo não se preocupe com a rapidez que a janela Splash vai aparecer. chamá-lo e depois removê-lo completamente da área de memória.

br . eles só servem para uma única função controlar e armazenar objetos invisíveis como eles. Segunda Cabeça . Primeira Cabeça .00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: BASICO.Apostila 10 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. então não tente colocar um tEdit ou um tImage dentro deles que eles não deixarão. então não adianta tentar dar um comando do tipo Show para mostrá-los pois todos são envergonhados e detestam aparecer. mas este não é o objetivo para o qual eles foram criados. eles são uma espécie de "Nehandertal" dos formulários. Terceira Cabeça . você deve é tomar cuidado para não cortar nenhuma delas pois sempre nascem mais duas no lugar. os mesmos campos. funções ou procedimentos basta apenas definí-los em sua área Public e depois declarar o Data Module no comando Uses da nossa unidade. criando e definindo os campos das tabelas além de outros objetos invisíveis que o sistema poderá a necessitar.Invisibilidade Os Data Modules são parentes primários dos formulários. Outra característica dos Data Modules é que eles adoram ser criados automaticamente.0.0 .MDB Prefácio Salve.Relação Data Module X Formulário É possível criar um Data Module para cada formulário. na verdade ele tem oito e mais uma que vive escondida esperando para te dar aquela dentada.Quando nasceu Os Data Modules surgiram a partir do Delphi 2. as mesmas ligações.com.0 versão Client/Server Suite BDE 5. então além do Menu deixe-o quietinho na área dos Auto-Create.Página Nr. tDataSource e tQuery perdidos. você pode até ficar criando os Data Modules na mão. você verá é que depois de domesticado ele se torna um fiel e amável bichinho de nove cabeças.com. quando os tiramos daquela área dos Auto-Create Forms eles simplesmente somem do projeto. Os Data Modules não são um bicho de sete cabeças. montando as regras de negócio.0. a maneira mais racional de se trabalhar com eles é criar um único Data Module abrigando todas as tabelas. então não adianta você ficar procurando naquela sua antiga versão de Delphi 1. PDF criado por: Idelson Pessoa da Silva – idelson@bol. fora que você sempre tinha que definir em dois formulários diferentes a mesma tabela.br Pré-Requisitos: Windows 98 Delphi 4. pois ficava aquele monte de objetos invisíveis em tempo de execução tipo tTable. mas em todo o nosso projeto será apenas um único Data Module. 104/178 . O Data Module é um espécie de armazém do nosso sistema. nesta apostila desvendaremos a utilização dos Data Modules. guarde nele tudo o que for globalmente usado. com a necessidade de organizar os formulários. isto gastava tempo e muito espaço do sistema. não são visíveis em tempo de execução. Mas. como por exemplo variáveis. dando aqueles comandos de criação.Curso de Delphi 4.

mdb e confirme as alterações em Object | Apply (ou simplesmente CTRL+A.Quarta Cabeça . Altere as seguinte propriedades: AliasName .Criando a 2a. (ou simplesmente CTRL+N) e modifique a janelinha que aparece para o Database Driver Name para MSACCESS e pressione a tecla OK.PrjPeso . 5. 105/178 . pegue novamente a Apostila 7 e veja como ficou o nosso Banco de Dados e crie-o com o MS-Access 97 (ou então utilize o MBD enviado) o nome do nosso banco será BASICO. 4.br . ou ainda clique no quarto botão da barra de ferramentas).. tQuery e quaiquer outro que necessitaremos e que utilizaremos ao longo de todo esse projeto e qual a forma como as tabelas se relacionam.. 2.Nome do Alias de Conexão DataBase Name . Feche-o em em Object | Close. 3. Na Component Pallete localize uma página chamada DataAccess e dentro dessa página de um clique no objeto DataBase (acredito que seja o quinto) e dê um clique dentro do Data Module criado.Página Nr. um objeto DataSource (acredito que seja o primeiro) e um objeto Query (acredito que seja o terceiro). Mude o nome do seu novo alias para AlPeso. Altere a propriedade DATABASE NAME para C:\CursoDelphi\Peso\basico.Criando a 1a.AlPeso .DNmPeso . 1.Nome da Base de Dados Interna Name . vamos criar todos os objetos tDataBase. Teste seu novo alias clicando em Object | Open seu alias deve formar um quadradinho luminoso em volta do objeto. Na Component Pallete ainda uma página chamada DataAccess e dentro dessa página traga nove objetos Table (acredito que seja o segundo). Volte para o Delphi e reabra novamente o projeto PESO. na Apostila 2 mostrei como se cria um Alias. Abra o aplicativo BDE Administrator para criar o Alias para o Banco de Dados enviado. Name e IndexFieldName respectivamente: PDF criado por: Idelson Pessoa da Silva – idelson@bol.MDB. A partir do BDE Administrator aberto vá em Object | New. Conexão Vamos agora criar toda a nossa regra de negócio. precisamos criar outro para este sistema.DPR. Altere as seguinte propriedades: Para os objetos Tables e Query altere a propriedade DataBaseName para DNmPeso Para os objetos Tables altere as propriedades TableName. ou seja. Conexão Vamos começar nosso desenvolvimento criando o Banco de Dados que abrigará o nossas tabelas do sistema.com.Nome do Objeto Quinta Cabeça . tTable. a partir do Menu Principal clique em File | New Data Module criando a seguinte janela: Altere a propriedade Name para D_Modelo e salve o Data Module com o nome de dModelo.

Para criar os objetos fields. mantendo assim a integridade referencial com este.NUM_CPF Isto fará com que esta tabela automaticamente se relacionem com a tabela de Cliente através do campo chave NUM_CPF. outra parte interessante é que aqui podemos definir as máscaras para os campos.br .tbCliente Name . deve ter ficado algo parecido com isso: Sétima Cabeça . isto servirá para que quando mostremos esta tabela através de um objeto dbGrid o Delphi o trate pelo nome que desejamos e não como NUM_CPF por exemplo.DsCliente Para o objeto tbTelefone_Cliente altere as propriedades: MasterSource .NUM_TELEFONE Para o objeto DataSource altere as propriedades: DataSet . dê um duplo clique em cima de qualquer tabela e aparecerá a janela Definition Fields. Altere a propriedade Name do objeto Query1 para QrySql Prontinho.DAT_MEDIDO ANO_MES NUM_CPF. 106/178 .DAT_CORRENTE NUM_CPF. o mesmo será colocado automaticamente quando de uma inclusão. clique com o botão direito nela e aparecerá o menu popup conforme a figura a seguir: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Criando os campos Uma coisa prática que podemos fazer é a definição dos campos de cada tabela.TableName Alimento Cidade Cliente Grupo Pasta_Cliente Peso_Cliente Resumo_Mensal Telefone_Cliente Name tbAlimento tbCidade tbCliente tbGrupo tbPasta_Cliente tbPeso_Cliente tbResumo_Mensal tbTelefone_Cliente IndexFieldName COD_ALIMENTO SIG_CIDADE NUM_CPF NUM_GRUPO NUM_CPF.DsCliente MasterFields .com.Página Nr.

_ !99/99/0000.0.0._ >a.0. cabe a você entrar em tabela a tabela e ir criando e alterando os campos: Tabela tbAlimento tbAlimento tbAlimento tbAlimento tbResumo_Mensal tbResumo_Mensal tbResumo_Mensal tbResumo_Mensal tbResumo_Mensal tbCliente tbCliente tbCliente tbCliente tbCliente tbCliente tbCliente tbCliente tbCliente tbGrupo tbGrupo tbTelefone_Cliente tbTelefone_Cliente tbTelefone_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbPasta_Cliente tbCidade tbCidade tbCidade tbPeso_Cliente tbPeso_Cliente tbPeso_Cliente Campo COD_ALIMENTO NUM_GRUPO NOM_ALIMENTO QTD_PERMITIDA ANO_MES VAL_MEDICO VAL_COORDENADOR VAL_NUTRICIONISTA VAL_DESPESA NUM_CPF SIG_CIDADE NOM_CLIENTE END_CLIENTE BAI_CLIENTE CEP_CLIENTE DES_EMAIL ALT_CLIENTE DAT_NASCIMENTO NUM_GRUPO DES_GRUPO NUM_CPF NUM_TELEFONE DES_FUNCAO NUM_CPF DAT_CORRENTE PLN_ADOTADO QTD_CALORIA OBS_PASTA DAT_PAGAMENTO VAL_TOTAL VAL_DESCONTO SIG_CIDADE NOM_CIDADE SIG_UF NUM_CPF DAT_MEDIDO PES_MEDIDO DisplayLabel Código Núm Grupo Nome Qtd Permitida Ano e Mês Valor Médico Valor Coordenador Valor Nutricionista Valor Despesa CPF Cliente Sigla da Cidade Nome Endereço Bairro CEP eMail Altura (Cm) Data de Nascimento Número Descrição CPF Cliente Núm Telefone Função CPF Cliente Data Corrente Plano Adotado Qtd Calorias Observações Data Pagamento Valor Total Valor Desconto Sigla Nome UF CPF Cliente Data Medição Peso Medido EditMask >a.0.000\._ !99/99/0000._ !99/99/0000._ !99/99/0000._ True True True True 000\._ >AA._ >aaa.Página Nr._ 9999\/99.0._ \(0000\) 000\-0000. vou agora descrever campo a campo de cada tabela e as propriedades que devem ser trocadas.0._ 0000.1.br .0.000\.0. 107/178 .0.com.1.0.Clique em Add fields..000\.0._ 000\._ PDF criado por: Idelson Pessoa da Silva – idelson@bol..000\/00. e clique no botão OK para inserir todos os campos.000\/00._ True True >aaa._ 000\.0.000\-000.0.0._ 000\._ Currency 00\.000\/00.000\.000\/00._ >a.1.1.

nmGrupo := 'GRUPO'. Conexao := True. 0). PDF criado por: Idelson Pessoa da Silva – idelson@bol.TableName := nmPeso_Cliente. Alterne para o Code Editor e localize a seguinte porção do código: private { Private declarations } public { Public declarations } e coloque o seguinte: private { Private declarations } public nmAlimento. // Testa a conexão try PrjPeso. begin // Atribui os nomes externos as variáveis nmAlimento := 'ALIMENTO'. 108/178 . nmPasta_Cliente := 'PASTA_CLIENTE'.D_ModeloCreate(Sender: TObject).TableName := nmCliente. verificarmos se foi feito a conexão corretamente entre o objeto TDataBase e o Alias para ambas: 1. nmCidade := 'CIDADE'.Oitava Cabeça . Selecione o objeto D_Modelo e para o evento OnCreate insira o seguinte código: procedure TD_Modelo. 2.com. tbResumo_Mensal. para evitar este pequeno problema. except MessageDlg('Erro na Conexão do Banco de Dados'. nil).IsSQLBased then PrjPesoLogin(PrjPeso. [MbOk]. tbPeso_Cliente. // Atribui os nomes das variáveis aos nomes das tabelas tbAlimento.TableName := nmGrupo. O problema uma mudança de nome em qualquer ponto pode ser desastroso. nmTelefone_Cliente := 'TELEFONE_CLIENTE'.TableName := nmResumo_Mensal. nmResumo_Mensal := 'RESUMO_MENSAL'. mtError. Outra coisa que precisamos controlar é a entrada do sistema. tbGrupo. quem já tentou por exemplo mudar do Paradox para o Oracle viu que nem por mais cuidado se tome sempre acaba tropeçando nos chamados Domínios do Oracle.TableName := nmAlimento. cada uma contendo e carregando consigo o nome da tabela. tbPasta_Cliente.TableName:= nmTelefone_Cliente. nmPeso_Cliente := 'PESO_CLIENTE'.TableName := nmPasta_Cliente. nmPeso_Cliente. nmCliente := 'CLIENTE'. nmPasta_Cliente.TableName := nmCidade.br . tbCidade. nmCidade. nmCliente : String. que são iniciais automáticas que ele coloca para definir quem é o dono das tabelas. nmGrupo.Coficando a entrada das tabelas Um grande problema que existe quando se troca de bancos de dados em sistemas com o Delphi é quanto ao nome das tabelas. tbTelefone_Cliente. if not PrjPeso. nmTelefone_Cliente. vamos adotar em nosso sistema oito variáveis globais.Connected := True. e isso não se limita apenas ao Oracle serve para qualquer outra migração de base de dados. end. // nmResumo_Mensal. tbCliente. var Conexao : Boolean.Página Nr.

begin PrjPeso. mtError. assim já que não posso arrumá-lo ou liberá-lo quando desejar.D_ModeloDestroy(Sender: TObject). não sou muito fã de campos do tipo AutoIncremento. end. SQL. Nona Cabeça . procedimentos prontos em linguagens SQL que são chamados em determinados momentos. nmTabela: String) : integer.br .. end.'. Já falei antes e vou repetir agora.ADD(NmTabela). LoginParams. 4.com. selecione o objeto D_Modelo e para o evento OnDestroy insira o seguinte código: procedure TD_Modelo. nmTabela: String) : integer.Connected := False. Para gerar um número automático para um campo qualquer precisamos apenas seguir os seguintes passos: 1. Crie uma chamada a uma função particular: private function Maximo(nmCampo. primeiro porque não são todos os bancos que os implementam e segundo porque não sou eu quem o controla. Open.Clear. quando o sistema for encerrado. e amanhã podemos usar o Oracle no dia seguinte o InterBase imagine o tempo que ficariamos com o sistema parado nas famosas ADAPTAÇÕES.Values['USER NAME'] := ''.Página Nr. SQL. [MbOk]. end.. 0).ADD('SELECT MAX(' + NmCampo + ') FROM').Terminate.Values['PASSWORD'] := ''. PDF criado por: Idelson Pessoa da Silva – idelson@bol.Conexao := False.Maximo(nmCampo. mas estamos utilizando o MS-Access aqui. Application. public 2.Funções Particulares e as regras de negócio Todas as amarrações que normalmente são definidas por DBA do banco de dados. end. end. não posso criar meu próprio passo e inúmeras outras coisas. begin LoginParams. Close. SQL. vou citar alguns exemplos e você terá uma boa base para criar outras que serão necessários aos seus sistemas. begin with QrySQL do begin if Active then Close. end. isto em bancos complexos é realizado criando Stored Procedures. Crie a função: function TD_Modelo. Para terminar a conexão. criando Stored Procedures e Triggers para a administração do banco podem ser reproduzidas perfeitamente aqui. end.AsInteger + 1. result := Fields[0]. LoginParams: TStrings). 3. if not conexao then begin MessageDlg('Sistema cancelado. Selecione o objeto PrjPeso e para o evento OnLogin insira o seguinte código: procedure TD_Modelo.PrjPesoLogin(Database: TDatabase. 109/178 .

TabelaErroPost(DataSet:TDataSet. begin tbAlimentoCOD_ALIMENTO. begin if (E is EDBEngineError) then begin MessageDlg('Impossível gravação: Provavelmente Registro Duplicado'. E: EDataBaseError. Altere a propriedade Required para True. 0). e selecione o campo DAT_NASCIMENTO. Abort. mas esses "Gatilhos" variam muito de banco para banco. 3. 110/178 . Outras funções particulares que podemos colocar são para os eventos OnPostError e OnDeleteError para controlar falhas na gravação e ao invés de recebermos aquelas amigáveis mensagens binárias hexadecimais $FFFFFFF para a alegria e desespero do nosso usuário. Para as regras de negócio contamos com o evento OnValidate que cada campo separadamente possui. end. darmos a nossa mensagem controlada e abortarmos o processo de gravação ou eliminação. var Action: TDataAction).br .3. Excluem-se clientes menores de 21 e maiores de 74 anos. [mbOk]. então siga os passos: 1.TabelaErroDelete(DataSet:TDataSet. Alterne para o Code Editor e defina os seguintes procedimentos antes da cláusula Private procedure TabelaErroPost(DataSet:TDataSet. [mbOk]. Dê um duplo clique na tabela de cliente. end. Abort. normalmente isto é feito através do que chamamos de Triggers de banco (Gatilhos). isto fará com que o campo tenha que ser preenchido obrigatoriamente.55 e 55 . PDF criado por: Idelson Pessoa da Silva – idelson@bol. var Action: TDataAction).tbAlimentoAfterInsert(DataSet: TDataSet). var Action: TDataAction). var Action: TDataAction). 2. vou citar aqui uma das mais importantes regras: Existem duas divisões entre 21 . Codifique agora os procedimentos: // Controla os Erros de Gravação coloque no Evento onPostError de todas as Tabelas procedure TD_Modelo. end.nmAlimento). E: EDataBaseError. 0). Isto é uma regra que o banco deve cumprir. // Controla os Erros de Exclusão coloque no Evento onDeleteError de todas as Tabelas procedure TD_Modelo.74 anos. o DataSet vinculado. end. procedure TabelaErroDelete(DataSet:TDataSet. aparecer controladamente algo mais agradável. E: EDataBaseError. então ela simplesmente monta uma cláusula SQL para procurar o maior valor daquele campo dentro da tabela e depois simplesmente soma mais um e devolve este resultado aonde o mesmo é jogado direto para o campo.com. Estes procedimentos foram criados para receberem os mesmos parâmetros do procedimento original ou seja. Resolvido as crises com os números automáticos. mtWarning. mtWarning. private 2. então basta simplesmente verificarmos se o código do erro é um EDBEngineError ou seja um erro de banco. então pessoalmente prefiro colocá-los no Delphi pois assim permito a maleabilidade dos diversos bancos.Página Nr. end. a função recebe como parâmetro o nome do campo inteiro e o nome da tabela. begin if (E is EDBEngineError) then begin MessageDlg('Impossível excluir: Provavelmente Registros Associados'. Para o evento AfterInsert do objeto tbAlimento coloque a seguinte codificação: procedure TD_Modelo. E: EDataBaseError. o código do erro e a ação a tomar. Selecione todas as tabelas e para o evento OnPostError selecione (através da seta. não dê duplo clique) o procedimento TabelaErroPost e para o evento OnDeleteError selecione o procedimento TabelaErroDelete.AsInteger := Maximo('COD_ALIMENTO'. vamos então implementar esta regra: 1.

: Exibe o carácter separador de tempo dado pela variável global TimeSeparator. utilizamos a função FormatDateTime que devolve uma data com base de uma máscara formatada. tt Exibe o tempo que usa o formato dado pela variável global LongTimeFormat.AsDateTime)). mmmm O mês como um nome cheio (January-December) usando a string LongMonthNamesque é uma variável global. e ' p' durante qualquer hora depois de meio-dia. begin Idade := StrToInt(FormatDateTime('YY'.Now . Chame o evento OnValidate e insira os seguintes procedimentos: procedure TD_Modelo. yyyy O ano como um número de quatro-dígito (0000-9999).com. Se a especificação de mm segue um h ou especificar um hh imediatamente. dd O dia como um número com um zero principal (01-31). ss O segundo com um zero principal (00-59). O tempo não é exibido se a parte fracionária do valor do DateTime é zero. d O dia como um número sem um zero principal (1-31). mmm O mês como uma abreviação (Jan-Dec) usando a string ShortMonthNames que é uma variável global. para isso. mm O mês como um número com um zero principal (01-12). então será exibido o minuto em lugar do mês. "xx" Carácter incluídos em plicks ( ' ) ou aspas ( " ) não afetam o formato. ddddd A data usando a string ShortDateFormat que é uma variável global. s O segundo sem um zero principal (0-59). o minuto em lugar do mês é exibido. seguiu até que usasse o formato dado pelo LongTimeFormat variável global. ou misturado (Am/Pm) o resultado será exibido de acordo. m O mês como um número sem um zero principal (1-12). O cálculo para a idade é feito da PDF criado por: Idelson Pessoa da Silva – idelson@bol. end. dddddd A data usando a string LongDateFormat que é uma variável global. ampm Usa a notação Hora-12 do relógio para o h precedendo ou specifier de hh.tbClienteDAT_NASCIMENTOValidate(Sender: TField). caso contrário (A/P).Página Nr. hh A hora com um zero principal (00-23). ddd O dia como uma abreviação (Sun-Sat) usando a string ShortDayNames que é uma variável global. e exibições ' a' durante qualquer hora antes de meio-dia. Coloquei esta tabela. var Idade: Integer. isso vale para: Especificação Mostra c A data que usa o formato dada pelo ShortDateFormat variável global. e exibições ' am' durante qualquer hora antes de meio-dia.br . e exibições os conteúdos da variável global TimeAMString durante qualquer hora antes de meio-dia.Create('Este Cliente está com a idade fora da faixa'). caso contrário (AM/PM). A especificação pode ser usado em minúscula (am/pm). t O tempo que usa o formato dado pela variável global ShortTimeFormat.tbClienteDAT_NASCIMENTO. yy O ano como um número de dois-dígito (00-99). ou misturado (A/p) o resultado será exibido de acordo. Se a especificação de m segue um h ou especificar de hh imediatamente. que pode ser encontrada no tópico do auxílio da função FormatDateTime apenas para que você não se esqueça o quão útil pode ser esta função no tratamento de Datas. 111/178 . nn O minuto com um zero principal (00-59). e ' pm' durante qualquer hora depois de meio-dia. / Exibe o carácter separador de data dado pela variável global DateSeparator. a/p Usa a notação Hora-12 do relógio para o h precedendo ou especificado de hh. n O minuto sem um zero principal (0-59). Criamos uma variável inteira aonde será calculado quantos anos este cliente possui. am/pm Usa a notação Hora-12 do relógio para o h precedendo ou especificado de hh. if (Idade < 21) or (Idade > 74) then raise Exception. dddd Exibe o dia como um nome cheio (Sunday-Saturday) usando a string LongDayNames que é uma variável global. h Displays a hora sem um zero principal (0-23). A especificação pode ser usado em minúscula (a/p).3. e os conteúdos da variável global TimePMString durante qualquer hora depois de meio-dia.

Página Nr. FieldByName('QTD_CALORIA'). apenas mandei os valores especicados para cada campo. Para o evento onAfterInsert (depois de ser dado o comando Insert) coloque os seguintes códigos: procedure TD_Modelo. depois basta apenas questionarmos se o valor está fora da faixa especificada.AsString := 'A'. mas para realizá-la no Delphi fazemos: 1. mas acredito que já deu para você perceber a utilíssima ferramenta que são os Data Modules. FieldByName('DAT_CORRENTE'). pegamos a data atual e subtraimos pela data de nascimento o resultado é convertido em anos pela função.br . ou seja. PDF criado por: Idelson Pessoa da Silva – idelson@bol.seguinte maneira. Na próxima apostila. Estas regras podem ser aplicadas na medida que você precise delas. MS-SQL ou Interbase entre outros. 2.tbPasta_ClienteAfterInsert(DataSet: TDataSet). end. begin with tbPasta_Cliente do begin FieldByName('PLN_ADOTADO').AsDateTime := Now. 112/178 . não precisando de bancos complexos como Oracle. começaremos a construir nossas telas de entradas. Quantidade de Calorias receba 800 KCal e Data Corrente receba a Data Atual. Outro tipo de Regra de Negócio que podemos aplicar e quanto a entrada padrão de determinados campos. Finalmente Ao longo deste projeto ainda voltaremos por aqui para incluirmos novas funcionalidades globais. nosso assunto será de construir os formulários que cadastrarão as tabelas básicas do sistema.com. para obtê-las. supomos que queremos que toda vez que for dada a entrada dos campos na tabela Pasta do Cliente os campos Plano Adotado receba o Plano A. esta Regra também pode ser determinada por certos bancos.AsString := '0800'. end. Selecione o objeto tbPasta_Cliente. Acredito que não precisa de muita explicação para o que fiz.

00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: OBJETOS.Apostila 11 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.0 . então não quero nem vou ficar esperando concluir ou terminar um módulo para mudar.BMP ImgAvanca.com.BMP ImgAvancaSalto.br Pré-Requisitos: Windows 98 Delphi 4.BMP ImgFicha. instale e verifique a utilidade dos objetos disponibilizados. tanto o ambiente como a linguagem.BMP ImgInsere.BMP ImgTabela.BMP ImgPrimeiro. PDF criado por: Idelson Pessoa da Silva – idelson@bol.br .BMP ImgDesFiltro. Importante .BMP ImgVaiMarca. porque sempre que pensei em lançar um curso deste nível também sempre desejei que as pessoas pudessem aprender o que existe de mais moderno sem ficar preso a uma linguagem ou ambiente antigo e morto. e aviso que isto sempre vai acontecer.BMP ImgInsLote.Junto com esta estou disponibilizando na parte de Objetos um manual e todos os objetos necessários que iremos utilizar a partir de agora. inclusive e principalmente os formulários.Página Nr.BMP ImgFormCons.BMP ImgDuplFicha.BMP ImgVoltaSalto. para não complicar muito esta apostila será dividida em duas partes (você verá que mesmo dividindo esta apostila em dois ela é bastante extensa).WRI POO.BMP ImgUltimo.BMP ImgCancela. então existe a propriedade Herança para o reaproveitamento dos formulários.WRI Seguintes Objetos : DgFiltro DgPrint SelectT PosEstad Seguintes Imagens : ImgAnterior. e isto é conseguido facilmente através da Herança dos Objetos primeiramente se ninguém nunca disse isso a você então vou ter a honra de falar primeiro. então antes que você começe a desenvolver nesta apostila aconselho que você baixe e dê uma lida neste manual. Todo o curso foi reformulado.BMP ImgGrava.com. e também estou disponibilizando o Apêndice C para que você aprenda e compreenda mais um pouco sobre a linguagem Object Pascal. Mas antes de começarmos deixe-me explicar porque suspendi o curso durante o mês de Agosto. tudo no Delphi são objetos.0 versão Client/Server Suite BDE 5. Aconselho que você sempre se mantenha sempre atualizado em relação ao Delphi. ☞ Começando e Criando o Pai de Todos Em Orientação a Objetos a palavra-chave é Reaproveitamento. nesta apostila desvendaremos a primeira parte de como criar os cadastros. ao ambiente Windows e ao Gerenciador de Banco de Dados MS-Access.BMP ImgLocaliza.BMP Prefácio Salve.BMP ImgFiltra.Curso de Delphi 4. eles são tratados como qualquer outro objeto.BMP ImgEnviaArea.BMP ImgElimina.BMP ImgMarca.BMP ImgImprime. 113/178 .

2.Uma janela diálogo padrão.Neste primeiro momento criaremos o pano de fundo para todos os nossos cadastros. mais pela simplicidade do que pelo número de funções fiz algumas mudanças e consegui chegar a uma tela de cadastro que julgo a ideal.Ficha Duplica determinada Ficha quando Inserir Primeira Ficha Volta o Salto das Fichas Ficha Anterior Próxima Ficha Glyph ImgInsere ImgGrava ImgCancela ImgElimina Name ButInsert ButPost ButCancel ButDelete Caption &Insere &Grava &Cancela &Elimina Hint Inclui uma nova ficha Grava as alterações realizadas na ficha Cancela as alterações realizadas na ficha Apaga a Ficha corrente 2. Mostra os dados em forma de uma FICHA. Parte. esta deve dar a mobilidade necessária para que o usuário possa ver os dados num bloco. Para diminuir um pouco. 2. vamos aos passos: 1.bsDialog . organize-os do lado esquerdo. não pense que vai ser simples. Altere as seguintes propriedades desta janela: 1. Criando o Geral Para começarmos abra o sistema e a partir do Menu Principal clique em File | New Form criando um novo formulário que será a nossa área de trabalho.poScreenCenter . Altere as seguinte propriedades dos quatro primeiros: 1 2 3 4 janela. solte o objeto. relações e filtragens o que o usuário quiser fazer para poder visualizar seus dados da forma como ele julgar melhor. 2a. um abaixo do outro deixando um espaço maior entre o quarto e quinto. servindo também para incluir ou alterar qualquer ficha.salve o formulário com o nome de fFicha. Na Component Pallete ainda na página Additional dentro dessa página de um clique no objeto SpeedButton (prendendo-o com a tecla Shift) e dê dez cliques no Form.com. Position . ou se você prefere. pois em 17 anos programando mudei várias vezes minhas telas de cadastro desde que trabalhava com linguagens do tipo Natural e Cobol. Name . os outros oito organize-os na parte de baixo do formulário. 3a. até que finalmente. foram criados cinco botões. Parte. Sendo simples e ao mesmo tempo complexa em número de utilidade que ela disponibiliza para o usuário. BorderStyle . 3.2.1.F_Ficha. Altere a propriedade ShowHint de todos para True. venho aprimorando minhas telas.br .Página Nr. 114/178 .A janela aparecerá centralizada no vídeo. graças a uma olhada num sistema me apaixonei logo de cara na tela de cadastro. Para o quinto botão altere a propriedade Kind para bkClose. Na Component Pallete localize uma página chamada Additional e dentro dessa página de um clique no objeto BitBtn (prendendo-o com a tecla Shift) e dê cinco cliques no Form. dois coloque-os no espaço entre o ButDelete e o BitBtn5 e estique-os para ficarem do mesmo tamanho.2.3. 1. 1. e altere a propriedade Hint para Fecha esta PDF criado por: Idelson Pessoa da Silva – idelson@bol. solte o objeto clicando no cursor reprensentado na Component Pallete. &Lote Insere um conjunto de fichas &Dupl. Mostra os dados em forma de uma TABELA aberta ou como a forma de uma Planilha. ☞Importante . de maneira rápida e eficiente.1. Parte. Altere as seguinte propriedades: 1 2 3 4 5 6 Glyph ImgInsLote ImgDuplFicha ImgPrimeiro ImgVoltaSalto ImgAnterior ImgAvanca Name ButFixIns ButDupField ButFirst ButRW ButPrior ButNext Caption Hint Ins. é como se o usuário estivesse navegando em uma gaveta dessas de bibliotecas e vasculhando as fichas que ele deseja utilizar. Fica a cargo das pesquisas. para não assustar muito ao usuário dividi a parte central da tela em três partes: 1a. e de vez em quando vá salvando para não perder o serviço. foram criados dez botões pequenos.

10. na página Additional clique no objeto MaskEdit e dê um clique no Form colocando abaixo do objeto Label1e altere as seguintes propriedades 11._ 11. Hint para Defina um valor para o salto das Fichas 11. vamos dar uma olhada para ver como está ficando a janela: 6. Na Component Pallete. Na Component Pallete.com. a propriedade Visible para False e a propriedade DataSource para dsVisao. na página Data Controls clique no objeto DBMemo e dê um clique no Form e altere a propriedade Name para DBMemClip. na página Additional clique no objeto PosEstado (Olhe o Manual dos Objetos para qualquer referencia) e dê um clique no Form bem abaixo do BitBtn5 e altere a propriedade DataSource para dsVisao e limpe a propriedade Caption. Na Component Pallete ainda na página Additional pegue um objeto chamado Bevel e envolva os objetos ButMark e ButGotoMark. 9.4. 7.Página Nr.7 8 9 10 ImgAvancaSalto ImgUltimo ImgMarca ImgVaiMarca ButFF ButLast ButMark ButGotoMark Salta Fichas Última Ficha Marca uma determinada Ficha Volta para a Ficha marcada 3. 3. Na Component Pallete. ainda na página Standard clique no objeto Label e dê um clique no Form colocando no espaço entre os objetos ButPrior e ButNext e altere a propriedade Caption para Valor Salto. Na Component Pallete. 8.0. na página Data Access clique no objeto DataSource e dê um clique no Form e altere a propriedade Name para dsVisao. Se perdeu ? Ok. Altere a propriedade ShowHint de todos para True. na página Standard clique no objeto Memo e dê um clique no Form e altere a propriedade Name para memClip e a propriedade Visible para False.2. 4. Altere as seguintes propriedades para os objetos ButFixIns e ButDupField: propriedade AllowAllUp altere para True e propriedade GroupIndex altere do primeiro para 1 e do segundo para 2.1. 11. Na Component Pallete.br . 115/178 . Na Component Pallete. 5. Name para mskSalto 11.1. EditMask para 099.2. ShowHint para True Veja como ficou o trabalho até aqui: PDF criado por: Idelson Pessoa da Silva – idelson@bol.3.

agora dê um duplo clique em cima do objeto criado para entrarmos no editor da lista de imagens. ou seja o objeto DBNavigator. não quero aqui em momento nenhum falar mal deste objeto.br .com. o problema se deu que com o passar do tempo eu o consegui aprimorar. conforme a figura abaixo: PDF criado por: Idelson Pessoa da Silva – idelson@bol. veja bem criei esta janela para facilitar a vida do usuário. 116/178 . o Delphi permite entrada direta em modo de Edição.Criando o Separador das Partes Toda essa parte de botões e apenas o acessoramento que servirá para substituir com muito mais eficiência um padrão adotado desde o Delphi 1.Ainda na terceira parte desta janela criaremos mais alguns botões para completar a barra que eu tinha desenvolvido. Para dividir a tela em três partes utilizei um objeto PageControl associado a figuras para ficar mais familiar ao usuário. basta que para isto o usuário começe a digitar os dados e depois ou gravar uma determinada Ficha ou simplesmente começar a navegar os dados. 12. ☞ Importante . até torná-lo uma barra com 23 botões e sem querer acabei foi conseguindo complicar bastante a cabeça dos meus usuários.0. Na Component Pallete. você notará que em momento nenhum desabilito ou habilito qualquer destes botões (a excessão do butMark e butGotoMark). não para prendê-lo a uma regra ou a um conjunto. na página Win32 clique no objeto ImageList e dê um clique no Form. a famosa Barra de Navegação. vamos construir este preparatório antes de continuarmos.Página Nr. caso ele deseje pode também Cancelar o processo. mas você pode notar a ausência do botão Edição ou Alteração. então resolvi descartá-lo e colocar toda a sua funcionalidade nesta tela.

e clique no botão abrir. e altere a propriedade Align para AlClient e a propriedade Name para PgTabela. altere a propriedade Caption para Ficha e propriedade Name para TabFicha. Clique no botão Add. isto não tem importância pois quando em modo de execução estes objetos ficarão invisíveis.com. Na Component Pallete. deixe exatamente do jeito que está. Novamente clique no objeto PgPrincipal com o botão Direito do mouse e escolha a opção NewPage.br .. insira as imagens ImgTabela e ImgFormCons. dividindo esta parte em mais três partes. a outra apenas para campos tipo Imagem e a última apenas para campos do tipo Texto e vamos ao trabalho: 17. altere a propriedade Caption para Formas de Consulta e propriedade Name para TabConsulta. uma nova página será criada. ela será a posição 0. Na Component Pallete. Clique no botão OK e saia do editor. 15. uma que mostra exclusivamente os dados simples. 14. Criando a Primeira Parte Atenção que esta é a parte mais difícil e complicada. O resultado de todo este trabalho se mostra na figura a seguir: ☞ Importante .. Finalmente clique no objeto PgPrincipal com o botão Direito do mouse e escolha a opção NewPage. e localize a figura ImgFicha. mais uma nova página será criada. Clique neste objeto criado com o botão Direito do mouse e escolha a opção NewPage.1. altere a propriedade Caption para Tabela e propriedade Name para TabTabela. PDF criado por: Idelson Pessoa da Silva – idelson@bol.12. você aqui simplesmente não vai fazer nada.Note que os objetos DBMemClip e MemClip ficaram escondidos atrás do objeto PgPrincipal. utilizaremos esta parte apenas nos formulários que criaremos por herança. Criando a Segunda Parte Clique na orelha Tabela dentro do objeto PgPrincipal. 16. 13. 117/178 .Página Nr. o problema em se mostrar os dados de uma tabela sob a forma de uma planilha é que campos tipo Imagem e campos tipo Texto não aparecem. mais uma nova página será criada. acerte-o para ocupar o espaço vazio do formulário e altere a propriedade Images para ImageList1 e a propriedade Name para PgPrincipal. ainda na página Win32 clique no objeto PageControl e dê um clique no Form. solucionei este problema. clique na página Win32 clique no objeto PageControl e dê um clique no Form.

com. Align para AlClient 19. PDF criado por: Idelson Pessoa da Silva – idelson@bol.br . Options para [dgTitles. compare como ficou: 25.2. altere a propriedade Caption para Dados e propriedade Name para TabTDados. Dentro desta página na Component Pallete. 24.dgColumnResize. Ainda dentro desta página na Component Pallete.dgAlwaysShowSelection] 19. Finalmente clique novamente no objeto PgTabela com o botão Direito do mouse e escolha a opção NewPage. 21. mais uma nova página será criada. uma nova página será criada. 23. ainda na página Standard clique no objeto ComboBox e dê um clique nesta página. Dentro desta página na Component Pallete. compare como ficou: 20. 19.dgColLines. altere a propriedade Align para AlTop e a propriedade DataSource para DsVisao 22. altere a propriedade Hint para Selecione o campo a pesquisar. clique na página Data Controls clique no objeto dbImage e dê um clique nesta página. DataSource para DsVisao. ainda na página Standard traga outro objeto ComboBox. clique na página Data Controls clique no objeto dbGrid e dê um clique nesta página. altere as seguintes propriedades: 19. clique na página Standard clique no objeto Label e dê um clique nesta página. Novamente clique no objeto PgTabela com o botão Direito do mouse e escolha a opção NewPage.dgRowSelect. Ainda dentro desta página na Component Pallete.18. mais uma nova página será criada. 118/178 . altere a propriedade Caption para Texto e propriedade Name para TabTTexto. Clique neste objeto criado com o botão Direito do mouse e escolha a opção NewPage.Página Nr.3. a propriedade ShowHint para True e a propriedade Name para CbCampoImg. altere a propriedade Caption para Imagem e propriedade Name para TabTImagem. Ainda dentro desta página na Component Pallete.1. altere a propriedade Caption para Campo e a propriedade Font para Estilo: Negrito e Cor: Castanho. e altere a propriedade Visible para False e a propriedade Name para CbCampoImgReal.

Dentro desta página na Component Pallete. coloque-os ao lado de cada botão.Página Nr. e altere a propriedade Visible para False e a propriedade Name para CbCampoTxtReal. altere a propriedade Font de todos para Cor: Azul-Marinho. Envia a ficha corrente para área de transferência. altere a propriedade Caption para Campo e a propriedade Font para Estilo: Negrito e Cor: Castanho. clique na página Data Controls clique no objeto dbMemo e dê um clique nesta página. coloque-os um abaixo do outro modificando a propriedade Flat de todos para True. limitando-as. 119/178 . Ainda dentro desta página na Component Pallete. solte o objeto. clique na página Standard clique no objeto Label e dê um clique nesta página. altere a propriedade Align para AlTop e a propriedade DataSource para DsVisao 27. ainda na página Standard traga outro objeto ComboBox. Na Component Pallete clique na página Additional dentro dessa página de um clique no objeto SpeedButton (prendendo-o com a tecla Shift) e dê cinco cliques nesta página. E altere a propriedade Caption de cada para: 1 2 3 4 5 Caption Ativa as opções para se criar um Filtro. 29. E altere as seguinte propriedades: 1 2 3 4 5 Glyph ImgFiltra ImgDesFiltro ImgLocaliza ImgImprime ImgEnviaArea Name ButFilterOpen ButFilterClose ButSearch ButPrint ButCopyClip Enabled True False True True True 31. Localiza determinada Ficha. Imprime todas as fichas.26. Desativa um filtro. Ainda dentro desta página na Component Pallete. limitando-as caso haja filtro ativo.br . o Filtro permite uma seleção das fichas mostradas. solte o objeto. 28. foram criados cinco botões pequenos. Ainda dentro desta página na Component Pallete. ainda na página Standard clique no objeto ComboBox e dê um clique nesta página.com. Compare como ficou: PDF criado por: Idelson Pessoa da Silva – idelson@bol. compare como ficou: Criando a Terceira Parte Clique na orelha Formas de Consulta dentro do objeto PgPrincipal e vamos ao trabalho: 30. a propriedade ShowHint para True e a propriedade Name para CbCampoTxt. altere a propriedade Hint para Selecione o campo a pesquisar. Na Component Pallete clique na página Standard dentro dessa página de um clique no objeto Label (prendendoo com a tecla Shift) e dê cinco cliques nesta página.

óbvio que precisei usar uma boa gama de conhecimento que tenho em linguagem Object Pascal mas adianto que não utilizei nada estranho 1. fTrava: Boolean. PDF criado por: Idelson Pessoa da Silva – idelson@bol. // Gera o Filtro // Procedure Global para a chamadas a formulários terceiros procedure TF_Ficha. Alterne para o Code Editor e localize a seguinte porção do código: private { Private declarations } public { Public declarations } e coloque o seguinte: private FBM: TBookmark. fFiltro. ChDuplica.com. end. uses dModelo. Codificando A codificação deste formulário não é tão complicado quando se entende toda a utilidade desta janela.Página Nr. um objeto DgPrint e um objeto DgFiltro.ChamaExterno(var Tab: TTable.br . 120/178 . PrtPesquisa e FilPesquisa respectivamente.Cursor := crHourGlass. abra a unidade D_Modelo e crie os seguintes objetos: Na Component Pallete na página chamada Dialogs e dentro dessa página traga um objeto SelectDlgT. Altere a propriedade Name para SelPesquisa. FiltroVisto: String. aFormClass: TFormClass).Criando os Acessores na D_Modelo Antes de continuarmos. aFormClass: TFormClass). public procedure ChamaExterno(var Tab: TTable. begin Screen.

end. ftBlob. Screen. Foi criada também um procedimento público para poder criar e chamar formulários secundários. PgPrincipal.FieldName). end. ftFmtMemo : begin CbCampoTxt. CbCampoImg. PgTabela. CbCampoTxtReal.Add(Fields[i]. Screen. Aqui foram criadas algumas variáveis para uso particular do programa ou seja só funcionarão aqui dentro.Items.Tab.Items. do tipo texto e do tipo imagem. var i : Integer. são FBM: Ponteiro para guardar a posição do arquivo quando for disparado o botão Marca Registro. CbCampoTxtChange(Sender).FieldName). begin with dsVisao.Items.Add(Fields[i].ItemIndex := 0.br . fTrava: Booleana que informa se o Inserção em Lote foi ou não ativada. end.Open.ActivePage := TabFicha. 121/178 .DataSet do begin for i := 0 to (FieldCount -1) do case Fields[i].Página Nr. end.Atualiza.ItemIndex := 0. Para o evento onShow do Formulário procedure TF_Ficha. este procedimento será visto com mais detalhes a frente.DisplayLabel).FormShow(Sender: TObject).ActivePage := TabTDados. finally Free. end. with aFormClass.Close. end. 2. PosEstado1. CbCampoImgChange(Sender). do tipo comum. fTrava := False.Add(Fields[i]. CbCampoTxt.Coloque na primeira declaração do USES (fica logo abaixo da Seção interface) a unidade DBTables pois o procedimento ChamaExterno faz uso do objeto TTable que faz parte desta biblioteca. CbCampoImgReal. isto é para ser colocado na segunda parte do formulário quando o usuário terá a visão da tabela PDF criado por: Idelson Pessoa da Silva – idelson@bol. ftBCD.com.Items.DataType of ftMemo.Add(Fields[i].Cursor := crDefault.Cursor := crDefault. FiltroVisto: Caso a tabela está com o filtro ativo criado e armado pelo usuário. A primeira parte coloca e divide os nomes dos campos das tabelas em três segmentos. ftTypedBinary. ChDuplica: Booleana que diz se é ou não para Duplicar um registro marcado. ftGraphic : begin CbCampoImg. Tab.Create(Application) do try ShowModal.DisplayLabel). ☞Importante elas: . end.

end.ButCancelClick(Sender: TObject).QrySQL. Para o evento onClick do objeto ButPost procedure TF_Ficha. end.ButPostClick(Sender: TObject). Quando for pressionado o botão Grava ativa o comando Post da tabela e verifica se está em modo de Inserção de Lote. if ChDuplica then for i := 0 to (FieldCount -1) do Fields[i]. end.0. 5. 4. A segunda parte prepara todo o ambiente para a mostragem dos dados.Atualiza. se estiver chama o procedimento de inclusão.ButInsertClick(Sender: TObject). 3. caso contrário atualiza o objeto PosEstado1. begin with dsVisao. Para o evento onClick do objeto ButCancel procedure TF_Ficha.DataSet do begin Insert.SetFocus.0). if fTrava then ButInsertClick(Sender) else PosEstado1. begin with dsVisao. atualiza o objeto PosEstado1. 122/178 . acerta a variável fTrava e retorna o cursor para o formato de uma seta. Para o evento onClick do objeto ButInsert procedure TF_Ficha. if fTrava then ButInsertClick(Sender) else PosEstado1.Atualiza. TabFicha.DataSet do Post. Para o evento onClick do objeto ButDelete procedure TF_Ficha. Posicionando os combos. Quando for pressionado o botão Cancela ativa o comando Cancel da tabela e verifica se está em modo de Inserção de Lote. na segunda página ativa a Página DADOS como principal. Keybd_event(9.ButDeleteClick(Sender: TObject). Quando for pressionado o botão Insere ativa o comando Insert da tabela e verifica se está em modo de Duplicação da Ficha. begin with dsVisao.0. caso contrário atualiza o objeto PosEstado1. begin PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. var i : Integer. PosEstado1.DataSet do Cancel.Value := D_Modelo. se estiver chama o procedimento de inclusão. 6.Fields[i]. end. se estiver transfere todos os dados da Query pública para a tabela corrente campo a campo. ativando os procedimentos Change de ambos os combos Imagem e Texto para carregá-los.Value.Página Nr.Atualiza.como a forma de uma planilha de dados.br . transformando a Página FICHA como inicial. atualiza o objeto PosEstado1 e manda o foco para o objeto TabFicha depois simula o pressionamento da tecla TAB isto fará com que o foco vá para o primeiro campo da TabFicha.

ButFixIns. begin with dsVisao. Para o evento onClick do objeto ButFirst procedure TF_Ficha. 8. end. 9. Quando for pressionado o botão Salto para Trás ativa o comando MoveBy enviando o salto estipulado de forma negativa. Para o evento onClick do objeto ButNext procedure TF_Ficha. begin with dsVisao. Quando for pressionado o botão Elimina ativa o comando Delete da tabela e atualiza o objeto PosEstado1.Enabled := not fTrava.com.br . ButDelete. end. 11. end. Para o evento onClick do objeto ButFF PDF criado por: Idelson Pessoa da Silva – idelson@bol. begin with dsVisao. Quando for pressionado o botão Insere Lote pode acontecer dois momentos o primeiro pressionamento trava e o segundo pressionamento libera.DataSet do First. Quando for pressionado o botão Primeiro Registro ativa o comando First da tabela.with dsVisao.ButRwClick(Sender: TObject).DataSet do Delete.Atualiza. Para o evento onClick do objeto ButPrior procedure TF_Ficha. 123/178 .DataSet do Prior.DataSet do moveby(-StrToInt(mskSalto. desabilita (ou habilita conforme o caso) o botão de exclusão e se for para travar chama o procedimento de inclusão. Quando for pressionado o botão Próximo Registro ativa o comando Next da tabela. Para o evento onClick do objeto ButFixIns procedure TF_Ficha. end.ButNextClick(Sender: TObject). begin with dsVisao. end.ButFixInsClick(Sender: TObject).Down := not fTrava. Para o evento onClick do objeto ButRw procedure TF_Ficha. 7.ButPriorClick(Sender: TObject). begin fTrava := not fTrava. if fTrava then ButInsertClick(Sender). Quando for pressionado o botão Registro Anterior ativa o comando Prior da tabela. 12. acerta a variável de controle.Página Nr. 10.Text)). PosEstado1. coloca o botão pressionado (ou despressionado conforme o caso). end.ButFirstClick(Sender: TObject).DataSet do Next.

br . Para o evento onClick do objeto ButFilter procedure TF_Ficha. begin with dsVisao. 15. with dsVisao.enabled := true.FilPesquisa do begin Tabela := (dsVisao.Página Nr. Quando for pressionado o botão Salto para Frente ativa o comando MoveBy enviando o salto estipulado.ButFilterOpenClick(Sender: TObject).Text)).DataSet as TTable).ButLastClick(Sender: TObject). end. Filter := FiltroSQL. begin with dsVisao.ButGotoMarkClick(Sender: TObject).DataSet do gotobookmark(FBM). end.Filter. ButFilterOpen.DataSet as TTable). Para o evento onClick do objeto ButGotoMark procedure TF_Ficha.DataSet do moveby(StrToInt(mskSalto. 14. Open. 13. FiltroVe := FiltroVisto. FiltroSQL := (dsVisao. begin with D_Modelo. Quando for pressionado o botão Último Registro ativa o comando Last da tabela. end. ButFilterClose. Para o evento onClick do objeto ButLast procedure TF_Ficha. Quando for pressionado o botão Marca Registro acerta o ponteiro BookMark para guardar a posição do registro. end. begin with dsVisao. 124/178 .ButFFClick(Sender: TObject).com. if Execute then begin FiltroVisto := FiltroVe. Quando for pressionado o botão Vai para o Registro Marcado posiciona a tabela de acordo com o ponteiro criado com o BookMark.DataSet do begin Close. begin with dsVisao.DataSet do Last. ButGotoMark.Enabled := False. end. end.procedure TF_Ficha.ButMarkClick(Sender: TObject). caso seja devolvida uma resposta positiva realiza a filtragem da tabela e desabilita este PDF criado por: Idelson Pessoa da Silva – idelson@bol. Filtered := True.DataSet do FBM := getbookmark. Para o evento onClick do objeto ButMark procedure TF_Ficha. 16.Enabled := True. end. end. Quando for pressionado o botão Abre Filtro seta os parâmetros para o objeto FilPesquisa localizado na D_Modelo e depois executa-o.

Quando for pressionado o botão Localiza Registro seta os parâmetros para o objeto SelPesquisa localizado na D_Modelo e depois executa-o.botão e habilita o botão Fecha Filtro.Tabela := (dsVisao. 19.Enabled := True. Marca := GetBookMark.PrtPesquisa. ButFilterOpen.DataSet do with D_Modelo. with dsVisao. caso seja devolvida uma resposta negativa retorna a posição guardada anteriormente.Enabled := False. 18.ButPrintClick(Sender: TObject). FreeBookMark(Marca). ButFilterClose.DataSet do begin Close. 20. Para o evento onClick do objeto ButFilterClose procedure TF_Ficha. begin D_Modelo. Filtro := Filter. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 125/178 . 17. end.SelPesquisa do begin Filtro := Filter. begin with dsVisao. with dsVisao. Para o evento onClick do objeto ButSearch procedure TF_Ficha.br .DataSet as TTable). end.SelPesquisa. if not Execute then GotoBookMark(Marca). Quando for pressionado o botão Fecha Filtro limpa o filtro da tabela e desabilita este botão e habilita o botão Abre Filtro.DataSet as TTable).ButSearchClick(Sender: TObject). Filtered := False. NomeRel := 'Relação de'. Quando for pressionado o botão Imprime Dados seta os parâmetros para o objeto PrtPesquisa localizado na D_Modelo e depois executa-o.com. antes guarda em um ponteiro do tipo BookMark a posição da tabela. Para o evento onClick do objeto ButPrint procedure TF_Ficha. var Marca: TBookmark. end.Tabela := (dsVisao. end. Para o evento onClick do objeto ButCopyClip procedure TF_Ficha.ButCopyClipClick(Sender: TObject).ButFilterCloseClick(Sender: TObject). end.DataSet do with D_Modelo. begin D_Modelo.PrtPesquisa do begin NomeTela := 'Impressão'. Open.Página Nr. var i : Integer. Execute. end.

Items.begin with dsVisao.DisplayLabel + ': ').SelectAll.Count > -1 then DbMemo1. MemClip. for i := 0 to FieldCount . com o auxílio do objeto dbMemClip.AsString > '' then begin DBMemClip. DBMemClip. MemClip. é disparado um comando Insert para a tabela e posicionado no primeiro campo. end. TabFicha. Para o evento onExit do objeto TabFicha procedure TF_Ficha. Para o evento onChange do objeto CbCampoTxt procedure TF_Ficha.Clear.DataField := CbCampoTxtReal.SetFocus. 21.DataSet do begin MemClip.CbCampoTxtChange(Sender: TObject). Quando for pressionado o botão Copia para Área de Transferência utiliza-se do objeto invisível MemClip.DataField := Fields[i].Add(Fields[i].br . A Inserção de Registros em Lote é realizada da seguinte forma.Visible then begin MemClip. para colocar todos os dados do registro atual para dentro deste e depois simplesmente seleciona tudo e envia para a Área de Transferência.CopyToClipboard.Lines. end. MemClip.CbCampoImgChange(Sender: TObject). 22.CopyToClipboard. end.Items. end. DBMemClip.com. e retornaremos para o primeiro campo. begin CbCampoTxtReal. end. 126/178 . begin CbCampoImgReal. 23.Text. Para o evento onChange do objeto CbCampoImg procedure TF_Ficha. então confirmaremos a gravação do registro digitado.ItemIndex := CbCampoImg. end.Count > -1 then DbImage1.PasteFromClipBoard.SelectAll. end. if CbCampoImgReal. if Fields[i].Lines.TabFichaExit(Sender: TObject). o usuário digitará até o último campo pressionando a tecla Tab quando ele chegar no último campo ele pressionará mais um Tab isto fará com que este comando seja ativado. if CbCampoTxtReal.1 do if Fields[i]. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Quando for modicada a posição do combo que contém os campos em formato Texto da página Tabela faz as alterações necessárias setando o objeto DBMemo1 para o novo campo.ItemIndex.ItemIndex. chamando o procedimento para tal. begin if fTrava then begin ButPostClick(Sender).DataField := CbCampoImgReal.ItemIndex := CbCampoTxt.Página Nr.Text. end.FieldName. Quando for modicada a posição do combo que contém os campos em formato Imagem da página Tabela faz as alterações necessárias setando o objeto DBImage1 para o novo campo.

FieldName.DataSet as TTable).FieldByName(NomeCampo). else SQL. end. with D_Modelo.FieldName. ftInteger.QrySQL do if Active then Close. ftVarBytes: SQL.FieldByName(NomeCampo).FieldByName(NomeCampo). ftCurrency. ftTypedBinary.com.DataSet do begin if Active then Close. ftWord. Quando for pressionado o botão Duplica Registro fará com que esta trenheira (gostei do trenheira) de código seja executado.DataSet as TTable).DataSet as TTable).AsString + ')').enabled then with dsVisao. ftInteger.FieldByName(NomeCampo).ButDupFieldClick(Sender: TObject). ftVarBytes: SQL. ftBoolean. ftFloat. case (dsVisao. Para o evento onClick do objeto ButDupField procedure TF_Ficha. var NomeCampo: String.Add('select * from ' + (dsVisao. Filtered := False. apenas ele. var Action: TCloseAction). com o auxílio do objeto Query público da D_Modelo (Objeto QrySQL) geraremos um comando SQL que quando disparado conterá o registro atual. if ButGotoMark. ftCurrency. end. begin ChDuplica := not ChDuplica. end. end. SQL.AsString + ')'). NomeCampo := (dsVisao.QrySQL do if Active then Close else with D_Modelo. SQL. ftBoolean. é simples.IndexFieldCount-1 do begin NomeCampo := (dsVisao. end. 25.DataType of ftAutoInc. end.br .DataSet as TTable).FieldByName(NomeCampo).Add('where (' + NomeCampo + ' = ' + (dsVisao. ftBytes.AsString + ''')').FormClose(Sender: TObject. ftFloat.TableName). Para o evento onClose do Formulário procedure TF_Ficha.IndexFields[i].24.DataSet as TTable).Add('where (' + NomeCampo + ' = ''' + (dsVisao. i : Integer.DataSet as TTable). begin if FiltroVisto <> '' then with dsVisao.Clear.DataSet as TTable). if ChDuplica then with D_Modelo. após isto basta com que após cada comando Insert copiemos campo a campo do objeto Query para a Tabela. ftTypedBinary. case (dsVisao. ButDupField.QrySQL do begin // Monta o "SQL Completo" if Active then Close. Open.IndexFields[0].DataSet as TTable). 127/178 .Down := not ChDuplica. ftSmallint.Add('and (' + NomeCampo + ' = ''' + (dsVisao.Página Nr. ftSmallint. ftWord. PDF criado por: Idelson Pessoa da Silva – idelson@bol.DataSet do FreeBookmark(FBM).DataSet as TTable).DataSet as TTable). end. Filter := ''. for i := 1 to (dsVisao.AsString + ''')').DataType of ftAutoInc.Add('and (' + NomeCampo + ' = ' + (dsVisao. else SQL.FieldByName(NomeCampo). ftBytes.

mas lembre-se que alguns bancos não permitem o relacionamento de Alteração e Exclusão em cascata como o Access permite. caso exista algum. entaum se vc quer um sistema portátil não utilize essa opção mesmo sendo ela muito prática. ou controlado o acesso livremente ou por determinados usuários com determinadas permissões. Dúvidas das Apostilas Anteriores Como faço para criar tabelas relacionadas ? Use o gerenciador do banco de dados para isso ou você quer criá-los via programação ? se sim não faça isso pois os comandos variam muito de banco para banco.br . Posso relacioná-las no Access ? Claro. mas se vc conseguir conexão com ele sem problemas então deixe a IDDAO32. o DAO3032.Página Nr. Finalmente Na próxima apostila criaremos a primeira utilização deste formulário através da Herança dos Objetos. quando passei a usar o Access comecei a definir meus relacionamentos no próprio banco mas sempre tomando o cuidado para que o sistema naum deixe passar besteiras. Possuo Windows 95 e o Office ORIGINAIS !!!!! Sera que nao resolve ?!? Dependendo naum resolve pois vc terá apenas o DAO 3. instale o APE Work disponível no endereço citado da home page do Bruno.0. e com relação a distribuição? Veja a apostila 4 como criar o Install Shield para isto.DLL nao foi encontrado em um determinado diretorio. ou uso MasterSource ? Você não relaciona tabelas com as opções MasterSource e MasterFields o que você faz é criar um indice virtual.com. acredito que vc próprio saberá o que é melhor para seu sistema pois cada caso é uma sentença.Antes do usuário sair. Produto -> Items Quando utilizava o Paradox naum utilizava relacionamentos deixava o sistema controlar toda a entrada dos dados. finalizaremos caso tenha sido criado o ponteiro de guardar registros e fecharemos. seu cliente precisa tê-lo ou vc a permissão para instalá-lo. A minha duvida é com relação ao Access/Multiusuario. cancelaremos o filtro. Com o Access isto também acontece? A forma de acesso ao Access é pelo DAO. Qual a melhor solução ? Ex.DLL PDF criado por: Idelson Pessoa da Silva – idelson@bol. isso apenas serve para controlar entradas e visões dos dados nada mais. 128/178 . Ja li sua resposta no final da apostila 7. caso esteje ativa.5. isto é possível? Sim ele é um banco multiusuário. o objeto Query Público da D_Modelo. O bom e velho Isto ocorre porque vc precisa instalar o DAO 3.

Add('Select * from Classe'). Será que os meus problemas são por causa da minha versão do Delphi ??? Onde posso arrumar um uprade para atualizar a minha versão de Delphi ??? Sempre em modo de edição ele pedirá para vc a janela Status Login.02. A senha e pedida e se eu der o OK o erro ocorre. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Os indíces. O meu Delphi é o 3.br . . 129/178 . end.Página Nr. begin Chave:=Column.02 do Delphi. Como devo fazer a consitencia do meu sistema para não deixar que registros duplicatos sejam cadastrados ? Faço a procura em outra Query? Crio em run_time ? Crie outra table para procura.0 e se estendeu com o Delphi 2.0 ! Por acaso. SQL. With QueryClas do begin Close.0 a Inprise já corrigiu e acertou os objetos Table´s. pois os objetos Query´s eram indiscutivelmente mais rápidos e práticos que os Table´s mas se vc está utilizando o Delphi 3. É a melhor opção ? Se vc está utilizando Query´s para cadastrar é. depois vc vai no próprio site da Inprise e pega a atualização para 3.Acessei o endereco para atualizar o DBE so que a versao que la se encontra e a 5. O que é óbvio porque apenas neste momento que vc está tentando o acesso ao DAO.01.DBGridClasTitleClick(Column: TColumn).02. ATENÇÃO: Não baixe a 3. Uso DBEdit ? ou a melhor opção são Edits ? Os DBEdit são melhores. ou uma query para procurar. var Chave:String. É somente dar um <enter> que consigo acessá-la. O problema naum é com seu Delphi mas para atualizá-lo para a versão 3. primeiro vc tem que pegar aonde vc comprou o Delphi a versão 3.Clear. mas eu naum recomendo seu uso depois do Delphi 3.Add('Order By ' + Chave ).. end.com.0 e você fala que os exemplos são todos para a versão 3. pois assim vc pode utilizar uma única query para seu sistema inteiro. apenas com o sistema rodando que ele parará de pedir pois entrará ou no LoginPrompt := False ou no evento OnLogin (conforme as apostilas 3 e 10). então aconselho que vc os utilize. Já fiz todas as configurações que você fala na sua Home Page.0.. Open.02 em cima da 3. procedure TFClas. É preferível sempre trabalhar com Querys? Quando devo usar Tables ? Isso surgiu com o Delphi 1. Qual a melhor maneira de procurar um registro usado query ? Pode ser o Locate ? Usando a cláusula Where. mas modifique o comando SQL via programa. SQL.Permito que o usário escolha a ordem dos dados? Neste caso coloquei no evento OnTitleClick do DBGrid o seguinte código. SQL.0 ainda naum testei com o D3 A minha base de dados que está feita no Access 97 quando é acessada sempre pede o login e a password.0. desabilitei o botão de "login prompt" no componente DataBase do Delphi.0.0 ou Delphi 4. exitiria algum problema em baixa-la ? Ela foi criada para atender o Delphi 4. ou By Order. mas ainda o problema de pedir o login para acessar a base persiste.FieldName.

é rápido. vou dar uma pesquisada nele aguarde notícias..0 e depois empregá-las no meu projeto. o relacionamento dentro do access nao funcionou no programa em delphi. PDF criado por: Idelson Pessoa da Silva – idelson@bol. Suponha que eu tenho 5 micros ligados em rede win95 com nenhum computador servidor dedicado(apenas compatilhamento de arquivos e hardware). win95 e bde 4.Página Nr. O que voce acha do OPUS para acessar MDB em relacao ao BDE 4.consulta.DBF) e depois com SET RELATION. exclui.. salvei e abri o DELPHI. altera.. entao para que serve o relacionamento feito dentro do Access em um programa delphi? No teste que eu fiz. Se vc quer movimentar o PAI e movimentar o FILHO use os parametros Master do objeto Table para isso. para instalar tudo siga as instruções da nova apostila 4. 130/178 . uma PAI e outra FILHO. não sei se amanhã resolvo mudar do Access para outra coisa qualquer. prático e seguro. Se eu estiver equivocado por favor me corrija. poderia ser empregado? No Access e no Paradox é um campo OLE e no Delphi vc os associa a um campo DBImage.51) É possível sem problema nenhum e vc naum precisa do Access97 instalado nos micros apenas o Win95 . serve para garantir que só existirá FILHOS se existirem PAIS.51 . Fiz as conexoes. Qual seria o tipo de campo ideal para armazenar estas imagens e qual seria o procedimento para fazer a visualização dessas imagens? Se isto for possível(eu sei que é.51 ??? Qual a melhor opcao? OPUS sem sombra de dúvida. em qualquer deles. Existe algum componente que permite a "Justificação" de texto nos relatórios criados via QuickReport? Nunca o vi. Iniciei um novo projeto coloquei dois table/datasource/grid. seu correspondente na tabela FILHO ja era posicionado automatico. elegendo por exemplo. vc pode desenvolver uma função que faça isso.3.. Para o Delphi isso serve pois vc não precisa codificar isso. utilizo o BDE para manter a integridade e portabilidade dos sistemas para qualquer banco de dados. é que um PAI dependendo da regra não pode morrer ou modificar sua chave se ouverem FILHOS atrelados a eles. O Delphi aceita qualquer formato pois para colocar uma imagem nesses campos o que vc faz é recortar a imagem e colar.MDB com duas tabelas.4 e todo a rede. Na aba de relacionamento (dentro do ACCESS97) fiz o relacionamento. existe um exemplo nos Demos do Delphi sobre isso. Quando posicionava o registro na tabela PAI.com. que pode ser Access97 ou Paradox 7. Os relacionamentos no banco de dados. o micro1 como local de instalação do programa e do banco de dados? Em todos os micros temos instalados os mesmo programas (Access97. relacionava a tabela PAI com a tabela FILHO.Sistema BDE 4. Não tenho como fazê-lo no meu caso as vezes é quase 90% Nao sei direito como funciona o relacionamento entre tabelas do Access. mas talvez o QR que vem com o Delphi 4 já vem com isso. porem quando movimento o registro na tabela PAI. só não sei como) quais os formatos além do Bmp e ico que o delphi aceita.Em um sistema.DAO. 60% se resume em inclui. Gostaria de armazenar um conjunto de imagens diretamente no banco de dados.br . Seria possível a utilização do programa Mapa criado nas apostilas 2. No clipper eu criava minhas tabelas (. No access criei um . a tabela filho nao se movimenta! Isso esta correto? Se sim.

.Página Nr. Pronto. A partir do Menu Principal vá em File | New. NADA. pois cada alteração causa um desvínculo da herança. neste momento foi criado uma cópia. Grupo e Alimento. Na apostila passada criamos a primeira parte dos cadastros que foi a construção de um formulário que servirá como base de todos os cadastros.. 131/178 .2..BMP Prefácio Salve.br . nesta apostila desvendaremos a segunda parte de como criar os cadastros dos nossos sistemas. Aqui criarei o formulário para o Cadastro de Cliente que é o mais complexo de todos. Se tiver que fazer este tipo de alteração faça no formulário F_Ficha pois deste modo automaticamente todos os outros formulários que foram herdados serão alterados. primeiramente vamos começar bem devagar. Para este objeto altere apenas as seguintes propriedades: 1.BMP ImgTele.1.. e vá na página Peso. Caption: Cadastro de Clientes.com. então caberá a você. Name: F_Cliente 1.PAS Note que precisamos preencher o miolo da primeira parte (A página da ficha propriamente dita).0 versão Client/Server Suite BDE 5. a criação dos formulários para os cadastros de Cidade.Curso de Delphi 4. Salve o formulário com o nome de fCliente.0 .br Pré-Requisitos: Windows 98 Delphi 4.com. para tanto: PDF criado por: Idelson Pessoa da Silva – idelson@bol. escolha o formulário F_Ficha e clique em Ok. inicialmente reabra o nosso projeto e proceda da seguinte maneira: 1. NÃO altere neste formulário criado qualquer posição dos botões.Apostila 12 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.3. Como utilizar a Herança A coisa que mais falei na apostila passada foi no tocante a Herança. Altere aqui o extritamente necessário. lembre-se que definimos quatro cadastros: Cidade. então vamos fazer uso dela.BMP ImgTerc. NÃO faça modificações na janela. Grupo. Alimento e Cliente. neste mostrarei como utilizar o formulário criado.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Formulário : F_Ficha (criado na Apostila 11) Objetos: DBCmpList DBDateEdit97 Seguintes Imagens : ImgLamp. um espelho ou se você prefere um novo objeto formulário baseado por herança no objeto formulário F_Ficha. 1. após este.

Acertando os campos 4. ☞ Importante .Existem várias maneiras de se criar este formulário que mostrei. 2. Clique na opção Vertically para a formação dos campos na Vertical e clique no Botão Next 2.Página Nr. 2.2. Agora selecione todos os campos e respectivos labels e digite CTRL+C vá para o formulário F_Cliente e clique na página Ficha selecione a página e digite CTRL+V dê uma arrumada nos campos. Posição dos Labels deixe marcada a opção Left (A esquerda) e clique no Botão Next 2. A tabela a ser usada para o formulário. altere as seguintes propriedades de todos: 4.1. Inicilmente vamos nos ocupar dos objetos Label´s. Desmarque a opção Generate a main form (Gera a tela como form principal) e na opção Form Generation marque Form e clique no Botão Finish. 132/178 .6.com. Para a opção Form Options marque Create a simple form (Um formulário simples) e para a opção DataSet Options marque Create a form using TTables objects (Usando o objeto tabela) e clique no Botão Next. O tipo do formulário a ser criado. 2. garanto que em breve você dominará uma maneira que mais lhe agrade. você deve conseguir algo como isto: Este segundo formulário criado já serviu para seu propósito pode fechá-lo cancelando qualquer procedimento para sua gravação. A partir do Menu Principal vá em File | New. 3. Campos a serem inseridos clique no Botão ">>" para ser inserido todos os campos e clique no Botão Next.br .3.1.5. Propriedade Caption (respectivamente): CPF: Nome: Endereço: Bairro: CEP: Cidade: eMail: Altura: PDF criado por: Idelson Pessoa da Silva – idelson@bol.. e vá na página Business. particularmente prefiro deste modo.4. Para a opção Drive or Alias name localize o Alias AlPeso e para a opção Table Name marque Cliente e clique no Botão Next.. Completo. escolha o formulário "Database Form Wizard" e clique em Ok: 2.2.

Nasc: 4.Dt. Name: EditDAT_NASCIMENTO PDF criado por: Idelson Pessoa da Silva – idelson@bol. volte para o formulário F_Cliente e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *. Glyph: ImgTerc.br .5. Desça-o para o espaço aberto entre os campos CEP e eMail 7.DsVisao) 7. CapLocaliza: Localiza determinada Cidade 7. DataField: SIG_CIDADE 7. PosCmpDescricao: 1 7. Na frente do campo EditALT_CLIENTE crie mais um objeto Label e coloque na propriedade Caption: em Cm 4.17.5.Abra o Data Module D_Modelo. DataSource: DsVisao (Atenção: Não marque. CriticaEd: False 7. Marque este objeto e vá na página Additional e coloque um objeto SpeedButton em cima do objeto CmpCidade ao lado do botão de localizar e altere as seguintes propriedades: 8. Vamos para os campos agora. MensagemCodigo: Sigla da Cidade não localizada 7. Caption: 7. TbSecundaria: D_Modelo.DFM} uses dModelo. DataField: DAT_NASCIMENTO 9.1.1. Hint: Chama o cadastro de Cidade 8.11.4. Propriedade AutoSize para True 4.3. PosCmpCodigoSec: 0 7.BMP (Enviado) 7. MensagemDescricao: Cidade não localizada 7.14. TipoSQL: Access 7. e na página Data Controls localize o objeto DBCmpList e coloque-o no lugar deste. ShowHint: True 9.com. Name: ButIncCidade 8. DataSource: DsVisao 9. Marque o objeto DsVisao e altere a propriedade DataSet para D_Modelo.tbCidade 7. 6. UsaLocaliza: True 8.12.9.6.5.13.2. Para o objeto DBCmpList criado altere as seguintes propriedades: 7. caso apareça F_Ficha.2.4.3.Color = clMaroon Font.Página Nr.3. 7.3.7. ☞ Importante . HintButLoc: Localiza determinada Cidade 7.8.2. aumente o espaço entre o campo CEP e eMail e elimine o objeto EditSIG_CIDADE.10. Altere a propriedade Font de todos para: Font. GlyphLoc: ImgLamp.16. Flat: True 8.15.tbCliente.BMP 8.1.4.Style = [fsBold] 5. Elimine o campo EditDAT_NASCIMENTO e coloque um DBDateEdit97 no lugar e altere as seguintes propriedades: 9. UsaDescricao: True 7. 133/178 . Name: CmpCidade 7.

1.. Caption: Inclua aqui os telefones de Contato do Cliente: 14. Propriedade Font para: Font. Name: TabTelefone 14.1.BMP (enviada) 12. Dê um Duplo-Clique no objeto ImageList1. Para esta nova página criada altere as seguintes propriedades: 13. Crie agora três objetos: 14.2.2. 13. 11. 134/178 . Altere a propriedade Font de todos os campos para Font. O trabalho final ficou desta maneira: Criando Mais uma Orelha Note através do nosso modelo que a tabela de CLIENTE tem um relacionamento de 1 para N com a tabela de TELEFONE_CLIENTE.Color = clNavy e organize a propriedade TabOrder para colocar os campos na sequência.com..1.1.2. Clique no objeto PgPrincipal e depois clique com o botão direito no sub-menu que aparece clique na opção New Page. e insira a imagem ImgTele. Caption: Telefones 13. clique no botão Add.Style = [fsBold] 14.10. DataSource e altere as seguintes propriedades: PDF criado por: Idelson Pessoa da Silva – idelson@bol.1.br .Color = clMaroon Font. Label e altere as seguintes propriedades: 14.Página Nr. normalmente adoto o seguinte método para o cadastro desse tipo.

a maior parte do trabalho ficou com o formulário anterior. dgTabs.2.3. este é a apenas um espelho do passado e sua programação é quase mínima e teremos apenas três trabalhos.3..Color: clNavy Title. na janela que aparece clique duas vezes em propriedades: para a coluna 0 FieldName: NUM_TELEFONE Font..dgCancelOnExit] 14.tbTelefone_Cliente 14.Página Nr.Font.Font. Options: [dgEditing. 135/178 .].2. altere as seguintes Difícil Programação Você vai se surpreender com a programação criada aqui.Color: clMaroon Title.Caption: Número do Telefone Title.3.br .dgConfirmDelete.Color: clNavy Title.2. veja como ficou esta nova página: .dgIndicator. Voz e FAX.com.3.dgRowLines.Style: [fsBold] Width: 104 Não vamos nos preocupar aqui com os detalhes de controlar qual telefone e de qual cliente pois esta amarração foi realizada no DataModule através do objeto tbTELEFONE_CLIENTE.dgColumnResize.dgColLines.Color: clMaroon Title.1.dgTitles. Columns: clique em [. DataSource: dsTelefone_Cliente 14. DataSet: D_Modelo. Name: dsTelefone_Cliente 14.1.Font.Font.Caption: Função PickList: Voz.3. PABX (Um em cada linha) Title. vamos a ela: PDF criado por: Idelson Pessoa da Silva – idelson@bol.14. FAX.Style: [fsBold] Width: 200 para a coluna 1 FieldName: DES_FUNCAO Font. dbGrid e altere as seguintes propriedades: 14.2.

end. begin with D_Modelo do begin case CriticaEdicao(dsVISAO.1° Trabalho. Exit. e crie três variáveis na Seção Particular do Objeto: private Tab1. end. PDF criado por: Idelson Pessoa da Silva – idelson@bol.FormShow(Sender: TObject. if not Tab3 then Open. if not Tab1 then tbCIDADE. end. end. end. 2° Trabalho. Um outro comando que você pode estranhar é o comando inherited ele é o responsável por chamar os comandos que estão localizados no evento OnShow do formulário Pai. with tbTELEFONE_CLIENTE do begin Tab3 := Active. 'do Cliente'. o objeto DBCmpList exige que a tabela secundária (tbCidade) seja aberta primeiramente que a tabela que serão gravados os dados (tbCliente).Página Nr. // *** Screen. Tab3 : Boolean.Cancel. Tab2. ☞Importante . Para tanto selecione o evento OnShow do formulário: procedure TF_Cliente. if not Tab2 then Open. if not Tab2 then tbCLIENTE.Close. end.Close. 'fechar') of mrYes : tbCLIENTE. end. end. end. if not Tab3 then tbTELEFONE_CLIENTE. inherited. sempre que abro um formulário de cadastro abro respectivamente as tabelas que ele utiliza na D_Modelo.FormClose(Sender: TObject.com.Aqui a ordem dos tratores altera o viaduto. mrNo : begin Action := caNone. 136/178 . if not Tab1 then Open. with tbCLIENTE do begin Tab2 := Active.br . Fechar as tabelas. begin with D_Modelo do begin with tbCIDADE do begin Tab1 := Active. Uma explicação geral é a seguinte. var Action: TCloseAction). Para tanto selecione o evento OnClose do formulário: procedure TF_Cliente. inherited.Cursor := crHourGlass.Close. mas como um formulário pode chamar outro formulário então corrijo isso através de variáveis locais que armazenam se a respectiva tabela já se encontrava ou não aberta quando o formulário foi ativado. Abrir as tabelas. var Action: TCloseAction).

br . mbNo]. o objeto DBCmpList exige que a tabela que serão gravados os dados (tbCliente) seja fechada primeiramente que a tabela secundária (tbCidade). begin if DSOrigem. mtConfirmation. function CriticaEdicao(DSOrigem: TDataSource. Deseja sair agora ?'. begin inherited. DoQue: String. Não se esqueça de declarar o formulário utilizado na USES: uses dModelo. Vamos a uma explicação geral. ela recebe três variáveis sendo uma delas um objeto inteiro. dsInsert] then result := MessageDlg('Necessário cancelar a edição (ou Inclusão) ' + Doque + ' antes de ' + AntesDe + '. são passados os seguintes: PDF criado por: Idelson Pessoa da Silva – idelson@bol. Após a diretiva de compilação insira os seguintes comandos: {$R *. uma coisa fantástica na linguagem Object Pascal é a possibilidade de passar objetos inteiros atraves de funções ou procedimentos. AntesDe: String) :Word. nmTelefone_Cliente.ButIncCidadeClick(Sender: TObject). 2. Esse foi moleza pois basta que chamemos a função ChamaExterno localizada no formulário F_Ficha. 3° Trabalho. nmPasta_Cliente.tbCIDADE.State in [dsEdit. Abra o DataModule D_Modelo através do Code Editor e localize a seção Public. [mbYes. 137/178 . nmCidade. end.CriticaEdicao(DSOrigem: TDataSource. end. através da função CriticaEdicao que será montada na D_Modelo verifica-se se o estado da tabela Cliente está em estado de Edição ou Inserção em caso positivo.Novamente a ordem dos camarões altera o vatapá. note que por ser uma função localizada no objeto que herdamos não precisamos nem fazer a referência para ela. ChamaExterno(D_Modelo.DFM} function TD_Modelo.com.Aqui é relativamente simples. AntesDe: String) :Word. Na segunda parte devolvemos o estado original das tabelas. end. É o botão responsável por chamar o Cadastro de Cidade para tanto de um duplo-clique no objeto ButIncCidade para ativar o evento OnClick: procedure TF_Cliente. a função é relativamente simples. // nmResumo_Mensal. fCidade. nmGrupo. ☞ Importante .Página Nr. insira o seguinte cabeçalho para a declaração da função coloque-o abaixo da declaração das variáveis: public nmAlimento. nmPeso_Cliente. 0) else result := mrNone. podemos cancelar a Edição ou cancelar o Fechamento da janela. DoQue: String. TF_CIDADE). nmCliente : String. Alterando a D_Modelo Lembra-se que na apostila referente ao DataModule avisei que algumas funções seriam posteriormente incluídas ? Então vamos começar estas inclusões: Função Responsável pela Verificação do Estado de uma Tabela: 1.

if sNumCpf = '' then Exit. nMod.Critica_CPF(sNumCpf: String) :boolean. var I.DFM} function TD_Modelo. nmTabela: String) : integer. sNumCpfCalc: String. 3. nTotal := nTotal + nSubTotal. e este valor somado (isto é realizado no segundo comando FOR) é aplicada a seguinte equação: Digito1 = 11 . nSubTotal. sNumCpfCalc := sNumCpfCalc + IntToStr(nDv). A função é o cálculo do famoso MÓDULO 11.DSOrigem : DataSource que será analisado DoQue : Ajuda na montagem da mensagem. caso contrário será devolvido um resultado mrNone. end.Value) then Raise Exception. e insira o seguinte cabeçalho para a declaração da função: private function Maximo(nmCampo. Após a diretiva de compilação insira os seguintes comandos: {$R *. Função Responsável pela crítica do CPF do Cliente: 1. o primeiro por 10. J. end. o segundo por 9 e assim sucessivamente até o nono número por 2. nTotal. begin if not Critica_CPF(tbClienteNUM_CPF. end. nDv: Integer. begin Result := True. for I := 1 to 2 do begin nMod := 2. Dê um duplo clique em cima da Tabela de Clientes e marque o campo NUM_CPF para o evento OnValidade insira os seguintes códigos: procedure TD_Modelo.Create('CPF não confere com o da Receita Federal'). 138/178 .br .(nTotal mod 11)).tbClienteNUM_CPFValidate(Sender: TField). end.com. Localize agora a seção Private. J. 1). nSubTotal := (StrToInt(sChar) * nMod). Inc(nMod).Resto( Soma / 11) PDF criado por: Idelson Pessoa da Silva – idelson@bol. nTotal := 0.9). Result := (sNumCpfCalc = sNumCpf). Deseja sair agora ?" e mostrado dois botões "Sim" ou "Não" o resultado será um dos dois. "Do que será cancelada a tarefa ? " AntesDe : Complemento da mensagem do modo de edição Então caso o DataSource passado esteja em estado de Edição ou inserção será mostrada a seguinte mensagem "Necessário cancelar a edição (ou Inclusão) Conteúdo_Doque antes de Conteúdo_AntesDe. function Critica_CPF(sNumCpf: String) : Boolean. if nDv > 9 then nDv := 0. for J := Length(sNumCpfCalc) downto 1 do begin sChar := Copy(sNumCpfCalc. você já deve ter ouvido falar isso várias vezes. 2. sNumCpfCalc := Copy(sNumCpf.Página Nr. nDv := (11 . sChar. o cálculo para o primeiro dígito é feito pegando-se os nove primeiros números do CPF e multiplicando-os da seguinte maneira.1.

nSubTotal. end.Create(Application). begin Result := True. Até a próxima. nTotal := nTotal + nSubTotal.. nMod.Página Nr. end. nDv: Integer.Este formulário precisa do Formulário F_Cidade já criado para funcionar. if nDv > 9 then nDv := 0. inc(nMod).A função MOD dá exatamente o resto de uma divisão. Se o valor deste primeiro dígito for maior que 9 o resultado é 0.Free. o segundo por 10 e assim sucessivamente até o décimo número por 2. o primeiro por 11.Cliente1Click(Sender: TObject). PDF criado por: Idelson Pessoa da Silva – idelson@bol. nSubTotal := (StrToInt(sChar) * nMod). 1). if sNumCgc = '' then Exit.12).br .Neste sistema não precisaremos.. J. J. e retire o formulário F_Cliente da área dos Auto-Create forms (retire também o F_Ficha caso você ainda não o fez) ☞ Importante . F_Cliente. end. var I. sChar.Critica_CGC(sNumCgc: String) : boolean.ShowModal. aplica-se a mesma fómula anterior para encontrar o resultado do segundo dígito. end. ☞ Importante . sNumCgcCalc := sNumCgcCalc + IntToStr(nDv). 139/178 . sNumCgcCalc: String. begin F_Cliente := TF_Cliente.com. mas vou colocar aqui os códigos caso você precise. adiciona-se este digito aos outros nove e realiza-se uma nova multiplicação com os 10 números da seguinte maneira. function TD_Modelo. for J := Length(sNumCgcCalc) downto 1 do begin sChar := Copy(sNumCgcCalc. nTotal. if nMod > 9 then nMod := 2. Também chame a partir do menu principal Project | Options. Finalmente Agora basta você voltar para o formulário F_Menu para fazer a inserção dos comandos para chamar o formulário: procedure TF_Menu. sNumCgcCalc := Copy(sNumCgc. da função para a crítica do CGC de Empresas. for I := 1 to 2 do begin nMod := 2. F_Cliente.1. Result := (sNumCgcCalc = sNumCgc). F_Grupo e F_Alimento. nDv := (11 . Agora cabê a você a criação dos formulários F_Cidade. nTotal := 0.(nTotal mod 11)).

nesta apostila começaremos as primeiras movimentações do nosso projeto. Align: alTop 3.3.0 versão Client/Server Suite BDE 5. A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: 1.1. BevelInner: bvLowered 2.Caloria: PDF criado por: Idelson Pessoa da Silva – idelson@bol. BorderStyle: bsDialog 1. Salve o formulário com o nome de fEntrada.com.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Objeto : DBDateEdit97 Seguintes Imagens : ImgLamp. A movimentação basicamente é dividida em duas fases: dados de Entrada ou dados de Saída.com. Position: poScreenCenter 1.BMP Prefácio Salve. ImgGrava. nesta vamos analisar a movimentação para Dados de Entrada. 140/178 .1. Entrada de Clientes Inicialmente vamos construir a parte da movimentação relativa a Entrada de Clientes. Crie um objeto do tipo TPanel e altere as seguintes propriedades: 2. ImgCancela.4. Crie dentro deste Panel seis objetos do tipo Label e altere as seguintes propriedades 3.1.0 .br .BMP. Caption: Entrada de Clientes 1.BMP.Curso de Delphi 4. Name: F_Entrada 1.Apostila 13 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.3.Página Nr. BorderWidth: 4 2. é o momento em que o Cliente entra no SPA e é cadastrado em algum plano 1.BMP. Propriedade Caption (respectivamente): CPF: [Nome do Cliente] Data: Plano: Qtd. ImgTerc. Esta fase deve ser lembrada como um formulário fácil e simples para que o usuário não se confunda com o processo que ele realizará.5.2.PAS 2.2.br Pré-Requisitos: Windows 98 Delphi 4.

1.1.5. Glyph: ImgTerc. DataSet: D_Modelo.Color = clMaroon Font. volte para o formulário F_Entrada e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *.1. Propriedade Font para: Font.3.4. Flat: True 6.4.1. Estique-o para ficar com o tamanho do Panel Importante .Style = [fsBold] 3.2.3. LabNOM_CLIENTE 3. Name: ButIncCliente 6.4.Abra o Data Module D_Modelo.1.2.BMP 6.tbPasta_Cliente 4.1. 4.4. Crie um objeto do tipo DataSource e altere as seguintes propriedades: 4.Página Nr.3.2. DataSource: dsPasta_Cliente ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol. Crie dentro do objeto Panel1 dois objetos do tipo DBRadioGroup e altere as seguintes propriedades 8. Font.1. Para o segundo Label altere as seguintes propriedades 3.1. Name: ButLocCliente 6.2.1.2. Para o primeiro SpeedButton: 6.1. Name: dsPasta_Cliente 5. Para o primeiro DBRadioGroup: 8.2. 141/178 . Font.5.2.2.Color: clNavy 7.2. Para o segundo SpeedButton: 6.com. Ao lado deste objeto criado crie mais dois objetos do tipo SpeedButton e altere as seguintes propriedades: 6.1.4. Flat: True 6. Propriedade AutoSize para True.br . menos para o segundo Label 3. Crie dentro do objeto Panel1 um objeto do tipo dbDateEdit97 e altere as seguintes propriedades 7.2.1.1. Crie dentro deste Panel um objeto do tipo dbEdit e altere as seguintes propriedades 5. ShowHint: True 6.DFM} uses dModelo. Name: EditNUM_CPF 6. DataField: DAT_CORRENTE 7.Observação: 3.1. DataSource: dsPasta_Cliente 7. Name: EditDAT_CORRENTE 8. Hint: Localiza determinado Cliente 6.4. DataSource: dsPasta_Cliente 5.2. DataField: NUM_CPF 5.4.2.BMP 6. ShowHint: True 7.1. Glyph: ImgLamp. Hint: Chama o cadastro de Clientes 6.3.Color: clNavy 5.3.2.

D 8.com.1.3.2. Caption: &Fechar 11.5. ShowHint: True 11.2.BMP 11. Font. Items: (Um por Linha) Plano Anti-Stress Plano Reeducação Plano Completo Plano Especial de Reeducação 8.Página Nr. Font.4.3.500 KCal 1.2. C. Para o primeiro BitBtn: 11.2. 1500 .1. Values: (Um por Linha) A.1. DataField: QTD_CALORIA 8.2. DataField: PLN_ADOTADO 8.4.2.1.2. Kind: bkClose 11.1.2.3. Hint: Grava os dados na Pasta do Cliente 11. Columns: 2 8.2. Columns: 2 9. DataField: OBS_PASTA 9.1. Para o terceiro BitBtn: 11.3.Color: clNavy 8. Name: ButCancela 11.1.2.2. 142/178 .3. ShowHint: True O trabalho final ficou desta maneira: PDF criado por: Idelson Pessoa da Silva – idelson@bol. Values: (Um por Linha) 0800 .1.Color: clNavy 9. ShowHint: True 11.BMP 11. Items: (Um por Linha) 800 KCal 1.2.2. Hint: Fecha esta janela retornando ao menu do sistema 11.Color: clNavy 8. Glyph: ImgGrava.B.3.4.200 KCal 1.2.1.5. Name: ButGrava 11.2.1.4.5.1.1. 1200 .3. Caption: &Grava 11.4. DataSource: dsPasta_Cliente 9. 11.1.1.6.4. Glyph: ImgCancela.8.000 KCal 1. Hint: Cancela e limpa a entrada dos dados 11.5. 1000 . Caption: &Cancela 11.6. Crie dentro do objeto Panel1 um objeto do tipo DBMemo e altere as seguintes propriedades 9.3.2.2.br . Name: MemoOBS_PASTA 10.1. Acerte a propriedade TabOrder para a sequência correta.1.3. DataSource: dsPasta_Cliente 8.2. Para o segundo DBRadioGroup: 8.2.800 KCal 8.3. Para o segundo BitBtn: 11.3. 1800 8. Abaixo do Objeto Panel1 crie três objetos do tipo BitBtn e altere as seguintes propriedades: 11. Font.

a programação aqui é uma coisa rápida é direta.FormShow(Sender: TObject).Open. end. SelPesquisa.tbPasta_Cliente. ela não deve ser aplicada em situações de risco.com.DFM} uses dModelo. Agora abaixo da diretiva de compilação crie o procedimento proposto: {$R *. begin with D_Modelo do begin tbCliente. SelPesquisa. end.Programando a Entrada Lembre-se. como por exemplo um cadastro. 143/178 .Tabela := tbCliente. LabNOM_CLIENTE.Insert. begin D_Modelo. Este procedimento será chamado toda vez que for feito uma nova inclusão na tabela Pasta Cliente. 3.Página Nr. Selecione agora o evento OnShow do formulário: procedure TF_Entrada.Caption := ''. Inicialmente alterne para a Code Editor e na seção Private crie a seguinte chamada para o procedimento: private procedure AcertaInsercao.AcertaInsercao. end.Open.NomeTela := 'Seleciona Determinado Cliente'. 1. tbPasta_Cliente. AcertaInsercao. procedure TF_Entrada.br . public 2. PDF criado por: Idelson Pessoa da Silva – idelson@bol.

begin if EditNUM_CPF.EditNUM_CPFExit(Sender: TObject).Post. 144/178 . tbPasta_Cliente. begin if EditNUM_CPF.Close.br . primeiro o botão responsável para realizar a Gravação na Pasta para tanto de um duplo-clique no objeto ButGrava para ativar o evento OnClick: procedure TF_Entrada. Fazemos duas críticas simples apenas para controlar se o CPF foi preenchido e se o nome do cliente foi encontrado (o que significará que o cliente existe). end. Programando o Cliente A ligação entre a tabela Pasta_Cliente e Cliente deverá ser totalmente controlada aqui. tbPasta_Cliente. var Action: TCloseAction).Página Nr. if LabNOM_CLIENTE. então gravamos o dado e simplesmente chamamos o procedimento para reativar o estado de inserção. Este aqui é simplesmente disparar um comando Cancel para a tabela e chamarmos o procedimento para reativar o estado de inserção. poderiamos usar do objeto CmpTerc para fazer este controle (igual fizemos no cadastro) mas preferi deixar o Cliente solto.Close. Vamos começar com os botões. depois aberta a tabela em que será realizada toda a movimentação a tbPasta_Cliente e chamado o procedimento particular para colocá-la em estado de inserção.Cancel.ButCancelaClick(Sender: TObject). D_Modelo. simplesmente fechamos as tabelas cancelando o estado de inserção da tabela principal. Aqui é relativamente simples.Text <> '' then with D_Modelo.Text = '' then raise exception. end. e aberta a tabela acessória tbCliente e organizado os campos dentro do objeto SelPesquisa localizado na D_Modelo. begin D_Modelo. begin with D_Modelo do begin tbCliente.tbCliente do PDF criado por: Idelson Pessoa da Silva – idelson@bol.tbPasta_Cliente.com.create('Cliente não informado').tbPasta_Cliente.FormClose(Sender: TObject. AcertaInsercao. end. então vamos aos passos: 1. O segundo botão é o responsável para realizar o Cancelamento dos dados para tanto de um duplo-clique no objeto ButCancela para ativar o evento OnClick: procedure TF_Entrada.Toda vez que o formulário for ativado. 4. 6. 5.create('Cliente não cadastrado').Caption = '' then raise exception. end.ButGravaClick(Sender: TObject). Selecione o objeto EditNUM_CPF e chame o evento OnExit: procedure TF_Entrada. Selecione o evento OnClose do formulário: procedure TF_Entrada. AcertaInsercao.Cancel.

A pior coisa de um sistema. então pesquisamos na tabela Cliente com o valor informado. é o momento em que o Cliente é pesado e sua massa é mostrada em um cálculo (Recorde este cálculo na apostila referente ao Levantamento dos Dados): 1.5. BorderStyle: bsDialog 1.Free. exatamente como é feito no menu principal.AsString. O primeiro o botão localizado depois do campo é o responsável para realizar a Consulta do Cliente para tanto de um duplo-clique no objeto ButLocCliente para ativar o evento OnClick: procedure TF_Entrada.Text]) then LabNOM_CLIENTE.3. Inicialmente verificamos se foi preenchido algo no campo. end. Crie dentro deste Panel seis objetos do tipo Label e altere as seguintes propriedades PDF criado por: Idelson Pessoa da Silva – idelson@bol.ButIncClienteClick(Sender: TObject).ButLocClienteClick(Sender: TObject). para evitar isto o segundo botão é o responsável para chamar o Cadastro de Cliente para tanto de um duplo-clique no objeto ButIncCliente para ativar o evento OnClick: procedure TF_Entrada. 145/178 .Execute then EditNUM_CPF. raise exception. São comando simples.PAS 2. caso contrário volta o cursor para o objeto EditNUM_CPF e mostra a mensagem de erro.br . F_Cliente.Text := tbClienteNUM_CPF.ShowModal.Caption := FieldByName('NOM_CLIENTE').2. Salve o formulário com o nome de fMassa. Crie um objeto do tipo TPanel e altere as seguintes propriedades: 2.2.3.1. Aqui apenas disparamos a chamada ao formulário de Cliente. 2.if FindKey([EditNUM_CPF. A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: 1. não se esquece de adicionar o formulário fCliente a cláusula USES. F_Cliente. Name: F_Massa 1. BorderWidth: 4 2.Página Nr. executamos o objeto SelPesquisa e caso ele traga uma resposta verdadeira apenas adicionamos o valor do campo NUM_CPF da tabela cliente ao objeto EditNUM_CPF. BevelInner: bvLowered 2.com.1. end. é por exemplo o Cliente não estar cadastrado e o usuário ser obrigado a sair da tela em que se encontra e cadastrar o cliente e depois retornar. end. 3.SetFocus.AsString else begin EditNUM_CPF. caso encontre coloca o nome do cliente no Label destinado para tal. Caption: Massa Corporal 1. Massa Corporal Outro exemplo de movimentação de entrada é o formulário para fazer a Massa Corporal.Create(Application). Align: alTop 3. Position: poScreenCenter 1. begin with D_Modelo do if SelPesquisa. begin F_Cliente := TF_Cliente.create('Cliente não cadastrado').4. end.

1. DataSource: dsPeso_Cliente 5. Glyph: ImgLamp.DFM} uses dModelo.Color = clMaroon Font.2.3.2.3. Para o primeiro SpeedButton: 6.3.4.1. Hint: Localiza determinado Cliente 6.com.1. 3. Flat: True 6. Crie dentro deste Panel um objeto do tipo dbEdit e altere as seguintes propriedades 5. Hint: Chama o cadastro de Clientes 6. Ao lado deste objeto criado crie mais dois objetos do tipo SpeedButton e altere as seguintes propriedades: 6. Para o segundo Label altere as seguintes propriedades 3.1.Página Nr.2.2. Name: dsPeso_Cliente 5.2. Crie dentro do objeto Panel1 um objeto do tipo dbDateEdit97 e altere as seguintes propriedades 7.4.Style = [fsBold] Para destacar aumente a fonte do último objeto para 11. Para o segundo SpeedButton: 6. 146/178 .1. Font. DataField: NUM_CPF 5. volte para o formulário F_Entrada e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *.1.br . LabNOM_CLIENTE 3. Propriedade AutoSize para True. ShowHint: True 6. Name: EditNUM_CPF 6. Propriedade Font para: Font.1. ShowHint: True 7. menos para o segundo Label 3. Propriedade Caption (respectivamente): CPF: [Nome do Cliente] Data: Peso: em Kg Massa Corporal é: 3.1.1.4.2.Abra o Data Module D_Modelo.1.4.4.2. Estique-o para ficar com o tamanho do Panel Importante . Name: ButLocCliente 6.tbPeso_Cliente 4.3.4.2.2. Crie um objeto do tipo DataSource e altere as seguintes propriedades: 4.2. DataSource: dsPeso_Cliente ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol.5.2. Name: ButIncCliente 6.3.2.1. DataSet: D_Modelo. 4.5. Flat: True 6.1.BMP 6. Glyph: ImgTerc.Color: clNavy 5.BMP 6.1.

2.4. Font.2.1. Glyph: ImgGrava.3. Name: ButGrava 10.2.BMP 10. 1.2.1.2. Glyph: ImgCancela.br . Caption: &Fechar 10.1.com.7.2.1.4.3. Name: EditPES_MEDIDO 9. Para o terceiro BitBtn: 10. Kind: bkClose 10. Hint: Cancela e limpa a entrada dos dados 10.3. 10.4.BMP 10. Para o segundo BitBtn: 10. ShowHint: True 10.3. Abaixo do Objeto Panel1 crie três objetos do tipo BitBtn e altere as seguintes propriedades: 10. Name: ButCancela 10.2. Hint: Grava os dados na Pasta do Cliente 10.1.3.3. Para o primeiro BitBtn: 10. DataField: PES_MEDIDO 8.5.3.Página Nr.3.2.Color: clNavy 8.4.1.2. ShowHint: True 10. como por exemplo um cadastro. Crie dentro deste Panel um objeto do tipo dbEdit e altere as seguintes propriedades 8.1.3.2. ShowHint: True O trabalho final ficou desta maneira: Programando a Massa Novamente vou frisar que a programação aqui é uma coisa rápida é direta. Name: EditDAT_MEDIDO 8. Acerte a propriedade TabOrder para a sequência correta.1.1. DataField: DAT_MEDIDO 7.2.Color: clNavy 7.1. Inicialmente alterne para a Code Editor e na seção Private crie a seguinte chamada para o procedimento: PDF criado por: Idelson Pessoa da Silva – idelson@bol. 147/178 . Font. DataSource: dsPeso_Cliente 8.5. Hint: Fecha esta janela retornando ao menu do sistema 10.3.4. Caption: &Cancela 10. ela não deve ser aplicada em situações de risco. Caption: &Grava 10.

NomeTela := 'Seleciona Determinado Cliente'.ButGravaClick(Sender: TObject). Agora abaixo da diretiva de compilação crie o procedimento proposto: {$R *.DFM} uses dModelo.AcertaInsercao. simplesmente fechamos as tabelas cancelando o estado de inserção da tabela principal. begin D_Modelo. 148/178 .br .tbPeso_Cliente.FormClose(Sender: TObject. 3. SelPesquisa.Insert. 5.Open. end. begin with D_Modelo do begin tbCliente. primeiro o botão responsável para realizar a Gravação do Peso para tanto de um duplo-clique no objeto ButGrava para ativar o evento OnClick: procedure TF_Massa. Aqui é relativamente simples. begin with D_Modelo do begin tbCliente. Vamos começar com os botões. 4.Caption = '' then raise exception.FormShow(Sender: TObject). end. public 2.create('Cliente não cadastrado'). Toda vez que o formulário for ativado. depois aberta a tabela em que será realizada toda a movimentação a tbPeso_Cliente e chamado o procedimento particular para colocá-la em estado de inserção.Post. procedure TF_Massa. D_Modelo.Cancel. Selecione o evento OnClose do formulário: procedure TF_Massa. Este procedimento será chamado toda vez que for feito uma nova inclusão na tabela Peso Cliente. tbPeso_Cliente.Text = '' then raise exception.Página Nr. tbPeso_Cliente. LabNOM_CLIENTE.Caption := ''. tbPeso_Cliente.com. SelPesquisa.Tabela := tbCliente.private procedure AcertaInsercao. e aberta a tabela acessória tbCliente e organizado os campos dentro do objeto SelPesquisa localizado na D_Modelo. Selecione agora o evento OnShow do formulário: procedure TF_Massa. end.create('Cliente não informado'). PDF criado por: Idelson Pessoa da Silva – idelson@bol. AcertaInsercao. if LabNOM_CLIENTE. end.Close. begin if EditNUM_CPF.tbPeso_Cliente.Close. end. end.Open. var Action: TCloseAction). AcertaInsercao.

EditPES_MEDIDOExit(Sender: TObject). end. begin F_Entrada := TF_Entrada.ShowModal.ButCancelaClick(Sender: TObject). end. end. AcertaInsercao. na saída da informação do peso. with LabMAS_CLIENTE do if ind < 20 then Caption := Caption + ' (Abaixo do Peso)' else if ind < 26 then Caption := Caption + ' (Normal)' else if ind < 30 then Caption := Caption + ' (Excesso de Peso)' else if ind < 40 then Caption := Caption + ' (Obsidade)' else Caption := Caption + ' (Obsidade Mórbida)'.AsInteger / ((tbClienteALT_CLIENTE. begin D_Modelo. LabMAS_CLIENTE. Este aqui é simplesmente disparar um comando Cancel para a tabela e chamarmos o procedimento para reativar o estado de inserção. mas ao invés de repetir todos os comandos prefiro que você volte e veja na seção anterior como isso é feito.Caption := 'Massa coorporal é: ' + IntToStr(Ind). var ind: Integer. Pronto. O segundo botão é o responsável para realizar o Cancelamento dos dados para tanto de um duplo-clique no objeto ButCancela para ativar o evento OnClick: procedure TF_Massa.Cancel. Finalmente Agora basta você voltar para o formulário F_Menu para fazer a inserção dos comandos para chamar os formulários: procedure TF_Menu.Free. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 6.Caption <> '' then begin with D_Modelo do ind := Round(tbPESO_CLIENTEPES_MEDIDO. 149/178 . begin if LabNOM_CLIENTE. novamente vou frisar que se você não lembra como é realizado isto recorra a apostila referente ao Levantamento dos Dados. F_Entrada.Create(Application). então gravamos o dado e simplesmente chamamos o procedimento para reativar o estado de inserção.AsInteger / 100))). end. que até poderia copiar é o Programando o Cliente. F_Entrada. então selecione o objeto EditPES_MEDIDO e chame o evento OnExit: procedure TF_Massa. é calculada a massa corporal.EntradadoCliente1Click(Sender: TObject).com. A principal parte diferente aqui é quanto ao cálculo da massa corporal.tbPeso_Cliente. apensa se existir um cliente pois precisamos saber da altura do cliente para o cálculo de sua massa.br .Página Nr.Fazemos duas críticas simples apenas para controlar se o CPF foi preenchido e se o nome do cliente foi encontrado (o que significará que o cliente existe).AsInteger / 100) * (tbClienteALT_CLIENTE. Últimos Passos Um passo.

MassaCorporal1Click(Sender: TObject). e retire os formulários F_Entrada e F_Massa da área dos Auto-Create forms. F_Massa.Free.Create(Application). portanto esteje preparado.. begin F_Massa := TF_Massa. F_Massa.br .com. 150/178 . Também chame a partir do menu principal Project | Options.. PDF criado por: Idelson Pessoa da Silva – idelson@bol.ShowModal.Página Nr. end.procedure TF_Menu. Na próxima apostila vamos criar uma movimentação um tanto mais complexa.

Página Nr.5. 1.Abra o Data Module D_Modelo. Saída de Clientes Vamos construir a parte da movimentação relativa a Saída de Clientes.1. Position: poScreenCenter 1.0 versão Client/Server Suite BDE 5.br . DataSet: D_Modelo.com. Salve o formulário com o nome de fSaida.DFM} uses dModelo.BMP ImgLocaliza.3. é o momento em que o Cliente está saindo do SPA e precisa efetuar o pagamento.1.br Pré-Requisitos: Windows 98 Delphi 4.BMP Prefácio Salve.Apostila 14 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. BorderStyle: bsDialog 1. Caption: Saída de Clientes 1.2.com. nesta apostila vamos concluir as movimentações do nosso projeto. aquele famoso Tchan para ficar completo. na verdade são dados já colocados nas tabelas mas que faltam a informação final. 151/178 .BMP ImgGrava. Crie um objeto do tipo DataSource e altere as seguintes propriedades: 2. não associe os dados de saída como retirada ou qualquer outra coisa parecida.Curso de Delphi 4.00 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Objeto : DBDateEdit97 Seguintes Imagens : ImgCalc. 2.PAS ☞Importante . A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: 1.tbPasta_Cliente PDF criado por: Idelson Pessoa da Silva – idelson@bol.0 . Name: F_Saida 1. Nesta segunda fase mostrarei como coordenar dados de Saída. volte para o formulário F_Saida e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *.4.

br .3.Style = [fsBold] ☞ Importante . Propriedade Caption (respectivamente): Cliente: Dt.Caloria: KCal Observação: Dt.2. Glyph: ImgLocaliza. ShowHint: True 4.5. Caption: &Localizar 5. BevelInner: bvLowered 6.Caloria e o label Observação 8.Color = clMaroon Font.1.4.Pagamento: Valor: Desconto: Total a Pagar: 7. DataSource: dsPasta_Cliente 4. Crie dentro do objeto Panel2 dez objetos do tipo Label e altere as seguintes propriedades: 7.3. Shape: bsBottomLine PDF criado por: Idelson Pessoa da Silva – idelson@bol.nbPrior. Crie dentro do objeto Panel1 um objeto do tipo dbNavigator e altere as seguintes propriedades 4. Name: DbNavega 4. Crie agora um segundo objeto do tipo TPanel e altere as seguintes propriedades: 6.2.1.4. BorderWidth: 4 6.Chegada: Plano: Qtd.2. Propriedade Font para: Font.1. Align: alTop 4.2.3.nbNext. Align: alTop 7.2. Crie um objeto do tipo TPanel e altere as seguintes propriedades: 3.nbLast] 5.5.Aqui vão algumas observações: a. ShowHint: True 6.2.Caloria com um espaço para colocar um campo c.2.com. Crie dentro do objeto Panel2 um objeto do tipo Bevel e altere as seguintes propriedades 8. Deixe um espaço entre o label Cliente e Dt.BMP 5.Chegada b. Name: ButLocaliza 5.Página Nr. 152/178 .1. Caption: 3. Name: dsPasta_Cliente 3. Hints: Primeiro Registro Próximo Registro Registro Anterior Último Registro 4. O label KCal fica na frente do Label Qtd.1.1. Deixe um espaço entre o Label Qtd. Crie dentro do objeto Panel1 um objeto do tipo BitBtn e altere as seguintes propriedades 5. VisibleButtons: [nbFirst. Hint: Localiza Determinada Pasta do Cliente 5.

153/178 .Página Nr. TabStop: False 10. Crie dentro do objeto Panel2 na frente do Label Plano um objeto do tipo Edit e altere as seguintes propriedades 11. Name: EditNOM_PLANO 11. DataSource: dsPasta_Cliente 13. Glyph: ImgCalc. Color: clBtnFace 9.1. DataSource: dsPasta_Cliente 9.7. DataSource: dsCliente 10.2.3. Font.2. ReadOnly: True ☞ Importante . Font. EditDAT_CORRENTE e EditQTD_CALORIA 9.Chegada e Qtd. 15.Color: clMarron 10.6. Flat: True 15.Caloria respectivamente.Color: clNavy 12.5.4.2.1.3. Name: ButCalcDesconto PDF criado por: Idelson Pessoa da Silva – idelson@bol.☞Importante .2.2.br . Acerte a propriedade TabOrder desses três últimos objetos para uma sequência correta a partir do zero.1.4. DAT_CORRENTE e QTD_CALORIA 9.1. Crie dentro do objeto Panel2 abaixo do objeto EditNUM_CPF mais um objeto do tipo dbEdit e altere as seguintes propriedades: 10.3. Color: clBtnFace 10. Crie dentro do objeto Panel2 na frente do Label Valor e Desconto respectivamente dois objetos do tipo dbEdit e altere as seguintes propriedades: 13. DataField (respectivamente): NUM_CPF. Font.3.4. Font. Hint: Calcula o Desconto Padrão 15.Posicione-os em frente aos labels Cliente. ReadOnly: True 12. Crie dentro do objeto Panel2 três objetos do tipo dbEdit e altere as seguintes propriedades: 9. TabStop: False 11.Este objeto foi criado apenas para separar os dados. Font. DataField: DAT_PAGAMENTO 12. ReadOnly: True 11.4. Name: EditNOM_CLIENTE 10.Caloria e Observação 9.3. Crie dentro do objeto Panel2 na frente do Label Dt. DataSource: dsPasta_Cliente 12. Name: EditDAT_PAGAMENTO 13.1.Color: clMarron 11.5.1. Name (respectivamente): EditNUM_CPF.4.Color: clMarron 9.4.Color: clNavy 13.2. TabStop: False 9. Name (respectivamente): EditVAL_TOTAL e EditVAL_DESCONTO 14. DataField: NOM_CLIENTE 10.2. Color: clBtnFace 11. coloque-o entre os Labels Qtd. 10.Pagamento um objeto do tipo dbDateEdit97 e altere as seguintes propriedades 12.BMP 15. Crie dentro do objeto Panel2 na frente do objeto EditVAL_DESCONTO um objeto do tipo SpeedButton e altere as seguintes propriedades: 15.2.4. DataField (respectivamente): VAL_TOTAL e VAL_DESCONTO 13. Dt.com.3.

Abaixo do Objeto Panel2 crie dois objetos do tipo BitBtn e altere as seguintes propriedades: 17.3. ShowHint: True 16. 154/178 . Para o primeiro BitBtn: 17. Alignment: taRightJustify 16.2.Color: clMaroon 17. Para o segundo BitBtn: 17.3. a idéia é que o usuário localize na tabela Pasta Cliente a entrada deste Cliente.com.5.1.4.4. Caption: &Grava 17.2.5.1. Name: ButGrava 17.15.1.BMP 17.1. BorderStyle: bsSingle 16.1. pode ser se você desejar colocar coisas homéricas.2.2.2. ShowHint: True O trabalho final ficou desta maneira: Programando a Saída A programação aqui (ainda bem que estamos tratando do Delphi) não é algo tão complicado.1. Font.br . Kind: bkClose 17.1.3. Height: 21 16.6. BevelOuter: bvNone 16.2. acompanhe PDF criado por: Idelson Pessoa da Silva – idelson@bol.Página Nr. Glyph: ImgGrava. mas lembre-se que o mesmo Cliente pode visitar várias vezes o SPA então precisamos restringir os registros.5. Caption: &Fechar 17.2.4. Hint: Grava os dados na Pasta do Cliente 17.1. Hint: Fecha esta janela retornando ao menu do sistema 17. ShowHint: True 17. Name: PnlTotal 16.2.1. Crie dentro do objeto Panel2 na frente do label Total a Pagar um objeto do tipo Panel e altere as seguintes propriedades: 16.

end.br . begin with D_Modelo do begin SelPesquisa. MasterFields := ''.atentamente a codificação: 1. eliminamos o filtro da tabela. e ativado um relacionamento entre a tabela tbCliente e tbPasta_Cliente e é aberta a tabela acessória tbCliente e depois é ativado um filtro para a tabela tbPasta_Cliente permitindo que sejam mostrados apenas os registros aonde o Valor ainda é 0 (ou menor. private VlDesconto: Double. end.NomeTela := 'Seleciona Determinada Pasta Cliente'. Filtered := True. Filtered := False. Open. Selecione agora o evento OnShow do formulário: procedure TF_Saida.Tabela := tbPasta_Cliente. end. end. aplicando um comando Cancel na tabela caso os dados estejam em momento de edição (para não acontecer uma gravação equivocada. with tbPasta_Cliente do begin Filter := 'VAL_TOTAL < 0'. 3. SelPesquisa. MasterSource := Nil. Inicialmente alterne para a Code Editor e na seção Private crie uma variável para acumular o valor de um desconto dado. end. Selecione o evento OnClose do formulário: procedure TF_Saida. MasterFields := 'NUM_CPF'. Neste momento fechamos inicialmente a tabela principal. Filter := ''. isso incluirá os nulos) e aberta a tabela em que será realizada toda a movimentação a tbPasta_Cliente. é organizado os campos dentro do objeto SelPesquisa localizado na D_Modelo. Close. var Action: TCloseAction).Página Nr. o segundo passo é fechar a tabela ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. public 2. end.State = dsEdit then Cancel.Abra a tabela ascessória primeiramente (no caso tbCliente).FormClose(Sender: TObject.FormShow(Sender: TObject). begin with D_Modelo do begin with tbPasta_Cliente do begin if dsPasta_Cliente. with tbCliente do begin MasterSource := dsPasta_Cliente. end. Open. end. se o usuário quer gravar então ele deve apertar o botão Grava) depois de fechada. 155/178 . Toda vez que o formulário for ativado. Importante . pois existirá uma dependência no evento quando os dados serão mudados do objeto DsPasta_Cliente que necessitará que esta tabela esteje aberta. with tbCliente do begin Close.

É um simples comando aqui apenas executamos o objeto SelPesquisa ele se encarregará de posicionar no registro correto. Este agora é o coração de todo o formulário.ButCalcDescontoClick(Sender: TObject).Text := FloatToStr(D_Modelo. end. O botão ao lado do EditVAL_DESCONTO é o responsável para calcular um desconto concedido para tanto de um duplo-clique no objeto ButCalcDesconto para ativar o evento OnClick: procedure TF_Saida. 7. 6. Selecione o objeto EditVAL_TOTAL e chame o evento OnExit: procedure TF_Saida. end.Post.tbPasta_Cliente do PnlTotal.br . Aqui não precisamos nos preocupar em colocar a tabela em momento de inserção pois o Delphi trata isto automaticamente.Create('Valor não informado').Text = '' then Raise Exception. 5.Text = '' then Raise Exception. 4. então calculamos o desconto com base na variável VlDesconto. [(FieldByName('VAL_TOTAL'). Aqui será feito para calcularmos o valor total a pagar.Execute.Caption := Format('%10. O botão localizado ao lado da barra de navegação é o responsável para realizar a Consulta a Pasta Cliente para tanto de um duplo-clique no objeto ButLocaliza para ativar o evento OnClick: procedure TF_Saida.Create('Data de Pagamento não informada'). 9. clique na seta que aparece ao lado do campo e coloque nele a chamada EditVAL_TOTALExit. então simplesmente gravamos o dado.Text <> '' then with D_Modelo.SelPesquisa.ButGravaClick(Sender: TObject). automaticamente. Vamos começar com os botões. end. begin if EditVal_Total.secundária. 156/178 . no momento da saída do campo Valor e do campo Desconto.mtInformation.Página Nr.AsFloat * VlDesconto) else MessageDlg('Informe primeiro o Valor'.[mbOk].tbPasta_Cliente.AsFloat)]). Verificamos se o Valor do Pagamento já foi preenchido. begin D_Modelo.tbPasta_ClienteVal_Total. Fazemos duas críticas simples apenas para controlar se a Data e o Valor de pagamento foram preenchidos. 8.ButLocalizaClick(Sender: TObject). begin if EditDAT_PAGAMENTO.0).Text <> '' then EditVAL_DESCONTO. Também. Selecione o objeto EditVAL_DESCONTO e localize o evento OnExit. begin if EditVal_Total. selecione o objeto PDF criado por: Idelson Pessoa da Silva – idelson@bol. o registro sumirá da tela. primeiro o botão responsável para realizar a Gravação na Pasta para tanto de um duplo-clique no objeto ButGrava para ativar o evento OnClick: procedure TF_Saida. end.AsFloat . é aqui que a maior parte foi projetada. if EditVAL_TOTAL. por causa do Filtro ativo.EditVAL_TOTALExit(Sender: TObject). eliminando também a dependência entre as duas tabelas. D_Modelo.2m'.com.FieldByName ('VAL_DESCONTO').

Caption := Format('%10.AsString = 'A' then EdtNOM_PLANO.0.0. 6: AcertaDesc('17'.com.Caption := 'Observação: Esta é a ' + Fields[0].Caption := 'Desconto:'.Add('Where (NUM_CPF = ''' + EditNUM_CPF.00]). 3: AcertaDesc('10'. procedure AcertaDesc(ValS: String. LabObserva.2m'. o brincadeira é a seguinte.2). 8: AcertaDesc('19'. Olhando assim parece complicado mas não precisamos temer tanto.Caption := 'Desconto ' + ValS + '%:'. if EditVal_Total.AsString = 'C' then EdtNOM_PLANO.Página Nr. SQL.DsPasta_Cliente e dê um duplo-clique no evento OnDataChange: procedure TF_Saida. end. 4: AcertaDesc('15'.Text + ''')').0.'. end. if not EOF then begin LabObserva.0.FieldByName ('VAL_DESCONTO'). end. 157/178 . SQL.AsInteger of 2: AcertaDesc('5'. Open.AsString = 'D' then EdtNOM_PLANO. [0. ValN: Double). else if Fields[0].AsFloat . VlDesconto := ValN. Field: TField).17). LabDesconto.AsString = 'B' then EdtNOM_PLANO.br .Caption := 'Observação: Não existe'. begin LabDesconto.Text := 'Plano Completo' else if FieldByName('PLN_ADOTADO'). end. with D_Modelo do with QrySQL do begin if Active then Close.AsInteger > 8 then AcertaDesc('20'.18). 7: AcertaDesc('18'.15). SQL.0. inicialmente coloquei um procedimento dentro para mostrar no LabDesconto se existe algum desconto cedido.Text := ''.0. end.1).Text <> '' then with D_Modelo. case Fields[0]. begin with D_Modelo.0. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 5: AcertaDesc('16'.Text := 'Plano Reeducação' else if FieldByName('PLN_ADOTADO').Clear.Caption := Format('%10. Close.Refresh.AsFloat)]) else PnlTotal.0.16). [(FieldByName('VAL_TOTAL'). D_Modelo.tbPasta_Cliente do if FieldByName('PLN_ADOTADO').05).Text := 'Plano Anti-Stress' else if FieldByName('PLN_ADOTADO'). VlDesconto := 0.dsPasta_ClienteDataChange(Sender: TObject. e setar a variável VlDesconto com este valor.Add('Select Count(NUM_CPF) from ' + NmPasta_Cliente).2m'.tbCliente.Text := 'Plano Especial de Reeducação' else EdtNOM_PLANO.AsString + 'ª visita deste cliente.tbPasta_Cliente do PnlTotal.19).

na anterior trabalhamos basicamente com o momento INSERT da tabela.ShowModal.Começando o procedimento realmente. F_Saida.. end. 3ª Visita = 10%.com. e finalmente damos um Refresh na tabela de Cliente para que o relacionamento feito entre ela e a tabela Pasta_Cliente possa ser efetivado. depois é calculado o valor a pagar (da mesma forma em que foi feito na saida dos campos EditVAL_TOTAL e EditVAL_DESCONTO). após concluirmos esta segunda fase da movimentação. 158/178 . Também chame a partir do menu principal Project | Options. Na próxima apostila vamos começar a analisar como são feitos relatórios.Página Nr.. tipo um Fechamento. e retire o formulário F_Saida da área dos Auto-Create forms. PDF criado por: Idelson Pessoa da Silva – idelson@bol. criarmos uma tabela idêntica. e verificamos qual o valor do desconto que pode ser concedido para este cliente (Lembra-se da regra: 2ª Visita = 5%. e admissível. Agora utilizaremos a Query ascessória para pesquisarmos dentro da tabela Pasta Cliente quantas vezes este Cliente já veio ao SPA. passar os dados já gravados para uma segunda tabela. apenas para servir como arquivamento dos dados. solicitando mais alguns dados para finalmente finalizarmos este Cadastro.Free. era apenas uma entrada simples e básica.SaidadoCliente1Click(Sender: TObject). Acredito que você tenha reparado os dois processos de movimentação. também é possível. nesta aqui pegamos aqueles dados inseridos e trabalhamos um pouco mais. F_Saida.Create(Application). Em movimentações. inicialmente é verificado qual é o plano que o cliente optou. mostrando o nome do cliente corretamente. begin F_Saida := TF_Saida. Finalmente Agora basta você voltar para o formulário F_Menu para fazer a inserção dos comandos para chamar os formulários: procedure TF_Menu.br . verifique na parte do Levantamento dos Dados). ou seja.

principalmente porque existem milhares de diferentes etiquetas. após instalada coloque como papel padrão o Definido pelo Usuário e acerte as medidas em mm para: Largura: 1200 Comprimento: 410 E coloque 0 na área não imprimível (isto são as margens) Você pode estar se perguntando como cheguei a tão fabulosas medidas ? Simples vários testes. uma jato de tinta tem o comportamento diferente de uma matricial. infelizmente isso varia de cliente para cliente.01 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Objeto : DgOrdena DgFiltro Seguintes Imagens : ImgFiltra. A primeira coisa a fazermos é instalar a impressora no Windows. a menos que você utilize o Word ou um software específico para produzí-las descobrirá que com o Quick Report.br Pré-Requisitos: Windows 98 Delphi 4. o cliente resolveu utilizar uma impressora matricial padrão Epson FX-100 para fazer este serviço. acho isso uma coisa estremamente divertida principalmente quando o papel engargala (isso existe ?).Página Nr. Inicialmente já vou avisando aos fãs do Quick Report que não irei utilizá-lo para tal serviço.03 versão Client/Server Suite BDE 5.Curso de Delphi 4. vamos agora começar a melhor parte de todo o nosso projeto. o Windows adora ao final de cada impressão mandar um caracter especial de final de página que ordena a impressora para se posicionar no começo da próxima página. mas acredito que com um pouco de cuidado tudo se acerta. Etiquetas e o Windows Desde que me entendo trabalhando nesta área de informática tenho feito impressão com etiquetas. isso mesmo vamos imprimir etiquetas. o motivo é simples Etiquetas não são uma coisa que rimam muito bem com o Windows. você pode estar se perguntando também.BMP. o do SPA Antes & Depois pediu para que utilizassemos as etiquetas da marca PIMACO referência 10236MC com 1 Carreira o tamanho da Etiqueta é de 102 x 36.BMP. ImgImprime. às vezes nem eles tem contra mim. bem como as etiquetas são em formulário contínuo. isso é uma coisa (infelizmente) muito comum a quem se aventurar a fazer este tipo de impressão. 159/178 . gastei quase meia caixa de etiquetas testando. então como não gosto de PDF criado por: Idelson Pessoa da Silva – idelson@bol. então para esse serviço. Uma coisa importante neste jogo é saber em qual impressora vamos imprimir. ImgOrdena. Report Builder entre outros não são muito amigáveis para produzir este tipo de arquivo.0 . ImgSalva.br . Bem para essa primeira parte dos relatórios (serão três neste projeto) vamos criar o relatório de Etiquetas de Endereçamento.Apostila 15 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.com.com.BMP Prefácio Salve. Crystal Report. o pior é que existem milhares de modos de fazê-las.1 mm e são 8 etiquetas por folha (anote essas medidas pois elas são muito importantes). ImgTeste.BMP.BMP. mas porque defini o tamanho da página no tamanho de uma etiqueta e não das oito ? Simples também. mas que exige além de um certo cuidado e também uma boa dose de paciência. Relatórios. Então vou utilizar aqui os bons e velhos comandos do arquivo Text do Pascal e simplesmente redirecionar para a saída da impressora. Pessoalmente não tenho nada contra eles.

talvez você conheça milhares de outras maneiras de imprimir etiquetas com o Windows. Propriedade Font para: Font. Name: G_EtiqEnd 1.1.1. volte para o formulário F_Saida e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *.Cadastro. BorderStyle: bsDialog 1.Color = clMaroon Font. 160/178 . Esse é o jeito mais fácil ? Isso é uma excelente pergunta.2. vou criar uma consulta com o que precisa ser impresso e cada linha da minha consulta vou descarregar como um arquivo na saída da minha impressora.2. 5. Glyph: ImgFiltra ImgOrdena ImgSalva ImgTeste ImgImprime PDF criado por: Idelson Pessoa da Silva – idelson@bol. e também para não ter que ficar controlando o tamanho das minhas linhas dentro da etiqueta. e também para dizer ao nosso usuário o que estamos fazendo: 1. adoto a seguinte nomenclatura em meus forms: F . Salve o formulário com o nome de gEtiqEnd. Position: poScreenCenter 1.1.5.1.Página Nr. Criando o Formulário Vamos neste momento criar um pequeno formulário que servirá de auxílio.com. Crie um objeto do tipo TLabel e altere as seguintes propriedades: 3. A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: 1.3. ☞ Observação .PAS ☞Importante . isso mesmo se tiver 100 etiquetas para imprimir existirá 100 arquivos na saída da minha impressora.Geração de alguma coisa específica R . Caption: Selecione sua Opção: 3. Caption: Relatório de Etiquetas de Endereçamento 1.Abra o Data Module D_Modelo. Tabelas e Movimentações G .Note que mudei a primeira letra do formulário de F para G.perder etiquetas.2. Name: QryEtq 3.Style = [fsBold] 4.DFM} uses dModelo. Crie um objeto do tipo TQuery e altere as seguintes propriedades: 2.Dados 2. Crie cinco objetos do tipo TBitBtn e altere as seguintes propriedades respectivamente: 5. DataBase: DNmPeso 2.4.br . simples e eficaz. Crie um objeto do tipo TBevel e dê uma esticada nele. para que dentro caiba os próximos objetos. mas considero a maneira como a que vou fazer aqui a mais fácil. O que pretendo fazer aqui é um trabalho simples.Relatórios do Quick D .

Crie mais um objeto do tipo TBitBtn.2.2. Caption: Ativa as opções para se criar um Filtro.3.3.com. Name: DgOrdenaEtq 8.4. Salva o Relatório em formato Texto Testa a posição das Etiquetas Imprime as Etiquetas Retorna a Janela Anterior 8. Caption: Fil&tra &Ordena &Salva &Teste &Imprime 6.3.1.2.2.tbCliente 8. Name: SalvarArq O trabalho final ficou desta maneira: PDF criado por: Idelson Pessoa da Silva – idelson@bol. NomeTela: Determinando um filtro 9. Crie um objeto do tipo TDgFiltro e altere as seguintes propriedades 9.* 10. o Filtro permite que a seleção dos Registro mostrados sejam limitados. Filter: Arquivos TXT|*.2.tbCliente 9. DataSet: D_Modelo.1. Propriedade Font para: Font. TipoSQL: Access 10. Finalmente crie um objeto do tipo TSaveDialog e altere as seguintes propriedades 10.2.1.3. Permite ordenar o relatório por determinados campos. colocando-o para fora do objeto TBevel e altere as seguintes propriedades: 6. Name: ButFiltra ButOrdena ButSalva ButTeste ButImprime 5. DefaultExt: TXT 10. 161/178 . Crie cinco objetos do tipo TLabel (em frente de cada objeto TBitBtn) respectivamente: e altere as seguintes propriedades 7. Name: butFechar 6.Página Nr.1.1. DataSet: D_Modelo. NomeTela: Ordenação dos Registros 9. Kind: bkClose 6.3. Crie um objeto do tipo TDgOrdena e altere as seguintes propriedades 8.br . Name: DgFiltroEtq 9.Color = clNavy 7.TXT|Todos os Arquivos|*.5. Caption: &Fechar 7.

SQL. Inicialmente alterne para a Code Editor e na seção Private crie algumas coisinhas. mtInformation.Ordem > '' then SQL. 0).FiltroSQL > '' then SQL.com. if EOF then begin Result := False.AcertaSQL: boolean.SIG_CIDADE = CID. SQL. private pArqImpre: TextFile. function AcertaSQL: boolean. Para a Função AcertaSQL function TG_EtiqEnd.1. e por sinal minha favorita.SIG_UF').SIG_CIDADE').Página Nr. end PDF criado por: Idelson Pessoa da Silva – idelson@bol. // Filtro if DgFiltroEtq.END_CLIENTE. cid.Add('Order By ' + DgOrdenaEtq. begin with QryEtq do begin if Active then Close. cid.Clear.BAI_CLIENTE.NOM_CLIENTE.Add('Select cli.NOM_CIDADE.Add('On CLI. procedure ProduzEtq(Tipo: Integer).Add('From ' + nmCLIENTE + ' As CLI Left Join ' + nmCIDADE + ' As CID'). SQL. // Ordenação if DgOrdenaEtq. pDesLinha: String. cli. mas por favor acompanhe atentamente esta codificação que apesar de ser simples existem alguns macetes que devem ser observados: 1. 1. pTotEtq: Integer.Ordem). [mbOk].Add('Where ' + DgFiltroEtq. pTotEtq acumulará o total de etiquetas impressas e pDesLinha corresponde a uma linha do arquivo texto. public Quanto as variáveis: pArqImpre será o nosso arquivo texto gerado. SQL.CEP_CLIENTE.FiltroSQL). 162/178 .Programando a Saída Agora começamos com a parte mais divertida do trabalho.Add('cli. with D_Modelo do SQL.br . '). procedure EnviaEtq(Tipo: Integer). cli. MessageDlg('Não Existem Registros para Gerar as Etiquetas'. Open.

aqui montamos uma query simples associando a tabela de Cliente com a Tabela de Cidade (através do comando Left Join) as cláusulas Where e Order By são definidas pelos objetos DgFiltroEtq e DgOrdenaEtq respectivamente. mtInformation. Printer. end.FileName) else raise Exception. end. begin try if AcertaSQL then begin AcertaFont. Total de ' + IntToStr(pTotEtq) + ' etiqueta(s)'. pTotEtq := 0. var FColFont : TFont.Font. Total de ' + IntToStr(pTotEtq) + ' etiqueta(s)'.Close. if tipo = 2 then begin if SalvarArq. Este procedimento é o responsável pelo controle da geração.Assign(fColFont). gera o arquivo de saída (caso a saída seja através de um arquivo físico). [mbOk]. fColFont. 163/178 . Está função é a responsável pela montagem do SQL no objeto QryEtq.Execute then AssignFile(pArqImpre. Para o Procedimento ProduzETQ procedure TG_EtiqEnd. [mbOk]. end. ao final encerra a QryEtq 1. Inc(pTotEtq). end.ProduzEtq(Tipo: Integer).Canvas. if Tipo = 2 then CloseFile(pArqImpre). 0) else MessageDlg('Arquivo Impresso sem problemas. 0).SalvarArq.EnviaEtq(Tipo: Integer). manda produzir as etiquetas e finaliza tudo. ao final basta apenas verificar se existe ou não registros retornando uma variável lógica de resposta. fColFont.com. end. ele corrige a fonte da impressora.Página Nr. mtInformation. end. end. 1.3. Rewrite(pArqImpre).Free. ProduzEtq(Tipo). end. if Tipo = 2 then MessageDlg('Arquivo Gerado sem problemas.br . fColFont.2.Create. procedure AcertaFont.Create('Falha na geração'). begin with QryEtq do repeat if Tipo = 1 then begin AssignPrn(pArqImpre).Name := 'Times New Roman'. begin fColFont := TFont.Size := 9.else Result := True. Para o Procedimento EnviaETQ procedure TG_EtiqEnd. finally QryETQ. Rewrite(pArqImpre). PDF criado por: Idelson Pessoa da Silva – idelson@bol. inicialmente ele chama a função AcertaSQL se existir registros.

begin with QryEtq do if Active then Close. pDesLinha). writeln(pArqImpre. pDesLinha). 2. ' ').FormClose(Sender: TObject. primeiro o botão responsável para realizar a Filtragem para tanto de um duploclique no objeto ButFiltro para ativar o evento OnClick: procedure TG_EtiqEnd.ButSalvaClick(Sender: TObject). // 4 pDesLinha := FieldByName('SIG_UF'). aqui inicialmente verificamos se a saída é para impressora se for desviamos o arquivo para lá.AsString. basta apenas executarmos a função Execute do Objeto DgOrdenaEtq que este objeto fará o resto para nós.com. end.ButFiltroClick(Sender: TObject).Página Nr. writeln(pArqImpre. agora basta apenas gravarmos linha a linha utilizando a variável pDesLinha como auxílio.AsString. until EOF. ' '). pDesLinha). ao final (se for para impressora) fechamos o arquivo. ' '). end. // 7 writeln(pArqImpre. Selecione o evento OnClose do formulário: procedure TG_EtiqEnd. Vamos começar com os botões. Apenas para garantir que antes de sairmos do formulário a Query estará encerrada. // 5 if Tipo <> 1 then begin writeln(pArqImpre. 3. Aqui é simples.3).Execute.1.Execute. // 2 pDesLinha := FieldByName('BAI_CLIENTE'). Next. O próximo é o botão que fará o salvamento em arquivo para tanto de um duplo-clique no objeto ButSalva para ativar o evento OnClick: procedure TG_EtiqEnd. var Action: TCloseAction).AsString. writeln(pArqImpre.6. // 3 pDesLinha := FieldByName('NOM_CIDADE').AsString. end. o filtro utilizado será armazenado nas variáveis FiltroSQL (filtro em linguagem SQL) e FiltroVe (filtro em linguagem que o usuário entende) 4.ButOrdenaClick(Sender: TObject).5)+ // '-' + Copy(FieldByName('NUM_CEP'). ' '). Aqui é simples. // 6 writeln(pArqImpre.br . begin DgFiltroEtq. pDesLinha := pDesLinha+' '+Copy(FieldByName('NUM_CEP'). PDF criado por: Idelson Pessoa da Silva – idelson@bol. writeln(pArqImpre.AsString. // 1 pDesLinha := FieldByName('END_CLIENTE'). end.AsString. O procedimento final que faz tudo. begin EnviaEtq(2). O próximo é o botão que fará a Ordenação dos campos para tanto de um duplo-clique no objeto ButOrdena para ativar o evento OnClick: procedure TG_EtiqEnd. if Tipo = 1 then CloseFile(pArqImpre). writeln(pArqImpre.pDesLinha := pDesLinha + FieldByName('NOM_CLIENTE').AsString. 164/178 . pDesLinha). pDesLinha). // 9 end. begin DgOrdenaEtq. // 8 writeln(pArqImpre. 5. basta apenas executarmos a função Execute do Objeto DgFiltroEtq que este objeto fará o resto para nós.

Finalmente Agora basta você voltar para o formulário F_Menu para fazer a inserção dos comandos para chamar o formulário: procedure TF_Menu.ButImprimeClick(Sender: TObject). Coisa simples basta dispararmos o procedimento EnviaEtq enviando o tipo em 1 7. end. Coisa simples basta dispararmos o procedimento EnviaEtq enviando o tipo em 2 6. Também chame a partir do menu principal Project | Options. se sim manda oito linhas com "*" e mais uma linha em branco para separar as etiquetas. end. var i : Integer.Página Nr. end. pois imagine no meio da impressão das etiquetas dá um erro. mbNo]. ou algumas etiquetas cismam de enganchar.. begin G_EtiqEnd := TG_EtiqEnd.ButImprimeClick(Sender: TObject).br ..Free. ☞Observação . pDesLinha := '**************************************'.end. 0) = mrYes) do begin AssignPrn(pArqImpre). CloseFile(pArqImpre). e retire o formulário G_EtiqEnd da área dos Auto-Create forms. for i := 1 to 8 do writeln(pArqImpre. O próximo é o botão que fará a impressão do arquivo para tanto de um duplo-clique no objeto ButImprime para ativar o evento OnClick: procedure TG_EtiqEnd. [mbYes. end. writeln(pArqImpre. begin EnviaEtq(1). Aqui também é fácil. Na próxima apostila vamos continuar analisando os diferentes tipos de relatórios. O último é o botão que fará o teste para o posicionamento da papel na impressora para tanto de um duplo-clique no objeto ButTeste para ativar o evento OnClick: procedure TG_EtiqEnd. Rewrite(pArqImpre). 165/178 .ShowModal.O ideal é que a impressora esteje plugada na porta LPT1 do Micro. G_EtiqEnd. ' ').Create(Application).com.Correspondncia1Click(Sender: TObject). criamos o arquivo na saída da impressora e questionamos se o usuário deseja o teste. PDF criado por: Idelson Pessoa da Silva – idelson@bol. G_EtiqEnd. begin While (MessageDlg('Imprime teste ?'. mtConfirmation. pDesLinha).

Página Nr.03 versão Client/Server Suite BDE 5.com. este objeto vai crescendo a medida em que recebe os dados.com.800 Kcal.01 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Seguintes Imagens : LogRel.Curso de Delphi 4. para este primeiro tipo criaremos relatórios Espelho. Batendo todos as refeições chegamos ao seguinte total máximo entre elas: Cardápio Padrão Refeição Desjejum (café da manhã) Colação (lanche da manhã) Almoço Lanche Jantar Ceia Número de Refeições Variando de 2 até 4 Fixa em 1 Variando de 3 até 8 Variando de 1 até 4 Variando de 3 até 10 Variando entre 1 e 2 O que pretendo fazer aqui é um trabalho simples.br . isto aprenderemos no curso de espionagem e não de Delphi) este é um tipo de relatório que todos os campos dentro de um formulário ficam sempre na mesma posição. o usuário informa o número de calorias de 800 Kcal a 1. vou formatar uma página do quick com 6 campos do tipo tQrMemo para que este receba os alimentos (um em cada linha). PDF criado por: Idelson Pessoa da Silva – idelson@bol.Apostila 16 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo. Este relatório que lidaremos aqui está no Menu é se chama: Cardápio.JPG. eles já são pré-configurados para estarem ali.0 . você teria que pré preparar a impressão com todos os campos em pré determinadas posições. ImgImprime. e montaremos um cardápio ao acaso utilizando a tabela de alimentos. Mas o que são relatórios do tipo Espelho ? Me adiantei antes que você perguntasse. de uma colada na Apostila 6 e você verá que o nosso usuário pré estabeleceu várias configurações para os cardápios. Pegue um bloco de Notas Fiscais se você tivesse que imprimir o seu conteúdo. pois resolvi dividir este projeto (e para sua melhor compreensão) em dois tipos de relatórios do Quick Report. Definindo o Relatório Bem. vamos começar a segunda parte dos Relatórios.br Pré-Requisitos: Windows 98 Delphi 4. O entendimento é simples.BMP Prefácio Salve. Na verdade esta segunda parte será a primeira. 166/178 . o negócio é o seguinte (não é pegar um relatório e imprimir todas as letras de trás para frente para ler diante de um espelho.

clique nele e em seguida click dentro do objeto do QrCardapio criado anteriormente e altere as seguintes propriedades: 4.1.com. localize o objeto chamado QuickRep. Criando o Relatório Vamos direto a criação do relatório no Quick: 1. DataBase: DNmPeso 2. Data: qrsDate e qrsPageNumber (respectivamente) ☞ PDF criado por: Idelson Pessoa da Silva – idelson@bol. Salve o formulário com o nome de rCardapio. A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: 1. Crie um objeto do tipo TQuery e altere as seguintes propriedades: 2.Azul-Marinho 5.1. então se você ainda não fez aconselho que você se encarregue disto. 7. 5.1. 5.2. Name: QrCardapio 3. Name: LabTitulo 6.1. clique nele e em seguida click no formulário e altere as seguintes propriedades: 3. Na Component Pallete ainda na página QReport.1. crie dois objetos do tipo QrSysData colocando um abaixo do outro e altere as seguintes propriedades: 7.☞Importante .JPG.Para testar a saída do formulário é bom que as bases de Grupos e Alimentos estejam carregadas. Name para BdCabPagina 4. é o caso deste nosso aqui. Font: Arial .Página Nr.5. Na Component Pallete ainda na página QReport. AlignToBand: True . 5. PrintIfEmpty: True Importante . Na Component Pallete ainda na página QReport. 167/178 . BandType para rbPageHeader .3. ela aparecerá em todas as páginas. coloque-o no canto superior esquerdo da banda.Negrito . localize o objeto chamado QrImage. localize o objeto chamado QrLabel. Alignment: taCenter . clique nele e em seguida click dentro do objeto do BdCabPagina e altere a propriedade Picture colocando a imagem LogRel.Abra o Data Module D_Modelo.DFM} uses dModelo.2. clique nele e em seguida click dentro do objeto do BdCabPagina e altere as seguintes propriedades: 5.2. volte para o formulário R_Cardapio e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *. Caption: Cardápio Planejado em xxx Cal 5. Name: R_Cardapio 1. Name: QryRelato 3.2. localize o objeto chamado QrBand.Essa é a propriedade que controla os tipos das seções no caso escolhemos uma Banda de Cabeçalho de Página.1.18 . Na Component Pallete ainda na página QReport.isto fará o alinhamento ficar centralizado.PAS ☞Importante . 2.2. pois os dados seram jogados para ele. 4.br . Na Component Pallete na página QReport.Normalmente a maioria dos relatório do tipo espelho não precisam estar amarrados a um objeto do tipo tDataSet.isto fará com que seja alinhado de acordo com a banda.4.

BandType para rbDetail . vá na nova banda criada e repita esta operação por mais quatro vezes. AutoStretch: True 10. 168/178 . localize o objeto chamado QrLabel.3.Página Nr.br .9 13. Alignment: : taRightJustify 8.9 .2. Estique-o para ocupar uma linha inteira desta banda. 12. O trabalho final ficou desta maneira: PDF criado por: Idelson Pessoa da Silva – idelson@bol.3.1. 11. clique nele e em seguida click dentro do objeto do QrCardapio criado anteriormente e altere as seguintes propriedades: 8. Na banda ChildBand1 criada (na alteração da propriedade HasChild para true) altere a propriedade HasChild para True . clique nele e em seguida click dentro do objeto do BdDetalhe e altere as seguintes propriedades: 10. 10.Normal . Na Component Pallete ainda na página QReport. Estique-o para ocupar uma linha inteira desta banda.9 10. como o componente Quick não está associado a nenhum DataSet então ela aparecerá apenas uma única vez. Text: Data: e Pág: (respectivamente) 7.Azul-Marinho 7. AutoSize: False 13. localize o objeto chamado QrLabel. agora que você pegou a idéia. agora altere a propriedade Caption de todos para respectivamente Colação (lanche da manhã) Almoço Lanche Jantar Ceia 13.4.5.Neste caso escolhemos uma Banda de Detalhe de Página.isto criará automaticamente uma nova banda do tipo tChildBand 9. 8.4. Na Component Pallete ainda na página QReport. coloque o objeto QrLabel1 em cima deste. Crie mais um objeto do tipo QrBand. Na Component Pallete ainda na página QReport.Normal . AutoStretch: True 13.Normal . coloque o objeto QrLabel em cima deste.1. HasChild: True .2.2. Font: Courier New .3. localize o objeto chamado QrMemo. AlignToBand: True 7.4. AutoSize: False 10.7. solte-o clicando na Component Pallete no desenho da seta. Font: Courier New . solte-o clicando na Component Pallete no desenho da seta. localize o objeto chamado QrLabel. clique nele (segurando a tecla Shift) e em seguida click dentro de cada objeto do ChildBand.com. ela aparecerá a cada novo registro. Na Component Pallete ainda na página QReport. Font: Arial . Name para BdDetalhe 8.1.3. agora altere as seguintes propriedades de todos: 13. clique nele e em seguida click dentro do objeto do BdDetalhe e altere a propriedade Caption para Desjejum (café da manhã).2.isto criará automaticamente uma nova banda do tipo tChildBand. clique nele (segurando a tecla Shift) e em seguida click dentro de cada objeto do ChildBand. criando assim um total de cinco objetos ChildBand.

Qtd: Integer). e por sinal minha favorita.QrySQL do begin if Active then Close. end.com. var vConta : Integer.Add('Select NOM_ALIMENTO from ' + NmAlimento). var MemUtil: TQRMemo). SQL.CarrMemo(Grupo : String.Página Nr. UsaData:Boolean. procedure TR_Cardapio. 169/178 .Clear. var MemUtil: TQRMemo. begin with D_Modelo.Programando a Saída Agora começamos com a parte mais divertida do trabalho. public public NumCal : Integer.br . NmTabela : String.DFM} uses dModelo. mas por favor acompanhe atentamente esta codificação que apesar de ser simples existem alguns macetes que devem ser observados: 1. Coloque a descrição do procedimento abaixo da diretiva de compilação: {$R *. Inicialmente alterne para a Code Editor e na seção Public crie uma chamada a um procedimento e na seção Private uma váriável que receberá o total de calorias: private procedure CarrMemo(NmCampo. UsaAnd. with D_Modelo do SQL. PDF criado por: Idelson Pessoa da Silva – idelson@bol.

Por Exemplo: procedure Teste(A : String). MemDesejum. primeiramente ele recebe o Grupo. MemDesejum.Lines. Close.Caption := 'Cardápio Planejado em ' + IntToStr(NumCal) + ' Cal'. end.Clear. diferente de: procedure Teste(var A : String). CarrMemo('3'. Este procedimento é o responsável pela montagem de todo o cardápio. CarrMemo('5'. MemLanche. e então vamos ao primeiro registro (First) e depois saltamos (MoveBy) registros indicados através da função Random que permite geramos um número aleatório até o total de registros.SQL. end. MemJantar. CarrMemo('4'. if EOF then MemUtil. 1). Open.Lines. begin MemDesejum. quando passado com o auxílio de um comando Var qualquer alteração se refletirá na variável originalmente passada. MemAlmoco.Clear.É possível conforme já visto anteriormente passar qualquer tipo de variável através de uma função ou procedimento.Clear. end. MemCeia. uma variável contendo o QrMemo que queremos encher e a Quantidade de vezes que é para o alimento deste grupo aparecer. 2). Teste(Var). 1).Lines. O valor final de Var é 'Um'. 1. 1). MemLanche.Página Nr. ☞ Observação . CarrMemo('5'. MemJantar.AsString).br .Lines. CarrMemo('2'.Lines. CarrMemo('2'.Add(Fields[0]. end. end. MemAlmoco. MemAlmoco. LabTitulo.Lines. end. begin Var := 'Um'. O valor final de Var é 'Dois'.Clear. ele é o coração de todo o relatório. begin Var := 'Um'. 1). case NumCal of 800 : begin CarrMemo('4'. 1). 170/178 . var PrintReport: Boolean). PDF criado por: Idelson Pessoa da Silva – idelson@bol. Teste(Var). 1). CarrMemo('3'.QrCardapioBeforePrint(Sender: TCustomQuickRep.Lines. 1). begin A := 'Dois'.Lines. verificamos se contém registros. MoveBy(Random(RecordCount)).Add('Where NUM_GRUPO = ' + Grupo). begin A := 'Dois'. end.Add('Não existe alimento para compor este cardápio') else for vConta := 1 to Qtd do begin First. Criamos uma SQL que pesquisa apenas os alimentos de um determinado grupo. MemColacao.com.2. MemAlmoco. MemUtil. depois basta apenas colocar o registro posicionado dentro da variável. MemColacao.Clear.Clear. Selecione agora o evento BeforePrint do objeto QrCardapio e insira os Procedimentos a seguir: procedure TR_Cardapio.

CarrMemo('2'. 1). 3). 1). end. CarrMemo('6'. MemDesejum. MemAlmoco. MemDesejum. 1). CarrMemo('3'. MemAlmoco. 1). CarrMemo('3'. CarrMemo('4'. MemJantar. 2). CarrMemo('4'. CarrMemo('3'. 3).Página Nr. CarrMemo('5'. CarrMemo('3'. 1). CarrMemo('2'. MemJantar. CarrMemo('4'. CarrMemo('3'. 1). 1). CarrMemo('5'. 1). 1). 2). MemLanche. CarrMemo('3'. CarrMemo('3'. MemJantar. CarrMemo('3'. 1). 2). end. MemAlmoco. MemCeia. 1). CarrMemo('7'. 1). MemJantar. MemAlmoco. CarrMemo('4'. MemCeia. MemAlmoco. MemCeia. 3). ☞ Importante . MemAlmoco. 2). MemDesejum. MemDesejum. CarrMemo('4'. 3). MemDesejum. inicialmente limpamos todos os objetos QrMemo. 1). 2). MemJantar. MemJantar. CarrMemo('5'. MemColacao. CarrMemo('2'. CarrMemo('4'. 3). 1). 1). CarrMemo('5'. MemDesejum. MemDesejum. MemLanche. MemJantar. MemDesejum. MemLanche. 1). CarrMemo('3'. MemJantar. 1). MemJantar. 1). na verdade são eventos relacionados ao relatório em si. MemJantar. CarrMemo('4'. MemAlmoco. MemAlmoco.Apesar de parecer. MemAlmoco.CarrMemo('5'. end. 1). 2). CarrMemo('3'. 1). 1). 1200 : begin CarrMemo('7'. CarrMemo('5'. 1). MemCeia. CarrMemo('5'.com. CarrMemo('5'. MemJantar. MemLanche. MemColacao. CarrMemo('4'. 1800 : begin CarrMemo('7'. MemJantar. MemColacao. depois simplesmente montamos conforme a verificação da variável. MemDesejum. CarrMemo('3'. CarrMemo('5'. 1). MemAlmoco. Este evento será chamado preparando a montagem do relatório. MemJantar. CarrMemo('5'. CarrMemo('4'. 1). 1). 171/178 . MemDesejum. end. MemJantar. MemLanche. CarrMemo('3'. CarrMemo('5'. 1). CarrMemo('5'. CarrMemo('5'. MemJantar. CarrMemo('4'. 1).br . CarrMemo('4'. 1). MemColacao. PDF criado por: Idelson Pessoa da Silva – idelson@bol. 4). CarrMemo('2'. MemCeia. 1000 : begin CarrMemo('4'. 1). MemJantar. CarrMemo('3'. 2). CarrMemo('3'. 1). 1). os eventos BeforePrint e AfterPrint não são como o nome diz. 1). o BeforePrint acontece antes do Quick mostrar o relatório (seja em tela ou na impressora) e o AfterPrint acontece quando se dá a saída do relatório e volta do controle ao formulário que o chamou. CarrMemo('6'. CarrMemo('4'. end. 2). isso é apenas um Denorex. 1). end. MemLanche. 1). 1). CarrMemo('6'. MemJantar. MemAlmoco. 1). antes de imprimir e depois de imprimir. CarrMemo('3'. CarrMemo('2'. 3). CarrMemo('3'. MemDesejum. MemJantar. MemJantar. MemAlmoco. CarrMemo('3'. CarrMemo('2'. MemAlmoco. 1). CarrMemo('2'. CarrMemo('4'. 3). 1). 1). CarrMemo('5'. MemAlmoco. CarrMemo('4'. CarrMemo('3'. CarrMemo('4'. 1). MemDesejum. 1500 : begin CarrMemo('7'. CarrMemo('4'. CarrMemo('3'. 1). MemJantar. 1). MemDesejum. CarrMemo('3'. end. MemLanche. 2). MemLanche. 1). CarrMemo('3'. CarrMemo('2'. CarrMemo('5'. 3). MemAlmoco. MemCeia. MemDesejum. 1). 4). 2). 2). CarrMemo('5'. 3). MemAlmoco. 1). 2). 1). MemDesejum.

NumCal := 1500.bkClose Para o botão de Imprimir coloque o seguinte código: procedure TF_RCardapio. 172/178 . e retire os formulários: R_Cardapio e F_RCardapio da área dos Auto-Create forms.Name .Faça a chamada do menu ao formulário F_RCardapio PDF criado por: Idelson Pessoa da Silva – idelson@bol. case RdgQtdCal. R_Cardapio.NumCal := 800..NumCal := 1200. 1 : R_Cardapio.Kind .Defina as seguintes propriedades para os objetos: Formulário .Free.Name .BMP) Botão de Fechar ..F_RCardapio (salvar com o nome de: fRCardapio) RadioGroup .com. 2 : R_Cardapio. end. Chame a partir do menu principal Project | Options.NumCal := 1800. 3 : R_Cardapio.Name .ButImprimirClick(Sender: TObject).br . end. 4 : R_Cardapio.Página Nr.ButImprimir (para imagem utilize a ImgImprime.Preview. begin R_Cardapio := TR_Cardapio.QrCardapio. R_Cardapio.Finalmente Crie a seguinte janela com o auxílio dos objetos RadioGroup e BitBtn: ☞ Importante .Create(Application).NumCal := 1000.ItemIndex of 0 : R_Cardapio.RdgQtdCal Botão de Imprimir . ☞ Observação .

uso de comandos SELECT do SQL. Mais simples que o primeiro.br Pré-Requisitos: Windows 98 Delphi 4.com. vamos começar a terceira e última parte dos Relatórios. como já disse vamos simplesmente imprimir a tabela PastaCliente dentro de um determinado mês e ano e ao final deste. objetos Table. Este relatório que lidaremos aqui está no Menu é se chama: Divisão das Contas Mensais.03 versão Client/Server Suite BDE 5. 40% para o coordenador dos planos alimentares. 10% para o nutricionista (caso seja efetuado os planos B ou D ). Criando o Relatório Vamos direto criar o relatório do Quick: 1. vou dizer aqui um grande Macete para a criação destes.br .Para testar a saída do formulário é bom que a base de PastaCliente esteja carregada.com.01 MS-Access 97 Arquivos trabalhados juntos com esta apostila: Seguintes Imagens : LogRel. então se você ainda não fez aconselho que você se encarregue disto. muitas pessoas queimam a cabeça tentando construir o relatório apenas com Table mas o grande lance aqui é criar o relatório baseado num comando SELECT primário e sem muita complicação.JPG ImgImprime.0 . que tem os valores pagos pelos clientes em determinado período. O único problema que teremos (e este desde a definição eu fiz de propósito) é quanto ao valor para o nutricionista que tem uma regra especial. O segundo tipo de relatório do Quick Report é o relatório tipo Folha de Dados. A partir do Menu Principal vá em File | New Form e para este objeto altere apenas as seguintes propriedades: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Curso de Delphi 4. numa banda de última página (ou se você prefere num sumário de página) com base em variáveis contendo o valor total vamos calcular a proporção de cada um. 30% (ou 40 % . Relatórios tipo Folha de Dados são mais fáceis que parecem.Página Nr. 173/178 . Definindo o Relatório Bem. aqui o usuário informa o Mês e o Ano e simplesmente disparamos o relatório totalmente baseado na tabela de PastaCliente. voltando a dar uma colada na Apostila 6 você verá que o nosso usuário pré estabeleceu várias configurações para a divisão dos lucros da empresa: 20% para o médico-presidente da empresa.BMP Prefácio Salve. O que pretendo fazer aqui é um trabalho simples.caso seja efetuado os planos A ou C) para despesas gerais. associada a ele sim. ☞ Importante .Apostila 17 Autor: Fernando Antonio Fernandes Anselmo E-Mail: fernandoanselmo@yahoo.

3.2. Name: LabTitulo 6. clique nele e em seguida click dentro do objeto do QrMensal criado anteriormente e altere as seguintes propriedades: PDF criado por: Idelson Pessoa da Silva – idelson@bol.com. clique nele e em seguida click no formulário e altere as seguintes propriedades: 3. localize o objeto chamado QrBand.5. BandType para rbPageHeader .Negrito .4.2.br . Na Component Pallete na página QReport.1.3. Name: QrMensal 3. Alignment: taCenter .Azul-Marinho 7. PrintIfEmpty: True 3. localize o objeto chamado QuickRep.JPG.Abra o Data Module D_Modelo. Name: QryRelato 3.isto fará o alinhamento ficar centralizado. Na Component Pallete ainda na página QReport.Essa é a propriedade que controla os tipos das seções no caso escolhemos uma Banda de Cabeçalho de Página.3.1. AlignToBand: True 7. clique nele e em seguida click dentro do objeto do BdCabPagina e altere a propriedade Picture colocando a imagem LogRel.2. Crie mais um objeto do tipo QrBand.1.1. volte para o formulário R_Mensal e alterne para a janela do programa e insira a seguinte declaração após a diretiva de compilação: {$R *.1.DFM} uses dModelo.Página Nr. DataBase: DNmPeso 2. 174/178 . Alignment: : taRightJustify 8.2. DataSet: QryRelato ☞ Importante .9 . Name: R_Mensal 1. Caption: Divisão das Contas Mensais 5.Azul-Marinho 5.Normal . clique nele e em seguida click dentro do objeto do BdCabPagina e altere as seguintes propriedades: 5. ela aparecerá em todas as páginas. 7.PAS ☞Importante . AlignToBand: True .5. Salve o formulário com o nome de rMensal. Na Component Pallete ainda na página QReport.2. Font: Arial .18 .1.4. 4. Na Component Pallete ainda na página QReport. Data: qrsDate e qrsPageNumber (respectivamente) 7.2. crie dois objetos do tipo QrSysData colocando um abaixo do outro e altere as seguintes propriedades: 7. Text: Data: e Pág: (respectivamente) 7. localize o objeto chamado QrImage. 5. localize o objeto chamado QrLabel.isto fará com que seja alinhado de acordo com a banda.Diferentemente dos relatório do tipo espelho estes aqui precisam estar amarrados a um objeto do tipo tDataSet.1. 2. Na Component Pallete ainda na página QReport. 5. coloque-o no canto superior esquerdo da banda. 5. Name para BdCabPagina 4. Font: Arial . clique nele e em seguida click dentro do objeto do QrMensal criado anteriormente e altere as seguintes propriedades: 4. Crie um objeto do tipo TQuery e altere as seguintes propriedades: 2.

2. ela aparecerá a cada nova página. Val_Desconto e Valor respectivamente 11. BandType para rbDetail . Font: Courier New .Neste caso escolhemos uma Banda de Cabeçalho de Página. Crie dentro deste objeto criado. cinco objetos do tipo QrLabel e altere as seguintes propriedades: 13. BandType para rbSummary .Neste caso escolhemos uma Banda de Detalhe de Página.2.1.9 .Médico-Presidente.9 .Negrito .3. ela aparecerá a cada novo registro. Nutricionista.br .2. Name para BdDetalhe 10. Name para ValPresidente. Crie dentro deste objeto criado. Crie dentro deste objeto criado.Normal . Coordenador. Name para BdCabecalho 8. Frame: DrawBottom e DrawTop para True. clique nele e em seguida click dentro do objeto do QrMensal criado anteriormente e altere as seguintes propriedades: 12. Desconto e Valor Pago respectivamente 9.com. ValCoordenador. 11.1.2.Preto 14. Cliente. Crie na frente destes cinco objetos criados. Caption para Dat_Pagamento. Crie mais um objeto do tipo QrBand. cinco objetos do tipo QrDbText e altere as seguintes propriedades: 11.Preto 10.2. Caption para Data. Crie mais um objeto do tipo QrBand.9 .1.Normal . Valor Cobrado.8.1. Val_Total. BandType para rbColumnHeader . clique nele e em seguida click dentro do objeto do QrMensal criado anteriormente e altere as seguintes propriedades: 10. isto fará com que se crie linhas inferior e superior a esta banda.2. 175/178 .1. Despesas Gerais e Valor Total respectivamente 13. 8. Caption para Resumo Final . Caption: 0 (Zero) para todos O trabalho final ficou desta maneira: e ValTotal PDF criado por: Idelson Pessoa da Silva – idelson@bol. Font: Courier New .Negrito . Font: Courier New . mais cinco objetos do tipo QrLabel e altere as seguintes propriedades: 14.9 . ValDespesa respectivamente 14.1.Neste caso escolhemos uma Banda de Final de Relatório. 13. ValNutricionista. 9.2.1. ela aparecerá apenas quando o relatório terminar.Preto 12. Font: Courier New . Nom_Cliente. cinco objetos do tipo QrLabel e altere as seguintes propriedades: 9.Preto 14.Página Nr.3. Name para BdSumario 12.

7. public MesInt : Integer.com. DataFin : String. 12: DataFin := '31/'+ MesStr + '/' + AnoStr. 3.1. DataIni. end. 10. case MesInt of 1. 5. // *** with QryRelato do begin PDF criado por: Idelson Pessoa da Silva – idelson@bol.br . procedure CarrMemo(Grupo : String. DataIni := '01/'+ MesStr + '/' + AnoStr. TotPlanoB. 11: DataFin := '30/'+ MesStr + '/' + AnoStr.Programando a Saída Vamos a quase finalização deste projeto. 8. else AnoInt := StrToInt(AnoStr). 9. 6. TotPlanoC. AnoStr : String. AnoInt : Integer. 176/178 . 2. Selecione agora o evento BeforePrint do objeto QrMensal e insira os Procedimentos a seguir: procedure TR_Mensal. o complemento com a programação: 1. Qtd: Integer). begin MesStr := Copy('0'.2 .Página Nr. end.QrMensalBeforePrint(Sender: TCustomQuickRep. if ((AnoInt/4) = Round(AnoInt/4)) then DataFin := '29/'+ MesStr + '/' + AnoStr else DataFin := '28/'+ MesStr + '/' + AnoStr. 4. var PrintReport: Boolean).Length(IntToStr(MesInt))) + IntToStr(MesInt). TotPlanoD : Float. var MemUtil: TQRMemo. var MesStr. Inicialmente alterne para a Code Editor e na seção Private crie cinco váriáveis para receber a quantidade de valor de cada plano e na seção Public crie um variável para receber o mês proposto: private TotPlanoA.

Add('WHERE (Pc. ValDespesa.SQL.AsFloat else if FieldByName('PLN_ADOTADO'). SQL.[((Total * 20) / 100)]).AsString = 'A' then TotPlanoA := TotPlanoA + FieldByName('Valor').Caption := Format('%m'.Clear. (Pc. end.Add('AND (Pc.NUM_CPF = Cl.AsFloat. var PrintBand: Boolean).VAL_DESCONTO. TotPlanoA := 0.AsFloat else if FieldByName('PLN_ADOTADO').Página Nr.Add('FROM Cliente Cl.BdSumarioBeforePrint(Sender: TQRCustomBand. Pc.DAT_PAGAMENTO.Caption := Format('%m'. TotPlanoB := 0. 177/178 . begin with QryRelato do begin if FieldByName('PLN_ADOTADO'). end.[(((Total * 30) / 100) + TotPart)]).Caption := Format('%m'. Verificamos qual o tipo de plano o registro está tratando e somamos na respectiva variável. TotPlanoD := 0. TotPlanoC := 0.VAL_TOTAL.NOM_CLIENTE. MaskEdit e BitBtn: PDF criado por: Idelson Pessoa da Silva – idelson@bol.Add('SELECT Pc.NUM_CPF)').[Total]). ' + 'Pc. 3.Caption := Format('%m'. Crie a seguinte janela com o auxílio dos objetos ComboBox. SQL.br .[((Total * 10) / 100)]). if Active then Close. inclusive com os cálculos de ano bissexto.VAL_DESCONTO) As Valor'). 4. com o auxílio da função Format transformamos os campos String em forma de Valores Monetários. montamos a pesquisa selecionando apenas os registros daquele intervalo e iniciamos as variáveis globais. TotPart := (Total * 40) / 100.AsFloat else if FieldByName('PLN_ADOTADO').BdDetalheBeforePrint(Sender: TQRCustomBand.AsString = 'B' then TotPlanoB := TotPlanoB + FieldByName('Valor').DAT_PAGAMENTO <= #' + DataFin + '#)'). SQL.AsString = 'D' then TotPlanoD := TotPlanoD + FieldByName('Valor'). Este último evento.PLN_ADOTADO. apenas calcula os valores transferindo-os para os respectivos campos. Selecione agora o evento BeforePrint do objeto BdDetalhe e insira os Procedimentos a seguir: procedure TR_Mensal. end.[((Total * 40) / 100)]). Selecione agora o evento BeforePrint do objeto BdDetalhe e insira os Procedimentos a seguir: procedure TR_Mensal.com.AsString = 'C' then TotPlanoC := TotPlanoC + FieldByName('Valor'). Total := TotPlanoA + TotPlanoC. Open. SQL.DAT_PAGAMENTO >= #' + DataIni + '# AND Pc. Total := TotPlanoB + TotPlanoD. begin Total := TotPlanoA + TotPlanoB + TotPlanoC + TotPlanoD. Cl. end. No início do relatório montamos primeiro o intervalo do mês e ano informado (de 01/mm/aa até [último dia]/mm/aa) para a pesquisa. ValCoordenador. var Total.Caption := Format('%m'. end. ValNutricionista.VAL_TOTAL . TotPart : Double. ValPresidente. Pasta_Cliente Pc'). Pc. var PrintBand: Boolean). ValTotal.Pc. Total := TotPlanoB + TotPlanoD.

☞ Observação .☞ Importante . R_Mensal.Kind .com. begin R_Mensal := TR_Mensal.Now). e retire os formulários: R_Mensal e F_RMensal da área dos Auto-Create forms.ButImprimir Botão de Fechar .QrMensal.1. R_Mensal.Name ._ Botão de Imprimir .Defina as seguintes propriedades para os objetos: Formulário .. end.Free. FIM PDF criado por: Idelson Pessoa da Silva – idelson@bol. begin CbMes.MesInt := CbMes. end..ItemIndex + 1.Text.Faça a chamada do menu ao formulário F_RMensal Grandes []´s Ao final deste projeto terminamos o nosso curso de Delphi.ItemIndex := StrToInt(FormatDateTime('MM'.Página Nr. MskAno. 178/178 .Name .AnoStr := MskAno.0000.ButImprimirClick(Sender: TObject).Name .EditMask .br .Preview.Name .Items .bkClose Para o evento OnShow do formulário coloque o seguinte código: procedure TF_RMensal.MskAno .F_RMensal (salvar com o nome de: fRMensal) ComboBox .Now)) .Create(Application).cbMes . espero sinceramente que você tenha aproveitado cada momento assim como eu também aproveitei e que este não seja apenas o final de mais um curso e sim o começo para uma excelente jornada. R_Mensal.Text := FormatDateTime('YYYY'. Chame a partir do menu principal Project | Options.FormShow(Sender: TObject).Nome dos meses (um em cada linha) MaskEdit .0. R_Mensal. Para o botão de Imprimir coloque o seguinte código: procedure TF_RMensal.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->