Você está na página 1de 32

maio 2009

maio 2009
ndice
Editorial Delphi

Neste ms apresentaremos o artigo Diretivas de Compila-


o Parte I do consultor Luiz Alexandre, neste artigo abor-
dado um assunto ainda obscuro para a maioria dos programa-
Introduo a Porta Paralela
05
dores, mas com grande potencial para auxiliar o programador.

12
Alexandre lista e esclarece neste artigo as principais diretivas
com alguns exemplos, e mostra que recursos e possibilidades Utilizando as APIs do windo-
so enormes usando as diretivas de compilao do Delphi. ws para melhorar a aplicao
Victory Fernandes est de volta apresentando Juliana An-

18
drade Carvalho e Rafael Arajo, onde juntos escrevem o artigo Diretivas de compilao -
Introduo a Porta Paralela Escrevendo bits via

04
Delphi, neste artigo abordado automatizao Parte I
de processos utilizando como principal forma de
comunicao a porta paralela.

.NET Dicas Delphi


Corrigindo erro na distribuies desenvolvidas em 2009 com SQL Server

23
A nova fase da WEB com Obter o nome do usurio e da empresa informado durante a instalao
Silverlight do Windows
Criar cores personalizadas (sistema RGB)
Gerar uma tabela no Word atravs do Delphi
Obter o valor de uma varivel de ambiente
Aumentar um Edit em tempo de execuo
28
Desafio
Legenda The CLub

30
Iniciante Teste seus conhe-
Intermedirio cimentos.
Avanado

maio 2009 03
Bem-vindo Av. Prof Celso Ferreira da Silva, 190

Neste ms apresentaremos o artigo Diretivas de Compilao Parte I Jd. Europa - Avar - SP - CEP 18.707-150
Informaes: (14) 3732-1529
do consultor Luiz Alexandre, neste artigo abordado um assunto ainda Suporte: (14) 3733-1588

obscuro para a maioria dos programadores, mas com grande potencial para
auxiliar o programador. Alexandre lista e esclarece neste artigo as principais Internet
http://www.theclub.com.br
diretivas com alguns exemplos, e mostra que recursos e possibilidades so Cadastro: cadastro@theclub.com.br

enormes usando as diretivas de compilao do Delphi. Suporte: suporte@theclub.com.br


Informaes: info@theclub.com.br
Skype Cadastro: theclub_cadastro
Skype Suporte: theclub_linha1
Victory Fernandes est de volta apresentando Juliana Andrade Carvalho theclub_linha2

e Rafael Arajo, onde juntos escrevem o artigo Introduo a Porta Paralela


Escrevendo bits via Delphi, neste artigo abordado automatizao de Copyright The Club Megazine 2008

processos utilizando como principal forma de comunicao a porta parale-


la. Neste assunto que vai muito alm da programao software, teremos Diretor Tcnico
Marcos Csar Silva
conhecimentos tcnicos sobre a tecnologia de acesso a hardwares at
mesmo conceitos de eletrnica digital, artigo este bastante interessante Diagramao e Arte
que vale muito a pena sua leitura. Vitor M. Rodrigues

Para os programadores no to iniciantes, mas que precisam aprimorar Reviso


Marcos Csar Silva
suas tcnicas de programao, Antonio Spitaleri Neto vem com o artigo
Utilizando as APIs do Windows para melhorar a aplicao. Neste artigo Colunistas
ele mostra recursos do sistema operacional simples de serem implemen- Antonio Spitaleri Neto
Fabiano Belmonte
tados na sua aplicao, mas que pode trazer grandes funcionalidades para Lus Alexandre de Oliveira
a aplicao, funcionalidades estas que dificilmente iria ser possvel de ser Marco Antonio Armando
Marcos Csar Silva
implementada usando apenas os recursos do Delphi. Victory Fernandes
Vitor M. Rodrigues

A nova Fase da web com Silverlight o artigo para .Net de Luiz Impresso e acabamento:

Alexandre, onde ele apresenta a tecnologia SilverLight da Microsoft para GRIL - Grfica e Editora
Rua So Paulo, n 447
desenvolvimento web. Usando as palavras do autor essa tecnologia Cep: 18740-00 - Taquarituba-SP
Tel. (14) 3762-1345
capaz de trabalhar com um conceito novo de recursos visuais, como os
de som e vdeo, animaes, alm da praticidade, usabilidade, agilidade e Reproduo
A utilizao, reproduo, apropriao, armazenamento em banco

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

Desejo a todos uma boa leitura e espero que se divirtam com seus
novos cdigos.

Um abrao a todos.

Marcos Csar Silva - Editor Chefe


marcos@theclub.com.br
Delphi marca registrada da Borland International,
as demais marcas citadas so registradas
pelos seus respectivos proprietrios.

04 maio 2009
Delphi

Introduo a Porta Paralela


Escrevendo bits via Delphi

A porta paralela como base do ensino UNIFACS ficaram entre os vencedores do Concurso
A exigncia dos consumidores faz com da automao Idias Inovadoras de 2008, realizado pela Fundao
que os processos automatizados estejam de Amparo Pesquisa do Estado da Bahia (FAPESB)
cada vez mais presentes no cotidiano, o que Os conceitos tcnicos apresentados neste e Secretaria de Cincia, Tecnologia e Inovao do
faz a automao de processos, algo de grande artigo so base de uma metodologia mais ampla Estado (SECTI). Na categoria Graduando, conquis-
valor no mercado. proposta, desenvolvida e aplicada nos cursos de tou o primeiro lugar e premiao de R$3.000,00, o
Engenharia Mecatrnica e Mecnica da Universi- projeto Sensor de Presena Veicular (SPV), desen-
Tal automatizao pode ser baseada em dade Salvador UNIFACS, premiada com a Meno volvido por alunos de Engenharia Mecatrnica e
diversos tipos de dispositivos controladores, Honrosa do Prmio Top Educacional Professor Engenharia Mecnica. Na categoria Inventor Livre,
tais como: Micro-Controladores, Controlado- Mrio Palmrio 2008, promovido pela Associao o terceiro lugar e premiao de R$5.000,00, foi para
res Lgicos Programveis CLP, computadores Brasileira de Mantenedoras de Ensino Superior o projeto de uma balana para botijo de GLP, de
PC dentre outros. A viso mais simplista deste ABMES, conforme descrito em Araujo (2008). um estudante de Engenharia Mecatrnica. Ainda
processo envolve sempre algum tipo de dispo- houve a participao no concurso de um terceiro
sitivo micro-processado que faz uso de portas Com o intuito de incentivar a aplicao prtica grupo formado por estudantes de Engenharia
de entradas e sadas para comunicao com de conceitos tericos abordados em sala, tornando Mecatrnica e Engenharia Eltrica, o grupo ficou
o meio externo. o curso ldico e desafiador para o estudante, de entre os finalistas da categoria Graduando, com
forma a aumentar seu interesse e reduzir os ndi- o projeto Dotbus, um sistema de automao de
Neste contexto, propostas simples como ces de evaso, foi implantada a estrutura de um transporte pblico envolvendo acessibilidade,
acender uma lmpada a partir do clique do programa interdisciplinar de prticas semestrais que permite aos passageiros selecionar o veculo
mouse, envolvem solues de software onde aplicadas de forma gradual, orientada e continua- desejado em um painel eletrnico instalado no
o processo de desenvolvimento extrapola a da, devidamente adequadas s grades curriculares ponto de nibus.
confeco de telas e interface com bancos dos cursos citados. Este programa, codinome
de dados, exigindo um maior conhecimento ARHTE, prev que desde o primeiro semestre o O que h em comum nesses projetos? Todos
acerca de tecnologias de acesso a hardware, aluno realize atividades de desenvolvimento de comearam a partir de uma simples escrita e lei-
bases numricas, conceitos de eletrnica projetos automatizados, inicialmente integrados tura de dados da porta paralela do PC como forma
digital, dentre outras. com o computador via porta paralela, interagindo de interagir e comunicar com o mundo externo,
de forma empreendedora com o mercado, aumen- permitindo que o software controle e automatize
Com o objetivo de iniciar o leitor nestas tando a abrangncia de seus conhecimentos e cul- processos.
tecnologias e prover conceitos bsicos relacio- minando ao final do curso com o desenvolvimento
nados a automao de processos a partir de de aplicaes profissionais e inovadoras. Para maiores informaes sobre o programa
computadores PC, ser abordado nesta srie As possibilidades de projetos so vastas e os ARHTE bem como acesso completo aos vdeos e
de artigos a mais simples dessas solues: a exemplos de sucesso j desenvolvidos so inme- detalhamentos dos projetos, acesse www.arhte.
porta paralela. No decorrer desta primeira ros, no entanto alguns merecem destaque pelo seu unifacs.br ou ainda os portais acadmicos de alguns
parte, falaremos sobre uma breve introduo reconhecimento prvio. professores da universidade: www.igara.com.br/
do dispositivo e sada de dados. victory/solucoes.html, do professor Victory Fernan-
Dois projetos desenvolvidos por estudantes da des e www.harpia.eng.br/lp1.html, do professor

