Você está na página 1de 68

!

"#$%&%"'() EDITORIAL

Ano 8 - 94ª Edição - 2008 - ISSN 1517990-7 Impresso no Brasil O DataSetProvider tem uma importante função no ciclo de vida da manipulação
de dados em uma aplicação Delphi. Ele é responsável por se comunicar
Corpo Editorial com o engine (dbExpress por exemplo), obter os dados, empacotá-los nos
chamados DataPackets e enviá-los através da memória para o ClientDataSet
Editor Geral (em uma aplicação 2-tier) ou através da interface IAppServer em uma aplicação
Guinther Pauli multicamadas (SOAP, COM+ etc.). O DataSetProvider faz muito mais do que isso,
guinther@devmedia.com.br
e expõe muitas de suas funcionalidades na forma de propriedades e eventos,
Editor Técnico como mostra o Adriano Santos em seu completo artigo sobre o assunto.
Adriano Santos Falando em DataSetProvider, seu irmão ClientDataSet também exerce
adrianosantos@devmedia.com.br importante função em aplicações de banco de dados. Um dos problemas
Equipe Editorial relacionados a esse componente, e que confunde muitos, é a correta manipulação
Fabricio Desbessel, Maikel Scheid, Paulo Quicoli, Luciano Pimenta de erros gerados no SGBD (Firebird por exemplo). No artigo do Rodrigo, veja
Editor de Arte como construir um descendente de ClientDataSet que automaticamente trata
Vinicius O. Andrade os principais erros do servidor, como violação de foreign-key.
viniciusoandrade@gmail.com Na seção Expert, o Gustavo Chaurais continua o artigo sobre Streams. Na
Diagramação parte final do seu artigo, veja como implementar compactação, download em
Adolfo Sabino múltiplos pacotes e resources em suas aplicações. Ainda nesta seção, o
simininu@yahoo.com.br Marco e o Carma aprofundam um assunto muito impor tante, que na verdade
é um desafio nos projetos de software: como mensurar o esforço e o prazo
Capa
Antonio Xavier necessário para desenvolver determinada aplicação, ajudando a reduzir
webdesigner@devmedia.com.br custos e não estropolar o cronograma.
O Maikel continua a série que demonstra a construção de uma locadora
Revisão
Web. E nada melhor que o ASP.NET para construir um sistema completo desse
Gregory Monteiro
gregory@clubedelphi.net
tipo. O Ricardo usa e abusa de seus conhecimentos sobre desenvolvimento
com PocketStudio e continua seu excelente curso que mostra como criar uma
Distribuição aplicação para o sistema operacional PalmOS.
Fernando Chinaglia Dist. S/A Na sessão Easy Delphi, para quem está iniciando, temos o Maikel com dois
Rua Teodoro da Silva, 907 artigos: veja como utilizar os principais controles da VCL na construção de um
Grajaú - RJ - 206563-900 pequeno editor de textos, bem prático. No outro ar tigo, mostra como utilizar os
componentes da paleta Indy para criar um sistema de envio de e-mails. ideal por
exemplo se você precisar enviar e-mails automaticamente da sua aplicação.
Atendimento ao Leitor Para finalizar, o Rodrigo apresenta aquele que considero o melhor recurso da
A DevMedia conta com um departamento exclusivo para o atendi- POO, o polimorfismo, tudo em PHP! Se você já domina ou conhece o assunto,
mento ao leitor. Se você tiver algum problema no recebimento do seu sabe que ele é realmente poderoso. Que tal utilizá-lo agora em suas aplicações
exemplar ou precisar de algum esclarecimento sobre assinaturas, Web com o Delphi for PHP?
exemplares anteriores, endereço de bancas de jornal, entre outros,
entre em contato com: Grande abraço e sucesso com o Delphi!
Carmelita Mulin
www.devmedia.com.br/central/default.asp
(21) 3382-5025
Kaline Dolabella
Gerente de Marketing e Atendimento
kalined@terra.com.br  Guinther Pauli
(21) 3382-5025
 guinther@devmedia.com.br 
Publicidade Microsoft Certified: MCP, MCAD, MCSD.NET
Para informações sobre veiculação de anúncio na revista ou no site Borland Cer tified: Delphi 6, 7, 2005, 2006, Web, Kylix
entre em contato com:
Kaline Dolabella
publicidade@devmedia.com.br

 N Ã O A
Portal do Assinante

Fale com o Editor A ClubeDelphi tem uma novidade para você que comprou este
 E R C
É muito importante para a equipe saber
o que você está achando da revista: que
artigo na revista ou no site ClubeDelphi, entre
em contato com os editores, informando
exemplar na banca de jornal: você pode acessar GRATUITAMENTE,
o Portal do Assinante ClubeDelphi!
 P
tipo de ar tigo você gostaria de ler, que o título e mini-resumo do tema que você Confira o que você encontra no Portal do Assinante:
artigo você mais gostou e qual artigo gostaria de publicar:
- Mais de 560 Vídeo Aulas!
você menos gostou. Fique a vontade
para entrar em contato com os editores - 7 cursos online!
e dar a sua sugestão! Guinther Pauli - Editor da Revista - 1 Livro Eletrônico sobre ADO.NET e BDP!
Se você estiver interessado em publicar um  guinther@devmedia.com.br  - Mais de 150 Artigos Exclusivos!
Para Utilizar o Portal do Assinante, acesse www.devmedia.com.br/clubedelphi/potal.asp
 !"#$# e utilize as informações abaixo: Login: DVM.PL e Senha: STX200
O acesso é válido por 30 di as a partida da data de lançamento da revista. Todos os
meses a ClubeDelphi lhe dará uma senha válida para acessar o portal. Comprando a
A revista ClubeDelphi é parte integrante da assinatura ClubeDelphi
PLUS. Para mais informações sobre o pacote PLUS, acesse: revista regularmente em bancas, você terá acesso ininterrupto a ele!
http://www.devmedia.com.br/clubedelphi/portal.asp
Informativo ClubeDelp

Portal ClubeDelphi +560 vídeo aulas e 7 cursos online


www.clubedelphi.net/portal 

Caro Leitor
O portal ClubeDelphi PLUS é a continuação, na Web, Acesse o portal ClubeDelphi PLUS e receba muito soais para acessar o portal. Se você comprou
da revista ClubeDelphi. O portal recebe um conteú- mais conteúdo sobre Delphi! E o que é melhor: de bancas, utilize o login e senha publicados na pá
do novo todo dia e hoje conta com: i) mais de 560 graça! Todo leitor da revista ClubeDelphi, seja ele do editorial desta edição.
vídeo aulas; ii) 7 cursos online; iii) 1 livro eletrônico assinante ou comprador da revista em bancas, tem Confira a seguir as últimas novidades do portal!
gratuito, de Guinther Pauli, sobre ADO.NET e BDP; iv) acesso ao portal (para quem compra em bancas, o
mais de 150 artigos exclusivos (que não foram pu- acesso é válido por 30 dias). Boa leitura e sucesso!
blicados na revista)!; Se você é assinante, utilize o seu login e senha pes- Equipe DevMedia

Brinde na web desta edição

1
Vídeo
Confira no portal ClubeDelphi PLUS um mini-curso sobre criação de um site com
ASP.NET e SQL Server 2005 Express
http://www.devmedia.com.br/articles/listcomp.asp?txtsearch=Delphi+e+SQL+Server+2005+Express

Gostou das vídeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vídeo aulas e dezenas de
cursos online sobre desenvolvimento de software! Agora você pode comprar as vídeo aulas que preferir e fazer
sua própria combinação de vídeos! Saiba mais em www.devmedia.com.br/creditos

Últimas Vídeo-Aulas
Aprenda a desenvolver sistemas para o Desenvolvendo uma aplicação para PalmOS Construindo uma ferramenta de busca
sistema operacional PalmOS com PocketStucio - Parte XIII a XV de arquivos Parte I e II
Acompanhe as aulas de Ricardo Boaro que falam Veja nessas vídeo-aulas de Ricardo Boaro, como traba- Veja nessas vídeos de Paulo Quicoli como des
unicamente do desenvolvimento de aplicações lhar com aplicações PalmOS com o PocketStudio. volver uma podeorsa ferramenta para busca
para PalmOS utilizando o IDE PocketStudio que arquivos no disco rígido.
é bastante semelhate ao Delphi inclusive utilizan- Mini-Curso Controle de Versão com JEDI VCS
do-se de linguagem Pascal. Veja nesse mini-curso de Adriano Santos como
trabalhar com esta fabulosa ferramenta para con-
Curso Aplicação ASP.NET com Delphi e SQL Server trole de versão e gerenciamento de equipes !

2005 Express-Parte IV a X – Testando a classe de


locação de fitas Como construir um WebServices com Delphi 7
Veja nessa vídeo aula de Luciano Pimenta as prin- Veja nessa vídeo aula de Guinther Pauli como de-
cipais diferenças de sintaxe para Stored Procedu- senvolver e trabalhar com WebServices usando o
res e Triggers entre FireBird e SQL Server 2005. Delphi 7.
Ask The Expert
Perguntas e Respostas
+460 vídeo aulas | 6 cursos online
Dúvidas respondidas por Adriano Santos
(envie as suas para falecom@adrianosantos.pro.br)

Implementando Drag and Listagem 1. Declaração de métodos na seção Private


Drop na aplicação ...
private
!"# %&'()*+, -.)*&+ &(/(0)1+2 .1 { Private declarations }
function  DragEnter(const dataObj: IDataObject;
0340+ *+ 5+'&, 23"36(+*)1+2 3 &37+(2 grfKeyState: Longint; pt: TPoint;
)'')20)1+2 7)') +.0'+ 7'+/')1) 6+1+ + var dwEffect: Longint): HResult; stdcall;
function  DragOver(grfKeyState: Longint;
8"+6+ &3 9+0)2 7+' 34317"+, + 0340+ : 6+; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
function  DragLeave: HResult; stdcall;
")&+< =+20)'() &3 2)>3' 23 : 7+22?@3" A)B3' function  Drop(const dataObj: IDataObject;
grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
322) (17"313*0)CD+ 31 13. 2(2031)< function  _AddRef: Integer; stdcall;
function  _Release: Integer; stdcall;
!"#$% '()*+,- public
...

!"# %*&':, '327+*&3*&+ ) 2.) -.320D+E Listagem 2. Códigos dos métodos para interagir com o mundo externo
2(1, : 7+22?@3" (17"313*0)' (22+ 31 2.) function  TMemoDragDropFrm.DragEnter(const dataObj:
)7"(6)CD+, 1)2 + 7'+6322+ : .1 0)*0+ 0'); IDataObject; grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult;
 >)"F+2+< G3H)1+2 6+1+ A)B3' (22+< begin
dwEffect := DROPEFFECT_COPY;
I'(13(')13*03 &3@31+2 6'()' .1) 2:'(3 Result := S_OK;
end;
&3 A.*CJ32 6)7)B32 &3 (*03')/(' 6+1 + function  TMemoDragDropFrm.DragOver(grfKeyState: Longint;
pt: TPoint; var dwEffect: Longint): HResult;
1.*&+ 3403'*+, H# -.3 7+22(>("(0)'31+2 begin
dwEffect := DROPEFFECT_COPY;
-.3 + )7"(6)0(@+ '363>) + @)"+' &3 .1 Result := S_OK;
0340+ @(*&+ &3 +.0'+ )7"(6)0(@+< I)') (22+ end;
function TMemoDragDropFrm.DragLeave: HResult;
)>') 23. K3"7F(, 2)"@3 + 7'+H30+ 3 &36")'3 begin
Result := S_OK;
)"/.1)2 A.*CJ32 *) #'3) !"#$%&'($ &) )"*# end;
function TMemoDragDropFrm._AddRef: Integer;
6+1+ 23/.3 *) ./-)(0+1 23 begin
Result := 1;
I'322(+*3 +#%, . /0*&# . +  7)') -.3 + end;
function TMemoDragDropFrm._Release: Integer;
K3"7F( 6'(3 + 6)>3C)"F+ &)2 A.*CJ32< L1 begin
23/.(&) &(/(03 + 6M&(/+ &3 6)&) A.*CD+ Result := 1;
end;
6+*A+'13 ) ./-)(0+1 4< function  TMemoDragDropFrm.Drop(const dataObj:
IDataObject; grfKeyState: Longint; pt: TPoint;
I+' A(1 &331+2 )"03')' +2 3@3*0+2 1"2 var dwEffect: Longint): HResult;
var
+%$'#$ 3 1"3$4#%56 &+ A+'1."#'(+ 7'(*6(; aFmtEtc: TFORMATETC;
aStgMed: TSTGMEDIUM;
7)" 7)') 23 )&)70)'31 N2 A.*CJ32 6'()&)2< pData: PChar;
begin
G3H) + 6M&(/+ *) ./-)(0+1 5< if (dataObj = nil) then
raise Exception.Create(‘Ponteiro não á válido!’);
%&(6(+*3 ) )"*# /0$,,78* )+ )4$4 &+ 7'+H3; with aFmtEtc do
0+ 3 7+' A(1, (*2(') .1 6+17+*3*03 9$:5 begin
cfFormat := CF_TEXT;
*) 03") 3 3436.03 + 7'+/')1)< I') 0320)', ptd := nil;
dwAspect := DVASPECT_CONTEN T;
)>') + 5+'& +. 5+'&I)&, &(/(03 )"/.1) lindex := -1;
tymed := TYMED_HGLOBAL;
6+(2), 23"36(+*3 3 31 23/.(&) )'')203;+ end;
OleCheck(dataOb j.GetData(aFmtEtc , aStgMed));
7)') +  9$:5 &+ 7'+/')1) 6'()&+< 9+03 try
pData := GlobalLock(aStgM ed.hGlobal);
-.3 + 0340+ : 0+0)"13*03 6+7()&+< Memo1.Text := pData;
finally
  GlobalUnlock(aStgMed.hGlobal);
  ReleaseStgMedium(aStgMed);
end;
Result := S_OK;
end;
Mudando fontes do programa de Listagem 3. Código dos eventos OnCreate e OnDestroy
uma só vez procedure TMemoDragDropFrm.FormCreate(Sender: TObject);
!(, /+20)'() &3 1.&)' 0+&)2 )2 A+*032 begin
  OleInitialize(nil);
&+ 13. 7'+H30+ ).0+1)0(6)13*03< O+1+ OleCheck(Regist erDragDrop(Handle , Self));
end;
7+22+ A)B3' (22+P
'($6+78 9/:(- procedure   TMemoDragDropFrm.FormDestroy(Sender: TObject);
begin
  RevokeDragDrop(Handle);
  OleUninitialize;
!"# Q)'63"+, .1) )"03'*)0(@) 7)') (22+ end;
23'() 6'()' .1) A.*CD+ -.3 A(B3223 +
Listagem 4. Código para modificação de fontes
23'@(C+ 7') 0(< L22) A.*CD+ 03'() -.3 23'
(17"313*0)&) 31 0+&+2 +2 A+'1."#'(+2< procedure   TForm1.ModificarFontes(AControle:
TWinControl);
G3H)1+2 (22+< procedure  Modificar(AControle: TControl);
var
!"#$ &' ()*) +"),$-) () .$/+0# $ (1 2"$1 f: TFont;
 !"#$%&'  3$4/1"$ &'1 ()*1  !"()'*+"'  4)') begin
if  IsPublishedProp(AControle, ‘Parentfont’)
5$6&$7 and (GetOrdProp(AControle, ‘Parentfont’) =
.. Ord(False))
private and IsPublishedProp(AControle, ‘font’) then
procedure  ModificarFontes( begin
AControle: TWinControl); f := TFont(GetObjectPr op(AControle,
public ‘font’, TFont));
.. f.Name := ‘Courier New’;
end;
end;
I'322(+*3 +#%, . /0*&# . +  7)') -.3 + var
K3"7F( 6'(3 + 6)>3C)"F+ &) A.*CD+ 3 31 i: Integer;
begin
23/.(&) &(/(03 + 6M&(/+ &) ./-)(0+1 ;<   Modificar(AControle);
for i := 0 to AControle.ControlCount - 1 do
9+ 6)2+ 320)1+2 A)B3*&+ .1 ")C+  &5% if  AControle.Controls[I] is TWinControl then
  ModificarFontes(TWincontrol(AControle.
*+2 6+17+*3*032 &+ A+'1."#'(+ )0.)" 3   Controls[I]))
.0("(B)*&+ +2 1:0+&+2 &) )"*# ;68$!"&5 ,  
else
Modificar(AControle.Controls[I]);
7+'0)*0+ &36")'3 ) 2.) )"*# *+ )4$4 &+ end;
Para utilizar a procedure basta incluir alguns controles em tela e em um botão fazer a
7'+H30+< ! *+13 &) )"*# : ;68!"&5< chamada a ela, com mostrado a seguir:

procedure  TForm1.Button1Click(Sender: TObject);


begin
Dê seu feedback sobre esta edição!   u
  e
   s
 F eedb ac  
 
k     ModificarFontes(Self);
     ê end;
     D
A Java Magazine tem que ser feita ao seu o     
s      

 b  
 r  
  e
gosto.Para isso, precisamos saber o que   e
  s
  t
   a
    e
  i   d
você, leitor, acha da revista!       o    ç
    ã

Dê seu voto sobre este artigo, através do link:


www.devmedia.com.br/javamagazine/feedback 
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

Streams
Implemente compactação, download em múltiplos pacotes e resources em
suas aplicações com técnicas avançadas de Streams – Parte 2

9 ) 3&(CD+ )*03'(+', (*(6()1+2 )


6'()CD+ &3 .1) )7"(6)CD+ -.3
A)B .2+ (*03*2(@+ &3 20'3)12
RL&(CD+ STU, -.3 (17"313*0) 6+17)6;
0)CD+, &+V*"+)& 31 1W"0(7"+2 7)6+032
A(*)"13*03, "31+2 + 6+*03W&+ &+ )'-.(;
@+ )0')@:2 &3 .1 +586A%5: &+ 4#%$':
0317+'#'(+<
9) ./-)(0+1 4 7+&31+2 @3' ) (17"3;
13*0)CD+ &3 +.0'+ 1:0+&+ (17+'0)*03,
3 '32+.'632< K320) @3B, .0("(B)'31+2 B$'?C"#%6< L20)1+2 )73*)2 "3*&+ .1)
.1 4#%$': 0317+'#'(+ 7)') 326'3@3' + 3*0')&) 3 &326)'0)*&+;) 6)2+ D%*#$B$4>,#
)'-.(@+ -.3 320)1+2 "3*&+< 9+03 -.3 23H) A)"23< I)') A(*)"(B)', @3H)1+2 + 1:0+;
320)1+2 .0("(B)*&+ <$#3$4#/#%$': 3 &+ 3$,$#$ &326'(0+ *) ./-)(0+1 5<
+,$'"3$4#/#%$':  7)') (22+ R@3H) W"0(1) L203 : 7'+@)@3"13*03 + 1:0+&+ 1)(2
"(20)/31 &) 3&(CD+ )*03'(+'U< I+'0)*0+, 6+17"(6)&+ &) 6")223< G)1+2 7'36(2)'
7+&3'31+2 3203*&3' 322) 6")223 A.0.'); &3 .1 4#%$': 0317+'#'(+ -.3 23'#, *)
13*03 7)') /3')' ) 2)?&) 31 .1 4#%$': @3'&)&3, + 1321+ )'-.(@+ A(*)", 2M -.3
Gustavo Chaurais -.)"-.3', *D+ 2M 31 )'-.(@+2< X3/.31 231 + )'-.(@+ ?$,$#'?5< \(@31+2 &3 A)B3'
(gustavoc@macrovision.com) 2.)2 (17"313*0)CJ32 R*D+ 23 32-.3C) &) (22+ 7+'-.3, )+ ?$,$#'%:54  + )'-.(@+ *+
é Borland Delphi 7 Advanced Certified, Borland &('30(@) =*%#>', *3"32< G3H) *) ./-)(0+1 2 1321+ 4#%$': , &37+(2 *D+ 6+*23/.(1+2
Delphi 2005 for Win32 Certified, Borland Del-
phi 2006 for Win32 Certified e Borland Delphi ) (17"313*0)CD+ &)2 A.*CJ32 <$#3$4#/2 '3&.B(' + 23. 4*E$ 7)') + 0)1)*F+ *+@+
Instructor Certified. Foi palestrante das três #%$': 3 +,$'"3$4#/#%$':< R13*+'U< L223 : + 6+17+'0)13*0+ 7)&'D+
últimas edições da Borland Conference Brasil  X3. A.*6(+*)13*0+ 0)1>:1 : >#2(6+E &3 .1 ;+5:8%$44*5"/#%$':<
e de outros grandes eventos nacionais. Além &326)'0)1+2 &+ )'-.(@+ !"?$@ Y Z 3*0'); ! 7'(13('+ 7)22+ 23'# 3*0D+ 6+7()'
disso, é membro da coordenadoria do GIES- &)2 7)') 7+2(6(+*)' + 6.'2+' &+ 4#%$': 7)') 3203 )'-.(@+ *+@+ 0+&)2 )2 3*0')&)2
SC. Hoje, ministra cursos, presta consultoria
e atua como Software Engineer do projeto &3 "3(0.')[ &37+(2 "31+2 + 0)1)*F+ &+ )0: ) &3 *W13'+ !"?$@ RB$'?C"#%6F;%>$GU<
InstallAnywhere para a empresa norte-ame- *+13, + *+13 3 + 0)1)*F+ &+ )'-.(@+, K37+(2 (/*+')1+2 .1) 3*0')&)
ricana Macrovision Corporation. 0)1>:1 7)') 7+2(6(+*)' + 6.'2+'[ 3, RB$'?C"#%6FA',4$GU 3 6+7()1+2 + '320+ &+
)'-.(@+ R+586C"#*%$/#%$':U< L1 23/.(&), Listagem 1. Métodos GetDestStream e CleanDestStream
2.>20(0.?1+2 + )'-.(@+ A(*)" )0.)" 73"+
function  TCompressor.GetDestStream(const DestFilePath:
*+@+ 3 %$858>,':54   )2 3*0')&)2, 7+(2 string): TStream;
320)2 A+')1 1+&(A(6)&)2< begin
Result := TFileStream.Crea te(DestFilePath, fmCreate);
I'+*0+< ]22+ : 0.&+ + -.3 7'36(2#@)1+2 end;
procedure   TCompressor.CleanDestStream(const DestStream: TStream);
7)') 03'1+2 .1) 6")223 0+0)"13*03 A.*; begin
  DestStream.Free;
6(+*)" 6+1 6+17)60)CD+ 7)') 1W"0(7"+2 end;
)'-.(@+2< %/+') 7'36(2)1+2 6+*20'.('
.1) *"#$%&'($ 6+1 + .2.#'(+< Listagem 2. Método ReadEntry

procedure   TCompressor.ReadEntry(WriteResult: Boolean);


Criando um exemplo completo de var
Buffer: TBuffer;
compactação NameLength: Integer;
begin
9+ 7'+H30+ )0.)", @+6^ &3@3 03' (/*+'); FStreamRead.Rea d(Buffer, 4);
if WriteResult then
&+ + A5%: 7)&'D+, /3')&+ 73"+ K3"7F(< FStreamWrite.Wri te(Buffer, 4);
NameLength := BinToInt(CopyFr omBuffer(Buffer, 4));
%/+'), @+"03 ) 3"3, 1.&3 23. *+13 7)') FStreamRead.Rea d(Buffer, NameLength);
_A1O+17'322(+*` 3 )&(6(+*3 .1 6+1; if WriteResult then
FStreamWrite.Wri te(Buffer, NameLength);
7+*3*03 ;;55,H'%< % 3203, )&(6(+*3 6(*6+ FStreamRead.Read (Buffer, 8);
if WriteResult then
;;55,H>##5"4 R_0>93V`, _0>!73*`, _0>%; FStreamWrite.Wri te(Buffer, 8);
ReadFile(BinToI nt64(CopyFromBuff er(Buffer, 8)), WriteResult);
&&`, _0>a31+@3` 3 _0>L40')60`U< %&(6(+*3 end;
0)1>:1 .1 ;3H<%*?R_&>/L*0'(32`U, Listagem 3. Método Delete
.1 ;+,*$"#3'#'/$#   R_6&2L*0'(32 I U,
procedure  TCompressor.Delete(Index: Integer);
.1 ;3'#'/5>%($  R_&2L*0'(32I U, &+(2 var
;18$"3*',5J4 R_!73*K()"+/` 3 _%&&b("3; i: Integer;
ATempStream: TFileStream;
K()"+/`U 3 .1 ;/'=$3*',5JR_X)@3K()"+/IU< begin
  RestartStream(fmOpenRead);
!76(+*)"13*03, )&(6(+*3 .1 ;!:'J$K*4# try
ATempStream := TFileStream.Cre ate(FFilePath + ‘.tmp’, fmCreate);
7)') )&(6(+*)' (1)/3*2 )+ ;;55,H'%< try
O+*A(/.'3 ?LJC"#%*$4 , )7+*0 )*&+;+ FStreamWrite := TCompressionStr eam.Create(clMax , ATempStream);
FStreamRead := TDecompressionSt ream.Create(FInt ernalStream);
7)') ?4C"#%*$4  3 3203 7)') + (?4C"#%*$4< for i := 0 to Index - 1 do
  ReadEntry(True);
9) 7'+7'(3&)&3 18#*5"4 &3 ?LJC"#%*$4 ,   ReadEntry(False);
  CopyEntireStream;
)6'3263*03 ?J9>,#*/$,$(# < %&(6(+*3 +   finally
23/.(*03 A("0'+ )+2 6+17+*3*032 18$"2  
 
CloseStreams;
ATempStream.Free;
3*',5J 3 /'=$3*',5JE _O".>3K3"7F( c(7   end;
  finally
b("3 Rd<6&BUed<6&B`< X3. A("0'+ (*(6()" &3@3   CloseStreams;
end;
23' 6+*A(/.')&+ 7)') _d<6&B`< K^ 0)1>:1   DeleteFile(FFilePath);
.1 0?0."+ )+2 &(#"+/+2< %&(6(+*3 ) +7CD+ RenameFile(FFil ePath + ‘.tmp’, FFilePath);
  RestartStream(fmOpenRead);
5&7,,5M9>,#*/$,$(#  N 7'+7'(3&)&3 18#*5"4 FStreamRead := TDecompressionStr eam.Create(FInter nalStream);
try
&+ 6+17+*3*03 7??A*,$3*',5J<   PopulateEntries;
  finally
%>') + A*$,?4 C?*#5% &+ 6+17+*3*03 (?2   CloseStreams;
4C"#%*$4 3 )&(6(+*3 +2 23/.(*032 6)17+2E   end;
end;
_I%\f` R4#%*"J ; 4*E$E ghiU, _b]jLkX]cL`
R,'%J$*"#U 3 _L9\alk]9KLm` R*"#$J$% ; =*4*2
L,$E A',4$U< %/+') 6"(-.3 6+1 + >+0D+ &('3(0+ *) 23CD+ 8%*='#$ &) 6")223 ;&:+5:8%$44*5" 23' (17"313*0)&+ &) 1321) 1)*3(')<
31 (?4C"#%*$4  3 23"36(+*3 +%$'#$ 3'#'/$#< 3 @)1+2 N (17"313*0)CD+ &+ 1:0+&+ B$2 I+':1, 0'+-.3 /'=$3*',5J 7+' 18$"3*'2
! 6+17+*3*03 (?4C"#%*$4 )'1)B3*)'# ,5'?C"#%*$4 6+*A+'13 ) ./-)(0+1 ;< ,5J  3 &3 ;%>$ 7)') A',4$  *) 6+*20'.CD+
)2 3*0')&)2 &+ ;+5:8%$445%< L20)1+2 L203 1:0+&+ : 1.(0+ 2(17"32, 320)1+2 &3 A+5:8%$445%< %/+'), .1) @3B 6'()&+
.0("(B)*&+ .1 ;+,*$"#3'#'/$# 6+1 &)&+2 )7)/)*&+ +2 &)&+2 &3 (?4C"#%*$4 3 )&(; A+5:8%$445% , : *36322#'(+ &320'.?;"+< b);
31 131M'() 73") A)6("(&)&3 31 23 0'); 6(+*)*&+ ) 3"3 0+&)2 )2 3*0')&)2 &+ 6+1; '31+2 (22+ )0')@:2 &+ 3@3*0+ 1"3$4#%56
 >)"F)' 6+1 +2 &)&+2 3 6+1 + ;3H<%*?< 7'322+'< %":1 &3 320)'1+2 6+*0'+")*&+ &+ A+'1."#'(+E
!76(+*)"13*03, @+6^ 7+&3 6+*A(/.')' ) )0.)"(B)CD+ &+ ?LJC"#%*$4 )0')@:2 &+2
if  Assigned(FCompressor) then
) 7'+7'(3&)&3 !"?$@A*$,?N':$4 &+ (?2 1:0+&+2 3*4'L,$+5"#%5,4  3 C"'L,$+5"#%5,4<   FreeAndNil(FCompressor);
4C"#%*$4   7)') _I%\f` 7)') +'&3*)' )2 G)1+2 (17"313*0)' )2 +73')CJ32 N$M
3*0')&)2 7+' 3203 6)17+< I+2(6(+*3 +2 3 18$"< I)') (20+, 1)*(7."3 + 3@3*0+ b(*)"13*03, @)1+2 )2 +.0')2 +73')CJ32<
6+17+*3*032 6+*A+'13 ) </0,$( 2< 1"+,*(O &+ >+0D+ #LN$M &3 )6+'&+ 6+1 O+13631+2 73"+ 7??< I+'0)*0+ 1)*(7.;
%*032 &) (17"313*0)CD+ &3 -.)"-.3' ) ./-)(0+1 =< "3 + 3@3*0+ &+ >+0D+ #L7?? 23/.(*&+ )
3@3*0+, &36")'3 A+5:8%$445% R;+5:8%$445%U ! 3@3*0+ 1"+,*(O  &+ >+0D+ #L18$" &3@3 6+&(A(6)CD+ 7'3@(20) *) ./-)(0+1 ><
Listagem 4. Código do método ReloadEntries
Q)(2 .1 1:0+&+ >)20)*03 2(17"32, *+
-.)" 7)22)1+2 )+ A+5:8%$445%  0+&+2 +2
procedure TfmCompression.ReloadEntries;
var )'-.(@+2 ) 23'31 )&(6(+*)&+2< I)') )
i: Integer;
Entry: TCompressionEntry ;
+73')CD+ &3 C@#%'(# , (17"313*03 + 3@3*0+
begin 1"+,*(O &+ >+0D+ #LC@#%'(# R./-)(0+1 ?U
  cdsEntries.DisableControls;
  cdsEntries.EmptyDataSet; % A.*CD+ /$,$(#3*%$(#5%6 *D+ : 1.(0+
try
for i := 0 to FCompressor.Entri esCount - 1 do
6+*F36(&)< L20) 23'@3 7)') -.3 + .2.;
  begin
Entry := FCompressor.Entri es[i];
#'(+ 7+22) 23"36(+*)' .1 &('30M'(+,
6+1+ .1 &(#"+/+ -.)"-.3'< I)22)1+2
  cdsEntries.Append;
cdsEntriesPATH. AsString := Entry.Path; + +'8#*5" , + &( '30M'(+ (*(6()" 3 7)')
cdsEntriesFILE_ SIZE.AsLargeInt := Entry.
  FileSize;
+*&3 3*@()' + &('30M'(+ 23"36(+*)&+<
 
cdsEntriesENTRY _INDEX.AsInteger := i;
cdsEntries.Post;
L*0D+, 7)') 6)&) "(*F) 23"36 (+*)&) *+
  end; ?LJC"#%*$4   320)1+2 6F)1)*&+ + 1:;
  finally
  cdsEntries.EnableControls; 0+&+ C@#%'(# &+ 6+17'322+' 7)22)*&+
  end;
end;
+ !"?$@   &) 3*0')&), )'1)B3*)&+ *+
1:0+&+ B$,5'?C"#%*$4<
Listagem 5. Código do botão Novo 9+@)13*03, + 6)2+ 1)(2 6+17"(6)&+<
procedure TfmCompression.tbNewClick(Sender: TObject); Q)*(7."3 + 3@3*0+ 1"+,*(O &+ >+0D+ #L3$2
var
AFileName: string;
,$#$ 7)') .2)*&+ + 6M&(/+ &) ./-)(0+1 @<
begin I)') 3*03*&3' + 6M&(/+ )*03'(+', 7'36(;
if SaveDialog.Execu te then
  begin 2)1+2 73*2)' 31 .1) +73')CD+ *) -.)"
AFileName := SaveDialog.File Name;
if Assigned(FCompre ssor) then 320D+ 23*&+ '31+@(&+2 @#'(+2 '3/(20'+2
  FCompressor.Free;
FCompressor := TCompressor.Crea te(AFileName,Tru e);
&3 .1) 6+"3CD+< O)2+ '31+@)1+2 .1
Caption := ExtractFileName(A FileName); '3/(20'+ 3, 7+203'(+'13*03, 03*031+2 '3;
  ReloadEntries;
  end; 1+@3' +.0'+ &3 ?*&(63 1)(+', + 23/.*&+
end;
'3/(20'+ 320)'# 23*&+ '31+@(&+ &3 1);
*3(') (*6+''30)< I+'0)*0+, @)1+2 A)B3' )
+73')CD+ 73/)*&+ &+ 1)(+' ?*&(63 ) 23'
'31+@(&+ 7)') + 13*+'<
I+' A)6("(&)&3, @)1+2 .0("(B)' .1
;/#%*"JK*4#  7)') )'1)B3*)' +2 ?*&(632<
% 7'(13(') 0)'3A) : 3*0D+ )"(13*0)' +
;/#%*"JK*4# 6+1 +2 ?*&(632 &)2 3*0')&)2 )
23'31 '31+@(&)2< % 23/.*&) 6+17'33*;
&3 7'+6.')' + 7'M4(1+ ?*&(63 1)(2 )"0+
&) "(20), /.)'&#;"+ 3 2)"@)' 2.) 7+2(CD+
*) 6+"3CD+ &3 ?*&(632< %7M2 (22+, ?$,$#'2
:54 ) 3*0')&) 3 ) 346".?1+2 &) 6+"3CD+<
n.)*&+ 0+&+2 +2 '3/(20'+2 A+'31 '31+;
@(&+2, 2(17"3213*03 6)''3/)1+2 0+&)2
)2 3*0')&)2 *+@)13*03<
I'+*0+< 9+22) @3'2D+ 2(17"(A(6)&) &+
D*"P*8 7)') 0')>)"F)' 6+1 )'-.(@+2 <(?E
320# 7'+*0) 7)') 23' .0("(B)&)< G+6^ 7+&3
)/+') 03*0)' )&(6(+*)' +.0'+2 '36.'2+2
6+1+ 6'(70+/')A() )+ 23. )'-.(@+ 6+1;
7)60)&+< %":1 &(22+, 6+1+ 6'()1+2 .1)
Figura 1. Interface gráfica do projeto Compression 6")223, @+6^ 7+&3 31>.0(' 322) A3'')13*;
0) 31 2.) )7"(6)CD+ 7)') 0')*27+'0)'
)'-.(@+2 6+1 1)(2 A)6("(&)&3<

Trabalhando com Resources


\+&+ 7'+/')1) 5(*&+V2 &3 (*03'A)63
/'#A(6) )7'323*0) .1) 2:'(3 &3 '36.'2+2 -.3
*D+ 2D+ )73*)2 6M&(/+ 6+17(")&+, 6+1+E
?6+*32, 6.'2+'32, 2+*2, (1)/3*2, &3*0'3 Listagem 6. Código do botão Add
+.0'+2< ! 7'M7'(+ 5(*&+V2 *+2 73'1(03 procedure   TfmCompression.tbAddClick(Sender: TObject);
(*23'(', 31 *+22+2 3436.0#@3(2, -.)"-.3' var
i: Integer;
0(7+ &3 )'-.(@+< L2032 7+&31 23' 6+17("); Entry: TCompressionEntr y;
begin
&+2 31 )'-.(@+2 &3 '36.'2+2 RQBC/U 3 3*0D+   cdsEntries.DisableControls;
try
31>.0(&+2 31 .1) )7"(6)CD+< if  AddFileDialog.Execute then
L20) : ) '363(0) &3 >+"+ 7)') ) .0("(B)CD+ begin
for i := 0 to AddFileDialog.Files.Count - 1 do
&3 )'-.(@+2 &3 '36.'2+2E begin
Entry := FCompressor.Add(A ddFileDialog.
Z< O'()1+2 .1 )'-.(@+ QB+ , '3A3'3*6()*;   Files[i]);
  cdsEntries.Append;
&+ +2 )'-.(@+2 -.3 ('D+ 6+*20)' *+ QBC/[ cdsEntriesPATH. AsString := Entry.Path;
g< O+17(")1+2 + )'-.(@+ QB+ 7)') QBC/[  
cdsEntriesFILE_ SIZE.AsLargeInt := Entry.
FileSize;
T< 9+ K3"7F(, .0("(B)1+2 ) &('30(@) RSB cdsEntriesENTRY _INDEX.AsInteger := FCompressor.
EntriesCount - 1;
7%T>*=5QBC/U   7)') (17+'0)' + )'-.(@+   cdsEntries.Post;
&3 '36.'2+2[ end;
end;
o< b)B31+2 .2+ &) 6")223 ;B$45>%($/#%$2 finally
  cdsEntries.EnableControls;
': 7)') ) "3(0.') &+2 )'-.(@+2<   end;
end;

9+22+ 7'(13('+ 34317"+ : .1 6"#22(6+ Listagem 7. Código do botão de extração


&) 6.20+1(B)CD+ &+2 '36.'2+2 &3 .1) procedure   TfmCompression.tbExtractClick(Sender: TObject);
)7"(6)CD+< O3'0)13*03, 23 *.*6) .0("(B+., var
  ExtractTo: string;
('# .0("(B#;"+ .1 &() 31 2.) )7"(6)CD+< i: Integer;
begin
p 1.(0+ 6+1.1 A)B3'1+2 .2+ &3 >(>"(+; if SelectDirectory(‘Extract to’, ‘c:\’, ExtractTo)
then
036)2 3403'*)2 )+ *+22+ 7'+/')1)< O+*; begin
  cdsEntries.DisableControls;
0.&+, + A)0+ &3 03'1+2 &3 &(20'(>.?;")2 try
 H.*0+ )+ *+22+ 3436.0#@3" *+2 (*6+1+&) for i := 0 to  dbgEntries.SelectedRows.Count-1 do
begin
 >)20)*03< I+'0)*0+, @)1+2 (*6".?;")2 31   cdsEntries.GotoBookmark(Pointer(dbgEntries.
  SelectedRows.Items[i]));
*+22) )7"(6)CD+< K3203 1+&+, 7+&3'?);   FCompressor.Extract(cdsEntriesENTRY_INDEX.
AsInteger, ExtractTo);
1+2 31>.0(' 0)1>:1 + 3436.0#@3" A(*)" end;
3 340')(' 0+&+2 3"32 )*032 &) 3436.CD+  
 
finally
cdsEntries.EnableControls;
7'+7'()13*03 &(0)<   end;
  end;
O'(3 R6+1 + 7'M7'(+ >"+6+ &3 *+0)2U .1 end;

)'-.(@+ 6+1 ) 3403*2D+ QB+  *+ &(26+


Listagem 8. Código para remoção de arquivo
R7+' 34317"+E B$(>%454QB+  *) 7)20) &)
)7"(6)CD+U< X3. 6+*03W&+ A(6)'() 7)'36(&+ procedure   TfmCompression.tbRemoveClick(Sender: TObject);
var
6+1 + 23/.(*03E i: Integer;
ToRemove: TStrings;
EntryIndexToRem ove, iToRemove: Integer;
DLL DLLFILE caminho_para_biblioteca.dll begin
  cdsEntries.DisableControls;
ToRemove := TStringList.Creat e;
% 7'(13(') 6+".*) 6+*0:1 ) 6F)@3 -.3 try
(&3*0(A(6)'# + )'-.(@+ 6+1+ '36.'2+ 3 for i := 0 to  dbgEntries.SelectedRows.Count-1 do
begin
7+&3'# 23' '37'323*0)&) 7+' -.)"-.3'   cdsEntries.GotoBookmark(Pointer(dbgEntries.
  SelectedRows.Items[i]));
7)")@')< % 23/.*&) 6+".*) 6+*0:1 +   ToRemove.Add(cdsEntriesENTRY_INDEX.AsString);
end;
0(7+ &3 )'-.(@+< !2 1)(2 6+1.*2 2D+E while ToRemove.Count > 0 do
H!;97V , !+1N   , +)B/1B , WVC< , D7XC , begin
EntryIndexToRemov e := -1;
;CY;  3 B+37;7 R/3*:'(6+U< % 03'63(') iToRemove := -1;
for i := 0 to ToRemove.Count - 1 do
6+".*) 6+*0:1 + 6)1(*F+ R)>2+".0+ +. begin
if  StrToInt(ToRemove[i])>EntryIndexToRemove
'3")0(@+U 7)') + )'-.(@+< j31>'3;23 &3 then
begin
-.3 (*W13')2 "(*F)2 R3*0')&)2U 7+&31 iToRemove := i;
23' )&(6(+*)&)2 )+ )'-.(@+ QB+< %7+*03 EntryIndexToRem ove := StrToInt(ToRemov e[i]);
end;
7)') -.)"-.3' >(>"(+036) 31 23. 2(2031)  
end;
FCompressor.Delete(EntryIndexToRemove);
7)') 0320)'<   ToRemove.Delete(iToRemove);
end;
O+1 + A+*03 QB+  7'+*0+, &3@31+2 finally
  cdsEntries.EnableControls;
6+17("#;"+ 7)') .1 QBC/< I)') (22+, @+6^   ToRemove.Free;
7+&3 .0("(B)' + 7'+/')1) HB++Z[Q$@$ , *) end;
  ReloadEntries;
7)20) L*" &+ 3$,80*< %>') .1) "(*F) &3 end;

6+1)*&+ 3 &(/(03E
[caminho para a pasta bin]\brcc32.exe
[arquivo .RC 
]
/3< ! ;B$45>%($/#%$': : 1.(0+ 7)'36(&+ 1:0+&+2 32736()(2E /'=$;5A*,$ 3 /'=$;5/2
6+1 + ;9$:5%6/#%$':  3 *36322(0) &3 #%$':< ]22+ : 1.(0+ W0(" 7+'-.3 *D+ 7'36(;
9) 7)20) )0.)" 23'# /3')&+ .1 )'-.(@+ 0'^2 7)'q130'+2 7)') 2.) 6+*20'.CD+< ! 2)1+2 &3 .1 ;A*,$/#%$': 7)') 2)"@)' 23.
<BC/ 6+1 + 1321+ *+13 &3 23. A+*03 7'(13('+ : + \95?>,$ , +. 23H), + 0'"?,$ 6+*03W&+< ! 1:0+&+ /'=$;5A*,$  H# A)B (22+
QB+ < O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ &+ 1M&."+ '30+'*)&+ *+ 6)''3/)13*0+ 7)') *M2< L 320) : ) +73')CD+ 7'323*03 31
6+1+ _a32+.'63Kjj<&7'`< 9) >"*# &+ &3 .1) )7"(6)CD+rKjj< 9+ 6)2+, + )'; *+22+ 34317"+< L20)1+2 2(17"3213*03
A+'1."#'(+ 7'(*6(7)", &(/(03E -.(@+ &3 '36.'2+2 A+( 6+17(")&+ H.*0+ 6'()*&+ + 4#%$': 3 6F)1)*&+ 23. 1:0+&+
N )7"(6)CD+ 6+''3*03, 7+'0)*0+, .0("(B); /'=$;5A*,$< Q.(0+ 2(17"32, *D+P
{$R caminho_para_o_arquivo_de_recurso_
compilado.RES} '31+2 \!"4#'"($< 9+ 6)2+ &3 -.3'3'1+2 O+1+ &(6), 7+&31+2 .0("(B)' + 7"./;(*
6)''3/)' '36.'2+2 &3 +.0')2 )7"(6)CJ32 /*:8,$ B$45>%($ C?*#5% R</0,$( 4U, &3 1(*F)
%&(6(+*3 .1 >+0D+ )+ A+'1."#'(+ 3 7)22)'?)1+2 + \95?>,$ &) )7"(6)CD+ ).0+'(), 7)') ) 1)*(7.")CD+ &+2 )'-.(;
(17"313*03 23. 3@3*0+ 1"+,*(O (/.)" ) &323H)&)< ! 23/.*&+ 7)'q130'+ : ) 6F); @+2 QB+< O+1 3"3 @+6^ 7+&3 A)6("13*03
./-)(0+1 A3 ]*(6(3 + 7'+/')1) 3 6"(-.3 *+ @3 -.3 (&3*0(A(6) + '36.'2+, (*A+'1)&) )&(6(+*)' *+@+2 )'-.(@+2 R>.26)*&+;+2
 >+0D+< % Kjj 23'# 340')?&) 7)') ) 1321) *+ QB+< L + 03'63('+ : + 0(7+ &3 '36.'2+, 7+' &(#"+/+2 32736()(2U, 6+17(")' 7)')
7)20), 6+1 + *+13 $@#%'(#$?Q?,,< 0)1>:1 (*A+'1)&+ *+ QB+< )'-.(@+2 QBC/ , &3*0'3 +.0')2 A.*6(+*);
a3"31>')*&+ + 6+*63(0+ &3 4#%$':4 &+ % 6")223 ;B$45>%($/#%$': , >31 6+1+ "(&)&32 >)20)*03 W03(2< ! )22(203*03 "F3
(*?6(+ &+ )'0(/+, A(*)"13*03 A36F)1+2 )2 + ;9$:5%6/#%$': , F3'&)1 &3 ;+>4#5:2 )H.&) (*6".2(@3 ), ')7(&)13*03, 23"36(+;
7'(*6(7)(2 6")2232 -.3 + )22.*0+ )>')*;  9$:5%6/#%$':< L20) W"0(1) (*0'+&.B &+(2 *)' + 0(7+ &3 '36.'2+ ) 23' )&(6(+*)&+<
X3. &+V*"+)& 7+&3 23' A3(0+ )0')@:2
&+ +5?$+$"#%', &) +5?$<$'% R((Q(5?$J$'%Q
Listagem 9. Código do botão de extração dos recursos
(5:G , 7'+6.')*&+;23 73"+ ).0+' <>4#'=5
procedure TForm1.Button1Click(Sender: TObject); +0'>%'*4< X3. 6M&(/+ A+*03 320# (*6".2+ 3
var
Stream: TResourceStream; : 1.(0+ (*03'322)*03 7)') 320.&+<
const
EXTRACTED_DLL_NA ME = ‘extracted.dll’;
begin
Stream := TResourceStream.C reate(HInstance, ‘DLL’, www.devmedia.com.br/clubedelphi/portal.asp
‘DLLFILE’);
try Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma
  Stream.SaveToFile(EXTRACTED_DLL_NAME);
MessageDlg(‘Arqui vo extraído para: ‘ +
vídeo aula de Adriano Santos que mostra como trabalhar com o plug-in
  IncludeTrailingPathDelimiter(ExtractFilePath( Simple Resource Editor.
Application.Exe Name)) + EXTRACTED_DLL_NA ME,
mtInformation, [mbOk], 0); www.devmedia.com.br/articles/viewcomp.asp?comp=5476&hl=
  finally
  FreeAndNil(Stream);
  end;
end;
G)1+2 )/+') 1(20.')' .1 7+.6+ )2
6+(2)2< O+*20'.('31+2 .1 34317"+ -.3
.0("(B)'# .1 )'-.(@+ 6+17'(1(&+ )0');
@:2 &+ 34317"+ +5:8%$44*5"<
O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+
B$45>%($P*8Q?8%< %&(6(+*3 ) 3"3 .1) *+@)
)"*#  3 2)"@3;) 6+1+ B$4+5:8%$445%Q8'4<
%&(6(+*3 0)1>:1 ) )"*# +5:8%$445%Q8'4 ,
6+*20'.?&) )*03'(+'13*03<
9) 23CD+ )4$4 &3 B$4+5:8%$445% , (*2(')E
+5:8%$445% , +,'44$4 , /64)#*,4 3 D*"?5M4<
%/+'), &36")'3 .1) 6")223 ;B$4+5:8%$42
45% , 3203*&3*&+ ;+5:8%$445%< K36")'3 3
(17"313*03 + 23/.(*03 1:0+&+ R6+1 )
&('30(@) %$*"#%5?>($UE
constructor   TResCompressor.Create(const
ResName:
string);
begin
FResName := ResName;
inherited Create(‘’, False);
end;

L &36")'3 AB$4N':$  *) 23CD+  8%*='#$


6+1+ 23*&+ &+ 0(7+ 4#%*"J< K36")'3 0)1;
Figura 2. Simple Resource Editor  >:1 3 (17"313*03 + 23/.(*03 1:0+&+E
procedure  TResCompressor.
ExtractToStream(Index:
%/+'), @)1+2 6+*20'.(' *+22+ )'-.(@+ L, 23 @+6^ )(*&) *D+ 6)*2+. &3 3431;
Integer; const ExtractTo: TStream); &3 '36.'2+2< %>') + 7'+/')1) +5:8%$42 7"+2, @)1+2 A(*)"(B)' 6+1 .1 1.(0+
begin
FDestStream := ExtractTo; 4*5" 3 6'(3 .1 )'-.(@+ 6+*03*&+ )"/.1)2 7+.6+ 6+*F36(&+E 6+1+ )"03')' %$45>%($4
inherited Extract(Index, ‘’);
end;
A(/.')2 &+ 0(7+ ]8J< O'(3 .1 )'-.(@+ QB+ &3 +.0')2 )7"(6)CJ32<
3 )&(6(+*3 ) 3"3 ) 23/.(*03 "(*F)E %(*&) *+ 34317"+ )*03'(+', )&(6(+*3 )
%&(6(+*3 0)1>:1 A3$4#/#%$': N 23CD+ 23/.(*03 "(*F) *) 23CD+ !"#$%&'($ &) )"*#
IMAGESZIP RCDATA caminho_para_arquivo_
 8%*='#$ &) 6")223< L203 1:0+&+ 23'# .0("(; compactado.cdz &+ A+'1."#'(+E
B)&+ 7)') 340')('1+2 .1 %$45>%($ 7)')
resourcestring
.1 4#%$': -.)"-.3'< O+17("3 + QB+ 7)') .1 QBC/ 3 + '3A3; TITLE = ‘not changed’;
G+6^ 23 "31>') &+2 0'^2 1:0+&+2 '3*6(3 *+ A+'1."#'(+ 7'(*6(7)", )0')@:2 &)
@('0.)(2 &) 6")223 ;+5:8%$445%P I+(2, &('30(@) RSB 7%T>*=5QBC/U< %&(6(+*3 )+ A+'; B$45>%($ /#%*"J4 2D+ 6+1+ 6+*20)*032< 9+
03*F) 63'03B) &3 -.3 *D+ 320D+ *) 23CD+ 1."#'(+ 7'(*6(7)" &) )7"(6)CD+ .1 ;V'*"#2 3*0)*0+, 7+&31+2 1+&(A(6)' 23. 6+*03W&+
 8%*='#$   &) 6")223 ;+5:8%$445%  R&3@31 H5@ R)>) /64#$:U< 9) 2.) )"*# , (*2(') ]8$J *) .0("(B)*&+ 7'+/')1)2 -.3 )"03'31 %$45>%2
320)' 7'3A3'3*6()"13*03 31  8%5#$(#$?U 3 23CD+ )4$4 3 1)*(7."3 + 3@3*0+ 1"+%$'#$ ($4 6+1+ + B$45>%($ \'(O$% +. + D5%O4058
'3&36")'3;+2 *) 6")223 ;B$4+5:8%$445% &(/(0)*&+ + 6M&(/+ &) ./-)(0+1 2B< C?*#5%< L22)2 2D+ 1.(0+ .0("(B)&)2 31
6+1 ) &('30(@) 5=$%%*?$< ! )0'(>.0+ &3 ! -.3 3203 1:0+&+ 320# A)B3*&+ 23 7'+/')1)2 -.3 &323H)1+2 (*03'*)6(+*);
;+5:8%$445% ,  A!"#$%"',/#%$': , 0)1>:1 '3A3'3 N 6'()CD+ &3 .1 ;B$4+5:8%$445% , "(B)', 7+(2 7+&31+2 )"03')' 23. 6+*03W&+
&3@3 23' 6+"+6)&+ 7'3A3'3*6()"13*03 *) + -.)" ('# 6)''3/)' + QBC/ , 6+*03*&+ + 7)') +.0') "?*/.) 231 03' &3 %$(5:8*,'% )
2.) 23CD+ 8%5#$(#$?< )'-.(@+ &)2 A(/.')2 6+17)60)&+< %7M2 )7"(6)CD+ 0+&)< %&(6(+*3 6+1+ 7'(13(')
! 1:0+&+ B$4#'%#/#%$': &3@3 23' .0("(; 2.) )>3'0.'), 7+&31+2 6F)1)' 23. "(*F) &+ 1)*(7.")&+' &+ 3@3*0+ 1"+%$'#$
B)&+ 7)') ) (*(6()"(B)CD+ &+ 4#%$': (*03'; 1:0+&+ C@#%'(#;5/#%$':   7)22)*&+ .1 &+ A+'1."#'(+ + 23/.(*03E
*+< I+'0)*0+, + (*(6()"(B)'31+2 6+1+ .1 ?*&(63 )"3)0M'(+< b(*)"13*03, 6)''3/)1+2 Caption := TITLE;
;B$45>%($/#%$': 6+*A+'13 23/.3E N A(/.') 31 AW8$J R&36")'3;) *) 6")223 &+
A+'1."#'(+U< s0("(B)1+2 .1 ;9$:5%6/2 O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+
procedure   TResCompressor.RestartStream(
Mode: Word); #%$': 7)') 6)''3/#;")< %/+'), *+ 3@3*0+ _a32+.'63s7&)03<&7'`< 9+ A+'1."#'(+
begin
FInternalStream := TResourceStream.C reate( 1"V'*"# &+ ;V'*"#H5@ , (17"313*03 + 7'(*6(7)", )&(6(+*3E 0'^2 ;K'L$, , 0'^2
end;
HInstance, FResName, RT_RCDATA); 6M&(/+ 23/.(*03< ;C?*#R_3&I'+/')1`, _3&a32t3u` 3 _3&G);
procedure   TForm1.PaintBox1Paint(Sender:
".3`U, 0'^2 ;H>##5"R_>0j(20`, _>0aOK%\%`
! 1:0+&+ <$#3$4#/#%$': : .0("(B)&+ 7)') TObject); 3 _>0X0'(*/`U 3 .1 ;9$:5R_11j(20IU<
begin
) (*(6()"(B)CD+ &3 .1) 4#%*"J  +*&3 23'# if Assigned(FJpeg) then I+2(6(+*3 +2 6+17+*3*032 3 6+*A(/.'3
PaintBox1.Canva s.Draw(0, 0, FJpeg);
/')@)&+ + )'-.(@+ 340')?&+< 93203 6)2+, end;
23.2 +'8#*5"4 6+*A+'13 ) </0,$( 5<
-.)*&+ A+' 6F)1)&+ + 1:0+&+ C@#%'(#2 G)1+2 (*(6()' 73") "(20)/31 &+2 '3;
;5/#%$': , + 4#%$': &323H)&+ 23'# /')@)&+ I'+*0+< %/+'), 0+&) @3B -.3 @+6^ 3*0')' 6.'2+2< ]17"313*03 + 0')0)13*0+ 7)')
"+6)"13*03 31 A3$4#/#%$':< I+&31+2 *+ 7'+/')1), .1) A(/.') )"3)0M'() &3 + 3@3*0+ 1"+,*(O &+ L#K*4# +>23'@)*&+ +
3*0D+ 2(17"3213*03 '30+'*#;"+< G3H)E 2.) "(20) 23'# 6)''3/)&) *+ ;V'*"#H5@< 6M&(/+ &) ./-)(0+1 22<
function   TResCompressor.GetDestStream(const G+6^ 7+&3 .0("(B)' (22+ *+ 48,'40 4(%$$" L20)1+2, 7'(13(')13*03, .0("(B)*&+
DestFilePath: string): TStream;
begin
&3 2.) )7"(6)CD+, 7+' 34317"+< ) A.*CD+ K5'?K*L%'%6C@  7)') 6)''3/)'
Result := FDestStream;
end;
Listagem 10. Código OnCreate do formulário
L, .1) @3B -.3 + 4#%$': @3(+ &3 A+') 7)')
procedure  TForm1.FormCreate(Sender: TObject);
+ C@#%'(#;5/#%$': , *D+ : *+22) '327+*2); var
 >("(&)&3 "(17#;"+< I'+@)@3"13*03, -.31 AResCompressor: TResCompressor;
AIndex: Integer;
6F)1+. + 1:0+&+ @)( -.3'3' "3' + -.3 A+( AMemoryStream: TStream;
begin
340')?&+< I+'0)*0+, + 1:0+&+ +,$'"3$4#/2 AResCompressor := TResCompressor.Cr eate(‘IMAGESZIP’ );
try
#%$': A(6)'# @)B(+< 9+03 ) 23/.('E AMemoryStream := TMemoryStream.Cr eate;
try
procedure  TResCompressor.   Randomize;
CleanDestStream(const AIndex := RandomRange(0, AResCompressor.En triesCount);
DestStream: TStream); AResCompressor.Ex tractToStream(AI ndex, AMemoryStream);
begin
end; AMemoryStream.Pos ition := 0;
FJpeg := TJpegImage.Creat e;
I)') A36F)' 320) 6")223, @+6^ 7+&3, +7;   FJpeg.LoadFromStream(AMemoryStream);
finally
6(+*)"13*03, &(27)')' .1) 3463CD+ 6)2+   AMemoryStream.Free;
end;
23H)1 6F)1)&+2 +2 1:0+&+2 7?? , 3$,$#$ finally
  AResCompressor.Free;
3 C@#%'(#< I)') 0)*0+, &36")'3;+2 6+1+   end;
=*%#>', *) 6")223 ;+5:8%$445% 3 5=$%%*?$ end;

*) 6")223 ;B$4+5:8%$445%<
+ 7'+/')1)< L20) A.*CD+ 7+ &3 23' 343; ! 1:0+&+ (17"313*0)&+, 6+*A+'13 6+;
6.0)&) 0)*0+ 7)') >(>"(+036)2 -.)*0+ 13*0)&+, 23'# 6F)1)&+ 7)') 6)&) '36.'2+
3436.0#@3(2 3 '30+'*) + 0'"?,$ &+ 1M; 3*6+*0')&+< X3 + '36.'2+ A+' .1 B+37;7 ,
&."+< %7M2 (22+, 6F)1)1+2 + 1:0+&+ )73*)2 )&(6(+*)1+2 *) "(20) + *+13 &+
C">:B$45>%($N':$4 , .1) @3B 7)') + '36.'2+< O)2+ 23H) .1 /#%*"J ;'L,$ , @)';
0(7+ B+37;7   3 .1) @3B 7)') + 0(7+ '31+2 ) 0)>3") "3*&+ 6)&) 4#%*"J )0')@:2
/;B!N<< I)22)1+2 0)1>:1 .1 7+*; &+ 1:0+&+ K5'?/#%*"J< I)') 73/)'1+2 +
03('+ 7)') ) A.*CD+ -.3 23'# 6F)1)&) *+13 &3 '36.'2+ &) 0)>3"), .0("(B)1+2 )
7)') 6)&) '36.'2+ R^C">:B$4N':$42 A.*CD+ K5D5%? , 7+(2, *+2 (*03'322) )73*)2
V%5(U 3 .1 7+*03('+ 7)') ) "(20) &3 +2 L6#$4 13*+2 2(/*(A(6)0(@+2<
4#%*"J4  &+ ::K*4#< % "(20) H# 320# 7'+*0) 7)') 23' 7'33*;
b3(0+ (22+, &36")'3 R"+/+ )6(1) &+ 1:; 6F(&)< G+6^ @3'# 7'(13('+ +2 '36.'2+2
0+&+ '36:1 (17"313*0)&+, 231 23' &) B+37;7 &+ )7"(6)0(@+ 3, &37+(2, +2 '3;
6")223 ;A5%:_U ) A.*CD+ C">:B$4N:'2 6.'2+2 &+ 0(7+ /#%*"J ;'L,$< 9+ 23/.*&+
$4V%5( R./-)(0+1 24U< 6)2+, )7)'363'# 0)1>:1 ) 6F)@3 (&3*0(;
n.)*&+ + '36.'2+ A+' &+ 0(7+ 4#%*"J , *) A(6)&+') &3 6)&) 4#%*"J<
@3'&)&3, 3"3 23'# .1 /#%*"J;'L,$< L22)2 %/+'), &36")'3 3 (17"313*03 + 1:0+&+
0)>3")2 2D+ ) 1)*3(') -.3 4#%*"J4  2D+ )8?'#$B$45>%($!"V%5J%': R./-)(0+1 25U<
)&(6(+*)&)2 )+2 )'-.(@+2 &3 '36.'2+< L203 : + 1:0+&+ -.3 23'# .0("(B)&+
L1 6)&) .1), 03'31+2 )0: Zi 4#%*"J4< 7)') ) 1+&(A(6)CD+ 3A30(@) &+2 %$45>%($4<
O)&) 4#%*"J : (&3*0(A(6)&+ 7+' .1) 6F); L"3 6+*2(203 31 6F)1)'1+2 H$J*")2
@3 7'M7'(), -.3 : 6)"6.")&) &) 23/.(*03  8?'#$B$45>%($  7)') (*(6()' ) )"03')CD+, +
A+'1)E Rv9!QL K! aLOsaX!w Y ZU d -.)" *+2 '30+'*) + \'"?,$ &+ 7'+/')1)<
Zi< I+203'(+'13*03, 7+&31+2 .0("(B)' ) X3 ) )"03')CD+ A+' &+ 0(7+ B+37;7 ,
A.*CD+ K5'?/#%*"J 7)22)*&+ 320) 6F)@3 (*(6()1+2 .1 4#%$': 7)') ) "3(0.') &+
Figura 3. Interface do exemplo ResourceUpdate 7)') "3'1+2 6)&) 4#%*"J< )'-.(@+ -.3 ('# 2.>20(0.(' + '36.'2+
)0.)"[ '323'@)1+2 131M'() 7)') 0+&+
3203 @)"+' R*+03 -.3 + )'-.(@+ 23'#
Listagem 11. Código do evento OnClick do botão btList 0+0)"13*03 6)''3/)&+ 31 131M'()U[
procedure  TForm1.btListClick(Sender: TObject);
"31+2 + )'-.(@+ *+ L>&&$%  3, 7+' A(1,
var 6F)1)1+2 )8?'#$B$45>%($< L203 : +
AHandle: THandle;
begin 1:0+&+ -.3 ('# 1+&(A(6)' + '36.'2+ 3,
  mmList.Clear;
AHandle := LoadLibraryEx(PC har(edProgram.Tex t), 0, LOAD_LIBRARY_AS _DATAFILE); 7)') 3"3, &3@31+2 7)22)'E + \'"?,$ &)
try
mmList.Lines.Add( ‘RCDATA RESOURCES’);
)7"(6)CD+ ) 1+&(A(6)', + 0(7+ &3 '36.';
EnumResourceNames (AHandle, RT_RCDATA, @EnumResNamesPr oc, Integer(mmList.L ines)); 2+, + *+13 &+ '36.'2+ R: (*03'322)*03
  mmList.Lines.Add(‘’);
mmList.Lines.Add( ‘STRING TABLES’); .0("(B)' ) A.*CD+  9'O$!"#B$45>%($  7)')
EnumResourceNames (AHandle, RT_STRING, @EnumResNamesPr oc, Integer(mmList.L ines));
finally ) A+'1)0)CD+ &+ @)"+'U, ) "(*/.)/31 &+
  FreeLibrary(AHandle);
  end;
'36.'2+ Rx y 93.0')"U, + L>&&$%   6+1 +2
end; L6#$4 3 + 0)1)*F+ ) 23' /')@)&+<
O)2+ 3203H)1+2 (*03'322)&+2 *) )"03');
Listagem 12. Função EnumResNamesProc
CD+ &3 .1) 4#%*"J , 6F)1)1+2 + 1:0+&+ )
function  EnumResNamesProc(Module: HMODULE; ResType, ResName: PChar;
Strings: TStrings): Boolean; stdcall;
23' (17"313*0)&+ <$#/#%*"J;'L,$ 3 /')@);
var 1+2, )/+'), 0+&) ) /#%*"J ;'L,$ *+@)13*03
InitialString, i: Integer;
Buffer: array[0..1023] of Char; *) 7+2(CD+ 6+''30) R'30+'*)&) 7+' <$#B$42
begin
if ResType = RT_STRING then N':$1&/#%!?< I)') )7"(6)' )2 )0.)"(B)CJ32,
begin
InitialString:=(L oWord(Cardinal(R esName))-1) * 16;
6F)1)1+2 C"?)8?'#$B$45>%($<
for i := 0 to 15 do b(*)"13*03, (17"313*03 +2 1:0+&+2
begin
if  LoadString(Module,InitialString+i, '3")6(+*)&+2 N 6+*20'.CD+ &+ /#%*"J ;'L,$
Buffer,1024) <> 0 then
Strings.Add(‘> ‘ + IntToStr(Initial String + i)
6+*A+'13 ) ./-)(0+1 2;<
  end;
+ ‘ - ‘ + string(Buffer)); I)') ) 1+*0)/31 &+ /#%*"J ;'L,$ ,
end : *36322#'(+ "3'1+2 0+&)2 )2 4#%*"J4
else if ResType = RT_RCDATA then
begin *+@)13*03, )&(6(+*)*&+;)2 *) 0)>3")
Strings.Add(‘> ‘ + ResName);
  end;
3 )"03')*&+ 2+13*03 ) 4#%*"J &323H)&)<
Result := True; I3'63>) -.3 )2 4#%*"J4 320D+ 7'323*032
end;
*) 0)>3") &) 23/.(*03 A+'1)E vjL9=;
\fwvX\a]9=w< ! 6#"6."+ &) 7+2(CD+
Listagem 13. Método UpdateResourceInProgram
(*(6()" : A3(0+ 6+1 >)23 *+ *+13 &+
procedure   TForm1.UpdateResourceInProgram(const
ResType: PChar);
'36.'2+ 6+''327+*&3*03 N /#%*"J ;'L,$
var 31 -.320D+< z# + 1&&4$#   '37'323*0) )
TempStream: TStream;
ResHandle: THandle; 7+2(CD+ &) 4#%*"J  ) 23' )"03')&) *)
Buffer: PChar;
StringTable: WideString; 0)>3")< I)') A(*)"(B)', &3@31+2 /3')'
begin
ResHandle := BeginUpdateReso urce(PChar(
+ 1321+ *W13'+ &3 6)')603'32 *."+2
edProgram.Text) , False); 6+''327+*&3*032 )+ 0)1)*F+ /3')&+<
try
if ResType = RT_RCDATA then %22(1, A36F)1+2 ) 6+*20'.CD+ &3 .1
begin
TempStream := TFileStream.Crea te(
/#%*"J ;'L,$ 6+17"30+< z# + 1:0+&+ <$2
edValue.Text, fmOpenRead); #B$4N':$1&/#%!? : .1 2(17"32 6#"6."+
try
GetMem(Buffer, TempStream.Size) ; 7)') 23 2)>3' + %$45>%($ "':$ &+ /#%*"J
TempStream.Read( Buffer^, TempStream.Size);
UpdateResource(R esHandle, RT_RCDATA, ;'L,$ 6+1 >)23 *+ *?  &3 .1 4#%*"J<
MakeIntResource(e dResKey.Text), 0,
Buffer, TempStream.Size );
\3203 23. 7'+/')1) )7+*0)*&+ 7)') +
 
finally
TempStream.Free;
3436.0#@3" )*03'(+'13*03 6'()&+ B$45>%2
end; ($P*8Q$@$ 3 6"(6)*&+ 31 L#K*4#< G+6^ @3'# )
  FreeMem(Buffer); "(20) 6+1 +2 '36.'2+2 &+ 7'+/')1)< I)')
end
else if ResType = RT_STRING then
)"03')' .1 4#%*"J , 6+"+-.3 *+ 23/.*&+
begin ;C?*# + *? &) 4#%*"J  R6+7(3 &) "(20)U 3 &^
StringTable := GetStringTable( StrToInt(
edResKey.Text), edValue.Text); .1 *+@+ @)"+'< I+' 34317"+, 7'+6.'3
UpdateResource(R esHandle, RT_STRING,
  MakeIntResource(GetResNameOfStrId(StrToInt( 7+' _*+0 6F)*/3&`, 6+''327+*&3*03 )+
edResKey.Text))) , 0, PWideChar(Strin gTable),
Length(StringTable));
%$45>%($4#%*"J )*03'(+'13*03 )&(6(+*)&+,
  end; 1.&3 23. @)"+' 3 3436.03 + 7'+/')1)<
  finally
EndUpdateResour ce(ResHandle, False); G+6^ @3'# -.3 ) 4#%*"J   A+( 1+&(A(6)&)
  end;
end; 6+1 2.6322+, )0')@:2 &) >)'') &3 0?0.;
"+2< =3'3 0)1>:1 +.0'+ )'-.(@+ Q(?E
Listagem 14. Implementação dos métodos GetStringTable e GetResNameOfStrId 6+1 &(A3'3*032 A(/.')2  ]8$J 3 A)C) .1)
function  TForm1.GetStringTable(StrId: Integer; const 1+&(A(6)CD+ )7+*0)*&+ 7)') + *+13 &+
NewValue: string): WideString;
var '36.'2+ R!97<C/P!VU 3 7)') + 6)1(*F+
ResName: Integer;
Offset: Integer;
)+ )'-.(@+ Q(?E< %>') + 7'+/')1) 3 @+6^
StartPos: Integer; @3'# )2 (1)/3*2 *+@)2<
i: Integer;
AHandle: THandle;
Buffer: array[0..1023] of Char;
  StrRead: string; Conclusão
begin
ResName := GetResNameOfStrId (StrId);
I+' 1)(2 -.3 )6F31+2 -.3 2)>31+2
Offset := StrId mod 16; 0.&+, 2317'3 F# )"/+ 7)') )7'3*&3'<
StartPos := (ResName - 1) * 16;
Result := ‘’; /#%$':4  *D+ 2D+ .1 6+*03W&+ &(A?6(",
AHandle := LoadLibraryEx(PCh ar(edProgram.Text ), 0,
LOAD_LIBRARY_AS_DATAFILE);
7+':1, *36322(0)1 23' 343'6(0)&+2< %":1
try
for i := 0 to 15 do
&(22+, ).13*0)1+2 .1 7+.6+ 1)(2
begin *+22+ _)'23*)"` &3 7+22(>("(&)&32, 6+1
if i = Offset then
begin ) .0("(B)CD+ &3 7+&3'+2+2 6+17)60)&+;
Result := Result + Char(Length(NewVa lue)) +
NewValue;
'32 &3 )'-.(@+2 3 )'-.(@+2 &3 '36.'2+
end
else
 >)20)*03 A"34?@3(2< %/+'), : 2M 3273')' )
begin +7+'0.*(&)&3 63'0) 7)') )7"(6)' + -.3 A+(
if LoadString(AHandle, StartPos + i, Buffer,
1024) <> 0 then 347"(6)&+ 31 .1 63*#'(+ '3)"<
begin
StrRead := string(Buffer);
Result := Result + Char(Length(Str Read)) +
StrRead;
  end;
  end;
  end; Dê seu feedback sobre esta edição!   u
  e
   s
 F eedb ac  
 
k  
Result:= Result + StringOfChar(#0, Length(Result));      ê
     D
finally
  FreeLibrary(AHandle);
A Java Magazine tem que ser feita ao seu
  end; gosto.Para isso, precisamos saber o que   e
  s
  t
   a
end;     e
  i   d
function   TForm1.GetResNameOfStrId(StrId: você, leitor, acha da revista!       o    ç
    ã

Integer): Integer;
begin
Result := (StrId div 16) + 1;
Dê seu voto sobre este artigo, através do link:
end;
www.devmedia.com.br/javamagazine/feedback 
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

Análise de Pontos de Função


Saiba mensurar o tamanho de seu software e estimar o tempo que levará
para ficar pronto

s 1 &+2 /')*&32 &32)A(+2 )0.)";


13*03 31 7'+H30+2 &3 2+A0V)'3
: /)')*0(' -.3 320(1)0(@)2 &3
0)1)*F+, 6.20+ 3 6'+*+/')1) 23H)1
'3)"(20)2, 0)*0+ 31 7'+H30+2 &3 &323*;
6+1+ ) %*#"(23 &3 I+*0+2 &3 b.*CD+ R&+
(*/"^2 bI% ; A>"(#*5" V5*"# 7"',64*4U<
K322) A+'1), 7+&3;23 320(1)' + 0)1);
*F+ &)2 A.*6(+*)"(&)&32 &3 .1 2(2031)
3, 31 A.*CD+ &(22+, &3A(*(' + 0317+
Carmo Crêdiney de Melo @+"@(13*0+ -.)*0+ &3 1)*.03*CD+< 3 '36.'2+2 7)') + 7'+H30+ 31 -.320D+
(carmo@jfnet.com.br) L*0'30)*0+, )2 6'3263*032 *36322(&)&32 6+1 >)23 *) 7'+&.0(@(&)&3 &) 3-.(73
Possui experiência desde 1990 em Tecnolo-
gia da Informação. Bacharel em Sistemas de
&+2 .2.#'(+2, ) )"0) 6+17"34(&)&3 3 +. *) 0)4) &3 3*0'3/) &3 7'+H30+2 23;
Informação pela Faculdade Metodista Gran-  >)( 4+ 3*03*&(13*0+ &+ &+1?*(+ &)2 13"F)*032< L22)2 320(1)0(@)2 &3A(*(&)2
bery (FMG). Acumula sete anos de estudos )7"(6)CJ32 ) 23'31 6+*20'.?&)2, )"()&)2 *+ (*?6(+ &+ 7'+H30+ 2D+ &303'1(*)*032
acadêmicos na área de tecnologia e na área N2 6+*20)*032 1.&)*C)2 036*+"M/(6)2, 7)') 7")*3H)' )2 2.)2 (03')CJ32, 7'3@3' +
de Gestão de Projetos. Possui capacitação em 7'+1+@31 .1 )"0+ /'). &3 (*63'03B) 6.20+ 3 3")>+')' + +'C)13*0+ &30)"F)&+
Rational Unified Process (RUP), Arquitetura
J2EE, Linux, Gestão de Projeto de Tecnologia e
*)2 320(1)0(@)2 7)') + 6.17'(13*0+ &)2 &+ 7'+H30+, 1(*(1(B)*&+ +2 '(26+2 -.3
Análise de Pontos de Função. 130)2 320)>3"36(&)2< + 7'+H30+ 03'1(*3 A+') &+ 7')B+ +. &+
O+1+ '32."0)&+, +2 &323*@+"@3&+'32 0^1 +'C)13*0+ 7'3@(20+<
3*A'3*0)&+ 7'+>"31)2 &3 2.>320(1)0(@)2, %22(1, + +>H30(@+ &3203 )'0(/+ : &326'3;
Marco Antônio Pereira Araújo 6."1(*)*&+ 31 )0')2+2 *+ 6'+*+/')1) 3 @3' 6+1+ +>03' + 0)1)*F+ &3 2(2031)2
(maraujo@granbery.edu.br)
É Professor do Curso de Bacharelado em Sis- &326.17'(13*0+ &3 +'C)13*0+2< I+' +.0'+ )0')@:2 &) 0:6*(6) &3 6+*0)/31 &3 I+*0+2
temas de Informação da Faculdade Metodista ")&+, 3*03*&3;23 -.3 +2 .2.#'(+2 0)1>:1 &3 b.*CD+, )0')@:2 &3 .1 7'+0M0(7+ &3
Granbery, Doutorando e Mestre em Engenharia 7'36(2)1 &3 '327+20)2 '#7(&)2 31 '3")CD+ (*03'A)63 &3 .1) )7"(6)CD+ &3 34317"+<
de Sistemas e Computação pela COPPE/UFRJ, )+ 0317+ 3 6.20+2 3*@+"@(&+2 31 7'+H30+2 9D+ 23 031 ) 7'303*2D+ &3 )7'323*0)'
Especialista em Métodos Estatísticos Compu-
tacionais e Bacharel em Matemática com Ha-
&3 2+A0V)'3< 9+ 23*0(&+ &3 +>03' 320(1); 0+&)2 )2 '3/')2 &3 bI%, 1)2 (*0'+&.B('
bilitação em Informática pela UFJF, Analista de 0(@)2 1)(2 6+*A(#@3(2, *36322(0);23 ")*C)' +2 6+*63(0+2 >#2(6+2 7)') ) 6+*0)/31 31
Sistemas da Prefeitura de Juiz de Fora. 1D+ &3 0:6*(6)2 32736?A(6)2 7)') 3223 A(1, 7'+H30+2 &3 &323*@+"@(13*0+<
! 320.&+ &3 6)2+ )7'323*0)&+ *3203 Contagem de Pontos de Função % 7)'0(' &322) H)*3"), + 2(2031) &3@3
)'0(/+ : '3")0(@+ N 6+*0)/31 &3 I+*0+2 &3 % 6+*0)/31 &3 7+*0+2 &3 A.*CD+ : '3); 7+22(>("(0)' ) 1)*.03*CD+ *+ 6)&)20'+
b.*CD+ &3 .1 A')/13*0+ &3 .1 2(2031) "(B)&) )0')@:2 &3 .1 6+*H.*0+ &3 7)22+2 &3 6.'2+2 6+*03*&+ 6M&(/+ 3 &326'(CD+ &+
&3 O+*0'+"3 %6)&^1(6+< 7'3@()13*03 &303'1(*)&+2< I)') A)6("(0)' 1321+, )":1 &+ 0(7+ &+ 6.'2+, -.3 7+&3
+ 3*03*&(13*0+ &3223 7'+6322+, 6)&) .1 23' &3 /')&.)CD+ +. 7M2;/')&.)CD+< I)')
Introdução à análise de &32232 7)22+2 23'# )7'323*0)&+ 3 )7"(6)&+ 6.'2+2 &3 /')&.)CD+ (*A+'1);23 0)1>:1
Pontos de Função ) .1 320.&+ &3 6)2+ -.3 &31+*20')'# + *W13'+ &3 73'?+&+2, 3*-.)*0+ -.3,
% bI% A+( &323*@+"@(&) 31 13)&+2 &) 6+1+ ) 6+*0)/31 7+&3 23' A3(0)< 7)') 6.'2+2 &3 7M2;/')&.)CD+, (*A+'1);
&:6)&) &3 {x *) 03*0)0(@) &3 1(*(1(B)' 93223 23*0(&+, + )'0(/+ 6+*&.B('# .1 23 ) 6)'/) F+'#'() R</0,$( 4U<
)2 &(A(6."&)&32 )22+6()&)2 N 13&(CD+ &3 320.&+ &3 6)2+ '3")6(+*)&+ )+ 6)&)20'+ %+ A(*)" &3 -.)"-.3' &+2 7'+6322+2 &3
0)1)*F+ &3 2+A0V)'3 )0')@:2 &3 "(*F)2 &3 &3 6.'2+2 3 )".*+2 &3 .1) A)6."&)&3< ! 1)*.03*CD+, + 2(2031) &3@3 31(0(' .1)
6M&(/+;A+*03, )":1 &3 7'+@3' .1 136)*(2; 6)&)20')13*0+ &3 6.'2+2 : (*(6()&+ 73"+ 13*2)/31 &3 6+*A('1)CD+ )+ .2.#'(+<
1+ -.3 7.&3223 7'3@3' + 32A+'C+ )22+6()&+ .2.#'(+ 3 )7'323*0) .1) "(20) &+2 6.'2+2 %7M2 + 6)&)20')13*0+ &3 6.'2+2, 7+;
)+ &323*@+"@(13*0+ &3 2+A0V)'3<  H# 6)&)20')&+2, 73'1(0(*&+ 732-.(2) ) &31+2 1)0'(6.")' +2 )".*+2< K) 1321)
L1 ZS|o, .1) @3'2D+ 1)(2 '3A(*)&) 7)'0(' &) &326'(CD+ &+ 6.'2+ 3 +A3'363*&+ 1)*3('), 34(203 .1) H)*3") &3 732-.(2)
A+( ")*C)&) 3, 7+203'(+'13*03, 6+1 + )2 +7CJ32 &3 6)&)20'+ '3")0(@)2 N (*6".2D+, &3 )".*+2, 7')0(6)13*03 (/.)" N &3 732;
).13*0+ &) .0("(B)CD+ &) bI%, 0+'*+.; )"03')CD+, 346".2D+ 3 6+*2."0) R</0,$( 2U< -.(2) &3 6.'2+2, 34630+ -.3 +A3'363 )(*&)
23 *36322#'(+ &3A(*(' .1 /.() -.3
(*03'7'30)223 )2 '3/')2 +'(/(*)(2 7)')
*+@+2 )1>(3*032< K3@(&+ ) 322) *3632;
2(&)&3, 31 ZS|i A+( 6'()&+ + !"#$%"'#*52
"', A>"(#*5" V5*"# )4$%4 <%5>8  R]bIs=U<
9+ 8')2(", 3223 /'.7+ : '37'323*0)&+
73"+ 8bIs= RH%'E*,*'" A>"(#*5" V5*"#
)4$%4 <%5>8U<
! 6#"6."+ &3 I+*0+2 &3 b.*CD+ RIbU
23/.3 .1 6+*H.*0+ &3 &('30'(B32 &32;
6'(0)2 *+ 1)*.)" &3 I'#0(6)2 &3 O+*;
0)/31 &3 I+*0+2 &3 b.*CD+ &+ ]bIs=<
L*0'30)*0+, &(@3'/^*6()2 &3 6+1+
)7"(6)' 322)2 '3/')2 A)B31 6+1 -.3 )2
6+*0)/3*2 *31 2317'3 '32."031 *.1
1321+ @)"+'<
9+ 23*0(&+ &3 6'()' .1 1:0+&+ 1)(2
'(/+'+2+ *3223 7'+6322+ &3 6+*0)/31,
2.'/(. ) *+'1) ]X!r]LO ZoZoT, -.3
320)>3"363 .1) 2:'(3 &3 7)&'J32 7)')
6+*0)/31 A.*6(+*)"< L1 gxxg, ) @3'2D+
o<Z &+ 1)*.)" &+ ]bIs= A+( )7'+@)&) Figura 1. Janela de pesquisa de cursos
6+1+ )&3'3*03 ) 322) *+'1)<
K322) A+'1), ) bI% 73'1(03 .1) 6+*;
0)/31 (*&(6)0(@) &+ 0)1)*F+ &+ 7'+H30+
*+ (*?6(+ &+ 23. &323*@+"@(13*0+, 231
6+*F363' &30)"F32 &3 1+&3"+2 &3 &)&+2
+. &3 6")2232< I+203'(+'13*03, *) A)23 &3
6+*20'.CD+, 322) 6+*0)/31 '37'323*0)
.1) 320(1)0(@) 6+1 1)(+' 7'36(2D+ &)
6+17"34(&)&3 &)2 A.*CJ32 3, )+ 0:'1(*+
&) 6+*20'.CD+ &+ 2+A0V)'3, *) 30)7) &3
0')*2(CD+, : '3)"(B)&) .1) 6+*0)/31
&30)"F)&), +>0(&) ) 7)'0(' &+ /'). &3
6+17"34(&)&3 &)2 A.*CJ32 "3@)*0)&)2
*+ 7'+6322+ A.*6(+*)", 1+&3"+ &3 &)&+2
+. 1+&3"+ &3 6")2232, &326'(CD+ &3 03")2
3 '3")0M'(+2< Figura 2. Janela de cadastro de cursos
.1) 7+22(>("(&)&3 &3 A("0')' +2 )".*+2 6.20+< %22(1, 7)') 320(1)' + 0)1)*F+ &+ (*6".?&)2 31 .1) &303'1(*)&) 6+*0)/31
7+' .1 6.'2+ 32736?A(6+ R</0,$( 5U< 2+A0V)'3 &3 )6+'&+ 6+1 ) bI%, 23/.3;23 &3 7+*0+2 &3 A.*CD+< 9+ *+22+ 320.&+ &3
! 6)&)20')13*0+ &3 )".*+2, 0)1>:1 .1 7'+63&(13*0+ &3 6+*0)/31, -.3 320# 6)2+, + 326+7+ &) 6+*0)/31 '320'(*/3;23
2313"F)*03 )+ &3 6.'2+2, 7+22.( 1)0'?; '37'323*0)&+ *+ 32-.31) &) </0,$( ?< N2 A.*6(+*)"(&)&32 &3 732-.(2) 3 6)&)2;
6."), *+13, &)&+2 7322+)(2 R</0,$( ;U, % 23/.(', 6)&) .1) &322)2 )0(@(&)&32 0')13*0+ &3 6.'2+2 3 )".*+2, 6+*A+'13
&)&+2 &3 3*&3'3C+ R</0,$( =U 3 &)&+2 23'# &326'(0) 3 )7"(6)&) )+ 320.&+ &3 6)2+ )7'323*0)&+ )*03'(+'13*03[
&3 &+6.13*0)CD+ R</0,$( >U< %7M2 + )7'323*0)&+< 5C <,"IJ+- #+ K(#8 E 6+*2(203 *) 6+*;
6)&)20')13*0+ &3 .1 )".*+, + 2(2031) 2C D/E8 #+ F8")(0+1E 34(2031 0'^2 0(7+2 0)/31 &+2 0(7+2 &3 &)&+2 .0("(B)&+2
&3@3'# 34(>(' 7)') + .2.#'(+ + @)"+' &) &3 6+*0)/31 &3 7+*0+2 &3 A.*CD+< % &(; *)2 A.*6(+*)"(&)&32 ) 23'31 &323*;
13*2)"(&)&3 ) 23' 7)/+ 73"+ )".*+< A3'3*C) *+ 7'+63&(13*0+ )&+0)&+ 3*0'3 @+"@(&)2< L2232 0(7+2 &3 &)&+2 7+&31
I)') + 6#"6."+ &) 13*2)"(&)&3, .1 32232 0(7+2 &3 6+*0)/31 320# *)2 AM'1.")2 23' )/'.7)&+2 31 .1 %'-.(@+ jM/(6+
@)"+' >)23 : .0("(B)&+ 7)') 6)&) 0(7+ &3 )7"(6)&)2 *) 6+*0)/31< XD+ 3"32E ]*03'*+ R%j]U -.3 '37'323*0) /'.7+2
6.'2+ 3 6+*2(&3') )(*&) + *W13'+ &3 ! V%5]$#5 ?$ ?$4$"=5,=*:$"#5E 13&3 0+&)2 &3 &)&+2 '3")6(+*)&+2 3 '36+*F36(&+2
73'?+&+2 7)') 6.'2+2 &3 /')&.)CD+ 3 ) )2 A.*CJ32 -.3 23'D+ 3*0'3/.32 6+1 + 73"+ .2.#'(+, &3*0'+ &) A'+*03(') &)
6)'/) F+'#'() 7)') 6.'2+2 &3 7M2;/')&.; 7'+H30+ 31 2.) 7'(13(') @3'2D+< p + 0(7+ &3 )7"(6)CD+[ +. .1 %'-.(@+ &3 ]*03'A)63
)CD+< !2 @)"+'32 >)23 &)2 13*2)"(&)&32 6+*0)/31 -.3 23'# .0("(B)&) *3203 )'0(/+[ L403'*) R%]LU -.3 '37'323*0) &)&+2
2D+ 1)*0(&+2 7+' .1 2(2031) A(*)*63('+ ! V%5]$#5 ?$ :$,05%*'E 13&3 )2 A.*6(+*); '3A3'3*6()&+2 73") )7"(6)CD+ 1)2
3 320D+ A+') &+2 "(1(032 &322) )7"(6)CD+, "(&)&32 )"03')&)2, (*6".?&)2 3 346".?&)2 1)*0(&+2 &3*0'+ &) A'+*03( ') &3 +.0')
23*&+ 6+*2."0)&+2 7+' 3")< )+ 7'+H30+[ )7"(6)CD+< 9+ 34317"+ 031+2E
I)') ) 6+*20'.CD+ &322)2 A.*6(+*)"(&)&32, ! 78,*('`a5E 13&3 )2 A.*CJ32 &3 .1) !!.LH O.'2+, %".*+
23'# 7'(13(')13*03 &303'1(*)&+ + 0)1); )7"(6)CD+ H# (*20)")&)< !!LGH Q3*2)"(&)&3
*F+ &) )7"(6)CD+ -.3 23'# &323*@+"@(&), &3 4C G-68E8 #( F8")(0+1H : ) A'+*03(') I)') 6)"6.")' ) 6+17"34(&)&3 &)2
A+'1) ) +'(3*0)' )2 320(1)0(@)2 &3 7')B+ 3 &) )7"(6)CD+< K3A(*3 )2 A.*CJ32 -.3 23'D+ A.*CJ32 &3 &)&+2, &3@3;23 6+*0)' +

Figura 3. Janela de pesquisa de alunos


Figura 5. Janela de Cadastro de Alunos – Dados de Endereço

Figura 4. Janela de Cadastro de Alunos – Dados Pessoais Figura 6. Janela de Cadastro de Alunos – Dados de Documentação
*W13'+ &3 \(7+2 &3 K)&+2 R\KU 3 \(7+2 7)') ) 6+*0)/31 .1 W*(6+ %j] 6+1 &+(2 %j] %".*+ : &3 6+17"34(&)&3 >)(4), 7+(2
&3 a3/(20'+2 R\aU &3 6)&) .1) &322)2 \(7+2 &3 a3/(20'+2< 7+22.( .1 \a 3 gT \K2 3, 7+' A(1, + %]L
A.*CJ32< s1 \K '3A3'3;23 ) .1 6)17+ ]&3*0(A(6)&+2 +2 \K2 3 \a2, 7+&3;23 Q3*2)"(&)&3 0)1>:1 : &3 6+17"34(&)&3
W*(6+ '36+*F36(&+ 73"+ .2.#'(+, 231 6)"6.")' ) 6+17"34(&)&3 &3 6)&) %j]r%]L  >)(4), 7+(2 7+22.( .1 \a 3 &+(2 \K2<
'3730(CD+, +. 23H), 23 .1 6)17+ 23 '3; )0')@:2 &) D(:+7( ;< %*)"(2)*&+;), +>23'; ;C <,"IJ+- #+ D$("-(IM8E '37'323*0)1 +2
730(' 1)(2 &3 .1) @3B *.1) (*03'A)63, @);23 -.3 + %j] O.'2+ : &3 6+17"34(&)&3 7'+6322+2 3"313*0)'32 A+'*36(&+2 73") )7"(;
6+*0);23 )73*)2 .1) @3B<  >)(4), 7+(2 7+22.( &+(2 \a2 3 6(*6+ \K2, + 6)CD+ )+ .2.#'(+, +*&3 .1 7'+6322+ 3"313*;
s1 \a '3A3'3;23 ) .1 2.>/'.7+ &3 0(7+2
&3 &)&+2, 0)1>:1 '36+*F36(&+2 73"+
.2.#'(+ 3 6+17+*3*03 &3 .1 %j] +. %]L<
9+ 34317"+, +2 \K2 320D+ )7'323*0)&+2
*)2 D(:+7(- 2 ) 5 , '37'323*0)*&+ +2 )'-.(;
@+2 O.'2+, %".*+ 3 Q3*2)"(&)&3, '32736;
0(@)13*03< O+1+ O.'2+ )7'323*0) &+(2
0(7+2 &3 '3/(20'+ R6.'2+2 &3 /')&.)CD+ 3
&3 7M2;/')&.)CD+ 6+1 &)&+2 32736?A(6+2U,
6+*2(&3');23 \a (/.)" ) g<
!2 &31)(2 7+22.31 \a (/.)" ) Z< X3 +2
6.'2+2 320(@32231 &(@(&(&+2 31 1)(2 &3
.1 )'-.(@+ 6+1+, 7+' 34317"+, .1 )';
-.(@+ 7)') 6.'2+2 &3 /')&.)CD+ 3 +.0'+2
&3 7M2, 1321+ )22(1, 6+*2(&3')'?)1+2

TD Tipo de Dado
1 Código do curso
2 Descrição do curso
3 Tipo do curso (1=Graduação / 2=Pós-Graduação)
4 Quantidade de períodos
5 Carga horária
Tabela 1. Tipos de Dados de Curso

TD Tipo de Dado
1 Matrícula do aluno
2 Nome do aluno
3 Data de nascimento
4 Identificador do curso
5 Ano de início
6 Semestre de início
7 Email
8 Telefone residencial
9 Telefone comercial
10 Telefone celular
11 Foto
12 Logradouro
13 Número
14 Complemento
15 Bairro
16 Cidade
17 UF
18 CEP
19 CPF
20 Número identidade
21 Órgão expedidor
22 UF órgão expedidor
23 Data expedição
Tabela 2. Tipos de Dados de Aluno Figura 7. Processo de contagem de pontos de função.
0)' (&3*0(A(6) ) 13*+' .*(&)&3 A.*6(+*)" &+ } %aE I)') 6)&) %j] "(&+ +. 1)*0(&+ 73") 34(>(&+2 6+1+ '32."0)&+ *) (*03'A)63
7+*0+ &3 @(20) &+ .2.#'(+, 3 7+&3 23'E )7"(6)CD+, +. %]L "(&+, 6+*0);23 .1[ 6+1 + .2.#'(+< V$4T>*4'% +>%45 3 V$4T>*4'%
!C"#%'?' C@#$%"' FCCGE 7)') 2.) (&3*0(A(; } \KE 7,>"5 6+*2(&3')1 %a (/.)" ) .1, 7+(2
6)CD+ &3@31 23' )*)"(2)&+2 0+&+2 +2 7'+; ; C"#%'?' C@#$%"'  RLLUE 6+*0)1;23 6)&) 7'+6322+ +>0:1 (*A+'1)CJ32 &3 .1
6322+2 3"313*0)'32 -.3 7'+6322)1 &)&+2 +2 )0'(>.0+2 -.3 2D+ )0.)"(B)&+2 3 W*(6+ %j] 3 \K (/.)" ) 0'^2, 7+(2, 7+' 23'
@(*&+2 &3 A+') &) A'+*03(') &) )7"(6)CD+ 3 &303'1(*);23 ) 6+17"34(&)&3 6+*A+'13 .1 7'+6322+ &3 3*0')&) 3 2)?&), '363>3
-.3 )0.)"(B)1 .1 +. 1)(2 %j]2[ ) D(:+7( >[ + 7)'q130'+ ) 23' 6+*2."0)&+ 3 34(>3 +2
!/'b?' C@#$%"' F/CGE + 7'+6322+ /3') ; /'b?' C@#$%"' RXLUE 6+*0)1;23 +2 &)&+2 7'3@(20+2 *)2 '327360(@)2 03")2 &3
&)&+2 7)') A+') &) A'+*03(') &) )7"(6)CD+, )0'(>.0+2 &) 2)?&), )":1 &3 )0'(>.0+2 6)"; 732-.(2) R6M&(/+ 3 &326'(CD+ 7)') 6.'2+2
03*&+ 7+' +>H30(@+ 7'(*6(7)" )7'323*0)' 6.")&+2, 3 &303'1(*);23 ) 6+17"34(&)&3 3 1)0'?6.") 3 *+13 7)') )".*+2U<
&)&+2 )+ .2.#'(+ )0')@:2 &3 "M/(6) &3 6+*A+'13 D(:+7( ?[ A*,#%'% 7,>"54 85% +>%45 6+*2(&3') .1 %a
7'+6322)13*0+ -.3 *D+ )73*)2 ) '36.; ; +5"4>,#' C@#$%"' ROLUE 31 .1 7'+6322+ ) 1)(2 7+' 03' -.3 34(>(' +2 6.'2+2 6)&)2;
73')CD+ &3 &)&+2[ &3 3*0')&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 0')&+2< ! 7'+6322+ 3"313*0)' C@*L*% 9$"2
!+5"4>,#' C@#$%"' F+CGE 7'+6322+ -.3 &3 23"3CD+, )":1 &3 13*2)/31 )+ .2.#'(+ 4'J$: ?$ +>%45 +'?'4#%'?5 *D+ 6+*2(&3')
3*@() &)&+2 7)') A+') &) A'+*03(') &) -.)*&+ A+' + 6)2+< L1 .1 7'+6322+ &3 *3*F.1 %a, 7+(2 *D+ +>0:1 (*A+'1)CJ32
)7"(6)CD+, )7'323*0)*&+ &)&+2 )+ .2.#; 2)?&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 &3 &3 *3*F.1 %j] +. %]L 3 6+*2(&3') \K
'(+ 7+' 13(+ &3 .1) 2(17"32 '36.73')CD+ 2)?&)< L1 7'+6322+2 &3 3*0')&) 3 2)?&), (/.)" ) .1 31 A.*CD+ &) 13*2)/31
&3 (*A+'1)CJ32 &3 %j] +. %]L< 2+1)1;23 +2 &+(2 '32."0)&+2< K303'1(*);23 34(>(&)< !2 7'+6322+2 3"313*0)'32 !"(,>*%c
9+ 320.&+ &3 6)2+ &3203 )'0(/+, 7+&31; ) 6+17"34(&)&3 6+*A+'13 ) D(:+7( ?< 7,#$%'%c C@(,>*% 3 +5"4>,#'% 7,>"54 6+*2(&3;
23 (&3*0(A(6)' +2 7'+6322+2 3"313*0)'32 9+ 320.&+ &3 6)2+ &3203 )'0(/+, 6+*; ')1 &+(2 %a 7+' )0.)"(B)' + %j] %".*+ 3
6+*A+'13 )7'323*0)&+ *) D(:+7( =< 2(&3')1;23 )2 )*#"(232 )7'323*0)&)2 *) +>03' &)&+2 &+ %j] O.'2+<
%2 '3/')2 7)') &3A(*(' ) 6+17"34(&)&3 D(:+7( @< ! 7'+6322+ 3"313*0)' C@*L*% +d,(>,5 ?$
&3 LL, XL +. OL 6+*2(&3')1 + *W13'+ &3 !2 7'+6322+2 3"313*0)'32 K*4#'% +>%454 X',5% ?' 9$"4',*?'?$ 6+*2(&3'+. %a (/.)"
%'-.(@+2 a3A3'3*6()&+2 R%aU 3 + *W13'+ 3 K*4#'% 7,>"54 6+*2(&3')')1 \K (/.)" ) ) .1 7+' "3' + %]L Q3*2)"(&)&3 3 \K (/.)"
&3 \(7+ &3 K)&+2 R\KU .0("(B)&+2, 23*&+E &+(2 7+' 23' 3223 + *W13'+ &3 )0'(>.0+2 ) &+(2, 31 @('0.&3 &3 "3' + @)"+' &) 13*2);
"(&)&3 31 A.*CD+ &+ 0(7+ &3 6.'2+<
TD Tipo de Dado =C N8")8- #+ <,"IM8 OM8 !P,-)(#8-H
1 Tipo do curso (1=Graduação / 2=Pós-Graduação) )7M2 (&3*0(A(6)' )2 A.*CJ32 &3 &)&+2 3 +2
2 Valor Base da Mensalidade 7'+6322+2 3"313*0)'32, 1."0(7"(6);23 +
Tabela 3. Tipos de Dados de Mensalidade 0+0)" &3 %j], %]L, LL, XL 3 OL 73"+ '32736;
0(@+ @)"+' &3 7+*0+ &3 A.*CD+ &) 0)>3") &3
Tipos de Dados (TD)
Tipos de Registro (TR) 6+17"34(&)&3 RD(:+7( AU 7)') &303'1(*)'
Abaixo de 20 20 a 50 Acima de 50
+ @)"+' 0+0)" -.3 23'# + Ib *D+ )H.20)&+<
1 Baixa Baixa Média
% D(:+7( 2B 34(>3 + '32."0)&+ A(*)" &+
2a5 Baixa Média Alta
6#"6."+ &3 7+*0+2 &3 A.*CD+ *D+ )H.20);
Acima de 5 Média Alta Alta
&+2 7)') + 320.&+ &3 6)2+ &3203 )'0(/+<
Tabela 4. Complexidade das funções de dados (ALI e AIE) >C Q(78$ #8 <()8$ #+ !P,-)+H  '37'323*;
Funcionalidade Processo Elementar Tipo 0) ) (*A".^*6() &3 '3-.(2(0+2 0:6*(6+2 3
Listar Cursos CE &3 -.)"(&)&3 *+ 0)1)*F+ &+ 2+A0V)'3<
Pesquisa de Cursos p 6)"6.")&+ 6+1 >)23 31 Zo 6)')603'?2;
Pesquisar Curso CE
Incluir Curso EE 0(6)2 /3')(2 &3 .1 2(2031), +*&3 6)&)
Alterar Curso EE .1) &3")2 &3@3 23' )*)"(2)&) 6+1 '3;
Cadastramento de Cursos Excluir Curso EE ")CD+ )+ 23. *?@3" &3 (*A".^*6() 2+>'3
Consultar Curso CE + 2(2031) 3 7+*0.)&) &3 x R*3*F.1)
Exibir Mensagem de Curso Cadastrado CE (*A".^*6()U ) h R/')*&3 (*A".^*6()U<
Listar Alunos CE % &326'(CD+ 6+17"30) &3 6)&) 6)')6;
Pesquisa de Alunos Pesquisar Aluno CE 03'?20(6) 3 )2 0)>3")2 7)') )@)"()CD+ &+2
Filtrar Alunos por Curso CE @)"+'32 &3 7+*0.)CD+, 7+&3 23' +>0(&)
Incluir Aluno EE *+ 1)*.)" &3 I'#0(6)2 &3 O+*0)/31
Alterar Aluno EE &3 I+*0+2 &3 b.*CD+ &+ ]bIs=< I)')
Cadastramento de Alunos
Excluir Aluno EE 3203 34317"+, )2 6)')603'?20(6)2 A+')1
Consultar Aluno CE &326'(0)2 ) 23/.(', >31 6+1+ +2 @)"+'32
Exib ir Cursos Cadastrados na Caixa de Combinação CE 6+*2(&3')&+2 7)') 6)&) .1) &3")2E
Exibir Cálculo de Valor da Mensalidade SE _Q +5:>"*('`a5 ?$ 3'?54e  6+*2(&3') 23
Tabela 5. Processos Elementares identificados no estudo de caso 2D+ .0("(B)&+2 '36.'2+2 &3 6+1.*(6)CD+
73") )7"(6)CD+< 93203 34317"+, 23'# 6+*; Tipos de Dados (TD)
2(&3')&+ + @)"+' -.)0'+, -.3 : '3")0(@+ Arquivos Referenciados (AR)
Abaixo de 5 5 a 15 Acima de 15
) )7"(6)CJ32 +*;"(*3, 2.7+'0)&)2 7+' 0 ou 1 Baixa Baixa Média
)"/.1 7'+0+6+"+ &3 6+1.*(6)CD+[ 2 Baixa Média Alta
[Q V%5($44':$"#5 3*4#%*L>b?5e  '3")0(@+ Acima de 2 Média Alta Alta
N 0')*2A3'^*6() &3 &)&+2 3*0'3 +2 6+1; Tabela 6. Complexidade de Entrada Externa (EE)
7+*3*032 &) )7"(6)CD+< b+( 6+*2(&3')&+
+ @)"+' .1, .1) @3B -.3 *D+ '3)"(B) Tipos de Dados (TD)
7'+6322)13*0+ &(20'(>.?&+, A)B3*&+ .2+ Arquivos Referenciados (AR)
Abaixo de 6 6 a 19 Acima de 19
)73*)2 &3 .1 2(2031) &3 /3'3*6()13*0+ 0 ou 1 Baixa Baixa Média
&3 >)*6+ &3 &)&+2[ 2 ou 3 Baixa Média Alta
ZQ V$%&5%:'"($e &303'1(*) 6+1+ + 0317+ Acima de 3 Média Alta Alta
&3 '327+20) (*A".3*6() ) )7"(6)CD+< b+( 6+*;
Tabela 7. Complexidade de Saída Externa (SE) e Consulta Externa (CE)
2(&3')&+ B3'+, .1) @3B -.3 *D+ A+( (*&(6)&)
*3*F.1) '320'(CD+ ) 3223 '3273(0+[
Processo Elementar Tipo AR TD Complexidade
fQ +5"&*J>%'`a5 7,#':$"#$ )#*,*E'?'e &3A(*3
Listar Cursos CE 1 2 Baixa
+ *?@3" &3 '320'(CJ32 (17+20)2 73"+ .2.#'(+<
Pesquisar Curso CE 1 3 Baixa
\)1>:1 A+( 6+*2(&3')&+ + @)"+' B3'+ .1) Incluir Curso EE 1 5 Baixa
@3B -.3 *3*F.1) '320'(CD+ A+( (17+20)[ Alterar Curso EE 1 5 Baixa
gQ X5,>:$ ?$ ;%'"4'`h$4e  '3A3'3;23 )+ Excluir Curso EE 1 5 Baixa
@+".13 &3 (*A+'1)CJ32 7'+6322)&+2 73") Consultar Curso CE 1 5 Baixa
)7"(6)CD+< O+*2(&3'+.;23 + @)"+' .1, Exibir Mensagem de Curso Cadastrado CE 0 1 Baixa
.1) @3B -.3 : 7'3@(20+ .1 *W13'+ &3 Listar Alunos CE 1 2 Baixa
0')*2)CJ32 1)(2 3"3@)&+ 31 )"/.*2 73; Pesquisar Aluno CE 1 3 Baixa
'?+&+2 32736?A(6+2, 6+1+ ) 6)&) 73'?+&+ Filtrar Alunos por Curso CE 2 3 Baixa
&3 1)0'?6.")2 &3 )".*+2[ Incluir Aluno EE 2 23 Alta
iQ C"#%'?' ?$ 3'?54 1"2,*"$e 6+*2(&3') ) Alterar Aluno EE 2 23 Alta
-.)*0(&)&3 &3 0')*2)CJ32 A3(0)2 +*;"(*3< Excluir Aluno EE 2 23 Alta
b+( 6+*2(&3')&+ + @)"+' 6(*6+ .1) @3B Consultar Aluno CE 2 23 Alta
-.3 + 2(2031) )7'323*0) 0+&)2 )2 0')*2); Exibir Cursos Cadastrados na Caixa de Combinação CE 1 1 Baixa
CJ32 6+1+ 23*&+ &3223 0(7+[ Exibir Cálculo de Valor da Mensalidade SE 1 2 Baixa
jQ C&*(*k"(*' ?5 )4>d%*5 A*"',e '3A3'3;23 ) Tabela 8. Complexidade dos processos elementares identificados no estudo d e caso.
A)6("(&)&32 +A3'36(&)2 )+ .2.#'(+ A(*)",
6+1+ )H.&) +*;"(*3, ).4?"(+ N *)@3/)CD+ Processo Elementar Tipo Complexidade Pontos Função
7+' 036")2 &3 A.*CD+, 13*.2, &3*0'3 +.0'+2< Curso ALI Baixa 7
b+( 6+*2(&3')&+ + @)"+' .1 7+' )7'323*; Aluno ALI Baixa 7
0)' )"/.1)2 7+.6)2 6)')603'?20(6)2 &3223 Mensalidade AIE Baixa 5
0(7+, 6+1+ ) 34(>(CD+ &+2 6.'2+2 31 6)(4) Listar Cursos CE Baixa 3
&3 6+1>(*)CD+ 7)') A)6("(0)' ) 23"3CD+ &+ Pesquisar Curso CE Baixa 3
.2.#'(+ *+ 6)&)20')13*0+ &3 )".*+2[ Incluir Curso EE Baixa 3
lQ 7#>',*E'`a5 1"2,*"$e &3A(*3 23 +2 )'; Alterar Curso EE Baixa 3
-.(@+2 "M/(6+2 (*03'*+2 2D+ )0.)"(B)&+2 Excluir Curso EE Baixa 3
+*;"(*3< b+( .0("(B)&+ + @)"+' 0'^2, 7+(2 Consultar Curso CE Baixa 3
0+&+2 +2 )'-.(@+2 (*03'*+2 2D+ )0.)"(B); Exibir Mensagem de Curso Cadastrado CE Baixa 3
&+2 &322) A+'1)[ Listar Alunos CE Baixa 3
mQ +5:8,$@*?'?$ ?$ V%5($44':$"#5e &303'; Pesquisar Aluno CE Baixa 3
1(*) ) 6+17"34(&)&3 &3 7'+6322)13*0+ Filtrar Alunos por Curso CE Baixa 3
Incluir Aluno EE Alta 6
Função Baixa Média Alta Alterar Aluno EE Alta 6
Consulta Externa (CE) 3 4 6 Excluir Aluno EE Alta 6
Entrada Externa (EE) 3 4 6 Consultar Aluno CE Alta 6
Saída Externa (SE) 4 5 7 Exibir Cursos Cadastrados na Caixa de Combinação CE Baixa 3
Arquivo de Interface Externa (AIE) 5 7 10 Exibir Cálculo de Valor da Mensalidade SE Baixa 4
Arquivo Lógico Interno (ALI) 7 10 15 Total de Pontos de Função 80
Tabela 9. Contribuição de ponto de função por complexidade Tabela 10. Identificação dos processos elementares e suas complexidade
&)2 A.*6(+*)"(&)&32 &) )7"(6)CD+< b+( )H.20)&+2 2D+ 6)"6.")&+2 ) 7)'0(' &+2 Ib2 "F+ &3 .1 W*(6+ &323*@+"@3&+'< !.0')
6+*2(&3')&+ + @)"+' B3'+, 7+' 23' .1) *D+ )H.20)&+2 1."0(7"(6)&+ 73"+ A)0+' &3 2(0.)CD+ -.3 13'363 )03*CD+ : .0("(B)'
)7"(6)CD+ >)20)*03 2(17"32[ )H.203< 9+ 6)2+ &3 7'+6322+2 &3 &323*; + @)"+' '3)" &3 7'+&.0(@(&)&3 &3 .1 &3;
_nQ B$>#*,*E'`a5e (&3*0(A(6) 23 + 6M&(/+ @+"@(13*0+, A.*CJ32 7)') 6+*@3'2D+ &3 23*@+"@3&+', .1) @3B -.3 &(A(6("13*03
A+( 7'+H30)&+ 7)') 23' '3)7'+@3(0)&+ &)&+2 0)1>:1 &3@31 23' 6+*2(&3')&)2 )"/.:1 031 7'+&.0(@(&)&3 (/.)" ) 2.)
31 +.0')2 )7"(6)CJ32< ! @)"+' B3'+ A+( 3 2.) 6+17"34(&)&3 31 7+*0+2 &3 A.*; 6)'/) F+'#'() 0+0)" &3 0')>)"F+<
6+*2(&3')&+ 7+' 322) *D+ 03' 2(&+ .1) CD+ &3@3 23' )&(6(+*)&) )+2 7+*0+2 &3 93203 34317"+ F(7+0:0(6+, 23 6+*2(&3')';
7'3+6.7)CD+ *+ 7'+H30+[ A.*CD+ *D+ )H.20)&+2< 1+2 -.3 .1 &323*@+"@3&+' 7'+&.B 63'6)
__Q A'(*,*?'?$ ?$ !"4#','`a5e   6+*2(&3') %22(1, ) 23/.(*03 AM'1.") 7)') 7'+632; &3 Th F+')2 '3)(2 7+' 231)*), + 320.&+ &3
23 34(2031 A3'')13*0)2 &3 6+*@3'2D+ 3 2+2 &3 &323*@+"@(13*0+ : )7"(6)&)E 6)2+ &3203 )'0(/+ "3@)'() 13*+2 &3 &.)2
(*20)")CD+ &) )7"(6)CD+< \)1>:1 A+( 6+*; 231)*)2 7)') 23' &323*@+"@(&+, 23 6+*&.;
PF Desenvolvimento = (PF Não Ajustado +
2(&3')&+ + @)"+' B3'+ 7+' 322) 7'3+6 .7); PF Conversão de Dados) * Fator Ajuste (VAF) B(&+ 7+' .1 W*(6+ &323*@+"@3&+'<
CD+ *D+ 03' 2(&+ "3@)&) 31 6+*2(&3')CD+
*+ 320.&+ &3 6)2+[ I)') + 6)2+ &+ 34317"+ .0("(B)&+, 6+1+ Conclusão
_[Q A'(*,*?'?$ ?$ 18$%'`a5e 6+*2(&3') *D+ A+( 6+*2(&3')&) ) 6+*@3'2D+ &3 &)&+2E O+*0)/31 &3 I+*0+2 &3 b.*CD+ '37'3;
)27360+2 &3 23/.')*C) 3 '36.73')CD+ &3 PF Desenvolvimento = (80 + 0) * 0,8 = 64 PFs 23*0) .1) 0:6*(6) &3 6#"6."+ &+ 0)1)*F+
(*A+'1)CJ32< O+1+ (22+ 0)1>:1 *D+ A+( &3 .1) )7"(6)CD+, *D+ &3 32A+'C+ 7)')
6+*2(&3')&+, : )22.1(&+ + @)"+' B3'+[ Estimativas de esforço e prazo a partir 23. &323*@+"@(13*0+< X.) 6+''30) .0("(;
_ZQ 9o,#*8,54 K5('*4e 23 ) )7"(6)CD+ A+( da Contagem de Pontos de Função B)CD+, >)23)&) *)2 '3/')2 &326'(0)2 *+
7'+H30)&) 3 &323*@+"@(&) 7)') 23' .0("(; I+*0+2 &3 b.*CD+ 0^1 7+' +>H30(@+ ) 1)*.)" &3 I'#0(6)2 &3 O+*0)/31 &3 I+*;
B)&) 31 &(A3'3*032 "+6)(2< L22) '320'(CD+ 13&(CD+ &+ 0)1)*F+ A.*6(+*)" &3 .1) 0+2 &3 b.*CD+ &+ ]bIs=, 7+&3 )H.&)' *)
0)1>:1 *D+ A+( 6+*2(&3')&) 3 )22.1(&+ )7"(6)CD+< L*0'30)*0+, *D+ : (*6+1.1 -.3 13&(CD+ &) A.*6(+*)"(&)&3 &3 2(2031)2
+ @)"+' B3'+[ &323*@+"@3&+'32 -.3(')1 320(1)' 32A+'C+ 3 )7+()' 320(1)0(@)2 &3 32A+'C+ 3 7')B+
_fQ A'(*,*?'?$ ?$ 9>?'"`'4e 23 ) )7"(6)CD+ 3 7')B+2 ) 7)'0(' &+ *W13'+ &3 7+*0+2  >)23)&)2 *) 7'+&.0(@(&)&3 6+*F36(&) &3
A+( 7'+H30)&) 7)') A)6("(0)' 1.&)*C)2 &3 A.*CD+< K3@3;23 0+1)' 6.(&)&+ 6+1 .1) 3-.(73 &3 &323*@+"@(13*0+<
*) "M/(6) &3 7'+6322)13*0+ +. 31 2.)2 322) 2(0.)CD+, 7+(2 ) 7'+&.0(@(&)&3 &3 I+&3;23 )(*&) 3*6+*0')' &(@3'2)2
320'.0.')2 &3 &)&+2< ! @)"+' B3'+ A+( &(A3'3*032 3-.(732 &3 &323*@+"@(13*0+ A3'')13*0)2 +. 7")*("F)2 3"30'~*(6)2 &3
.0("(B)&+ *3223 6)2+< 7+&3 @)'()' 6+*2(&3')@3"13*03, (*6".2(@3 &(A3'3*032 A+'*363&+'32 7)') )7+()' +2
X+1)1;23 3*0D+ 322)2 7+*0.)CJ32 7)') 31 A.*CD+ &)2 036*+"+/()2 .0("(B)&)2< 7'+63&(13*0+2 &3 6#"6."+ &3 7+*0+2 &3
+>03' + *?@3" 0+0)" &3 (*A".^*6() R\K] Y ;5#', % A)"0) &3 6+*F36(13*0+ &) 7'+&.; A.*CD+ &3 A+'1) ) A)6("(0)' + 7'+6322+ &3
3$J%$$ 5& !"&,>$"($U< K)? >)20) )7"(6)' ) 23; 0(@(&)&3 &) 3-.(73 7+&3 A)B3' 6+1 6+*0)/31< L203 )'0(/+ 7'+6.'+. )7'323*;
/.(*03 AM'1.") 7)') +>03' + @)"+' &+ A)0+' -.3 )2 320(1)0(@)2 &3 32A+'C+ 23H)1 0)' &3 A+'1) 7'#0(6) )2 7'( *6(7)(2 '3/')2
&3 )H.203 RG%b Y X',>$ 7?]>4#:$"# A'(#5%UE 3'')&)2, 231 -.3 7+*0+2 &3 A.*CD+ &3 6+*0)/31 &3 7+*0+2 &3 A.*CD+ )0')@:2
23H)1 +2 6."7)&+2 7+' (22+< !.0') 2(; &3 .1 320.&+ &3 6)2+ 7'#0(6+<
Valor do Fator de Ajuste (VAF) =
(TDI x 0,01) + 0,65 0.)CD+ 7'3+6.7)*03 : .0("(B)' 0)>3")2
&3 7'+&.0(@(&)&3 7+' 7+*0+ &3 A.*CD+ Referências
9+ 6)2+ &+ 34317"+ &3203 )'0(/+E &(27+*?@3(2 *) (*03'*30, +*&3 +2 &)&+2
Site do IFPUG: International Function Point Users Group
VAF = (15 x 0,01) + 0,65 = 0,8
)"( )7'323*0)&+2 7+&31 *D+ '3A"30(' ) www.ifpug.org
6)7)6(&)&3 &3 7'+&.CD+ &3 -.)"-.3' Site do BFPUG-Brazilian Function Point Users Group
%0.)"13*03 3223 : .1 7)22+ +76(+*)" 3-.(73 &3 &323*@+"@(13*0+ 3, 1.(0)2 www.bfpug.com.br 
&+ 7'+6322+ &3 6+*0)/31< Q.(0)2 +'/); @3B32, *D+ "3@)1 31 6+*2(&3')CD+ )2 LivroAnálisedePontosdeFunção  – Medição,Estimativas
*(B)CJ32 &326+*2(&3')1 + A)0+' &3 )H.203 6)')603'?20(6)2 &3 &(A3'3*032 036*+"+/()2
 e Gerenciamento de Projetos de Software
3 .2)1 )73*)2 ) 13&(CD+ &+2 7+*0+2 &3 -.3 7+&31 23' .0("(B)&)2<
3ª. edição, Carlos Eduardo Vazquez, Guilherme Siqueira
A.*CD+ *D+ )H.20)&+2< ]22+ 23 &3@3 )+ I+'0)*0+, + 6+*F36(13*0+ &) 7'+&.0(;
 Simões e Renato Machado Albert.
A)0+ &3 -.3 )2 6)')603'?20(6)2 /3')(2 &3 @(&)&3 &3 6)&) 3-.(73 : A.*&)13*0)"
Editora Érica, 2003.
.1 2(2031), )7'323*0)&)2 )*03'(+'13*; 7)') 320(1)0(@)2 &3 32A+'C+ 3 7')B+ )
03, 2D+ 6+*2(&3')&)2 &32)0.)"(B)&)2 +. 7)'0(' &) 6+*0)/31 &3 7+*0+2 &3 A.*CD+<
(*6+17"30)2 31 '3")CD+ N2 036*+"+/()2 9+ 320.&+ &3 6)2+ &3203 )'0(/+, @)1+2 Dê seu feedback sobre esta edição!   u
  e
 F eedb ac  
 
k  
   s
)0.)"13*03 .0("(B)&)2, A)B3*&+ 6+1 -.3 6+*2(&3')' F(7+030(6)13*03 ) 2(0.)CD+ &3      ê
     D

2.) .0("(&)&3 23H) -.320(+*)&)< -.3 .1 7+*0+ &3 A.*CD+ : &323*@+"@(&+ A Java Magazine tem que ser feita ao seu o     
s      

 b  
 r  
  e

]22+ A(6) 1)(2 3@(&3*6()&+ -.)*&+ ) 31 .1) F+') &3 0')>)"F+ &3 .1 &323*; gosto.Para isso, precisamos saber o que   e
  s
  t
   a
    e
   d
  i

*+'1) ]X!r]LO ZoZoT 6+*2(&3') )73*)2 @+"@3&+' RZ F+131rF+')U< você, leitor, acha da revista!       o    ç
    ã

+2 7+*0+2 &3 A.*CD+ *D+ )H.20)&+2 31 %22(1, + 32A+'C+ 7)') 3223 7'+H30+, Dê seu voto sobre este artigo, através do link:
2.)2 320(1)0(@)2 &3 13&(CD+ A.*6(+*)"< 6+*2(&3')*&+;23 +2 7+*0+2 &3 A.*CD+ www.devmedia.com.br/javamagazine/feedback 
?C N8")8- #+ <,"IM8 !P,-)(#8-H  !2 Ib2 )H.20)&+2, 23'() &3 io F+')2 &3 0')>);
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

Usando todo o poder do TDataSetProvider


Usufrua de todos os recursos do DataSetProvider em suas aplicações

X 31 &W@(&) *3*F.1), .1 &+2


6+17+*3*032 1)(2 7+&3'+2+2 &)
GOj : + 3'#'/$#V%5=*?$% , -.3, )":1
&3 7'+@3' &)&+2 ) 0+&) ) )7"(6)CD+, :
6)7)B &3 ).4("()' 31 .1) 2:'(3 &3 A.*;
Entendendo o DataSetProvider
8)2(6)13*03 + 3'#'/$#V%5=*?$% : '327+*;
2#@3" 7+' 3*@()' 3 '363>3' +2 3'#' V'(O$#4
&) )7"(6)CD+ 6"(3*03 7)') ) + 23'@(&+' &3
&)&+2< !2 3'#' V'(O$#4 2D+ +2 7)6+032 &3
6(+*)"(&)&32 *+ 2(2031)< &)&+2 0')A3/)&+2 *) '3&3 31 .1) )7"(6);
G3'31+2 + -.3 F# &3 1)(2 (*03; CD+ &.)2 6)1)&)2 R_0V+;0(3'` +. _6"(3*0r
'322)*03 *3223 6+17+*3*03 3 &(6)2 23'@3'`U +. _*` 6)1)&)2 R_*;0(3'`U< \+&)
)@)*C)&)2 7)') .2.A'.(' )+ 1#4(1+ 3 -.)"-.3' '3-.(2(CD+ A3(0) 73") )7"(6)CD+
&3 2.)2 7'+7'(3&)&32 3 1:0+&+2< L1 6"(3*03 : 3*@()&) )+ 3'#'/$#V%5=*?$%  -.3
6+*H.*0+ 6+1 +2 6 +17+*3*032 3HC@2 7+' 2.) @3B 23 3*6)''3/) &3 2+"(6(0)' +2
 8% $44 + 3'#'/$#V%5=*?$%   : 6)7)B &3 &)&+2 )+ 23'@(&+' &3 )7"(6)CD+< ! %$4>,#
'3)"(B)' (*W13')2 0)'3A)2< G3'31+2 4$# , +. 23H), + '32."0)&+ &) '3-.(2(CD+ :
*3223 )'0(/+E 317)6+0)&+ R_K)0) I)6•302`U 3 3*@()&+
} ]*0'+&.CD+ )+ K)0)X30I'+@(&3'[ &3 @+"0) N )7"(6)CD+ 6"(3*03< n.)"-.3'
Adriano Santos } O+1+ .2)' + s7&)03Q+&3 3 I'+@(; 3463CD+ "3@)*0)&), 23H) *) '3-.(2(CD+ +.
(falecom@adrianosantos.pro.br) &3'b")/2[ *+ '363>(13*0+ &+2 &)&+2, : '30+'*)&) )
é desenvolvedor Delphi desde 1998. Professor } O+*A(/.')*&+ &(*)1(6)13*03 + )7"(6)CD+ 6"(3*03<
e programador PHP. Bacharel em Comunicação s7&)03Q+&3 3 I'+@(&3'b")/2[ I+&3;23 &(B3' -.3 ) .0("(B)CD+ 1)(2
Social pela Universidade Cruzeiro do Sul, SP. É } s2+ &3 O+*20')(*02[ 6+1.1 &+ 3'#'/$#V%5=*?$%   : A3(0) 31
Editor Técnico, Colunista e Membro da Comissão
Editorial da revista ClubeDelphi e WebMobile.
6+*H.*0+ &+2 6+17+*3*032 &) 7)"30)
Mantém o blog Delphi to Delphi (www.delphi- O'()'31+2 &(@3'2+2 34317"+2 7)') 3HC@8%$44  )6'326(&+ &+ 6+17+*3*03
todelphi.blogspot.com) com dicas, informações 3*03*&3'1+2 6+''30)13*03 6)&) A.*6(+; +,*$"#3'#'/$#< s1 34317"+ &3 .2+ 7+&3
e tudo sobre desenvolvimento Delphi. *)"(&)&3 &+ 3'#'/$#V%5=*?$%[ 23' @(20+ *) </0,$( 2<
! -.3 7+.6) /3*03 2)>3 : -.3 + 3'#'2 &3 &323*@+"@(13*0+, + -.3 )6)''30)'() ]22+ : >)20)*03 (*03'322)*03, @(20+
/$#V%5=*?$%  7+&3 23 0+'*)' 1)(2 &+ -.3 31 (*6+*2(20^*6() &+2 &)&+2< -.3 '3&.B &')20(6)13*03 ) -.)*0(&);
.1 2(17"32 6+17+*3*03 &3 6+*34D+ L1 )7"(6)CJ32 "2#*$%  R1."0(;6)1)&)2U &3 &32*36322#'() &3 6M&(/+ 3 )(*&)
6+1 + >)*6+ &3 &)&+2 7+' 23' A)'0+ &3 7+&31+2 '36+''3' )+ 7+&3'+2+ K)0)X*)7 73'1(03 -.3 23H)1 73'2+*)"(B)&)2 )2
7'+7'(3&)&32 3 3@3*0+2< 3 7'+/')1)' *+22)2 '3/')2 &3 *3/M6(+ 13*2)/3*2 &3 3463CD+ /3')&)2< L22)2
&('30)13*03 *+ 23'@(&+' &3 )7"(6)CD+, 7'+7'(3&)&32 2D+E
Constraints e DataSetProvider 0+'*)*&+ ) )7"(6)CD+ 1)(2 6+*2(203*03 } R+(# S"7TE O+1+ + 7'M7'(+ *+13
O+1+ 2)>31+2, )2 (5"4#%'*"#4 &3 3 (*03"(/3*03< L22)2 '3/')2 '32(&31 *+ (*&(6), 7+&31+2 _230)'` .1 6)17+
.1) )7"(6)CD+ 7+&31 23' (*23'(&)2 6M&(/+ A+*03 &+ 23'@(&+' &3 )7"(6)CJ32, 6+1+ 2+13*03 "3(0.')[
&3 &(@3'2)2 A+'1)2 31 .1) )7"(6)CD+< 3 A(6)1 63*0')"(B)&)2< } R+U,/$+#E L22) 7'+7'(3&)&3 320)*&+
L1 )7"(6)CJ32 #M52#*$%c   7+' 34317"+, a32.1(*&+, .1) &)2 13"F+'32 )"03'*); 6+*A(/.')&) 6+1+ \'.3, A)B 6+1 -.3
031+2 )73*)2 &+(2 "./)'32 +*&3 3")2 0(@)2 63'0)13*03 : A)B3' .2+ &320) W"0(1) ) )7"(6)CD+ +>'(/.3 + .2.#'(+ A(*)" )
7+&31 23' ( *6".?&)2E *+ ")&+ 4$%=*?5% +7CD+, +. 23H), .0("(B)' .1 23'@(&+' &3 &(/(0)' .1 @)"+' *3")< ='+223(')13*03
+. *) '8,*('`a5 (,*$"#$ < 9+ 23'@(&+' )7"(6)CD+ -.3 A)'# + (*03'6q1>(+ 3*0'3 A)")*&+, 6)17+2 9+0 9."" *+ >)*6+ &3
&3@31+2 (*23'(;")2 &('30)13*03 *+ L'"?5 ?$ ?'?54 RX=8KU 3 '8,*('`a5 (,*$"#$c &)&+2 2D+ A+'032 6)*&(&)0+2 ) 23'31
X=8K )0')@:2 &3 /#5%$? V%5($?>%$4c 7+(2 )":1 &3 7'+7(6()' 1)(+' 6+*0'+"3 6)17+2 a3-.('3&, 0)*0+ :, -.3 -.)*&+
?5:'*"4c %>,$4 , #%*JJ$%4 $#( < p .1) 2+>'3 )2 '3/')2 &3 *3/M6(+2, )(*&) 7+; )&(6(+*)1+2 .1 6)17+ 9+0 9."" )+2
3463"3*03 (&:(), 7+(2 63*0')"(B)1+2 &31+2 &(27+*(>("(B)' ) )7"(6)CD+ 7)') b(3"&€2 L&(0+'€2 &+ K)0)X30, 3203 H# @31
*+22)2 '3/')2 &3 *3/M6(+2 31 .1 )6322+ '31+0+ )0')@:2 &) (*03'*30< 6+1+ \'.3 31 2.) 7'+7'(3&)&3[
W*(6+ "./)'< I+':1, 6+''31+2 + '( 26+ } K+V(,7)GWE$+--/8" E G)"+' 7)&'D+
&3 A(6)'1+2 7'32+2 )+ >)*6+ &3 &)&+2 Propriedades do TField 7)') (*23'CD+ *+ >)*6+ &3 &)&+2< %-.(
-.3 320)1+2 0')>)"F) *&+ 7+' 6+*0) &) %"/.1)2 7'+7'(3&)&32 0+ ;A*$,? 7+&31+2 6+*A(/.')' .1 @)"+' -.3 23'#
"(*/.)/31 317'3/)&) *+ X=8K< L1 2D+ ).0+1)0(6)13*03 7)22)&)2 &) /')@)&+ *+ >)*6+ 6)2+ 3203H) @)B(+[
+.0')2 7)")@')2 -.)*&+ 7'+/')1)1+2 )7"(6)CD+ 23'@(&+') 7)') + 6"(3*03 3 ) } F,-)81F8"-)$(/") E p 34)0)13*03
&('30)13*03 *+ >)*6+ *36322(0)1+2 1)(+'() &+2 @)"+'32 2D+ &303'1(*)&+2 *322) 7'+7'(3&)&3 -.3 &3A(*(1+2 *+22)
.2)' ) "(*/.)/31 &3 7'+/')1)CD+ 31 0317+ &3 7'+H30+ >)23)*&+;23 6+*20')(*0< K(/(0)1+2 ) 347'322D+ 3 7+203;
Xnj, 0)1>:1 6F)1)&) %9X], 7)') *) 320'.0.') &) 0)>3") *+ X=8K< I+; '(+'13*03 + 2(2031) A)'# ) @)"(&)CD+< L4<E
6'()' *+22)2 7'M7'()2 (*20' .CJ32< ]22+ &31+2 .2.A'.(' &3 )"/.*2 '36.'2+2 m  Zxx )*& m ‚ gxx[
7+&3 23 0+'*)' .1) &+' &3 6)>3C) 31 2+13*03 &(27+*?@3(2 *)2 7'+7'(3&)&32
.1) 3@3*0.)" 1.&)*C) &3 >)*6+ &3 &+ ;A*$,? , 23 H) 31 )7"(6)CJ3 2 4*"J,$
www.devmedia.com.br/clubedelphi/portal.asp
&)&+2 +. 1321+ 23 + 7'+&.0+ @(3' ) #*$% , #M52#*$% +. "2#*$% 3 -.3 *D+ 320D+
23' 6+13'6()"( B)&+ 6+1 8K€2 &(A3'3*; &(27+*?@3(2 *+ K)0)X*)7< L1 2.1), : Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma
032< ]1)/(*3 .1 2+A0V)'3 -.3 7'36(2) 7+22?@3" 6'()'1+2 73-.3*)2 (5"4#%'*"#4 vídeo aula de Guinther Pauli que mostra como trabalhar com constraints
23' 6)7)B &3 23 6+*360)' )+2 >)*6+2 &('30)13*03 *) )7"(6)CD+ 6" (3*03 3 -.3 e ClientDataSet.
www.devmedia.com.br/articles/viewcomp.asp?comp=567&hl=
]*03'>)23rb('3>('&, Xnj X3'@3' gxxh 7+&31 23' A)6("13*03 6+*A(/.')&)2<
L47'322 3 !')6"3< K3 (* ?6(+ H# 03'31+2
)"/.1)2 6+17"(6)CJ32 3*0'3 ]*03'>)23
3 b('3>('& &373*&3*&+ &) @3'2D+ &3
)1>+2, F)H) @(20) -.3 1.(0)2 1+&(A(;
6)CJ32 *+ 8K A+')1 A3(0)2 )+ "+*/+ &+2
)*+2< I+' (22+, &) 1321) A+' 1) -.3 +
32-.31) : (*03'322)*03, 0)1>:1 7+ &3
0+'*)';23 .1 0').1)<
I+' +.0'+ ")&+ : 7+22?@3" (*6".(' (5"42
#%'*"#4 &('30)13*03 *) )7"(6)CD+ 6"(3*03,
7+':1 031+2 .1) 3*+'13 &32@)*0);
/31E ) ?$($"#%',*E'`a5 &3 *+22)2 '3/')2
&3 *3/M6(+2< L")2 7'36(2)1 23' '3A3(0)2
7)') 6)&) *+@) )7"(6)CD+ 3 327)"F)&)2
7+' 0+&+ + 6M&(/+ A+*03 +. 31 )"*#4 ,
6+17+*3*032 +. ?,,p4Q L22) 7'#0(6) :
)"0)13*03 73'(/+2), 7+(2 7+&31 +6+';
'3' 1+13*0+2 31 -.3 .1) '3/') &3
*3/M6(+ 7+&3 *D+ 23' )"03')&) 7+'
32-.36(13*0+ &+2 131>'+2 &) 3-.(73 Figura 1. Exemplo de uso do componente DataSetProvider
} O+*20')(*0L''+'Q322)/3E I+' W"0(1+ ?LC@8%$44< K^ .1 6"(-.3 &.7"+ *+ /sK2 2(2031) +>'(/)'# + .2.#'(+ ) (*23'(' .1
) 13*2)/31 &3 3''+ -.3 23'# 34(>(&) )+ +5""$(#*5"  3 6'(3 .1) *+@) 6+*34D+ 6+1 @)"+' *32232 6)17+2 R</0,$( 5U<
.2.#'(+ A(*)" &) )7"(6)CD+[ + >)*6+ &3 &)&+2 C:8,56$$Q&?L 7'323*03 *+
K3@31+2 *+2 "31>')' -.3 (22+ 0.&+ &('30M'(+ &3 (*20)")CD+ &+ b('3>('&, *+'; Propriedade adicionais do TField
2M : 7+22?@3" 6+1 6)17+2 73'2(203*032, 1)"13*03 31 +et7%T>*=54 ?$ V%5J%':'4t usadas pelo DataSetProvider
+. 23H), 6+1 0(7(A(6)CD+ &3 6)17+2 *+ A*%$L*%?tA*%$L*%?uX$%4a5t$@':8,$4t$:82 %/+') @3H)1+2 )"/.1)2 &)2 7'+7'(3;
7'+H30+< L223 '36.'2+ : .0("(B)&+ -.)*&+ L>*,?tC:8,56$$Q&?L< O+*3603 + /sK3'#'/$# &)&32 1)(2 (17+'0)*032 31 .1 ;A*$,?
)&(6(+*)1+2 +2 6)17+2 &) 0)>3") *+ )+ /sK+5""$(#*5"  .2)*&+ ) 7'+7'(3&)&3 3 -.3 2D+ .0("(B)&)2 A+'0313*03 73"+
A*$,?p4 C?*#5% &+ ;3'#'/$# , &+ 6+*0'#'(+ /sK+5""$(#*5"  3 31 23/.(&) &(/(03 ) 3'#'/$#V%5=*?$%< % 7'+7'(3&)&3 18#*5"4
*D+ 23'# 7+22?@3"< (*20'.CD+ Xnj ) 23/.(' 7)') 23"36(+*)' +2 &+ 3/V R_K)0)X30I'+@(&3'`U 2.7+'0) )
!.0')2 &.)2 (*A+'1)CJ32 2D+ (17+'0)*; &)&+2 &) 0)>3") /7KC/ &+ >)*6+< 7)22)/31 &3 7'+7'(3&)&32 )&(6(+*)(2
0?22(1)2< % 7'(13(') : -.3 )2 13*2)/3*2 &+ ;A*$,?p4< n.)*&+ 6+*A(/.')1+2 6+1+
SELECT * FROM SALES
&3 3''+ 2D+ '32."0)*032 &) @(+")CD+ &)2 ;%>$ ) 7'+7'(3&)&3 85!"(A*$,?V%584 , 7+&3;
'3/')2 (17+20)2 *+2 ;A*$,?p4  &+ ;3'#'/$# , %'')203 )/+') .1 3'#'/$#V%5=*?$% 3 1+2 7)22)' 7'+7'(3&)&32 &+ ;A*$,? 7)')
3 6+*23-ƒ3*0313*03 /3')'D+ 3463CJ32< X3 .1 +,*$"#3'#'/$# &) 7)"30) 3'#' 7(($44< + 3/V< L22)2 7'+7'(3&)&32 2D+E
+.0')2 '3/')2 0)1>:1 A+'31 &3A(*(&)2 *+ j(/.3 + 3'#'/$#V%5=*?$% )+ /sK3'#'/$# w 7,*J":$"#x
23'@(&+' &3 &)&+2, +. 23H), &('30)13*03 *+ 73") 7'+7'(3&)&3 3'#'/$# 3 + +,*$"#3'2 w +>%%$"(6x
X=8K, 320)2 0)1>:1 "3@)*0)'D+ 3463CJ32, #'/$# )+ V%5=*?$%   .2)*&+ V%5=*?$%N':$< w 3*48,'6A5%:'#x
7+':1 2+13*03 .1) &)2 &.)2 13*2)/3*2 %>') 23. /3'3*6()&+' &3 >)*6+ &3 &)&+2 w 3*48,'6K'L$,x
23'# 34(>(&)< % 23/.*&) (*A+'1)CD+ &(B 7'3A3'(&+ 3 @(2.)"(B3 ) 320'.0.') &) 0); w 3*48,'6D*?#0x
'3273(0+ N )"03')CD+ &3 '3/')2 *+ X=8K<  >3") /7KC/ R</0,$( 4U< w C?*#A5%:'#x
%"/.1)2 &)2 '3/')2 &3 *3/M6(+2 (1; 9+03 -.3 +2 6)17+2 V1uN)9HCBc w C?*#9'4Ox
7+20)2 &('30)13*03 *+ 8K 7'36(2)1 23' +)/;uN1c 1B3CBu/;7;)/c 1B3CBu w 9'@X',>$x
'37"(6)&)2 7)') ) )7"(6)CD+, 6+1+ : + 6)2+ 37;Cc s;vu1B3CBC3c ;1;7KuX7K)Cc w 9*"X',>$x
&3 6)17+2 '3-.3'(&+2 R_a3-.('3€2`U< O)2+ 3!/+1)N;  3 !;C9u;vVC , 320D+ 1)'6); w X*4*L,$x
1+&(A(-.3 &3 ;%>$ 7)') A',4$ +. @(63;@3'2) &+2 6+1+ N5# N>,, , +. 23H), *D+ 73'1(031
31 .1 &303'1(*)&+ 6)17+, 3203 7'36(2) -.3 23H)1 /')@)&+2 231 *3*F.1 @)"+'< ! -.3 7+.6+2 2)>31, : -.3 7+&31+2
23' '31+@(&+ +. )"03')&+ 31 0317+ &3 L473'(13*03 )&(6(+*)' 0+&+2 +2 6)17+2 6+*A(/.')' +.0')2 7'+7'(3&)&32 &+ 3/V
7'+H30+< G3H)1+2 .1 34317"+E &) 0)>3") /7KC/ )+ A*$,?p4 C?*#5% &+ +,*$"2 6)7)B32 &3 *+2 ).4("()' 31 &(@3'2)2
%>') + K3"7F( 3 6'(3 .1) *+@) )7"(6)CD+ #$3'#'/$# .2)*&+ + 13*. &3 6+*0340+ 3 ) 0)'3A)2< %(*&) *) 7'+7'(3&)&3 18#*5"4
.2)*&+ A*,$qN$Mr788,*('#*5"  3 2)"@)*&+;) +7CD+ 7?? ',, &*$,?4Q L1 23/.(&) 6"(-.3 @3H)1+2 )"/.1)2 &3")2E
6+1+ _I'+73'0(32<&7'` 3 + A+'1."#'(+ 31 6)&) 6)17+ 3 +>23'@3 ) 7'+7'(3&)&3 }  85B$'?1",6e K32)>("(0) -.)"-.3' )";
7'(*6(7)" 6+1+ _I'(*6(7)"<7)2`< ]*2(') *+ B$T>*%$?< I3'63>) -.3 6)&) 6)17+ N5# 03')CD+ *+ K)0)X30 "(/)&+ ) 3")[
A+'1."#'(+ .1 6+17+*3*03 /sK+5""$(2 N>,, 03@3 2.) 7'+7'(3&)&3 B$T>*%$? 1+; } 853*4'L,$!"4$%#4e K32)>("(0) ) (*23'CD+
#*5" 3 .1 ;/sK3'#'/$# , )1>+2 &) 7)"30) &(A(6)&) 7)') ;%>$ , (22+ 2(/*(A(6) -.3 + &3 &)&+2 *) 0)>3")[
} 853*4'L,$C?*#4e K)2)0(@) ) 3&(CD+ &+2
'3/(20'+2[
} 853*4'L,$3$,$#$4e 9D+ 73'1(03 ) 346".;
2D+ &3 '3/(20'+2[

a30+'*3 )+ 7'+H30+ 6'()&+ )*03'(+';


13*03 3 &323*F3 .1) 03") 2313"F)*03
N </0,$( ;< X3"36(+*3 + 3'#'/$%V%5=*?$%  3
6+*A(/.'3 ) 7'+7'(3&)&3 18#*5"4r85B$'?
1",6 7)') ;%>3, )0(@3 + +,*$"#3'#'/$# 3
3436.03 ) )7"(6)CD+< I3'63>) -.3 + 3H2
N'=*J'#5%  73'1(03 )73*)2 ) *)@3/)CD+
&+2 '3/(20'+2 R</0,$( =U 3 *D+ 1)(2 )2
&31)(2 +7CJ32<
X3/.(*&+ ) 1321) "(*F) &3 ')6(+6?;
*(+, )/+') 1+&(A(-.3 ) 7'+7'(3&)&3
18#*5"4r3*4'L,$C?*#4 , 2)"@3 + 7'+H30+
3 3436.03< 9) 23-ƒ^*6(), 3473'(13*03
6"(6)' *+ >+0D+ &3 )"03')CD+ 3 *+03 +
Figura 2. Estrutura da tabela SALES do banco Employee.fdb 3''+ R</0,$( >U<
Figura 3. Configuração do TField adicionado au tomaticamente

]22+ )6+*0363, 7+'-.3 (*A+'1)1+2 )+ )22(*)0.') 6+17"30) &+ 3@3*0+ 7+&31+2 "(B)CD+ *D+ : .1) (*20'.CD+ 7)') ?$,$#'%
3/V -.3 *D+ : 73'1(0(&) ) )"03')CD+ &3 @3' ) 23/.(', H.*0)13*03 6+1 ) &326'(CD+ + '3/(20'+, 7+(2 6)2+ 23H) *D+ F# *36322(;
'3/(20'+2 7+' 7)'03 &) )7"(6)CD+ 6"(3*03, &3 6)&) 7)'q130'+E &)&3 31 23 @)"(&)' .1 '3/(20'+ -.3 23'#
"+/+ ) 13*2)/31 _O"(3*0K)0)X30ZE Q+; BeforeUpdateRecor d(Sender: TObject; )7)/)&+< L1 23/.(&) 0320)1+2 23 + @)"+'
&(A(6)0(+*2 )'3 *+03 )""+V3&<`, 0')&.;  
SourceDS: TDataSet; DeltaDS:
TClientDataSet;
'363>(&+ : &(A3'3*03 &3 N>,,R_G)']29.""`U
B(*&+, _O"(3*0K)0)X30ZE Q+&(A(6)CJ32 UpdateKind: TUpdateKind; 3 &(A3'3*03 &3 ='E*5R_G)']2L170u`U< I+'
var Applied: Boolean);
*D+ 2D+ 73'1(0(&)2<`< A(1, @3'(A(6)1+2 23 + @)"+' &+ 6)17+
} /$"?$%e 3'#'/$#V%5=*?$% -.3 &(27)'+. 1B3CBu37;C *D+ : 2.73'(+' )+ /\!Vu
Usando os eventos do DSP + 3@3*0+[ 37;C< f)@3*&+ -.)(2-.3' &(@3'/^*6()
I+&31+2 .0("(B)' 0'^2 3@3*0+2 7)') @)"(; } /5>%($3/e ='+223(')13*03 A)")*&+ : .1) 3463CD+ : "3@)*0)&)<
&)' (5"4#%'*"#4 31 .1) )7"(6)CD+ .2)*&+ ) A+*03 &3 &)&+2, +2 &)&+2 31 2([
+ 3'#'/$#V%5=*?$%< XD+ 3"32E } 3$,#'3/e I)6+03 &3 &)&+2 3*@()&+ Usando o evento OnUpdateData
} H$&5%$)8?'#$B$(5%?e %6+*0363 )*032 73") )7"(6)CD+ 6"(3*03[ ! 3@3*0+ 1")8?'#$3'#'   +6+''3 .1)
-.3 +2 &)&+2 23H)1 )0.)"(B)&+2 *) )7"(; } )8?'#$y*"?e  \(7+ &3 .7&)03, )0.)"(B); @3B )+ (*(6()' ) )7"(6)CD+ &+2 &)&+2 *+
6)CD+ '31+0)[ CD+, -.3 23'# A3(0)< !2 @)"+'32 7+22?@3(2 23'@(&+', +. 23H), *+ '363>(13*0+ &+2
} 1")8?'#$3'#'e %6+*0363 )+ )7"(6)' +2 2D+E >O!"4$%#c >O95?*&6 $ >O3$,$#$x '3/(20'+2 K3"0) &+ +,*$"#3'#'/$#< p *3223
&)&+2 '363>(&+2 73") )7"(6)CD+ 6"(3*03, } 788,*$?e ]*&(6) 23 )2 1+&(A(6)CJ32 1+13*0+ -.3 (*03'6370)1+2 )2 1+&(A(;
*+ 23'@(&+' &3 &)&+2[ 23'D+ )7"(6)&)2< 6)CJ32 3 )63(0)1+2 +. )0: 1+&(A(6)1+2
} 1")8?'#$C%%5%e   n.)*&+ +6+''31 +2 &)&+2 23 *36322#'(+< %-.( 0)1>:1
3''+2 )+ 03*0)' 3A30.)' + )8?'#$< Usando o evento 7+&31+2 3*@()' 13*2)/3*2 N )7"(6)CD+
s2)1+2 + 3@3*0+ H$&5%$)8?'#$B$(5%? BeforeUpdateRecord 6"(3*03 6)2+ 23H) *36322#'(+<
-.)*&+ *36322(0)1+2 A)B3' ) @)"(&)CD+ G3H)1+2 .1 34317"+ 7'#0(6+< 9+ 3@3*; G3H) ) )22(*)0.') &+ 3@3*0+ "+/+ 31
(*&(@(&.)" &+2 '3/(20'+2 3*@()&+2 )+ 0+ H$&5%$)8?'#$B$(5%? &(/(03 + 6M&(/+ &) 23/.(&)E
23'@(&+'< \)1>:1 7+&31+2 1+&(A(6)' ./-)(0+1 2< 93223 6)2+ 320)1+2 @3'(A(;
OnUpdateData(Se nder: TObject; DataSet:
&)&+2 '363>(&+2 &) )7"(6)CD+ 6"(3*03< % 6)*&+ 7'(13(')13*03 23 + 0(7+ &3 )0.); TClientDataSet);
} /$"?$%e 3/V -.3 &(27)'+. + 3@3*0+[ .1 3'#'/5>%($R_K)0)X+.'63Z`U )+ 2(2031)< 3A30.)&)2< L436.03 + 7'+/')1), 3A30.3
} 3'#'/$#e I)6+03 &3 &)&+2, 3'#' V'(O$#x K326+*3603 + +,*$"#3'#'/$# &+  8%5=*?$% )"/.1)2 )"03')CJ32 *) 0)>3") 3 31 23/.(;
"(17)*&+ ) 7'+7'(3&)&3 V%5=*?$%N':$< &) 6"(-.3 *+ >+0D+ 3$,#'< I3'63>) -.3 + g„
9+ 6)2+ &+ 3@3*0+ )*03'(+', H$&5%$)8?'#$2 O+*3603 + 3'#'/5>%($_ )+ 3$,#'< ]*2(') .1 3H<%*? 1+20') )73*)2 )"/.*2 '3/(20'+2<
3'#' , *D+ 031+2 )6322+ 0+0)" )+2 &)&+2 -.3 H>##5" 3 .1 3H<%*?< j(/.3 + 3H<%*? )+ L"32 A)B31 7)'03 &+ 3'#' V'(O$# , +. 23H), +
320D+ @(*&+, 3 2(1 ) .1 '3/(20'+ 31 7)'0(6.; ?43$,#' 3 &(/(03 + 6M&(/+ &) ./-)(0+1 4 *+ 7)6+03 &3 &)&+2 -.3 23'# 3*@()&+ )+ 3/V
")'< z# *+ 6)2+ &+ 1")8?'#$3'#' , '363>31+2 3@3*0+ 1"+,*(O &+ H>##5" R</0,$( ?U< 7)') 1+*0)/31 &)2 (*20'.CJ32 &3 (*6".;
+ 3'#'/$# , -.3 6+*0:1 0+&+2 +2 &)&+2 )"03'); ! -.3 320)1+2 A)B3*&+ : 1.(0+ 2(1; 2D+, )"03')CD+ 3 346".2D+ &+2 '3/(20'+2 *)
&+2 3 *D+ )"03')&+2< X3*&+ )22(1, 7+&31+2 7"32< %73*)2 )0'(>.?1+2 N 7'+7'(3&)&3  >)23 &3 &)&+2< XD+ )22(1 -.3 6F3/)1 +2
"3' (*&(@(&.)"13*03 + 20)0.2 &3 6)&) '3/(2; 3'#' &+ 3$,#' + 6+*03W&+ &) 7'+7'(3&)&3 &)&+2 )+ 3/V R</0,$( @U<
0'+ &) 0)>3") )0')@:2 &+ 3$,#'< ]*2(') 1)(2 3$,#' &+ +,*$"#3'#'/$#_ , -.3 6+*0:1 +2 ! 7'(13('+ '3/(20'+ 6+1 + 6M&(/+
.1 6+17+*3*03 +,*$"#3'#'/$#R_K3"0)`U 3 &)&+2 +'(/(*)(2 )6'326(&+ &)2 )"03')CJ32 Xm_Cn[_n , A+( 1)'6)&+ 7)') 346".2D+< z#

Figura 5. DBNavigator apenas com funções de navegação

Figura 6. Exceção gerada pelo DSP

www.devmedia.com.br/clubedelphi/portal.asp

Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma


vídeo aula de Guinther Pauli que mostra como funciona a arquitetura do
Data e Delta do ClientDataSet.
www.devmedia.com.br/articles/viewcomp.asp?comp=5717&hl=

Nota do DevMan
Se você quiser mostrar mensagens personalizadas de
erros em seu DSP, basta fazer uso dos eventos OnEditError,
OnPostError e OnDeleteError presentes no ClientDataSet.
Para isso basta acessar o evento que deseja modificar e
inserir a mensagem desejada. Ex:
Figura 4. Exemplo de tela
procedure TForm1.ClientDataSet1EditError
(DataSet: TDataSet;
E: EDatabaseError; var Action:
Listagem 1. Código do evento BeforeUpdateRecord TDataAction);
begin
procedure TForm1.DataSetProvider1BeforeUpdateRecord( MessageDlg(‘Não são permitidas
Sender: TObject; SourceDS: TDataSet; DeltaDS: alterações nessa tabela.’,
TClientDataSet; UpdateKind: TUpdateKind; mtInformation, [mbOk], 0);
var Applied: Boolean); Action := daAbort;
begin end;
if UpdateKind <> ukDelete then
if ((VarIsNull(Del taDS.FieldByName (‘ORDER_DATE’)
.NewValue) = False) and Note que estamos alterando o parâmetro Action
  (VarIsEmpty(DeltaDS.FieldByName(‘ORDER_DATE’)
.NewValue) = False)) then para daAbort, dessa forma a mensagem original do
if DeltaDS.FieldBy Name(‘ORDER_DATE’ ).NewValue >
DeltaDS.FieldByN ame(‘SHIP_DATE’). OldValue then ClientDataSet não será exibida, mostrando apenas nossa
raise Exception.Create( ‘Data do pedido não pode ser
superior a data de compra.’);
caixa de diálogo.
end;
+ 23/.*&+ '3/(20'+, Xm[W_nnZ , 03@3 + 6)1;
7+ +)/;uN1 )"03')&+ &3 _n_n 7)') Znn ,
7+' (22+ )7)'363 *) @(2.)"(B)CD+ )73*)2
+ 6)17+ +)/;uN1 )"03')&+< I+' A(1 +2
&+(2 W"0(1+2 '3/(20'+2 A+')1 (*6".2+2
*) 0)>3")< % 7)'0(' &+ 1+13*0+ -.3 +
1:0+&+ 788,6)8?'#$4 &+ +,*$"#3'#'/$# Listagem 2. Código do botão Delta
A+' 6F)1)&+, + 3/V A)'# ) 1+*0)/31 &)2 procedure  TForm1.Button2Click(Sender: TObject);
(*20'.CJ32 Xnj 3 )2 3*@()'# )+ 23'@(&+' begin
try
&3 &)&+2, -.3 7+' 2.) @3B 3436.0)'# 0+&+   Delta.Close;
Delta.Data := ClientDataSet1.D elta;
+ 7'+6322+ &3 )0.)"(B)CD+<   Delta.Open;
except
MessageDlg(‘Sem registros no Delta’,
Usando o evento OnUpdateError   end;
mtWarning, [mbOK], 0);

9)2 23CJ32 )*03'(+'32 @(1+2 -.3 : end;


7+22?@3" (*6".(' 13*2)/3*2 73'2+*);
"(B)&)2 *) )7"(6)CD+ 7)') "(&)' 6+1
3''+2 &+ 2(2031)< %-.( @3'31+2 6+1+
0')>)"F)' 6+1 + 3@3*0+ 1")8?'#$C%2
%5%< 93"3 7+&31+2 (*03'6370)' + 3''+,
7'+6322#;"+, 6+''(/(;"+ 3 )0: 1321+
1+&(A(6#;"+ 7)') -.3 + .2.#'(+ A(*)"
03*F) 1)(2 6+*A()*C) *+ )7"(6)0(@+ 3
3*03*&) 13"F+' 0.&+ -.3 320# )6+*;
0363*&+< % 23/.(' 3*6+*0')1+2 .1)
 >'3@3 &326' (CD+ &3 6)&) 7)'q130'+ &+
3@3*0+, >31 6+1+ 2.) )22(*)0.')E
OnUpdateError(Sender: TObject;
DataSet: TClientDataSet;
E: EUpdateError;
UpdateKind: TUpdateKind;
var Response: TResolverRespons e);

} /$"?$%e 3'#'/$%V%5=*?$% -.3 &(27)'+.


+ 3''+[
} 3'#'/$#e 3'#'/$#  0317+'#'(+ 7)')
)6322)' + 3''+[
} Ce !>H30+ &3 3463CD+[
} )8?'#$y*"?e \(7+ &3 >8?'#$x
} B$485"4$e %CD+ &3 '327+20) )+ 3''+[

%22(1 6+1+ +2 3@3*0+2 -.3 H# @(;


1+2, )-.( *M2 7+&31+2 .2)' +2
@)"+'32 N$MX',>$R_9+@+ G)"+'`U 3
1,?X',>$R_G)"+' %*03'(+'`U &+ ;A*$,?<
\)1>:1 : 7+22?@3" .0("(B)' + @)"+' +>%2
X',>$ R_G)"+' )0.)"`U, -.3 (*&(6) + @)"+'
)0.)" &+ >)*6+ &3 &)&+2< O+1 (22+ 7+;
&31+2 @(2.)"(B)' + @)"+' +'(/(*)", @)"+'
)'1)B3*)&+ )0.)"13*03 3 + @)"+' -.3
&3@3'# 23' )7"(6)&+<

www.devmedia.com.br/clubedelphi/portal.asp

Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma


vídeo aula de Guinther Pauli que mostra como a arquitetura os Data
Packets no ClientDataSet.
www.devmedia.com.br/articles/viewcomp.asp?comp=5932&hl=
Figura 7. Exemplo de tela com o Delta
! 7)'q130'+ &3 3463CD+, C , 7+22.( .1)
7'+7'(3&)&3 6F)1)&) 1%*J*"',C@($8#*5"<
L"3 73'1(03 -.3 @+6^ +>03*F) + @)"+' +'(;
/(*)" &) 3463CD+ /3')&) 73"+ 3''+< O+1
8KL 7+&31+2 .2)' ) 6")223 C3HC"J*"$2
C%%5% 7)') +>03' + 6M&(/+ &3 3''+<
p (17+'0)*03 "31>')' -.3 &373*&3*&+
&) -.)*0(&)&3 &3 3''+2 13*6(+*)&) *)
6F)1)&) )+ 788,6)8?'#$4 , )2 3463CJ32
*D+ 23'D+ 7'+7)/)&)2, (22+ 7+'-.3 7+&3;
1+2 "(1(0)' + *W13'+ &3 3''+2 0+"3')&+2
73"+ +,*$"#3'#'/$#<
L473'(13*03 &(/(0)' + 6M&(/+ &) ./-)(X
0+1 4 *+ 3@3*0+ 1")8?'#$C%%5% &+ 3/V ,
3436.03 ) )7"(6)CD+ 3 &(/(03 .1 @)"+'
-.)"-.3' *+ 6)17+ X0)0.2< K37+(2 2)"@3
3 6"(-.3 31 788,6< a37)'3 *) 13*2)/31
-.3 : 34(>(&) *) </0,$( A<

Configurando UpdateMode e
ProviderFlags
\')>)"F)' 6+1 3/V *D+ : 0D+ &(A?6("
-.)*0+ 23 73*2), 1)2 1.(0+2 23 )0');
7)"F)1 6+1 2.)2 6+*A(/.')CJ32< s1)
&)2 6+(2)2 -.3 1)(2 2+. (*&)/)&+, &(B
'3273(0+ N2 7'+7'(3&)&32 )8?'#$95?$ &+
3'#'/$#V%5=*?$%  3 V%5=*?$%A,'J4 &+ +,*$"2
#3'#'/$#< 9D+ F# 23/'3&+2 1(')>+")*032
*322)2 &.)2 7'+7'(3&)&32, @3H)1+2 + -.3
6)&) .1) 2(/*(A(6) 3 6+1+ A.*6(+*)<
L1 2.1) 031+2 )73*)2 0'^2 320)&+2 &+
)8?'#$95?$ -.3 2D+E
} >8D0$%$7,,e s0("(B) 0+&+2 +2 6)17+2 *)
6"#.2.") D0$%$ 7)') 3*6+*0')' + '3/(20'+[
} >8D0$%$+0'"J$?e  s0("(B) )73*)2 +2
6)17+2 )"03')&+2 *) 6"#.2.") D0$%$ 7)')
3*6+*0')' +2 '3/(20'+2[
} >8D0$%$y$61",6e  s0("(B) )73*)2 +2
Figura 8. Delta do ClientDataSet1 sendo visualizado 6)17+2 6F)@3 7)') 7'+6.')' +2 '3/(20'+2<
831, 7') 23' 1)(2 +>H30(@+ 0+&) @3B
-.3 6F)1)1+2 + 1:0+&+ 788,6)8?'#$4 ,
+ +,*$"#3'#'/$#   3*@() +2 3'#' V'(O$#p4
7)') + 3/V -.3 23 3*6)''3/) &3 @)''^;"+
3 1+*0)' )2 (*20'.CJ32 Xnj -.3 23'D+
3*@()&)2 )+ 23'@(&+' 3 7+203'(+'13*03
)7"(6)&)2 )+ >)*6+< n.)*&+ 7)22)1+2
7)') + 3/V   ) +7CD+ >8D0$%$7,, , 3"3
1+*0)'# .1) (*20'.CD+ .0("(B)*&+
0+&+2 +2 6)17+2 &) 0)>3") 31 2.)
Figura 9. Mensagem personalizada no evento OnUpdateError 6"#.2.") D0$%$ 7)') -.3 + '3/(20'+ 23H)
)0.)"(B)&+< X.7+*&+ -.3 *+22) 0)>3") V%5=*?$%A,'J &(A3'3*03< L*0D+ 73*2)1+2 '30(')&+2 +2 )0'(>.0+2 &+ V%5=*?$%A,'J4 ,
7+22.( +2 6)17+2 !3c N19Cc CN3C2 *) 23/.(*03 2(0.)CD+E *+22+ .2.#'(+ 7+(2 0+&) ) '3/') &3 *3/M6(+ +. 7)'03
BC+1c +!373Cc C/;731 3 ;CKCA1NC , 3*0'+. *) 03") &3 6)&)20'+ &3 O" (3*032 &3"), &373*&3 &322)2 7'+7'(3&)&32 >31
23*&+ -.3 )73*)2 + 6)17+ !3 : 6F)@3, 3 )"03'+. )73*)2 + *+13 &+ 6"(3*03< 6+*A(/.')&)2<
(1)/(*3 ) (*20'.CD+ 1+*0)&) 73"+ 3/V %+ 3A30.)' .1 788,6)8?'#$4 , + 3/V
-.)*&+ )73*)2 + 6)17+ ;CA1NC A+223 3*0') 31 )CD+ 3 A)'# ) 1+*0)/31 &) Considerações finais
)"03')CD+< G3H)E (*20'.CD+< % (*20'.CD+ 1)(2 23*2)0) ! 6+17+*3*03 ;3'#'/$#V%5=*?$%  )(*&)
UPDATE CLIENTES SET TELEFONE=’555-5525’
-.3 + KXI 7'36(2) 1+*0)' 6+*2(203 7+22.( .1) 2:'(3 &3 +.0')2 A.*6(+*)"(;
WHERE ID=ID, NOME=NOME, ENDERECO=ENDERECO, )73*)2 31 A)B3' .1 )8?'#$  .2)*&+ &)&32 -.3 *D+ 7.&3')1 23' @(20)2 )-.(
CIDADE=CIDADE, TELEFONE=TELEFONE
6+1+ 6)17+ &3 )"03')CD+ + 9+13, 3 7+' 6+*0) &) 2.) 6+17"34(&)&3, 6+1+
I3'63>) -.3 ) 6"#.2.") D0$%$  7+22.( *) 6"#.2.") D0$%$ *36322(0)1+2 )73*)2 7+' 34317"+ N$4#$? 3'#'/$#4 3 + .2+ &3
0+&+2 +2 6)17+2 &) 0)>3"), + -.3 : &32*3; &+2 6)17+2 &) 6F)@3, -.3 *3223 6)2+ 7)6+032 &3 &)&+2 73'2+*)"(B)&+2 7)')
6322#'(+< X3 + 1321+ 6)2+ A+223 )7"(6)&+ @)1+2 (1)/(*)' + !3  &+ 6"(3*03< s1) 1+*0)/31 &3 #5O$"p4  &3 @)"(&)CD+ +.
.0("(B)*&+ ) +7CD+ >8D0$%$+0'"J$? ) (*20'.CD+ 23'()E ,5J4 &3 3@3*0+<
(*20'.CD+ 23'()E UPDATE CLIENTES SET NOME=’JOSE DA SILVA’ p )"0)13*03 '36+13*&#@3" A)B3' .1
WHERE ID=ID
320.&+ )7'+A.*&)&+ &3 0+&+2 +2 13;
UPDATE CLIENTES SET TELEFONE=’555-5525’
WHERE TEFONE=TELEFONE I)') 6+*A(/.')' + +,*$"#3'#'/$#  &3 0)" 6)*(21+2 3 0:6*(6)2 7') .0("(B)CD+ &3
A+'1) -.3 322) 23H) ) (*20'.CD+ >)23, 0+&+2 +. 73"+ 13*+2 /')*&3 7)'03 &+2
93223 6)2+ 03'?)1+2 7'+>"31)2, 7+(2 7+; 7'36(2)1+2 1+&(A(6)' +2 V%5=*?$%A,'2 '36.'2+2 &3223 A)*0#20(6+ 6+17+*3*03<
&3'?)1+2 73'&3' ) '3A3'^*6() 3 )0.)"(B)'  J4   &+ 6)17+ !3   7)')') z8&!")8?'#$c ]17+'0)*03 0)1>:1 "31>')' -.3 :
+ '3/(20'+ (*6+''30+< ! 13"F+' &3 0+&+2  8&!"D0$%$c 8&!"y$6{< !2 &31)(2 6)17+2 73'A3(0)13*03 7+22?@3" .0("(B)' +.0')2
+2 6)2+2 : .2)' ) +7CD+ >8D0$%$y$61",6 A(6)1 6+*A(/.')&+2 )73*)2 6+1 )2 320'.0.')2 &3 6+17+*3*032 6+1 + KXI,
-.3 1+*0) ) (*20'.CD+ .2)*&+ )73*)2 +2 &.)2 7'(13(')2 +7CJ32< K322) A+'1) 6+1+ 7+' 34317"+ ;3'#'H'4$4r ;s>$%6
6)17+2 &) 6F)@3 7'(1#'(), 34E /)')*0(1+2 -.3 +2 &)&+2 23'D+ )0.)"(; r;3'#'/$#V%5=*?$%r;+,*$"#3'#'/$#<
B)&+2 6+''30)13*03<
UPDATE CLIENTES SET TELEFONE=’555-5525’
WHERE ID=ID Conclusão
Configurando dinamicamente b)")' 2+>'3 ;3'#'/$#V%5=*?$%  *D+ :
I+' A(1 '320)1 )2 6+*A(/.')CJ32 &+2 UpdateMode e ProviderFlags A#6(", @(20+ -.3 2.) 6+17"34(&)&3 :
6)17+2 *+ +,*$"#3'#'/$#< 93223 6)2+ ) L22) W"0(1) 30)7) &3 *+22+ )'0(/+  >)20)*03 )"0) 3 ) -.)*0(&)&3 &3 '3 ;
6+*A(/.')CD+ )6+*0363 6)17+ ) 6)17+ &31+*20') 6+1+ A)B3' ) 6+*A(/.')CD+ 6.'2+2 34(203*032 : A)*0#20(6)< ! .2+
*+2 A*$,?p4 C?*#5% &+ +>H30+< ! 7'(*6(7)" &+ )8?'#$95?$ 3 V%5=*?$%A,'J4  &(*); &3 3'#'/$#V%5=*?$%   *+ &(););&(), A)B
+>H30(@+ &+2 V%5=*?$%A,'J4   : (*A+'1)' 1(6)13*03, + -.3 *) @3'&)&3 *D+ F# 6+1 -.3 ) 7'+/')1)CD+ 23H) 2317'3
)+ 3'#'/$#V%5=*?$%  -.)" ) 7'+@(&^*6() 23/'3&+ )"/.1< .1) 6)(4(*F) &3 2.'7'32), H# -.3 2+;
23'# 0+1)&) 6+1 6)&) 6)17+< ! 1)(2 % 7'+7'(3&)&3 )8?'#$95?$ &+ 3'#'/$2 1+2 6)7)B32 &3 &326+>'(' (*W13')2
(17+'0)*03 : 3*03*&3' -.3 *31 0+&+2 #V%5=*?$%  7+22.( )73*)2 0'^2 +7CJ32, 3 A(*)"(&)&32 3 A.*6(+*)"(&)&32 7)') +
+2 6)17+2 7'36(2)1 23' )"03')&+2 *+ 7)') 1+&(A(6#;") 31 0317+ &3 3436.CD+ 6+17+*3*03< I+' (22+ : '36+13*&#@3"
 >)*6+ &3 &)&+2, 6+1+ 6)17+2 @(*&+2 &3 )73*)2 )0'(>.) + @)"+' &('30)13*03 ) 2.) -.3 23 320.&3 ) A.*&+ 0+&)2 )2 2.)2
 W5*"4 6+1 +.0')2 0)>3")2< O+1+ (*A+'1)' 7'+7'(3&)&3, @3H)E 7)'0(6.")' (&)&32< 93223 )'0(/+ @( 1+2
3/V -.3 &303'1(*)&+ 6)17+ 73'03*63 ) +2 7'(*6(7)(2 )27360+2 &) 7'+/')1);
DataSerProvider1. UpdateMode := upWhereAll;
+.0') 0)>3") 3 *D+ : *36322#'(+ /')@#;"+P CD+ 6+1 3/V  3 23.2 7'(*6(7)(2 '36.';
p )? -.3 3*0')1 +2 V%5=*?$%A,'J4< X.)2  z# + +,*$"#3'#'/$#  ) F(20M'() 1.&) &3 2+2, &(6)2 3 1)63032<
+7CJ32 2D+E A(/.')< 93"3, 2.) 7'+7'(3&)&3 V%5=*2 L273'+ -.3 03*F)1 /+20)&+< s1 A+'03
}  8& !")8 ?' #$ e   O)17+ (*6".2+ *+2 ?$%A,'J4  : &+ 0(7+ 3*.13')&+, +. 23H), )>')C+ 3 )0: ) 7'M4(1)<
)8?'#$4x 7+&3 03' 1)(2 &3 .1 @)"+'< Q321+
} 8&!"D0$%$e  O)17+ (*6".2+ *) 6"#.2.; )22(1 )(*&) : >)20)*03 2(17"32 &3
") D0$%$x s2)&+ 7)') 3*6+*0')' + '3/(20'+ A)B3' ) (17"313*0)CD+< %73*)2 )0'(;
+'(/(*)"[  >.) + @)"+' 3*0 '3 6+"6F3032 )+ 6)17+
}  8&!"y$6e  O)17+ 6F)@3[ s2)&+ 7)') -.3 &323H) )&(6(+*)' +2 V%5=*?$%A,'J4 , Dê seu feedback sobre esta edição!   u
  e
   s
 F eedb ac  
 
k  

3*6+*0')' + '3/(20'+ +'(/(*)"[ 6+1+ 23/.3E      ê


     D

} 8&\*??$"e  O)17+ +6."0+[ O)17+ (*; A Java Magazine tem que ser feita ao seu
6".2+ &+ 3'#' V'(O$# , 1)2 : .2)&+ )73*)2 ClientDataSet1.FieldByName(‘CustNo’). gosto.Para isso, precisamos saber o que    a
    e
  e
  s
  t
ProviderFlags := [pfInUpdate,pfInKey];   i   d

7)') 3*6+*0')' + '3/(20'+ +'(/(*)"[ você, leitor, acha da revista!       o    ç
    ã

O+1+ 7+&3 @3', : 1.(0+ 2(17"32< XM : Dê seu voto sobre este artigo, através do link:
I)') 23' 1)(2 &('30+, 6)&) 6)17+ 7'36(2+ 0+1)' 1.(0+ 6.(&)&+ 31 -.)" www.devmedia.com.br/javamagazine/feedback 
31 .1 A*$,?p4 C?*#5% 7+&3 '363>3' .1 + 1+13*0+ -.3 23'D+ )&(6(+*)&+2 +.
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

ClientDataSet
Automatizando o tratamento de Erros

n .31 H# 6'(+. )"/.1 0(7+ &3


)7"(6)0(@+ -.3 A(B3223 )6322+
6+1 >)*6+ &3 &)&+2 3 -.3
03@3 -.3 (17"313*0)' )"/.1) A+'1)
7)') 0')0)' +2 3''+2 '30+'*)&+2 73"+
Criando o componente
MyClientDataset
G)1+2 (*(6()' ) 6'()CD+ &3 6+17+*3*03,
7)') (22+ (*(6(3 + K3"7F( R320+. .0("(B)*;
&+ ) @3'2D+ {, 1)2 *)&) (173&3 -.3 23
X=8K, 2)>3 + -.)*0+ @)( 23' W0(" ) .23 +.0') @3'2D+U, *+ 13*. 7'(*6(7)",
.0("(B)CD+ &3223 6+17+*3*03 R6'()&+ 3*0'3 *) +7CD+ O+17+*3*0  93V
*3203 )'0(/+U, 7+(2 6+1 3"3 *D+ 23'# O+17+*3*0< O+1 (22+ 23'# )>3'0) ) 03")
1)(2 *36322#'(+ 03' -.3 (17"313*0)' &) </0,$( 2< G3H) ) D(:+7( 2<
)"/.1 1:0+&+ &3 0')0)13*0+ 31 %7M2 (*A+'1)' +2 @)"+'32 )6(1), 6"(-.3
0+&+2 +2 6+17+*3*032 O"(3*0K)0)230 31 !t, 23'# 6'()&+ + )'-.(@+ A+*03 &+
327)"F)&+2 73"+ )7"(6)0(@+< *+22+ 6+17+*3*03< %/+') 2M 7'36(2)1+2
! 7'(*6(7)" +>H30(@+ &3223 6+17+; (17"313*0)' )2 *+@)2 A.*6(+*)"(&)&32
*3*03 : '30(')' &+ &323*@+"@3&+' ) *+ 6+17+*3*03< G)1+2 (*(6()' (*6".(*&+
*36322(&)&3 &3 (17"313*0)' '+0(*)2 *+ .232 &+ *+22+ 6+17+*3*03 )2 .*(0€2
7)') 0')0)' +2 3''+2 '30+'*)&+2 *+ >)*; *36322#'()2 7)') 6+17(")CD+ 3 6'()' .1
6+ &3 &)&+2 )0')@:2 &+2 3@3*0+2 !*; *+@+ 0(7+ 6F)1)&+ \QuL''+'2 7)') (&3*;
a36+*6("3L''+' 3 !*I+20L''+'< 93223 0(A(6)' +2 3''+2 '30+'*)&+2 R./-)(0+1 2U<
)'0(/+ ('3( 6'()' 3223 *+@+ 6+17+*3*03 O+1 (22+ 6+*6".?&+, @)1+2 (*23'('
&3'(@)&+ &) 6")223 \O"(3*0K)0)230< +2 1:0+&+2, + 6+*20'.0+' 3 + &320'.0+'
Rodrigo Lazoti !2 3''+2 0')0)&+2 73"+ 6+17+*3*03 &+ 6+17+*3*03, ('3( 6'()' &.)2 A.*CJ32
(rodrigolazoti@yahoo.com.br)
é programador e desenvolvedor Delphi, .Net, 2D+ >)23)&+2 *)2 13*2)/3*2 '30+'; 2+>'36)''3/)&)2 6+1 + *+13 &3 K3036;
Java,Php e Asp. Possui certificação SCJP e atu- *)&)2 .0("(B)*&+ + >)*6+ &3 &)&+2 0)'L''+2 7)') (&3*0(A(6)' + 3''+ '30+'*)&+
almente trabalha como consultor J2EE. b('3>('&< 73"+ X=8K, @3' 31 -.)" +7CD+ &+ *+22+
0(7+ 6'()&+ ) 13*2)/31 &3 3''+ 23 3*;
-.)&') 3 '30+'*#;") 6+1+ '32."0)&+ &)
A.*CD+< O'()'3( 0)1>:1 &+(2 7'+63&(;
13*0+2 2+>'36)''3/)&+2 6+1 + *+13 &3
a30+'*)'L''+2 -.3 031 6+1+ A(*)"(&)&3
&(27)')' .1) *+@) 3463CD+ 0')0)&) 7)')
+ )7"(6)0(@+< L 7)') A(*)"(B)' 6'()'3( &+(2
1:0+&+2 7)') A)B3' + @?*6."+ 6+1 +2
3@3*0+2 +*a36+*6("3L''+' 3 +*I+20L''+'
&+ 6+17+*3*03< I'(13('+ @)1+2 (*6".('
)2 &36")')CJ32 &) 2322D+ 7'(@)03 &+ 6+1;
7+*3*03 R./-)(0+1 4U<
%*032 &3 6'()'1+2 + 6+'7+ &32232 1:0+;
&+2 @)1+2 (*6".(' +2 1:0+&+2 '320)*032
7)') 6'()' + 6+'7+ &3 0+&+2 +2 1:0+&+2
&3 .1) @3B< G3H) *) ./-)(0+1 5 +2 1:;
0+&+2 &) 2322D+ 8>L,*(<
I'+*0+, )/+') H# 031+2 0+&+2 +2 1:0+;
&+2 -.3 ('31+2 .2)' 31 *+22+ 6+17+;
*3*03 &36")')&+2< %73'03 O0'"…XF(A0…O
7)') -.3 23H) 6'()&+ ).0+1)0(6)13*03
+ 6+'7+ &3 0+&+2 +2 1:0+&+2 &+ 6+17+; Figura 1. Criando um novo componente derivado da classe TClientDataset
Campo Valor Descrição
Ancestor type TClientDataset Contém a classe que nosso componente será derivado.
Class name TMyClientDataset O nome da classe do novo componente
Palette Page ClubeDelphi O nome da aba onde o componente será instalado.
Unit file name C:\Arquivos de programas\Borland\Delphi7\Lib\MyclientDataset.pas Nome e local do arquivo fonte do componente criado.
Tabela 1. Informações iniciais para criação do componente

Listagem 1. Declarando o novo tipo de retorno e incluindo as unit’s no uses *3*03 3 (*2(') ) 6+&(A(6)CD+ &+2 1:0+&+2
unit MyClientDataSet;
6+*A+'13 ) ./-)(0+1 ;<
interface
! 6M&(/+ 320# 0+&+ 6+13*0)&+ 7)')
A#6(" 3*03*&(13*0+< I'+*0+, *+22+ 6+1;
uses
SysUtils, Classes, DB, DBClient; 7+*3*03 320# A(*)"(B)&+, 2)"@3 ) .*(0<
type
9+ 13*. 7'(*6(7)" &+ K3"7F( 6"(-.3 31
TMyErrors = (meViolacaoChav e, meValidacao, meChavePrimaria , meChaveEstrange ira, O+17+*3*0  ]*20)"" O+17+*3*0< 9)
meConflito, meOutros);
+7CD+ s*(0 A("3 *)13 (*A+'13 + "+6)" 3
type
TMyClientDataSet = class(TClientDat aSet) *+13 &) .*(0 6'()&), 6"(-.3 31 !t, 23'#
  private
{ Private declarations }
)>3'0) .1) H)*3") 6+1 + 7)6+03 KOjsXa<
  protected KIt, 6+17("3 + 7)6+03, 6+1 (22+ + *+@+
{ Protected declarations }
  public 6+17+*3*03 H# 320)'# &(27+*?@3" 7)') +
{ Public declarations }
  published .2+< L473'(13*03 .0("(B)' + *+@+ 6+17+;
{ Published declarations }
  end;
*3*03 6+1 +2 6+17+*3*032 &+ &>L47'322
)6322)*&+ + b('3>('&, 3 @3H) -.3 3''+2 &+
procedure Register;
23'@(&+', 6+1+ @(+")CD+ &3 6F)@3, 23'D+
implementation
).0+1)0(6)13*03 0')0)&+2<
procedure Register;
begin
RegisterComponen ts(‘ClubeDelphi’, [TMyClientDataS et]);
end;
Conclusão
O+1+ @(1+2 *3223 )'0(/+, ) 6'()CD+
end.
&3 6+17+*3*032 7+&3 *+2 )H.&)' ) *D+
326'3@3' 6M&(/+2 '3730(0(@+2, 0+'*)*&+
Listagem 2. Declarando novos métodos no componente ) 6'()CD+ ) 1)*.03*CD+ &+2 )7"(6)0(@+2
  private 1)(2 A#6("<
{ Private declarations }
FTratarErros :Boolean;
function DetectarErros(e: EReconcileError): TMyErrors; overload;
function DetectarErros(e: EDatabaseError): TMyErrors; overload;
procedure RetornarErros(c ds: TClientDataSet; Err :EReconcileErro r); overload;
procedure RetornarErros(c ds: TClientDataSet; Err :EDataBaseError ); overload;

Listagem 3. Declarando novos métodos no componente


  public
{ Public declarations }
constructor Create(aOwner :TComponent); override;
destructor Destroy; override;
procedure MyReconcileErro r(DataSet: TCustomClientData Set; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction) ;
procedure MyPostError(Dat aSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
Listagem 4. Codificando os métodos do componente
constructor TMyClientDataSet.Create(aOwner: TComponent); ‘Valor inválido ou nulo foi encontrado em campos que contém restrições. ‘+
begin ‘Motivo: ‘ + Err.Message);
// Associa os eventos aos métodos   meChavePrimaria:
inherited Create(aOwner); raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+
Self.OnPostError := MyPostError; ‘O registro não pode ser gravado, ocorreu um erro de duplicidade na chave primária. ‘+
Self.OnReconcileE rror := MyReconcileError; ‘Motivo: ‘ + Err.Message);
end;   meChaveEstrangeira:
destructor TMyClientDataSet.Destroy; raise Exception.Create(‘Erro ao efetuar operação ‘ + cds.Name +
begin ‘.’+#10#13+‘Dependência inválida entre tabelas ligadas. ‘ +
inherited Destroy; ‘Motivo: ‘ + Err.Message);
end;   meConflito:
function TMyClientDataSet.DetectarErros(e: EReconcileError): TMyErrors; raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+
begin ‘O registro foi modificado ou deletado por outro usuário. ‘+
// Verifica qual o erro ocorrido pela mensagem  ‘Motivo: ‘ + Err.Message);
if (Pos(‘VALIDATION ERROR’, UpperCase(E.Messa ge))<>0) then   else
Result := meValidacao raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+
else if (Pos(‘VIOLATION OF FOREIGN KEY’, UpperCase(E.Message))<>0) then ‘Erro desconhecido: ‘+err.Message);
Result := meChaveEstrangei ra   end;
else if (Pos(‘VIOLATION OF PRIMARY OR UNIQUE KEY’, end;
UpperCase(E.Message))<>0) then
Result := meChavePrimaria Procedure TMyClientDataSet.RetornarErros(cds: TClientDataSet;
else if (Pos(‘RECORD NOT FOUND OR CHANGED BY ANOTHER USER’, Err: EDataBaseError);
UpperCase(E.Mes sage))<>0) then Begin
Result := meConflito   cds.CancelUpdates;
  else   cds.Refresh;
Result := meOutros; case DetectarErros(Er r) of
end;   meViolacaoChave:
function TMyClientDataSet.DetectarErros(e: EDatabaseError): TMyErrors; raise Exception.Create( ‘Erro ao salvar ‘ +cds.Name+ ‘.’+
begin ‘Já existe um registro com o código informado!’);
// Trata Key Violation   else
if (Pos(‘KEY VIOLATION’, UpperCase(E.Message))<>0) then raise Exception.Create( ‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+
Result := meViolacaoChave ‘Erro desconhecido: ‘+err.Message);
  else   end;
Result := meOutros; end;
end; procedure TMyClientDataSet.MyPostError(DataSet: TDataSet;
procedure TMyClientDataSet.RetornarErros(cds: TClientDataSet; E: EDatabaseError; var Action: TDataAction);
Err: EReconcileError ); begin
Begin RetornarErros(S elf, E);
// Faz o tratamento do OnReconcileError end;
// Cancela o Update procedure TMyClientDataSet.MyReconcileError(
  cds.CancelUpdates; DataSet: TCustomClientDa taSet;
  cds.Refresh; E: EReconcileError ; UpdateKind: TUpdateKind;
// Trata o tipo de erro var Action: TReconcileActio n);
case DetectarErros(E rr) of begin
  meValidacao: RetornarErros(S elf, E);
raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+ end;
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

Controle on-line de vídeo-locadora - Parte 2


Veja como criar um sistema on-line de controle para uma vídeo-locadora

9 3203 )'0(/+ @3'31+2 ) 6+*0(*.;


)CD+ &) 6'()CD+ &3 .1 2(2031)
5",*"$ 7)') @?&3+;"+6)&+'),
+*&3 A)'31+2 ) 6+*6".2D+ &+2 7'(*6(;
7)(2 7'+6322+2 -.3 3*@+"@31 '323'@)2,
a3"31>')*&+ + )'0(/+ )*03'(+', 6'()1+2
+ >)*6+ &3 &)&+2 6+1 0+&) ) 320'.0.') &3
0)>3")2 *36322#'()2, )":1 &) 6+*A(/.');
CD+ &) 6+*34D+ &+ 2(2031) 6+1 + >)*6+
&3 &)&+2 .0("(B)*&+ +2 6+17+*3*032
'30(')&)2 3 &3@+".CD+ &3 A("132 7+' 32736?A(6+2 7)') 6+*34D+ 6+1 + b('3>('&<
13(+ &3 .2.#'(+2 3 0)1>:1 ) &(27+; O'()1+2 0)1>:1 *+ )'0(/+ )*03'(+' )2
*(>("(&)&3 &3 6+*2."0)2< 9320) 30)7) 7#/(*)2 &3 1)*.03*CD+ &+2 /^*3'+2 3
&+ )'0(/+ A)'31+2 ) 6'()CD+ &3 7#/(*)2 @?&3+2 &) "+6)&+'), +*&3 6'()1+2 0+&+2
7)') ).03*0(6)CD+ &3 .2.#'(+2 3 0)1>:1 +2 *+22+2 6+17+*3*032 &3 6+*34D+ 3
7)') ).03*0(6)CD+ &3 )&1(*(20')&+'32 732-.(2)2 *+ 6M&(/+ &) 7#/(*) R%>"#*:$U,
&+ 2(2031) &3 "+6)&+')< 7'+6322+ 3203 -.3 03'# 6+*0(*.)CD+ *320)
I)') '323'@)2, 6'()'31+2 .1) 7#/(*) 23/.*&) 30)7) &+ )'0(/+<
32736?A(6) )+2 .2.#'(+2 +*&3 +2 132;
1+2 7+&3'D+ '3)"(B)' >.26)2 &3 A(" 132 Login de Usuários
3 '323'@)' +2 1321+2 7)') '30 (')&) *) a30+1)*&+ + 7'+H30+ 6'()&+ *+ )'0(/+
"+6)&+')< \)1>:1 ) 6'()CD+ &3 .1) )*03'(+', )7M2 '3)>3'0+ + 1321+ )&(6(+;
Maikel Marcelo Scheid #'3) )&1(*(20')0(@) 7)') 3A30(@)CD+ &)2 *3 .1) *+@) 7/VQNC; V'J$c )0')@:2 &+
(maikelscheid@gmail.com) '30(')&)2 A3(0)2 7+' 13(+ &3 '323'@)2 13*. A*,$qN$Mr1#0$%r3$,80* &5% QNC;
é técnico em Informática com ênfase em Aná- 5",*"$ 3 1)*.03*CJ32 &3 317':20(1+2, V%5]$(#4rN$M 7/VQNC; A*,$4r7/VQNC;
lise e Programação de Sistemas. Atua na área 7+&3*&+ '3/(20')' *+@)2 "+6)CJ32 +. V'J$ 3 )"03'3 23. *+13 7)') | "+/(*<
de Desenvolvimento de Softwares em Delphi
para plataforma Win32 e .NET com banco de
&3@+"@3*&+ A("132 "+6)&+2, 63*0')"(; )274`< %&(6(+*3 )+ 6+'7+ &) 7#/(*)
dados Firebird e MS SQL. É membro da equipe B)*&+ 3203 7'+6322+ )+2 )&1(*(20'); .1) 0)>3") &3 o "(*F)2 3 Z 6+".*) 6+1
Editorial ClubeDelphi. &+'32 &) "+6)&+')< Txx 7(43"2 &3 ")'/.')< 9) 7'(13(') "(*F)
– - –

&(/(03 + 0340+ _j+/(* &3 O"(3*032` 3 A)C) &3 (*A+'1)CJ32 6+''30)2 *) ).03*0(6)CD+, % 34(20^*6() &3 .1 >"+6+ #%6QQ$@($8# :
) A+'1)0)CD+ &+ 0340+< 9) 23/.*&) "(*F) )"/.1)2 (*A+'1)CJ32 6+*0(&)2 *+ +>H30+ 1.(0+ (17+'0)*03 *3203 0'36F+ &+ 6M&(/+
&) 0)>3") )&(6(+*3 .1) *+@) 0)>3") 6+1 23'D+ )'1)B3*)&)2 31 @)'(#@3(2 &3 7)') (*03'7'30)' ) 23/.(*03 2(0.)CD+E
g "(*F)2 3 g 6+".*)2 +6.7)*&+ Zxx† &) 2322D+ R/$44*5"U 7)') 23'31 .2)&)2 A.0.; ; X.7+*&+ -.3 + .2.#'(+ 3203H) "+/)&+
")'/.') &(27+*?@3", +*&3 &3@3'# &(/(0)' ')13*03 7)') (&3*0(A(6)CD+ 3 @)"(&)CD+ *+ 2(2031), "+/+ ) /$44*5"z}N19Cp{ 03'#
*)2 "(*F)2 &) 7'(13(') 6+".*) + 0340+ &3 .2.#'(+2< %&(6(+*3 0)1>:1 H.*0+ )2 .1 @)"+' '3")6(+*)&+ 3 + 1321+ 23'#
_s2.#'(+` 3 _X3*F)` 3 *)2 "(*F)2 &) )4$4 &) 7#/(*) + "':$48'($ A*%$L*%?/sKQ 34(>(&+ *+ KL,)4>'%*5 , 1)2 *+ 6)2+ &3
23/.*&) 6+".*) )&(6(+*)' &+(2 6+17+; 3'#'QA*%$L*%? -.3 7+22(>("(0)'# + 0')>)"F+ + .2.#'(+ *D+ 03' '3)"(B)&+ ) ).03*0(;
*3*032 ;$@#H5@F_040s23'`, _040X3*F)`U 6+1 + +>H30+2 &3 6+*34D+ 3 732-.(2) 6)CD+ 3 ) 23CD+ N5:$ *D+ 34(20(', .1
)"03')*&+ ) 7'+7'(3&)&3 ;$@#95?$ &+ 7)') b('3>('&< 0')0)13*0+ &3 3''+2 A)B 6+1 -.3 + >"+6+
#@#/$"0' 7)') _V'44M5%?`< %&(6(+*3 *) $@($8# '3&('36(+*3 + .2.#'(+ &3 @+"0) N
"(*F) T .1 H>##5"F_>0*j+/(*`U 3 *) Validando usuários na página 7#/(*) &3 ,5J*" , (*(>(*&+ 23. )6322+ )
W"0(1) "(*F) &) 0)>3") 6'(3 .1 ,*"O 7)') % @)"(&)CD+ &+2 .2.#'(+2 *) 7#/(*) : 0+&)2 )2 7#/(*)2 +*&3 + )4$% +5"#%5,
+ ,5J*" &+2 )&1(*(20')&+'32, &('36(+;  >)20)*03 2(17"32 &3 23' (17"313*0)&)< 320(@3' 23*&+ .0("(B)&+<
*)*&+ N 7#/(*) ,5J*"u'?:Q'48@ -.3 23'# j+6)"(B3 *+ 7'+H30+ + )4$% +5"#%5, >((5"2
6'()&) *+ &36+''3' &+ )'0(/+< #%5,$Q'4(@ 6'()&+ H# *+ (*?6(+ &+ )'0(/+ 3 Página de Reservas OnLine do
%6322)*&+ + 6M&(/+ &) 7#/(*) R.23 6+1 .1 &.7"+ 6"(-.3 2+>'3 .1) #'3) 31 cliente
) 036") &3 )0)"F+ A_[U, 6'(3 ) 6+*20)*03  >')*6+, )63223 + 3@3*0+ K5'? &+ 1321+ 9+ 13*. A*,$qN$Mr1#0$%r3$,80* &5%
_20'O+*34)+` *) #'3) !"#$%&'($ &) 7#/(*) +*&3 &3@3'# &(/(0)' )2 23/.(*032 "( *F)2 QNC; V%5]$(#4rN$M 7/VQNC; A*,$4r7/VQ
(*A+'1)*&+ ) 4#%*"J &3 6+*34D+ 6+1 + &3 6M&(/+E NC; V'J$ 6'(3 .1) *+@) 7#/(*) 2)"@)*;
 >)*6+< L223 @)"+' 23'# .2)&+ 1)(2 )&()*; try &+;) 6+1+ _.23'k'323'@)2<)274`< %&(;
03 7)') -.3 + 6+17+*3*03  &L+5""$(#*5" LblUsuario.Text := Session[‘NOME’] .
ToString;
6(+*3 )+ 6+'7+ &) 7#/(*) .1) 0)>3")
)63223 + H3Q K) 1321) 1)*3(') 6+1+ except &3 ZZ "(*F)2 3 Z 6+".*) 6+1 {xx 7(43"2
  Response.Redirect(‘login.aspx’);
.0("(B)&+ *+ )'0(/+ )*03'(+', &36")'3 ) end; &3 ")'/.')< %&(6(+*3 )"/.*2 6+17+;
6+*20)*03 6+*A+'13 6M&(/+ ) 23/.('E
Listagem 1. Evento Click para autenticação de usuário e senha dos clientes
const
strConexao = ‘User=SYSDBA; procedure   TWebForm1.btnLogin_Click(sender:
  Password=masterkey; System.Object; e: System.EventArgs);
  Database=<Caminho>LOCADORA.FDB;’;
var
Comand: FbCommand;
K3 @+"0) )+ 6+'7+ &) 7#/(*) RA_[U, DataAdapter: FbDataAdapter;
Conn: FbConnection;
6+1 .1 &.7"+ 6"(-.3 2+>'3 + L#"K5J*" , prUser : FbParameter;
)&(6(+*3 )+ 23. 3@3*0+ 1"+,*(O + 6M&(/+ prSenha : FbParameter;
fbReader : FbDataReader;
&) ./-)(0+1 2 '327+*2#@3" 7+' '3)"(B)' )
begin
).03*0(6)CD+ &+ .2.#'(+ 3 23*F) &(/(0)&+2 { Criação dos objetos de conexão }
3 &('36(+*)' + .2.#'(+ ) 7#/(*) 6+''32; Conn := FbConnection.Cr eate;
DataAdapter := FbDataAdapter.Cre ate;
7+*&3*03 *+ 2(2031)< ! 6M&(/+ .0("(B)&+ Comand := FbCommand.Create ;
{ Atribuição da string de conexão e abertura do BD}
)6+17)*F) ) 130+&+"+/() 317'3/)&) Conn.Connection String := strConexao;
  Conn.Open;
*+ )'0(/+ &) 3&(CD+ )*03'(+', +*&3 "+/+ { Atribuição dos atributos de seleção dos dados }
&3 (*?6(+ 6'()1+2 0+&+2 +2 6+17+*3*032 DataAdapter.Sel ectCommand := Comand;
DataAdapter.Sel ectCommand.Connec tion := Conn;
3 )0'(>.?1+2 ) 4#%*"J &3 6+*34D+ 6+1 + DataAdapter.Sel ectCommand.Comman dText :=
‘select clientes.nome, clientes.cod_cliente ‘ +
 >)*6+ )+ +5"" , 6+17+*3*03 &3 6+*34D+< ‘from clientes where ((clientes.login = ?) and
(clientes.senha = ?))’;
L1 23/.(&) )0'(>.?1+2 ) 6+*34D+ )+ prUser := FbParameter.Crea te;
+>H30+ (*03'*+ &+ 3'#'7?'8#$% 6F)1)&+ prSenha := FbParameter.Cre ate;
  DataAdapter.SelectCommand.Parameters.Add(prUser);
/$,$(#+5::'"? < p 3"3 -.3 '363>3'# ) (*2;   DataAdapter.SelectCommand.Parameters.Add(prSenha);
DataAdapter.Sel ectCommand.Parame ters[0].Value :=
0'.CD+ /sK &3 23"3CD+ &+2 &)&+2 31 2.) txtUser.Text;
DataAdapter.Sel ectCommand.Parame ters[1].Value :=
7'+7'(3&)&3 +5::'"?;$@#< txtSenha.Text;
L1 23/.(&) )0'(>.?1+2 +2 7)'q13; fbReader := DataAdapter.Selec tCommand.ExecuteR eader;
if fbReader.Read then
0'+2 &3 .2.#'(+ 3 23*F) 7)') ) /sK &3
begin
23"3CD+ &+ +5::'"?;$@# )0')@:2 &+ Session[‘USUARIO ’] := txtUser.Text;
Session[‘NOME’] := fbReader[‘NOME’] .ToString;
+>H30+ ALV'%':$#$% 6'()&+ 3 (*20)*6()&+ Session[‘CODIGO’ ] := fbReader[‘COD_CL IENTE’]
237)')&)13*03 7)') 6)&) 7)'q130'+  
 
.ToString;
Response.Redirect(‘user_reservas.aspx’);
)&(6(+*)&+, +*&3 )+ A(*)" 3436.0)1+2 end else
  RegisterStartupScript(‘erro’,’<script>javascript
) 6+*2."0) 3 '3")6(+*)1+2 + '32."0)&+ ) :alert(‘’Usuário ou Senha incorretos!’’);
  </script>’);
.1 +>H30+ AL3'#'B$'?$% -.3 23'# @3'(A(; end;
6)&+ -.)*0+ )+ 2.6322+ &+ ,5J*"Q 9+ 6)2+
*3*032 )+ 6+'7+ &3"), +'/)*(B)*&+;+2 2+>'3 + 3'#'<%*? )63223 2.) 7'+7'(3&); &3 \$'?$% #$@# 7)') _I'3@< K3@`< 31 3'#'
'327360(@)13*03 &3 )6+'&+ 6+1 + &3 7>#5 A5%:'# 3 )7"(-.3 .1 320("+ &3 A*$,? &(/(03 + @)"+' VBCXu3CX1K)+71
,'65># 34(>(&+ *) </0,$( 23 %'')203 A+'1)0)CD+ &323H)&+< 9+@)13*03 6+1 3 31 3'#' A5%:'##*"J C@8%$44*5" + @)"+'
*) 7'(13(') "(*F) &) 0)>3") + )4$% + >+0D+ &('3(0+ &+ 1+.23, )63223 )/+') _‡xE&&rQQruuuuˆ` -.3 A)'# ) A+'1)0);
+5"#%5, >((5"#%5,$Q'4(@ , )7M2 (*2(') .1 + (031 V%58$%#6 H>*,?$% +*&3 ('31+2 CD+ &) A+'1) &3 34(>(CD+ &) &)0)<
H>##5"F_>0*X)('`U *) 23/.*&) "(*F), 1+&(A(6)' ) 320'.0.') &) 6)03/+'() X3"36(+*)*&+ + J%*?B$4$%='4 , A)'31+2
23/.(&+ &3 .1) "(*F) 6+1 + 0340+ +5,>:"4Q K321)'-.3 + (031 +%$'#$ 6+*A(/.')CJ32 2313"F)*032 )2 )7"(6);
_Q(*F)2 j+6)CJ32 %0(@)2` (&3*0(A(; (5,>:"4 '>#5:'#*(',,6 '# %>" #*:$< L1 &)2 *) 6+*A(/.')CD+ &+  J%*?K 5('('5 <
6)*&+ + 6+*03W&+ ) 23' 6)''3/)&+ *+ 23/.(&) 6"(-.3 *+ (031 H5>"? +5,>:" O+1 + >+0D+ &('3(0+ &+ 1+.23 2+>'3 +
3'#'<%*?R_/'(&j+6)6)+`U &) "(*F) 23; 31 7='*,'L,$ (5,>:"4   3 3*@(3;+ 7)') 3'#'<%*? )63223 2.) 7'+7'(3&)&3 7>#5
/.(*03< s1) "(*F) 31 >')*6+ 6+1 .1 /$,$(#$? (5,>:"4< %/+') 23"36(+*3;+ 3 A5%:'# 3 )7"(-.3 .1 320("+ &3 A+'1)0);
327)C+ ('# 237)')' + 6+*03W&+ &+ 0340+ )0'(>.) + @)"+' +13uK1+7+71 *) CD+ )+ 1321+< 9+@)13*03 6+1 + >+0D+
_Q(*F)2 a323'@)2 %0(@)2` (&3*0(A(6)*; 7'+7'(3&)&3 3'#' A*$,? , +*&3 '36 3; &('3(0+ &+ 1+.23, )632 23 )/+') + (031
&+ + 3'#'<%*?R_/'(&a323'@)2`U -.3 23'#  >3'31+2 + @)"+' &+ 6)17+ *) 0)>3") V%58$%#6 H>*,?$% +*&3 ('31+2 1+&(A(;
7'33*6F(&+ 6+1 )2 '323'@)2 )0(@)2 &+ K5('('5 )0')@:2 &+ %$4>,# 4$# &) /$,$(# 6)' ) 320'.0.') &) 6)03/+'() +5,>:"4c
.2.#'(+< %2 W"0(1)2 &) 0)>3") 23'D+ -.3 A)'31+2 *+2 '3/(20'+2 6+1 4#'#>4 +*&3 *+ 0+7+ &) H)*3") &321)'-.3 +
6)')603'(B)&)2 7+' 6)&)20')' *+@)2 _9` (*&(6)*&+ j+6)CD+< K321)'-.3 (031 +%$'#$ (5,>:"4 '>#5:'#*(',,6 '# %>"
'323'@)2, +*&3 )":1 &+ 0340+ (*A+'1); 0)1>:1 ) +7CD+ X*4*L,$ &) 6+".*)< #*:$< L1 23/.(&) 6"(-.3 *+ (031 H5>"?
0(@+ _O'()' *+@) '323'@)` .1 6+17+; %/+') (*2(') .1) *+@) 6+".*), +. 23H), +5,>:" 31 7='*,'L,$ (5,>:"4 3 3*@(3;+
*3*03 3%5835MK*4#F_&&"G(&3+2`U 7)') 6"(-.3 *+@)13*03 31 H5>"? +5,>:" 3 7)') /$,$(#$? (5,>:"4< %/+') 23"36(+*3;
"(20)/31 &+2 @?&3+2 &(27+*?@3(2 7)') 3*@(3;+ 7)') ) #'3) /$,$(#$? (5,>:"4< 9) + 3 )0'(>.) + @)"+' +13uK1+7+71  *)
'323'@) 3 .1 H>##5"F_>0*a323'@)'`U 7'+7'(3&)&3 \$'?$% #$@# R_\340+ &3 6)>3; 7'+7'(3&)&3 3'#' A*$,? , +*&3 '363>3'3;
7)') 2)"@)' + 7'+6322+ &) '323' @)< C)"F+`U, &(/(03 _\(0."+` 3 31 3'#' A*$,? + 1+2 + @)"+' &+ 6)17+ *) 0)>3") K5('('5
X3"36(+*)*&+ +  J%*?K5('(' 5 , A)'31+2 @)"+' ;!;)K1 -.3 : H.20)13*03 + 6)17+ )0')@:2 &+ %$4>,# 4$# &) /$,$(# -.3 A)'3;
)/+') )"/.1)2 6+*A(/.')CJ32 *36322#; '32."0)*03 &3 .1 !""$% W5*" &) 0)>3") 1+2 *+2 '3/(20'+2 6+1 /#'#>4 _a` 7)')
'()2 )*032 &) 6+&(A(6)CD+ &+2 7'+632; K5('('5 6+1 ) 0)>3") X*?$54 2313"F)*03 a323'@)2< K321)'-.3 0)1>:1 ) +7CD+
2+2 -.3 ('D+ 34(>(' )2 ( *A+'1)CJ32 *) 6+1+ *+ 7)22+ )*03'(+'< I+' A(1, )&(6(+*3 X*4*L,$ &) 6+".*)<
7#/(*)< O+1 + >+0D+ &( '3(0+ &+ 1+.23 .1) *+@) 6+".*) 3 )"03'3 2.) 7'+7'(3&); %/+') (*2(') .1) *+@) 6+".*), +.
23H), 6"(-.3 *+@)13*03 31 H5>"?
+5,>:" 3 3*@(3;+ 7)') ) #'3) /$,$(#$?
(5,>:"4< 9) 7'+7'(3&)&3 \$'?$% #$@#
R_\340+ &3 6)>3C)"F+`U, &(/(03 _\(0."+`
3 31 3'#' A*$,? + @)"+' \]\sj! -.3 :
 H.20)13*03 + 6)17+ '32."0)*03 &3 .1
!""$% W5*" &) 0)>3") K5('('5  6+1 ) 0);
 >3") X*?$54 2313"F)*03 6+1+ *+ 7)22+
)*03'(+'< I+' A(1, )&(6(+*3 .1) *+@)
6+".*) 3 )"03'3 2.) 7'+7'(3&)&3 \$'2
?$% #$@# 7)') _K)0) a323'@)`< 31 3'#'
A*$,? &(/(03 + @)"+' _K%\%` 3 31 3'#'
A5%:'##*"J C@8%$44*5" + @)"+' _‡xE&&r
QQruuuuˆ` -.3 A)'# ) A+'1)0)CD+ &)
A+'1) &3 34(>(CD+ &) &)0)<
X3"36(+*)*&+ + ??,X*?$54 , )&(6(+*3 )
2.) 7'+7'(3&)&3 3'#'X',>$A*$,? + @)"+'

Nota do DevMan
Para alterar a largura das colunas, basta entrar novamente
no Property Builder e selecionar o item Format. Nele
podemos definir atributos para várias características do
componente Data Grid. Note que temos a opção Columns.
Expanda este item e clique na última coluna (“Alterar”). À
direita digite 50 no campo Width (“largura”) e confirme.
Figura 1. Layout da página de reservas do usuário
– - –

+13uX!3C1 3 7)') 3'#';$@#A*$,? + @)"+'


Listagem 2. Codificando as ações para carregamento de vídeos, reservas e locações
;!;)K1c 23*&+ 320)2 &.)2 6+".*)2 &3 (*;
A+'1)CJ32 -.3 23'D+ 6)''3/)&)2 )0')@:2 procedure   TWebForm2.CarregaVideos;
var
&+ %$4>,# &3 .1 4$,$(# 31 0+&+2 +2 @?&3+2 Comand: FbCommand;
DataAdapter: FbDataAdapter;
&(27+*?@3(2 7)') '323'@)< Ds: DataSet;
Conn: FbConnection;
! 7'+6322+ 7)') 6)''3/)13*0+ &)2 (*;
A+'1)CJ32 '3-.3' -.3 Z 8%5($?>%$ 3 .1) begin
{ Criação dos objetos de conexão }
 &>"(#*5" 23H)1 6'()&)2, 32736(A(6)*&+ Conn := FbConnection.Cr eate;
DataAdapter := FbDataAdapter.Cre ate;
7)') 6)&) .1) &3")2 6+17+*3*032 -.3 Comand := FbCommand.Create ;
{ Atribuição da string de conexão e abertura
23'D+ 6'()&+2 31 0317+ &3 3436.CD+ do BD}
6+*A+'13 34317"+2 )*03'(+'32 3 -.3 Conn.Connection String := strConexao;
  Conn.Open;
'3-.3'31 ) 6'()CD+ &3 .1) 6+*20)*03 { Atribuição dos atributos de seleção dos dados }
DataAdapter.Sel ectCommand := Comand;
_20'O+*34)+` 3 (*6".2D+ &) "':$48'($ DataAdapter.Sel ectCommand.Connec tion := Conn;
DataAdapter.Sel ectCommand.Comman dText :=
A*%$L*%?/sKQ3'#'QA*%$L*%? *) 6"#.2.") ‘SELECT V.COD_VIDEO, V.TITULO FROM VIDEOS V ‘+
)4$4Q K36")'3 *) 23CD+ V%*='#$ &+ 6M&(/+ ‘WHERE V.COD_VIDEO NOT IN (SELECT LOCACAO.VIDEO
FROM LOCACAO ‘+
) 8%5($?>%$ 3 0)1>:1 ) &>"(#*5" 6+*A+'13 ‘WHERE ((LOCACAO.VIDEO = V.COD_VIDEO) AND
((LOCACAO.STATUS = ‘’R’’) ‘+
"(20) )&()*03 3 )&(6(+*3 ) 6)&) .1) &3")2 ‘OR (LOCACAO.STATUS = ‘’N’’)))) ORDER BY V.TITULO’;
+2 '327360(@+2 6M&(/+2 3*6+*0')&+2 *) { Criação em memória do DataSet auxliar }
Ds := DataSet.Create;
./-)(0+1 4 , 23*&+ -.3 0+&+2 +2 7'+; DataAdapter.Fil l(Ds, ‘Titulo’);

6322+2 3*6+*0')1;23 6+13*0)&+2 3*0'3 Try


{ Popularização dos vídeos no componente da
)2 "(*F)2 &+ 1321+< !>23'@3 -.3 7)') página }
6)''3/)' )2 "+6)CJ32 3 '323'@)2 )0(@)2  
ddlVideos.DataSo urce := Ds;
ddlVideos.DataBind;
.0("(B)1+2 )73*)2 .1) A.*CD+, ) -.)" finally
  Conn.Close;
'3-.3' ) 7)22)/31 &+ 7)'q130'+ /#'#>4 end;
end;
&3 )6+'&+ 6+1 ) 2(0.)CD+ 6)&)20')" &+2
'3/(20'+2 -.3 &323H)1+2 34(>('E function  TWebForm2.CriaListaVideos(Status: String):
DataSet;
var
procedure  CarregaVideos; Comand: FbCommand;
function   CriaListaVideos(Status: DataAdapter: FbDataAdapter;
String):DataSet; Ds: DataSet;
Conn: FbConnection;
b(*)"(B)&) ) 6'()CD+ 3 6+&(A(6)CD+ prCliente : FbParameter;
begin
&+2 1:0+&+2 7)') 6)''3/)' +2 &)&+2 { Criação dos objetos de conexão }
Conn := FbConnection.Cr eate;
&3 "+6)CJ32, '323'@)2 3 @?&3+2 7'36(; DataAdapter := FbDataAdapter.Cre ate;
Comand := FbCommand.Create ;
2)1+2 A)B3' ) 6 F)1)&) &+2 1321+2< { Atribuição da string de conexão e abertura do BD}
I)') (22+ .2)'31+2 + 3@3*0+ K5'? &) Conn.Connection String := strConexao;
  Conn.Open;
7#/(*) +*&3 &3@3'# &(/(0)' )2 23/.(*; { Atribuição dos atributos de seleção dos dados }
DataAdapter.Sel ectCommand := Comand;
032 "(* F)2 &+ 6M&(/+, -.3 ('D+ H+/)' + DataAdapter.Sel ectCommand.Connec tion := Conn;
DataAdapter.Sel ectCommand.Comman dText :=
'32."0)&+ )+2 6+17+*3*032 '3")6(+*); ‘SELECT LOCACAO.COD_LOCACAO, VIDEOS.TITULO,
&+2< !>23'@3 -.3 320)1+2 .0("( B)*&+ ‘ CLIENTES.NOME, ‘ +
‘LOCACAO.PREV_DE VOLUCAO, LOCACAO.DATA FROM ‘ +
) 1321) A.*CD+ 7)') 6)''3/)' )2 ‘ LOCACAO ‘ +
‘ INNER JOIN VIDEOS ON (LOCACAO.VIDEO = ‘ +
'323'@)2 3 "+6)CJ32, )"03')*&+ )73*)2 ‘ VIDEOS.COD_VIDEO) ‘ +
‘ INNER JOIN CLIENTES ON (LOCACAO.CLIENTE = ‘ +
+ @)"+' &+ 7)'q130'+ /#'#>4 '37)22)&) ‘ CLIENTES.COD_CLIEN TE) ‘ +
7)') ) A.*60(+* e ‘WHERE ((LOCACAO.STATUS = ‘ + Status + ‘)
‘ AND (LOCACAO.CLIENT E = ?)) ORDER BY ‘ +
‘ LOCACAO.DATA’;
gridLocacao.DataSource := { Criação dos parâmetros da pesquisa. O Status
CriaListaVideos(‘’’N’’’);
será configurado ao chamar a function }
gridLocacao.DataBind;
prCliente := FbParameter.Crea te;
gridReservas.DataSource :=
  DataAdapter.SelectCommand.Parameters.Add(
CriaListaVideos(‘’’R’’) AND   prCliente);
(LOCACAO.PREV_DEVOLUCAO >= ‘’TODAY’’’); DataAdapter.Sel ectCommand.Parame ters[0].Value :=
gridReservas.DataBind;
Session[‘CODIGO’].ToString;
CarregaVideos;
{ Criação em memória do DataSet auxliar }
Ds := DataSet.Create;
X3 3436.0)' ) 7#/(*) *3203 1+13*0+, DataAdapter.Fil l(Ds, ‘Titulo’);

 H# 7+&3'# 73'63>3' -.3 0+&)2 )2 (*A+'; try


{ Joga o resultado do Select para o Result
1)CJ32 23'D+ "(20)&)2, 7+':1 )(*&) 320# da função }
Result := Ds;
&(27+*?@3" + 6)&)20'+ &3 *+@)2 '323'@)2< finally
s1) *+@) '323'@) 23'# '3)"(B)&) ) 7)'0('   Conn.Close;
end;
&+ (,*(O )+ >+0D+ L#"B$4$%='%  *+ -.)" end;

)&(6(+*3 + 6M&(/+ &) ./-)(0+1 5<


Listagem 3. Código para reservar um vídeo
! 6M&(/+ 0)1>:1 23 .0("(B) &)
6'()CD+ &+2 6+17+*3*032 31 '.*0(;
procedure   TWebForm2.btnReservar_Click(sender:
System.Object; e: System.EventArgs);
13 +*&3 7)22)1+2 .1) (*20'.CD+
Xnj )+ +>H30+ ]*23'0O+11)*& &+
var
Comand: FbCommand; K)0)%&)703' 3 6+*A(/.')CD+ &+2
DataAdapter: FbDataAdapter;
Conn: FbConnection; 7)'q130'+2 &3 6)&)20'+2< %+ 3436.;
prVideo : FbParameter;
prCliente : FbParameter;
0)'1+2 ) (*20'.CD+, 3 + '32."0)&+ A+'
prData : FbParameter; &3 2.6322+, 6F)1)1+2 +2 1:0+&+2
prStatus : FbParameter;
prDev : FbParameter; 7)') -.3 ) 7#/(*) 23H) '36)''3/)&) 3
begin
)2 (*A+'1)CJ32 )0.)"(B)&)2< j31>'3;
{ Criação dos objetos de conexão } 23 &3 )&(6(+*)' *)2 s232 &) 7#/(* ) +
Conn := FbConnection.Cre ate;
DataAdapter := FbDataAdapter.C reate; *)1327)63 K)03s0("2 &) -.)" 320)1+2
Comand := FbCommand.Create;
6F)1)*&+ .1) A.*CD+ 7)') ( *6'313*;
{ Atribuição da string de conexão e abertura do BD}
Conn.ConnectionS tring := strConexao;
0)' 63'0) - .)*0(&)&3 &3 &()2 N &)0) &3
  Conn.Open; @3*6(13*0+ &) '323'@)<
{ Atribuição dos atributos de seleção dos dados } %&(6(+*3 0)1>:1 )+ 3@3*0+ 1"+,*(O &+
DataAdapter.Inse rtCommand := Comand;
DataAdapter.Inse rtCommand.Connect ion := Conn;
L#"/'*% + 6M&(/+ )&()*03 7)') A)B3' + '3;
DataAdapter.Inse rtCommand.Command Text := &('36(+)13*0+ &) 7#/(*) 3 )7M2 3436.03
‘INSERT INTO LOCACAO ‘+
‘(VIDEO, CLIENTE, DATA, STATUS, PREV_DEVOLUCAO) ) 7#/(*) A)B3*&+ .1) *+@) '323'@) 7)')
‘VALUES (?, ?, ?, ?, ?)’;
+ .2.#'(+ ).03*0(6)&+<
  prVideo := FbParameter.Creat e;
prCliente := FbParameter.Creat e;
Response.Redirect(‘login.aspx’);
prData := FbParameter.Creat e;
prStatus := FbParameter.Creat e;
prDev := FbParameter.Creat e;
  DataAdapter.InsertCommand.Parameters.Add(prVideo);
  DataAdapter.InsertCommand.Parameters.Add(prCliente);
Conclusão
  DataAdapter.InsertCommand.Parameters.Add(prData); 9D+ 73'6) ) 7'M4(1) 7)'03 &3203 )'0(/+,
  DataAdapter.InsertCommand.Parameters.Add(prStatus);
  DataAdapter.InsertCommand.Parameters.Add(prDev); +*&3 6+*0(*.)'31+2 ) (17"313*0)CD+
DataAdapter.Inse rtCommand.Paramet ers[0].Value :=
ddlVideos.SelectedValue; &)2 '30(')&)2 3 &3@+".CD+ &3 A("132 7+'
DataAdapter.Inse rtCommand.Paramet ers[1].Value :=
Session[‘CODIGO’].ToString;
13(+ &3 .2.#'(+2 3 0)1>:1 ) &(27+*(;
DataAdapter.Inse rtCommand.Paramet ers[2].Value :=  >("(&)&3 &3 6+*2."0)2<
DateTime.Today.ToString(‘dd.MM.yyyy’);
DataAdapter.Inse rtCommand.Paramet ers[3].Value := ‘R’;
DataAdapter.Inse rtCommand.Paramet ers[4].Value :=
System.&String.Format(‘{0:dd/MM/yyyy}’,
IncDay(DateTime.Today, 7));{Uses DateUtils} Dê seu feedback sobre esta edição!  F eedb ac  
 
  u k  
  e
   s
     ê
if  DataAdapter.InsertCommand.ExecuteNonQuery> 0 then      D
begin A Java Magazine tem que ser feita ao seu o     
s      

 b  
 r  
gridReservas.Data Source := CriaListaVideos (‘’’R’’)   e

AND (LOCACAO.PREV_DEVOLUCAO >= ‘’TODAY’’’); gosto.Para isso, precisamos saber o que   e
  s
  t
   a
    e
  i   d
  gridReservas.DataBind; você, leitor, acha da revista!       o    ç
    ã

  CarregaVideos;
end;
end; Dê seu voto sobre este artigo, através do link:
www.devmedia.com.br/javamagazine/feedback 
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET

Desenvolvendo uma Aplicação Completa com


PocketStudio
Aprenda a criar aplicações para o sistema operacional PalmOS – Parte 3

9 + )'0(/+ )*03'(+', )7'3*&31+2


) 6'()' .1) 0)>3") 3 A)B3' '3A3;
'^*6() ) 3") 31 *+22+ A+'1."#;
'(+ &3 6+*2."0) &3 6"(3*032< O+1 >)23 *+
1321+ 6+*63(0+ 3 )7'3*&(B)&+, A)'31+2
+ IO< I)') (22+ &3@31+2 6'()' .1) *+@)
)"*#c  6+1+ @(1+2 *+ )'0(/+ )*03'(+'<
%63223 + 13*. A*,$qN$Mr)"*# , 2)"@3;)
6+1 + *+13 &3 _I'+&.0+2K8<7)2`< G)"3
"31>')' -.3 7+&31+2 .0("(B)' )2 036")2
) (*6".2D+ &3 *+@)2 03")2 31 *+22+ 2(2; &3 )0)"F+2 +;BK . /0*&# . / 7)') 2)"@)'
031), 0)(2 6+1+E 6)&)20'+ &3 7'+&.0+2 3 *+22+ 7'+H30+< b3(0+ (22+ @)1+2 1+*0)'
&(/(0)CD+ &3 73&(&+2< ) 0)>3") &3 7'+&.0+2<
j31>')*&+ -.3 *+22)2 03")2 *+ 2(2031) j+/+ )>)(4+ &) 7)")@') '323'@)&)
)73*)2 6+*2."0)1 ) >)23 &3 &)&+2 *D+ !"#$%&'($ &36")'3 .1) 23CD+ )4$4  7)')
7+22(>("(0)*&+ ) (*6".2D+ &3 '3/(20'+2< )&(6(+*)'1+2 ) V/K -.3 : ) K*L%'%6 &+
L22) 0)'3A) 23'# 3A30.)&) )0')@:2 &+ 2(*; I+6•30X0.&(+ +*&3 320D+ +2 1:0+&+2
6'+*(21+ 3*0'3 &(27+2(0(@+ 3 IO< *36322#'(+2 7)') 1)*(7.")'1+2 + 8K
I+&3'?)1+2 6'()' 3 .0("(B)' ) 03") 7)') &3*0'+ &) )"*# V/3'#'L'4$< %7M2 ) 23CD+
3&(0)' +2 '3/(20'+2 3 3*@(#;"+2 )+ IO, )4$4 &36")')1+2 .1) *+@) 23CD+ +5"4#
Ricardo C. Boaro 7+':1 31 *+22+ 34317"+ 23'# )73*)2 +*&3 (*A+'1)'31+2 + 3HN':$c 3H;68$
(rboaro@aquasoft.com.br) 1)(2 .1) H)*3") &3 6+*2."0)< %2 03")2 3 +2 ?*&(632 7)') '36.73')CD+ 3 6+*A(/.;
trabalha com desenvolvimento de sistemas -.3 ('D+ 1)*(7.")' (*A+'1)CJ32 2D+ )2 ')CD+ &+2 @)"+'32 *+2 6)17+2 &) 0)>3")
em Delphi há mais de 10 anos e PocketStudio &3 73&(&+2 3 (03*2 &+ 73&(&+< &3 V%5?>#54<
há 3 anos. Atualmente é gerente de informá- ! 7'(13('+ 7)22+ : 6'()'1+2 ) 0)>3") %7M2 ) &3A(*(CD+ &+2 6)17+2 3 23.2
tica na Di Hellen Indústria de Cosméticos, e
atual como instrutor certificado Borland na
7'+&.0+2 7)') )'1)B3*)'1+2 +2 &)&+2 '327360(@+2 ?*&(632, &36")')1+2 .1) 23;
Aquasoft Tecnologia da Informação parceira 3 7+&3'1+2 *)@3/)' 3*0'3 +2 '3/(20'+2< CD+ X'% , +*&3 (*A+'1)'31+2 )+ I+6•30X;
da Borland, em Porto Alegre – RS. Borland j31>')*&+ -.3 322) 0)>3") 23'# 7'33*; 0.&(+ + A*$,?3$&4 3 .1 )'')u< \)1>:1
Instrutor, Delphi 7, 2007 e Certified. 6F(&) *+ 1+13*0+ &+ 2(*6'+*(21+ 6+1 ('31+2 &36")')' )2 @)'(#@3(2 /"+>)(2 -.3
– -

('D+ '3A3'3*6()' *+22) >)23 &3 &)&+2 31 )'0(/+ )*03'(+' 7)') (*6".2D+ &3 H*#:'8p4 *)@3/)'1+2 3*0'3 +2 '3/(20'+2< I)') (22+
0+&+ 7'+H30+< % 320'.0.') &3 0+&)2 )2 0); 3 )22+6()CD+ &3"32 )+2 >+0J32 &) 7)'03 (*; .0("(B)'31+2 )2 A.*CJ32 &) V/3'#'H'4$
 >3")2 6'()&)2 *+ I+6•30X0.&(+ : 2317'3 A3'(+'< ! >+0D+ -.3 A(6)'# )+ ")&+ &+ 0?0."+ &) V/K< I'322(+*3 A_[ *+ A+'1."#'(+ 7)')
) 1321), 6+1+ .1) '363(0) &3 >+"+< Q.; &+ A+'1."#'(+ 23 6F)1)'# _80*G+"0)'`< @(2.)"(B)' ) 7#/(*) &3 6M&(/+ 3 "+6)"(B3
&)1+2 )73*)2 *+13 &) 0)>3") 3 6)17+2, %*032 &3 6+&(A(6)'1+2 +2 >+0J32, 7'3; ) 7)")@') '323'@)&) !:8,$:$"#'#*5"Q
1)2 ) 1)*3(') &3 1+*0)' 3 1)*(7.")' : 6(2)1+2 6'()' .1) A.*CD+ 7)') 6)''3/)' K36")'3 + 7'+63&(13*0+ &) ./-)(0+1 4
34)0)13*03 (/.)" 7)') 0+&)2< +2 &)&+2 *) 03") &3 6+*2."0) 6+*A+'13 )>)(4+ &3 !:8,$:$"#'#*5"<
O+1+ *+ )'0(/+ )*03'(+' 6'()1+2 ) 0)>3;
") &3 6"(3*032, *D+ @+. 3*0')' 31 &30)"F32
Listagem 1. Código completo da tabela de Produtos
&3 6+1+ A.*6(+*) 6)&) A.*CD+ 6'()&) 31
*+22) 0)>3")< %"03'3 ) )"*# V%5?>#543H unit ProdutosDB;
interface
6+*A+'13 ) ./-)(0+1 23 uses PSL;
const
ProdutosDBName = ‘ProdutosDB’;
Criando a Tela de Consulta a ProdutosDBType = Rsc(‘DBPR’);
Prod_Codigo = 0;
Produtos Prod_DescProd = 1;
Prod_Preco = 2;
O'()&) ) 0)>3") &3 7'+&.0+2, @)1+2 )&(; Prod_Estoque = 3;
Prod_Tam = 4;
6(+*)' .1 *+@+ A+'1."#'(+ 7)') 6'()'1+2 Prod_Un = 5;
var
) 03") &3 6+*2."0)< 9+ 13*. 7'(*6(7)" FieldDefs : array[0..5] of TFieldDef =
&+ I+6•30X0.&(+ )63223 A*,$qN$MrA5%: ((DataType: ftUInt16),
(DataType: ftString),
3 2)"@3;+ 6+1+ _sK)&+2I'+&.0+2<7)2` (DataType: ftDouble),
(DataType: ftUInt32),
.2)*&+ A*,$r/'=$ +. 73")2 036")2 &3 )0)"F+ (DataType: ftString),
(DataType: ftString));
+;BK . /< %"03'3 ) 7'+7'(3&)&3 9)13 bProdutosInclui : Boolean;
7)') _b'1K)&+2I'+&.0+2` 3 23.2 \(0"3 DBPro : TDatabase;

7)') _O+*2."0) ) I'+&.0+2`< K323*F3 function Open: Boolean;


function Close: Boolean;
.1) 03") 2313"F)*03 ) </0,$( 2< function ProcuraCodigo(Codigo: UInt16): Boolean;
9+13(3 +2 6+17+*3*032 &+ 0(7+ A*$,? implementation
6+1 +2 *+132 _b"&O+&(/+`, _b"&K326'(; function Open: Boolean;
6)+`, _b"&I'36+`, _b"&L20+-.3`, _b"&\); var
Atributos : UInt16;
1)*F+` 3 _b"&s*`, '327360(@)13*03< begin
Result := PSDatabase.Open( DBPro, ProdutosDBName,
]*2(') 6(*6+ >+0J32, 23*&+, -.)0'+ *) dmModeReadWrite);
7)'03 (*A3'(+' -.3 23 6F)1)'D+ _80*I'(; if not Result then
begin
13('+`, _80*%*03'(+'`, _80*I'+4(1+` 3 Result := PSDatabase.Create Database(Produtos DBName,
Creator, ProdutosDBType);
_80*s"0(1+`, 23/.(*&+ &) 32-.3'&) 7)') if Result then
) &('3(0)< %7'+@3(03 3 '37(0) +2 7)22+2 &+ Result := PSDatabase.Open (DBPro, ProdutosDBName,
dmModeReadWrite);
  end;
if not Result then
begin
  ShowSystemError(PSDatabase.LastError);
  Exit;
  end;
  PsDataBase.DataBaseAttributes(ProdutosDBName,
Atributos);
Atributos := Atributos and $FFF7;
  PsDataBase.SetDataBaseAttributes(ProdutosDBName,
Atributos);
PSDatabase.SetF ieldDefs(DBPro, FieldDefs[0],
  SizeOf(FieldDefs) div  SizeOf(FieldDefs[0]));
end;
function Close: Boolean;
begin
Result := PSDatabase.Close (DBPro);
end;

function ProcuraCodigo(Codigo: UInt16): Boolean;


begin
  PSDatabase.First(DBPro);
while not  PSDatabase.EOF(DBPro) do
begin
if PSDatabase.FieldUInt16(DBPro, Prod_Codigo) =
Codigo then
begin
Result := True;
  exit;
  end;
  PSDatabase.Next(DBPro);
  end;
Result := False;
end;
end.
Figura 1. Exemplo de tela de Consulta a Produtos
9) A.*CD+ +'%%$J'V%5?>#54 .0("(B)1+2 @3'0(&+ *) 7'+7'(3&)&3 ;$@# &+ A*$,?< &3 *+22) 0)>3") &3 7'+&.0+2 &36")'3 )2
.1) @)'(#@3" H>&&$% -.3 : .1 7%%'6 &3 I)') (22+ .0("(B)1+2 ) )"*# V4A*$,? &) )"*#4 V%5?>#543H 3 )V%*"(*8', *+ )4$4
+0'% 7)') ).4("()' ) 0')*2A+'1)CD+ &+ V/K 3 + 1:0+&+ /$#;$@#3 s1 7)22+ (1; &+ A+'1."#'(+ )0.)"< !>23'@3 + 6M&(/+
6M&(/+ &+ 7'+&.0+ &3 )!"#_i 7)') /#%*"J< 7+'0)*03 *) A.*CD+ O)''3/)I'+&.0+2 ) 23'/.('E
I)') (22+ .0("(B)1+2 ) A.*CD+ /#%!;57< : A)B3' .1 03203 7)') 2)>3' 23 34(2031 implementation
%7M2 (22+ '36.73')1+2 + @)"+' &+ 6)17+ '3/(20'+2 *) 0)>3"), 7+(2 6)2+ *D+ 34(2; uses
ProdutosDB, UPrincipal;
6M&(/+ &) 0)>3") 3 + 0')*2A+'1)'1+2 0)1, .1) 3463CD+ 23'# /3')&)< I)')
/#%*"J< I+' A(1 '363>31+2 + @)"+' 6+*; (22+ .2)1+2 + 1:0+&+ B$(5>%?+5>"# L1 23/.(&) 7+&31+2 6+&(A(6)' +
&) )"*# V43'#'H'4$< '320)*03 &+2 >+0J32< 9) ./-)(0+1 5
! 7'M4(1+ 7)22+ : 6+&(A(6)'1+2 +2 3*6+*0')1+2 + 6M&(/+ &3 6)&) >+0D+<
Nota do DevMan  >+0J32, 7+' (22+ (* (6()'31+2 73"+ >+; !>23'@3 -.3 ) 6+&(A(6)CD+ : 1.(0+ 2(1;
0D+ &3 X5,#'%< K^ .1 6"(-.3 &.7"+ *+ 7"32< %73*)2 6F)1)1+2 +2 1:0+&+2
Nas versões mais antigas do PocketStudio, principalmente  >+0D+ H#"X5,#'% 3 23'31+2 "3@)&+2 )+ A*%4# R_7'(13('+`U, V%*5% R_)*03'(+'`U, N$@#
as versões Trial, a Unit LibAll, que possue diversas funções A+*03 &) )"*# *+ 3@3*0+ /$,$(#< K(/(03 R_7'M4(1+`U 3 K'4# R_W"0(1+`U, )7'+7'()&+
de conversão, não vinha instalada no diretório de instalação
do PS. Por isso, caso tenha problemas ao compilar a )73*)2 + 6M&(/+ -.3 23/.3E 7)') 6)&) >+0D+<
aplicação, é recomendado que salve o arquivo LibAll.pas 9+03 -.3 31 0+&+2 +2 >+0J32 .0("(B)1+2
FrmGotoForm(FrmPrincipal);
no diretório do seu código fonte. Esse arquivo pode ser ) V43'#'H'4$ 3 +2 1:0+&+2 &3 *)@3/)CD+
encontrado juntamente com os fontes de exemplo desse
artigo. Acesse o portal DevMedia e localize a página de I)') -.3 7+22)1+2 A)B3' '3A3'^*6() 7)22)*&+ 6+1+ 7)'q130'+ ) @)'(#@3"
downloads das revistas ClubeDelphi. )+ A+'1."#'(+ 7'(*6(7)" 3 N2 A.*CJ32 3HV%5?Q L22) @)'(#@3" A)B '3A3'^*6() )
*+22) 0)>3") &3 7'+&.0+2<
I)') A(*)"(B)' ) 6+&(A(6)CD+ &) 03") &3
Listagem 2. Procedimento de carga de Produtos 6+*2."0) &3 7'+&.0+2 @)1+2 6+&(A(6)' +
procedure  CarregaProdutos;
3@3*0+ 1"18$" &+ A+'1."#'(+ 7)') )7'3;
var 23*0)'1+2 +2 &)&+2 &) 0)>3")< O"(-.3 *+
 Buffer: Array [0..10] of Char;
begin A+'1."#'(+ 3 7'322(+*3 A__ 7)') @(2.)"(;
if PsDataBase.RecordCount(DBPro) > 0 then
begin
B)' 2.)2 7'+7'(3&)&32 3 3@3*0+2< 9) )>)
StrIToA(Buffer, PsDataBase.Fiel dUInt16(DbPro,
Prod_Codigo));
L@3*02 6"(-.3 &.)2 @3B32 2+>'3 + 3@3*0+
PsField.SetText(F ldCodigo, Buffer); 1"18$" 3 )6'3263*03 .1) 6F)1)&) )+
PsField.SetText(FldDescricao, PsDatabase. 7'+63&(13*0+ +'%%$J'V%5?>#54< ! 6M&(/+
FieldStringPtr( DbPro, Prod_DescProd)) ;
6+17"30+ A(6)'# 6+1+ ) 23/.('E
FormatFloat(Buffe r, PSDatabase.Field Double(DBPro,
Prod_Preco), 2); procedure   FrmDadosProdutosOpen;
PsField.SetText(F ldPreco, Buffer); begin
 CarregaProdutos;
StrIToA(Buffer, PsDataBase.Fiel dUInt32(DbPro,  PSForm.Draw;
Prod_Estoque)); end;
PsField.SetText(F ldEstoque, Buffer);
! W*(6+ &30)"F3 )/+') : -.3 &3@31+2
PsField.SetText(F ldUn, PsDatabase.Field StringPtr(
DbPro, Prod_Un)); (*6".(' .1) 6F)1)&) )+ A+'1."#'(+ &3
PsField.SetText(F ldTamanho, PsDatabase.
FieldStringPtr( DbPro, Prod_Tam)); 7'+&.0+2 *) 03") 7'(*6(7)" &3 *+22+ 2(2;
end;
end;
031), 7+' (22+ @+"03 )+ A+'1."#'(+ 7'(*6(;
7)", 6"(-.3 &.)2 @3B32 *+ >+0D+ V%5?>#54
Listagem 3. Código dos botões de navegação 3 &(/(03 ) 6F)1)&) 6+1+ 23/.3E
procedure  BtnPrimeiroSelect; FrmGotoForm(FrmDadosCliente);
begin
  PsDataBase.First(DBPro);
  CarregaProdutos; f# 1)(2 .1) 6+*A(/.')CD+ *36322#'()
end;
) 23' A3(0) 31 *+22+ 7'+H30+ 7)') -.3 +2
procedure  BtnAnteriorSelect;
begin A+'1."#'(+2 23H)1 3A30(@)13*03 6F);
  PsDataBase.Prior(DBPro);
  CarregaProdutos;
1)&+2< %22(1 6+1+ A(B31+2 *+ )'0(/+
end; )*03'(+', 03'31+2 -.3 )"03')' + 1:0+&+
procedure  BtnProximoSelect; 788,*('#*5"\'"?,$C=$"#   &3 A+'1) -.3
begin
  PsDataBase.Next(DBPro); 7+22) 6F)1)' + A+'1."#'(+ -.3 &323;
  CarregaProdutos;
end;
 H)1+2< I)') (22+, )>') + )'-.(@+ X$"?'4
3-.(@)"3*03 )+ V%5]$(#r/5>%($ &+ K3"7F(<
procedure  BtnUltimoSelect;
begin I'322(+*3 +;BK . A_[ 3 23"36(+*3;+<
  PsDataBase.Last(DBPro);
  CarregaProdutos;
X3'# *36322#'(+ A)B3' ) )"03')CD+ )73*)2
end; &+ ('4$QQ5&   )+ A(*)" &+ 7'+63&(13*0+<
G3H) ) 23/.('E
– -

case FormID of
  FrmPrincipal: Listagem 4. Código completo do evento ApplicationHandleEvent
FrmSetEventHandler(Form, uPrincipal.
  HandleEvent); function  ApplicationHandleEvent(var Event: EventType)
  FrmClientes: : Boolean;
FrmSetEventHandler(Form,UDadosClientes. var
  HandleEvent); FormID: UInt16;
  FrmDadosProdutos: Form: FormPtr;
FrmSetEventHandler(Form, begin
UDadosProdutos.HandleEvent); Result := False;
end; if Event.eType = frmLoadEvent then
begin
G3H) -.3 )&(6(+*)1+2 + A+'1."#'(+ FormID := Event.frmLoad.for mID;
Form := FrmInitForm(Form ID);
A%:3'?54V%5?>#54 )+ ('4$QQ5& < O)&)   FrmSetActiveForm(Form);
case FormID of
A+'1."#'(+ -.3 @)1+2 )&(6(+*)*&+ )+ FrmPrincipal: FrmSetEventHandle r(Form,
2(2031), : *36322#'(+ A)B3' )"03')CD+ uPrincipal.HandleEvent);
FrmClientes: FrmSetEventHand ler(Form,
*3223 3@3*0+< G3H) + 3@3*0+ 6+17"30+ *) UDadosClientes.HandleEvent);
FrmDadosProdutos: FrmSetEventHand ler(Form,
./-)(0+1 ;< UDadosProdutos.HandleEvent);
  end;
Result := True;
Criando a tela de Pedidos e Itens end
end;
! 7'(13('+ 7)22+ )*032 &3 6'()'1+2 )
03") 7'+7'()13*03 &(0), : 6'()' )2 0)>3")2
*36322#'()2 7)') )'1)B3*)' +2 &)&+2
&(/(0)&+2< s1) >+) &(6), : 23/.(' +2 132;
1+2 7)22+2 .2)&+2 7)') 6'()' ) 0)>3")2 &3
(,*$"#$4 3 8%5?>#54< G3H)1+2 +2 7'(*6(7)(2
7)22+2 ) 3436.0)'E
} O'(3 .1) *+@) s*(0 .2)*&+ + 13*.
b("3e93Vs*(0 3 2)"@3;) 6+1 + *+13 -.3
7'3A3'('< 9322) 2:'(3 &3 )'0(/+2 320)1+2
.2)*&+ _9+13K)\)>3")K8<7)2`, 34E
I'+&.0+2K8<7)2[

Nota do DevMan
Formulários Destrutivos e Não Destrutivos
Até agora trabalhamos apenas com formulários
Destrutivos, mas existem duas formas de se trabalhar com
formulários no PocketStudio como podemos ver a seguir:
Modo Destrutivo: neste modo todos os objetos visuais
do formulário atual e seu conteúdo serão perdidos.
Se necessitarmos preservar os dados informados no
formulário precisamos criar funções para salvar e restaurar
os dados. Nesse modo utilizamos a função FrmGotoForm
para alternar entre os formulários.
Modo Não Destrutivo:  o problema dessa abordagem
é que não podemos dar mais de um passo, ou seja,
imaginemos três formulários. Podemos navegar do
primeiro para o segundo e voltar para o primeiro, mas
se tentarmos navegar do primeiro direto para o terceiro
formulário, uma exceção será gerada. Nessa abordagem
usamos a função FrmPopupForm para ir para o formulário
e FrmReturnToForm para retornar.
Tenha em mente que se precisarmos navegar entre vários
formulários e voltar aleatoriamente entre eles, devemos
utilizar o modo destrutivo. Também devemos considerar
o que o modo Não Destrutivo irá carregar a memória do
dispositivo à medida que os formulários são chamados.
Em resumo, precisamos considerar cada situação e analisar
o que realmente é necessário, evitando maiores problemas
na aplicação.
} O'(3 )2 6+*20)*032 &3 *+13 &3 6)1; &K8<7)2`< ! 6M&(/+ A+*03 6+17"30+ &) A*,$qN$MrA5%: 3 2)"@3;+ 6+1+ _sI3&(&+2<
7+2 3 )2 A.*CJ32 *36322#'()2 7)') )>'(' 6'()CD+ &3 )1>)2 0)>3")2 7+&31+2 @3' 7)2` 3 23. N':$ 1+&(A(-.3 7)') _b'1I3;
3 A36F)' ) 0)>3")[ *)2 ./-)(0+"- = 3 >< &(&+2`< Q+&(A(-.3 0)1>:1 ) 7'+7'(3&)&3
} O'(3 .1) A.*CD+ 7)') *)@3CD+ &+2 ;*#,$ 7)') _O)>3C)"F+ &+ I3&(&+`< K323*F3
&)&+2, +'%%$J'3'?54 7+' 34317"+[ Desenhando a tela de pedidos .1) 03") 2313"F)*03 ) </0,$( 4<
9+ 6)2+ &3 V$?*?54 3 !#$"4 ?$ V$?*?54 , % 03") &3 73&(&+2 3 (03*2 &3 73&(&+ A.; f# 0'^2 *+@(&)&32 )-.(, +. 23H), 0'^2 *+;
&3@31+2 6'()' &.)2 *+@)2 s*(02, -.3 23 /('# .1 7+.6+ &+ -.3 H# @(1+2 )0: )/+')< @+2 6+17+*3*032 -.3 *D+ @(1+2 )0: )/+;
6F)1)'D+ _I3&(&+2K8<7)2` 3 _]031I3; O'(3 .1 *+@+ A+'1."#'(+ .2)*&+ + 13*. ')< XD+ 3"32, V58>8;%*JJ$%c /$,$(#5%;%*JJ$% 3
K*4#< ! 6+17+*3*03 V58>8;%*JJ$% 31 6+*;
 H.*0+ 6+1 K*4# A.*6(+*) 6+1+ 23 A+223 .1
Listagem 5. Código da tabela PedidosDB
+5:L5H5@ &+ K3"7F(< ]22+ 2(/*(A(6) -.3
unit PedidosDB; 7+&31+2 2(1.")' "(20)2 2.273*2)2< I)')
interface
uses PSL; (22+ (*2(') *+ A+'1."#'(+ .1 6+17+*3*03
const V58>8;%*JJ$%R_I+7O+*&(6+32`U &) 7)"30)
PedidosDBName = ‘PedidosDB’;
PedidosDBType = Rsc(‘DBPE’);
A5%:< %"03'3 + 23. +'8#*5" 7)') _O+*&<
Ped_NumeroPedido = 0; I)/0+`, )22(1 3*-.)*0+ *D+ F+.@3' .1
Ped_CodCli = 1;
Ped_Emissao = 2; (031 23"36(+*)&+, ) (*&(CD+ &3 _O+*&(CJ32
Ped_Cond = 4;
Ped_Total = 5; &3 I)/)13*0+` 320)'# )0(@)< ]*6".) )/+')
var
.1 6+17+*3*03 K*4#R_j20O+*&(6+32`U
FieldDefs : array[0..4] of TFieldDef = 3 (*2(') )"/.*2 (03*2 *) 7'+7'(3&)&3
((DataType: ftUInt32),
(DataType: ftUInt16), !#$:4 &+ 6+*0'+"3< L1 23/.(&) '30+'*3 )+
(DataType: ftDateTime),
(DataType: ftString), 6+17+*3*03 V58+5"?*(5$4 3 23"36(+*3 +
(DataType: ftDouble)); K4#+5"?*(5$4   *) 7'+7'(3&)&3 V58>8K*4#<
bPedidosInclui : Boolean; ]22+ A)'# 6+1 -.3 ) "(20) &3 6+*&(CJ32 &3
dPedidoData : DateTimeType;
DBPed : TDatabase; 7)/)13*0+ )7)'3C) )+ 6"(6)' *+ V58>82
function  Open: Boolean;
;%*JJ$%Q I)') 3@(0)' -.3 + V58+5"?*(5$4
function  Close: Boolean;
function  ProcuraCodigo(Codigo: UInt32): Boolean;
)7)'3C) 6+*20)*0313*03, 1)'-.3 2.)
7'+7'(3&)&3 X*4*L,$ 6+1 + @)"+' A',4$<
implementation

function  Open: Boolean;


begin www.devmedia.com.br/clubedelphi/portal.asp
Result := PSDatabase.Open(D BPed, PedidosDBName,
dmModeReadWrite); Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a
if not Result then
begin uma vídeo aula de Ricardo Boaro que mostra como trabalhar com os
Result := PSDatabase.Crea teDatabase(Pedido sDBName, componentes SelectorTrigger e List.
Creator, PedidosDBType);
if Result then www.devmedia.com.br/articles/viewcomp.asp?comp=7606
Result := PSDatabase.Open( DBPed, PedidosDBName,
dmModeReadWrite);
end;

if not Result then
begin
  ShowSystemError(PSDatabase.LastError);
  Exit;
end;

PSDatabase.SetFi eldDefs(DBPed, FieldDefs[0],


SizeOf(FieldDefs) div SizeOf(FieldDefs[ 0]));
end;

function  Close: Boolean;


begin
Result := PSDatabase.Close( DBPed);
end;

function  ProcuraCodigo(Codigo: UInt32): Boolean;


begin
  PSDatabase.First(DBPed);
while not  PSDatabase.EOF(DBPed) do
begin
if  PSDatabase.FieldUInt32(DBPed, Ped_NumeroPedido)
= Codigo then
begin
Result := True;
  exit;
end;
  PSDatabase.Next(DBPed);
end;
Result := False;
end;
end.
Figura 2. Exemplo de tela de Consulta a Pedidos
– -

!2 *+132 &+2 6+17+*3*032 23/.31 ) %>)(4+ &+ 6)17+ C:*44a5 , (*2(') .1 &) A)1?"() &+2 >+0J32, 7+'0)*0+ .0(;
1321) "(*F) 317'3/)&) *)2 03")2 )*03;  >+0D+ 6+1.1 3 0'+-.3 23. +'8#*5" 7)') "(B)1+2 ) s*(0 V4H>##5" &) V/K  7)')
'(+'32< s23 + 7'3A(4+ _b"&` 7)') 6)17+2 _j+6)"(B) O"(3*03`< %7'+@3(03 3 1+&(A(; 0')>)"F)'1+2 6+1 3"3< % &(A3'3*C) :
3 _80*` 7)') >+0J32< 9322) H)*3") 3*; -.3 ) 7'+7'(3&)&3 A%':$ .2)*&+ ) +7CD+ -.3 7+&31+2 6F)1)' A+'1."#'(+2 31
6+*0')1+2 +2 6)17+2 _b"&9.1I3&(&+`,  &%N5"$ , )22(1 '30(')1+2 2.) >+'&)< 1+&+ 1+&)" 6+1 3"3< L223 6+17+*3*03
_b"&O"(O+&(/+`, _b"&O"(9+13` 3 _b"&; O+1 3463CD+ &+2 6+*0'+"32 /$,$(#5%;%*2 23'# .2)&+ *) C:*44a5 , 7+'0)*0+ (*2(')
G)"\+0)"`< L )(*&) +2 >+0J32 _80*9+@+`,  JJ$%c V58>8;%*JJ$% 3 K*4# , H# 0')>)"F)1+2 .1 /$,$(#5%;%*JJ$%R_X"0L1(22)+`U "+/+ N
_80*]03*2`, _80*I'(13('+`, _80*%*03; 6+1 +2 6+17+*3*032 .0("(B)&+2 *322) &('3(0) &+ K'L$, C:*44a5[
'(+'`, _80*I'+4(1+`, _80*s"0(1+`, _80*; 03"), 23*&+ )22(1 6)>3 .1 347"(6)CD+ } V58>8;%*JJ$%e Q)(2 .1 6+17+*3*03
b(1` 3 _80*=')@)'`, '327360(@)13*03 &) 2+>'3 +2 *+@+2 6+17+*3*032< &) A)1?"() &+2 >+0J32 3 2.) A.*6(+*);
32-.3'&) 7)') ) &('3(0)< } /$,$(#5%;%*JJ$%e  L203 6+17+*3*03 : "(&)&3 &373*&3 &+ .2+ 31 6+*H.*0+
6+1 .1 +>H30+ "(20)< L"3 2+B(*F+ *D+
031 .0("(&)&3, (1)/(*31+2 3"3 6+1+ +
Listagem 6. Código da tabela ItemPedDB
6+*F36(&+ O+1>+8+4 &+ K3"7F(, 31
unit ItemPedDB; %>"2#*:$ 3"3 : 1.(0+ 2(1(")'[
interface
uses PSL; } K*4#e j(20) : .1 +>H30+ >)20)*03 .0(;
const "(B)&+ 7+' *M2 &323*@+"@3&+'32, 7+(2
ItemPedDBName = ‘ItemPedDB’;
ItemPedDBType = Rsc(‘DBIP’);
320# &(27+*?@3" 31 7')0(6)13*03 0+&+2
Itp_NumeroPed = 0; +2 )1>(3*032 &3 &323*@+"@(13*0+< K.;
Itp_CodProd = 2;
Itp_Qtde = 3; ')*03 + &323*@+"@(13*0+ &) *+22) 2:'(3
Itp_Preco = 4;

var Listagem 7. Código de todos os botões da tela de Pedidos


FieldDefs : array[0..3] of TFieldDef =
((DataType: ftUInt32),
procedure  BtNovoSelect;
(DataType: ftUInt16),
begin
(DataType: ftUInt16),
  PsDataBase.Insert(DBPed);
(DataType: ftDouble));
end;
procedure   BtPedItensSelect;
bItemPedInclui : Boolean;
begin
DBItp : TDatabase;
  FrmGotoForm(FrmPedidoItem);
end;
function  Open: Boolean;
procedure  BtInicioSelect;
function  Close: Boolean;
begin
function  ProcuraCodigo(Codigo: UInt16): Boolean;
  PsDataBase.First(DBPed);
end;
implementation
procedure   BtAnteriorSelect;
begin
function  Open: Boolean;
  PsDataBase.Prior(DBPed);
begin
end;
Result := PSDatabase.Open (DBItp, ItemPedDBName, dmModeReadWrite);
procedure  BtProximoSelect;
if not Result then
begin
begin
  PsDataBase.Next(DBPed);
Result := PSDatabase.Creat eDatabase(ItemPed DBName, Creator, ItemPedDBType);
end;
if Result then
procedure  BtFimSelect;
Result := PSDatabase.Open(D BItp, ItemPedDBName, dmModeReadWrite );
begin
end;
  PsDataBase.Last(DBPed);
end;
if not Result then
procedure  BtGravarSelect;
begin
begin
  ShowSystemError(PSDatabase.LastError);
  PsDataBase.Post(DBPed);
  Exit;
end;
end;
procedure  BtExcluirSelect;
begin
PSDatabase.SetFie ldDefs(DBItp, FieldDefs[0],
  PsDataBase.Delete(DBPed);
SizeOf(FieldDef s) div SizeOf(FieldDef s[0]));
end;
end;
procedure  BtnVoltarSelect;
begin
function  Close: Boolean;
  FrmGotoForm(FrmPrincipal);
begin
end;
Result := PSDatabase.Clos e(DBItp);
end;
Listagem 8. Código dos botões Produtos e Pedidos
function  ProcuraCodigo(Codigo: UInt16): Boolean;
begin
..
  PSDatabase.First(DBItp);
uses
while not  PSDatabase.EOF(DBItp) do
UDadosClientes, UDadosProdutos,
begin
UDadodsPedidos;
if PSDatabase.FieldUInt16(DBItp, Itp_NumeroPed) = Codigo then
..
begin
procedure   btnProdutosSelect;
Result := True;
begin
  exit;
  FrmGotoForm(FrmDadosProdutos);
end;
end;
  PSDatabase.Next(DBItp);
end;
procedure   btnPedidosSelect;
Result := False;
begin
end;
  FrmGotoForm(FrmDadosPedidos);
end.
end;
&3 )'0(/+2 0')>)"F)'31+2 1.(0+ 6+1 I'36(2)1+2 )/+') 7'37)')' + 2(2031) &3@3'# )&(6(+*)' )+ )4$4 &+ A+'1."#'(+
) K*4#  3 3*03*&3'31+2 2.)2 7'(*6(7)(2 7)') -.3 7+22) )>'(' )2 *+@)2 03")2 ) 7'(*6(7)" )2 &.)2 )"*#4 7)') '3A3'^*6()<
A.*6(+*)"(&)&32< 7)'0(' &+ A+'1."#'(+ 7'(*6(7)"< I+'; X3 7'3A3'(' @3H) + 0'36F+ 6M&(/+ &+2 &+(2
%7M2 3*03*&3'1+2 + A.*6(+*)13*0+ 0)*0+, '30+'*3 + A+'1."#'(+ 7'(*6(7)" 3  >+0J32 *) ./-)(0+1 @<
&+2 *+@+2 6+17+*3*032, @)1+2 6+&(A(6)' 6+&(A(-.3, *+ 3@3*0+ 1"/$,$(# &+2 >+0J32 %73*)2 7)') "31>')', &3@31+2 )6'32;
*+22+ A+*03< 9) ./-)(0+1 ? 3*6+*0')1+2 I'+&.0+2 3 I3&(&+2, .1) 6F)1)&) )+ 63*0)' + A+'1."#'(+ &3 73&(&+2 *+ s*(0
+ 6M&(/+ &3 6)&) >+0D+ (*6".2+ *+ 3431; 1:0+&+ A%:<5#5A5%:  (*&(6)*&+ -.)" 7'(*6(7)" &+ 7'+H30+, *) A.*CD+ %77"(;
7"+< O+&(A(-.3 6+*A+'13 *36322#'(+< A+'1."#'(+ 23'# )>3'0+< 9D+ 32-.3C) -.3 6)0(+*f)*&"3L@3*0, 7)') -.3 + 2(2031)
+73')6(+*)" &+ I)"1!X '36+*F3C) +
Listagem 9. Código do método ApplicationHandleEvent alterado A+'1."#'(+ &3 I3&(&+2 3 I'+&.0+2 6+1+
function   ApplicationHandleEvent(var Event: EventType):
7)'03 &) )7"(6)CD+< %>') ) .*(0 G3*&)2
Boolean; 3 )&(6(+*3 ) 6F)1)&) )+ 6)23<<+A *+
var
FormID: UInt16; 1:0+&+< G3H) + 6M&(/+ 6+17"30+ *)
Form: FormPtr;
begin ./-)(0+1 A<
Result := False;
if Event.eType = frmLoadEvent then
%7'+@3(0)*&+ -.3 320)1+2 1343*&+
begin *) )"*# X$"?'4 , 7'36(2)1+2 A)B3' &+(2
FormID := Event.frmLoad.f ormID;
Form := FrmInitForm(FormI D); W"0(1+2 )H.2032< I'36(2)1+2 )>'(' 3 A3;
  FrmSetActiveForm(Form);
case FormID of 6F)' )2 0)>3")2 V%5?>#543H , V$?*?543H 3
FrmPrincipal: FrmSetEventHand ler(Form,
uPrincipal.HandleEvent);
!#$:V$?3H *+2 1:0+&+2 /#58788,*('#*5"
FrmClientes: FrmSetEventHandl er(Form, 3 /#'%#788,*('#*5"<
UDadosClientes.HandleEvent);
FrmDadosProduto s: FrmSetEventHandl er(Form, j+6)"(B3;+2 3 )"03'3 6+*A+'13 ) ./-X
UDadosProdutos.HandleEvent);
FrmDadosPedidos : FrmSetEventHandle r(Form, )(0+1 2B< !>23'@3 -.3 + 3@3*0+ /#52
UDadodsPedidos.HandleEvent);  8788,*('#*5" A36F) )2 0)>3")2 .2)*&+ +
end;
Result := True; 1:0+&+ +,54$ 3 + 3@3*0+ /#'%#788,*('#*5"
  end.
end; )>'3;)2 .2)*&+ + 1:0+&+ 18$"< % W*(6)
7)'0(6.")'(&)&3, : -.3 *) )>3'0.') &)2
Listagem 10. Código dos eventos StopApplication e StartApplication alterados 0)>3")2, *M2 0320)1+2 23 ) 0)>3") 7+&3 23'
function  StartApplication: Boolean; )>3'0)< L1 6)2+ *3/)0(@+ 3*@()1+2 .1)
begin
{ Abre o banco de dados de Clientes. Se não conseguir 13*2)/31 (*A+'1)*&+ -.3 ) 0)>3") *D+
abrir, }
{ não executa a aplicação}
7+&3 23' 3*6+*0')&)<
if not ClientesDB.Open then
begin
ShowMessage(‘Tabe la de Clientes não encontrada!’); Conclusão
Result := False;
  Exit; 93223 )'0(/+ 6'()1+2 ) 03") &3 6+*2."0)
end;
if not ProdutosDB.Open then
) 7'+&.0+2, + >)*6+ &3 &)&+2 &3 73&(&+2
begin 3 (03*2 &+ 73&(&+, 6+*F3631+2 +2 6+*63(;
ShowMessage(‘Tabe la de Produtos não encontrada!’);
Result := False; 0+2 &3 A+'1."#'(+2 &+ I)"1, &320'.0(@+
  Exit;
end; 3 *D+ &320'.0(@+, 3 6'()1+2 ) 03") &+
if not PedidosDB.Open then
begin
6)>3C)"F+ &+ 73&(&+< 9+ 7'M4(1+ )'0(/+
ShowMessage(‘Tabe la de Itens não encontrada!’); 6'()'31+2 ) 03") &3 ]03*2 &+ I3&(&+ 3
Result := False;
  Exit; 6+*20'.('31+2 + +5"?>*#< %0: + 7'M4(1+
end;
if not ItemPedDB.Open then )'0(/+, 3 >+*2 6M&(/+2 ) 0+&+2‰
begin
ShowMessage(‘Tab ela de Itens não encontrada!’);
Result := False;
  Exit;
end;
Result := PSApplication.Che ckROMVersion($200 3000);
if not Result then
begin
FrmCustomAlert(A lertIncompatible, ’2.0’, nil, nil);
  Exit;
end;
Dê seu feedback sobre esta edição!   u
  e
   s
 F eedb ac  
 
k  
  FrmGotoForm(FrmPrincipal);      ê
     D
end;
A Java Magazine tem que ser feita ao seu o     
s      

 b  
 r  
  e
procedure  StopApplication;
begin
gosto.Para isso, precisamos saber o que     e
  t
   a
  e
  s

  i   d
  ClientesDB.Close; você, leitor, acha da revista!       o    ç
    ã

  ProdutosDB.Close;
  PedidosDB.Close;
  ItemPedDB.Close;
Dê seu voto sobre este artigo, através do link:
  FrmCloseAllForms;
end; www.devmedia.com.br/javamagazine/feedback 
AMIGO
...só pra lembrar,
Existem coisas sua assinatura pode
estar acabando!
que não
conseguimos
ficar sem!
Renove Já!

www.devmedia.com.br/renovacao
Para mais informações:
www.devmedia.com.br/central
eç o eç o eç o
Nesta seção você encontra artigos para iniciantes
na linguagem Delphi

Envio de E-mails com componentes


da paleta Indy
Veja como enviar e-mails utilizando os componentes da paleta Indy

! 3*@(+ &3 3;1)("2 ).0+1)0(B)&+


31 2(2031)2 : 2(17"3213*03
.1) A3'')13*0) A)*0#20(6)<
%0')@:2 &3 6+17+*3*032 3 1:0+&+2, +
&323*@+"@3&+' &(27+*(>("(B) 31 23.
6+1 6+17+*3*032 &) 7)"30) !"?6 <
O+1 + K3"7F( )>3'0+, .0("(B3 + 13*.
A*,$qN$Mr788,*('#*5" 7)') 6'()' .1)
*+@) )7"(6)CD+< %"03'3 ) 7'+7'(3&)&3
N':$ &+ A+'1."#'(+ 7'(*6(7)" 7)') _A'1;
2(2031) .1) )/3*&) &3 3;1)("2, -.3 )+ X3*&Q)("` 3 + +'8#*5" )"03'3 7)') _L*@(+
23' 6+*A(/.')&) &(27)') 3;1)("2 6+1 '3; &3 L;1)("2`< X)"@3 ) )"*# &+ A+'1."#'(+
")0M'(+2, )@(2+2, 3*0'3 +.0'+2, ).0+1)0(6); 7'(*6(7)" 6+1+ _.L1)("<7)2` 3 + 7'+H30+
13*03 )+2 23.2 &320(*)0#'(+2< 9+ K3"7F(, 2)"@3 6+1+ _7'HL1)("<&7'`<
7+&31+2 6+*0)' 6+1 +2 6+17+*3*032
&) 7)"30) !"?6 7)') 6'()' .1 2(2031) &3
3*@(+ &3 3;1)("2< Nota do DevMan
93203 )'0(/+ @3'31+2 ) 6'()CD+ &3 .1
2(2031) 2(17"32 &3 3*@(+ &3 13*2)/3*2 De forma bem simples, o envio de e-mails funciona
3"30'~*(6)2 R3;1)("U, +*&3 A)'31+2 )":1 basicamente através de um cliente de e-mail acessado
&)2 6+*A(/.')CJ32 *+'1)(2 &3 '31303*03, pelo browser de internet ou através de gerenciadores
instalados e configurados nas estações de trabalho,
&320(*)0#'(+, )22.*0+ 3 13*2)/31 ) 6+*A(; tais como Microsoft Outlook, Outlook Express, Mozilla
Maikel Marcelo Scheid /.')CD+ &3 ).03*0(6)CD+ &+2 .2.#'(+2 7+' Thunderbird entre outros. O usuário que necessita de sua
(maikelscheid@gmail.com) XQ\I, 0)1>:1 ) 6+*A(/.')CD+ 7)') -.3 + utilidade precisa ter uma credencial de cadastro (usuário
é técnico em Informática com ênfase em Aná- e senha) em um servidor de e-mails SMTP (“Simple Mail
3;1)(" 7+22) 23' 3*@()&+ 6+1 )*34+2< Transfer Protocol”) para o envio dos e-mails. Toda vez
lise e Programação de Sistemas. Atua na área que a ação de envio for requisitada ao gerenciador, uma
de Desenvolvimento de Softwares em Delphi
para plataforma Win32 e .NET com banco de Criando a aplicação autenticação será realizada no servidor, e este por sua
vez irá proceder com o envio do texto/arquivo para o
dados Firebird e MS SQL. É membro da Equipe s0("(B)'31+2 + K3"7F( { 7)') ) 6'(); destinatário pré-informado.
Editorial ClubeDelphi. CD+ &+ 2(2031) &3 3*@(+ &3 3;1)("
%H.203 )2 &(13*2J32 &+ A+'1."#'(+ )";
03')*&+ 2.) 7'+7'(3&)&3 \$*J0# 7)') gln
3 D*?#0  7)') g_n< j+/+ *+ 6)>3C)"F+ &+
A+'1."#'(+ )'')203 &) 7)"30) /#'"?'%? .1
6+17+*3*03 <%5>8H5@R_/>XQ\I`U, )"03;
')&+ 2.) 7'+7'(3&)&3 +'8#*5" 7)') _%.;
03*0(6)CD+ &3 s2.#'(+2 XQ\I`< K3*0'+
&+ 6+17+*3*03 JL/9;V )&(6(+*3 )+ 0+7+ Figura 1. Componentes para autenticação SMTP
.1 6+17+*3*03 +0$(OH5@R_O•XQ\I`U,
)"03')*&+ 2.) 7'+7'(3&)&3 +'8#*5" 7)')
_Q3. 23'@(&+' '3-.3'3' .1) ).03*0(6);
CD+ XQ\I 7)') 3*@(+ &3 3;1)("2`, -.3
23'# .0("(B)&+ *+2 6)2+2 31 -.3 : *3632;
2#'() ).03*0(6)CD+ 7)') '3)"(B)' + 3*@(+
&) 13*2)/31< %&(6(+*3 "+/+ )>)(4+ &+
(O/9;V 0'^2 6+17+*3*032 K'L$, , )"03')*;
&+ ) 7'+7'(3&)&3 +'8#*5" &3 )1>+2 7)')
_f+20`, _s2.#'(+` 3 _X3*F)`, '327360(;
@)13*03< j+/+ )>)(4+ 6)&) K'L$, )&(6(+;
*)&+ ('31+2 (*23'(' 0'^2 6+17+*3*032
&3 0340+< %'')203 &) 7)"30) 7??*#*5"',
.1 6+17+*3*03  9'4OC?*#R_3&0f+20`U 3
)"03'3 2.) 7'+7'(3&)&3 C?*#9'4O 7)')
_SSSŠ<SSSŠ<SSSŠ<SSS[Z[k`, 23*&+ 320) )
Figura 2. Cabeçalho do E-mail
1#26)') 7)') A+'1)0)CD+ &+ 3*&3'3C+
;+V~!V   &+ 23'@(&+' &3 ).03*0(6)CD+
XQ\I ) 23' .0("(B)&+ 7)') + 3*@(+<
%"03'3 0)1>:1 ) 7'+7'(3&)&3 ;$@# &+
6+17+*3*03 7)') _xxx<xxx<xxx<xxx`<
%'')203 )/+') &) 7)"30) /#'"?'%? &+(2
6+17+*3*032 C?*# , )"03')*&+ ) 7'+7'(3;
&)&3 N':$ &3 )1>+2 7)') _3&0s2.)'(+`
3 _3&0X3*F)`, '327360(@)13*03 &3 )6+'&+
6+1 +2 +'8#*5"4 &+2 K'L$,p4 )6(1)< X3.
 JL/9;V  A(6)'# 2313"F)*03 N (1)/31
(".20')&) *) </0,$( 23
%&(6(+*3 (13&()0)13*03 )>)(4+
)+  JL /9 ;V   .1 *+@+ 6+17+*3*03
<%5>8H5@R_/>L1)("`U, )"03')*&+ 23. +'82
#*5" 7)') _O)>3C)"F+ &+ L;1)("`< K3*0'+
&+  JLC:'*,  )&(6(+*3 )+ 0+7+ .1 K'L$,
6+1 + +'8#*5" _K3E` 3 (13&()0)13*03
)>)(4+ )'')203 &) 7)"30) /#'"?'%? .1
C?*#R_31)("K3`U 3 '31+@) + @)"+' &) 2.)
7'+7'(3&)&3 ;$@# &3(4)*&+;+ 31 >')*6+<
j+/+ )>)(4+ )+ $:'*,3$ , )'')203 .1 *+@+
K'L$, 6+1 + +'8#*5" _I)')E` (*23'(*&+ 31
23/.(&) &) 7)"30) /#'"?'%? .1 6+17+;
*3*03 9$:5R_3&0I)')`U 3 '31+@3*&+ 23.
0340+ *) 7'+7'(3&)&3 K*"$4Q %"03'3 0)1;
 >:1 ) 7'+7'(3&)&3 /(%5,,H'%4 &+ $?#V'%'
7)') _44X$%#*(', ` A)B3*&+ 6+1 -.3 .1)
 >)'') &3 '+")/31 *+ 23*0(&+ @3'0(6)" 23H)
34(>(&) *+ 6+17+*3*03< %(*&) )>)(4+
&+ 1321+, )'')203 .1 K'L$, 6+1 + +'82 Figura 3. Formulário de envio de e-mails
#*5" _%22.*0+` 3 (*2(') .1 6+17+*3*03 %+ A(*)" &+ A+'1."#'(+, )&(6(+*3 )(*&) 6)&) 6+17+*3*03, @3H) 7)') -.)" A.*CD+
C?*#R_3&0%22.*0+`U, '31+@3*&+ 0)1>:1 &) 7)"30) 7??*#*5"', &+(2 6+17+*3*032 23'# .0("(B)&+ 3 -.)(2 )2 6+*A(/.')CJ32
+ 23. ;$@#Q %+ A(*)" &320) 6+*A(/.')CD+, H*#H#"R_>0*L*@()'` 3 _>0*O)*63")'`U< *36322#'()2E
23. A+'1."#'(+ &3@3'# 320)' &3 )6+'&+ %"03'3 ) 7'+7'(3&)&3 +'8#*5" &3 )1>+2 ; !?/9;V  R_O+17XQ\I`U &) 7)"30)
6+1 ) </0,$( 43 7)') _L9G]%a` 3 _O%9OLj%a`, '32736; !"?6+,*$"#4e 23'# + '327+*2#@3" 73")
I)') (*6".2D+ &3 )*34+2 )+ 3;1)(", )&(; 0(@)13*03< ]*6".), )0')@:2 &) 7'+7'(3&)&3 6+1.*(6)CD+ &('30) 6+1 + 23'@(&+' &3
6(+*3 "+/+ )>)(4+ )+  JLC:'*, .1 *+@+ <,680c .1) (1)/31 ) 6)&) .1 &+2 >+0J32< ).03*0(6)CD+ 3 3*@(+ &+2 3;1)("2 XQ\I<
<%5>8H5@R_/>%*34+`U, )"03')*&+ 23. %+ A(*)" 23. A+'1."#'(+ 320)'# 6+1 + K'65># %2 6+*A(/.')CJ32 &3 2.)2 7'+7'(3&)&32
+'8#*5" 7)') _%*34+` 3 )'')203 7)') 3 2313"F)*03 ) </0,$( 53 G3'31+2 ) 23/.(' 23'D+ '3)"(B)&)2 31 0317+ &3 3436.CD+
&3*0'+ &+ 1321+ .1 6+17+*3*03 +2 6+17+*3*032 *36322#'(+2 7)') 3*@(+ &+ 3 @3'31+2 ) 23/.('<
K*4#X*$MR_31)("%*34+`U &) 7)"30) D*"Z[Q 3;1)(" 3 )&(CD+ &+2 )*34+2 N 13*2)/31< ; !?9$44'J$  R_O+17Q3*2)/31`U &)
%(*&) )>)(4+ )+ JL7"$@5 , )&(6(+*3 1)(2 .1 7)"30) !"?6 9*4(e 6+17+*3*03 *+ -.)"
<%5>8H5@R_/>Q3*2)/31`U 3 &3A(*) 23. +'82 Componentes para envio do e-mail 6'()1+2 + 3;1)("< 93"3 -.3 23'D+ )&(;
#*5" 7)') _Q3*2)/31`< %'')203 7)') &3*0'+ e adição de anexos 6(+*)&+2 + )22.*0+, 13*2)/31, 3*0'3
&+ JL9$"4'J$: .1 6+17+*3*03 B*(0C?*# G3'31+2 ) 23/.(' +2 6+17+*3*032 *3; +.0')2 7)'032 &+ 3;1)("< X.) 6+*A(/.;
R_31)("Q3*2)/31`U &) 7)"30) D*"Z[ 3 '3; 6322#'(+2 ) 23'31 )&(6(+*)&+2 *+ A+'1.; ')CD+ 0)1>:1 23'# '3)"(B)&) 31 0317+
1+@) + 0340+ &) 2.) 7'+7'(3&)&3 K*"$4Q "#'(+ 7)') + 3*@(+ &+ 3;1)("< %+ ")&+ &3 &3 3436.CD+<
; !?7"#*A%$$E$  R_%*0(=3"+`U &) 7)"30)
!"?6 9*4(e 2.) .0("(&)&3 : *D+ &3(4)' )
Listagem 1. Adicionando anexos ao e-mail
)7"(6)CD+ _6+*/3")'` 3*-.)*0+ + 3;1)("
procedure   TfrmSendMail.Anexararquivo1Click(Sender: TObject); 320# 23*&+ 3*@()&+< ! 6+17+*3*03 1)*;
var 0:1 + A+'1."#'(+ )0.)"(B)&+, 73'1(0(*&+
files: TListItem;
-.3 )0: &.')*03 + 3*@(+ + .2.#'(+ 7+22)
begin
if OpenAnexo.Execute then
6+*0(*.)' (*03')/(*&+ 6+1 + 2(2031)<
; 18$"3*',5J R_!73*%*34+`U &) 7)"30)
begin
files := emailAnexo.Items .Add; 3*',5J4e 23'# .0("(B)&+ 7)') "+6)"(B)' +2
files.Caption := OpenAnexo.FileNa me;
end; )*34+2 ) 23'31 )&(6(+*)&+2 )+ 3;1)("<
end; 9D+ '3-.3' *3*F.1) 6+*A(/.')CD+ 32;
Listagem 2. Código para exclusão de anexo
736()", 7+(2 23'# .0("(B)&+ )73*)2 7)')
"+6)"(B)' +2 )'-.(@+2<
procedure   TfrmEmails.Excluir1Click(Sender: TObject);
var ; V58>89$">  R_Q3*.%*34+`U &) 7);
Arquivo : string;
begin
"30) /#'"?'%?e '3")6(+*3 + 6+17+*3*03 N
Arquivo := ExtractFileName( emailAnexo.Items. Item[ 7'+7'(3&)&3 V58>89$"> &+ 6+17+*3*03
  emailAnexo.ItemIndex].Caption);
if  Application.MessageBox(PAnsiChar(‘Deseja excluir $:'*,7"$@5< X3'# .0("(B)&+ *+ 6"(-.3 &+ >+;
o arquivo ‘ + Arquivo + ‘?’), ‘Excluir anexo’,
MB_YESNO) = idYes then
0D+ &('3(0+ 2+>'3 + 6+17+*3*03 $:'*,7"$@5
 
end;
emailAnexo.Items.Delete(emailAnexo.ItemIndex); 7)') )&(6(+*)' +. '31+@3' )'-.(@+2< O+1
.1 &.7"+ 6"(-.3 2+>'3 + 6+17+*3*03 9$2
">7"$@5 , 6'(3 &+(2 (03*2 &3 13*. R_%*34)'
)'-.(@+` 3 _L46".(' )'-.(@+`U<
; !:'J$K*4# R_]1)/3*2`U &) 7)"30) D*"Z[e
6+17+*3*03 +*&3 ('31+2 )&(6(+*)' &.)2
(1)/3*2 -.3 23'D+ "(20)&)2 H.*0+ 6+1 +
6+17+*3*03 9$">7"$@5< O+1 .1 &.7"+
6"(-.3 2+>'3 + 6+17+*3*03 !:'J$"4 .0("(B3
+ >+0D+ 7?? 3 "+6)"(B3 &+(2 ?6+*32 '3")6(+;
*)&+2 )+2 13*.2 6'()&+2 *+ V58>89$"><
I+' ?$&'>,# @+6^ ('# 3*6+*0')' ?6+*32 7)')
23'31 )&(6(+*)&+2 *+ 6)1(*F+ +et7%T>*2
=54 ?$ 8%5J%':'4t7%T>*=54 (5:>"4tH5%,'"?
/0'%$?t!:'J$4tH>##5"4<
 %7M2 )&(6(+*)&)2 &.)2 (1)/3*2, @+"03
)+ 6+17+*3*03  9$">7"$@5  3 '3")6(+*3
) 7'+7'(3&)&3 !:'J$4 )+ 6+17+*3*03
!:'J$"4< O+1 .1 &.7"+ 6"(-.3 2+>'3
Figura 4. Envio do e-mail + 6+17+*3*03, 23"36(+*3 6)&) .1 &+2
(03*2 &3 13*. )&(6(+*)&+2 3 *) 7'+; CD+ XQ\I 6+1+ 23'@(&+' &3 2)?&) &)2 &) A+'1)0)CD+ &+ 0340+ ) 23' 3*@()&+<
7'(3&)&3 !:'J$!"?$@ 23"36(+*3 + ?6+*3 13*2)/3*2< L20)*&+ 6+''30)2 0+&)2 )2 %7"(-.3 3203 '36.'2+ )+ 23. 2(2031) &3(;
6+''327+*&3*03< (*A+'1)CJ32, 23. 3;1)(" 23'# 3*@()&+ 4)*&+;+ 1)(2 A.*6(+*)" 3 )0')0(@+ 7)')
6+1 2.6322+ R</0,$( ;U< 23. 6"(3*03< %>')C+ 3 )0: ) 7'M4(1)<
Anexando arquivos ao E-mail
O+1 .1 6"(-.3 &.7"+ 2+>'3 + 6+17+*3*; Conclusão Dê seu feedback sobre esta edição!   u
  e
   s
 F eedb ac  
 
k  

03 9$">7"$@5 , 23"36(+*3 + (031 &3 13*. 93203 )'0(/+ )7'3*&31+2 ) 6'()' .1)      ê
     D

_%*34)' )'-.(@+` 3 )&(6(+*3 ) 23. 3@3*0+ )7"(6)CD+ &3 3*@(+ &3 3;1)("2 .0("(B)*; A Java Magazine tem que ser feita ao seu
1"+,*(O + 6M&(/+ &) ./-)(0+1 2 , +>3&363*; &+ +2 6+17+*3*032 &) 7)"30) !"?6 &+ gosto.Para isso, precisamos saber o que    a
    e
  e
  s
  t
   d
  i

&+ ) 6'()CD+ &3 .1) @)'(#@3" &+ 0(7+ ;K*42 K3"7F(< O+1 32032 6M&(/+2 @+6^ 7+&3'# você, leitor, acha da revista!       o    ç
    ã

#!#$: 7)') -.3 23H) (*20)*6()&+ + )'-.(@+ (17"313*0)' *+@)2 A.*6(+*)"(&)&32, Dê seu voto sobre este artigo, através do link:
23"36(+*)&+ 3 34(>(&+ *+ $:'*,7"$@5< 6+1+ 7+' 34317"+ +7CJ32 &3 2+"(6(0)CD+ www.devmedia.com.br/javamagazine/feedback 
! 6M&(/+ : >31 2(17"32, )73*)2 6'(); &3 3*0'3/) 3 "3(0.') &) 13*2)/31, )":1
1+2 .1) @)'(#@3" &+ 0(7+ ;K*4#!#$: 3
6F)1)1+2 + 1:0+&+ C@$(>#$ &+ 6+*0'+"3 Listagem 3. Enviando o e-mail
18$"7"$@5< %7M2 ) 23"3CD+ &3 .1 )'-.(;
procedure   TfrmSendMail.btnEnviarClick(Sender: TObject);
@+ *) 6)(4) &3 &(#"+/+, )&(6(+*)1+2 .1 var
i : integer;
*+@+ (031 )+ $:'*,7"$@5 , 6+17+*3*03 begin
K*4#X*$M , 3 6+*A(/.')1+2 + 23. +'8#*5" try
{ Verifica se o campo remetente foi preenchido }
6+1 + *+13 &+ )'-.(@+ 23"36(+*)&+< if emailDe.Text <> ‘’ then
begin
 z# *+ (031 &3 13*. _L46".(' )'-.(; { Verifica se o campo destinatásio foi preenchido }
if emailPara.Text <> ‘’ then
@+` '31+@31+2 + )'-.(@+ &) "(20) &3 begin
)*34+2< I'(13('+ 6+7()1+2 + *+13 &+ { Verifica se o campo assunto foi preenchido }
if emailAssunto.Text <> ‘’ then
)'-.(@+ 23"36(+*)&+ 31 .1) @)'(#@3" begin
{ Verifica se a mensagem foi preenchida }
&+ 0(7+ /#%*"J 3 31 23/.(&) 6F)1)1+2 if emailMensagem.Lines.Text <> ‘’ then
begin
+ 1:0+&+ 3$,$#$ &+ 6+17+*3*03 $:'*,72 { Verifica se o servidor de SMTP requer autenticação. De acordo com a
"$@5< G3H) ) ./-)(0+1 4< seleção, o tipo de autenticação do componente será alterada }
if ckSMTP.Checked then
CompSMTP.Authenti cationType := atLogin else
Enviando o e-mail CompSMTP.Authenti cationType := atNone;
{ Configura o Host do servidor de SMTP a ser utilizado para o envio do e-mail }
CompSMTP.Host := edtHost.Text;
I)') '3)"(B)' + 3*@(+ &+ 3;1)(" 7'3; { Configuração do usuário e senha para autenticação no Host de SMTP }
6(2)1+2 6'()' 31 0317+ &3 3436.CD+ CompSMTP.Usernam e := edtUsuario.Text ;
CompSMTP.Passwor d := edtSenha.Text;
)"/.1)2 6+*A(/.')CJ32 '3")6(+*)&)2 )+2 { Faz a conexão ao servidor SMTP }
  CompSMTP.Connect;
6+17+*3*032 )&(6(+*)&+2< %&(6(+*3 )+ { Verifica se o servidor SMTP foi conectado }
3@3*0+ !*O"(6• &+ >0*L*@()' + 6M&(/+ &) if CompSMTP.Connected then
begin
./-)(0+1 5 , -.3 3*6+*0');23 6+13*0)&+ &3 { Configura a mensagem a ser enviada. Passagem de valores as propriedades }
  CompMensagem.Clear;
)6+'&+ 6+1 6)&) )CD+ -.3 320# +6+''3*&+   CompMensagem.Priority:=mpHighest;
{ Low = baixo / High = alto / mpHighest = urgente }
&.')*03 + 7'+6322+ &3 3*@(+ &+ 3;1)("< CompMensagem.Cont entType := ‘text/html’;
p 1.(0+ (17+'0)*03 -.3 0+&+ + 6M&(/+ CompMensagem.From .Text := emailDe.Text;
CompMensagem.Reci pients.EMailAddre sses := emailPara.Lines.T ext;
23H) 1)*0(&+ 31 .1 >"+6+ #%6QQ&*"',,6 CompMensagem.Subj ect := emailAssunto.Tex t;
CompMensagem.Body .Text := emailMensagem.Te xt;
23*&+ -.3 3*0'3 +  &*"',,6QQ$"? &3@3'# { Anexa os arquivos ao e-mail }
for i := 0 to emailAnexo.Items.Count - 1 do
320)' ) "(*F) 7)') &326+*360)' )+ 23'@(;   TIdAttachment.Create(CompMensagem.
&+' XQ\I< \)*0+ *.1 6)2+ &3 2.6322+  
MessageParts, TFileName(email Anexo.
Items[i].Caption));
&+ 3*@(+ &+ 3;1)(" +. *.1 6)2+ 31 { Faz o envio do e-mail }
  CompSMTP.Send(CompMensagem);
-.3 +6+'') .1) A)"F), + 6+17+*3*03 : MessageDlg(‘E-mai l enviado com sucesso!’,mtInfor mation, [mbOK], 0);
end;
&326+*360)&+ *D+ &3(4)*&+ *3*F.1) end
7+'0) &3 "(/)CD+ )>3'0)< else
ShowMessage(‘Inf orme a mensagem do e-mail’);
! 6)*63")13*0+ &+ 3*@(+ &+ 3;1)(" *) end
else
@3'&)&3 0')0);23 &3 .1) 2)?&) &+ A+'; ShowMessage(‘In forme o assunto do e-mail!’);
end
1."#'(+< I)') 0)*0+ )&(6(+*3 )+ 3@3*0+ else
1"+,*(O &+ L#"+'"($,'%   .1) 6F)1)&) ShowMessage(‘In forme o destinatário do e-mail!’);
end
)+ 1:0+&+ +,54$< else
ShowMessage(‘Info rme o e-mail do remetente!’);
O+*A(/.')&+2 0+&+2 +2 3@3*0+2 &) Finally
)7"(6)CD+, 3436.03 ) 1321) 3 A)C) + 03203  
{ desconecta do servidor SMTP }
CompSMTP.Disconnect;
&3 3*@(+< O3'0(A(-.3;23 )*032 &3 -.3 320# end;
end;
.2)*&+ .1 !V  @#"(&+ 7)') ).03*0(6);
eç o eç o eç o
Nesta seção você encontra artigos
ar tigos para iniciantes
na linguagem Delphi

Editor de Textos com RichEdit


Veja como criar seu próprio editor de textos com o componente RichEdit

Q .(0)2 @3B32 .0("


.0("(B)1+2
(B)1+2 31 *+2;
2)2 )7"(6)CJ32 + 6+17+*3*03
B*(0C?*# , -.3 7+22(>("
7+22 (>("(0)
7'+/')1)&+'32 )7"(6#;"+2 31 (*W13')2
2(0.)CJ32 &.')*03 + &323*@+"@(13*0+
(0) )+2

&323 *@+"@(13*0+ &3


A+'1)0)CD+ 6+1+ *3/'(0+, 2.>"(*F)&+
3*0'3 +.0'+2< \)1>:1 )"(*F)13*0+2 3
327)C)13*0+2 &3 7)'#/')A+2< b)'31+2
.2+ 0)1>:1, 31 )"/.1)2 2(0.)CJ32,
2(0.)CJ32, &3
)"/.*2 6+17+*3*032 &) 7)"30) 3*',5J4 &+
2.)2 )7"(6)CJ32< L*0'3 )2 &(@3'2)2 .0("(; K3"7F( 6+1 ) A.*CD+ &3 &3A(*(' + K'65>#
&)&32 320D+ A+'1."#'(+2 &3 6)&)20'+2 &3 (17'322D+, 2)"@)' 3 )>'(' &+6.13*0+2
6+1+ *+0?6()2, A+'1."#'(+2 &3 3*@(+ &3 2)"@+2 73"+ 3&(0+' &3 0340+2 +. )0: 1321+
3;1)(" +. ) 6'()CD+ &3 23. 7'M7'(+ 3&(0+'
3& (0+' 7+' +.0'+2 3&(0+'32<
&3 0340+2< O+1 + 6+17+*3*03 B*(0C?*#
@+6^ 7+&3 6'()' 3 )73'A3(C+)' 1.(0)2 &)2 Criando a aplicação
.0("(&)&32 -.3 + N5#$8'? R_8"+6+
R_8"+6+ &3 9+; % 6'()CD+ &+ 3&(0+' &3 0340+2 0')0);23 &3
0)2`U &+ 5(*&+V2 7+22.(< I+&3 (*+@)' .1) 2(17"32 )7"(6)CD+
)7"(6)CD+ *) -.)" .0("
.0("(B)'31+2
(B)'31+2
*) 6'()CD+ &3 .1 K'65># 3 *) )7"(6)CD+ + K3"7F( { 7)') ) 6'()CD+ &+ )7"(6)0(@+
&3 A3'')13*0)2 3 6+*A(/.')CJ32 *) &(/(; 5(*Tg< 9D+ 23'# *36322#'() ) .0("(B)CD+ &3
0)CD+ &3 0340+2, 2)"@#;"+2 3 '3)>'(;"+2 231 *3*F.1) 327:6(3
327:6(3 &3 >)*6+ &3 &)&+2
&)&+2 +. (*2;
73'&3' *3*F.1) A+'1)0)CD+< 0)")CD+ &3 6+17+*3*032 &3 03'63('+2< X3'D+
Maikel Marcelo Scheid G3H) *3203 )'0(/+ ) 6'()CD+ &3 .1 )73*)2 .0("(B)&+2 6+17+*3*032 *)0(@+2 &)2
(maikelscheid@gmail.com) 2(17"32 3&(0+' .2)*&+ + 6+17+*3*03 7)"30)2 &+ K3"7F(< O'(3
O'( 3 ) )7"(6)CD+ *+ 13*.
é técnico em Informática com ênfase em Aná- B*(0C?*#   3 )7'3*&) 1)*3(')2 &3 6+1+ A*,$qN$Mr788,*('#*5" 3 )"03'3 ) 7'+7'(3&)&3
lise e Programação de Sistemas. Atua na área .0("(B)' 2.)2 7'+7'(3&)&32 6+&(A(6)*&+ +'8#*5" &+ A+'1."#'(+ 7'(*6(7)" 7)') _Q3.
de Desenvolvimento de Softwares em Delphi
para plataforma Win32
Win32 e .NET com banco de
2(0.)CJ32 &3 A+'1)0)CD+ &3 0340+2, 0)(2 3&(0+' &3 \340+2` 3 31 23/.(&) *+13(3 +
dados Firebird e MS SQL. É membro da Equipe 6+1+ )"03')CD+ &) A+*03, 0)1)*F+ 3 A+'1."#'(+ 7)') _A'1L&(0+'`< X)"@3 ) )"*#
Editorial ClubeDelphi. 6+' &) "30'), .0("(B)CD+ &3 320("+2 &3 &+ A+'1."#'(+ 6+1+ _.I'(*6(7)"<7)2` 3 +
7'+H30+ 6+1+ _\340L&(0+'<&7'`< %&(6(+*3 0)1)*F+ &) A+*03 -.3 320# .0("(B)*&+, 6+17+*3*03 _8)'')8.00+*2` '3")6(+*3 )
)+ A+'1."#'(+ 7'(*6(7)" .1 6+17+*3*03 3 7)') (22+ )&(6(+*3 N >)'') .1 *+@+ 7'+7'(3&)&3 !:'J$4 &+ 1321+ )+ 7#',05!2
 9'*"9$"
 9'*"9$"> >R_Q)(*Q3*.Z`U &) 7)"30) /#'"2 6+17+*3*03 +5:L5H5@F_6•\)1)*F+`U, :'J$4 , , +>23'@)*&+
+>23'@)*&+ -.3 )"/.*2 )0)"F+2 H#
?'%? 3 6+1 &.7"+ 6"(-.3 &+ 1 1+.23
+.23 6'(3 .1) 3 *) 2.) 7'+7'(3&)&3 !#$:4 )&(6(+*3 )22.1(')1 &3 A+'1) ).0+1#0(6) )"/.*2
320'.0.') &3 13*.2 6+*A+'13 (".20')&+ *) )2 @)'()CJ32 &3 0)1)*F+2 -.3 &323H) ?6+*32 &3 (&3*0(A(6)CD+<
(&3*0(A (6)CD+<
</0,$( 23 L20) 320'.0.') &3 13*.2 0)1>:1 &(27+*(>("(B)'< 9+ 3&(0+' &3 (03*2 &+ I)') 3&(0)' +2 ?6+*32 &3 6)&) >+0D+ 3
23'# .0("(B)&) 1)(2 )&()*03 7)') ) 6'()CD+ 6+17+*3*03 )&(6(+*3, 237)')&+2 7+' )&3-.#;"+2 )+ ?6+*3 &3 2.) '327360(@)
&+2 )0)"F+2 &3 )6322+ '#7(&+< "(*F), +2 23/.(*032
23/ .(*032 @)"+'32E
@)"+'32E A.*6(+*)"(&)&3, 6"(-.3 2+>'3 ) 7'+7'(3&)&3
K3A(*(&) )/+') 0+&) ) 320'.0.') &3 13; !:'J$!"?$@ 3 *) "(20) &3 (1)/3*2 &(27+*?@3(2
&(27+* ?@3(2
6, 8, 10, 11, 12, 14, 16, 18, 20, 22, 24,
*.2 3 +7CJ32 &+ *+22+ 3&(0+' &3 0340+2, 28, 30, 32, 40. 23"36(+*3 -.)" 6+''327+*&3 N 2.) A.*CD+<
@)1+2 )&(6(+*)' &) 7)"30) D*"Z[ .1 %+ A(*)" &) 3&(CD+ &)2 (1)/3*2, ) >)'') &3
6+17+*3*03 ;55,H'%R_8)'')8.00+*2`U % )"03')CD+ &)2 6+'32 &3 .1 0340+ -.3 23 )0)"F+2 &+ 2(2031) &3@3'# A(6)' 320'.0.')&)
7)') -.3 7+22)1+2 6'()' )"/.*2 )0)"F+2 320# &(/(0)*&+ 0)1>:1 : .1) 6)')603'?2; &3 A+'1) 2313"F)*03 ) </0,$( 5<
&3 )6322+ '#7(&+ ) )"/.1 13*.2 &+ 2(203; 0(6) 1.(0+ (17+'0)*03 &.')*03 ) 6'()CD+ % 6+*A(/.')CD+ &+2 ?6+*32 &3 13*.
1)< O+1 + 6"(-.3 &+ >+0D+ &('3(0+ 2+>'3 &3 .1 3&(0+'< ]*6".) *) >)'') &3 )0)"F+2
)0)" F+2 0)1>:1 &3@3'# 23' '3)"(B)&) *+ 6+17+;
) ;55,H'% 23"36(+*3 ) +7CD+ N$M H>##5"c .1 6+17+*3*03 +5,5%H5@R_6•O+'`U &) *3*03 9'*"9$">_ , +*&3 0)1>:1 &3@3'#
6'()*&+
6'() *&+ )22(1 .1
. 1 *+@+ >+0D+ R_>09+@+`U
R_>09+@+`U 7)"30) 7??*#*5"', 3 31 23/.(&) (*2(') '3")6(+*)' 2.) 7'+7'(3&)&3 !:'J$4 )+
*) >)'') &3 )0)"F+2< O'(3 "+/+ )7M2 1)(2 1)(2 .1 237)')&+' N >)'')< _%0)"F+]1)/32` 3 6+1 .1 &.7"+ 6"(-.3
0'^2 >+0J32 .0("(B)*&+
.0(" (B)*&+ + 1321+ 1:0+&+< I)') 73'1(0(' ) A+'1)0)CD+ 3 )7"(6)CD+ )+ )>'(' + 3&(0+' &3 13*.2, 23"36(+*3
9+13(3 +2 >+0J32 6+1+ _>0%>'('`, _>0; &3 320("+2 &3 A+'1)0)CD+ 7)') 0340+2 6+1 6)&) .1 &3"32 )"03')*&+ + ?6+*3 '3");
X)"@)'` 3 _>0]17'(1('`
_>0]17'(1 ('`,, '327360(@)13*03< *3/'(0+, (0#"(6+, 2.>"(*F)&+ 3 '(26)&+, 6(+*)&+ ) 2.) 7'+7'(3&)&3 !:'J$!"?$@Q
K322) A+'1) )6)>)1+2 &3 6'()' +2 >+0J32 )&(6(+*3 N >)'') &3 )0)"F+2 -.)0'+ >+0J32, %"03')&+2
%"03')&+2 3 6+*A(/.')&+2 0+&+2 +2 ?6+*32
&3 )0)"F+ 7)') +2 7'(*6(7)(2 (03*2 &+ _>093/'(0+`, _>0]0)"(6+`, _>0X.>"(*F)&+` &3 (&3*0(A(6)CD+ &3 13*.2 3 )0)"F+2 &+
13*. _%'-.
_%'-.(@+`
(@+` 3 @)1+2
@)1+2 6'()'
6' ()' )/+') 7)') 3 _>0a(26)&+`< ]*2(') .1 *+@+ 237)')&+'< 3&(0+', @)1+2 )/+')
)/+') )&(6(+*)' + 7'(*6(7)"
+2 (03*2 &+ 13*. C?*#'%< I+' W"0(1+, (*6".) *) >)'') &3 )0)"F+2 1)(2 6+17+*3*03 &) *+22) )7"(6)CD+ )+ A+';
%*032 &3 6'()' .1. 1 *+@+ >+0D+ *) >)'') 0'^2 >+0J32 _>0L2-.3'&)`, _>0O3*0'+` 3 1."#'(+< 9) 7)"30) D*"Z[ )&(6(+*3 .1
&3 )0)"F+2, @)1+2 )&(6(+*)' .1 237); _>0K('3(0)` -.3 23'D+ .0("(B)&+2 6+1 ) A(; 6+17+*3*03 B*(0C?*# R_\340L&(0+'`U, &3;
')&+' ) A(1 &3 +'/)*(B)' 13"F+' 3 6)03; *)"(&)&3 &3 )"(*F)' + 0340+ 7)') 32-.3'&), A(*) 2.) 7'+7'(3&)&3 7,*J" 7)') ',+,*$"#
/+'(B)' 7+' /'.7+2 &3 A.*CJ32 *) >)'') 63*0')"(B)' 3 +'/)*(B)' N &('3(0)<
&3 )0)"F+2< O"(6)*&+ 2+> ) >)'') 6+1 + 9+22) )7"(6)CD+ 320# )7)'363*&+ )/+;
 >+0D+ &('3(0+ &+ 1+.23 3 23"36(+*)*&+
23"36(+*) *&+ ') &3 .1) A+'1) .1 0)*0+ 320')*F),
) +7CD+ N$M /$8'%'#5%
/$ 8'%'#5%QQ 031+2 )73*)2 + 13*. 3 .1) >)'') &3
O'()&+ .1 237)')&+' "+/+ )7M2 + 7'(; )0)"F+2 6+1 @#'(+2 >+0J32, 23*&+ -.3
13('+ /'.7+ &3 >+0J32, 6'()'31+2 )/+') *3*F.1 &3"32 )(*&) &(27J3 &3 -.)"-.3'
+2 >+0J32 7)') '3")6(+*)' )0)"F+2 )+2 (03*2 0(7+ &3 (&3*0(A(6)CD+ @(2.)" 7)') 2.)
&+ 13*. C?*#'%< O'(3 0'^2 >+0J32 &320(*)&+2 A.*6(+*)"(&)&3< I)') &3A(*(' .1 320("+
) 3203 /'.7+ 6+1 +2 *+132 _>0O+7()'`, &3 ,'65>#  3 6)')603'(B)' 6)&) >+0D+ &3
_>0a36+'0)'` 3 _>0O+")'`< j+/+ )7M2 )&(; )0)"F+, )'')203 7)') + A+'1."#'(+ .1
6(+*3 .1 *+@+ 237)')&+' )+ 13*.< 6+17+*3*03 !:'J$K*4#R_%0)"F+]1)/32`U
X3*&+ *+22) (&:() ) &3 6'()' .1 3&(0+' &) 7)"30) D*"Z[Q O+1 .1 6"(-.3 &.7"+
&3 0340+2, : (*03'322)*03 -.3 7)') .1) 2+>'3 + 1321+ )>') 23. 3&(0+' 3 )&(6(+*3
A#6(" 3&(CD+ &+ 1321+ + .2.#'(+ 03*F) .1) 2:'(3 &3 (1)/3*2 &3 )6+'&+ 6+1 )2
2317'3 &3 A#6(" )6322+ +2 0(7+2
0(7+ 2 &3 A+*032 A.*6(+*)"(&)&32 -.3 -.3'31+2 )0'(>.(' )+
7)') -.3 ) -.)"-.3' 1+13*0+ 7+22) *+22+ 3&(0+' &3 0340+2< %2 (1)/3*2 ) 23'31
)"03'#;") 31 0'36F+2 &+ 23. 0340+< I)') )&(6(+*)&)2 &3@3'D+ 320)' 6+1 A+'1)0+2
+A3'363' 320) +7CD+ )+ .2.#'(+, )&(6(+; &3 )'-.(@+ 6+1+ d<>17 +. d<(6+ 3 7+&3'D+
*)'31+2 0)1>:1 N >)'') &3 )0)"F+2 .1 23' A)6("13*03 "+6)"(B)&)2 *+ &('30M'(+ &3
6+17+*3*03 +5:L5H5@R_6•b+*032`U &) (1)/3*2 (*20)")&)2 73"+ 7'M7'(+ K3"7F(,
7)"30) /#'"?'%? -.3 23'# 7+@+)&+ "+/+ 3*6+*0')&)2 *+ 6)1(*F+ 7)&'D+ 31 +et +et
1)(2 6+1 0+&) ) "(20) &3 A+*032 (*20)")&)2 7%T>*=54 ?$ 8%5J%':'4t7%T>*=54 (5:>"4t
*+ 5(*&+V2< %&(6(+*)&+ + 6+17+*3*03, /0'%$?t!:'J$4tH>##5"4< O)&) (1);
H5%,'"? /0'%$?t!:'J$4tH>##5"4
6'(3 .1 *+@+ 237)')&+' *) >)'') &3 )0); /31 )&(6(+*)&) 7)') + 6+17+*3*03 !:'J$2
"F+2< %":1 &) )"03')CD+ &+ 0(7+ &3 A+*03 :K*4# '363>3 .1 *W13'+ &3 (&3*0(A(6)CD+
31 .1 0340+, + .2.#'(+ 7'36(2) 0)1>:1 -.3 .2)'31+2 7)') &3A(*(' +2 )0)"F+2 *+2
03' 2317'3 &3 A#6(" )6322+ ) )"03')CD+ &+  >+0J32 R</0,$( 4U< X3"36(+*)*&+ )/+') + Figura 1. Estrutura de menus do sistema
3 '31+@) + 0340+ 7)&'D+ 34(>(&+ *) 2.) %+ A(*)" &) )&(CD+ 3 6+*A(/.')CD+ &3 ?>%$ -.3 23'# '3A3'3*6()&) 6+1+ A+'1)
7'+7'(3&)&3 K*"$4Q 0+&+2 +2 6+17+*3*032 )+ A+'1."#'(+, &3 7+*03('+ 3 '3A3'^*6() ) .1 327)C+ &3
I+2(6(+*)&+ )/+') 2+> ) 7)"30) 3*',5J4 , 2.) )7"(6)CD+ &3@3'# 320)' 2313"F)*03 N 131M'() ) 23' "+6)&+ *+ 2(2031)< %(*&)
)&(6(+*3 )+ A+'1."#'(+ +2 6+17+*3*032 )7"(6)CD+ &) </0,$( = , *) -.)" 7)22)'3;
7)22)'3 ; &3*0'+ &) 8%5($?>%$ 6'()1+2 .1) @)'(#;
V%*"#3*',5JR_&"/I'(*0`U -.3 23'# .0("(B); 1+2 ) 7)'0(' &3203 1+13*0+
1+13*0+ ) 6+&(A(6)' @3" &+ 0(7+ K5"JD5%? -.3 : .2)&) 7)')
&+ 7)') 6+*A(/.')CD+ 3 3*@(+ &+ 0340+ )2 A.*CJ32 &+ *+22+ 3&(0+'< 6)''3/)' +2 *+132 &)2 A+*032 3 "+/+ 1)(2
1)( 2
N (17'322+'), /'=$3*',5J R_&"/X)@3`U 2D+ )0'(>.?&)2 )+ 6+17+*3*03 (OA5"#$4<
.0("(B)&+ 7)') 2)"@)' 3 )'1)B3*)' + Codificando a aplicação 9+ 3@3*0+ 1"+%$'#$ &+ A+'1."#'(+, )&(;
0340+ &+ 3&(0+' 6+1+ .1 &+6.13*0+ 31 % 6+&(A(6)CD+ &3 0+&+ + 7'+6322+ &+ 6(+*3 )2 23/.(*032 "(*F)2
"(* F)2 &3 6M&(/+, -.3
-.)"-.3' .*(&)&3 &3 )'1)B3*)13*0+ 3&(0+' &3 0340+2 *D+ 23'# 1.(0+ 6+17"(; ('D+ 6F)1)' ) 8%5($?>%$
 8%5($?>%$ &+ 6)''3/)13*0+
&+ 6+17.0)&+' 3 0)1>:1 )&(6(+*3 .1 6)&), @31+2 -.3 23 0')0) &3 73-.3*+2 &)2 A+*032 '36:1 6'()&) 3 &3A(*(' *+2
18$"3*',5JR_&"/!73*`U .0("(B)&+ 7)')  >"+6+2 &3 6+1)*&+2 -.3 23'D+ A)6("13*03 6+17+*3*032 (OA5"#$4 3 (O;':'"05 + 0(7+
"+6)"(B)' &+6.13*0+2 )'1)B3*)&+2 *+ 3*03*&(&+2 3 7+&3'D+ 23' )7"(6)&)2 ) 3 0)1)*F+ &)2 6+*A(/.')CJ32
6+*A (/.')CJ32 7)&'D+
7)&'D+ -.3
6+17.0)&+' 3 '3)>'(;"+2 ) A(1 &3 "3' +. @#'()2 +.0')2 2(0.)CJ32 -.3 @+6^ 7+&3'# 320D+ &3A(*(&)2 *+ 2(2031), 0')B3*&+;)2
6+*0(*.)' 6+1 ) 3&(CD+ &+ 0340+< 23 &37)')' 3*-.)*0+ &323*@+"@3' 2.) 23"36(+*)&)2E
! A+'1)0+ &3 )'-.(@+ -.3 .0("(B)'31+2 )7"(6)CD+< % 7'(13(') 6+&(A(6)CD+ -.3   ObtemFontes;
23'# + <'0A, )+ -.)" ('31+2 &3A(*(' .1 A("0'+
A( "0'+ @3'31+2 23'# -.)*0+ ) 6'()CD+
6' ()CD+ &+ A+'1.; ckFontes.Text := DefFontData.Name ;
ckTamanho.Text :=
7)') ) 7'+7'(3&)&3 A*,#$% &+2 6+17+*3*; "#'(+ R3@3*0+ 1"+%$'#$U +*&3 ('31+2 '3; IntToStr(-MulDiv( DefFontData.Heigh t, 72,
Screen.PixelsPerInch));
032 ?,J/'=$ 3 ?,J18$"< %>'(*&+ + 3&(0+' )"(B)' )"/.1)2
)"/. 1)2 6+*A(/.')CJ32 -.3 23'D+
&3 A("0'+2 &+2 6+17+*3*032, &3A(*) &+(2 +2 3$&'>,# &+ *+22+ 3&(0+'< %6322)*&+ + 9)2 7'M4(1)2 "(*F)2
"(* F)2 &3 6M&(/+, @)1+2
A("0'+2 31 "(*F)2 &(A3'3*032, +>3&363*&+ 3&(0+' &3 6M&(/+2 &+ A+'1."#'(+,
A+'1."#'(+, &36")'3 )0'(>.(' A.*6(+*)"(&)&32 )+2 13*.2 &+
+ A*,#$% N':$ 6+1+ _%'-.(@+2 &3 \340+ *) 23CD+ 8%*='#$ ) 23/.(*03 8%5($?>%$ -.3 2(2031) R 9'*"9$">_
 9'*"9$">_U, 3 7)') +2 6)2+2 &3
Rd<'0A
Rd<'0AU`
U` 3 _\+&+2
_\+&+2 +2 )'-.(@+2`
)' -.(@+2` 3 *) 6+".*)
6+". *) 23'# '327+*2#@3" 7+' 6)70.')' 0+&)2 )2 34(20('
34(20( ' .1 )0)"F+ '#7(&+ *) >)'')
>)'') 6+''32;
A*,#$% +>3&3C) d<'A0 3 d<d, '327360(@)13*03 A+*032 (*20)")&)2 *+ 5(*&+V2 3 7'33*; 7+*&3*03 ) .1 (031 &+ 13*. +'(/(*)"
R</0,$( ;U< L22)2 6+*A(/.')CJ32 ('D+ A)B3' 6F3' ) "(20) *+ 6+17+*3*03 (OA5"#$4< R13*. 7L%*% 7+' 34317"+U,
34317"+U, ('31+2 )73*)2
)73 *)2
6+1 -.3 )73*)2 )'-.(@+2 6+1 320) 3403*; '3")6(+*)' + >+0D+ )+ (031 )0')@:2 &)
procedure  ObtemFontes;
2D+ 23H)1 34(>(&+2 *) F+') &3 2)"@)' +. 2.) 7'+7'(3&)&3 9$">!#$: -.3 @3'31+2
"+6)"(B)' &+6.13*0+2 *)2 .*(&)&32 &3 I+2(6(+*)&+ 2+>'3 ) &36")')CD+ &) 0)1>:1 1)(2 ) 23/.('<
)'1)B3*)13*0+ &+ 6+17.0)&+'< O+*A(;  8%5($?>%$ .0("(B3 )2 036")2 +#%,./0*&#.+ O"(-.3 &.)2 @3B32 *+ 9'*"9$">_
 9'*"9$">_ 3 6+1
/.'3 )(*&)
)( *&) 31 )1>+2 +2 6+17+*3*032 ) 7)') -.3 + K3"7F( 6'(3 + 6)>3C)"F+ &+ 3"3 )>3'0+ *)@3/.3 )+ (031 7%T>*=5rN5=5<
7'+7'(3&)&3 3$&'>,#C@#c )0'(>.(*&+;"F32 + 7'+63&(13*0+, 3 )&(6(+*3 )+ 1321+ + %.0+1)0(6)13*03 + K3"7F( *+2 6'() +
@)"+' d<'0A
d<'0A -.3 23'# ) 3403*2D+
3403* 2D+ 7)&'D+ -.3 6M&(/+ &) ./-)(0+1 2 , +*&3 6'()'31+2
6'() '31+2 6)>3C)"F+ &+ 3@3*0+ 1"+,*(O &3223 (031
)&+0)1+2 7)') *+22+ 2(2031)< .1)  &>"(#*5" &3'(@)&) &3*0'+ &)  8%5($2 )+ -.)" &(/(0)'31+2 )2 23/.(*032 "(*F)2
&3 6+1)*&+E
if  TextEditor.Modified then
ShowMessage(‘De seja salvar arquivo’)
else
  TextEditor.Lines.Clear;

9+ 6M&(/+ @3'(A(6)1+2 23 F+.@3 )";


/.1) )"03')CD+ &+ 0340+ &(/(0)&+ 3
73'/.*0)1+2 23 + .2.#'(+ &323H) 2)"@)'
+ 6+*03W&+ +. 23*D+ "(17)1+2 0+&+2 +2
@)"+'32 34(203*032
34(203*032 *) "(*F)2<
"( *F)2<
a37(0) 3223 7'+6322+ 3 &(/(03 + 6M&(/+
&) ./-)(0+1 4  *+ 3@3*0+ 1"+,*(O &+
13*. 7%T>*=5r7L%*%< L223 3@3*0+ ('#
3436.0)' .1) 6)(4) &3 732-.(2) &+
6+17+*3*03 ?,J18$"   3 )+ 23"36(+*)'
.1 )'-.(@+ -.3 + .2.#'(+ &323H) )>'(',
@3'(A(6)1+2 23 ) 3403*2D+ &+ 1321+
Figura 2. Adicionando imagens para ImageList 6+''327+*&3 )+ 0(7+ &3 )'-.(@+2 6+1
-.3 320)1+2 0')>)"F)*&+ 6)''3/)*&+;
+ *+ 3&(0+', 6)2+ 6+*0')'(+ @+6^ 23'#
*+0(A(6)&+ &3 -.3 + A+'1)0+ &+ )'-.(@+
Figura 3. Barra de atalhos d o Editor de Textos 23"36(+*)*&+ *D+ 6+''327+*&3 )+2 )';
-.(@+2 2.7+'0)&+2 73"+ *+22+ 3&(0+' 3 ) +>#;5+,*8H5'%? 3 V'4#$;5+,*8H5'%?  -.3, &)&+ )+ 23. 0340+< %*032 &3 )&(6(+*)'
)CD+ 23'# (/*+')&)< '327360(@)13*03, 6+7()1, '36+'0)1 3 + 6M&(/+, &36")'3 *)2 >4$4 &+ 7'+H30+ )
I)') 2)"@)' + 6+*03W&+ &(/(0)&+ *+ 3&(; 6+")1 + 6+*03W&+ ?$ +. 8'%' ) 131M'() )"*# 3*',5J4Q
0+', )0'(>.) )+ 3@3*0+ 1"+,*(O &+ 13*. R_O"(78+)'&`U<
7%T>*=5r/',='% + 6M&(/+ &) ./-)(0+1 5 9+ 13*. B$(>5 &+ 7)'#/')A+ )&(6(+*3 //Adicionar uses Dialogs
TextEditor.Para graph.FirstIndent :=
-.3 )+ 3436.0)' + 6+17+*3*03 &3 &(#; )+ 3@3*0+ 1"+,*(O )2 23/.(*032 "(*F)2 TextEditor.Paragraph.FirstIndent +
StrToInt(InputBox(‘Digite o
"+/+ ?,J/'=$  ('# @3'(A(6)' 23 + *+13 &+ &3 6M&(/+, -.3 ('D+ )>'(' .1) 6)(4) &3 espaçamento’,’Recuo do Texto (em mm)’,
  IntToStr(TextEditor.Paragraph.
)'-.(@+ A+'*36(&+ 73"+ .2.#'(+ H# 34(203 &(/(0)CD+ 7)') -.3 + .2.#'(+ 7+22) &3;   FirstIndent)));
*) 7)20) 23"36(+*)&)< f)@3*&+ + )'-.(@+ A(*(' -.)" 327)C)13*0+ &323H) -.3 23H)
3"3 23'# 2+>'326'(0+< L1 6)2+ 6+*0'#'(+
23'# 6'()&+ .1 *+@+ )'-.(@+ 6+1 + *+13
A+'*36(&+ *) 7)20) &3 &320(*+ 23"36(+*); Nota do DevMan
&) 73"+ .2.#'(+< I+' A(1 ) 7'+7'(3&)&3
 95?*&*$? &+ 3&(0+' 23'# '37)22)&) 6+1+ Se você estiver trabalhando no Windows VISTA, será
A',4$c  A+'*363*&+ )22(1 -.3 *D+ 34(203 necessário executar o Visual Web Developer como
administrador, para que a aplicação tenha direitos
6+*03W&+ 1+&(A(6)&+ 231 23' 2)"@+ 6)2+ suficientes para gravar no log de Eventos.
&323H3 6'()' .1 *+@+ &+6.13*0+<
Para executar o Visual Web Developer como administrador,
% 6+&(A(6)CD+ &+ 13*. /',='% +5:5 clique com o botão direito sobre o seu ícone no menu, e
0)1>:1 23 &# &3 A+'1) >)20)*03 2(17"32, escolha a opção “Executar como administrador” ou “Run as
7+(2 *3*F.1) @3'(A(6)CD+ 7'36(2) 23' '3; administrator”.
Figura 4. Configuração dos filtros
)"(B)&), *36322(0)*&+ )73*)2 3436.0)' +
&(#"+/+ &+ ?,J/'=$ 3 2)"@)' + 6+*03W&+ *)
7)20) 23"36(+*)&) 6+1 + *+13 A+'*36(&+<
! 6M&(/+ ) 23/.(' &3@3'# 23' )&(6(+*)&+
)+ 23. 3@3*0+ 1"+,*(Oe
if dlgSave.Execute then
begin
  TextEditor.Lines.SaveToFile(
  dlgSave.FileName);
TextEditor.Modif ied := false;
end;

I3"+ A)0+ &3 03'1+2 )&(6(+*)&+ )+ A+';


1."#'(+ .1 6+17+*3*03 7)') &(#"+/+
&) (17'322+'), ) (17'322D+ 0)1>:1 :
&3 A+'1) 1.(0+ 2(17"32< 8)20) )&(6(+*)'
)+ 3@3*0+ 1"+,*(O &+ 13*. !:8%*:*% +
6M&(/+ ) 23/.(', -.3 23'# '327+*2#@3" 7+'
6F)1)' + &(#"+/+ 3 3*@()' ) (17'322+')E
if (dlgPrint.Execute) then
  TextEditor.Print(Text);

9+ 3@3*0+ 1"+,*(O &+ 13*. /'*% )&(;


Figura 5. Estrutura do Editor de Textos
6(+*3 + 6M&(/+ &) ./-)(0+1 ;3 %-.(
@3'(A(6)1+2 23 F+.@3 )"03')CJ32 *+
6+17+*3*03 B*(0;$@#Q L1 6)2+ 7+2(0(@+ Listagem 1. Implementação da procedure ObtemFontes
73'/.*0)1+2 )+ .2.#'(+ 23 3"3 &323H) procedure   TfrmEditor.ObtemFontes;
2)"@)' + )'-.(@+, 6)2+ 6+*0'#'(+ )73*)2 function  EnumFontsProc(var LogFont: TLogFont; var
TextMetric: TTextMetric; FontType: Integer;
A36F)1+2 + )7"(6)0(@+< Data: Pointer): Integer; stdcall;
begin
I)') 6+&(A(6)CD+ &+2 0'^2 &+2 (03*2 &+   TStrings(Data).Add(LogFont.lfFaceName);
Result := 1;
13*. C?*#'%  +>23'@3 *) ./-)(0+1 = +2 end;
6M&(/+2 '3A3'3*032 ) 6)&) (031 &3 13*. var
DC: HDC;
&(/(0)*&+ +2 '327360(@+2 6M&(/+2 7)') )2 begin
DC := GetDC(0);
)CJ32 &3 +58*'%c B$(5%#'% 3 +5,'%<   EnumFonts(DC, nil, @EnumFontsProc,
Pointer(ckFontes.Items));
! 6+17+*3*03 B*(0;$@# 7+22.( 0'^2 1:; ReleaseDC(0, DC);
0+&+2 &(20(*0+2 7)') 23 0')0)' 13*2)/3*2 ckFontes.Sorted := True;
end;
31 131M'() -.3 2D+ +586;5+,*8H5'%?c
9+ 6M&(/+ )*03'(+' )0'(>.?1+2 + @)"+' N5=5c 7L%*% 3 /',='%< )2 -.)(2 )(*&) *D+ A+')1 13*6(+*)&)2
&(/(0)&+ 73"+ .2.#'(+ N 7'+7'(3&)&3 X3"36(+*)*&+ + >+0D+ 6+''327+*&3*03, 31 *3*F.1) 6+&(A(6)CD+ 3 -.3 2D+
A*%4#!?$"# &+ V'%'J%'80< ! V'%'J%'80 : .1) @# )0: ) 7'+7'(3&)&3 9$">!#$: 3 "+6)"(B3 (*&(273*2#@3(2 ) .1 3&(0+' &3 0340+2<
7'+7'(3&)&3 &+ 6+*0'+"3 B*(0;$@#  '32; + *+13 &+ (031 &3 13*. 6+''327+*&3*; %"03')CD+ &+ 0(7+, 0)1)*F+ 3 6+' &3 A+*;
7+*2#@3" 7+' )"03')' )2 6+*A(/.')CJ32 &3 03< a37(0) + 1321+ 7'+63&(13*0+ 31 032< I+&31+2 23"36(+*)' 0'36F+2 &+ 0340+
7)'#/')A+, 6+1+ + 7'M7'(+ *+13 2./3'3< 0+&+2 +2 >+0J32< 3 A)6("13*03 3&(0)' -.)"-.3' .1) &)2
b(*)"(B)&) ) )0'(>.(CD+ &+2 6M&(/+2 )+2 7'+7'(3&)&32 )73*)2 1.&)*&+ + (031
(03*2 &3 13*. &+ 6+17+*3*03 9'*"9$2 Alterando tipo, tamanho 23"36(+*)*&+ *+ +5:L5H5@ '3")6(+*)&+
">_ , 7'36(2)1+2 '3")6(+*)' +2 )0)" F+2 e cor da fonte ) +7CD+< !2 6M&(/+2 2D+ 2(17"32 3 )7"(6);
'#7(&+2 N-.3"32 (03*2 -.3 H# A+')1 6+; \31+2 )&(6(+*)&+ ) *+22) >)'') &3 &+2 )+ 3@3*0+ 1"+0'"J$ &3 6)&) .1 &+2
&(A(6)&+2, 6+1+ : + 6)2+ &+2 )0)"F+2 &3 )0)"F+2 '#7(&+2 0'^2 A.*6(+*)"(&)&32, 6+17+*3*032, 6+*A+'13 7+&3'# +>23'@)'
*+2 6M&(/+2 3 6+13*0#'(+2 '3")6(+*)&+2
*) ./-)(0+1 > ) 23/.('< !2 6M&(/+2 320D+
Listagem 2. OnClick para o menu Abrir
6+13*0)&+2 3 *D+ F# 23/'3&+<
procedure   TfrmEditor.Abrir1Click(Sender: TObject);
begin
\)1>:1 )0)"F+2 -.3 )(*&) *D+ A+;
if dlgOpen.Execute then ')1 6+&(A(6)&+2, 031+2 +2 >+0J32 7)')
begin
if ExtractFileExt(dlgOpen.FileName) = ‘.rtf’ then )7"(6)CD+ &+ 320("+2 &3 N$J%*#5c !#d,*(5c
begin
  TextEditor.Lines.LoadFromFile(dlgOpen.FileName);
/>L,*"0'?5 3 B*4('?5  2+>'3 +2 0'36F+2
dlgSave.FileNam e := dlgOpen.FileName;
TextEditor.Modi fied := false;
&3 0340+2 23"36(+*)&+< 9) 6+&(A(6)CD+
end &3 0+&+2 32032 >+0J32, @3'(A(6)1+2 23 +
else
MessageDlg(‘For mato de arquivo não suportado’,mtInf ormation,[mbOk],0 ) 320("+ H# 23 3*6+*0') )7"(6)&+ )+2 0'36F+2
end;
end;
23"36(+*)&+2, 3 *+ 6)2+ &3 H# 34(20(',
+ 1321+ 23'# '31+@(&+ &3(4)*&+ +
Listagem 3. OnClick do menu Arquivo|Salvar 0340+ 231 + 320("+ 6"(6)&+< %&(6(+*3 )
procedure   TfrmEditor.Salvar1Click(Sender: TObject); 6)&) .1 &+2 >+0J32 ) "(*F) &3 6M&(/+
begin
if  FileExists(dlgSave.FileName) then
6+''327+*&3*03 -.3 320# 7'3@(20) *)
  TextEditor.Lines.SaveToFile(dlgSave.FileName) ./-)(0+1 ?3 L1 '32.1+, + -.3 320)1+2
else
begin A)B3*&+ : )&(6(+*)' +. '31+@3' + 320("+
if dlgSave.Execute then
begin 317'3/)&+ N 7'+7'(3&)&3 /$,7##%*L>#$4
  TextEditor.Lines.SaveToFile(dlgSave.FileName);
end;
&+ 6+17+*3*03 B*(0;$@#<
end; \31+2 )(*&) ) 6+&(A(6)CD+ &+2 0'^2
TextEditor.Modif ied := false;
end; W"0(1+2 >+0J32 &3 )6322+ '#7(&+ &+
*+22+ 2(2031), 6+''327+*&3*032 )+ )"(;
Listagem 4. Evento ativado ao sair do editor de textos
*F)13*0+ &+ 0340+ )+ ")&+ 32-.3'&+,
procedure  TfrmEditor.Sair1Click(Sender: Tobject); 63*0')"(B)&+ 3 N &('3(0) &+ 3&(0+'< I)')
begin
if  TextEditor.Modified then )"(*F)' + 0340+ 23"36(+*)&+, 1+&(A(6);
begin
if Application.MessageBox(‘Deseja salvar as 1+2 ) 7'+7'(3&)&3 %"(/*13*0 )0'(>.(*;
alterações?’, ‘Salvar’,MB_YESNO) = IdYes then
begin
&+ +2 @)"+'32 0)j3A0z.20(AuR_32-.3'&)`U,
if dlgSave.Execute then 0)O3103'R_63*0'+`U +. 0)a(/0Fz.20(Au
  TextEditor.Lines.SaveToFile(dlgSave.FileName);
  Close; R_&('3(0)`U )+ 3@3*0+ !*O"(6• &+2 >+0J32
end
else  >0*L2-.3'&), >0*O3*0'+ 3 >0*K('3(0),
 
end
Close; '327360(@)13*03< G3H) + 6M&(/+ &+ >+;
else 0D+ >0*L2-.3'&)< a37(0) + 6M&(/+ 7)')
  Close;
end; +2 &31)(2 >+0J32 0'+6)*&+ )73*)2 )
)0'(>.(CD+ A(*)"E
Listagem 5. Copiar, Recortar e Colar
TextEditor.Paragraph.Alignment :=
procedure   TfrmEditor.Copiar1Click(Sender: TObject);   taLeftJustify;
begin
  TextEditor.CopyToClipboard;
end;
%7M2 0+&+ 3223 7'+6322+ &3 6+&(A(6)CD+
procedure   TfrmEditor.Recortar1Click(Sender: TObject);
begin
&+2 13*.2 3 >+0J32 &3 )6322+ '#7(&+ &+
  TextEditor.CutToClipboard; 2(2031), )6)>)1+2 6+1 ) 6'()CD+ &+ *+2;
end;
2+ 7'M7'(+ 3&(0+' &3 0340+2, -.3 7+&3'#
procedure   TfrmEditor.Colar1Click(Sender: TObject);
begin
23' 0320)&+ 3 .0("(B)&+ 7)') )7"(6)CD+ &3
  TextEditor.PasteFromClipboard;
end;
&(@3'2+2 320("+2<
L436.03;+ 3 A)C) ) &(/(0)CD+ &3 @)"+'32,
.0("(B)*&+ 0+&)2 )2 7'+7'(3&)&32 )-.( 6+*;
Listagem 6. Alteração do tipo, tamanho e cor da fonte do texto
A(/.')&)2< G3H) -.3 (*W13')2 )CJ32 6+1 +
procedure   TfrmEditor.ckFontesChange(Sender: TObject);
begin
0340+ 7+&31 23' 23"36(+*)&)2 R</0,$( >U<
{ Altera o tipo da fonte no texto selecionado. }
TextEditor.SelAtt ributes.Name :=
ckFontes.Items[ckFontes.ItemIndex]; Conclusão
end;
procedure   TfrmEditor.ckTamanhoChange(Sender: TObject);
G(1+2 6+1 322) 6'()CD+ &+ 3&(0+' &3
begin
{ Altera o tamanho da fonte no texto selecionado. }
0340+2 -.3 7+&31+2 6'()' *+22)2 7'M;
TextEditor.selatt ributes.Size := 7'()2 A3'')13*0)2 &3 0')>)"F+< ]1)/(*3
StrToInt(ckTamanho.Items[ckTamanho.ItemIndex]);
end; *3203 6)2+ ) 2.>20(0.(CD+ &+ >"+6+ &3
procedure   TfrmEditor.ckCorChange(Sender: TObject);
*+0)2 73"+ 23. 7'M7'(+ 3&(0+' &3 0340+2
begin 3 -.31 2)>3 6+1 1)(2 A.*6(+*)"(&)&32<
{ Altera a cor da fonte no texto selecionado. }
TextEditor.selatt ributes.Color := ckCor.Selected; O'(3 )/+') A+'1."#'(+2 73'2+*)"(B)&+2
end;
3 7'+/')13 *+@)2 .0("(&)&32 )+ 3&(0+',
Listagem 7. Aplicação de estilos ao texto. )&(6(+*3 1:0+&+2 7)') 1)'6)&+'32 3 *.;
13')&+'32 &3 7)'#/')A+2, 327)C)13*0+
procedure   TfrmEditor.btNegritoClick(Sender: TObject);
begin &+ 0340+ 3*0'3 "(*F)2 3 "30')2, 732-.(2)2
if (fsBold in  TextEditor.selattributes.Style) then
TextEditor.selatt ributes.Style := TextEditor.SelAtt ributes.Style - [fsBold] else 7+' 7)")@')2, 2.>20(0.(CD+ &3 0340+2,
TextEditor.selatt ributes.Style := TextEditor.SelAtt ributes.Style +
end;
[fsBold]; 3*0'3 +.0')2 (*W13')2 A.*6(+*)"(&)&32
procedure   TfrmEditor.btItalicoClick(Sender: TObject); -.3 7+&3'D+ 23' 6+*A(/.')&)2<
begin
if (fsItalic in  TextEditor.selattributes.Style) then %>')C+ 3 )0: ) 7'M4(1)<
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style - [fsItalic]
else
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style + [fsItalic];
end;
procedure   TfrmEditor.btSublinhadoClick(Sender: TObject); Dê seu feedback sobre esta edição!  F eedb a c  k  
  u
  e
begin    s
     ê
if (fsUnderline in  TextEditor.selattributes.Style)      D
then A Java Magazine tem que ser feita ao seu
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style - [fsUnderline]
else gosto.Para isso, precisamos saber o que   t
   a
    e
  e
  s
   d
  i
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style + [fsUnderline]
end;
você, leitor, acha da revista!       o    ç
    ã

procedure   TfrmEditor.btRiscadoClick(Sender: TObject);


begin Dê seu voto sobre este artigo, através do link:
if (fsStrikeOut in TextEditor.selattributes.Style)
then www.devmedia.com.br/javamagazine/feedback 
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style - [fsStrikeOut]
else
TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style + [fsStrikeOut]
end;

Figura 6. Utilizando funcionalidades do Editor de textos


4)' 6")'+ -.3 ) "(*/.)/31 -.3 320)1+2 Listagem 1. Polimorfismo no Delphi Win32
0')>)"F)*&+ : + IfI 3 -.3 + 1321+ :
unit SeresVivos;
(*03'7'30)&+, A')6)13*03 #*8'?5 3 23*&+
)22(1 *D+ F# ) *36322(&)&3 &3 23 &36"); interface

')' @)'(#@3(2 6+1 23.2 0(7+2< Q)2 + -.3 type


TServivo = class
(22+ 031 ) @3' 6+1  85,*:5%&*4:5P \.&+‰ procedure ProduzirSom;
end;
!>23'@3 + 6M&(/+ &) ./-)(0+1 2<
9+ 6M&(/+ &) ./-)(0+1 2 23'# "3@)*; TCachorro = class(TServivo)
procedure  ProduzirSom;
0)&) .1) 3463CD+ *+ 3@3*0+ 1"+,*(O &+ end;

 >+0D+ 6+1 ) 13*2)/31 _931 0+&+ 23' THomem = class(TServivo)


procedure  ProduzirSom;
@(@+ 7'+&.B 2+1‰‰‰` 1321+ .1 +>H30+ end;
&+ 0(7+ ;\5:$: 23*&+ (*20)*6()&+ 7)')
implementation
) @)'(#@3" /$%< ]22+ )6+*0363 7+'-.3 *+
uses
K3"7F( +2 1:0+&+2 2D+ 320#0(6+2 7+' 7); SysUtils, Dialogs;
&'D+< ]22+ 2(/*(A(6) -.3 (*&373*&3*03 &+ { TCachorro }
+>H30+ -.3 23H) (*20)*6()&+ *) @)'(#@3"
procedure   TCachorro.ProduzirSom;
@)"3 7)') 3") + 0(7+ -.3 A+( &36")')&+< begin
ShowMessage(‘Ca chorro Latindo !!!’);
I)') 6+*23/.('1+2 + 3A3(0+ &323H)&+, end;
+. 23H), + 1:0+&+ V%5?>E*%/5: &) 6")223 { TServivo }
;\5:$:  23H) 6F)1)&+, : 7'36(2+ &3;
procedure   TServivo.ProduzirSom;
6")')' + 1:0+&+ V%5?>E*%/5: *) 6")223 begin
raise Exception.Create(‘Nem todo ser vivo produz
;/$%X*=5  6+1+ X*%#>',< som !’);
]22+ A)B 6+1 -.3 + K3"7F( 6'(3 .1) end;

GQ\R_G('0.)" Q30F+& \)>"3`U .1) 0); { THomem }

 >3") 6+1 +2 7+*03('+2 &+2 1:0+&+2 -.3 procedure   THomem.ProduzirSom;


begin
A+')1 &36")')&+2 6+1+ @('0.)(2 7)') ShowMessage(‘Ho mem Falando !!!’);
-.3 7+22)1 23' 2+>'326'(0+2 31 0317+ end;

&3 3436.CD+< 9) ./-)(0+1 4 @31+2 6+1+ end.

A(6)'() + 6M&(/+< procedure  TForm1.Button1Click(Sender: TObject);


var
9+ IfI *)&) &(22+ : *36322#'(+, 6+1+ Ser: TSerVivo;
3"3 3 A')6)13*03 0(7)&+, +. 23H), *D+ begin
Ser := THomem.Create;
  Ser.ProduzirSom;
end;

Listagem 2. Métodos Virtuais


Nota do DevMan unit SeresVivos;

interface
O termo Programação Procedural (ou programação
procedimental) é às vezes utilizado como sinônimo de type
TServivo = class
Programação Imperativa (paradigma de programação que procedure  ProduzirSom;virtual;
especifica os passos que um programa deve seguir para end;
alcançar um estado desejado), mas o termo pode se referir
TCachorro = class(TServivo)
(como neste artigo) a um paradigma de programação procedure  ProduzirSom;override ;
baseado no conceito de chamadas a procedimentos. end;
Procedimentos, também conhecidos como rotinas, sub-
THomem = class(TServivo)
rotinas, métodos, ou funções simplesmente contêm um procedure  ProduzirSom;override ;
conjunto de passos computacionais a serem executados. end;
Um dado procedimento pode ser chamado a qualquer
hora durante a execução de um programa, inclusive por implementation

outros procedimentos ou por si mesmo. end.


7'36(2)1+2 &36")')' + 0(7+ &3 *+22)2 9+03 -.3 )/+') 6'()1+2 .1) 6")223 7'+/')1)&+'32 3*@+"@(&+2 *+ 7'+6322+
@)'(#@3(2, *D+ F# 7+'-.3 +2 1:0+&+2 /$%X*=5 -.3 23'@('# &3 >)23 7)') 0+&)2 &3A(*(1+2 32232 1:0+&+2 6+1+ )>20')0+2
23'31 320#0(6+2, 3 *31 7+&31< O+1+ )2 +.0')2 6")2232 &3 )*(1)(2 -.3 ('31+2 &31+*20')*&+ )22(1 ) *+22) (*03*CD+ &3
*D+ F# .1 0(7+ &3A(*(&+ 7)') + +>H30+ 6'()' 3 -.3 ('D+ 7'+&.B(' )"/.1 2+1< p -.3 3"3 23H) 2+>'326'(0+ *) 6")223 -.3 +
-.3 23'# (*20)*6()&+, 7+' 7)&'D+ 23'# *320) 6")223 -.3 320# &36")')&+ + 1:0+&+ F3'&+.< O+1 (22+ 031+2 .1 6M&(/+ 1)(2
6F)1)&+ + 1:0+&+ &+ +>H30+ -.3 A+( (*2; -.3 23'# 2+>'326'(0+ *)2 6")2232 &3263*; +'/)*(B)&+, 1)(2 6+32+< % 7'M7'() 6")223
0)*6()&+ 7)') )-.3") @)'(#@3"< I+' (22+ &3*032 7+':1 *D+ F# )-.( ) *36322(&)&3 *+2 "31>') -.3 7'36(2)1+2 (17"313*0)'
7+&31+2 &(B3' -.3 *+ IfI +2 1:0+&+2 &3 *3*F.1 7)'q130'+ +. &('30(@) 7)') 3223 1:0+&+ 31 )"/.1 1+13*0+< 9+ 8KX
2D+ _G('0.)(2` 3 (20+ A)6("(0) ) (17"313*; 0+'*)' 3203 1:0+&+ @('0.)" 3 7)22?@3" gxxi, -.)*&+ 031+2 .1 1:0+&+ )>20')0+
0)CD+ &+  85,*:5%&*4:5 '3&.B(*&+ )22(1 &3 23' 2+>'326'(0+< !>23'@3 -.3 &320) 31 .1) 6")223 3 F3'&)1+2 &) 1321), )+
+ .2+ &3 6+*0'+"32 &3 A".4+2 6+1+ !&p4 1)*3(') + *+22+ 6M&(/+ *D+ A(6) _3*; .0("(B)'1+2 + +5?$+5:8,$#*5" 3203 1:0+&+
7)') 0+'*)' *+22+ 6M&(/+ 1)(2 '+>.20+ /322)&+`< X3 7+' 34317"+ &36(&('1+2 )7)'363 31 @3'13"F+ (*&(6)*&+ -.3 7'3;
3 347)*2?@3"< 6'()' .1) 6")223 <'#5 31 *)&) 03'31+2 6(2) 23' (17"313*0)&+<
G+6^ &3@3 320)' 23 73'/.*0)*&+E   |/$ -.3 )"03')' + 1:0+&+ <$#/5:Q 8)20) -.3 s1 A)0+ (17+'0)*03 ) 23' "31>')&+ : -.3,
"a5 8%$(*4':54 ?$(,'%'% 5 #*85 ?$ "544'4 ) 6")223 <'#5 F3'&3 &3 /$%X*=5 7)') -.3 *+ IfI 23 .1) 6")223 7+22.( )+ 13*+2 .1
='%*d=$*4 $ ?$ "54454 5L]$#54c (5:5 4'L$% 23H) )63(0) *+ 1:0+&+ <$#/5: 3 A3(0+ (22+ 1:0+&+ )>20')0+ 3") &3@3 23' &36")')&)
4$ >: 5L]$#5 8$%#$"($ ' >:' ?$#$%:*"'?' 2+>'326'3@31+2 + 1:0+&+ V%5?>E*%/5: 6+1+ )>20')0) &(A3'3*03 &3 +.0')2 "(*/.);
0*$%'%T>*' 5> 8544>* 5 :•#5?5 T>$ T>$%$:54 *) 6")223 F3'&)&)< /3*2 &3 7'+/')1)CD+< L22) &.7") &3A(*(CD+
(0':'%€IQ I3'63>) -.3 A+( .0("(B)&+ 31 *+22+ 6M&(; 34(203 7)') 73'1(0(' ) @+6^ &36")')' .1)
I)') (20+ 031+2 *+ IfI h + +73')&+' /+ + +73')&+' *"4#'"($5&  7)') @3'(A(6)' 23 6")223 6+1+ )>20')0) 1321+ -.3 ) 1321)
*"4#'"($5& 3 L"3 @3'(A(6) 23 .1 +>H30+ + +>H30+ 7)22)&+ 6+1+ 7)'q130'+ 7)') + *D+ 7+22.) 1:0+&+2 )>20')0+2<
-.)"-.3' 7+22.( .1 '3")6(+*)13*0+ • 1:0+&+ <$#/5: 73'03*63 N 6")223 /$%X*=5 9+ 34317"+ &+2 *+22+2 23'32 @(@+2 A(6)
>: 6+1 .1) 6")223 32736?A(6)< L"3 *) +. F3'&) &) 1321)< X3 320) 6+*&(CD+ A+' 6")'+ -.3 *31 0+&+2 +2 23'32 7'+&.B31
@3'&)&3 : .1) 1+&(A(6)CD+ &) H# 34(203*; 2)0(2A3(0) 7+&31+2 03' ) 63'03B) -.3 3"3 2+1, )22(1 3203 1:0+&+ *320) 6")223 *D+
03 A.*CD+ *4u'FG -.3 A+( &326+*0(*.)&), 03'# 31 2.) 320'.0.') + 1:0+&+ V%5?>E*%2 &3@3 03' (17"313*0)CD+ A(6)*&+ *+22)
7+(2 + 7'(13('+ : .1 +73')&+' >(*#'(+ /5:< %/+') -.)" 13*2)/31 23'# 34(>(&) 6")223 6+1+ ) &) ./-)(0+1 =<
"M/(6+ 73'1(0(*&+ 6'()' 23*03*C)2 6+1+ 7+' 3203 1:0+&+ @)( &373*&3' &+ 0(7+ 9+03 *) ./-)(0+1 = -.3 ) 6")223 /$%X*=5
) 23/.('E &+ +>H30+ -.3 320(@3' (*20)*6()&+ )"( *+ )/+') A+( &36")')&) 6+1+ 'L4#%'(# , 7+(2 &+2
1+13*0+< O+1 (22+ @+"0)1+2 N &3A(*(CD+ 0'^2 1:0+&+2 -.3 ) 1321) 7+22.( .1 &3;
if($c instanceof  Cliente) {
echo ‘$c é um cliente’;
&+ (*?6(+ &+ *+22+ )'0(/+E |V5,*:5%&*4:5e ' "32 : )>20')0+ 3 7+' (22+ 031+2 -.3 &36")')'
} ('8'(*?'?$ T>$ >: :$4:5 :•#5?5 #$: ?$ 4$ ) 6")223 6+1+ )>20')0) 0)1>:1< %22(1 /$%2
(5:85%#'% ?$ :'"$*%' ?*&$%$"#$ ?$8$"?$"?5 X*=5 *D+ 7+&3'# 23' (*20)*6()&) 3 0)1>:1
I)') 34317"(A(6)' 322) A)6("(&)&3 +>; ?$ T>', (,'44$ $,$ &5* (0':'?5I< *D+ F)@3'# *36322(&)&3, 7+(2 320) 6")223 :
23'@3 + 6M&(/+ &) ./-)(0+1 5< O")'+ -.3 1.(0+ 1)(2 7+&3 23' A3(0+ )73*)2 .1) >)23 7)') )2 &31)(2<
I+&31+2 *+0)' A)6("13*03 -.3 + 6M&(/+ 7)') 0+'*)' *+22+ 6M&(/+ 1)(2 6+32+, O+1+ 0+&+ 23' @(@+ *)263, 6'3263, 23 '3;
326'(0+ *D+ 320# 347)*2?@3"< ]1)/(*3 -.3 7+' 34317"+, 23 *31 0+&+2 +2 23'32 @(@+2 7'+&.B 3 1+''3, 7+&31+2 +>23'@)' -.3
@+6^ &36(&) 6'()' 31 23. 1+&3"+ 1)(2 7'+&.B31 2+1 *D+ F# 7+'-.3 + 1:0+&+ 031+2 )"/.1)2 &322)2 A)232 31 A+'1) &3
6(*6+ )*(1)(2 6)&) .1 7'+&.B(*&+ I'+&.B('X+1 *) 6")223 X3'G(@+ 03*F) 1:0+&+2 31 /$%X*=5 , *D+ 6+1+ )>20')0+2,
23. '327360(@+ 2+1, (22+ 23 0+'*)'() (17"313*0)CD+< 93203 6)2+ )7"(6);23 .1 1)2 7)22?@3(2 &3 23'31 2+>'326'(0+2<
7)') @+6^ .1 0+'13*0+, 7+(2 03'() -.3 1:0+&+ )>20')0+<
)&(6(+*)' +.0'+2 6(*6+ >"+6+2 $,4$*&  7)') Métodos e Propriedades Estáticas
A)B3' ) @3'(A(6)CD+< ]22+ A3'3 + 6+*63(0+  Métodos e Classes Abstratas p &3 6+*F36(13*0+ /3')" -.3 .1)
&3 '3)7'+@3(0)13*0+ &3 6M&(/+ 3 7(+' 9+ IfIh 031+2 0)1>:1 + 6+*63(0+ &3 6")223 7+&3 &36")')' _*` 7'+7'(3&)&32 3
&+ -.3 (22+ (1)/(*3 + 2+A'(13*0+ -.3 6")2232 3 1:0+&+2 )>20')0+2< K(B )>20')0+ 1:0+&+2< O)&) (*20q*6() &320) 6")223, +.
23'() 7)') &)' 1)*.03*CD+ 31 .1 6M; .1 1:0+&+ -.3 *D+ 7+22.( (17"313*; 23H), 6)&) +>H30+ 7+22.( .1) 6M7() &320)2
&(/+ &3203 7+'03< L*0D+ 3223 6M&(/+ 320# 0)CD+ +. .1) 6")223 -.3 *D+ &3@3 23' 7'+7'(3&)&32 3 1:0+&+2< ]22+ 2(/*(A(6)
0+0)"13*03 A+') &3 6+/(0)CD+< (*20)*6()&), -.3 23'@3 )73*)2 &3 '3A3; -.3 7+&31 '363>3' @)"+'32 &(20(*0+2 3
! .2+ &) F3')*C) 6+1 +  85,*:5%&*4:5 '^*6() 7)') 23' F3'&)&) 3 + 1:0+&+ 7)') 23.2 1:0+&+2 23'31 6F)1)&+2 &3 A+'1)
*+2 )H.&) ) '32+"@3' 3203 7'+>"31), ) 23' 2+>'326'(0+< (*&373*&3*03< I+':1 31 !! 031+2 .1
(*03*CD+ : A)B3' ) 1321) 6+(2), 7+':1 &3 ]20+ : 1.(0+ 6+1.1 31 !!, 7+(2 -.)*&+ 6+*63(0+ 6F)1)&+ &3 7'+7'(3&)&32 320#;
.1) 1)*3(') -.3 *+2 )H.&3 ) 347)*&(' 0')>)"F)1+2 6+1 /')*&32 3-.(732 3 31 0(6)2 3 1:0+&+2 320#0(6+2< XD+ 3"313*0+2
*+22+ 6M&(/+, '3)7'+@3(0#;"+ 3 1)(2 &+ /')*&32 7'+H30+2 /3')"13*03 -.3'31+2 -.3 73'03*631 N 6")223 3 *D+ )+ +>H30+,
-.3 (22+ -.3 A)6("(03 ) 1)*.03*CD+ &+ /)')*0(' -.3 &303'1(*)&)2 6")2232 03*F)1 6+1 (20+ 3"32 7+&31 23' )6322)&+2 3
1321+< ]22+ )7"(6)&+ *) 7'#0(6) 23 0+'*) 63'0+2 1:0+&+2 3223*6()(2 )+ A.*6(+*); (*@+6)&+2 ) 7)'0(' &) 6")223 231 ) *3632;
+ 6M&(/+ &326'(0+ *) ./-)(0+1 ;< 13*0+ &+ 1+&3"+ 3 6+1+ 2D+ @#'(+2 +2 2(&)&3 &3 23 (*20)*6()' + +>H30+<
I+&31+2 03' @#'(+2 +>H30+2, 1)2 0+&+2 Q)2 @+6^ &3@3 320)' 23 73'/.*0)*&+ 23 .1 1:0+&+ 7)') +>03' + @)"+' )0.)" &+
3"32 +'(.*&+2 &3 .1) W*(6) 6")223< O+1+ '3)"13*03 A)'# .2+ &3203 0(7+ &3 '36.'2+ 6+*0)&+' &) 6")223< L203 1:0+&+ &3@3'#
)2 7'+7'(3&)&32 3 1:0+&+2 73'03*631 N 3 23 3"3 : '3)"13*03 *36322#'(+< I+(2 3*; 23' 320#0(6+ 7)') 3@(0)' -.3 23 03*F)
6")223 7+&31+2 &3&.B(' -.3 322)2 7'+; 0D+ +>23'@3 + 6M&(/+ &) ./-)(0+1 >< -.3 (*20)*6()' ) 6")223 7)') (*@+6)'
7'(3&)&32 3 1:0+&+2 2D+ 6+17)'0("F)&+2 ! -.3 031+2 )-.( : .1) 6")223 6"(3*03 + 1:0+&+< G3H) 6+1+ A(6)'() 6+1 322)
7+' 0+&+2 +2 +>H30+2< 6+1.1 3 2(17"32, 7+':1 6+1 .1 6+*0)&+' 1+&(A(6)CD+ *) ./-)(0+1 ?<
f# )"/.1)2 6+*2(&3')CJ32 2+>'3 + .2+ -.3 '3/(20') ) -.)*0(&)&3 &3 +>H30+2 &320) !>23'@3 -.3 )&(6(+*)1+2 ) *+22)
&3 1:0+&+2 3 7'+7'(3&)&32 320#0(6)2 *+ 6")223 -.3 A+')1 (*20)*6()&+2< I+' (22+ ) 6")223 +,*$"#$ .1 1:0+&+ 320#0(6+ -.3
IfI< I+' 34317"+, 7)') 23 )6322)' 7'+; 7'+7'(3&)&3 320#0(6) S+5"#'?5% , 7'+7'(3&); '30+'*) ) 7+2(CD+ )0.)" &+ 6+*0)&+'< I)')
7'(3&)&32 320#0(6)2 &3 &3*0'+ &) 7'M7'() &3 320) -.3 73'03*63 N 6")223 3 *D+ )+ +>H30+, (*@+6#;"+ .0("(B)1+2 ) 7'M7'() 6")223
6")223 031+2 -.3 .0("(B)' + +73')&+' : 6+17)'0("F)&) 7+' 0+&)2 )2 (*20q*6()2< 231 ) *36322(&)&3 &3 23 (*20)*6()' .1
/$,&ee  -.3 )-.( 031 .1) A.*CD+ +7+20) !>23'@3 -.3 *+ 6+*20'.0+' )6322)1+2 320) +>H30+E +,*$"#$ee<$#+5>"#FG3
) &+ K3"7F( +*&3 + /$,&   : .2)&+ 7)') 7'+7'(3&)&3 )0')@:2 &+ +73')&+' /$,&  3 + (*;
A)B3' '3A3'^*6() )+ +>H30+ &+ 6+*0340+ 6'313*0)1+2 31 .1< b3(0+ (22+ )0'(>.?1+2 Criando um exemplo
3*-.)*0+ *+ IfI .2)1+2 7)') )6322)' ) + @)"+' &+ 6+*0)&+' N 7'+7'(3&)&3 S*? , 322) p *+0M'(+ -.3 +2 34317"+2 6(0)&+2 )6(;
6")223< !.0'+ &30)"F3 : -.3 7)') )6322)' 2(1 73'03*63*03 )+ +>H30+< 1) 23'@31 )73*)2 7)') 34317"(A(6)' +2
.1) 7'+7'(3&)&3 +. 1:0+&+ &3203 0(7+ ! 1:0+&+ +%*'%+,*$"#$4   3436.0) .1 6+*63(0+2 )>+'&)&+2 )-.(< I)') -.3 @+6^
031+2 -.3 A)B^;"+ )0')@:2 &) 6")223 &3 ")C+ &5% 3 (*20)*6() &3B +>H30+2 +,*$"#$4 3 7+22) 03' .1) *+CD+ &3 6+1+ + 7+"(1+';
&.)2 1)*3(')2E "+/+ )7M2 1+20') *+ *)@3/)&+' + @)"+' A(21+ ).4("() 31 0)'3A)2 &(#'()2 @)1+2
&) 7'+7'(3&)&3 S*?< 6+*20'.(' .1 73-.3*+ 34317"+ )>+'&)*;
Classe::Propriedade
Classe::Método() I+&3'?)1+2 (*6".(' *320) 6")223 +,*$"#$ &+ + 6+*63(0+ )6(1)< %>') + K3"7F( A+'

Listagem 3. Codigo PHP sem polimorfismo Listagem 5. Classes abstratas no PHP

<?php <?php
class Cachorro{ abstract class SerVivo{
function  Latir(){ function  Nascer(){
echo “Cachorro Latindo !”; echo “Nascendo !!!”;
} }
} function  Crescer(){
class Homem{ echo “Crescendo !!!”;
function  Falar{ }
echo “Homem Falando !”; abstract function  ProduzirSom();
} }
}
function  ProduzirSom($Obj){ class Cachorro extends SerVivo{
if ($Obj instaceof  Cachorro){ function  ProduzirSom(){
  $Obj->Latir(); echo “Cachorro Latindo !”;
}elseif($Obj instanceof  Homem){ }
  $Obj->Falar(); }
}else{
echo “O objeto passado não produz som”; class Homem extends SerVivo{
} function  ProduzirSom{
} echo “Homem Falando !”;
}
?> }
function GetSom($Obj){
if ($Obj instaceof  SerVivo){
Listagem 4. Polimorfismo aplicado no PHP   $Obj->ProduzirSom();
}else{
<?php echo “O objeto passado não é um ser vivo !”;
class SerVivo{ }
function  ProduzirSom(){ }
echo “Nem todo ser vivo produz som !”; ?>
}
}
class Cachorro extends  SerVivo{ Listagem 6. Propriedade Estática no PHP
function  ProduzirSom(){
echo “Cachorro Latindo !”; <?php
} class Cliente{
} static $Contador = 0;
class Homem extends SerVivo{ public $id;
function  ProduzirSom{ function  __construct(){
echo “Homem Falando !”; self::$Contador++;
} $this->id = self::$Contador;
} }
function  GetSom($Obj){ }
if ($Obj instaceof  SerVivo){ function CriarClientes(){
  $Obj->ProduzirSom(); for($i=0;$i<=9;$i++){
}else{ $cliente = new Cliente();
echo “O objeto passado não é um ser vivo !”; echo  $cliente->id.”<br>”;
} }
} }
?> ?>
IfI 3 6'(3 .1) *+@) )7"(6)CD+< I)') (22+ &3 )6+'&+ 6+1 6)&) 6)17+< %&(6+*3 N 6")223 .1 6)17+ 7'+03/(&+ Su"5:$ 6+1
)63223 + 13*. A*,$qN$Mr788,*('#*5" < 0)1>:1 &+(2 8.00+*2R_80*X)"@)'` 3 +2 1:0+&+2 <$# 3 /$# 7)') )6322+ ) 3203
X)"@3 ) )7"(6)CD+ 7'322(+*)*&+ _80*j(20)'`U 3 .1 B'?*5<%5>8< %&(6(+*3 A*$,?< ]22+ A)'# -.3 *+ +5?$ +5:8,$#*5"
+#%,./0*&#./ +. 326+"F)  A*,$r/'=$ V%52 )+ B'?*5<%5>8 &+(2 (03*2 ) 2.) 7'+7'(3; @+6^ 7+22) )6322)' ) 7'+7'(3&)&3 N5:$
 ]$(# 74 6+1 + *+13 _I'HI+"(1+'A(21+< &)&3 !#$:4< K(/(03 _I322+) b?2(6)` 3 )0')@:2 &3 V$445'2rN5:$ 31>+') + <$#N52
7F7'H` 3 31 23/.(&) 2)"@3 ) )"*# 6+1+ _I322+) z.'?&(6)`< %"03'3 ) 7'+7'(3&)&3 :$ 3 + /$#N5:$ *D+ 23H)1 (*@+6)&+2<
_(*&34<7F7`< %"03'3 ) 7'+7'(3&)&3 N':$ 1%*$"#'#*5"  7)') 5%\5%*E5"#',< 9) </0,$( a30+'*)*&+ )+ 34317"+, '37(0) + 7)22+
&+ A+'1."#'(+ 7)') _b'1]*&34`< L203 2 031+2 .1) 2./320D+ &3 ,'65>#< )*03'(+' 3 A)C) + 1321+ 7)') 7.>"(6)'
A+'1."#'(+ 23'# .0("(B)&+ 7)') 6'()' ) O+*6".?&+ + ")u+.0 7)22)'31+2 )/+') 31 V$445' ) 7'+7'(3&)&3 ;$,$&5"$< L1
*"#$%&'($ @(2.)" &+ *+22+ 34317"+< 7)') ) 6'()CD+ &3 *+22)2 6")2232< 9D+ ('3( V$445'A*4*(' 7.>"(-.3 ) 7'+7'(3&)&3 +VA
%&(6(+*3 *3203 A+'1."#'(+ 0'^2 C?*#4 13 )7'+*A.*&)' *) 2(*0)43 !! *+ IfI 3 31 V$445'W>%*?*(' ) 7'+7'(3&)&3 +NVW <
&) 7)"30) /#'"?'%?< %"03'3 23.2 *+132 7+(2 3203 A+( 326+7+ &+ 7'(13('+ )'0(/+< !>23'@3 *) ./-)(0+1 2B )2 6")2232 6+1
7)') _L&09+13`, _L&0L1)("`, _L&0a3; %63223 + 13*. A*,$qN$Mr)"*#  3 6'(3 )2 7'+7'(3&)&32 7.>"(6)&)2<
/(20'+`, '327360(@)13*03< %&(6(+*3 0'^2 .1) *+@) )"*# 2)"@)*&+;) 6+1 + *+13 % 7'(*6?7(+ @+6^ &3@3'# *+0)' -.3 *D+
K'L$,4c 0)1>:1 &) 7)"30) /#'"?'%? , .1 _Q+&3"<7F7`< 9320) )"*# ('31+2 6'()' A+/3 1.(0+ ) '3/') &3 6'()CD+ &3 6")223
7)') 6)&) C?*# 3 0'+-.3 23.2 +'8#*5"4 .1 1+&3"+ +*&3 03'31+2 .1) 6")223 31 6+17)')CD+ 6+1 + K3"7F( 5(*Tg<
V$445'   6+1 )2 7'+7'(3&)&32 N5:$ 3 \31+2 31 V$445' )2 7'+7'(3&)&32 73'0(;
;$,$&5"$  6+1.1 ) 0+&+ + 0(7+ &3 7322+)< *3*032 ) 0+&+ 0(7+ &3 7322+)< V$445'A*4*('
b)'31+2 .1 32736()"(B)CD+ &3 V$445' 31 F3'&) &3 V$445'c 3 7+' 3223 1+0(@+ 0')B
V$445'A*4*(' 3 V$445'W>%*(' 6)&) .1) 6+1 6+*2(/+, &3@(&+ ) F3')*C), )2 7'+7'(3&);
.1) 7'+7'(3&)&3 346".2(@) +VA 3 +NVW  &32 N5:$ 3 ;$,$&5"$Q I'36(2)1+2 )73*)2
'327360(@)13*03< 9) )"*# 6'()&) &(/(03 )&(6(+*)' ) 7'+7'(3&)&3 +VA )22(1 6+1+
+ 6M&(/+ &) ./-)(0+1 @< )6+*0363 31 V$445'W>%*?*('c  23*&+ -.3
*320) 031+2 + +NVW  6+1+ &(A3'3*6()"<
9+ 6M&(/+ &) ./-)(0+1 @ )73*)2 6'(); X3 *+0+. >31, 7.>"(6)1+2 + 1:0+&+
1+2 ) 320'.0.') &)2 6")2232 -.3 23'D+ .2); /'=$FG 31 V$445' 6+1+ 'L4#%'(# (*&(6)*&+
&)2 31 *+22+ 34317"+< I+2(6(+*3 + 6.'2+' )22(1 ) (*03*CD+ -.3 031+2 31 2+>'32;
*) #'3) &) 6")223 V$445' 3 7'322(+*3 +#%, . 6'3@^;"+ *)2 6")2232 &3263*&3*032 3 : (22+
/0*&# . 7,# . )  7)') 7.>"(6)' )2 7'+7'(3; -.3 A)'31+2 )/+')< 9) 6")223 V$445'A*4*('
&)&32< 9+ &(#"+/+ -.3 23 )>'3 7'33*6F) 2+>'326'3@) ) A.*CD+ /'=$FG 6+*A+'13 )
+2 6)17+2 6+*A+'13 ) </0,$( 43 ./-)(0+1 22< b)C) + 1321+ 7)') V$445'2
Figura 1. Exemplo de layout a37)'3 -.3 + K3"7F( A+' IfI H# )&(6(+*) A*4*(' 6+*A+'13 ./-)(0+1 24<

Listagem 7. Método Estático no PHP


<?php Nota do DevMan
class Cliente{
static $Contador = 0;
public $id; Para que os métodos Get e Set possam ser invocados
function  __construct(){ automaticamente como no Delphi Win32 suas classes
self:: $Contador++;
$this->id = self::$Contador; precisam possuir os métodos __set() e __get ou
} simplesmente herdar suas classes da classe Object do
static function GetCount(){ Delphi for PHP o que não acontece automaticamente
return self::$Contador;
} como no caso so Delphi Win32. A classe object já intercepta
} o acesso a propriedade e delega a chamada aos respectivos
function  CriarClientes(){ get’s e set’s.Oberve na Listagem 9 a estrutura em Object.
for($i=0;$i<=9;$i++){
$cliente = new Cliente(); Declaramos os métodos __get() e __set() e preparamos
echo  $cliente->id.”<br>”;
} ambos para que localizem a herança e retornem o
echo  Cliente::GetCount(); resultado. Caso não seja encontrada, uma exceção é
} levantada informando que o método não existe.
?>

Listagem 8. Estrutura das classes

abstract class Pessoa{
protected abstract function Save();
}
class PessoaFisica extends Pessoa{
}
class PessoaJuridica extends Pessoa{

Figura 2. Publicando a Propriedade Nome


L2232 2D+ +2 1:0+&+2 -.3 23'D+ A'.0+ &+ 3@3*0+ &(/(03 + 6M&(/+ &) ./-)(0+1 2;< Listagem 9. Métodos __get e __set em Object.
 85,*:5%&*4:5< \3'31+2 .1) +.0') 6")223 ! 7'+63&(13*0+ : 2(17"32< I'(13('+ <?php
-.3 23'@('# 6+1+ "(20) &3 7322+)2, +*&3 @3'(A(6)1+2 ) +7CD+ 23"36(+*)&) *+ B'2 function  __get($nm){
  $method=’get’.$nm;
/.)'&)'31+2 0+&+2 +2 +>H30+2 6'()&+2 *) ?*5<%5>8 )0')@:2 &) 7'+7'(3&)&3 !#$:!"2 if  (method_exists($this,$method)){
return  ($this->$method());
)7"(6)CD+< ! >+0D+ "(20)' 23'@('# 7)') 73'; ?$@< b3(0+ (22+ 6'()1+2 + +>H30+ &3 )6+'&+ }else{
6+''3' 0+&) ) "(20) 3 (*@+6)' + 1:0+&+ /'=$FG 6+1 ) +7CD+ &+ .2.#'(+ 3 H# 6)''3/)1+2   $method=’read’.$nm;
if  (method_exists($this,$method)){
&+2 +>H30+2 6+*0(&+2 *3")< 9D+ 2)>31+2 )+ + @)"+' &+ $?#B$J*4#%5  7)') ) 7'+7'(3&)&3 return  ($this->$method());
}else{
63'0+ 23 2D+ 7322+)2 A?2(6)2 +. H.'?&(6)2< +VA +. +NVW  &373*&3*&+ &+ 6)2+< if ($this->inheritsFrom(‘Component’)){
%73*)2 2)>31+2 -.3 2D+ 7322+)2 3 23 2D+ L1 23/.(&) 6)''3/)1+2 7)') )2 7'+; if( isset($this->_childnames[$nm]) )
return $this->_childnames[$nm];
7322+)2 7+22.31 + 1:0+&+ /'=$FG<9) 132; 7'(3&)&32 N5:$ 3 C:'*, +2 @)"+'32 &3 23.2 }
throw new  EPropertyNotFound(
1) )"*# &+ 1+&3"+, :5?$,Q808 , 6'(3 ) 6")223 '327360(@+2 C?*#p4< I+' A(1 @3'(A(6)1+2 23   $this->ClassName().”.”.$nm);
}
K*4#'V$445' 6+*A+'13 ./-)(0+1 25< F# *) 23CD+ .1) @)'(#@3" 1L]< X3 3") *D+ }
9320) 6")223 031+2 .1 7%%'6 V%*='#$ 34(20(' 6'()1+2 .1 +>H30+ 3 + 6+"+6)1+2 }
function  __set($nm, $val){
+*&3 /.)'&)'31+2 0+&+2 +2 +>H30+2 *) 23CD+ 7)') 7+&3' 7)22#;"+ 7)') +.0')   $method=’set’.$nm;
if  (method_exists($this,$method)){
6'()&+2 *) )7"(6)CD+< ! 1:0+&+ 7W>"(6+ 7#/(*)< X3 ) @)'(#@3" &3 23CD+ H# 34(20('   $this->$method($val);
}else{
7??V$445' 23'@3 7)') -.3 7+22)1+2 03' 3*0D+ )73*)2 (*@+6)1+2 &3 &3*0'+ &)   $method=’write’.$nm;
.1) 1)*3(') &3 )&(6(+*)'1+2 (03*2 )+ 23CD+ ) A.*CD+ 7??V$445' 7)22)*&+ + +>;  
if  (method_exists($this,$method)){
$this->$method($val);
7%%'6 -.3 : 7'(@)&+< a37)'3 *+ 7)'q13;  H30+ 6'()&+< %+ A(*)" 03'31+2 *) 23CD+ .1 }else{
throw new
0'+ &) A.*CD+ -.3 6+"+6)1+2 + 0(7+ &+ +>H30+ K*4#'V$445' 6+1 0+&)2 )2 7322+)2 EPropertyNotFound($this->
  ClassName().”.”.$nm);
7)'q130'+ )*032 &+ 1321+< ! IfI *D+ 6'()&)2 ) 6)&) 6"(-.3 &3 >+0D+< }
: 0(7)&+, 7+':1 031+2 3203 '36.'2+ -.3 I)') 6+*6".(' *+22+ 34317"+ *+ 1"+,*(O }
}

: 6F)1)&+ &3 \*"# ?$ +,'44$< &+ >+0D+ K*4#'% ;5?54 6F)1)'31+2 .1) ?>

O+1 (22+ .1 3''+ 23'# /3')&+ 23 03*; 7#/(*) R_"(20)<7F7`U 3 *3") 34(>('31+2 +
Listagem 10. Classes com propriedades publicadas
0)'1+2 )&(6(+*)' *+ 7%%'6 .1 +>H30+ 6+*03W&+ &3 *+22) "(20) &3 7322+)2< I)')
-.3 *D+ 23H) &+ 0(7+ 7322+)< % A.*CD+ (22+ 6+&(A(-.3 + >+0D+ 31 -.320D+ A)B3*; <?php
/* Classe principal Pessoa */
7.>"(6)' 31 K*4#'V$445'  )73*)2 A)B .1 &+ .1) 6F)1)&) )+ 1:0+&+ %$?*%$(# &+ abstract class Pessoa{
protected $_nome=””;
,558 *+ 7%%'6 +*&3 6)&) (*03')CD+, +. IfI, 6+*A+'13 ) 23/.('E function  getNome(){
return  $this->_nome;
23H), 6)&) @3B -.3 7)22) 7+' .1 +>H30+ + }
redirect(‘lista.php’);
1:0+&+ /'=$FG : (*@+6)&+, 7.>"(6)*&+ *+  
function  setNome($value){
$this->_nome=$value;
L%5M4$% )2 (*A+'1)CJ32 &+ +>H30+< L20) 7#/(*) )(*&) *D+ A+( 6'()&) 3*0D+ }
function  defaultNome(){
I)') 0320)' *+22+ 1+&3"+ @)1+2 )+ 7'+63&) 6+1 ) 6'()CD+ 31 A*,$qN$MrA5%:< return ;
}
3@3*0+ 1"+,*(O &+ >+0D+ /',='%< 93203 X)"@3;) 6+1+ _"(20)<7F7` 3 1+&(A(-.3 protected  $_email=””;
function  getEmail(){
return  $this->_email;
}
function  setEmail($value){
  $this->_email=$value;
}
function  defaultEmail(){
return ;
}
protected abstract function  Save();
}
/* Classe PessoaFisica */
class PessoaFisica extends Pessoa{
protected $_cpf=””;
function  getCPF(){
return  $this->_cpf;
}
function  setCPF($value){
  $this->_cpf=$value;
}
function  defaultCPF(){
return ;
}
}
/* Classe PessoaJuridica */
class PessoaJuridica extends Pessoa{
protected  $_cnpj=””;
function  getCNPJ(){
return  $this->_cnpj;
}
function  setCNPJ($value){
  $this->_cnpj=$value;
}
function  defaultCNPJ(){
return ;
}
}
?>
Figura 3. Cadastrando Pessoas na Lista
Listagem 11. Metodo Save() na classe PessoaFisica
23. N':$ 7)') _b'1j(20)`< 9+ 1"/05M
&322) 7#/(*) &(/(03 + 6M&(/+ ) 23/.('E
public function Save(){
echo ‘<font size=6 color=darkblue’.
‘face=Tahoma>’.$this->Nome.’</font><br>’. $L = $_SESSION[‘Obj’];
‘Email...: ‘.$this->Email.’< br>’. $L->Publicar();
‘CPF....: ‘.$this->CPF.’< br>’.
‘Tipo...: Pessoa Fisica <hr>’;
} L203 6M&(/+ )73*)2 (*@+6) + 1:0+&+
Listagem 12. Metodo Save() na classe PessoaJuridica V>L,*('% &+ +>H30+ K*4#'V$445' -.3 320# *)
public function Save(){
23CD+< L203 1:0+&+ 7+' 2.) @3B A)B .1
echo ‘<font size=6 color=darkblue’. ,558 *+ 7%%'6 (*@+6)*&+ + 1:0+&+ /'=$FG
‘face=Tahoma>’.$this->Nome.’</font><br>’.
‘Email...: ‘.$this->Email.’< br>’. &3 6)&) (031 &) "(20)< O+1 (22+ -.)*&+
‘CNPJ...: ‘.$this->CNPJ.’ <br>’.
‘Tipo...: Pessoa Juridica <hr>’;
320) 7#/(*) A+' 6)''3/)&) 34(>('# *+
} L%5M4$% 0+&)2 )2 7322+)2 6)&)20')&)2 *)
"(20) &3@(&)13*03 A+'1)0)&)2<
Listagem 13. Classe Pessoa Lista
L436.03 ) )7"(6)CD+< /$,$(*5"$ + 0(7+ &3
class ListaPessoa{
static private  $instance;
7322+), (*A+'13 +2 &)&+2 3 6"(-.3 *+ >+;
private $_list = array(); 0D+ /',='%< G3H) ) )7"(6)CD+ 31 3436.CD+
function  AddPessoa(Pessoa $Obj){ *)2 </0,$(- 5 3 ;<
$this->_list[] = $Obj;
}

function  Publicar(){
Conclusão
for ($i = 0; $i < count($this->_list); $i++){ O+1 +2 6+*63(0+2 )7'3*&(&+2 )0: + 1+;
  $this->_list[$i]->Save();
} 13*0+ H# : 7+22?@3" )&(6(+*)' )+2 *+22+2
}
7'+H30+2 .1 )27360+ 1)(2 7'+A(22(+*)", 3
Listagem 14. Criando os objetos do modelo 6")'+, A)6("(0)' >)20)*03 + *+22+ 0')>)"F+<
O+*A322+ -.3 7)') -.31 *D+ 031 .1
function  BtnSalvarClick($sender, $params){
63'0+ 6+*F36(13*0+ 31 !! 7+&3 7)'363'
switch ($this->RadioGroup1->ItemIndex) {
case 0: ) 7'(13(') @(20) .1 0)*0+ 6+17"(6)&+
$Pessoa = new PessoaFisica;
$Pessoa->CPF = $this->Edit3->Te xt;
)7"(6)' 0+&+2 32232 6+*63(0+2, 1)2 6+1
break; + 0317+ @+6^ ('# 73'63>3' -.3 )2 6+(2)2
case 1:
$Pessoa = new PessoaJuridica; *D+ 2D+ 0D+ 6+17"(6)&)2 6+1+ 7)'3631<
$Pessoa->CNPJ = $this->Edit3->T ext;
} ! 1.*&+ &3 7'+/')1)CD+ !! : A)2;
  $Pessoa->Nome = $this->Edit1->Text;
6(*)*03 3 '3-.3' 1.(0) &3&(6)CD+ 7+'
$Pessoa->Email = $this->Edit2->T ext; 7)'03 &)-.3"32 -.3 23 ")*C)1 *3"3< I+'
if  (!isset($_SESSION[‘Obj’])){ (22+ &3&(-.3;23< j31>'3;23 -.3 !! : !!
$_SESSION[‘Obj’] = new ListaPessoa;
}
(*&373*&3*03 &) "(*/.)/31< f)>(0.3;23
  $_SESSION[‘Obj’]->AddPessoa($Pessoa);
) 73*2)' !!, 7+(2 0+&)2 )2 /')*&32 "(*;
} /.)/3*2 3 7+' 6+*23-ƒ^*6() A3'')13*0)2
320D+ )7+()&)2 *320) A("+2+A()<
s1 /')*&3 )>')C+ ) 0+&+2 3 )0: +
7'M4(1+ )'0(/+, +*&3 0')0)'31+2 &3 .1
)22.*0+ .1 0)*0+ (*03'322)*03E K32(/*
I)003'*2 31 IfI<
L. 2+. a+&'(/+ O)''3('+ 3 73") 2.)
)03*CD+ 1.(0+ +>'(/)&+<

Dê seu feedback sobre esta edição!   u


  e
   s
 F eedb ac  
 
k  
     ê
     D
A Java Magazine tem que ser feita ao seu o     
s      

 b  
 r  
  e
gosto.Para isso, precisamos saber o que   e
  s
  t
   a
    e
  i   d
você, leitor, acha da revista!       o    ç
    ã

Dê seu voto sobre este artigo, através do link:


www.devmedia.com.br/javamagazine/feedback 
Figura 4. Publicando conteúdo da lista

Você também pode gostar