Clube Delphi 094

March 5, 2019 | Author: Francisco Barbosa | Category: Php, Tecnologia, World Wide Web, Microsoft Windows, Digital Technology
Share Embed Donate


Short Description

delphi datasetprovider...

Description

!"#$%&%"'() Ano 8 - 94ª Edição - 2008 - ISSN 1517990-7

Impresso no Brasil

Corpo Editorial Editor Geral Guinther Pauli [email protected] Editor Técnico Adriano Santos [email protected] Equipe Editorial Fabricio Desbessel, Maikel Scheid, Paulo Quicoli, Luciano Pimenta Editor de Arte Vinicius O. Andrade [email protected] Diagramação Adolfo Sabino [email protected] Capa Antonio Xavier [email protected] Revisão Gregory Monteiro [email protected] Distribuição Fernando Chinaglia Dist. S/A Rua Teodoro da Silva, 907 Grajaú - RJ - 206563-900

Atendimento ao Leitor

A DevMedia conta com um departamento exclusivo para o atendimento ao leitor. Se você tiver algum problema no recebimento do seu exemplar ou precisar de algum esclarecimento sobre assinaturas, exemplares anteriores, endereço de bancas de jornal, entre outros, entre em contato com:

EDITORIAL 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 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 (em uma aplicação 2-tier) ou através da interface IAppServer em uma aplicação multicamadas (SOAP, COM+ etc.). O DataSetProvider faz muito mais do que isso, e expõe muitas de suas funcionalidades na forma de propriedades e eventos, como mostra o Adriano Santos em seu completo artigo sobre o assunto. Falando em DataSetProvider, seu irmão ClientDataSet também exerce importante função em aplicações de banco de dados. Um dos problemas relacionados a esse componente, e que confunde muitos, é a correta manipulação de erros gerados no SGBD (Firebird por exemplo). No artigo do Rodrigo, veja como construir um descendente de ClientDataSet que automaticamente trata os principais erros do servidor, como violação de foreign-key. Na seção Expert, o Gustavo Chaurais continua o artigo sobre Streams. Na parte final do seu artigo, veja como implementar compactação, download em múltiplos pacotes e resources em suas aplicações. Ainda nesta seção, o 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 necessário para desenvolver determinada aplicação, ajudando a reduzir custos e não estropolar o cronograma. O Maikel continua a série que demonstra a construção de uma locadora Web. E nada melhor que o ASP.NET para construir um sistema completo desse tipo. O Ricardo usa e abusa de seus conhecimentos sobre desenvolvimento com PocketStudio e continua seu excelente curso que mostra como criar uma aplicação para o sistema operacional PalmOS. Na sessão Easy Delphi, para quem está iniciando, temos o Maikel com dois artigos: veja como utilizar os principais controles da VCL na construção de um 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. Para finalizar, o Rodrigo apresenta aquele que considero o melhor recurso da POO, o polimorfismo, tudo em PHP! Se você já domina ou conhece o assunto, sabe que ele é realmente poderoso. Que tal utilizá-lo agora em suas aplicações Web com o Delphi for PHP? 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

Guinther Pauli

[email protected] 

(21) 3382-5025

 [email protected] 

Publicidade Para informações sobre veiculação de anúncio na revista ou no site entre em contato com:

Microsoft Certified: MCP, MCAD, MCSD.NET Borland Cer tified: Delphi 6, 7, 2005, 2006, Web, Kylix

Kaline Dolabella

[email protected]

Portal do Assinante A ClubeDelphi tem uma novidade para você que comprou este

Fale com o Editor É muito importante para a equipe saber o que você está achando da revista: que tipo de ar tigo você gostaria de ler, que artigo você mais gostou e qual artigo você menos gostou. Fique a vontade para entrar em contato com os editores e dar a sua sugestão! Se você estiver interessado em publicar um

artigo na revista ou no site ClubeDelphi, entre em contato com os editores, informando o título e mini-resumo do tema que você gostaria de publicar:

exemplar na banca de jornal: você pode acessar GRATUITAMENTE, o Portal do Assinante ClubeDelphi!

 N Ã O A  C  R  E  P

Confira o que você encontra no Portal do Assinante:

- Mais de 560 Vídeo Aulas! - 7 cursos online!

Guinther Pauli - Editor da Revista

- 1 Livro Eletrônico sobre ADO.NET e BDP!

 [email protected] 

- Mais de 150 Artigos Exclusivos! Para Utilizar o Portal do Assinante, acesse www.devmedia.com.br/clubedelphi/potal.asp

 !"#$#

A revista ClubeDelphi é parte integrante da assinatura ClubeDelphi PLUS. Para mais informações sobre o pacote PLUS, acesse: http://www.devmedia.com.br/clubedelphi/portal.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 revista regularmente em bancas, você terá acesso ininterrupto a ele!

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

1

Vídeo

Brinde na web desta edição 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 sistema operacional PalmOS

Desenvolvendo uma aplicação para PalmOS com PocketStucio - Parte XIII a XV

Construindo uma ferramenta de busca 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 2005 Express-Parte IV a X – Testando a classe de locação de fitas

trole de versão e gerenciamento de equipes

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.

!

Como construir um WebServices com 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 [email protected])

Implementando Drag and Drop na aplicação !"# %&'()*+, -.)*&+ &(/(0)1+2 .1 0340+ *+ 5+'&, 23"36(+*)1+2 3 &37+(2 )'')20)1+2 7)') +.0'+ 7'+/')1) 6+1+ + 8"+6+ &3 9+0)2 7+' 34317"+, + 0340+ : 6+; ")&+< =+20)'() &3 2)>3' 23 : 7+22?@3" A)B3' 322) (17"313*0)CD+ 31 13. 2(2031)< !"#$% '()*+,-

!"# %*&':, '327+*&3*&+ ) 2.) -.320D+E 2(1, : 7+22?@3" (17"313*0)' (22+ 31 2.) )7"(6)CD+, 1)2 + 7'+6322+ : .1 0)*0+ 0');  >)"F+2+< G3H)1+2 6+1+ A)B3' (22+< I'(13(')13*03 &3@31+2 6'()' .1) 2:'(3 &3 A.*CJ32 6)7)B32 &3 (*03')/(' 6+1 + 1.*&+ 3403'*+, H# -.3 7+22(>("(0)'31+2 -.3 + )7"(6)0(@+ '363>) + @)"+' &3 .1 0340+ @(*&+ &3 +.0'+ )7"(6)0(@+< I)') (22+ )>') 23. K3"7F(, 2)"@3 + 7'+H30+ 3 &36")'3 )"/.1)2 A.*CJ32 *) #'3) !"#$%&'($ &) )"*# 6+1+ 23/.3 *) ./-)(0+1 23 I'322(+*3 +#%, . /0*&# . +  7)') -.3 + K3"7F( 6'(3 + 6)>3C)"F+ &)2 A.*CJ32< L1 23/.(&) &(/(03 + 6M&(/+ &3 6)&) A.*CD+ 6+*A+'13 ) ./-)(0+1 4< I+' A(1 &331+2 )"03')' +2 3@3*0+2 1"2 +%$'#$ 3 1"3$4#%56 &+ A+'1."#'(+ 7'(*6(; 7)" 7)') 23 )&)70)'31 N2 A.*CJ32 6'()&)2< G3H) + 6M&(/+ *) ./-)(0+1 5< %&(6(+*3 ) )"*# /0$,,78* )+ )4$4 &+ 7'+H3; 0+ 3 7+' A(1, (*2(') .1 6+17+*3*03 9$:5 *) 03") 3 3436.03 + 7'+/')1)< I') 0320)', )>') + 5+'& +. 5+'&I)&, &(/(03 )"/.1) 6+(2), 23"36(+*3 3 31 23/.(&) )'')203;+ 7)') +  9$:5 &+ 7'+/')1) 6'()&+< 9+03 -.3 + 0340+ : 0+0)"13*03 6+7()&+<

Listagem 1. Declaração de métodos na seção Private ... private { Private declarations } function  DragEnter(const dataObj: IDataObject;

grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function  DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function  DragLeave: HResult; stdcall; function  Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function  _AddRef: Integer; stdcall; function  _Release: Integer; stdcall; public ...

Listagem 2. Códigos dos métodos para interagir com o mundo externo function  TMemoDragDropFrm.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; begin dwEffect := DROPEFFECT_COPY; Result := S_OK; end; function  TMemoDragDropFrm.DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; begin dwEffect := DROPEFFECT_COPY; Result := S_OK; end; function TMemoDragDropFrm.DragLeave: HResult; begin Result := S_OK; end; function TMemoDragDropFrm._AddRef: Integer; begin Result := 1; end; function TMemoDragDropFrm._Release: Integer; begin Result := 1; end; function  TMemoDragDropFrm.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; var aFmtEtc: TFORMATETC; aStgMed: TSTGMEDIUM; pData: PChar; begin if (dataObj = nil) then raise Exception.Create(‘Ponteiro não á válido!’); with aFmtEtc do begin cfFormat := CF_TEXT; ptd := nil; dwAspect := DVASPECT_CONTEN T; lindex := -1; tymed := TYMED_HGLOBAL; end; OleCheck(dataOb j.GetData(aFmtEtc , aStgMed)); try pData := GlobalLock(aStgM ed.hGlobal); Memo1.Text := pData; finally   GlobalUnlock(aStgMed.hGlobal);   ReleaseStgMedium(aStgMed); end; Result := S_OK; end;

Mudando fontes do programa de uma só vez

Listagem 3. Código dos eventos OnCreate e OnDestroy procedure TMemoDragDropFrm.FormCreate(Sender: TObject); begin   OleInitialize(nil); OleCheck(Regist erDragDrop(Handle , Self)); end;

!(, /+20)'() &3 1.&)' 0+&)2 )2 A+*032 &+ 13. 7'+H30+ ).0+1)0(6)13*03< O+1+ 7+22+ A)B3' (22+P

procedure   TMemoDragDropFrm.FormDestroy(Sender: TObject); begin   RevokeDragDrop(Handle);   OleUninitialize; end;

'($6+78 9/:(-

!"# Q)'63"+, .1) )"03'*)0(@) 7)') (22+ 23'() 6'()' .1) A.*CD+ -.3 A(B3223 + 23'@(C+ 7') 0(< L22) A.*CD+ 03'() -.3 23' (17"313*0)&) 31 0+&+2 +2 A+'1."#'(+2< G3H)1+2 (22+<

Listagem 4. Código para modificação de fontes procedure   TForm1.ModificarFontes(AControle: TWinControl); procedure  Modificar(AControle: TControl); var f: TFont; begin if  IsPublishedProp(AControle, ‘Parentfont’) and (GetOrdProp(AControle, ‘Parentfont’) = Ord(False)) and IsPublishedProp(AControle, ‘font’) then begin f := TFont(GetObjectPr op(AControle, ‘font’, TFont)); f.Name := ‘Courier New’; end; end; var i: Integer; begin   Modificar(AControle); for i := 0 to AControle.ControlCount - 1 do if  AControle.Controls[I] is TWinControl then   ModificarFontes(TWincontrol(AControle.   Controls[I])) else   Modificar(AControle.Controls[I]); end; Para utilizar a procedure basta incluir alguns controles em tela e em um botão fazer a chamada a ela, com mostrado a seguir:

!"#$ &' ()*) +"),$-) () .$/+0# $ (1 2"$1  !"#$%&'  3$4/1"$ &'1 ()*1  !"()'*+"'  4)') 5$6&$7 .. private procedure  ModificarFontes( AControle: TWinControl); public ..

I'322(+*3 +#%, . /0*&# . +  7)') -.3 + K3"7F( 6'(3 + 6)>3C)"F+ &) A.*CD+ 3 31 23/.(&) &(/(03 + 6M&(/+ &) ./-)(0+1 ;< 9+ 6)2+ 320)1+2 A)B3*&+ .1 ")C+  &5% *+2 6+17+*3*032 &+ A+'1."#'(+ )0.)" 3 .0("(B)*&+ +2 1:0+&+2 &) )"*# ;68$!"&5 , 7+'0)*0+ &36")'3 ) 2.) )"*# *+ )4$4 &+ 7'+H30+< ! *+13 &) )"*# : ;68!"&5< Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

procedure  TForm1.Button1Click(Sender: TObject); begin   ModificarFontes(Self); end;

   F eedb ac   k  

     D

o     

s      

 b  

 r  

  e

  e

Dê seu voto sobre este artigo, através do link: www.devmedia.com.br/javamagazine/feedback 

  s

  t    a     e

  i   d    ç     ã       o

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 Gustavo Chaurais ([email protected])

é Borland Delphi 7 Advanced Certified, Borland Delphi 2005 for Win32 Certified, Borland Delphi 2006 for Win32 Certified e Borland Delphi Instructor Certified. Foi palestrante das três últimas edições da Borland Conference Brasil e de outros grandes eventos nacionais. Além disso, é membro da coordenadoria do GIESSC. Hoje, ministra cursos, presta consultoria e atua como Software Engineer do projeto InstallAnywhere para a empresa norte-americana Macrovision Corporation.

) 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 3 '32+.'632< K320) @3B, .0("(B)'31+2 .1 4#%$': 0317+'#'(+ 7)') 326'3@3' + )'-.(@+ -.3 320)1+2 "3*&+< 9+03 -.3 320)1+2 .0("(B)*&+ ', *3"32< G3H) *) ./-)(0+1 2 ) (17"313*0)CD+ &)2 A.*CJ32 ,# 23H) A)"23< I)') A(*)"(B)', @3H)1+2 + 1:0+; &+ 3$,$#$ &326'(0+ *) ./-)(0+1 5< L203 : 7'+@)@3"13*03 + 1:0+&+ 1)(2 6+17"(6)&+ &) 6")223< G)1+2 7'36(2)' &3 .1 4#%$': 0317+'#'(+ -.3 23'#, *) @3'&)&3, + 1321+ )'-.(@+ A(*)", 2M -.3 231 + )'-.(@+ ?$,$#'?5< \(@31+2 &3 A)B3' (22+ 7+'-.3, )+ ?$,$#'%:54  + )'-.(@+ *+ 1321+ 4#%$': , &37+(2 *D+ 6+*23/.(1+2 '3&.B(' + 23. 4*E$ 7)') + 0)1)*F+ *+@+ R13*+'U< L223 : + 6+17+'0)13*0+ 7)&'D+ &3 .1 ;+5:8%$44*5"/#%$':< ! 7'(13('+ 7)22+ 23'# 3*0D+ 6+7()' 7)') 3203 )'-.(@+ *+@+ 0+&)2 )2 3*0')&)2 )0: ) &3 *W13'+ !"?$@ RB$'?C"#%6F;%>$GU< K37+(2 (/*+')1+2 .1) 3*0')&) RB$'?C"#%6FA',4$GU 3 6+7()1+2 + '320+ &+

)'-.(@+ R+586C"#*%$/#%$':U< L1 23/.(&), 2.>20(0.?1+2 + )'-.(@+ A(*)" )0.)" 73"+ *+@+ 3 %$858>,':54   )2 3*0')&)2, 7+(2 320)2 A+')1 1+&(A(6)&)2< I'+*0+< ]22+ : 0.&+ + -.3 7'36(2#@)1+2 7)') 03'1+2 .1) 6")223 0+0)"13*03 A.*; 6(+*)" 6+1 6+17)60)CD+ 7)') 1W"0(7"+2 )'-.(@+2< %/+') 7'36(2)1+2 6+*20'.(' .1) *"#$%&'($ 6+1 + .2.#'(+<

Criando um exemplo completo de compactação 9+ 7'+H30+ )0.)", @+6^ &3@3 03' (/*+'); &+ + A5%: 7)&'D+, /3')&+ 73"+ K3"7F(< %/+'), @+"03 ) 3"3, 1.&3 23. *+13 7)') _A1O+17'322(+*` 3 )&(6(+*3 .1 6+1; 7+*3*03 ;;55,H'%< % 3203, )&(6(+*3 6(*6+ ;;55,H>##5"4 R_0>93V`, _0>!73*`, _0>%; &&`, _0>a31+@3` 3 _0>L40')60`U< %&(6(+*3 0)1>:1 .1 ;3H/L*0'(32`U, .1 ;+,*$"#3'#'/$#   R_6&2L*0'(32 I U, .1 ;3'#'/5>%($  R_&2L*0'(32I U, &+(2 ;18$"3*',5J4 R_!73*K()"+/` 3 _%&&b("3; K()"+/`U 3 .1 ;/'=$3*',5JR_X)@3K()"+/IU< !76(+*)"13*03, )&(6(+*3 .1 ;!:'J$K*4# 7)') )&(6(+*)' (1)/3*2 )+ ;;55,H'%< O+*A(/.'3 ?LJC"#%*$4 , )7+*0 )*&+;+ 7)') ?4C"#%*$4  3 3203 7)') + (?4C"#%*$4< 9) 7'+7'(3&)&3 18#*5"4 &3 ?LJC"#%*$4 , )6'3263*03 ?J9>,#*/$,$(# < %&(6(+*3 + 23/.(*03 A("0'+ )+2 6+17+*3*032 18$"2 3*',5J 3 /'=$3*',5JE _O".>3K3"7F( c(7 b("3 Rd') + A*$,?4 C?*#5% &+ 6+17+*3*03 (?2 4C"#%*$4 3 )&(6(+*3 +2 23/.(*032 6)17+2E _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+ 31 (?4C"#%*$4  3 23"36(+*3 +%$'#$ 3'#'/$#< ! 6+17+*3*03 (?4C"#%*$4 )'1)B3*)'# )2 3*0')&)2 &+ ;+5:8%$445%< L20)1+2 .0("(B)*&+ .1 ;+,*$"#3'#'/$# 6+1 &)&+2 31 131M'() 73") A)6("(&)&3 31 23 0');  >)"F)' 6+1 +2 &)&+2 3 6+1 + ;3H+0D+ #L18$" &3@3

23' (17"313*0)&+ &) 1321) 1)*3(')< I+':1, 0'+-.3 /'=$3*',5J 7+' 18$"3*'2 ,5J  3 &3 ;%>$ 7)') A',4$  *) 6+*20'.CD+ &3 A+5:8%$445%< %/+'), .1) @3B 6'()&+ A+5:8%$445% , : *36322#'(+ &320'.?;"+< b); '31+2 (22+ )0')@:2 &+ 3@3*0+ 1"3$4#%56 &+ A+'1."#'(+E  

if  Assigned(FCompressor) then FreeAndNil(FCompressor);

b(*)"13*03, @)1+2 )2 +.0')2 +73')CJ32< O+13631+2 73"+ 7??< I+'0)*0+ 1)*(7.; "3 + 3@3*0+ &+ >+0D+ #L7?? 23/.(*&+ ) 6+&(A(6)CD+ 7'3@(20) *) ./-)(0+1 ><

Listagem 4. Código do método ReloadEntries procedure TfmCompression.ReloadEntries; var i: Integer; Entry: TCompressionEntry ; begin   cdsEntries.DisableControls;   cdsEntries.EmptyDataSet; try for i := 0 to FCompressor.Entri esCount - 1 do   begin Entry := FCompressor.Entri es[i];  

cdsEntries.Append; cdsEntriesPATH. AsString := Entry.Path; cdsEntriesFILE_ SIZE.AsLargeInt := Entry.   FileSize; cdsEntriesENTRY _INDEX.AsInteger := i;   cdsEntries.Post;   end;   finally   cdsEntries.EnableControls;   end; end;

Listagem 5. Código do botão Novo procedure TfmCompression.tbNewClick(Sender: TObject); var AFileName: string; begin if SaveDialog.Execu te then   begin AFileName := SaveDialog.File Name; if Assigned(FCompre ssor) then   FCompressor.Free; FCompressor := TCompressor.Crea te(AFileName,Tru e); Caption := ExtractFileName(A FileName);   ReloadEntries;   end; end;

Figura 1. Interface gráfica do projeto Compression

Q)(2 .1 1:0+&+ >)20)*03 2(17"32, *+ -.)" 7)22)1+2 )+ A+5:8%$445%  0+&+2 +2 )'-.(@+2 ) 23'31 )&(6(+*)&+2< I)') ) +73')CD+ &3 C@#%'(# , (17"313*03 + 3@3*0+ 1"+,*(O &+ >+0D+ #LC@#%'(# R./-)(0+1 ?U % A.*CD+ /$,$(#3*%$(#5%6 *D+ : 1.(0+ 6+*F36(&)< L20) 23'@3 7)') -.3 + .2.; #'(+ 7+22) 23"36(+*)' .1 &('30M'(+, 6+1+ .1 &(#"+/+ -.)"-.3'< I)22)1+2 + +'8#*5" , + &( '30M'(+ (*(6()" 3 7)') +*&3 3*@()' + &('30M'(+ 23"36(+*)&+< L*0D+, 7)') 6)&) "(*F) 23"36 (+*)&) *+ ?LJC"#%*$4   320)1+2 6F)1)*&+ + 1:; 0+&+ C@#%'(# &+ 6+17'322+' 7)22)*&+ + !"?$@   &) 3*0')&), )'1)B3*)&+ *+ 1:0+&+ B$,5'?C"#%*$4< 9+@)13*03, + 6)2+ 1)(2 6+17"(6)&+< Q)*(7."3 + 3@3*0+ 1"+,*(O &+ >+0D+ #L3$2 ,$#$ 7)') .2)*&+ + 6M&(/+ &) ./-)(0+1 @< I)') 3*03*&3' + 6M&(/+ )*03'(+', 7'36(; 2)1+2 73*2)' 31 .1) +73')CD+ *) -.)" 320D+ 23*&+ '31+@(&+2 @#'(+2 '3/(20'+2 &3 .1) 6+"3CD+< O)2+ '31+@)1+2 .1 '3/(20'+ 3, 7+203'(+'13*03, 03*031+2 '3; 1+@3' +.0'+ &3 ?*&(63 1)(+', + 23/.*&+ '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 .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 +.0'+2< ! 7'M7'(+ 5(*&+V2 *+2 73'1(03 (*23'(', 31 *+22+2 3436.0#@3(2, -.)"-.3' 0(7+ &3 )'-.(@+< L2032 7+&31 23' 6+17("); &+2 31 )'-.(@+2 &3 '36.'2+2 RQBC/U 3 3*0D+ 31>.0(&+2 31 .1) )7"(6)CD+< L20) : ) '363(0) &3 >+"+ 7)') ) .0("(B)CD+ &3 )'-.(@+2 &3 '36.'2+2E Z< O'()1+2 .1 )'-.(@+ QB+ , '3A3'3*6()*; &+ +2 )'-.(@+2 -.3 ('D+ 6+*20)' *+ QBC/[ g< O+17(")1+2 + )'-.(@+ QB+ 7)') QBC/[ T< 9+ K3"7F(, .0("(B)1+2 ) &('30(@) RSB 7%T>*=5QBC/U   7)') (17+'0)' + )'-.(@+ &3 '36.'2+2[ o< b)B31+2 .2+ &) 6")223 ;B$45>%($/#%$2 ': 7)') ) "3(0.') &+2 )'-.(@+2< 9+22+ 7'(13('+ 34317"+ : .1 6"#22(6+ &) 6.20+1(B)CD+ &+2 '36.'2+2 &3 .1) )7"(6)CD+< O3'0)13*03, 23 *.*6) .0("(B+., ('# .0("(B#;"+ .1 &() 31 2.) )7"(6)CD+< p 1.(0+ 6+1.1 A)B3'1+2 .2+ &3 >(>"(+; 036)2 3403'*)2 )+ *+22+ 7'+/')1)< O+*; 0.&+, + A)0+ &3 03'1+2 &3 &(20'(>.?;")2  H.*0+ )+ *+22+ 3436.0#@3" *+2 (*6+1+&)  >)20)*03< I+'0)*0+, @)1+2 (*6".?;")2 31 *+22) )7"(6)CD+< K3203 1+&+, 7+&3'?); 1+2 31>.0(' 0)1>:1 + 3436.0#@3" A(*)" 3 340')(' 0+&+2 3"32 )*032 &) 3436.CD+ 7'+7'()13*03 &(0)< O'(3 R6+1 + 7'M7'(+ >"+6+ &3 *+0)2U .1 )'-.(@+ 6+1 ) 3403*2D+ QB+  *+ &(26+ R7+' 34317"+E B$(>%454QB+  *) 7)20) &) )7"(6)CD+U< X3. 6+*03W&+ A(6)'() 7)'36(&+ 6+1 + 23/.(*03E DLL DLLFILE caminho_para_biblioteca.dll

% 7'(13(') 6+".*) 6+*0:1 ) 6F)@3 -.3 (&3*0(A(6)'# + )'-.(@+ 6+1+ '36.'2+ 3 7+&3'# 23' '37'323*0)&) 7+' -.)"-.3' 7)")@')< % 23/.*&) 6+".*) 6+*0:1 + 0(7+ &3 )'-.(@+< !2 1)(2 6+1.*2 2D+E  , +)B/1B , WVC 0 do begin EntryIndexToRemov e := -1; iToRemove := -1; for i := 0 to ToRemove.Count - 1 do begin if  StrToInt(ToRemove[i])>EntryIndexToRemove then begin iToRemove := i; EntryIndexToRem ove := StrToInt(ToRemov e[i]); end; end;   FCompressor.Delete(EntryIndexToRemove);   ToRemove.Delete(iToRemove); end; finally   cdsEntries.EnableControls;   ToRemove.Free; end;   ReloadEntries; end;

[caminho para a pasta bin]\brcc32.exe [arquivo .RC  ]

9) 7)20) )0.)" 23'# /3')&+ .1 )'-.(@+ ')*&+ + 6+*63(0+ &3 4#%$':4 &+ (*?6(+ &+ )'0(/+, A(*)"13*03 A36F)1+2 )2 7'(*6(7)(2 6")2232 -.3 + )22.*0+ )>')*;

