megazine 3 - the club - o maior clube de programadores do ... · dicas & truques ... para...

32

Upload: lamnga

Post on 15-Dec-2018

222 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens
Page 2: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens
Page 3: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 3

EDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ..................................................................................................... 03Perguntas & Respostas ........................................................................... 04Gestão de infraestrutura de tecnologia da informação com ITL .......... 05Impressão de Código de BarrasUma abordagem prática ZEBRA ZPL2 .................................................... 09Um estranho no ninhoFerramenta gratuita invade o mundo dos Delphianos .......................... 13Imprimindo no Delphi 2005 ...................................................................... 16Construindo um relatório CrossTab no Rave Reports .......................... 20ASP.NET: Parte III ....................................................................................... 26Dicas & Truques ....................................................................................... 30

THE CLUBAv. Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (0xx14) 3732-3689

Suporte: (0xx14) 3733-1588 - Fax: (0xx14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]

Informações: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem ser

enviados ao - THE CLUB, indicando "Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube em

geral, mande a sua correspondência para a seção

"Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sob qualquerforma ou meio, de textos, fotos e outras criações

intelectuais em cada publicação da Revista“The Club” são terminantemente proibidos sem

autorização escrita dos titulares dos direitosautorais.

Copyright© The Club® 2005

Impressão e acabamento:GRAFILAR

Tel.: (0xx14) 3841-2587 - Fax: (0xx14) 3841-3346Rua Cel. Amando Simôes, 779 - Cep 18.650-000

São Manuel - SPTiragem: 5.000 exemplares

Diretor - Presidente

Celso Jefferson M. Paganelli

Diretor TécnicoMauro Sant’Anna

Colaboradores

Emerson Facunte, Marcelo NogueiraVictory Fernandes e Augusto Frederico

Delphi é marca registrada da Borland International, as

demais marcas citadas são registradas pelos seus

respectivos proprietários.

Olá amigos,Vocês estão recebendo mais uma edição da revista The Club Megazine, recheada de

informações importantes para manter-lhes sempre atualizados.Começamos com mais um artigo do nosso amigo Marcelo Nogueira, onde ele

apresenta o ITIL (Information Technology Infrastructure Library), que é o modelo dereferência para gerenciamento de processos de TI mais aceito no mundo.

Atendendo várias solicitações, nossos amigos Victory Fernandes e AugustoFrederico prepararam um excelente artigo sobre Impressão de Código de Barrasutilizando impressoras ZEBRA, não deixe de conferir.

Se você necessita desenvolver para a plataforma Microsoft .NET sem gastarnenhum centavo, não deixe de conferir o artigo “Um estranho no ninho” onde nossoamigo Emerson Facunte apresenta a ferramenta: Microsoft Visual C# 2005 Express,uma excelente IDE totalmente gratuita!

Falando em .NET, não podemos deixar de lado o poderoso Delphi 2005 onde nossoconsultor Claudinei Rodrigues apresenta algumas dicas sobre impressão em aplicaçõesWinForms. Já que o assunto é relatório, nosso consultor Alessandro Ferreirademonstra em seu artigo como construir um relatório CrossTab (referência cruzada)utilizando o Rave Reports, gerador presente a partir do Delphi 7.

E fechando esta edição, trazemos a última parte da série sobre ASP.NET ondeabordamos os arquivos Global.asax/pas e o web.config, não deixe de conferir aimportância destes arquivos.

Boa leitura à todos e até a próxima.

Page 4: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE4

Perguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & Respostas

Perguntas & Respostas

Perguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & Respostas

Pergunta: Gostaria de verificar se uma pasta existe noWindows via Clipper, isso é possível?

Resposta: Isso poderá ser feito utilizando a funçãoDirectory, conforme demonstra o exemplo a seguir:

cPath = “C:\WINDOWS\”

aDir := Directory( cPath + “*.*” )

lIsDir := Valtype( aDir ) == “A” .And.!Empty( aDir )

if lIsDir ? “Existe”else ? “Não existe!”end if

Dúvida enviada por Bkr Informática Ltda, Chiapetta/RS.

Pergunta: É possível desabilitar a barra de tarefas doWindows? Se possível, envie-nos um exemplo.

Resposta: Isso é possível efetuando uma pesquisa pelohandle da janela referente a barra de tarefas e depois desabilita ajanela via API EnableWindow, veja a seguir:

var H: hwnd;begin H := FindWindow(‘Shell_traywnd’, nil); EnableWindow(H, FALSE); // disable itend;

Dúvida enviada por Almir R. Borges, Araçatuba/SP.

Pergunta: Como faço para rodar o Firebird 1.5 e oInterbase em um mesmo servidor?

Resposta: Para rodar o Interbase e o Firebird 1.5 na

mesma máquina, basta instalar o Firebird 1.5, NÃO gerar acópia da GDS32.DLL (para não sobrepor a versão do Interbase jáinstalado) e depois mudar a PORTA de comunicação do Firebird.

Para alterar a porta de comunicação do Firebird, abra oarquivo Firebird.conf (via um editor de textos qualquer) e localizea seguinte linha:

# ——————————————# TCP Protocol Settings### The TCP Service name/Port number to be usedfor client database# connections.## It is only necessary to change one of theentries, not both. The# order of precendence is the‘RemoteServiceName’ (if an entry is# found in the ‘services.’ file) then the‘RemoteServicePort’.## Type: string, integer##RemoteServiceName = gds_db#RemoteServicePort = 3050

