Sei sulla pagina 1di 30

Revista The Club Megazine - 07/2003

A utilizao, reproduo, apropriao, armazenamento em banco de dados,


sob qualquer forma ou meio, de textos, fotos e outras criaes intelectuais
em cada publicao da revista The Club so terminantemente proibidos
sem autorizao escrita dos titulares dos direitos autorais.

Copyright The Club 2003

EDITORIAL

Editorial
Ol amigos,
THE CLUB
Av. Celso Ferreira da Silva, 190
Jd. Europa - Avar - SP - CEP 18.707-150
Informaes: (0xx14) 3732-3689
Suporte: (0xx14) 3733-1588 - Fax: (0xx14) 3732-0987

Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
Informaes: info@theclub.com.br

Dvidas
Correspondncia ou fax com dvidas devem ser
enviados ao - THE CLUB, indicando "Suporte".

Opinio
Se voc quer dar a sua opinio sobre o clube em
geral, mande a sua correspondncia para a seo
"Tire sua dvida".

Neste ms estamos trazendo muitas matrias interessantes. Quem nunca teve


problemas com a comparao de nmeros no formato de ponto flutuante. Nesta edio
voc ir entender porque este problema acontece e como resolv-lo.
Vamos mostrar tambm como voc pode criar o seu prprio clculo de dgito
verificador, algo que muito solicitado ao suporte.
Outro assunto tambm muito solicitado est sendo como utilizar impressoras com
porta USB no Clipper, nesta edio existe uma explanao completa sobre o assunto.
Ns fizemos uma entrevista com Jason Wharton, criador do IBOjects. Para quem
no conhece, este componente serve para acessar o Interbase e o Firebird nativamente
e est sendo muito comentado entre os programadores Delphi.
Aproveito a oportunidade para agradecer a todos os associados que nos enviam emails sobre questes que gostariam de ver em nossa revista. Caso voc tenha alguma,
pode enviar para suporte@theclub.com.br. A sua participao muito importante para
ns.
At a prxima...

Reproduo
A utilizao, reproduo, apropriao,
armazenamento em banco de dados, sob qualquer
forma ou meio, de textos, fotos e outras criaes
intelectuais em cada publicao da Revista
The Club so terminantemente proibidos sem
autorizao escrita dos titulares dos direitos
autorais.

Celso Jefferson Paganelli


Presidente - The Club

Copyright The Club 2003


Impresso e acabamento:
Impressos Gril - Gril Grfica e Repr. Ind. Ltda.
Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259
Rua So Paulo, 447 - Cep 18.740-000
Taquarituba - SP
Tiragem: 5.000 exemplares

Diretor - Presidente

Celso Jefferson M. Paganelli


Diretor Tcnico

Mauro SantAnna
Colaboradores
Emerson Facunte
Delphi marca registrada da Borland
International, as demais marcas citadas so
registradas pelos seus respectivos proprietrios.

Editorial ............................................................................ 03
Livros ............................................................................... 04
Intraweb com Banco de Dados .......................................... 06
IBObjects - Acesso nativo ao Interbase/Firebird ................. 08
Solues para impresso Clipper em
Windows e portas USB ...................................................... 10
Quando Zero no igual a Zero ......................................... 16
Calculando o Dgito Verificador ......................................... 19
Dicas & Truques ................................................................. 23
Perguntas & Respostas ...................................................... 29
MeGAZINE

Livros
Dominando o Delphi 7 - A Bblia
Autor: Cant, Marco
Editora: Makron Books
ISBN: 8534615187
Srie Dominando - A Bblia
Idioma Portugues
Pginas: 896
Publicao: 2003
Edio 1
Encadernao: Brochura
Disponibilidade: Em estoque - Prazo de entrega: 3 dias
Peso: 1795.00 gramas
Home Page: http://www.livrosdeprogramacao.com.br/
Descrio:
Tanto para quem deseja aprender Delphi 7 como para quem est migrando de uma verso anterior, este livro a nica fonte
necessria para atualizar-se. Prtico, inclui as tcnicas mais atuais em bancos de dados, cliente-servidor e programao para a
Internet. Acompanhando a viso do renomado autor Marco Cant, voc obter o conhecimento necessrio para aproveitar ao mximo
o Delphi 7 totalmente atualizado e expandido. Livro best-seller no Brasil em vrios outros pases em tdo o mundo.

Aprendendo Delphi 7 Guia Prtico


Autor: Spanghero, Aldo
Editora: Advanced
ISBN: 8574131415
Idioma Portugues
Pginas: 333
Publicao: 2003
Edio 1
Encadernao: Brochura
Disponibilidade: Momentaneamente sem estoque - Prazo de entrega: 7 dias
Peso: 333.00 gramas
Home Page: http://www.livrosdeprogramacao.com.br/

Descrio:
Aprendendo Delphi 7 Guia Prtico foi feito para quem quer aprender a usar com eficincia os componentes do Delphi 7, no
somente mediante a teoria, mas praticando com programas reais.
Os exemplos foram elaborados de modo que o leitor possa aplicar na prtica o que aprendeu. O leitor incentivado a modificar os
exemplos e a experimentar as diversas propriedades dos componentes. Assim, o aprendizado mais rpido do que apenas saber como
tais componentes funcionam. Afinal, este um guia prtico !
A construo de cada exemplo feita por meio de uma descrio passo a passo, a fim de que o leitor se sinta seguro do que deve ser
feito em cada etapa.
Aprendendo Delphi 7 Guia Prtico abrange: Como usar o ambiente de desenvolvimento do Delphi 7, Componentes bsicos, Menus, Caixas
de dilogo, Componentes avanados e complementares, Bancos de dados, Vrios outros componentes
Alm disso, o leitor encontrar dicas de como criar seus prprios componentes e tambm como personaliz-los.

MeGAZINE

Livros
Dominando o Windows Server 2003 - A Bblia
Autor: Minasi, Mark
Editora: Makron Books
ISBN: 8534615195
Srie Dominando - A Bblia
Idioma Portugues
Pginas: 1408
Publicao: 2003
Edio 1
Encadernao: Brochura
Disponibilidade: Em estoque - Prazo de entrega: 3 dias
Peso: 2525.00 gramas
Home Page: http://www.livrosdeprogramacao.com.br/
Descrio:
Este livro a nica fonte de informao sobre o Windows Server de que voc precisa. o mais compreensvel e bem escrito livro
sobre o assunto. Ensina como projetar e gerenciar uma rede multiplataforma, construir uma intranet baseada em Windows,
encontrar a melhor estratgia de backup, evitar e recuperar desastres, e muito mais.
As instrues prticas levaro voc a experimentar tudo o que possvel fazer com o Windows Server 2003. O premiado autor,
Mark Minasi, que conquistou milhares de seguidores em todo o mundo, mostra como planejar, configurar e instalar sua rede, mantla funcionando da melhor forma possvel e como solucionar os problemas. Inclui informao jamais documentada de administradores
de rede, consultores e vrios outros profissionais da rea, especialistas em redes Windows.

Sistema Comercial Integrado com Delphi 7 - Cadastro e Estoque


Autor: Oliviero, Carlos
Editora: rica
ISBN: 8571949158
Idioma Portugus
Pginas: 566
Publicao: 2003
Edio 1
Encadernao: Brochura
Disponibilidade: Momentaneamente sem estoque - Prazo de entrega: 6 dias
Peso: 566.00 gramas
Home Page: http://www.livrosdeprogramacao.com.br/
Descrio:
Este livro destinado aos interessados em aprender a criar uma aplicao comercial completa utilizando o Delphi 7 ou 6 com o
banco de dados Cliente/Servidor - InterBase.
Aborda a criao de menus, barra de ferramentas e de status, execuo de programas externos, login do sistema, configurao de
perfis de usurios, herana de formulrios e o uso de componentes IBX e da linguagem SQL.
A metodologia orientada por projeto permitir ao leitor, ao concluir o livro, desenvolver o menu principal da aplicao e os mdulos
de cadastro e estoque.
Para acompanhar a obra, necessrio possuir conhecimentos bsicos em Delphi, linguagem SQL e InterBase, temas abordados
nos primeiros livros da srie.

MeGAZINE

Delphi

Intraweb com Banco de Dados


Por: Emerson Facunte

Salve, salve Delphianos! Perderam o medo de desenvolver


aplicaes para Web? Ainda no? No percam tempo, o mercado
precisa de aplicaes e-business.
Neste artigo teremos uma simples aplicao Intraweb
acessando banco de dados.
Atravs das opes File/New/Other..., selecione a seo
Intraweb e escolha o modelo Stand Alone Application with Data
Module (figura 1).

Veja o exemplo de conexo:


Propriedade

Valor

CommitRetain

False

Database

localhost: c: \cursow eb\clientes.gdb

Passw ord

a famosa masterkey