/3< ! ;B$45>%($/#%$': : 1.(0+ 7)'36(&+ 6+1 + ;9$:5%6/#%$':  3 *36322(0) &3 0'^2 7)'q130'+2 7)') 2.) 6+*20'.CD+< ! 7'(13('+ : + \95?>,$ , +. 23H), + 0'"?,$ &+ 1M&."+ '30+'*)&+ *+ 6)''3/)13*0+ &3 .1) )7"(6)CD+rKjj< 9+ 6)2+, + )'; -.(@+ &3 '36.'2+2 A+( 6+17(")&+ H.*0+ N )7"(6)CD+ 6+''3*03, 7+'0)*0+, .0("(B); '31+2 \!"4#'"($< 9+ 6)2+ &3 -.3'3'1+2 6)''3/)' '36.'2+2 &3 +.0')2 )7"(6)CJ32 7)22)'?)1+2 + \95?>,$ &) )7"(6)CD+ &323H)&)< ! 23/.*&+ 7)'q130'+ : ) 6F); @3 -.3 (&3*0(A(6) + '36.'2+, (*A+'1)&) *+ QB+< L + 03'63('+ : + 0(7+ &3 '36.'2+, 0)1>:1 (*A+'1)&+ *+ QB+< % 6")223 ;B$45>%($/#%$': , >31 6+1+ + ;9$:5%6/#%$': , F3'&)1 &3 ;+>4#5:2  9$:5%6/#%$':< L20) W"0(1) (*0'+&.B &+(2

Listagem 9. Código do botão de extração dos recursos procedure TForm1.Button1Click(Sender: TObject); var Stream: TResourceStream; const EXTRACTED_DLL_NA ME = ‘extracted.dll’; begin Stream := TResourceStream.C reate(HInstance, ‘DLL’, ‘DLLFILE’); try   Stream.SaveToFile(EXTRACTED_DLL_NAME); MessageDlg(‘Arqui vo extraído para: ‘ +   IncludeTrailingPathDelimiter(ExtractFilePath( Application.Exe Name)) + EXTRACTED_DLL_NA ME, mtInformation, [mbOk], 0);   finally   FreeAndNil(Stream);   end; end;

1:0+&+2 32736()(2E /'=$;5A*,$ 3 /'=$;5/2 #%$':< ]22+ : 1.(0+ W0(" 7+'-.3 *D+ 7'36(; 2)1+2 &3 .1 ;A*,$/#%$': 7)') 2)"@)' 23. 6+*03W&+< ! 1:0+&+ /'=$;5A*,$  H# A)B (22+ 7)') *M2< L 320) : ) +73')CD+ 7'323*03 31 *+22+ 34317"+< L20)1+2 2(17"3213*03 6'()*&+ + 4#%$': 3 6F)1)*&+ 23. 1:0+&+ /'=$;5A*,$< Q.(0+ 2(17"32, *D+P O+1+ &(6), 7+&31+2 .0("(B)' + 7"./;(* /*:8,$ B$45>%($ C?*#5% R)20)*03 W03(2< ! )22(203*03 "F3 )H.&) (*6".2(@3 ), ')7(&)13*03, 23"36(+; *)' + 0(7+ &3 '36.'2+ ) 23' )&(6(+*)&+< X3. &+V*"+)& 7+&3 23' A3(0+ )0')@:2 &+ +5?$+$"#%', &) +5?$: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;

Figura 2. Simple Resource Editor

L &36")'3 AB$4N':$  *) 23CD+  8%*='#$ 6+1+ 23*&+ &+ 0(7+ 4#%*"J< K36")'3 0)1;  >:1 3 (17"313*03 + 23/.(*03 1:0+&+E

procedure  TResCompressor. ExtractToStream(Index: Integer; const ExtractTo: TStream); begin FDestStream := ExtractTo; inherited Extract(Index, ‘’); end;

%&(6(+*3 0)1>:1 A3$4#/#%$': N 23CD+  8%*='#$ &) 6")223< L203 1:0+&+ 23'# .0("(; B)&+ 7)') 340')('1+2 .1 %$45>%($ 7)') .1 4#%$': -.)"-.3'< G+6^ 23 "31>') &+2 0'^2 1:0+&+2 @('0.)(2 &) 6")223 ;+5:8%$445%P I+(2, 03*F) 63'03B) &3 -.3 *D+ 320D+ *) 23CD+  8%*='#$   &) 6")223 ;+5:8%$445%  R&3@31 320)' 7'3A3'3*6()"13*03 31  8%5#$(#$?U 3 '3&36")'3;+2 *) 6")223 ;B$4+5:8%$445% 6+1 ) &('30(@) 5=$%%*?$< ! )0'(>.0+ &3 ;+5:8%$445% ,  A!"#$%"',/#%$': , 0)1>:1 &3@3 23' 6+"+6)&+ 7'3A3'3*6()"13*03 *) 2.) 23CD+ 8%5#$(#$?< ! 1:0+&+ B$4#'%#/#%$': &3@3 23' .0("(; B)&+ 7)') ) (*(6()"(B)CD+ &+ 4#%$': (*03'; *+< I+'0)*0+, + (*(6()"(B)'31+2 6+1+ .1 ;B$45>%($/#%$': 6+*A+'13 23/.3E procedure   TResCompressor.RestartStream( Mode: Word); begin FInternalStream := TResourceStream.C reate( HInstance, FResName, RT_RCDATA); end;

! 1:0+&+ ') + 7'+/')1) +5:8%$42 4*5" 3 6'(3 .1 )'-.(@+ 6+*03*&+ )"/.1)2 A(/.')2 &+ 0(7+ ]8J< O'(3 .1 )'-.(@+ QB+ 3 )&(6(+*3 ) 3"3 ) 23/.(*03 "(*F)E IMAGESZIP RCDATA caminho_para_arquivo_ compactado.cdz

O+17("3 + QB+ 7)') .1 QBC/ 3 + '3A3; '3*6(3 *+ A+'1."#'(+ 7'(*6(7)", )0')@:2 &) &('30(@) RSB 7%T>*=5QBC/U< %&(6(+*3 )+ A+'; 1."#'(+ 7'(*6(7)" &) )7"(6)CD+ .1 ;V'*"#2 H5@ R)>) /64#$:U< 9) 2.) )"*# , (*2(') ]8$J *) 23CD+ )4$4 3 1)*(7."3 + 3@3*0+ 1"+%$'#$ &(/(0)*&+ + 6M&(/+ &) ./-)(0+1 2B< ! -.3 3203 1:0+&+ 320# A)B3*&+ 23 '3A3'3 N 6'()CD+ &3 .1 ;B$4+5:8%$445% , + -.)" ('# 6)''3/)' + QBC/ , 6+*03*&+ + )'-.(@+ &)2 A(/.')2 6+17)60)&+< %7M2 2.) )>3'0.'), 7+&31+2 6F)1)' 23. 1:0+&+ C@#%'(#;5/#%$':   7)22)*&+ .1 ?*&(63 )"3)0M'(+< b(*)"13*03, 6)''3/)1+2 N A(/.') 31 AW8$J R&36")'3;) *) 6")223 &+ A+'1."#'(+U< s0("(B)1+2 .1 ;9$:5%6/2 #%$': 7)') 6)''3/#;")< %/+'), *+ 3@3*0+ 1"V'*"# &+ ;V'*"#H5@ , (17"313*03 + 6M&(/+ 23/.(*03< procedure   TForm1.PaintBox1Paint(Sender: TObject); begin if Assigned(FJpeg) then PaintBox1.Canva s.Draw(0, 0, FJpeg); end;

I'+*0+< %/+'), 0+&) @3B -.3 @+6^ 3*0')' *+ 7'+/')1), .1) A(/.') )"3)0M'() &3 2.) "(20) 23'# 6)''3/)&) *+ ;V'*"#H5@< G+6^ 7+&3 .0("(B)' (22+ *+ 48,'40 4(%$$" &3 2.) )7"(6)CD+, 7+' 34317"+<

L, 23 @+6^ )(*&) *D+ 6)*2+. &3 3431; 7"+2, @)1+2 A(*)"(B)' 6+1 .1 1.(0+ 7+.6+ 6+*F36(&+E 6+1+ )"03')' %$45>%($4 &3 +.0')2 )7"(6)CJ32< %(*&) *+ 34317"+ )*03'(+', )&(6(+*3 ) 23/.(*03 "(*F) *) 23CD+ !"#$%&'($ &) )"*# &+ A+'1."#'(+E resourcestring TITLE = ‘not changed’;

B$45>%($ /#%*"J4 2D+ 6+1+ 6+*20)*032< 9+

3*0)*0+, 7+&31+2 1+&(A(6)' 23. 6+*03W&+ .0("(B)*&+ 7'+/')1)2 -.3 )"03'31 %$45>%2 ($4 6+1+ + B$45>%($ \'(O$% +. + D5%O4058 C?*#5%< L22)2 2D+ 1.(0+ .0("(B)&)2 31 7'+/')1)2 -.3 &323H)1+2 (*03'*)6(+*); "(B)', 7+(2 7+&31+2 )"03')' 23. 6+*03W&+ 7)') +.0') "?*/.) 231 03' &3 %$(5:8*,'% ) )7"(6)CD+ 0+&)< %&(6(+*3 6+1+ 7'(13(') "(*F) &+ 1)*(7.")&+' &+ 3@3*0+ 1"+%$'#$ &+ A+'1."#'(+ + 23/.(*03E Caption := TITLE;

O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+ _a32+.'63s7&)03##5"R_>0j(20`, _>0aOK%\%` 3 _>0X0'(*/`U 3 .1 ;9$:5R_11j(20IU< I+2(6(+*3 +2 6+17+*3*032 3 6+*A(/.'3 23.2 +'8#*5"4 6+*A+'13 ) ‘ + IntToStr(Initial String + i) + ‘ - ‘ + string(Buffer));   end; end else if ResType = RT_RCDATA then begin Strings.Add(‘> ‘ + ResName);   end; Result := True; end;

! 1:0+&+ (17"313*0)&+, 6+*A+'13 6+; 13*0)&+, 23'# 6F)1)&+ 7)') 6)&) '36.'2+ 3*6+*0')&+< X3 + '36.'2+ A+' .1 B+37;7 , )73*)2 )&(6(+*)1+2 *) "(20) + *+13 &+ '36.'2+< O)2+ 23H) .1 /#%*"J ;'L,$ , @)'; '31+2 ) 0)>3") "3*&+ 6)&) 4#%*"J )0')@:2 &+ 1:0+&+ K5'?/#%*"J< I)') 73/)'1+2 + *+13 &3 '36.'2+ &) 0)>3"), .0("(B)1+2 ) A.*CD+ K5D5%? , 7+(2, *+2 (*03'322) )73*)2 +2 L6#$4 13*+2 2(/*(A(6)0(@+2< % "(20) H# 320# 7'+*0) 7)') 23' 7'33*; 6F(&)< G+6^ @3'# 7'(13('+ +2 '36.'2+2 B+37;7 &+ )7"(6)0(@+ 3, &37+(2, +2 '3; 6.'2+2 &+ 0(7+ /#%*"J ;'L,$< 9+ 23/.*&+ 6)2+, )7)'363'# 0)1>:1 ) 6F)@3 (&3*0(; A(6)&+') &3 6)&) 4#%*"J< %/+'), &36")'3 3 (17"313*03 + 1:0+&+ )8?'#$B$45>%($!"V%5J%': R./-)(0+1 25U< L203 : + 1:0+&+ -.3 23'# .0("(B)&+ 7)') ) 1+&(A(6)CD+ 3A30(@) &+2 %$45>%($4< L"3 6+*2(203 31 6F)1)'1+2 H$J*")2  8?'#$B$45>%($  7)') (*(6()' ) )"03')CD+, + -.)" *+2 '30+'*) + \'"?,$ &+ 7'+/')1)< X3 ) )"03')CD+ A+' &+ 0(7+ B+37;7 , (*(6()1+2 .1 4#%$': 7)') ) "3(0.') &+ )'-.(@+ -.3 ('# 2.>20(0.(' + '36.'2+ )0.)"[ '323'@)1+2 131M'() 7)') 0+&+ 3203 @)"+' R*+03 -.3 + )'-.(@+ 23'# 0+0)"13*03 6)''3/)&+ 31 131M'()U[ "31+2 + )'-.(@+ *+ L>&&$%  3, 7+' A(1, 6F)1)1+2 )8?'#$B$45>%($< L203 : + 1:0+&+ -.3 ('# 1+&(A(6)' + '36.'2+ 3, 7)') 3"3, &3@31+2 7)22)'E + \'"?,$ &) )7"(6)CD+ ) 1+&(A(6)', + 0(7+ &3 '36.'; 2+, + *+13 &+ '36.'2+ R: (*03'322)*03 .0("(B)' ) A.*CD+  9'O$!"#B$45>%($  7)') ) A+'1)0)CD+ &+ @)"+'U, ) "(*/.)/31 &+ '36.'2+ Rx y 93.0')"U, + L>&&$%   6+1 +2 L6#$4 3 + 0)1)*F+ ) 23' /')@)&+< O)2+ 3203H)1+2 (*03'322)&+2 *) )"03'); CD+ &3 .1) 4#%*"J , 6F)1)1+2 + 1:0+&+ ) 23' (17"313*0)&+ %($ "':$ &+ /#%*"J ;'L,$ 6+1 >)23 *+ *?  &3 .1 4#%*"J< \3203 23. 7'+/')1) )7+*0)*&+ 7)') + 3436.0#@3" )*03'(+'13*03 6'()&+ B$45>%2 ($P*8Q$@$ 3 6"(6)*&+ 31 L#K*4#< G+6^ @3'# ) "(20) 6+1 +2 '36.'2+2 &+ 7'+/')1)< I)') )"03')' .1 4#%*"J , 6+"+-.3 *+ 23/.*&+ ;C?*# + *? &) 4#%*"J  R6+7(3 &) "(20)U 3 &^ .1 *+@+ @)"+'< I+' 34317"+, 7'+6.'3 7+' _*+0 6F)*/3&`, 6+''327+*&3*03 )+ %$45>%($4#%*"J )*03'(+'13*03 )&(6(+*)&+, 1.&3 23. @)"+' 3 3436.03 + 7'+/')1)< G+6^ @3'# -.3 ) 4#%*"J   A+( 1+&(A(6)&) 6+1 2.6322+, )0')@:2 &) >)'') &3 0?0.; "+2< =3'3 0)1>:1 +.0'+ )'-.(@+ Q(?E 6+1 &(A3'3*032 A(/.')2  ]8$J 3 A)C) .1) 1+&(A(6)CD+ )7+*0)*&+ 7)') + *+13 &+ '36.'2+ R!97') + 7'+/')1) 3 @+6^ @3'# )2 (1)/3*2 *+@)2<

Conclusão I+' 1)(2 -.3 )6F31+2 -.3 2)>31+2 0.&+, 2317'3 F# )"/+ 7)') )7'3*&3'< /#%$':4  *D+ 2D+ .1 6+*03W&+ &(A?6(", 7+':1, *36322(0)1 23' 343'6(0)&+2< %":1 &(22+, ).13*0)1+2 .1 7+.6+ 1)(2 *+22+ _)'23*)"` &3 7+22(>("(&)&32, 6+1 ) .0("(B)CD+ &3 7+&3'+2+2 6+17)60)&+; '32 &3 )'-.(@+2 3 )'-.(@+2 &3 '36.'2+  >)20)*03 A"34?@3(2< %/+'), : 2M 3273')' ) +7+'0.*(&)&3 63'0) 7)') )7"(6)' + -.3 A+( 347"(6)&+ 31 .1 63*#'(+ '3)"<

Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

   F eedb ac   k  

     D

  e   s   t    a

    e   i   d    ç     ã       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

Análise de Pontos de Função Saiba mensurar o tamanho de seu software e estimar o tempo que levará para ficar pronto

s

Carmo Crêdiney de Melo ([email protected])

Possui experiência desde 1990 em Tecnologia da Informação. Bacharel em Sistemas de Informação pela Faculdade Metodista Granbery (FMG). Acumula sete anos de estudos acadêmicos na área de tecnologia e na área de Gestão de Projetos. Possui capacitação em Rational Unified Process (RUP), Arquitetura J2EE, Linux, Gestão de Projeto de Tecnologia e Análise de Pontos de Função.

Marco Antônio Pereira Araújo ([email protected])

É Professor do Curso de Bacharelado em Sistemas de Informação da Faculdade Metodista Granbery, Doutorando e Mestre em Engenharia de Sistemas e Computação pela COPPE/UFRJ, Especialista em Métodos Estatísticos Computacionais e Bacharel em Matemática com Habilitação em Informática pela UFJF, Analista de Sistemas da Prefeitura de Juiz de Fora.

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*; @+"@(13*0+ -.)*0+ &3 1)*.03*CD+< L*0'30)*0+, )2 6'3263*032 *36322(&)&32 &+2 .2.#'(+2, ) )"0) 6+17"34(&)&3 3  >)( 4+ 3*03*&(13*0+ &+ &+1?*(+ &)2 )7"(6)CJ32 ) 23'31 6+*20'.?&)2, )"()&)2 N2 6+*20)*032 1.&)*C)2 036*+"M/(6)2, 7'+1+@31 .1 )"0+ /'). &3 (*63'03B) *)2 320(1)0(@)2 7)') + 6.17'(13*0+ &)2 130)2 320)>3"36(&)2< O+1+ '32."0)&+, +2 &323*@+"@3&+'32 0^1 3*A'3*0)&+ 7'+>"31)2 &3 2.>320(1)0(@)2, 6."1(*)*&+ 31 )0')2+2 *+ 6'+*+/')1) 3 &326.17'(13*0+ &3 +'C)13*0+2< I+' +.0'+ ")&+, 3*03*&3;23 -.3 +2 .2.#'(+2 0)1>:1 7'36(2)1 &3 '327+20)2 '#7(&)2 31 '3")CD+ )+ 0317+ 3 6.20+2 3*@+"@(&+2 31 7'+H30+2 &3 2+A0V)'3< 9+ 23*0(&+ &3 +>03' 320(1); 0(@)2 1)(2 6+*A(#@3(2, *36322(0);23 ")*C)' 1D+ &3 0:6*(6)2 32736?A(6)2 7)') 3223 A(1,

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+ 3 '36.'2+2 7)') + 7'+H30+ 31 -.320D+ 6+1 >)23 *) 7'+&.0(@(&)&3 &) 3-.(73 +. *) 0)4) &3 3*0'3/) &3 7'+H30+2 23; 13"F)*032< L22)2 320(1)0(@)2 &3A(*(&)2 *+ (*?6(+ &+ 7'+H30+ 2D+ &303'1(*)*032 7)') 7")*3H)' )2 2.)2 (03')CJ32, 7'3@3' + 6.20+ 3 3")>+')' + +'C)13*0+ &30)"F)&+ &+ 7'+H30+, 1(*(1(B)*&+ +2 '(26+2 -.3 + 7'+H30+ 03'1(*3 A+') &+ 7')B+ +. &+ +'C)13*0+ 7'3@(20+< %22(1, + +>H30(@+ &3203 )'0(/+ : &326'3; @3' 6+1+ +>03' + 0)1)*F+ &3 2(2031)2 )0')@:2 &) 0:6*(6) &3 6+*0)/31 &3 I+*0+2 &3 b.*CD+, )0')@:2 &3 .1 7'+0M0(7+ &3 (*03'A)63 &3 .1) )7"(6)CD+ &3 34317"+< 9D+ 23 031 ) 7'303*2D+ &3 )7'323*0)' 0+&)2 )2 '3/')2 &3 bI%, 1)2 (*0'+&.B(' +2 6+*63(0+2 >#2(6+2 7)') ) 6+*0)/31 31 7'+H30+2 &3 &323*@+"@(13*0+<

! 320.&+ &3 6)2+ )7'323*0)&+ *3203 )'0(/+ : '3")0(@+ N 6+*0)/31 &3 I+*0+2 &3 b.*CD+ &3 .1 A')/13*0+ &3 .1 2(2031) &3 O+*0'+"3 %6)&^1(6+<

Introdução à análise de Pontos de Função % bI% A+( &323*@+"@(&) 31 13)&+2 &) &:6)&) &3 {x *) 03*0)0(@) &3 1(*(1(B)' )2 &(A(6."&)&32 )22+6()&)2 N 13&(CD+ &3 0)1)*F+ &3 2+A0V)'3 )0')@:2 &3 "(*F)2 &3 6M&(/+;A+*03, )":1 &3 7'+@3' .1 136)*(2; 1+ -.3 7.&3223 7'3@3' + 32A+'C+ )22+6()&+ )+ &323*@+"@(13*0+ &3 2+A0V)'3< L1 ZS|o, .1) @3'2D+ 1)(2 '3A(*)&) A+( ")*C)&) 3, 7+203'(+'13*03, 6+1 + ).13*0+ &) .0("(B)CD+ &) bI%, 0+'*+.; 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 8  R]bIs=U< 9+ 8')2(", 3223 /'.7+ : '37'323*0)&+ 73"+ 8bIs= RH%'E*,*'" A>"(#*5" V5*"# )4$%4 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)23 &)2 13*2)"(&)&32 2D+ 1)*0(&+2 7+' .1 2(2031) A(*)*63('+ 3 320D+ A+') &+2 "(1(032 &322) )7"(6)CD+, 23*&+ 6+*2."0)&+2 7+' 3")< I)') ) 6+*20'.CD+ &322)2 A.*6(+*)"(&)&32, 23'# 7'(13(')13*03 &303'1(*)&+ + 0)1); *F+ &) )7"(6)CD+ -.3 23'# &323*@+"@(&), &3 A+'1) ) +'(3*0)' )2 320(1)0(@)2 &3 7')B+ 3

Figura 3. Janela de pesquisa de alunos

Figura 4. Janela de Cadastro de Alunos – Dados Pessoais

6.20+< %22(1, 7)') 320(1)' + 0)1)*F+ &+ 2+A0V)'3 &3 )6+'&+ 6+1 ) bI%, 23/.3;23 .1 7'+63&(13*0+ &3 6+*0)/31, -.3 320# '37'323*0)&+ *+ 32-.31) &) )(4), 7+(2 7+22.( .1 \a 3 &+(2 \K2< ;C ,#' C@#$%"' F+CGE 7'+6322+ -.3 3*@() &)&+2 7)') A+') &) A'+*03(') &) )7"(6)CD+, )7'323*0)*&+ &)&+2 )+ .2.#; '(+ 7+' 13(+ &3 .1) 2(17"32 '36.73')CD+ &3 (*A+'1)CJ32 &3 %j] +. %]L< 9+ 320.&+ &3 6)2+ &3203 )'0(/+, 7+&31; 23 (&3*0(A(6)' +2 7'+6322+2 3"313*0)'32 6+*A+'13 )7'323*0)&+ *) D(:+7( =< %2 '3/')2 7)') &3A(*(' ) 6+17"34(&)&3 &3 LL, XL +. OL 6+*2(&3')1 + *W13'+ &3 %'-.(@+2 a3A3'3*6()&+2 R%aU 3 + *W13'+ &3 \(7+ &3 K)&+2 R\KU .0("(B)&+2, 23*&+E !

!

!

TD 1 2

} %aE I)') 6)&) %j] "(&+ +. 1)*0(&+ 73") )7"(6)CD+, +. %]L "(&+, 6+*0);23 .1[ } \KE ; C"#%'?' C@#$%"'  RLLUE 6+*0)1;23 +2 )0'(>.0+2 -.3 2D+ )0.)"(B)&+2 3 &303'1(*);23 ) 6+17"34(&)&3 6+*A+'13 ) D(:+7( >[ ; /'b?' C@#$%"' RXLUE 6+*0)1;23 +2 )0'(>.0+2 &) 2)?&), )":1 &3 )0'(>.0+2 6)"; 6.")&+2, 3 &303'1(*);23 ) 6+17"34(&)&3 6+*A+'13 D(:+7( ?[ ; +5"4>,#' C@#$%"' ROLUE 31 .1 7'+6322+ &3 3*0')&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 &3 23"3CD+, )":1 &3 13*2)/31 )+ .2.#'(+ -.)*&+ A+' + 6)2+< L1 .1 7'+6322+ &3 2)?&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 &3 2)?&)< L1 7'+6322+2 &3 3*0')&) 3 2)?&), 2+1)1;23 +2 &+(2 '32."0)&+2< K303'1(*);23 ) 6+17"34(&)&3 6+*A+'13 ) D(:+7( ?< 9+ 320.&+ &3 6)2+ &3203 )'0(/+, 6+*; 2(&3')1;23 )2 )*#"(232 )7'323*0)&)2 *) D(:+7( @< !2 7'+6322+2 3"313*0)'32 K*4#'% +>%454 3 K*4#'% 7,>"54 6+*2(&3')')1 \K (/.)" ) &+(2 7+' 23' 3223 + *W13'+ &3 )0'(>.0+2

Tipo de Dado Tipo do curso (1=Graduação / 2=Pós-Graduação) Valor Base da Mensalidade

=C N8")8- #+ *4'% +>%45 3 V$4T>*4'% 7,>"5 6+*2(&3')1 %a (/.)" ) .1, 7+(2 6)&) 7'+6322+ +>0:1 (*A+'1)CJ32 &3 .1 W*(6+ %j] 3 \K (/.)" ) 0'^2, 7+(2, 7+' 23' .1 7'+6322+ &3 3*0')&) 3 2)?&), '363>3 + 7)'q130'+ ) 23' 6+*2."0)&+ 3 34(>3 +2 &)&+2 7'3@(20+2 *)2 '327360(@)2 03")2 &3 732-.(2) R6M&(/+ 3 &326'(CD+ 7)') 6.'2+2 3 1)0'?6.") 3 *+13 7)') )".*+2U< A*,#%'% 7,>"54 85% +>%45 6+*2(&3') .1 %a ) 1)(2 7+' 03' -.3 34(>(' +2 6.'2+2 6)&)2; 0')&+2< ! 7'+6322+ 3"313*0)' C@*L*% 9$"2 4'J$: ?$ +>%45 +'?'4#%'?5 *D+ 6+*2(&3') *3*F.1 %a, 7+(2 *D+ +>0:1 (*A+'1)CJ32 &3 *3*F.1 %j] +. %]L 3 6+*2(&3') \K (/.)" ) .1 31 A.*CD+ &) 13*2)/31 34(>(&)< !2 7'+6322+2 3"313*0)'32 !"(,>*%c 7,#$%'%c C@(,>*% 3 +5"4>,#'% 7,>"54 6+*2(&3; ')1 &+(2 %a 7+' )0.)"(B)' + %j] %".*+ 3 +>03' &)&+2 &+ %j] O.'2+< ! 7'+6322+ 3"313*0)' C@*L*% +d,(>,5 ?$ X',5% ?' 9$"4',*?'?$ 6+*2(&3'+. %a (/.)" ) .1 7+' "3' + %]L Q3*2)"(&)&3 3 \K (/.)" ) &+(2, 31 @('0.&3 &3 "3' + @)"+' &) 13*2); "(&)&3 31 A.*CD+ &+ 0(7+ &3 6.'2+<

Tipo CE CE EE EE EE CE CE CE CE CE EE EE EE CE CE SE

)7M2 (&3*0(A(6)' )2 A.*CJ32 &3 &)&+2 3 +2 7'+6322+2 3"313*0)'32, 1."0(7"(6);23 + 0+0)" &3 %j], %]L, LL, XL 3 OL 73"+ '32736; 0(@+ @)"+' &3 7+*0+ &3 A.*CD+ &) 0)>3") &3 6+17"34(&)&3 RD(:+7( AU 7)') &303'1(*)' + @)"+' 0+0)" -.3 23'# + Ib *D+ )H.20)&+< % D(:+7( 2B 34(>3 + '32."0)&+ A(*)" &+ 6#"6."+ &3 7+*0+2 &3 A.*CD+ *D+ )H.20); &+2 7)') + 320.&+ &3 6)2+ &3203 )'0(/+< >C Q(78$ #8 0(&) *+ 1)*.)" &3 I'#0(6)2 &3 O+*0)/31 &3 I+*0+2 &3 b.*CD+ &+ ]bIs=< I)') 3203 34317"+, )2 6)')603'?20(6)2 A+')1 &326'(0)2 ) 23/.(', >31 6+1+ +2 @)"+'32 6+*2(&3')&+2 7)') 6)&) .1) &3")2E _Q +5:>"*('`a5 ?$ 3'?54e  6+*2(&3') 23 2D+ .0("(B)&+2 '36.'2+2 &3 6+1.*(6)CD+

73") )7"(6)CD+< 93203 34317"+, 23'# 6+*; 2(&3')&+ + @)"+' -.)0'+, -.3 : '3")0(@+ ) )7"(6)CJ32 +*;"(*3, 2.7+'0)&)2 7+' )"/.1 7'+0+6+"+ &3 6+1.*(6)CD+[ [Q V%5($44':$"#5 3*4#%*L>b?5e  '3")0(@+ N 0')*2A3'^*6() &3 &)&+2 3*0'3 +2 6+1; 7+*3*032 &) )7"(6)CD+< b+( 6+*2(&3')&+ + @)"+' .1, .1) @3B -.3 *D+ '3)"(B) 7'+6322)13*0+ &(20'(>.?&+, A)B3*&+ .2+ )73*)2 &3 .1 2(2031) &3 /3'3*6()13*0+ &3 >)*6+ &3 &)&+2[ ZQ V$%&5%:'"($e &303'1(*) 6+1+ + 0317+ &3 '327+20) (*A".3*6() ) )7"(6)CD+< b+( 6+*; 2(&3')&+ B3'+, .1) @3B -.3 *D+ A+( (*&(6)&) *3*F.1) '320'(CD+ ) 3223 '3273(0+[ fQ +5"&*J>%'`a5 7,#':$"#$ )#*,*E'?'e &3A(*3 + *?@3" &3 '320'(CJ32 (17+20)2 73"+ .2.#'(+< \)1>:1 A+( 6+*2(&3')&+ + @)"+' B3'+ .1) @3B -.3 *3*F.1) '320'(CD+ A+( (17+20)[ gQ X5,>:$ ?$ ;%'"4'`h$4e  '3A3'3;23 )+ @+".13 &3 (*A+'1)CJ32 7'+6322)&+2 73") )7"(6)CD+< O+*2(&3'+.;23 + @)"+' .1, .1) @3B -.3 : 7'3@(20+ .1 *W13'+ &3 0')*2)CJ32 1)(2 3"3@)&+ 31 )"/.*2 73; '?+&+2 32736?A(6+2, 6+1+ ) 6)&) 73'?+&+ &3 1)0'?6.")2 &3 )".*+2[ iQ C"#%'?' ?$ 3'?54 1"2,*"$e 6+*2(&3') ) -.)*0(&)&3 &3 0')*2)CJ32 A3(0)2 +*;"(*3< b+( 6+*2(&3')&+ + @)"+' 6(*6+ .1) @3B -.3 + 2(2031) )7'323*0) 0+&)2 )2 0')*2); CJ32 6+1+ 23*&+ &3223 0(7+[ jQ C&*(*k"(*' ?5 )4>d%*5 A*"',e '3A3'3;23 ) A)6("(&)&32 +A3'36(&)2 )+ .2.#'(+ A(*)", 6+1+ )H.&) +*;"(*3, ).4?"(+ N *)@3/)CD+ 7+' 036")2 &3 A.*CD+, 13*.2, &3*0'3 +.0'+2< b+( 6+*2(&3')&+ + @)"+' .1 7+' )7'323*; 0)' )"/.1)2 7+.6)2 6)')603'?20(6)2 &3223 0(7+, 6+1+ ) 34(>(CD+ &+2 6.'2+2 31 6)(4) &3 6+1>(*)CD+ 7)') A)6("(0)' ) 23"3CD+ &+ .2.#'(+ *+ 6)&)20')13*0+ &3 )".*+2[ lQ 7#>',*E'`a5 1"2,*"$e &3A(*3 23 +2 )'; -.(@+2 "M/(6+2 (*03'*+2 2D+ )0.)"(B)&+2 +*;"(*3< b+( .0("(B)&+ + @)"+' 0'^2, 7+(2 0+&+2 +2 )'-.(@+2 (*03'*+2 2D+ )0.)"(B); &+2 &322) A+'1)[ mQ +5:8,$@*?'?$ ?$ V%5($44':$"#5e &303'; 1(*) ) 6+17"34(&)&3 &3 7'+6322)13*0+ Função Baixa Média Alta Consulta Externa (CE) 3 4 6 Entrada Externa (EE) 3 4 6 Saída Externa (SE) 4 5 7 Arquivo de Interface Externa (AIE) 5 7 10 Arquivo Lógico Interno (ALI) 7 10 15 Tabela 9. Contribuição de ponto de função por complexidade

