Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
maio 2009
ndice
Editorial Delphi
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.
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
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.
04 maio 2009
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
Veja na Figura 1.
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
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:
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
Referncias
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
maio 2009 13
case RadioGroup2.ItemIndex of
0:
sdispmode.dmBitsPerPel:=4; // 16 cores
1:
sdispmode.dmBitsPerPel:=8;// 256 cores
2:
sdispmode.dmBitsPerPel:=16; // 65536 cores
end;
sdispmode.dmFields:=DM_BITSPERPEL+DM_PELSWIDTH+DM_
PELSHEIGHT;
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
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
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.
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);
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.
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}
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
Veja a Figura 2
24 maio 2009
Figura 3
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.
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
Figura 7
Figura 9
Veja a Figura 8
Veja a Figura 9
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.
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.
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.
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;
Figura 1
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