maio 2009 05
Rafael Arajo.

Tipos de comunicao

No mbito das comunicaes de dados atravs


de canais de entrada e sada, existem dois modos
de comunicao bsicos: comunicao serial e a
comunicao paralela.

A comunicao serial, como o prprio nome


indica, envia os dados em srie. Os dados so en-
viados atravs de um nico canal de comunicao,
por onde as informaes passam bit-a-bit.

Na comunicao paralela h mais de um canal


de comunicao e dados podem ser enviados
simultaneamente nos diversos canais. Figura 1: Comunicao Serial e Comunicao Paralela.
Fonte: http://i61.photobucket.com/albums/h61/southafrikanse/comfig12.gif
Na Figura 1 possvel visualizar, atravs de um
grfico de conjuntos, a diferena entre tais tipos
de comunicao.

Veja na Figura 1.

Conforme Tocci (2007), a informao


transmitida em formato binrio e, geralmente,
representada por tenses na sada de um circuito
transmissor que est conectado entrada de um
circuito receptor.

Para transmitir o texto oi de um computador


para uma impressora, conectada porta paralela
LPT1, sero enviados de uma s vez, pelos 8 canais
Figura 3: Porta paralela e seus endereos de memria.
de dados da porta paralela, os 8 bits referentes
Fonte: http://i61.photobucket.com/albums/h61/southafrikanse/pinout.gif (editada)
representao da letra o na tabela ASCII (0110-
1111). Em seguida so enviados os 8 bits restantes
referentes representao da letra i na tabela grande perigo do uso indevido da porta, para o Todos os aspectos da porta paralela do com-
ASCII (0110-1001). Um total de 16 bits enviados em qual o leitor deve estar sempre atento, de forma putador pessoal so padronizados pela norma
2 momentos ou tempos de comunicao. a evitar danos. IEEE 1248, incluindo conectores, pinagem, nveis
de tenso etc.
Para a mesma aplicao desta vez utilizando o A porta paralela possui 5 canais de entrada
canal de dados serial, portas COM ou USB, faz-se (pinos 10 a 13, 15) e 12 de sada de dados (pinos
necessrio que os 16 bits sejam enviados um a um 1 a 9, 14, 16 e 17). Alm desses canais de entrada
atravs do nico canal de comunicao existente. e sada, existem mais 8 canais para aterramento
(pinos 18 a 25). Assim totalizam-se 25 canais
apresentados, fisicamente, por pinos (macho) e
A porta paralela encaixes (fmea).
Os canais de entrada e sada so divididos em
Fisicamente falando, a porta paralela se endereos de memria, identificados por nmeros
apresenta diretamente conectada placa me na base hexadecimal, e codinomes (portas), como
do computador como um conector de 25 pinos, Figura 2: Conector Macho DB25. pode ser visto na Figura 3.
DB25, mostrado na Figura 2. Devido ao fato de Fonte: http://highlyliquid.com/blog/up/db-25-kit.
estar diretamente acoplada placa me, surge um jpg Veja a Figura 3

06 maio 2009
Nas portas de Dados e de Controle concen- Assim como o parmetro EndPorta, o par-
tram-se os 12 canais de sada de dados. J na porta procedure metro Valor tambm pode receber a informao
de Status, temos os 5 canais de entrada. Neste arti- outportb(EndPorta: Integer; em qualquer base numrica, tendo como padro
go so abordados os canais de sada, utilizados para Valor:BYTE); stdcall; a base decimal.
escrever dados ou enviar informaes para o meio external inpout32.DLL
name Out32;
externo. Os canais de entrada sero abordados na O cdigo apresentado a seguir executa a
prxima edio. chamada funo de envio de dados, transmi-
tindo para os pinos de Dados da porta paralela o
Os parmetros recebidos pela funo outportb
As informaes em um computador so nmero 1010 na base decimal, cuja representao
so, respectivamente, o endereo da porta para o
interpretadas em nveis lgicos digitais ou, popu- equivalente na base binria representada com 8
qual a informao deve ser enviada e a informao
larmente, os zeros e uns. Esses nveis lgicos so bits 0000-10102
a ser enviada propriamente dita.
pulsos com magnitude de corrente e de diferena
de potencial (ddp). No caso da porta paralela, so
Como se pode verificar, o valor EndPorta um
padronizados respeitando o padro TTL (Transistor- Outoportb($378, 10);
valor do tipo Integer. Uma varivel desse tipo pode
Transistor-Logic) da eletrnica com 5 VDC (Volts
receber valores em diversas bases numricas, assim
Corrente Contnua) para representar bits com
possvel o envio do valor da porta em qualquer Para identificar quais pinos da porta paralela
valor 1 (um), e 0 VDC para representar bits com
base numrica. Vejamos um exemplo. Suponha- sero ativados e desativados aps a execuo
valor 0 (zero).
mos que desejamos acessar a porta de controle deste comando, preciso analisar a representa-
da porta paralela cujo endereo 37A16. Assim, o binria dos valores enviados. Cada algarismo
As correntes geradas por um sinal da porta
utilizando o Delphi, podemos atribuir tal valor de do nmero binrio representa um pino da porta
paralela so suficientes apenas para acionar LEDs,
duas formas equivalentes, passando o nmero paralela, como pode ser visto na Figura 4.
que so cargas que consomem correntes da or-
na sua representao Decimal ou Hexadecimal,
dem de miliampres. Dessa forma, caso se queira
conforme mostrado a seguir. Veja a Figura 4.
controlar dispositivos mais robustos, necessrio
o uso de circuitos auxiliares que sero abordados
em seguida. Assim, para a porta de Dados, o algarismo
EndPorta := 890;
mais significativo representa o pino 9 e o menos
EndPorta := $37A;
significativo o pino 2.
Acesso porta paralela e o uso in-
pout.dll

Recentemente desenvolver um software


para enviar bits para os dispositivos de entrada e
sada do computador tornou-se um pouco mais
complicado, devido ao bloqueio do acesso direto
aos componentes de hardware dos computadores
promovido pelos sistemas operacionais mais novos,
a exemplo do Windows NT, XP e Vista.

Um dos dispositivos de hardware bloqueados


pelos sistemas operacionais, por motivos de segu-
rana, foi a porta paralela.

Como forma de abstrair a complexidade de


acesso porta paralela em tais sistemas opera-
cionais e simplificar o acesso a tais dispositivos
possvel utilizar uma Dynamic Link Library (dll) dis-
ponvel gratuitamente na internet: a inpout32.dll.

Na linguagem Delphi, em poucas linhas pos-


svel disponibilizar as funes escritas na dll para a
sua aplicao. A seguir apresentado o cdigo de
declarao da funo de escrita na porta paralela Figura 4: relao entre casas binrias e pinos da porta paralela.
contida na dll: Fonte: http://i61.photobucket.com/albums/h61/southafrikanse/pinout.gif (editada)