Arquivos Referenciados (AR)

Tipos de Dados (TD) 5 a 15 Baixa Média Alta

Abaixo de 5 Baixa Baixa Média

0 ou 1 2 Acima de 2

Acima de 15 Média Alta Alta

Tabela 6. Complexidade de Entrada Externa (EE)

Arquivos Referenciados (AR) 0 ou 1 2 ou 3 Acima de 3

Tipos de Dados (TD) 6 a 19 Baixa Média Alta

Abaixo de 6 Baixa Baixa Média

Acima de 19 Média Alta Alta

Tabela 7. Complexidade de Saída Externa (SE) e Consulta Externa (CE) Processo Elementar Listar Cursos Pesquisar Curso Incluir Curso Alterar Curso Excluir Curso Consultar Curso Exibir Mensagem de Curso Cadastrado Listar Alunos Pesquisar Aluno Filtrar Alunos por Curso Incluir Aluno Alterar Aluno Excluir Aluno Consultar Aluno Exibir Cursos Cadastrados na Caixa de Combinação Exibir Cálculo de Valor da Mensalidade

Tipo CE CE EE EE EE CE CE CE CE CE EE EE EE CE CE SE

AR 1 1 1 1 1 1 0 1 1 2 2 2 2 2 1 1

TD 2 3 5 5 5 5 1 2 3 3 23 23 23 23 1 2

Complexidade Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Alta Alta Alta Alta Baixa Baixa

Tabela 8. Complexidade dos processos elementares identificados no estudo d e caso. Processo Elementar Curso Aluno Mensalidade Listar Cursos Pesquisar Curso Incluir Curso Alterar Curso Excluir Curso Consultar Curso Exibir Mensagem de Curso Cadastrado Listar Alunos Pesquisar Aluno Filtrar Alunos por Curso Incluir Aluno Alterar Aluno Excluir Aluno Consultar Aluno Exibir Cursos Cadastrados na Caixa de Combinação Exibir Cálculo de Valor da Mensalidade Total de Pontos de Função

Tabela 10. Identificação dos processos elementares e suas complexidade

Tipo ALI ALI AIE CE CE EE EE EE CE CE CE CE CE EE EE EE CE CE SE

Complexidade Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Baixa Alta Alta Alta Alta Baixa Baixa

Pontos Função 7 7 5 3 3 3 3 3 3 3 3 3 3 6 6 6 6 3 4 80

&)2 A.*6(+*)"(&)&32 &) )7"(6)CD+< b+( 6+*2(&3')&+ + @)"+' B3'+, 7+' 23' .1) )7"(6)CD+ >)20)*03 2(17"32[ _nQ B$>#*,*E'`a5e (&3*0(A(6) 23 + 6M&(/+ A+( 7'+H30)&+ 7)') 23' '3)7'+@3(0)&+ 31 +.0')2 )7"(6)CJ32< ! @)"+' B3'+ A+( 6+*2(&3')&+ 7+' 322) *D+ 03' 2(&+ .1) 7'3+6.7)CD+ *+ 7'+H30+[ __Q A'(*,*?'?$ ?$ !"4#','`a5e   6+*2(&3') 23 34(2031 A3'')13*0)2 &3 6+*@3'2D+ 3 (*20)")CD+ &) )7"(6)CD+< \)1>:1 A+( 6+*; 2(&3')&+ + @)"+' B3'+ 7+' 322) 7'3+6 .7); CD+ *D+ 03' 2(&+ "3@)&) 31 6+*2(&3')CD+ *+ 320.&+ &3 6)2+[ _[Q A'(*,*?'?$ ?$ 18$%'`a5e 6+*2(&3') )27360+2 &3 23/.')*C) 3 '36.73')CD+ &3 (*A+'1)CJ32< O+1+ (22+ 0)1>:1 *D+ A+( 6+*2(&3')&+, : )22.1(&+ + @)"+' B3'+[ _ZQ 9o,#*8,54 K5('*4e 23 ) )7"(6)CD+ A+( 7'+H30)&) 3 &323*@+"@(&) 7)') 23' .0("(; B)&) 31 &(A3'3*032 "+6)(2< L22) '320'(CD+ 0)1>:1 *D+ A+( 6+*2(&3')&) 3 )22.1(&+ + @)"+' B3'+[ _fQ A'(*,*?'?$ ?$ 9>?'"`'4e 23 ) )7"(6)CD+ A+( 7'+H30)&) 7)') A)6("(0)' 1.&)*C)2 *) "M/(6) &3 7'+6322)13*0+ +. 31 2.)2 320'.0.')2 &3 &)&+2< ! @)"+' B3'+ A+( .0("(B)&+ *3223 6)2+< X+1)1;23 3*0D+ 322)2 7+*0.)CJ32 7)') +>03' + *?@3" 0+0)" &3 (*A".^*6() R\K] Y ;5#', 3$J%$$ 5& !"&,>$"($U< K)? >)20) )7"(6)' ) 23; /.(*03 AM'1.") 7)') +>03' + @)"+' &+ A)0+' &3 )H.203 RG%b Y X',>$ 7?]>4#:$"# A'(#5%UE Valor do Fator de Ajuste (VAF) = (TDI x 0,01) + 0,65

9+ 6)2+ &+ 34317"+ &3203 )'0(/+E VAF = (15 x 0,01) + 0,65 = 0,8

%0.)"13*03 3223 : .1 7)22+ +76(+*)" &+ 7'+6322+ &3 6+*0)/31< Q.(0)2 +'/); *(B)CJ32 &326+*2(&3')1 + A)0+' &3 )H.203 3 .2)1 )73*)2 ) 13&(CD+ &+2 7+*0+2 &3 A.*CD+ *D+ )H.20)&+2< ]22+ 23 &3@3 )+ A)0+ &3 -.3 )2 6)')603'?20(6)2 /3')(2 &3 .1 2(2031), )7'323*0)&)2 )*03'(+'13*; 03, 2D+ 6+*2(&3')&)2 &32)0.)"(B)&)2 +. (*6+17"30)2 31 '3")CD+ N2 036*+"+/()2 )0.)"13*03 .0("(B)&)2, A)B3*&+ 6+1 -.3 2.) .0("(&)&3 23H) -.320(+*)&)< ]22+ A(6) 1)(2 3@(&3*6()&+ -.)*&+ ) *+'1) ]X!r]LO ZoZoT 6+*2(&3') )73*)2 +2 7+*0+2 &3 A.*CD+ *D+ )H.20)&+2 31 2.)2 320(1)0(@)2 &3 13&(CD+ A.*6(+*)"< ?C N8")8- #+ 3")2 &3 7'+&.0(@(&)&3 7+' 7+*0+ &3 A.*CD+ &(27+*?@3(2 *) (*03'*30, +*&3 +2 &)&+2 )"( )7'323*0)&+2 7+&31 *D+ '3A"30(' ) 6)7)6(&)&3 &3 7'+&.CD+ &3 -.)"-.3' 3-.(73 &3 &323*@+"@(13*0+ 3, 1.(0)2 @3B32, *D+ "3@)1 31 6+*2(&3')CD+ )2 6)')603'?20(6)2 &3 &(A3'3*032 036*+"+/()2 -.3 7+&31 23' .0("(B)&)2< I+'0)*0+, + 6+*F36(13*0+ &) 7'+&.0(; @(&)&3 &3 6)&) 3-.(73 : A.*&)13*0)" 7)') 320(1)0(@)2 &3 32A+'C+ 3 7')B+ ) 7)'0(' &) 6+*0)/31 &3 7+*0+2 &3 A.*CD+< 9+ 320.&+ &3 6)2+ &3203 )'0(/+, @)1+2 6+*2(&3')' F(7+030(6)13*03 ) 2(0.)CD+ &3 -.3 .1 7+*0+ &3 A.*CD+ : &323*@+"@(&+ 31 .1) F+') &3 0')>)"F+ &3 .1 &323*; @+"@3&+' RZ F+131rF+')U< %22(1, + 32A+'C+ 7)') 3223 7'+H30+, 6+*2(&3')*&+;23 +2 7+*0+2 &3 A.*CD+ )H.20)&+2, 23'() &3 io F+')2 &3 0')>);

"F+ &3 .1 W*(6+ &323*@+"@3&+'< !.0') 2(0.)CD+ -.3 13'363 )03*CD+ : .0("(B)' + @)"+' '3)" &3 7'+&.0(@(&)&3 &3 .1 &3; 23*@+"@3&+', .1) @3B -.3 &(A(6("13*03 )"/.:1 031 7'+&.0(@(&)&3 (/.)" ) 2.) 6)'/) F+'#'() 0+0)" &3 0')>)"F+< 93203 34317"+ F(7+0:0(6+, 23 6+*2(&3')'; 1+2 -.3 .1 &323*@+"@3&+' 7'+&.B 63'6) &3 Th F+')2 '3)(2 7+' 231)*), + 320.&+ &3 6)2+ &3203 )'0(/+ "3@)'() 13*+2 &3 &.)2 231)*)2 7)') 23' &323*@+"@(&+, 23 6+*&.; B(&+ 7+' .1 W*(6+ &323*@+"@3&+'<

Conclusão O+*0)/31 &3 I+*0+2 &3 b.*CD+ '37'3; 23*0) .1) 0:6*(6) &3 6#"6."+ &+ 0)1)*F+ &3 .1) )7"(6)CD+, *D+ &3 32A+'C+ 7)') 23. &323*@+"@(13*0+< X.) 6+''30) .0("(; B)CD+, >)23)&) *)2 '3/')2 &326'(0)2 *+ 1)*.)" &3 I'#0(6)2 &3 O+*0)/31 &3 I+*; 0+2 &3 b.*CD+ &+ ]bIs=, 7+&3 )H.&)' *) 13&(CD+ &) A.*6(+*)"(&)&3 &3 2(2031)2 3 )7+()' 320(1)0(@)2 &3 32A+'C+ 3 7')B+  >)23)&)2 *) 7'+&.0(@(&)&3 6+*F36(&) &3 .1) 3-.(73 &3 &323*@+"@(13*0+< I+&3;23 )(*&) 3*6+*0')' &(@3'2)2 A3'')13*0)2 +. 7")*("F)2 3"30'~*(6)2 &3 &(A3'3*032 A+'*363&+'32 7)') )7+()' +2 7'+63&(13*0+2 &3 6#"6."+ &3 7+*0+2 &3 A.*CD+ &3 A+'1) ) A)6("(0)' + 7'+6322+ &3 6+*0)/31< L203 )'0(/+ 7'+6.'+. )7'323*; 0)' &3 A+'1) 7'#0(6) )2 7'( *6(7)(2 '3/')2 &3 6+*0)/31 &3 7+*0+2 &3 A.*CD+ )0')@:2 &3 .1 320.&+ &3 6)2+ 7'#0(6+< Referências

Site do IFPUG: International Function Point Users Group www.ifpug.org

Site do BFPUG-Brazilian Function Point Users Group www.bfpug.com.br 

LivroAnálisedePontosdeFunção  – Medição,Estimativas  e Gerenciamento de Projetos de Software 3ª. edição, Carlos Eduardo Vazquez, Guilherme Siqueira  Simões e Renato Machado Albert.

Editora Érica, 2003.

Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

   F eedb ac   k  

     D

o     

s      

 b  

 r  

  e

  e

  s

  t    a     e    d

  i    ç     ã       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

Usando todo o poder do TDataSetProvider Usufrua de todos os recursos do DataSetProvider em suas aplicações

X

Adriano Santos ([email protected])

é desenvolvedor Delphi desde 1998. Professor e programador PHP. Bacharel em Comunicação Social pela Universidade Cruzeiro do Sul, SP. É Editor Técnico, Colunista e Membro da Comissão Editorial da revista ClubeDelphi e WebMobile. Mantém o blog Delphi to Delphi (www.delphitodelphi.blogspot.com) com dicas, informações e tudo sobre desenvolvimento Delphi.

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.*; 6(+*)"(&)&32 *+ 2(2031)< G3'31+2 + -.3 F# &3 1)(2 (*03; '322)*03 *3223 6+17+*3*03 3 &(6)2 )@)*C)&)2 7)') .2.A'.(' )+ 1#4(1+ &3 2.)2 7'+7'(3&)&32 3 1:0+&+2< L1 6+*H.*0+ 6+1 +2 6 +17+*3*032 3HC@2  8% $44 + 3'#'/$#V%5=*?$%   : 6)7)B &3 '3)"(B)' (*W13')2 0)'3A)2< G3'31+2 *3223 )'0(/+E } ]*0'+&.CD+ )+ K)0)X30I'+@(&3'[ } O+1+ .2)' + s7&)03Q+&3 3 I'+@(; &3'b")/2[ } O+*A(/.')*&+ &(*)1(6)13*03 + s7&)03Q+&3 3 I'+@(&3'b")/2[ } s2+ &3 O+*20')(*02[ O'()'31+2 &(@3'2+2 34317"+2 7)') 3*03*&3'1+2 6+''30)13*03 6)&) A.*6(+; *)"(&)&3 &+ 3'#'/$#V%5=*?$%[

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 &)&+2 0')A3/)&+2 *) '3&3 31 .1) )7"(6); CD+ &.)2 6)1)&)2 R_0V+;0(3'` +. _6"(3*0r 23'@3'`U +. _*` 6)1)&)2 R_*;0(3'`U< \+&) 3 -.)"-.3' '3-.(2(CD+ A3(0) 73") )7"(6)CD+ 6"(3*03 : 3*@()&) )+ 3'#'/$#V%5=*?$%  -.3 7+' 2.) @3B 23 3*6)''3/) &3 2+"(6(0)' +2 &)&+2 )+ 23'@(&+' &3 )7"(6)CD+< ! %$4>,# 4$# , +. 23H), + '32."0)&+ &) '3-.(2(CD+ : 317)6+0)&+ R_K)0) I)6•302`U 3 3*@()&+ &3 @+"0) N )7"(6)CD+ 6"(3*03< n.)"-.3' 3463CD+ "3@)*0)&), 23H) *) '3-.(2(CD+ +. *+ '363>(13*0+ &+2 &)&+2, : '30+'*)&) ) )7"(6)CD+ 6"(3*03< I+&3;23 &(B3' -.3 ) .0("(B)CD+ 1)(2 6+1.1 &+ 3'#'/$#V%5=*?$%   : A3(0) 31 6+*H.*0+ &+2 6+17+*3*032 &) 7)"30) 3HC@8%$44  )6'326(&+ &+ 6+17+*3*03 +,*$"#3'#'/$#< s1 34317"+ &3 .2+ 7+&3 23' @(20+ *) 3 : -.3 + 3'#'2 /$#V%5=*?$%  7+&3 23 0+'*)' 1)(2 &+ -.3 .1 2(17"32 6+17+*3*03 &3 6+*34D+ 6+1 + >)*6+ &3 &)&+2 7+' 23' A)'0+ &3 7'+7'(3&)&32 3 3@3*0+2<

Constraints e DataSetProvider O+1+ 2)>31+2, )2 (5"4#%'*"#4 &3 .1) )7"(6)CD+ 7+&31 23' (*23'(&)2 &3 &(@3'2)2 A+'1)2 31 .1) )7"(6)CD+< L1 )7"(6)CJ32 #M52#*$%c   7+' 34317"+, 031+2 )73*)2 &+(2 "./)'32 +*&3 3")2 7+&31 23' ( *6".?&)2E *+ ")&+ 4$%=*?5% +. *) '8,*('`a5 (,*$"#$ < 9+ 23'@(&+' &3@31+2 (*23'(;")2 &('30)13*03 *+ X=8K )0')@:2 &3 /#5%$? V%5($?>%$4c ?5:'*"4c %>,$4 , #%*JJ$%4 $#( < p .1) 3463"3*03 (&:(), 7+(2 63*0')"(B)1+2 *+22)2 '3/')2 &3 *3/M6(+2 31 .1 W*(6+ "./)'< I+':1, 6+''31+2 + '( 26+ &3 A(6)'1+2 7'32+2 )+ >)*6+ &3 &)&+2 -.3 320)1+2 0')>)"F) *&+ 7+' 6+*0) &) "(*/.)/31 317'3/)&) *+ X=8K< L1 +.0')2 7)")@')2 -.)*&+ 7'+/')1)1+2 &('30)13*03 *+ >)*6+ *36322(0)1+2 .2)' ) "(*/.)/31 &3 7'+/')1)CD+ Xnj, 0)1>:1 6F)1)&) %9X], 7)') 6'()' *+22)2 7'M7'()2 (*20' .CJ32< ]22+ 7+&3 23 0+'*)' .1) &+' &3 6)>3C) 31 .1) 3@3*0.)" 1.&)*C) &3 >)*6+ &3 &)&+2 +. 1321+ 23 + 7'+&.0+ @(3' ) 23' 6+13'6()"( B)&+ 6+1 8K€2 &(A3'3*; 032< ]1)/(*3 .1 2+A0V)'3 -.3 7'36(2) 23' 6)7)B &3 23 6+*360)' )+2 >)*6+2 ]*03'>)23rb('3>('&, Xnj X3'@3' gxxh 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

&3 &323*@+"@(13*0+, + -.3 )6)''30)'() 31 (*6+*2(20^*6() &+2 &)&+2< L1 )7"(6)CJ32 "2#*$%  R1."0(;6)1)&)2U 7+&31+2 '36+''3' )+ 7+&3'+2+ K)0)X*)7 3 7'+/')1)' *+22)2 '3/')2 &3 *3/M6(+ &('30)13*03 *+ 23'@(&+' &3 )7"(6)CD+, 0+'*)*&+ ) )7"(6)CD+ 1)(2 6+*2(203*03 3 (*03"(/3*03< L22)2 '3/')2 '32(&31 *+ 6M&(/+ A+*03 &+ 23'@(&+' &3 )7"(6)CJ32, 3 A(6)1 63*0')"(B)&)2< a32.1(*&+, .1) &)2 13"F+'32 )"03'*); 0(@)2 63'0)13*03 : A)B3' .2+ &320) W"0(1) +7CD+, +. 23H), .0("(B)' .1 23'@(&+' &3 )7"(6)CD+ -.3 A)'# + (*03'6q1>(+ 3*0'3 L'"?5 ?$ ?'?54 RX=8KU 3 '8,*('`a5 (,*$"#$c 7+(2 )":1 &3 7'+7(6()' 1)(+' 6+*0'+"3 2+>'3 )2 '3/')2 &3 *3/M6(+2, )(*&) 7+; &31+2 &(27+*(>("(B)' ) )7"(6)CD+ 7)') )6322+ '31+0+ )0')@:2 &) (*03'*30<

Propriedades do TField %"/.1)2 7'+7'(3&)&32 0+ ;A*$,? 2D+ ).0+1)0(6)13*03 7)22)&)2 &) )7"(6)CD+ 23'@(&+') 7)') + 6"(3*03 3 ) 1)(+'() &+2 @)"+'32 2D+ &303'1(*)&+2 31 0317+ &3 7'+H30+ >)23)*&+;23 *) 320'.0.') &) 0)>3") *+ X=8K< I+; &31+2 .2.A'.(' &3 )"/.*2 '36.'2+2 2+13*03 &(27+*?@3(2 *)2 7'+7'(3&)&32 &+ ;A*$,? , 23 H) 31 )7"(6)CJ3 2 4*"J,$ #*$% , #M52#*$% +. "2#*$% 3 -.3 *D+ 320D+ &(27+*?@3(2 *+ K)0)X*)7< L1 2.1), : 7+22?@3" 6'()'1+2 73-.3*)2 (5"4#%'*"#4 &('30)13*03 *) )7"(6)CD+ 6" (3*03 3 -.3 7+&31 23' A)6("13*03 6+*A(/.')&)2<

Figura 1. Exemplo de uso do componente DataSetProvider

]22+ : >)20)*03 (*03'322)*03, @(20+ -.3 '3&.B &')20(6)13*03 ) -.)*0(&); &3 &32*36322#'() &3 6M&(/+ 3 )(*&) 73'1(03 -.3 23H)1 73'2+*)"(B)&)2 )2 13*2)/3*2 &3 3463CD+ /3')&)2< L22)2 7'+7'(3&)&32 2D+E } R+(# S"7TE O+1+ + 7'M7'(+ *+13 (*&(6), 7+&31+2 _230)'` .1 6)17+ 6+1+ 2+13*03 "3(0.')[ } R+U,/$+#E L22) 7'+7'(3&)&3 320)*&+ 6+*A(/.')&) 6+1+ \'.3, A)B 6+1 -.3 ) )7"(6)CD+ +>'(/.3 + .2.#'(+ A(*)" ) &(/(0)' .1 @)"+' *3")< ='+223(')13*03 A)")*&+, 6)17+2 9+0 9."" *+ >)*6+ &3 &)&+2 2D+ A+'032 6)*&(&)0+2 ) 23'31 6)17+2 a3-.('3&, 0)*0+ :, -.3 -.)*&+ )&(6(+*)1+2 .1 6)17+ 9+0 9."" )+2 b(3"&€2 L&(0+'€2 &+ K)0)X30, 3203 H# @31 6+1+ \'.3 31 2.) 7'+7'(3&)&3[ } K+V(,7)GWE$+--/8" E G)"+' 7)&'D+ 7)') (*23'CD+ *+ >)*6+ &3 &)&+2< %-.( 7+&31+2 6+*A(/.')' .1 @)"+' -.3 23'# /')@)&+ *+ >)*6+ 6)2+ 3203H) @)B(+[ } F,-)81F8"-)$(/") E p 34)0)13*03 *322) 7'+7'(3&)&3 -.3 &3A(*(1+2 *+22) 6+*20')(*0< K(/(0)1+2 ) 347'322D+ 3 7+203; '(+'13*03 + 2(2031) A)'# ) @)"(&)CD+< L4(&) )+ .2.#'(+ A(*)" &) )7"(6)CD+[ K3@31+2 *+2 "31>')' -.3 (22+ 0.&+ 2M : 7+22?@3" 6+1 6)17+2 73'2(203*032, +. 23H), 6+1 0(7(A(6)CD+ &3 6)17+2 *+ 7'+H30+< L223 '36.'2+ : .0("(B)&+ -.)*&+ )&(6(+*)1+2 +2 6)17+2 &) 0)>3") *+ A*$,?p4 C?*#5% &+ ;3'#'/$# , &+ 6+*0'#'(+ *D+ 23'# 7+22?@3"< !.0')2 &.)2 (*A+'1)CJ32 2D+ (17+'0)*; 0?22(1)2< % 7'(13(') : -.3 )2 13*2)/3*2 &3 3''+ 2D+ '32."0)*032 &) @(+")CD+ &)2 '3/')2 (17+20)2 *+2 ;A*$,?p4  &+ ;3'#'/$# , 3 6+*23-ƒ3*0313*03 /3')'D+ 3463CJ32< X3 +.0')2 '3/')2 0)1>:1 A+'31 &3A(*(&)2 *+ 23'@(&+' &3 &)&+2, +. 23H), &('30)13*03 *+ X=8K, 320)2 0)1>:1 "3@)*0)'D+ 3463CJ32, 7+':1 2+13*03 .1) &)2 &.)2 13*2)/3*2 23'# 34(>(&)< % 23/.*&) (*A+'1)CD+ &(B '3273(0+ N )"03')CD+ &3 '3/')2 *+ X=8K< %"/.1)2 &)2 '3/')2 &3 *3/M6(+2 (1; 7+20)2 &('30)13*03 *+ 8K 7'36(2)1 23' '37"(6)&)2 7)') ) )7"(6)CD+, 6+1+ : + 6)2+ &3 6)17+2 '3-.3'(&+2 R_a3-.('3€2`U< O)2+ 1+&(A(-.3 &3 ;%>$ 7)') A',4$ +. @(63;@3'2) 31 .1 &303'1(*)&+ 6)17+, 3203 7'36(2) 23' '31+@(&+ +. )"03')&+ 31 0317+ &3 7'+H30+< G3H)1+2 .1 34317"+E %>') + K3"7F( 3 6'(3 .1) *+@) )7"(6)CD+ .2)*&+ A*,$qN$Mr788,*('#*5"  3 2)"@)*&+;) 6+1+ _I'+73'0(32('&, *+'; 1)"13*03 31 +et7%T>*=54 ?$ V%5J%':'4t

Propriedade adicionais do TField usadas pelo DataSetProvider

A*%$L*%?tA*%$L*%?uX$%4a5t$@':8,$4t$:82 L>*,?tC:8,56$$Q&?L< O+*3603 + /sK3'#'/$# )+ /sK+5""$(#*5"  .2)*&+ ) 7'+7'(3&)&3 /sK+5""$(#*5"  3 31 23/.(&) &(/(03 )

%/+') @3H)1+2 )"/.1)2 &)2 7'+7'(3; &)&32 1)(2 (17+'0)*032 31 .1 ;A*$,? 3 -.3 2D+ .0("(B)&)2 A+'0313*03 73"+ 3'#'/$#V%5=*?$%< % 7'+7'(3&)&3 18#*5"4 &+ 3/V R_K)0)X30I'+@(&3'`U 2.7+'0) ) 7)22)/31 &3 7'+7'(3&)&32 )&(6(+*)(2 &+ ;A*$,?p4< n.)*&+ 6+*A(/.')1+2 6+1+ ;%>$ ) 7'+7'(3&)&3 85!"(A*$,?V%584 , 7+&3; 1+2 7)22)' 7'+7'(3&)&32 &+ ;A*$,? 7)') + 3/V< L22)2 7'+7'(3&)&32 2D+E

(*20'.CD+ Xnj ) 23/.(' 7)') 23"36(+*)' +2 &)&+2 &) 0)>3") /7KC/ &+ >)*6+< SELECT * FROM SALES