UserName

o famoso SYSDBA

Name

C o n exao B D

Altere tambm a propriedade LoginPrompt para false.


Nunca esquea de fazer esta alterao, pois numa aplicao
servidora no existe a possibilidade do usurio interagir no login
do banco de dados.
Insira um objeto do tipo TSQLDataSet, e altere as seguintes
propriedades:

Propriedade

Valor

SQLConnection

C o n exao B D

CommandText

select * from TBCLIENTE

Active

True

Repare que estamos trazendo todas as informaes da


entidade TBCLIENTE.

Figura 1: Iniciando a aplicao


A opo with Data Module, cria automaticamente um Data
Module, bem como suas referncias.

timo, agora vamos para o formulrio principal.

Insira um objeto do tipo TSQLConnection, e atravs do duploclique, j na tela de configurao, aponte para a sua conexo
dbExpress. Neste artigo estou utilizando uma conexo padro
previamente criada.

Insira a unit DataModuleUnit na clusula uses, e grave a


aplicao.
Insira os componentes que seguem.

MeGAZINE

Delphi

Figura 2:
Formulrio
principal

No colocamos nenhum cdigo nesta aplicao. Assim como


em aplicaes desktop, apenas associamos os objetos.
Vamos executar a aplicao e ver o resultado (figura 3).
Amigos, apesar de simples, o exemplo demonstra a
disponibilidade de banco de dados na Internet.

A figura 2 ilustra nosso formulrio principal.

Que tal desenvolver uma lista de preos para Web, s para


comear?
Forte abrao e muita luz a todos!

Figura 3:
exemplo em execuo

MeGAZINE

Delphi

IBOjects
Acesso nativo ao
Interbase/Firebird.
Por Claudinei Rodrigues nei@theclub.com.br

Ns da equipe tcnica do The Club sempre estamos


procurando por novidades para nossos associados. Informaes
que ajudem no seu dia a dia. E com o aumento da utilizao do
Interbase e do Firebird tivemos a oportunidade de conhecer um
componente chamado IBOjects. O IBOjects na verdade um
conjunto de componentes de acesso nativo ao Interbase/Firebird
que segundo o seu fabricante o melhor componente para acesso
ao Interbase/Firebird da atualidade. Fiquei curioso sobre o
componente e ento entrei em contato com o seu fabricante. O
nome dele Jason Wharton, americano, casado, pai de quatro
filhos. Aproveitando a oportunidade eu lhe fiz algumas
perguntas, veja o que ele me respondeu:

Porque voc criou o IBOjects?


Eu realmente gostei muito do Delphi e do Interbase, mas eu
no gostei da tecnologia de acesso a dados que havia disponvel.
Ento eu decidi criar o meu prprio componente com melhores
caractersticas e principalmente com um desempenho muito
melhor. Eu tambm queria utilizar corretamente a
potencialidade de transao disponvel no Interbase/Firebird e a
nica maneira que eu poderia fazer isto era escrevendo meus
prprios componentes.

Quais so as vantagens do IBOjects?

aprend-lo. Voc ir notar que ser possvel criar aplicaes com


caractersticas muito mais ricas e fceis de usar alm do
desempenho que muito mais rpido.

O IBOjects compatvel com quais verses do


Delphi ?
Ele compatvel com todas as verses a partir do Delphi 2.0.
Sendo o IBOjects um conjunto de componentes, como eles
esto divididos.
So vrios componentes divididos em acesso a base de dados,
controles visuais, caixas de dilogo, ferramentas de
produtividade, replicao, pesquisa, internet, etc...

Quais so os arquivos que devo disponibilizar para


o usurio final se eu desenvolver uma aplicao
utilizando o IBOjects ?
No h necessidade de levar nenhum arquivo adicional. Tudo
o que voc vai precisar estar incorporado ao seu executvel.

Existe alguma verso do IBOjects para o Kylix ?


Sim, existe uma verso BETA, mas eu ainda no terminei os
componentes visuais, terminei apenas o material no visual.

O que voc pensa sobre o Kylix ?

Agora como este componente est muito mais maduro e


estvel, eu lhe aconselharia a tirar um pouco do seu tempo para

Eu penso que uma grande idia um pouco antes do seu


tempo. O LINUX precisa amadurecer mais antes de podermos

MeGAZINE

Delphi
fazer um analise sobre criar aplicaes utilizando o Kylix para o
usurio final.

Como voc v o futuro do Firebird em relao ao


Interbase ?
Eu vejo ambos os produtos com muito bons olhos. Cada um
representa uma rea de interesse e de foco. O Open Source uma
grande idia, mas ainda existe uma necessidade de que a
Borland esteja oferecendo uma verso comercial do Interbase.

Falando em verso comercial, quanto custa o


IBOjects ?
A licena para utilizao do IBOjects chamada de
Trustware. Que vem a ser um caminho para pessoas poderem
utilizar IBObjects e paguem quando puderem. Se algum estiver
numa situao financeira no muito favorvel e no tiver
condies para pagar pelo componente, ele poder pagar aps ter
desenvolvido o seu software e ganho algum dinheiro com ele. Se a
pessoa no ganhar nenhum dinheiro eu ficarei feliz mesmo
assim porque eu permiti que utilizassem o poder o IBOjects sem
ter que pagar nada por isto. Esta a minha maneira de emitir

uma mensagem positiva de confiana de integrao entre os


seres humanos.

Concluso
Bem amigos do The Club, este componente parece ser
realmente muito bom. Eu andei olhando as listas de discusses e
pelo visto j tem muito programador utilizando este componente.
Agora botar a mo na massa para confirmar tudo que o Jason
me disse.
Nas prximas edies vamos analisar melhor este
componente. Espero que vocs tenham gostado desta matria, e
se voc deseja sugerir algum assunto para ser publicado em
nossa revista, fique a vontade. Envie um e-mail para
suporte@theclub.com.br. A sua sugesto muito importante
para ns.

MeGAZINE

Um grande abrao a todos e at a prxima.

Claudinei Rodrigues
Equipe de suporte do The Club.

Clipper

Solues para impresso


Clipper em Windows e
portas USB
Adaptao: Suporte The Club, suporte@theclub.com.br

Introduo

USB: no h nenhuma forma de uma aplicao DOS conseguir

Muitos programadores que possuem aplicativos rodando em

acessar uma impressora conectada via USB diretamente. (Veja

Clipper esto em busca de solues para que seus aplicativos

abaixo mais informaes sobre este caso...)

possam fazer impresso em Windows e portas USB, devido este


tipo de device estar tornando-se muito comum hoje. Neste artigo

A Soluo
A melhor soluo evitar estes tipos de impressoras

iremos mostrar algumas solues sendo algumas freeware e


outras sharewares.

completamente, e usar impressoras que aceitam aplicaes


baseadas em DOS.

O Problema
Os fabricantes de impressoras esto notoriamente projetando

Se isto no for possvel, voc ter que recorrer a produtos de

impressoras cada vez mais compatveis com Windows, deixando o

terceiros que permitam enviar sua sada de impressora ao

suporte ao bom e velho DOS de lado, desenvolvendo apenas

sistema de impresso do Windows. H dois tipos de solues:

drivers para Windows e fazendo com que estas impressoras


sequer reconheam os to utilizados cdigos de controles (ESC)
para formatao de fontes, espaamento de linhas, etc.

Bibliotecas, as quais possibilitam linkar sua aplicao


diretamente ao sistema de impresso do Windows.

Isto gera um grande problema para aplicaes DOS, como

Spoolers, programas independentes que capturam sua sada

as em Clipper que no podem fazer uso dos drivers instalados no

de impresso tradicional, e enviam isto ao sistema de impresso

Windows e s fazem acesso diretamente as impressoras.

do Windows.

Um problema relacionado uma impressora conectada por

10

Vejamos mais detalhes:

MeGAZINE

Clipper
Bibliotecas

existentes, e trabalhar com qualquer aplicao fundamentada

As bibliotecas contm funes que podem ser utilizadas na

em DOS (assim no s o Clipper).

programao Clipper que lhe permitem que sua aplicao possa


enviar sada diretamente impressora Windows. A vantagem

A nica exigncia que estas aplicaes devero poder

desta soluo que voc ter grande controle e flexibilidade em

redirecionar a sada de impressora para o disco. Contudo, embora

cima do que ser impresso, e como dever ser impresso. A

no serem necessrios ajustes na aplicao, isso no ser uma

desvantagem que voc precisar modificar seu cdigo fonte e

regra, visto algum destes gerenciadores de spoller fazer o controle

em caso de grandes aplicaes isso poder demandar tempo.

da fonte, porm, muitos deles trabalham perfeitamente com os


cdigos de controle (ESC) comumente utilizados em aplicaes

Spoolers

Clipper para formatao da fonte a ser impressa.

