Download pdf - Apostila III - Delphi

Transcript

1

DELPHI APOSTILA III

AUTOMAO COMERCIALAUTORES RENATO BARROS FRANCISCO FERREIRA DA SILVA 2006

2

NDICE1 2 3 4 4.1 4.2 CONTEDO CLASSES TIPOS DE MTODOS E CAMPOS COMPONENTES Override A criao do Primeiro Componente 4.2.1 Criando o componente 4.2.2 Implementando o procedimento KeyPress 4.2.3 Instalando o componente 4.3 Mais um exemplo de criao de componente 4.3.1 Criando um componente DBEdit com mascara 4.3.2 A mascara 4.3.3 SCRCOPY 4.3.4 Testando o componente 4.3.5 Programao do componente EdtCpf TEMPLATE 5.1 Um template simples 5.2 Abrindo um novo projeto atravs do template CDIGO DE BARRAS 6.1 Surgimento do cdigo de barras 6.2 Cdigo de barras do tipo UPC 6.3 Os tipos de cdigos EAN 6.4 O padro EAN 6.5 Definio do cdigo 6.6 O funcionamento do cdigo de barras 6.7 A representao dos campos do cdigo EAN 6.8 Durao do cdigo de barras 6.9 Cdigo de barras do tipo EAN-8 6.10 Cdigo ISBN 6.11 Cdigo ESSN 6.12 Cdigo EAN-14 6.13 Cdigo de uso interno 6.14 Localizao do cdigo de barras 6.15 Calculo do dgito verificador do EAN-13 6.16 Criao do componente para fazer leitura do cdigo de barras 6.16.1 - Programando as propriedades 6.16.2 - Programao do Procedimento KeyPress 6.16.3 - O tratamento do cdigo EAN-13 para uso interno. 6.17 - Programao da Unit CodigoDeBarras 6.18 - Exerccio: 6.19 - Utilizando o cdigo de barras 6.20 - Exemplo de programao de procedimento usando o componente de cdigo de barras

5

6

3 7 DESINSTALAO DE COMPONENTES 8 CRIAO AUTOMTICA DE FORMULRIOS. 8.1 - O comando Destroy 9 - DLL 9.1 - Problemas com a DLL 9.2 - Como construir uma DLL 9.3 - Programao das rotinas 9.4 - Gerando a DLL 9.5 - Programao da DLL 9.6 - Fazendo um aplicativo para testar a DLL 9.6.1 - Para usar a DLL 9.6.2 - A rotina Divide. 9.6.2.1 - Programao do boto Divide 9.7 - Como criar formulrios dentro da DLL. 9.8 - Programao da Unit U_teste: 9.9 - Criando uma DLL para chamar este formulrio. 9.9.1 - Programao das rotinas. 9.10 - Programao da DLL 9.11 - Criando outro Projeto para Teste 9.12 - Programao da Unit Chama tela 9.13 - Exerccio: 10 - PROVAS APLICADAS 10.1 - Prova A 10.2 - Prova B 10.3 - Prova C 10.4 - Prova D 11 IMPRESSORA FISCAL 11.1 - Cupom Fiscal 11.2 - Relatrios emitidos pela Impressora Fiscal 11.3 - Os Arquivos de Configurao. 11.4 - O emulador. 11.5 - Exemplos de integrao 11.6 - Configurando a Impressora 11.7 - A memria de trabalho do emulador. 11.8 - As rotinas 11.9 - PCHAR 11.10 - Possveis retornos da Funo (INTEIRO): 11.11 - Comandos Retorno da Impressora retirado do arquivo Ajuda BEMAFI32.DLL 11.11.1 - Estados de ST1 11.11.2 - Estados de ST2 11.11.3 Lgica de tratamento 11.12 Itens Rotina Vende Item 11.13 - Rotina Iniciar Fechamento do Cupom Fiscal 11.14 Rotina Bematech FI EfetuarFormaPagamentoMFD 11.15 - Fechamento do Cupom Fiscal. 11.16 Implementando o programa para uso com banco de dados.

4 12 DECISION CUBE 12.1 - BI ( ) - Negcio Inteligente 12.2 - A implementao da ferramenta 12.2.1 - Descrio: 12.2.1.1 DecisionCube. 12.2.1.2 DecisionQuery. 12.2.1.3 DecisionSource 12.2.1.4 DecisionPivot 12.2.1.5 DecisionGrid 12.2.1.6 Decision Graph 12.3 Criando uma aplicao exemplo 12.3.1 - Decision Query 12.3.2 - DecisionCube 12.3.3 - DecisionSourse 12.3.4 - DecisionPivot 12.3.5 - DecisionGrid 12.3.6 - DecisionGraph 12.4 - Executando o Aplicativo 12.4.1 - Exemplo 1: 12.4.2 - Exemplo 2: 12.4.3 - Exemplo 3 12.4.4 - Exemplo 4 12.4.5 - Exemplo 5 12.4.6 - Exemplo 6 12.4.7 - Exemplo 7 12.4.8 - Exemplo 8 12.4.9 - Exemplo 9 12.4.10 Exerccio Trabalho: 13 - CORREIO ELETRNICO 13.1 - Email no Delphi 13.2 - Diferena ente servidor ftp e pop3 13.3 - Criando o Formulrio 13.3.1 - CheckBox Confirmar recebimento 13.3.2 - Memo 13.3.3 - Componente OpenDialog 13.3.4 - Componente - IBMessage 13.3.5 - Componente IdsMTP 13.4 - A programao. 13.4.1 - Boto Anexar 13.4.2 - Boto Enviar 13.5 - Programao completa do aplicativo 14 CONEXO ADO 14.1 - O que ODBC? 14.2 - A paleta ADO 14.2 .1 - Componentes da Paleta ADO 14.3 - Como criar uma conexo. 14.3 1 - A Porta

5 14.4 - Criao de conexo via ODBC. 14.5 - Caixa de dilogo Instalao do Microsoft ODBC para Oracle 14.6 - Para usar no Delphi 14.6.1 - Colocando uma tabela. 14.7 - Um exemplo pratico 14.7.1 - Colocando uma tabela. 14.8 - O componente TDCOMConnection 15 PROGRAMAO EM TRS CAMADAS 15.1 - Introduo 15.2 As trs camadas 15.2.1 - O cliente, o servidor de aplicao e o banco de dados. 15.2.2 - Atualizao. 15.2.3 - Desvantagem. 15.2.4 - Performance 15.3 - Antes, um histrico 15.4 - Como o DCOM distribui as tarefas. 15.5 - Criando uma nova Aplicao. 15.5.1 - Projeto Cliente 15.5.2 - Tabela Temporria 15.5.3 - Outro exemplo: 15.6 - Propriedades de Expression (TAggregateField) 15.6.1 - Descrio 15.7 - Colocando um campo Total Parcial. 15.8 - Uma regra de negcio num programa 15.8.1 - Fazendo a configurao 15.8.1.1 -Componente SQLConnection 15.8.1.2 - Componente SQLDataSet 15.8.1.3 - Componente DataSetProvider 15.8.1.4 - Os dois clientes 15.8.1.5 - A programao 15.8.1.6 - Alterando nomes dos campos 15.8.1.7 - Propriedades dos componentes DataSetProvider (data access) e ClientDataSet (data access) 15.8.1.8 - DataSetProvider (data access) 15.8.1.9 - ClientDataSet (data access) 15.8.2 Tabelas do banco de dados para teste: 15.9 - As Trs Camadas de fato 15.9.1 - O servidor 15.9.2 - Fornecedor de recursos 15.9.3 Montando o Servidor 15.9.4 - Os Clientes 15.9.5 - Primeira forma de conexo via DCOM 15.9.6 - A propriedade PacketRecords 15.9.7 - Fazendo mais uma exportao. 15.9.8 - Tratamentos 15.9.8.1 - Auto Numerao de Cdigo (ID) 15.9.9 - Programando o evento BeforeUpdataRecord.

6 15.9.10 - Refresh da tela (Atualizao) 15.9.11 - Programao dos projetos Servidor e Cliente 16 BALANA COMERCIAL 16.1 - Instalando o Componente 16.1.1 - Descrio da pasta leia-me 16.1.2 - Instalao 16.2 - Um Exemplo 16.2.1 - A programao do componente. 16.2.2 - A configurao do DEVICE 16.2.2.1 - Baud Rate 16.2.2.2 - Parity (paridade) 16.2.2.3 - Stop Bits (Bits de parada) 16.3 - Mais um exemplo: 16.3.1 - A programao 16.3.2 Melhorando o exemplo: 16.3.3 - Fazendo a programao: 17 INSTALL SHIELD 17.1 - Criando a Instalao. 17.2 - Organizao do Setup.

7

FIGURASFigura 1 Paletas de Componentes Figura 2 Caixa de dilogos para instalao de componentes. Figura 3 Preenchimento da caixa de dialogo para instalao de componentes. Figura 4 Preenchimento das propriedades do novo componente Figura 5 Modulo de programao do componente. Figura 6 Campo protected criao de procedimentos. Figura 7 - Caixa de dialogo para instalao de componentes. Figura 8 Confirmao da instalao. Figura 9 Registro do componente. Figura 10 Pacotes de componentes. Figura 11 Formulrio utilizando o novo componente. Figura 12 Demonstrao da utilizao do componente instalado. Figura 13 Criao do componente TEdtCPF Figura 14 Reinstalando o componente. Figura 15 Compilando o componente. Figura 16 Formulrio utilizando o componente criado. Figura 17 Formulrio compilado e em execuo. Figura 18 Visualizao do formulrio Template Figura 19 Caixa de dilogo para adicionar Template em um repositrio. Figura 20 Confirmao para salvar o Template. Figura 21 Formulrio de Novos Itens Figura 22 Formulrio aberto atravs de um Template. Figura 23 Programao do formulrio aberto atravs de um Template. Figura 24 Exemplo de cdigo EAN-13 Figura 25 Exemplo de cdigo de barras EAN-13 Figura 26 Exemplo de cdigo de barras EAN-8 Figura 27 Caixa de dilogos para criao de novo componente. Figura 28 Cdigo de programao do componente CodigoDeBarras. Figura 29 Procedimento para seleo do evento KeyPress. Figura 30 Caixa de Instalao de componentes. Figura 31 Pacotes de componentes. Figura 32 Remoo de componentes. Figura 33 Caixa de confirmao de remoo de componentes. Figura 34 Opes de Projetos. Figura 35 Relao de componentes de uma paleta. Figura 36 Tela de um projeto. Figura 37 Tela de Cadastro de Clientes. Figura 38 Opes de projeto para o sistema. Figura 39 Tela de Units de um projeto. Figura 40 Tela de projeto de um sistema. Figura 41 Caixa de projetos Novos itens. Figura 42 Programao inicial de uma DLL Figura 43 Compilao da DLL.