%'')203 )/+') .1 3'#'/$#V%5=*?$% 3 .1 +,*$"#3'#'/$# &) 7)"30) 3'#' 7(($44< j(/.3 + 3'#'/$#V%5=*?$% )+ /sK3'#'/$# 73") 7'+7'(3&)&3 3'#'/$# 3 + +,*$"#3'2 #'/$# )+ V%5=*?$%   .2)*&+ V%5=*?$%N':$< %>') 23. /3'3*6()&+' &3 >)*6+ &3 &)&+2 7'3A3'(&+ 3 @(2.)"(B3 ) 320'.0.') &) 0);  >3") /7KC/ R3") /7KC/ )+ A*$,?p4 C?*#5% &+ +,*$"2 #$3'#'/$# .2)*&+ + 13*. &3 6+*0340+ 3 ) +7CD+ 7?? ',, &*$,?4Q L1 23/.(&) 6"(-.3 31 6)&) 6)17+ 3 +>23'@3 ) 7'+7'(3&)&3 B$T>*%$?< I3'63>) -.3 6)&) 6)17+ N5# N>,, 03@3 2.) 7'+7'(3&)&3 B$T>*%$? 1+; &(A(6)&) 7)') ;%>$ , (22+ 2(/*(A(6) -.3 +

w 7,*J":$"#x w +>%%$"(6x w 3*48,'6A5%:'#x w 3*48,'6K'L$,x w 3*48,'6D*?#0x w C?*#A5%:'#x w C?*#9'4Ox w 9'@X',>$x w 9*"X',>$x w X*4*L,$x

! -.3 7+.6+2 2)>31, : -.3 7+&31+2 6+*A(/.')' +.0')2 7'+7'(3&)&32 &+ 3/V 6)7)B32 &3 *+2 ).4("()' 31 &(@3'2)2 0)'3A)2< %(*&) *) 7'+7'(3&)&3 18#*5"4 @3H)1+2 )"/.1)2 &3")2E }  85B$'?1",6e K32)>("(0) -.)"-.3' )"; 03')CD+ *+ K)0)X30 "(/)&+ ) 3")[ } 853*4'L,$!"4$%#4e K32)>("(0) ) (*23'CD+ &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 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+0D+ &3 )"03')CD+ 3 *+03 + 3''+ RU<

Figura 3. Configuração do TField adicionado au tomaticamente

]22+ )6+*0363, 7+'-.3 (*A+'1)1+2 )+ 3/V -.3 *D+ : 73'1(0(&) ) )"03')CD+ &3 '3/(20'+2 7+' 7)'03 &) )7"(6)CD+ 6"(3*03, "+/+ ) 13*2)/31 _O"(3*0K)0)X30ZE Q+; &(A(6)0(+*2 )'3 *+03 )""+V3&(&+ : &(A3'3*03 &3 N>,,R_G)']29.""`U 3 &(A3'3*03 &3 ='E*5R_G)']2L170u`U< I+' A(1, @3'(A(6)1+2 23 + @)"+' &+ 6)17+ 1B3CBu37;C *D+ : 2.73'(+' )+ /\!Vu 37;C< f)@3*&+ -.)(2-.3' &(@3'/^*6() .1) 3463CD+ : "3@)*0)&)<

Usando o evento OnUpdateData ! 3@3*0+ 1")8?'#$3'#'   +6+''3 .1) @3B )+ (*(6()' ) )7"(6)CD+ &+2 &)&+2 *+ 23'@(&+', +. 23H), *+ '363>(13*0+ &+2 '3/(20'+2 K3"0) &+ +,*$"#3'#'/$#< p *3223 1+13*0+ -.3 (*03'6370)1+2 )2 1+&(A(; 6)CJ32 3 )63(0)1+2 +. )0: 1+&(A(6)1+2 +2 &)&+2 23 *36322#'(+< %-.( 0)1>:1 7+&31+2 3*@()' 13*2)/3*2 N )7"(6)CD+ 6"(3*03 6)2+ 23H) *36322#'(+< G3H) ) )22(*)0.') &+ 3@3*0+ "+/+ 31 23/.(&)E OnUpdateData(Se nder: TObject; DataSet: TClientDataSet);

} /$"?$%e 3/V -.3 &(27)'+. + 3@3*0+[ } 3'#'/$#e I)6+03 &3 &)&+2, 3'#' V'(O$#x 9+ 6)2+ &+ 3@3*0+ )*03'(+', H$&5%$)8?'#$2 3'#' , *D+ 031+2 )6322+ 0+0)" )+2 &)&+2 -.3 320D+ @(*&+, 3 2(1 ) .1 '3/(20'+ 31 7)'0(6.; ")'< z# *+ 6)2+ &+ 1")8?'#$3'#' , '363>31+2 + 3'#'/$# , -.3 6+*0:1 0+&+2 +2 &)&+2 )"03'); &+2 3 *D+ )"03')&+2< X3*&+ )22(1, 7+&31+2 "3' (*&(@(&.)"13*03 + 20)0.2 &3 6)&) '3/(2; 0'+ &) 0)>3") )0')@:2 &+ 3$,#'< ]*2(') 1)(2 .1 6+17+*3*03 +,*$"#3'#'/$#R_K3"0)`U 3

.1 3'#'/5>%($R_K)0)X+.'63Z`U )+ 2(2031)< K326+*3603 + +,*$"#3'#'/$# &+  8%5=*?$% "(17)*&+ ) 7'+7'(3&)&3 V%5=*?$%N':$< O+*3603 + 3'#'/5>%($_ )+ 3$,#'< ]*2(') .1 H>##5" 3 .1 3H.?1+2 N 7'+7'(3&)&3 3'#' &+ 3$,#' + 6+*03W&+ &) 7'+7'(3&)&3 3$,#' &+ +,*$"#3'#'/$#_ , -.3 6+*0:1 +2 &)&+2 +'(/(*)(2 )6'326(&+ &)2 )"03')CJ32

3A30.)&)2< L436.03 + 7'+/')1), 3A30.3 )"/.1)2 )"03')CJ32 *) 0)>3") 3 31 23/.(; &) 6"(-.3 *+ >+0D+ 3$,#'< I3'63>) -.3 + g„ 3H'3@3 &326' (CD+ &3 6)&) 7)'q130'+ &+ 3@3*0+, >31 6+1+ 2.) )22(*)0.')E

Listagem 2. Código do botão Delta procedure  TForm1.Button2Click(Sender: TObject); begin try   Delta.Close; Delta.Data := ClientDataSet1.D elta;   Delta.Open; except MessageDlg(‘Sem registros no Delta’, mtWarning, [mbOK], 0);   end; end;

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(>(&) *) 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 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.) 6"#.2.") D0$%$ 7)') -.3 + '3/(20'+ 23H)

)0.)"(B)&+< X.7+*&+ -.3 *+22) 0)>3") 7+22.( +2 6)17+2 !3c N19Cc CN3C2 BC+1c +!373Cc C/;731 3 ;CKCA1NC , 23*&+ -.3 )73*)2 + 6)17+ !3 : 6F)@3, (1)/(*3 ) (*20'.CD+ 1+*0)&) 73"+ 3/V -.)*&+ )73*)2 + 6)17+ ;CA1NC A+223 )"03')CD+< G3H)E UPDATE CLIENTES SET TELEFONE=’555-5525’ WHERE ID=ID, NOME=NOME, ENDERECO=ENDERECO, CIDADE=CIDADE, TELEFONE=TELEFONE

I3'63>) -.3 ) 6"#.2.") D0$%$  7+22.( 0+&+2 +2 6)17+2 &) 0)>3"), + -.3 : &32*3; 6322#'(+< X3 + 1321+ 6)2+ A+223 )7"(6)&+ .0("(B)*&+ ) +7CD+ >8D0$%$+0'"J$? ) (*20'.CD+ 23'()E UPDATE CLIENTES SET TELEFONE=’555-5525’ WHERE TEFONE=TELEFONE

93223 6)2+ 03'?)1+2 7'+>"31)2, 7+(2 7+; &3'?)1+2 73'&3' ) '3A3'^*6() 3 )0.)"(B)' + '3/(20'+ (*6+''30+< ! 13"F+' &3 0+&+2 +2 6)2+2 : .2)' ) +7CD+ >8D0$%$y$61",6 -.3 1+*0) ) (*20'.CD+ .2)*&+ )73*)2 +2 6)17+2 &) 6F)@3 7'(1#'(), 34E UPDATE CLIENTES SET TELEFONE=’555-5525’ WHERE ID=ID

I+' A(1 '320)1 )2 6+*A(/.')CJ32 &+2 6)17+2 *+ +,*$"#3'#'/$#< 93223 6)2+ ) 6+*A(/.')CD+ )6+*0363 6)17+ ) 6)17+ *+2 A*$,?p4 C?*#5% &+ +>H30+< ! 7'(*6(7)" +>H30(@+ &+2 V%5=*?$%A,'J4   : (*A+'1)' )+ 3'#'/$#V%5=*?$%  -.)" ) 7'+@(&^*6() 23'# 0+1)&) 6+1 6)&) 6)17+< ! 1)(2 (17+'0)*03 : 3*03*&3' -.3 *31 0+&+2 +2 6)17+2 7'36(2)1 23' )"03')&+2 *+  >)*6+ &3 &)&+2, 6+1+ 6)17+2 @(*&+2 &3  W5*"4 6+1 +.0')2 0)>3")2< O+1+ (*A+'1)' 3/V -.3 &303'1(*)&+ 6)17+ 73'03*63 ) +.0') 0)>3") 3 *D+ : *36322#'(+ /')@#;"+P p )? -.3 3*0')1 +2 V%5=*?$%A,'J4< X.)2 +7CJ32 2D+E }  8& !")8 ?' #$ e   O)17+ (*6".2+ *+2 )8?'#$4x } 8&!"D0$%$e  O)17+ (*6".2+ *) 6"#.2.; ") D0$%$x s2)&+ 7)') 3*6+*0')' + '3/(20'+

+'(/(*)"[ }  8&!"y$6e  O)17+ 6F)@3[ s2)&+ 7)') 3*6+*0')' + '3/(20'+ +'(/(*)"[ } 8&\*??$"e  O)17+ +6."0+[ O)17+ (*; 6".2+ &+ 3'#' V'(O$# , 1)2 : .2)&+ )73*)2 7)') 3*6+*0')' + '3/(20'+ +'(/(*)"[ I)') 23' 1)(2 &('30+, 6)&) 6)17+ 31 .1 A*$,?p4 C?*#5% 7+&3 '363>3' .1

V%5=*?$%A,'J &(A3'3*03< L*0D+ 73*2)1+2

*) 23/.(*03 2(0.)CD+E *+22+ .2.#'(+ 3*0'+. *) 03") &3 6)&)20'+ &3 O" (3*032 3 )"03'+. )73*)2 + *+13 &+ 6"(3*03< %+ 3A30.)' .1 788,6)8?'#$4 , + 3/V 3*0') 31 )CD+ 3 A)'# ) 1+*0)/31 &) (*20'.CD+< % (*20'.CD+ 1)(2 23*2)0) -.3 + KXI 7'36(2) 1+*0)' 6+*2(203 )73*)2 31 A)B3' .1 )8?'#$  .2)*&+ 6+1+ 6)17+ &3 )"03')CD+ + 9+13, 3 *) 6"#.2.") D0$%$ *36322(0)1+2 )73*)2 &+2 6)17+2 &) 6F)@3, -.3 *3223 6)2+ @)1+2 (1)/(*)' + !3  &+ 6"(3*03< s1) (*20'.CD+ 23'()E UPDATE CLIENTES SET NOME=’JOSE DA SILVA’ WHERE ID=ID

I)') 6+*A(/.')' + +,*$"#3'#'/$#  &3 0)" A+'1) -.3 322) 23H) ) (*20'.CD+ >)23, 7'36(2)1+2 1+&(A(6)' +2 V%5=*?$%A,'2  J4   &+ 6)17+ !3   7)')') z8&!")8?'#$c  8&!"D0$%$c 8&!"y$6{< !2 &31)(2 6)17+2 A(6)1 6+*A(/.')&+2 )73*)2 6+1 )2 &.)2 7'(13(')2 +7CJ32< K322) A+'1) /)')*0(1+2 -.3 +2 &)&+2 23'D+ )0.)"(; B)&+2 6+''30)13*03<

Configurando dinamicamente UpdateMode e ProviderFlags L22) W"0(1) 30)7) &3 *+22+ )'0(/+ &31+*20') 6+1+ A)B3' ) 6+*A(/.')CD+ &+ )8?'#$95?$ 3 V%5=*?$%A,'J4  &(*); 1(6)13*03, + -.3 *) @3'&)&3 *D+ F# 23/'3&+ )"/.1< % 7'+7'(3&)&3 )8?'#$95?$ &+ 3'#'/$2 #V%5=*?$%  7+22.( )73*)2 0'^2 +7CJ32, 3 7)') 1+&(A(6#;") 31 0317+ &3 3436.CD+ )73*)2 )0'(>.) + @)"+' &('30)13*03 ) 2.) 7'+7'(3&)&3, @3H)E DataSerProvider1. UpdateMode := upWhereAll;

 z# + +,*$"#3'#'/$#  ) F(20M'() 1.&) &3 A(/.')< 93"3, 2.) 7'+7'(3&)&3 V%5=*2 ?$%A,'J4  : &+ 0(7+ 3*.13')&+, +. 23H), 7+&3 03' 1)(2 &3 .1 @)"+'< Q321+ )22(1 )(*&) : >)20)*03 2(17"32 &3 A)B3' ) (17"313*0)CD+< %73*)2 )0'(;  >.) + @)"+' 3*0 '3 6+"6F3032 )+ 6)17+ -.3 &323H) )&(6(+*)' +2 V%5=*?$%A,'J4 , 6+1+ 23/.3E ClientDataSet1.FieldByName(‘CustNo’). ProviderFlags := [pfInUpdate,pfInKey];

O+1+ 7+&3 @3', : 1.(0+ 2(17"32< XM : 7'36(2+ 0+1)' 1.(0+ 6.(&)&+ 31 -.)" + 1+13*0+ -.3 23'D+ )&(6(+*)&+2 +.

'30(')&+2 +2 )0'(>.0+2 &+ V%5=*?$%A,'J4 , 7+(2 0+&) ) '3/') &3 *3/M6(+ +. 7)'03 &3"), &373*&3 &322)2 7'+7'(3&)&32 >31 6+*A(/.')&)2<

Considerações finais ! 6+17+*3*03 ;3'#'/$#V%5=*?$%  )(*&) 7+22.( .1) 2:'(3 &3 +.0')2 A.*6(+*)"(; &)&32 -.3 *D+ 7.&3')1 23' @(20)2 )-.( 7+' 6+*0) &) 2.) 6+17"34(&)&3, 6+1+ 7+' 34317"+ N$4#$? 3'#'/$#4 3 + .2+ &3 7)6+032 &3 &)&+2 73'2+*)"(B)&+2 7)') 1+*0)/31 &3 #5O$"p4  &3 @)"(&)CD+ +. ,5J4 &3 3@3*0+< p )"0)13*03 '36+13*&#@3" A)B3' .1 320.&+ )7'+A.*&)&+ &3 0+&+2 +2 13; 6)*(21+2 3 0:6*(6)2 7') .0("(B)CD+ &3 0+&+2 +. 73"+ 13*+2 /')*&3 7)'03 &+2 '36.'2+2 &3223 A)*0#20(6+ 6+17+*3*03< ]17+'0)*03 0)1>:1 "31>')' -.3 : 73'A3(0)13*03 7+22?@3" .0("(B)' +.0')2 320'.0.')2 &3 6+17+*3*032 6+1 + KXI, 6+1+ 7+' 34317"+ ;3'#'H'4$4r ;s>$%6 r;3'#'/$#V%5=*?$%r;+,*$"#3'#'/$#<

Conclusão b)")' 2+>'3 ;3'#'/$#V%5=*?$%  *D+ : A#6(", @(20+ -.3 2.) 6+17"34(&)&3 :  >)20)*03 )"0) 3 ) -.)*0(&)&3 &3 '3 ; 6.'2+2 34(203*032 : A)*0#20(6)< ! .2+ &3 3'#'/$#V%5=*?$%   *+ &(););&(), A)B 6+1 -.3 ) 7'+/')1)CD+ 23H) 2317'3 .1) 6)(4(*F) &3 2.'7'32), H# -.3 2+; 1+2 6)7)B32 &3 &326+>'(' (*W13')2 A(*)"(&)&32 3 A.*6(+*)"(&)&32 7)') + 6+17+*3*03< I+' (22+ : '36+13*&#@3" -.3 23 320.&3 ) A.*&+ 0+&)2 )2 2.)2 7)'0(6.")' (&)&32< 93223 )'0(/+ @( 1+2 +2 7'(*6(7)(2 )27360+2 &) 7'+/')1); CD+ 6+1 3/V  3 23.2 7'(*6(7)(2 '36.'; 2+2, &(6)2 3 1)63032< L273'+ -.3 03*F)1 /+20)&+< s1 A+'03 )>')C+ 3 )0: ) 7'M4(1)<

Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

   F eedb ac   k  

     D

  e   s   t    a

    e   i   d    ç     ã       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

ClientDataSet Automatizando o tratamento de Erros

n

Rodrigo Lazoti ([email protected])

é programador e desenvolvedor Delphi, .Net, Java,Php e Asp. Possui certificação SCJP e atualmente trabalha como consultor J2EE.

.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"+ X=8K, 2)>3 + -.)*0+ @)( 23' W0(" ) .0("(B)CD+ &3223 6+17+*3*03 R6'()&+ *3203 )'0(/+U, 7+(2 6+1 3"3 *D+ 23'# 1)(2 *36322#'(+ 03' -.3 (17"313*0)' )"/.1 1:0+&+ &3 0')0)13*0+ 31 0+&+2 +2 6+17+*3*032 O"(3*0K)0)230 327)"F)&+2 73"+ )7"(6)0(@+< ! 7'(*6(7)" +>H30(@+ &3223 6+17+; *3*03 : '30(')' &+ &323*@+"@3&+' ) *36322(&)&3 &3 (17"313*0)' '+0(*)2 7)') 0')0)' +2 3''+2 '30+'*)&+2 *+ >)*; 6+ &3 &)&+2 )0')@:2 &+2 3@3*0+2 !*; a36+*6("3L''+' 3 !*I+20L''+'< 93223 )'0(/+ ('3( 6'()' 3223 *+@+ 6+17+*3*03 &3'(@)&+ &) 6")223 \O"(3*0K)0)230< !2 3''+2 0')0)&+2 73"+ 6+17+*3*03 2D+ >)23)&+2 *)2 13*2)/3*2 '30+'; *)&)2 .0("(B)*&+ + >)*6+ &3 &)&+2 b('3>('&<

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 .23 +.0') @3'2D+U, *+ 13*. 7'(*6(7)", 3*0'3 *) +7CD+ O+17+*3*0  93V O+17+*3*0< O+1 (22+ 23'# )>3'0) ) 03") &) '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 Ancestor type Class name Palette Page Unit file name

Valor TClientDataset TMyClientDataset ClubeDelphi C:\Arquivos de programas\Borland\Delphi7\Lib\MyclientDataset.pas

Descrição Contém a classe que nosso componente será derivado. O nome da classe do novo componente O nome da aba onde o componente será instalado. 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 unit MyClientDataSet; interface uses SysUtils, Classes, DB, DBClient; type TMyErrors = (meViolacaoChav e, meValidacao, meChavePrimaria , meChaveEstrange ira, meConflito, meOutros); type TMyClientDataSet = class(TClientDat aSet)   private { Private declarations }   protected { Protected declarations }   public { Public declarations }   published { Published declarations }   end; procedure Register; implementation procedure Register; begin RegisterComponen ts(‘ClubeDelphi’, [TMyClientDataS et]); end; end.

Listagem 2. Declarando novos métodos no componente   private { 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);

*3*03 3 (*2(') ) 6+&(A(6)CD+ &+2 1:0+&+2 6+*A+'13 ) ./-)(0+1 ;< ! 6M&(/+ 320# 0+&+ 6+13*0)&+ 7)') A#6(" 3*03*&(13*0+< I'+*0+, *+22+ 6+1; 7+*3*03 320# A(*)"(B)&+, 2)"@3 ) .*(0< 9+ 13*. 7'(*6(7)" &+ K3"7F( 6"(-.3 31 O+17+*3*0  ]*20)"" O+17+*3*0< 9) +7CD+ s*(0 A("3 *)13 (*A+'13 + "+6)" 3 *+13 &) .*(0 6'()&), 6"(-.3 31 !t, 23'# )>3'0) .1) H)*3") 6+1 + 7)6+03 KOjsXa< KIt, 6+17("3 + 7)6+03, 6+1 (22+ + *+@+ 6+17+*3*03 H# 320)'# &(27+*?@3" 7)') + .2+< L473'(13*03 .0("(B)' + *+@+ 6+17+; *3*03 6+1 +2 6+17+*3*032 &+ &>L47'322 )6322)*&+ + b('3>('&, 3 @3H) -.3 3''+2 &+ 23'@(&+', 6+1+ @(+")CD+ &3 6F)@3, 23'D+ ).0+1)0(6)13*03 0')0)&+2<

Conclusão O+1+ @(1+2 *3223 )'0(/+, ) 6'()CD+ &3 6+17+*3*032 7+&3 *+2 )H.&)' ) *D+ 326'3@3' 6M&(/+2 '3730(0(@+2, 0+'*)*&+ ) 6'()CD+ ) 1)*.03*CD+ &+2 )7"(6)0(@+2 1)(2 A#6("<

Listagem 4. Codificando os métodos do componente constructor TMyClientDataSet.Create(aOwner: TComponent); begin // Associa os eventos aos métodos

inherited Create(aOwner); Self.OnPostError := MyPostError; Self.OnReconcileE rror := MyReconcileError; end; destructor TMyClientDataSet.Destroy; begin inherited Destroy; end; function TMyClientDataSet.DetectarErros(e: EReconcileError): TMyErrors; begin // Verifica qual o erro ocorrido pela mensagem 

if (Pos(‘VALIDATION ERROR’, UpperCase(E.Messa ge))0) then Result := meValidacao else if (Pos(‘VIOLATION OF FOREIGN KEY’, UpperCase(E.Message))0) then Result := meChaveEstrangei ra else if (Pos(‘VIOLATION OF PRIMARY OR UNIQUE KEY’, UpperCase(E.Message))0) then Result := meChavePrimaria else if (Pos(‘RECORD NOT FOUND OR CHANGED BY ANOTHER USER’, UpperCase(E.Mes sage))0) then Result := meConflito   else Result := meOutros; end; function TMyClientDataSet.DetectarErros(e: EDatabaseError): TMyErrors; begin // Trata Key Violation

if (Pos(‘KEY VIOLATION’, UpperCase(E.Message))0) then Result := meViolacaoChave   else Result := meOutros; end; procedure TMyClientDataSet.RetornarErros(cds: TClientDataSet; Err: EReconcileError ); Begin // Faz o tratamento do OnReconcileError // Cancela o Update

  cds.CancelUpdates;   cds.Refresh; // Trata o tipo de erro

 

case DetectarErros(E rr) of meValidacao: raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+

‘Valor inválido ou nulo foi encontrado em campos que contém restrições. ‘+ ‘Motivo: ‘ + Err.Message);   meChavePrimaria: raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+ ‘O registro não pode ser gravado, ocorreu um erro de duplicidade na chave primária. ‘+ ‘Motivo: ‘ + Err.Message);   meChaveEstrangeira: raise Exception.Create(‘Erro ao efetuar operação ‘ + cds.Name + ‘.’+#10#13+‘Dependência inválida entre tabelas ligadas. ‘ + ‘Motivo: ‘ + Err.Message);   meConflito: raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+ ‘O registro foi modificado ou deletado por outro usuário. ‘+ ‘Motivo: ‘ + Err.Message);   else raise Exception.Create(‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+ ‘Erro desconhecido: ‘+err.Message);   end; end; Procedure TMyClientDataSet.RetornarErros(cds: TClientDataSet; Err: EDataBaseError); Begin   cds.CancelUpdates;   cds.Refresh; case DetectarErros(Er r) of   meViolacaoChave: raise Exception.Create( ‘Erro ao salvar ‘ +cds.Name+ ‘.’+ ‘Já existe um registro com o código informado!’);   else raise Exception.Create( ‘Erro ao salvar ‘ + cds.Name + ‘.’+#10#13+ ‘Erro desconhecido: ‘+err.Message);   end; end; procedure TMyClientDataSet.MyPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin RetornarErros(S elf, E); end; procedure TMyClientDataSet.MyReconcileError( DataSet: TCustomClientDa taSet; E: EReconcileError ; UpdateKind: TUpdateKind; var Action: TReconcileActio n); begin RetornarErros(S elf, E); 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

Maikel Marcelo Scheid ([email protected])

é técnico em Informática com ênfase em Análise e Programação de Sistemas. Atua na área de Desenvolvimento de Softwares em Delphi para plataforma Win32 e .NET com banco de dados Firebird e MS SQL. É membro da equipe Editorial ClubeDelphi.

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, '30(')&)2 3 &3@+".CD+ &3 A("132 7+' 13(+ &3 .2.#'(+2 3 0)1>:1 ) &(27+; *(>("(&)&3 &3 6+*2."0)2< 9320) 30)7) &+ )'0(/+ A)'31+2 ) 6'()CD+ &3 7#/(*)2 7)') ).03*0(6)CD+ &3 .2.#'(+2 3 0)1>:1 7)') ).03*0(6)CD+ &3 )&1(*(20')&+'32 &+ 2(2031) &3 "+6)&+')< I)') '323'@)2, 6'()'31+2 .1) 7#/(*) 32736?A(6) )+2 .2.#'(+2 +*&3 +2 132; 1+2 7+&3'D+ '3)"(B)' >.26)2 &3 A(" 132 3 '323'@)' +2 1321+2 7)') '30 (')&) *) "+6)&+')< \)1>:1 ) 6'()CD+ &3 .1) #'3) )&1(*(20')0(@) 7)') 3A30(@)CD+ &)2 '30(')&)2 A3(0)2 7+' 13(+ &3 '323'@)2 5",*"$ 3 1)*.03*CJ32 &3 317':20(1+2, 7+&3*&+ '3/(20')' *+@)2 "+6)CJ32 +. &3@+"@3*&+ A("132 "+6)&+2, 63*0')"(; B)*&+ 3203 7'+6322+ )+2 )&1(*(20'); &+'32 &) "+6)&+')<

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 32736?A(6+2 7)') 6+*34D+ 6+1 + b('3>('&< O'()1+2 0)1>:1 *+ )'0(/+ )*03'(+' )2 7#/(*)2 &3 1)*.03*CD+ &+2 /^*3'+2 3 @?&3+2 &) "+6)&+'), +*&3 6'()1+2 0+&+2 +2 *+22+2 6+17+*3*032 &3 6+*34D+ 3 732-.(2)2 *+ 6M&(/+ &) 7#/(*) R%>"#*:$U, 7'+6322+ 3203 -.3 03'# 6+*0(*.)CD+ *320) 23/.*&) 30)7) &+ )'0(/+<

Login de Usuários a30+1)*&+ + 7'+H30+ 6'()&+ *+ )'0(/+ )*03'(+', )7M2 '3)>3'0+ + 1321+ )&(6(+; *3 .1) *+@) 7/VQNC; V'J$c )0')@:2 &+ 13*. A*,$qN$Mr1#0$%r3$,80* &5% QNC; V%5]$(#4rN$M 7/VQNC; A*,$4r7/VQNC; V'J$ 3 )"03'3 23. *+13 7)') | "+/(*<

)274`< %&(6(+*3 )+ 6+'7+ &) 7#/(*) .1) 0)>3") &3 o "(*F)2 3 Z 6+".*) 6+1 Txx 7(43"2 &3 ")'/.')< 9) 7'(13(') "(*F)



&(/(03 + 0340+ _j+/(* &3 O"(3*032` 3 A)C) ) A+'1)0)CD+ &+ 0340+< 9) 23/.*&) "(*F) &) 0)>3") )&(6(+*3 .1) *+@) 0)>3") 6+1 g "(*F)2 3 g 6+".*)2 +6.7)*&+ Zxx† &) ")'/.') &(27+*?@3", +*&3 &3@3'# &(/(0)' *)2 "(*F)2 &) 7'(13(') 6+".*) + 0340+ _s2.#'(+` 3 _X3*F)` 3 *)2 "(*F)2 &) 23/.*&) 6+".*) )&(6(+*)' &+(2 6+17+; *3*032 ;$@#H5@F_040s23'`, _040X3*F)`U )"03')*&+ ) 7'+7'(3&)&3 ;$@#95?$ &+ #@#/$"0' 7)') _V'44M5%?`< %&(6(+*3 *) "(*F) T .1 H>##5"F_>0*j+/(*`U 3 *) W"0(1) "(*F) &) 0)>3") 6'(3 .1 ,*"O 7)') + ,5J*" &+2 )&1(*(20')&+'32, &('36(+; *)*&+ N 7#/(*) ,5J*"u'?:Q'48@ -.3 23'# 6'()&) *+ &36+''3' &+ )'0(/+< %6322)*&+ + 6M&(/+ &) 7#/(*) R.23 ) 036") &3 )0)"F+ A_[U, 6'(3 ) 6+*20)*03 _20'O+*34)+` *) #'3) !"#$%&'($ &) 7#/(*) (*A+'1)*&+ ) 4#%*"J &3 6+*34D+ 6+1 +  >)*6+< L223 @)"+' 23'# .2)&+ 1)(2 )&()*; 03 7)') -.3 + 6+17+*3*03  &L+5""$(#*5" )63223 + H3Q K) 1321) 1)*3(') 6+1+ .0("(B)&+ *+ )'0(/+ )*03'(+', &36")'3 ) 6+*20)*03 6+*A+'13 6M&(/+ ) 23/.('E