Spoolers so programas que recebem a sada padro da


impressora produzido por uma aplicao DOS, e aps isso

Os Produtos

enviam para uma impressora no Windows. A vantagem desta

Veja um pequeno resumo das solues disponveis no

soluo que no requer nenhuma mudana nas aplicaes

mercado:

CPS - Guionardo Furlan


Website

www.guiosoft.hpg.com.br/

Tipo da soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

Si m

Suporta Grficos

No

Suporta cdigos "ESC"

No

Tem Preview

No

Preo

Freeware

O CPS (Clipper Printer Server) fica monitorando um diretrio pr-determinado


e assim que um arquivo for gerado neste diretrio, o mesmo ser enviado ao
sistema de impresso do Windows. Contudo, sero necessrio alguns ajustes
em sua apli cao C li pper onde a mesma dever envi ar a i mpresso para
arquivo e no mais diretamente para a sada de impresso.

DOSPRINT - Simply the Best, Inc


Website

www.dosprint.com

Tipo da Soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

Si m

Suporta Grficos

Si m

Suporta Cdigos "ESC"

Si m

Tem Preview

Si m

Preo

US$ 99,00

O DOSPRINT recebe o nome do arquivo de impresso na linha de comando e


o imprime atravs do sistema de impresso do Windows. Ao contrrio de alguns
produtos, no fica "esperando" por um arquivo de impresso em um diretrio
qualquer... E m contraparti da deve ser executado i nformando-se o nome do
arquivo a ser executado, necessitando com isso a alterao do cdigo fonte da
aplicao. O DOSPRINT varre o arquivo de impresso em busca de cdigos
"ESC" e os interpreta enviando ao sistema de impresso do Windows.

MeGAZINE

11

Clipper
DosWinPrint - Sapient Softw are
Website

www.sapient-software.com

Tipo da soluo

Spooler

Necessita alterar os fontes

No

Autofit

Sim

Suporta Grficos

Somente Cdigo de barras

Suporta Cdigos "ESC"

Si m

Tem Preview

Si m

Preo

US$ 24,95

O DosWinPrint foi projetado para imprimir relatrios com ttulos e colunas e


p e rmi te me lho ra r o vi s ua l d a i mp re s s o . P e rmi te a uti li za o d e fo nte s
proporcionais, e ASCII. O programa poder gerar cdigos de barras a partir
d e nm e r o s r e c e b i d o s . A m a i o r i a d e s t a s f un e s e xe c ut a d a
automaticamente. O modo que o programa trabalha pode ser configurado a
p a rti r d e um a rq ui vo INI. E s te a rq ui vo c o nt m p a r me tro s p a ra a jus ta r
m a r g e ns , o r i e nt a o , e t c . , e t a m b m p a r m e t r o s q ue a uxi l i a m na
configurao da pgina e colunas. Pode ainda receber um conjunto mltiplo
de parmetros para controlar diversos tipos de relatrios.

Pagescript - AbeeLabs Systems


Website

www.abeelabs.com

Ti po da soluo

Biblioteca

Necessita alterar os fontes

Si m

Autofit

Programao

Suporta Grficos

Si m

Suporta Cdigos "ESC"

Indisponvel

Tem Preview

Externo (FinePrint)

Preo

US$ 110,00

A biblioteca PageScript contm um conjunto de funes que lhe permitiro


i m p r i m i r d i r e t a m e nt e d e um a a p l i c a o C l i p p e r p a r a um i m p r e s s o r a
Windows. O texto pode ser impresso em vrios tipos de fontes, tamanhos, e
com efeitos como negrito, itlicos e suporte a cor. Podem ser desenhados
li nhas e crculos e ai nda permi te a i ncluso de bi tmaps no mome nto da
impresso. Permite um timo controle de posicionamento de texto e grficos
na pgi na com bastante preci so. Juntamente com uma outra ferramenta
chamada FinePrint permite gerar visualizao de impresso.

Printfil - Guolo Davide


Website

www.guolo.com/printfil/english.htm

Tipo da soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

Si m

Suporta Grficos

Si m

Suporta Cdigos "ESC"

No

Tem Preview

Si m

Preo

Euro 99,00

12

A b i b l i o t e c a P a g e S c r i p t c o nt m um c o nj unt o d e f un e s q ue l he
p e rmi ti r o i mp ri mi r d i re ta me nte d e uma a p li ca o C li p p e r p a ra um
i mpressora Wi ndows. O texto pode ser i mpresso em vri os ti pos de
fontes, tamanhos, e com efeitos como negrito, itlicos e suporte a cor.
Podem ser desenhados linhas e crculos e ainda permite a incluso de
b i tma p s no mo me nto d a i mp re s s o . P e rmi te um ti mo c o ntro le d e
posicionamento de texto e grficos na pgina com bastante preciso.
Juntamente com uma outra ferramenta chamada FinePrint permite gerar
visualizao de impresso.

MeGAZINE

Clipper
PrintFile - Peter Lerup
Website

www.lerup.com/printfile

Tipo da soluo

Spooler

Necessita alterar os fontes

No

Autofit

No

Suporta Grficos

No

Suporta Cdigos "ESC"

Passthru

Tem Preview

No

Preo

Freeware

O P ri ntF i le um uti li t ri o q ue lhe p e rmi te i mp ri mi r a rq ui vo s te xto si mp le s,


P o s ts c r i p t, a r q ui vo s E P S e a r q ui vo s c o m c d i g o s " E S C " e m b uti d o s . A
co nfi g ura o p o d e se r fe i ta vi a i nte rfa ce Wi nd o ws o u me smo vi a li nha d e
comandos, podendo definir um diretrio ser monitorado e com isso, qualquer
a rq ui vo q ue fo r g e ra d o ne ste a rq ui vo se r i mp re sso . E fe i to s e sp e ci a i s d e
impresso podero ser configurados em arquivos de configurao, como por
exemplo tamanho de fonte (nmero de caracteres por linha), ttulo e rodap de
pgina, traduo de cdigos "ESC" para controles Windows, e diversos outros
controles.

Print Wiz ard - Rasmussen Softw are


Website

www.anzio.com

Tipo da soluo

Spooler

Necessita alterar os fontes

No

Autofit

Si m

Suporta Grficos

Si m

Suporta Cdigos "ESC"

Passthru

Tem Preview

No

Preo

US$ 99,00

O P ri ntWi z um so ftwa re q ue p e rmi te p ro ce ssa r v ri o s ti p o s d e sa d a d e