maio 2009 07
Neste exemplo, aps a transmisso do valor
1010 para a porta de dados, os pinos 5 e 3 da procedure TForm1.Button1Click(Sender: TObject);
porta paralela ficariam ativados com nvel lgico var
alto de 5VDC e os demais desativados, com nvel porta, valor: integer;
begin
lgico baixo 0 VDC.
try
begin
if radiogroup1.ItemIndex = 0 then
Escrevendo na porta paralela begin
Label2.Caption :=
Para exemplificar o processo de escrita na InttoByteSTR(strtoint(edit1.Text), 8);
porta paralela de forma abrangente e simples, porta := $378;
este artigo prope o seguinte mdulo de escrita na valor := strtoint(Edit1.Text);
porta paralela, apresentado na Figura 5. end
else if Radiogroup1.ItemIndex = 1 then
begin
Label3.Caption :=
InttoByteSTR(strtoint(edit1.Text), 8);
porta := $37A;
valor := strtoint(Edit1.Text);
end
else
begin
showmessage(Escolha para qual porta deseja
mandar um valor antes de ligar o programa!);
exit;
end;
outportb(porta, valor);
end;
except
on E: EConvertError do
begin
Figura 5: Laiute do programa de envio de bits pela Showmessage(Esse texto no corresponde a um
porta paralela. valor inteiro vlido. Digite novo valor!);
Fonte: Elaborao prpria. end;
end;
No RadioGroup feita a escolha do endereo end; Cdigo 1
da porta para a qual o usurio deseja mandar a
informao. A depender de qual opo esteja
Veja o Cdigo 1.
marcada, um valor ser atribudo ao parmetro

EndPorta da funo OutPortB.
Para que possamos ento visualizar quais bits
esto ligados ou desligados, precisamos implemen-
No EditBox, o usurio digita o valor numrico
tar uma funo de converso decimal-binrio.
inteiro que deseja enviar para a porta paralela.
Uma maneira rpida e prtica de realizar tal
Como j foi visto, a funo outportb pode
converso fazer sucessivas divises por dois (base
receber o valor a ser enviado em qualquer base nu-
do sistema binrio) do nmero decimal a que se de-
mrica. Ento, com o objetivo de tornar a interface
seja representar em binrio. Para maiores detalhes
com o usurio mais amigvel, o valor ser digitado
desse mtodo leia a apostila sobre converses de
na base decimal. Esse valor digitado ser atribudo
bases numricas do sistema EAD do ICEA (Instituto
ao parmetro Valor da funo OutPortB.
de Controle do Espao Areo) na seguinte url:

Ao clicar no boto Enviar!, a funo outportb http://www.icea.gov.br/ead/anexo/21201.htm


ser chamada com os parmetros atribuidos pelo
usurio. A seguir temos a rotina atribuda ao evento Assim fica fcil construir uma rotina que realize
de OnClick do boto Enviar: essa converso. Seria ela:

08 maio 2009
Veja o Cdigo 2.
function InttoByteSTR(Value, Tam: integer):
Aplicaes de controle via Porta Paralela String;
var
x: integer;
Uma das aplicaes mais simples de controle
temp: string;
de dispositivos via porta paralela, acender e
begin
apagar um LED (Light-emitting diode). Como foi
temp := ;
discutido anteriormente, as correntes e as tenses setlength(result, 8);
disponibilizadas pela porta paralela so de baixa
magnitude. Como o led um dispositivo que no while (value >= 1 ) do
demanda elevadas correntes, este pode ser contro- begin
lado diretamente pela porta paralela, sem o auxilio temp := temp + inttostr(value mod 2);
de amplificadores de sinal. Utiliza-se apenas um value := value div 2;
resistor da ordem de 470ohm para garantir que a end;
corrente trabalhe na faixa de tolerncia do led, algo
em torno de 10 a 20 mA. if length(temp) > Tam then
begin
ON_OFF; {rotina que trata de proprieties dos
Assim, com o aplicativo proposto anteriormen-
panels, radiogroups e editboxes}
te, possvel controlar o acionamento de um led,
showmessage(Numero tem mais que a quantidade
atravs de um circuito bastante simples mostrado de bits estipulada);
na Figura 6, a seguir. end
else
begin
for x:= 1 to 8 do
begin
if (length(temp) < x) then
result[9 - x] := 0
else
result[9 - x] := temp[x];
end;
end;
end; Cdigo 2

de lmpadas e diversos outros dispositivos, para (CI) que funcionar como um gatilho, amplificando
esses casos, utilizam-se transistores, drivers de o sinal original, este CI o ULN2003 ou ULN2803.
potncia e rels. Dessa forma o circuito descrito apresenta-se como
na Figura 8.
Para exemplificar o caso descrito anteriormen-
te, mostraremos um circuito de comutao, atravs Veja a Figura 8.
Figura 6: Circuito de acionamento de LED via porta de um rel controlado pela porta paralela, de uma
paralela. tenso alternada em uma lmpada.
Ao enviar um bit de valor 1 (um) para o pino 2
Fonte: Elaborao prpria.
da porta paralela, o mesmo ser ativado, fazendo
O rel um dispositivo composto por uma
bobina e uma chave de trs contatos, como pode com que o ULN libere uma tenso de 12VDC para
Um exemplo de testes de funcionamento do
circuito proposto na Figura 6 pode ser visto no ser visto na Figura 7. acionamento do rel, que por sua vez fechar o
vdeo postado no YouTube de cursos ministrados circuito da lmpada com a rede eltrica de 110
na UNIFACS, disponvel no link: Veja a Figura 7. ou 220VAC, permitindo desta forma que voc
ligue e desligue uma lmpada a partir do clique
http://www.youtube.com/watch?v=jp1OHKlNyTk Ao induzir uma corrente na bobina, um campo do mouse.
magntico gerado, forando o acionamento da
Existem dispositivos que necessitam de uma chave. Devido s questes da estrutura fsica do Agora voc j sabe como controlar uma
corrente e/ou tenso mais elevadas. Para que rel, a corrente que possibilita o acionamento da lmpada atravs do seu software! O acionamento
seus estados de ligado e desligado sejam comu- chave de magnitude elevada, no sendo compat- de sistema digitais baseados em transistores e
tados, bem como pode ser necessrio comutar rels o princpio bsico de qualquer processo
vel com a corrente disponibilizada pela porta para-
tenses alternadas para o caso de acionamento de automao!
lela. Ento possvel utilizar um circuito integrado

maio 2009 09
Concluso

Neste artigo apresentamos os conceitos bsi-


cos relacionados automao de processos a partir
de computadores PC, utilizando acionamento de
bits da porta paralela para controle de dispositivos
externos atravs de aplicativos desenvolvidos em
Delphi.
A aplicao desta metodologia no ensino da
automao tem demonstrado excelentes resul-
tados.
Na experincia da UNIFACS, h a indicao de
que os alunos ingressam em semestres posterio-
res amadurecidos, com interesses profissionais,
resultado das pesquisas e aplicao de contedos
de eletrnica, programao, mecnica, materiais e
automao realizados previamente. Os professores
relatam que as aulas formais tornaram-se mais in-
teressantes e dinmicas, pois a responsabilidade de Figura 7: Estrutura do rel.
trazer contedos do mercado de trabalho deixa de Fonte: http://www.jag-lovers.org/lumps/tech/basics/spst_relay.gif
ser atribuio exclusiva do professor da disciplina,
que passa a compartilhar essa responsabilidade
com o aluno.
Os resultados obtidos indicam uma modifica-
o nas abordagens didticas e comportamentais
de discentes e docentes nos cursos de engenharia.
Associado aos contedos tcnicos, a proposta tem
se mostrado eficaz na formao do engenheiro para
o sculo XXI, com o processo de ensino-aprendiza-
gem prazeroso, efetivo e de qualidade.
No prximo artigo daremos continuidade no
estudo dos recursos da porta paralela, abordando a
leitura de informaes a partir de sensores acopla-
dos mesma, tornando possvel que seu software
adquira percepo do ambiente. Figura 8: Circuito para acionar lmpada.
Fonte: Elaborao prpria.

Referncias

TOCCI, Ronal J.. Sistemas Digitais Principios Sobre os autores