-

&3 (*A+'1)CJ32 6+''30)2 *) ).03*0(6)CD+, )"/.1)2 (*A+'1)CJ32 6+*0(&)2 *+ +>H30+ 23'D+ )'1)B3*)&)2 31 @)'(#@3(2 &3 2322D+ R/$44*5"U 7)') 23'31 .2)&)2 A.0.; ')13*03 7)') (&3*0(A(6)CD+ 3 @)"(&)CD+ &3 .2.#'(+2< %&(6(+*3 0)1>:1 H.*0+ )2 )4$4 &) 7#/(*) + "':$48'($ A*%$L*%?/sKQ 3'#'QA*%$L*%? -.3 7+22(>("(0)'# + 0')>)"F+ 6+1 + +>H30+2 &3 6+*34D+ 3 732-.(2) 7)') b('3>('&<

Validando usuários na página % @)"(&)CD+ &+2 .2.#'(+2 *) 7#/(*) :  >)20)*03 2(17"32 &3 23' (17"313*0)&)< j+6)"(B3 *+ 7'+H30+ + )4$% +5"#%5, >((5"2 #%5,$Q'4(@ 6'()&+ H# *+ (*?6(+ &+ )'0(/+ 3 6+1 .1 &.7"+ 6"(-.3 2+>'3 .1) #'3) 31  >')*6+, )63223 + 3@3*0+ K5'? &+ 1321+ +*&3 &3@3'# &(/(0)' )2 23/.(*032 "( *F)2 &3 6M&(/+E try LblUsuario.Text := Session[‘NOME’] . ToString; except   Response.Redirect(‘login.aspx’); end;



% 34(20^*6() &3 .1 >"+6+ #%6QQ$@($8# : 1.(0+ (17+'0)*03 *3203 0'36F+ &+ 6M&(/+ 7)') (*03'7'30)' ) 23/.(*03 2(0.)CD+E ; X.7+*&+ -.3 + .2.#'(+ 3203H) "+/)&+ *+ 2(2031), "+/+ ) /$44*5"z}N19Cp{ 03'# .1 @)"+' '3")6(+*)&+ 3 + 1321+ 23'# 34(>(&+ *+ KL,)4>'%*5 , 1)2 *+ 6)2+ &3 + .2.#'(+ *D+ 03' '3)"(B)&+ ) ).03*0(; 6)CD+ 3 ) 23CD+ N5:$ *D+ 34(20(', .1 0')0)13*0+ &3 3''+2 A)B 6+1 -.3 + >"+6+ $@($8# '3&('36(+*3 + .2.#'(+ &3 @+"0) N 7#/(*) &3 ,5J*" , (*(>(*&+ 23. )6322+ ) 0+&)2 )2 7#/(*)2 +*&3 + )4$% +5"#%5, 320(@3' 23*&+ .0("(B)&+<

Página de Reservas OnLine do cliente 9+ 13*. A*,$qN$Mr1#0$%r3$,80* &5% QNC; V%5]$(#4rN$M 7/VQNC; A*,$4r7/VQ NC; V'J$ 6'(3 .1) *+@) 7#/(*) 2)"@)*;

&+;) 6+1+ _.23'k'323'@)2'3 + L#"K5J*" , )&(6(+*3 )+ 23. 3@3*0+ 1"+,*(O + 6M&(/+ &) ./-)(0+1 2 '327+*2#@3" 7+' '3)"(B)' ) ).03*0(6)CD+ &+ .2.#'(+ 3 23*F) &(/(0)&+2 3 &('36(+*)' + .2.#'(+ ) 7#/(*) 6+''32; 7+*&3*03 *+ 2(2031)< ! 6M&(/+ .0("(B)&+ )6+17)*F) ) 130+&+"+/() 317'3/)&) *+ )'0(/+ &) 3&(CD+ )*03'(+', +*&3 "+/+ &3 (*?6(+ 6'()1+2 0+&+2 +2 6+17+*3*032 3 )0'(>.?1+2 ) 4#%*"J &3 6+*34D+ 6+1 +  >)*6+ )+ +5"" , 6+17+*3*03 &3 6+*34D+< L1 23/.(&) )0'(>.?1+2 ) 6+*34D+ )+ +>H30+ (*03'*+ &+ 3'#'7?'8#$% 6F)1)&+ /$,$(#+5::'"? < p 3"3 -.3 '363>3'# ) (*2; 0'.CD+ /sK &3 23"3CD+ &+2 &)&+2 31 2.) 7'+7'(3&)&3 +5::'"?;$@#< L1 23/.(&) )0'(>.?1+2 +2 7)'q13; 0'+2 &3 .2.#'(+ 3 23*F) 7)') ) /sK &3 23"3CD+ &+ +5::'"?;$@# )0')@:2 &+ +>H30+ ALV'%':$#$% 6'()&+ 3 (*20)*6()&+ 237)')&)13*03 7)') 6)&) 7)'q130'+ )&(6(+*)&+, +*&3 )+ A(*)" 3436.0)1+2 ) 6+*2."0) 3 '3")6(+*)1+2 + '32."0)&+ ) .1 +>H30+ AL3'#'B$'?$% -.3 23'# @3'(A(; 6)&+ -.)*0+ )+ 2.6322+ &+ ,5J*"Q 9+ 6)2+

procedure   TWebForm1.btnLogin_Click(sender: System.Object; e: System.EventArgs); var Comand: FbCommand; DataAdapter: FbDataAdapter; Conn: FbConnection; prUser : FbParameter; prSenha : FbParameter; fbReader : FbDataReader; begin { Criação dos objetos de conexão } Conn := FbConnection.Cr eate; DataAdapter := FbDataAdapter.Cre ate; Comand := FbCommand.Create ; { Atribuição da string de conexão e abertura do BD} Conn.Connection String := strConexao;   Conn.Open; { Atribuição dos atributos de seleção dos dados } DataAdapter.Sel ectCommand := Comand; DataAdapter.Sel ectCommand.Connec tion := Conn; DataAdapter.Sel ectCommand.Comman dText := ‘select clientes.nome, clientes.cod_cliente ‘ + ‘from clientes where ((clientes.login = ?) and (clientes.senha = ?))’; prUser := FbParameter.Crea te; prSenha := FbParameter.Cre ate;   DataAdapter.SelectCommand.Parameters.Add(prUser);   DataAdapter.SelectCommand.Parameters.Add(prSenha); DataAdapter.Sel ectCommand.Parame ters[0].Value := txtUser.Text; DataAdapter.Sel ectCommand.Parame ters[1].Value := txtSenha.Text; fbReader := DataAdapter.Selec tCommand.ExecuteR eader; if fbReader.Read then begin Session[‘USUARIO ’] := txtUser.Text; Session[‘NOME’] := fbReader[‘NOME’] .ToString; Session[‘CODIGO’ ] := fbReader[‘COD_CL IENTE’]   .ToString;   Response.Redirect(‘user_reservas.aspx’); end else   RegisterStartupScript(‘erro’,’javascript :alert(‘’Usuário ou Senha incorretos!’’);   ’); end;

*3*032 )+ 6+'7+ &3"), +'/)*(B)*&+;+2 '327360(@)13*03 &3 )6+'&+ 6+1 + ,'65># 34(>(&+ *) ##5"F_>0*X)('`U *) 23/.*&) "(*F), 23/.(&+ &3 .1) "(*F) 6+1 + 0340+ _Q(*F)2 j+6)CJ32 %0(@)2` (&3*0(A(; 6)*&+ + 6+*03W&+ ) 23' 6)''3/)&+ *+ 3'#':"4 '>#5:'#*(',,6 '# %>" #*:$< L1 23/.(&) 6"(-.3 *+ (031 H5>"? +5,>:" 31 7='*,'L,$ (5,>:"4   3 3*@(3;+ 7)') /$,$(#$? (5,>:"4< %/+') 23"36(+*3;+ 3 )0'(>.) + @)"+' +13uK1+7+71 *) 7'+7'(3&)&3 3'#' A*$,? , +*&3 '36 3;  >3'31+2 + @)"+' &+ 6)17+ *) 0)>3") K5('('5 )0')@:2 &+ %$4>,# 4$# &) /$,$(# -.3 A)'31+2 *+2 '3/(20'+2 6+1 4#'#>4 _9` (*&(6)*&+ j+6)CD+< K321)'-.3 0)1>:1 ) +7CD+ X*4*L,$ &) 6+".*)< %/+') (*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)>3; C)"F+`U, &(/(03 _\(0."+` 3 31 3'#' A*$,? + @)"+' ;!;)K1 -.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 \$'?$% #$@# 7)') _I'3@< K3@`< 31 3'#' A*$,? &(/(03 + @)"+' VBCXu3CX1K)+71 3 31 3'#' A5%:'##*"J C@8%$44*5" + @)"+' _‡xE&&rQQruuuuˆ` -.3 A)'# ) A+'1)0); CD+ &) A+'1) &3 34(>(CD+ &) &)0)< X3"36(+*)*&+ + J%*?B$4$%='4 , A)'31+2 6+*A(/.')CJ32 2313"F)*032 )2 )7"(6); &)2 *) 6+*A(/.')CD+ &+  J%*?K 5('('5 < O+1 + >+0D+ &('3(0+ &+ 1+.23 2+>'3 + 3'#'#5 A5%:'# 3 )7"(-.3 .1 320("+ &3 A+'1)0); CD+ )+ 1321+< 9+@)13*03 6+1 + >+0D+ &('3(0+ &+ 1+.23, )632 23 )/+') + (031 V%58$%#6 H>*,?$% +*&3 ('31+2 1+&(A(; 6)' ) 320'.0.') &) 6)03/+'() +5,>:"4c +*&3 *+ 0+7+ &) H)*3") &321)'-.3 + (031 +%$'#$ (5,>:"4 '>#5:'#*(',,6 '# %>" #*:$< L1 23/.(&) 6"(-.3 *+ (031 H5>"? +5,>:" 31 7='*,'L,$ (5,>:"4 3 3*@(3;+ 7)') /$,$(#$? (5,>:"4< %/+') 23"36(+*3; + 3 )0'(>.) + @)"+' +13uK1+7+71  *) 7'+7'(3&)&3 3'#' A*$,? , +*&3 '363>3'3; 1+2 + @)"+' &+ 6)17+ *) 0)>3") K5('('5 )0')@:2 &+ %$4>,# 4$# &) /$,$(# -.3 A)'3; 1+2 *+2 '3/(20'+2 6+1 /#'#>4 _a` 7)') a323'@)2< K321)'-.3 0)1>:1 ) +7CD+ X*4*L,$ &) 6+".*)< %/+') (*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*$,? + @)"+' ;!;)K1c 23*&+ 320)2 &.)2 6+".*)2 &3 (*;

A+'1)CJ32 -.3 23'D+ 6)''3/)&)2 )0')@:2 &+ %$4>,# &3 .1 4$,$(# 31 0+&+2 +2 @?&3+2 &(27+*?@3(2 7)') '323'@)< ! 7'+6322+ 7)') 6)''3/)13*0+ &)2 (*; A+'1)CJ32 '3-.3' -.3 Z 8%5($?>%$ 3 .1)  &>"(#*5" 23H)1 6'()&)2, 32736(A(6)*&+ 7)') 6)&) .1) &3")2 6+17+*3*032 -.3 23'D+ 6'()&+2 31 0317+ &3 3436.CD+ 6+*A+'13 34317"+2 )*03'(+'32 3 -.3 '3-.3'31 ) 6'()CD+ &3 .1) 6+*20)*03 _20'O+*34)+` 3 (*6".2D+ &) "':$48'($ A*%$L*%?/sKQ3'#'QA*%$L*%? *) 6"#.2.") )4$4Q K36")'3 *) 23CD+ V%*='#$ &+ 6M&(/+ ) 8%5($?>%$ 3 0)1>:1 ) &>"(#*5" 6+*A+'13 "(20) )&()*03 3 )&(6(+*3 ) 6)&) .1) &3")2 +2 '327360(@+2 6M&(/+2 3*6+*0')&+2 *) ./-)(0+1 4 , 23*&+ -.3 0+&+2 +2 7'+; 6322+2 3*6+*0')1;23 6+13*0)&+2 3*0'3 )2 "(*F)2 &+ 1321+< !>23'@3 -.3 7)') 6)''3/)' )2 "+6)CJ32 3 '323'@)2 )0(@)2 .0("(B)1+2 )73*)2 .1) A.*CD+, ) -.)" '3-.3' ) 7)22)/31 &+ 7)'q130'+ /#'#>4 &3 )6+'&+ 6+1 ) 2(0.)CD+ 6)&)20')" &+2 '3/(20'+2 -.3 &323H)1+2 34(>('E procedure  CarregaVideos; function   CriaListaVideos(Status: String):DataSet;

b(*)"(B)&) ) 6'()CD+ 3 6+&(A(6)CD+ &+2 1:0+&+2 7)') 6)''3/)' +2 &)&+2 &3 "+6)CJ32, '323'@)2 3 @?&3+2 7'36(; 2)1+2 A)B3' ) 6 F)1)&) &+2 1321+2< I)') (22+ .2)'31+2 + 3@3*0+ K5'? &) 7#/(*) +*&3 &3@3'# &(/(0)' )2 23/.(*; 032 "(* F)2 &+ 6M&(/+, -.3 ('D+ H+/)' + '32."0)&+ )+2 6+17+*3*032 '3")6(+*); &+2< !>23'@3 -.3 320)1+2 .0("( B)*&+ ) 1321) A.*CD+ 7)') 6)''3/)' )2 '323'@)2 3 "+6)CJ32, )"03')*&+ )73*)2 + @)"+' &+ 7)'q130'+ /#'#>4 '37)22)&) 7)') ) A.*60(+* e gridLocacao.DataSource := CriaListaVideos(‘’’N’’’); gridLocacao.DataBind; gridReservas.DataSource := CriaListaVideos(‘’’R’’) AND (LOCACAO.PREV_DEVOLUCAO >= ‘’TODAY’’’); gridReservas.DataBind; CarregaVideos;

X3 3436.0)' ) 7#/(*) *3203 1+13*0+,  H# 7+&3'# 73'63>3' -.3 0+&)2 )2 (*A+'; 1)CJ32 23'D+ "(20)&)2, 7+':1 )(*&) 320# &(27+*?@3" + 6)&)20'+ &3 *+@)2 '323'@)2< s1) *+@) '323'@) 23'# '3)"(B)&) ) 7)'0(' &+ (,*(O )+ >+0D+ L#"B$4$%='%  *+ -.)" )&(6(+*3 + 6M&(/+ &) ./-)(0+1 5<

-



Listagem 2. Codificando as ações para carregamento de vídeos, reservas e locações procedure   TWebForm2.CarregaVideos; var Comand: FbCommand; DataAdapter: FbDataAdapter; Ds: DataSet; Conn: FbConnection; begin { Criação dos objetos de conexão } Conn := FbConnection.Cr eate; DataAdapter := FbDataAdapter.Cre ate; Comand := FbCommand.Create ; { Atribuição da string de conexão e abertura do BD} Conn.Connection String := strConexao;   Conn.Open; { Atribuição dos atributos de seleção dos dados } DataAdapter.Sel ectCommand := Comand; DataAdapter.Sel ectCommand.Connec tion := Conn; DataAdapter.Sel ectCommand.Comman dText := ‘SELECT V.COD_VIDEO, V.TITULO FROM VIDEOS V ‘+ ‘WHERE V.COD_VIDEO NOT IN (SELECT LOCACAO.VIDEO FROM LOCACAO ‘+ ‘WHERE ((LOCACAO.VIDEO = V.COD_VIDEO) AND ((LOCACAO.STATUS = ‘’R’’) ‘+ ‘OR (LOCACAO.STATUS = ‘’N’’)))) ORDER BY V.TITULO’; { Criação em memória do DataSet auxliar } Ds := DataSet.Create; DataAdapter.Fil l(Ds, ‘Titulo’); Try { Popularização dos vídeos no componente da página } ddlVideos.DataSo urce := Ds;   ddlVideos.DataBind; finally   Conn.Close; end; end; function  TWebForm2.CriaListaVideos(Status: String): DataSet; var Comand: FbCommand; DataAdapter: FbDataAdapter; Ds: DataSet; Conn: FbConnection; prCliente : FbParameter; begin { Criação dos objetos de conexão } Conn := FbConnection.Cr eate; DataAdapter := FbDataAdapter.Cre ate; Comand := FbCommand.Create ; { Atribuição da string de conexão e abertura do BD} Conn.Connection String := strConexao;   Conn.Open; { Atribuição dos atributos de seleção dos dados } DataAdapter.Sel ectCommand := Comand; DataAdapter.Sel ectCommand.Connec tion := Conn; DataAdapter.Sel ectCommand.Comman dText := ‘SELECT LOCACAO.COD_LOCACAO, VIDEOS.TITULO, ‘ CLIENTES.NOME, ‘ + ‘LOCACAO.PREV_DE VOLUCAO, LOCACAO.DATA FROM ‘ + ‘ LOCACAO ‘ + ‘ INNER JOIN VIDEOS ON (LOCACAO.VIDEO = ‘ + ‘ VIDEOS.COD_VIDEO) ‘ + ‘ INNER JOIN CLIENTES ON (LOCACAO.CLIENTE = ‘ + ‘ CLIENTES.COD_CLIEN TE) ‘ + ‘WHERE ((LOCACAO.STATUS = ‘ + Status + ‘) ‘ AND (LOCACAO.CLIENT E = ?)) ORDER BY ‘ + ‘ LOCACAO.DATA’; { Criação dos parâmetros da pesquisa. O Status será configurado ao chamar a function } prCliente := FbParameter.Crea te;   DataAdapter.SelectCommand.Parameters.Add(   prCliente); DataAdapter.Sel ectCommand.Parame ters[0].Value := Session[‘CODIGO’].ToString; { Criação em memória do DataSet auxliar } Ds := DataSet.Create; DataAdapter.Fil l(Ds, ‘Titulo’); try { Joga o resultado do Select para o Result da função } Result := Ds; finally   Conn.Close; end; end;

Listagem 3. Código para reservar um vídeo procedure   TWebForm2.btnReservar_Click(sender: System.Object; e: System.EventArgs); var Comand: FbCommand; DataAdapter: FbDataAdapter; Conn: FbConnection; prVideo : FbParameter; prCliente : FbParameter; prData : FbParameter; prStatus : FbParameter; prDev : FbParameter; begin { Criação dos objetos de conexão } Conn := FbConnection.Cre ate; DataAdapter := FbDataAdapter.C reate; Comand := FbCommand.Create; { Atribuição da string de conexão e abertura do BD}

Conn.ConnectionS tring := strConexao;   Conn.Open; { Atribuição dos atributos de seleção dos dados }

DataAdapter.Inse rtCommand := Comand; DataAdapter.Inse rtCommand.Connect ion := Conn; DataAdapter.Inse rtCommand.Command Text := ‘INSERT INTO LOCACAO ‘+ ‘(VIDEO, CLIENTE, DATA, STATUS, PREV_DEVOLUCAO) ‘VALUES (?, ?, ?, ?, ?)’;   prVideo := FbParameter.Creat e; prCliente := FbParameter.Creat e; prData := FbParameter.Creat e; prStatus := FbParameter.Creat e; prDev := FbParameter.Creat e;   DataAdapter.InsertCommand.Parameters.Add(prVideo);   DataAdapter.InsertCommand.Parameters.Add(prCliente);   DataAdapter.InsertCommand.Parameters.Add(prData);   DataAdapter.InsertCommand.Parameters.Add(prStatus);   DataAdapter.InsertCommand.Parameters.Add(prDev); DataAdapter.Inse rtCommand.Paramet ers[0].Value := ddlVideos.SelectedValue; DataAdapter.Inse rtCommand.Paramet ers[1].Value := Session[‘CODIGO’].ToString; DataAdapter.Inse rtCommand.Paramet ers[2].Value := 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} if  DataAdapter.InsertCommand.ExecuteNonQuery> 0 then begin gridReservas.Data Source := CriaListaVideos (‘’’R’’) AND (LOCACAO.PREV_DEVOLUCAO >= ‘’TODAY’’’);   gridReservas.DataBind;   CarregaVideos; end; end;

! 6M&(/+ 0)1>:1 23 .0("(B) &) 6'()CD+ &+2 6+17+*3*032 31 '.*0(; 13 +*&3 7)22)1+2 .1) (*20'.CD+ Xnj )+ +>H30+ ]*23'0O+11)*& &+ K)0)%&)703' 3 6+*A(/.')CD+ &+2 7)'q130'+2 &3 6)&)20'+2< %+ 3436.; 0)'1+2 ) (*20'.CD+, 3 + '32."0)&+ A+' &3 2.6322+, 6F)1)1+2 +2 1:0+&+2 7)') -.3 ) 7#/(*) 23H) '36)''3/)&) 3 )2 (*A+'1)CJ32 )0.)"(B)&)2< j31>'3; 23 &3 )&(6(+*)' *)2 s232 &) 7#/(* ) + *)1327)63 K)03s0("2 &) -.)" 320)1+2 6F)1)*&+ .1) A.*CD+ 7)') ( *6'313*; 0)' 63'0) - .)*0(&)&3 &3 &()2 N &)0) &3 @3*6(13*0+ &) '323'@)< %&(6(+*3 0)1>:1 )+ 3@3*0+ 1"+,*(O &+ L#"/'*% + 6M&(/+ )&()*03 7)') A)B3' + '3; &('36(+)13*0+ &) 7#/(*) 3 )7M2 3436.03 ) 7#/(*) A)B3*&+ .1) *+@) '323'@) 7)') + .2.#'(+ ).03*0(6)&+< Response.Redirect(‘login.aspx’);

Conclusão 9D+ 73'6) ) 7'M4(1) 7)'03 &3203 )'0(/+, +*&3 6+*0(*.)'31+2 ) (17"313*0)CD+ &)2 '30(')&)2 3 &3@+".CD+ &3 A("132 7+' 13(+ &3 .2.#'(+2 3 0)1>:1 ) &(27+*(;  >("(&)&3 &3 6+*2."0)2<

Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

   F eedb ac   k  

     D

o     

s      

 b  

 r  

  e

  e

Dê seu voto sobre este artigo, através do link: www.devmedia.com.br/javamagazine/feedback 

  s

  t    a     e

  i   d    ç     ã       o

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

Ricardo C. Boaro ([email protected])

trabalha com desenvolvimento de sistemas em Delphi há mais de 10 anos e PocketStudio há 3 anos. Atualmente é gerente de informática na Di Hellen Indústria de Cosméticos, e atual como instrutor certificado Borland na Aquasoft Tecnologia da Informação parceira da Borland, em Porto Alegre – RS. Borland Instrutor, Delphi 7, 2007 e Certified.

+ )'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 ) (*6".2D+ &3 *+@)2 03")2 31 *+22+ 2(2; 031), 0)(2 6+1+E 6)&)20'+ &3 7'+&.0+2 3 &(/(0)CD+ &3 73&(&+2< j31>')*&+ -.3 *+22)2 03")2 *+ 2(2031) )73*)2 6+*2."0)1 ) >)23 &3 &)&+2 *D+ 7+22(>("(0)*&+ ) (*6".2D+ &3 '3/(20'+2< L22) 0)'3A) 23'# 3A30.)&) )0')@:2 &+ 2(*; 6'+*(21+ 3*0'3 &(27+2(0(@+ 3 IO< I+&3'?)1+2 6'()' 3 .0("(B)' ) 03") 7)') 3&(0)' +2 '3/(20'+2 3 3*@(#;"+2 )+ IO, 7+':1 31 *+22+ 34317"+ 23'# )73*)2 1)(2 .1) H)*3") &3 6+*2."0)< %2 03")2 -.3 ('D+ 1)*(7.")' (*A+'1)CJ32 2D+ )2 &3 73&(&+2 3 (03*2 &+ 73&(&+< ! 7'(13('+ 7)22+ : 6'()'1+2 ) 0)>3") 7'+&.0+2 7)') )'1)B3*)'1+2 +2 &)&+2 3 7+&3'1+2 *)@3/)' 3*0'3 +2 '3/(20'+2< j31>')*&+ -.3 322) 0)>3") 23'# 7'33*; 6F(&) *+ 1+13*0+ &+ 2(*6'+*(21+ 6+1

+ 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')' -.3 7+&31+2 .0("(B)' )2 036")2 &3 )0)"F+2 +;BK . /0*&# . / 7)') 2)"@)' *+22+ 7'+H30+< b3(0+ (22+ @)1+2 1+*0)' ) 0)>3") &3 7'+&.0+2< j+/+ )>)(4+ &) 7)")@') '323'@)&) !"#$%&'($ &36")'3 .1) 23CD+ )4$4  7)') )&(6(+*)'1+2 ) V/K -.3 : ) K*L%'%6 &+ I+6•30X0.&(+ +*&3 320D+ +2 1:0+&+2 *36322#'(+2 7)') 1)*(7.")'1+2 + 8K &3*0'+ &) )"*# V/3'#'L'4$< %7M2 ) 23CD+ )4$4 &36")')1+2 .1) *+@) 23CD+ +5"4# +*&3 (*A+'1)'31+2 + 3HN':$c 3H;68$ 3 +2 ?*&(632 7)') '36.73')CD+ 3 6+*A(/.; ')CD+ &+2 @)"+'32 *+2 6)17+2 &) 0)>3") &3 V%5?>#54< %7M2 ) &3A(*(CD+ &+2 6)17+2 3 23.2 '327360(@+2 ?*&(632, &36")')1+2 .1) 23; CD+ X'% , +*&3 (*A+'1)'31+2 )+ I+6•30X; 0.&(+ + A*$,?3$&4 3 .1 )'')u< \)1>:1 ('31+2 &36")')' )2 @)'(#@3(2 /"+>)(2 -.3



('D+ '3A3'3*6()' *+22) >)23 &3 &)&+2 31 0+&+ 7'+H30+< % 320'.0.') &3 0+&)2 )2 0);  >3")2 6'()&)2 *+ I+6•30X0.&(+ : 2317'3 ) 1321), 6+1+ .1) '363(0) &3 >+"+< Q.; &)1+2 )73*)2 *+13 &) 0)>3") 3 6)17+2, 1)2 ) 1)*3(') &3 1+*0)' 3 1)*(7.")' : 34)0)13*03 (/.)" 7)') 0+&)2< O+1+ *+ )'0(/+ )*03'(+' 6'()1+2 ) 0)>3; ") &3 6"(3*032, *D+ @+. 3*0')' 31 &30)"F32 &3 6+1+ A.*6(+*) 6)&) A.*CD+ 6'()&) 31 *+22) 0)>3")< %"03'3 ) )"*# V%5?>#543H 6+*A+'13 ) ./-)(0+1 23

Criando a Tela de Consulta a Produtos O'()&) ) 0)>3") &3 7'+&.0+2, @)1+2 )&(; 6(+*)' .1 *+@+ A+'1."#'(+ 7)') 6'()'1+2 ) 03") &3 6+*2."0)< 9+ 13*. 7'(*6(7)" &+ I+6•30X0.&(+ )63223 A*,$qN$MrA5%: 3 2)"@3;+ 6+1+ _sK)&+2I'+&.0+2+0J32 &) 7)'03 (*; A3'(+'< ! >+0D+ -.3 A(6)'# )+ ")&+ &+ 0?0."+ &+ A+'1."#'(+ 23 6F)1)'# _80*G+"0)'`< %*032 &3 6+&(A(6)'1+2 +2 >+0J32, 7'3; 6(2)1+2 6'()' .1) A.*CD+ 7)') 6)''3/)' +2 &)&+2 *) 03") &3 6+*2."0) 6+*A+'13