impresso, como por exemplo texto simples (o qual passa usando uma lgica
de autofit sofisticada para fazer o ajuste de pgina), "raw text" (o qual permite
cdigos "ESC" e postscript) que diretamente enviado ao spooler do Windows
e a i nd a " Ma s k Up Te xt" ( e s te p o d e nd o c o nte r c d i g o s HTML a tra v s d e
comandos PWML, com que uma aplicao pode alcanar mair controle em cima
do que i mpresso. C om i sso, voc poder especi fi car fontes, tamanho de
fontes, cor, grfi cos e cdi go de barras. Obvi amente voc ter que alterar o
c d i g o f o nt e d e s e u p r o g r a m a p a r a p o d e r t e r a c e s s o a t o d a s e s t a s
funcionalidades. O PrintWiz tambm vem com uma DLL que pode ser utilizada
em aplicaes Windows, como por exemplo em Delphi e VB.

PRTWIN - Araisa
Website

www.araisa.com

Tipo da soluo

Spooler

Necessita alterar os fontes

No

Autofit

Programao

Suporta Grficos

Si m

Suporta Cdigos "ESC"

Si m

Tem Preview

Si m

Preo

US$ 24,00

O PRTWIN varre at nove diretrios (para nove impressoras diferentes) para


arqui vos de i mpresso gerados nestes di retri os, e os envi a ao si stema de
impresso do Windows. Reconhece vrios cdigos "ESC", como por exemplo,
da Epson, entre outros formatos. Adicionalmente, utiliza vrios comandos "ESC"
proprietrios para imprimir grficos e habilitam impresso em modo horizontal,
sendo possvel a configurao dos mesmos.

MeGAZINE

13

Clipper
WinPrint - Charles E. Kindel Jr
Website

www.kindel.com

Tipo da soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

No

Suporta Grficos

Si m

Suporta Cdigos "ESC"

No

Tem Preview

No

Preo

US$ 25,00

O WinPrint um gerenciador de impresso de arquivos ASCII para Windows.


Tem uma interface de linha de comando, assim tambm pode ser invocado a
partir de uma aplicao "DOS" para imprimir um arquivo texto. H opes de
linha de comandos para selecionar opes como tipo de fonte e classificao
segundo o tamanho e margens. Seu uso pode ser feito a partir de configuraes
onde possvel a definio de orientao de pgina, impresso de mltiplas
pginas em uma nica pgina fsica, etc. Reconhece "formfeed" e caracteres
d e ta b ula o (e p o s s ve l d e fi ni r a q ua nti d a d e d e e s p a o s na ta b ula o
utilizada).

WinPrint - Piero Ronchi


Website

www.simtel.net/pub/pd/9929.shtml

Tipo da soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

Si m

Suporta Grficos

Si m

Suporta Cdigos "ESC"

No

Tem Preview

No

Preo

US$ 50,00

O Wi nP ri nt deve ser aci onado quando necessri o para i mpri mi r um


arquivo. Permite diversas opes de linha de comandos para selecionar
fonte, tamanho da fonte, efeitos (itlico, negrito, etc), orientao (retrato
e p a i s a g e m ) , c o n f i g u r a o d e m a r g e n s , e t c . R e c o n h e c e v r i a s
convenes de terminao de linha (PC, Unix, Macintosh e mainframe),
p o d e nd o se r uti li za d o s co njunto s mlti p lo s d e o p e s e m um ni co
arquivo de parmetros que presumivelmente torna a manuteno bem
mais fcil. O WinPrint freeware para uso pessoal e tem custo para uso
comercial.

WinPrint - Port Ltd, Obninsk, Russia


Website

www.port.obninsk.ru/util.htm

Tipo da soluo

Spooler

Necessita alterar os fontes

Si m

Autofit

No

Suporta Grficos

No

Suporta Cdigos "ESC"

No

Tem Preview

No

Preo

Freeware

14

E ste Wi nP ri nt d e ve se r cha ma d o q ua nd o ho uve r a ne ce ssi d a d e d e


imprimir um arquivo. Permite a configurao atravs de opes de linha
de comandos para seleci onar tamanho de fonte, espaamento entre
linhas, orientao (retrato e paisagem). Os mesmos efeitos podem ser
obtidos embutindo cdigos especficos no texto (por exemplo, um cdigo
"ESC" para condensar caracteres). Junto ao mesmo existe um arquivo
"ReadMe" onde explicado o funcionamento desta ferramenta. Tambm
h uma verso shareware (US $ 18,00) que traz funci onali dade para
formatao de cdigos e configurao de parmetros de fonte.

MeGAZINE

Clipper
AutoPrint - Reiner Krump
Website

www.hrs-krump.de/software/autoprint/autoprint_e.htm

Tipo da soluo

Spooler

Necessita alterar os fontes

No

Autofit

No

Suporta Grficos

Si m

Suporte cdigos "ESC"

No

Tem Preview

No

Preo

US$ 40,00 (ou free)

Mais algumas dicas para voc testar

O AutoPrint fica checando uma ou vrias pastas prconfi guradas em busca de arqui vos TXT, PRN ou
BMP. Detectando a existncia de qualquer destes
arquivos, ele automaticamente ir envi-los para o
sistema de impresso do Windows. O AutoPrint
g r ti s p a ra usu ri o s q ue i mp ri me me no s d e d e z
arquivos por vez.

tamanho de fontes, efeitos, etc.

Alm de todos os produtos apresentados neste artigo, voc


tambm poder assumir um desafio tcnico faa voc mesmo,
utilizando as ferramentas que o prprio Windows disponibiliza.
A idia geral criar um arquivo de impresso, e ento
invocar um programa Windows que poder imprimir o arquivo
gerado. Existem vrias possibilidades, veja abaixo:

Bloco de notas
Teoricamente, voc poder invocar o Bloco de notas para
imprimir um arquivo ASCII puro. O Bloco de notas porm, um
programa muito simples, com virtualmente nenhuma
inteligncia prpria, e no h nenhum modo de voc controlar a
sada para impressora.
No nem mesmo possvel forar quebra de pgina
utilizando um controle formfeed no arquivo a ser impresso.

HTML
Voc poder criar um arquivo com tags HTML embutidas, e
utilizar o Internet Explorer ou outro navegador para fazer a
impresso do mesmo. Podem ser convertidos relatrios com
colunas utilizando tabelas HTML, deixando o controle a cargo do
HTML.

Impressoras USB
USB-only printers (ou seja, impressora que no possuem
interface paralela) podem ser um problema especial, pois elas no
podem ser endereadas diretamente no ambiente DOS, porm,
todos os produtos acima mencionados resolvero este problema.
Uma soluo alternativa descrita logo abaixo. Trabalha em
Windows 2000 e XP e tambm trabalha em Windows NT, mas
como o NT no da suporte a USB, no h porque utilizar esta
soluo neste sistema operacional.
Defina a conexo USB de sua impressora no Windows.
Faa o compartilhamento da mesma para rede
Mapeie a LPT1: para esta impressora de rede: algo mais
como:
. NET USE LPT1 \\servidor\impressora
A princpio, isso s ir funcionar se seu PC estiver conectado
a uma rede.

Concluso
Este artigo uma adaptao do contedo disponvel no site:

RTF e Wordpad

http://www.dse.nl/~tmk/clipper/clpwinprint.htm#AutoPrint

Voc poder tambm criar um documento RTF (Rich Text


Format) e utilizar o Wordpad para a impresso do mesmo.
Embora o formato RTF gere um pouco de receio a primeira vista,
ele deve ser estudado com carinho, visto no ser to difcil assim.
O formato RTF oferece diversos recursos como exemplo tipo e

Aqui esto sem dvida nenhuma, as melhores solues para


que aplicativos DOS possam fazer acesso a impressoras
Windows-Only e portas USB, permitindo assim que estas
aplicaes possam acompanhar as inovaes tecnolgicas que
diariamente so disponibilizadas aos usurios. Boa sorte.

MeGAZINE

15

Delphi

Quando o zero
no igual a zero.
Todo mundo sabe que a comparao de nmeros
armazenados no formato de ponto flutuante pode conduzir a
resultados inexatos, especialmente quando os nmeros
representam valores monetrios. Para remediar isto, o Delphi 2
introduziu um novo tipo chamado Currency.
A idia que o tipo Currency no seja passvel de erros se
arredondando da forma que os tipos de ponto flutuante fazem, e
deveria ento ser usado no lugar de Single, Real, Double e
Extended onde o valor monetrio est envolvido. Infelizmente,
existe muito pouca informao sobre o tipo Currency na
documentao do Delphi. Atravs de pesquisas encontramos
algumas informaes. Estas informaes resultaram neste
artigo.

Floats
Veja o exemplo mostrado na figura 1. Quando voc executar
este exemplo, voc receber a mensagem dCounter <> 0. Agora
coloque um breakpoint sobre a linha if dCounter = 0 then e rode
o programa novamente. Coloque o mouse sobre a varivel
dCounter. A princpio o valor desta varivel seria igual a zero,
certo? Errado. Voc ver que o hint mostrar o valor 1.1102907873e-17.
procedure TForm1.Button1Click(Sender: TObject);
var
dCounter: Double;
begin
dCounter := 0;
dCounter := dCounter + 0.05;
dCounter := dCounter + 0.05;

16

dCounter := dCounter + 0.05;


dCounter := dCounter - 0.05;
dCounter := dCounter - 0.05;
dCounter := dCounter - 0.05;
if dCounter = 0 then
ShowMessage(dCounter = 0)
else
ShowMessage(dCounter <> 0);
end;
Figura 1: Testando valores
Agora coloque um breakpoint na segunda linha abaixo do
begin, ou seja na linha dCounter := dCounter + 0.05; e rode
novamente o programa. Assim que o programa parar no seu
breakpoint chame a janela CPU pressionando as teclas
<CTRL><ALT><C> e a janela FPU atravs das teclas
<CTRL><ALT><F>. Mantenha estas duas janelas de uma
maneira de fcil visualizao e ative a janela CPU como mostra a
figura 2.
Execute o Step Over pressionando a tecla F8 para executar
um dos comandos dCounter := dCounter + 0.05;. V at a janela
FPU e clique com o boto direito do mouse no centro da janela e
na opo Display As selecione a opo Words.
Esta janela ficar igual ao que est sendo mostrada na
figura 3. Agora o registro ST7 contm o seguinte numero
hexadecimal 3FFA CCCC CCCC CCCC CCCD.

MeGAZINE

Delphi
Vamos olhar alm de nosso exemplo
por um momento. O Delphi gera o
cdigo, que usa somente o FPU para
executar clculos com os nmeros no
formato ponto flutuante.
No importa que preciso voc usa
em seu programa, Single, Double ou
Extended, porque o FPU armazena e
processa todos os nmeros somente no
formato Extended.
Este formato definido pelo IEEE
(Institute of Electrical and Electronics
Engineers) e tem a seguinte expresso:
(-1)s x2E-16383 x(m63.m62..m0),
onde S = sign (bit No. 79),
E = expoente (bitsq No.
78..64), e m63.m62..m0 = mantissa
(bits No. 63..0).
Figura 2: A janela CPU no primeiro breakpoint

Agora, transforma o nmero


hexadecimal localizado no registro ST7
para o formato decimal usando a
frmula acima.
A calculadora do Windows no
formato cientifico pode ser muito til.
As figuras 4 e 5 podem ajudar voc
neste processo.

Figura 3: Carregando .05 no registro ST7 com um Double.


Hexadecimal

Binrio

3FFA

0011.1111.1111.1010

CCCC

1100.1100.1100.1100

CCCC

1100.1100.1100.1100

CCCC

1100.1100.1100.1100

CCCD

1100.1100.1100.1101

Aps a substituio de todos os


componentes na frmula, ns teremos o
seguinte:
(-1)0 x216378-16383
x(1.1001100110011001100110011
00110011001100110011001100110011001101)

Figura 5:
Substituindo os
valores de ST7 na
frmula IEEE

S i gn

02 = 010

Exponent

0111111111110102 = 1637810

Mantissa

1.1001100110011001100110011001100110011001
100110011001100110011012

Figura 4: Valor do
registro ST7 em hexadecimal e binary

MeGAZINE

17

O nmero reduzido tem a seguinte


expresso:
2-5
x1.1001100110011001100110011001
100110011001100110011001100110011012
Ou tem esta expresso:

Delphi
voc receber o resultado correto.

0.0000110011001100110011001100110011
00110011001100110011001100110011012

Currency

Agora, ns precisamos transformar o resultado obtido em um


formato decimal. Considere o seguinte:
x11.00110011001100110011001100110
0110011001100110011001100110011012
Remova a parte fracional e obtenha o seguinte:
2-6 x112 = 310/6410=0.04687510
Repita os mesmos passos com nveis diferentes de preciso.
2-10 x1100112=5110/102410=0.049804687510
2-14 x11001100112=81910/1638410=0.0499877929687510
O nmero mximo de dgitos disponveis que voc pode usar
na transformao atravs da calculadora 41. O clculo de 41
digitos igual a:
2-41 x
11001100110011001100110011001100110012=10995116277710/
219902325555210=0.04999999999972715110
A anlise da mantissa mostra que este nmero tem um
fragmento decimal.
1.10011001100110011001100110011
00110011001100110011001100110011012
Baseado nisto, ns determinamos que impossvel conseguir
a preciso absoluta do nmero 0.05 no
formato de ponto flutuante. O nmero
sempre um valor aproximado.

Agora vamos retornar para aquele exemplo. Modifique o tipo


da varivel dCounter de Double para Currency. Configure o
breakpoint na segunda linha dCounter := dCounter + 0.05; e
rode o programa. Quando o programa para no breakpoint chame
novamente as janelas CPU e FPU. Execute o Step Over e troque
o modo de mostrar a janela FPU para Extended, como mostra a
figura 6.
Este modo executa automaticamente a transformao
executada anteriormente. Voc pode ver que .05 apresentado
como 500. Todos os nmeros no formato Currency so
armazenados como inteiros. Conseqentemente todos os clculos
so executados como inteiros tambm. Ento, se voc usar o
formato Currency ao invs de formatos de ponto flutuante voc
no encontrar problemas com respeito a preciso de clculos. De
qualquer forma o formato Currency permite que somente a parte
fracionria de quatro dgitos, no mximo, seja armazenada.

Concluso
Se voc calcular o trajeto de um satlite, a quantidade de
tomos em metros cbicos de ar, ou um campo de futebol em
polegadas, o formato de ponto flutuante seria a melhor escolha.
Entretanto, se voc quiser desenvolver um balano geral para
finalidades de contabilidade ou desenvolver um pacote de
relatrios financeiros, o formato de ponto flutuante ser
problemtico.
Nesses casos, o tipo Currency o formato ideal.

Voc pode usar a seguinte regra para


determinar se um numero pode ser
apresentado no formato de ponto
flutuante com preciso absoluta.
Multiplique o seu nmero por 2 at ele
ser maior ou igual a 1.
Se o resultado no tem um parte
fracional, o nmero pode ser apresentado
precisamente no formato de ponto
flutuante. Por exemplo, se voc colocar .5
no cdigo mostrado no inicio deste artigo,

Figura 6: Lendo .05 no registro ST0 com o tipo Currency.

18

MeGAZINE

Delphi

Calculando o
Dgito Verificador
Por Claudinei Rodrigues nei@theclub.com.br

Alguns de nossos scios tm ligado ao suporte tcnico


solicitando informaes sobre como criar o clculo de dgito
verificador. Sendo assim resolvi escrever este artigo ensinando
uma forma simples de resolver este problema utilizando o mdulo
11.

2 - Agora some os resultados:


16 + 0 + 0 + 15 + 28 + 3 + 10 = 72
3) Agora calcule o modulo 11 desse resultado: 72 mod 11 = 6