e Aplicaes. 2007. Editora Pearson. 10a Edio.
So Paulo - SP.
Juliana Andrade Carvalho graduanda em Engenharia Mecatrnica pela UNIFACS e estagiria
ARAUJO, Rafael; Fleming, Paulo Victor; Amo-
da TKS. Pode ser contatada em juliana@unifacs.edu.br
rin, Targino; Fernandes, Victory; Marques Ederval.
Ensino Interdisciplinar nas Engenharia Mecnica
e Mecatrnica. Prmio Top Educacional Professor
Rafael Araujo Coordenador do Curso de Engenharia Mecatrnica da UNIFACS, Engenheiro
Mrio Palmrio 2008. Salvador BA.
com Mestrado em Regulao da Indstria de Energia. Pode ser contatado em rafael.araujo@unifacs.br,
MESSIAS, Antonio Rogrio. Rogercom: O maior
ou atravs do site www.harpia.eng.br
contedo brasileiro sobre porta paralela. Disponvel
em: <http://www.rogercom.com/>.
ARAJO, Rafael Gonalves Bezerra de. Rafael
Victory Fernandes Professor do Departamento de Engenharia da UNIFACS, Engenheiro Mest-
Arajo: ENGENHARIA. Disponvel em: <http://www.
rando em Redes de Computadores, e desenvolvedor scio da TKS Software - Solues de Automao e
harpia.eng.br/>.
Softwares Dedicados. Pode ser contatado em victory@igara.com.br, ou atravs dos sites www.igara.com.
FERNANDES, Victory Santos. Victory Fernan-
br www.igara.com.br/victory
des: Engenharia e Software. Disponvel em: <http://
www.igara.com.br/victory>.

10 maio 2009
maio 2009 11
Utilizando as APIs do
windows para melhorar
a aplicao

Todo aplicativo que executado sobre a function DeleteFiber; external kernel32 name
plataforma Windows, tenha sido ele desen- DeleteFiber;
volvido em Delphi ou qualquer outra lingua-
function DeleteFile; external kernel32 name
gem, precisa seguir um conjunto de regras
para funcionar corretamente. Esse conjunto DeleteFileA;
de regras conhecido por API(Application function DeleteFileA; external kernel32 name
Program Interface), e consiste numa srie de
DeleteFileA;
classes que controlam o comportamento dos
aplicativos Win32. function DeleteFileW; external kernel32 name
DeleteFileW;
function DeviceIoControl; external kernel32 name
O Delphi utiliza as APIs a todo instante, porm
de forma transparente ao programador, ou seja, DeviceIoControl;
quem programa em Delphi no tem a necessidade function DisableThreadLibraryCalls; external kernel32
de realizar nenhuma chamada direta API quando
name DisableThreadLibraryCalls;
est programando. O Delphi se encarrega de efetu-
ar as chamadas necessrias API para realizar as function DisconnectNamedPipe; external kernel32 name
mais diversas funes como minimizar e maximizar DisconnectNamedPipe;
uma janela, alterar a cor ou imagem de fundo de
function DosDateTimeToFileTime; external kernel32 name
um formulrio, etc.
DosDateTimeToFileTime;
Quem programa em Delphi, mesmo os expe- function DuplicateHandle; external kernel32 name
rientes, na maioria das vezes digamos que vai pelo
DuplicateHandle;
rumo em se tratando de APIs, ou seja, utiliza as
APIs porm no diretamente, apenas atravs do function EncryptFile; external kernel32 name
encapsulamento oferecido pelas classes da VCL EncryptFile;
do Delphi.
function EncryptFileA; external kernel32 name
No Delphi, grande parte das funes que EncryptFileA;
trabalham com as APIs esto localizadas na unit function EncryptFileW; external kernel32 name
Windows, veja esse pequeno trecho dessa unit
EncryptFileW; Cdigo 1
que bem extensa:

12 maio 2009
Repare que as funes utilizam a diretiva
external que indica que elas no esto Em alguma Objeto Propriedades
unit do Delphi e sim em uma DLL, no caso a dll Radio Group 1 Caption: Resoluo da tela
kernel32 que se encontra no diretrio C:\Windows\
System32. Itens: 640 x 480, 800 x 600, 1024 x 768
Radio Group 2 Caption: Cores
No impescindvel ao programador Delphi
saber trabalhar com as APIs, porm o bom uso Itens: 16 cores, 256 cores, 65536 cores
delas pode melhorar significativamente a aplicao.
Nesse artigo estarei mostrando alguns exemplos
Button 1 Caption: Aplicar Alteraes.
de como a API do Windows pode ser usada para
incrementar seus aplicativos. Mos obra! Tabela 1

Alterando a resoluo da tela

Geralmente, desenvolvemos nossos aplicativos


para serem executados em uma determinada reso-
luo de vdeo (por exemplo, 800x600) e quando
o usurio executa o aplicativo em uma resoluo
diferente as janelas ficam mal posicionadas, o que
convenhamos no interessante em termos visuais
e acaba por desvalorizar o software.

Nesse caso, podemos utilizar a API do Windows


para oferecer ao usurio final a opo de mudar a
resoluo das telas do aplicativo de acordo com Imagem 1
a resoluo de vdeo do monitor que ele esteja
utilizando. Dessa forma o problema com o mal
posicionamento de telas resolvido.
procedure TForm1.Button1Click(Sender: TObject);
var sdispmode:DEVMODE;//declarao da estrutura devmode
O Delphi possui a classe TScreen que poderia
begin
ser utilizada nesse caso, essa classe contm mto-
EnumDisplaySettings(nil,0,sdispmode);//armazenamos os
dos que podem ser utilizados para, entre outras
dados de resoluo
coisas alterar a resoluo da tela do computador.
// tela na varivel
Nesse exemplo porm estaremos utilizando duas
sdispmode
funes da API: EnumDisplaySettings, que res-
ponsvel por retornar os valores de resoluo de
case RadioGroup1.ItemIndex of
vdeo correntes e ChangeDisplaySettings que se
// aqui alteramos os valores de largura
encarrega de mudar a resoluo de vdeo.Alm
// e altura da tela de acordo com a
dessas funes, estaremos utilizando a estrutura
// escolha do usurio
DevMode, que armazena dados sobre a resoluo
0:
de vdeo.
begin
sdispmode.dmPelsWidth:=640;
Mais informaes sobre essas funes podem
sdispmode.dmPelsHeight:=480;
ser obtidas atravs do help do Delphi, na seo
end;
Windows Setup API Programmers Reference.
1:
begin
Vamos ao exemplo. Crie uma nova aplicao
sdispmode.dmPelsWidth:=800;
em Delphi e inclua os seguintes componentes:
sdispmode.dmPelsHeight:=600;
end;
Veja a tabela 1.
2:
begin
A tela de seu aplicativo dever ficar com a
sdispmode.dmPelsWidth:=1024;
seguinte aparncia:
sdispmode.dmPelsHeight:=768;
Veja a imagem 1.
end;
end; Cdigo 2
No evento Onclick do Button1 faa:

maio 2009 13
case RadioGroup2.ItemIndex of

// aqui ajustamos o nmero de bits de cores por


//pixel atravs da propriedade bitsperpel da
// estrutura devmode representada pela varivel
sdispmode

0:
sdispmode.dmBitsPerPel:=4; // 16 cores
1:
sdispmode.dmBitsPerPel:=8;// 256 cores
2:
sdispmode.dmBitsPerPel:=16; // 65536 cores
end;

// agora especificamos quais campos da estrutura


devmode foram alterados

sdispmode.dmFields:=DM_BITSPERPEL+DM_PELSWIDTH+DM_
PELSHEIGHT;

// a seguir aplicamos as alteraes e verificamos o


valor de retorno
// que representado pela constante DISP_CHANGE_
SUCCESSFUL
// se o retorno da funo ChangeDisplaySettings for
igual a essa
// constante porque as alteraes foram executadas com
sucesso
if (ChangeDisplaySettings(sdispmode,0)= DISP_CHANGE_
SUCCESSFUL)then
ShowMessage(Alterada a resoluo)
else
ShowMessage(Resoluo no Suportada);
end;
Cdigo 2

Criando Formulrios diretamente via aplicao no Delphi e localize a unit do programa,


Cdigo ou seja, o arquivo dpr onde a aplicao inicializa-
da. Nessa unit coloque o seguinte cdigo:
Em alguns casos, na programao Delphi,
acabamos por ter que criar formulrios para a
execuo de pequenas tarefas e na soma esses
vrios formulrios acabam por tornar a aplicao
mais pesada.