-

*)@3/)'1+2 3*0'3 +2 '3/(20'+2< I)') (22+ .0("(B)'31+2 )2 A.*CJ32 &) V/3'#'H'4$ &) V/K< I'322(+*3 A_[ *+ A+'1."#'(+ 7)') @(2.)"(B)' ) 7#/(*) &3 6M&(/+ 3 "+6)"(B3 ) 7)")@') '323'@)&) !:8,$:$"#'#*5"Q K36")'3 + 7'+63&(13*0+ &) ./-)(0+1 4 )>)(4+ &3 !:8,$:$"#'#*5"<

Listagem 1. Código completo da tabela de Produtos unit ProdutosDB; interface uses PSL; const ProdutosDBName = ‘ProdutosDB’; ProdutosDBType = Rsc(‘DBPR’); Prod_Codigo = 0; Prod_DescProd = 1; Prod_Preco = 2; Prod_Estoque = 3; Prod_Tam = 4; Prod_Un = 5; var FieldDefs : array[0..5] of TFieldDef = ((DataType: ftUInt16), (DataType: ftString), (DataType: ftDouble), (DataType: ftUInt32), (DataType: ftString), (DataType: ftString)); bProdutosInclui : Boolean; DBPro : TDatabase; function Open: Boolean; function Close: Boolean; function ProcuraCodigo(Codigo: UInt16): Boolean; implementation function Open: Boolean; var Atributos : UInt16; begin Result := PSDatabase.Open( DBPro, ProdutosDBName, dmModeReadWrite); if not Result then begin Result := PSDatabase.Create Database(Produtos DBName, Creator, ProdutosDBType); if Result then 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.

9) A.*CD+ +'%%$J'V%5?>#54 .0("(B)1+2 .1) @)'(#@3" H>&&$% -.3 : .1 7%%'6 &3 +0'% 7)') ).4("()' ) 0')*2A+'1)CD+ &+ 6M&(/+ &+ 7'+&.0+ &3 )!"#_i 7)') /#%*"J< I)') (22+ .0("(B)1+2 ) A.*CD+ /#%!;57< %7M2 (22+ '36.73')1+2 + @)"+' &+ 6)17+ 6M&(/+ &) 0)>3") 3 + 0')*2A+'1)'1+2 /#%*"J< I+' A(1 '363>31+2 + @)"+' 6+*;

Nota do DevMan Nas versões mais antigas do PocketStudio, principalmente as versões Trial, a Unit LibAll, que possue diversas funções de conversão, não vinha instalada no diretório de instalação do PS. Por isso, caso tenha problemas ao compilar a aplicação, é recomendado que salve o arquivo LibAll.pas no diretório do seu código fonte. Esse arquivo pode ser encontrado juntamente com os fontes de exemplo desse artigo. Acesse o portal DevMedia e localize a página de downloads das revistas ClubeDelphi.

@3'0(&+ *) 7'+7'(3&)&3 ;$@# &+ A*$,?< I)') (22+ .0("(B)1+2 ) )"*# V4A*$,? &) V/K 3 + 1:0+&+ /$#;$@#3 s1 7)22+ (1; 7+'0)*03 *) A.*CD+ O)''3/)I'+&.0+2 : A)B3' .1 03203 7)') 2)>3' 23 34(2031 '3/(20'+2 *) 0)>3"), 7+(2 6)2+ *D+ 34(2; 0)1, .1) 3463CD+ 23'# /3')&)< I)') (22+ .2)1+2 + 1:0+&+ B$(5>%?+5>"# &) )"*# V43'#'H'4$< ! 7'M4(1+ 7)22+ : 6+&(A(6)'1+2 +2  >+0J32, 7+' (22+ (* (6()'31+2 73"+ >+; 0D+ &3 X5,#'%< K^ .1 6"(-.3 &.7"+ *+  >+0D+ H#"X5,#'% 3 23'31+2 "3@)&+2 )+ A+*03 &) )"*# *+ 3@3*0+ /$,$(#< K(/(03 )73*)2 + 6M&(/+ -.3 23/.3E FrmGotoForm(FrmPrincipal);

I)') -.3 7+22)1+2 A)B3' '3A3'^*6() )+ A+'1."#'(+ 7'(*6(7)" 3 N2 A.*CJ32

Listagem 2. Procedimento de carga de Produtos procedure  CarregaProdutos; var  Buffer: Array [0..10] of Char; begin if PsDataBase.RecordCount(DBPro) > 0 then begin StrIToA(Buffer, PsDataBase.Fiel dUInt16(DbPro, Prod_Codigo)); PsField.SetText(F ldCodigo, Buffer);

PsField.SetText(FldDescricao, PsDatabase. FieldStringPtr( DbPro, Prod_DescProd)) ; FormatFloat(Buffe r, PSDatabase.Field Double(DBPro, Prod_Preco), 2); PsField.SetText(F ldPreco, Buffer); StrIToA(Buffer, PsDataBase.Fiel dUInt32(DbPro, Prod_Estoque)); PsField.SetText(F ldEstoque, Buffer); PsField.SetText(F ldUn, PsDatabase.Field StringPtr( DbPro, Prod_Un)); PsField.SetText(F ldTamanho, PsDatabase. FieldStringPtr( DbPro, Prod_Tam)); end; end;

Listagem 3. Código dos botões de navegação procedure  BtnPrimeiroSelect; begin   PsDataBase.First(DBPro);   CarregaProdutos; end; procedure  BtnAnteriorSelect; begin   PsDataBase.Prior(DBPro);   CarregaProdutos; end; procedure  BtnProximoSelect; begin   PsDataBase.Next(DBPro);   CarregaProdutos; end; procedure  BtnUltimoSelect; begin   PsDataBase.Last(DBPro);   CarregaProdutos; end;

&3 *+22) 0)>3") &3 7'+&.0+2 &36")'3 )2 )"*#4 V%5?>#543H 3 )V%*"(*8', *+ )4$4 &+ A+'1."#'(+ )0.)"< !>23'@3 + 6M&(/+ ) 23'/.('E implementation uses ProdutosDB, UPrincipal;

L1 23/.(&) 7+&31+2 6+&(A(6)' + '320)*03 &+2 >+0J32< 9) ./-)(0+1 5 3*6+*0')1+2 + 6M&(/+ &3 6)&) >+0D+< !>23'@3 -.3 ) 6+&(A(6)CD+ : 1.(0+ 2(1; 7"32< %73*)2 6F)1)1+2 +2 1:0+&+2 A*%4# R_7'(13('+`U, V%*5% R_)*03'(+'`U, N$@# R_7'M4(1+`U 3 K'4# R_W"0(1+`U, )7'+7'()&+ 7)') 6)&) >+0D+< 9+03 -.3 31 0+&+2 +2 >+0J32 .0("(B)1+2 ) V43'#'H'4$ 3 +2 1:0+&+2 &3 *)@3/)CD+ 7)22)*&+ 6+1+ 7)'q130'+ ) @)'(#@3" 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 6+*2."0) &3 7'+&.0+2 @)1+2 6+&(A(6)' + 3@3*0+ 1"18$" &+ A+'1."#'(+ 7)') )7'3; 23*0)'1+2 +2 &)&+2 &) 0)>3")< O"(-.3 *+ A+'1."#'(+ 3 7'322(+*3 A__ 7)') @(2.)"(; B)' 2.)2 7'+7'(3&)&32 3 3@3*0+2< 9) )>) L@3*02 6"(-.3 &.)2 @3B32 2+>'3 + 3@3*0+ 1"18$" 3 )6'3263*03 .1) 6F)1)&) )+ 7'+63&(13*0+ +'%%$J'V%5?>#54< ! 6M&(/+ 6+17"30+ A(6)'# 6+1+ ) 23/.('E procedure   FrmDadosProdutosOpen; begin  CarregaProdutos;  PSForm.Draw; end;

! W*(6+ &30)"F3 )/+') : -.3 &3@31+2 (*6".(' .1) 6F)1)&) )+ A+'1."#'(+ &3 7'+&.0+2 *) 03") 7'(*6(7)" &3 *+22+ 2(2; 031), 7+' (22+ @+"03 )+ A+'1."#'(+ 7'(*6(; 7)", 6"(-.3 &.)2 @3B32 *+ >+0D+ V%5?>#54 3 &(/(03 ) 6F)1)&) 6+1+ 23/.3E FrmGotoForm(FrmDadosCliente);

f# 1)(2 .1) 6+*A(/.')CD+ *36322#'() ) 23' A3(0) 31 *+22+ 7'+H30+ 7)') -.3 +2 A+'1."#'(+2 23H)1 3A30(@)13*03 6F); 1)&+2< %22(1 6+1+ A(B31+2 *+ )'0(/+ )*03'(+', 03'31+2 -.3 )"03')' + 1:0+&+ 788,*('#*5"\'"?,$C=$"#   &3 A+'1) -.3 7+22) 6F)1)' + A+'1."#'(+ -.3 &323;  H)1+2< I)') (22+, )>') + )'-.(@+ X$"?'4 3-.(@)"3*03 )+ V%5]$(#r/5>%($ &+ K3"7F(< I'322(+*3 +;BK . A_[ 3 23"36(+*3;+< X3'# *36322#'(+ A)B3' ) )"03')CD+ )73*)2 &+ ('4$QQ5&   )+ A(*)" &+ 7'+63&(13*0+< G3H) ) 23/.('E



case FormID of   FrmPrincipal: FrmSetEventHandler(Form, uPrincipal.   HandleEvent);   FrmClientes: FrmSetEventHandler(Form,UDadosClientes.   HandleEvent);   FrmDadosProdutos: FrmSetEventHandler(Form, UDadosProdutos.HandleEvent); end;

G3H) -.3 )&(6(+*)1+2 + A+'1."#'(+ A%:3'?54V%5?>#54 )+ ('4$QQ5& < O)&) A+'1."#'(+ -.3 @)1+2 )&(6(+*)*&+ )+ 2(2031), : *36322#'(+ A)B3' )"03')CD+ *3223 3@3*0+< G3H) + 3@3*0+ 6+17"30+ *) ./-)(0+1 ;<

Criando a tela de Pedidos e Itens ! 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'(' 3 A36F)' ) 0)>3")[ } O'(3 .1) A.*CD+ 7)') *)@3CD+ &+2 &)&+2, +'%%$J'3'?54 7+' 34317"+[ 9+ 6)2+ &3 V$?*?54 3 !#$"4 ?$ V$?*?54 , &3@31+2 6'()' &.)2 *+@)2 s*(02, -.3 23 6F)1)'D+ _I3&(&+2K8+0J32< 9322) H)*3") 3*; 6+*0')1+2 +2 6)17+2 _b"&9.1I3&(&+`, _b"&O"(O+&(/+`, _b"&O"(9+13` 3 _b"&; G)"\+0)"`< L )(*&) +2 >+0J32 _80*9+@+`, _80*]03*2`, _80*I'(13('+`, _80*%*03; '(+'`, _80*I'+4(1+`, _80*s"0(1+`, _80*; b(1` 3 _80*=')@)'`, '327360(@)13*03 &) 32-.3'&) 7)') ) &('3(0)<

%>)(4+ &+ 6)17+ C:*44a5 , (*2(') .1  >+0D+ 6+1.1 3 0'+-.3 23. +'8#*5" 7)') _j+6)"(B) O"(3*03`< %7'+@3(03 3 1+&(A(; -.3 ) 7'+7'(3&)&3 A%':$ .2)*&+ ) +7CD+  &%N5"$ , )22(1 '30(')1+2 2.) >+'&)< O+1 3463CD+ &+2 6+*0'+"32 /$,$(#5%;%*2  JJ$%c V58>8;%*JJ$% 3 K*4# , H# 0')>)"F)1+2 6+1 +2 6+17+*3*032 .0("(B)&+2 *322) 03"), 23*&+ )22(1 6)>3 .1 347"(6)CD+ 2+>'3 +2 *+@+2 6+17+*3*032< } /$,$(#5%;%*JJ$%e  L203 6+17+*3*03 :

Listagem 6. Código da tabela ItemPedDB unit ItemPedDB; interface uses PSL; const ItemPedDBName = ‘ItemPedDB’; ItemPedDBType = Rsc(‘DBIP’); Itp_NumeroPed = 0; Itp_CodProd = 2; Itp_Qtde = 3; Itp_Preco = 4; var FieldDefs : array[0..3] of TFieldDef = ((DataType: ftUInt32), (DataType: ftUInt16), (DataType: ftUInt16), (DataType: ftDouble));

bItemPedInclui DBItp

: Boolean; : TDatabase;

function  Open: Boolean; function  Close: Boolean; function  ProcuraCodigo(Codigo: UInt16): Boolean; implementation function  Open: Boolean; begin Result := PSDatabase.Open (DBItp, ItemPedDBName, dmModeReadWrite); if not Result then begin Result := PSDatabase.Creat eDatabase(ItemPed DBName, Creator, ItemPedDBType); if Result then Result := PSDatabase.Open(D BItp, ItemPedDBName, dmModeReadWrite ); end; if not Result then begin   ShowSystemError(PSDatabase.LastError);   Exit; end;

PSDatabase.SetFie ldDefs(DBItp, FieldDefs[0], SizeOf(FieldDef s) div SizeOf(FieldDef s[0])); end; function  Close: Boolean; begin Result := PSDatabase.Clos e(DBItp); end; function  ProcuraCodigo(Codigo: UInt16): Boolean; begin   PSDatabase.First(DBItp); while not  PSDatabase.EOF(DBItp) do begin if PSDatabase.FieldUInt16(DBItp, Itp_NumeroPed) = Codigo then begin Result := True;   exit; end;   PSDatabase.Next(DBItp); end; Result := False; end; end.

-

&) A)1?"() &+2 >+0J32, 7+'0)*0+ .0(; "(B)1+2 ) s*(0 V4H>##5" &) V/K  7)') 0')>)"F)'1+2 6+1 3"3< % &(A3'3*C) : -.3 7+&31+2 6F)1)' A+'1."#'(+2 31 1+&+ 1+&)" 6+1 3"3< L223 6+17+*3*03 23'# .2)&+ *) C:*44a5 , 7+'0)*0+ (*2(') .1 /$,$(#5%;%*JJ$%R_X"0L1(22)+`U "+/+ N &('3(0) &+ K'L$, C:*44a5[ } V58>8;%*JJ$%e Q)(2 .1 6+17+*3*03 &) A)1?"() &+2 >+0J32 3 2.) A.*6(+*); "(&)&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+ + 6+*F36(&+ O+1>+8+4 &+ K3"7F(, 31 %>"2#*:$ 3"3 : 1.(0+ 2(1(")'[ } K*4#e j(20) : .1 +>H30+ >)20)*03 .0(; "(B)&+ 7+' *M2 &323*@+"@3&+'32, 7+(2 320# &(27+*?@3" 31 7')0(6)13*03 0+&+2 +2 )1>(3*032 &3 &323*@+"@(13*0+< K.; ')*03 + &323*@+"@(13*0+ &) *+22) 2:'(3 Listagem 7. Código de todos os botões da tela de Pedidos procedure  BtNovoSelect; begin   PsDataBase.Insert(DBPed); end; procedure   BtPedItensSelect; begin   FrmGotoForm(FrmPedidoItem); end; procedure  BtInicioSelect; begin   PsDataBase.First(DBPed); end; procedure   BtAnteriorSelect; begin   PsDataBase.Prior(DBPed); end; procedure  BtProximoSelect; begin   PsDataBase.Next(DBPed); end; procedure  BtFimSelect; begin   PsDataBase.Last(DBPed); end; procedure  BtGravarSelect; begin   PsDataBase.Post(DBPed); end; procedure  BtExcluirSelect; begin   PsDataBase.Delete(DBPed); end; procedure  BtnVoltarSelect; begin   FrmGotoForm(FrmPrincipal); end;

Listagem 8. Código dos botões Produtos e Pedidos .. uses UDadosClientes, UDadosProdutos, UDadodsPedidos; .. procedure   btnProdutosSelect; begin   FrmGotoForm(FrmDadosProdutos); end; procedure   btnPedidosSelect; begin   FrmGotoForm(FrmDadosPedidos); end;

&3 )'0(/+2 0')>)"F)'31+2 1.(0+ 6+1 ) K*4#  3 3*03*&3'31+2 2.)2 7'(*6(7)(2 A.*6(+*)"(&)&32< %7M2 3*03*&3'1+2 + A.*6(+*)13*0+ &+2 *+@+2 6+17+*3*032, @)1+2 6+&(A(6)' *+22+ A+*03< 9) ./-)(0+1 ? 3*6+*0')1+2 + 6M&(/+ &3 6)&) >+0D+ (*6".2+ *+ 3431; 7"+< O+&(A(-.3 6+*A+'13 *36322#'(+<

I'36(2)1+2 )/+') 7'37)')' + 2(2031) 7)') -.3 7+22) )>'(' )2 *+@)2 03")2 ) 7)'0(' &+ A+'1."#'(+ 7'(*6(7)"< I+'; 0)*0+, '30+'*3 + A+'1."#'(+ 7'(*6(7)" 3 6+&(A(-.3, *+ 3@3*0+ 1"/$,$(# &+2 >+0J32 I'+&.0+2 3 I3&(&+2, .1) 6F)1)&) )+ 1:0+&+ A%:3'0+< 9D+ 32-.3C) -.3

Listagem 9. Código do método ApplicationHandleEvent alterado function   ApplicationHandleEvent(var Event: EventType): Boolean; var FormID: UInt16; Form: FormPtr; begin Result := False; if Event.eType = frmLoadEvent then begin FormID := Event.frmLoad.f ormID; Form := FrmInitForm(FormI D);   FrmSetActiveForm(Form); case FormID of FrmPrincipal: FrmSetEventHand ler(Form, uPrincipal.HandleEvent); FrmClientes: FrmSetEventHandl er(Form, UDadosClientes.HandleEvent); FrmDadosProduto s: FrmSetEventHandl er(Form, UDadosProdutos.HandleEvent); FrmDadosPedidos : FrmSetEventHandle r(Form, UDadodsPedidos.HandleEvent); end; Result := True;   end. end;

Listagem 10. Código dos eventos StopApplication e StartApplication alterados function  StartApplication: Boolean; begin { Abre o banco de dados de Clientes. Se não conseguir abrir, } { não executa a aplicação} if not ClientesDB.Open then begin ShowMessage(‘Tabe la de Clientes não encontrada!’); Result := False;   Exit; end; if not ProdutosDB.Open then begin ShowMessage(‘Tabe la de Produtos não encontrada!’); Result := False;   Exit; end; if not PedidosDB.Open then begin ShowMessage(‘Tabe la de Itens não encontrada!’); Result := False;   Exit; end; if not ItemPedDB.Open then 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;

  FrmGotoForm(FrmPrincipal); end; procedure  StopApplication; begin   ClientesDB.Close;   ProdutosDB.Close;   PedidosDB.Close;   ItemPedDB.Close;   FrmCloseAllForms; end;

&3@3'# )&(6(+*)' )+ )4$4 &+ A+'1."#'(+ 7'(*6(7)" )2 &.)2 )"*#4 7)') '3A3'^*6()< X3 7'3A3'(' @3H) + 0'36F+ 6M&(/+ &+2 &+(2  >+0J32 *) ./-)(0+1 @< %73*)2 7)') "31>')', &3@31+2 )6'32; 63*0)' + A+'1."#'(+ &3 73&(&+2 *+ s*(0 7'(*6(7)" &+ 7'+H30+, *) A.*CD+ %77"(; 6)0(+*f)*&"3L@3*0, 7)') -.3 + 2(2031) +73')6(+*)" &+ I)"1!X '36+*F3C) + A+'1."#'(+ &3 I3&(&+2 3 I'+&.0+2 6+1+ 7)'03 &) )7"(6)CD+< %>') ) .*(0 G3*&)2 3 )&(6(+*3 ) 6F)1)&) )+ 6)233")2 V%5?>#543H , V$?*?543H 3 !#$:V$?3H *+2 1:0+&+2 /#58788,*('#*5" 3 /#'%#788,*('#*5"< j+6)"(B3;+2 3 )"03'3 6+*A+'13 ) ./-X )(0+1 2B< !>23'@3 -.3 + 3@3*0+ /#52  8788,*('#*5" A36F) )2 0)>3")2 .2)*&+ + 1:0+&+ +,54$ 3 + 3@3*0+ /#'%#788,*('#*5" )>'3;)2 .2)*&+ + 1:0+&+ 18$"< % W*(6) 7)'0(6.")'(&)&3, : -.3 *) )>3'0.') &)2 0)>3")2, *M2 0320)1+2 23 ) 0)>3") 7+&3 23' )>3'0)< L1 6)2+ *3/)0(@+ 3*@()1+2 .1) 13*2)/31 (*A+'1)*&+ -.3 ) 0)>3") *D+ 7+&3 23' 3*6+*0')&)<

Conclusão 93223 )'0(/+ 6'()1+2 ) 03") &3 6+*2."0) ) 7'+&.0+2, + >)*6+ &3 &)&+2 &3 73&(&+2 3 (03*2 &+ 73&(&+, 6+*F3631+2 +2 6+*63(; 0+2 &3 A+'1."#'(+2 &+ I)"1, &320'.0(@+ 3 *D+ &320'.0(@+, 3 6'()1+2 ) 03") &+ 6)>3C)"F+ &+ 73&(&+< 9+ 7'M4(1+ )'0(/+ 6'()'31+2 ) 03") &3 ]03*2 &+ I3&(&+ 3 6+*20'.('31+2 + +5"?>*#< %0: + 7'M4(1+ )'0(/+, 3 >+*2 6M&(/+2 ) 0+&+2‰

Dê seu feedback sobre esta edição! A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

   F eedb ac   k  

     D

o     

s      

 b  

 r  

  e

  e   s   t    a

    e   i   d    ç     ã       o

Dê seu voto sobre este artigo, através do link: www.devmedia.com.br/javamagazine/feedback 

AMIGO Existem coisas que não conseguimos ficar sem!

...só pra lembrar, sua assinatura pode estar acabando!

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

!

Maikel Marcelo Scheid ([email protected])

é técnico em Informática com ênfase em Análise e Programação de Sistemas. Atua na área de Desenvolvimento de Softwares em Delphi para plataforma Win32 e .NET com banco de dados Firebird e MS SQL. É membro da Equipe Editorial ClubeDelphi.

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. 2(2031) .1) )/3*&) &3 3;1)("2, -.3 )+ 23' 6+*A(/.')&) &(27)') 3;1)("2 6+1 '3; ")0M'(+2, )@(2+2, 3*0'3 +.0'+2, ).0+1)0(6); 13*03 )+2 23.2 &320(*)0#'(+2< 9+ K3"7F(, 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< 93203 )'0(/+ @3'31+2 ) 6'()CD+ &3 .1 2(2031) 2(17"32 &3 3*@(+ &3 13*2)/3*2 3"30'~*(6)2 R3;1)("U, +*&3 A)'31+2 )":1 &)2 6+*A(/.')CJ32 *+'1)(2 &3 '31303*03, &320(*)0#'(+, )22.*0+ 3 13*2)/31 ) 6+*A(; /.')CD+ &3 ).03*0(6)CD+ &+2 .2.#'(+2 7+' XQ\I, 0)1>:1 ) 6+*A(/.')CD+ 7)') -.3 + 3;1)(" 7+22) 23' 3*@()&+ 6+1 )*34+2<

Criando a aplicação s0("(B)'31+2 + K3"7F( { 7)') ) 6'(); CD+ &+ 2(2031) &3 3*@(+ &3 3;1)("

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; X3*&Q)("` 3 + +'8#*5" )"03'3 7)') _L*@(+ &3 L;1)("2`< X)"@3 ) )"*# &+ A+'1."#'(+ 7'(*6(7)" 6+1+ _.L1)("3C)"F+ &+ A+'1."#'(+ )'')203 &) 7)"30) /#'"?'%? .1 6+17+*3*03 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+ .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Š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 1. Componentes para autenticação SMTP

Figura 2. Cabeçalho do E-mail

Figura 3. Formulário de envio de e-mails

#*5" _%22.*0+` 3 (*2(') .1 6+17+*3*03 C?*#R_3&0%22.*0+`U, '31+@3*&+ 0)1>:1 + 23. ;$@#Q %+ A(*)" &320) 6+*A(/.')CD+,

23. A+'1."#'(+ &3@3'# 320)' &3 )6+'&+ 6+1 ) %*34+`U, )"03')*&+ 23. +'8#*5" 7)') _%*34+` 3 )'')203 7)') &3*0'+ &+ 1321+ .1 6+17+*3*03 K*4#X*$MR_31)("%*34+`U &) 7)"30) D*"Z[Q %(*&) )>)(4+ )+ JL7"$@5 , )&(6(+*3 1)(2 .1 8H5@R_/>Q3*2)/31`U 3 &3A(*) 23. +'82 #*5" 7)') _Q3*2)/31`< %'')203 7)') &3*0'+ &+ JL9$"4'J$: .1 6+17+*3*03 B*(0C?*# R_31)("Q3*2)/31`U &) 7)"30) D*"Z[ 3 '3; 1+@) + 0340+ &) 2.) 7'+7'(3&)&3 K*"$4Q

%+ A(*)" &+ A+'1."#'(+, )&(6(+*3 )(*&) &) 7)"30) 7??*#*5"', &+(2 6+17+*3*032 H*#H#"R_>0*L*@()'` 3 _>0*O)*63")'`U< %"03'3 ) 7'+7'(3&)&3 +'8#*5" &3 )1>+2 7)') _L9G]%a` 3 _O%9OLj%a`, '32736; 0(@)13*03< ]*6".), )0')@:2 &) 7'+7'(3&)&3 +0J32< %+ A(*)" 23. A+'1."#'(+ 320)'# 6+1 + K'65># 3 2313"F)*03 ) :1 23'# '3)"(B)&) 31 0317+ &3 3436.CD+< ; !?7"#*A%$$E$  R_%*0(=3"+`U &) 7)"30) !"?6 9*4(e 2.) .0("(&)&3 : *D+ &3(4)' ) )7"(6)CD+ _6+*/3")'` 3*-.)*0+ + 3;1)(" 320# 23*&+ 3*@()&+< ! 6+17+*3*03 1)*; 0:1 + A+'1."#'(+ )0.)"(B)&+, 73'1(0(*&+ -.3 )0: &.')*03 + 3*@(+ + .2.#'(+ 7+22) 6+*0(*.)' (*03')/(*&+ 6+1 + 2(2031)< ; 18$"3*',5J R_!73*%*34+`U &) 7)"30) 3*',5J4e 23'# .0("(B)&+ 7)') "+6)"(B)' +2 )*34+2 ) 23'31 )&(6(+*)&+2 )+ 3;1)("< 9D+ '3-.3' *3*F.1) 6+*A(/.')CD+ 32; 736()", 7+(2 23'# .0("(B)&+ )73*)2 7)') "+6)"(B)' +2 )'-.(@+2< ; V58>89$">  R_Q3*.%*34+`U &) 7); "30) /#'"?'%?e '3")6(+*3 + 6+17+*3*03 N 7'+7'(3&)&3 V58>89$"> &+ 6+17+*3*03 $:'*,7"$@5< X3'# .0("(B)&+ *+ 6"(-.3 &+ >+; 0D+ &('3(0+ 2+>'3 + 6+17+*3*03 $:'*,7"$@5 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<

Figura 4. Envio do e-mail

 %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 + 6+17+*3*03, 23"36(+*3 6)&) .1 &+2

(03*2 &3 13*. )&(6(+*)&+2 3 *) 7'+; 7'(3&)&3 !:'J$!"?$@ 23"36(+*3 + ?6+*3 6+''327+*&3*03<

Anexando arquivos ao E-mail O+1 .1 6"(-.3 &.7"+ 2+>'3 + 6+17+*3*; 03 9$">7"$@5 , 23"36(+*3 + (031 &3 13*. _%*34)' )'-.(@+` 3 )&(6(+*3 ) 23. 3@3*0+ 1"+,*(O + 6M&(/+ &) ./-)(0+1 2 , +>3&363*; &+ ) 6'()CD+ &3 .1) @)'(#@3" &+ 0(7+ ;K*42 #!#$: 7)') -.3 23H) (*20)*6()&+ + )'-.(@+ 23"36(+*)&+ 3 34(>(&+ *+ $:'*,7"$@5< ! 6M&(/+ : >31 2(17"32, )73*)2 6'(); 1+2 .1) @)'(#@3" &+ 0(7+ ;K*4#!#$: 3 6F)1)1+2 + 1:0+&+ C@$(>#$ &+ 6+*0'+"3 18$"7"$@5< %7M2 ) 23"3CD+ &3 .1 )'-.(; @+ *) 6)(4) &3 &(#"+/+, )&(6(+*)1+2 .1 *+@+ (031 )+ $:'*,7"$@5 , 6+17+*3*03 K*4#X*$M , 3 6+*A(/.')1+2 + 23. +'8#*5" 6+1 + *+13 &+ )'-.(@+ 23"36(+*)&+<  z# *+ (031 &3 13*. _L46".(' )'-.(; @+` '31+@31+2 + )'-.(@+ &) "(20) &3 )*34+2< I'(13('+ 6+7()1+2 + *+13 &+ )'-.(@+ 23"36(+*)&+ 31 .1) @)'(#@3" &+ 0(7+ /#%*"J 3 31 23/.(&) 6F)1)1+2 + 1:0+&+ 3$,$#$ &+ 6+17+*3*03 $:'*,72 "$@5< G3H) ) ./-)(0+1 4<

Enviando o e-mail I)') '3)"(B)' + 3*@(+ &+ 3;1)(" 7'3; 6(2)1+2 6'()' 31 0317+ &3 3436.CD+ )"/.1)2 6+*A(/.')CJ32 '3")6(+*)&)2 )+2 6+17+*3*032 )&(6(+*)&+2< %&(6(+*3 )+ 3@3*0+ !*O"(6• &+ >0*L*@()' + 6M&(/+ &) ./-)(0+1 5 , -.3 3*6+*0');23 6+13*0)&+ &3 )6+'&+ 6+1 6)&) )CD+ -.3 320# +6+''3*&+ &.')*03 + 7'+6322+ &3 3*@(+ &+ 3;1)("< p 1.(0+ (17+'0)*03 -.3 0+&+ + 6M&(/+ 23H) 1)*0(&+ 31 .1 >"+6+ #%6QQ&*"',,6 23*&+ -.3 3*0'3 +  &*"',,6QQ$"? &3@3'# 320)' ) "(*F) 7)') &326+*360)' )+ 23'@(; &+' XQ\I< \)*0+ *.1 6)2+ &3 2.6322+ &+ 3*@(+ &+ 3;1)(" +. *.1 6)2+ 31 -.3 +6+'') .1) A)"F), + 6+17+*3*03 : &326+*360)&+ *D+ &3(4)*&+ *3*F.1) 7+'0) &3 "(/)CD+ )>3'0)< ! 6)*63")13*0+ &+ 3*@(+ &+ 3;1)(" *) @3'&)&3 0')0);23 &3 .1) 2)?&) &+ A+'; 1."#'(+< I)') 0)*0+ )&(6(+*3 )+ 3@3*0+ 1"+,*(O &+ L#"+'"($,'%   .1) 6F)1)&) )+ 1:0+&+ +,54$< O+*A(/.')&+2 0+&+2 +2 3@3*0+2 &) )7"(6)CD+, 3436.03 ) 1321) 3 A)C) + 03203 &3 3*@(+< O3'0(A(-.3;23 )*032 &3 -.3 320# .2)*&+ .1 !V  @#"(&+ 7)') ).03*0(6);