8 Figura 44 Formulrio de uma calculadora simples. Figura 45 Projeto calculadora em execuo atravs de uma DLL. Figura 46 Execuo do projeto calculadora com novos parmetros. Figura 47 Formulrio para teste Figura 48 Projeto teste para chamar tela com DLL Figura 49 - Projeto Chama tela compilado. Figura 50 Tela aberta atravs de uma DLL. Figura 51 Tela do site www.bematech.com.br. Figura 52 Tela do emulador EMULFITH VR.1.02 Figura 53 Tela da ajuda da Bemafi32.DLL. Figura 54 Formulrio de teste para Cupom Fiscal. Figura 55 Funes de inicializao para Impressora Fiscal. Figura 56 Tela de ajuda Bematech Bematech_FI_AbreCupomMFD. Figura 57 Teste Impressora em execuo Figura 58 Emulfith vr.1.02 mostrando dados da impressora fiscal. Figura 59 Aspecto do formulrio Forma de pagamento para a venda. Figura 60 Componentes da paleta Decision Cube. Figura 61 Tabela Vendas.DB no paradox. Figura 62 Formulrio exemplo do Decision Cube. Figura 63 Parmetros do DataBase. Figura 64 Decision Query Editor. Figura 65 Comandos SQL para a tabela do Decision Cube. Figura 66 Controle de memria do Decision Cube Editor. Figura 67 Formatao da Data no Decision Cube. Figura 68 Amostra de Opcionais vendidos. Figura 69 Grfico de amostra por idades de clientes. Figura 70 Amostra de idade e opcionais. Figura 71 Formulrio de email no Delphi. Figura 72 Object Inspector do componente odAnexos (TOopenDialog) Figura 73 Editor de filtro no Object Inspector do componente odAnexos. Figura 74 Object Inspector do componente idMessage. Figura 75 Object Inspector do componente idSMTP. Figura 76 Object Inspector do componente LB_Anexos (TlistBox). Figura 78 Clientes e banco de dados. Figura 79 Administrador de fonte de dados ODBC. Figura 80 Tela para criar nova fonte de dados. Figura 81 - Instalao do Microsoft ODBC para Oracle. Figura 82 Formulrio com componente ADO. Figura 83 Formulrio do componente ADOConnection. Figura 84 Formulrio de propriedades de vinculao de dados. Figura 85 Fontes de conexo do componente ADO. Figura 86 Aspecto do formulrio de teste para conexo ADO. Figura 87 Configuraes e conexo do componente SQLConnection. Figura 88 Grid adicionada ao formulrio e ligada ao DataSourse. Figura 89 Formulrio para teste de conexo ADO. Figura 90 Formulrio do componente ADOConnection. Figura 91 Propriedade de vinculao de dados.

9 Figura 92 Informao de teste de conexo. Figura 93 String de conexo. Figura 94 Aspecto do formulrio usando exemplo de fonte do Delphi Figura 95 Representao de cliente ligado ao banco de dados. Figura 96 Tela de visualizao de servios de componentes. Figura 97 Aplicativos COM+ em servios de componentes. Figura 98 Editor de propriedades Figura 99 Formulrio de Teste de tabela temporria. Figura 100 Editor de propriedades de componente. Figura 101 Campos do componente Tbl_Teste, mostrando o campo TotalGeral. Figura 102 Formulrio com o campo Total. Figura 103 Editor de propriedades de componente. Figura 104 Formulrio de Teste de tabela temporria, Figura 105 Object Inspector do componente DS_Ativ (DataSetProvider). Figura 106 Aspecto do formulrio com duas grids representando dois clientes. Figura 107 Formulrio com dois clientes em execuo. Figura 108 Mensagem de erro mostrando violao de chave. Figura 109 Campos do componente SQLDataSet (Tbl_Atividade). Figura 110 Object Inspector da Tabela de Atividades (Tbl_Atividade) Figura 111 Mensagem de erro. Figura 112 Formulrio de teste Figura 113 Propriedade de mensagem de erro. Figura 114 Mensagem de erro. Figura 115 Transactional Data Module. Figura 116 Tela de dilogo do Data Modulo Figura 117 Tela de dialogo do DataModuloRemoto. Figura 118 Tela do Servidor Data Modulo. Figura 119 Componentes do DataModuloRemoto. Figura 120 Tela de Units. Figura 121 Programao gerada do P_Serv_Tbl. Figura 122 Servios de componentes. Figura 123 DataModuloRemoto no Install COM. Figura 124 Nome do Servidor. Figura 125 Informao de sucesso de registro do ActiveX. Figura 126 Servidor de Aplicao criado no Servios de componente. Figura 127 Object Inspector do componente DCOM_Conexo. Figura 128 Object Inspector do componente Tbl_Ativ (ClientDataSet). Figura 129 Formulrio de Clientes. Figura 130 Object Inspetor do componente SQL_Ativ. Figura 131 Formulrio cliente em execuo. Figura 132 Object Inspector do componente SQL_Ativ. Figura 133 Editor SQL. Figura 134 Balana Toledo Figura 135 Contedo do pacote ACBr Figura 136 Mensagem de instalao do pacote ACBr. Figura 137 Informaes de instalao do pacote ACBr Figura 138 - Paleta ACBr com todos os seus componentes instalados.

10 Figura 139 Formulrio do demo BalancaTeste Figura 140 Propriedades da paleta ACBr Figura 141 Campo genrico do formulrio demo BalancaTeste. Figura 142 Propriedades do componente ACBrBAL o Device Figura 143 Formulrio teste Figura 144 Criao da tabela Produto no Paradox Figura 145 Preenchimento da tabela Produto no Paradox. Figura 146 Preenchimento das propriedades do Database Figura 147 - Aspecto do formulrio depois de pronto Figura 148 - Aspecto do formulrio depois de executado. Figura 149 - Tela de Menu do InstallShield Figura 150 - Criando um novo projeto. Figura 151 - Tela de boas vindas Figura 152 Criando um Novo Projeto Figura 153 - Informaes da aplicao. Figura 154 Atualizaes do Software. Figura 155 - Informaes do Software Figura 156 Apresentao da Aplicao. Figura 157 Arquivos para instalao. Figura 158 Arquivos Instalados. Figura 159 Criao de Shortcuts. Figura 160 - Registro do sistema. Figura 161 Dilogos. Figura 162 Sumrios. Figura 163 Organizao do Setup.

11

Delphi Apostila IIIAUTOMAO COMERCIAL 1 ContedoClasses Criao de Componentes Herana Paleta personalizada de componentes Template Cdigo de Barras Implantao de Cdigo de Barras no Sistema Criao de DLL Para que serve Como funciona Como criar uma DLL Como Usar Impressora Fiscal Cupom Fiscal Emisso de Cupom Fiscal Como Cancelar Cupom Fiscal Forma de pagamento Localizao de nmero de Srie da Impressora Web dentro do Delphi Desision Cube Instalao de Programas com InstallShield

12

2 CLASSESA partir de agora faremos literalmente a programao orientada a objeto. Em uma declarao TYPE, estamos definindo o tipo para o Delphi. como se fosse criar um novo tipo de varivel, estamos definindo uma nova tipagem. Quando abrimos um formulrio dentro do Delphi, estamos criando um tipo chamado TForm1. A letra T antes do nome sempre vai existir. Exemplos: TEdit, TForm TBgrid. Este T um tipo. Vamos definir uma estrutura de dados para ele. Isso uma nomenclatura usada e no obrigatria, s colocado para saber que um tipo. Da mesma forma que damos um nome a um formulrio (Frm_NomeDoForm), ali ele pe um T antes do NomeDoForm. Ento criamos esse Form que uma classe derivada de TForm. Em Pascal, num registro RECORD, temos uma estrutura, por exemplo: nome,endereo, telefone, definida no campo TYPE. Reg1 = Record Cod_Cli:integer; Nome_Cli: string; End_Cli: string; End; Para declarar uma varivel denominada Registro do tipo Reg1, basta incluir sua declarao aps a palavra reservada VAR: Var Registro: Reg1; A estrutura ns colocamos A idia de classe a mesma. A classe um super-record, alm de definirmos tipos como cdigo, endereo, telefone, podemos definir mtodos, procedimentos internos que manipulam esses dados. Um pouco diferente do outro, podemos colocar procedimentos, por exemplo: Calcular o cdigo. S existe para aquele dado que definirmos da mesma classe, no funciona fora disso. Para os procedimentos especficos, declaramos tudo dentro dessa classe, alm de colocar dados, podemos colocar programao. --> uma classe um super-record. Uma classe tambm tem diversos campos. A definio de um tipo de classe pode ser feita de forma bastante semelhante de um tipo de varivel composta, bastando substituir a palavra reservada Record por Class.

13 Se quisermos criar uma classe denominada Reg1 em vez de um tipo composto chamado Reg1, basta incluir o seguinte trecho de cdigo aps a palavra reservada TYPE: Reg1 = Class Cod_Cli:integer; Nome_Cli: string; End_Cli: string; End; Agora temos uma classe denominada Reg1, em vez de um tipo de varivel composta chamada Reg1 Podemos ento declarar um objeto denominado Registro, da classe Reg1, incluindo a sua declarao aps a palavra reservada VAR: Var Registro: Reg1; Anteriormente foi criado um tipo de varivel e foi declarada uma varivel daquele tipo. Agora criamos uma classe e declaramos um objeto daquela classe. O que tem dentro da classe? Quando falamos em classe, podemos ter uma herana desta classe. Herdar alguma coisa pegar as caractersticas do objeto Pai. Exemplo: Como o filho? Num casamento, o filho herda caractersticas do pai, tipo de cabelo, cor de pele. Da mesma forma que acontece na vida natural, aqui tambm. Se criarmos uma classe, tudo que for definido entre parnteses herdado. O filho tem todas as caractersticas prprias, mais o que herdar do pai. No formulrio do Delphi, temos as caractersticas: borda, cor de fundo, boto maximizar, minimizar, fechar, eventos programados que algum j fez. Se for criado um novo Form herdada as caractersticas do Form principal. Este formulrio criado uma classe chamada TForm. TForm uma classe criada pelos programadores da Borland para que ns possamos criar outro formulrio herdando suas caractersticas. Este novo formulrio criado igual ao formulrio Pai TForm e neste novo formulrio podemos fazer as modificaes que por padro, antes da modificao, idntico ao Pai, o TForm. A vantagem de trabalhar com classe herdar caractersticas. Podemos construir uma classe, por exemplo, de manipulao de Impressora fiscal padro e as caractersticas como escolha de impressora e tipo. Essa classe herda todas as rotinas prontas e s colocaremos o que for preciso a mais, com isso economizamos muitas linhas de programao criando classes. No necessrio programar tudo de novo, porque j foi herdado. Para ter acesso aos campos de um objeto da classe, basta utilizar a notao de ponto. Para atribuir valores aos campos do objeto Registro (da classe Reg1), basta incluir as seguintes linhas de cdigo: Registro.cod_Cli := 100;

14 Registro.Nome_Cli: =Fulano; Registro.End_Cli:= Rua x;

15

16

3 TIPOS DE MTODOS E CAMPOSNa linguagem Delphi, uma classe pode ter os seguintes tipos de mtodos e campos: A diretiva public detona campos e mtodos que so livremente acessveis por qualquer outra poro de uma programa tanto quanto a unit em que esto definidos. private (privados) - A diretiva private denota campos e mtodos de uma classe que no so acessveis fora da unit que declara a classe. protected (protegidos) - A diretiva protected usada para indicar mtodos e campos com visibilidade limitada. Somente a classe atual e suas derivadas podem acessar elementos protected. Mais precisamente, somente a classe, subclasses, e qualquer cdigo na mesma unit que a classe podem acessar os membros protected.

public (pblicos) -

Alem desses temos ainda os tipos: - published semelhante ao tipo publico, mas seu valor pode ser visualizado no Object Inspector e ser visto logo mais na criao de componentes. - Automated tem as mesmas regras de visualizao do tipo public e geralmente usado em classes derivadas da classe TAutoObject (definida na unit OleAuto). Ento, qual a diferena da programao entre Private e Public? Se definirmos uma rotina dentro do private no formulrio TForm, como uma classe chamada PintadeAzul, e criarmos um TForm1 (que uma herana) com todas as caractersticas do TForm. Como a definio de PintaDeAzul esta dentro do campo private do TForm ela no vai estar disponvel para o TForm1 porque privativa somente para o formulrio Pai. Se esta definio fosse criada dentro do campo public, certamente iria funcionar no Tform1. Fazendo um Teste: Abra a programao de um formulrio recm criado. clique em F12. Criamos no mtodo private definindo a seguinte varivel: A do tipo integer. Criamos uma classe chamada Pessoa que tem dentro dela uma nica varivel que no tem mtodo, j funciona para a classe pessoa. Criamos uma outra classe chamada Aluno que herda as caractersticas de pessoa e que no tem nada no private e nem no public. Basicamente a classe aluno igual classe Pessoa. Colocamos no formulrio um boto, com uma varivel aluno do Tpessoa. Essa classe do tipo Tpessoa, tem s o cdigo e o nome, e tem mais uma varivel TAluno que tem as caractersticas Tpessoa. O que acontece? Quando apontamos em TAluno, conseguimos ver as caractersticas de Tpessoa porque do mesmo tipo, tem a mesma herana. Se tivermos outra classe e passamos o mesmo modo, no conseguimos. Como no foi definido em outro form, porque