Nesse exemplo, estarei mostrando que pos-


svel criar janelas em Delphi atravs de chamadas
diretas API, ao estilo da programao em C++.

claro que devido a complexidade do cdigo


no seria vivel a criao de vrios forms de uma
grande aplicao devido a baixa produtividade.
Esse exemplo fica limitado a criao de forms para
tarefas pequenas da aplicao como, por exemplo,
o login de usurios.
Vamos ao cdigo do exemplo. Inicie uma nova

14 maio 2009
program testwindow;
uses
Windows,Messages;
var
WinClass: TWndClassA;
Inst, Handle, Button1, Label1, Edit1: Integer;
Msg: TMsg;
hFont: Integer;
{ Verifica se a senha digitada theclub e mostra
uma mensagem }
procedure CheckPassword;
var
Textlength: Integer;
Text: PChar;
begin
TextLength := GetWindowTextLength(Edit1);
if TextLength = 7 then
begin
GetMem(Text, TextLength + 1);
GetWindowText(Edit1, Text, TextLength + 1);
if Text = theclub then
begin
MessageBoxA(Handle, A senha est correta.,
Verifica a senha, MB_OK);
FreeMem(Text, TextLength + 1);
Exit;
end;
end;
MessageBoxA(Handle, Senha incorreta., Verifica
senha, MB_OK);
end;
{ Funo WindowProc alternativa }
function WindowProc(hWnd, uMsg, wParam, lParam:
Integer): Integer; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
{ Ve se tem mensagens }
if (lParam = Button1) and (uMsg = WM_COMMAND) then
CheckPassword;
if uMsg = WM_DESTROY then
Halt;
end;

begin
{ ** Registra um classe de janela alternativa ** }
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := AG_TESTWINDOW;
hCursor := LoadCursor(0, IDC_ARROW);
end; { with }
RegisterClass(WinClass);
{ ** Cria a janela principal ** } Cdigo 3

maio 2009 15
Atravs de chamadas a API possvel, at de
Handle := CreateWindowEx(WS_EX_WINDOWEDGE, AG_ forma um tanto simples, fazer essa verificao
TESTWINDOW, Amigreen TestWindow 1.00, utilizando para tanto apenas uma funo da API,
WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU, getversionex, essa funo que utilizaremos no
363, 278, 305, 65, 0, 0, Inst, nil);
exemplo a seguir.
{ ** Cria um botao ** }
Button1 := CreateWindow(Button, OK, WS_VISIBLE or
O primeiro passo declarar uma varivel do
WS_CHILD or BS_PUSHLIKE or BS_TEXT,
216, 8, 75, 25, handle, 0, Inst, nil); tipo tosversioninfo, essa varivel que ser passada
{ ** Cria um label estatico ** } como parmetro para a funo getversionex para
Label1 := Createwindow(Static, , WS_VISIBLE or WS_ que essa funo retorne corretamente a verso do
CHILD or SS_LEFT, Windows que est rodando na mquina.
8, 12, 76, 13, Handle, 0, Inst, nil);
{ ** Cria um Edit ** } Com a varivel declarada, precisamos di-
Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, Edit, , mension-la, isso feito atravs do seguinte
WS_CHILD or WS_VISIBLE or comando:
WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0,
Inst, nil);
Var version:tosversioninfo;
{ ** Cria a fonte padrao ** } version.dwOSVersionInfoSize
hFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, :=sizeof(version);
DEFAULT_CHARSET, Cdigo 4
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_
QUALITY, Com a varivel devidamente dimensionada,
DEFAULT_PITCH or FF_DONTCARE, MS Sans Serif); podemos chamar a funo getversionex e passar
essa varivel como parmetro da mesma:
{ Muda a fonte }
if hFont <> 0 then
begin GetVersionEx(version);
SendMessage(Button1, WM_SETFONT, hFont, 0); Cdigo 5
SendMessage(Label1, WM_SETFONT, hFont, 0);
SendMessage(Edit1, WM_SETFONT, hFont, 0); Agora podemos acessar os valores da varivel
end; que nos permitiro conferir a verso do Windows
{ Muda o texto do label } atravs da comparao desses valores com a
SetWindowText(Label1, Informe a senha:); seguinte tabela:
{ Poe o focu no Edit }
SetFocus(Edit1); Veja a tabela 2

UpdateWindow(Handle); Essa tabela est disponvel no site da Microsoft


no link:
{ ** Loop de Mensagens ** }
while(GetMessage(Msg, Handle, 0, 0)) do http://support.microsoftcom/kb/189249/
begin
TranslateMessage(msg); Vamos agora criar a funo.Segue o cdigo
DispatchMessage(msg); da mesma:
end; { with }
end. Cdigo 3

Como pode ser verificado, o cdigo extenso Em algumas situaes, pode ser til que o
e se torna um tanto complexo devido s chamadas aplicativo faa uma verificao de qual verso do
diretas API que so realizadas. Apesar disso pode Windows est sendo executada na mquina no qual
ser muito til para reduzir o tamanho em memria ele est rodando. Principalmente nos casos em que
da aplicao. o aplicativo executa funes cuja chamada pode
ser diferente dependendo da verso do sistema
Verificando qual verso do Windows est operacional.
sendo executada.

16 maio 2009
95 98 ME NT 3,51 NT 4.0 2000 XP
PlatformID 1 1 1 2 2 2 2
Major Version 4 4 4 3 4 5 5
Minor Version 0 10 90 0 0 0 1
Tabela 2

function TForm1.getversion: string;


begin
version.dwOSVersionInfoSize:=sizeof(version); Verifique que apesar de estarmos utilizando
GetVersionEx(version); API relativamente fcil verificar qual verso do
Result:=; Windows estamos rodando. E pode ser bastante
with Version do til essa verificao.
begin
case dwPlatformId of
1: Fazendo o Delphi falar
case dwMinorVersion of
0: Result:=Windows 95; SAPI(Speech Application Program Interface)
10: Result:=Windows 98; uma API que permite aos desenvolvedores traba-
90: Result:=Windows Me; lhar de forma mais tranqila com reconhecimento
end; de voz e simulao de efeitos sonoros.No exemplo
2: a seguir, utilizaremos essa API para construir um
case dwMajorVersion of aplicativo simples em Delphi que ir ler um texto
3: Result:=Windows NT 3.51; digitado pelo usurio e transform-lo em som.
4: Result:=Windows NT 4.0;
5: Inicie uma nova aplicao no Delphi e adicione
case dwMinorVersion of uma Edit e um Button. No evento on click do Button
0: Result:=Windows 2000; criado faa:
1: Result:=Windows XP;
end; Veja o Cdigo 7.
end;
end; No cdigo, criamos um objeto no padro
end; OLE(object linking and embeding) que um pa-
if (Result=) then dro para integrao de aplicaes. Esse objeto
Result:=Sistema operacional desconhecido.; se encarrega de fazer a leitura do que o usurio
end; digita e transforma em udio que ser exibido via
placa de som.
No exemplo usaremos a funo no evento onclick de um
Button, como segue:
Concluso
procedure TForm1.Button1Click(Sender: TObject);
var winversion:string; Embora no seja necessrio ser um conhecedor
begin de APIs, observamos que ter certo conhecimento
winversion:=getversion; em APIs pode facilitar a vida do programador, per-
ShowMessage(Voc est usando +winversion); mitindo incluir recursos no sistema, onde apenas
end; usando Delphi seria quase impossvel.
Cdigo 6

Sobre o autor
var falador:OleVariant;
Antonio Spitaleri Neto
begin
falador:=CreateOleObject(SAPI.spvoice);
Consultor Tcnico The club
falador.speak(Edit1.Text,0);
end;
antonio@theclub.com.br
Cdigo 7