CD+ XQ\I 6+1+ 23'@(&+' &3 2)?&) &)2 13*2)/3*2< L20)*&+ 6+''30)2 0+&)2 )2 (*A+'1)CJ32, 23. 3;1)(" 23'# 3*@()&+ 6+1 2.6322+ R"(*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 &+ K3"7F( 6+1 ) A.*CD+ &3 &3A(*(' + K'65># &3 (17'322D+, 2)"@)' 3 )>'(' &+6.13*0+2 2)"@+2 73"+ 3&(0+' &3 0340+2 +. )0: 1321+ 7+' +.0'+2 3&(0+'32<

Criando a aplicação % 6'()CD+ &+ 3&(0+' &3 0340+2 0')0);23 &3 .1) 2(17"32 )7"(6)CD+ )7"(6)CD+ *) -.)" .0(" .0("(B)'31+2 (B)'31+2 + K3"7F( { 7)') ) 6'()CD+ &+ )7"(6)0(@+ 5(*Tg< 9D+ 23'# *36322#'() ) .0("(B)CD+ &3 *3*F.1) 327:6(3 327:6(3 &3 >)*6+ &3 &)&+2 &)&+2 +. (*2; 0)")CD+ &3 6+17+*3*032 &3 03'63('+2< X3'D+ )73*)2 .0("(B)&+2 6+17+*3*032 *)0(@+2 &)2 7)"30)2 &+ K3"7F(< O'(3 O'( 3 ) )7"(6)CD+ *+ 13*. A*,$qN$Mr788,*('#*5" 3 )"03'3 ) 7'+7'(3&)&3 +'8#*5" &+ A+'1."#'(+ 7'(*6(7)" 7)') _Q3. 3&(0+' &3 \340+2` 3 31 23/.(&) *+13(3 + A+'1."#'(+ 7)') _A'1L&(0+'`< X)"@3 ) )"*# &+ A+'1."#'(+ 6+1+ _.I'(*6(7)"R_Q)(*Q3*.Z`U &) 7)"30) /#'"2 ?'%? 3 6+1 &.7"+ 6"(-.3 &+ 1 1+.23 +.23 6'(3 .1) 320'.0.') &3 13*.2 6+*A+'13 (".20')&+ *) :1 23'# .0("(B)&) 1)(2 )&()*03 7)') ) 6'()CD+ &+2 )0)"F+2 &3 )6322+ '#7(&+< K3A(*(&) )/+') 0+&) ) 320'.0.') &3 13; *.2 3 +7CJ32 &+ *+22+ 3&(0+' &3 0340+2, @)1+2 )&(6(+*)' &) 7)"30) D*"Z[ .1 6+17+*3*03 ;55,H'%R_8)'')8.00+*2`U 7)') -.3 7+22)1+2 6'()' )"/.*2 )0)"F+2 &3 )6322+ '#7(&+ ) )"/.1 13*.2 &+ 2(203; 1)< O+1 + 6"(-.3 &+ >+0D+ &('3(0+ 2+>'3 ) ;55,H'% 23"36(+*3 ) +7CD+ N$M H>##5"c 6'()*&+ 6'() *&+ )22(1 .1 . 1 *+@+ >+0D+ R_>09+@+`U R_>09+@+`U *) >)'') &3 )0)"F+2< O'(3 "+/+ )7M2 1)(2 0'^2 >+0J32 .0("(B)*&+ .0(" (B)*&+ + 1321+ 1:0+&+< 9+13(3 +2 >+0J32 6+1+ _>0%>'('`, _>0; X)"@)'` 3 _>0]17'(1('` _>0]17'(1 ('`,, '327360(@)13*03< K322) A+'1) )6)>)1+2 &3 6'()' +2 >+0J32 &3 )0)"F+ 7)') +2 7'(*6(7)(2 (03*2 &+ 13*. _%'-. _%'-.(@+` (@+` 3 @)1+2 @)1+2 6'()' 6' ()' )/+') 7)') +2 (03*2 &+ 13*. C?*#'%< %*032 &3 6'()' .1 . 1 *+@+ >+0D+ *) >)'') &3 )0)"F+2, @)1+2 )&(6(+*)' .1 237); ')&+' ) A(1 &3 +'/)*(B)' 13"F+' 3 6)03; /+'(B)' 7+' /'.7+2 &3 A.*CJ32 *) >)'') &3 )0)"F+2< O"(6)*&+ 2+> ) >)'') 6+1 +  >+0D+ &('3(0+ &+ 1+.23 3 23"36(+*)*&+ 23"36(+*) *&+ ) +7CD+ N$M /$8'%'#5% /$ 8'%'#5%QQ O'()&+ .1 237)')&+' "+/+ )7M2 + 7'(; 13('+ /'.7+ &3 >+0J32, 6'()'31+2 )/+') +2 >+0J32 7)') '3")6(+*)' )0)"F+2 )+2 (03*2 &+ 13*. C?*#'%< O'(3 0'^2 >+0J32 &320(*)&+2 ) 3203 /'.7+ 6+1 +2 *+132 _>0O+7()'`, _>0a36+'0)'` 3 _>0O+")'`< j+/+ )7M2 )&(; 6(+*3 .1 *+@+ 237)')&+' )+ 13*.< X3*&+ *+22) (&:() ) &3 6'()' .1 3&(0+' &3 0340+2, : (*03'322)*03 -.3 7)') .1) A#6(" 3&(CD+ &+ 1321+ + .2.#'(+ 03*F) 2317'3 &3 A#6(" )6322+ +2 0(7+2 0(7+ 2 &3 A+*032 7)') -.3 ) -.)"-.3' 1+13*0+ 7+22) )"03'#;") 31 0'36F+2 &+ 23. 0340+< I)') +A3'363' 320) +7CD+ )+ .2.#'(+, )&(6(+; *)'31+2 0)1>:1 N >)'') &3 )0)"F+2 .1 6+17+*3*03 +5:L5H5@R_6•b+*032`U &) 7)"30) /#'"?'%? -.3 23'# 7+@+)&+ "+/+ 1)(2 6+1 0+&) ) "(20) &3 A+*032 (*20)")&)2 *+ 5(*&+V2< %&(6(+*)&+ + 6+17+*3*03, 6'(3 .1 *+@+ 237)')&+' *) >)'') &3 )0); "F+2< %":1 &) )"03')CD+ &+ 0(7+ &3 A+*03 31 .1 0340+, + .2.#'(+ 7'36(2) 0)1>:1 03' 2317'3 &3 A#6(" )6322+ ) )"03')CD+ &+

0)1)*F+ &) A+*03 -.3 320# .0("(B)*&+, 3 7)') (22+ )&(6(+*3 N >)'') .1 *+@+ 6+17+*3*03 +5:L5H5@F_6•\)1)*F+`U, 3 *) 2.) 7'+7'(3&)&3 !#$:4 )&(6(+*3 )2 @)'()CJ32 &3 0)1)*F+2 -.3 &323H) &(27+*(>("(B)'< 9+ 3&(0+' &3 (03*2 &+ 6+17+*3*03 )&(6(+*3, 237)')&+2 7+' "(*F), +2 23/.(*032 23/ .(*032 @)"+'32E @)"+'32E 6, 8, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 30, 32, 40.

% )"03')CD+ &)2 6+'32 &3 .1 0340+ -.3 23 320# &(/(0)*&+ 0)1>:1 : .1) 6)')603'?2; 0(6) 1.(0+ (17+'0)*03 &.')*03 ) 6'()CD+ &3 .1 3&(0+'< ]*6".) *) >)'') &3 )0)"F+2 )0)" F+2 .1 6+17+*3*03 +5,5%H5@R_6•O+'`U &) 7)"30) 7??*#*5"', 3 31 23/.(&) (*2(') 1)(2 .1 237)')&+' N >)'')< I)') 73'1(0(' ) A+'1)0)CD+ 3 )7"(6)CD+ &3 320("+2 &3 A+'1)0)CD+ 7)') 0340+2 6+1 *3/'(0+, (0#"(6+, 2.>"(*F)&+ 3 '(26)&+, )&(6(+*3 N >)'') &3 )0)"F+2 -.)0'+ >+0J32, _>093/'(0+`, _>0]0)"(6+`, _>0X.>"(*F)&+` 3 _>0a(26)&+`< ]*2(') .1 *+@+ 237)')&+'< I+' W"0(1+, (*6".) *) >)'') &3 )0)"F+2 1)(2 0'^2 >+0J32 _>0L2-.3'&)`, _>0O3*0'+` 3 _>0K('3(0)` -.3 23'D+ .0("(B)&+2 6+1 ) A(; *)"(&)&3 &3 )"(*F)' + 0340+ 7)') 32-.3'&), 63*0')"(B)' 3 +'/)*(B)' N &('3(0)< 9+22) )7"(6)CD+ 320# )7)'363*&+ )/+; ') &3 .1) A+'1) .1 0)*0+ 320')*F), 031+2 )73*)2 + 13*. 3 .1) >)'') &3 )0)"F+2 6+1 @#'(+2 >+0J32, 23*&+ -.3 *3*F.1 &3"32 )(*&) &(27J3 &3 -.)"-.3' 0(7+ &3 (&3*0(A(6)CD+ @(2.)" 7)') 2.) A.*6(+*)"(&)&3< I)') &3A(*(' .1 320("+ &3 ,'65>#  3 6)')603'(B)' 6)&) >+0D+ &3 )0)"F+, )'')203 7)') + A+'1."#'(+ .1 6+17+*3*03 !:'J$K*4#R_%0)"F+]1)/32`U &) 7)"30) D*"Z[Q O+1 .1 6"(-.3 &.7"+ 2+>'3 + 1321+ )>') 23. 3&(0+' 3 )&(6(+*3 .1) 2:'(3 &3 (1)/3*2 &3 )6+'&+ 6+1 )2 A.*6(+*)"(&)&32 -.3 -.3'31+2 )0'(>.(' )+ *+22+ 3&(0+' &3 0340+2< %2 (1)/3*2 ) 23'31 )&(6(+*)&)2 &3@3'D+ 320)' 6+1 A+'1)0+2 &3 )'-.(@+ 6+1+ d17 +. d23'@)*&+ +>23'@)*&+ -.3 )"/.*2 )0)"F+2 H# )22.1(')1 &3 A+'1) ).0+1#0(6) )"/.*2 ?6+*32 &3 (&3*0(A(6)CD+< (&3*0(A (6)CD+< I)') 3&(0)' +2 ?6+*32 &3 6)&) >+0D+ 3 )&3-.#;"+2 )+ ?6+*3 &3 2.) '327360(@) A.*6(+*)"(&)&3, 6"(-.3 2+>'3 ) 7'+7'(3&)&3 !:'J$!"?$@ 3 *) "(20) &3 (1)/3*2 &(27+*?@3(2 &(27+* ?@3(2 23"36(+*3 -.)" 6+''327+*&3 N 2.) A.*CD+< %+ A(*)" &) 3&(CD+ &)2 (1)/3*2, ) >)'') &3 )0)"F+2 &+ 2(2031) &3@3'# A(6)' 320'.0.')&) &3 A+'1) 2313"F)*03 ) *=54 ?$ 8%5J%':'4t7%T>*=54 (5:>"4t H5%,'"? /0'%$?t!:'J$4tH>##5"4 /0'%$?t!:'J$4tH>##5"4< O)&) (1); /31 )&(6(+*)&) 7)') + 6+17+*3*03 !:'J$2 :K*4# '363>3 .1 *W13'+ &3 (&3*0(A(6)CD+

-.3 .2)'31+2 7)') &3A(*(' +2 )0)"F+2 *+2  >+0J32 R'(;"+2 ) A(1 &3 "3' +. 6+*0(*.)' 6+1 ) 3&(CD+ &+ 0340+< ! A+'1)0+ &3 )'-.(@+ -.3 .0("(B)'31+2 23'# + '(*&+ + 3&(0+' &3 A("0'+2 &+2 6+17+*3*032, &3A(*) &+(2 A("0'+2 31 "(*F)2 &(A3'3*032, +>3&363*&+ + A*,#$% N':$ 6+1+ _%'-.(@+2 &3 \340+ Rd3&3C) d+2 +2 6+17+*3*032 ) 7'+7'(3&)&3 3$&'>,#C@#c )0'(>.(*&+;"F32 + @)"+' d"+6+2 &3 6+1)*&+2 -.3 23'D+ A)6("13*03 3*03*&(&+2 3 7+&3'D+ 23' )7"(6)&)2 ) @#'()2 +.0')2 2(0.)CJ32 -.3 @+6^ 7+&3'# 23 &37)')' 3*-.)*0+ &323*@+"@3' 2.) )7"(6)CD+< % 7'(13(') 6+&(A(6)CD+ -.3 @3'31+2 23'# -.)*0+ ) 6'()CD+ 6' ()CD+ &+ A+'1.; "#'(+ R3@3*0+ 1"+%$'#$U +*&3 ('31+2 '3; )"(B)' )"/.1)2 )"/. 1)2 6+*A(/.')CJ32 -.3 23'D+ +2 3$&'>,# &+ *+22+ 3&(0+'< %6322)*&+ + 3&(0+' &3 6M&(/+2 &+ A+'1."#'(+, A+'1."#'(+, &36")'3 *) 23CD+ 8%*='#$ ) 23/.(*03 8%5($?>%$ -.3 23'# '327+*2#@3" 7+' 6)70.')' 0+&)2 )2 A+*032 (*20)")&)2 *+ 5(*&+V2 3 7'33*; 6F3' ) "(20) *+ 6+17+*3*03 (OA5"#$4< procedure  ObtemFontes;

I+2(6(+*)&+ 2+>'3 ) &36")')CD+ &)  8%5($?>%$ .0("(B3 )2 036")2 +#%,./0*&#.+ 7)') -.3 + K3"7F( 6'(3 + 6)>3C)"F+ &+ 7'+63&(13*0+, 3 )&(6(+*3 )+ 1321+ + 6M&(/+ &) ./-)(0+1 2 , +*&3 6'()'31+2 6'() '31+2 .1)  &>"(#*5" &3'(@)&) &3*0'+ &)  8%5($2

?>%$ -.3 23'# '3A3'3*6()&) 6+1+ A+'1)

&3 7+*03('+ 3 '3A3'^*6() ) .1 327)C+ &3 131M'() ) 23' "+6)&+ *+ 2(2031)< %(*&) &3*0'+ &) 8%5($?>%$ 6'()1+2 .1) @)'(#; @3" &+ 0(7+ K5"JD5%? -.3 : .2)&) 7)') 6)''3/)' +2 *+132 &)2 A+*032 3 "+/+ 1)(2 1)( 2 2D+ )0'(>.?&)2 )+ 6+17+*3*03 (OA5"#$4< 9+ 3@3*0+ 1"+%$'#$ &+ A+'1."#'(+, )&(; 6(+*3 )2 23/.(*032 "(*F)2 "(* F)2 &3 6M&(/+, -.3  8%5($?>%$ &+ 6)''3/)13*0+ ('D+ 6F)1)' ) 8%5($?>%$ &)2 A+*032 '36:1 6'()&) 3 &3A(*(' *+2 6+17+*3*032 (OA5"#$4 3 (O;':'"05 + 0(7+ 3 0)1)*F+ &)2 6+*A(/.')CJ32 6+*A (/.')CJ32 7)&'D+ 7)&'D+ -.3 320D+ &3A(*(&)2 *+ 2(2031), 0')B3*&+;)2 23"36(+*)&)2E   ObtemFontes; ckFontes.Text := DefFontData.Name ; ckTamanho.Text := IntToStr(-MulDiv( DefFontData.Heigh t, 72, Screen.PixelsPerInch));

9)2 7'M4(1)2 "(*F)2 "(* F)2 &3 6M&(/+, @)1+2 )0'(>.(' A.*6(+*)"(&)&32 )+2 13*.2 &+ 2(2031) R 9'*"9$">_  9'*"9$">_U, 3 7)') +2 6)2+2 &3 34(20(' 34(20( ' .1 )0)"F+ '#7(&+ *) >)'') >)'') 6+''32; 7+*&3*03 ) .1 (031 &+ 13*. +'(/(*)" R13*. 7L%*% 7+' 34317"+U, 34317"+U, ('31+2 )73*)2 )73 *)2 '3")6(+*)' + >+0D+ )+ (031 )0')@:2 &) 2.) 7'+7'(3&)&3 9$">!#$: -.3 @3'31+2 0)1>:1 1)(2 ) 23/.('<  9'*"9$">_ 3 6+1 O"(-.3 &.)2 @3B32 *+ 9'*"9$">_ 3"3 )>3'0+ *)@3/.3 )+ (031 7%T>*=5rN5=5< %.0+1)0(6)13*03 + K3"7F( *+2 6'() + 6)>3C)"F+ &+ 3@3*0+ 1"+,*(O &3223 (031 )+ -.)" &(/(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;

Figura 2. Adicionando imagens para ImageList

Figura 3. Barra de atalhos d o Editor de Textos

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+ 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+ &+ )'-.(@+ 23"36(+*)*&+ *D+ 6+''327+*&3 )+2 )';

-.(@+2 2.7+'0)&+2 73"+ *+22+ 3&(0+' 3 ) )CD+ 23'# (/*+')&)< I)') 2)"@)' + 6+*03W&+ &(/(0)&+ *+ 3&(; 0+', )0'(>.) )+ 3@3*0+ 1"+,*(O &+ 13*. 7%T>*=5r/',='% + 6M&(/+ &) ./-)(0+1 5 -.3 )+ 3436.0)' + 6+17+*3*03 &3 &(#; "+/+ ?,J/'=$  ('# @3'(A(6)' 23 + *+13 &+ )'-.(@+ A+'*36(&+ 73"+ .2.#'(+ H# 34(203 *) 7)20) 23"36(+*)&)< f)@3*&+ + )'-.(@+ 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(+*); &) 73"+ .2.#'(+< I+' A(1 ) 7'+7'(3&)&3  95?*&*$? &+ 3&(0+' 23'# '37)22)&) 6+1+ A',4$c  A+'*363*&+ )22(1 -.3 *D+ 34(203 6+*03W&+ 1+&(A(6)&+ 231 23' 2)"@+ 6)2+ &323H3 6'()' .1 *+@+ &+6.13*0+< % 6+&(A(6)CD+ &+ 13*. /',='% +5:5 0)1>:1 23 &# &3 A+'1) >)20)*03 2(17"32, 7+(2 *3*F.1) @3'(A(6)CD+ 7'36(2) 23' '3; )"(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

+>#;5+,*8H5'%? 3 V'4#$;5+,*8H5'%?  -.3,

'327360(@)13*03, 6+7()1, '36+'0)1 3 6+")1 + 6+*03W&+ ?$ +. 8'%' ) 131M'() R_O"(78+)'&`U< 9+ 13*. B$(>5 &+ 7)'#/')A+ )&(6(+*3 )+ 3@3*0+ 1"+,*(O )2 23/.(*032 "(*F)2 &3 6M&(/+, -.3 ('D+ )>'(' .1) 6)(4) &3 &(/(0)CD+ 7)') -.3 + .2.#'(+ 7+22) &3; A(*(' -.)" 327)C)13*0+ &323H) -.3 23H)

&)&+ )+ 23. 0340+< %*032 &3 )&(6(+*)' + 6M&(/+, &36")'3 *)2 >4$4 &+ 7'+H30+ ) )"*# 3*',5J4Q //Adicionar uses Dialogs TextEditor.Para graph.FirstIndent := TextEditor.Paragraph.FirstIndent + StrToInt(InputBox(‘Digite o espaçamento’,’Recuo do Texto (em mm)’,   IntToStr(TextEditor.Paragraph.   FirstIndent)));

Nota do DevMan Se você estiver trabalhando no Windows VISTA, será necessário executar o Visual Web Developer como administrador, para que a aplicação tenha direitos suficientes para gravar no log de Eventos. Para executar o Visual Web Developer como administrador, clique com o botão direito sobre o seu ícone no menu, e escolha a opção “Executar como administrador” ou “Run as administrator”.

Figura 4. Configuração dos filtros

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*. /'*% )&(; 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(@+ 73'/.*0)1+2 )+ .2.#'(+ 23 3"3 &323H) 2)"@)' + )'-.(@+, 6)2+ 6+*0'#'(+ )73*)2 A36F)1+2 + )7"(6)0(@+< I)') 6+&(A(6)CD+ &+2 0'^2 &+2 (03*2 &+ 13*. C?*#'%  +>23'@3 *) ./-)(0+1 = +2 6M&(/+2 '3A3'3*032 ) 6)&) (031 &3 13*. &(/(0)*&+ +2 '327360(@+2 6M&(/+2 7)') )2 )CJ32 &3 +58*'%c B$(5%#'% 3 +5,'%< ! 6+17+*3*03 B*(0;$@# 7+22.( 0'^2 1:; 0+&+2 &(20(*0+2 7)') 23 0')0)' 13*2)/3*2 31 131M'() -.3 2D+ +586;5+,*8H5'%?c

Figura 5. Estrutura do Editor de Textos Listagem 1. Implementação da procedure ObtemFontes procedure   TfrmEditor.ObtemFontes; function  EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric; FontType: Integer; Data: Pointer): Integer; stdcall; begin   TStrings(Data).Add(LogFont.lfFaceName); Result := 1; end; var DC: HDC; begin DC := GetDC(0);   EnumFonts(DC, nil, @EnumFontsProc, Pointer(ckFontes.Items)); ReleaseDC(0, DC); ckFontes.Sorted := True; end;

9+ 6M&(/+ )*03'(+' )0'(>.?1+2 + @)"+' &(/(0)&+ 73"+ .2.#'(+ N 7'+7'(3&)&3 A*%4#!?$"# &+ V'%'J%'80< ! V'%'J%'80 : .1) 7'+7'(3&)&3 &+ 6+*0'+"3 B*(0;$@#  '32; 7+*2#@3" 7+' )"03')' )2 6+*A(/.')CJ32 &3 7)'#/')A+, 6+1+ + 7'M7'(+ *+13 2./3'3< b(*)"(B)&) ) )0'(>.(CD+ &+2 6M&(/+2 )+2 (03*2 &3 13*. &+ 6+17+*3*03 9'*"9$2 ">_ , 7'36(2)1+2 '3")6(+*)' +2 )0)" F+2 '#7(&+2 N-.3"32 (03*2 -.3 H# A+')1 6+; &(A(6)&+2, 6+1+ : + 6)2+ &+2 )0)"F+2 &3

N5=5c 7L%*% 3 /',='%<

X3"36(+*)*&+ + >+0D+ 6+''327+*&3*03, @# )0: ) 7'+7'(3&)&3 9$">!#$: 3 "+6)"(B3 + *+13 &+ (031 &3 13*. 6+''327+*&3*; 03< a37(0) + 1321+ 7'+63&(13*0+ 31 0+&+2 +2 >+0J32<

Alterando tipo, tamanho e cor da fonte \31+2 )&(6(+*)&+ ) *+22) >)'') &3 )0)"F+2 '#7(&+2 0'^2 A.*6(+*)"(&)&32,

Listagem 2. OnClick para o menu Abrir procedure   TfrmEditor.Abrir1Click(Sender: TObject); begin if dlgOpen.Execute then begin if ExtractFileExt(dlgOpen.FileName) = ‘.rtf’ then begin   TextEditor.Lines.LoadFromFile(dlgOpen.FileName); dlgSave.FileNam e := dlgOpen.FileName; TextEditor.Modi fied := false; end else MessageDlg(‘For mato de arquivo não suportado’,mtInf ormation,[mbOk],0 ) end; end;

Listagem 3. OnClick do menu Arquivo|Salvar procedure   TfrmEditor.Salvar1Click(Sender: TObject); begin if  FileExists(dlgSave.FileName) then   TextEditor.Lines.SaveToFile(dlgSave.FileName) else begin if dlgSave.Execute then begin   TextEditor.Lines.SaveToFile(dlgSave.FileName); end; end; TextEditor.Modif ied := false; end;

Listagem 4. Evento ativado ao sair do editor de textos procedure  TfrmEditor.Sair1Click(Sender: Tobject); begin if  TextEditor.Modified then begin if Application.MessageBox(‘Deseja salvar as alterações?’, ‘Salvar’,MB_YESNO) = IdYes then begin if dlgSave.Execute then   TextEditor.Lines.SaveToFile(dlgSave.FileName);   Close; end else   Close; end else   Close; end;