Mas ateno, nem sempre voc poder utilizar este cdigo.


Mais adiante neste artigo eu explicarei o motivo.

4) Subtraia o resultado de 11: 11 - 6 = 5


O resultado do clculo 5. Ou seja, igual ao dgito do cdigo
mencionado anteriormente.

Todo o cdigo que se verifique com clculo tipo dgito


verificador consta de duas partes:

Em alguns casos no possvel utilizar o mdulo 11. Para


alguns documentos existem rgos que definem os clculos para
seus documentos, tratando-os de forma diferente.

A primeira parte o corpo e a segunda o dgito verificador.


O clculo bsico o seguinte:
Imagine que voc tem o seguinte cdigo 2003715-5. Neste
caso o corpo seria o numero 2003715 e o dgito 5.

Por exemplo, utilizando o clculo acima quando o resto for 0


ou 1, o dgito ser 11 ou 10, ento alguns orgos decidem que o
dgito seja 0, 1 ou alguma letra.

Para verificarmos se o dgito est correto faamos o seguinte:


1 - Pegue o corpo e multiplique pelos pesos. Estes pesos so
criados na seqncia de 2 at 9 em ordem decrescente. Veja a
tabela a seguir:
Corpo

P eso s

Resultado

16

15

28

10

Tabela 1: Exemplo do calculo.

Muitos cdigos como, por exemplo, inscries estaduais, usam


rotinas bem diferentes desta que estamos utilizando neste artigo.
Existem cdigos onde so necessrios dois clculos.
O primeiro dgito encontrado se soma ao corpo e para se obter
o segundo dgito, que so os casos do CPF e CGC.
Agora chega de teoria e vamos para prtica.
Chame o Delphi e inclua no Form1 um componente TEdit e
um componente TButton como mostra a figura 1.

MeGAZINE

19

Delphi

Figura 1: Exemplo de como ficar o form.


Agora v at o unit do seu form e digite a rotina, mostrada
na Listagem 1, que far o clculo do dgito verificador.
// Funo que calcula o dgito verificador
function Calcula_Dgito( codigo : string ):String;
var
SR, Resto, R, I, Dgito : Integer;
Peso : string;
begin
// Esta linha remove o ponto caso existe algum no
cdigo
Codigo :=
StringReplace(Codigo,.,,[rfReplaceAll]);
// Esta linha remove a virgula caso exista alguma
no cdigo
Codigo :=
StringReplace(Codigo,,,,[rfReplaceAll]);
// Esta linha remove o trao caso exista algum no
cdigo
Codigo := StringReplace(Codigo,,,[rfReplaceAll]);
// Esta linha remove os espaos em branco caso
exista algum no cdigo
Codigo := StringReplace(Codigo,
,,[rfReplaceAll]);
// Aqui informamos o peso de cada dgito. Aqui
estamos trabalhando
// com sete dgitos. A quantidade de dgitos
utilizada na varivel
// peso deve ser igual a quantidade de dgitos
existente na varivel
// cdigo.
Peso := 8765432;
// Aqui vamos montar um for para ler todos os
dgitos da varivel cdigo
for i := 01 to Length( Codigo ) do
begin
// Agora vamos fazer o clculo de cada dgito
do cdigo
// com o seu respectivo peso.
R := (StrToInt(Codigo[I]) *

20

StrToInt(Peso[I]));
// Aqui vamos armazenar a soma do resultado da
multiplicao
// de cada dgito do codigo com o seu
respectivo peso
SR := SR + R;
end;
// Aqui vamos pegar o resto da diviso da soma dos
resultados
Resto := SR mod 11;
// Aqui vamos pegar o dgito
Dgito := 11 - Resto;
Result := IntToStr(Dgito);
end;
Listagem 1: Rotina de clculo do dgito verificador
Como voc pode observar na rotina mostrada na listagem 1,
eu tentei explicar detalhadamente o que faz cada linha.
Para que possamos testar esta rotina, inclua o cdigo abaixo
no evento OnClick do componente Button, como mostrado na
listagem 2.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(O dgito + Calcula_Dgito(
Edit1.Text ));
end;
Listagem 2: Mostra como chamar a nossa rotina
Para que este exemplo funcione corretamente, no informe o
dgito verificador no componente Edit. Ou seja, digite apenas o
numero 2003715. Pois a inteno deste artigo mostrar como se
calcula o dgito verificador. Como j sabemos qual o dgito deste
cdigo fica muito fcil de sabermos se a nossa funo est ou no
funcionando.