Tire o comentário (#) antes de RemoteServicePort e altere ovalor para 3051, por exemplo.

Em seu componente SQLConnection, no parâmetroVENDORLIB, altere para: FbClient.dll

E a partir disso, você não irá se referir mais a GDS32.DLL esim a FBCLIENT.DLL, ou seja, ao invés de compartilhar napasta a GDS32.DLL, deverá disponibilizar a FBCLIENT.DLL.

Dessa forma terá o Interbase e o Firebird rodando s/problemas.

Dúvida enviada por Júlio Cezar de Jesus Rodrigues,Curitiba/PR.

Page 5: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 5

Gestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura detecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITIL

Gestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura deGestão de infraestrutura detecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITILtecnologia da informação com ITIL

Por Marcelo Nogueira

Resumo - O ITIL (Information Technology InfrastructureLibrary) é o modelo de referência para gerenciamento deprocessos de TI mais aceito mundialmente.

A metodologia foi criada pela secretaria de comércio (Office ofGovernment Commerce, OGC) do governo Inglês, a partir depesquisas realizadas por Consultores, Especialistas e Doutores,para desenvolver as melhores práticas para a gestão da área deTI nas empresas privadas e públicas. Atualmente se tornou anorma BS-15000, sendo esta um anexo da ISO 9000/2000. O focodeste modelo é descrever os processos necessários para gerenciara infra-estrutura de TI eficientemente e eficazmente de modo agarantir os níveis de serviço acordados com os clientes internos eexternos.

Palavras-chave: ITIl, .

Introdução - Governança de TIGovernança de tecnologia da Informação é uma estrutura de

relacionamentos e processos para dirigir e controlar aorganização no atingimento dos objetivos desta organização,adicionando valor, ao mesmo tempo em que equilibra os riscos emrelação ao retorno da TI e seus processos. [2]

São estruturas e processos visando a garantir que a TIsuporte e maximize os objetivos e estratégias da organização. [2]

A governança permite controlar, medir, auditar, a execução ea qualidade dos serviços e: [2]

· Viabiliza o acompanhamento de contratos internos eexternos da organização.

· Define condições para o exercício eficaz da gestão com baseem conceitos consolidados de qualidade.

· Alinha a estratégia de TI com as do negócio.· Mais capacidade e agilidade para novos modelos de negócios

ou ajustes nos modelos atuais;· Explicita a relação entre aumento nos custos de TI e

aumento no valor da informação;· Mantém os riscos do negócio sob controle;· Explicita a importância da TI na continuidade dos negócios;· Mede e melhora continuamente a performance de TI.

BS 15000A especificação para Gestão dos Serviços e Processos de

Tecnologia da Informação (TI ) – BS 15000 , foi preparado peloComitê Técnico BDD/3 do Instituto de Padronização Britânico(BSI). [3]

O comitê técnico BDD/3, composto pela British Computer Society(BCS), Central Computer and Telecommunications (CCTA), IT ServiceManagement Forum (itSMF), National Audit (NAO) e algunscolaboradores ,foi responsável pela emissão da especificação em15 de Novembro de 2000. [3]

O modelo especificado é aplicável na gestão dos serviços eprocessos de TI, além desta aplicação ela pode ser utilizada para:

· As organizações buscarem propostas para outsource dosserviços;

· Organizações que requerem um acesso consistente paratodos os provedores de serviços em uma cadeia de fornecimento(supply chain);

· Benchmark da gestão dos serviços de TI dos provedoresexistentes;

· Base formal para certificação.

O relacionamento entre os diferentes processos de gestão,planejamento do serviço e os processos de gestão consideradosnesta norma são mostrados na ilustração a seguir: [3]

Delphi

Page 6: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE6

Delphi

AUTOMAÇÃO

PLANEJAMENTO DO SERVIÇO E GESTÃO DOS PROCESSOS

Gerenciamento da segurança

Eficácia eContinuidade do serviço

Gerenciamento do nível do serviço

Relatório do serviço

Gerenciamentodas habilidades

Administraçãofinanceira

CONTROLE DE PROCESSOSGerenciamento das configurações

Gerenciamento das modificaçõesPROCESSOSDE LIBERAÇÃO

Gerenciamentodas versões

PROCESSOS DE DECISÃO

Gerenciamento dos Incidentes

Gerenciamento dos problemas

PROCESSOS DE RELACIONAMENTO

Gerenciamento doRelacionamento dos

negócios

Gerenciamentodos fornecedores

AUTOMAÇÃO

PLANEJAMENTO DO SERVIÇO E GESTÃO DOS PROCESSOS

Gerenciamento da segurança

Eficácia eContinuidade do serviço

Gerenciamento do nível do serviço

Relatório do serviço

Gerenciamentodas habilidades

Administraçãofinanceira

CONTROLE DE PROCESSOSGerenciamento das configurações

Gerenciamento das modificaçõesPROCESSOSDE LIBERAÇÃO

Gerenciamentodas versões

PROCESSOS DE DECISÃO

Gerenciamento dos Incidentes

Gerenciamento dos problemas

PROCESSOS DE RELACIONAMENTO

Gerenciamento doRelacionamento dos

negócios

Gerenciamentodos fornecedores

Figura 1 - Processo de gestão e planejamento do serviço.

Os relacionamentos entre os diferentes processos de gestão eplanejamento dos serviços foram mostrados acima, agora éinteressante conhecermos como a versão 2000 desta norma estáorganizada. A seguir será mostrado como está organizada anorma:

Tabela 1 - Conteúdo da norma bs 15000

ITEM DESCRIÇÃO

1 ESCOPO

2 REFERENCIAS NORMATIVAS

3 DEFINIÇÕES

4 PRINCIPIO GERAL

5 GESTÃO E PROJETO DO SERVIÇO

6 PROCESSOS DE RELACIONAMENTO

7 PROCESSOS DE DECISÃO

8 CONTROLE DE PROCESSO

9 GERENCIAMENTO DAS VERSÕES

ANEXO A (INFORMATIVO) OUTRAS FONTES DEINFORMAÇÕES

BIBLIOGRAFIA

O escopo, que compreende o item número 1 desta norma, foimostrado no inicio deste artigo. O item a seguir indica que a BS15000 está referenciando itens do documento DISC PD 005 (Code ofPractice for IT Service Management).

O item número 3 algumas definições que não estão definidas

no documento DISC PD 005, como, porexemplo, temos “métrica”, que está definidocomo o elemento mensurável da função ouprocesso do serviço.

A partir do item 4 ao item 9 temos adescrição do modelo de gestão, para a Gestãodos Serviços e Processos de Tecnologia daInformação (TI ).

No item 4 da norma foram detalhados oslimites da gestão de serviços. Estes limitesdevem ser definidos de acordo com ascaracterísticas de cada organização, sualocalização, seus ativos e a tecnologiaempregada.Dentro destes limites estão

definidos: [3]

· O direcionamento e os recursos necessários paraimplementação da gestão dos serviços de TI;

· As competências necessárias para os profissionais queexecutam atividades nesta área;

· Como deve ser evidenciada a melhoria continua daqualidade dos serviços;

· Como devem ser executadas as auditorias;· Como deve ser demonstrada a conformidade dos objetivos da

gestão dos serviços.

No item número 5 (que é dedicado a gestão e o planejamentodo serviço) está definido o nível de gestão do serviço.Isto pode sertraduzido:

· Como é usada eficazmente a gestão para a tradução e aintegração dos requisitos solicitados;

· Como a organização assegura a continuidade dos serviços;· Como a organização produz informações para a tomada de

decisões;· Como é controlado e calculado o custo para provisão e

recuperação dos serviços;· A competência da gestão da organização.

No item 5 , destaca-se a utilização do SLA ( Service LevelAgreement ), como ferramenta para obtenção do entendimentoentre o provedor do serviço e um cliente que documenta e define onível do serviço desejado.

No item 6 , dedicado ao Processo de Relacionamento estãodetalhados os processos para gerar e manter um bomrelacionamento entre o provedor de serviço e o cliente. Esterelacionamento é baseado no entendimento do cliente e o

Page 7: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 7

Delphi

direcionamento de seu negócio.O relacionamento descrito étraduzido:

· Na gestão do relacionamento dos negócios;· Na gestão dos fornecedores.

Um outro item, que é o de número 7, trata dos processos deresolução. Neste processo estão descritas as formas de reduçãoda degradação, pelo gerenciamento do ciclo de vida completo dosincidentes, além da identificação e gerenciamento das causasfundamentais da minimização dos incidentes.

No penúltimo item desta norma está definido o Controle dosprocessos. Este item objetiva: [3]

· Registrar e controlar os componentes dos serviços ouinfraestrutura e proteção da integridade dos sistemas deinformações e meio físico.

· Assegurar que as mudanças requeridas nos negócios,infraestrutura ou serviço são avaliadas, aprovadas eimplementadas de uma forma controlada.

· O planejamento da implementação de novos serviços oumodificação de serviços e demonstração dos resultadosalcançados.

No último item desta norma está definido como planejar ereceber uma versão para garantir que qualquer modificação dositens de configuração sejam corretos, rastreáveis, protegidos eautorizados.

O Que é ITIL™

O ITIL™ (Information Technology Infrastructure Library) é o modelode referência para gerenciamento de processos de TI mais aceitomundialmente.

A metodologia foi criada pela secretaria de comércio (Office ofGovernment Commerce, OGC) do governo Inglês, a partir de pesquisasrealizadas por Consultores, Especialistas e Doutores, paradesenvolver as melhores práticas para a gestão da área de TI nasempresas privadas e públicas.

Atualmente se tornou a norma BS-15000, sendo esta umanexo da ISO 9000/2000. O foco deste modelo é descrever osprocessos necessários para gerenciar a infra-estrutura de TIeficientemente e eficazmente de modo a garantir os níveis deserviço acordados com os clientes internos e externos. [1]

Entre os processos que fazem parte do modelo de referência,podemos citar:

· Planejamento de serviços;

· Gerenciamento de incidentes;· Problemas;· Mudanças;· Configuração;· Operações;· Segurança;· Capacidade;· Disponibilidade;· Custos;· Entrada em produção;· Testes.

As empresas que o adotaram estão preocupadas em gerarvalor do TI para os negócios da empresa e provar este valor demaneira adequada, através de processos corretos. [1]

As normas ITIL™ estão documentadas em aproximadamente40 livros, onde os principais processos e as recomendações dasmelhores práticas de TI estão descritas.

O ITIL™ é composto por módulos. Os mais importantes são o“IT Service Support” e o “IT Service Delivery”.

Características do ITIL™· As principais características do ITIL™ são:· Modelo de referência para processos de TI não proprietário;· Adequado para todas as áreas de atividade;· Independente de tecnologia e fornecedor;· Um padrão de fato;· Baseado nas melhores práticas;· Um modelo de referência para a implementação de

processos de TI;· Padronização de terminologias;· Interdependência de processos;· Diretivas básicas para implementação;· Diretivas básicas para funções e responsabilidades dentro de

cada processo;· Checklist testado e aprovado;· O que fazer e o que não fazer.

Porque ITIL™?O ITIL™ conduz a uma forma de trabalho orientada a

processos objetivando oferecer um serviço de alta qualidade egarantia para os clientes da área de TI. As vantagens detrabalhar orientado a processos são listadas abaixo: [1]

· Faz com que as melhorias de qualidade possam ser medidas;· Torna os processos de gerenciamento dos serviços de TI

mensuráveis;· Fornece uma forma consistente de trabalho;· Fornece uma terminologia padronizada;

Page 8: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE8

Delphi

Figura 2 - Estrutura ITIL

· Aperfeiçoa os processos de comunicação;· Aumenta a satisfação do cliente ajustando corretamente sua

expectativa;· Auxilia na obtenção da certificação ISO 9000.

Casos de Sucesso1 - Procter & Gamble [2]· Adotou ITIL em 1997;· Economizou US$ 500 milhões em 4 anos:· 6 a 8% em corte de custos operacionais· 15 a 20% em redução de staff de tecnologia

2 - Governo de Ontario, Canadá [2]· Adotou ITIL para melhorar o serviço de 25.000 usuários em

1.000 locais;· Criou um service desk que melhorou a resposta e reduziu os

custos com chamados em 40%;

3 - ABN Amro [2]· Iniciou ITIL em 2001 – Data Center e implantação de

equipamentos do banco/agências;

· Deve estar concluído em 2005;· Centralização do help-desk:

aumento de chamados de 20.000para 60.000;

· Tempo de atendimentoreduzido em 20%;

· Volume de reclamaçõesreduzido em 80%;

· 94% dos atendimentoscompletados em menos de 20segundos;

ConclusãoA governança de TI tem sido

largamente difundida eimplementada nas organizações.

No entanto para o seu sucesso,depende diretamente da adoção emconjunta com metodologias epadrões de qualidade.

No caso do ITIL, oadicionamento da cultura dequalidade nos processos ficoudemonstrada nesse artigo, devidoao enriquecimento que a normaBS 15000 contém.

Sobre o autorMarcelo Nogueira é Mestre em Engenharia de Produção com

ênfase em Gestão da Informação, bacharel em Análise de

Sistemas, Professor Universitário, Instrutor e

Desenvolvedor Delphi desde 1995, Membro fundador do

DUG-BR. e-mail: [email protected]

Referências Bibliográficas[1] ITIL, ITIL Definições, Consist, acessado em 26/08/

2004 http://www.consist.com.br/brasil/consistitsm/itil.htm[2] BRODBECK, Henrique J., Governança de TI,

acessado em 30/07/2004 http://www.inf.ufrgs.br/~brodbeck/[3]Sasaki, Luís Hiromitsu , Conhecendo a norma de

Gestão de Serviços TI (BS 15000). Acesso 04/06/03 http://www.alternet.com.br/canal/administracao/bs15000.doc

[4]Ghigonetto, Mauricio, ITIL, acesso em 07/08/2004.http://www.emm.usp.br/g_fr_tutor.html

Page 9: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 9

Impressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasUma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2

Delphi

Na Internet estão disponíveis diversos componentes parageração e impressão de Código de Barras utilizando o Delphi eimpressoras Laser ou Jato de Tinta. Ao trabalharmos comdiferentes impressoras, tivemos alguns problemas quanto àresolução, configuração de impressoras, impressão nas margensdas etiquetas, impressão de grandes quantidades de etiquetas eetc, o que comprometia a confiabilidade do sistema.

Devido a estes e outros problemas, consideramos que amaneira mais simples, prática e profissional de se imprimircódigos de barras, é utilizando impressoras específicas paraimpressão de etiquetas e códigos de barras.

Neste artigo fazemos uma abordagem prática para asimpressoras Zebra, que utilizam linguagem de script ZPL2, apóseste estudo, o leitor estará familiarizado com o conceito geral, epronto para utilizar qualquer impressora do gênero.

Acessando a impressoraCaso deseje, o usuário da impressora pode utilizar softwares

prontos disponíveis para download que acompanham a impressoraou são vendidos separadamente. Este não é o tipo de abordagemque desejamos aos nossos clientes. O ideal é que sejamos capazesde oferecer a funcionalidade de impressão de código de barras pordentro dos nossos programas, utilizando uma interface com aqual o usuário já esteja familiarizado. Para isso, é necessárioconhecer o formato de comunicação com a impressora.

A impressora em questão não requer nenhum tipo de driverespecífico para funcionar, bastando que lhe seja passada umaseqüência de comandos ASCII pela porta a qual esta conectada.Sendo assim o acesso pode ser feito até mesmo pelo MS-DOS comum comando do tipo:

COPY “MEU_ARQUIVO.TXT” LPT1ou

COPY “MEU_ARQUIVO.TXT” COM1

Onde “MEU_ARQUIVO.TXT” é um arquivo de texto comumcontendo o script em ZPL2 que se deseja executar e deve serenviado para a porta paralela (LPT1) ou serial (COM)

Este tipo de abordagem de comunicação facilita, e muito, aimplementação, uma vez que a nossa única preocupação seráconhecer os comandos, utilizando os métodos padrões do Delphipara o envio das strings.

Conhecendo a LinguagemOs comandos em ZPL2 obedecem a uma sintaxe geral do tipo:

·A Comandos·p1,p2,p3 Parâmetros·[p1,p2,p3] Parâmetros opcionais

Apesar da impressora disponibilizar uma infinidade decomandos e opções, tais como contadores, criação earmazenamento de formulários em memória, velocidade deimpressão dentre outros, vamos abordar alguns itens principais:

· Configuração da Etiqueta· Impressão de Textos· Impressão de Códigos de Barras

Sempre que desejarmos imprimir uma determinada etiquetadevemos seguir um procedimento geral indicado pela impressora:

· Inicialmente devemos indicar o início de formatação daetiqueta, Comando XA.

· Enviamos à impressora os comandos relativos à

Impressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasImpressão de Código de BarrasUma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2Uma abordagem prática ZEBRA ZPL2

por Victory Fernandes e Augusto Frederico

Page 10: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE10

Delphi

configuração e montagem da nova etiqueta –Comandos Texto e Códigode Barras.

· Uma vez concluída a montagem da etiqueta, com o ComandoPQ determina-se a quantidade de impressão.

· O Comando XZ decretará o término da formatação.

Veremos agora a análise de cada um dos comandos citadosseparadamente:

Modo de FormataçãoO primeiro Comando passado à impressora será o Comando XA,

que indicará o início no modo de formatação da etiqueta.

Impressão de TextosPara impressão de textos formatados na etiqueta, utilizamos

o Comando_Texto_ZPL2, que nada mais é do que a junção de várioscomandos da impressora e cuja sintaxe é mostrada abaixo:

Onde,p1 margem esquerda em pontos (8 pontos/mm).

default: 00- 9999

p2 margem superior em pontos(8 pontos/mm).default:00-9999

p3 inverter coresAo enviarmos este parâmetro, a impressora inverte as

cores pretas em brancas e vice-versa .p4 tipo fonte

A..Z1..9

p5 orientação

Valor Descrição

N Sem rotação

R Rotação de 90º

I Rotação de 180º

B Rotação de 270º

p6 altura fonte em pontos (8 pontos/mm)default: 1510- 1500 pontos

p7 largura fonte em pontos(8 pontos/mm)default: 1210-1500 pontos

p8 Texto (informação a ser impressa)

Chamamos a função texto da seguinte forma:Texto_ZPL2(20, //Margem Esquerda 70, //Margem Superior

Teste de Impressao, //TextoN , //Inverter CoresN , //OrientaçãoN , //Tipo fonte15 //Altura Fonte15 //Largura Fonte

A Listagem 01 mostra o retorno do script ZPL2 após a chamadafeita acima:

^FO20,70^AN,N,15,15^FDTeste de Impressao^FS

Listagem 01 - Formatação do texto

Impressão de Código de BarrasPara impressão de códigos de barras nos mais diversos

formatos, utilizamos o Comando Código_Barras_ZPL2, uma junçãode vários comandos da impressora e cuja sintaxe é mostradaabaixo:

Bp1,p2, p3,p4, p5,p6

Onde,p1 margem esquerda em pontos (8 pontos/mm).

default: o0- 9999

p2 margem superior em pontos(8 pontos/mm).default:00-9999

p3 tipo código1, 2, 3, 4, 7, 8, 9, A, B, C, D, E, F,I, J, K, L, M, P, Q, S, U, X, Y, Z.

p4 Orientação

Valor Descrição

N Sem rotação

R Rotação de 90º

I Rotação de 180º

B Rotação de 270º

Tabela 01

Valores de Rotação

Tabela 02

Valores de Rotação

p5 inverter coresAo enviarmos esse parâmetro a impressora inverte as cores

pretas em brancas e vice-versa.p6 Código (valor do código de barras).

Chamamos a função Código_Barras_ZPL2 da seguinte forma:Codigo_Barras_ZPL2(20, //Margem Esquerda 70, //Margem Superior

Page 11: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

Delphi

1 //Tipo fonte123, //CódigoN , //Inverter CoresN) ; //Orientação

A Listagem 02 mostra o retorno do script ZPL2 após a chamadafeita acima:

^FO20,70^B1N^FD123^FS

Listagem 02 - Formatação do Código de Barras

Comandos Finais da EtiquetaApós passarmos todos dados para a etiqueta, determinamos a

quantidade de etiqueta a ser impressa através do Comando PQ,com sintaxe:

PQ p1p1 determina a quantidade de cópias, 1 até 99.999.999.O comando XZ determina o termino da formatação.

O Programa ExemploVeja na Figura 01 a tela do aplicativo demonstrativo criado:

Figura 01 - Tela principal do exemplo de utilização de Impressora de Código de Barras

· Configurar todos os parâmetros de formatação doscomandos XA, Texto, Código de Barras, PQ, XZ.

· Adicionar e excluir produtos para impressão.· Visualizar a codificação em ZPL2 gerada para impressão

das etiquetas.· Salvar um arquivo de script ZPL2 para impressão futura.· Abrir um arquivo de script ZPL2 para impressão.· Imprimir códigos de barras em qualquer impressora

paralela compatível com ZPL2.Nele foram implementadas as chamadas às funções de

impressão de texto e código de barras, descritas anteriomente, comomostrado:

Function Comando_XA: String;Procedure Texto_ZPL2(p1,p2 p3,p4,p5,p6,p7,p8 :string)Procedure Codigo_Barras_ZPL2(p1, p2, p3, p4, p5, p6: string)Function Comando_PQ(q: String): String;Function Comando_XZ: String;O programa faz sucessivas chamadas a estas funções, de

acordo com a quantidade de produtos contida no componenteTListview e a quantidade de etiquetas por produto definida pelousuário, para gerar o script em ZPL2 que é enviado para ocomponente TMemo. Uma vez o script em ZPL2 pronto, utilizamosuma função de escrita na porta da impressora para enviar os

comandos contidos no componente TMemo para aimpressora instalada na porta paralela, comomostrado:

procedureprocedureprocedureprocedureprocedure DirectPrint(s:StringStringStringStringString);var PTBlock : TPassThroughData;begin PTBlock.nLen := Length(s); StrPCopy(@PTBlock.Data, s); Escape(printer.handle,PASSTHROUGH, 0, @PTBlock, nilnilnilnilnil);endendendendend;procedureprocedureprocedureprocedureprocedureTForm1.Button2Click(Sender:TObject);begin //impressao do codigo de barras ififififif memo1.Lines.Count > 0 thenthenthenthenthen beginbeginbeginbeginbegin

Printer.BeginDoc; DirectPrint(memo1.Lines.Text); Printer.EndDoc; endendendendend;endendendendend;

Este programa exemplifica a impressão de códigos de barras.Nele podemos:

Page 12: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

Delphi

A ZPL2_UnitAs chamadas dos comandos da impressora demonstradas

durante o artigo foram feitas utilizando a ZPL2_Unit.pas, uma Unitdesenvolvida em Delphi de acordo com o manual de referência dalinguagem ZPL2 para geração de script utilizado nas impressorasde código de barras Zebra.

As vantagens de utilizar a ZPL2_Unit incluem:· Completa abstração da camada de geração do script, sendo

necessário apenas fazer chamadas às funções da Unit para oscomandos desejados.

· Velocidade na implementação da comunicação com aimpressora.

· Geração de etiquetas com texto e código de barras de formamuito simples.

· Facilidade na geração de código ZPL2

Maiores informações sobre a ZPL2_Unit podem ser obtidas nosite do produto em http://www.igara.com.br/produto.php?cod_produto=46

ConclusãoAgora que você está familiarizado com as principais opções

das impressoras, fica muito mais fácil partir paraimplementações mais elaboradas, que utilizem outros recursosnão abordados neste artigo, como opções de contadores,

temporizadores, impressão de imagens e logomarcas, impressãode formulários etc...

Maiores informações sobre impressoras de códigos de barras,bem como download de manuais podem ser encontradas no sitedo fabricante em http://www.zebra.com.

Maiores informações sobre a ZPL2_Unit podem ser obtidas nosite do produto em http://www.igara.com.br/produto.php?cod_produto=46

Sobre o autorVictory Fernandes é desenvolvedor sócio da TKSSoftware - Soluções de Automação Comercial eSoftwares Dedicados. Pode ser contactado [email protected], ou através dos siteswww.victory.hpg.com.br - www.enge.cjb.net –www.igara.com.br.

Sobre o autorAugusto Frederico é estudante de EngenhariaMecatrônica e desenvolvedor da TKS Software -Soluções de Automação e Softwares Dedicados. Pode sercontactado em [email protected]

Page 13: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 13

Um estranho no ninhoUm estranho no ninhoUm estranho no ninhoUm estranho no ninhoUm estranho no ninhoFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos Delphianos

Delphi

Um estranho no ninhoUm estranho no ninhoUm estranho no ninhoUm estranho no ninhoUm estranho no ninhoFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos DelphianosFerramenta gratuita invade o mundo dos Delphianos

por Emerson Facunte

Salve, salve Delphianos!

Peço licença a vocês para apresentar uma ferramenta dedesenvolvimento C# totalmente gratuita: Microsoft Visual C#2005 Express.

Eu sei que alguns irão torcer o nariz e dizer: essa revista édirigida aos desenvolvedores Delphi, certo? O Facunte sempredefendeu o Delphi com unhas e dentes, certo? E por que oFacunte quer apresentar uma ferramenta C#?

O mercado está cada vez mais exigente, meus amigos! Eagradeço a Borland por introduzir o suporte ao C# em sua IDE.Isso não é nenhuma surpresa, é um antigo sonho da Borland emoferecer linguagens e tecnologias diferentes em sua IDE.

Em meus artigos anteriores mostrei como é fácil e prazerosoo aprendizado desta fantástica linguagem de desenvolvimento:C#.

Agora mostrarei a facilidade de utilizar uma ferramenta dedesenvolvimento gratuita muito semelhante ao Visual Studio daMS.

Coragem meus amigos, quebre esse paradigma, sejageneralista!

O início

Antes de iniciarmos, sugiro que vocês baixem a ferramentaMS Visual C# 2005 Express no site:

http://lab.msdn.microsoft.com/express/

É uma ferramenta totalmente gratuita para o uso pessoal ecomercial, com bons recursos para o desenvolvimento deaplicações Console, Windows, além de bibliotecas de classe,controles entre outras.

Na tela inicial (figura 1) temos uma central com Wizards,Tutoriais e sites da comunidade C#.

Criando a aplicaçãoVamos criar nossa aplicação no modelo Windows Forms.

Selecione as opções File/New/Project (Ctrl-Shift-N), e najanela seguinte (figura 2), selecione a opção Windows Application,informando TheClubBrowser como nome da aplicação.

Repare que agora foi criado um formulário.

Vamos inserir os objetos necessários para a nossa aplicação.

Os objetos estão disponíveis na ToolBox (figura 3). Selecione aseção Windows Forms e insira os objetos que seguem:

ComboBoxName cmbURL

ButtonName - btnGoText - >

WebBrowserwbrClientAnchor – Top, Bottom, Left, Right

Page 14: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE14

Delphi

Figura 1 – Tela inicial

Figura 2 – Selecionando a opção Windows Application Figura 3 – ToolBox

Page 15: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 15

Delphi

A figura 4 ilustra a disposição dos objetos.

Figura 4 – Disposição dos objetos

Neste ponto iremos codificar o objeto btnGo. Dê umduplo-clique no objeto btnGO (ou selecione o evento

Click) e insira o código que segue:wbrCLient.Navigate(cmbURL.Text);

Execute a aplicação (F5) e veja o resultado (verfigura 5).

Figura 5 – Aplicação em execução

Sobre o autorFacunte é co-Owner Framework.Net Microsoft,

evangelista de aplicações e-business, publicou 6livros e mais de 80 artigos, ministrou palestra paracerca de 10.000 pessoas em todo o país (Borcon,TechWeek-SP-POA-RJ, .Net 2005 RoadShow),membro-fundador do DUG-BR, lider do grupoGo.Net, consultor sênior do grupo DevMedia eArquiteto de Software do Grupo Saraiva. Nostempos livres curte programação MSX, Cinema,Basquete e uma boa pista de dança!

http://br.thespoke.net/MyBlog/borlandman/MyBlog.aspx

Page 16: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE16

Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005

Delphi

Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005Imprimindo no Delphi 2005Por Claudinei Rodrigues – [email protected]

A parte de impressão é uma das mais importantes tarefas deuma aplicação. Neste artigo eu vou abordar a impressão viaprogramação no Delphi 2005 utilizando os recursos disponíveisno .NET Framework. Você verá que este tipo de trabalho é bemsimples de ser feito, pois o .NET Framework traz uma classe queencapsula todas as funções de impressão mais complexas. Comesta classe você tem a possibilidade de permitir ao usuário queconfigure em qual impressora ele quer imprimir, configurar otamanho da página, margens, quantidade de cópias, etc. Nósvamos começar com um exemplo bem simples que imprimeapenas um string, depois baseado neste exemplo nós vamosimplementar outros recursos.

Criando um novo projeto.Agora chame o seu Delphi 2005. Clique em File | New |

Windows Forms Application – Delphi for .NET, como mostradona figura 1.

Figura 1: Criando uma aplicação Windows Forms

Agora nós vamos incluir quatro botões ao nosso WinForm.Vá até o Tool Palette na categoria Windows Forms. Clique nocomponente Button, como mostrado na figura 2, e arraste-o aonosso WinForm.

Figura 2: Tool Palette

Após incluir os botões você terá o WinForm semelhante aomostrado na figura 3.

Figura 3: WinFormcom as opções deimpressão

Agora para podermos utilizar a classe de impressão, temosque declarar um namespace. Vá até o código fonte e declare onamespace System.Drawing.Printing, como mostrado na listagem 1;

unit WinForm;

interface

uses

Page 17: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 17

Delphi

System.Drawing, System.Collections,System.ComponentModel, System.Windows.Forms,System.Data, System.Drawing.PrintingSystem.Drawing.PrintingSystem.Drawing.PrintingSystem.Drawing.PrintingSystem.Drawing.Printing;

Type

Listagem 1: Declaração dos namespaces.

É neste namespace que encontraremos a classePrintDocument que é responsável em enviar informações para aimpressora. Tudo o que você precisa para imprimir desderelatórios simples até os mais complexos. Entretanto nós veremosa utilização de outras classes que irão enriquecer o nossoexemplo.

Para imprimirmos um texto ou um gráfico basta quechamemos o método Print da classe PrintDocument. Ao executareste método, um evento de impressão será disparado. É nesteevento que iremos incluir o que precisamos que seja impresso.

Escrevendo o eventoO nosso evento recebe um argumento do tipo

System.Drawing.Printing.PrintPageEventArgs, contendo osdados relacionados ao evento de impressão. Um objeto queencontramos em PrintPageEventArgs é o objeto Graphics que éresponsável pela impressão da página. Para enviar um texto nósvamos utilizar o método DrawString. Existem também outrosmétodos como FillRectangle, DrawEllipse, etc.

Para que você possa entender melhor como tudo istofunciona, vamos montar uma rotina bem simples. Depois iremosadicionar os novos recursos.

Bem, no começo desta matéria você adicionou quatro botõesno WinForm. Vá até o evento Click do primeiro botão e inclua ocódigo abaixo:

procedureprocedureprocedureprocedureprocedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);var// Define uma variável do tipo PrintDocument ImpDoc : PrintDocument;begin try// Cria uma variável do tipo PrintDocument ImpDoc := PrintDocument.Create(); // Atribui o evento PrintPage a funçãoImpPag include(ImpDoc.PrintPage,ImpPag);// Executa a impressão

ImpDoc.Print; // Verifica se ocorreu algum erro exceptexceptexceptexceptexcept ononononon E: System.Exception dododododo begin // Caso ocorra algum erro, será // mostrada uma mensagem. MessageBox.Show(E.Message.ToString()); end; end;end;

Listagem 2: Rotina de impressão direta.

Conforme eu havia dito, ao você executar o método Print umevento de impressão seria disparado. No código acima eu estouatribuindo uma procedure que eu criei ao evento de impressão doPrintDocument, como você pode ver nesta linha que está incluídano código mostrado anteriormente.

// Atribui o evento PrintPage a função ImpPaginclude(ImpDoc.PrintPage,ImpPag);

Agora veja a seguir como é a nossa procedure que iráfornecer os dados necessários a impressão.

procedureprocedureprocedureprocedureprocedure TWinForm.ImpPag(sender:System.Object; e: PrintPageEventArgs);var texto : stringstringstringstringstring; MargemEsquerda, MargemTopo : integer; fonte : System.Drawing.Font;begin // Defini o texto a ser impresso texto := ‘Exemplo de impressão

em Delphi .NET’; // Configura o tipo de fonte fonte := System.Drawing.Font.

Create(‘Arial’, 20); // Defini a margem esquerda MargemEsquerda := e.MarginBounds.Left; // Defini a margem direita MargemTopo := e.MarginBounds.Top; // Imprime a linha e.Graphics.DrawString(texto, fonte,Brushes.Black, MargemEsquerda, MargemTopo);end;

Listagem 3: Rotina de impressão.

Como você pode ver, a rotina é muito simples. Agora basta

Page 18: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE18

Delphi

compilar. Está pronto o seu primeiro exemplo de impressão em.NET através do Delphi 2005.

Usando o PrintDialogAgora vamos adicionar mais recursos ao nosso programa.

Vamos utilizar o PrintDialog para que possamos selecionar paraqual impressora queremos mandar a nossa impressão,implementar a possibilidade de cancelar a impressão, selecionar onumero de cópias, quais páginas desejamos imprimir, etc. Parase utilizar o PrintDialog é muito simples, veja o código a seguirque está incluído no segundo botão do nosso exemplo.

procedureprocedureprocedureprocedureprocedure TWinForm.Button2_Click(sender:System.Object; e: System.EventArgs);var // Define uma variável do tipoPrintDocument ImpDoc : PrintDocument; // Define uma variável do tipo PrintDialog dlg : PrintDialog;begin try //Cria uma variável do tipo PrintDocument ImpDoc := PrintDocument.Create(); // Cria uma variável do tipo PrintDialog dlg := PrintDialog.Create(); // Permite a seleção de páginas dlg.AllowSomePages := True; //Atribui o PrintDocumento ao PrintDialog dlg.Document := ImpDoc; //Atribui o evento PrintPage //a função ImpPag include(ImpDoc.PrintPage,ImpPag); // Chama o componente PrintDialog. // Se clicar no botão OK o relatório // será impresso, caso contrário // o relatório não será impresso. ififififif (dlg.ShowDialog() = System.Windows.

Forms.DialogResult.OK) thenthenthenthenthen beginbeginbeginbeginbegin // Imprime o relatório ImpDoc.Print; end; // Verifica se ocorreu algum erro except onexcept onexcept onexcept onexcept on E: System.Exception dododododo begin // Caso ocorra algum erro, será // mostrada uma mensagem. MessageBox.Show(E.Message.ToString()); end;

end;end;

Listagem 3: Utilização do PrintDialog.

Configuração de páginaAgora nós vamos adicionar o recurso de configuração de

página. Para isto nós vamos trabalhar com o PageSettings. Vocêpode incluir um botão em sua aplicação apenas para fazer aconfiguração da página, veja no código a seguir que está incluídono terceiro botão da nossa aplicação.

procedureprocedureprocedureprocedureprocedure TWinForm.Button5_Click(sender:System.Object; e: System.EventArgs);begin //Cria uma variável do tipo PageSetupdialog psd := PageSetupDialog.Create(); // Cria uma variável do tipo PageSettings ConfPag := PageSettings.Create(); // Atribui as configurações de página // ao PageSetupDialog psd.PageSettings := ConfPag; // Permite alterar a orientação do papel psd.AllowOrientation := True; // Permite a alteração de margens psd.AllowMargins := True; // Chama a tela do PageSetupDialog psd.ShowDialog();end;

Listagem 4: Configurando páginas

Preview do relatórioNormalmente antes de se mandar imprimir um relatório,

muitos usuários gostam de ver o relatório antes de enviá-lo paraa impressora. Assim vamos montar o preview do relatório, algomuito simples. Veja no código abaixo onde utilizamos oPrintPreviewDialog que pode ser visto no quarto botão de nossaaplicação.

procedureprocedureprocedureprocedureprocedure TWinForm.Button3_Click(sender:System.Object; e: System.EventArgs);var // Define uma variável do // tipo PrintDocument ImpDoc : PrintDocument; // Define uma variável do // tipo PrintPreviewDialog prvdlg : PrintPreviewDialog;begin

Page 19: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

Delphi

try //Cria uma variável do tipo PrintDocument ImpDoc := PrintDocument.Create(); // Atribui o evento PrintPage // a função ImpPag include(ImpDoc.PrintPage,ImpPag); // Cria uma variável do tipo // PrintPreviewDialog prvdlg := PrintPreviewDialog.Create(); // Atribui o relatório ao Preview prvdlg.Document := ImpDoc; // Texto da tela de preview prvdlg.Text :=

‘THE CLUB - Exemplo de Preview’; // Texto da tela de preview maximizada prvdlg.WindowState :=

FormWindowState.Maximized; // Chama o componente PrintPreviewDialog prvdlg.ShowDialog(); // Verifica se ocorreu algum erro exceptexceptexceptexceptexcept ononononon E: System.Exception dododododo begin // Caso ocorra algum erro, será

// mostrada uma mensagem. MessageBox.Show(E.Message.ToString()); end; end;end;

Listagem 5: Montando o preview

ConclusãoComo você pôde ver nesta matéria eu tentei ser o mais

simples possível, para que você possa entender como se pode fazera impressão via programação no Delphi 2005 utilizando osrecursos disponíveis no .NET Framework. É claro que você podefazer muito mais, basta a partir destes exemplos utilizar a suacriatividade. Até o próximo mês, e um grande abraço a todos.

Download do projeto em: http://www.theclub.com.br/revista/download/imp032005.zip

Sobre o autorClaudinei Rodrigues,

Consultor Técnico do The Club

[email protected]

Page 20: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE20

Construindo um relatórioConstruindo um relatórioConstruindo um relatórioConstruindo um relatórioConstruindo um relatórioCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave Reports

Delphi

Como sabem, o Rave Reports é um poderoso gerador derelatórios que apesar de estar no mercado há um bom tempo,somente após sua distribuição junto ao Delphi 7 passou a sermais utilizando entre os programadores Delphi. Este geradorpossui muitos recursos interessantes, contudo, a falta dedocumentação a respeito do mesmo gera uma certa resistênciaem sua adoção.

Diariamente atendemos dezenas de programadores comdúvidas sobre situações até simples que estavam habituados aimplementar em outros geradores como o QuickReport porexemplo, porém esbarrando na falta de informação dentro doRave Reports.

Uma destas situações é a implementação do famoso relatórioCrossTab ou seja, um relatório de referência cruzada onde osdados podem possuir uma coluna fixa, como por exemplo com onome do cliente e ao lado, a totalização de suas compras mês amês, estando cada mês representado em uma coluna.

Pensando nestas situações, resolvi publicar este artigoabordando o Rave Reports e CrossTab, somando mais um artigosobre este excelente gerador de relatórios em nossa The ClubMegazine.

Banco de dadosNeste exemplo, iremos utilizar o Firebird 1.5.2 onde iremos

criar duas tabelas, sendo uma contendo os dados dos clientes eoutra contendo as compras efetuadas por estes clientes. Sugiroutilizar o IBExpert (www.ibexpert.com) que é uma ferramentagratuita para manutenção em bancos Interbase/Firebird paracriar o banco de dados e suas tabelas. (Poderá encontrarreferência sobre o IBExpert em nossa revista de Dezembro/2004).

Vamos criar as estrutura da tabela Clientes, veja o código nalistagem 1.

CREATE TABLE CLIENTES ( ID INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(70), ENDERECO VARCHAR(70), BAIRRO VARCHAR(30), CIDADE VARCHAR(30), UF CHAR(2), CEP CHAR(10), CNPJ_CPF VARCHAR(18), RG_IE VARCHAR(18), TELEFONE VARCHAR(18), EMAIL VARCHAR(80));

Listagem 1 – Tabela Clientes

Agora vamos criar uma tabela chamada Vendas, a qual teráuma estrutura bem simples apenas para ilustrar nosso relatório,veja a listagem 2.

CREATE TABLE VENDAS (NF CHAR(6) NOT NULL PRIMARY KEY,DATA DATE NOT NULL,CLIENTE_ID INTEGER NOT NULL,VALOR_TOTAL NUMERIC(15,2) NOT NULL);ALTER TABLE VENDAS ADD CONSTRAINTFK_VENDAS_CLIENTES FOREIGN KEY (CLIENTE_ID) REFERENCESCLIENTES (ID);

Listagem 2 – Tabela Vendas

Para podermos testar nosso relatório, vamos acionar algunsregistros em ambas as tabelas… Para isso, poderá utilizar a aba

Construindo um relatórioConstruindo um relatórioConstruindo um relatórioConstruindo um relatórioConstruindo um relatórioCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave ReportsCrossTab no Rave Reports

por Alessandro Ferreira, [email protected]

Page 21: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 21

Delphi

Figura 1 – Clientes

Agora vamos adicionar alguns registros que irão representaras compras destes clientes, veja a figura 2.

Adicione dados para todosos clientes alternandovalores e datas. Se preferir,poderá baixar o projeto deexemplo apresentado nesteartigo no qual jáadicionamos dados nastabelas para testes, veja oendereço no final desteartigo

Observação: CrossTab “no braço”Alguns geradores de relatório como,por exemplo, o Report Builder e oCrystal Reports possuem recursosespecíficos para implementação derelatórios que necessitam de dadosagrupados, assim como este queiremos construir. Contudo, no casodo Rave Reports não temos este tipode funcionalidade e com issoteremos que construí-lo “no braço”mesmo, contudo você verá que isso

não será tão complicado assim.Primeiro, vamos criar um projeto no Delphi 7 ou Delphi 2005

se preferir onde iremos através da dbExpress acessar o banco dedados e gerar uma consulta SQL para agrupar os dados deacordo com nossas necessidades e depois utilizá-los via RaveReports. Adicione um componente SQLConnection (dbExpress),altere sua propriedade Name para cnxCrossTab, a propriedade

LoginPrompt para False, dê um duplo clique no componente eadicione uma conexão apontando para nosso banco de dados deexemplo, conforme sugere a figura 3.

Figura 2 – Vendas

Figura 3 – Conexão dbExpress.

Prosseguindo, adicione um componente SQLDataSet,configure a propriedade SQLConnection para cnxCrossTab,Name para sdsCrossTab e na propriedade CommandTextadicione a sentença SQL apresentada na listagem 3.

Select CLI.NOME AS CLIENTE, EXTRACT(MONTH FROM VEN.DATA) AS MES, SUM(VEN.VALOR_TOTAL) AS TOTALFrom VENDAS VENLeft Outer Join CLIENTES CLI on CLI.ID = VEN.CLIENTE_IDWhere EXTRACT(YEAR FROM VEN.DATA) = :ANOGroup By CLI.NOME,

Page 22: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE22

Delphi

EXTRACT(MONTH FROM VEN.DATA)

Listagem 3 – Sentença SQL.

Adicione um componente DataSetProvider, configure Namepara dspCrossTab e DataSet para sdsCrossTab. Após isso,adicione um componente ClientDataSet, configure Name paracdsCrossTab, ProviderName para dspCrossTab e depois cliquecom o botão direito no mesmo e selecione a opção: ‘Fetch Params’.

Para testes, se executar esta sentença SQL no IBExpert, teráo resultado apresentado na figura 4.

Figura 4Select executado

Observe que os dados ficam arranjados contendo mês/totallinha a linha para cada cliente. Contudo, um relatório dereferência cruzada consiste em arranjar os dados na estruturaapresentada na tabela 1.

altere Name para RvCrossTab, adicione um componenteRvDataSetConnection, altere Name para RvDsCrossTab e apontea propriedade DataSet para cdsCrossTab. Após isso, dê um duploclique no RvProject para acessarmos os Rave Design, no qual

Cliente Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez Total

Alessand... 420,00 180,00 420,00 280,00 500,00 420,00 180,00 100,00 320,00 180,00 100,00 500,00 3.600,00

Emerson... 1267,00 487,00 1850,00 1190,00 1190,00 530,00 650,00 540,00 221,00 311,00 123,00 1205,00 9.564,00

Total 13.164,00

Tabela 1 – Dadosarranjados emcross-tab.

vamos criar um novo relatório. Para isso, acesse o menu File |New, volte ao menu File e selecione agora Save As... e salve noprojeto Rave junto com os demais arquivos do projeto qualestamos trabalhando, como o nome de RvCrossTab, feito isso,alterne ao projeto Delphi e ajuste a propriedade ProjectFile doRvCrossTab para RvCrossTab.Rav.

Devido a estrutura deste relatório, vamos necessitar de maisespaço na transversal, por isso, selecione o objeto ‘Page1’utilizando o treeview de objetos ao lado direito do Rave Design eajuste a propriedade Orientation para poLandScape a qual indicao modo ‘paisagem’, veja a figura 5.

Adicione agora um componente Region (aba Report) e ajuste-o de forma a ocupar todo o Report1.

Após isso, adicione dois componentes Band (aba Report) econfigure a propriedade BandStyle conforme demonstra a figura6, estas bandas serão utilizadas como cabeçalho de página ecabeçalho de coluna.

Figura 6 – Cabeçalhos

Esta segunda Band iremos utilizarcomponentes VLine e Rectangle (abaDrawing) e componentes Text para dar aaparência de uma tabela, parecido com olayout apresentado na figura 7.

Figura 7 – Layout do relatório

Figura 5 - Seleção do objeto Page1.

Obs. Por questões de espaço,não temos como mostrar o layoutcompleto, mas as colunas vão atéDezembro, sendo a última paraapresentar o total, seguindo omesmo layout que apresentamosanteriormente na tabela 1.

Page 23: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 23

Delphi

Antes de adicionarmos um DataBand (na qual iremosapresentar os dados), vamos configurar a fonte de dados. Paraisso, clique no botão ‘New Data Object’, selecione a opção ‘DirectData View’ e estando com ‘RsDsCrossTab’ selecionado, clique em‘Finish’ e com isso teremos um objeto DataView adicionado emnosso relatório. Selecione-o no treeview a direita e altere suapropriedade Name para dvCrossTab.

Adicione agora uma DataBand (aba Report), ligue suapropriedade DataView ao dvCrossTab. Para que as bandas decabeçalho funcionem corretamente, selecione-as (Band1 eBand2) e aponte a propriedade ControllerBand para DataBand1.

Em nossa DataBand também iremos utilizar componentesVLine a fim de deixar o layout parecido com uma tabela,seguindo a estrutura que construímos no cabeçalho de coluna.Ainda em nossa DataBand, adicione 14 componentes DataText osquais iremos nomear como: dt_Nome, dt_01, dt_02, dt_03, dt_04,dt_05, dt_06, dt_07, dt_08, dt_09, dt_10, dt_11, dt_12 e dt_Total, osquais serão utilizados para apresentação dos dados na DataBand.Cada um destes DataText estará ligado a um parâmetro queiremos definir selecionando o objeto Page e depois acessando apropriedade Parameters na qual declare os seguintes valores,“um por linha”: pNome, p01, p02, p03, p04, p05, p06, p07, p08,p09, p10, p11, p12, pTotal. Na propriedade DataField do dt_Nome,informe: Param.pNome. Na propriedade DataField do dt_Total,informe: Param.pTotal e nos demais DataText “dt_??” informe oparâmetro correspondente, como exemplo para o dt_01 configureo DataField como: Param.p01 e assim sucessivamente.

E finalmente vamos adicionar uma banda para totalizaçãogeral de nosso relatório, então, adicione mais um Band e ajuste apropriedade ControllerBand para DataBand1 e BandStyleconforme a figura 8.

Figura 8 – BandaSumário.

Adicione componentes VLine eRectangle (aba Drawing) para darcontinuidade ao layout de nossa tabela.Para efetuar a totalização das colunas,adicione 13 CalcText1 os quais irãototalizar cada mês e na última coluna ototal geral. Configure as propriedades:Controller para DataBand1,DisplayFormat para ##,##0.00,FontJustify para pjRight e DataFieldpara cada parâmetro respectivamente,como exemplo Param.p01 referentejaneiro e o último referente o total geralpara Param.pTotal, com isso, nossabanda de totalização estará pronta.

Aqui, finalizamos asimplementações dentro do projeto Rave,restando agora a codificação dentro doDelphi, vamos lá...

Finalizando a codificaçãoAdicione um componente Label e altere seu Caption para

‘Informe o Ano para gerar o relatório:’, um componente MaskEdite configure Name para MEdit_Ano e um BitBtn configurandoName para btnVisualizar. Vamos agora implementar e declararvariáveis e métodos que serão utilizados em nosso projeto, veja alistagem 4.

private { Private declarations } { Private declarations } { Private declarations } { Private declarations } { Private declarations } NomeDoCliente: String; TotalDoCliente: Extended; procedure ZeraValores; procedure AtualizaTotalDoCliente; procedure PreencheParametros; procedure MostraTotal; public { Public declarations } end;

var Form1: TForm1;

implementation

{$R *.dfm}

{ Atribui “zero” para os parâmetros, para quese um determinado mês não possuirmovimentação, não mostre o valores anterior }procedure TForm1.ZeraValores;var i: Integer;begin for i := 1 to 12 do RvCrossTab.SetParam(‘p’+FormatFloat

(‘00’, i),’0,00');end;

{ Vai acumulando mês a mês para totalizar ocliente }procedure TForm1.AtualizaTotalDoCliente;begin TotalDoCliente := TotalDoCliente + cdsCrossTab.FieldByName(‘TOTAL’).AsFloat;end;

{ Atribui valores aos parâmetros querepresentam mês a mês }procedure TForm1.PreencheParametros;

Page 24: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE24

Delphi

begin if (NomeDoCliente <>cdsCrossTab.FieldByName(‘CLIENTE’).AsString)then RvCrossTab.SetParam(‘pNome’,cdsCrossTab.FieldByName(‘CLIENTE’).AsString);

NomeDoCliente :=cdsCrossTab.FieldByName(‘CLIENTE’).AsString;

RvCrossTab.SetParam(‘p’+FormatFloat(‘00’,cdsCrossTab.FieldByName(‘MES’).AsInteger),

FormatFloat(‘##,##0.00’,cdsCrossTab.FieldByName(‘TOTAL’).AsFloat));end;

{ Mostra total do cliente }procedure TForm1.MostraTotal;begin RvCrossTab.SetParam(‘pTotal’,FormatFloat(‘##,##0.00’, TotalDoCliente)); TotalDoCliente := 0;end;

Listagem 4 – Métodos auxiliares.

Efetuei comentários no topo de cada método apresentado nalistagem 4, contudo gostaria de falar um pouco mais sobre ométodo “PrencheParametros” o qual considero o maisimportante... Este método será chamado nos eventos OnGetRow eOnNext do objeto RvDataSetConnection e é nele que verificamoso momento de imprimir o nome do cliente (ou seja, quandohouver mudança de nome o mesmo deverá ser impresso)utilizando para controle a variável “NomeDoCliente” a qualrecebe o campo CLIENTE. Após isso, atribuímos o valor aoparâmetro referente o mês atualmente posicionado. Apenas paralembrar, nomeamos os parâmetros como p01, p02 e assimsucessivamente representando os meses, dessa forma, ficou fácilatribuir o valor ao parâmetro, bastando concatenar “p” ao mêscorrente advindo do ClientDataSet.

Estando com os métodos declarados, vamos codificar o eventoOnClick do botão btnVisualizar, acompanhe o código apresentadona listagem 5, o qual também está comentado.

procedure TForm1.btnVisualizarClick(Sender:TObject);begin with cdsCrossTab do begin

Close; Params.ParamByName(‘ANO’).

AsInteger := StrToInt(MEdit_Ano.Text); Open; { Variável que será usada para

totalizar cliente por cliente } TotalDoCliente := 0; { Abre o Engine de Report } RvCrossTab.Open; { Zera parâmetros } ZeraValores; { Chama o Report } RvCrossTab.Execute; end;end;

Listagem 5 – Evento OnClick do btnVisualizar.

Para finalizarmos a codificação iremos acessar algunseventos do objeto RvDsCrossTab (TRvDataSetConnection) o qualé responsável em ‘prover’ os dados ao nosso relatório, sendo nestecomponente possível interceptar registro a registro que seráapresentado em nosso realtório... Iremos utilizar os seguinteseventos: OnGetRow: acionado no momento que o engine derelatório obtém os dados providos pelo TRvDataSetConnection;OnNext: acionado quando o engine de relatório avança para opróximo registro a fim de suprir o OnGetRow; OnFirst: acionadoquando o engine de relatório inicia a solicitação de registros. Nalistagem 6 a seguir apresentamos a codificação destes trêseventos.

{ Evento acionado quando o Report busca osdados para impressão. Neste evento,verificamos se está no mesmo cliente e nãopermitimos a mudança de linha, forçando aimpressão para a próxima coluna }procedureTForm1.RvDsCrossTabGetRow(Connection:TRvCustomConnection);begin if (NomeDoCliente = cdsCrossTab.FieldByName

(‘CLIENTE’).AsString) then if cdsCrossTab.RecNo <

cdsCrossTab.RecordCount then Connection.ExecNext else begin AtualizaTotalDoCliente; PreencheParametros; MostraTotal;

Page 25: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 25

Delphi

end else MostraTotal;end;

procedure TForm1.RvDsCrossTabNext(Connection:TRvCustomConnection);begin { Evento acionado quando vai para o próximoregistro } if TotalDoCliente = 0 then ZeraValores; PreencheParametros; AtualizaTotalDoCliente; Connection.DoNext;end;

procedureTForm1.RvDsCrossTabFirst(Connection:TRvCustomConnection);begin { Evento acionado quando abre o primeiro registro } PreencheParametros; Connection.DoFirst;end;

No evento OnGetRow efetuamos um controle a fim deapresentar apenas um cliente por linha e os demais registroscorrespondentes ao mesmo cliente deverão preencher as colunasda direita, conforme o layout anteriormente sugerido. Para isso,assumimos o controle de salto de registros fazendo a chamada dométodo ‘ExecNext’ do objeto ‘Connection’ que é fornecido comoparâmetro do evento. Observe que estamos dentro de um looping

implícido fornecido pelo objeto RvDsCrossTab e, dessa forma nãonecessitamos implementar nenhum laço de controle while ousemelhante. Ao entrar no evento OnNext, fazemos a verificaçãoda variável TotalDoCliente e caso ela esteja igual a zero sabemosque um novo cliente está sendo inicializado. Ainda neste evento,efetuamos o preenchimento dos parâmetros através do método‘PreencheParametros’, atualizamos o total do cliente através dométodo ‘AtualizaTotalDoCliente’ e finalizando efetuamos achamada do método ‘DoNext’ que tem a finalidade de manter oevento ativo durante o processamento.

Estando tudo codificado, vamos testar nosso projeto deexemplo, bastando para isso teclar [F9] e clicar no botão‘Visualizar’. Se tudo correu bem, você irá obter como resultadouma tela parecida com a figura 9

Considerações finaisDemonstramos aqui uma abordagem bastante simples de

como manipular o Rave Reports para implementação de umrelatório de referencia cruzada, mostrando como é possívelcustomizar o Rave de acordo com nossas necessidades. Estaabordagem abre um leque de opções para situações de relatóriosnão-triviais, pois fornece ao programador bastante flexibilidadeno controle dos mesmos.

Até a próxima, abraço e sucesso à todos.

DownloadO projeto de exemplo referente este artigo está disponível para

download em: http://www.theclub.com.br/revista/download/ravecrosstab.zip.

Listagem 6 – Eventos do RvDsCrossTab

Figura 9 – Preview do relatório

Sobre o autorAlessandro Ferreira,

Consultor Técnico do The Club

[email protected]

Page 26: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE26

ASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte III

ASP.NET

ASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte IIIASP.NET: Parte IIIpor: [email protected]

Global.asax/pas & Web.config Comprar um carro é uma tarefa complicada. Ninguém quer

se sentir como se tivesse feito um mal negócio, então vocêcertamente vai olhar o carro de perto antes de tomar a decisão decomprá-lo. Talvez você investigue o carro pela internet, mas issoforneceria somente fotos e uma descrição. E por último, você vaiquerer ver o carro pessoalmente e sentar nele. Provavelmente vaiquerer fazer um test-drive!

Nas últimas duas colunas não fizemos muito além de “dar

uma olhada em algumas fotos da Web” de uma aplicaçãoASP.NET (veja a Parte I e a Parte II). Examinamos somente asuperfície de uma aplicação ASP.NET muito simples no Delphi 8/2005. Vimos uma aplicação ASP.NET do ponto de vista dodesenvolvedor — isto é, como o asp.net funciona por traz dascortinas.

Neste capítulo, vamos dar uma olhada em duas coisas que de

alguma forma estão “debaixo dos panos,” porém facilmenteencontradas no Project Manager: o arquivo global.asax/pas e oarquivo web.config.

O arquivo global.asax/pas contém o código para gerenciar o

código e eventos da aplicação. Ele implementa um descendente deSystem.Web.HttpApplication.

Esta classe é análoga ao TApplication do VCL; ela fornece ainfra-estrutura para toda a sua aplicação ASP.NET, permitindoque você faça um gancho dos códigos dos eventos que ocorrempara todas as requisições que chegarem. O arquivo web.configcontém informações de configuração de sua aplicação, como umarquivo *.ini para uma aplicação cliente comum. Ambas asentidades são partes importantes na aplicação ASP.NET, masnunca são visíveis para os usuários.

Neste artigo, vamos dar uma olhada de perto nestesarquivos, e mostrar como eles podem ser usados para adicionar

maior poder e funcionalidade para suas aplicações ASP.NET.

A Global UnitO módulo global consiste de dois arquivos, global.asax e

global.pas. O principal propósito do modulo global é fornecer umcontainer para o código a nível de aplicação e apontamento paraos eventos. O run-time do ASP.NET compila automaticamente oarquivo global.asax quando a primeira requisição para aaplicação é feita, e executa o código do módulo toda vez que umarequisição chegue para a aplicação.

Obs: Por padrão, o ASP.NET é configurado para nunca

permitir que o usuário veja um arquivo que tenha a extensão*.asax. O aspnet_isapi.dll tem um apontamento definido para aextensão *.asax que impede que o usuário veja as páginas asax.

O mesmo também ocorre para os arquivos *.config. A não serque você altere as configurações do seu IIS, ou permita alistagem de diretório para seus diretórios virtuais, não hámaneira dos usuários verem o conteúdo destes arquivos, entãovocê não precisa se preocupar sobre colocá-los no diretórioprincipal. A requisição deles via browser resulta no erro “Thistype of page is not served”.

O arquivo global.asax, por padrão, contém apenas uma linha:

<%@ Application Codebehind=”Global.pas” Inherits=”Global.Global”%>

O atributo Application simplesmente define a unit de código

que fornecerá o code-behind para o objeto global de sua aplicação.O arquivo global.asax deve ficar no diretório principal de suaaplicação. Você pode, se desejar, adicionar um script baseado emapontamentos de eventos em seu arquivo global.asax, mas émuito mais fácil gerenciar este código no arquivo de code-behindglobal.pas. (O Delphi 8/2005 não suporta o uso do Delphi-

Page 27: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 27

ASP.NET

Language em páginas *.as?x.) Você também pode declarar astags de objeto do lado do servidor neste arquivo e ainda é possíveladicionar referências de include do lado servidor neste arquivo, eelas funcionarão como você espera de uma função de includedireta. (Veja a documentação do MSDN para mais informaçõesdestas últimas duas características, pois foge do contexto desteartigo.)

O arquivo global.pas é um arquivo de código Delphi que

contém por padrão, uma declaração da classe TGlobal que comomencionamos, descende da System.Web.HttpApplication. A principalfunção desta classe no ponto de vista do desenvolvedor, édisponibilizar eventos que ocorrem durante o ciclo de vida de umaúnica requisição.

A unit padrão inclui stubs para oito eventos a nível deaplicação. Novamente, a coisa mais importante a se observer éque o apontamento de eventos da classe TGlobal são eventos anível de aplicação.

Alguns eventos serão disparados para cada requisiçãoindividual, alguns dispararão para cada requisição feita pelousuário, e alguns dispararão uma vez para cada instância doobjeto da aplicação, mas eles são todos “eventos horizontais”, querdizer, os códigos nos apontamentos de eventos se cruzarãoatravés de todas as páginas, e nenhum dos códigos escritos neles

Evento Descrição

Application_Start

Este evento é disparado uma única vez quando a aplicação é inicializada. Ou, colocando de outramaneira, ele é disparado somente quando você inicializa o IIS, e não será disparado novamente.Use ele para iniciar variáveis que são consideradas globais para toda a aplicação. Não utilizepara iniciar variáveis que são usadas por requisição ou por instanciamento. Para isto,sobreescreva o método Init ou use o método InitializeComponents fornecido com a classe TGlobal.

Session_Start

Este evento é disparado sempre que um novo visitante desconhecido chega ao seu site. Umvisitante desconhecido é aquele que não tem um cookie de sessão válido. Toda vez que um novovisitante faz uma nova requisição, uma nova sessão é inicializada, e este evento é disparado.Use-o para escrever o código que você quer que ocorra cada vez que um novo usuário chegar.

Application_BeginRequestEste evento é disparado no começo de cada requisição individual HTTP. Você pode usar estecódigo para fazer qualquer inicialização que precise para ficar pronto para responder a umarequisição.

Application_EndRequestEste evento é disparado quando o processamento de uma requisição HTTP foi completada. Esteevento é a última chance de influenciar o que está sendo enviado de volta como resultado de umarequisição.

Application_AuthenticateRequest Este evento é disparado quando o sistema de segurança do ASP.NET identificou um usuárioespecífico.

Application_Error Este evento é disparado quando uma exceção que não foi tratada em seu código é disparada.

Session_End Este é disparado quando uma sessão de um usuário individual é expirada via time-out, ou quandouma sessão de usuário é finalizada, por exemplo via logout.

Application_EndIsto ocorre quando a aplicação é desligada. Como o evento Application_Start, este evento édisparado somente uma vez na vida da aplicação, normalmente quando o IIS é desligado oureinicializado.

serão específicos para qualquer página Web específica. O ASP.NET gerenciará e fará um cache da coleção de

instâncias do objeto TGlobal. (Se você é um usuário do WebBroker/WebSnap, o TGlobal objeto será gerenciado e armazenado damesma forma que os WebModules). Assim, quando adicionarcódigos para estes eventos, você precisa se lembrar que estasclasses podem ser “sujas,” quer dizer que a instância da classeque você pegou para usar pode ter sido usada antes, e pode terdeixado um estado para trás que precisa ser reinicializado.

A TGlobal é como qualquer outra classe do Delphi e você pode

adicionar métodos, eventos, e propriedades à ela. Se você clicar natab Design, você poderá adicionar componentes não visuais nodesigner, e eles serão mostrados como qualquer outrocomponente, permitindo que você ajuste suas propriedades noObject Inspector. Por exemplo, a classe TGlobal é um bom lugarpara você gerenciar suas conexões de banco de dados.

A classe TGlobal expõe um número de eventos para os quais

você pode escrever seu código de apontamento de eventos. Atabela da figura 1 discute os oito eventos padrões e suas funções.

Há mais que apontamentos de eventos no objeto TGlobal. Aclasse também expõe várias propriedades valiosas que contéminformações críticas em nível de aplicação (veja a Figura 2).

Figura 1: Eventos da classe TGlobals.

Page 28: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE28

ASP.NET

Propriedade Descrição

Application Esta aponta para o objeto Application, que contém informações disponíveis de todos os usuários por toda a aplicação.Em outras palavras, a informação contida aqui é global, assim todos os usuários vêem a mesma informação.

Context Esta aponta para uma instância da classe HTTPContext para determinada requisição

Modules Aponta para uma coleção de todos os módulos que estão na aplicação corrente.

Request Esta aponta para uma instância da classe HTTPRequest que representa a requisição corrente. Você pode acessaresta informação quando necessário para responder adequadamente a uma requisição corrente.

Response Esta aponta para uma instância da classe HTTPResponse que representa a resposta corrente. Você pode ajustar aspropriedade desta classe para responder a requisição quando necessário.

Server Esta aponta para uma instância da classe HTTPServerUtility que contém informações sobre o servidor físico que estárodando a aplicação.

SessionEsta aponta para o objeto da sessão corrente, o qual contém informações sobre o usuário único. Em outras palavras,as mesmas variáveis estão disponíveis para todos os usuários, mas os valores destas variáveis variarão dependendodo usuário.

User Esta aponta para uma instância da interface IPrincipal que contém informações sobre o usuário corrente

Figura 2: Propriedades da classe TGlobal

O arquivo Web.ConfigTambém está incluído em sua aplicação um arquivo chamado

web.config. O arquivo web.config contém informações deconfiguração para sua aplicação. Você pode pensar nele como umarquivo *.ini, embora ele seja mais útil que os arquivo *.iniconvencionais.

Para começar, ele é um arquivo XML, então ele é um pouco

mais complicado que um arquivo padrão *.ini, e certamente émais poderoso e pode conter qualquer tipo de informação. Umarquivo web.config tem um esquema padrão que contéminformações que o framework irá buscar e as utilizará.

Um arquivo web.config pode ser utilizado para controlar a

aplicação como um todo ou ainda para controlar ‘partes’ daaplicação. Por exemplo, toda aplicação ASP.NET precisa de umarquivo web.config que fique no diretório principal da aplicação,contudo, você também poderá colocar um arquivo web.config emum diretório abaixo do seu diretório principal, e fornecerconfigurações customizadas para este diretório e seussubdiretórios, e ambos podem sobreescrever e somar-se aosarquivos web.config de seus diretórios pais. Observe que essaherança hierárquica não é baseada nos diretórios físicos de seuHD, mas na estrutura de diretório virtual definida por suaaplicação e o servidor Web.

Por exemplo, você talvez tenha uma função de administrador

que que esteja acessível somente aos usuários autenticados. Paratornar esse subdiretório e todos os diretórios abaixo deledisponível somente para usuários autenticados, você pode

adicionar um arquivo web.config especificamente neste diretóriocom a seguinte configuração:

<system.Web> <authorization> <deny users=”?”/> </authorization> </system.Web>

O arquivo web.config é um arquivo XML, e assim deve conter

o XML apropriado para que o framework consiga lê-lo.

Por exemplo, todos os elementos tags devem estar com anomenclatura correta. (Infelizmente, a nomenclatura para estesarquivos não é compatível com a nomenclatura do Delphi.)

As informações do web.config principal de sua aplicação podetanto aumentar como sbreescrever os ajustes de seu arquivomachine.config. As informações de configuração dadas à umaaplicação podem ser acessadas via classe ConfigurationSettings nonamespace System.Configuration.

O arquivo padrão web.config para uma aplicação ASP.NET

do Delphi possui basicamente a seguinte estrutura:

<?xml version=”1.0" encoding=”utf-8" ?><configuration> <system.Web> <compilation debug=”true”

defaultLanguage=”c#”>

Page 29: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE 29

ASP.NET

</compilation> <customErrors mode=”RemoteOnly”/> <authentication mode=”Windows” /> <trace enabled=”false” requestLimit=”10" pageOutput=”false” traceMode=”SortByTime” localOnly=”true”/> <sessionState mode=”InProc” stateConnectionString=

”tcpip=127.0.0.1:42424" sqlConnectionString=

”data source=127.0.0.1;userid=sa;

password=” cookieless=”false” timeout=”20"/> <globalization requestEncoding=”utf-8"

responseEncoding=”utf-8"/> </system.Web></configuration>

Os ajustes padrões do web.config fornecem informações de

configuração sobre seis pontos básicos de informação, as quaissão explicadas na tabela mostrada na Figura 3.

Tag Name Descrição

<compilation>

Esta seção determina como o framework tratará o código em sua aplicação. O atributo mais importante aqui é oatributo de debug, o qual, quando ajustado para true, fornecerá uma mensagem de erro completa e rastreará porquaisquer erros que aconteçam em sua aplicação. Esta seção também pode ser configurada para usar scriptsdinâmicos de outras linguagens, como Perl ou Delphi.

<customErrors>

Esta tag define como o framework lidará com os erros customizados. Se o atributo for ajustado para On, então umamensagem de erro genérica será retornada. Se Off, então uma mensagem de erro detalhada será exibida, o que é útilpara desenvolvedores. Se estiver ajustada para RemoteOnly, então um erro detalhado será exibido somente namáquina local, e os usuários remotos verão uma mensagem de erro genérico. Você pode adicionar sub-tags aqui quecontrolem exatamente o que os usuários verão para erros específicos de http.

<authentication>Esta tag determina como os usuários são autenticados com sua aplicação. Ela pode ser definida somente em nível deaplicação ou por arquivos de configuração mais altos. Você diz para sua aplicação para usar a autenticação doWindows, baseado em Forms, Passport, ou sem autenticação.

<trace>Esta seção determina se o rastreamento está ligado ou desligado para uma aplicação. Quando ligado, umrastreamento completo de sua aplicação irá ser executado até ter uma página de resposta. Isto obviamente é útildurante o desenvolvimento.

<sessionState>Esta seção determina como a aplicação lidará com a informação de sessão do usuário. A informação de sessão podeser armazenada no processo, em um processo separado projetado para apontar a informação de sessão, no SQLServer, ou nenhum deles.

<globalization> Esta seção define os ajustes globais para uma aplicação. Você pode determinar os métodos de codificação para asrequisições de chegada e respostas de saída, bem como ajustar uma cultura para sua aplicação.

Figura 3: Ajustes padrões para o web.config

O esquema atual para o arquivo é muito complicado é podeser visto em http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/gngrfASPNETConfigurationSectionSchema.ASP.NET.

Há alguns outros itens que devem ser observados sobre os

arquivos web.config.

Primeiro, como os arquivos global.asax, o frameworkASP.NET impede a visualização destes via um browser cliente.Segundo, o ASP.NET framework armazena estes arquivos paraprover acesso rápido, mas você observará que este arquivo éatualizado, relido e reaplicado quando houver alguma alteraçãono mesmo.

Isto permite que você mude a configuração de sua aplicaçãosem precisar desligar e ligar o servidor.

Bem, com isso finalizamos esta série de artigos sobreASP.NET onde procuramos demonstrar o funcionamento domecanismo por trás do ASP.NET.

Nas próximas edições estaremos abordando tópicos maisespecíficos como desenvolvimento de sites, etc...

Até a próxima.

Page 30: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens

MeGAZINE30

Dicas & Truques

ADO – Como cancelar a execução de um consulta.Os objetos DataSet pertencentes ao AdoExpress possuem um

evento chamado OnFetchProgress através do qual podemosinterceptar a execução de uma query e caso necessário cancelar oseu processamento, veja o código a seguir:

Private CancelarQuery: Boolean;implementationprocedureTForm1.ADODataSet1FetchProgress(DataSet:TCustomADODataSet; Progress, MaxProgress: Integer; varEventStatus: TEventStatus);begin if CancelarQuery then Begin DataSet.Recordset.Cancel; Application.ProcessMessages; end;;end;

No evento OnShow do formulário:

CancelarQuery := False;

Depois, no evento OnClick de um botão que será utilizadopara cancelar:

CancelarQuery := True;

RichEdit – Como pesquisar e substituir texto.Nesta dica iremos demonstrar como pesquisar e substituir

texto em um RichEdit que contenha texto formatado. Aabordagem mais conhecida é através da utilização da funçãoPOS, contudo tratando-se de texto formatado ela pode falhar enão localizar a posição correta do texto e, neste caso lançamosmão do método FindText existente no próprio RichEdit,acompanhe o código a seguir:

// Código do botão OK.procedure TForm1.SpeedButton1Click

(Sender: TObject);var FoundAt: LongInt;

StartPos, ToEnd: Integer;begin while FoundAt <> -1 do begin with RichEdit1 do begin if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0; ToEnd := Length(Text) - StartPos; FoundAt := FindText(edPesquisar.Text,

StartPos, ToEnd, [stWholeWord]); if FoundAt <> -1 then begin SetFocus; SelStart := FoundAt; SelLength :=

Length(edPesquisar.Text); SelText := edTrocaPor.Text; end; end; end;end;

O projeto de exemplo referente esta dica está disponível paradownload em: http://www.theclub.com.br/revista/download/RichEdit_PesqSub.zip.

Page 31: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens
Page 32: MeGAZINE 3 - The Club - O maior clube de programadores do ... · Dicas & Truques ... Para alterar a porta de comunicação do Firebird, abra o ... 15000 está referenciando itens