maio 2009 17
DIRETIVAS DE COMPILAO
Parte I
do seu programa e tambm gerar verses de demonstrao.
Neste artigo irei abordar um assunto que um mistrio para grande
maioria dos programadores e vem de encontro as necessidades de alguns Quando voc usa as diretivas de compilao o Delphi verifica se ela esta
scios. Quando voc compila o seu projeto , o Delphi esta realizando um definida e obedece as regras que voc imps pelo uso da diretiva , visto que
processo de traduo do cdigo que voc escreveu para uma linguagem as diretivas so avaliadas antes da compilao do seu cdigo.
que seu computador possa entender.
Voc pode ento , atravs das diretivas de compilao controlar, o cdigo

A
que ser compilado.
s diretivas so usadas para controlar as caractersticas do com-
pilador Delphi. As diretivas podem ser inseridas diretamente no Lista das Diretivas
cdigo fonte utilizando a sintaxe de comentrio( no podemos
confundir diretivas com comentrio), ou tambm podem ser $A Define o tipo de alinhamento de campos do tipo Record.
colacadas no arquivo de configurao DCC32.CFG.

Tambm podem ser fornecidas na linha de comando do compilador Opo significado


DCC32.exe. A caixa de dilogo Project OptionsCompiler contm muitas {$A+} Os campos em tipos Record declarados sem o modifi-
opes equivalentes as diretivas, contudo, as diretivas inseridas diretamente cador packed
no cdigo fonte sempre se sobrepem s diretivas na linha de comando e s sero alinhados
opes do projeto (Project OptionsCompiler).
{$A-} No sero alinhados
A tecla ctrl + OO pressionadas no editor de cdigo inserem as definies
correntes das diretivas ativas no incio do arquivo fonte.(Figura 2) Exemplo

type
// default : $A+
// sem pacote
TSemPacoteON = Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;
// packed record
TPacote = Packed Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
Figura 1 . end;

Todas as diretivas de compilao so iniciadas pelo caractere $. As diretivas // Set alignment off
podem ser colocadas em qualquer parte do programa. {$A-}

Voc pode usar as diretivas de compilao para selecionar trechos particu- // Sem pacote com {$A-}
lares de cdigo que sero executados enquanto outros trechos sero ignorados TSemPacoteOff= Record
pelo compilador. Pode tambm alterar valores definidos de alguns elementos

18 maio 2009
name1 : string[4]; begin
floater : single; WriteLn(Entre com seu nome);
name2 : char; ReadLn(name);
int : Integer; WriteLn(Seu nome e +name);
end; WriteLn();
WriteLn(Pressione enter para sair);
ReadLn(name);
var end.
Form1: TForm1;
alignedRec : TSemPacoteOn;
packedRec : TPacote; $assertions o mesmo que {$C+| -}
unPackedRec : TSemPacoteOff;

$B
implementation
Define o modelo de gerao de cdigo para os operadores booleanos
{$R *.dfm} and e or. O mesmo que {$booleval on|off}

procedure TForm1.Button1Click(Sender: {$B+} Todas as expresses booleanas so avaliadas at o final, mesmo que
TObject); o resultado da expresso inteira seja avaliado.
begin {$B-} A avaliao finalizada to logo que o resultado da expresso inteira
ShowMessage(tamanho registro alinhado torne-se evidente, mesmo antes que a expresso inteira seja avaliada.
sem pacote com {$A+} = +IntToStr(Size
Of(alignedRec))); Exemplo
ShowMessage(tamanho com pacote(packed
record)= +IntToStr(SizeOf(packedRec)));
ShowMessage(tamanho sem pacote com var
{$A-} = +IntToStr(SizeOf(unPackedRec)) FullString, EmptyString : string;
); begin
FullString := alexandre;
EmptyString := ;
end;
{$B-}
end.
// verifica o 4 caractere
if (Length(FullString) >= 4) and
$APPTYPE (FullString[4] = x)
then ShowMessage(O 4th caractere
Controla se o compilador deve gerar uma aplicao GUI ou uma ou uma x)
aplicao console console que pode ser executada a partir da linha de coman- else ShowMessage(O 4th caractere no
do. Corresponde ao comando ProjectOptionsLinkerexe and DLL options x);
Generate console application do menu principal do Delphi.
if (Length(EmptyString) >= 4) and
(EmptyString[4] = x)
{$APPTYPE GUI} OU {APPTYPE CONSOLE} then ShowMessage(O 4th caractere
x)
Exemplo else ShowMessage(O 4th caractere no
x);

program Project1; {$B+}

{$AppType CONSOLE} // verifica o 4 caractere


if (Length(FullString) >= 4) and
uses (FullString[4] = x)
SysUtils; then ShowMessage(O 4th caractere
x)
var else ShowMessage(O 4th caractere no
name : string; x);

maio 2009 19
Project/Options, Compiler, Debug Information, Assertions.
try
if (Length(EmptyString) >= 4) and Exemplo
(EmptyString[4] = x)
then ShowMessage(O 4 th caractere Simularemos um caso em que um cliente possui um saldo inicial de 200
x) Reais e ele poder fazer depsitos e retiradas. A pr-condio para efetivarmos
else ShowMessage(O 4th caractere o depsito de que o valor depositado seja maior que 0, e a ps-condio
no x); que o saldo aps o depsito seja maior que o saldo anterior operao,
except simples mas bastante lgico no?
on E : EAccessViolation do
ShowMessage(E.Message); Para a retirada teremos como pr-condio que o valor a ser retirado
end; no seja maior que o saldo, e como ps-condio, que o saldo final seja
maior que 0.

$BOOLEVAL Comece declarando duas variveis globais do tipo Currency, uma chamada
valor e outra chamada saldo inicializada com o valor de 200:
O mesmo que {$B+|-}
{$BOOLEVAL ON} OU {$BOOLEVAL OFF}
var
valor: Currency;
$C saldo: Currency = 200;
No evento OnClick do boto btRetirar
Controla a gerao de cdigo objeto para asseres( procedure Assert) no digite o cdigo a seguir:
programa fonte. O mesmo que {$ASSERTIONS ON|OFF} procedure TForm1.btRetirarClick(Sender:
Assertions so validaes sobre os fundamentos da lgica de um programa. TObject);
A verificao de um assertion a validao de que uma condio necessria begin
para o algoritimo funcionar, algo que voc supe ser verdadeiro, realmente valor:= StrToCurr(edtValor.Text);
vlido durante a execuo do programa. Assert(saldo > valor, Tentativa de
Em Delphi, a sintaxe de um Assertion a seguinte: retirada invlida);
saldo:= saldo - valor;
Assert(saldo >= 0, O saldo estava
Assert(Condition: Boolean; [Message: negativo);
string]); ShowMessage(Saldo atual: +
CurrToStr(saldo));
end;
Isso quer dizer que Assert um procedimento que aceita uma condio,
e opcionalmente uma mensagem de erro. usado como uma prtica defen-
siva de codificao para garantir o estado do seu programa, pegando falhas Comeamos capturando o valor digitado no edtValor na varivel valor,
antes que aconteam. Se a condio passada para o assert for avaliada como na linha a seguir, inferimos a nossa pr-condio, saldo deve ser maior que
falso, ser gerada uma exceo com a mensagem informada (ou assertion valor para que a retirada possa ser feita, caso essa condio no seja atendida
failure, se no for passada nenhuma), e o mais interessante, por uma mgica (o chamador no cumpriu sua parte do contrato), um erro de assero ser
de compilador a mensagem tambm inclui o nome do arquivo e a linha onde lanado .
a falha ocorreu.
A execuo do cdigo subseqente ento abortada e a retirada nunca
concretizada. Isso foi um erro de assero. Caso consegussemos chegar
penltima linha deste cdigo (Assert(saldo >= 0, O saldo estava negativo);)
ai sim teria ocorrido uma verdadeira exceo, j que pelas regras impostas o
saldo nunca conseguiria ser menor que 0, portanto, em algum momento o
software teria falhado em impor estas regras.

Assertions no so feitas para validao de entrada de dados ou de resulta-


dos de funes, mas sim de pressupostos que deveriam sempre ser verdadeiros,
e se no forem, indicam existe uma bug em alguma parte do seu programa.
Por esse motivo, prtica comum desabilitar a validao de assertions no Vamos agora programar o click do boto btDepositar:
executvel final produzido para distribuio, o que pode ser feito atravs de