Concluso
Espero ter esclarecido ao menos um pouco sobre como fazer o
clculo do dgito verificador. Com base neste exemplo voc poder
entender melhor os outros tipos de clculos de dgito verificador.
Aproveito mais uma vez lhe avisar que se voc tem algum
assunto que gostaria que fosse publicado em nossa revista, sintase a vontade de enviar um e-mail para suporte@theclub.com.br.
Sua participao muito importante para ns.
Download: http://www.theclub.com.br/revista/download/
dv106.zip

MeGAZINE

Delphi

Utilizando o tipo
Record.

O tipo Record uma estrutura de dados do Delphi que pode


misturar vrios tipos de variveis. Vamos supor que voc precise

O tipo TFuncionario contm trs itens, o Codigo e o Nome do


tipo string e o Salario do tipo Double.

armazenar em uma varivel algumas informaes como o cdigo,


nome e salrio de um funcionrio. A primeira idia seria criar

Agora que j temos o tipo Record definido, vamos criar uma

uma array tridimencional. Mas existe um problema. O array

varivel do tipo Record. Alis, voc pode criar quantas variveis

teria que ser de apenas um tipo ou seja, do tipo string. Se voc

do tipo Record forem necessrias. Vale lembrar que a declarao

precisar, por exemplo, fazer algum clculo com o salrio voc ter

TFuncionario no aloca nenhuma informao na memria para

que converter a varivel de string para double.. O tipo Record

Codigo, Nome e Salario.

pode lhe auxiliar muito neste sentido.


Para instanciar o tipo TFuncionario ns podemos criar uma
Vamos agora a estrutura do tipo Record.

varivel da seguinte forma:

type

Var

TFuncionario = Record

Adm : TFuncionario;

Codigo : string;

Prod : TFuncionario;

Nome : string;
Agora para ter acesso a cada item de cada varivel que

Salario : double;

acabamos de criar, basta colocar o nome da varivel seguindo de

end;

ponto, por exemplo:


Como voc pode ver, uma estrutura de dados do tipo Record
pode misturar vrios tipos de variveis. Cada item, como uma
varivel, consistindo de nome e tipo.

Adm.Codigo := 000001;
Adm.Nome := Jos da Siva;

MeGAZINE

21

Delphi
Adm.Salario := 1500;

Salario := 8000;
end;

Prod.Codigo := 000156;
Ou, por exemplo, montar um contador para mostrar os

Prod.Nome := Antonio da Conceio;

nomes contidos neste array:

Prod.Salario := 3000;
Como voc pde ver bem simples. Um outro recurso que

var i : integer;

temos disponvel neste caso a utilizao do operador with, veja


como simples.

for i := 1 to 50 do
ShowMessage(Empresa[i].Nome);

with Adm do
Como foi dito anteriormente que o tipo Record trabalha como

begin
Codigo := 000001;

qualquer outro tipo do Delphi, ns podemos ir ainda mais alm.

Nome := Jos da Siva;

Voc pode criar um tipo Record dentro de outro Record. Veja.

Salario := 1500;
end;

type
TDepartamento = record

with Prod do

Codigo : string;

begin

Func

Codigo := 000156;

: TFuncionario;

end;

Nome := Antonio da Conceio;


Para preencher todas as informaes necessrias deste novo

Salario := 3000;

Record basta voc seguir a mesma regra.

end;
Se voc quiser possvel copiar todo o contedo da varivel

Veja como fazer:

Adm para a varivel Prod da seguinte forma:


var Depto : TDepartamento;
Prod := Adm;
Depto.Codigo := 000001;

Arrays

Depto.Func.Codigo := 000101;

Como o tipo TFuncionario trabalha como qualquer outro tipo


do Delphi, ns podemos declarar um array deste tipo, por exemplo

Depto.Func.Nome := Antonio da Silva;


Depto.Func.Salario := 3500;

Consideraes finais

var Empresa : array[1..50] of TFuncionario;


Para acessar o dcimo elemento deste array voc pode fazer

O tipo Record pode ter uma parte variante. Esta parte


variante pode ser usada, por exemplo, quando voc quer criar um

da seguinte forma:

tipo Record que tenha campos de tipos diferentes de dados, mas


ns sabemos que no precisaremos usar todos os campos em uma

with Empresa[10] do

instancia simples do Record.


begin
Na prxima edio ns vamos falar mais sobre este assunto.

Codigo := 000025;

At l.

Nome := Antonio Ribeiro;

22

MeGAZINE

Dicas & TTruques


ruques

Como exportar tabelas atravs do ADO, parte II.


Exportando dados de um arquivo TXT para o
Access.
Errata:
Na revista anterior publicamos a primeira parte desta dica
exportando para Paradox, Excel E HTML, mas infelizmente
a rotina saiu com erro de impresso. Sendo assim a seguir
publicaremos novamente a rotina da ltima revista:

Exportando dados de um arquivo TXT para o


Access.
Para fazermos a exportao dos dados do TXT para o Access
primeiramente iremos preparar o arquivo TXT para que o
mesmo fique visvel como uma tabela, isso , que seus dados
fiquem separados por colunas.
Para isso criaremos um arquivo chamado Schema.ini onde
indicaremos a estrutura do nosso arquivo TXT.
[Pessoal.txt]
ColNameHeader=True
Format=Delimited(;)
Col1=Empresa Char Width 4
Col2=Area_RH Char Width 4
Col3=Sub-Area Char Width 4
Col4=N.Pessoal Char Width 8
Col5=Nome Char Width 30
Col6=Cargo float
Col7=Descricao Char Width 20
Col8=Subordinacao Char Width 6
Col9=Descricao Char Width 30

var
Path: string;
begin
Path := ExtractFilePath(Application.ExeName);
{ Exportar dados para Paradox }
ADOConnection1.Execute(SELECT * INTO Clientes IN
+ Path + Paradox 7.x; FROM CLIENTES);
{ Exportar dados para o Excel }
ADOConnection1.Execute(SELECT * INTO Clientes IN
+ Path + clientes.xls Excel 8.0; FROM
CLIENTES);
{ Exportar dados para o html }
ADOConnection1.Execute(SELECT * INTO
[Clientes.htm] IN + Path + HTML Export;
FROM CLIENTES);
end;
Exportando para Paradox, Excel e HTML

Estrutura do arquivo Schema.ini criado para o arquivo


Pessoal.txt
Estando com o arquivo TXT e o arquivo .INI prontos, agora
podemos criar a string de conexo no componente
ADOConnection para acessar o TXT usando o Jet.
Para isso iremos selecionar como Provider o Jet.OLEDB e no
DataSource devemos somente indicar o caminho onde se
encontra o arquivo TXT.

MeGAZINE

23

Dicas & TTruques


ruques
A string de conexo ficar da seguinte forma:
Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=D:\Exemplos\ADO LER ARQUIVO
TXT\ARQUIVOS\;Mode=Read;Extended
Properties=Text;Persist Security Info=False
Criada a string de conexo agora temos que montar a
instruo para exportar os dados do arquivo TXT para o arquivo
MDB, sendo assim montaremos a instruo de exportao da
seguinte forma:

{ Cria o MDB via programao usando o componente da


Pasta Servers }
AccessApplication1.Connect;
AccessApplication1.NewCurrentDatabase(Path+Novo.MDB);
AccessApplication1.Disconnect;
{ Exporta os dados do TXT para o MDB criando a
tabela dentro do MDB }
ADOConnection1.Execute(SELECT * INTO Dados IN
+Path+Novo.MDB Jet 2.x; FROM PESSOAL.TXT);
end;
O projeto de exemplo pode ser baixado em nosso site no
seguinte link:
http://www.theclub.com.br/revista/download/
ADO_TXTparaMDB.zip

var Path : String;