Listagem 5. Copiar, Recortar e Colar procedure   TfrmEditor.Copiar1Click(Sender: TObject); begin   TextEditor.CopyToClipboard; end; procedure   TfrmEditor.Recortar1Click(Sender: TObject); begin   TextEditor.CutToClipboard; end; procedure   TfrmEditor.Colar1Click(Sender: TObject); begin   TextEditor.PasteFromClipboard; end;

)2 -.)(2 )(*&) *D+ A+')1 13*6(+*)&)2 31 *3*F.1) 6+&(A(6)CD+ 3 -.3 2D+ (*&(273*2#@3(2 ) .1 3&(0+' &3 0340+2< %"03')CD+ &+ 0(7+, 0)1)*F+ 3 6+' &3 A+*; 032< I+&31+2 23"36(+*)' 0'36F+2 &+ 0340+ 3 A)6("13*03 3&(0)' -.)"-.3' .1) &)2 7'+7'(3&)&32 )73*)2 1.&)*&+ + (031 23"36(+*)*&+ *+ +5:L5H5@ '3")6(+*)&+ ) +7CD+< !2 6M&(/+2 2D+ 2(17"32 3 )7"(6); &+2 )+ 3@3*0+ 1"+0'"J$ &3 6)&) .1 &+2 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+ 6+13*0)&+2 3 *D+ F# 23/'3&+< \)1>:1 )0)"F+2 -.3 )(*&) *D+ A+; ')1 6+&(A(6)&+2, 031+2 +2 >+0J32 7)') )7"(6)CD+ &+ 320("+2 &3 N$J%*#5c !#d,*(5c />L,*"0'?5 3 B*4('?5  2+>'3 +2 0'36F+2 &3 0340+2 23"36(+*)&+< 9) 6+&(A(6)CD+ &3 0+&+2 32032 >+0J32, @3'(A(6)1+2 23 + 320("+ H# 23 3*6+*0') )7"(6)&+ )+2 0'36F+2 23"36(+*)&+2, 3 *+ 6)2+ &3 H# 34(20(', + 1321+ 23'# '31+@(&+ &3(4)*&+ + 0340+ 231 + 320("+ 6"(6)&+< %&(6(+*3 ) 6)&) .1 &+2 >+0J32 ) "(*F) &3 6M&(/+ 6+''327+*&3*03 -.3 320# 7'3@(20) *) ./-)(0+1 ?3 L1 '32.1+, + -.3 320)1+2 A)B3*&+ : )&(6(+*)' +. '31+@3' + 320("+ 317'3/)&+ N 7'+7'(3&)&3 /$,7##%*L>#$4 &+ 6+17+*3*03 B*(0;$@#< \31+2 )(*&) ) 6+&(A(6)CD+ &+2 0'^2 W"0(1+2 >+0J32 &3 )6322+ '#7(&+ &+ *+22+ 2(2031), 6+''327+*&3*032 )+ )"(; *F)13*0+ &+ 0340+ )+ ")&+ 32-.3'&+, 63*0')"(B)&+ 3 N &('3(0) &+ 3&(0+'< I)') )"(*F)' + 0340+ 23"36(+*)&+, 1+&(A(6); 1+2 ) 7'+7'(3&)&3 %"(/*13*0 )0'(>.(*; &+ +2 @)"+'32 0)j3A0z.20(AuR_32-.3'&)`U, 0)O3103'R_63*0'+`U +. 0)a(/0Fz.20(Au R_&('3(0)`U )+ 3@3*0+ !*O"(6• &+2 >+0J32  >0*L2-.3'&), >0*O3*0'+ 3 >0*K('3(0), '327360(@)13*03< G3H) + 6M&(/+ &+ >+; 0D+ >0*L2-.3'&)< a37(0) + 6M&(/+ 7)') +2 &31)(2 >+0J32 0'+6)*&+ )73*)2 ) )0'(>.(CD+ A(*)"E  

TextEditor.Paragraph.Alignment := taLeftJustify;

%7M2 0+&+ 3223 7'+6322+ &3 6+&(A(6)CD+ &+2 13*.2 3 >+0J32 &3 )6322+ '#7(&+ &+ 2(2031), )6)>)1+2 6+1 ) 6'()CD+ &+ *+2; 2+ 7'M7'(+ 3&(0+' &3 0340+2, -.3 7+&3'# 23' 0320)&+ 3 .0("(B)&+ 7)') )7"(6)CD+ &3 &(@3'2+2 320("+2< L436.03;+ 3 A)C) ) &(/(0)CD+ &3 @)"+'32,

.0("(B)*&+ 0+&)2 )2 7'+7'(3&)&32 )-.( 6+*; A(/.')&)2< G3H) -.3 (*W13')2 )CJ32 6+1 + 0340+ 7+&31 23' 23"36(+*)&)2 RU<

Listagem 6. Alteração do tipo, tamanho e cor da fonte do texto procedure   TfrmEditor.ckFontesChange(Sender: TObject); begin { Altera o tipo da fonte no texto selecionado. } TextEditor.SelAtt ributes.Name := ckFontes.Items[ckFontes.ItemIndex]; end; procedure   TfrmEditor.ckTamanhoChange(Sender: TObject); begin { Altera o tamanho da fonte no texto selecionado. } TextEditor.selatt ributes.Size := StrToInt(ckTamanho.Items[ckTamanho.ItemIndex]); end;

Conclusão

procedure   TfrmEditor.ckCorChange(Sender: TObject); begin { Altera a cor da fonte no texto selecionado. } TextEditor.selatt ributes.Color := ckCor.Selected; end;

Listagem 7. Aplicação de estilos ao texto. procedure   TfrmEditor.btNegritoClick(Sender: TObject); begin if (fsBold in  TextEditor.selattributes.Style) then TextEditor.selatt ributes.Style := TextEditor.SelAtt ributes.Style TextEditor.selatt ributes.Style := TextEditor.SelAtt ributes.Style + end; procedure   TfrmEditor.btItalicoClick(Sender: TObject); begin if (fsItalic in  TextEditor.selattributes.Style) then TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style else TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style end; procedure   TfrmEditor.btSublinhadoClick(Sender: TObject); begin if (fsUnderline in  TextEditor.selattributes.Style) then TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style else TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style end; procedure   TfrmEditor.btRiscadoClick(Sender: TObject); begin if (fsStrikeOut in TextEditor.selattributes.Style) then TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style else TextEditor.sela ttributes.Style := TextEditor.SelAtt ributes.Style end;

Figura 6. Utilizando funcionalidades do Editor de textos

[fsBold] else [fsBold];

G(1+2 6+1 322) 6'()CD+ &+ 3&(0+' &3 0340+2 -.3 7+&31+2 6'()' *+22)2 7'M; 7'()2 A3'')13*0)2 &3 0')>)"F+< ]1)/(*3 *3203 6)2+ ) 2.>20(0.(CD+ &+ >"+6+ &3 *+0)2 73"+ 23. 7'M7'(+ 3&(0+' &3 0340+2 3 -.31 2)>3 6+1 1)(2 A.*6(+*)"(&)&32< O'(3 )/+') A+'1."#'(+2 73'2+*)"(B)&+2 3 7'+/')13 *+@)2 .0("(&)&32 )+ 3&(0+', )&(6(+*3 1:0+&+2 7)') 1)'6)&+'32 3 *.; 13')&+'32 &3 7)'#/')A+2, 327)C)13*0+ &+ 0340+ 3*0'3 "(*F)2 3 "30')2, 732-.(2)2 7+' 7)")@')2, 2.>20(0.(CD+ &3 0340+2, 3*0'3 +.0')2 (*W13')2 A.*6(+*)"(&)&32 -.3 7+&3'D+ 23' 6+*A(/.')&)2< %>')C+ 3 )0: ) 7'M4(1)<

- [fsItalic] + [fsItalic];

Dê seu feedback sobre esta edição! - [fsUnderline] + [fsUnderline]

A Java Magazine tem que ser feita ao seu gosto.Para isso, precisamos saber o que você, leitor, acha da revista!

  u

  e    s      ê

 F eedb a c  k  

     D

  i    ç     ã       o

Dê seu voto sobre este artigo, através do link: - [fsStrikeOut] + [fsStrikeOut]

  e   s   t    a     e    d

www.devmedia.com.br/javamagazine/feedback 

4)' 6")'+ -.3 ) "(*/.)/31 -.3 320)1+2 0')>)"F)*&+ : + IfI 3 -.3 + 1321+ : (*03'7'30)&+, A')6)13*03 #*8'?5 3 23*&+ )22(1 *D+ F# ) *36322(&)&3 &3 23 &36"); ')' @)'(#@3(2 6+1 23.2 0(7+2< Q)2 + -.3 (22+ 031 ) @3' 6+1  85,*:5%&*4:5P \.&+‰ !>23'@3 + 6M&(/+ &) ./-)(0+1 2< 9+ 6M&(/+ &) ./-)(0+1 2 23'# "3@)*; 0)&) .1) 3463CD+ *+ 3@3*0+ 1"+,*(O &+  >+0D+ 6+1 ) 13*2)/31 _931 0+&+ 23' @(@+ 7'+&.B 2+1‰‰‰` 1321+ .1 +>H30+ &+ 0(7+ ;\5:$: 23*&+ (*20)*6()&+ 7)') ) @)'(#@3" /$%< ]22+ )6+*0363 7+'-.3 *+ K3"7F( +2 1:0+&+2 2D+ 320#0(6+2 7+' 7); &'D+< ]22+ 2(/*(A(6) -.3 (*&373*&3*03 &+ +>H30+ -.3 23H) (*20)*6()&+ *) @)'(#@3" @)"3 7)') 3") + 0(7+ -.3 A+( &36")')&+< I)') 6+*23/.('1+2 + 3A3(0+ &323H)&+, +. 23H), + 1:0+&+ V%5?>E*%/5: &) 6")223 ;\5:$:  23H) 6F)1)&+, : 7'36(2+ &3; 6")')' + 1:0+&+ V%5?>E*%/5: *) 6")223 ;/$%X*=5  6+1+ X*%#>',< ]22+ A)B 6+1 -.3 + K3"7F( 6'(3 .1) GQ\R_G('0.)" Q30F+& \)>"3`U .1) 0);  >3") 6+1 +2 7+*03('+2 &+2 1:0+&+2 -.3 A+')1 &36")')&+2 6+1+ @('0.)(2 7)') -.3 7+22)1 23' 2+>'326'(0+2 31 0317+ &3 3436.CD+< 9) ./-)(0+1 4 @31+2 6+1+ A(6)'() + 6M&(/+< 9+ IfI *)&) &(22+ : *36322#'(+, 6+1+ 3"3 3 A')6)13*03 0(7)&+, +. 23H), *D+

Nota do DevMan O termo Programação Procedural (ou programação procedimental) é às vezes utilizado como sinônimo de Programação Imperativa (paradigma de programação que especifica os passos que um programa deve seguir para alcançar um estado desejado), mas o termo pode se referir (como neste artigo) a um paradigma de programação baseado no conceito de chamadas a procedimentos. Procedimentos, também conhecidos como rotinas, subrotinas, métodos, ou funções simplesmente contêm um conjunto de passos computacionais a serem executados. Um dado procedimento pode ser chamado a qualquer hora durante a execução de um programa, inclusive por outros procedimentos ou por si mesmo.

Listagem 1. Polimorfismo no Delphi Win32 unit SeresVivos; interface type TServivo = class procedure ProduzirSom; end;

TCachorro = class(TServivo) procedure  ProduzirSom; end; THomem = class(TServivo) procedure  ProduzirSom; end; implementation uses SysUtils, Dialogs; { TCachorro }

procedure   TCachorro.ProduzirSom; begin ShowMessage(‘Ca chorro Latindo !!!’); end; { TServivo }

procedure   TServivo.ProduzirSom; begin raise Exception.Create(‘Nem todo ser vivo produz som !’); end; { THomem }

procedure   THomem.ProduzirSom; begin ShowMessage(‘Ho mem Falando !!!’); end; end. procedure  TForm1.Button1Click(Sender: TObject); var Ser: TSerVivo; begin Ser := THomem.Create;   Ser.ProduzirSom; end;

Listagem 2. Métodos Virtuais unit SeresVivos; interface type TServivo = class procedure  ProduzirSom;virtual; end;

TCachorro = class(TServivo) procedure  ProduzirSom;override ; end; THomem = class(TServivo) procedure  ProduzirSom;override ; end; implementation end.

7'36(2)1+2 &36")')' + 0(7+ &3 *+22)2 @)'(#@3(2, *D+ F# 7+'-.3 +2 1:0+&+2 23'31 320#0(6+2, 3 *31 7+&31< O+1+ *D+ F# .1 0(7+ &3A(*(&+ 7)') + +>H30+ -.3 23'# (*20)*6()&+, 7+' 7)&'D+ 23'# 6F)1)&+ + 1:0+&+ &+ +>H30+ -.3 A+( (*2; 0)*6()&+ 7)') )-.3") @)'(#@3"< I+' (22+ 7+&31+2 &(B3' -.3 *+ IfI +2 1:0+&+2 2D+ _G('0.)(2` 3 (20+ A)6("(0) ) (17"313*; 0)CD+ &+  85,*:5%&*4:5 '3&.B(*&+ )22(1 + .2+ &3 6+*0'+"32 &3 A".4+2 6+1+ !&p4 7)') 0+'*)' *+22+ 6M&(/+ 1)(2 '+>.20+ 3 347)*2?@3"< G+6^ &3@3 320)' 23 73'/.*0)*&+E   |/$ "a5 8%$(*4':54 ?$(,'%'% 5 #*85 ?$ "544'4 ='%*d=$*4 $ ?$ "54454 5L]$#54c (5:5 4'L$% 4$ >: 5L]$#5 8$%#$"($ ' >:' ?$#$%:*"'?' 0*$%'%T>*' 5> 8544>* 5 :•#5?5 T>$ T>$%$:54 (0':'%€IQ

I)') (20+ 031+2 *+ IfI h + +73')&+' *"4#'"($5& 3 L"3 @3'(A(6) 23 .1 +>H30+ -.)"-.3' 7+22.( .1 '3")6(+*)13*0+ • >: 6+1 .1) 6")223 32736?A(6)< L"3 *) @3'&)&3 : .1) 1+&(A(6)CD+ &) H# 34(203*; 03 A.*CD+ *4u'FG -.3 A+( &326+*0(*.)&), 7+(2 + 7'(13('+ : .1 +73')&+' >(*#'(+ "M/(6+ 73'1(0(*&+ 6'()' 23*03*C)2 6+1+ ) 23/.('E if($c instanceof  Cliente) { echo ‘$c é um cliente’; }

I)') 34317"(A(6)' 322) A)6("(&)&3 +>; 23'@3 + 6M&(/+ &) ./-)(0+1 5< I+&31+2 *+0)' A)6("13*03 -.3 + 6M&(/+ 326'(0+ *D+ 320# 347)*2?@3"< ]1)/(*3 -.3 @+6^ &36(&) 6'()' 31 23. 1+&3"+ 1)(2 6(*6+ )*(1)(2 6)&) .1 7'+&.B(*&+ 23. '327360(@+ 2+1, (22+ 23 0+'*)'() 7)') @+6^ .1 0+'13*0+, 7+(2 03'() -.3 )&(6(+*)' +.0'+2 6(*6+ >"+6+2 $,4$*&  7)') A)B3' ) @3'(A(6)CD+< ]22+ A3'3 + 6+*63(0+ &3 '3)7'+@3(0)13*0+ &3 6M&(/+ 3 7(+' &+ -.3 (22+ (1)/(*3 + 2+A'(13*0+ -.3 23'() 7)') &)' 1)*.03*CD+ 31 .1 6M; &(/+ &3203 7+'03< L*0D+ 3223 6M&(/+ 320# 0+0)"13*03 A+') &3 6+/(0)CD+< ! .2+ &) F3')*C) 6+1 +  85,*:5%&*4:5 *+2 )H.&) ) '32+"@3' 3203 7'+>"31), ) (*03*CD+ : A)B3' ) 1321) 6+(2), 7+':1 &3 .1) 1)*3(') -.3 *+2 )H.&3 ) 347)*&(' *+22+ 6M&(/+, '3)7'+@3(0#;"+ 3 1)(2 &+ -.3 (22+ -.3 A)6("(03 ) 1)*.03*CD+ &+ 1321+< ]22+ )7"(6)&+ *) 7'#0(6) 23 0+'*) + 6M&(/+ &326'(0+ *) ./-)(0+1 ;<

9+03 -.3 )/+') 6'()1+2 .1) 6")223 /$%X*=5 -.3 23'@('# &3 >)23 7)') 0+&)2 )2 +.0')2 6")2232 &3 )*(1)(2 -.3 ('31+2 6'()' 3 -.3 ('D+ 7'+&.B(' )"/.1 2+1< p *320) 6")223 -.3 320# &36")')&+ + 1:0+&+ -.3 23'# 2+>'326'(0+ *)2 6")2232 &3263*; &3*032 7+':1 *D+ F# )-.( ) *36322(&)&3 &3 *3*F.1 7)'q130'+ +. &('30(@) 7)') 0+'*)' 3203 1:0+&+ @('0.)" 3 7)22?@3" &3 23' 2+>'326'(0+< !>23'@3 -.3 &320) 1)*3(') + *+22+ 6M&(/+ *D+ A(6) _3*; /322)&+`< X3 7+' 34317"+ &36(&('1+2 6'()' .1) 6")223 :1 + 6+*63(0+ &3 6")2232 3 1:0+&+2 )>20')0+2< K(B )>20')0+ .1 1:0+&+ -.3 *D+ 7+22.( (17"313*; 0)CD+ +. .1) 6")223 -.3 *D+ &3@3 23' (*20)*6()&), -.3 23'@3 )73*)2 &3 '3A3; '^*6() 7)') 23' F3'&)&) 3 + 1:0+&+ 7)') 23' 2+>'326'(0+< ]20+ : 1.(0+ 6+1.1 31 !!, 7+(2 -.)*&+ 0')>)"F)1+2 6+1 /')*&32 3-.(732 3 31 /')*&32 7'+H30+2 /3')"13*03 -.3'31+2 /)')*0(' -.3 &303'1(*)&)2 6")2232 03*F)1 63'0+2 1:0+&+2 3223*6()(2 )+ A.*6(+*); 13*0+ &+ 1+&3"+ 3 6+1+ 2D+ @#'(+2 +2

7'+/')1)&+'32 3*@+"@(&+2 *+ 7'+6322+ &3A(*(1+2 32232 1:0+&+2 6+1+ )>20')0+2 &31+*20')*&+ )22(1 ) *+22) (*03*CD+ &3 -.3 3"3 23H) 2+>'326'(0+ *) 6")223 -.3 + F3'&+.< O+1 (22+ 031+2 .1 6M&(/+ 1)(2 +'/)*(B)&+, 1)(2 6+32+< % 7'M7'() 6")223 *+2 "31>') -.3 7'36(2)1+2 (17"313*0)' 3223 1:0+&+ 31 )"/.1 1+13*0+< 9+ 8KX gxxi, -.)*&+ 031+2 .1 1:0+&+ )>20')0+ 31 .1) 6")223 3 F3'&)1+2 &) 1321), )+ .0("(B)'1+2 + +5?$+5:8,$#*5" 3203 1:0+&+ )7)'363 31 @3'13"F+ (*&(6)*&+ -.3 7'3; 6(2) 23' (17"313*0)&+< s1 A)0+ (17+'0)*03 ) 23' "31>')&+ : -.3, *+ IfI 23 .1) 6")223 7+22.( )+ 13*+2 .1 1:0+&+ )>20')0+ 3") &3@3 23' &36")')&) 6+1+ )>20')0) &(A3'3*03 &3 +.0')2 "(*/.); /3*2 &3 7'+/')1)CD+< L22) &.7") &3A(*(CD+ 34(203 7)') 73'1(0(' ) @+6^ &36")')' .1) 6")223 6+1+ )>20')0) 1321+ -.3 ) 1321) *D+ 7+22.) 1:0+&+2 )>20')0+2< 9+ 34317"+ &+2 *+22+2 23'32 @(@+2 A(6) 6")'+ -.3 *31 0+&+2 +2 23'32 7'+&.B31 2+1, )22(1 3203 1:0+&+ *320) 6")223 *D+ &3@3 03' (17"313*0)CD+ A(6)*&+ *+22) 6")223 6+1+ ) &) ./-)(0+1 =< 9+03 *) ./-)(0+1 = -.3 ) 6")223 /$%X*=5 )/+') A+( &36")')&) 6+1+ 'L4#%'(# , 7+(2 &+2 0'^2 1:0+&+2 -.3 ) 1321) 7+22.( .1 &3; "32 : )>20')0+ 3 7+' (22+ 031+2 -.3 &36")')' ) 6")223 6+1+ )>20')0) 0)1>:1< %22(1 /$%2 X*=5 *D+ 7+&3'# 23' (*20)*6()&) 3 0)1>:1 *D+ F)@3'# *36322(&)&3, 7+(2 320) 6")223 : )73*)2 .1) >)23 7)') )2 &31)(2< O+1+ 0+&+ 23' @(@+ *)263, 6'3263, 23 '3; 7'+&.B 3 1+''3, 7+&31+2 +>23'@)' -.3 031+2 )"/.1)2 &322)2 A)232 31 A+'1) &3 1:0+&+2 31 /$%X*=5 , *D+ 6+1+ )>20')0+2, 1)2 7)22?@3(2 &3 23'31 2+>'326'(0+2<

Métodos e Propriedades Estáticas p &3 6+*F36(13*0+ /3')" -.3 .1) 6")223 7+&3 &36")')' _*` 7'+7'(3&)&32 3 1:0+&+2< O)&) (*20q*6() &320) 6")223, +. 23H), 6)&) +>H30+ 7+22.( .1) 6M7() &320)2 7'+7'(3&)&32 3 1:0+&+2< ]22+ 2(/*(A(6) -.3 7+&31 '363>3' @)"+'32 &(20(*0+2 3 23.2 1:0+&+2 23'31 6F)1)&+2 &3 A+'1) (*&373*&3*03< I+':1 31 !! 031+2 .1 6+*63(0+ 6F)1)&+ &3 7'+7'(3&)&32 320#; 0(6)2 3 1:0+&+2 320#0(6+2< XD+ 3"313*0+2 -.3 73'03*631 N 6")223 3 *D+ )+ +>H30+, 6+1 (20+ 3"32 7+&31 23' )6322)&+2 3 (*@+6)&+2 ) 7)'0(' &) 6")223 231 ) *3632; 2(&)&3 &3 23 (*20)*6()' + +>H30+<

I+&31+2 03' @#'(+2 +>H30+2, 1)2 0+&+2 3"32 +'(.*&+2 &3 .1) W*(6) 6")223< O+1+ )2 7'+7'(3&)&32 3 1:0+&+2 73'03*631 N 6")223 7+&31+2 &3&.B(' -.3 322)2 7'+; 7'(3&)&32 3 1:0+&+2 2D+ 6+17)'0("F)&+2 7+' 0+&+2 +2 +>H30+2< f# )"/.1)2 6+*2(&3')CJ32 2+>'3 + .2+ &3 1:0+&+2 3 7'+7'(3&)&32 320#0(6)2 *+ IfI< I+' 34317"+, 7)') 23 )6322)' 7'+; 7'(3&)&32 320#0(6)2 &3 &3*0'+ &) 7'M7'() 6")223 031+2 -.3 .0("(B)' + +73')&+' /$,&ee  -.3 )-.( 031 .1) A.*CD+ +7+20) ) &+ K3"7F( +*&3 + /$,&   : .2)&+ 7)') A)B3' '3A3'^*6() )+ +>H30+ &+ 6+*0340+ 3*-.)*0+ *+ IfI .2)1+2 7)') )6322)' ) 6")223< !.0'+ &30)"F3 : -.3 7)') )6322)' .1) 7'+7'(3&)&3 +. 1:0+&+ &3203 0(7+ 031+2 -.3 A)B^;"+ )0')@:2 &) 6")223 &3 &.)2 1)*3(')2E Classe::Propriedade Classe::Método()

Q)2 @+6^ &3@3 320)' 23 73'/.*0)*&+ 23 '3)"13*03 A)'# .2+ &3203 0(7+ &3 '36.'2+ 3 23 3"3 : '3)"13*03 *36322#'(+< I+(2 3*; 0D+ +>23'@3 + 6M&(/+ &) ./-)(0+1 >< ! -.3 031+2 )-.( : .1) 6")223 6"(3*03 6+1.1 3 2(17"32, 7+':1 6+1 .1 6+*0)&+' -.3 '3/(20') ) -.)*0(&)&3 &3 +>H30+2 &320) 6")223 -.3 A+')1 (*20)*6()&+2< I+' (22+ ) 7'+7'(3&)&3 320#0(6) S+5"#'?5% , 7'+7'(3&); &3 320) -.3 73'03*63 N 6")223 3 *D+ )+ +>H30+, : 6+17)'0("F)&) 7+' 0+&)2 )2 (*20q*6()2< !>23'@3 -.3 *+ 6+*20'.0+' )6322)1+2 320) 7'+7'(3&)&3 )0')@:2 &+ +73')&+' /$,&  3 + (*; 6'313*0)1+2 31 .1< b3(0+ (22+ )0'(>.?1+2 + @)"+' &+ 6+*0)&+' N 7'+7'(3&)&3 S*? , 322) 2(1 73'03*63*03 )+ +>H30+< ! 1:0+&+ +%*'%+,*$"#$4   3436.0) .1 ")C+ &5% 3 (*20)*6() &3B +>H30+2 +,*$"#$4 3 "+/+ )7M2 1+20') *+ *)@3/)&+' + @)"+' &) 7'+7'(3&)&3 S*?< I+&3'?)1+2 (*6".(' *320) 6")223 +,*$"#$

.1 1:0+&+ 7)') +>03' + @)"+' )0.)" &+ 6+*0)&+' &) 6")223< L203 1:0+&+ &3@3'# 23' 320#0(6+ 7)') 3@(0)' -.3 23 03*F) -.3 (*20)*6()' ) 6")223 7)') (*@+6)' + 1:0+&+< G3H) 6+1+ A(6)'() 6+1 322) 1+&(A(6)CD+ *) ./-)(0+1 ?< !>23'@3 -.3 )&(6(+*)1+2 ) *+22) 6")223 +,*$"#$ .1 1:0+&+ 320#0(6+ -.3 '30+'*) ) 7+2(CD+ )0.)" &+ 6+*0)&+'< I)') (*@+6#;"+ .0("(B)1+2 ) 7'M7'() 6")223 231 ) *36322(&)&3 &3 23 (*20)*6()' .1 +>H30+E +,*$"#$ee"#FG3

Criando um exemplo p *+0M'(+ -.3 +2 34317"+2 6(0)&+2 )6(; 1) 23'@31 )73*)2 7)') 34317"(A(6)' +2 6+*63(0+2 )>+'&)&+2 )-.(< I)') -.3 @+6^ 7+22) 03' .1) *+CD+ &3 6+1+ + 7+"(1+'; A(21+ ).4("() 31 0)'3A)2 &(#'()2 @)1+2 6+*20'.(' .1 73-.3*+ 34317"+ )>+'&)*; &+ + 6+*63(0+ )6(1)< %>') + K3"7F( A+'

Listagem 3. Codigo PHP sem polimorfismo

Listagem 5. Classes abstratas no PHP



Listagem 4. Polimorfismo aplicado no PHP

class Cachorro extends SerVivo{ function  ProduzirSom(){ echo “Cachorro Latindo !”; } } class Homem extends SerVivo{ function  ProduzirSom{ echo “Homem Falando !”; } } function GetSom($Obj){ if ($Obj instaceof  SerVivo){   $Obj->ProduzirSom(); }else{ echo “O objeto passado não é um ser vivo !”; } } ?>

Listagem 6. Propriedade Estática no PHP

IfI 3 6'(3 .1) *+@) )7"(6)CD+< I)') (22+ )63223 + 13*. A*,$qN$Mr788,*('#*5" < X)"@3 ) )7"(6)CD+ 7'322(+*)*&+ +#%,./0*&#./ +. 326+"F)  A*,$r/'=$ V%52  ]$(# 74 6+1 + *+13 _I'HI+"(1+'A(21+< 7F7'H` 3 31 23/.(&) 2)"@3 ) )"*# 6+1+ _(*&34
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF