!"#$%&%"'() 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("3e93Vs*(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