20 maio 2009
$DEFINITIONINFO
procedure TForm1.
btDepositarClick(Sender: TObject); O mesmo que {&Y}.
var
SaldoInicial: Currency;
begin $DENYPACKAGEUNIT
SaldoInicial:= saldo;
valor:= StrToCurr(edtValor.Text); Impede (on) que a unit onde a diretiva estiver contida seja colocada em
Assert(valor > 0); pacote.
saldo:= saldo + valor;
Assert(saldo > SaldoInicial, Saldo {$DENYPACKAGEUNIT on } ou {$DENYPACKAGEUNIT off}
incorreto aps um depsito);
ShowMessage(Saldo atual: +
CurrToStr(saldo)); $DESCRIPTION
end;
Insere um texto na entrada de descrio de mdulo no cabealho de um
arquivo.EXE,.DDL ou .BPL.

Como a ps-condio exige que comparemos o saldo ao fim da operao {$DESCRIPTION TEXTO}
com seu prprio valor antes da operao criamos uma varivel local para
guardar o saldo inicial (j que saldo ser alterada no decorrer da rotina), co-
meamos armazenando nesta varivel o valor de saldo antes da execuo da $DESIGNONLY
rotina, logo depois capturamos o valor digitado no edtValor na varivel valor,
a seguir garantimos nossa pr-condio. (Somente em .DPK)
Indica que o pacote onde a diretiva estive contida deve ser compilado
para instalao no IDE do Delphi.
$D
{$DESIGNONLY on} ou {$DESIGNONLY off}
Grava, no arquivo .DCU , informaes para depurao. O mesmo que
{$DEGUBINFO ON|OFF}
{$ENDIF}
$DEFINE Finaliza o bloco de compilao condicional iniciado pela ltima diretiva
{$ifxxx}
Define um smbolo condicional, Utilize {$Undef nome} para cancelar a
definio
$E
{&Define Nome}
Define a extenso dos arquivos executveis gerados pelo compilador
Exemplo {$E extenso}

var Fiz uma pequena listagem de diretivas de compilao e quando possvel


text : string; passei os trechos de cdigo como exemplo. At o prximo artigo
begin
{$Define TESTMODE}
text := Testando;
{$IfDef TESTMODE}
ShowMessage(text = +text); Sobre o autor
{$EndIf}
{$UnDef TESTMODE}
Lus Alexandre de Oliveira Tcnologo em Processamento
text := No estamos testando;
de Dados ,graduado pela Faculdade de Tcnologia de Sorocaba, Consultor
{$IfDef TESTMODE}
tcnico do The Club.
ShowMessage(text = +text);
{$EndIf}
Docente do curso tcnico informtica - Etec de Avar e do curso Tecno-
end;
logia em Redes de Computadores - Fatec Eduvale Avar

maio 2009 21
22 maio 2009
INSTALAO
Neste artigo irei apresentar a nova tecno- Vale ressaltar alguns pontos interessantes:
logia da Microsoft para desenvolvimento web. Para utilizar o Silverlight 2.0, alm de baix-lo
Essa tecnologia capaz de trabalhar com um O silverlight multiplataforma, ou e instal-lo, voc precisar instalar as ferramentas
conceito novo de recursos visuais, como os seja, independente de navegador e Sistema do Silverlight no Visual Studio ou ainda instalar o
de som e vdeo, animaes, alm da pratici- Operacional; Expressino Blend, que uma ferramenta especfica
dade, usabilidade, agilidade e intuitividade de Possui visual consistente; para a criao de interfaces com o Silverlight.
navegao que chamamos de Experincia no O Silverlight controla a demanda da
Usurio (Ux-User eXperience). Ns desenvol- qualidade de vdeo para o dispositivo clien- Sugiro que voc baixe e instale os pacotes que
vedores utilizaremos nosso conhecimento em te; se encontram em:
.Net e de vrias linguagens suportadas pelo L e recebe dados sem precisar atu-
framework da Microsoft. alizar a pgina; http://silverlight.net/GetStarted/
O download do plugin pequeno
(~=4mb); Na sesso GET STARTED BUILDING SILVERLI-
O Silverlight uma tecnologia de apresenta- O Silverlight executado no contexto GHT 2 APPLICATIONS.
o visual desenhada para funcionar em diversas do navegador e no tem acesso mquina do
plataformas e navegadores, ele um plugin que cliente;
renderiza o XAML (eXtensible Application Ma- PRIMEIRO PROJETO
rkup Language principal interface da Microsoft
para Windows Vista) e executa eventos. Utiliza o Antes de comear a desvendar essa tecnologia, Vamos por a mo na massa. Abram o VS 2008,
.Net Frameork para construir aplicaes ricas e importante conhecer um pouco o seu potencial. selecione o Menu File New Projet. Na janela aber-
interativas na web, permite o desenvolvimento Temos uma infinidade de exemplos no site ta (figura1), na rea Project Types, selecione Visual
visual de interfaces de alta produo e de expe- Studio C# e, sem seguida, Silverlight.
rincia interativas que podem ser executadas em HTTP://seiverlight.net.
toda parte: dentro de navegadores, dispositivos
mveis e desktop.
maio 2009 23
Figura 1

Veja a Figura.1

Clique em Ok e aparecer a janela Add Silver-


light Application (Figura 2).

Veja a Figura 2

Nesse momento, voc ir decidir como a


sua aplicao Silverlight ir executar. Clicando na
primeira opo, Add a new ASP.Net Web project
to the solution for host Silverlight, voc cria uma
soluo com dois projetos (ASP.NET e Silverlight)
com ambos integrados. Na segunda opo, voc
cria apenas o projeto Silverlight que pode ser re-
ferenciado por outro projeto. Nas opes escolhi
o Asp.Net Web Site.

Observe o solucion Explorer, conforme fi-


gura 3, a soluo criada com os projetos Web e
Silverlight.
Figura 2

24 maio 2009
Figura 3

No projeto web, o Visual Studio criou um Figura 4


arquivo ASP.NET e outro HTML com o nome de
HelloWordTestPage, que servem para executar e
testar a aplicao Silverlight desenvolvida. Estas
so as duas formas possveis que temos que exibir
uma interface SilverLight no Browser

No projeto Silverlight, por padro so criados


dois arquivos XAML (App.xaml e Page.xaml), cada
um com seus respectivos arquivos de classe (.cs).
O arquivo que vamos trabalhar Page.xaml, que
o controle inicial ativado pela aplicao .
Figura 5
Vamos criar uma pgina bem simples.

esquerda, no toolbox, voc ver que h (figura5). Ainda no mesmo projeto, pelo Visual Studio,
controles que podem ser utilizados para a criao clique com o boto direito do mouse no arquivo
de interfaces Silverlight. Infelizmente, o VS no Veja a Figura 5 Page.xaml, conforme mostrado na figura 6 e clique
muito legal com relao aos controles de arrastar e em Open in Expression Blend....
soltar. Teremos que manipul-lo no XAML. Vamos incluir no evento a listagem3.

Clique no arquivo Page.xaml. Vamos adicionar


private void btnOK_
o cdigo xaml para adiconar o boto conforme
Click(object sender,
Figura 4.
RoutedEventArgs e)
{
Veja a Figura 4 MessageBox.
Show(Ol Pessoal!);
Podemos conferir o resultado na rea de }
Design.

Alm disso, quando voc digita o cdigo no Como voc pode perceber, trabalhar com
Visual Studio, percebemos que os recursos do XAML no to produtivo. Para resolver esse
IntelliSense nos ajudam com as propriedades de problema a Microsoft criou o Blend que tem como
cada objeto. Por fim, foi configurado um evento objetivo compor a interface visual com o XAML, que
(EventHandler) para o clique do Boto. Se voc torna mais atrativo e funcional para o desenvolvi-
clicar com o boto direito do mouse sobre o Even- mento em Silverlight.
tHandler poder abrir o code-behind da pgina Figura 6

maio 2009 25
Feito isso, toda a soluo criada no Visual
Studio aberta no Expression Blend, conforme
figura 7.

Veja a Figura 7

No feche o Visual Studio, pois retornaremos


a ele num outro momento.

Com Expresson Blend, o trabalho se torna mais


tranquilo, com o ato de arrastar o boto ou mesmo
redimensionar e alinhar o objeto.