begin
Path := ExtractFilePath
(Application.ExeName);
ADOConnection1.Execute(SELECT * INTO
Pessoal IN +Path+Novo.MDB Jet
2.x; FROM PESSOAL.TXT);
end;
Exportando dados do arquivo TXT para o
Access
Neste momento se voc fez o teste recebeu
uma mensagem indicando que o arquivo
Novo.MDB no foi encontrado, isso ocorre
porque a exportao criar somente a tabela com
os dados e essa tabela deve ser criada dentro de
um arquivo MDB, portanto antes da exportao
temos que criar o arquivo .MDB, mesmo que
vazio, e para isso utilizaremos outro componente
chamado AccessApplication, da aba Servers.
Aps incluir o componente AccessApplication no form
podemos complementar a nossa rotina de exportao incluindo a
instruo para criar o arquivo MDB.
Abaixo segue as instrues para criar o arquivo .MDB vazio e
depois exportamos os dados do arquivo TXT para esse MDB.
procedure TForm1.Button2Click(Sender: TObject);
var Path : String;
begin
// Nome do arquivo TXT de origem dos dados,
Pessoal.txt
// Nome do arquivo INI contendo a estrutura do
arquivo txt, Schema.ini
// Nome do arquivo MDB a ser criado, Novo.MDB
// Nome da tabela que ser criada dentro do MDB,
Dados
Path :=
ExtractFilePath(Application.ExeName)+ARQUIVOS\;

24

Figura 1: Estrutura do TXT de origem dos dados

FireBird/Interbase - Retornar as tabelas Detalhes


a partir da Master.
Nesta dica iremos utilizar as tabelas de sistema do banco
para verificar se uma determinada tabela tem outras tabelas
ligadas a ela atravs de Foreign Key.
A tabela Master a PEDIDO.
select
R1.rdb$relation_name as MASTER,
R5.rdb$field_name as CAMPO_MASTER,
R3.rdb$relation_name AS DETALHE,
R4.rdb$field_name AS CAMPO_DETALHE
from RDB$RELATION_CONSTRAINTS R1
left outer join RDB$REF_CONSTRAINTS R2
on (R2.rdb$const_name_uq = R1.RDB$CONSTRAINT_NAME)
left outer join RDB$RELATION_CONSTRAINTS R3

MeGAZINE

Dicas & TTruques


ruques
on (R2.rdb$constraint_name = R3.RDB$CONSTRAINT_NAME)
left outer join RDB$INDEX_SEGMENTS R4
on (R4.rdb$index_name = R3.rdb$index_name)
left outer join RDB$INDEX_SEGMENTS R5
on (R5.rdb$index_name = R1.rdb$index_name)
where (R2.rdb$constraint_name is not Null)
and R1.rdb$relation_name = PEDIDO

Abreviando nomes
Veja a seguir como voc pode abreviar um nome de forma
simples. Inclua no seu form um componete TEdit e um
componente TButton. Inclua o cdigo abaixo no evento OnClick
do componente TButton

Neste exemplo retornaremos o nome da Tabela Master, o


nome do campo dessa tabela Master usado na ligao, o nome da
tabela ligada Master atravs da Foreign Key e o nome do campo
dessa tabela encontrada que faz parte da Foreign key.

procedure TForm1.Button1Click(Sender: TObject);


begin
ShowMessage(AbreviaNome(Edit1.Text));
end;
Agora inclua na sua unit a rotina que faz a
abreviao de nomes.

Veja exemplo:
Master Campo_Master Detalhe Campo_detalhe
PEDIDO CODPEDIDO PEDITENS CODPEDIDO

FireBird/Interbase Usando um For Select dentro


da StoredProcedure
Neste exemplo iremos criar um StoredProcedure dentro do
banco
para retornar registros de duas tabelas usando para isso o
For Select.
create procedure SP_RETORNO(PCOD INTEGER)
returns (COD INTEGER, NOME VARCHAR(30),
VALOR NUMERIC(15,4))
as
begin
for select CODIGO, NOME from CLIENTES
where CODIGO = :PCOD
into :COD, :NOME do
begin
select VALOR from VALORES
where CODIGO = :COD
into :VALOR;
if ((VALOR IS NULL) or (VALOR = 0)) then
VALOR = 1;
suspend;
end
end;
Para visualizar os registros retornados desta
StoredProcedure podemos fazer um Select dentro da Query,
ficando a instruo da seguinte forma:
select * from SP_RETORNO( 10 )

MeGAZINE

function AbreviaNome(Nome: String): String;