17 ento est mostrando? Porque esta definido na mesma Unit, por isso que consegue enxergar. Se a classe TPessoa e TAluno tiverem sido definidas em Units diferentes j no conseguiramos enxergar. Quando fizemos a definio de TAluno, ele mostrou a varivel A. Mostrou o A porque estava dentro do formulrio, na mesma Unit, mas se estivesse em Units diferentes, j no iria aparecer. Tudo que tiver dentro do Privat na mesma Unit possvel enxergar. No caso do componente, uma Unit que ser criada, no consegue enxergar se for colocada algum comando de linha no Privat. Em dois formulrios, Form1 e Form2, no Form2 vamos criar uma caracterstica, varivel aux do tipo integer que s existe no Form2 e foi criado como sendo Private. Na Unit1, se colocarmos o comando USE UNIT2. no mostrar a varivel Aux, porque est em outro formulrio no campo Private. Se no Form2, colocarmos a varivel Aux no campo Public, ento na Unit1 aparecer o comando Form2. e a varivel ser mostrada. Obs.: No esquea de atribuir algum valor para a varivel criada, seno no mostra no form. Agora o comando permitiu mostras a varivel Aux porque ela foi colocada no campo Public. No Primeiro exemplo, foi mostrado o acesso a um campo privado porque estava na mesma Unit, ento no tem privacidade. No segundo exemplo, em Units diferentes, antes de acessar, ele define se public ou Private, para verificar se pode ou no acessar.

18

4 - COMPONENTESUm componente nada mais do que uma listagem, uma programao que j est feita e quando herdada j vem tudo pronto (create, close, print, resize). Esses eventos programados esto no campo public que podem ser modificados. Na herana, uma classe herda caractersticas de outra classe. Podemos colocar procedimentos e disponibilizar dados. Alm de dados podemos criar outros procedimentos. Para criar um procedimento que outros podem acessar, colocamos no campo public esses procedimentos. Ex: No campo public podemos colocar Procedure PintaDeAzul - Para definir esse procedimento, criamos o nome do procedimento. - Posicionamos o cursor em cima do nome do procedimento, no caso PintaDeAzul - Pressionando as Teclas CTRL + SHIFT + C as linhas deste procedimento criada logo abaixo com os campos Procedure begin end - para depois colocarmos a programao dentro deste campo. Esta programao se refere ao Form2 Quando definimos a classe TForm2, este procedimento PintaDeAzul s existe no Tform2. No TForm1 se for criada uma classe herdando caractersticas do TForm1 no vai existir o procedimento PintaDeAzul, mas se for herdada do TForm2, ento vai ganhar esta caracterstica do PintaDeAzul. Basicamente, quando criamos componentes, estamos disponibilizando vrios procedimentos, vrias rotinas, que quando aparecer um cone, nele herdada todas as caractersticas automaticamente. Tem tudo o que o Pai tinha mais a programao que for feita parte. Se tivermos uma classe chamada TForm (formulrio) e criamos nossa prpria classe chamada TNovoFormulario, herdando caractersticas de TForm, neste formulrio gravamos nosso evento Close e no queremos que execute o evento Close do TForm, mas sim este close que criamos, um novo close. Como fazer para ele saber qual dos closes a executar, se o close do Pai ou o close do filho? Neste caso, sempre vai tentar usar o do filho. Para isso escrevemos Override (Virtual) aps o comando, no evento do formulrio Pai, porque estamos indicando para o Delphi que ele pode ser substitudo, se existir o procedimento no filho, ele pode, se quiser, substituir o do Pai. Se for procurado no Filho e no localizar, ento executa o do Pai. Se no for definido isso, por padro, ser executado o evento close do formulrio Pai. Primeiro procura na classe Pai, e executa, depois executa do filho.

19

4.1 - OverrideExiste um create na classe pai e toda vez que for usado vai executar este create, mas podemos fazer o nosso create. Em vez de usar o create do pai podemos fazer um create especial, e na hora que usar, por exemplo, pintar de alguma cor, ento este create pode ser substitudo, deixando uma instruo que virtual (Override) Em toda programao podemos substituir o mtodo por outra classe que permita que possa colocar uma programao diferente. Para isso defina o mtodo a ser substitudo como Override (virtual). O mtodo existe mas pode ser substitudo, diferente de outros procedimentos, por exemplo, habilitar alinhamento no pode ser substitudo, mesmo que for feito este procedimento no Filho, vai executar o do Pai. Geralmente na programao do componente ele vem como virtual (Override), podendo permitir opcionalmente efetuar sua prpria programao. Em funes que no podem ser substitudas no colocamos Override.

4.2 - A criao do primeiro ComponentePara o exemplo, vamos criar um componente Edit que quanto digitarmos letras minsculas, ele transforma tudo em letras maisculas. J existe um componente pronto no Delphi, ento o que o novo componente vai ter? Ter tudo o que o Edit1 tem mais a caracterstica de passar tudo para maisculo. Ento vai ter uma rea para digitar, vai ter todas as propriedades do Edit pai mais as propriedades que quisermos definir. 4.2.1 Criando o componente Para criar o componente faa: Clique na paleta Component. New component

Figura 1 Paletas de Componentes

20

Figura 2 Caixa de dilogos para instalao de componentes. Queremos criar um componente, parecido com quem? Digite o nome TEdit, componente que deseja herdar as caractersticas, no campo Ancestor type, que mostrar uma listagem dos componentes que o Delphi j tem. (fig. 3).

Figura 3 Preenchimento da caixa de dialogo para instalao de componentes. Ai aparece dois tipos de TEdit um TEdit (QStdCtrls) e um TEdit (StdCtrls). Qual deles herdar as caractersticas? - Tudo que tiver um Q na frente para Linux . No ClxAplication Tudo que for para Linux tem a palavra Q na frente e tudo que for para Windows sem o Q. No caso do nosso exemplo a aplicao para Windows. Escolha TEdit (StdCtrls). Qual o nome a ser dado para o componente? Esse nome o que vai ser dado para a classe criada.

21 Coloque o nome de TeditMaiusculo no campo Class Name, conforme figura abaixo: Palette Page Nome da paleta a ser criada: O componente pode ser criado dentro de uma paleta que j existe, ou pode ser criada sua prpria paleta. De o nome da paleta de Unilins escrevendo no campo Palette Page. (fig. 4)

Figura 4 Preenchimento das propriedades do novo componente OBS: Cada vez que criar um componente, no crie um monte de paleta, mas escolha uma paleta j criada, ou crie uma exclusiva de novos componentes e salve seus componentes nela. Para gravar essa Unit do componente criada, escolha um arquivo existente ou crie seu prprio arquivo no campo Unit file name. O local que vai ficar gravada ser dentro do Delphi 7, no diretrio Lib, vai criar um arquivo chamado EdtMaiusculo.pas, conforme mostrado: c:\arquivos de programas\borland\delphi7\Lib\EdtMaiusculo.pas Mas se quisermos escolher outro local para criar esse componente s escolher outro Path. Obs.: Na prova, voc ter que escolher outro path para salvar seu componente e transferi-lo para o disquete. Na hora que criar um componente, salve dentro do seu projeto nas pastas criadas para transferi-lo para o disquete. Para esta pasta pode ser dado o nome de componentes. J criamos uma Unit chamada EditMaiuscula no Path escolhido acima. Clique em OK. Vai ser mostrado o mdulo de programao abaixo: (fig 5)

22

Figura 5 Modulo de programao do componente. A classe TEditMaiuscula herda todas as caractersticas do TEdit pai mais algumas coisas, entre essas caractersticas, a transformao do que foi digitado para maisculo. Neste arquivo de cdigo a nova classe TEditMaiuscula, ser derivada por herana da classe TEdit, como mostrado o trecho do cdigo abaixo: type TEdtMaiusculo = class(TEdit) Foi definido ainda um procedimento chamado Register que faz uma chamada a outro procedimento denominado RegisterComponents. Este procedimento recebe como parmetro o nome da categoria da Tool Palette na qual os novos componentes sero inseridos e se a pgina no existir ento ser criada. procedure Register; begin RegisterComponents('Unilins', [TEditMaiusculo]); end; { TEditMaiusculo } Quando esta classe filha foi criada apareceu na interface os campos private, protected, public e published. Private e public j estavam na classe pai. type TEditMaiusculo = class(TEdit) private

