Escolar Documentos
Profissional Documentos
Cultura Documentos
"#$%&%"'() EDITORIAL
Ano 8 - 94ª Edição - 2008 - ISSN 1517990-7 Impresso no Brasil O DataSetProvider tem uma importante função no ciclo de vida da manipulação
de dados em uma aplicação Delphi. Ele é responsável por se comunicar
Corpo Editorial com o engine (dbExpress por exemplo), obter os dados, empacotá-los nos
chamados DataPackets e enviá-los através da memória para o ClientDataSet
Editor Geral (em uma aplicação 2-tier) ou através da interface IAppServer em uma aplicação
Guinther Pauli multicamadas (SOAP, COM+ etc.). O DataSetProvider faz muito mais do que isso,
guinther@devmedia.com.br
e expõe muitas de suas funcionalidades na forma de propriedades e eventos,
Editor Técnico como mostra o Adriano Santos em seu completo artigo sobre o assunto.
Adriano Santos Falando em DataSetProvider, seu irmão ClientDataSet também exerce
adrianosantos@devmedia.com.br importante função em aplicações de banco de dados. Um dos problemas
Equipe Editorial relacionados a esse componente, e que confunde muitos, é a correta manipulação
Fabricio Desbessel, Maikel Scheid, Paulo Quicoli, Luciano Pimenta de erros gerados no SGBD (Firebird por exemplo). No artigo do Rodrigo, veja
Editor de Arte como construir um descendente de ClientDataSet que automaticamente trata
Vinicius O. Andrade os principais erros do servidor, como violação de foreign-key.
viniciusoandrade@gmail.com Na seção Expert, o Gustavo Chaurais continua o artigo sobre Streams. Na
Diagramação parte final do seu artigo, veja como implementar compactação, download em
Adolfo Sabino múltiplos pacotes e resources em suas aplicações. Ainda nesta seção, o
simininu@yahoo.com.br Marco e o Carma aprofundam um assunto muito impor tante, que na verdade
é um desafio nos projetos de software: como mensurar o esforço e o prazo
Capa
Antonio Xavier necessário para desenvolver determinada aplicação, ajudando a reduzir
webdesigner@devmedia.com.br custos e não estropolar o cronograma.
O Maikel continua a série que demonstra a construção de uma locadora
Revisão
Web. E nada melhor que o ASP.NET para construir um sistema completo desse
Gregory Monteiro
gregory@clubedelphi.net
tipo. O Ricardo usa e abusa de seus conhecimentos sobre desenvolvimento
com PocketStudio e continua seu excelente curso que mostra como criar uma
Distribuição aplicação para o sistema operacional PalmOS.
Fernando Chinaglia Dist. S/A Na sessão Easy Delphi, para quem está iniciando, temos o Maikel com dois
Rua Teodoro da Silva, 907 artigos: veja como utilizar os principais controles da VCL na construção de um
Grajaú - RJ - 206563-900 pequeno editor de textos, bem prático. No outro ar tigo, mostra como utilizar os
componentes da paleta Indy para criar um sistema de envio de e-mails. ideal por
exemplo se você precisar enviar e-mails automaticamente da sua aplicação.
Atendimento ao Leitor Para finalizar, o Rodrigo apresenta aquele que considero o melhor recurso da
A DevMedia conta com um departamento exclusivo para o atendi- POO, o polimorfismo, tudo em PHP! Se você já domina ou conhece o assunto,
mento ao leitor. Se você tiver algum problema no recebimento do seu sabe que ele é realmente poderoso. Que tal utilizá-lo agora em suas aplicações
exemplar ou precisar de algum esclarecimento sobre assinaturas, Web com o Delphi for PHP?
exemplares anteriores, endereço de bancas de jornal, entre outros,
entre em contato com: Grande abraço e sucesso com o Delphi!
Carmelita Mulin
www.devmedia.com.br/central/default.asp
(21) 3382-5025
Kaline Dolabella
Gerente de Marketing e Atendimento
kalined@terra.com.br Guinther Pauli
(21) 3382-5025
guinther@devmedia.com.br
Publicidade Microsoft Certified: MCP, MCAD, MCSD.NET
Para informações sobre veiculação de anúncio na revista ou no site Borland Cer tified: Delphi 6, 7, 2005, 2006, Web, Kylix
entre em contato com:
Kaline Dolabella
publicidade@devmedia.com.br
N Ã O A
Portal do Assinante
Fale com o Editor A ClubeDelphi tem uma novidade para você que comprou este
E R C
É muito importante para a equipe saber
o que você está achando da revista: que
artigo na revista ou no site ClubeDelphi, entre
em contato com os editores, informando
exemplar na banca de jornal: você pode acessar GRATUITAMENTE,
o Portal do Assinante ClubeDelphi!
P
tipo de ar tigo você gostaria de ler, que o título e mini-resumo do tema que você Confira o que você encontra no Portal do Assinante:
artigo você mais gostou e qual artigo gostaria de publicar:
- Mais de 560 Vídeo Aulas!
você menos gostou. Fique a vontade
para entrar em contato com os editores - 7 cursos online!
e dar a sua sugestão! Guinther Pauli - Editor da Revista - 1 Livro Eletrônico sobre ADO.NET e BDP!
Se você estiver interessado em publicar um guinther@devmedia.com.br - Mais de 150 Artigos Exclusivos!
Para Utilizar o Portal do Assinante, acesse www.devmedia.com.br/clubedelphi/potal.asp
!"#$# e utilize as informações abaixo: Login: DVM.PL e Senha: STX200
O acesso é válido por 30 di as a partida da data de lançamento da revista. Todos os
meses a ClubeDelphi lhe dará uma senha válida para acessar o portal. Comprando a
A revista ClubeDelphi é parte integrante da assinatura ClubeDelphi
PLUS. Para mais informações sobre o pacote PLUS, acesse: revista regularmente em bancas, você terá acesso ininterrupto a ele!
http://www.devmedia.com.br/clubedelphi/portal.asp
Informativo ClubeDelp
Caro Leitor
O portal ClubeDelphi PLUS é a continuação, na Web, Acesse o portal ClubeDelphi PLUS e receba muito soais para acessar o portal. Se você comprou
da revista ClubeDelphi. O portal recebe um conteú- mais conteúdo sobre Delphi! E o que é melhor: de bancas, utilize o login e senha publicados na pá
do novo todo dia e hoje conta com: i) mais de 560 graça! Todo leitor da revista ClubeDelphi, seja ele do editorial desta edição.
vídeo aulas; ii) 7 cursos online; iii) 1 livro eletrônico assinante ou comprador da revista em bancas, tem Confira a seguir as últimas novidades do portal!
gratuito, de Guinther Pauli, sobre ADO.NET e BDP; iv) acesso ao portal (para quem compra em bancas, o
mais de 150 artigos exclusivos (que não foram pu- acesso é válido por 30 dias). Boa leitura e sucesso!
blicados na revista)!; Se você é assinante, utilize o seu login e senha pes- Equipe DevMedia
1
Vídeo
Confira no portal ClubeDelphi PLUS um mini-curso sobre criação de um site com
ASP.NET e SQL Server 2005 Express
http://www.devmedia.com.br/articles/listcomp.asp?txtsearch=Delphi+e+SQL+Server+2005+Express
Gostou das vídeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vídeo aulas e dezenas de
cursos online sobre desenvolvimento de software! Agora você pode comprar as vídeo aulas que preferir e fazer
sua própria combinação de vídeos! Saiba mais em www.devmedia.com.br/creditos
Últimas Vídeo-Aulas
Aprenda a desenvolver sistemas para o Desenvolvendo uma aplicação para PalmOS Construindo uma ferramenta de busca
sistema operacional PalmOS com PocketStucio - Parte XIII a XV de arquivos Parte I e II
Acompanhe as aulas de Ricardo Boaro que falam Veja nessas vídeo-aulas de Ricardo Boaro, como traba- Veja nessas vídeos de Paulo Quicoli como des
unicamente do desenvolvimento de aplicações lhar com aplicações PalmOS com o PocketStudio. volver uma podeorsa ferramenta para busca
para PalmOS utilizando o IDE PocketStudio que arquivos no disco rígido.
é bastante semelhate ao Delphi inclusive utilizan- Mini-Curso Controle de Versão com JEDI VCS
do-se de linguagem Pascal. Veja nesse mini-curso de Adriano Santos como
trabalhar com esta fabulosa ferramenta para con-
Curso Aplicação ASP.NET com Delphi e SQL Server trole de versão e gerenciamento de equipes !
!"# %*&':, '327+*&3*&+ ) 2.) -.320D+E Listagem 2. Códigos dos métodos para interagir com o mundo externo
2(1, : 7+22?@3" (17"313*0)' (22+ 31 2.) function TMemoDragDropFrm.DragEnter(const dataObj:
)7"(6)CD+, 1)2 + 7'+6322+ : .1 0)*0+ 0'); IDataObject; grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult;
>)"F+2+< G3H)1+2 6+1+ A)B3' (22+< begin
dwEffect := DROPEFFECT_COPY;
I'(13(')13*03 &3@31+2 6'()' .1) 2:'(3 Result := S_OK;
end;
&3 A.*CJ32 6)7)B32 &3 (*03')/(' 6+1 + function TMemoDragDropFrm.DragOver(grfKeyState: Longint;
pt: TPoint; var dwEffect: Longint): HResult;
1.*&+ 3403'*+, H# -.3 7+22(>("(0)'31+2 begin
dwEffect := DROPEFFECT_COPY;
-.3 + )7"(6)0(@+ '363>) + @)"+' &3 .1 Result := S_OK;
0340+ @(*&+ &3 +.0'+ )7"(6)0(@+< I)') (22+ end;
function TMemoDragDropFrm.DragLeave: HResult;
)>') 23. K3"7F(, 2)"@3 + 7'+H30+ 3 &36")'3 begin
Result := S_OK;
)"/.1)2 A.*CJ32 *) #'3) !"#$%&'($ &) )"*# end;
function TMemoDragDropFrm._AddRef: Integer;
6+1+ 23/.3 *) ./-)(0+1 23 begin
Result := 1;
I'322(+*3 +#%, . /0*&# . + 7)') -.3 + end;
function TMemoDragDropFrm._Release: Integer;
K3"7F( 6'(3 + 6)>3C)"F+ &)2 A.*CJ32< L1 begin
23/.(&) &(/(03 + 6M&(/+ &3 6)&) A.*CD+ Result := 1;
end;
6+*A+'13 ) ./-)(0+1 4< function TMemoDragDropFrm.Drop(const dataObj:
IDataObject; grfKeyState: Longint; pt: TPoint;
I+' A(1 &331+2 )"03')' +2 3@3*0+2 1"2 var dwEffect: Longint): HResult;
var
+%$'#$ 3 1"3$4#%56 &+ A+'1."#'(+ 7'(*6(; aFmtEtc: TFORMATETC;
aStgMed: TSTGMEDIUM;
7)" 7)') 23 )&)70)'31 N2 A.*CJ32 6'()&)2< pData: PChar;
begin
G3H) + 6M&(/+ *) ./-)(0+1 5< if (dataObj = nil) then
raise Exception.Create(‘Ponteiro não á válido!’);
%&(6(+*3 ) )"*# /0$,,78* )+ )4$4 &+ 7'+H3; with aFmtEtc do
0+ 3 7+' A(1, (*2(') .1 6+17+*3*03 9$:5 begin
cfFormat := CF_TEXT;
*) 03") 3 3436.03 + 7'+/')1)< I') 0320)', ptd := nil;
dwAspect := DVASPECT_CONTEN T;
)>') + 5+'& +. 5+'&I)&, &(/(03 )"/.1) lindex := -1;
tymed := TYMED_HGLOBAL;
6+(2), 23"36(+*3 3 31 23/.(&) )'')203;+ end;
OleCheck(dataOb j.GetData(aFmtEtc , aStgMed));
7)') + 9$:5 &+ 7'+/')1) 6'()&+< 9+03 try
pData := GlobalLock(aStgM ed.hGlobal);
-.3 + 0340+ : 0+0)"13*03 6+7()&+< Memo1.Text := pData;
finally
GlobalUnlock(aStgMed.hGlobal);
ReleaseStgMedium(aStgMed);
end;
Result := S_OK;
end;
Mudando fontes do programa de Listagem 3. Código dos eventos OnCreate e OnDestroy
uma só vez procedure TMemoDragDropFrm.FormCreate(Sender: TObject);
!(, /+20)'() &3 1.&)' 0+&)2 )2 A+*032 begin
OleInitialize(nil);
&+ 13. 7'+H30+ ).0+1)0(6)13*03< O+1+ OleCheck(Regist erDragDrop(Handle , Self));
end;
7+22+ A)B3' (22+P
'($6+78 9/:(- procedure TMemoDragDropFrm.FormDestroy(Sender: TObject);
begin
RevokeDragDrop(Handle);
OleUninitialize;
!"# Q)'63"+, .1) )"03'*)0(@) 7)') (22+ end;
23'() 6'()' .1) A.*CD+ -.3 A(B3223 +
Listagem 4. Código para modificação de fontes
23'@(C+ 7') 0(< L22) A.*CD+ 03'() -.3 23'
(17"313*0)&) 31 0+&+2 +2 A+'1."#'(+2< procedure TForm1.ModificarFontes(AControle:
TWinControl);
G3H)1+2 (22+< procedure Modificar(AControle: TControl);
var
!"#$ &' ()*) +"),$-) () .$/+0# $ (1 2"$1 f: TFont;
!"#$%&' 3$4/1"$ &'1 ()*1 !"()'*+"' 4)') begin
if IsPublishedProp(AControle, ‘Parentfont’)
5$6&$7 and (GetOrdProp(AControle, ‘Parentfont’) =
.. Ord(False))
private and IsPublishedProp(AControle, ‘font’) then
procedure ModificarFontes( begin
AControle: TWinControl); f := TFont(GetObjectPr op(AControle,
public ‘font’, TFont));
.. f.Name := ‘Courier New’;
end;
end;
I'322(+*3 +#%, . /0*&# . + 7)') -.3 + var
K3"7F( 6'(3 + 6)>3C)"F+ &) A.*CD+ 3 31 i: Integer;
begin
23/.(&) &(/(03 + 6M&(/+ &) ./-)(0+1 ;< Modificar(AControle);
for i := 0 to AControle.ControlCount - 1 do
9+ 6)2+ 320)1+2 A)B3*&+ .1 ")C+ &5% if AControle.Controls[I] is TWinControl then
ModificarFontes(TWincontrol(AControle.
*+2 6+17+*3*032 &+ A+'1."#'(+ )0.)" 3 Controls[I]))
.0("(B)*&+ +2 1:0+&+2 &) )"*# ;68$!"&5 ,
else
Modificar(AControle.Controls[I]);
7+'0)*0+ &36")'3 ) 2.) )"*# *+ )4$4 &+ end;
Para utilizar a procedure basta incluir alguns controles em tela e em um botão fazer a
7'+H30+< ! *+13 &) )"*# : ;68!"&5< chamada a ela, com mostrado a seguir:
b
r
e
gosto.Para isso, precisamos saber o que e
s
t
a
e
i d
você, leitor, acha da revista! o ç
ã
Streams
Implemente compactação, download em múltiplos pacotes e resources em
suas aplicações com técnicas avançadas de Streams – Parte 2
6+1)*&+ 3 &(/(03E
[caminho para a pasta bin]\brcc32.exe
[arquivo .RC
]
/3< ! ;B$45>%($/#%$': : 1.(0+ 7)'36(&+ 1:0+&+2 32736()(2E /'=$;5A*,$ 3 /'=$;5/2
6+1 + ;9$:5%6/#%$': 3 *36322(0) &3 #%$':< ]22+ : 1.(0+ W0(" 7+'-.3 *D+ 7'36(;
9) 7)20) )0.)" 23'# /3')&+ .1 )'-.(@+ 0'^2 7)'q130'+2 7)') 2.) 6+*20'.CD+< ! 2)1+2 &3 .1 ;A*,$/#%$': 7)') 2)"@)' 23.
<BC/ 6+1 + 1321+ *+13 &3 23. A+*03 7'(13('+ : + \95?>,$ , +. 23H), + 0'"?,$ 6+*03W&+< ! 1:0+&+ /'=$;5A*,$ H# A)B (22+
QB+ < O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ &+ 1M&."+ '30+'*)&+ *+ 6)''3/)13*0+ 7)') *M2< L 320) : ) +73')CD+ 7'323*03 31
6+1+ _a32+.'63Kjj<&7'`< 9) >"*# &+ &3 .1) )7"(6)CD+rKjj< 9+ 6)2+, + )'; *+22+ 34317"+< L20)1+2 2(17"3213*03
A+'1."#'(+ 7'(*6(7)", &(/(03E -.(@+ &3 '36.'2+2 A+( 6+17(")&+ H.*0+ 6'()*&+ + 4#%$': 3 6F)1)*&+ 23. 1:0+&+
N )7"(6)CD+ 6+''3*03, 7+'0)*0+, .0("(B); /'=$;5A*,$< Q.(0+ 2(17"32, *D+P
{$R caminho_para_o_arquivo_de_recurso_
compilado.RES} '31+2 \!"4#'"($< 9+ 6)2+ &3 -.3'3'1+2 O+1+ &(6), 7+&31+2 .0("(B)' + 7"./;(*
6)''3/)' '36.'2+2 &3 +.0')2 )7"(6)CJ32 /*:8,$ B$45>%($ C?*#5% R</0,$( 4U, &3 1(*F)
%&(6(+*3 .1 >+0D+ )+ A+'1."#'(+ 3 7)22)'?)1+2 + \95?>,$ &) )7"(6)CD+ ).0+'(), 7)') ) 1)*(7.")CD+ &+2 )'-.(;
(17"313*03 23. 3@3*0+ 1"+,*(O (/.)" ) &323H)&)< ! 23/.*&+ 7)'q130'+ : ) 6F); @+2 QB+< O+1 3"3 @+6^ 7+&3 A)6("13*03
./-)(0+1 A3 ]*(6(3 + 7'+/')1) 3 6"(-.3 *+ @3 -.3 (&3*0(A(6) + '36.'2+, (*A+'1)&) )&(6(+*)' *+@+2 )'-.(@+2 R>.26)*&+;+2
>+0D+< % Kjj 23'# 340')?&) 7)') ) 1321) *+ QB+< L + 03'63('+ : + 0(7+ &3 '36.'2+, 7+' &(#"+/+2 32736()(2U, 6+17(")' 7)')
7)20), 6+1 + *+13 $@#%'(#$?Q?,,< 0)1>:1 (*A+'1)&+ *+ QB+< )'-.(@+2 QBC/ , &3*0'3 +.0')2 A.*6(+*);
a3"31>')*&+ + 6+*63(0+ &3 4#%$':4 &+ % 6")223 ;B$45>%($/#%$': , >31 6+1+ "(&)&32 >)20)*03 W03(2< ! )22(203*03 "F3
(*?6(+ &+ )'0(/+, A(*)"13*03 A36F)1+2 )2 + ;9$:5%6/#%$': , F3'&)1 &3 ;+>4#5:2 )H.&) (*6".2(@3 ), ')7(&)13*03, 23"36(+;
7'(*6(7)(2 6")2232 -.3 + )22.*0+ )>')*; 9$:5%6/#%$':< L20) W"0(1) (*0'+&.B &+(2 *)' + 0(7+ &3 '36.'2+ ) 23' )&(6(+*)&+<
X3. &+V*"+)& 7+&3 23' A3(0+ )0')@:2
&+ +5?$+$"#%', &) +5?$<$'% R((Q(5?$J$'%Q
Listagem 9. Código do botão de extração dos recursos
(5:G , 7'+6.')*&+;23 73"+ ).0+' <>4#'=5
procedure TForm1.Button1Click(Sender: TObject); +0'>%'*4< X3. 6M&(/+ A+*03 320# (*6".2+ 3
var
Stream: TResourceStream; : 1.(0+ (*03'322)*03 7)') 320.&+<
const
EXTRACTED_DLL_NA ME = ‘extracted.dll’;
begin
Stream := TResourceStream.C reate(HInstance, ‘DLL’, www.devmedia.com.br/clubedelphi/portal.asp
‘DLLFILE’);
try Acesse agora o mesmo o portal do assinante ClubeDelphi e assista a uma
Stream.SaveToFile(EXTRACTED_DLL_NAME);
MessageDlg(‘Arqui vo extraído para: ‘ +
vídeo aula de Adriano Santos que mostra como trabalhar com o plug-in
IncludeTrailingPathDelimiter(ExtractFilePath( Simple Resource Editor.
Application.Exe Name)) + EXTRACTED_DLL_NA ME,
mtInformation, [mbOk], 0); www.devmedia.com.br/articles/viewcomp.asp?comp=5476&hl=
finally
FreeAndNil(Stream);
end;
end;
G)1+2 )/+') 1(20.')' .1 7+.6+ )2
6+(2)2< O+*20'.('31+2 .1 34317"+ -.3
.0("(B)'# .1 )'-.(@+ 6+17'(1(&+ )0');
@:2 &+ 34317"+ +5:8%$44*5"<
O'(3 .1 *+@+ 7'+H30+ 3 2)"@3;+ 6+1+
B$45>%($P*8Q?8%< %&(6(+*3 ) 3"3 .1) *+@)
)"*# 3 2)"@3;) 6+1+ B$4+5:8%$445%Q8'4<
%&(6(+*3 0)1>:1 ) )"*# +5:8%$445%Q8'4 ,
6+*20'.?&) )*03'(+'13*03<
9) 23CD+ )4$4 &3 B$4+5:8%$445% , (*2(')E
+5:8%$445% , +,'44$4 , /64)#*,4 3 D*"?5M4<
%/+'), &36")'3 .1) 6")223 ;B$4+5:8%$42
45% , 3203*&3*&+ ;+5:8%$445%< K36")'3 3
(17"313*03 + 23/.(*03 1:0+&+ R6+1 )
&('30(@) %$*"#%5?>($UE
constructor TResCompressor.Create(const
ResName:
string);
begin
FResName := ResName;
inherited Create(‘’, False);
end;
*) 6")223 ;B$4+5:8%$445%<
+ 7'+/')1)< L20) A.*CD+ 7+ &3 23' 343; ! 1:0+&+ (17"313*0)&+, 6+*A+'13 6+;
6.0)&) 0)*0+ 7)') >(>"(+036)2 -.)*0+ 13*0)&+, 23'# 6F)1)&+ 7)') 6)&) '36.'2+
3436.0#@3(2 3 '30+'*) + 0'"?,$ &+ 1M; 3*6+*0')&+< X3 + '36.'2+ A+' .1 B+37;7 ,
&."+< %7M2 (22+, 6F)1)1+2 + 1:0+&+ )73*)2 )&(6(+*)1+2 *) "(20) + *+13 &+
C">:B$45>%($N':$4 , .1) @3B 7)') + '36.'2+< O)2+ 23H) .1 /#%*"J ;'L,$ , @)';
0(7+ B+37;7 3 .1) @3B 7)') + 0(7+ '31+2 ) 0)>3") "3*&+ 6)&) 4#%*"J )0')@:2
/;B!N<< I)22)1+2 0)1>:1 .1 7+*; &+ 1:0+&+ K5'?/#%*"J< I)') 73/)'1+2 +
03('+ 7)') ) A.*CD+ -.3 23'# 6F)1)&) *+13 &3 '36.'2+ &) 0)>3"), .0("(B)1+2 )
7)') 6)&) '36.'2+ R^C">:B$4N':$42 A.*CD+ K5D5%? , 7+(2, *+2 (*03'322) )73*)2
V%5(U 3 .1 7+*03('+ 7)') ) "(20) &3 +2 L6#$4 13*+2 2(/*(A(6)0(@+2<
4#%*"J4 &+ ::K*4#< % "(20) H# 320# 7'+*0) 7)') 23' 7'33*;
b3(0+ (22+, &36")'3 R"+/+ )6(1) &+ 1:; 6F(&)< G+6^ @3'# 7'(13('+ +2 '36.'2+2
0+&+ '36:1 (17"313*0)&+, 231 23' &) B+37;7 &+ )7"(6)0(@+ 3, &37+(2, +2 '3;
6")223 ;A5%:_U ) A.*CD+ C">:B$4N:'2 6.'2+2 &+ 0(7+ /#%*"J ;'L,$< 9+ 23/.*&+
$4V%5( R./-)(0+1 24U< 6)2+, )7)'363'# 0)1>:1 ) 6F)@3 (&3*0(;
n.)*&+ + '36.'2+ A+' &+ 0(7+ 4#%*"J , *) A(6)&+') &3 6)&) 4#%*"J<
@3'&)&3, 3"3 23'# .1 /#%*"J;'L,$< L22)2 %/+'), &36")'3 3 (17"313*03 + 1:0+&+
0)>3")2 2D+ ) 1)*3(') -.3 4#%*"J4 2D+ )8?'#$B$45>%($!"V%5J%': R./-)(0+1 25U<
)&(6(+*)&)2 )+2 )'-.(@+2 &3 '36.'2+< L203 : + 1:0+&+ -.3 23'# .0("(B)&+
L1 6)&) .1), 03'31+2 )0: Zi 4#%*"J4< 7)') ) 1+&(A(6)CD+ 3A30(@) &+2 %$45>%($4<
O)&) 4#%*"J : (&3*0(A(6)&+ 7+' .1) 6F); L"3 6+*2(203 31 6F)1)'1+2 H$J*")2
@3 7'M7'(), -.3 : 6)"6.")&) &) 23/.(*03 8?'#$B$45>%($ 7)') (*(6()' ) )"03')CD+, +
A+'1)E Rv9!QL K! aLOsaX!w Y ZU d -.)" *+2 '30+'*) + \'"?,$ &+ 7'+/')1)<
Zi< I+203'(+'13*03, 7+&31+2 .0("(B)' ) X3 ) )"03')CD+ A+' &+ 0(7+ B+37;7 ,
A.*CD+ K5'?/#%*"J 7)22)*&+ 320) 6F)@3 (*(6()1+2 .1 4#%$': 7)') ) "3(0.') &+
Figura 3. Interface do exemplo ResourceUpdate 7)') "3'1+2 6)&) 4#%*"J< )'-.(@+ -.3 ('# 2.>20(0.(' + '36.'2+
)0.)"[ '323'@)1+2 131M'() 7)') 0+&+
3203 @)"+' R*+03 -.3 + )'-.(@+ 23'#
Listagem 11. Código do evento OnClick do botão btList 0+0)"13*03 6)''3/)&+ 31 131M'()U[
procedure TForm1.btListClick(Sender: TObject);
"31+2 + )'-.(@+ *+ L>&&$% 3, 7+' A(1,
var 6F)1)1+2 )8?'#$B$45>%($< L203 : +
AHandle: THandle;
begin 1:0+&+ -.3 ('# 1+&(A(6)' + '36.'2+ 3,
mmList.Clear;
AHandle := LoadLibraryEx(PC har(edProgram.Tex t), 0, LOAD_LIBRARY_AS _DATAFILE); 7)') 3"3, &3@31+2 7)22)'E + \'"?,$ &)
try
mmList.Lines.Add( ‘RCDATA RESOURCES’);
)7"(6)CD+ ) 1+&(A(6)', + 0(7+ &3 '36.';
EnumResourceNames (AHandle, RT_RCDATA, @EnumResNamesPr oc, Integer(mmList.L ines)); 2+, + *+13 &+ '36.'2+ R: (*03'322)*03
mmList.Lines.Add(‘’);
mmList.Lines.Add( ‘STRING TABLES’); .0("(B)' ) A.*CD+ 9'O$!"#B$45>%($ 7)')
EnumResourceNames (AHandle, RT_STRING, @EnumResNamesPr oc, Integer(mmList.L ines));
finally ) A+'1)0)CD+ &+ @)"+'U, ) "(*/.)/31 &+
FreeLibrary(AHandle);
end;
'36.'2+ Rx y 93.0')"U, + L>&&$% 6+1 +2
end; L6#$4 3 + 0)1)*F+ ) 23' /')@)&+<
O)2+ 3203H)1+2 (*03'322)&+2 *) )"03');
Listagem 12. Função EnumResNamesProc
CD+ &3 .1) 4#%*"J , 6F)1)1+2 + 1:0+&+ )
function EnumResNamesProc(Module: HMODULE; ResType, ResName: PChar;
Strings: TStrings): Boolean; stdcall;
23' (17"313*0)&+ <$#/#%*"J;'L,$ 3 /')@);
var 1+2, )/+'), 0+&) ) /#%*"J ;'L,$ *+@)13*03
InitialString, i: Integer;
Buffer: array[0..1023] of Char; *) 7+2(CD+ 6+''30) R'30+'*)&) 7+' <$#B$42
begin
if ResType = RT_STRING then N':$1&/#%!?< I)') )7"(6)' )2 )0.)"(B)CJ32,
begin
InitialString:=(L oWord(Cardinal(R esName))-1) * 16;
6F)1)1+2 C"?)8?'#$B$45>%($<
for i := 0 to 15 do b(*)"13*03, (17"313*03 +2 1:0+&+2
begin
if LoadString(Module,InitialString+i, '3")6(+*)&+2 N 6+*20'.CD+ &+ /#%*"J ;'L,$
Buffer,1024) <> 0 then
Strings.Add(‘> ‘ + IntToStr(Initial String + i)
6+*A+'13 ) ./-)(0+1 2;<
end;
+ ‘ - ‘ + string(Buffer)); I)') ) 1+*0)/31 &+ /#%*"J ;'L,$ ,
end : *36322#'(+ "3'1+2 0+&)2 )2 4#%*"J4
else if ResType = RT_RCDATA then
begin *+@)13*03, )&(6(+*)*&+;)2 *) 0)>3")
Strings.Add(‘> ‘ + ResName);
end;
3 )"03')*&+ 2+13*03 ) 4#%*"J &323H)&)<
Result := True; I3'63>) -.3 )2 4#%*"J4 320D+ 7'323*032
end;
*) 0)>3") &) 23/.(*03 A+'1)E vjL9=;
\fwvX\a]9=w< ! 6#"6."+ &) 7+2(CD+
Listagem 13. Método UpdateResourceInProgram
(*(6()" : A3(0+ 6+1 >)23 *+ *+13 &+
procedure TForm1.UpdateResourceInProgram(const
ResType: PChar);
'36.'2+ 6+''327+*&3*03 N /#%*"J ;'L,$
var 31 -.320D+< z# + 1&&4$# '37'323*0) )
TempStream: TStream;
ResHandle: THandle; 7+2(CD+ &) 4#%*"J ) 23' )"03')&) *)
Buffer: PChar;
StringTable: WideString; 0)>3")< I)') A(*)"(B)', &3@31+2 /3')'
begin
ResHandle := BeginUpdateReso urce(PChar(
+ 1321+ *W13'+ &3 6)')603'32 *."+2
edProgram.Text) , False); 6+''327+*&3*032 )+ 0)1)*F+ /3')&+<
try
if ResType = RT_RCDATA then %22(1, A36F)1+2 ) 6+*20'.CD+ &3 .1
begin
TempStream := TFileStream.Crea te(
/#%*"J ;'L,$ 6+17"30+< z# + 1:0+&+ <$2
edValue.Text, fmOpenRead); #B$4N':$1&/#%!? : .1 2(17"32 6#"6."+
try
GetMem(Buffer, TempStream.Size) ; 7)') 23 2)>3' + %$45>%($ "':$ &+ /#%*"J
TempStream.Read( Buffer^, TempStream.Size);
UpdateResource(R esHandle, RT_RCDATA, ;'L,$ 6+1 >)23 *+ *? &3 .1 4#%*"J<
MakeIntResource(e dResKey.Text), 0,
Buffer, TempStream.Size );
\3203 23. 7'+/')1) )7+*0)*&+ 7)') +
finally
TempStream.Free;
3436.0#@3" )*03'(+'13*03 6'()&+ B$45>%2
end; ($P*8Q$@$ 3 6"(6)*&+ 31 L#K*4#< G+6^ @3'# )
FreeMem(Buffer); "(20) 6+1 +2 '36.'2+2 &+ 7'+/')1)< I)')
end
else if ResType = RT_STRING then
)"03')' .1 4#%*"J , 6+"+-.3 *+ 23/.*&+
begin ;C?*# + *? &) 4#%*"J R6+7(3 &) "(20)U 3 &^
StringTable := GetStringTable( StrToInt(
edResKey.Text), edValue.Text); .1 *+@+ @)"+'< I+' 34317"+, 7'+6.'3
UpdateResource(R esHandle, RT_STRING,
MakeIntResource(GetResNameOfStrId(StrToInt( 7+' _*+0 6F)*/3&`, 6+''327+*&3*03 )+
edResKey.Text))) , 0, PWideChar(Strin gTable),
Length(StringTable));
%$45>%($4#%*"J )*03'(+'13*03 )&(6(+*)&+,
end; 1.&3 23. @)"+' 3 3436.03 + 7'+/')1)<
finally
EndUpdateResour ce(ResHandle, False); G+6^ @3'# -.3 ) 4#%*"J A+( 1+&(A(6)&)
end;
end; 6+1 2.6322+, )0')@:2 &) >)'') &3 0?0.;
"+2< =3'3 0)1>:1 +.0'+ )'-.(@+ Q(?E
Listagem 14. Implementação dos métodos GetStringTable e GetResNameOfStrId 6+1 &(A3'3*032 A(/.')2 ]8$J 3 A)C) .1)
function TForm1.GetStringTable(StrId: Integer; const 1+&(A(6)CD+ )7+*0)*&+ 7)') + *+13 &+
NewValue: string): WideString;
var '36.'2+ R!97<C/P!VU 3 7)') + 6)1(*F+
ResName: Integer;
Offset: Integer;
)+ )'-.(@+ Q(?E< %>') + 7'+/')1) 3 @+6^
StartPos: Integer; @3'# )2 (1)/3*2 *+@)2<
i: Integer;
AHandle: THandle;
Buffer: array[0..1023] of Char;
StrRead: string; Conclusão
begin
ResName := GetResNameOfStrId (StrId);
I+' 1)(2 -.3 )6F31+2 -.3 2)>31+2
Offset := StrId mod 16; 0.&+, 2317'3 F# )"/+ 7)') )7'3*&3'<
StartPos := (ResName - 1) * 16;
Result := ‘’; /#%$':4 *D+ 2D+ .1 6+*03W&+ &(A?6(",
AHandle := LoadLibraryEx(PCh ar(edProgram.Text ), 0,
LOAD_LIBRARY_AS_DATAFILE);
7+':1, *36322(0)1 23' 343'6(0)&+2< %":1
try
for i := 0 to 15 do
&(22+, ).13*0)1+2 .1 7+.6+ 1)(2
begin *+22+ _)'23*)"` &3 7+22(>("(&)&32, 6+1
if i = Offset then
begin ) .0("(B)CD+ &3 7+&3'+2+2 6+17)60)&+;
Result := Result + Char(Length(NewVa lue)) +
NewValue;
'32 &3 )'-.(@+2 3 )'-.(@+2 &3 '36.'2+
end
else
>)20)*03 A"34?@3(2< %/+'), : 2M 3273')' )
begin +7+'0.*(&)&3 63'0) 7)') )7"(6)' + -.3 A+(
if LoadString(AHandle, StartPos + i, Buffer,
1024) <> 0 then 347"(6)&+ 31 .1 63*#'(+ '3)"<
begin
StrRead := string(Buffer);
Result := Result + Char(Length(Str Read)) +
StrRead;
end;
end;
end; Dê seu feedback sobre esta edição! u
e
s
F eedb ac
k
Result:= Result + StringOfChar(#0, Length(Result)); ê
D
finally
FreeLibrary(AHandle);
A Java Magazine tem que ser feita ao seu
end; gosto.Para isso, precisamos saber o que e
s
t
a
end; e
i d
function TForm1.GetResNameOfStrId(StrId: você, leitor, acha da revista! o ç
ã
Integer): Integer;
begin
Result := (StrId div 16) + 1;
Dê seu voto sobre este artigo, através do link:
end;
www.devmedia.com.br/javamagazine/feedback
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
Figura 4. Janela de Cadastro de Alunos – Dados Pessoais Figura 6. Janela de Cadastro de Alunos – Dados de Documentação
*W13'+ &3 \(7+2 &3 K)&+2 R\KU 3 \(7+2 7)') ) 6+*0)/31 .1 W*(6+ %j] 6+1 &+(2 %j] %".*+ : &3 6+17"34(&)&3 >)(4), 7+(2
&3 a3/(20'+2 R\aU &3 6)&) .1) &322)2 \(7+2 &3 a3/(20'+2< 7+22.( .1 \a 3 gT \K2 3, 7+' A(1, + %]L
A.*CJ32< s1 \K '3A3'3;23 ) .1 6)17+ ]&3*0(A(6)&+2 +2 \K2 3 \a2, 7+&3;23 Q3*2)"(&)&3 0)1>:1 : &3 6+17"34(&)&3
W*(6+ '36+*F36(&+ 73"+ .2.#'(+, 231 6)"6.")' ) 6+17"34(&)&3 &3 6)&) %j]r%]L >)(4), 7+(2 7+22.( .1 \a 3 &+(2 \K2<
'3730(CD+, +. 23H), 23 .1 6)17+ 23 '3; )0')@:2 &) D(:+7( ;< %*)"(2)*&+;), +>23'; ;C <,"IJ+- #+ D$("-(IM8E '37'323*0)1 +2
730(' 1)(2 &3 .1) @3B *.1) (*03'A)63, @);23 -.3 + %j] O.'2+ : &3 6+17"34(&)&3 7'+6322+2 3"313*0)'32 A+'*36(&+2 73") )7"(;
6+*0);23 )73*)2 .1) @3B< >)(4), 7+(2 7+22.( &+(2 \a2 3 6(*6+ \K2, + 6)CD+ )+ .2.#'(+, +*&3 .1 7'+6322+ 3"313*;
s1 \a '3A3'3;23 ) .1 2.>/'.7+ &3 0(7+2
&3 &)&+2, 0)1>:1 '36+*F36(&+2 73"+
.2.#'(+ 3 6+17+*3*03 &3 .1 %j] +. %]L<
9+ 34317"+, +2 \K2 320D+ )7'323*0)&+2
*)2 D(:+7(- 2 ) 5 , '37'323*0)*&+ +2 )'-.(;
@+2 O.'2+, %".*+ 3 Q3*2)"(&)&3, '32736;
0(@)13*03< O+1+ O.'2+ )7'323*0) &+(2
0(7+2 &3 '3/(20'+ R6.'2+2 &3 /')&.)CD+ 3
&3 7M2;/')&.)CD+ 6+1 &)&+2 32736?A(6+2U,
6+*2(&3');23 \a (/.)" ) g<
!2 &31)(2 7+22.31 \a (/.)" ) Z< X3 +2
6.'2+2 320(@32231 &(@(&(&+2 31 1)(2 &3
.1 )'-.(@+ 6+1+, 7+' 34317"+, .1 )';
-.(@+ 7)') 6.'2+2 &3 /')&.)CD+ 3 +.0'+2
&3 7M2, 1321+ )22(1, 6+*2(&3')'?)1+2
TD Tipo de Dado
1 Código do curso
2 Descrição do curso
3 Tipo do curso (1=Graduação / 2=Pós-Graduação)
4 Quantidade de períodos
5 Carga horária
Tabela 1. Tipos de Dados de Curso
TD Tipo de Dado
1 Matrícula do aluno
2 Nome do aluno
3 Data de nascimento
4 Identificador do curso
5 Ano de início
6 Semestre de início
7 Email
8 Telefone residencial
9 Telefone comercial
10 Telefone celular
11 Foto
12 Logradouro
13 Número
14 Complemento
15 Bairro
16 Cidade
17 UF
18 CEP
19 CPF
20 Número identidade
21 Órgão expedidor
22 UF órgão expedidor
23 Data expedição
Tabela 2. Tipos de Dados de Aluno Figura 7. Processo de contagem de pontos de função.
0)' (&3*0(A(6) ) 13*+' .*(&)&3 A.*6(+*)" &+ } %aE I)') 6)&) %j] "(&+ +. 1)*0(&+ 73") 34(>(&+2 6+1+ '32."0)&+ *) (*03'A)63
7+*0+ &3 @(20) &+ .2.#'(+, 3 7+&3 23'E )7"(6)CD+, +. %]L "(&+, 6+*0);23 .1[ 6+1 + .2.#'(+< V$4T>*4'% +>%45 3 V$4T>*4'%
!C"#%'?' C@#$%"' FCCGE 7)') 2.) (&3*0(A(; } \KE 7,>"5 6+*2(&3')1 %a (/.)" ) .1, 7+(2
6)CD+ &3@31 23' )*)"(2)&+2 0+&+2 +2 7'+; ; C"#%'?' C@#$%"' RLLUE 6+*0)1;23 6)&) 7'+6322+ +>0:1 (*A+'1)CJ32 &3 .1
6322+2 3"313*0)'32 -.3 7'+6322)1 &)&+2 +2 )0'(>.0+2 -.3 2D+ )0.)"(B)&+2 3 W*(6+ %j] 3 \K (/.)" ) 0'^2, 7+(2, 7+' 23'
@(*&+2 &3 A+') &) A'+*03(') &) )7"(6)CD+ 3 &303'1(*);23 ) 6+17"34(&)&3 6+*A+'13 .1 7'+6322+ &3 3*0')&) 3 2)?&), '363>3
-.3 )0.)"(B)1 .1 +. 1)(2 %j]2[ ) D(:+7( >[ + 7)'q130'+ ) 23' 6+*2."0)&+ 3 34(>3 +2
!/'b?' C@#$%"' F/CGE + 7'+6322+ /3') ; /'b?' C@#$%"' RXLUE 6+*0)1;23 +2 &)&+2 7'3@(20+2 *)2 '327360(@)2 03")2 &3
&)&+2 7)') A+') &) A'+*03(') &) )7"(6)CD+, )0'(>.0+2 &) 2)?&), )":1 &3 )0'(>.0+2 6)"; 732-.(2) R6M&(/+ 3 &326'(CD+ 7)') 6.'2+2
03*&+ 7+' +>H30(@+ 7'(*6(7)" )7'323*0)' 6.")&+2, 3 &303'1(*);23 ) 6+17"34(&)&3 3 1)0'?6.") 3 *+13 7)') )".*+2U<
&)&+2 )+ .2.#'(+ )0')@:2 &3 "M/(6) &3 6+*A+'13 D(:+7( ?[ A*,#%'% 7,>"54 85% +>%45 6+*2(&3') .1 %a
7'+6322)13*0+ -.3 *D+ )73*)2 ) '36.; ; +5"4>,#' C@#$%"' ROLUE 31 .1 7'+6322+ ) 1)(2 7+' 03' -.3 34(>(' +2 6.'2+2 6)&)2;
73')CD+ &3 &)&+2[ &3 3*0')&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 0')&+2< ! 7'+6322+ 3"313*0)' C@*L*% 9$"2
!+5"4>,#' C@#$%"' F+CGE 7'+6322+ -.3 &3 23"3CD+, )":1 &3 13*2)/31 )+ .2.#'(+ 4'J$: ?$ +>%45 +'?'4#%'?5 *D+ 6+*2(&3')
3*@() &)&+2 7)') A+') &) A'+*03(') &) -.)*&+ A+' + 6)2+< L1 .1 7'+6322+ &3 *3*F.1 %a, 7+(2 *D+ +>0:1 (*A+'1)CJ32
)7"(6)CD+, )7'323*0)*&+ &)&+2 )+ .2.#; 2)?&) &3 &)&+2, 6+*0)1;23 +2 )0'(>.0+2 &3 &3 *3*F.1 %j] +. %]L 3 6+*2(&3') \K
'(+ 7+' 13(+ &3 .1) 2(17"32 '36.73')CD+ 2)?&)< L1 7'+6322+2 &3 3*0')&) 3 2)?&), (/.)" ) .1 31 A.*CD+ &) 13*2)/31
&3 (*A+'1)CJ32 &3 %j] +. %]L< 2+1)1;23 +2 &+(2 '32."0)&+2< K303'1(*);23 34(>(&)< !2 7'+6322+2 3"313*0)'32 !"(,>*%c
9+ 320.&+ &3 6)2+ &3203 )'0(/+, 7+&31; ) 6+17"34(&)&3 6+*A+'13 ) D(:+7( ?< 7,#$%'%c C@(,>*% 3 +5"4>,#'% 7,>"54 6+*2(&3;
23 (&3*0(A(6)' +2 7'+6322+2 3"313*0)'32 9+ 320.&+ &3 6)2+ &3203 )'0(/+, 6+*; ')1 &+(2 %a 7+' )0.)"(B)' + %j] %".*+ 3
6+*A+'13 )7'323*0)&+ *) D(:+7( =< 2(&3')1;23 )2 )*#"(232 )7'323*0)&)2 *) +>03' &)&+2 &+ %j] O.'2+<
%2 '3/')2 7)') &3A(*(' ) 6+17"34(&)&3 D(:+7( @< ! 7'+6322+ 3"313*0)' C@*L*% +d,(>,5 ?$
&3 LL, XL +. OL 6+*2(&3')1 + *W13'+ &3 !2 7'+6322+2 3"313*0)'32 K*4#'% +>%454 X',5% ?' 9$"4',*?'?$ 6+*2(&3'+. %a (/.)"
%'-.(@+2 a3A3'3*6()&+2 R%aU 3 + *W13'+ 3 K*4#'% 7,>"54 6+*2(&3')')1 \K (/.)" ) ) .1 7+' "3' + %]L Q3*2)"(&)&3 3 \K (/.)"
&3 \(7+ &3 K)&+2 R\KU .0("(B)&+2, 23*&+E &+(2 7+' 23' 3223 + *W13'+ &3 )0'(>.0+2 ) &+(2, 31 @('0.&3 &3 "3' + @)"+' &) 13*2);
"(&)&3 31 A.*CD+ &+ 0(7+ &3 6.'2+<
TD Tipo de Dado =C N8")8- #+ <,"IM8 OM8 !P,-)(#8-H
1 Tipo do curso (1=Graduação / 2=Pós-Graduação) )7M2 (&3*0(A(6)' )2 A.*CJ32 &3 &)&+2 3 +2
2 Valor Base da Mensalidade 7'+6322+2 3"313*0)'32, 1."0(7"(6);23 +
Tabela 3. Tipos de Dados de Mensalidade 0+0)" &3 %j], %]L, LL, XL 3 OL 73"+ '32736;
0(@+ @)"+' &3 7+*0+ &3 A.*CD+ &) 0)>3") &3
Tipos de Dados (TD)
Tipos de Registro (TR) 6+17"34(&)&3 RD(:+7( AU 7)') &303'1(*)'
Abaixo de 20 20 a 50 Acima de 50
+ @)"+' 0+0)" -.3 23'# + Ib *D+ )H.20)&+<
1 Baixa Baixa Média
% D(:+7( 2B 34(>3 + '32."0)&+ A(*)" &+
2a5 Baixa Média Alta
6#"6."+ &3 7+*0+2 &3 A.*CD+ *D+ )H.20);
Acima de 5 Média Alta Alta
&+2 7)') + 320.&+ &3 6)2+ &3203 )'0(/+<
Tabela 4. Complexidade das funções de dados (ALI e AIE) >C Q(78$ #8 <()8$ #+ !P,-)+H '37'323*;
Funcionalidade Processo Elementar Tipo 0) ) (*A".^*6() &3 '3-.(2(0+2 0:6*(6+2 3
Listar Cursos CE &3 -.)"(&)&3 *+ 0)1)*F+ &+ 2+A0V)'3<
Pesquisa de Cursos p 6)"6.")&+ 6+1 >)23 31 Zo 6)')603'?2;
Pesquisar Curso CE
Incluir Curso EE 0(6)2 /3')(2 &3 .1 2(2031), +*&3 6)&)
Alterar Curso EE .1) &3")2 &3@3 23' )*)"(2)&) 6+1 '3;
Cadastramento de Cursos Excluir Curso EE ")CD+ )+ 23. *?@3" &3 (*A".^*6() 2+>'3
Consultar Curso CE + 2(2031) 3 7+*0.)&) &3 x R*3*F.1)
Exibir Mensagem de Curso Cadastrado CE (*A".^*6()U ) h R/')*&3 (*A".^*6()U<
Listar Alunos CE % &326'(CD+ 6+17"30) &3 6)&) 6)')6;
Pesquisa de Alunos Pesquisar Aluno CE 03'?20(6) 3 )2 0)>3")2 7)') )@)"()CD+ &+2
Filtrar Alunos por Curso CE @)"+'32 &3 7+*0.)CD+, 7+&3 23' +>0(&)
Incluir Aluno EE *+ 1)*.)" &3 I'#0(6)2 &3 O+*0)/31
Alterar Aluno EE &3 I+*0+2 &3 b.*CD+ &+ ]bIs=< I)')
Cadastramento de Alunos
Excluir Aluno EE 3203 34317"+, )2 6)')603'?20(6)2 A+')1
Consultar Aluno CE &326'(0)2 ) 23/.(', >31 6+1+ +2 @)"+'32
Exib ir Cursos Cadastrados na Caixa de Combinação CE 6+*2(&3')&+2 7)') 6)&) .1) &3")2E
Exibir Cálculo de Valor da Mensalidade SE _Q +5:>"*('`a5 ?$ 3'?54e 6+*2(&3') 23
Tabela 5. Processos Elementares identificados no estudo de caso 2D+ .0("(B)&+2 '36.'2+2 &3 6+1.*(6)CD+
73") )7"(6)CD+< 93203 34317"+, 23'# 6+*; Tipos de Dados (TD)
2(&3')&+ + @)"+' -.)0'+, -.3 : '3")0(@+ Arquivos Referenciados (AR)
Abaixo de 5 5 a 15 Acima de 15
) )7"(6)CJ32 +*;"(*3, 2.7+'0)&)2 7+' 0 ou 1 Baixa Baixa Média
)"/.1 7'+0+6+"+ &3 6+1.*(6)CD+[ 2 Baixa Média Alta
[Q V%5($44':$"#5 3*4#%*L>b?5e '3")0(@+ Acima de 2 Média Alta Alta
N 0')*2A3'^*6() &3 &)&+2 3*0'3 +2 6+1; Tabela 6. Complexidade de Entrada Externa (EE)
7+*3*032 &) )7"(6)CD+< b+( 6+*2(&3')&+
+ @)"+' .1, .1) @3B -.3 *D+ '3)"(B) Tipos de Dados (TD)
7'+6322)13*0+ &(20'(>.?&+, A)B3*&+ .2+ Arquivos Referenciados (AR)
Abaixo de 6 6 a 19 Acima de 19
)73*)2 &3 .1 2(2031) &3 /3'3*6()13*0+ 0 ou 1 Baixa Baixa Média
&3 >)*6+ &3 &)&+2[ 2 ou 3 Baixa Média Alta
ZQ V$%&5%:'"($e &303'1(*) 6+1+ + 0317+ Acima de 3 Média Alta Alta
&3 '327+20) (*A".3*6() ) )7"(6)CD+< b+( 6+*;
Tabela 7. Complexidade de Saída Externa (SE) e Consulta Externa (CE)
2(&3')&+ B3'+, .1) @3B -.3 *D+ A+( (*&(6)&)
*3*F.1) '320'(CD+ ) 3223 '3273(0+[
Processo Elementar Tipo AR TD Complexidade
fQ +5"&*J>%'`a5 7,#':$"#$ )#*,*E'?'e &3A(*3
Listar Cursos CE 1 2 Baixa
+ *?@3" &3 '320'(CJ32 (17+20)2 73"+ .2.#'(+<
Pesquisar Curso CE 1 3 Baixa
\)1>:1 A+( 6+*2(&3')&+ + @)"+' B3'+ .1) Incluir Curso EE 1 5 Baixa
@3B -.3 *3*F.1) '320'(CD+ A+( (17+20)[ Alterar Curso EE 1 5 Baixa
gQ X5,>:$ ?$ ;%'"4'`h$4e '3A3'3;23 )+ Excluir Curso EE 1 5 Baixa
@+".13 &3 (*A+'1)CJ32 7'+6322)&+2 73") Consultar Curso CE 1 5 Baixa
)7"(6)CD+< O+*2(&3'+.;23 + @)"+' .1, Exibir Mensagem de Curso Cadastrado CE 0 1 Baixa
.1) @3B -.3 : 7'3@(20+ .1 *W13'+ &3 Listar Alunos CE 1 2 Baixa
0')*2)CJ32 1)(2 3"3@)&+ 31 )"/.*2 73; Pesquisar Aluno CE 1 3 Baixa
'?+&+2 32736?A(6+2, 6+1+ ) 6)&) 73'?+&+ Filtrar Alunos por Curso CE 2 3 Baixa
&3 1)0'?6.")2 &3 )".*+2[ Incluir Aluno EE 2 23 Alta
iQ C"#%'?' ?$ 3'?54 1"2,*"$e 6+*2(&3') ) Alterar Aluno EE 2 23 Alta
-.)*0(&)&3 &3 0')*2)CJ32 A3(0)2 +*;"(*3< Excluir Aluno EE 2 23 Alta
b+( 6+*2(&3')&+ + @)"+' 6(*6+ .1) @3B Consultar Aluno CE 2 23 Alta
-.3 + 2(2031) )7'323*0) 0+&)2 )2 0')*2); Exibir Cursos Cadastrados na Caixa de Combinação CE 1 1 Baixa
CJ32 6+1+ 23*&+ &3223 0(7+[ Exibir Cálculo de Valor da Mensalidade SE 1 2 Baixa
jQ C&*(*k"(*' ?5 )4>d%*5 A*"',e '3A3'3;23 ) Tabela 8. Complexidade dos processos elementares identificados no estudo d e caso.
A)6("(&)&32 +A3'36(&)2 )+ .2.#'(+ A(*)",
6+1+ )H.&) +*;"(*3, ).4?"(+ N *)@3/)CD+ Processo Elementar Tipo Complexidade Pontos Função
7+' 036")2 &3 A.*CD+, 13*.2, &3*0'3 +.0'+2< Curso ALI Baixa 7
b+( 6+*2(&3')&+ + @)"+' .1 7+' )7'323*; Aluno ALI Baixa 7
0)' )"/.1)2 7+.6)2 6)')603'?20(6)2 &3223 Mensalidade AIE Baixa 5
0(7+, 6+1+ ) 34(>(CD+ &+2 6.'2+2 31 6)(4) Listar Cursos CE Baixa 3
&3 6+1>(*)CD+ 7)') A)6("(0)' ) 23"3CD+ &+ Pesquisar Curso CE Baixa 3
.2.#'(+ *+ 6)&)20')13*0+ &3 )".*+2[ Incluir Curso EE Baixa 3
lQ 7#>',*E'`a5 1"2,*"$e &3A(*3 23 +2 )'; Alterar Curso EE Baixa 3
-.(@+2 "M/(6+2 (*03'*+2 2D+ )0.)"(B)&+2 Excluir Curso EE Baixa 3
+*;"(*3< b+( .0("(B)&+ + @)"+' 0'^2, 7+(2 Consultar Curso CE Baixa 3
0+&+2 +2 )'-.(@+2 (*03'*+2 2D+ )0.)"(B); Exibir Mensagem de Curso Cadastrado CE Baixa 3
&+2 &322) A+'1)[ Listar Alunos CE Baixa 3
mQ +5:8,$@*?'?$ ?$ V%5($44':$"#5e &303'; Pesquisar Aluno CE Baixa 3
1(*) ) 6+17"34(&)&3 &3 7'+6322)13*0+ Filtrar Alunos por Curso CE Baixa 3
Incluir Aluno EE Alta 6
Função Baixa Média Alta Alterar Aluno EE Alta 6
Consulta Externa (CE) 3 4 6 Excluir Aluno EE Alta 6
Entrada Externa (EE) 3 4 6 Consultar Aluno CE Alta 6
Saída Externa (SE) 4 5 7 Exibir Cursos Cadastrados na Caixa de Combinação CE Baixa 3
Arquivo de Interface Externa (AIE) 5 7 10 Exibir Cálculo de Valor da Mensalidade SE Baixa 4
Arquivo Lógico Interno (ALI) 7 10 15 Total de Pontos de Função 80
Tabela 9. Contribuição de ponto de função por complexidade Tabela 10. Identificação dos processos elementares e suas complexidade
&)2 A.*6(+*)"(&)&32 &) )7"(6)CD+< b+( )H.20)&+2 2D+ 6)"6.")&+2 ) 7)'0(' &+2 Ib2 "F+ &3 .1 W*(6+ &323*@+"@3&+'< !.0')
6+*2(&3')&+ + @)"+' B3'+, 7+' 23' .1) *D+ )H.20)&+2 1."0(7"(6)&+ 73"+ A)0+' &3 2(0.)CD+ -.3 13'363 )03*CD+ : .0("(B)'
)7"(6)CD+ >)20)*03 2(17"32[ )H.203< 9+ 6)2+ &3 7'+6322+2 &3 &323*; + @)"+' '3)" &3 7'+&.0(@(&)&3 &3 .1 &3;
_nQ B$>#*,*E'`a5e (&3*0(A(6) 23 + 6M&(/+ @+"@(13*0+, A.*CJ32 7)') 6+*@3'2D+ &3 23*@+"@3&+', .1) @3B -.3 &(A(6("13*03
A+( 7'+H30)&+ 7)') 23' '3)7'+@3(0)&+ &)&+2 0)1>:1 &3@31 23' 6+*2(&3')&)2 )"/.:1 031 7'+&.0(@(&)&3 (/.)" ) 2.)
31 +.0')2 )7"(6)CJ32< ! @)"+' B3'+ A+( 3 2.) 6+17"34(&)&3 31 7+*0+2 &3 A.*; 6)'/) F+'#'() 0+0)" &3 0')>)"F+<
6+*2(&3')&+ 7+' 322) *D+ 03' 2(&+ .1) CD+ &3@3 23' )&(6(+*)&) )+2 7+*0+2 &3 93203 34317"+ F(7+0:0(6+, 23 6+*2(&3')';
7'3+6.7)CD+ *+ 7'+H30+[ A.*CD+ *D+ )H.20)&+2< 1+2 -.3 .1 &323*@+"@3&+' 7'+&.B 63'6)
__Q A'(*,*?'?$ ?$ !"4#','`a5e 6+*2(&3') %22(1, ) 23/.(*03 AM'1.") 7)') 7'+632; &3 Th F+')2 '3)(2 7+' 231)*), + 320.&+ &3
23 34(2031 A3'')13*0)2 &3 6+*@3'2D+ 3 2+2 &3 &323*@+"@(13*0+ : )7"(6)&)E 6)2+ &3203 )'0(/+ "3@)'() 13*+2 &3 &.)2
(*20)")CD+ &) )7"(6)CD+< \)1>:1 A+( 6+*; 231)*)2 7)') 23' &323*@+"@(&+, 23 6+*&.;
PF Desenvolvimento = (PF Não Ajustado +
2(&3')&+ + @)"+' B3'+ 7+' 322) 7'3+6 .7); PF Conversão de Dados) * Fator Ajuste (VAF) B(&+ 7+' .1 W*(6+ &323*@+"@3&+'<
CD+ *D+ 03' 2(&+ "3@)&) 31 6+*2(&3')CD+
*+ 320.&+ &3 6)2+[ I)') + 6)2+ &+ 34317"+ .0("(B)&+, 6+1+ Conclusão
_[Q A'(*,*?'?$ ?$ 18$%'`a5e 6+*2(&3') *D+ A+( 6+*2(&3')&) ) 6+*@3'2D+ &3 &)&+2E O+*0)/31 &3 I+*0+2 &3 b.*CD+ '37'3;
)27360+2 &3 23/.')*C) 3 '36.73')CD+ &3 PF Desenvolvimento = (80 + 0) * 0,8 = 64 PFs 23*0) .1) 0:6*(6) &3 6#"6."+ &+ 0)1)*F+
(*A+'1)CJ32< O+1+ (22+ 0)1>:1 *D+ A+( &3 .1) )7"(6)CD+, *D+ &3 32A+'C+ 7)')
6+*2(&3')&+, : )22.1(&+ + @)"+' B3'+[ Estimativas de esforço e prazo a partir 23. &323*@+"@(13*0+< X.) 6+''30) .0("(;
_ZQ 9o,#*8,54 K5('*4e 23 ) )7"(6)CD+ A+( da Contagem de Pontos de Função B)CD+, >)23)&) *)2 '3/')2 &326'(0)2 *+
7'+H30)&) 3 &323*@+"@(&) 7)') 23' .0("(; I+*0+2 &3 b.*CD+ 0^1 7+' +>H30(@+ ) 1)*.)" &3 I'#0(6)2 &3 O+*0)/31 &3 I+*;
B)&) 31 &(A3'3*032 "+6)(2< L22) '320'(CD+ 13&(CD+ &+ 0)1)*F+ A.*6(+*)" &3 .1) 0+2 &3 b.*CD+ &+ ]bIs=, 7+&3 )H.&)' *)
0)1>:1 *D+ A+( 6+*2(&3')&) 3 )22.1(&+ )7"(6)CD+< L*0'30)*0+, *D+ : (*6+1.1 -.3 13&(CD+ &) A.*6(+*)"(&)&3 &3 2(2031)2
+ @)"+' B3'+[ &323*@+"@3&+'32 -.3(')1 320(1)' 32A+'C+ 3 )7+()' 320(1)0(@)2 &3 32A+'C+ 3 7')B+
_fQ A'(*,*?'?$ ?$ 9>?'"`'4e 23 ) )7"(6)CD+ 3 7')B+2 ) 7)'0(' &+ *W13'+ &3 7+*0+2 >)23)&)2 *) 7'+&.0(@(&)&3 6+*F36(&) &3
A+( 7'+H30)&) 7)') A)6("(0)' 1.&)*C)2 &3 A.*CD+< K3@3;23 0+1)' 6.(&)&+ 6+1 .1) 3-.(73 &3 &323*@+"@(13*0+<
*) "M/(6) &3 7'+6322)13*0+ +. 31 2.)2 322) 2(0.)CD+, 7+(2 ) 7'+&.0(@(&)&3 &3 I+&3;23 )(*&) 3*6+*0')' &(@3'2)2
320'.0.')2 &3 &)&+2< ! @)"+' B3'+ A+( &(A3'3*032 3-.(732 &3 &323*@+"@(13*0+ A3'')13*0)2 +. 7")*("F)2 3"30'~*(6)2 &3
.0("(B)&+ *3223 6)2+< 7+&3 @)'()' 6+*2(&3')@3"13*03, (*6".2(@3 &(A3'3*032 A+'*363&+'32 7)') )7+()' +2
X+1)1;23 3*0D+ 322)2 7+*0.)CJ32 7)') 31 A.*CD+ &)2 036*+"+/()2 .0("(B)&)2< 7'+63&(13*0+2 &3 6#"6."+ &3 7+*0+2 &3
+>03' + *?@3" 0+0)" &3 (*A".^*6() R\K] Y ;5#', % A)"0) &3 6+*F36(13*0+ &) 7'+&.; A.*CD+ &3 A+'1) ) A)6("(0)' + 7'+6322+ &3
3$J%$$ 5& !"&,>$"($U< K)? >)20) )7"(6)' ) 23; 0(@(&)&3 &) 3-.(73 7+&3 A)B3' 6+1 6+*0)/31< L203 )'0(/+ 7'+6.'+. )7'323*;
/.(*03 AM'1.") 7)') +>03' + @)"+' &+ A)0+' -.3 )2 320(1)0(@)2 &3 32A+'C+ 23H)1 0)' &3 A+'1) 7'#0(6) )2 7'( *6(7)(2 '3/')2
&3 )H.203 RG%b Y X',>$ 7?]>4#:$"# A'(#5%UE 3'')&)2, 231 -.3 7+*0+2 &3 A.*CD+ &3 6+*0)/31 &3 7+*0+2 &3 A.*CD+ )0')@:2
23H)1 +2 6."7)&+2 7+' (22+< !.0') 2(; &3 .1 320.&+ &3 6)2+ 7'#0(6+<
Valor do Fator de Ajuste (VAF) =
(TDI x 0,01) + 0,65 0.)CD+ 7'3+6.7)*03 : .0("(B)' 0)>3")2
&3 7'+&.0(@(&)&3 7+' 7+*0+ &3 A.*CD+ Referências
9+ 6)2+ &+ 34317"+ &3203 )'0(/+E &(27+*?@3(2 *) (*03'*30, +*&3 +2 &)&+2
Site do IFPUG: International Function Point Users Group
VAF = (15 x 0,01) + 0,65 = 0,8
)"( )7'323*0)&+2 7+&31 *D+ '3A"30(' ) www.ifpug.org
6)7)6(&)&3 &3 7'+&.CD+ &3 -.)"-.3' Site do BFPUG-Brazilian Function Point Users Group
%0.)"13*03 3223 : .1 7)22+ +76(+*)" 3-.(73 &3 &323*@+"@(13*0+ 3, 1.(0)2 www.bfpug.com.br
&+ 7'+6322+ &3 6+*0)/31< Q.(0)2 +'/); @3B32, *D+ "3@)1 31 6+*2(&3')CD+ )2 LivroAnálisedePontosdeFunção – Medição,Estimativas
*(B)CJ32 &326+*2(&3')1 + A)0+' &3 )H.203 6)')603'?20(6)2 &3 &(A3'3*032 036*+"+/()2
e Gerenciamento de Projetos de Software
3 .2)1 )73*)2 ) 13&(CD+ &+2 7+*0+2 &3 -.3 7+&31 23' .0("(B)&)2<
3ª. edição, Carlos Eduardo Vazquez, Guilherme Siqueira
A.*CD+ *D+ )H.20)&+2< ]22+ 23 &3@3 )+ I+'0)*0+, + 6+*F36(13*0+ &) 7'+&.0(;
Simões e Renato Machado Albert.
A)0+ &3 -.3 )2 6)')603'?20(6)2 /3')(2 &3 @(&)&3 &3 6)&) 3-.(73 : A.*&)13*0)"
Editora Érica, 2003.
.1 2(2031), )7'323*0)&)2 )*03'(+'13*; 7)') 320(1)0(@)2 &3 32A+'C+ 3 7')B+ )
03, 2D+ 6+*2(&3')&)2 &32)0.)"(B)&)2 +. 7)'0(' &) 6+*0)/31 &3 7+*0+2 &3 A.*CD+<
(*6+17"30)2 31 '3")CD+ N2 036*+"+/()2 9+ 320.&+ &3 6)2+ &3203 )'0(/+, @)1+2 Dê seu feedback sobre esta edição! u
e
F eedb ac
k
s
)0.)"13*03 .0("(B)&)2, A)B3*&+ 6+1 -.3 6+*2(&3')' F(7+030(6)13*03 ) 2(0.)CD+ &3 ê
D
2.) .0("(&)&3 23H) -.320(+*)&)< -.3 .1 7+*0+ &3 A.*CD+ : &323*@+"@(&+ A Java Magazine tem que ser feita ao seu o
s
b
r
e
]22+ A(6) 1)(2 3@(&3*6()&+ -.)*&+ ) 31 .1) F+') &3 0')>)"F+ &3 .1 &323*; gosto.Para isso, precisamos saber o que e
s
t
a
e
d
i
*+'1) ]X!r]LO ZoZoT 6+*2(&3') )73*)2 @+"@3&+' RZ F+131rF+')U< você, leitor, acha da revista! o ç
ã
+2 7+*0+2 &3 A.*CD+ *D+ )H.20)&+2 31 %22(1, + 32A+'C+ 7)') 3223 7'+H30+, Dê seu voto sobre este artigo, através do link:
2.)2 320(1)0(@)2 &3 13&(CD+ A.*6(+*)"< 6+*2(&3')*&+;23 +2 7+*0+2 &3 A.*CD+ www.devmedia.com.br/javamagazine/feedback
?C N8")8- #+ <,"IM8 !P,-)(#8-H !2 Ib2 )H.20)&+2, 23'() &3 io F+')2 &3 0')>);
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
]22+ )6+*0363, 7+'-.3 (*A+'1)1+2 )+ )22(*)0.') 6+17"30) &+ 3@3*0+ 7+&31+2 "(B)CD+ *D+ : .1) (*20'.CD+ 7)') ?$,$#'%
3/V -.3 *D+ : 73'1(0(&) ) )"03')CD+ &3 @3' ) 23/.(', H.*0)13*03 6+1 ) &326'(CD+ + '3/(20'+, 7+(2 6)2+ 23H) *D+ F# *36322(;
'3/(20'+2 7+' 7)'03 &) )7"(6)CD+ 6"(3*03, &3 6)&) 7)'q130'+E &)&3 31 23 @)"(&)' .1 '3/(20'+ -.3 23'#
"+/+ ) 13*2)/31 _O"(3*0K)0)X30ZE Q+; BeforeUpdateRecor d(Sender: TObject; )7)/)&+< L1 23/.(&) 0320)1+2 23 + @)"+'
&(A(6)0(+*2 )'3 *+03 )""+V3&<`, 0')&.;
SourceDS: TDataSet; DeltaDS:
TClientDataSet;
'363>(&+ : &(A3'3*03 &3 N>,,R_G)']29.""`U
B(*&+, _O"(3*0K)0)X30ZE Q+&(A(6)CJ32 UpdateKind: TUpdateKind; 3 &(A3'3*03 &3 ='E*5R_G)']2L170u`U< I+'
var Applied: Boolean);
*D+ 2D+ 73'1(0(&)2<`< A(1, @3'(A(6)1+2 23 + @)"+' &+ 6)17+
} /$"?$%e 3'#'/$#V%5=*?$% -.3 &(27)'+. 1B3CBu37;C *D+ : 2.73'(+' )+ /\!Vu
Usando os eventos do DSP + 3@3*0+[ 37;C< f)@3*&+ -.)(2-.3' &(@3'/^*6()
I+&31+2 .0("(B)' 0'^2 3@3*0+2 7)') @)"(; } /5>%($3/e ='+223(')13*03 A)")*&+ : .1) 3463CD+ : "3@)*0)&)<
&)' (5"4#%'*"#4 31 .1) )7"(6)CD+ .2)*&+ ) A+*03 &3 &)&+2, +2 &)&+2 31 2([
+ 3'#'/$#V%5=*?$%< XD+ 3"32E } 3$,#'3/e I)6+03 &3 &)&+2 3*@()&+ Usando o evento OnUpdateData
} H$&5%$)8?'#$B$(5%?e %6+*0363 )*032 73") )7"(6)CD+ 6"(3*03[ ! 3@3*0+ 1")8?'#$3'#' +6+''3 .1)
-.3 +2 &)&+2 23H)1 )0.)"(B)&+2 *) )7"(; } )8?'#$y*"?e \(7+ &3 .7&)03, )0.)"(B); @3B )+ (*(6()' ) )7"(6)CD+ &+2 &)&+2 *+
6)CD+ '31+0)[ CD+, -.3 23'# A3(0)< !2 @)"+'32 7+22?@3(2 23'@(&+', +. 23H), *+ '363>(13*0+ &+2
} 1")8?'#$3'#'e %6+*0363 )+ )7"(6)' +2 2D+E >O!"4$%#c >O95?*&6 $ >O3$,$#$x '3/(20'+2 K3"0) &+ +,*$"#3'#'/$#< p *3223
&)&+2 '363>(&+2 73") )7"(6)CD+ 6"(3*03, } 788,*$?e ]*&(6) 23 )2 1+&(A(6)CJ32 1+13*0+ -.3 (*03'6370)1+2 )2 1+&(A(;
*+ 23'@(&+' &3 &)&+2[ 23'D+ )7"(6)&)2< 6)CJ32 3 )63(0)1+2 +. )0: 1+&(A(6)1+2
} 1")8?'#$C%%5%e n.)*&+ +6+''31 +2 &)&+2 23 *36322#'(+< %-.( 0)1>:1
3''+2 )+ 03*0)' 3A30.)' + )8?'#$< Usando o evento 7+&31+2 3*@()' 13*2)/3*2 N )7"(6)CD+
s2)1+2 + 3@3*0+ H$&5%$)8?'#$B$(5%? BeforeUpdateRecord 6"(3*03 6)2+ 23H) *36322#'(+<
-.)*&+ *36322(0)1+2 A)B3' ) @)"(&)CD+ G3H)1+2 .1 34317"+ 7'#0(6+< 9+ 3@3*; G3H) ) )22(*)0.') &+ 3@3*0+ "+/+ 31
(*&(@(&.)" &+2 '3/(20'+2 3*@()&+2 )+ 0+ H$&5%$)8?'#$B$(5%? &(/(03 + 6M&(/+ &) 23/.(&)E
23'@(&+'< \)1>:1 7+&31+2 1+&(A(6)' ./-)(0+1 2< 93223 6)2+ 320)1+2 @3'(A(;
OnUpdateData(Se nder: TObject; DataSet:
&)&+2 '363>(&+2 &) )7"(6)CD+ 6"(3*03< % 6)*&+ 7'(13(')13*03 23 + 0(7+ &3 )0.); TClientDataSet);
} /$"?$%e 3/V -.3 &(27)'+. + 3@3*0+[ .1 3'#'/5>%($R_K)0)X+.'63Z`U )+ 2(2031)< 3A30.)&)2< L436.03 + 7'+/')1), 3A30.3
} 3'#'/$#e I)6+03 &3 &)&+2, 3'#' V'(O$#x K326+*3603 + +,*$"#3'#'/$# &+ 8%5=*?$% )"/.1)2 )"03')CJ32 *) 0)>3") 3 31 23/.(;
"(17)*&+ ) 7'+7'(3&)&3 V%5=*?$%N':$< &) 6"(-.3 *+ >+0D+ 3$,#'< I3'63>) -.3 + g„
9+ 6)2+ &+ 3@3*0+ )*03'(+', H$&5%$)8?'#$2 O+*3603 + 3'#'/5>%($_ )+ 3$,#'< ]*2(') .1 3H<%*? 1+20') )73*)2 )"/.*2 '3/(20'+2<
3'#' , *D+ 031+2 )6322+ 0+0)" )+2 &)&+2 -.3 H>##5" 3 .1 3H<%*?< j(/.3 + 3H<%*? )+ L"32 A)B31 7)'03 &+ 3'#' V'(O$# , +. 23H), +
320D+ @(*&+, 3 2(1 ) .1 '3/(20'+ 31 7)'0(6.; ?43$,#' 3 &(/(03 + 6M&(/+ &) ./-)(0+1 4 *+ 7)6+03 &3 &)&+2 -.3 23'# 3*@()&+ )+ 3/V
")'< z# *+ 6)2+ &+ 1")8?'#$3'#' , '363>31+2 3@3*0+ 1"+,*(O &+ H>##5" R</0,$( ?U< 7)') 1+*0)/31 &)2 (*20'.CJ32 &3 (*6".;
+ 3'#'/$# , -.3 6+*0:1 0+&+2 +2 &)&+2 )"03'); ! -.3 320)1+2 A)B3*&+ : 1.(0+ 2(1; 2D+, )"03')CD+ 3 346".2D+ &+2 '3/(20'+2 *)
&+2 3 *D+ )"03')&+2< X3*&+ )22(1, 7+&31+2 7"32< %73*)2 )0'(>.?1+2 N 7'+7'(3&)&3 >)23 &3 &)&+2< XD+ )22(1 -.3 6F3/)1 +2
"3' (*&(@(&.)"13*03 + 20)0.2 &3 6)&) '3/(2; 3'#' &+ 3$,#' + 6+*03W&+ &) 7'+7'(3&)&3 &)&+2 )+ 3/V R</0,$( @U<
0'+ &) 0)>3") )0')@:2 &+ 3$,#'< ]*2(') 1)(2 3$,#' &+ +,*$"#3'#'/$#_ , -.3 6+*0:1 +2 ! 7'(13('+ '3/(20'+ 6+1 + 6M&(/+
.1 6+17+*3*03 +,*$"#3'#'/$#R_K3"0)`U 3 &)&+2 +'(/(*)(2 )6'326(&+ &)2 )"03')CJ32 Xm_Cn[_n , A+( 1)'6)&+ 7)') 346".2D+< z#
www.devmedia.com.br/clubedelphi/portal.asp
Nota do DevMan
Se você quiser mostrar mensagens personalizadas de
erros em seu DSP, basta fazer uso dos eventos OnEditError,
OnPostError e OnDeleteError presentes no ClientDataSet.
Para isso basta acessar o evento que deseja modificar e
inserir a mensagem desejada. Ex:
Figura 4. Exemplo de tela
procedure TForm1.ClientDataSet1EditError
(DataSet: TDataSet;
E: EDatabaseError; var Action:
Listagem 1. Código do evento BeforeUpdateRecord TDataAction);
begin
procedure TForm1.DataSetProvider1BeforeUpdateRecord( MessageDlg(‘Não são permitidas
Sender: TObject; SourceDS: TDataSet; DeltaDS: alterações nessa tabela.’,
TClientDataSet; UpdateKind: TUpdateKind; mtInformation, [mbOk], 0);
var Applied: Boolean); Action := daAbort;
begin end;
if UpdateKind <> ukDelete then
if ((VarIsNull(Del taDS.FieldByName (‘ORDER_DATE’)
.NewValue) = False) and Note que estamos alterando o parâmetro Action
(VarIsEmpty(DeltaDS.FieldByName(‘ORDER_DATE’)
.NewValue) = False)) then para daAbort, dessa forma a mensagem original do
if DeltaDS.FieldBy Name(‘ORDER_DATE’ ).NewValue >
DeltaDS.FieldByN ame(‘SHIP_DATE’). OldValue then ClientDataSet não será exibida, mostrando apenas nossa
raise Exception.Create( ‘Data do pedido não pode ser
superior a data de compra.’);
caixa de diálogo.
end;
+ 23/.*&+ '3/(20'+, Xm[W_nnZ , 03@3 + 6)1;
7+ +)/;uN1 )"03')&+ &3 _n_n 7)') Znn ,
7+' (22+ )7)'363 *) @(2.)"(B)CD+ )73*)2
+ 6)17+ +)/;uN1 )"03')&+< I+' A(1 +2
&+(2 W"0(1+2 '3/(20'+2 A+')1 (*6".2+2
*) 0)>3")< % 7)'0(' &+ 1+13*0+ -.3 +
1:0+&+ 788,6)8?'#$4 &+ +,*$"#3'#'/$# Listagem 2. Código do botão Delta
A+' 6F)1)&+, + 3/V A)'# ) 1+*0)/31 &)2 procedure TForm1.Button2Click(Sender: TObject);
(*20'.CJ32 Xnj 3 )2 3*@()'# )+ 23'@(&+' begin
try
&3 &)&+2, -.3 7+' 2.) @3B 3436.0)'# 0+&+ Delta.Close;
Delta.Data := ClientDataSet1.D elta;
+ 7'+6322+ &3 )0.)"(B)CD+< Delta.Open;
except
MessageDlg(‘Sem registros no Delta’,
Usando o evento OnUpdateError end;
mtWarning, [mbOK], 0);
www.devmedia.com.br/clubedelphi/portal.asp
Configurando UpdateMode e
ProviderFlags
\')>)"F)' 6+1 3/V *D+ : 0D+ &(A?6("
-.)*0+ 23 73*2), 1)2 1.(0+2 23 )0');
7)"F)1 6+1 2.)2 6+*A(/.')CJ32< s1)
&)2 6+(2)2 -.3 1)(2 2+. (*&)/)&+, &(B
'3273(0+ N2 7'+7'(3&)&32 )8?'#$95?$ &+
3'#'/$#V%5=*?$% 3 V%5=*?$%A,'J4 &+ +,*$"2
#3'#'/$#< 9D+ F# 23/'3&+2 1(')>+")*032
*322)2 &.)2 7'+7'(3&)&32, @3H)1+2 + -.3
6)&) .1) 2(/*(A(6) 3 6+1+ A.*6(+*)<
L1 2.1) 031+2 )73*)2 0'^2 320)&+2 &+
)8?'#$95?$ -.3 2D+E
} >8D0$%$7,,e s0("(B) 0+&+2 +2 6)17+2 *)
6"#.2.") D0$%$ 7)') 3*6+*0')' + '3/(20'+[
} >8D0$%$+0'"J$?e s0("(B) )73*)2 +2
6)17+2 )"03')&+2 *) 6"#.2.") D0$%$ 7)')
3*6+*0')' +2 '3/(20'+2[
} >8D0$%$y$61",6e s0("(B) )73*)2 +2
Figura 8. Delta do ClientDataSet1 sendo visualizado 6)17+2 6F)@3 7)') 7'+6.')' +2 '3/(20'+2<
831, 7') 23' 1)(2 +>H30(@+ 0+&) @3B
-.3 6F)1)1+2 + 1:0+&+ 788,6)8?'#$4 ,
+ +,*$"#3'#'/$# 3*@() +2 3'#' V'(O$#p4
7)') + 3/V -.3 23 3*6)''3/) &3 @)''^;"+
3 1+*0)' )2 (*20'.CJ32 Xnj -.3 23'D+
3*@()&)2 )+ 23'@(&+' 3 7+203'(+'13*03
)7"(6)&)2 )+ >)*6+< n.)*&+ 7)22)1+2
7)') + 3/V ) +7CD+ >8D0$%$7,, , 3"3
1+*0)'# .1) (*20'.CD+ .0("(B)*&+
0+&+2 +2 6)17+2 &) 0)>3") 31 2.)
Figura 9. Mensagem personalizada no evento OnUpdateError 6"#.2.") D0$%$ 7)') -.3 + '3/(20'+ 23H)
)0.)"(B)&+< X.7+*&+ -.3 *+22) 0)>3") V%5=*?$%A,'J &(A3'3*03< L*0D+ 73*2)1+2 '30(')&+2 +2 )0'(>.0+2 &+ V%5=*?$%A,'J4 ,
7+22.( +2 6)17+2 !3c N19Cc CN3C2 *) 23/.(*03 2(0.)CD+E *+22+ .2.#'(+ 7+(2 0+&) ) '3/') &3 *3/M6(+ +. 7)'03
BC+1c +!373Cc C/;731 3 ;CKCA1NC , 3*0'+. *) 03") &3 6)&)20'+ &3 O" (3*032 &3"), &373*&3 &322)2 7'+7'(3&)&32 >31
23*&+ -.3 )73*)2 + 6)17+ !3 : 6F)@3, 3 )"03'+. )73*)2 + *+13 &+ 6"(3*03< 6+*A(/.')&)2<
(1)/(*3 ) (*20'.CD+ 1+*0)&) 73"+ 3/V %+ 3A30.)' .1 788,6)8?'#$4 , + 3/V
-.)*&+ )73*)2 + 6)17+ ;CA1NC A+223 3*0') 31 )CD+ 3 A)'# ) 1+*0)/31 &) Considerações finais
)"03')CD+< G3H)E (*20'.CD+< % (*20'.CD+ 1)(2 23*2)0) ! 6+17+*3*03 ;3'#'/$#V%5=*?$% )(*&)
UPDATE CLIENTES SET TELEFONE=’555-5525’
-.3 + KXI 7'36(2) 1+*0)' 6+*2(203 7+22.( .1) 2:'(3 &3 +.0')2 A.*6(+*)"(;
WHERE ID=ID, NOME=NOME, ENDERECO=ENDERECO, )73*)2 31 A)B3' .1 )8?'#$ .2)*&+ &)&32 -.3 *D+ 7.&3')1 23' @(20)2 )-.(
CIDADE=CIDADE, TELEFONE=TELEFONE
6+1+ 6)17+ &3 )"03')CD+ + 9+13, 3 7+' 6+*0) &) 2.) 6+17"34(&)&3, 6+1+
I3'63>) -.3 ) 6"#.2.") D0$%$ 7+22.( *) 6"#.2.") D0$%$ *36322(0)1+2 )73*)2 7+' 34317"+ N$4#$? 3'#'/$#4 3 + .2+ &3
0+&+2 +2 6)17+2 &) 0)>3"), + -.3 : &32*3; &+2 6)17+2 &) 6F)@3, -.3 *3223 6)2+ 7)6+032 &3 &)&+2 73'2+*)"(B)&+2 7)')
6322#'(+< X3 + 1321+ 6)2+ A+223 )7"(6)&+ @)1+2 (1)/(*)' + !3 &+ 6"(3*03< s1) 1+*0)/31 &3 #5O$"p4 &3 @)"(&)CD+ +.
.0("(B)*&+ ) +7CD+ >8D0$%$+0'"J$? ) (*20'.CD+ 23'()E ,5J4 &3 3@3*0+<
(*20'.CD+ 23'()E UPDATE CLIENTES SET NOME=’JOSE DA SILVA’ p )"0)13*03 '36+13*&#@3" A)B3' .1
WHERE ID=ID
320.&+ )7'+A.*&)&+ &3 0+&+2 +2 13;
UPDATE CLIENTES SET TELEFONE=’555-5525’
WHERE TEFONE=TELEFONE I)') 6+*A(/.')' + +,*$"#3'#'/$# &3 0)" 6)*(21+2 3 0:6*(6)2 7') .0("(B)CD+ &3
A+'1) -.3 322) 23H) ) (*20'.CD+ >)23, 0+&+2 +. 73"+ 13*+2 /')*&3 7)'03 &+2
93223 6)2+ 03'?)1+2 7'+>"31)2, 7+(2 7+; 7'36(2)1+2 1+&(A(6)' +2 V%5=*?$%A,'2 '36.'2+2 &3223 A)*0#20(6+ 6+17+*3*03<
&3'?)1+2 73'&3' ) '3A3'^*6() 3 )0.)"(B)' J4 &+ 6)17+ !3 7)')') z8&!")8?'#$c ]17+'0)*03 0)1>:1 "31>')' -.3 :
+ '3/(20'+ (*6+''30+< ! 13"F+' &3 0+&+2 8&!"D0$%$c 8&!"y$6{< !2 &31)(2 6)17+2 73'A3(0)13*03 7+22?@3" .0("(B)' +.0')2
+2 6)2+2 : .2)' ) +7CD+ >8D0$%$y$61",6 A(6)1 6+*A(/.')&+2 )73*)2 6+1 )2 320'.0.')2 &3 6+17+*3*032 6+1 + KXI,
-.3 1+*0) ) (*20'.CD+ .2)*&+ )73*)2 +2 &.)2 7'(13(')2 +7CJ32< K322) A+'1) 6+1+ 7+' 34317"+ ;3'#'H'4$4r ;s>$%6
6)17+2 &) 6F)@3 7'(1#'(), 34E /)')*0(1+2 -.3 +2 &)&+2 23'D+ )0.)"(; r;3'#'/$#V%5=*?$%r;+,*$"#3'#'/$#<
B)&+2 6+''30)13*03<
UPDATE CLIENTES SET TELEFONE=’555-5525’
WHERE ID=ID Conclusão
Configurando dinamicamente b)")' 2+>'3 ;3'#'/$#V%5=*?$% *D+ :
I+' A(1 '320)1 )2 6+*A(/.')CJ32 &+2 UpdateMode e ProviderFlags A#6(", @(20+ -.3 2.) 6+17"34(&)&3 :
6)17+2 *+ +,*$"#3'#'/$#< 93223 6)2+ ) L22) W"0(1) 30)7) &3 *+22+ )'0(/+ >)20)*03 )"0) 3 ) -.)*0(&)&3 &3 '3 ;
6+*A(/.')CD+ )6+*0363 6)17+ ) 6)17+ &31+*20') 6+1+ A)B3' ) 6+*A(/.')CD+ 6.'2+2 34(203*032 : A)*0#20(6)< ! .2+
*+2 A*$,?p4 C?*#5% &+ +>H30+< ! 7'(*6(7)" &+ )8?'#$95?$ 3 V%5=*?$%A,'J4 &(*); &3 3'#'/$#V%5=*?$% *+ &(););&(), A)B
+>H30(@+ &+2 V%5=*?$%A,'J4 : (*A+'1)' 1(6)13*03, + -.3 *) @3'&)&3 *D+ F# 6+1 -.3 ) 7'+/')1)CD+ 23H) 2317'3
)+ 3'#'/$#V%5=*?$% -.)" ) 7'+@(&^*6() 23/'3&+ )"/.1< .1) 6)(4(*F) &3 2.'7'32), H# -.3 2+;
23'# 0+1)&) 6+1 6)&) 6)17+< ! 1)(2 % 7'+7'(3&)&3 )8?'#$95?$ &+ 3'#'/$2 1+2 6)7)B32 &3 &326+>'(' (*W13')2
(17+'0)*03 : 3*03*&3' -.3 *31 0+&+2 #V%5=*?$% 7+22.( )73*)2 0'^2 +7CJ32, 3 A(*)"(&)&32 3 A.*6(+*)"(&)&32 7)') +
+2 6)17+2 7'36(2)1 23' )"03')&+2 *+ 7)') 1+&(A(6#;") 31 0317+ &3 3436.CD+ 6+17+*3*03< I+' (22+ : '36+13*&#@3"
>)*6+ &3 &)&+2, 6+1+ 6)17+2 @(*&+2 &3 )73*)2 )0'(>.) + @)"+' &('30)13*03 ) 2.) -.3 23 320.&3 ) A.*&+ 0+&)2 )2 2.)2
W5*"4 6+1 +.0')2 0)>3")2< O+1+ (*A+'1)' 7'+7'(3&)&3, @3H)E 7)'0(6.")' (&)&32< 93223 )'0(/+ @( 1+2
3/V -.3 &303'1(*)&+ 6)17+ 73'03*63 ) +2 7'(*6(7)(2 )27360+2 &) 7'+/')1);
DataSerProvider1. UpdateMode := upWhereAll;
+.0') 0)>3") 3 *D+ : *36322#'(+ /')@#;"+P CD+ 6+1 3/V 3 23.2 7'(*6(7)(2 '36.';
p )? -.3 3*0')1 +2 V%5=*?$%A,'J4< X.)2 z# + +,*$"#3'#'/$# ) F(20M'() 1.&) &3 2+2, &(6)2 3 1)63032<
+7CJ32 2D+E A(/.')< 93"3, 2.) 7'+7'(3&)&3 V%5=*2 L273'+ -.3 03*F)1 /+20)&+< s1 A+'03
} 8& !")8 ?' #$ e O)17+ (*6".2+ *+2 ?$%A,'J4 : &+ 0(7+ 3*.13')&+, +. 23H), )>')C+ 3 )0: ) 7'M4(1)<
)8?'#$4x 7+&3 03' 1)(2 &3 .1 @)"+'< Q321+
} 8&!"D0$%$e O)17+ (*6".2+ *) 6"#.2.; )22(1 )(*&) : >)20)*03 2(17"32 &3
") D0$%$x s2)&+ 7)') 3*6+*0')' + '3/(20'+ A)B3' ) (17"313*0)CD+< %73*)2 )0'(;
+'(/(*)"[ >.) + @)"+' 3*0 '3 6+"6F3032 )+ 6)17+
} 8&!"y$6e O)17+ 6F)@3[ s2)&+ 7)') -.3 &323H) )&(6(+*)' +2 V%5=*?$%A,'J4 , Dê seu feedback sobre esta edição! u
e
s
F eedb ac
k
} 8&\*??$"e O)17+ +6."0+[ O)17+ (*; A Java Magazine tem que ser feita ao seu
6".2+ &+ 3'#' V'(O$# , 1)2 : .2)&+ )73*)2 ClientDataSet1.FieldByName(‘CustNo’). gosto.Para isso, precisamos saber o que a
e
e
s
t
ProviderFlags := [pfInUpdate,pfInKey]; i d
7)') 3*6+*0')' + '3/(20'+ +'(/(*)"[ você, leitor, acha da revista! o ç
ã
O+1+ 7+&3 @3', : 1.(0+ 2(17"32< XM : Dê seu voto sobre este artigo, através do link:
I)') 23' 1)(2 &('30+, 6)&) 6)17+ 7'36(2+ 0+1)' 1.(0+ 6.(&)&+ 31 -.)" www.devmedia.com.br/javamagazine/feedback
31 .1 A*$,?p4 C?*#5% 7+&3 '363>3' .1 + 1+13*0+ -.3 23'D+ )&(6(+*)&+2 +.
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
ClientDataSet
Automatizando o tratamento de Erros
Listagem 1. Declarando o novo tipo de retorno e incluindo as unit’s no uses *3*03 3 (*2(') ) 6+&(A(6)CD+ &+2 1:0+&+2
unit MyClientDataSet;
6+*A+'13 ) ./-)(0+1 ;<
interface
! 6M&(/+ 320# 0+&+ 6+13*0)&+ 7)')
A#6(" 3*03*&(13*0+< I'+*0+, *+22+ 6+1;
uses
SysUtils, Classes, DB, DBClient; 7+*3*03 320# A(*)"(B)&+, 2)"@3 ) .*(0<
type
9+ 13*. 7'(*6(7)" &+ K3"7F( 6"(-.3 31
TMyErrors = (meViolacaoChav e, meValidacao, meChavePrimaria , meChaveEstrange ira, O+17+*3*0 ]*20)"" O+17+*3*0< 9)
meConflito, meOutros);
+7CD+ s*(0 A("3 *)13 (*A+'13 + "+6)" 3
type
TMyClientDataSet = class(TClientDat aSet) *+13 &) .*(0 6'()&), 6"(-.3 31 !t, 23'#
private
{ Private declarations }
)>3'0) .1) H)*3") 6+1 + 7)6+03 KOjsXa<
protected KIt, 6+17("3 + 7)6+03, 6+1 (22+ + *+@+
{ Protected declarations }
public 6+17+*3*03 H# 320)'# &(27+*?@3" 7)') +
{ Public declarations }
published .2+< L473'(13*03 .0("(B)' + *+@+ 6+17+;
{ Published declarations }
end;
*3*03 6+1 +2 6+17+*3*032 &+ &>L47'322
)6322)*&+ + b('3>('&, 3 @3H) -.3 3''+2 &+
procedure Register;
23'@(&+', 6+1+ @(+")CD+ &3 6F)@3, 23'D+
implementation
).0+1)0(6)13*03 0')0)&+2<
procedure Register;
begin
RegisterComponen ts(‘ClubeDelphi’, [TMyClientDataS et]);
end;
Conclusão
O+1+ @(1+2 *3223 )'0(/+, ) 6'()CD+
end.
&3 6+17+*3*032 7+&3 *+2 )H.&)' ) *D+
326'3@3' 6M&(/+2 '3730(0(@+2, 0+'*)*&+
Listagem 2. Declarando novos métodos no componente ) 6'()CD+ ) 1)*.03*CD+ &+2 )7"(6)0(@+2
private 1)(2 A#6("<
{ Private declarations }
FTratarErros :Boolean;
function DetectarErros(e: EReconcileError): TMyErrors; overload;
function DetectarErros(e: EDatabaseError): TMyErrors; overload;
procedure RetornarErros(c ds: TClientDataSet; Err :EReconcileErro r); overload;
procedure RetornarErros(c ds: TClientDataSet; Err :EDataBaseError ); overload;
&(/(03 + 0340+ _j+/(* &3 O"(3*032` 3 A)C) &3 (*A+'1)CJ32 6+''30)2 *) ).03*0(6)CD+, % 34(20^*6() &3 .1 >"+6+ #%6QQ$@($8# :
) A+'1)0)CD+ &+ 0340+< 9) 23/.*&) "(*F) )"/.1)2 (*A+'1)CJ32 6+*0(&)2 *+ +>H30+ 1.(0+ (17+'0)*03 *3203 0'36F+ &+ 6M&(/+
&) 0)>3") )&(6(+*3 .1) *+@) 0)>3") 6+1 23'D+ )'1)B3*)&)2 31 @)'(#@3(2 &3 7)') (*03'7'30)' ) 23/.(*03 2(0.)CD+E
g "(*F)2 3 g 6+".*)2 +6.7)*&+ Zxx† &) 2322D+ R/$44*5"U 7)') 23'31 .2)&)2 A.0.; ; X.7+*&+ -.3 + .2.#'(+ 3203H) "+/)&+
")'/.') &(27+*?@3", +*&3 &3@3'# &(/(0)' ')13*03 7)') (&3*0(A(6)CD+ 3 @)"(&)CD+ *+ 2(2031), "+/+ ) /$44*5"z}N19Cp{ 03'#
*)2 "(*F)2 &) 7'(13(') 6+".*) + 0340+ &3 .2.#'(+2< %&(6(+*3 0)1>:1 H.*0+ )2 .1 @)"+' '3")6(+*)&+ 3 + 1321+ 23'#
_s2.#'(+` 3 _X3*F)` 3 *)2 "(*F)2 &) )4$4 &) 7#/(*) + "':$48'($ A*%$L*%?/sKQ 34(>(&+ *+ KL,)4>'%*5 , 1)2 *+ 6)2+ &3
23/.*&) 6+".*) )&(6(+*)' &+(2 6+17+; 3'#'QA*%$L*%? -.3 7+22(>("(0)'# + 0')>)"F+ + .2.#'(+ *D+ 03' '3)"(B)&+ ) ).03*0(;
*3*032 ;$@#H5@F_040s23'`, _040X3*F)`U 6+1 + +>H30+2 &3 6+*34D+ 3 732-.(2) 6)CD+ 3 ) 23CD+ N5:$ *D+ 34(20(', .1
)"03')*&+ ) 7'+7'(3&)&3 ;$@#95?$ &+ 7)') b('3>('&< 0')0)13*0+ &3 3''+2 A)B 6+1 -.3 + >"+6+
#@#/$"0' 7)') _V'44M5%?`< %&(6(+*3 *) $@($8# '3&('36(+*3 + .2.#'(+ &3 @+"0) N
"(*F) T .1 H>##5"F_>0*j+/(*`U 3 *) Validando usuários na página 7#/(*) &3 ,5J*" , (*(>(*&+ 23. )6322+ )
W"0(1) "(*F) &) 0)>3") 6'(3 .1 ,*"O 7)') % @)"(&)CD+ &+2 .2.#'(+2 *) 7#/(*) : 0+&)2 )2 7#/(*)2 +*&3 + )4$% +5"#%5,
+ ,5J*" &+2 )&1(*(20')&+'32, &('36(+; >)20)*03 2(17"32 &3 23' (17"313*0)&)< 320(@3' 23*&+ .0("(B)&+<
*)*&+ N 7#/(*) ,5J*"u'?:Q'48@ -.3 23'# j+6)"(B3 *+ 7'+H30+ + )4$% +5"#%5, >((5"2
6'()&) *+ &36+''3' &+ )'0(/+< #%5,$Q'4(@ 6'()&+ H# *+ (*?6(+ &+ )'0(/+ 3 Página de Reservas OnLine do
%6322)*&+ + 6M&(/+ &) 7#/(*) R.23 6+1 .1 &.7"+ 6"(-.3 2+>'3 .1) #'3) 31 cliente
) 036") &3 )0)"F+ A_[U, 6'(3 ) 6+*20)*03 >')*6+, )63223 + 3@3*0+ K5'? &+ 1321+ 9+ 13*. A*,$qN$Mr1#0$%r3$,80* &5%
_20'O+*34)+` *) #'3) !"#$%&'($ &) 7#/(*) +*&3 &3@3'# &(/(0)' )2 23/.(*032 "( *F)2 QNC; V%5]$(#4rN$M 7/VQNC; A*,$4r7/VQ
(*A+'1)*&+ ) 4#%*"J &3 6+*34D+ 6+1 + &3 6M&(/+E NC; V'J$ 6'(3 .1) *+@) 7#/(*) 2)"@)*;
>)*6+< L223 @)"+' 23'# .2)&+ 1)(2 )&()*; try &+;) 6+1+ _.23'k'323'@)2<)274`< %&(;
03 7)') -.3 + 6+17+*3*03 &L+5""$(#*5" LblUsuario.Text := Session[‘NOME’] .
ToString;
6(+*3 )+ 6+'7+ &) 7#/(*) .1) 0)>3")
)63223 + H3Q K) 1321) 1)*3(') 6+1+ except &3 ZZ "(*F)2 3 Z 6+".*) 6+1 {xx 7(43"2
Response.Redirect(‘login.aspx’);
.0("(B)&+ *+ )'0(/+ )*03'(+', &36")'3 ) end; &3 ")'/.')< %&(6(+*3 )"/.*2 6+17+;
6+*20)*03 6+*A+'13 6M&(/+ ) 23/.('E
Listagem 1. Evento Click para autenticação de usuário e senha dos clientes
const
strConexao = ‘User=SYSDBA; procedure TWebForm1.btnLogin_Click(sender:
Password=masterkey; System.Object; e: System.EventArgs);
Database=<Caminho>LOCADORA.FDB;’;
var
Comand: FbCommand;
K3 @+"0) )+ 6+'7+ &) 7#/(*) RA_[U, DataAdapter: FbDataAdapter;
Conn: FbConnection;
6+1 .1 &.7"+ 6"(-.3 2+>'3 + L#"K5J*" , prUser : FbParameter;
)&(6(+*3 )+ 23. 3@3*0+ 1"+,*(O + 6M&(/+ prSenha : FbParameter;
fbReader : FbDataReader;
&) ./-)(0+1 2 '327+*2#@3" 7+' '3)"(B)' )
begin
).03*0(6)CD+ &+ .2.#'(+ 3 23*F) &(/(0)&+2 { Criação dos objetos de conexão }
3 &('36(+*)' + .2.#'(+ ) 7#/(*) 6+''32; Conn := FbConnection.Cr eate;
DataAdapter := FbDataAdapter.Cre ate;
7+*&3*03 *+ 2(2031)< ! 6M&(/+ .0("(B)&+ Comand := FbCommand.Create ;
{ Atribuição da string de conexão e abertura do BD}
)6+17)*F) ) 130+&+"+/() 317'3/)&) Conn.Connection String := strConexao;
Conn.Open;
*+ )'0(/+ &) 3&(CD+ )*03'(+', +*&3 "+/+ { Atribuição dos atributos de seleção dos dados }
&3 (*?6(+ 6'()1+2 0+&+2 +2 6+17+*3*032 DataAdapter.Sel ectCommand := Comand;
DataAdapter.Sel ectCommand.Connec tion := Conn;
3 )0'(>.?1+2 ) 4#%*"J &3 6+*34D+ 6+1 + DataAdapter.Sel ectCommand.Comman dText :=
‘select clientes.nome, clientes.cod_cliente ‘ +
>)*6+ )+ +5"" , 6+17+*3*03 &3 6+*34D+< ‘from clientes where ((clientes.login = ?) and
(clientes.senha = ?))’;
L1 23/.(&) )0'(>.?1+2 ) 6+*34D+ )+ prUser := FbParameter.Crea te;
+>H30+ (*03'*+ &+ 3'#'7?'8#$% 6F)1)&+ prSenha := FbParameter.Cre ate;
DataAdapter.SelectCommand.Parameters.Add(prUser);
/$,$(#+5::'"? < p 3"3 -.3 '363>3'# ) (*2; DataAdapter.SelectCommand.Parameters.Add(prSenha);
DataAdapter.Sel ectCommand.Parame ters[0].Value :=
0'.CD+ /sK &3 23"3CD+ &+2 &)&+2 31 2.) txtUser.Text;
DataAdapter.Sel ectCommand.Parame ters[1].Value :=
7'+7'(3&)&3 +5::'"?;$@#< txtSenha.Text;
L1 23/.(&) )0'(>.?1+2 +2 7)'q13; fbReader := DataAdapter.Selec tCommand.ExecuteR eader;
if fbReader.Read then
0'+2 &3 .2.#'(+ 3 23*F) 7)') ) /sK &3
begin
23"3CD+ &+ +5::'"?;$@# )0')@:2 &+ Session[‘USUARIO ’] := txtUser.Text;
Session[‘NOME’] := fbReader[‘NOME’] .ToString;
+>H30+ ALV'%':$#$% 6'()&+ 3 (*20)*6()&+ Session[‘CODIGO’ ] := fbReader[‘COD_CL IENTE’]
237)')&)13*03 7)') 6)&) 7)'q130'+
.ToString;
Response.Redirect(‘user_reservas.aspx’);
)&(6(+*)&+, +*&3 )+ A(*)" 3436.0)1+2 end else
RegisterStartupScript(‘erro’,’<script>javascript
) 6+*2."0) 3 '3")6(+*)1+2 + '32."0)&+ ) :alert(‘’Usuário ou Senha incorretos!’’);
</script>’);
.1 +>H30+ AL3'#'B$'?$% -.3 23'# @3'(A(; end;
6)&+ -.)*0+ )+ 2.6322+ &+ ,5J*"Q 9+ 6)2+
*3*032 )+ 6+'7+ &3"), +'/)*(B)*&+;+2 2+>'3 + 3'#'<%*? )63223 2.) 7'+7'(3&); &3 \$'?$% #$@# 7)') _I'3@< K3@`< 31 3'#'
'327360(@)13*03 &3 )6+'&+ 6+1 + &3 7>#5 A5%:'# 3 )7"(-.3 .1 320("+ &3 A*$,? &(/(03 + @)"+' VBCXu3CX1K)+71
,'65># 34(>(&+ *) </0,$( 23 %'')203 A+'1)0)CD+ &323H)&+< 9+@)13*03 6+1 3 31 3'#' A5%:'##*"J C@8%$44*5" + @)"+'
*) 7'(13(') "(*F) &) 0)>3") + )4$% + >+0D+ &('3(0+ &+ 1+.23, )63223 )/+') _‡xE&&rQQruuuuˆ` -.3 A)'# ) A+'1)0);
+5"#%5, >((5"#%5,$Q'4(@ , )7M2 (*2(') .1 + (031 V%58$%#6 H>*,?$% +*&3 ('31+2 CD+ &) A+'1) &3 34(>(CD+ &) &)0)<
H>##5"F_>0*X)('`U *) 23/.*&) "(*F), 1+&(A(6)' ) 320'.0.') &) 6)03/+'() X3"36(+*)*&+ + J%*?B$4$%='4 , A)'31+2
23/.(&+ &3 .1) "(*F) 6+1 + 0340+ +5,>:"4Q K321)'-.3 + (031 +%$'#$ 6+*A(/.')CJ32 2313"F)*032 )2 )7"(6);
_Q(*F)2 j+6)CJ32 %0(@)2` (&3*0(A(; (5,>:"4 '>#5:'#*(',,6 '# %>" #*:$< L1 &)2 *) 6+*A(/.')CD+ &+ J%*?K 5('('5 <
6)*&+ + 6+*03W&+ ) 23' 6)''3/)&+ *+ 23/.(&) 6"(-.3 *+ (031 H5>"? +5,>:" O+1 + >+0D+ &('3(0+ &+ 1+.23 2+>'3 +
3'#'<%*?R_/'(&j+6)6)+`U &) "(*F) 23; 31 7='*,'L,$ (5,>:"4 3 3*@(3;+ 7)') 3'#'<%*? )63223 2.) 7'+7'(3&)&3 7>#5
/.(*03< s1) "(*F) 31 >')*6+ 6+1 .1 /$,$(#$? (5,>:"4< %/+') 23"36(+*3;+ 3 A5%:'# 3 )7"(-.3 .1 320("+ &3 A+'1)0);
327)C+ ('# 237)')' + 6+*03W&+ &+ 0340+ )0'(>.) + @)"+' +13uK1+7+71 *) CD+ )+ 1321+< 9+@)13*03 6+1 + >+0D+
_Q(*F)2 a323'@)2 %0(@)2` (&3*0(A(6)*; 7'+7'(3&)&3 3'#' A*$,? , +*&3 '36 3; &('3(0+ &+ 1+.23, )632 23 )/+') + (031
&+ + 3'#'<%*?R_/'(&a323'@)2`U -.3 23'# >3'31+2 + @)"+' &+ 6)17+ *) 0)>3") V%58$%#6 H>*,?$% +*&3 ('31+2 1+&(A(;
7'33*6F(&+ 6+1 )2 '323'@)2 )0(@)2 &+ K5('('5 )0')@:2 &+ %$4>,# 4$# &) /$,$(# 6)' ) 320'.0.') &) 6)03/+'() +5,>:"4c
.2.#'(+< %2 W"0(1)2 &) 0)>3") 23'D+ -.3 A)'31+2 *+2 '3/(20'+2 6+1 4#'#>4 +*&3 *+ 0+7+ &) H)*3") &321)'-.3 +
6)')603'(B)&)2 7+' 6)&)20')' *+@)2 _9` (*&(6)*&+ j+6)CD+< K321)'-.3 (031 +%$'#$ (5,>:"4 '>#5:'#*(',,6 '# %>"
'323'@)2, +*&3 )":1 &+ 0340+ (*A+'1); 0)1>:1 ) +7CD+ X*4*L,$ &) 6+".*)< #*:$< L1 23/.(&) 6"(-.3 *+ (031 H5>"?
0(@+ _O'()' *+@) '323'@)` .1 6+17+; %/+') (*2(') .1) *+@) 6+".*), +. 23H), +5,>:" 31 7='*,'L,$ (5,>:"4 3 3*@(3;+
*3*03 3%5835MK*4#F_&&"G(&3+2`U 7)') 6"(-.3 *+@)13*03 31 H5>"? +5,>:" 3 7)') /$,$(#$? (5,>:"4< %/+') 23"36(+*3;
"(20)/31 &+2 @?&3+2 &(27+*?@3(2 7)') 3*@(3;+ 7)') ) #'3) /$,$(#$? (5,>:"4< 9) + 3 )0'(>.) + @)"+' +13uK1+7+71 *)
'323'@) 3 .1 H>##5"F_>0*a323'@)'`U 7'+7'(3&)&3 \$'?$% #$@# R_\340+ &3 6)>3; 7'+7'(3&)&3 3'#' A*$,? , +*&3 '363>3'3;
7)') 2)"@)' + 7'+6322+ &) '323' @)< C)"F+`U, &(/(03 _\(0."+` 3 31 3'#' A*$,? + 1+2 + @)"+' &+ 6)17+ *) 0)>3") K5('('5
X3"36(+*)*&+ + J%*?K5('(' 5 , A)'31+2 @)"+' ;!;)K1 -.3 : H.20)13*03 + 6)17+ )0')@:2 &+ %$4>,# 4$# &) /$,$(# -.3 A)'3;
)/+') )"/.1)2 6+*A(/.')CJ32 *36322#; '32."0)*03 &3 .1 !""$% W5*" &) 0)>3") 1+2 *+2 '3/(20'+2 6+1 /#'#>4 _a` 7)')
'()2 )*032 &) 6+&(A(6)CD+ &+2 7'+632; K5('('5 6+1 ) 0)>3") X*?$54 2313"F)*03 a323'@)2< K321)'-.3 0)1>:1 ) +7CD+
2+2 -.3 ('D+ 34(>(' )2 ( *A+'1)CJ32 *) 6+1+ *+ 7)22+ )*03'(+'< I+' A(1, )&(6(+*3 X*4*L,$ &) 6+".*)<
7#/(*)< O+1 + >+0D+ &( '3(0+ &+ 1+.23 .1) *+@) 6+".*) 3 )"03'3 2.) 7'+7'(3&); %/+') (*2(') .1) *+@) 6+".*), +.
23H), 6"(-.3 *+@)13*03 31 H5>"?
+5,>:" 3 3*@(3;+ 7)') ) #'3) /$,$(#$?
(5,>:"4< 9) 7'+7'(3&)&3 \$'?$% #$@#
R_\340+ &3 6)>3C)"F+`U, &(/(03 _\(0."+`
3 31 3'#' A*$,? + @)"+' \]\sj! -.3 :
H.20)13*03 + 6)17+ '32."0)*03 &3 .1
!""$% W5*" &) 0)>3") K5('('5 6+1 ) 0);
>3") X*?$54 2313"F)*03 6+1+ *+ 7)22+
)*03'(+'< I+' A(1, )&(6(+*3 .1) *+@)
6+".*) 3 )"03'3 2.) 7'+7'(3&)&3 \$'2
?$% #$@# 7)') _K)0) a323'@)`< 31 3'#'
A*$,? &(/(03 + @)"+' _K%\%` 3 31 3'#'
A5%:'##*"J C@8%$44*5" + @)"+' _‡xE&&r
QQruuuuˆ` -.3 A)'# ) A+'1)0)CD+ &)
A+'1) &3 34(>(CD+ &) &)0)<
X3"36(+*)*&+ + ??,X*?$54 , )&(6(+*3 )
2.) 7'+7'(3&)&3 3'#'X',>$A*$,? + @)"+'
Nota do DevMan
Para alterar a largura das colunas, basta entrar novamente
no Property Builder e selecionar o item Format. Nele
podemos definir atributos para várias características do
componente Data Grid. Note que temos a opção Columns.
Expanda este item e clique na última coluna (“Alterar”). À
direita digite 50 no campo Width (“largura”) e confirme.
Figura 1. Layout da página de reservas do usuário
– - –
b
r
gridReservas.Data Source := CriaListaVideos (‘’’R’’) e
AND (LOCACAO.PREV_DEVOLUCAO >= ‘’TODAY’’’); gosto.Para isso, precisamos saber o que e
s
t
a
e
i d
gridReservas.DataBind; você, leitor, acha da revista! o ç
ã
CarregaVideos;
end;
end; Dê seu voto sobre este artigo, através do link:
www.devmedia.com.br/javamagazine/feedback
eç o eç o eç o
Nesta seção você encontra artigos intermediários
sobre Delphi Win32 e Delphi .NET
('D+ '3A3'3*6()' *+22) >)23 &3 &)&+2 31 )'0(/+ )*03'(+' 7)') (*6".2D+ &3 H*#:'8p4 *)@3/)'1+2 3*0'3 +2 '3/(20'+2< I)') (22+
0+&+ 7'+H30+< % 320'.0.') &3 0+&)2 )2 0); 3 )22+6()CD+ &3"32 )+2 >+0J32 &) 7)'03 (*; .0("(B)'31+2 )2 A.*CJ32 &) V/3'#'H'4$
>3")2 6'()&)2 *+ I+6•30X0.&(+ : 2317'3 A3'(+'< ! >+0D+ -.3 A(6)'# )+ ")&+ &+ 0?0."+ &) V/K< I'322(+*3 A_[ *+ A+'1."#'(+ 7)')
) 1321), 6+1+ .1) '363(0) &3 >+"+< Q.; &+ A+'1."#'(+ 23 6F)1)'# _80*G+"0)'`< @(2.)"(B)' ) 7#/(*) &3 6M&(/+ 3 "+6)"(B3
&)1+2 )73*)2 *+13 &) 0)>3") 3 6)17+2, %*032 &3 6+&(A(6)'1+2 +2 >+0J32, 7'3; ) 7)")@') '323'@)&) !:8,$:$"#'#*5"Q
1)2 ) 1)*3(') &3 1+*0)' 3 1)*(7.")' : 6(2)1+2 6'()' .1) A.*CD+ 7)') 6)''3/)' K36")'3 + 7'+63&(13*0+ &) ./-)(0+1 4
34)0)13*03 (/.)" 7)') 0+&)2< +2 &)&+2 *) 03") &3 6+*2."0) 6+*A+'13 )>)(4+ &3 !:8,$:$"#'#*5"<
O+1+ *+ )'0(/+ )*03'(+' 6'()1+2 ) 0)>3;
") &3 6"(3*032, *D+ @+. 3*0')' 31 &30)"F32
Listagem 1. Código completo da tabela de Produtos
&3 6+1+ A.*6(+*) 6)&) A.*CD+ 6'()&) 31
*+22) 0)>3")< %"03'3 ) )"*# V%5?>#543H unit ProdutosDB;
interface
6+*A+'13 ) ./-)(0+1 23 uses PSL;
const
ProdutosDBName = ‘ProdutosDB’;
Criando a Tela de Consulta a ProdutosDBType = Rsc(‘DBPR’);
Prod_Codigo = 0;
Produtos Prod_DescProd = 1;
Prod_Preco = 2;
O'()&) ) 0)>3") &3 7'+&.0+2, @)1+2 )&(; Prod_Estoque = 3;
Prod_Tam = 4;
6(+*)' .1 *+@+ A+'1."#'(+ 7)') 6'()'1+2 Prod_Un = 5;
var
) 03") &3 6+*2."0)< 9+ 13*. 7'(*6(7)" FieldDefs : array[0..5] of TFieldDef =
&+ I+6•30X0.&(+ )63223 A*,$qN$MrA5%: ((DataType: ftUInt16),
(DataType: ftString),
3 2)"@3;+ 6+1+ _sK)&+2I'+&.0+2<7)2` (DataType: ftDouble),
(DataType: ftUInt32),
.2)*&+ A*,$r/'=$ +. 73")2 036")2 &3 )0)"F+ (DataType: ftString),
(DataType: ftString));
+;BK . /< %"03'3 ) 7'+7'(3&)&3 9)13 bProdutosInclui : Boolean;
7)') _b'1K)&+2I'+&.0+2` 3 23.2 \(0"3 DBPro : TDatabase;
case FormID of
FrmPrincipal: Listagem 4. Código completo do evento ApplicationHandleEvent
FrmSetEventHandler(Form, uPrincipal.
HandleEvent); function ApplicationHandleEvent(var Event: EventType)
FrmClientes: : Boolean;
FrmSetEventHandler(Form,UDadosClientes. var
HandleEvent); FormID: UInt16;
FrmDadosProdutos: Form: FormPtr;
FrmSetEventHandler(Form, begin
UDadosProdutos.HandleEvent); Result := False;
end; if Event.eType = frmLoadEvent then
begin
G3H) -.3 )&(6(+*)1+2 + A+'1."#'(+ FormID := Event.frmLoad.for mID;
Form := FrmInitForm(Form ID);
A%:3'?54V%5?>#54 )+ ('4$QQ5& < O)&) FrmSetActiveForm(Form);
case FormID of
A+'1."#'(+ -.3 @)1+2 )&(6(+*)*&+ )+ FrmPrincipal: FrmSetEventHandle r(Form,
2(2031), : *36322#'(+ A)B3' )"03')CD+ uPrincipal.HandleEvent);
FrmClientes: FrmSetEventHand ler(Form,
*3223 3@3*0+< G3H) + 3@3*0+ 6+17"30+ *) UDadosClientes.HandleEvent);
FrmDadosProdutos: FrmSetEventHand ler(Form,
./-)(0+1 ;< UDadosProdutos.HandleEvent);
end;
Result := True;
Criando a tela de Pedidos e Itens end
end;
! 7'(13('+ 7)22+ )*032 &3 6'()'1+2 )
03") 7'+7'()13*03 &(0), : 6'()' )2 0)>3")2
*36322#'()2 7)') )'1)B3*)' +2 &)&+2
&(/(0)&+2< s1) >+) &(6), : 23/.(' +2 132;
1+2 7)22+2 .2)&+2 7)') 6'()' ) 0)>3")2 &3
(,*$"#$4 3 8%5?>#54< G3H)1+2 +2 7'(*6(7)(2
7)22+2 ) 3436.0)'E
} O'(3 .1) *+@) s*(0 .2)*&+ + 13*.
b("3e93Vs*(0 3 2)"@3;) 6+1 + *+13 -.3
7'3A3'('< 9322) 2:'(3 &3 )'0(/+2 320)1+2
.2)*&+ _9+13K)\)>3")K8<7)2`, 34E
I'+&.0+2K8<7)2[
Nota do DevMan
Formulários Destrutivos e Não Destrutivos
Até agora trabalhamos apenas com formulários
Destrutivos, mas existem duas formas de se trabalhar com
formulários no PocketStudio como podemos ver a seguir:
Modo Destrutivo: neste modo todos os objetos visuais
do formulário atual e seu conteúdo serão perdidos.
Se necessitarmos preservar os dados informados no
formulário precisamos criar funções para salvar e restaurar
os dados. Nesse modo utilizamos a função FrmGotoForm
para alternar entre os formulários.
Modo Não Destrutivo: o problema dessa abordagem
é que não podemos dar mais de um passo, ou seja,
imaginemos três formulários. Podemos navegar do
primeiro para o segundo e voltar para o primeiro, mas
se tentarmos navegar do primeiro direto para o terceiro
formulário, uma exceção será gerada. Nessa abordagem
usamos a função FrmPopupForm para ir para o formulário
e FrmReturnToForm para retornar.
Tenha em mente que se precisarmos navegar entre vários
formulários e voltar aleatoriamente entre eles, devemos
utilizar o modo destrutivo. Também devemos considerar
o que o modo Não Destrutivo irá carregar a memória do
dispositivo à medida que os formulários são chamados.
Em resumo, precisamos considerar cada situação e analisar
o que realmente é necessário, evitando maiores problemas
na aplicação.
} O'(3 )2 6+*20)*032 &3 *+13 &3 6)1; &K8<7)2`< ! 6M&(/+ A+*03 6+17"30+ &) A*,$qN$MrA5%: 3 2)"@3;+ 6+1+ _sI3&(&+2<
7+2 3 )2 A.*CJ32 *36322#'()2 7)') )>'(' 6'()CD+ &3 )1>)2 0)>3")2 7+&31+2 @3' 7)2` 3 23. N':$ 1+&(A(-.3 7)') _b'1I3;
3 A36F)' ) 0)>3")[ *)2 ./-)(0+"- = 3 >< &(&+2`< Q+&(A(-.3 0)1>:1 ) 7'+7'(3&)&3
} O'(3 .1) A.*CD+ 7)') *)@3CD+ &+2 ;*#,$ 7)') _O)>3C)"F+ &+ I3&(&+`< K323*F3
&)&+2, +'%%$J'3'?54 7+' 34317"+[ Desenhando a tela de pedidos .1) 03") 2313"F)*03 ) </0,$( 4<
9+ 6)2+ &3 V$?*?54 3 !#$"4 ?$ V$?*?54 , % 03") &3 73&(&+2 3 (03*2 &3 73&(&+ A.; f# 0'^2 *+@(&)&32 )-.(, +. 23H), 0'^2 *+;
&3@31+2 6'()' &.)2 *+@)2 s*(02, -.3 23 /('# .1 7+.6+ &+ -.3 H# @(1+2 )0: )/+')< @+2 6+17+*3*032 -.3 *D+ @(1+2 )0: )/+;
6F)1)'D+ _I3&(&+2K8<7)2` 3 _]031I3; O'(3 .1 *+@+ A+'1."#'(+ .2)*&+ + 13*. ')< XD+ 3"32, V58>8;%*JJ$%c /$,$(#5%;%*JJ$% 3
K*4#< ! 6+17+*3*03 V58>8;%*JJ$% 31 6+*;
H.*0+ 6+1 K*4# A.*6(+*) 6+1+ 23 A+223 .1
Listagem 5. Código da tabela PedidosDB
+5:L5H5@ &+ K3"7F(< ]22+ 2(/*(A(6) -.3
unit PedidosDB; 7+&31+2 2(1.")' "(20)2 2.273*2)2< I)')
interface
uses PSL; (22+ (*2(') *+ A+'1."#'(+ .1 6+17+*3*03
const V58>8;%*JJ$%R_I+7O+*&(6+32`U &) 7)"30)
PedidosDBName = ‘PedidosDB’;
PedidosDBType = Rsc(‘DBPE’);
A5%:< %"03'3 + 23. +'8#*5" 7)') _O+*&<
Ped_NumeroPedido = 0; I)/0+`, )22(1 3*-.)*0+ *D+ F+.@3' .1
Ped_CodCli = 1;
Ped_Emissao = 2; (031 23"36(+*)&+, ) (*&(CD+ &3 _O+*&(CJ32
Ped_Cond = 4;
Ped_Total = 5; &3 I)/)13*0+` 320)'# )0(@)< ]*6".) )/+')
var
.1 6+17+*3*03 K*4#R_j20O+*&(6+32`U
FieldDefs : array[0..4] of TFieldDef = 3 (*2(') )"/.*2 (03*2 *) 7'+7'(3&)&3
((DataType: ftUInt32),
(DataType: ftUInt16), !#$:4 &+ 6+*0'+"3< L1 23/.(&) '30+'*3 )+
(DataType: ftDateTime),
(DataType: ftString), 6+17+*3*03 V58+5"?*(5$4 3 23"36(+*3 +
(DataType: ftDouble)); K4#+5"?*(5$4 *) 7'+7'(3&)&3 V58>8K*4#<
bPedidosInclui : Boolean; ]22+ A)'# 6+1 -.3 ) "(20) &3 6+*&(CJ32 &3
dPedidoData : DateTimeType;
DBPed : TDatabase; 7)/)13*0+ )7)'3C) )+ 6"(6)' *+ V58>82
function Open: Boolean;
;%*JJ$%Q I)') 3@(0)' -.3 + V58+5"?*(5$4
function Close: Boolean;
function ProcuraCodigo(Codigo: UInt32): Boolean;
)7)'3C) 6+*20)*0313*03, 1)'-.3 2.)
7'+7'(3&)&3 X*4*L,$ 6+1 + @)"+' A',4$<
implementation
if not Result then
begin
ShowSystemError(PSDatabase.LastError);
Exit;
end;
!2 *+132 &+2 6+17+*3*032 23/.31 ) %>)(4+ &+ 6)17+ C:*44a5 , (*2(') .1 &) A)1?"() &+2 >+0J32, 7+'0)*0+ .0(;
1321) "(*F) 317'3/)&) *)2 03")2 )*03; >+0D+ 6+1.1 3 0'+-.3 23. +'8#*5" 7)') "(B)1+2 ) s*(0 V4H>##5" &) V/K 7)')
'(+'32< s23 + 7'3A(4+ _b"&` 7)') 6)17+2 _j+6)"(B) O"(3*03`< %7'+@3(03 3 1+&(A(; 0')>)"F)'1+2 6+1 3"3< % &(A3'3*C) :
3 _80*` 7)') >+0J32< 9322) H)*3") 3*; -.3 ) 7'+7'(3&)&3 A%':$ .2)*&+ ) +7CD+ -.3 7+&31+2 6F)1)' A+'1."#'(+2 31
6+*0')1+2 +2 6)17+2 _b"&9.1I3&(&+`, &%N5"$ , )22(1 '30(')1+2 2.) >+'&)< 1+&+ 1+&)" 6+1 3"3< L223 6+17+*3*03
_b"&O"(O+&(/+`, _b"&O"(9+13` 3 _b"&; O+1 3463CD+ &+2 6+*0'+"32 /$,$(#5%;%*2 23'# .2)&+ *) C:*44a5 , 7+'0)*0+ (*2(')
G)"\+0)"`< L )(*&) +2 >+0J32 _80*9+@+`, JJ$%c V58>8;%*JJ$% 3 K*4# , H# 0')>)"F)1+2 .1 /$,$(#5%;%*JJ$%R_X"0L1(22)+`U "+/+ N
_80*]03*2`, _80*I'(13('+`, _80*%*03; 6+1 +2 6+17+*3*032 .0("(B)&+2 *322) &('3(0) &+ K'L$, C:*44a5[
'(+'`, _80*I'+4(1+`, _80*s"0(1+`, _80*; 03"), 23*&+ )22(1 6)>3 .1 347"(6)CD+ } V58>8;%*JJ$%e Q)(2 .1 6+17+*3*03
b(1` 3 _80*=')@)'`, '327360(@)13*03 &) 2+>'3 +2 *+@+2 6+17+*3*032< &) A)1?"() &+2 >+0J32 3 2.) A.*6(+*);
32-.3'&) 7)') ) &('3(0)< } /$,$(#5%;%*JJ$%e L203 6+17+*3*03 : "(&)&3 &373*&3 &+ .2+ 31 6+*H.*0+
6+1 .1 +>H30+ "(20)< L"3 2+B(*F+ *D+
031 .0("(&)&3, (1)/(*31+2 3"3 6+1+ +
Listagem 6. Código da tabela ItemPedDB
6+*F36(&+ O+1>+8+4 &+ K3"7F(, 31
unit ItemPedDB; %>"2#*:$ 3"3 : 1.(0+ 2(1(")'[
interface
uses PSL; } K*4#e j(20) : .1 +>H30+ >)20)*03 .0(;
const "(B)&+ 7+' *M2 &323*@+"@3&+'32, 7+(2
ItemPedDBName = ‘ItemPedDB’;
ItemPedDBType = Rsc(‘DBIP’);
320# &(27+*?@3" 31 7')0(6)13*03 0+&+2
Itp_NumeroPed = 0; +2 )1>(3*032 &3 &323*@+"@(13*0+< K.;
Itp_CodProd = 2;
Itp_Qtde = 3; ')*03 + &323*@+"@(13*0+ &) *+22) 2:'(3
Itp_Preco = 4;
b
r
e
procedure StopApplication;
begin
gosto.Para isso, precisamos saber o que e
t
a
e
s
i d
ClientesDB.Close; você, leitor, acha da revista! o ç
ã
ProdutosDB.Close;
PedidosDB.Close;
ItemPedDB.Close;
Dê seu voto sobre este artigo, através do link:
FrmCloseAllForms;
end; www.devmedia.com.br/javamagazine/feedback
AMIGO
...só pra lembrar,
Existem coisas sua assinatura pode
estar acabando!
que não
conseguimos
ficar sem!
Renove Já!
www.devmedia.com.br/renovacao
Para mais informações:
www.devmedia.com.br/central
eç o eç o eç o
Nesta seção você encontra artigos para iniciantes
na linguagem Delphi
03 9$">7"$@5 , 23"36(+*3 + (031 &3 13*. 93203 )'0(/+ )7'3*&31+2 ) 6'()' .1) ê
D
_%*34)' )'-.(@+` 3 )&(6(+*3 ) 23. 3@3*0+ )7"(6)CD+ &3 3*@(+ &3 3;1)("2 .0("(B)*; A Java Magazine tem que ser feita ao seu
1"+,*(O + 6M&(/+ &) ./-)(0+1 2 , +>3&363*; &+ +2 6+17+*3*032 &) 7)"30) !"?6 &+ gosto.Para isso, precisamos saber o que a
e
e
s
t
d
i
&+ ) 6'()CD+ &3 .1) @)'(#@3" &+ 0(7+ ;K*42 K3"7F(< O+1 32032 6M&(/+2 @+6^ 7+&3'# você, leitor, acha da revista! o ç
ã
#!#$: 7)') -.3 23H) (*20)*6()&+ + )'-.(@+ (17"313*0)' *+@)2 A.*6(+*)"(&)&32, Dê seu voto sobre este artigo, através do link:
23"36(+*)&+ 3 34(>(&+ *+ $:'*,7"$@5< 6+1+ 7+' 34317"+ +7CJ32 &3 2+"(6(0)CD+ www.devmedia.com.br/javamagazine/feedback
! 6M&(/+ : >31 2(17"32, )73*)2 6'(); &3 3*0'3/) 3 "3(0.') &) 13*2)/31, )":1
1+2 .1) @)'(#@3" &+ 0(7+ ;K*4#!#$: 3
6F)1)1+2 + 1:0+&+ C@$(>#$ &+ 6+*0'+"3 Listagem 3. Enviando o e-mail
18$"7"$@5< %7M2 ) 23"3CD+ &3 .1 )'-.(;
procedure TfrmSendMail.btnEnviarClick(Sender: TObject);
@+ *) 6)(4) &3 &(#"+/+, )&(6(+*)1+2 .1 var
i : integer;
*+@+ (031 )+ $:'*,7"$@5 , 6+17+*3*03 begin
K*4#X*$M , 3 6+*A(/.')1+2 + 23. +'8#*5" try
{ Verifica se o campo remetente foi preenchido }
6+1 + *+13 &+ )'-.(@+ 23"36(+*)&+< if emailDe.Text <> ‘’ then
begin
z# *+ (031 &3 13*. _L46".(' )'-.(; { Verifica se o campo destinatásio foi preenchido }
if emailPara.Text <> ‘’ then
@+` '31+@31+2 + )'-.(@+ &) "(20) &3 begin
)*34+2< I'(13('+ 6+7()1+2 + *+13 &+ { Verifica se o campo assunto foi preenchido }
if emailAssunto.Text <> ‘’ then
)'-.(@+ 23"36(+*)&+ 31 .1) @)'(#@3" begin
{ Verifica se a mensagem foi preenchida }
&+ 0(7+ /#%*"J 3 31 23/.(&) 6F)1)1+2 if emailMensagem.Lines.Text <> ‘’ then
begin
+ 1:0+&+ 3$,$#$ &+ 6+17+*3*03 $:'*,72 { Verifica se o servidor de SMTP requer autenticação. De acordo com a
"$@5< G3H) ) ./-)(0+1 4< seleção, o tipo de autenticação do componente será alterada }
if ckSMTP.Checked then
CompSMTP.Authenti cationType := atLogin else
Enviando o e-mail CompSMTP.Authenti cationType := atNone;
{ Configura o Host do servidor de SMTP a ser utilizado para o envio do e-mail }
CompSMTP.Host := edtHost.Text;
I)') '3)"(B)' + 3*@(+ &+ 3;1)(" 7'3; { Configuração do usuário e senha para autenticação no Host de SMTP }
6(2)1+2 6'()' 31 0317+ &3 3436.CD+ CompSMTP.Usernam e := edtUsuario.Text ;
CompSMTP.Passwor d := edtSenha.Text;
)"/.1)2 6+*A(/.')CJ32 '3")6(+*)&)2 )+2 { Faz a conexão ao servidor SMTP }
CompSMTP.Connect;
6+17+*3*032 )&(6(+*)&+2< %&(6(+*3 )+ { Verifica se o servidor SMTP foi conectado }
3@3*0+ !*O"(6• &+ >0*L*@()' + 6M&(/+ &) if CompSMTP.Connected then
begin
./-)(0+1 5 , -.3 3*6+*0');23 6+13*0)&+ &3 { Configura a mensagem a ser enviada. Passagem de valores as propriedades }
CompMensagem.Clear;
)6+'&+ 6+1 6)&) )CD+ -.3 320# +6+''3*&+ CompMensagem.Priority:=mpHighest;
{ Low = baixo / High = alto / mpHighest = urgente }
&.')*03 + 7'+6322+ &3 3*@(+ &+ 3;1)("< CompMensagem.Cont entType := ‘text/html’;
p 1.(0+ (17+'0)*03 -.3 0+&+ + 6M&(/+ CompMensagem.From .Text := emailDe.Text;
CompMensagem.Reci pients.EMailAddre sses := emailPara.Lines.T ext;
23H) 1)*0(&+ 31 .1 >"+6+ #%6QQ&*"',,6 CompMensagem.Subj ect := emailAssunto.Tex t;
CompMensagem.Body .Text := emailMensagem.Te xt;
23*&+ -.3 3*0'3 + &*"',,6QQ$"? &3@3'# { Anexa os arquivos ao e-mail }
for i := 0 to emailAnexo.Items.Count - 1 do
320)' ) "(*F) 7)') &326+*360)' )+ 23'@(; TIdAttachment.Create(CompMensagem.
&+' XQ\I< \)*0+ *.1 6)2+ &3 2.6322+
MessageParts, TFileName(email Anexo.
Items[i].Caption));
&+ 3*@(+ &+ 3;1)(" +. *.1 6)2+ 31 { Faz o envio do e-mail }
CompSMTP.Send(CompMensagem);
-.3 +6+'') .1) A)"F), + 6+17+*3*03 : MessageDlg(‘E-mai l enviado com sucesso!’,mtInfor mation, [mbOK], 0);
end;
&326+*360)&+ *D+ &3(4)*&+ *3*F.1) end
7+'0) &3 "(/)CD+ )>3'0)< else
ShowMessage(‘Inf orme a mensagem do e-mail’);
! 6)*63")13*0+ &+ 3*@(+ &+ 3;1)(" *) end
else
@3'&)&3 0')0);23 &3 .1) 2)?&) &+ A+'; ShowMessage(‘In forme o assunto do e-mail!’);
end
1."#'(+< I)') 0)*0+ )&(6(+*3 )+ 3@3*0+ else
1"+,*(O &+ L#"+'"($,'% .1) 6F)1)&) ShowMessage(‘In forme o destinatário do e-mail!’);
end
)+ 1:0+&+ +,54$< else
ShowMessage(‘Info rme o e-mail do remetente!’);
O+*A(/.')&+2 0+&+2 +2 3@3*0+2 &) Finally
)7"(6)CD+, 3436.03 ) 1321) 3 A)C) + 03203
{ desconecta do servidor SMTP }
CompSMTP.Disconnect;
&3 3*@(+< O3'0(A(-.3;23 )*032 &3 -.3 320# end;
end;
.2)*&+ .1 !V @#"(&+ 7)') ).03*0(6);
eç o eç o eç o
Nesta seção você encontra artigos
ar tigos para iniciantes
na linguagem Delphi
interface
O termo Programação Procedural (ou programação
procedimental) é às vezes utilizado como sinônimo de type
TServivo = class
Programação Imperativa (paradigma de programação que procedure ProduzirSom;virtual;
especifica os passos que um programa deve seguir para end;
alcançar um estado desejado), mas o termo pode se referir
TCachorro = class(TServivo)
(como neste artigo) a um paradigma de programação procedure ProduzirSom;override ;
baseado no conceito de chamadas a procedimentos. end;
Procedimentos, também conhecidos como rotinas, sub-
THomem = class(TServivo)
rotinas, métodos, ou funções simplesmente contêm um procedure ProduzirSom;override ;
conjunto de passos computacionais a serem executados. end;
Um dado procedimento pode ser chamado a qualquer
hora durante a execução de um programa, inclusive por implementation
<?php <?php
class Cachorro{ abstract class SerVivo{
function Latir(){ function Nascer(){
echo “Cachorro Latindo !”; echo “Nascendo !!!”;
} }
} function Crescer(){
class Homem{ echo “Crescendo !!!”;
function Falar{ }
echo “Homem Falando !”; abstract function ProduzirSom();
} }
}
function ProduzirSom($Obj){ class Cachorro extends SerVivo{
if ($Obj instaceof Cachorro){ function ProduzirSom(){
$Obj->Latir(); echo “Cachorro Latindo !”;
}elseif($Obj instanceof Homem){ }
$Obj->Falar(); }
}else{
echo “O objeto passado não produz som”; class Homem extends SerVivo{
} function ProduzirSom{
} echo “Homem Falando !”;
}
?> }
function GetSom($Obj){
if ($Obj instaceof SerVivo){
Listagem 4. Polimorfismo aplicado no PHP $Obj->ProduzirSom();
}else{
<?php echo “O objeto passado não é um ser vivo !”;
class SerVivo{ }
function ProduzirSom(){ }
echo “Nem todo ser vivo produz som !”; ?>
}
}
class Cachorro extends SerVivo{ Listagem 6. Propriedade Estática no PHP
function ProduzirSom(){
echo “Cachorro Latindo !”; <?php
} class Cliente{
} static $Contador = 0;
class Homem extends SerVivo{ public $id;
function ProduzirSom{ function __construct(){
echo “Homem Falando !”; self::$Contador++;
} $this->id = self::$Contador;
} }
function GetSom($Obj){ }
if ($Obj instaceof SerVivo){ function CriarClientes(){
$Obj->ProduzirSom(); for($i=0;$i<=9;$i++){
}else{ $cliente = new Cliente();
echo “O objeto passado não é um ser vivo !”; echo $cliente->id.”<br>”;
} }
} }
?> ?>
IfI 3 6'(3 .1) *+@) )7"(6)CD+< I)') (22+ &3 )6+'&+ 6+1 6)&) 6)17+< %&(6+*3 N 6")223 .1 6)17+ 7'+03/(&+ Su"5:$ 6+1
)63223 + 13*. A*,$qN$Mr788,*('#*5" < 0)1>:1 &+(2 8.00+*2R_80*X)"@)'` 3 +2 1:0+&+2 <$# 3 /$# 7)') )6322+ ) 3203
X)"@3 ) )7"(6)CD+ 7'322(+*)*&+ _80*j(20)'`U 3 .1 B'?*5<%5>8< %&(6(+*3 A*$,?< ]22+ A)'# -.3 *+ +5?$ +5:8,$#*5"
+#%,./0*&#./ +. 326+"F) A*,$r/'=$ V%52 )+ B'?*5<%5>8 &+(2 (03*2 ) 2.) 7'+7'(3; @+6^ 7+22) )6322)' ) 7'+7'(3&)&3 N5:$
]$(# 74 6+1 + *+13 _I'HI+"(1+'A(21+< &)&3 !#$:4< K(/(03 _I322+) b?2(6)` 3 )0')@:2 &3 V$445'2rN5:$ 31>+') + <$#N52
7F7'H` 3 31 23/.(&) 2)"@3 ) )"*# 6+1+ _I322+) z.'?&(6)`< %"03'3 ) 7'+7'(3&)&3 :$ 3 + /$#N5:$ *D+ 23H)1 (*@+6)&+2<
_(*&34<7F7`< %"03'3 ) 7'+7'(3&)&3 N':$ 1%*$"#'#*5" 7)') 5%\5%*E5"#',< 9) </0,$( a30+'*)*&+ )+ 34317"+, '37(0) + 7)22+
&+ A+'1."#'(+ 7)') _b'1]*&34`< L203 2 031+2 .1) 2./320D+ &3 ,'65>#< )*03'(+' 3 A)C) + 1321+ 7)') 7.>"(6)'
A+'1."#'(+ 23'# .0("(B)&+ 7)') 6'()' ) O+*6".?&+ + ")u+.0 7)22)'31+2 )/+') 31 V$445' ) 7'+7'(3&)&3 ;$,$&5"$< L1
*"#$%&'($ @(2.)" &+ *+22+ 34317"+< 7)') ) 6'()CD+ &3 *+22)2 6")2232< 9D+ ('3( V$445'A*4*(' 7.>"(-.3 ) 7'+7'(3&)&3 +VA
%&(6(+*3 *3203 A+'1."#'(+ 0'^2 C?*#4 13 )7'+*A.*&)' *) 2(*0)43 !! *+ IfI 3 31 V$445'W>%*?*(' ) 7'+7'(3&)&3 +NVW <
&) 7)"30) /#'"?'%?< %"03'3 23.2 *+132 7+(2 3203 A+( 326+7+ &+ 7'(13('+ )'0(/+< !>23'@3 *) ./-)(0+1 2B )2 6")2232 6+1
7)') _L&09+13`, _L&0L1)("`, _L&0a3; %63223 + 13*. A*,$qN$Mr)"*# 3 6'(3 )2 7'+7'(3&)&32 7.>"(6)&)2<
/(20'+`, '327360(@)13*03< %&(6(+*3 0'^2 .1) *+@) )"*# 2)"@)*&+;) 6+1 + *+13 % 7'(*6?7(+ @+6^ &3@3'# *+0)' -.3 *D+
K'L$,4c 0)1>:1 &) 7)"30) /#'"?'%? , .1 _Q+&3"<7F7`< 9320) )"*# ('31+2 6'()' A+/3 1.(0+ ) '3/') &3 6'()CD+ &3 6")223
7)') 6)&) C?*# 3 0'+-.3 23.2 +'8#*5"4 .1 1+&3"+ +*&3 03'31+2 .1) 6")223 31 6+17)')CD+ 6+1 + K3"7F( 5(*Tg<
V$445' 6+1 )2 7'+7'(3&)&32 N5:$ 3 \31+2 31 V$445' )2 7'+7'(3&)&32 73'0(;
;$,$&5"$ 6+1.1 ) 0+&+ + 0(7+ &3 7322+)< *3*032 ) 0+&+ 0(7+ &3 7322+)< V$445'A*4*('
b)'31+2 .1 32736()"(B)CD+ &3 V$445' 31 F3'&) &3 V$445'c 3 7+' 3223 1+0(@+ 0')B
V$445'A*4*(' 3 V$445'W>%*(' 6)&) .1) 6+1 6+*2(/+, &3@(&+ ) F3')*C), )2 7'+7'(3&);
.1) 7'+7'(3&)&3 346".2(@) +VA 3 +NVW &32 N5:$ 3 ;$,$&5"$Q I'36(2)1+2 )73*)2
'327360(@)13*03< 9) )"*# 6'()&) &(/(03 )&(6(+*)' ) 7'+7'(3&)&3 +VA )22(1 6+1+
+ 6M&(/+ &) ./-)(0+1 @< )6+*0363 31 V$445'W>%*?*('c 23*&+ -.3
*320) 031+2 + +NVW 6+1+ &(A3'3*6()"<
9+ 6M&(/+ &) ./-)(0+1 @ )73*)2 6'(); X3 *+0+. >31, 7.>"(6)1+2 + 1:0+&+
1+2 ) 320'.0.') &)2 6")2232 -.3 23'D+ .2); /'=$FG 31 V$445' 6+1+ 'L4#%'(# (*&(6)*&+
&)2 31 *+22+ 34317"+< I+2(6(+*3 + 6.'2+' )22(1 ) (*03*CD+ -.3 031+2 31 2+>'32;
*) #'3) &) 6")223 V$445' 3 7'322(+*3 +#%, . 6'3@^;"+ *)2 6")2232 &3263*&3*032 3 : (22+
/0*&# . 7,# . ) 7)') 7.>"(6)' )2 7'+7'(3; -.3 A)'31+2 )/+')< 9) 6")223 V$445'A*4*('
&)&32< 9+ &(#"+/+ -.3 23 )>'3 7'33*6F) 2+>'326'3@) ) A.*CD+ /'=$FG 6+*A+'13 )
+2 6)17+2 6+*A+'13 ) </0,$( 43 ./-)(0+1 22< b)C) + 1321+ 7)') V$445'2
Figura 1. Exemplo de layout a37)'3 -.3 + K3"7F( A+' IfI H# )&(6(+*) A*4*(' 6+*A+'13 ./-)(0+1 24<
abstract class Pessoa{
protected abstract function Save();
}
class PessoaFisica extends Pessoa{
}
class PessoaJuridica extends Pessoa{
: 6F)1)&+ &3 \*"# ?$ +,'44$< &+ >+0D+ K*4#'% ;5?54 6F)1)'31+2 .1) ?>
O+1 (22+ .1 3''+ 23'# /3')&+ 23 03*; 7#/(*) R_"(20)<7F7`U 3 *3") 34(>('31+2 +
Listagem 10. Classes com propriedades publicadas
0)'1+2 )&(6(+*)' *+ 7%%'6 .1 +>H30+ 6+*03W&+ &3 *+22) "(20) &3 7322+)2< I)')
-.3 *D+ 23H) &+ 0(7+ 7322+)< % A.*CD+ (22+ 6+&(A(-.3 + >+0D+ 31 -.320D+ A)B3*; <?php
/* Classe principal Pessoa */
7.>"(6)' 31 K*4#'V$445' )73*)2 A)B .1 &+ .1) 6F)1)&) )+ 1:0+&+ %$?*%$(# &+ abstract class Pessoa{
protected $_nome=””;
,558 *+ 7%%'6 +*&3 6)&) (*03')CD+, +. IfI, 6+*A+'13 ) 23/.('E function getNome(){
return $this->_nome;
23H), 6)&) @3B -.3 7)22) 7+' .1 +>H30+ + }
redirect(‘lista.php’);
1:0+&+ /'=$FG : (*@+6)&+, 7.>"(6)*&+ *+
function setNome($value){
$this->_nome=$value;
L%5M4$% )2 (*A+'1)CJ32 &+ +>H30+< L20) 7#/(*) )(*&) *D+ A+( 6'()&) 3*0D+ }
function defaultNome(){
I)') 0320)' *+22+ 1+&3"+ @)1+2 )+ 7'+63&) 6+1 ) 6'()CD+ 31 A*,$qN$MrA5%:< return ;
}
3@3*0+ 1"+,*(O &+ >+0D+ /',='%< 93203 X)"@3;) 6+1+ _"(20)<7F7` 3 1+&(A(-.3 protected $_email=””;
function getEmail(){
return $this->_email;
}
function setEmail($value){
$this->_email=$value;
}
function defaultEmail(){
return ;
}
protected abstract function Save();
}
/* Classe PessoaFisica */
class PessoaFisica extends Pessoa{
protected $_cpf=””;
function getCPF(){
return $this->_cpf;
}
function setCPF($value){
$this->_cpf=$value;
}
function defaultCPF(){
return ;
}
}
/* Classe PessoaJuridica */
class PessoaJuridica extends Pessoa{
protected $_cnpj=””;
function getCNPJ(){
return $this->_cnpj;
}
function setCNPJ($value){
$this->_cnpj=$value;
}
function defaultCNPJ(){
return ;
}
}
?>
Figura 3. Cadastrando Pessoas na Lista
Listagem 11. Metodo Save() na classe PessoaFisica
23. N':$ 7)') _b'1j(20)`< 9+ 1"/05M
&322) 7#/(*) &(/(03 + 6M&(/+ ) 23/.('E
public function Save(){
echo ‘<font size=6 color=darkblue’.
‘face=Tahoma>’.$this->Nome.’</font><br>’. $L = $_SESSION[‘Obj’];
‘Email...: ‘.$this->Email.’< br>’. $L->Publicar();
‘CPF....: ‘.$this->CPF.’< br>’.
‘Tipo...: Pessoa Fisica <hr>’;
} L203 6M&(/+ )73*)2 (*@+6) + 1:0+&+
Listagem 12. Metodo Save() na classe PessoaJuridica V>L,*('% &+ +>H30+ K*4#'V$445' -.3 320# *)
public function Save(){
23CD+< L203 1:0+&+ 7+' 2.) @3B A)B .1
echo ‘<font size=6 color=darkblue’. ,558 *+ 7%%'6 (*@+6)*&+ + 1:0+&+ /'=$FG
‘face=Tahoma>’.$this->Nome.’</font><br>’.
‘Email...: ‘.$this->Email.’< br>’. &3 6)&) (031 &) "(20)< O+1 (22+ -.)*&+
‘CNPJ...: ‘.$this->CNPJ.’ <br>’.
‘Tipo...: Pessoa Juridica <hr>’;
320) 7#/(*) A+' 6)''3/)&) 34(>('# *+
} L%5M4$% 0+&)2 )2 7322+)2 6)&)20')&)2 *)
"(20) &3@(&)13*03 A+'1)0)&)2<
Listagem 13. Classe Pessoa Lista
L436.03 ) )7"(6)CD+< /$,$(*5"$ + 0(7+ &3
class ListaPessoa{
static private $instance;
7322+), (*A+'13 +2 &)&+2 3 6"(-.3 *+ >+;
private $_list = array(); 0D+ /',='%< G3H) ) )7"(6)CD+ 31 3436.CD+
function AddPessoa(Pessoa $Obj){ *)2 </0,$(- 5 3 ;<
$this->_list[] = $Obj;
}
function Publicar(){
Conclusão
for ($i = 0; $i < count($this->_list); $i++){ O+1 +2 6+*63(0+2 )7'3*&(&+2 )0: + 1+;
$this->_list[$i]->Save();
} 13*0+ H# : 7+22?@3" )&(6(+*)' )+2 *+22+2
}
7'+H30+2 .1 )27360+ 1)(2 7'+A(22(+*)", 3
Listagem 14. Criando os objetos do modelo 6")'+, A)6("(0)' >)20)*03 + *+22+ 0')>)"F+<
O+*A322+ -.3 7)') -.31 *D+ 031 .1
function BtnSalvarClick($sender, $params){
63'0+ 6+*F36(13*0+ 31 !! 7+&3 7)'363'
switch ($this->RadioGroup1->ItemIndex) {
case 0: ) 7'(13(') @(20) .1 0)*0+ 6+17"(6)&+
$Pessoa = new PessoaFisica;
$Pessoa->CPF = $this->Edit3->Te xt;
)7"(6)' 0+&+2 32232 6+*63(0+2, 1)2 6+1
break; + 0317+ @+6^ ('# 73'63>3' -.3 )2 6+(2)2
case 1:
$Pessoa = new PessoaJuridica; *D+ 2D+ 0D+ 6+17"(6)&)2 6+1+ 7)'3631<
$Pessoa->CNPJ = $this->Edit3->T ext;
} ! 1.*&+ &3 7'+/')1)CD+ !! : A)2;
$Pessoa->Nome = $this->Edit1->Text;
6(*)*03 3 '3-.3' 1.(0) &3&(6)CD+ 7+'
$Pessoa->Email = $this->Edit2->T ext; 7)'03 &)-.3"32 -.3 23 ")*C)1 *3"3< I+'
if (!isset($_SESSION[‘Obj’])){ (22+ &3&(-.3;23< j31>'3;23 -.3 !! : !!
$_SESSION[‘Obj’] = new ListaPessoa;
}
(*&373*&3*03 &) "(*/.)/31< f)>(0.3;23
$_SESSION[‘Obj’]->AddPessoa($Pessoa);
) 73*2)' !!, 7+(2 0+&)2 )2 /')*&32 "(*;
} /.)/3*2 3 7+' 6+*23-ƒ^*6() A3'')13*0)2
320D+ )7+()&)2 *320) A("+2+A()<
s1 /')*&3 )>')C+ ) 0+&+2 3 )0: +
7'M4(1+ )'0(/+, +*&3 0')0)'31+2 &3 .1
)22.*0+ .1 0)*0+ (*03'322)*03E K32(/*
I)003'*2 31 IfI<
L. 2+. a+&'(/+ O)''3('+ 3 73") 2.)
)03*CD+ 1.(0+ +>'(/)&+<
b
r
e
gosto.Para isso, precisamos saber o que e
s
t
a
e
i d
você, leitor, acha da revista! o ç
ã