var
Nomes: array[1..20] of string;
i, TotalNomes: Integer;
begin
Nome := Trim(Nome);
Result := Nome;
{Insere um espao para garantir que todas
as letras sejam testadas}
Nome := Nome + #32;
{Pega a posio do primeiro espao}
i := Pos(#32, Nome);
if i > 0 then
begin
TotalNomes := 0;
{Separa todos os nomes}
while i > 0 do
begin
Inc(TotalNomes);
Nomes[TotalNomes] := Copy(Nome, 1, i - 1);
Delete(Nome, 1, i);
i := Pos(#32, Nome);
end;
if TotalNomes > 2 then
begin
{Abreviar a partir do segundo nome,
exceto o ltimo.}
for i := 2 to TotalNomes - 1 do
begin
{Contm mais de 3 letras? (ignorar
de, da, das, do, dos, etc.)}
if Length(Nomes[i]) > 3 then
{Pega apenas a primeira letra do

25

Dicas & TTruques


ruques
Clear;
Add(Name1, ftString, 20, False);
Add(Name2, ftString, 20, False);
Add(Name3, ftString, 20, False);
Add(Name4, ftString, 20, False);

nome e coloca um ponto aps.}


Nomes[i] := Nomes[i][1] + .;
end;
Result := ;
for i := 1 to TotalNomes do
Result := Result + Trim
(Nomes[i]) + #32;
Result := Trim(Result);
end;
end;
end;
Agora pressione a tecla F9 para rodar o programa. Digite um
nome no componente TEdit e clique no boto. Voc receber uma
mensagem mostrando o nome abreviado.

Na prtica, criar os ndices com AddIndex() logo aps


CreateTable, no vai influenciar em nada o seu programa.

Criando arquivos DBF com ndices compostos


Quem trabalha com DBFs j encontrou problemas para criar
ndices compostos, ou seja, um ndice que tenha mais de um
campo, em tempo de execuo.
Isto ocorre devido a existncia de um parmetro no
documentado, necessrio para arquivos DBFs ixExpression que
informa o Delphi que se trata de um ndice com mais de um
campo. Como trabalhar com DBFs comum para a maioria dos
programadores que vem do Clipper, acho interessante solucionar
este problema da melhor forma possvel.
Assim a criao do ndice fica para logo depois da criao da
tabela, como mostra o segmento de cdigo abaixo.
uses
SysUtils, WinTypes, WinProcs, Messages, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, DB,
DBTables;
procedure TForm1.Button1Click(Sender: TObject);
var
Table1 : TTable;
begin
{ Criar arquivos }
Table1 := TTable.create(Application);
{ Cria arquivo }
with Table1 do
begin
Active := False;
DatabaseName := C:\;
TableName := teste;
TableType := ttdBASE;
with FieldDefs do
begin

26

end;
CreateTable;
AddIndex(Indice1, Name1 + Name2,
[ixExpression]);
AddIndex(Indice2, Name2 + Name3,
[ixExpression]);
AddIndex(Indice3, Name3 + Name4,
[ixExpression]);
end;
end;

Colocar uma ProgressBar numa StatusBar


Coloque uma StatusBar no form.
Adicione dois painis na StatusBar (propriedade Panels).
Ajuste as propriedades do primeiro painel conforme abaixo:
Style = psOwnerDraw
Width = 150
Coloque uma ProgressBar no form e mude sua propriedade
Visible para false.
No evento OnDrawPanel da StatusBar digite o cdigo abaixo:
procedure TForm1.StatusBar1DrawPanel(StatusBar:
TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
{ Se for o primeiro painel... }
if Panel.Index = 0 then
begin
{ Ajusta a tamanho da ProgressBar de acordo
com o tamanho do painel }
ProgressBar1.Width := Rect.Right Rect.Left +1;
ProgressBar1.Height := Rect.Bottom Rect.Top +1;
{ Pinta a ProgressBar no DC
(device-context) da StatusBar }
ProgressBar1.PaintTo(StatusBar.Canvas.Handle,
Rect.Left, Rect.Top);
end;
end;

MeGAZINE

Dicas & TTruques


ruques
Coloque um Button no form
Digite no evento OnClick do Button o cdigo abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var
I: integer;
begin
for I := ProgressBar1.Min to ProgressBar1.Max do
begin
{ Atualiza a posio da ProgressBar }
ProgressBar1.Position := I;
{ Repinta a StatusBar para forar a
atualizao visual }
StatusBar1.Repaint;
{ Aguarda 50 milisegundos }
Sleep(50);
end;
{ Aguarde 500 milisegundos }
Sleep(500);
{ Reseta (zera) a ProgressBar }
ProgressBar1.Position := ProgressBar1.Min;
{ Repinta a StatusBar para forar a
atualizao visual }
StatusBar1.Repaint;
end;
Execute e clique no boto para ver o resultado.

Como mover um componente em Run-time


Para montar este exemplo vamos incluir um componente
Button. Para testar este exemplo mantenha a tecla CTRL
pressionada clique com o mouse sobre o componente Button e
arraste-o para qualquer lugar do form.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

MeGAZINE

procedure Button1MouseMove(Sender: TObject;


Shift: TShiftState; X,
Y: Integer);
procedure Button1MouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
MouseDownSpot : TPoint;
Capturing : bool;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Evento OnMouseDown do boto
procedure TForm1.Button1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then
begin
SetCapture(Button1.Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
end;
// Evento OnMouseMove do boto
procedure TForm1.Button1MouseMove(Sender: TObject;
Shift: TShiftState; X,
Y: Integer);
begin
if Capturing then
begin
Button1.Left:= Button1.Left(MouseDownSpot.x-x);
Button1.Top:= Button1.Top (MouseDownSpot.y-y);
end;
end;
// Evento OnMouseUp do boto

27

Dicas & TTruques


ruques
procedure TForm1.Button1MouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Capturing then
begin
ReleaseCapture;
Capturing := false;
Button1.Left := Button1.Left (MouseDownSpot.x -x);
Button1.Top := Button1.Top (MouseDownSpot.y - y);
end;
end;

Veja abaixo alguns exemplos de cdigo SQL.


Formato 01 - Pesquisa igual, maior menor, etc
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// Fecha o componente Query
Query1.Close;
// Limpa a propriedade SQL
Query1.Sql.Clear;
// Nome dos campos
Query1.Sql.Add(Select Teste1.Codigo,
Teste1.Nome);
// Nome do banco de dados
Query1.Sql.Add(From Teste1 );
// Condies do Filtro
Query1.Sql.Add(Where );
// :Codigo1 e :Codigo2 so as variveis que
// recebero os parmetros.
// O nome destas variveis no importam, pode
// ser usado qualquer nome.
Query1.Sql.Add((Teste1.Codigo >= :Codigo1) and);
Query1.Sql.Add((Teste1.Codigo <= :Codigo2));
// Passagem do parmetro para a varivel
// criada acima
Query1.Params[0].AsString := Edit1.Text;
Query1.Params[1].AsString := Edit2.Text;
// Abre o componente Query
Query1.Open;
end;
Formato 02 - Pesquisa por parte de uma string
procedure TForm1.BitBtn1Click(Sender: TObject);

28

begin
// Fecha o componente Query
Query1.Close;
// Limpa a propriedade SQL
Query1.Sql.Clear;
// Nome dos campos
Query1.Sql.Add(Select Teste1.Codigo,
Teste1.Nome);
// Nome do banco de dados
Query1.Sql.Add(From Teste1 );
// Condies do Filtro
Query1.Sql.Add(Where );
// :Nome1 a varivel que receber o parmetro.
// O nome desta varivel no importa,
// pode ser usado qualquer nome.
Query1.Sql.Add((Teste1.Nome like :Nome1) );
// Passagem do parmetro para a varivel
// criada acima
Query1.Params[0].AsString := %+Edit1.Text+%;
// Abre o componente Query
Query1.Open;
end;
Formato 03 - Filtro de OrdemServio e Data em branco
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// Fecha o componente Query
Query1.Close;
// Limpa a propriedade SQL
Query1.Sql.Clear;
// Nome dos campos
Query1.Sql.Add(Select Teste1.Codigo,
Teste1.Nome);
// Nome do banco de dados
Query1.Sql.Add(From Teste1 );
// Condies do Filtro
Query1.Sql.Add(Where );
// :Var1 a varivel que receber o parmetro.
// O nome desta varivel no importa, pode ser
// usado qualquer nome.
Query1.Sql.Add((Teste1.OrdemServico=:Var1)and );
// Aqui est sendo informado que o campo data
// est vazio
Query1.Sql.Add((Teste1.DataServico is Null) );
// Passagem do parmetro para a varivel acima
Query1.Params[0].AsString := MaskEdit5.Text;
// Abre o componente Query
Query1.Open;
end;

MeGAZINE

Perguntas & Respostas

Pergunta: Como saber no evento onClose do form se o


mesmo
foi apresentado com Show ou ShowModal?

uses Menus;
{$R *.dfm}

Resposta: Para saber se o form foi chamado como


ShowModal, podemos utilizar a seguinte instruo:

procedure TForm1.ApplicationEvents1ShortCut(var Msg:


TWMKey;
var Handled: Boolean);
var
ShortCut: TShortCut;
ShiftState: TShiftState;
begin
ShiftState := KeyDataToShiftState(Msg.KeyData);
ShortCut
:= Menus.ShortCut(Msg.CharCode,
ShiftState);
if TextToShortCut(Shift+F2) = ShortCut then
ShowMessage(Pressionou as teclas Shift+F2);
end;

procedure TForm2.Button1Click(Sender: TObject);


begin
if Form2.FormState = [fsModal] then
ShowMessage(Form chamado como ShowModal)
else
ShowMessage(Form chamado como Show);
end;
Dvida enviada por Paulo Geloramo Assis SP

Pergunta:

Dvida enviada por Juarez Capivari SP

Como tratar um conjunto de teclas em todo o

projeto ?

Resposta:

Para fazer este tratamento voc deve utilizar o


evento OnShortCut do componente ApplicationEvents e declarar
a unit Menus.
Veja abaixo um exemplo que trata as teclas Shift F2
implementation

Resolvendo o problema de campos numricos do


Oracle com o DBExpress
Dica enviada por scio
Estou migrando as aplicaes da empresa do BDE para o
DBExpress utilizando o Oracle como banco de dados. Ao tentar
incluir um registro numa tabela que contm campos NUMBER
em sua estrutura, o evento OnReconcileError do ClientDataSet
retorna a seguinte mensagem

MeGAZINE

29

Perguntas & Respostas


ORA 01722-Invalid Number e o registro no includo.

// Pesquisa a informao digitada no PickList


if DBGrid1.Columns[Indice].PickList.
IndexOf(Informacao) < 0 then
begin
ShowMessage(Informao invlida.);
Abort;
end;
end;

A soluo que encontrei que se deve alterar a configurao


do Oracle no registro do Windows.
Alterar a chave do registro do Windows :
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0
de

end;
Dvida enviado por SAMUEL DELLA SAVIA DE OLIVEIRA
So Paulo SP

NSL_LANG=BRAZILIAN
PORTUGUESE_BRAZIL.WE8ISO8859P1
para

Pergunta: Possuo uma aplicao que usa ADO para se


conectar a um banco SQL Server.

NSL_LANG=BRAZILIAN
PORTUGUESE_AMERICA.WE8ISO8859P1
O erro est na forma que o Oracle est recebendo os valores
numricos do DBExpress trocando o smbolo de separao
decimal de . por , provocando o erro.
A soluo aplicada ainda est em testes pois no sei se terei
efeitos colaterais em minhas aplicaes que usam o BDE. Caso
seja encontrada alguma outra soluo ou encontrado algum
efeito colateral, por favor entrem em contato conosco.
Informao enviada pelo scio Marcelo Marcolongo So
Paulo SP

Pergunta: Como posso validar os itens de um PickList


existente em uma coluna do DBGrid ?

Caso de algum erro, RollBack... S que, se eu estiver


trabalhando com dois computadores e nos dois emitindo pedidos
ao mesmo tempo, o usurio que der commit primeiro grava o
pedido e o outro quando der commit d um erro dizendo que
existem registros alterados na tabela e o sistema no pode ler
estes registros e cancela a operao.
Tem alguma configurao que o ADOConnection precise
para que ele controle as transaes no Banco?

Resposta: O problema que ocorre que por default todos os


campos so utilizados para localizar o registro para Update e com
isso, como algum dos campos foi alterado, o registro no consegue
ser encontrando para ser atualizado.

Resposta: Voc pode fazer esta validao no evento


OnColExit. Veja a seguir como deve ficar a sua rotina.
procedure TForm1.DBGrid1ColExit(Sender: TObject);
var
Indice : integer;
Informacao : string;
begin
// Pega o indice da coluna
Indice := DBGrid1.SelectedField.Index;
// Pega o texto da coluna
Informacao := DBGrid1.SelectedField.DisplayText;
// Verifica se a coluna tem PickList
if DBGrid1.Columns[Indice].PickList.Count > 0 then
begin

30

Tenho no sistema uma tela de lanamento de Pedidos onde,


quando entro na tela dou um BeginTransaction no Banco de
Dados e quando finalizo o pedido dou um Commit Transaction.

Para resolver este problema bastar setar para que a


atualizao seja feita com base no campo chave, para isso, no
evento AfterOpen do AdoTable adicione o seguinte cdigo:
ADODataSet1.Properties[Update Criteria].value :=
adCriteriaKey;
// Declarar a unit AdoInt na lista de uses.
Dvida enviada por Gabriel Jank Horizontina - RS

Envie-nos suas dicas para que


possamos compartilh-las com todos

MeGAZINE

Potrebbero piacerti anche