23 { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; Private s dentro do prprio formulrio temos acesso, mas em outro formulrio, mesmo herdada as caractersticas, no podemos ter acesso.

Num exemplo, se tivermos uma Unit1 e uma Unit2, definimos uma classe Tpessoa, uma classe que tem algo como private = varivel a do tipo integer. O que acontece? Fazendo a programao var a: integer; Isto vlido? a: = text.a isto funciona? No Considerando que a varivel a tipo integer no exista. Apesar de herdar todas as caractersticas, no vai herdar o que esta no campo private de outro formulrio. Mas para fazer com que a classe filha herde as caractersticas do pai temos que criar comandos no campo protected, isto far com que o filho herde tambm as caractersticas do pai. Se for definida no campo protected, campo T do tipo integer, no campo private no funciona, mas neste campo, sim. Se for protected, funciona dentro da prpria Unit e tambm fora dela, se forem herdadas as caractersticas exatas do mesmo pai. Como protected, se for do mesmo tipo do outro, ento pode usar as caractersticas herdadas. Published - Tudo que tiver como published o que vai aparecer no Object Inspector. 4.2.2 - Implementando o procedimento KeyPress A nova funo do KeyPress neste novo componente, quando for digitado, passara todos os caracteres para maisculo (UpCase). Esta funo j foi definida em algum lugar e para verificar a definio, veja no campo protected tudo o que pode ser modificado. No campo protected precione as teclas CTRL + barra de espao (fig. 6).

24

Figura 6 Campo protected criao de procedimentos. Ai aparecer tudo que poder ser modificado: procedure, function, todas as funes que podemos escolher para o Edit. Estes comandos (procedures) esto escritos seguidos com a funo Override, isto , pode ser substitudo. No caso, queremos trocar uma letra, o evento usado ser ento o OnKeyPress, quando for digitadas letras minsculas, elas sero trocadas para maisculas. Se for digitado OnKeyPress, aparece mensagem dizendo que um evento do tipo Keypress, mas se for digitado KeyPress, tambm existe. No Objecto Inspector tem um evento chamado onKeyPress, dando um duplo clique neste evento, ele cria um evento chamado KeyPress. OnKeyPress s o nome da propriedade e nesta propriedade est gravada o evento a ser chamado. OnKeypress uma propriedade que est armazenada no evento a ser chamado. A palavra on vem antes da propriedade que s armazena o evento a ser chamado. O evento em si no tem esta palavra (on) na frente. Ento se queremos programar um evento do Keypress, ser chamado apenas Keypress. A palavra on s uma propriedade para aparecer no Objecto Inspector. Tudo que for Published vai aparecer no objecto inspector. O nome a ser utilizado o KeyPress, que ao ser selecionado cria um procedimento chamado Override, porque poder ser substitudo/reutilizado se quisermos fazer outro procedimento KeyPress.

25 De duplo clique na procedure KeyPress selecionada o procedimento ir aparecer no campo protected onde estava o cursor. Para abrir a programao deste procedimento coloque o cursor em cima da palavra KeyPress e precione as teclas CTRL + Shift + C procedure TEditMaiusculo1.KeyPress(var Key: Char); begin inherited; end; end. A primeira linha que aparece, se chama inherited, o que isso? Significa: Execute o que tinha sido programado no Pai. Se por acaso no pai tivesse algum tratamento que precisasse ser feito, primeiro executada a programao no pai e depois executar a programao no filho para depois sair. Na programao queremos que a chave (Key) seja igual a prpria chave sendo UpCase. Queremos que essa tecla se torne maisculo. Aps colocada as linhas de programao, salve o componente e instale-o. File > Save Observe que ainda no existe a Paleta UNILINS. O comando para colocar essa paleta o procedimento que foi criado chamado Regis. Quando clicar em instalar, automaticamente executar uma procedure chamada Regis (Registro), isto far com que registre o componente criando a paleta Unilins e coloca dentro desta paleta o componente criado. Na hora que for executado, o componente TEditMaiusculo instalado na paleta Unilins. 4.2.3 - Instalando o Componente clique em component > Install Componente.

26

Figura 7 - Caixa de dialogo para instalao de componentes. Clique em OK Na caixa de dilogos abaixo pedir a confirmao da instalao.

Figura 8 Confirmao da instalao. clique em YES Na caixa de dilogos perguntar se o componentes EditMaisculo que voc quer instalar. Confirme.

Figura 9 Registro do componente. Compile clicando no boto Compile.

27

Figura 10 Pacotes de componentes. O sistema mostra mensagem dizendo que o componente foi instalado e registrado. Percorra o campo das paletas e verifique se o componente foi instalado no final. Para verificar a funcionalidade do componente, crie uma nova aplicao. File > New > Apllication. Coloque um Edit comum no formulario e o componentes EditMaiusculo criado. Compile e teste. No Edit comum podemos digitar letras tanto minsculas, quanto maisculas. No EditMaiusculo, automaticamente as letras digitadas sero transformadas em maisculas. O componente na verdade o aproveitamento de outro componente que tem muitos procedimentos. Voc aproveita alguma coisa que algum j tenha feito e cria novos procedimentos e funes que achar importante. Para compartilhar, a programao colocada no campo Protected se tiver herana entre pai e filho. Private, ningum acessa, Public todos tem acesso e Published aparece no Objecto Inspector.

-

At agora foi criado s um evento. Se quiser criar seu prprio evento ou Propriedade tambm d. Para criar uma propriedade no Objecto Inspector, chamada maisculo local, se for colocado True, passa para maisculo, se False deixa parecer um Edit Comum. O programador decide se deseja maisculo ou no. Teremos uma propriedade chamada maisculo, se for colocado True, passa para maisculo, se False no passa para minsculo. Criaremos uma propriedade chamada maisculo do tipo global.

28 Importante: Quando definirmos uma propriedade, temos que especificar se de leitura ou gravao, isto , se s podemos ler ou tambm modificar o campo. If maiscula = true then (faa alguma coisa), est fazendo uma comparao, e faz uma leitura. Se o valor for verdadeiro, faz a comparao e executa alguma coisa. Isto ler uma propriedade. Se quiser permitir alterar a propriedade gravao. Ento hora de definir se a permisso para s gravar, ler ou ler e gravar. Geralmente as propriedades do Objecto Inspector so como leitura e gravao, podendo consultar o que est l dentro ou alterar, mas podemos fazer uma propriedade que permita somente leitura e no consegue modificar o valor da propriedade. Neste exemplo, vamos permitir a modificao. Para permitir a leitura e a gravao, temos que ter uma varivel tipo Read e do tipo Higth. Quando falamos em propriedade, ele vai pegar a propriedade maisculo e armazenar em algum lugar. Precisamos de uma varivel interna para armazenar, porque o nome maisculo no uma varivel, mas o nome que vai aparecer no objecto Inspector e o valor do local tem que ser armazenado em algum lugar. Essa varivel tem que ser criada, do tipo boolean. Por exemplo, se tivermos uma varivel com o nome Mai e outro que vai dentro desta varivel do tipo Mai. Essa varivel que vamos ter que criar. Quando tivermos uma propriedade chamada maisculo do tipo boolean , na hora que for alterada l dentro ele vai gravar o valor dentro desta varivel chamada EMaiusculo. Se precisar gravar, grava dentro do Emaiusculo. S que temos que criar esta varivel no campo Private, porque o valor s pode ser manipulado via Objecto Inspector. Essa varivel vai existir, mas no pode ser vista e nem alterada. Somente atravs da propriedade do Objecto Inspector poder ser mudado o valor. Ateno - Toda vez que for criada uma propriedade, obrigatoriamente deve existir uma varivel para atribuir o valor e tem que ser declarado no campo Private. Foi criada a propriedade maiscula, e queremos utilizar aqui dentro, ento utilizamos Fmaiu. private { Private declarations } fmaiu: boolean;

Passamos para maisculo: se o fmaiu for True ento passamos para Maisculo. If fmaiu = true then - passa para maisculo. No campo Public precionando as Teclas CTRL + barra de espao, procure o campo Create public constructor Create(AOwner: TComponent); override; { Public declarations }

29

Coloque o cursor em cima da palavra Create e precione CTRL+SHIFT+C para criar o campo de programao do mtodo create. O campo Create, ao criar na tela o componente, executa antes de mais nada o mtodo create. Ele cria na memria tudo o que precisa e depois passa o valor da propriedade para true. No campo protected cada vez que carregar o mtodo, queremos que no create, por padro cada vez que for criado o componente na tela, essa propriedade seja True. Criado o mtodo create aps pressionadas as teclas CTRL + Shifit + C, fazemos um alterao, colocando a varivel fmaiu sendo True por padro. constructor TEditMaiusculo.Create(AOwner: TComponent); begin inherited; fmaiu:= true; end; Salve o componente. OBS: Se tentarmos executar, no vai funcionar, porque componente no se executa, componente para ser instalado. Instale o componente de novo clicando em Componente > Install Component selecionando o componente > compile novamente. Aparecer uma mensagem que o componente j existe, mas queremos que seja recompilado novamente para atualiza-lo. A programao do componente unit EditMaiusculo; interface uses SysUtils, Classes, Controls, StdCtrls; type TEditMaiusculo = class(TEdit) private { Private declarations }

30 fmaiu: boolean; protected procedure KeyPress(var Key: Char); override; { Protected declarations } public constructor Create(AOwner: TComponent); override; { Public declarations } published { Published declarations } property Maiusculo: boolean read fmaiu write fmaiu; end; procedure Register; implementation procedure Register; begin RegisterComponents('Unilins', [TEditMaiusculo]); end; { TEditMaiusculo } constructor TEditMaiusculo.Create(AOwner: TComponent); begin inherited; fmaiu:= true; end; procedure TEditMaiusculo.KeyPress(var Key: Char); begin inherited; if fmaiu = true then Key := UpCase(Key); end; end.

Para testar, feche o que est sendo feito. Abra um novo projeto e insira o componente TeditMaiusculo e um Tedit Comum. clique no componente TEditMaiusculo. No Objeto inspector verifique se a propriedade Maiscula est como True Se estiver como true porque no mtodo create colocamos a propriedade padro como True. Do jeito que est como True se for executado e digitando qualquer palavra, automaticamente ir transformar para maisculo.

31

Figura 11 Formulrio utilizando o novo componente.

Figura 12 Demonstrao da utilizao do componente instalado. Voltando na propriedade do Objeto Inspector e mudando para False, aps executar, as letras no sero convertidas para maisculas. Podemos ter uma propriedade que verifica o CPF vlido, herando do Edit se for true, criamos um procedimento checar CPF no evento onKeyPress, quando apertar o Enter, executada uma rotina, ou no OnExit , quando perder o foco. Agora podemos construir componentes com vrias funcionalidades. A vantagem que esses componentes criados ficam disponveis com vrios programas. Podemos ter um conjunto de componentes e se for preciso distribuir um componente para algum entregamos o arquivo criado que ser instalado no InstallComponente. Podemos ter uma biblioteca com vrios componentes que mais usamos. Um exemplo desse uso com Cdigo de barras, um componente que faz a leitura de cdigo de barras. Conseguimos fazer um cadastro inteiro, em minutos, ganhando tempo, usando herana na construo de componentes e formulrios.

32

4.3 - Mais um exemplo de criao de componentesQuando foi criado o componente anterior, foi salva em uma pasta fora do delphi, mas se o componente for de uso definitivo em seus trabalhos, ento j deixe gravado no delphi. A herana feita atravs da linha de comando Inherited que faz com que seja executada a programao do componente Pai. Para criar um novo componente: Existem muitas coisas a serem trabalhadas, por exemplo, no componente Edit: trocar de cor, filtros com alguma validao (validar um componente que s recebe nmeros ou s recebe letras. 4.3.1 - Criando um componente DBEdit com mascara Clique na paleta component > New Component Escolha o componente DBEdit (TEdit (StdCtrl) salve na paleta UNILINS Salve no Path desejado no caso em sua pasta componente dentro de seu projeto. Campos Class Name : TEdtCPF Palette Page: Unilins Unit file name: Escolha o Path

Figura 13 Criao do componente TEdtCPF Clique em OK

33 A programao da Unit ser feita conforme mostrada abaixo: unit EdtCPF; interface uses SysUtils, Classes, Controls, StdCtrls; type TEdtCPF = class(TEdit) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Unilins', [TEdtCPF]); end; end.

Foi aberta uma nova classe que no tem propriedades e nem eventos . Vai ser derivada do componente Edit normal, onde ser feita a programao. Conforme forem digitados os nmeros, contar quantos caracteres foram digitados e aps o terceiro caractere colocar um ponto. Esta mascara constituir dos seguintes campos: xxx.xxx.xxx-xx. Temos que definir como ser feita esta mascara. Conforme for digitando vai preenchendo os campos com os pontos e hfen ou digita primeiro todos os campos e depois que apertar o enter aparece a mascara com os zeros tambm preenchidos. O evento onKey Press dever ser tratado, tratar tanto com o enter e testar todo o calculo e alm disso vai ficar procurando toda hora se a quantidade digitada de zero a nove. No campo protected precione as Teclas CONTROL+BARRA DE ESPAO digite KeyPress e no combo mostrado selecione o procedimento KeyPress

34 type TEdtCPF = class(TEdit) private { Private declarations } protected procedure KeyPress(var Key: Char); override; { Protected declarations } public { Public declarations } published { Published declarations } end; Toda programao nestes campos vem seguida do comando Override isto significa que ela pode ser substituda Coloque o cursor em cima da palavra Key press e pressione as Teclas CTRL + SHIFT + C Isto far que o campo da programao abra embaixo. Esta programao vem com a linha de comando inherited, isto significa faa tudo o que est programado no pai e depois execute as linha de comandos abaixo. Se este comando for apagado o procedimento no executar as funes do Pai. procedure TEdtCPF.KeyPress(var Key: Char); begin inherited; end;

Defina para o procedimento KeyPress as linhas de comando abaixo aps a palavra inherited: procedure TEdtCPF.KeyPress(var Key: Char); begin inherited; if not (key in ['0'..'9',#8,#13]) then key :=#0; end;

35 Primeiro filtro Se a tecla no estiver dentro deste conjunto a tecla Key recebe vazio. Qualquer caractere que for digitado e que no esteja dentro do conjunto, ento apaga. Se for digitado uma letra qualquer ser apagado. Esta programao aceitar todos os caracteres de zero a nove, o backspace. Qualquer outra tecla que for digitado e no seja nenhuma destas definidas na programao, ento apaga. Segundo filtro Se for Enter gera mascara O evento doExit Na hora que o Edit perder o foco gera a mascara. Este evento doExit o que perde o foco. No campo protected - precione CTRL + barra de espao para aparecer os procedimentos. digite a palavra Exit e no combo mostrado selecione o evento DoExit. protected { Protected declarations } procedure KeyPress(var Key: Char); override; procedure DoExit; override; Coloque o cursor em cima da palavra DoExit e pressione as telas CTRL+SHIFT+C para formar o campo de programao do evento. procedure TEdtCPF.DoExit; begin inherited; end;

Neste campo temos que ter um nmero mnimo a ser digitado. - Temos que saber qual o nmero de caracteres para depois clicar em OK. - Temos que saber ainda se na digitao aparecer os caracteres da esquerda para a direita ou vice-versa. - Se for digitado um nmero errado, podemos fazer com que o campo seja apagado. OBS: No de mensagens para o usurio porque no podemos saber como est o nosso componente. O que pode ser feito, se quiser criar uma propriedade e no final, quando for perdido o foco, de a mensagem se deu certo ou no. Conforme digitamos o valor, se conseguir aplicar a mascara colocamos true. Se perdeu o foco porque foi digitado errado, colocamos false, dando uma mensagem na

36 tela. Com esta varivel possvel fazer o tratamento que quiser, porque nunca sabemos como o usurio quer tratar a interface. O campo Protected o que aparece no Object Inspector, desde que seja de leitura e gravao, porque no tem sentido aparecer no Object inspector uma propriedade que no podemos mudar. Se criarmos uma propriedade somente leitura, podemos somente ler o valor e ela no aparece no Object Inspector porque no de gravao.

READ o que define o tipo de leitura e gravao do nome que aparecer no Object Inspector. Internamente temos que trabalhar com outra varivel, no podemos trabalhar com a mesma. o nome que aparece no object inspector internamente. Geralmente temos que trabalhar com outro nome bem diferente. Crie a varivel fvalido tipo boolean dentro do campos private Criamos ento essa varivel interna dentro do campo private, porque no podemos correr o risco de algum tentar mudar alguma propriedade. private { Private declarations } //colocar a propriedade fvalido em private para no ser modificada fvalido : boolean;

A vantagem que o usurio no tem acesso direto programao, no tem como atribuir nenhum valor. Ao sair, primeiro temos que verificar a quantidade de dgitos colocados. O CPF pode ter no mnimo 8 at no mximo 11 caracteres e no podemos deixar que o numero digitado tenha mais de 11 caracteres. Se acontecer de ser digitado mais de 11 caracteres, colocamos uma mensagem que no foi possvel aplicar a mascara. Podemos usar a propriedade Length de no mximo 11 posies. Duas formas de fazer: 1- Digita-se o nmero e quando perder o foco exibe a mascara com 8 at 11 posies, ou; 2- Conforme for digitando, s vai deixar de digitar at dar 11 caracteres e se tentar digitar mais, apaga tudo. No evento onKeyPresss, implementamos at o mximo de 11 caracteres, usando a propriedade Length.

37 OBS: Em qualquer propriedade ou mtodo no coloque o nome da propriedade. , j coloque direto a palavra text. Ele assume que o Edit o prprio componente. procedure TEdtCPF.KeyPress(var Key: Char); begin inherited; if not (key in ['0'..'9',#8,#13]) then key :=#0; if (Length(text) >= 11) and (key #8) and (Key #13) then Key := #0; end;

Se o tamanho for >= 11 j tem 11 dgitos e entra com mais um, ento apaga, no recebe nada. Se o caractere length o KeyPress no est contando ainda. Se no tem o caractere ainda e for efetuando um KeyPress o evento chamado antes de aparecer o caractere, e no foi contado ainda. Mesmo que tiver alguns caracteres, o caractere que estiver sendo pressionado no conta neste ponto (o caractere atual) Se o tamanho estiver completo no 12 digito, apaga. Se o tamanho for maior que 11 ou diferente que o Backspace ou Enter ento apaga, com isso estamos limitando o mximo de caracteres que podem ser digitados. No procedimento doExit. Se Length (tamanho) dessa varivel for menor que 8 caracteres, a varivel fvalido recebe false e no conseguimos converter, seno fvalido recebe true (o nmero de caracteres legal), ento consegue converter. procedure TEdtCPF.DoExit; var aux : string; begin inherited; if (Length (text) < 8) then fvalido := false else begin fvalido := true; end; end;

Em uma propriedade normal qualquer, dentro do Delphi, usamos por exemplo Edt_valor.text que vai executar o comando (text) depois do ponto. No caso do componente, se colocarmos o mesmo comando descrito, pode at funcionar no componente, s que

38 depois que usurio cria um componente e muda o nome (herdando os valores), por exemplo para btn_sair, o que acontece? Mudamos o nome de programao e quando for executado o cdigo, para o boto o nome btn_sair. O Delphi verifica que no tem o btn_sair, no existe um Edt_valor. Para evitar esse problema, dentro do componente no coloque o nome, s coloque a propriedade direto. Toda vez que o delphi achar essa propriedade e no tem o nome na frente, ento assume que o prprio componente.

4.3.2 - A Mscara Tem 8 ou 11 caracteres. Se for 11 comeamos com um nmero vlido, mas se o CPF tiver 8 caracteres, preenche com zeros at completar onze caracteres. Em pascal o primeiro caractere guarda o nmero de caracteres que tem a string. O comando Length verifica quantos caracteres existem. Uma string em Pascal permite at 256 caracteres. A primeira posio a posio zero, depois em diante a seqncia determinada pela varivel. Da posio 1 at a 11 colocamos um comando for variando de 1 at Length. Esse cdigo verifica se as posies vai de 1 at 11 caracteres. Criamos uma varivel auxiliar para armazenar o valor e depois atribui-la para o campo text de Edit. procedure TEdtCPF.DoExit; var aux : string; i: integer; begin inherited; if (Length (text) < 8) then fvalido := false else begin fvalido := true; if length (text) = 8 then text := '0'+ text; {montando a mascara} for i := 1 to length do begin if i = 3 aux := aux + text[i]; end; end; end;

-

aux varivel auxiliar para armazenar os valores digitados.

39 Text:= 0+text este cdigo completa com zeros se o cpf tiver 8 caracteres (concatena) at 11 caracteres, depois s copiar para a varivel auxiliar de 3 em 3 caracteres. Aux:= aux + text[i] - do jeito que esta o comando coloca toda a string do aux e coloca no outro, mas no isso que queremos, ento colocamos uma condio if para cada mltiplo de 3 (if i=3), mas esta condio no coloca ponto e nem trao.

-

4.3.3 - SCRCOPY Comando copy. Uma linha de comando que no usa o for. Neste comando colocamos a string que queremos entre parentes. No exemplo copy(text,1,3) copiamos os trs primeiros caracteres e aps concatenamos um ponto. Neste comando podemos copiar de trs em trs blocos concatenando os pontos e o trao final. Podemos fazer uma nica linha de comando sem usar o for. copy(text,1,3)+'.'+ (a partir da primeira posio, copiamos trs campos e somamos (concatena) um ponto). copy(text,4,3)+'.'+ (a partir da quarta posio, copiamos mais trs campos e somamos (concatena) mais um ponto). copy(text,7,3)+'-'+ (a partir da stima posio, copiamos mais trs campos e somamos (concatena) um trao). copy(text,10,2); (a partir da dcima posio, copiamos mais dois campos).

text:= aux; - Aux: - Guarda a String completa. Agora jogamos aux para ser mostrada no campo Edit. OBS: Se no usarmos o comando IF, ento no precisamos da varivel i. procedure TEdtCPF.DoExit; var aux : string; begin inherited; if (Length (text) < 8) then fvalido := false else begin fvalido := true; if length (text) = 8 then text := '0'+ text; {montando a mascara} aux:= copy(text,1,3)+'.'+ copy(text,4,3)+'.'+ copy(text,7,3)+'-'+ copy(text,10,2); text:= aux; end;

40 Reinstale o componente para atualiza-lo. Install component.

Figura 14 Reinstalando o componente. Clique em ok

Figura 15 Compilando o componente. Clique em Compile para instalar. 4.3.4 Testando o Componente Dentro de um novo form, coloque um Edit comum e o EdtCPF que acabamos de criar.

41

Figura 16 Formulrio utilizando o componente criado. Compile e teste seu componente.

Figura 17 Formulrio compilado e em execuo. Se tentarmos digitar letras este componente no aceita. Aps digitar os nmeros e teclar enter (perder o foco ) ele executa a mascara, colocando pontos e trao. OBS: S podemos fazer componentes se estivermos logados como administrador, porque temos que escrever na pasta do delphi. 4.3.5 - Programao do Componente EdtCPF unit EdtCPF; interface uses SysUtils, Classes, Controls, StdCtrls; type TEdtCPF = class(TEdit) private { Private declarations } // colocar a propriedade fvalido em private para no ser modificada fvalido : boolean; protected

42 { Protected declarations } //precionar CTRL + barra de espao para aparecer os procedimentos procedure KeyPress(var Key: Char); override; procedure DoExit; override; public { Public declarations } published { Published declarations } //propriedade criada para verificar se o numero digitado esta correto property cpfvalido: boolean read fvalido; end; procedure Register; implementation procedure Register; begin RegisterComponents('Unilins', [TEdtCPF]); end; { TEdtCPF } {procedimento aparece apos efetuar CTRL+shift+ C com o cursor em cima da palavra Key Press do procedimento acima no campo protected} procedure TEdtCPF.DoExit; var aux : string; {se fizer com o comando Copy nao eh necessario usar a variavel "i"} //i : integer; begin inherited; {Ao perder o foco, gerar a mascara} if (Length (text) < 8) then fvalido := false else begin fvalido := true; // forca 11 caracteres, completando com zero if length (text) = 8 then text := '0'+ text; {montando a mascara} {for i := 1 to length do begin if i = 3 aux := aux + text[i]; end;}

43

aux:= copy(text,1,3)+'.'+ copy(text,4,3)+'.'+ copy(text,7,3)+'-'+ copy(text,10,2); text:= aux; end; end; procedure TEdtCPF.KeyPress(var Key: Char); begin inherited; //primeiro filtro : digitar somente nmeros, apagar e enter. {Se no for digitado os algarismos de 0 a 9 ou barra espao ou enter ento aparecera vazio} if not (key in ['0'..'9',#8,#13]) then key :=#0; // verificar o tamanho maximo (11 caracteres) {os dgitos podem ser colocados ate a posio 11 e eliminar os caracteres apagados com o backspace ou tecla enter} if (Length(text) >= 11) and (key #8) and (Key #13) then Key := #0; end; end.

44

5 - TEMPLATE uma maneira de copiarmos toda uma programao sem usar uma nica linha de cdigo. Uma automatizao de tarefas. Qualquer componente que colocarmos na tela do template, no podemos depois mudar o nome. A propriedade Name vai ser fixa. O nome que forem colocados para os botes, tabelas tem que serem genricos

5.1 - Um template simples.Podemos fazer um formulrio com alguns componentes e programa-los como um form padrao. Ento salvamos dentro do delphi numa pasta chamada Template ou outro nome que voc quiser. Dentro do Delphi criamos um arquivo chamado U_Cadastro (nosso formulrio de cadastro padro). Salve o formulrio em uma pasta qualquer, o importante estar salvo par evitar que se perca. ento salve na pasta alunos Trocamos o nome do formulrio para Frm_CadPad. No caption coloque um nome genrico (Cadastro de...) para que possa ser completado nos formulrios criados a partir deste. Coloque trs botes com o nome primeiro, anterior e prximo com desenhos. Um DataSourse e uma Table Mude o nome do Botes, para Btn_Primeiro, Btn_Anterior e Btn_Proximo em caption. Coloque o nome da table Tbl_Mster. Nome do DataSourse associado Ds_Mster. Associe a Tbl_Mster ao DS_Mster. Na tabela, no foi preenchido o Databasename e nem o TableName ento no est funcionando.

A tela ficar com o aspecto mostrado abaixo:

45

Figura 18 Visualizao do formulrio Template

Programando os botes Programe o boto - duplo clique em cada boto para entrar no modulo de programao. procedure TFrm_CadPad.Btn_primeiroClick(Sender: TObject); begin tbl_master.First; end; procedure TFrm_CadPad.Btn_AnteriorClick(Sender: TObject); begin tbl_master.Prior; end; procedure TFrm_CadPad.Btn_ProximoClick(Sender: TObject); begin tbl_master.Next; end; Salve o formulrio Para salvar o formulrio como template clicamos o boto direito do mouse em cima do formulrio e em Add to Repository Em Title coloque o nome do formulrio que vai aparecer, no exemplo: Cadastro

46 Em Page (paleta) - pode ser escolhida uma que j existe ou digitar o nome de sua pasta no exemplo coloque o nome Unilins. Pode ser colocado um cone para simbolizar o template.

Figura 19 Caixa de dilogo para adicionar Template em um repositrio. Clique em OK

Figura 20 Confirmao para salvar o Template. Confirme. A partir de agora este template est gravado no sistema.

5.2 Abrindo um novo projeto atravs do templatePara abrir um novo projeto e usarmos esta aplicao para completar um cadastro: File > New > Other > procure a paleta chamada Unilins criada o formulrio criado deve estar l dentro

47

Figura 21 Formulrio de Novos Itens Para criar outro cadastro coloque a opo de inherit (faa uma herana) e clique em OK. Foi criado um novo formulrio com o nome de Frm_CadPad2, herdando as caractersticas do form Frm_CadPad.

Figura 22 Formulrio aberto atravs de um Template.

48

Figura 23 Programao do formulrio aberto atravs de um Template. No foi programado nada no formulrio, pois ele j herda toda a programao do formulrio pai. Neste formulrio efetuada uma herana, isto , executa a programao que tinha no formulrio padro Observe a palavra inherited. A partir da criao do novo formulrio selecionamos uma tabela na Tbl_Master, podemos criar outros botes, adicionar procedimentos. Para adicionar outros componentes em todos os formulrios, podemos abrir o template e acionar no formulrio padro que vai aparecer em todos os formulrios criados a partir deste. Isto til num sistema que tem muitos formulrios, podemos efetuar no template uma alterao de programao que far com que todos os formulrios que herdam suas caractersticas tambm faam esta programao. A vantagem que se tivermos um template de cadastro, podemos fazer um cadastro completo em alguns minutos usando a herana.

49

6 CDIGO DE BARRASNa aula anterior foram construdos componentes para serem testados. No foi includo algoritmos para no ficarem pesados. A inteno foi s para testar componente, porque daqui para frente teremos que criar um componente novo, quer seja componente para trabalhar com cdigo de barras, para impressora fiscal, etc. A idia da disciplina que saibamos o que um componente. A cada componente teremos que colocar peculiaridades novas.

6.1 - Surgimento do cdigo de barrasA idia do cdigo de barras velha, de 1973/75. A necessidade do cdigo de barras foi devido ao crescimento das vendas. Antes os produtos eram vendidos digitando um cdigo e o preo. Era um tipo de cdigo interno e para um novo produto, era gerado um novo cdigo interno e este fixado no produto. Cada vez que tinha um novo produto, era necessrio inclu-lo no cadastro. Esses produtos eram nicos, no existia uma uniformidade de dados. Ao passar pelo caixa, era preciso digitar o cdigo e o preo. O problema e as conseqncias eram filas longas e a demora e muitas vezes o cdigo e o preo poderiam ser digitados errados.

6.2 - Cdigo de barras do tipo UPCO Cdigo de Produto Universal (UPC) foi a primeira simbologia de cdigo de barras adotada para comrcio. Foi criado em 3 de abril de 1973, nos Estados Unidos, quando a indstria de carnes instituiu oficialmente o cdigo UPC como o cdigo de barras padro para marcar seus produtos. Interesses estrangeiros no cdigo UPC levaram ao desenvolvimento e adoo de um cdigo similar, o cdigo EAN, em dezembro de 1976. O cdigo UPC Americano composto de 12 dgitos. Usado nos Estados Unidos e no Canad. Somente so usados os campos cdigo da empresa e o cdigo do produto, no tem o cdigo do pas. A partir de 1977, surgiu a Empresa EAN, um grupo que fez a padronizao dos cdigos de barra. Essa padronizao no nova. O inicio foi dado pelos Estados Unidos em 1973. Aps 1977, a EAN difundiu sua padronizao para o mundo inteiro e o padro mundial hoje ditado por ela. A empresa EAN foi criada na Europa e estabeleceu o padro utilizado no mundo todo. A Associao Brasileira de Automao Comercial foi criada em 1994 e atualmente utiliza o nome EAN Brasil. Como os Estados Unidos j tinha seu padro UPC, a EAN difundiu seu cdigo para o restante do mundo, mas hoje os produtos dos Estados Unidos j usam cdigos EAN.

50

6.3 - Os tipos de cdigos EANExistem vrios tipos de codificao EAN, as principais delas so EAN8, EAN13 e AN14, que so usadas no front de caixa. Outros cdigos como o EAN12, EAN128, no so usados no front de caixa. A maioria dos leitores de cdigo de barras no consegue ler o EAN12 e EAN128, necessrio um leitor especifico. O cdigo EAN128 exige um leitor a laser. O leitor padro o leitor modelo CCD manual (com gatilho) que consiste num equipamento com um bocal que emite luz proveniente de um conjunto de LEDs. Para fazer a leitura necessrio encostar o bocal do leitor no cdigo de barras. Essa luz ento refletida por um conjunto de lentes at um circuito integrado sensvel luz, semelhante a clulas fotoeltricas, que capta a imagem do cdigo de barras. Os leitores a laser requerem uma certa distancia da barra, como o caso dos leitores usados em supermercados. Para os cdigos EAN128 existem aparelhos especficos para fazer a leitura porque o alcance tem que ser maior. O EAN128 geralmente usado em grandes volumes. O leitor de cdigo de barras normalmente usado em conjunto com o teclado. No h diferena na programao, seja para os leitores de cdigos comuns (front de caixa) e leitores a laser que requerem uma distncia para efetuar leitura. Os hardwares so usados para a mesma funo - ler cdigos de barras. Quando passamos o leitor em cima do cdigo de barras a mesma coisa que digitar o valor no teclado.

6.4 - O Padro EANEAN-8 EAN-13 EAN-14 EAN-128 tem 9 dgitos. tem 13 dgitos. tem 14 dgitos. um caso particular

O EAN-8 usado para embalagens pequenas mas este cdigo em relao ao preo muito caro em termos de custos. O padro utilizado na grande maioria dos produtos expostos venda o EAN-13.(fig 24).

6.5 - Definio do cdigoO cdigo EAN definido da seguinte forma: - uma margem branca para comear o cdigo a partir dele - uma margem sem nenhuma numerao.

Figura 24 Exemplo de cdigo EAN-13

51 - um cdigo de incio. Aps isso localiza o primeiro cdigo que o numero 6. Este numero indica o inicio da leitura e no est representado numericamente para no confundir na digitalizao. No meio do cdigo tem outro nmero 6 e no final tem outro numero para finalizar a String e saber que foi feita a leitura inteira do cdigo. Quanto compra de um cdigo de barras necessrio entrar em contado com a EAN Brasil, filiar-se empresa e obter o cdigo. O taxa de uso paga anualmente e mais a filiao pela primeira vez.

6.6 - O funcionamento do cdigo de barraO cdigo de barras um smbolo composto de barras paralelas de largura e espaamento variveis. Depende muito da variao do espaamento para produzir um cdigo diferente. Os padres mais importantes so: EAN-8, EAN-13, EAN-14, EAN-128, o UPC americano, o 2 de 5 e o 3 de 9 A leitura das barras feita da direita para a esquerda. Quando a luz incide no cdigo, tudo que for branco ou refletir luz ser interpretado como digito 1 e as barras que no emitirem luz sero interpretadas como digito 0. Esta codificao feita em bit. Utilizadas para gerenciamento do controle de Estoque, principalmente quando se tem um volume muito grande de dados. No sistema financeiro, na parte de caixa, pagamento de bancos. Ao utilizar o cdigo de barras no necessria a etiquetao de produto a produto. Antes eram usados o cdigo do produto e o preo e muitas vezes quando o preo do produto era alterado, tinha que ser alterado na gndola o preo das etiquetas. Na utilizao do cdigo de barras podemos controlar qualquer alterao de preo diretamente no caixa. Geralmente no se troca o preo no perodo de funcionamento de uma empresa, mas sim durante noite.

6.7 - A representao dos campos do cdigo EANOs trs primeiros dgitos do cdigo EAN representa o pais, por exemplo o Brasil o 789 e cada pas tem um nmero codificado. Com isso podemos saber a origem de determinado produto. OBS: O cdigo do pas necessariamente no indica que a origem do produto seja daquele pas, mas sim registrado. Os prximos quatro ou cinco dgitos representam o cdigo da empresa. Neste caso existem dois tipos de cdigo de barras - um de 4 e outro de 5 dgitos que representam a empresa. Exemplo: uma empresa como a Nestl que tem uma linha de produtos muito grande registrou no Brasil com o cdigo 789 (do pas). Quatro dgitos para representar a empresa e

52 cinco dgitos para representar o produto (numa representao de at 100.000 produtos) que so comeados pelo 0 at 99.999 unidades. Ao comprar um cdigo de barras com 5 dgitos para a empresa, permitimos para o cdigo do produto uma faixa de at 9.999 unidades (10.000 produtos). Se o cdigo de barras conter 5 dgitos para a empresa, permitimos que o cdigo do produto v at 9.999 unidades. Se ocupar mais espao para o cdigo da empresa sobra menos espao para o cdigo do produto. O cdigo que usa somente quatro dgitos para o cdigo da empresa o mais caro e geralmente comea com o nmero 1. Se o cdigo comea com um (1) ento uma das empresa que pode ir at 99.999 cdigos para representar os produtos. Por ltimo, temos o digito verificador que confirma se o nmero da barra foi lido corretamente. As barras das extremidades e central so iguais e obrigatrias em todos os cdigos. Margem de Silncio - o espao em branco antes de comear o cdigo que contm os dados. Se tiver uma margem escura ou um quadro antes de comear as barras, aqueles so interpretados como se fizessem parte do cdigo, ento para evitar isso necessrio um espao em branco antes de comear o cdigo - a margem de silencio. As combinaes de corres. Os Cdigos de Barras tem que ter as combinaes de corres corretas: Barra Preto Azul Escuro Marrom Verde Escuro Fundo Branco Amarelo Vermelho Rosa

e e e e

No funcionam as combinaes de cores de cdigo fora do padro especificado pela EAN. O ideal para um cdigo de barras a impresso de barras pretas em fundo branco. Margem clara, caractere que representa o incio (seis caracteres para codificar tabela A ou B, o cdigo da empresa representada por 4 ou 5 caracteres, o caractere central, 4 ou 5 caracteres que representam o cdigo do produto, o digito verificador e por ltimo o caractere de guarda que ao final indica que terminou o cdigo de barras. A compra do cdigo de barras fornecida com o cdigo do pas e o cdigo da empresa, a numerao correspondente ao produto gerada pela prpria empresa, seqencial para cada produto. Para cada produto, um novo cdigo.

53 Se uma empresa comprar outra empresa, ter que manter o cdigo da empresa comprada (o cdigo de barras) porque ainda existem produtos dessa empresa expostos venda em estabelecimentos comerciais que ainda no foram vendidos ao consumidor final.

6.8 - Durao do Cdigo de barras.O cdigo de barras de um produto que teve sua fabricao suspensa, no pode ser reutilizado para outro produto. Exemplo: A reutilizao do cdigo de barras para produtos comestveis em media de um a dois anos para permitir que o estoque venda seja esgotado. Para os produtos no comestveis, pelo menos cinco anos. Quando terminar o perodo, podemos reutilizar o cdigo mas necessrio informar s empresas consumidoras que o produto referente quele cdigo no existe mais e foi reutilizado para outro produto, assim essas empresas podem atualizar o cadastro referente a esse cdigo de barras em seu sistema (banco de dados). O prazo de cinco anos necessrio para manter durante esse tempo um arquivo fiscal de tudo que foi vendido na empresa. Se tiver um produto que foi modificado, por exemplo a frmula, contedo, embalagem, etc, ter que ser gerado um novo nmero. Pode acontecer de ser colocado uma quantidade a mais e grtis numa embalagem, ento no necessrio trocar o cdigo do produto, porque no est sendo cobrado esse contedo a mais.

6.9 - Cdigo de barras do tipo EAN8O cdigo de barras do tipo EAN8 foi desenvolvido a partir do EAN13. Na verdade ele uma verso compacta do EAN13 visando embalagens pequenas, como cigarros, caixa de fsforos, lpis, canetas, etc. A diferena para o EAN13 est no mtodo de codificao e no menor nmero de caracteres de dados. Neste formato no existe o cdigo do fabricante, s tem o cdigo do pas, o cdigo do produto e o digito verificador. Veja no exemplo abaixo como o cdigo de barras EAN8 bem menor que o EAN13: Exemplo: Para o EAN13 tem o seguinte cdigo:

789 4401 00004 1 Figura 25 Exemplo de cdigo de barras EAN-13

7894401000041 789 4401 00004 1

o cdigo completo cdigo do pas - Brasil cdigo do fabricante cdigo do produto dgito verificador

54

Para codificar a mesma fita utilizando o cdigo EAN8, o smbolo gerado ficaria bem mais compacto. Exemplo abaixo:

789 0004 1

Figura 26 Exemplo de cdigo de barras EAN-8 789 0004 1 789 0004 1 o cdigo completo cdigo do pas - Brasil cdigo do produto dgito verificador

O cdigo que identifica o fabricante omitido e o cdigo do produto fica com quatro casas em vez de cinco. Com isto o cdigo utilizado fica com oito dgitos em vez de treze. O smbolo gerado fica mais compacto. Quando for necessrio usar o cdigo EAN-8, compra-se um nico cdigo, individualmente. S existem 10.000 cdigos disponveis pela EAN que verificar antes de tudo se no possvel colocar um cdigo EAN-13.

6.10 - Cdigo ISBN(International Standard Book Number) impressos em livros. Tornou-se padro na identificao internacional de livros. um padro de 13 dgitos tambm, com trs dgitos iniciais identificando que o produto se trata de um livro (978 ou 979), seguido da numerao ISBN (nove dgitos) e o dgito de verificao.

6.11 - Cdigo ESSNCdigo serial para publicaes de peridicos Comea com 977 e depois o nmero do peridico. No precisa fazer o controle de qual o pas.

6.12 - Cdigo EAN-14Usado para serem usados em embalagem que contm mais de uma unidade. O EAN-14 o mesmo EAN-13 com um dgito a mais no incio. Os 13 dgitos do prprio cdigo e o dgito a mais representa de que forma esta sendo vendido o produto, representa a quantidade no lote.Ex: 1 Embalagem com 6 unidades. 2 Embalagem com 12 unidades. 3 Embalagem com 24 unidades. Esse cdigo permite vender produtos em lote com at 9 tipos de quantidade. Sua localizao padro geralmente em embalagem de plstico em cima desta embalagem.

55

6.13 - Cdigo de uso internoPara venda de produtos, por exemplo hortifrutigranjeiros e aougues. Todo cdigo de uso interno tambm tem 13 dgitos. A diferena est no primeiro dgito: - Sempre comea com 2 uso interno reservado. - O prximo dgito indica o tipo de cobrana a ser feito se por peso ou por preo. Por exemplo: 0 para peso e 1 para preo. - Depois o cdigo do produto com 5 dgitos para especificar o produto. - Mais cinco dgitos para representar a quantidade ou o peso. - E o digito verificador. Quando o produto vendido por peso, o peso mximo que podemos vender 99.999 gramas (100 quilos). Para o cdigo do produto 100.000 produtos disponveis. Se for vendido por preo, o processo o mesmo, o que muda o segundo dgito que representa o preo. O valor mximo que podemos representar R$ 999,99 reais. Geralmente os aougues trabalham com preo. Se um produto muda muito o preo, por exemplo, produtos importados, geralmente usamos colocar o peso, porque s alterar no sistema o peso e no preciso remarcar o cdigo de barras. Produtos que no so vendidos com facilidade podem ter seu cdigo de barras colocados por preo.

6.14 - Localizao do Cdigo de barrasA etiqueta ou impresso do cdigo de barras colocada de preferncia e seguindo uma padronizao no canto esquerdo ou direito inferior. - Produtos na promoo: Se for vendida duas unidades na promoo necessrio embala-las numa nica unidade para colocar outro cdigo de barras, para que as barras das unidades no fiquem expostas com o risco de serem lidas ao passar pelo caixa.

6.15 - Calculo do digito verificador no EAN-13.Como calcular o ltimo nmero que analisa se o cdigo esta certo ou errado? Vamos tomar por base o cdigo de nmero: 7 8 9 1 0 1 0 2 2 0 0 9 789 1010 22009 nmero que representa o Brasil. representa o fabricante representa o produto

Obs: O nmero 22009, no significa que tem 22.000 produtos porque pode ser que um ou mais produtos saiam de linha e no permitido usar esses cdigos enquanto no vencer o prazo estabelecido em Lei. O calculo do dgito verificador feito da seguinte forma neste cdigo: Numere cada caractere do cdigo, da esquerda para a direita.

56 Ex: 7 13 8 12 9 11 1 10 0 9 1 8 0 7 2 6 2 5 0 4 0 3 9 2 ? 1

1) - Soma-se todos os nmeros que esto nas posies mpares a partir da posio 3: 0 + 2 + 0 + 0 + 9 + 7 = 18 2) - Soma-se todas as posies pares: 9 + 0 + 2 + 1 + 1 + 8 = 21 3) - O nmero que foi obtido no passo 2 (pares) deve ser multiplicado por 3: 21 X 3 = 63 4) - Soma-se o valor do passo 1 (18) com o valor do numero obtido no passo 3 (63): 18 + 63 = 81 5) - Obtenha o mltiplo de 10 maior que o nmero do passo 4 (81) Mltiplo de 10 > 81 = 90 6) - Faa a subtrao do numero obtido (90) do numero do passo 4 (81): 90 - 81 = 9 O numero 9 o dgito verificador do cdigo acima.

O cdigo de barras representa os dgitos binrios 0 e 1, determinados pela espessura das barras. Cada barra preta ou branca representa um nico dgito. J existem componentes que geram o cdigo de barras. A impresso ideal de cdigo de barras feita em impressora laser. No cdigo EAN 128 pode ser codificadas letras que permita colocar a descrio do produto, por exemplo. Nos Estados Unidos temos um microship em teste para ser usado no lugar do cdigo de barras. A inveno atende pelo nome de Radio Frequency Identification (RFID), que em portugus significa "Identificao por Radiofreqncia". Dentro de pouco tempo, esta tecnologia ser to familiar quanto o prprio carrinho de supermercado. Alm disso, estar presente em uma infinidade de produtos, de pizzas congeladas e refrigerantes a CDs e televisores. A RFID, que est cada vez mais difundida, se caracteriza por um microcircuito eletrnico que armazena informaes sobre todos os tipos de objetos, e at de animais. Permite, alm

57 disso, a localizao destes em poucos segundos, e a transmisso de seus dados a um dispositivo receptor situado a poucos metros ou a vrios quilmetros de distncia.

6.16 - Criao de componente para fazer leitura do cdigo de barras Clique na barra Component > New Component No campo Ancestor type escolha o TEdt (StdCtrls) conforme figura abaixo: No campo Class Name (Nome da classe) coloque TCodigoDeBarras. Em Palette Page coloque Unilins. Em Unit file name: Coloque o diretrio a ser salvo. Geralmente no diretrio por voc criado ou se for usa-lo definitivamente pode deixar na pasta LIB.

Figura 27 Caixa de dilogos para criao de novo componente. Aps criado > clique em OK Depois de criado aparecer o cdigo da unit abaixo: (fig. 28)

58

Figura 28 Cdigo de programao do componente CodigoDeBarras. Classe TcodigoDeBarras derivado de TEdit 6.16.1 - Programando as propriedades A primeira propriedade a ser feita o evento OnKeyPress. Dentro do evento protected clique em CTRL + Barra de espao para abrir a caixa de dilogos abaixo > selecione o evento KeyPress. (fig.29).

Figura 29 Procedimento para seleo do evento KeyPress. Vai aparecer o procedimento KeyPress abaixo com a declarao override:

59

protected { Protected declarations } procedure KeyPress(var Key: Char); override; Coloque o cursor em cima de KeyPress e pressione as teclas CTRL+SHIFT+C que criar o procedimento na ultima linha da unit, conforme mostra abaixo: procedure TCodigoDeBarras.KeyPress(var Key: Char); begin inherited; end; end.

Alm do evento KeyPress temos que criar uma propriedade que retorna o cdigo, outra que retorna se deu certo ou no e qual o tipo de cdigo se EAN-13, EAN-14, interno, etc. Precisamos de trs propriedades, todas elas somente de leitura. No campo published criamos trs propriedades Published { Published declarations } property codigo:string read fcod; {codigo lido}Esta propriedade no pode ser do tipo inteiro porque o numero muito grande e o inteiro s vai at 32.000 O nome da varivel interna vai se chamar fcod

property valido:boolean read fval; {valido ou nao}Esta propriedade indica de deu certo ou no tambm de leitura

property gtipo:integer read ftipo; {EAN13,EAN14,8 OU ITERNO}Esta propriedade retorna o tipo.

Colocamos mais trs propriedades: property medida:boolean read fmed;

{peso(true) ou preo(false)}

Se for colocado o preo por quilo, pode ser inteiro e trabalhamos todas as medidas em gramas

property peso:real read fpeso ; {peso do produto} property preco:real read fpreco ; {preco do produto} end; Agora precisamos criar as variveis. Como so todas de uso interno do componente, criamos no campo private:

60

{ Private declarations } fcod:string; fval:boolean; ftipo:integer; fmed:boolean; fpeso:real; fpreco:real;

Temos que efetuar trs tratamentos: Digito verificador, tipo de cdigo se EAN-8, EAN13,EAN14 e se de uso Interno ou Externo. Para no ficar repetindo os mesmos comandos, criamos uma rotina extra para fazer o calculo do dgito verificador. Entramos com o valor de uma string e esta rotina verifica se esta correto ou no: Esta rotina ser criada no campo private para que no se tenha acesso a ela. Private { Private declarations } fcod:string; fval:boolen; ftipo:integer; fmed:boolean; fpeso:real; fpreco:real; function verifica(cod:string):boolean; {verifica o dv}

Esta funco retorna se foi lido o cdigo corretamente. Coloque o cursor em cima da palavra verifica e pressione CRTL+SHIFT+C: function TCodigoDeBarras.verifica(cod: string): boolean; var i:integer; vpar,vimpar,vtot:integer; begin end;

No colocaremos o comando overhide porque teoricamente no permitiremos que o usurio modifique os comandos, principalmente porque ele o usurio nem tem acesso a esse Edit.

61

O algoritmo: {1 soma as posies impares 2 soma as pares 3 multiplica-as por 3 4 soma o resultado da multiplicao com a soma das pares 5 subtrai o total do prximo mltiplo de 10 }

function TCodigoDeBarras.verifica(cod: string): boolean; var i:integer; vpar,vimpar,vtot:integer; begin {1 soma as posioes impares 2 soma as pares 3 multiplica as por 3 4 soma a multiplicaao com as pares 5 subtrai do proximo multiplo de 10 }Zerar as variaveis vpar, vimpar e vtot.

vpar:=0; vimpar:=0; vtot:=0; for i:=length(cod)-1 downto 1 do beginVerificamos se o campo par ou impar

if (i mod 2)=0 then Se for par, a varivel vpar recebe o prprio valor do campo mais o caractere daquela posio (cd(i)); begin {par} vpar:=vpar+strtoint(cod[i]); end else {impar} begin vimpar:=vimpar+strtoint(cod[i]); end;Se o valor for impar o mesmo procedimento acima realizado. Detalhe: Tanto faz se for feita a multiplicao por 3 da varivel vpar antes ou depois do lao. Se for colocada a multiplicao dentro do lao, para cada lao que for realizado efetuada a multiplicao, ento fora do lao ganha um pouco de desempenho.

vtot:=vpar*3 + vimpar;

62

J temos o total, falta descobrir o mltiplo de dez maior que o vtot. Temos duas opes de calculo: Ou procuramos at achar o mltiplo que queremos, ou pegamos o numero da varivel vtot e calculamos o mod 10. Depois comparamos se igual ao digito verificador. O cdigo uma string e queremos comparar dois nmeros inteiros, ento convertemos.

if (10 -(vtot mod 10)mod 10)=strtoint(cod[length(cod)]) thenSe o digito verificador for correto ento retorna a rotina verifica = true.

verifica:=true elseSe deu errado retorna a rotina verifica = false

verifica:=false; end; end;

A funo Verifica s para confirmar o digito verificador, declarada no campo private para o usurio no ter acesso a ela. Esta funo de uso interno. Retorna True ou False com a funo de validar o cdigo de barras . J temos o tratamento do cdigo verificador. Se os cdigos forem iguais, verifica recebe true, caso contrrio retorna false. 6.16.2 - Programao do Procedimento KeyPress procedure TCodigoBarras.KeyPress(var Key: Char); begin inherited; {tratamento do cdigo de barras. Necessitamos realizar o tratamento do:} - digito verificador - tipo de cdigo se 14,13,8 etc... - se interno ou externo}Este if verifica se foi pressionada a tecla ENTER. Se for enter ento inicia toda a investigao

if not (Key in[0..9,#8) and (key#13]) then Key:= #0; if(length(text) >= 4) and (key #8) and (key #13) then Key:= #0; if Key = #13 then begin {verificar se valido}Primeiro temos que verificar se o dgito vlido ou no

Fval:= verifica (text); {verifica o tipo}Para verificar se o tipo vlido ou no, temos que usar a propriedade chamada valido que retorna true ou

63false.. A propriedade fval recebe a funo verifica, passando a string digitada e verifica se falso ou no. Depois verifica o tipo do cdigo Caso Length (tamanho) for do tamanho do tipo 14, 13,8 ento fara alguma coisa. A propriedade chamada ftipo se for 14 ftipo recebe 14. Pode ser usada o comando Case para cada tipo independente se do tipo 13, 14, etc.

case Length(text) of 14: ftipo:= 14; 13: begin {verifica se um cdigo de uso interno. Isto s possvel se a empresa utilizar o EAN13 e o cdigo de barras iniciar com 2} if text[1]= '2' then begin {uso interno} ftipo:= 2; {apos verificar o primeiro digito e descobrir que de uso interno, temos que verificar se o calculo ser realizado por peso ou por preo. Para tal, basta olhar o contedo do 2 digito} {0 = preo ou 1 = peso} Fmed:= ('1' = text[2]); {copiar o cdigo do produto} Fcod := Copy(text,3,5); { copiar o valor} if fmed then begin fpeso:= strtofloat(Copy(text,8,5))/1000; end else begin fpreco:= strtofloat(Copy(text,8,5))/100; end; end else ftipo:= 13; end; 8: ftipo:= 8; end; end; end;

64 Agora vamos ver qual o cdigo que est sendo usado, se 14, 13, 8 ou de uso interno. Para verificar o tipo de cdigo usamos o Length (tamanho). Antes, temos que determinar se a tecla pressionada o enter atravs do comando if. Se for pressionado enter entra no comando case if Key = #13 then begin end; Determinar se um digito vlido ou no verificao do tipo. Fval:= verifica (text); Esta validao feita atravs da rotina verifica e passamos como parmetro a String digitada que ser valida ou no. Para verificar se o cdigo de uso interno temos que certificar se o cdigo o EAN-13 e o cdigo de barras inicia com 2. if text[1]= '2' then begin {uso interno} ftipo:= 2; S podemos usar internamente o cdigo EAN-13 legalmente que comea com 2. Fazemos o tratamento do cdigo s quando for o EAN-13, porque no da para tratar o uso interno de outros cdigos (nem do EAN-8 e nem do EAN-14). 6.16.3 - O tratamento do cdigo EAN-13 para uso interno. Primeiro temos que saber se comea com o nmero 2. if text[1]= '2' then begin Se o caractere na primeira posio for o 2 ento de uso interno ento ftipo recebe 2, ftipo:= 2; Para verificar se o cdigo por preo ou por peso, temos que ler o segundo digito. Apos verificar o primeiro digito e descobrir que de uso interno, temos que verificar se o calculo ser realizado por peso ou por preo. Para tal, basta olhar o contedo do segundo digito: 0 = preo 1 = peso Esta definio de preo ou peso no tem padronizao. Existe uma propriedade que define se por preo ou por peso. H duas maneiras de estabelecer esta condio:

65 1 por peso (fmed:= true) - se 1 for igual a text na posio 2 estabelece a condio direto. Estamos comparando se o contedo na posio 2 for igual a 1(que por peso) ento atribumos true para fmed, caso contrario atribui false. 2 Se a segunda posio for igual a 1 fmed recebe true seno fmed recebe false esta condio ficar como comentrio na programao mas tambm funciona. Ns temos 4 tipos de cdigos e temos que descobrir qual o tipo se EAN8, 13, 14, interno. O EAN 13 composto de: 1 Tipo 2 Cd. 0 ou 1 3 Cdigo Produto 4 Preo ou Peso 5 Dig. Verificador

Posies: 1 Se de uso interno ou no. Se de uso interno comea pelo numero 2. 2 Cdigo 0 ou 1 se por preo ou por peso. 3 Cdigo do Produto. 4 Preo ou peso do produto. 5 Digito Verificador. Tanto faz se o campo 4 for por preo ou peso, o cdigo do produto ser o mesmo. O preo ter duas casas decimais representando os centavos. O peso ter trs casas decimais representando a medida de peso em gramas.

Fcod foi copiado para dentro do campo. Se for por peso (fmed:= true). Nota: No precisamos colocar (se for = true) porque um cdigo booleano e retorna true ou false. Fazemos a cpia do cdigo atravs do comando Copy. {copiar o cdigo do produto} Fcod := Copy(text,3,5);

Depois temos que copiar o valor - Para copiar o valor comparamos o fmed. Se fmed for true, a medida por peso. Se for por peso temos que transformar em valor.. Ex.: Se tivermos 10 K e 200g podemos copiar o numero 10 e concatenar com 200. Isso vai dar 10.200g. Ao salvar transformamos em float. (strtofloat - convertendo em dinheiro).

66 Ou Fazemos a leitura de todos os dgitos de uma nica vez (10.200) e dividimos por 1000 que dar os 10.200g.

Se por peso, o fpeso recebe a string que acabamos de copiar. Ela comea na oitava posio e copia cinco caracteres. Como string temos que transformar em numero (strtofloat). Aps transformar em nmero dividimos por 1000. { copiar o valor} if fmed then begin fpeso:= strtofloat(Copy(text,8,5))/1000; end Com isso conseguimos transformar o peso em gramas else begin fpreco:= strtofloat(Copy(text,8,5))/100; end;

Para o preo, como utilizado com duas casas decimais, dividimos por 100 Se for por peso dividimos por 1000. Se for por preo dividimos por 100. O cdigo: Exemplo (2 0 08100 00071 4) como de uso interno vai armazenar os cinco dgitos do cdigo do produto (08100). Ento quando for feito um comando LooKup, este comando para o cdigo e localiza o produto especifico daquele cdigo. if text[1]= '2' then begin {uso interno} ftipo:= 2; Se aparecer o campo 2 de uso interno l o prximo campo Nota: Quando o cdigo de uso externo fazemos a busca pelo cdigo inteiro, mas quando de uso interno, temos que destrinchar o cdigo. Ento quando efetuamos uma busca, no passamos o text como parmetro, mas sim o cdigo do produto (o campo especifico do cdigo).

67 A propriedade cdigo (property codigo) que retorna o cdigo de barras tem que ser atribudo no comeo no campo published porque independente de qual seja, por padro, o cdigo de barras o que est na propriedade teste, o que foi digitado. Ento se for digitado 789101000001 8, por exemplo, esta linha um text que ser atribudo por padro. Ento por padro o cdigo igual ao text (Fcod = text) Quando for de uso interno comeo com o nmero 2 depois 0 ou 1 (dependendo se por preo ou peso), depois 5 digitos do cdigo do produto (12345) e cinco dgitos que indica o valor (55532). Se for por peso ser 55 quilos e 532 gramas. Se for por preo ser R$ 555,32. E por ltimo o dgito verificador. Como para todos os cdigos 12, 13, 14 tanto faz, colocamos Fcod recebe text (Fcod = text). Estamos atribuindo varivel Fcod o valor de text para depois descartar quando no mais precisar. Para esse cdigo que ser feita busca no banco de dados, por padro , vamos pegar todos os dgitos com exeo quando for de uso interno, que ser substitudo. Se valido ou no, calcula o digito verificador. O tipo j est sendo atribudo. Para um deles atribudo o tipo, no caso do 13 est faltando atribuir qual o tipo. O cdigo de barras est pronto.

6.17 - Programao da Unit CodigoDeBarrasunit CodigoDeBarras; interface uses SysUtils, Classes, Controls, StdCtrls; type TCodigoDeBarras = class(TEdit) private { Private declarations } fcod:string; fval:boolean; ftipo:integer; fmed:boolean; fpeso:real; fpreco:real; function verifica(cod:string):boolean; {verifica o dv} protected { Protected declarations } procedure KeyPress(var Key: Char); override;

68public { Public declarations } published { Published declarations } property codigo:string read fcod; {codigo lido} property valido:boolean read fval; {valido ou nao} property gtipo:integer read ftipo; {EAN13,EAN14,8 OU ITERNO} property medida:boolean read fmed; {peso(true) ou preo(false)} property peso:real read fpeso ; {peso do produto} property preco:real read fpreco ; {preco do produto} end; procedure Register; implementation procedure Register; begin RegisterComponents('unilins', [TCodigoDeBarras]); end; { TcodigoDeBarras } procedure TCodigoDeBarras.KeyPress(var Key: Char); begin inherited; {tratamento do codigo de barras} //digito verificador //tipo de codigo se 14,13,8 etc... // se interno ou no if not (Key in[0..9,#8) and (key#13]) then Key:= #0; if(length(text) >= 4) and (key #8) and (key #13) then Key:= #0; if Key = #13 then begin {verificar se valido} Fval:= verifica (text); {verifica o tipo} case Length(text) of 14: ftipo:= 14; 13: begin {verifica se um cdigo de uso interno. Isto s possvel se a empresa utilizar o EAN13 e o cdigo de barras iniciar com 2} if text[1]= '2' then begin {uso interno} ftipo:= 2; {apos