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!
Atendimento ao Leitor
A DevMedia conta com um departamento exclusivo para o atendi-mento ao leitor. Se você tiver algum problema no recebiatendi-mento do seu exemplar ou precisar de algum esclarecimento sobre assinaturas, exemplares anteriores, endereço de bancas de jornal, entre outros, entre em contato com:
Carmelita Mulin
www.devmedia.com.br/central/default.asp
(21) 3382-5025
Kaline Dolabella
Gerente de Marketing e Atendimento
(21) 3382-5025
Publicidade
Para informações sobre veiculação de anúncio na revista ou no site entre em contato com:
Kaline Dolabella [email protected] 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
Ano 8 - 94ª Edição - 2008 - ISSN 1517990-7 Impresso no Brasil
!"#$%&%"'()
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:
Guinther Pauli - Editor da Revista [email protected]
Portal do Assinante
A ClubeDelphi tem uma novidade para você que comprou este exemplar na banca de jornal: você pode acessar GRATUITAMENTE, o Portal do Assinante ClubeDelphi!
Confira o que você encontra no Portal do Assinante:
- Mais de 560 Vídeo Aulas! - 7 cursos online!
- 1 Livro Eletrônico sobre ADO.NET e BDP! - Mais de 150 Artigos Exclusivos!
Para Utilizar o Portal do Assinante, acessewww.devmedia.com.br/clubedelphi/potal.asp
e utilize as informações abaixo:Login: DVM.PL e Senha: STX200
O acesso é válido por 30 di as a partida da data de lançamento da revista. Todos os meses a ClubeDelphi lhe dará uma senha válida para acessar o portal. Comprando a revista regularmente em bancas, você terá acesso ininterrupto a ele!
N Ã O
P E R C
A
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
!"#$#
Guinther Pauli
Microsoft Certified: MCP, MCAD, MCSD.NET
Informativo ClubeDelp
Aprenda a desenvolver sistemas para o sistema operacional PalmOS
Acompanhe as aulas de Ricardo Boaro que falam unicamente do desenvolvimento de aplicações para PalmOS utilizando o IDE PocketStudio que é bastante semelhate ao Delphi inclusive utilizan-do-se de linguagem Pascal.
Curso Aplicação ASP.NET com Delphi e SQL Server 2005 Express-Parte IV a X – Testando a classe de locação de fitas
Veja nessa vídeo aula de Luciano Pimenta as prin-cipais diferenças de sintaxe para Stored Procedu-res e Triggers entre FireBird e SQL Server 2005.
Desenvolvendo uma aplicação para PalmOS com PocketStucio - Parte XIII a XV
Veja nessas vídeo-aulas de Ricardo Boaro, como traba-lhar com aplicações PalmOS com o PocketStudio.
Mini-Curso Controle de Versão com JEDI VCS
Veja nesse mini-curso de Adriano Santos como trabalhar com esta fabulosa ferramenta para con-trole de versão e gerenciamento de equipes!
Como construir um WebServices com Delphi 7
Veja nessa vídeo aula de Guinther Pauli como de-senvolver e trabalhar com WebServices usando o Delphi 7.
Construindo uma ferramenta de busca de arquivos Parte I e II
Veja nessas vídeos de Paulo Quicoli como des volver uma podeorsa ferramenta para busca arquivos no disco rígido.
Últimas Vídeo-Aulas
O portal ClubeDelphi PLUS é a continuação, na Web, da revista ClubeDelphi. O portal recebe um conteú-do novo toconteú-do dia e hoje conta com: i) mais de 560 vídeo aulas; ii) 7 cursos online; iii) 1 livro eletrônico gratuito, de Guinther Pauli, sobre ADO.NET e BDP; iv) mais de 150 artigos exclusivos (que não foram pu-blicados na revista)!;
Acesse o portal ClubeDelphi PLUS e receba muito mais conteúdo sobre Delphi! E o que é melhor: de graça! Todo leitor da revista ClubeDelphi, seja ele assinante ou comprador da revista em bancas, tem acesso ao portal (para quem compra em bancas, o acesso é válido por 30 dias).
Se você é assinante, utilize o seu login e senha
pes-soais para acessar o portal. Se você comprou bancas, utilize o login e senha publicados na pá do editorial desta edição.
Confira a seguir as últimas novidades do portal!
Boa leitura e sucesso! Equipe DevMedia
Caro Leitor
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 portalwww.devmedia.com.brpossui mais de2 mil vídeo aulas edezenas 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 emwww.devmedia.com.br/creditos
+560 vídeo aulas e 7 cursos online
1
í
Vídeo
Portal ClubeDelphi
Portal ClubeDelphi
www clubedelphi net portal
+460 vídeo aulas | 6 cursos online
Ask The Expert
Perguntas e Respostas
Dúvidas respondidas porAdriano Santos
(envie as suas para [email protected])
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;
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 3. Código dos eventos OnCreate e OnDestroy
procedure TMemoDragDropFrm.FormCreate(Sender: TObject);
begin
OleInitialize(nil);
OleCheck(Regist erDragDrop(Handle , Self));
end;
procedure TMemoDragDropFrm.FormDestroy(Sender: TObject);
begin
RevokeDragDrop(Handle); OleUninitialize;
end;
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:
procedure TForm1.Button1Click(Sender: TObject);
begin
ModificarFontes(Self);
end;
Mudando fontes do programa de
uma só vez
!(, /+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 '($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+< !"#$ &' ()*) +"),$-) () .$/+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!
Dê seu voto sobre este artigo, através do link: www.devmedia.com.br/javamagazine/feedback D ê s e u F eedb a c k s o b r e e s t a e d i ç ã o
eç o
eç o
eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
Gustavo Chaurais ([email protected])
é Borland Delphi 7 Advanced Certified, Borland Delphi 2005 for Win32 Certified, Borland Del-phi 2006 for Win32 Certified e Borland DelDel-phi 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 GIES-SC. Hoje, ministra cursos, presta consultoria e atua como Software Engineer do projeto InstallAnywhere para a empresa norte-ame-ricana Macrovision Corporation.
Streams
Implemente compactação, download em múltiplos pacotes e resources em
suas aplicações com técnicas avançadas de Streams – Parte 2
9
) 3&(CD+ )*03'(+', (*(6()1+2 ) 6'()CD+ &3 .1) )7"(6)CD+ -.3 A)B .2+ (*03*2(@+ &3 20'3)12 RL&(CD+ STU, -.3 (17"313*0) 6+17)6; 0)CD+, &+V*"+)& 31 1W"0(7"+2 7)6+032 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$4#/#%$': 3 +,$'"3$4#/#%$': 7)') (22+ R@3H) W"0(1) "(20)/31 &) 3&(CD+ )*03'(+'U< I+'0)*0+, 7+&3'31+2 3203*&3' 322) 6")223 A.0.'); 13*03 7)') /3')' ) 2)?&) 31 .1 4#%$': -.)"-.3', *D+ 2M 31 )'-.(@+2< X3/.31 2.)2 (17"313*0)CJ32 R*D+ 23 32-.3C) &) &('30(@)=*%#>', *3"32< G3H) *)./-)(0+1 2 ) (17"313*0)CD+ &)2 A.*CJ32<$#3$4#/2 #%$': 3+,$'"3$4#/#%$':< X3. A.*6(+*)13*0+ 0)1>:1 : >#2(6+E &326)'0)1+2 &+ )'-.(@+!"?$@ Y Z 3*0'); &)2 7)') 7+2(6(+*)' + 6.'2+' &+ 4#%$':&3 "3(0.')[ &37+(2 "31+2 + 0)1)*F+ &+ *+13, + *+13 3 + 0)1)*F+ &+ )'-.(@+, 0)1>:1 7)') 7+2(6(+*)' + 6.'2+'[ 3,
A(*)"13*03, "31+2 + 6+*03W&+ &+ )'-.(; @+ )0')@:2 &3 .1 +586A%5: &+ 4#%$':
0317+'#'(+<
9)./-)(0+1 4 7+&31+2 @3' ) (17"3;
13*0)CD+ &3 +.0'+ 1:0+&+ (17+'0)*03,
B$'?C"#%6< L20)1+2 )73*)2 "3*&+ .1)
3*0')&) 3 &326)'0)*&+;) 6)2+D%*#$B$4>,#
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<%*?R_&>/L*0'(32`U, .1 ;+,*$"#3'#'/$# R_6&2L*0'(32IU, .1 ;3'#'/5>%($ R_&2L*0'(32IU, &+(2 ;18$"3*',5J4R_!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<6&BUed<6&B`< X3. A("0'+ (*(6()" &3@3 23' 6+*A(/.')&+ 7)') _d<6&B`< K^ 0)1>:1 .1 0?0."+ )+2 &(#"+/+2< %&(6(+*3 ) +7CD+ 5&7,,5M9>,#*/$,$(# N 7'+7'(3&)&318#*5"4 &+ 6+17+*3*037??A*,$3*',5J< %>') + 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,$EA',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<%*?< !76(+*)"13*03, @+6^ 7+&3 6+*A(/.')' ) 7'+7'(3&)&3 !"?$@A*$,?N':$4 &+ (?2 4C"#%*$4 7)') _I%\f` 7)') +'&3*)' )2 3*0')&)2 7+' 3203 6)17+< I+2(6(+*3 +2 6+17+*3*032 6+*A+'13 )</0,$( 2<
%*032 &) (17"313*0)CD+ &3 -.)"-.3' 3@3*0+, &36")'3A+5:8%$445%R;+5:8%$445%U
Listagem 1. Métodos GetDestStream e CleanDestStream
function TCompressor.GetDestStream(const DestFilePath:
string): TStream;
begin
Result := TFileStream.Crea te(DestFilePath, fmCreate);
end;
procedure TCompressor.CleanDestStream(const DestStream: TStream);
begin
DestStream.Free;
end;
Listagem 2. Método ReadEntry
procedure TCompressor.ReadEntry(WriteResult: Boolean); var Buffer: TBuffer; NameLength: Integer; begin FStreamRead.Rea d(Buffer, 4); if WriteResult then FStreamWrite.Wri te(Buffer, 4);
NameLength := BinToInt(CopyFr omBuffer(Buffer, 4)); FStreamRead.Rea d(Buffer, NameLength);
if WriteResult then
FStreamWrite.Wri te(Buffer, NameLength); FStreamRead.Read (Buffer, 8);
if WriteResult then
FStreamWrite.Wri te(Buffer, 8);
ReadFile(BinToI nt64(CopyFromBuff er(Buffer, 8)), WriteResult); end;
Listagem 3. Método Delete
procedure TCompressor.Delete(Index: Integer);
var i: Integer; ATempStream: TFileStream; begin RestartStream(fmOpenRead); try
ATempStream := TFileStream.Cre ate(FFilePath + ‘.tmp’, fmCreate); try
FStreamWrite := TCompressionStr eam.Create(clMax , ATempStream); FStreamRead := TDecompressionSt ream.Create(FInt ernalStream); for i := 0 to Index - 1 do ReadEntry(True); ReadEntry(False); CopyEntireStream; finally CloseStreams; ATempStream.Free; end; finally CloseStreams; end; DeleteFile(FFilePath);
RenameFile(FFil ePath + ‘.tmp’, FFilePath); RestartStream(fmOpenRead);
FStreamRead := TDecompressionStr eam.Create(FInter nalStream); try PopulateEntries; finally CloseStreams; end; end; *) 23CD+ 8%*='#$ &) 6")223;&:+5:8%$44*5" 3 @)1+2 N (17"313*0)CD+ &+ 1:0+&+B$2 ,5'?C"#%*$4 6+*A+'13 )./-)(0+1 ;< L203 1:0+&+ : 1.(0+ 2(17"32, 320)1+2 )7)/)*&+ +2 &)&+2 &3 (?4C"#%*$4 3 )&(;
6(+*)*&+ ) 3"3 0+&)2 )2 3*0')&)2 &+ 6+1; 7'322+'< %":1 &3 320)'1+2 6+*0'+")*&+ ) )0.)"(B)CD+ &+ ?LJC"#%*$4 )0')@:2 &+2
1:0+&+23*4'L,$+5"#%5,4 3C"'L,$+5"#%5,4< G)1+2 (17"313*0)' )2 +73')CJ32 N$M
3 18$"< I)') (20+, 1)*(7."3 + 3@3*0+ 1"+,*(O &+ >+0D+ #LN$M &3 )6+'&+ 6+1 )./-)(0+1 =<
! 3@3*0+1"+,*(O &+ >+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 ><
Figura 1. Interface gráfica do projeto Compression
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; 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+ &3C@#%'(# , (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 <(?E 320# 7'+*0) 7)') 23' .0("(B)&)< G+6^ 7+&3 )/+') 03*0)' )&(6(+*)' +.0'+2 '36.'2+2 6+1+ 6'(70+/')A() )+ 23. )'-.(@+ 6+1; 7)60)&+< %":1 &(22+, 6+1+ 6'()1+2 .1) 6")223, @+6^ 7+&3 31>.0(' 322) A3'')13*; 0) 31 2.) )7"(6)CD+ 7)') 0')*27+'0)' )'-.(@+2 6+1 1)(2 A)6("(&)&3<
Trabalhando com Resources
\+&+ 7'+/')1) 5(*&+V2 &3 (*03'A)63 /'#A(6) )7'323*0) .1) 2:'(3 &3 '36.'2+2 -.3 *D+ 2D+ )73*)2 6M&(/+ 6+17(")&+, 6+1+E
Listagem 6. Código do botão Add
procedure TfmCompression.tbAddClick(Sender: TObject);
var i: Integer; Entry: TCompressionEntr y; begin cdsEntries.DisableControls; try if AddFileDialog.Execute then begin
for i := 0 to AddFileDialog.Files.Count - 1 do begin
Entry := FCompressor.Add(A ddFileDialog. Files[i]);
cdsEntries.Append;
cdsEntriesPATH. AsString := Entry.Path; cdsEntriesFILE_ SIZE.AsLargeInt := Entry. FileSize;
cdsEntriesENTRY _INDEX.AsInteger := FCompressor. EntriesCount - 1; cdsEntries.Post; end; end; finally cdsEntries.EnableControls; end; end;
Listagem 7. Código do botão de extração
procedure TfmCompression.tbExtractClick(Sender: TObject);
var
ExtractTo: string; i: Integer;
begin
if SelectDirectory(‘Extract to’, ‘c:\’, ExtractTo)
then begin
cdsEntries.DisableControls;
try
for i := 0 to dbgEntries.SelectedRows.Count-1do begin cdsEntries.GotoBookmark(Pointer(dbgEntries. SelectedRows.Items[i])); FCompressor.Extract(cdsEntriesENTRY_INDEX. AsInteger, ExtractTo); end; finally cdsEntries.EnableControls; end; end; end;
Listagem 8. Código para remoção de arquivo
procedure TfmCompression.tbRemoveClick(Sender: TObject);
var
i: Integer;
ToRemove: TStrings;
EntryIndexToRem ove, iToRemove: Integer;
begin
cdsEntries.DisableControls; ToRemove := TStringList.Creat e;
try
for i := 0 to dbgEntries.SelectedRows.Count-1 do begin cdsEntries.GotoBookmark(Pointer(dbgEntries. SelectedRows.Items[i])); ToRemove.Add(cdsEntriesENTRY_INDEX.AsString); end; while ToRemove.Count > 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; ?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 H!;97V ,!+1N ,+)B/1B , WVC< ,D7XC , ;CY; 3 B+37;7 R/3*:'(6+U< % 03'63(') 6+".*) 6+*0:1 + 6)1(*F+ R)>2+".0+ +. '3")0(@+U 7)') + )'-.(@+< j31>'3;23 &3 -.3 (*W13')2 "(*F)2 R3*0')&)2U 7+&31 23' )&(6(+*)&)2 )+ )'-.(@+QB+< %7+*03 7)') -.)"-.3' >(>"(+036) 31 23. 2(2031) 7)') 0320)'<
O+1 + A+*03 QB+ 7'+*0+, &3@31+2 6+17("#;"+ 7)') .1QBC/< I)') (22+, @+6^
7+&3 .0("(B)' + 7'+/')1)HB++Z[Q$@$ , *) 7)20) L*" &+ 3$,80*< %>') .1) "(*F) &3 6+1)*&+ 3 &(/(03E
[caminho para a pasta bin]\brcc32.exe [arquivo .RC ] 9) 7)20) )0.)" 23'# /3')&+ .1 )'-.(@+ <BC/ 6+1 + 1321+ *+13 &3 23. A+*03 QB+< O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+ _a32+.'63Kjj<&7'`< 9) >"*# &+ A+'1."#'(+ 7'(*6(7)", &(/(03E {$R caminho_para_o_arquivo_de_recurso_ compilado.RES} %&(6(+*3 .1 >+0D+ )+ A+'1."#'(+ 3 (17"313*03 23. 3@3*0+ 1"+,*(O (/.)" ) ./-)(0+1 A3]*(6(3 + 7'+/')1) 3 6"(-.3 *+ >+0D+< % Kjj 23'# 340')?&) 7)') ) 1321) 7)20), 6+1 + *+13$@#%'(#$?Q?,,<
a3"31>')*&+ + 6+*63(0+ &34#%$':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
Figura 2. Simple Resource Editor
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</0,$( 4U, &3 1(*F)
).0+'(), 7)') ) 1)*(7.")CD+ &+2 )'-.(; @+2 QB+< O+1 3"3 @+6^ 7+&3 A)6("13*03
)&(6(+*)' *+@+2 )'-.(@+2 R>.26)*&+;+2 7+' &(#"+/+2 32736()(2U, 6+17(")' 7)') )'-.(@+2 QBC/ , &3*0'3 +.0')2 A.*6(+*); "(&)&32 >)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?$<$'% R((Q(5?$J$'%Q (5:G , 7'+6.')*&+;23 73"+ ).0+' <>4#'=5 +0'>%'*4< X3. 6M&(/+ A+*03 320# (*6".2+ 3
: 1.(0+ (*03'322)*03 7)') 320.&+<
Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma vídeo aula de Adriano Santos que mostra como trabalhar com o plug-in Simple Resource Editor.
www.devmedia.com.br/articles/viewcomp.asp?comp=5476&hl= www.devmedia.com.br/clubedelphi/portal.asp G)1+2 )/+') 1(20.')' .1 7+.6+ )2 6+(2)2< O+*20'.('31+2 .1 34317"+ -.3 .0("(B)'# .1 )'-.(@+ 6+17'(1(&+ )0'); @:2 &+ 34317"++5:8%$44*5"< O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+ B$45>%($P*8Q?8%< %&(6(+*3 ) 3"3 .1) *+@) )"*# 3 2)"@3;) 6+1+ B$4+5:8%$445%Q8'4< %&(6(+*3 0)1>:1 ))"*# +5:8%$445%Q8'4 , 6+*20'.?&) )*03'(+'13*03< 9) 23CD+)4$4 &3B$4+5:8%$445% , (*2(')E +5:8%$445% , +,'44$4 , /64)#*,43 D*"?5M4< %/+'), &36")'3 .1) 6")223;B$4+5:8%$42 45% , 3203*&3*&+ ;+5:8%$445%< K36")'3 3 (17"313*03 + 23/.(*03 1:0+&+ R6+1 ) &('30(@)%$*"#%5?>($UE
constructor TResCompressor.Create(const
ResName:
string);
begin
FResName := ResName;
inherited Create(‘’, False);
end;
L &36")'3 AB$4N':$ *) 23CD+ 8%*='#$
6+1+ 23*&+ &+ 0(7+4#%*"J< K36")'3 0)1; >:1 3 (17"313*03 + 23/.(*03 1:0+&+E
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;
Listagem 10. Código OnCreate do formulário
procedure TForm1.FormCreate(Sender: TObject);
var
AResCompressor: TResCompressor; AIndex: Integer;
AMemoryStream: TStream;
begin
AResCompressor := TResCompressor.Cr eate(‘IMAGESZIP’ );
try
AMemoryStream := TMemoryStream.Cr eate;
try
Randomize;
AIndex := RandomRange(0, AResCompressor.En triesCount); AResCompressor.Ex tractToStream(AI ndex, AMemoryStream); AMemoryStream.Pos ition := 0; FJpeg := TJpegImage.Creat e; FJpeg.LoadFromStream(AMemoryStream); finally AMemoryStream.Free; end; finally AResCompressor.Free; end; end; procedure TResCompressor. ExtractToStream(Index:
Integer; const ExtractTo: TStream);
begin FDestStream := ExtractTo; inherited Extract(Index, ‘’); end; %&(6(+*3 0)1>:1A3$4#/#%$': N 23CD+ 8%*='#$ &) 6")223< L203 1:0+&+ 23'# .0("(; B)&+ 7)') 340')('1+2 .1 %$45>%($ 7)') .14#%$': -.)"-.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+&+<$#3$4#/#%$': : .0("(B)&+ 7)') ) (*(6()"(B)CD+ &3 .1) 4#%*"J +*&3 23'# /')@)&+ + )'-.(@+ 340')?&+< 93203 6)2+, -.)*&+ A+' 6F)1)&+ + 1:0+&+ C@#%'(#2 ;5/#%$': , +4#%$': &323H)&+ 23'# /')@)&+ "+6)"13*03 31 A3$4#/#%$':< I+&31+2 3*0D+ 2(17"3213*03 '30+'*#;"+< G3H)E
function TResCompressor.GetDestStream(const
DestFilePath: string): TStream;
begin Result := FDestStream; end; L, .1) @3B -.3 +4#%$': @3(+ &3 A+') 7)') +C@#%'(#;5/#%$': , *D+ : *+22) '327+*2); >("(&)&3 "(17#;"+< I'+@)@3"13*03, -.31 6F)1+. + 1:0+&+ @)( -.3'3' "3' + -.3 A+( 340')?&+< I+'0)*0+, + 1:0+&++,$'"3$4#/2 #%$': A(6)'# @)B(+< 9+03 ) 23/.('E procedure TResCompressor. CleanDestStream(const DestStream: TStream); begin end;
I)') A36F)' 320) 6")223, @+6^ 7+&3, +7; 6(+*)"13*03, &(27)')' .1) 3463CD+ 6)2+ 23H)1 6F)1)&+2 +2 1:0+&+27?? ,3$,$#$ 3 C@#%'(#< I)') 0)*0+, &36")'3;+2 6+1+ =*%#>', *) 6")223 ;+5:8%$445% 3 5=$%%*?$ *) 6")223;B$4+5:8%$445%< %/+'), @)1+2 6+*20'.(' *+22+ )'-.(@+ &3 '36.'2+2< %>') + 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(/.') 31AW8$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<&7'`< 9+ A+'1."#'(+ 7'(*6(7)", )&(6(+*3E 0'^2 ;K'L$, , 0'^2
;C?*#R_3&I'+/')1`, _3&a32t3u` 3 _3&G); ".3`U, 0'^2;H>##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 )</0,$( 5< G)1+2 (*(6()' 73") "(20)/31 &+2 '3; 6.'2+2< ]17"313*03 + 0')0)13*0+ 7)') + 3@3*0+1"+,*(O &+L#K*4# +>23'@)*&+ + 6M&(/+ &)./-)(0+1 22<
L20)1+2, 7'(13(')13*03, .0("(B)*&+ ) A.*CD+ K5'?K*L%'%6C@ 7)') 6)''3/)'
+ 7'+/')1)< L20) A.*CD+ 7+ &3 23' 343; 6.0)&) 0)*0+ 7)') >(>"(+036)2 -.)*0+ 3436.0#@3(2 3 '30+'*) + 0'"?,$ &+ 1M; &."+< %7M2 (22+, 6F)1)1+2 + 1:0+&+ C">:B$45>%($N':$4 , .1) @3B 7)') + 0(7+ B+37;7 3 .1) @3B 7)') + 0(7+ /;B!N<< I)22)1+2 0)1>:1 .1 7+*; 03('+ 7)') ) A.*CD+ -.3 23'# 6F)1)&) 7)') 6)&) '36.'2+ R^C">:B$4N':$42 V%5(U 3 .1 7+*03('+ 7)') ) "(20) &3 4#%*"J4 &+ ::K*4#< b3(0+ (22+, &36")'3 R"+/+ )6(1) &+ 1:; 0+&+ '36:1 (17"313*0)&+, 231 23' &) 6")223 ;A5%:_U ) A.*CD+ C">:B$4N:'2 $4V%5( R./-)(0+1 24U<
n.)*&+ + '36.'2+ A+' &+ 0(7+4#%*"J , *) @3'&)&3, 3"3 23'# .1 /#%*"J;'L,$< L22)2 0)>3")2 2D+ ) 1)*3(') -.3 4#%*"J4 2D+ )&(6(+*)&)2 )+2 )'-.(@+2 &3 '36.'2+< L1 6)&) .1), 03'31+2 )0: Zi 4#%*"J4< O)&)4#%*"J : (&3*0(A(6)&+ 7+' .1) 6F); @3 7'M7'(), -.3 : 6)"6.")&) &) 23/.(*03 A+'1)E Rv9!QL K! aLOsaX!w Y ZU d Zi< I+203'(+'13*03, 7+&31+2 .0("(B)' ) A.*CD+ K5'?/#%*"J 7)22)*&+ 320) 6F)@3 7)') "3'1+2 6)&)4#%*"J<
Figura 3. Interface do exemplo ResourceUpdate
Listagem 11. Código do evento OnClick do botão btList
procedure TForm1.btListClick(Sender: TObject);
var
AHandle: THandle;
begin
mmList.Clear;
AHandle := LoadLibraryEx(PC har(edProgram.Tex t), 0, LOAD_LIBRARY_AS _DATAFILE);
try
mmList.Lines.Add( ‘RCDATA RESOURCES’);
EnumResourceNames (AHandle, RT_RCDATA, @EnumResNamesPr oc, Integer(mmList.L ines)); mmList.Lines.Add(‘’);
mmList.Lines.Add( ‘STRING TABLES’);
EnumResourceNames (AHandle, RT_STRING, @EnumResNamesPr oc, Integer(mmList.L ines));
finally
FreeLibrary(AHandle);
end; end;
Listagem 12. Função EnumResNamesProc
function EnumResNamesProc(Module: HMODULE; ResType, ResName: PChar; Strings: TStrings): Boolean; stdcall;
var
InitialString, i: Integer; Buffer: array[0..1023] of Char;
begin
if ResType = RT_STRING then begin
InitialString:=(L oWord(Cardinal(R esName))-1) * 16;
for i := 0 to 15 do begin
if LoadString(Module,InitialString+i, Buffer,1024) <> 0 then
Strings.Add(‘> ‘ + 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+' .1B+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 +2L6#$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,$ 3 /')@); 1+2, )/+'), 0+&) )/#%*"J ;'L,$ *+@)13*03 *) 7+2(CD+ 6+''30) R'30+'*)&) 7+'<$#B$42 N':$1&/#%!?< I)') )7"(6)' )2 )0.)"(B)CJ32, 6F)1)1+2C"?)8?'#$B$45>%($< b(*)"13*03, (17"313*03 +2 1:0+&+2 '3")6(+*)&+2 N 6+*20'.CD+ &+/#%*"J ;'L,$ 6+*A+'13 )./-)(0+1 2;< I)') ) 1+*0)/31 &+ /#%*"J ;'L,$ , : *36322#'(+ "3'1+2 0+&)2 )2 4#%*"J4 *+@)13*03, )&(6(+*)*&+;)2 *) 0)>3") 3 )"03')*&+ 2+13*03 ) 4#%*"J &323H)&)< I3'63>) -.3 )2 4#%*"J4 320D+ 7'323*032 *) 0)>3") &) 23/.(*03 A+'1)E vjL9=;
Listagem 13. Método UpdateResourceInProgram
procedure TForm1.UpdateResourceInProgram(const
ResType: PChar); var TempStream: TStream; ResHandle: THandle; Buffer: PChar; StringTable: WideString; begin
ResHandle := BeginUpdateReso urce(PChar( edProgram.Text) , False);
try
if ResType = RT_RCDATA then begin
TempStream := TFileStream.Crea te( edValue.Text, fmOpenRead);
try
GetMem(Buffer, TempStream.Size) ;
TempStream.Read( Buffer^, TempStream.Size); UpdateResource(R esHandle, RT_RCDATA,
MakeIntResource(e dResKey.Text), 0, Buffer, TempStream.Size ); finally TempStream.Free; end; FreeMem(Buffer); end
else if ResType = RT_STRING then begin
StringTable := GetStringTable( StrToInt( edResKey.Text), edValue.Text);
UpdateResource(R esHandle, RT_STRING,
MakeIntResource(GetResNameOfStrId(StrToInt( edResKey.Text))) , 0, PWideChar(Strin gTable), Length(StringTable));
end; finally
EndUpdateResour ce(ResHandle, False);
end; end;
Listagem 14. Implementação dos métodos GetStringTable e GetResNameOfStrId
function TForm1.GetStringTable(StrId: Integer; const
NewValue: string): WideString;
var ResName: Integer; Offset: Integer; StartPos: Integer; i: Integer; AHandle: THandle;
Buffer: array[0..1023] of Char; StrRead: string;
begin
ResName := GetResNameOfStrId (StrId); Offset := StrId mod 16;
StartPos := (ResName - 1) * 16; Result := ‘’;
AHandle := LoadLibraryEx(PCh ar(edProgram.Text ), 0, LOAD_LIBRARY_AS_DATAFILE);
try
for i := 0 to 15 do begin
if i = Offset then begin
Result := Result + Char(Length(NewVa lue)) + NewValue;
end else begin
if LoadString(AHandle, StartPos + i, Buffer, 1024) <> 0 then
begin
StrRead := string(Buffer);
Result := Result + Char(Length(Str Read)) + StrRead;
end; end; end;
Result:= Result + StringOfChar(#0, Length(Result));
finally FreeLibrary(AHandle); end; end; function TForm1.GetResNameOfStrId(StrId: Integer): Integer; begin
Result := (StrId div 16) + 1;
end; \fwvX\a]9=w< ! 6#"6."+ &) 7+2(CD+ (*(6()" : A3(0+ 6+1 >)23 *+ *+13 &+ '36.'2+ 6+''327+*&3*03 N /#%*"J ;'L,$ 31 -.320D+< z# + 1&&4$# '37'323*0) ) 7+2(CD+ &) 4#%*"J ) 23' )"03')&) *) 0)>3")< I)') A(*)"(B)', &3@31+2 /3')' + 1321+ *W13'+ &3 6)')603'32 *."+2 6+''327+*&3*032 )+ 0)1)*F+ /3')&+< %22(1, A36F)1+2 ) 6+*20'.CD+ &3 .1 /#%*"J ;'L,$ 6+17"30+< z# + 1:0+&+<$2 #B$4N':$1&/#%!? : .1 2(17"32 6#"6."+ 7)') 23 2)>3' + %$45>%($ "':$ &+ /#%*"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)*&+ 31L#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<C/P!VU 3 7)') + 6)1(*F+ )+ )'-.(@+Q(?E< %>') + 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!
Dê seu voto sobre este artigo, através do link: www.devmedia.com.br/javamagazine/feedback D ê s e u F eedb a c k e s t a e d i ç ã o
eç o
eç o
eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
Marco Antônio Pereira Araújo ([email protected])
É Professor do Curso de Bacharelado em Sis-temas 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 Compu-tacionais e Bacharel em Matemática com Ha-bilitação em Informática pela UFJF, Analista de Sistemas da Prefeitura de Juiz de Fora.
Carmo Crêdiney de Melo ([email protected])
Possui experiência desde 1990 em Tecnolo-gia da Informação. Bacharel em Sistemas de Informação pela Faculdade Metodista Gran-bery (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.
Análise de Pontos de Função
Saiba mensurar o tamanho de seu software e estimar o tempo que levará
para ficar pronto
s
1 &+2 /')*&32 &32)A(+2 )0.)"; 13*03 31 7'+H30+2 &3 2+A0V)'3 : /)')*0(' -.3 320(1)0(@)2 &3 0)1)*F+, 6.20+ 3 6'+*+/')1) 23H)1 '3)"(20)2, 0)*0+ 31 7'+H30+2 &3 &323*; @+"@(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 <%5>8 R]bIs=U<
9+ 8')2(", 3223 /'.7+ : '37'323*0)&+ 73"+ 8bIs= RH%'E*,*'" A>"(#*5" V5*"# )4$%4 <%5>8U<
! 6#"6."+ &3 I+*0+2 &3 b.*CD+ RIbU 23/.3 .1 6+*H.*0+ &3 &('30'(B32 &32; 6'(0)2 *+ 1)*.)" &3 I'#0(6)2 &3 O+*; 0)/31 &3 I+*0+2 &3 b.*CD+ &+ ]bIs=< L*0'30)*0+, &(@3'/^*6()2 &3 6+1+ )7"(6)' 322)2 '3/')2 A)B31 6+1 -.3 )2 6+*0)/3*2 *31 2317'3 '32."031 *.1 1321+ @)"+'<
9+ 23*0(&+ &3 6'()' .1 1:0+&+ 1)(2 '(/+'+2+ *3223 7'+6322+ &3 6+*0)/31, 2.'/(. ) *+'1) ]X!r]LO ZoZoT, -.3 320)>3"363 .1) 2:'(3 &3 7)&'J32 7)') 6+*0)/31 A.*6(+*)"< L1 gxxg, ) @3'2D+ o<Z &+ 1)*.)" &+ ]bIs= A+( )7'+@)&) 6+1+ )&3'3*03 ) 322) *+'1)<
K322) A+'1), ) bI% 73'1(03 .1) 6+*; 0)/31 (*&(6)0(@) &+ 0)1)*F+ &+ 7'+H30+ *+ (*?6(+ &+ 23. &323*@+"@(13*0+, 231 6+*F363' &30)"F32 &3 1+&3"+2 &3 &)&+2 +. &3 6")2232< I+203'(+'13*03, *) A)23 &3 6+*20'.CD+, 322) 6+*0)/31 '37'323*0) .1) 320(1)0(@) 6+1 1)(+' 7'36(2D+ &) 6+17"34(&)&3 &)2 A.*CJ32 3, )+ 0:'1(*+ &) 6+*20'.CD+ &+ 2+A0V)'3, *) 30)7) &3 0')*2(CD+, : '3)"(B)&) .1) 6+*0)/31 &30)"F)&), +>0(&) ) 7)'0(' &+ /'). &3 6+17"34(&)&3 &)2 A.*CJ32 "3@)*0)&)2 *+ 7'+6322+ A.*6(+*)", 1+&3"+ &3 &)&+2 +. 1+&3"+ &3 6")2232, &326'(CD+ &3 03")2 3 '3")0M'(+2<
Contagem de Pontos de Função
% 6+*0)/31 &3 7+*0+2 &3 A.*CD+ : '3); "(B)&) )0')@:2 &3 .1 6+*H.*0+ &3 7)22+2 7'3@()13*03 &303'1(*)&+2< I)') A)6("(0)' + 3*03*&(13*0+ &3223 7'+6322+, 6)&) .1 &32232 7)22+2 23'# )7'323*0)&+ 3 )7"(6)&+ ) .1 320.&+ &3 6)2+ -.3 &31+*20')'# 6+1+ ) 6+*0)/31 7+&3 23' A3(0)<
93223 23*0(&+, + )'0(/+ 6+*&.B('# .1 320.&+ &3 6)2+ '3")6(+*)&+ )+ 6)&)20'+ &3 6.'2+2 3 )".*+2 &3 .1) A)6."&)&3< ! 6)&)20')13*0+ &3 6.'2+2 : (*(6()&+ 73"+ .2.#'(+ 3 )7'323*0) .1) "(20) &+2 6.'2+2 H# 6)&)20')&+2, 73'1(0(*&+ 732-.(2) ) 7)'0(' &) &326'(CD+ &+ 6.'2+ 3 +A3'363*&+ )2 +7CJ32 &3 6)&)20'+ '3")0(@)2 N (*6".2D+, )"03')CD+, 346".2D+ 3 6+*2."0) R</0,$( 2U<
Figura 1. Janela de pesquisa de cursos
Figura 2. Janela de cadastro de cursos
% 7)'0(' &322) H)*3"), + 2(2031) &3@3 7+22(>("(0)' ) 1)*.03*CD+ *+ 6)&)20'+ &3 6.'2+2 6+*03*&+ 6M&(/+ 3 &326'(CD+ &+ 1321+, )":1 &+ 0(7+ &+ 6.'2+, -.3 7+&3 23' &3 /')&.)CD+ +. 7M2;/')&.)CD+< I)') 6.'2+2 &3 /')&.)CD+ (*A+'1);23 0)1>:1 + *W13'+ &3 73'?+&+2, 3*-.)*0+ -.3, 7)') 6.'2+2 &3 7M2;/')&.)CD+, (*A+'1); 23 ) 6)'/) F+'#'() R</0,$( 4U<
%+ A(*)" &3 -.)"-.3' &+2 7'+6322+2 &3 1)*.03*CD+, + 2(2031) &3@3 31(0(' .1) 13*2)/31 &3 6+*A('1)CD+ )+ .2.#'(+< %7M2 + 6)&)20')13*0+ &3 6.'2+2, 7+; &31+2 1)0'(6.")' +2 )".*+2< K) 1321) 1)*3('), 34(203 .1) H)*3") &3 732-.(2) &3 )".*+2, 7')0(6)13*03 (/.)" N &3 732; -.(2) &3 6.'2+2, 34630+ -.3 +A3'363 )(*&)
.1) 7+22(>("(&)&3 &3 A("0')' +2 )".*+2 7+' .1 6.'2+ 32736?A(6+ R</0,$( 5U<
! 6)&)20')13*0+ &3 )".*+2, 0)1>:1 2313"F)*03 )+ &3 6.'2+2, 7+22.( 1)0'?; 6."), *+13, &)&+2 7322+)(2 R</0,$( ;U,
&)&+2 &3 3*&3'3C+ R</0,$( =U 3 &)&+2
&3 &+6.13*0)CD+ R</0,$( >U< %7M2 +
6)&)20')13*0+ &3 .1 )".*+, + 2(2031) &3@3'# 34(>(' 7)') + .2.#'(+ + @)"+' &) 13*2)"(&)&3 ) 23' 7)/+ 73"+ )".*+<
I)') + 6#"6."+ &) 13*2)"(&)&3, .1 @)"+' >)23 : .0("(B)&+ 7)') 6)&) 0(7+ &3 6.'2+ 3 6+*2(&3') )(*&) + *W13'+ &3 73'?+&+2 7)') 6.'2+2 &3 /')&.)CD+ 3 ) 6)'/) F+'#'() 7)') 6.'2+2 &3 7M2;/')&.; )CD+< !2 @)"+'32 >)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
Figura 5. Janela de Cadastro de Alunos – Dados de Endereço
Figura 6. Janela de Cadastro de Alunos – Dados de Documentação
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) &)</0,$( ?<
% 23/.(', 6)&) .1) &322)2 )0(@(&)&32 23'# &326'(0) 3 )7"(6)&) )+ 320.&+ &3 6)2+ )7'323*0)&+<
2C D/E8 #+ F8")(0+1E 34(2031 0'^2 0(7+2
&3 6+*0)/31 &3 7+*0+2 &3 A.*CD+< % &(; A3'3*C) *+ 7'+63&(13*0+ )&+0)&+ 3*0'3 32232 0(7+2 &3 6+*0)/31 320# *)2 AM'1.")2 )7"(6)&)2 *) 6+*0)/31< XD+ 3"32E !V%5]$#5 ?$ ?$4$"=5,=*:$"#5E 13&3 0+&)2 )2 A.*CJ32 -.3 23'D+ 3*0'3/.32 6+1 + 7'+H30+ 31 2.) 7'(13(') @3'2D+< p + 0(7+ &3 6+*0)/31 -.3 23'# .0("(B)&) *3203 )'0(/+[ !V%5]$#5 ?$ :$,05%*'E 13&3 )2 A.*6(+*);
"(&)&32 )"03')&)2, (*6".?&)2 3 346".?&)2 )+ 7'+H30+[
!78,*('`a5E 13&3 )2 A.*CJ32 &3 .1)
)7"(6)CD+ H# (*20)")&)<
4C G-68E8 #( F8")(0+1H : ) A'+*03(')
&) )7"(6)CD+< K3A(*3 )2 A.*CJ32 -.3 23'D+
(*6".?&)2 31 .1) &303'1(*)&) 6+*0)/31 &3 7+*0+2 &3 A.*CD+< 9+ *+22+ 320.&+ &3 6)2+, + 326+7+ &) 6+*0)/31 '320'(*/3;23 N2 A.*6(+*)"(&)&32 &3 732-.(2) 3 6)&)2; 0')13*0+ &3 6.'2+2 3 )".*+2, 6+*A+'13 )7'323*0)&+ )*03'(+'13*03[
5C <,"IJ+- #+ K(#8E 6+*2(203 *) 6+*;
0)/31 &+2 0(7+2 &3 &)&+2 .0("(B)&+2 *)2 A.*6(+*)"(&)&32 ) 23'31 &323*; @+"@(&)2< L2232 0(7+2 &3 &)&+2 7+&31 23' )/'.7)&+2 31 .1 %'-.(@+ jM/(6+ ]*03'*+ R%j]U -.3 '37'323*0) /'.7+2 &3 &)&+2 '3")6(+*)&+2 3 '36+*F36(&+2 73"+ .2.#'(+, &3*0'+ &) A'+*03(') &) )7"(6)CD+[ +. .1 %'-.(@+ &3 ]*03'A)63 L403'*) R%]LU -.3 '37'323*0) &)&+2 '3A3'3*6()&+2 73") )7"(6)CD+ 1)2 1)*0(&+2 &3*0'+ &) A'+*03(') &3 +.0') )7"(6)CD+< 9+ 34317"+ 031+2E
!!.LHO.'2+, %".*+ !!LGHQ3*2)"(&)&3
I)') 6)"6.")' ) 6+17"34(&)&3 &)2 A.*CJ32 &3 &)&+2, &3@3;23 6+*0)' +
Figura 7. Processo de contagem de pontos de função.
*W13'+ &3 \(7+2 &3 K)&+2 R\KU 3 \(7+2 &3 a3/(20'+2 R\aU &3 6)&) .1) &322)2 A.*CJ32< s1 \K '3A3'3;23 ) .1 6)17+ W*(6+ '36+*F36(&+ 73"+ .2.#'(+, 231 '3730(CD+, +. 23H), 23 .1 6)17+ 23 '3; 730(' 1)(2 &3 .1) @3B *.1) (*03'A)63, 6+*0);23 )73*)2 .1) @3B< s1 \a '3A3'3;23 ) .1 2.>/'.7+ &3 0(7+2 &3 &)&+2, 0)1>:1 '36+*F36(&+2 73"+ .2.#'(+ 3 6+17+*3*03 &3 .1 %j] +. %]L< 9+ 34317"+, +2 \K2 320D+ )7'323*0)&+2 *)2D(:+7(- 2)5 , '37'323*0)*&+ +2 )'-.(;
@+2 O.'2+, %".*+ 3 Q3*2)"(&)&3, '32736; 0(@)13*03< O+1+ O.'2+ )7'323*0) &+(2 0(7+2 &3 '3/(20'+ R6.'2+2 &3 /')&.)CD+ 3 &3 7M2;/')&.)CD+ 6+1 &)&+2 32736?A(6+2U, 6+*2(&3');23 \a (/.)" ) g< !2 &31)(2 7+22.31 \a (/.)" ) Z< X3 +2 6.'2+2 320(@32231 &(@(&(&+2 31 1)(2 &3 .1 )'-.(@+ 6+1+, 7+' 34317"+, .1 )'; -.(@+ 7)') 6.'2+2 &3 /')&.)CD+ 3 +.0'+2 &3 7M2, 1321+ )22(1, 6+*2(&3')'?)1+2 TD Tipo de Dado 1 Código do curso 2 Descrição do curso
3 Tipo do curso (1=Graduação / 2=Pós-Graduação) 4 Quantidade de períodos
5 Carga horária Tabela 1. Tipos de Dados de Curso
TD Tipo de Dado 1 Matrícula do aluno 2 Nome do aluno 3 Data de nascimento 4 Identificador do curso 5 Ano de início 6 Semestre de início 7 Email 8 Telefone residencial 9 Telefone comercial 10 Telefone celular 11 Foto 12 Logradouro 13 Número 14 Complemento 15 Bairro 16 Cidade 17 UF 18 CEP 19 CPF 20 Número identidade 21 Órgão expedidor 22 UF órgão expedidor 23 Data expedição Tabela 2. Tipos de Dados de Aluno
7)') ) 6+*0)/31 .1 W*(6+ %j] 6+1 &+(2 \(7+2 &3 a3/(20'+2<
]&3*0(A(6)&+2 +2 \K2 3 \a2, 7+&3;23 6)"6.")' ) 6+17"34(&)&3 &3 6)&) %j]r%]L )0')@:2 &)D(:+7( ;< %*)"(2)*&+;), +>23';
@);23 -.3 + %j] O.'2+ : &3 6+17"34(&)&3 >)(4), 7+(2 7+22.( &+(2 \a2 3 6(*6+ \K2, +
%j] %".*+ : &3 6+17"34(&)&3 >)(4), 7+(2 7+22.( .1 \a 3 gT \K2 3, 7+' A(1, + %]L Q3*2)"(&)&3 0)1>:1 : &3 6+17"34(&)&3 >)(4), 7+(2 7+22.( .1 \a 3 &+(2 \K2<
;C <,"IJ+- #+ D$("-(IM8E '37'323*0)1 +2
7'+6322+2 3"313*0)'32 A+'*36(&+2 73") )7"(; 6)CD+ )+ .2.#'(+, +*&3 .1 7'+6322+ 3"313*;
TD TipodeDado
1 Tipo do curso (1=Graduação / 2=Pós-Graduação) 2 Valor Base da Mensalidade
Tabela 3. Tipos de Dados de Mensalidade
0)' (&3*0(A(6) ) 13*+' .*(&)&3 A.*6(+*)" &+ 7+*0+ &3 @(20) &+ .2.#'(+, 3 7+&3 23'E
!C"#%'?' C@#$%"' FCCGE 7)') 2.) (&3*0(A(;
6)CD+ &3@31 23' )*)"(2)&+2 0+&+2 +2 7'+; 6322+2 3"313*0)'32 -.3 7'+6322)1 &)&+2 @(*&+2 &3 A+') &) A'+*03(') &) )7"(6)CD+ 3 -.3 )0.)"(B)1 .1 +. 1)(2 %j]2[
!/'b?' C@#$%"' F/CGE + 7'+6322+ /3')
&)&+2 7)') A+') &) A'+*03(') &) )7"(6)CD+, 03*&+ 7+' +>H30(@+ 7'(*6(7)" )7'323*0)' &)&+2 )+ .2.#'(+ )0')@:2 &3 "M/(6) &3 7'+6322)13*0+ -.3 *D+ )73*)2 ) '36.; 73')CD+ &3 &)&+2[
!+5"4>,#' 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
Tipos de Registro (TR) Tipos de Dados (TD)
Abaixo de 20 20 a 50 Acima de 50 1 Baixa Baixa Média 2a5 Baixa Média Alta Acimade5 Média Alta Alta Tabela 4. Complexidade das funções de dados (ALI e AIE)
Funcionalidade Processo Elementar Tipo Pesquisa de Cursos Listar Cursos CE
Pesquisar Curso CE Cadastramento de Cursos Incluir Curso EE Alterar Curso EE Excluir Curso EE Consultar Curso CE Exibir Mensagem de Curso Cadastrado CE Pesquisa de Alunos
Listar Alunos CE Pesquisar Aluno CE Filtrar Alunos por Curso CE
Cadastramento de Alunos
Incluir Aluno EE Alterar Aluno EE Excluir Aluno EE Consultar Aluno CE Exibir Cursos Cadastrados na Caixa de Combinação CE Exibir Cálculo de Valor da Mensalidade SE Tabela 5. Processos Elementares identificados no estudo de caso
} %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+'13D(:+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)'32K*4#'% +>%454
3K*4#'% 7,>"54 6+*2(&3')')1 \K (/.)" ) &+(2 7+' 23' 3223 + *W13'+ &3 )0'(>.0+2
34(>(&+2 6+1+ '32."0)&+ *) (*03'A)63 6+1 + .2.#'(+<V$4T>*4'% +>%45 3V$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+<
=C N8")8- #+ <,"IM8 OM8 !P,-)(#8-H
)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 <()8$ #+ !P,-)+H '37'323*;
0) ) (*A".^*6() &3 '3-.(2(0+2 0:6*(6+2 3 &3 -.)"(&)&3 *+ 0)1)*F+ &+ 2+A0V)'3< p 6)"6.")&+ 6+1 >)23 31 Zo 6)')603'?2; 0(6)2 /3')(2 &3 .1 2(2031), +*&3 6)&) .1) &3")2 &3@3 23' )*)"(2)&) 6+1 '3; ")CD+ )+ 23. *?@3" &3 (*A".^*6() 2+>'3 + 2(2031) 3 7+*0.)&) &3 x R*3*F.1) (*A".^*6()U ) h R/')*&3 (*A".^*6()U<
% &326'(CD+ 6+17"30) &3 6)&) 6)')6; 03'?20(6) 3 )2 0)>3")2 7)') )@)"()CD+ &+2 @)"+'32 &3 7+*0.)CD+, 7+&3 23' +>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+