Logo acima do boto vamos inserir um Text-


Block e um TextBox. Para isso, v at o seu Toolbar,
indicada pela figura 9, e clique com o boto direito
do mouse na caixa T. Selecione o controle TextBlock,
arraste logo acima do boto. Em seguida faa o
mesmo para o TextBox.

Figura 7

Figura 9

Veja a Figura 8

Clique no TextBlock, v para as propriedades


do controle clicando na aba Properties e em segui-
da modifique o texto para Entre com seu nome:
e altere a fonte e o tamanho como desejar,
conforme figura 9

Veja a Figura 9

Clique no TextBox e v para a aba Properties

26 maio 2009
para informar o nome do controle. Coloque a pa-
lavra txtNome no campo Nome. Altere a fonte e o
tamanho como desejar e em Common Properties
apague a palavra textbox do campo text.

Vamos adicionar mais um TextBlock abaixo


do boto . Modifique a propriedade name para
tbkInfo. Clique em foreground na caixa brushes
e escolha a cor vermelha. Apague o valor da pro-
priedade Text.

Durante todos esses passos pelo Blend, deixa-


mos o Visual Studio aberto. Salve o projeto em file
save e feche o Blend.

De volta ao Visual Studio, v par ao arquivo Figura 10


Page.xaml.cs e no evento btnOK_Click vamos infor-
mar uma linha de cdigo. Observe a listagem 4.

Concluso
private void btnOK_
Click(object sender, Com esse pequeno projeto, um simples boto
RoutedEventArgs e) em um formulrio, ficou claro que a interface j
{ ficou mais interessante. Entretanto, todos sabem
tbkInfo.Text =
que o Visual Studio no ideal para se trabalhar
ol amigos do The Club,
com Design. Para isso a Microsoft criou o Blend,
meu nome + txtNome.
Text + !;
uma ferramenta que cria experincia rica na web
} e em aplicaes desktop.

Pronto! Agora d um CRTL + F5 e veja o resul-


tado semelhante a figura 10. Fontes:

http://blogs.msdn.com/charlie/
archive/2009/04/08/silverlight-creating-a-new-
project.aspx

http://weblogs.asp.net/scottgu/pages/silverlight-
tutorial-part-1-creating-quot-hello-world-quot-
with-silverlight-2-and-vs-2008.aspx

Sobre o autor
Lus Alexandre de Oliveira Tc-
nologo em Processamento de Dados ,graduado
pela Faculdade de Tcnologia de Sorocaba,
Consultor tcnico do The Club.

Docente do curso tcnico informtica - Etec


de Avar e do curso Tecnologia em Redes de
Computadores - Fatec Eduvale Avar

maio 2009 27
Dicas DELPHI
Corrigindo erro na distribuio de Aplicaes desenvol- Reg := TRegIniFile.Create(SOFTWARE\
vidas em 2009 com SQL Server MICROSOFT\MS SETUP (ACME)\);
try
S := Reg.ReadString(USER
Nesta dica, abordaremos erro em Delphi 2009, utilizando DBExpress e INFO,DefName,);
banco de dados SQL Server 2005. S := S + #13;
S := S + Reg.ReadString(USER
Para distribuio da aplicao no basta instalar com a mesma o arquivo INFO,DefCompany,);
DBXMSS30.DLL e declarar o Midas dentro do executvel. ShowMessage(S);
finally
Ao rodar o programa teremos a seguinte mensagem de erro, conforme Reg.free;
a figura 1. end;
end;

Criar cores personalizadas (sistema RGB)

Figura 1

Posteriormente se efetuarmos alteraes no registro do Windows para procedure TForm1.Button1Click(Sender:


resolver o problema passar a retornar uma mensagem de erro, descrevendo TObject);
a soluo do problema, onde devemos distribuir junto com a aplicao, a DLL var
dbxmss.dll ao invs da dbxmss30.dll, conforme a figura 2: Vermelho, Verde, Azul: byte;
MinhaCor: TColor;
begin
Vermelho := 0;
Verde := 200;
Azul := 150;
MinhaCor := TColor(RGB(Vermelho,
Verde, Azul));
Form1.Color := MinhaCor;
Figura 2 end;

Finalmente para resolver o problema instalaremos juntamente com a apli-


cao os arquivos *.ini do dbexpress, so eles: dbxconnections.ini e dbxdrivers.
ini, ou um arquivo *.ini da prpria aplicao com as informaes do arquivos Gerar uma tabela no Word atravs do Delphi
citados anteriormente, e o problema estar resolvido.

Colaborao: Gildicley Alves Pereira Taubat/SP Inclua na seo uses: ComObj

Obter o nome do usurio e da empresa informado du- procedure TForm1.Button1Click(Sender:


rante a instalao do Windows TObject);
var
Word: Variant;
begin
procedure TForm1.Button1Click(Sender: { Abre o Word }
TObject); Word := CreateOleObject(Word.
var Application);
Reg: TRegIniFile; try
S: string; { Novo documento }
begin Word.Documents.Add;

28 maio 2009
try { Obtm o comprimento da varivel }
{ Adiciona tabela de 2 linhas e 3 I := GetEnvironmentVariable(PATH,
colunas } nil, 0);
Word.ActiveDocument.Tables.Add(
Range := Word.Selection.Range, if I > 0 then begin
NumRows := 2, SetLength(Result, I);
NumColumns := 3); GetEnvironmentVariable(PATH,
{ Escreve na primeira clula } PChar(Result), I);
Word.Selection.TypeText(Text := end;
Linha 1, Coluna 1); end;
{ Prxima clula }
Word.Selection.MoveRight(12);
{ Escreve }
Word.Selection.TypeText(Text := Aumentar um Edit em tempo de execuo
Linha 1, Coluna 2);
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text :=
Linha 1, Coluna 3); var
Word.Selection.MoveRight(12); Form1: TForm1;
Word.Selection.TypeText(Text := aumenta : boolean;
Linha 2, Coluna 1); xxx : integer;
Word.Selection.MoveRight(12); implementation
Word.Selection.TypeText(Text :=
Linha 2, Coluna 2); {$R *.dfm}
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text := procedure TForm1.Edit1MouseMove(Sender:
Linha 2, Coluna 3); TObject; Shift: TShiftState; X,
{ Auto-Formata } Y: Integer);
Word.Selection.Tables.Item(1). begin
Select; { Seleciona a 1 tabela }
Word.Selection.Cells.AutoFit; { if (x = Edit1.Width -6) or (x = Edit1.
auto-formata } Width -5) then
{ Imprime 1 cpia } begin
Word.ActiveDocument. Edit1.Cursor := crSizeWE;
PrintOut(Copies := 1); end
ShowMessage(Aguarde o trmino da else begin
impresso...); Edit1.Cursor := crDefault;
{ Para salvar... } end;
Word.ActiveDocument. if (aumenta ) and (xxx < x) then
SaveAs(FileName := c:\Tabela.doc); Edit1.Width := (x+6);
finally if (aumenta) and (xxx > x) then
{ Fecha documento } Edit1.Width := (x+5);
Word.ActiveDocument. xxx := x;
Close(SaveChanges := 0); end;
end;
finally procedure TForm1.Edit1MouseDown(Sender:
{ Fecha o Word } TObject; Button: TMouseButton;
Word.Quit; Shift: TShiftState; X, Y: Integer);
end; begin
end; if (x = Edit1.Width -6) or (x = Edit1.
Width -5) then
aumenta := true;
end;
Obter o valor de uma varivel de ambiente
procedure TForm1.Edit1MouseUp(Sender:
TObject; Button: TMouseButton;
function tbGetEnvVar(const VarName: Shift: TShiftState; X, Y: Integer);
string): string; begin
var if (x = Edit1.Width -6) or (x = Edit1.
I: integer; Width -5) then
begin aumenta := false;
Result := ; end;

maio 2009 29
THECLUB PROCEDURE CREATE SETFOCUS INTEGER
DATASNAP SETLENGTH CLIENTDATASET FIREBIRD APPEND
SHOWMESSAGE THREAD UNIT GETMEM MULDIV

30 maio 2009
maio 2009
maio 2009