• Nenhum resultado encontrado

Clube Delphi 094

N/A
N/A
Protected

Academic year: 2021

Share "Clube Delphi 094"

Copied!
68
0
0

Texto

(1)
(2)
(3)
(4)
(5)

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

[email protected] 

(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

 [email protected] 

Microsoft Certified: MCP, MCAD, MCSD.NET

(6)

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

(7)

+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()&+<

(8)

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

(9)

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+ &+

(10)

)'-.(@+ 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 ><

(11)

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

(12)

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

(13)

[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;

(14)

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/)'

(15)

+ 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=;

(16)

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

(17)

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+<

(18)

! 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 )(*&)

(19)

.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)' +

(20)

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*;

(21)

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+

Referências

Documentos relacionados

Podem treinar tropas (fornecidas pelo cliente) ou levá-las para combate. Geralmente, organizam-se de forma ad-hoc, que respondem a solicitações de Estados; 2)

Está prevista a redução do Conselho de Administração para 5 membros, dos quais 3 executivos e os restantes dois não executivos.. Os administradores executivos e não

Como não há garantia de que este FUNDO terá o tratamento tributário para fundos de longo prazo, fica expressamente ressalvado que a ocorrência de alteração nas alíquotas a que

Entre as atividades, parte dos alunos é também conduzida a concertos entoados pela Orquestra Sinfônica de Santo André e OSESP (Orquestra Sinfônica do Estado de São

Biblioteca Digital Curt Nimuendajú - Coleção Nicolai www.etnolinguistica.org.. s:inibutan:i, úni ca

Dando prosseguimento, o presidente em exercício, colocou em votação a proposta de menção de elogio para os membros da comissão eleitoral central e comissões

A pesquisa analisa dados coletados com referência ao ano de 2016 e abrange um universo de 111 produtores (correspondente a 10% do total de associados da área de leite, conforme

O objetivo deste estudo é modelar de forma eficiente a fila de espera para o transplante de cór- neas em Goiás, bem como analisar as variáveis que interferem no tempo de espera