Escolar Documentos
Profissional Documentos
Cultura Documentos
"da Visu
em
Duncan Mackenzie
Kent Sharkey
Traduo:
Aldir Jos Coelho Co rrea da Silva
Revisc7Q Tcnica:
Marcos Jorge
Consultor Espcci[l[ista na Plfllaformu .NET
Analista de Sistemas
PEARSON
Makron
Books
So Paulo
Brasil Argentina Colmbia Costa Rica Chile Espanha
Mackenzie, Duncan
Aprenda Visual Basic .NET em 21 Dias I Duncan Mackenzie, Kent
Sharkey; traduo: Aldir Jos Coelho Correa da Silva; reviso
tcnica: Marcos Jorge. -- So Paulo: Pearson Education do Brasil,
2003.
Titulo original: Sams teach yourself Visual Basic .NET in 21 days.
ISBN : 85.346.1450-4
1. BASIC (Linguagem de programao para computadores) 2. Microsoft Visual Basic 3. Microsoft Windows (Programa de computador)
I. Sharkey, Kenl. II. Titulo.
02-4239
CDD-005-133
,
2003
Proibida a reproduo total ou parcial.
Os intratores sero punidos na forma da lei.
Direitos exclusivos para a lngua portuguesa cedidos
Pearson Education do Brasil,
uma empresa do grupo Pearson Education
Av. Ermano Marchetti , 1435
CEP 05038-001 - Lapa - So Paulo - SP
Tel. (11) 3613-1222 Fax: (11) 3611-0444
e-mail: vendas@pearsoned .com
Dedicatria
De Duncan Mackenzie:
Enquanto trabalhava neste livro. quase ludo em minha vida se modificou, mas em grande
parte, isso no eslava relacionado com ele. Agora tenho um jilho, Connor, me mudei para
oulra regio e es/ou com um 1I0VO trabalho na Microsoft. Gostaria de dedicar este livro a
minha esposa, Laura, que sempre apoiou a iniciativa de escrevlo, independentemente de
quantos meses ultrapassamos o prazo inicial, e a meu filho , que no linha a mnima idia
de que este livro eslava sendo escrito e mesmo assim eslava mui/o feliz e solidrio. Para
concluir. lenho de agradecer a Kent, porque ele escreveu melade do livro, e no acho que
eu/erio sobrevivido se tivesse que faz-lo sozinho.
De Kent SI/Grkey:
Em princpio, pretendia parecer inteligente e escrever um poema aqui, mas esse lado de
meu crebro est com problemas nestes ltimos dias. Portanto, em vez disso, essa ser uma
lista bastanle tpica de todas as pessoas que me ajudaram neste livro. Gostaria de agradecer ao mell co-alllor, Dllncan. Obrigado pela oportllnidade e por nllnca aceitar 11111 "no"
ou "Desis/o" como repos/a. Obrigado a lodos os editores que trabalharam no livro, principalmeme Sondra e Todd. Obrigado a Squirre1 por me manter so e salvo e a Cica por deixar meu/aptop aquecido e, s vezes, sem a/ividade. Por ltimo, mas no menos impor/ante.
obrigado a Margaret por me apoiar enquanto trabalhava nesta a/ividade, 11m novo trabalho
em um novo local. Agora teremos novamente essa coisa que chamam de fim de semana!
Sobre os Autores
Duncan Mackenzie profissional certificado MCSD, MCSE e MCT que trabalha para o grupo
MSDN (http://msdn.microsoft.com)daMicrosoftem Redmand, Washington. Ele um programador dinmico do Visual Basic .NET que possui o aborrecido hbito de escrever artigos
ocasionais. Duncan tambm alua como instrutor de Visual Basic e ministra muitos cursos, que
abrangem da programao intermediria avanada do VB. Escreveu vrios livros e colaborou
,
em tantos outros sobre as tecnologias da Microsoft. E ainda orador em muitas conferncias que
cnfocam o desenvolvimento da Microsoft.
Kent Sharkc)' MCSD, MCSE, MCT e MCP+SB. No momento trabalha na Microsoft corno
Instrutor Tcn ico no Grupo de Solues .NET, em que sua ocupao atual o .NET Framework
e o Visual Studio .NET. Antes de entrar para a Microsoft, Kent j possua anos de experincia
como instrutor e consultor, concentrando-se em projetos e desenvolvimento de aplicativos com
o uso do Visual Basic. Ele escreveu e co laborou em diversos livros, incluindo sobre MCSD e Visual Basic. Faz exposies regularmente em conferncias de desenvo lvedores dando nfase ao
desenvolvimento da Microsoft.
Receberemos com satisfao seus comentrios. Voc pode enviar um fax , e-mail ou escrever direlamente, para que possamos saber do que gostou ou no neste livro - assim como o que pode-
Por favor, entenda que no podemos ajud-lo com problemas tcnicos relacionados ao tpico
deste livro e que, devido ao grande volume de correspondncia que recebemos, talvez no possamos responder a todas as mensagens.
Quando voc escrever, cenifique-se de incluir o ttulo e o autor deste livro, assim como seu
nome e nmero de telefone ou fax . Examinaremos seus comentrios cuidadosamente e os compartilharemos com os autores e ed itores que trabalharam no livro.
Fax:
Fone:
Endereo Eletrnico:
Endereo Postal:
...
...
cc
cc
CI
(II
.e
cc
CI
..,
""-cc
CI
cc
CI
-CIcc
-CIcc
'"cc
.N
II)
ln
-cc
( II
cc
CIl
-cc
:$
CI
CI
CI
C,)
.-
...
co
CI
CI
cc
cc
.>
(II
cc
-==
...c..
II)
...
-CIcc
-CIcc
:$
CI
'"C-ccI
"":$
co
..,
-CIcc
C>
<C
cc
CI
cc
CI
CI
ln
~
cc
CI
Sumrio
Introduo- ............. .. .. ... .. . .... . . . . .. .. ... . . .. . ..... XXI
3
Compreendendo a Programao de Computadores ' .. ... . .. ... .. . .. . .. .. 3
..
..
..
..
..
..
14
14
15
16
. .... . ... 17
. .... . .. . 17
. ... . . 21
. .... . 2 1
. .. ... 22
. ..... 27
P&R ')7
Workshop . ... . ... . .. .. . .. - ... . . .. .. . .. ..... - . . . .. . 28
Teste .. ... . .. .. .. .. .. ... . ... .. . . .. . . . . .. .. .. . . . . ... 28
Exercfdos ....................... . .. ... .. .. .. . . . ..... 28
Dia 2
29
29
30
32
50
52
53
54
54
55
56
58
60
Teste 61
Exercc ios' .. .. ... . .. .. ... . ... .. .. .. .. .. ... . . , ... , . . . .. . 61
Dia 3
63
P&R89
Workshop ................. . .............. . ............... 89
Teste' ........ .. ... . ... . . . .. .. .. ....... .. ............... 90
Exerc cios' .. .. .. .. .. .. ... . ... .. .. .. .. .. .. .. .. .. .. . .... . .. . 90
Dia 4
91
Tomando Decises com as Instrues de Controle ' ..... .. .. ....... . .. . 91
A In struo If . .. .. .. .. ... . ... .. .. .. .. .. .... . .. .. .. . ... ... . . 92
Sum rio
Dia 5
Dia 6
ttt
113
t t4
t t5
116
117
119
121
123
123
124
124
125
127
127
128
129
133
133
134
134
135
136
138
139
141
145
145
146
146
147
148
148
148
149
149
XII
159
167
165
[68
172
Teste 174
111
Para Comear: O Que um Objeto? ..... .. . .... . .... .. ....... ... 177
Classes e Instncias ........... ....... . ..... . ...... ..... 178
Referncias ..................... .. .. ... . ..... .. ...... .... 178
Passando o Conceito para o Cdigo' ....... .. . .. . .... .. .. . .. ..... 179
Propriedades ' .. . ... .. .. . ....... .. . . .. ... . . .. . ... .. .. . . .. 180
Propriedades ReadOn l y e WriteOnly .. . ... .. . . .. .. . ... .. . 18 1
Criando a Instnc ia de um Objeto . .. ... . ....... .. .. . .. . . .. . .... . 182
Encapsulando Cdigos em Suas Classes' .............. . ........... 183
Tpicos Avanados' .. ... .. . ... .. .. ... . .. ... . ... .. . . .. . .. ... . 187
Sobreposio ' . . .. ... . .. ... .. .. ... . .. ... . ... .. . . .. ... .. . 187
Herana ' ... .. . .. ... . .... . .. .. ... . .. ... . ... .. . . .. ... .. . 189
A Base de Todas as Classes Bs icas ' .. .. .. ... . ... .. . . . . ... .. . 194
Construtores' .................................. . .......... 195
Espaos de Nome' .............................. . ........ .. 197
Membros e Objetos Compartilhados .. .. .. .. ......... . . ......... 199
Resumo . .. .. ... . ... .. . .. ... . ... .. .. .. ... . ... .. . .. ...... .. . 199
P&R .. . .. ... .. . ... .. . .. ... . ... .. . ... ... . .. . .. . .... .. .. . 200
Workshop' .... . . ....... .. ... . .. .. ... . .... .. ..... ..... 200
Teste' ........ . . .... .. ... .. ... . ... . .... .. ..... .... 201
Exercidos ..... . . .... .. .... . . . . .... . ..... .. ....... ... 201
SEMANA 1 Revis o
202
203
Dia 8
Sumrio
XIII
Math ., , .. " ,., , ,." ,." ,." , .. , ... , , ,.,., .. , ... ... ", .. " 2 14
Classes de Conjuntos no ,N ET Framework ' .. ' , , . ' ' .. , . .... . . ' , . ' , 215
Encontrando o Que Precisa no ,N ET Framework ' ' , . , , .. ' . ...... ' , .. . 2 19
As Regras da Busca . .. .. . ....... .. .. .. ... . .. .. .. .... . . .. . .. 2 19
A Saga pela Classe Perfeita' .. , .. , , ... , ... , , .. ' ... .. .. . .. , , ... 220
Resumo' . , ... , , ... , .. , .... , , .. . . . . . ... . ' ... .. .. . . . , , .. , 223
P&R "." ... " .. " .. , .... " . .. . .. . .. . , ... .. . ... . , ... , 224
Workshop .. .. . . , ..... . ... . . .. . . .... . .. . .. .... . .. . .. 224
Teste .. ... .. . ... .. .. . .... . .. .. .. .. ... . ... .. .. .. ....... .. . 224
Exercfc ios . ... . .. ... . , .. .. .. .. ... . ... .. .. .. .. .. .. .. .. ... .. . 224
Dia 9
225
, , , .. , 225
. , , ... 227
. , , .. , 227
. , , .. , 228
... . .. 229
... .. . 229
XIV
283
283
284
284
284
285
Um Banco de Dados a Soluo para Todos os Problemas Cot id ianos' ...... 285
A Dec Iso E Tomada' . .. .. ...... ... . .. ... . ... .. .. .. ... . ... .. . 286
A Passagem para um Banco de Dados Real . ... . ... .. .. .. ... . ... .. . 287
Uma Introduo SQ L' . . .. . ....... .. .. .. ... . ... .. .. ...... .. . .. 288
Recu perando Registros com a Instruo SELECT ........ .. ..... . 288
Adicionando Novos Registras' ...................... .. ..... ..... 290
Alteran do Registras' ............................ .. . .. . . ..... 291
Removendo Registros Indesejados' .. .. .. .. ... . ... .. .. . . . .. . ... . .. 29"
Para Onde Ir a Partir Daqui Abordando a SQL' .. . ... .. .. . .. . . . .. . .. 29"
Problemas Comuns dos Bancos de Dados e Suas Solues' . .. . .. .. . ... .. . 293
Incons istncias de Atualizao . . ..... . .......................... 293
Campos Multivalorados ....................................... 297
Associaes: Consultando Vrias Tabelas de uma S Vez ' . .. . .. . .. ... . 298
Re lacionamentos Mu itos-para-Muitos ... . .. ... . ... .. . ... . .. . ... . .. 300
Integridade Referencial .. .. ...... .. .. .. ... .. .. .. .. .. . .. . ... . . . 300
Criando Chaves Prim rias ................ . .. ..... 301
Criando o Banco de Dados de Exemplo ' ................ .......... 304
Access 2000 ou Access 2002 ...................... . .......... 304
MS DE e SQ L Server 2000 . ....... .. .. .. ... . ... .. .. . .. . ... .. . 305
Testando a Confi gurao com $ystem. Data .. ... . ... .. .. ... .. . ... .. . 305
Resunlo . .. ... .. .. .. .. . ... .. .. .. ... . .. .. . . .. . .. ..... .. . .. 307
P&R .. .................. . ............. . . . . .. .. ..... ..... 308
Workshop ..... ....... . ... . .. . .... . .. .. .. ..... ..... 308
Teste' .. ... .. . ... .. .. . ... .. .. ... . ... .. . . .. . ...... .. .. . 309
Exerccios .. .. . ... .. .. .. ...... .. .. .. ... . ... .. .. .. .... .. .. . 309
Dia 12 Acessando Dados com a Plataforma .NET
311
Uma Viso Geral do Acesso aos Dados na Plataforma .NET .. .. . .. . ... .. . 3 11
OADOeoOLEDB 3 12
Sumrio
ADOoNET o o o oo o o oo o o oo o o oo o o oo o o o
o" oo o
o
o o oo o o o312
Tareras-padro dos Bancos de Dados o o o.. o.. . ... o.. o o .. . . o o. o o314
Conectando-se ao Banco de Dados o o.. o. o . o.. o o o. o . o o.. . 3 14
Executando uma Instruo SQL' .... .. . o o o o o. .. . o o o o o .. . .. 3 19
Recuperando Dados o. o o o. o o o. o o o.. o. . o o.. o. o o .. o. . o o o oo o o32 1
Trabalhando com Data Sets ' .. o o o oo o o. . o. . o o.. o.. o .. o.. o o oo o o323
Inserindo Dados em um DataSet . o o... o.... o. . o... .. o.. o o... o323
Navegando pe los Dados ' . . ....... ... . .. ... . . . .. . . ... o .. . .. 326
Editando Dados (Adicionar, Editar e Excluir)' ... . ... .. . o o. . . ... .. . 329
Editando Registros . .. o . o. o .. . o .. .. o . .. o .. . o .. . o . .. . .... . o . 33 1
Atualizando o Banco de Dados o. o o o.. o o.. o o o. o o o. o o o o o. o o oo o o334
Trabalhando com Mltiplas Tabe las o... o... o o. o o o... . o o. o o... o346
Visualizaes ' . . ... .. .. . ....... ... . .. ... . ... .. . .. . ... .. . 348
Vinculao de Dados . ... .. . ....... ... . .. ....... .. . .. . ... .. . 350
Vinculao de Dados com os Fonnulrios Windows ' .. .. .. .. . ... . .. 35 1
Resumo ' .. ... .. . ... .. .. .. .. .. .. ... . .. ... . ... .. .. ...... .. . 354
P&R o. o o o. o o o o. o o.. o o.. o o o. o o o.. o o.. o o o. o o o. o o . o oo o o o. o o355
Workshop .. .. . .. ... . o.. .. .. . . .. ... .. .. .. . .. o... o.. . 355
Teste' .. ... .. . ... .. .. .. .. .. . . . .. ... . ... .. . o . .. .. ... . 355
Exercc ios' . .. . ... .. .. . .... . o . .. o. ... .. . o .. o .. . .. 356
00
.0
.0
0.0
357
381
o o o. o o o. o o381
... . . .. .. . 387
... . o .. .. . 384
o .. o o .. o . . 385
o.. o o o. o o385
XVI
Herana' ... .. .. .. .. .. .. ... . .. ... . ... ... ..... ... ...... .. .. . 389
Construtores' .. . ... .. .. . ....... .. .. .. ... . . .. .. ... ...... .. . .. 393
Projetando um Aplicativo com o Uso da roo .... . . .. .... .. .. . ....... 396
Ident ificando os Objelos ................... . . ... .. ... ....... 397
Reviso
403
405
407
...... 407
. .. .. . 408
. .. .. . 408
. .. .. . 410
441
Menus ......................................... .. .......... 44 I
Adicionando um Menu a um Formu lrio' ............. o 441
Os Teclados e os Menus ' . . ........ . .. .. ... . ... .. .. .. . ... .. . 444
Adicionando Cdigo .. .. . ........ .. . .. ... . ... .. . .. . ... .. . 445
Algumas Sugestes ' ..... . ........ . .. .. ... ... . .. .. ...... .. . 448
Programas de Interrace de Documentos Mlt ip los ......... . .......... 449
,
O Que E uma Interrace de Documentos Mltiplos? ... .. ... . . .. ... .. . 449
S um rio
XV II
.. .............
.. .........
47 1
47 1
47 1
472
473
Fluxos e Arquivos' .............. . ....... . .... .. ...... ..... 473
,
O Que E um Stream? .......... .. . . .. ... . .... .. ...... .. .. 474
Arquivos e Diretrios' ............... .. . .. . .... .. .. . .. .... 474
Lendo um Arquivo de Texto ' ...... .. .. .. ... . .. .. . ... . . . .. . . 476
Gravando em um Arqu ivo de Texto ' . ... . .. ... . ... .. . . .. .. . ... .. . 478
Desenhando com as Classes de Figuras .. .. .. .. ... .. .. . .. . . .. . .... . 492
Exam inando as Classes de Figuras' .................. . ........... 492
Onde Posso Desenhar? . .. . .... . .. .. .. .. ... . ... .. . .. . .. ... . 498
Desenhando Fomlas . .. .. . ... .. .. ... . .. ... . ... .. . . .. ... .. . 503
Salvando Figuras ' . ... . .. .... . .. . .. ... . ... .. . . . .... .. . 506
Resumo . .. ... .. . .. ... .. . ... .. .. . .. ... . ... .. . .. . ... .. . 509
P&R .......................... . ....................... 509
Worksho p' ...................... . ............. . ........ .. 510
Teste 510
Exerc cios' ... . ... .. .. . ..... . . . .. ... . ... .. . .. ...... .. . 5 10
Dia 18 Retoques Finais
511
XVIII
547
573
O Que um Serv io Web? ' . . .... . .. .. .. .. ... . ... .. ... . .. . ... .. . 573
O Sim p[e Object Access Protocol ..... .. .. .. ... . ... .. . .. . .. . ... .. . 575
O Protocolo' .................................. . .......... 575
Web Service Description Language (WSD L) ........... .. .......... 576
Discovel)" ... . .. . ... .. .. ... . ... . .. .. .. ........ .... ... .. . 579
Criando um Servio Web Simples ' . . .. ... . .. ... . ... .. .. .. . ... . .. 580
Criando o Projeto ' .. .. .. . ....... . .. ... . ... .. .. .. . ... . .. 58 1
Adicionando o Cdigo' . ........................ .......... 584
Compilando o Servio Web' ........ .. ............. .. .......... 585
Criando um Serv io Web Cliente .... .. ............. . .......... 587
Criando o Projeto' .. .. .. . ....... . . . . .. ... . ... .. . . .. .. . ... . .. 588
Adicionando O Cdigo' . ... ... . .. .. .. .. ... .. . .. ... .. .. . . ... . 589
XIX
Sumrio
Workshop '
Teste' .
Exercfc ios
. . . .. . . .. . ...
. . . .. . . ... .. .
. . . .. .
592
600
604
605
605
605
605
SEMANA 3 Resumo
606
Respostas do Dia [
Teste' ...
Exercfcios
Respostas do Dia 2
Teste' ..
Exercfc io
Respostas do Dia 3
Teste' ...
Exerccios
Respostas do Dia 4
Teste' ..
Exercc io
Respostas do Dia 5
Teste' ...... .
Respostas do Dia 6
Teste' .. .
Exercc ios
Respostas do Dia 7
Teste' ...
Exerccios
Respostas do Dia 8
Teste ' .. .
Exerc cios
Respostas do Dia 9
Teste' .. .
Exerccios
Respostas do Dia 10
Teste' ...
Exerccios
597
596
597
614
615
615
615
615
615
617
. . . .. . . ... .. .
609
609
609
610
61 I
611
611
611
611
612
613
6\3
. . . ...
. . . .. . . .. . ...
... . ..
. . .. . . .
620
621
621
619
619
617
617
622
623
623
67'
-,
xx
627
. . . . . . . . . . . . . . . . 627
. . . . . . ... ... .. . . . . . . . . 628
Teste' .. .. . .. . .. . .. ... . .
.. .
Exerc cios'
Respostas do Dia 12 . . .. . .
. . . .. . . .. . ...
. ...... . . . . . . 629
Teste ' . . .... . ...... .. . . .... ... . . . . . ... . . ... ... .. ... .... . . . 629
. . . . . . . .. . . . 630
. . . . . . . . . . .. 630
Teste' . . . . . . . .. . . .. . .. . . . ... . ... . ... . . . . .. . . . . . . . . . . . . . 630
Respostas do Dia 14 ... .. - . . .... . . . . .. ... . ... .. . . . . - . . . . . . . . 630
Teste' .. ... . . . . . ... . ... . . . . . . . . . . ... .. . .. . .. . .. . . . . . . . . . . 630
Exercc ios' .... . ............ . .. .......... . .. . ... ........ . 630
Exercc ios' .. . . .. ... .. . . .. .. .. .. . . . . .... . .. .. .
Respostas do Dia 13 .... . .. . . ... ... . .. .. ... . . . ... .
........ ..... .. ..
..
..
.. . ..
..... . . .. . . .
Exerc cios
Respostas do Dia 20 .. . ... .. . . . . . . . .... . .. . . .... . . .. .
Teste ' .. ... .. . ... . . ...
. .. . . ...
. ... . . . . .
63 1
63 1
63 1
633
633
633
638
638
638
639
639
640
640
640
. . 64 1
. . 641
.. 641
. . 644
.. 644
645
Introduo
Bcm-vindo a uma lio estimulante e informativa de 21 d ias sobre o Visual Basic .NET, a mais
nova encarnao da linguagem de programao mais popu lar do mundo. Este livro foi planejado
para fornecer a voc uma introduo ao .NET Framework e ao Visual Basic .NET, e faz-lo comear a programar aplicativos reais o mais rpido possvel.
Viso Geral
o .NET Framework o conjunto bsico de conceitos e tecnologia subjacente ao mais novo grupo de ferramentas de desenvolvimento da Microsoft e constituir a base para a nova srie de servidores, apli cativos e servios com base na Web implantados ao redor do mundo. Como j de
se esperar, a plataforma .NET no algo que possa ser completamente discutido em uma hora ou
mesmo em 21 dias, portanto, este livro ter uma abordagem mais especifica. Voc precisar se
tomar produtivo rapidamente e isso o que conseguir nos prximos 21 dias enquanto ler este livro e trabalhar com os exerccios dele. Pelo fornecimento dos elementos bsicos da linguagem
do Visual Basic .NET e li ma expl icao s uficiente do prprio .NET Framework, voc estar
pronto para j comear a programar e preparado para continuar aprendendo ao progred ir.
Desde o incio, importante observar um fato essencial sobre a plataforma .NET: a linguagem
que voc lisa menos relevante do que foi no passado. O Framework (o conjunto de tecnologia
em que toda a plataforma .NET est baseada) a prpria plataforma .NET e tambm pode ser
acessado sem problemas por qualq uer linguagem .NET (incl uindo o Visual Basic, C#, C++ e outras). Essas so notcias excelentes tanto para os desenvolvedores novos do Visual Basic quanto
para os experientes. O Visual Basic no mais uma linguagem de segunda classe, com certos recursos avanados do sistema operacional restritos apenas aos programadores que usam C++.
Agora, qualquer sistema, independentemente do tipo, pode ser criado no Visual Basic.
Essa independnc ia tambm significa que voc (ou sua empresa) est livre para escolher qualquer linguagem com aqual que ira trabalhar. Dada essa opo, mu itas pessoas, incluindo os autores deste livro, iro adolaro Visual Bas ic .NET. Sua sintaxe e est ilo fceis de usar o tornaram a
linguagem de programao mais popular do mundo, mesmo com as limitaes que a verso anterior apresentava. Agora, com a plataforma .NET, nada ir imped i-la de ser usada em qualquer
projeto de todos os tipos de empresa.
Se voc estiver interessado cm aprender mais do que apenas o Visual Basic .NET - talvez a C#
possa ser bem interessante - , continuar tendo um bom ponto de partida. Este livro vai fornecer
uma abordagem de como usar o .NET Framework, conhecimento que pode ser transferido facilmente para qualquer linguagem .NET.
Este livro foi planejado como uma srie de lies, cada uma representando a lgum conceito importante no desenvolvimento de aplcativos (como o acesso a bancos de dados) ou um trecho es-
XXII
senc ial com conhecimento para tornar voc produt ivo (o uso do IDE, por exemplo). Essas lies
podem ser examinadas em qualquer ordem, mas se voc for novo na atividade de programao
em geral, ento, ser mais vantajoso seguir a partir do incio, na primeira vez que o livro for usado. A maioria das lies, mesmo a primeira, inclui algum exemplo de cdigo e exerccios para os
quais ser necessria a elaborao de mais um pouco de codificao. Para aprovei tar ao mximo
o tempo gasto no livro, tente realizar todos esses exemp los e exerccios. Nada aumentar sua
compreenso desses tpicos mais rapidamente do que co locar a mo na massa e cod ificar.
Introduo
XXIII
Nosso objetivo prepar-lo nos prximos 21 dias para que voc possa criar muitos de seus prprios apl icativos simples no Visua l Basic .NET e trabalhar como parte da equipe que est desenvolvendo um grande aplicativo Windows ou com base na Web.
o Que No Abordaremos
Apesar da discusso anterior sobre a independncia da linguagem e a importncia das tecnologias subjacentes, este um livro que tem como prioridade o Visual Basic .NET. Como tal, no
abordaremos a C# ou qualquer outra linguagem .NET que no seja o Visual Bas ic. Mencionaremos a utilizao de bancos de dados, como o SQL Server, mas voc no precisar recorrer a livros sobre ele para obter detalhes completos sobre como configurar e gerenciar seu servidor de
banco de dados.
Tambm no pretendemos abordar todo o Visual Basic .NET neste livro. Essa uma linguagem
portentosa, com muitos recursos. Apenas para listar todos eles e a sintaxe usada para empreg-Ias, preci saramos facilmente de um livro deste tamanho. Discutiremos o Visual Basic .NET
com detalhes sufic ientes para que voc se torne produtivo ao us- lo e seja fornecido o conhecimento necessrio para que comece a projetar aplicativos que se beneficiem dos novos recursos
da plataforma .NET.
Requisitos
J que se trata de um livro sobre o Visual Basic .NET, o requisito mais premente um sistema
que execute o Visual Studio .NET, e que tenha no mnimo as especi ficaes bsicas a seguir:
o
Alm do Visual Studio, os exem plos deste livro requerem a possibi lidade de acesso a um servidor Web que esteja na mesma mquina do Visual Studio ou tenha o SDK do .NET Framework
instalado nela. O melhor a fazer se certificar de que sua mquina principal de desenvolvimento
tenha um servidor Web em execuo nela, como no Windows 2000 ou no Windows NT. Outro requisito bsico usado pelos exemplos na ltima metade deste livro O acesso a um banco de dados,
especificamente o SQL Server 7.0 ali 2000. Se voc no tiver o SQL Server, ento poder usar o
Microsoft Data Engine (MSDE), que funciona de maneira semelhante ao SQL Server completo.
Pode ser usado um banco de dados Access, se for esse o seu, mas ser preciso alterar alguns dos
exemplos nas lies de acesso a bancos de dados para faz-los funcionar sem o SQL Server.
XXIV
Copiar arquivos, imprimir, abrir arquivos no Bloco de notas e habil idades de edio bsica de texto
(recortar, cop iar, colar) so todas necessrias, e no sero explicadas nas li es. Saber como conectar sua mquina Internet e navegar em si les da Web tambm so habilidades exigidas .
saber como construir bancos de dados. Qualquer conhecimento efetivo nessas reas provavelmente ser til, mas nossos exemplos e explicaes foram elaborados para serem claros mesmo
para algum que nunca tenha tentado codificar antes .
o Site da Web
Este Iivro possui um site da Web associado a ele no endereo http: //www.makron.com.br . Localize a pgina do livro no site, digitando seu ttulo na caixa Pesquisa. Ao entrar na pgina do livro,
procure o link MATERIAL COMPLEMENTAR. Voc pode fazer o downJoad de todos os cdigos do livro e alguns Iinks ou materiais
complementares que achamos ser teis para o leitor com,
preender o Visual Studio .NET. E claro que totalmente possvel usar este livro e acompanhar
todos os exemplos, sem ser preciso visitar o site, mas em alguns dos exemp los mais longos, pode
ser melhor economizar algum esforo em digitao fazendo o download dos arquivos que contm os cdigos.
Introduo
xxv
Retorno
Trabalhamos duro para tornar este Iivro urna ferramenta til de aprendizado da plataforma .N ET
e uma aquisio valiosa para sua biblioteca de desenvolv imento. Se voc achar que deveramos
ter gasto mais ou menos tempo em algurn tpico especfico ou tiver sugestes para melhorar o livro, faa cantata conosco (c 1i entes@makron.com.br). Tentaremos incorpor-las em livros futuros e, se for o caso, na prxima reviso deste mesmo volume.
NOTA
As notas fornecem informaes teis em destaque, que voc pode ler imediatamente ou retornar a elas sem perder o fluxo do tpico que estiver examinando.
DICA
Os alertas de cuidado concentram sua ateno em problemas ou efeitos colaterais que podem ocorrer em situaes especificas.
Faa
Os q uadros FaaJNo Faa enfatizam prticas
boas que voc deve adotar ...
Novo TERMO
Os cones Novo Termo assinalam locais onde uma nova lenninologia foi usada e definida pela primeira vez. Essa terrninologia aparece destacada com uma fonte em itlico.
CDIGO
ANLISE
SEMANA
Viso Geral
Durante esta parte, voc aprender varias tpicos essenciais:
Configurao e uso do Visual Studio .NET para comear a escrever programas (Dia 2).
A sinta"e e as tcn icas de programao do Visual Basic para tipos de dados, procedimentos e variveis (Dia 3); o controle do fluxo dos programas
- laos e instrues condicionais (Dia 4); e o tratamento de erros (Dia 6).
Conceitos importantes relacionados ao desenvolvimento orientado a objetos com os quais voc trabalhar por todo o livro (Dia 7).
Esta parte importante. Ela define os fundam entos do conhecimento bsico nos
quais todos os outros conceitos de programao do Visual Bas ic .NET se basearo. O Dia I preparar voc para comear a explorar e aprender o Visual Basic,
por meio da introduo dos conceitos fundamentais de programao e da plataforma .NET, junto com um breve histrico do prprio Visual Basic. No Dia 2,
aprenderemos a usar o ambiente de desenvolvimento com todos os recursos do
Visual Studio para criar projetos .
Nos Dias 3 e 4, voc ir programar com muitas informaes sobre a sintaxe e
conceitos (incluindo variveis, laos, instrues i f e mais) que faro parte de todos os programas do Visual Basic escritos desse ponto em diante.
No Dia 5, voc conhecer todos os tipos diferentes de projeto que poder criar no
Visual Basic .NET e aprender a adapt-los arquitetura geral do sistema. Para
concluir, os Dias 6 c 7 retornam ao mundo prtico da codificao cm que aprenderemos a lidar com erros e a usar objetos em programas.
Esta parte fornecer as informaes de que voc precisa para prosseguir com a
leitura do livro, provendo todos os detalhes sobre os quais os outros captulos se
desenvolvero.
SEMANA
DIA
Bem-Vindo ao Visual Basic .NET
Hoje, o introduzirei no universo da programao do Visual Basic respondendo s perguntas
.
a segUI r:
O que .NET?
Nos dias de hoje, o computador j coisa trivial, e muitas pessoas que conheo passam o dia inteiro trabalhando com eles. Mas, mesmo assim, a pergunta mais comum : "O que um programador de computadores faz?" . Essa pergunta tem sido feita tantas vezes, que na lio de hoje,
usarei um pouco do tempo discorrendo sobre o que programar e por que voc gostaria de fazer
ISSO.
Compreendendo a Programao de
Computadores
Embora falemos com freqncia em computadores no que diz respeito ao hardware ( comum
ouvir comentrios como "Tenho um Pentium III com 600 MHze 256 MB de RAM", por exemplo), s isso no o bastante. A CPU (Central Processing Unit ou unidade central de processamento do com putador), por exemplo, pode realizar muitas tarefas importantes como clcu los
matemticos ou a transferncia de dados entre vrias partes do sistema. Sozinho, no entanto, no
capaz nem mesmo de ler um arquivo no disco rgido. Um programa de compulador um con-
Dia 1
junto de instrues para todos esses elementos de hardware, em geral escrito para execuo de
alguma tarefa que esse no poderia concluir sozinho. Todas as operaes bsicas que envolvem
o uso de unidades de disco, memria, monilare impressora so complexas. Um programa que tivesse de interagir com essas operaes gastaria a maior parte de seu tempo nelas, e s6 um pequeno percentual seria empregado em sua finalidade real. Escrito no hardware, um programa para
calcular os pagamentos de uma hipoteca provavelmente teria centenas ou mi lhares de linhas
para gerenciar a exibio e outras questes, e apenas algumas li nhas para fazer o clcul o. Assim
a programao era fei ta no passado, sem que fosse muito produtivo porque mu ito pouco tempo
podia ser gasto na finalidade real do aplicativo. O que se precisava era de alguma maneira pela
qual todos esses detalhes fossem manipulados para que os programas pudessem se dedicara suas
tarefas especficas.
1.1
O sistema operacional
se toma a iII/e/face
emre o equipamelllo
do computador e seu
programa. permitindo
que voc evile cdigos
especficos de
FIGURA
Iwrdll'lIrc.
Sistema Operacional
Drivers de Dispositivos
Drivers de Dispositivos
Componentes do Hardware
Com freqOnc ia, os relacionamentos no so definidos com muita clareza; um programa pode
precisar acessar o hardware diretamente (sem passar pelo sistema operacional) para usar um recurso dele ao qual o sistema operacional no d suporte ou para tentar melhorar o desempenho.
Isso decerto foi o que aconteceu, no incio, com um dos pri meiros sistemas operacionais de r es,
no qual muitos programas tinham de interagir diretamente com o hardware . Essas limitaes
significavam mais trabalho para as pessoas que quisessem escrever softwares para rcs, j que
cada programa precisava manipular suas prprias impressoras e outros detalhes. Ao mesmo tempo em que verses sucessivas dos sistemas operacionais forneciam um aumento na funcionali-
dade, se tomou mais fci l escrever programas para eles. Por fi m, o Windows substituiu esses
sistemas. Uma das maiores melhorias oferecidas pelo Windows que o sistema operacional
agora prov recursos de interface de usurio para outros programas. No Windows, se um programa de computador precisar mostrar uma caixa de dilogo na tela (como a da Figura 1.2), ele apenas solicita ao sistema operacional para exibi -Ia e fornece a mensagem que a acompanhar. Para
acessar toda a funciona l idade que o sistema operacional prov, um conj unlo de APls (Appl ical ion Programming Interfaces) disponibil izado. Essas AP ls representam a exposio de todos os
recursos do sistema operacional e podem, portanto, ser usadas em seus programas.
FIGURA 1.2
O Windows manipula a
~~ ...
exibitio de elementos
de GU!.s (Gl'aphicaf
UseI' Ime/faces.
daIo(J boxl
II '" II
o resultado de todas essas melhori as que cada programa tem de manipular cada vez menos
operaes genricas do computador e pode, portanto, se dedicar a sua fi nal idade real. O utro
grande beneficio da remoo de cdigos especficos de hardware dos apli cativos que, quando
ocorrem alteraes no hardware (impressoras e unidades novas de disco rgido, c r us mais velozes), o sistema operacional pode ser atuali zado para manipu lar o equ ipamento novo, mas os programas executados nesse computador no devem ser afetados.
O que isso signi fica para voc como programador do Visual Bas ic? Bem, significa que poder
criar programas de computador para reali zar uma tarefa espec fi ca sem ter de saber nada sobre
como o Windows desenha as figuras no monitor, emi te documentos na impressora ou salva arqu ivos no disco rgido. Voc se tornar produti vo rapidamente, com a ajuda deste livro.
Dia 1
possvel escrever programas usando di retamente esse cdigo nati vo, com a criao de um arquivo no disco rgido repleto de instrues, mas seria necessrio muito trabalho para produzir
at mesmo um programa mais simples. Para evitar todo esse esforo e permitir que os programadores se dediquem fina li dade de seus programas, linguagens de nvel superior foram criadas.
Essas linguagens permitem que voc use instrues mais avanadas e complexas que so, ento,
convertidas para as diversas instrues necessrias que sejam correspondentes s outras na linguagem de mquina. Uma nica linha de uma linguagem desse tipo provavelmente poderia se
transformar em dez instrues separadas na linguagem de mquina.
Novo
TERMO
Muitas dessas linguagens foram criadas com o passar dos anos. FORTRAN, COBOL, APL, Pascal , C e BAS IC so apenas alguns exemplos, mas centenas de li nguagens diferentes esto disponveis. Cada linguagem poss ui seu prprio conjunto de comandos e, com o tempo, novos
comandos so criados para simpl ificar ainda mais o esforo de programao. Assim como os
computadores evo luram progressivamente, o mesmo aconteceu s linguagens usadas para program- los, sendo adicionados novos recursos s existentes ou com a criao de novas linguagens como a Ctt (que, como voc deve ter adiv inhado, foi baseada na C) e a JA VA. Em geral,
os aprimoramentos nas linguagens tm o objetivo de aumentar a produtividade da programao,
permitindo que o desenvol vedor crie o programa desejado da maneira mais fcil possve l.
NOTA
FIGURA 1,3
Os compiladores
eOlll'erlem o
cdigo-fonle de
lillguagells de alIo nirel
em instrues qlle o
computador possa
compreender.
Compile
)
C------'-~
Encontre erros)
El(ecute
Enquanto as li ng uagens de programao evoluam, esse c iclo foi melhorando tambm, resul tando no desenvolv imento de compi ladores mais avanados e no conceito de um Ambiente Integrado de Desenvolvimento ( IDE, Integrated Development Environrn ent). A finalidade de um IDE
combinar os componentes de edio, depurao e compilao do desenvolv imento de softwares
em lima llnica interface para o programador (veja a Figura 1.4). Apesar da interface llnica, a tecnologia real muito semelhante. Na maiori a dos casos, o cdigo ainda compi lado (veja a Nota
a seguir para mais infonn aes) e o programador ainda cria arquivos de texto, mas o ambiente de
trabalho muito mais amigvel.
FIGURA 1,4
,
"'. . 01 .
.... """
r. ".c".. ,................,
.... . _""o U
... . .
Dia 1
ND T A
Alm das linguagens compiladas (em que o cdigo-fonte deve ser processado
em um compilador antes que possa ser executado), existe um outro tipo chamado linguagem interpretada. Nessas linguagens, o cd igo-fonte nao com pilado. Em vez disso, um programa especial executa o Cdigo lendo o fonte e
processando o que for apropriado. Em geral, j que a an lise (a leitura do fonte
procura de comandos) tem de ocorrer sempre que o programa executado,
as linguagens interpretadas so processadas mais lentamente do que as compiladas, nas quais a anlise s6 ocorre uma vez, na hora da compilao. O Visual
Basic j foi uma linguagem interpret ada, mas esse no mais o caso.
A criao de IDEs gerou alguma conruso entre quais seriam os seus recursos e os da linguagem
a ser usada. Isso rea lmente verdade no caso do Visual Basic, para o qual o IDE forn ece muitos
recursos que permitem ao programador criar com facilidade uma funcionalidade avanada.
Esses recursos quase sempre geram o cdigo do Visual Basic, e ele que executa o trabalho.
Nesse caso, o IDE que adiciona a funcionalidade, e no a linguagem, mas ambos so em geral
vistos como o mesmo elemento. Hoj e, quando for introduzido o conceito do Visual Studio .NET,
voc ver que um I DE pode dar suporte a muitas linguagens, e talvez seja importante compreender a diferena entre ele e sua linguagem subjacente .
Outro avano importante na histria das linguagens de programao foi a criao das linguagens
'visuais', como o Visual Basic. Essas linguagens so chamadas 'visuais' porque permitem a gerao de programas que usem um a interface grfica. O recurso mais comum desse tipo de linguagem a possibilidade de inserir botes, texto e outros itens em uma tela para constru ir uma
interface com o us urio (veja a Figura 1.5). Mais uma vez, na verdade, um cdigo real freqUentemente gerado, mas o programador tem um trabalho muito mais agradvel com a criao das
partes grficas de seu aplicativo. Abordarei a posio ocupada pelo Visual Basic como linguagem de programao um pouco mais ad iante na lio de hoje.
FIGURA
1.5
As jerramenlas I'isuais
de desellvolvimenlo
[dt"-~""'_ry-l'"
tJ ~
~
Sl -l;t
1iI"
... . . .
inlelfaces graflcamenle
e. elll segl/ida. ge/'e o
cdigo lIecessrio.
.... ,
Dia 1
deve, ento, ser distribudo para os usurios, com manuteno e aprimoramentos posteriores. Os
erros - problemas no s istema - devem ser corrigidos, e novos recursos adicionados.
FIGURA 1.6
Requisitos
Correo de Erros
e Manuteno
"-
Distribuio
Projeto
'\
./
Implementao
Esse ciclo a vida e o trabalho do desenvolvedor de softwares. Mas, para a maioria dos programadores, o molivo pelo qual programam pode ser definido em tennos mais simples: eles escrevem cdigos que fazem algo de ti l. A finalidade efetiva da programao fazer o hardware do
computador realizar tarefas prticas; isso que guia a maioria dos desenvolvedores de softwares. Meu co-autor eeu mantivemos esse conceito em mente portodo o livro e nos certi ficamos de
que quase todos os programas que mostramos executasse uma fu no de utilidade, alm de fornecer a experincia para o aprendizado. esse o objetivo real, criar aplicativos teis, que conduz
muitas pessoas ao Visual Bas ic,j que ele considerado por muitas delas como o caminho mais
rpido para passar da idia ao aplicativo.
11
face com o est ilo do Windows, de modo que ele no era mui to apropriado para codificao nesse
novo ambiente.
No entanto, a Microsoft apresento u um novo produto que combinava a linguagem popular e fcil
de aprender do BAS IC com um ambiente de desenvolvimento que permitia aos programadores
criar graficamente a interface com o us urio para um programa. Esse prod uto, como voc j deve
ter adivi nhado, era o Vis ual Basic 1.0. No incio, ele no fo i adotado, mas fornecia realmente um
ambiente veloz para o desenvolvimento de interfaces grficas com o usurio (GU ls). O que pode
ser uma s urpresa que o Vis ual Basic, na verdade, comeou com urna verso em DOS, embora
tenha s ido logo transferido para o Windows (veja a Figura 1.7).
FIGURA 1.7
"13
_ ............. _ ( _ 1
A primeira rerso do
//Iais
.. -
O Visual Basic cresceu em popularidade com o tempo. Um n ico recurso se mostrou essencial
para seu sucesso. Era a possibilidade de a Microsoft, o programador e outros fornecedores criarem componentes de interface personalizados que podiam ser ad icionados aos programas. As
empresas rapidamente entraram nesse mercado, desenvolvendo componentes que adicionavam
vrios recursos aos aplicativos do Visual Basic, como a gerao de grficos, ed io de imagens,
conexes com modems e muitos outros. Esses componentes permitiam que o programador do
Visual Basic criasse apli cativos mais avanados combinando vrios componentes com seu prprio cdigo. Isso aumentou mu ito o desenvolvimento rpido possibilitado pelo Visual Basic e
ajudou a torn-l o uma das linguagens mais populares de programao.
Toda verso atuali zada do Visual Basic adicionava novos recursos, o que o tornava cada vez
mais uma ferramenta de desenvolvimento completamente capacitada. Uma alterao importante, em particular, foi na maneira como o Visual Basic era processado no tempo de execuo. At
a verso 5 ser lanada em 1997, o Vis ual Basic era uma linguagem interpretada, o que resultava
em um desempenho relat ivamente fraco se comparado com o do Visual Ctt, Delphi e outras lin-
12
Dia 1
guagens compiladas. O Visual Basic 5.0 tomou possvel criar verses compiladas ou interpretadas de programas, e o desempenho melhorou de modo cons idervel.
Outra alterao essencial no Visual Basic foi a possibilidade de criar componentes. Em programao, encontra-se com freqU ncia um trecho de cdigo, como uma rotina de clculo de hipoteca, que poderia ser usado em muitos locais do programa e potencialmente at mesmo em vri os
programas di ferentes. O comparti lhamento desse cdigo dentro de um programa em geral conseguido escrevendo-o como um proced imento, um bloco de cd igo que digitado um a vez no
programa, mas pode ser chamado de qualquer local do aplical'ivo. O com partil hamento entre
programas pode ser feito apenas copiando-se o cdigo do procedimento em cada novo apl icativo
que for desenvolvido, mas isso gera um problema. Sempre que voc, ou outra pessoa, fi zer uma
alterao nesse bloco de cdigo (para corrigir um erro ou melhorar a maneira do cd igo funci onar), precisar copiar o cdigo para todos os apl icativos que o uti li zam.
Uma maneira de melhor compartilhar o cdigo criar uma biblioteca de cdigos armazenada em
um arquivo separado dos programas que o utili zam e que possa ser alterado de modo independente . Essa biblioteca conhec ida como componente e criada quase sempre na forma de um arquivo .d l!. Usar uma biblioteca o mtodo preferido de com partil har cdigos. No decorrer do
desenvolvimento de novas verses do Vi sual Basic, sua capacidade de criar esses componentes
foi avanando regularmente. A verso 4.0 (lanada em 1996) foi a primeira a perm itir a criao
de componentes, e hoje esse um recurso extremamente essenci al em projetos de desenvo lvimento. Disc utiremos os componentes com mai s deta lhes no Dia 14, "Introduo Programao
Orientada a Objetos".
Muitos recursos complementares foram adicionados ao Visual Basic, mas tudo foi construdo
em ci ma da base ex istente. Isso no raro. A maioria das ferramentas de desenvolvimento progride dessa maneira, contudo h o efeito colateral de acum ular lixo. As verses novas de uma
ferramenta tentam manter a compat ibil idade com todos os aspectos muito pouco efi cazes das anteriores. Reescrever uma linguagem a partir do zero quase impensvel. O trabalho necessrio
poderia ser enonne, e romper a compatibilidade com o cdigo j existente para o usurio pode
no ser bem aceito. O benefcio de uma mudana dessas seria lima impl ementao nova e limpa
por completo, que poderi a manter o que fosse bom e desc311ar as partes invl idas da linguagem
anterior.
Isso foi exatamentc o que a Microsoft fez na passagem do Visual Basic 6.0 para o Visual Basic
.NET. Ela reescreveu a linguagem para criar uma verso li mpa que eliminasse o lixo que se acumulou por uma dcada de atuali zaes sucessivas. Isso sign ifi ca lima curva de aprendi zado severa para as pessoas que tinham experincia na verso anter ior da linguagem, mas o resultado
fi nal vale o esforo. A alterao rad ical faz com que este seja um grande momento para ser iniciante no Visual Basic, j que os concei tos ensinados neste livro tero uma vida til muito mais longa
do que aquilo que se aprenderia com um material relacionado verso anterior.
H muitos benefcios nessa mudana, todos eles foram esti muladores dessa dec iso, mas a motivao mai s significat iva foi a necessidade de adaptao ao novo amb iente .NET. No decorrer
13
desta lio, voc aprender mai s sobre a plataforma .NET, o que e como o Visual Basic se enquadra nela.
o Que .NET?
primeira vista, .NET pode parecer apenas um conceito de marketing, uma maneira de evitar
mais um nmero aps Visual Basic, mas muito mais que isso . .NET representa toda uma gama de
tecnologias e conceitos que formam uma plataforma na qual voc pode desenvolver apl icativos.
NOTA
No incio desta Iio, expliquei como o sistema operacional fornece um nvel de funciona lidade
bsica aos aplicativos (como a possibilidade de ler arquivos de um disco rgido ou disquete). A
platafonna .NET pode ser explicada de maneira semelhante; ela uma camada que existe abaixo
de seus programas e fornece um conjunto de servios e funes bsicas. Essacamada contm um
grupo de apl icativos e sistemas operacionais chamado servidores .NET; um conjunto bsico de
objetos chamado .NET Framework; e um conj unto de servios que d suporte a todas as linguagens .NET chamado Common Language Runlime (CLR). Cada uma dessas partes da plataforma
.NET (veja a Figura 1.8) ser abordada individualmente.
FIGURA 1.8
.NET Framework
Servidores .NET
Windows, BizTalk, Exchange, SQL, App Center.
Dispositivos .NET
Componentes de Hardware
14
Dia 1
Servidores .NET
tos so conhecidos como .NET Enterprise Servers. Eles roram projetados para substitu ir os
recursos de back-end necessrios ao sistema distribudo. Esses produtos incluem:
Um mecanismo de transfonnao de dados com base em XML (falarei mais sobre a XML
no Dia 20), chamado Microsoft BizTalk Server
Um serv idor para o acesso a sistemas legados, como o AS/400s, chamado Host lntegration Server
E mais ...
Juntos, esses servi dores fornecero os servios bsicos a seus apli cat ivos .NET , formando o alicerce dos sistemas. Este livro se referiraeles a lgumas vezes, mostrando onde podem ser usados
em seus sistemas .
.NET Framework
Na passagem para o Visual Basic .NET muitas coisas foram rad icalmente alteradas; uma delas
foi o desenvolvimento de uma nova base para todas as ferramentas .NET de desenvolvimento.
Essa base, conhecida como .NET Framework, fornece dois itens essenciais: o ambiente principal de tempo de execuo e um conjunto de classes bsicas. O ambiente de tempo de execuo
seme lhante ao sistema operacional por proporc ionar uma camada entre seu programa e as complexidades do resto do sistema, exec utando servios para seu aplicativo e simpl ificando o acesso
aos recursos das camadas inferiores. As classes bsicas forn ecem um vasto conjunto de recursos,
empacotando e definindo essas tecnologias como protocolos da Internet, acesso a sistemas de arquivos, manipulao de XML e mais.
O verdadeiro poder dessa estrutura ser exp lorado com mais detalhes no Dia 8, " Introduo ao
.NET Framework". Por enquanto, s temos de entender que o .NET Framework em mu itos aspectos semelhante ao sistema operacional e que fornece seu prprio conjunto de APl s a fim de
facili tar aos programadores o aproveitamento de seus recursos. A Figura 1.9 il ustra o relacionamento do Framework com o seu cdigo e com os serv ios subjacentes do sistema operacional.
1.9
O .NET Framework
fornece oulra camada
de abslrao sobre o
sistema operaciollal.
eX(l/amellte como esse
faz para o hardware
do eompUfado/'.
FIGURA
15
.NET Fremework
Sistema Operacional
Componentes de Hardware
Servios .NET
A platafonna .NET inclui certos conceitos que se estendem alm dos detalhes de programao
para descrever como os sistemas devem ser desenvolvidos e podem interagir. Um desses conceitos essenciais a idia de servios da Web, recurso distribudo de uma maneira consistente de
modo que s ua execuo fique totalmente confinada em seu ambiente. Um exemplo desse tipo de
servio pode ser uma folha de pagamentos, para a qual uma empresa possui servidores e aplicativos em sua prpria organizao que podem man ipul-Ia. A empresa fornece esse servio para
outras por meio de um servio da Web (veja a Figura 1.1 0). Isso diferente de apenas di sponibilizar um site da Web; uma interface que outros aplicativos ou sites da Web podem acessar atravs de cdigo.
16
Dia 1
FIGURA 1.10
Um servio da lVeb
permite que (IS
empresas forneam
servios com base em
software pela IlIIemel e
que O/III"OS aplica/ivos
el oll siles
da Web os IIlili:em.
Servidores do
Aplicativo. Cliente,
Grande QUlntidade
de Servios Dispon(Yeis
Servidores Web
=
O. servios Web podem ser e><l>O$lo, a partir de
qualquer sislema operacional" criados com qualquer
Usu6,los Remoto.
Essa tecnologia pode ser usada de varias maneiras, mas o conceito de servios da Web consiste
em que h certos serv ios bsicos ou fundamentais de que muitos ap licativos precisam, como
autenticao, organizao de calendrio, env io de mensagens (correio eletrnico) e outros. Se
esses tipos de recursos forem servios da Web, qualquer pessoa no mundo poder se benel1ciar
deles para reduzir o tempo de desenvolv imento de seu prprio sistema. A Microsoft, corno part icipante da iniciativa. NET, est fornecendo alguns desses servios para autenticao (conhecido
corno Microsoft Passport, www.passport.com), envio de mensagens (hotmai l, www.hotmail . com)
e outros.
Posteriormente, no Dia 21, "Criando Servios Web com o Visual Basic .NET", forneceremos
urna introduo apropriada aos servios da Web e nos aprofundaremos em corno voc pode
us-los em seus aplicativos.
Dispositivos .NET
Atualmente, h uma grande vari edade de sistemas que podem ser usados para se conseguir acesso Internet, rede de sua empresa ou a suas informaes pessoais. Sendo eles PCs completos,
terminais da Internet com base em TVs, simples cl ientes ou Personal Digital Assistants (PDAs);
todos so possveis dispositivos utilizados pelo usurio para acessar um aplicativo .NET. Essa
tendncia direcionada a vrios disposit ivos forar voc, como programador, a esquecer o
padro geral de um nico tipo de cliente, em geral um PC, e a considerar, em vez disso, que um cliente poderia estar se conectando por meio de um entre muitos dispositivos possveis. Esses podem
ser classi ficados como dispositivos .NET - uma combinao de recursos de hardware e software
projetados para funcionar com os servios e aplicativos com base na platafonna .NET. Hoje, a
variedade de dispositivos .NET disponveis inclui computadores que executam o Windows
(Windows 9x, Millennium Edition e Windows 2000 com o .NET Framework instalado) e dispositivos que executam o Windows CE. (O .NET Framework compacto est disponvel para essa
plataforma, permitindo o suporte aos recursos .NET.) Haver um crescimento contnuo nessa
rea.
No se preocupe se ainda houver partes da plataforma .NET que parecem confusas: elas precisam ser! Durante os dias restantes, as lies deste livro explicaro mais detalhes que ajudaro a
esclarecer tudo. Por enquanto, lem bre-se do relacionamento entre a plataforma .NET e seus programas - uma camada de funcionalidade que j fornecida e fci l de acessar pelo seu cdigo.
Com esse conceito em mente e sabendo que o resultado fina l um desenvolvimento mais rpido
na passagem da idia para o programa conc ludo, voc ter aprend ido bastante sobre a pl ataforma .NET nesta lio.
E hora de escrever seu primeiro trecho de cd igo do Visua l Basic .NET. Antes de continuar com
este exemp lo, e os do resto do li vro, voc deve ter o Visual Basic .NET instalado. Nesta seo,
exp lorarei o processo de instalao do Visual Basic ou do Visual Studio (incluindo o Visual Basic) em seu computador. Se j o tiver instalado, v para a seo "Onde Est meu IDE?".
Dia 1
instalao do WCU depende do sistema, porque apenas os itens que ainda no foram atualizados
o sero. Algumas das instalaes possveis so a do Windows 2000 Service Pack 2, do MOAC
2.7 (componentes atualizados de acesso a dados) e do Internet Explorer 6.0. Um item que ser
instalado na maioria dos sistemas o prprio .NET Framework, que no inclui o IDE do Visua l
Sludio .NET, mas fornece todas as classes e arquivos de suporte do Framework necessrios
execuo dos aplicativos .NET. Dependendo de que componentes forem precisos, o programa
de instalao pode ter de rein icia lizar seu computador uma ou mais vezes. Quando essa instalao estiver concluda, voc retornar primeira caixa de dilogo de instalao, como mostra a
Figura 1.11.
FIGURA 1.11
O processo de
ills/(lla(io do Visual
SllIdio .NET dividido
em Irs ela{Jas.
D um c lique na etapa 2 para iniciar a prxima parte da instalao do Visual Studio .NET. Voc
ser solicitado a inserir a chave do produto e ace itar ou no o Contrato de Licena de Usurio Final (EU LA , End User License Agreement) antes que a instalao principal possa ser iniciada.
Depois que as informaes so licitadas forem fornecidas e o EU LA aceito, surgir uma tela com
vrias opes em que podcro ser selec ionados os elementos do Visual Studio .NET que voc
deseja insta lar (veja a Figura 1. 12).
A Figura 1. 12 foi baseada no Visual Studio .NET Beta 2 e algumas das opes podem se alterar,
mas no geral voc deve ver a mesma lista. Se est iver planejando programar grande parte no
Visual Basic .N ET, sugiro a seleo das mesmas opes que podemos ver na Figura 1.12. A primeira escolha digna de nota foi a seleo do Visual Basic e do Visual C# na opo das linguagens. O Visual C# no necessrio, mas veremos que mu itos exemplos de cdigo estaro
disponveis nessa linguagem, e mais provvel que faamos testes com a C# do que com a C++.
Tambm possvel selecionar o Visual C++, mas s aconse lhvel faz-lo se ho uver realmente a pretenso de us-l o j que e le ocupa mais espao em disco do q ue qualquer das outras Ii11guagens.
19
FIGURA 1.12
compol/emes do Visual
II
SlIIdio .N ET deseja
il/slGlar.
Cj .... _ _ ... -
.. ,,_.,_
Iil.v _ _ _ """"",--",
i/l.~ _""'_'_"
..
. ... .
_._.....
-..-_~ I
_o.w, ...
Iil~
___
,~_
..... ",
. .......... I'u.)
.Iil:._. .......
'w"' ,,..
.Iil,,""'" __.. . _
Iil:'_ '
. Iil~ , _
.__ ...
h ....... _
."
"' LI________________-'!~
...,_.......
'"""" Nr
A seguir, cert ifiq ue-se de que marcou todas as opes disponveis em Enterprise Tools, Server
Components e Toais for Redistributi ng Apps. No explicarei o que essas opes contm, mas
marc- Ias assegurar que voc tenha todos os recursos disponveis em sua verso do Visual Studia (verses d istintas do Visual Studio possuem conjuntos diferen tes de opes de recursos).
Para conc luir, selecione MSON e mantenha a configurao-padro Run from source, que solic ita acesso a seu CD, OVO ou local de instalao na rede, ou se tiver bastante espao em disco, altere para a instalao em um cam inho espec fico (vej a a Figura 1.13). Executara MSON do loca l
de instalao mais lento do que t-lo em sua mqu ina local, mas a deciso cm geral baseada
no espao d isponve l em disco em vez de na velocidade.
FIGURA 1.13
As bibliotecas MSDN.
que cOI//m mui/os
dOCl/mall/os a anigos
teis. podendo os
exemplos ser inslO!ados
---_
_._(1 ....... _ _
.
.
...
"" ..
........... ,,"'" ,.
-"... ............ ,... _.
.....
' """"'"'"'
""' ,, @ .
.....
oblenl1ll mais
velocidade.
_ _ 1'....,
, . ., . . H " . .
20
Dia 1
Depois que voc fi zer Iodas as suas escol has, d um clique no link Instai! Nowl na parte inferior
da caixa de d ilogo para iniciar a instalao . Vrios trechos de texto que descrevem os recursos
da plataforma .NET sero exibidos enquanto a instalao progride, encerrando por fim com uma
tela de trmino (veja a Figura 1. 14). Se algo der errado durante a instalao, ser ex ibido nessa
tela.
FIGURA 1.14
duranle a il/oSla/arao,
voc ser iIIfo rmado do
pr oblema neSla feIa.
Setup is complete.
':::~ ::;::.::':::~
_~_HE'f~_~ . _
l_
o .... . . . -
Por fim, quando voc ti ver retornado tela inicial da instalao, a terceira opo estar disponvel. Dar um clique nessa opo, Service Releases, o conduzir outra caixa de dilogo (veja a
Figura 1.15), em que podero ser selecionadas as atualizaes da instalao pela Web ou pelo
di sco. Se houver conectividade com a Internet, recomendo escolher a primei ra opo para assegurar a obteno da lista mais recente de at uali zaes.
FIGURA 1.15
O programa de
ills/{{Iatio do Visual
8tudl0 .NET pode fazer
o dOlvl/load e instalar
atuali:aes pela
Internet.
"'0
OIOOM ... _ ' ' ' ' ' ' _ ' ' ..... s-c.Pod."'" ..... ",.
......
_ 1"'_ ... ""_ .. _ ......... ...
s...... P", .... ......
_~
"0.. ,mo.oo."
[a",.,
21 [
Agora o Visual Studio .NET est instalado e deve estar pronto para ser executado, portanto, voc
pode passar para a prxima seo em que comear a escrever alguns cdigos.
TERMO
A expresso programa "Helio lVorld! " ou "Ol Mundo! " descreve o exemplo de
um programa que no faz nada de til, ou mais espec ificamente, nada mais til do
que apenas exibir a mensagem solicitada.
Voc vai comear com um programa que poder executar da linha de comando e que retornar
um texto peq ueno. Em seguida, mostrarei como esse programa ilustra quase tudo que prec iso
saber para desenvolver um utilitrio proveitoso que exiba informaes sobre a verso de seu sistema operacional (por exemplo, no lanamento do Windows 2000 houve uma verso n
5.00.2195). Isso pode ou no ser til como um utilitrio de linha de comando, mas demonstra o
conceito bsico de sua criao.
22
Dia 1
Escrevendo o Cdigo
J que voc comear em um editor de texto (corno o Bloco de notas) em vez de no IDE, nada
ser feito de modo automtico, e o arqu ivo a princpio estar vazio. Isso significa que ser preciso configurar a estrutura bsica de seu programa antes de comear a escrever um cdigo que seja
compilado corretamente. Para iniciar, crie um arquivo novo de texto em algum local de seu computador; para os exemplos deste livro, crie um diretrio em seu computador chamado
C: \ TYVB\Cl \ . Para gerar o novo arquivo de texto, d um clique com o boto direito do mouse na
pasta apropriada e selecione New (Novo) e Text Document (Documento de texto) (veja a Figura
1.16). 'sso criar um arquivo de texto com extenso txt. Renomeie esse arquivo para que indique seu contedo final alterando para Stepl. vb .
,
,
FIGURA 1 ,16
O menu de ala/IIo do
Explorer fomecer (l
l'oc lima maneira
direla de criar
.~ .
~"'
III/I
(1l"(llIil'O de lexlo e
muilOS Olllros
documelllos.
_...
0 .~
9><>"'"
~_<MO
fl _
...
~---_
@ .... _.-.~
I!il -- _"''''''''l
~w
_ _
Com o arquivo renomeado e no diretrio correto, voc poder dar prosseguimento e comear a
configurar seu cd igo efetivo. Abra o arquivo no Bloco de notas dando um clique nele com o boto direito do mouse e selecionando Abrir com. Isso abrir uma caixa de dilogo por meio da
qual ser poss vel selecionar o Bloco de notas ou outro editor de texto (o Word Pad , por exemplo). Depois de ter selecionado um programa, d um clique em OK, e o arquivo ser aberto. No
deve haver nada nele neste momento; voc ter de adicionar tudo que o far func ionar.
23
ra bsica de um programa do Visual Basic .NET; digite-o na janela de seu Bloco de notas e, em
seguida, salve-o como Step1.vb.
Public Class Stepl
Shared Sub Main()
End Sub
End C1 ass
Ao tentar salvar seu cd igo como Stepl. vb, voc pode acabar com alguns resultados estranhos. Por causa da tendncia do Bloco de notas de criar arquivos
de text o e dependendo das con figuraes de seu sistema com relao s extenses, pode terminar com um arquivo chamado stepl. vb. txt em seu disco
rgido . Para evitar isso, certifique-se de ter desmarcado a opo Ocultar extenses de tipos de arquivo conhecidos (guia Modo de exibio em Opes de
pasta no menu Ferramentas do Windows Explorer) .
A seguir, inicie um promptdecomandodo programa Visual Studio .NETTools, como na Figura 1.17.
FIGURA 1.17
..;;;..
Seleciollor o prolllpl de
comal/do do Visual
SllIdio .NET a melhor
mal/eira de (rabalhal'
COIII
*:
..*_0
\
'"'=\""'"
,"'-',
...........
,.. =',.....
a plataforma .NET
--- .
_
..... J C l c - . . J _
-*
E essencial que voc use essa opo para acessar a linha de comando, porque s atravs dela ser
possvel conseguir que o(s) caminho(s) correto(s) seja(m) configurado(s) para executar ferramentas .NET como o compilador do Visual Basi c (vbc.exe). Se quiser empregar uma linha de
comando habitual , ter de adicionar a configurao do caminho apropriado (execute uma pesquisa em vbc.exe para encontrar o diretrio que precisa estar em se u caminho) sua mquina.
Isso apresentar um console de comando (como mostra a Figura 1.(8). Desse local, navegue
para o diretrio que contm seu arquivo Step I.vb. Agora voc pode compilar seu programa,
24
Dia 1
criando um executvel, mas adie um pouco mais adicionando uma etapa complementar antes da
compilao.
FIGURA 1.18
O /ISO do eompi/ador
de linha de comal/do
feilo por meio do
console (011 do prompl
do MS-DOS. como
jreqiielllclllellle
chamado).
No prompt de comando, digite vbc e pressione Enter. Voc deve ver este resultado
RESULTADO
seguido por uma grande quantidade de in formaes de ajuda sobre o liSO do compilador do Visual Basic. Se isso func ionar, voc ter confirmado vrios itens:
Ao testar primeiro o vbc automat icamente, voc poder eliminlo corno fonte de qualquer pro
blema que encontrar ao tentar compi lar um programa efetivo. Continuando esse raciocnio, ago
ra podemos compilar seu programa salvo, Step1.vb, inserindo um comando do vbc, Step1.vb
jt:exe e, em seguida, pressionando Enter. Se tudo der certo, deve aparecer este resultado:
A chamada ao vbe pode aceitar lima grande variedade de parmetros opcionais (comandos complementares adicionados linha de comando, em geral separados por barras [IJ), como voc
pode ver na execuo automtica do vbe. No entanto, nesse caso, s foram usados dois. Com o
fornecimento do nome do arquivo-fonte , s tepl. vb, foi informado ao vbe que arqu ivo compi lar.
A segunda opo para I t (que significa ' destino' e tambm pode ser digitado como Itarget)
pode ser um programa winexe, exe, uma biblioteca ou um mdulo. Todas essas opes sero
abordadas depois, mas, por enquanto, s as duas primeiras so particularmente relevantes; winexe cria um ap licativo do Windows e exe, uma linha de comando ou apl icativo do console (que
nosso objetivo). Por padro, quando vbe fo r executado, ele usar It :exe.
26
COOIGol
RESULTADO
Dia 1
C: \TYVB \Cl>step2
Eaqui que entraro as informaes sobre a verso do sistema operacional!
outro rec urso que ele fornece, o acesso aos dados sobre o sistema operac ional at ual, como o Windows 2000. Essas informaes so disponibi lizadas pelo mesmo objeto Syslem , mas em vez de
usar Syslem.Console, empregaremos Syslem.EI/\Jironmenl.OSVersioll. Altere o cdigo de
Slep2.vb para que tenha a aparncia do descrito abaixo e, ento, salve o arquivo como Step3 . vb.
Imports Sys tem
Public Class Step3
Shared Sub Main{)
System.Console.WriteLi ne{ System.Environment.OSVersion.ToString{))
End Sub
End Cl ass
A compi lao do cdigo vbc step3. vb It :exe no ser diferente do que foi fei to nos dois exemplos anteriores. Essa compilao produzi r um programa executvel com o nome step3 .exe.
Executar esse programa exe, digitando Step3 En t er na janela aberta da linha de comando, gerar
o resultado a seguir:
C: \ T V \ C1 step3
Microsoft Windows NT 5. 0.2195 . 0
Observe que o resultado indica um computador Windows 2000 (NT 5.0); outros resultados sero
gerados para com putadores diferentes. Agora voc tem um pequeno programa exe que retornar
a verso do sistema operacional , decerto ele ser til pe lo menos para admini stradores de rede. O
aplicativo cham ado de s tep3 .exe, mas seu nome pode ser fac il mente alterado para algo mais
prximo de sua final idade real.
executveis com o mesmo nome do arquivo-fonte , mas h muitas opes complementares disponveis como parte desse comando. Aq ui esto alguns parmetros de linha de comando que podem ser mais teis quando comearmos a fazer testes com o Visual Basic .NET:
Itarget :<wi nexe, exe, 1i brary, ou modul e> (pode ser chamado como It) especifica que
tipo de resu ltado deve ser criado pelo compilador. A opo wi nexe cria um apl icat ivo do
Windows. A opo exe, usada em nossos exemplos, gera um aplicativo do console ou de
linha de comando e o padro se nenhum parmetro It for empregado . As duas outras
opes, 1 i brary e modul e, so util izadas na criao de resultados que no possam ser usadas di retamente, mas que estejam destinadas a fazer parte de outro aplicativo. Voc
aprender mais sobre todos esses tipos de sada nos dias posteriores.
Ihel p (ou I?) eq uivalente a executar o vbc sem opes : em q ualquer das duas fo rmas, o
resultado ser uma listagem deta lhada de lodos os parmetros disponveis.
Resumo
Nesta lio abordamos um pouco do histrico da programao, o Visual Basic e a plataforma
.NET antes de cri ar um programa pequeno. Agora, voc est pronto para passar ao aprendizado
da linguagem propriamente dita e escrever programas mais complexos. O Visual Bas ic uma
das linguagens de programao mais popu lares do mundo, e j cobrimos um d ia na direo que
conduz ao seu domnio.
P&R
P Por que o Visual Basic .NET to diferente das verses unteriores do Visu;,1 Ba sic?
R O Visual Basic tem evoludo com o tempo. Cada verso tem sido muito semelhante anterior, mas, em certos pontos, uma reviso maior como a da plataforma .NET era necessria para assegurar que a li nguagem acompanhasse o utras alteraes da indstria, como
a Internet e a computao distribuda.
P Ouvi falar sobre outra lin guagem .NET, a C#. Devo aprend-Ia em vez do Visual
Basic .Net ou estudar as duas?
28
Dia 1
R A C# umatima linguagem nova, uma maneira mais simples e fci l de usar aC++, mas
no, voc no tem de aprend-la. Todas as linguagens .NET so ig uais em termos de suas
capacidades; se voc puder criar um certo tipo de apl icativo em C#, poder faz- lo no Vi,
suai Basic .NET. E possivel que as pessoas achem que muitos exemplos da Microsoft
aparecero em C#, apenas porque uma linguagem que tanto os programadores do Visual Basic quanto da C++ acham relativamente fcil de ler.
Workshop
o Workshop foi planejado para ajud-lo a antecipar possveis dvidas, revisara quej aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste eslo
Teste
I. Qual produto da Microsoft foi o predecessor do Visual Basic?
2. Por que todas as linguagens .NET (Visual Basic, C# e outras) compart il ham certos recursos com uns (o .NET Framework, mtodos de criao e uso de objetos e mais)?
3. Como se denomina o processo de converter o cd igo-fonte (seus programas) em cdigo
nati vo de mquina (como um arquivo exe)?
4. Considere o cdigo a seguir:
Public Class MyClass
Shared Sub Main{)
End Sub
End C1 ass
Se esse cdigo fosse sal vo em um arquivo chamado MySourceCode . lIb e, em seguida. fosse executado o comando vbc jt:exe MySourceCode.llb, que arquivo seria criado?
Exerccios
I. Nos exemplos desta lio, voc no especificou um nome para o arquivo de resultado
quando compilou, o que fez com que o compilador usasse o nome do arquivo-fonte como
padro. Recompile s tep3. vb, definindo um nome para o arquivo de resultado igual a
WhatOS.exe.
2. Para obter informaes sobre a verso, voc empregou o objeto System. Envi ronment,
que possui vrias outras propriedades teis. Use a documentao de ajuda que est instalada no Visual Basic (veja a seo "Preparando-se para Codificar" ) para saber o que
mais est dispon ve l e, em seguida, crie outro programa para ex ibir uma ou mais dessas
propriedades complementares.
SEMANA 1
DIA
Trabalhando com o Visual Basic
.NET
No Dia I, " Bem- Vindo ao Visual Basic .NET" , voc aprendeu algumas informaes gerai s sobre programao, Visual Basic e plataforma .NET, que lhe forneceram o conheci mento necessrio para comear a desenvolver aplicativos. Nesta lio criaremos um aplicativo Windows real
por meio do Visual Basic e, no processo, abordaremos os tpicos a seguir:
Comearei com uma viso geral do IDE do Visual Studio (VS). Os IDEs foram abordados na lio anterior (Dia I), mas incluirei urna reviso rpida sobre seu sign ificado e finalidade.
Dia 2
IDE. Mesmo as tarefas simples de edio e compilao de seu cdigo sero muito simplificadas
pelo IDE do Visual Studio que fornece muitas possibilidades complementares que apenas no
existi riam sem ele.
Iniciando
Antes que voc possa usar o IDE do Visual Studio, ele deve ser instalado em sua mquina. O
processo usado para faze r isso foi detalhado na lio de ontem, portanto, leia esta seo se precisar conc luir a instalao antes de continuar.
Configuraes do Perfil
O prime iro item que voc ver quando iniciar o Visual Studio .NET ser uma interface parec ida
com uma pgina da Web (que foi chamada de Visual Studio Home Page) so li citando a confirmao das configuraes de seu perfil. O conceito de perfil novo nesta verso do Visual Studio,
uma variao da idia de preferncias do usuri o que prov a capacidade de configurar muitas
opes diferentes em um nico perfil. As opes bs icas fornec idas foram projetadas para fac ilitar sua transio para este ambiente dependendo de sua experinc ia part icu lar. Essa d isponib il idade de padres me levou a escolher rapidamente as configuraes mostradas na Figura 2.1. No
entanto, depois de algumas horas de LISO, as alterei para algo um pouco diferente de qualquer dos
perfis-padro. provvel que voc faa o mesmo.
Por enquanto, selecione o perfi I Visual Basic Developer, e depois voc poder voltar caixa de
dilogo para alterar essas configuraes se desejar. D um clique em Get Started para sai r da pgina de configuraes de perfil. O que apareceu agora considerada a rea principal de trabalho
do IDE do Visual Sludio, uma localizao geral que contm contedo de vrios tipos, como o cdigo ed itado ou as pginas da Web projetadas. Ela tambm inc lui um navegador da Web interno,
que aberto por padro; ele usado para mostrar uma interface para o Visual Studio com jeito de
Web.
Na Home Page (veja a Figura 2.2), voc encontrar vrias opes teis. A primeira, Get Started,
a pgina q ue ser mostrada sempre que o Visual Studio for aberto. Projetada como uma preparao in icial para seu trabal ho, essa pgina fornece tanto uma lista dos projetos recentemente
abertos quanto um link para a criao de um novo, permiti ndo que sed prosseguimento com um
s imples clique cm algum local dela. Por hora, selecionaremos uma das opes de navegao que
se encontram no lado esquerdo da pgina.
2.1
O IDE do Visual Sludio
NET pode ser
personali::ado para
lornar mais fcil a
Iransir/o por meio de
oulras jerramelllas de
dese IIvolvimelllo.
inc/uindo a l'erso
al/ferior do Visual
8asic,
FIGURA
31
"QEI
.-
~--------
( ....... s-.....
I"',..' ,"'.
... ,ou<,
... ,...,
CJ
CJ
CJ
j(.. .....j
..... H.,.,
a' .......'
2.2
A pgilla il/iciol
jomecida pelo Visual
Sludio disponibiliza
1IfI/O visualizao
fUllciol/al dos projetos
que voc abriu
recentemente, alm do
acesso a I'rias fontes
de informao.
FIGURA
~t.
__ _
e.,'
,,_._,.
..
til""'"
~."",
t.vd<f, ......., . _
o.,....,... I
~,
J...
......
"''''
...
Detalhes dos novos recursos do Visual Stud io .NET. What' s New (O Que H de Novo)
est vinculada a vrios recursos on-li ne como newsgroups (Online Communi ty)
Uma pgina de notcias ao vivo sobre o Visual Studio e outros tpicos relacionados a desenvolvedores (Head lines, veja a Figura 23)
32
Dia 2
Um lin k de retomo pgina de seleo de perfis que apresentada por padro na primeira
execuo do IDE (My Profile)
Todos esses recursos esto disponveis para o desenvolvedor do Visual Studio, o que torna essa
pgina in icial um bom ponto de partida para muitas pessoas. No entanto, se voc quiser adicionar algo a essas opes ou substit uir por completo o conjunto de pginas, a fonte integral da pgina padro est dispon vel em \Program Fi 1es\Mi crosoft Vi sual Studio . NET\HTML. Porm, a
vai um aviso - as pginas-padro no so simples, e seria Fcil danific-Ias sem que possam ser
reparadas. Faa uma cpia do d irelrio como backup antes de comear a personali zar !
FIGURA 2.3
!.fo tdI. _
IIIformaes relel'OlIles
1.... _
para programadores do
Visual 8asic .NET
podem com freqiincia
ser e nconlradas 110 sile
da lVeb
msdn.Microsoft. com.
qlle realado
alllomalicamenle em
sees da pgina
inicial do Visual
Sllfdio.
0 ... _
~,~
""cWTd "."""
,_~ ~
c_
PKtK"""" .....
_
>001
...... _,,"" ....."c_.. c""" ... _ _ o .... _
Objecl Browser
Cornrnand/Immediate
Task List
Class View
Server Explorer
H oulras janelas que abordarei q uando se tornarem irnp0l1anles, mais adiante no livro.
33
Encaixando/Desencaixando
No perfil Visual Basic Developer, tanto o Solution Exp lorer quanto Properties fi cam alinhados
no lado di reito da tela do Visual Studio, e Toolbox fi ca no lado esquerdo (veja a Fig ura 2.4). O
posicionamento de uma j anela rente outra rea descrito como encaixar essa j anela. Quando
est encaixada, ajanela bloqueada por essa rea em um ou dois lados (dois lados, se estiver encai xada em um canto). Todas as janelas de ferramentas do Visual Stlldio .NET podem ser encaixadas e no h limite para as margens nas quais possvel alinh-Ias .
FIGURA 2 .4
._
~
too _
f~'..
I'Ir;J1:!
__
'."'."'""_ "'.'(1
'14d ~. '~,.,.' o.
... ....
"t" ...
,o.o<ud
"
" Ou_'''' _.
_
."" "
'D<l "
.. .. ..... _u
,
Para mover uma jane la encaixada para outra rea da tela, deve-se dar um clique e manter pressionado o boto do mouse na barra de ttulo da janela de ferramentas e, em seguida, arrast-la para a
34
Dia 2
nova posio. Enquanto ela estiver sendo arrastada, um contorno aparecer na tela para mostrar
onde a janela seria posicionada se voc soltasse o boto do mouse. Para encaixar a janela em outro lado do IDE, apenas arraste-a para uma borda dele, mantendo o boto do rn ause pressionado
e soltando-o quando o contorno da jane la mostrar o resultado desejado. No trajeto, pode-se ter a
impresso de que o contorno no foi encaixado em nenhuma parte do IDE (veja a Figura 2.5) .
FIGURA 2 .5
O comQmo de lili/a
janda q/le e.slij sendo
arrastada se altera
para indicar o que
ocorreria se voc
parasse de arrast-Ia
cm 11111 IlIgar espec ffico.
..tl!3
, , ..... "..
.....,,,.,
..,.,.."
,- .
tIO'" , .... ,
'h.~
~,
H,O.,
.....
~. '
...............
Se voc deixasse ajanela de ferramentas nesse ponto, ela ficar ia ' desencaixada' , o que tambm
conhecido como jane lajlutuallle (vej a a Figura 2.6), pos io na qual ela no estaria mais fixada a
nenhuma borda do IDE.
FIGURA 2 .6
."
" . ,.....,
""""t"
......... ,_...
"
.. x
.......
35
Quando as janelas esti verem desencaixadas, voc poder reencaixlas seguindo o mesmo pro
ced imento que acabou de usar.
NOTA
Pode ser complicado levar uma janela encaixada de volta ao local exato do
qual a moveu, portanto, a va i uma pequena dica: em vez de arra star a janela
para encaixar e desencaix-Ia, d um cliq ue duplo na barra de ttul o. Isso desencaixa r a janela de ferramentas que estiver encaixada ou leva r uma janela
flutuante de volta a seu local o ri g inal.
Ocultao
Encaixadas ou no, as janelas ainda ocupam espao em sua tela, mas possvel ocu ltar ou fechar
jane las especficas que voc no queira que permaneam visveis. Toda janela de ferramentas
possui um boio X (veja a Figura 2.7), semelhante ao cone comum de fechamento de outras janelas. Dar um c li que nesse boto fechar ajanela de ferramentas, removendo-a da te la.
2.7
As j anelas de
"r::IEJ
FIGURA
, ....,
I"lflEJ
as ocultar da te/a at
..-
~,
Para trazer ajane lade volta, voc precisar usar uma opo do menu. Por exemplo. se der um clique no boto X do Solution Explorer, esse desaparecer da tela. Para traz- lo de volta, preciso
selecionar Solulion Explorer no menu View (ou pressionar Ctrl +R). No to d ifc il, principalmente para uma jane la que no util izada com freqUncia, mas e aquelas que podem no estar
sendo usadas agora, porm, em geral, o so? O Visual Studio .NET fornece uma maneira de recuperar o espao da tela ut iIizado por essas janelas, tornando-as ainda assim fc il de acessar - o
rec urso Auto-Hide. Todajanela de ferramentas encaixada possui um icone em sua barra de tt ulo
que se parece com um pequeno pino (veja a Figura 2.8).
36
FIGURA
Di a 2
2.8
T()(!as as janelas de
ferram ellfas possuem
1/11/ pequeno pino que
permite que
.~ejalll
.... _
ot<o l"'" _
.\ ~ II!. .,: $I- Q
'w.. '
-,,,"'
!!O\>
. '""""
_.,"'~~~
f~:
,~
...
".E!
confinadas em 1/1110
posio onde ficam
abertas.
_......
Esse um boto de doi s estados que controla se ajanela deve ou no ser automaticamente oculta
quando no estiver em LISO. Por padro, ajanela do Server Exp[orer configurada para empregar
esse recurso e, portanto, aparece apenas como uma guia ou boto cinza no lado esquerdo do IDE.
Passar o ponteiro do mouse por cima dessa guia far com q ue o Server Explorer se torne visve l
por comp leto, deslizando para a te la. Qualquer janela de ferramentas com a opo Auto-H ide
ativada ser minimizada automaticamente em uma gu ia na lateral do IDE onde estiver encaixa
da. Ajanela oculta ser trazida leia sempre que o usurio passar o mouse sobre essa guia, o que
s ignifica que s ocupar espao quando for necessria. Esse recurso, junto da opo do menu
Window, Auto Hide Ali, utili zado por mim para configurar o Vi sual Studio com a aparncia
que desejo (veja a Figura 2.9). Isso deixa o mximo de espao para ajane la principal, onde o c-digo aparecer quando voc tiver aberto um trabalho. Uma interface extrema como essa pode ser
desnecessria quando se trabalha em um monitor grande, mas, como usurio de laptop, a acho
perfeita.
Guias
Outro recurso para econom izarespao: as janelas de ferramentas mltiplas podem ser agrupadas
em uma nica rea da tela onde automaticamente se transformaro em guias individuais de uma
jane la com vrias gu ias (veja a Figura 2. 1O) . No perfil Visual Bas ic Developer, diversas janelas
j foram agrupadas (o Solution Explorer compart ilha o espao com ajanela Class View, e Pro
perties e Dynamic Help foram configuradas de maneira seme lhante), mas qualquer combinao
de janelas de ferramentas possvel.
FIGURA
37
..r:lD
2.9
AlIIo-l-lide para
maximizar sI/a rea
celllral de trabalho,
que onde editar
/01110 cdigos (fllanto
objetos visl/ais.
FIGURA
2.10
~- _!""'-~
e,
..,: .. $I. qj .:_
As gllias permitiro
que voc tenha IIIl1ita.~
janelas diferentes de
... :O:'!'!' ..
1'I' .. m'
jerramelllas abertas
cnqllalllO OCllpam o
mesmo espao precioso
da tela.
"
~
",'
_ 'lO'
',.....w ,
, , " ""'"
",
<00
,,
--. . . 0;,
-,
'-,--
..
.....""'
"
"'r.JC!
-,
~~
'-,-
<J _
,-
-,
".
Para adicionar uma janela a um grupo de guias ou criar uma janela com guias, arraste uma janela
de ferramentas (dando um clique em seu ttulo e arrastando) para Qltlra, soltando o boto do
mouse quando o contorno se a lterar para mostrar uma janela com guias, exibindo a extenso de
uma pequena guia na parte inferior dele. Consegue-se a remoo de uma janela de manei ra parecida. Apenas arraste uma das guias para fora do grupo at que o contorno perca o formato de guia
e, em seguida, arraste-a para o novo local desejado e solte.
38
Dia 2
Redimensionando
Qualquer janela de ferramemas pode ser redimensionada, mas, se estiver encaixada, s o poder
ser ao longo de suas bordas desencaixadas . Para redimensionar uma janela, mova o ponteiro do
rnouse sobre a margem dela, at que ele se transforme cm um indicador de redimensionamento,
mostrando a direo pennitida para a alterao. Quando o ponteiro indicar que voc est com o
mousc na posio certa, d um clique e arraste para estender ou retrair a borda da janela at o tamanho desejado. Observe que o redimensionamento entre duas janelas encaixadas estar na verdade alterando ambas porque urna deve encol her para permit ir que a outra se expanda.
Toolbox
Uma das janelas mais usadas, a Toolbox (caixa de ferramentas) fornece uma listagem de vrios
trec hos de texto, elementos de interface com o usurio e outros itens que so disponibilizados
para serem adicionados aos projetos. A seleo de itens mostrados depender do que estiver sendo edi tado no momento najanela principal do IDE. Por exemplo, se nada ou apenas o navegador
da Web for selecionado na janela principal , ento, o nico item disponvel na Toolbox sero cone Pointer. Esse cone, q ue est sempre presente, fornecido como uma maneira de desmarcar
qualquer outro item da janela Too lbox. Se voc estiver editando algo, como o cd igo HTML da
pgina inicial do Visual Stud io (d um clique com o boto direito do mouse no navegador da
Web e se lccione Ex ibir cdigo fonte), guias complementares sero adicionadas janela Toolbox. No caso da ed io do cdigo, uma guia HT ML foi adicionada (veja a Figura 2.11) contendo
vrios itens que representam diferentes tags HTML.
FIGURA 2 .11
Na edio de cdigo
HTML. IOdos os
elementos de Ullipicos
da finguagem ficam
dponil'eis 11(1 Toolha,.
"
lJO_
-_
!.JS-_
J;IlI"'~_
IZ r... _
.. "(
.'-_EJ _.-......
.~-
'"
0 _
,,-
0 .....-.._
. ..
,,,,, ',.,,,
<.....,
."-"
"""",>
,1 ~t. L>
39
Qualquer item , com exceo do especial , Pointer, pode ser usado de uma das duas maneiras:
D um clique e arraste o item para ajanela de edio (soltando quando voc tiver movido
o mouse para o local desejado).
D um clique duplo no item, o que far com que seja adicionado janela de ed io no
ponto de insero selecionado (q ualquer que seja o local onde o cursor estiver posicionado na janela de edio quando houver o clique duplo sobre ele).
Esses dois mtodos de uso dos itens esto disponveis para qualquer tipo de documento que estiver sendo editado, mas, se uma interface grfica com o usurio (algum documento visual sem
texto como um formulrio Windows) for o documento atual, ento, as duas opes anteriores se
comportaro de maneira um pouco diferente. Uma terceira opo tambm est disponvel:
Dar um cl ique e arrastar o item para o documento visual funciona da mesma forma que
para um texto, mas, em vez de aparecer um ponto de insero do cursor, ser mostrado um
contorno real do item quando voc mover o mouse sobre o documento.
Dar um clique duplo tambm func iona, mas, j que um documento visual nem sempre
possui um ponto de insero selecionado naquele momento, o novo item em geral apenas criado no centro do documento.
Uma terceira opo, que no est disponvel para edio de texto, selecionaro item dando
um clique nele, real{l-lo na Toolbox e, em seguida, dar um clique e arrast-lo para o documento visual. Isso esboar o tamanho e o local no qual voc deseja que haja a insero no
documento, e o novo item ser criado de acordo com o definido (veja a Figura 2. 12).
FIGURA 2.12
""'""" .....
l<d> _
_ ' ..'I
o
;.
Jl
.
c
. ..
., .
40
NOTA
Dia 2
linguagem utilizada.
Apresentarei de modo detal hado um exemplo de uso da Toolbox com um documento visual posteriomlenle nesta lio, quando voc criar um formu lrio Windows como parte de seu primeiro
aplicativo empregando o IDE. A Toolbox pode conter qualquer trecho arbitrrio de texto, alm
de fornecer alguns para a ed io de HTML, desenvolvimento de formu lrios e muitos outros tipos de trabal ho, o que s ignifica ser possve l gerar seus prprios itens que representem sees do
texto. Esse recurso uma maneira til de selecionar um fragmento de texto (que pode ser, e provave lmente ser, cdigo) que se espera utilizar com freqncia e torn-lo faci Imente disponivel.
Para conseguir esse excelente fe ito de produtividade, selecione o texto desejado na janela de ed io (o que pode incl uir primeiro a d igitao do texto) e arraste essa opo para a j anela da Toolbox. Independentemente da guia que voc arrastar, o texto de la determinar onde seu item
aparecer. Como podemos ver na Figura 2.13, o item apresentar um nome inoportuno e bastante sem sentido, como HTML Fragment, mas possve l dar um clique nele com o boto d ireito do
mouse e selecionar Rename Item para fo rnecer urna descrio apropri ada. Voil! Agora temos
um novo item personalizado na Toolbox, que pode ser usado sempre que se desejar apenas arrastando-o para a janela de ed io .
. _ _ .. _
FIGURA 2.13
Cdigos. linguagem
HTML ou outros
trechos de lexlo podem
ser inseridos na
Toolbox e. em seg uida.
usados (arrastados
para ajal1ela de edilio
de cdigos e NTML)
exa/Gmellfe como
~'"
'fJ<w
1.J ,, ~iI
i.~ ... : .., :
11'190
,p ql .--"
, .~ , ,,'
" 0'_
''"' ...
dela.
' , ...
C... , T. . "",,
c_ .. ,.
41
A Toolbox, assim como o resto do IDE, possui muitas opes complementares que no abordarei, como a capacidade de ad icionar mais guias (guias so aquelas sees deslizantes da jane la
Toobox), renome- las e alterar a visualizao da lista de cones de qualquer seo. Esses outros
recursos podem ser acessados por meio do menu suspenso da Toolbox (o menu que acessado
com um clique no boto direito do mouse) e tambm esto documentados nos arquivos de ajuda
do IDE.
Command/lmmediate
Voc j se surpreendeu executando o console de comando (ou a jane la do DOS, corno alguns
gostam de cham-lo) para efetuar uma tarefa? Para muitas pessoas, algumas tarefas s podem
ser processadas mais rapidamente com o uso do teclado e de uma interface de li nha de comando
em vez de se empregar o mouse para navegar pelos cones, menus e caixas de dilogo. J que a
produtividade do programador o objetivo final , qualquer mtodo que puder ser mais veloz vale
a tentat iva. O Visual Studio .NET possui uma janela que fornece duas fonnas com base no console de interagir com o IDE . Uma fez parte do Visual Basic por algum tempo, ajane la Immediate
e a outra esteve presente no Fax Pro por mu itos anos e acabou adicionada ao Visual Stud io, ajanela Command.
Em termos de utilizao, elas so realmente duas janelas, mas foram associadas para tornar a
operao um pouco mais confusa. Voc pode consider-las como duas janelas (sei que vou fazer
isso), depois que tiver aprend ido dois itens essenc iais: como alternar o modo dajanela (de Command para lmmediate e vce-versa) e como infonnarem que modo ajanela est atualmente. Primeiro, o prioritrio - tornemos essa janela visvel; selecione View, Other Windows e Command
Window no menu, exibindo assim essa nova janela.
Essa janela, agora com o nome de Command Window, deve conter apenas urna linha em branco
seguida de um prompt ;> (quase exatamente como o console de comando ou o prompt do DOS
com o qual est acostumado). Elaj est no modo Command, e voc pode inserir o comando que
quiser e execut- lo pressionando Relurn . Para passar essa janela para o modo Immediate, apenas
digite o comando i nvned (e pressione Return ou Enter) no prompl fornec ido. Agora, ajanela ter
passado para o modo Immediate, distinto do modo anterior pelo acrscimo de - Invnediate em
sua barra de ttulo e pela remoo do prompt;> de seu texto efetivo. Para retornar ao modo Command, digite crnd e pressione Return (sim, voc mesmo precisa incluir o prompt ;. Agora que
sabemos como alternar rapidamente entre esses dois modos, podemos examinar a final idade e o
LISO de cada um.
O modo Command dessa janela permite que voc controle o IDE por meio de comandos digitados - por exemplo, digitando File . Ne Pro ect para realizar a mesma tarefa que seria executada
se selecionasse os itens File, New e Project no menu. Uma interface do console em geral pode
ser mai s veloz do que uma interface grfica com o usurio. Essa duplicao de func ionalidade
fornecida como uma maneira potencial de acelerar seu trabalho dentro do IDE. Uma grande
quantidade de comandos est disponvel , mas o modo mais rpido de encontrar muitos deles
Dia 2
42
percorrer os nomes dos menus visveis. Depois que tiver digitado um nome (como Edit ou
Fil e), adic ione um ponto, e ser mostrada uma lista suspensa com os comandos disponve is para
esse nome de menu. Aqui est uma lista curta de comandos que bom conhecer:
Fi l e . NewProject
Flle.SaveAll
Window . AutoHideAl l
A janela Im med iate fornece a capacidade de avaliar as instrues do cd igo diretamente (de
imediato!). Isso pennitir que voc insira uma nica linha de cdigo e veja os resultados sem ter
de criar um prottipo inteiro do projeto. Esse recurso til quando se est no modo de interru(r
o, em que se interrompe a execuo de um programa em curso. Iremos desenvolver um exemplo simples de projeto, no qual usaremos um 'ponto de interrupo' para provocar o
encerramento da exec uo do programa em uma certa linha de cdigo. (O ponto de interrupo
ser abordado com mais detalhes no Dia 6, "O Que Fazer Quando Programas Bons Apresentam
Prob lemas e para Se Certificar de Que Isso No Acontea", porque ele realmente uma ferramenta de depurao).
Voc usar ajane la Command no incio deste exemplo apenas para ter uma noo de como ela
poder ser til no futu ro. Certifique-se de que ajane la Command fique visvel e no modo Command, selecionando View, Other Windows e Command Window na barra de menu. Agora, ajanela Command deve estar vis vel com um prompt > mostrando que est no modo Command.
Digite o comando File.Ne Pro ect e press ione Enter. Uma ca ixa de dilogo aparecer, solicitando a criao de um novo projeto. Se lecione a pasta chamada Visual Basic Projects na lista da
esq uerda e o tipo individual de projeto chamado Windows Appl ication, na caixa di rei ta. D um
clique em OK para fechar a caixa de dilogo, gerando um novo projeto em branco.
O projeto cri ado contm apenas um formu lrio Windows, e voc ainda precisa adicionar seu
prprio cdigo. No entanto, o Visual Basicj inseri u de modo automtico um pequeno trecho de
cdigo ne le, um pouco do trabalho que necessrio para gerar e in icializar o novo formulrio em
branco. Esse cdigo pode ser visto com um cl ique no boto direito do mouse sobre o novo formulrio (na janela central do IDE) e selecionando-se View Code. Esse procedimento ira adicionar e se lecionar uma guia nova na janela central, uma janela de cd igo que exibe aquele
associado a esse formu lrio. J que nada fo i adicionado ao formu lrio, o cdigo um pouco limitado, mas suficiente para o exemplo.
Selecione a linha Fonnl '" Me, rolando para baixo a fi m de encontr- Ia, se necessrio. Agora, voc
quer marcar essa li nha com um ponto de interrupo, portanto, a execuo desse cdigo ser encerrada ou 'interrompida' quando ele a atingir. H trs mane iras diferentes de marcar a lin ha.
Uma dar um clique na margem (a rea cinza-c laro no lado esq uerdo da janela do cdigo), outra
dar um clique com o boto direito do mouse e selecionar Insert Breakpoint, e a terceira usar o
atalho do teclado para essa funo, pressionando F9. Empregando o mtodo que quiser, adicione
o ponto de interrupo, e vera um ponto vermelho aparecer na margem prxima linha. Ela ind ica a presena de um ponto de interrupo.
43
Com esse ponto de interrupo inserido, voc poder executar o projeto, e o processamento ser
encerrado quando ele atingir essa linha. Como para o ponto de interrupo, h trs maneiras
principais de iniciar um projeto: uma usar o boto da barra de ferramentas (que se parece com o
boto de reproduo dos CD players ou videocassetes - veja a Figura 2.14), outra utilizar as
opes Debug e Start do menu, e a tercei ra empregar o atalho do teclado, F5. claro que a ofr
o a ser usada uma preferncia pessoal. Muitos programadores acham que, no fina l das contas, os atalhos do teclado so a forma mais fcil de acessar as funes mais comuns.
Quando voc iniciar a execuo do projeto, ele ser rapidamente encerrado e exibir a linha de
cdigo marcada com um ponto de interrupo. Agora, estamos no modo de interrupo, como
indicado por [break] na barra de ttulo do IDE do Visual Studio. A seta amarela que pode ser vista na margem da janela do cdigo ind ica a linha que est para ser executada (processada). Nesse
ponto, pode-se alterar a janela Command para o modo Immed iate e test-lo.
Se sua janela Command estava visvel antes da execuo do projeto, ainda deve estar presente,
embora o layout possa ter sido um pouco alterado quando certas janelas foram abertas automaticamente no momento em que voc estava no meio do processamento do projeto. Se a janela
Command no estiver visvel, abra-a usando as opes View, Other Windows e Command Window do menu.
FIGURA 2.14
A barra de fermmenra.l
fornece boIes para
Debu!I
II
... X
ai
iniciar e imerromper li
exeClIiio de
programas, IIsando
cones parecidos com
os eOlllroles de
videocasseles.
D um cliq ue na janela para selecion-Ia (tornando-a a janela ativa no IDE) e digite irrmed (seguido da tecla Enter) para pass-la para o modo Immediate. Agora voc pode inserir qualquer instruo do Visual Basic, e ela ser avali ada imediatamente (da o nome). Tente as instrues a
segtll r:
? Me.Width
Me.Width " 50
? Me . Width
? 3 + 5
?3" 5
44
Dia 2
Usar as teclas de seta para cima e seta para baixo enquanto estiver na janela
NOTA
Notou o ponto de interrogao em frente a algumas das instrues anteriores? Isso indica
' exi~
bir' e, sem ele, o Vi sual Basic no saber o que fazer com as instrues que retornam um valor.
Por exemplo, 3 + 5 produzir 8, mas, sem a instruo de exibio, 8 no ser um comando vlido
do Visual Basic. Por outro lado, instruescomoMe.Width "Me.Width * 2 so trechos de cdigo
vlidos do Visual Basic e no precisam do ponto de interrogao em sua frente.
Pressione F5 para fazer com que a execuo do cdigo continue aps o ponto de interrupo, e o
formulrio aparecer na te la maior do que o tamanho original se voc processou as instrues do
exemplo fornecido anteriormente. Como pode ver, possvel afetar pmtes de seu programa a
partir da janela Immediate, o que a faz uma tima ferramenta de depurao.
Dynamic Help
Estajane la de ferramentas configurada como uma guia com ajanela Properties (se voc estiver
usando as configuraes do perfil Visual Basic Developer) e fornece referncias, com base no
contexto, da documentao dos arquivos de ajuda do Visual Studio. Em vez de esperar que voc
solic ite aj uda, esta janela de ferramentas age de modo proativo quando a tecla F I pressionada
ou algo selecionado no menu Hel p. Com base em sua opo ou tarefaatual , ela exibi r uma lista de tpicos relacionados. Na Figura 2. 15, a janela de fe lTamentas Dynamic Help mostra um
conjunto de tpicos de ajuda sobre a tag HTML atualmente se lecionada na janela de ed io de
cdigos. Alm dos tpicos relacionados, essa janela em geral exibe um link para vrios tpicos
mais genricos como (nesse caso) a seo Coding Techniques and Programm ing Practices (Tcnicas de Cod ificao e Prticas de Programao) da documentao. Essa janela de ferramentas
tambm fornece um link direto para as sees de pesqu isa, contedo e indice da documentao
de ajuda por meio de trs cones da barra de ferramentas.
FIGURA 2 .15
:!O<'
....
45
I!IIIIgE!
' Tono'
as solicite.
' .
.... IN..
".H_
"
"ro "
.. ....... " "r.,,.,,
C.~"OI'."""
.. . ... _
.... ...
. ,
....
,
,
..............
"
...
,_.,
.
....
.
.._....."...,_..... , .._. ......,
~
"
"
~ ,, -_
,.. ,
'
'., . . . . . . . . " . . . , _. . . . . , L. . . . .
' ............>... , _
, _ .
Server Explorer
Estajanela de ferramentas (veja a Figura 2.16) fornece uma listagem visual de dois recursos es"
senciais, bancos de dados e servidores. O primeiro conjunto de recursos representa todas as conexes estabelecidas entre seu projeto e vrios servidores de banco de dados, e perm ite que voc
explore esses bancos de dados para examinar tabelas, procedimentos armazenados e OUlras informaes teis.
O segundo conjunto de infonnaes, Servers, representa qualquer mquina com a qual voc possa se conectar e que fornea uma interface visual para os recursos que ela possa tornar disponivel
para seu programa. Esses recursos incluem contadores de desempenho, registros de eventos, filas de mensagens e mais, todos fac ilmente encontrados por me io desta janela de ferramentas.
O Dia 13, "Usando o Server Explorer", se aprofunda no uso dessa janela de ferramentas para en"
contrar e man ipu lar recursos de servidores.
46
Dia 2
FIGURA 2.16
O Sen'er ExploreI"
fornece /lma maneira
vis/lol de examil/ar e
IIsar recursos fanl a do
'onol
de outras mquinas.
......_L.yo.'''.,..,
... ~.o .. . _
.... . ",."""
.....
..,
........,
c .....
Properties
O IDE do Vi sual Stud io permite que voc trabalhe com muitos itens, projetas, solues, formu-
lrios c classes diferentes, alm de outros recursos, todos possuindo atributos c propriedades.
Essas propriedades so in formaes que descrevem o item, como o nome de um projeto. Embora
lima maneira de alter-las. A janela Properties fornece essa funciona lidade. Sempre que um item
for selecionado no IDE, os atributos desse objeto sero exibidos nesta jane la de ferramentas
(veja a Figura 2. 17). Alguns desses atributos podem ser de leitura (no podem ser alterados),
mas, se ass im o for, ento, ser possvel dar um clique neles na janela Properties e alter-l os
quando necessrio.
Solution Explorer
De muitas maneiras, o Solution Explorer semelhante ao recurso do Windows Explorer usado
no Windows. a interface de gerenciamento de arquivos do Visual Studio .NET. No Visual Studio .NET, o cd igo que voc criar poder ser organizado em camadas diferentes de agrupamento: solues, projetos e arqu ivos. A janela Solution Explorer permite que sejam vis ualizados
todos os objetos que estejam abertos no momento, em seus respectivos grupos ou janelas. A janela Solutiotls contm projetos, isto , aplicativos e componentes individuais, como um sistema
completo, incluindo componentes executados tanto no cliente quanto no servidor. Dentro de
cada janela Project esto todos os arquivos efetivos do projeto (classes, form ulrios e outros elementos).
47
2.17
Quando IIfIl objeto for
FIGURA
..
,,~m'
de texto em UIII
--.
..
---_0- .- ...
-0_.
_., ..
,
"""' . .,...
-, I
0-
atribllfos.
~r _~
o
o
o
o~
''''1
, ,
o
o
p'
o~
o~
~
- ~~
A lm de permitir que voc visualize o que est aberto no momento, ajane la Solution Explorer
fornece vrios recursos, Por meio dela, podemos
Adic ionar e remover projetos inteiros de um grupo Solution (d um clique com o boto
direito do mouse na soluo para adicionar um projeto e em um projeto para a opo de
remov-lo da soluo atual)
Class View
Como parte da discusso sobre o Solution Explorer, expliquei que poderia haver muitos arquivos diferentes envolvidos em um nico projeto OLl soluo, Esses arquivos em geral correspondem s classes criadas (como uma classe Veculo o u Conta), mas no h um requisito para que a
organizao do arqu ivo se parea com a organizao conce ituai das classes no projeto. A jane la
Class View (veja a Figura 2. 18) foi projetada para permitir que voc visua li ze a estrutura do objeto de seu projeto e use essa visualizao para navegar em seu cdigo.
Dentro desta janela, voc pode min imizar e expand ir os objetos exib idos, para acessar as diversas propriedades e mtodos que eles expem. Dar um clique duplo em um item especfico de
Class View o levar para essa classe, mtodo, evento, propriedade ou procedimento. Se o item
sobre o qual houve o cl ique dup lo no estiver disponvel como parte de se u cd igo, Class View o
conduzir para a definio dessa parte da classe dentro do Object Browser (veja a prxima seo) . A janela Class View til como uma mane ira de exami nar seu projeto atravs das classes
definidas nele, ignorando os detalhes fsicos dos arquivos reais.
48
Dia 2
FIGURA 2.18
p.*:I
(>oco
!II> _
l ltle. .c~
arq/lil'os fsicos. e
fomece acesso direlo
00 il//erio/' desses
objelOs.
lOIREI
. ...,
r
.'"
. .........,...
"
'"'
"'." ."M/
r . ' ''J
r-R ''o:''
,.
Object Browser
Toda a programao na plataforma ,NET baseada em objetos - os objetos fornecidos como
parte do .NET Framework, os que voc criar e at os que outros participantes de sua prpria
equipe desenvolverem. Todos esses objetos possuem propriedades e mtodos por meio dos quais
possvel interagir com eles, mas como saber o que est disponvel? O Object Browser foi projetado para ajud- lo no trabalho com todos esses objetos, permitindo que voc navegue e pesquise
em um catlogo de objetos disponveis. Esse catlogo inclui os objetos (c lasses) expostos por
qualquer biblioteca de classes que for referenciada, alm das classes contidas em seu prprio
projeto. Semelhante em alguns aspectos Class View, o Object Browser vai alm da funcionalidade dessa outra janela, incluindo objetos externos ao seu projeto. Essa janela mais til como
uma maneira de documentao ou referncia, permit indo que classes sejam encontradas dentro
do .NET Framework ou outras bibliotecas de c lasses e seus detalhes visualizados, como s uas
propriedades e mtodos. Na Figura 2. 19, podemos ver o Object Browser sendo usado para pesquisar o contedo da biblioteca System .oata, exibindo infonnaes detalhadas que vo at o nvel dos parmetros necessrios para uma celta chamada de mtodo.
Lista de Tarefas
Em qualquer projeto de desenvolvimento, mesmo os concludos, h a probabilidade de ficarem
vrias tarefas pendentes para serem completadas. As sees do programa podem prec isar de
ajuste no desempenho. Pode haver erros conhecidos ou recursos que necessitem ser remediados.
Quando as tarefas pendentes podem ser relacionadas em uma rea do cdigo, uma prtica comum entre os programadores marcar essa rea com comentrios. Quando os programadores incluem consistentemente certas palavras-chave como TODO ou BUG nesses comentrios, mais
49
fcil varrer o cdigo procurando-as para encontrar os trechos apropriados. O Visual Studio .NET
forma lizou esse processo fornecendo uma lista real de tarefas que preenchida de modo automtico com referncias a qualquer seo de seu cdigo que contenha uma das vrias palavras-chave
como TODO (mas, voc pode especificar a palavra-chave que qu iser). Cada comentrio encontrado ser, em seguida, relacionado em uma lista fcil de usar, detalhando no somente o prprio
comentrio, mas tambm o arq uivo e a linha onde foi encontrado (veja a Figura 2.20).
FIGURA 2.19
O Objecl !JrOll'sel"
~~-_
o
""'...,. . _
....
.........,
,, ~ e.I,,!
....
-,'
"..
,...
Framell'ol"k e de
qualquer oufra
011
refelellciado.
NeTA
Voc pode adicionar suas prprias palavras-chave lista de sim bolos reconhecidos por meio da caixa de dilogo Options. Na sua seo Environment\Task
Ust, possivel acrescentar novos sim bolos e especificar configuraes para a
tarefa, que sero criadas quando essa palavra-chave for encontrada. As
palavras-chave s sero consideradas quando fo rem encontradas nos comentrios de seu cdigo.
Com um rpido clique duplo em uma tarefa pendente, voc ser levado de imed iato para o cd igo, no qual poder trabal har no que ela indicar. Alm dessa funcionalidade - por si s bastante
ti l -, a lista de tarefas pode conter vrias outras espcies de tarefas. O Visual Studio adiciona
outras tarefas automaticamente, como a referncia a erros compi lados e outros itens perceptveis.
Mas voc tambm pode acrescentar dois tipos de tarefa a essa lista: atalhos de cdigo e tarefas
definidas pejo usurio.
50
Dia 2
2.20
Cada comentrio
marcado COI/1 1/111(1
palavra-chore especial
FIGURA
lIIos/rodo em lili/a
Pnv., . . . . .
,.,.... , lO "
''f<(),
C~.ycl1< ~ (
~_"._
oh,.,
""u
' oO ....
'"
Os ata lhos de cdigo so semelhantes s tarefas com base em comentrios, mas so uma referncia a alguma linha do cdigo. No precisam de nenhuma palavra-chave especial. Para adicionar
um atalho de cdigo lista de tarefas, d um clique com o boto direito do mOllse na janela de
edio de cdigos e se lecione o item Add Task List Shortcut no menu.
Uma nova tarefa ser adicionada a sua lista, com o padro para a descrio sendo a linha de cdigo selecionada (embora voc possa, e provavelmente deva, a lterar isso para outra descrio que
queira usar). Em segu ida, voc poder retornar rapidamente para essa linha apenas com um clique duplo nessa tarefa. Quando um atalho criado, uma seta azul posicionada na margem es,
querda da janela do cdigo prxima linha apropriada. E possvel remover o atalho dando um
clique com o boto direito do mouse na linha do cdigo e selecionando Remove Task List Shortcut ou selecionando o item novo da lista de tarefas e exclui ndo-o diretamente.
o outro tipo de tarefa que voc pode criar uma tarefa do usurio, que no est associada a nenhum trecho em particular do cdigo, semelhante a uma tarefa-padro do Outlook. Uma tarefa
do usurio ad icionada com um clique na seo C lick Here to Add a New Task da lista de tarefas
e preenchendo-se os detalhes. Observe que, diferente das outras tarefas, essa no possui campos
de arquivo/linha preenchidos e, portanto, s tm dois campos disponveis, a descrio e a prioridade (baixa, normal ou alta). Se qu iser criar uma observao sobre uma rea especfica do cd igo, voc com certeza achar mais til gerar um atalho de cdigo e alterar a prioridade e a
descrio para fornecer mais detalhes sobre a questo real.
Solues e Projetos
Como discut imos na seo "Solution Explorer", ex istem vrios nveis nos quais seus cd igos
podem ser agrupados. O prime iro, a soluo, representa o sistema completo que est sendo cria-
51
do, enquanto os componentes individuais dele so representados por projetas separados. Antes
que voc possa desenvolver qualq uer cdigo no IDE do Visual Stud io, precisa configurar a sol uo e pe lo menos um projeto. Nesta seo, percorreremos os princpios bsicos da organizao
do cdigo, criando novos proj etas e traba lhando com projetas e arquivos existentes. A seguir
apresento um resumo desses tpicos, mas, na seo logo a seguir, passaremos a praticar essas habil idades gerando um exemplo com pl eto de um aplicativo.
FIGURA 2.21
O Visual Studio possui
111110 caixa de dilogo
chamada Neli' Projecto
que permite que 1I0~'OS
projetos sejam
acrescentados quando
voc il/stala modelos
ou linguagens
.. .
~~
""_
I~~~~~'~'.~.~~~~~~~~~~~==~
, L.
_ ..
adicionais.
, ~,
Para criar um ap licati vo que seja executado localmente em sua mquina e usar uma interface
com o usurio com base no Windows (com caixas de dilogo e outros elementos UI do Windows), selecione Windows Application na lista de tipos de proj etas. Para conclui r o processo de
criao, digite um nome para seu novo aplicativo e, se quiser, altere o caminho sugerido. D um
clique em OK, e o Visual Studio gerar seu novo projeto. E uma boa idia dar a seus projetas nomes significat ivos, mesmo quando voc estiver apenas fazendo testes; caso contrrio, logo haver todo um grupo de projetas com os nomes WindowsApplicat ion I e WindowsApplication2,
dificultando a localizao de algo em que tenha estado trabalhando.
52
Dia 2
ser aberto no IDE. O Visual Studio fornece algumas maneiras fceis de abrir projetas passados.
Um mtodo llsar o menu atravs de File, Open e Project ou diretamente pe la opo Recent Projecls prxima parte inferior do menu Fi le. Outro mtodo por meio da seo Gel Started da pgina inicial do Visual Sludio, uma pgina HTML que lista os ltimos projetas uti lizados. Nesse
local, possvel dar um clique no projeto especfico que se quer abrir ou at criar um novo atravs de um link adicional. Abrir um projeto novo faz com que qualquer oulro projeto que j esteja
sendo usado seja fechado, a menos que sejam empregadas as opes Fite e Adct Project do menu,
que adicionam um projeto novo ou ex istente so luo aberta recentemente.
Arquivos
As solues e projetos existem quase apenas para fin s de organizao; o cd igo efetivo reside
em um ou mais arquivos individuais. Quando voc cria um projeto novo, em geral so gerados
certos arquivos, como um novo formu lrio Windows (form1.vb) ao ser criado um ap li cativo
Windows e um novo mdulo (Modul elo vb) para um apl icativo do console. Esses arquivos so gerados em disco e existem independentemente de seu projeto, permi tindo que um nico arquivo
seja compartilhado por vrios projetos se isso fo r desejado.
,- ,
~
c,,__ ,
8 U""~',qK"t _
-O'~
"'-
"'lO
o .....,.
~~
[j,
-'!m- ";:!li- --
c,"
[ii.]
iD
~ ,~
..,.,.
I """,-~
53
Salvando Tudo
Com todos esses grupos diferentes (solues, projetos e arquivos), importante saber como salvar os trabalhos que fo ram executados, mesmo se estiverem localizados em mais de um arquivo.
No IDE do Visual Studio, isso feito atravs de dois comandos diferentes: Save e Save AlI.
Esses comandos, situados no menu Fi le e na barra de ferramentas, permitem que seja salvo apenas o arquivo selec ionado no momento (selecionado najanela Server Explorer) com o uso do comando Save ou, por meio do comando Save Ali, todos os arquivos abertos que tenham sido
alterados.
Se voc tem medo de perder seu trabalho, como eu, ficar especialmente interessado em uma das
opes do IDE. Na caixa de dilogo Opt ions (acessada por meio dos itens Tools e Options do
menu), possvel expandir o grupo Environment e se lecionar o item Projects and So lutions para
ver um conjunto de trs botes de opo sob o cabealho On Build/Run (veja a Figura 2.23).
Essas opes controlam se o IDE salvar algum arquivo alterado antes de comear a executar um
projeto. Essa uma configurao importante porque, se o IDE falhar em algum momento, bem
mais provvel que isso acontea quando seu cdigo estiver em execuo. Essa opo fornece
lima maneira fcil de assegurar que todas as suas alteraes sejam sempre sa lvas antes da execuo de seu cdigo.
FIGURA 2.23
Ao usar IIfIl
cOlI/plllador
noro, )'erifique sempre
essas configuraes
para sall'ar 110
momelllO do
deselll'oll'ime/1/o. de
modo qlle el'ite a perda
de algumas horas de
codificao.
""' ,o~
- (noW_
_.........
_.-,
-~
...
p _
~ _
, .... <t...-.hot ~ - . , . _
I'. r.
"II r
..... _
El I
,, "'"
"' _ - . .
......
0 _" c""" ..
Cl l.,. EdOor
D_
O 0 ..... _ 11<
D_
~"-~-~------''
Dia 2
54
Crie o Projeto
Nos menus, selecione os comandos File, New e Project, apresentando ass im a caixa de dilogo
New Project. Na categoria Visual Basic, selecione o cone Windows Application e altere o nome
do projeto de Wi ndowsApp 1i cat ion(x) - o nome-padro numerado - para Adder (a menos que
voc seja importunado por intromet idos, situao na qual poder nomear o projeto da maneira
que quiser). O novo proj eto j ter um formulrio, que tudo de que voc precisa para comear a
trabal har no apli cativo. O Visual Studio criar automaticamente uma pasta Solution para armazenar seu projeto novo, tambm dando o nome de Adder a ela. D um clique em OK depois que
tiver inserido os nomes corretos do projeto e da soluo.
A.
'Il1o
'Ii. .
semelhanle a esta
jigum.
. :._ -_.-
o .
~ __
111-(:1
I
I
.... I I
I
I
... I I
55
Selecione a primeira caixa de texto (a mais prxima da parte superior do formulrio) e exiba ajanela Properties (pressione F4 ou selec ione View e Properties Window no menu, se a janela j
no estiver visvel). Vrias propriedades diferentes sero listadas, mas voc s ir alterar duas
de las:
Text (no grupo Appearance) Representa o contedo da caixa de texto. Exclua o contedo desta propriedade para fazer com que a caixa de texto fique vazia quando o programa
for iniciado.
(Name) (no grupo Design) No cdigo, voc se referir a essa caixa de texto usando o
nome desta propriedade, que tem como padro um nome relativamente irrelevante, como
Text2 ou Textl. Neste exemplo, altere para txtF1rstValue.
Continue com as outras duas caixas de texto, deixando sua propriedade Text em branco e alterando seus nomes para txtSecondValue e txtResult , respectivamente.
Agora selecione o boto para exibi r seus atributos na janela Properties. Voc tambm alterar
somente dois valores desse objeto, (Name) para btnAdd e Text para Add.
Para concluir, s porque tem esse recurso, voc alterar uma das propriedades do prprio formulrio. Selecione o formu lrio (d um clique em algum local dele que no seja Outro objeto) e role
pela lista de propriedades para encontrar a propriedade Text no grupo Appearance. Para um formulrio, essa propriedade representa seu titulo (o texto exibido na barra de ttulo), o qual poderemos configurar como Simple Adder no exemplo.
Executando o Projeto
Mesmo se voc no tiver inserido um cd igo, o projeto poder ser exec utado da maneira como se
encontra. O IDE do Visual Stud io permite que o programa seja processado dentro de le, sem a
existncia de um programa executvel (um arquivo .exe, por exemplo). possivel processar rapidamente o trecho de cd igo necessrio durante o desenvolvimento e, o que mais importante,
executar vrias tarefas de depurao enquanto o programa estiver sendo processado. Mais informaes sobre os aplicativos de depurao sero fornecidas no Dia 6, mas, por enquanto, essencial observar que h uma diferena entre processar seu cdigo no IDE e gerar um arquivo
executvel real. A criao de um executvel, ou outro tipo de arq uivo de resultado de seu projeto, chamada de construo e ser abordada na prxima seo.
Para executar um projeto no IDE, se lecione Start no menu Debug, pressione F5 ou use o boto da
barra de ferramentas que se parece com uma seta para a direita (ou com o boto de reproduo de
um videocassete). Tente isso agora, com o projeto Adder que voc j abriu, e ver o formulrio
sobre o IDE do Visual Studio. Mesmo sem que tenha sido escrita uma nica linha de cdigo, o
fonnu lrio parecer bem fu ncional. Ele poder ser arrastado pela tela e minimizado, tudo por causa
do .NET Framework e do IDE subjacentes que permitem a criao visual de uma interface com o
usurio e produzem o cd igo necessrio para faz-Ia funcionar.
Dia 2
Embora voc no tenha escrito nenhum cdigo, uma codificao extensa j foi gerada pelo IDE,
e ela que executada quando o projeto processado.
Construindo o Projeto
Construir um projeto a criao de um executvel ou outros arquivos de resultado. Para um aplicativo Windows como o do exemplo, isso significa a compilao de seu cdigo em um arquivo
.exe que possa ser executado fora do IDE do Visual Studio. Essa uma etapa essencial se voc
pretende que um projeto seja usado por outras pessoas que no sejam desenvolvedores, embora
possa ser evitada durante o desenvolvimento pela execuo dentro do IDE.
Assembly name Este valor fornece a primeira parte do nome do arquivo de seu arquivo
de resu ltado. No caso do exemplo, ele Adder, portanto, Adder .exe fo i criado. Altere-o
para MyAdder, e MyAdder . exe ser criado quando voc iniciar a construo.
Output type Infonna ao IDE que tipo de arquivo ser criado na construo deste projeto, com a extenso .exe se Windows Appli cation ou Console Application for selecionado,
ou .dll, se Class Library for selecionado.
Startup object Indica a parte do projeto que deve ser executada por padro quando o
aplicati vo for processado. No exemplo, ela deve ser Adder. FonnI para indicar que o formulrio deve ser executado de maneira automtica. Observe que, se voc alterar, mesmo
temporariamente, Output Type de Windows A pplication para qualquer outra opo, essa
propriedade tambm ser modificada e pode acabar configurada de modo incorrcto.
Cancele todo o processamento da caixa de dilogo de propriedades do projeto (dando um clique
no boto Cancel na parte inferior do formulrio) se voc perceber que alterou algo que no sabe
como corrigir.
Todas as configuraes de Common Properties\Version so armazenadas nos arquivos de sada
quando o projeto construdo, e ficam visveis como parte das informaes das propriedades do
57
arquivo executvel final (veja a Figura 2.25). Enquanto voc esliver aprendendo o Vi sual Basic,
as informaes inseridas nessa caixa de dilogo podem ser irre levantes, mas, quando criar um
apl icativo que ser distribudo para os usurios, recomendvel levar em considerao as informaes dessa pgina com muito cuidado. No mnimo, certifique-se de que inseriu os nmeros
corretos das verses na pgina porque eles fornecem um mtodo conclusivo para os usurios verificarem que verso de um aplicati vo possuem.
FIGURA 2.25
Qual/do voc visualizar
as propriedades de /1111
arquivo execlltrel 011
DLL. poder examinar
fodas (/s informaes
especificadas antes de
sI/a cOllstruc7o.
1.0.2'314.16
-------
Em Common Properties\Build, apesar do nome, encontramos apenas uma propriedade que claramente relevante para o processo de construo. O valor de Application Icon determina a aparncia do arquivo tinal .exe no Windows e permite que voc se lecione o arqu ivo de cones (.ico)
que desejar.
Embora no sejam as nicas configuraes adicionai s que aretam a construo, os ltimos itens
que mencionarei esto em Configurat ion Propert ies\Build. Nesse loca l voc encontrar vrias
configuraes relacionadas com a depurao, assim corno a configurao de Output Directory,
que determina onde o arquivo executvel ou outros que forem criados sero posicionados.
Dia 2
58
Com o Configuratioll Manager (yeja a Figura 2.26), voc poder criar quantos grupos diferentes
de configurao ou at mesmo remover uma existente . Por enquanto, ser prefervel deixar as
configuraes como esto, selecionando a verso Release do resultado quando estiver implantando o projeto, e Debug no teste.
FIGURA 2 .26
13
O Configuratioll
Mal/ager permite que
\'oc crie co/!figuracs
diferenles para
fillalidades distintas
(leste. depurao.
aCeifa(io do 1I.WI'iO,
liberao e ol/Iras).
cada IIlIIa podendo ter
configuraes
diferemes no lIIel/lI
Build.
59
o uso do IDE faz com que esse processo seja muito direto: d um clique duplo no formulrio do
Solution Explorer para assegurar que a visualizao do projeto esteja ativada e, em seguida, d
um clique duplo no boto Add. Isso o conduzi r para a visualizao do cdigo do formul rio e a
uma subrot ina que foi ad icionada pelo IDE. Um controle, como esse boto, caixas de texto ou
outros componentes do formulr io, pode ter eventos associados a ele. A maioria dos eventos de
um controle representa aes executadas neles como serem clicados, clicados duas vezes, selecionados e desmarcados. possvel criar procedimentos que sero executados quando um desses
eventos ocorrer e, por padro, esses procedimentos so designados pelo seu nome (o nome do
controle, btnAdd, segu ido do evento, C1 i ck). Podem-se associar proced imentos a eventos, independentemente de seus nomes, mas neste caso, o procedimento btnAdd Cl ick ser executado se
o usurio der um clique no boto. fcil testar essa funcional idade usando um recurso muito til
do .NET Framework que fornece os formulrios, botes, caixas de texto e outros elementos de
interface, e, portanto, est disponvel para qualquer projeto no qual se esteja usando esses objetos. A classe MessageBox permite que uma mensagem seja exibida em uma caixa de dilogo com
uma nica linha de cdigo, como esta:
MessageBox . Show("O boto foi clicado")
Esse cdigo exibe uma ca ixa de dilogo como a mostrada na Figura 2 .27. A simpli cidade do uso
dessa classe a torna perfeita para ser empregada como uma ferramenta de teste ou de depurao.
Adicione a li nha de cdigo anterior sub-rotina btnAdd_C1 ick e, em seguida, execute o projeto
pressionando F5. Depois que o formulrio aparecer, tente dar um clique no boto. Cada clique
deve provocar o aparecimento da caixa de mensagem, mostrando a voc que o cdigo de
btnAdd Cl i ck executado sempre que o boto pressionado.
FIGURA 2.27
A classe MessageBox
fornece uma mal/eira
fcil de exibir
iliformaes lia tela e
em gera/usada
fases de
I T.". M=- I
11m'
1'1'0'"
depurao/lesfe,
Agora que voc j sabe como executar um cdigo que responde ao clique em um boto, poder
criara cd igo efetivo de seu projeto. Ele tem de somar dois valores para produzir um resu ltado, o
que soa mais fcil do que na realidade. Os valores que queremos so os contedos de suas caixas de texto, disponveis por meio da propriedade Text desses controles, mas antes que possamos us-los em uma equao matemtica(somando-os), temos de convert-los de strings (texto)
Dia 2
Resumo
O objetivo do I DE fornecer um ambiente no qual voc possa escrever, editar, executar e depurar seus programas, e o do Visual Stud io fornece todos esses recursos e ma is. Esta lio abordou
os recursos bsicos do IDE e a fi nalidade de cada uma de suas jane las princ ipais. Tambm o conduziu pela criao de um aplicativo Windows simples. Daqui em diante, estaremos usando o
IDE freqUentemente, apesar de nem sempre trabalharmos com elementos visuais (como formulrios e controles). Portanto, aprenderemos mais sobre ele e seus recursos o tempo todo. Embora
possa parecer um pouco confuso e cansativo agora, o IDE a ferramenta que voc usar para fazer sua programao de modo que, com o tempo, e la se tornar familiar.
P&R
P Preciso usar o IDE ou posso apenas empregar um editor de texto e a linha de comando?
R No Visual Basic .NET, possvel fazer qualquer coisa usando apenas a linha de comando e um editor de texto, mas o IDE fornece uma grande quantidade de recursos para tornar o desenvolvimento um processo mui to mais fcil. O Intel li Sense, a estrutura das
instrues e a edio codificada em cores, tudo faz com que a criao de cdigos seja
mais agradvel, alm de ser difcil ficar sem os recursos de depurao.
61
Workshop
o Workshop foi planejado para ajud-lo a antecipar possveis dvidas, revisara quej aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, " Respostas dos Testes/Exerccios".
Teste
I. Se voc quisesse ver todos os arquivos que fazem parte de seu projeto, que janela do IDE
usaria?
2. Qual o local-padro dos novos projetas do Visual Studio?
3. Como voc pode escolher um cone para um aplicat ivo que esteja desenvolvendo no Visual SlUd io?
4. Se a janela Command estiver no modo lmmediate, como posso passar para o modo Command e depois voltar?
Exerccios
Exatamente como voc fez nesta lio, use a classe MessageBox para adicionar mensagens ao
procedimento de outros eventos e verifique quando forem chamados. Tente selecionar txtResul t na primeira lista suspensa da janela de edio de cd igos e, em seguida, TextChanged, na
segunda lista para trabalhar com esse evento.
SEMANA
DIA
Introduo Programao com o
Visual Basic .NET
Agora que voc se fami liarizou com o ambiente .NET de desenvolvimento, hora de comear a
escrever cdigos. Embora com o V isual Basic .NET sej a fcil escrever um programa simples
sem o uso de muita codificao, mesmo se for mais sim ples que uma verso de demonstrao,
ele precisar manter o registro das infonnaes e executar clculos elementares e tarefas semelhantes. Para escrever cdigos que executem essas tarefas, ser necessrio um bom conhecimento sobre variveis. Por meio da compreenso do emprego e dos tipos de variveis, criada a base
para ass imilao do Visual Basic .NET. De maneira parecida, exalamenle como quando iniciamos o aprend izado da aritmtica simples, precisaremos aprender alguns operadores fundamentais que podem ser ut i Iizados no trabalho com variveis numricas e ai fanumricas. Nesta lio,
voc aprender:
o
o
o
64
Dia 3
Variveis e Atribuio
Varive is e atribuio so a base de toda linguagem de programao. As variveis permitem que
voc armazene informaes para uso posterior e a atribuio a maneira de inserir informaes
.. .
nas vanavcls.
,
65
Variveis Simples
Como descrito anteriormente, os tipos simples de variveis ' arrnazenam ' valores como nmeros
e palavras. Portanto, voc pode achar que s necessrio exist ir dois tipos de variveis: de nmeros e de palavras. Porm, na verdade, h vrios tipos diferentes de variveis simples - cada
um criado para armazenar tamanhos ou ti pos disti ntos de nmeros ou stri ngs.
Tente usar o melhor tipo de varivel para a situao. Em algumas vezes, s ser preciso manter o
registro de um nmero peq ueno - por exemp lo, se estiver armazenando os meses do ano. Em outras, ter de trabalhar com nmeros grandes - por exemplo, se estiver escrevendo um programa
que execute clculos cientficos ou de engenharia.
As variveis simples podem ser divididas em quatro subgrupos. O primeiro e maior o dos inteiros, nmeros que no possuem casas decimais. O segundo grupo usado para nmeros com casas deci mais. As strings e os caracteres compem o terceiro grupo, e o quarto seria me lhor
descrito como ' diversos' . Examinemos cada um desses grupos e vejamos quando qual apropriado usar em que situao.
Variveis de Inteiros
As variveis de inleiros (integer) amlazenam os conhecidos nmeros inteiros (isto ,
nmeros sem casas decimais). Essas variveis so as que voc usar com mais freqOncia nos programas e as mais fceis para os computadores tratar. Por causa dessa comodidade,
elas devem ser seu tipo preferido quando for preciso trabalhar com nllmeros. A Tabela 3.1 mostra
diversas variveis de inteiros diferentes, cada uma fo i criada para armazenar numeros de tamanhos distintos e para empregar quantidades diferentes de memria. A quantidade de memria utilizada medida em bytes. (Um byte contem oito bits, o que e apenas uma maneira tcnica de dizer
que cada byte possui oito algarismos um ou zero, ou uma combinao de uns e zeros.) Embora
no haja problema em usar uma varivel projetada para conter valores maiores do que o necessrio, ela consum ir mais memria. Alm disso, pode fazer com que seu programa seja executado
mais lentamente porque teria de manter registras de sees maiores da memria, mesmo que essas nunca fossem utilizadas,
Novo
TERMO
Dia 3
TABELA 3 . 1
Tipo
de Dado
Abrangncia
Comentrios
Byte
o a 255
Curto
(Short)
-32.768
Uma varivel de inteiros pequena e prtica. Voc pode usar um tipo curto sempre
que no precisar de todo o intervalo de um
tipo inteiro, por exemplo, se estivesse escrevendo um programa para contar a quantidade de empregados de urna empresa que
s tivesse alguns milhares de funcionrios.
a
32.767
Inteiro
(Integer)
Longo
(Long)
- 2.147.483.648
2.147.483.647
- 9.223.372.036.
854.775.808
a
9 .223.3 72 .036.8
54.775.807
67
lembre da notao cientfica que aprendeu na escola, o nmero sobrescrito acima do algarismo
10 a quant idade de vezes que preciso multipl icar por 10 (se pos itivo) ou dividi r por 10 (se negativo). Portanto, 106 lO seis vezes ou 1.000.000, e 10" igual a 0,000001.
TABElA 3.2
Tipo
de Dado
Tamanho
(Bytes)
Simp les
(Single)
Duplo
(Doubl e)
Abrangncia
Comentrios
- 3,402823 x 10JOa
- 1,401298 x 10"'s
para nmeros negativos;
1,401298 x \0-1 1 a
3,402823 x lO>!
para nmeros positivos
No se preocupe muito com o tamanho desses nmeros do intervalo. O tipo simples pode manter o
registro de nmeros muito grandes
(ou muito pequenos). O im portante
para este tipo de dado a preciso.
O nome 'simples' quer dizer que
este tipo de varivel para nlmeros
com pomo flut/lonte de preciso
simples. Esse o significado do jargo da infonntica: "Ele s realmente bom para annazenar sete
dgitos impoltantes". Examine cada
um dos nmeros do intervalo.
Observe que possuem um nmero
antes da casa decimal e seis a seguir, mais o expoente (o nmcro
acima do algarismo 10). Portanto,
embora o tipo simples seja bom
para armazenar tanto nllmeros
grandes quanto pequenos, no to
preciso quanto os outros, e poderia
causar erros de arredondamento se
voc fizesse muitos clculos com
valores realmente altos ou muito
baixos. O tipo de varivel simples
seria til em um programa em que
menos exatido fosse necessria.
- 1,797693 1348623 I x
IOJ<J~ a -4,9406564584124 7
x 1Oll. para nmeros negativos; 4,94065645841247
x 1O.J!' a 1,79769313486232
x IOlm para nmeros
positivos
'ponto flutuante com preciso dupla', portanto, annazena duas vezes mais dgitos sign ificativos que
o tipo simples ou 15 casas decimais. Use um tipo duplo sempre que
voc fizer clculos com nmeros
grandes ou quando quiser evitar os
erros de arredondamento que podem
acontecer no tipo simples, como ao
efetuar clculos em aplicativos cientficos ou de engenharia.
68
Dia 3
Strings e Caracteres
Os nmeros so adequados se voc precisa armazenar quantidades ou espaos de tempo, mas
com freqUnc ia tambm necessrio lidar com palavras na programao. O Visual Basic .NET
fornece variveis para armazenamento de strings: os tipos de dado Char e Stri n9. O tipo Char
apropriado para o armaze namento de apenas um caractere (da o nome), enquanto o tipo Stri ng
pode conter strings de comprimento maior. A Tabela 3.3 descreve os dois tipos de dados com
mais detalhes.
TABElA 3.3
Tipo
de Dado
Cha r
(Bytes)
Abrangncia
Comentrios
Um caractere
tere.
String
10 + 2
por
caractere
At dois
bilhes de
caracteres
Porq ue cada tipo Char e cada caractere de um tipo String ocupam dois bytes? Afinal , h apenas
25 caracteres usados no idioma portugus, alm dos nmeros e smbolos - decerto, voc no precisa de dois bytes (65.536 valores poss veis). No precisari a, se todas as linguagens empregassem o mesmo conjunto de caracteres.
Novo
TERMO
o cenrio o que o conjunto de caracteres ASCII (ou ANS I), popular no passado, de
No Unicode, cada caractere representado por dois bytes . Isso permite o armazenamento de todos os caracteres da li sta ASCI I, bem como os dos idiomas russo, grego, japons e tailands, os
dos matemticos e ass im por diante. Em Un icode, 65 ainda representa a letra ' A' , mas 8800 o
caraclere [iJ . O caraclere japons Hiranaga "IEM' ('no') representado por 12398. O Visual
Basic .NET usa os valores Unicode para todos os caracteres, portanto o ti po Cha r usa dois bytes,
e cada caractere de um tipo String acrescenta dois bytes de espao complementar de armazenamento.
69
3.4
Tipo
de Dado
Booleano
(Boo 1ean)
Abrangncia
Comentrios
Verdadeiro
(True) ou falso
(False)
Data
(Date)
1 de jane iro
de 100a3 1 de
dezembro de
9999
Voc poderia usar outro tipo de dado para armazenar datas como strin gs ou inteiro representando o perodo em dias aps alguma dat a especfica.
Declarando Variveis
Agora que voc conhece os ti pos de variveis dispon veis, como cri-las em seus programas? A
maneira mai s si mples com a palavra-chave Dim (abrev iatura de ' Dimenso'), seguida pelo
nome da varivel, a palavra-chave As e, por fim , pelo tipo da varivel. A aparncia a seguinte:
Dia 3
Arrays
A capacidade de uma varive l de armazenar qualquer coisa prtica e at mesmo essencial em
programao. No entanto, voc pode precisar armazenar vrios itens relacionados. Por exemplo,
se est ivesse escrevendo um programa de jogo de xadrez, os quadrados do tabuleiro precisariam
ser representados como um conjunto de itens re lacionados. Use os arrays para criar variveis
que armazenem juntos todos os itens relacionados. No programa do jogo de xadrez, o tabul eiro
provavelmente seria armazenado como um array de posies, cada uma contendo o tipo de pea
(ou nenhuma) dessa posio. Se no fosse usada uma varivel de array, teriam de ser empregadas 64 variveis separadas. Tambm pode ser preciso manter o registro de uma lista de strings,
por exem plo, dos nomes dos al unos de lima sala. Sempre que for necessrio armazenar uma li sta
de itens, use um array.
Como na declarao das variveis simples, a de um array feita com a palavra-chave Dim. No
entanto, h algumas diferenas entre declaraes de variveis simples e declaraes de arrays
porque esses so conjuntos de variveis. A Listagem 3.1 mostra trs maneiras possveis de declarar arrays.
COOIGO
LISTAGEM
3.1
Declarando Arrays
1 'Declarao simples
2 Oim iValues(3)As Integer
3 Oim dtDates()As Date
4 Oim I As Integer
5forI= lTo3
6 ivalues (I-1)=I
7 Next
8
9
10
11
12
LISTAGEM 3.1
71
13
14
15
16
17
18
19
20
21
22
ANLISE
No primeiro exemplo, i Val ues foi declarada como um array de trs membros. Todos os itens do array so inteiros (I nteger). Tudo faz sent ido. A parte potenciahnente confusa est na maneira usada para fazer referncia a cada membro do array. Isso mostrado no
lao For ... Next que vai da linha 5 7 (abordaremos o lao For ... Next no prximo captu lo).
Observe que os trs membros do array esto numerados de Oa 2. Portanto, o segundo membro do
array est na posio I, e no 2.
NOTA
Vale a pena ressa ltar que os computadores, diferente das pessoas, sempre comeam sua contagem com o zero. melhor deixar a verdadeira razo disso
nos recnditos de suas minsculas mentes de silicone, mas precisamos estar
conscientes desse detalhe, principalmente no que diz respeito a arrays.
o segundo array criado, com os meses do ano, fo i declarado e in icializado. Exatamente corno
voc pode in icial izar variveis simples quando as declara, possvel fazer o mesmo com arrays.
Nesse caso, no entanto, coloq ue cada elemento do array em uma lista delimitada por vrgulas,
envolvida em chaves, como mostrado na linha 16. Isso criar um array de 12 membros, com cada
elemento contendo uma string. Lembre-se, contudo, de que se quiser se referir a cada um, eles
estaro numerados de O a II - portanto, sMonths(10) seria "Nov", e no "Out".
A l ti ma declarao de um array dinamicamente dimensionado. Esse array pode depois ser redimensionado para o tamanho correto com a palavra-chave ReDim como mostrado na linha 10.
Como nos outros tipos, os itens do array dinmico esto numerados de zero a I menos 1. Depois
que o array fo r dimensionado, voc poder us-l o como qualquer outro. Esse tipo de declarao
til se o tamanho do array depender do valor de outra varivel, portanto, isso no seria conhec ido at o tempo de execuo.
Dia 3
72
ALERTA
Tenho repetido o fato de que todos os arrays comeam com O no Visual Basic
.N ET porque, anteriormente, o Visual Basic podia no ser operado dessa maneira. Em suas verses anteri ores ao Visual Basic .NET, voc poderi a usar a declarao Opt i on Base 1 no inicio de um mdulo para assegu rar que todos os
arrays criados nele comeassem em l o De modo alternativo, ao declarar arrays, seria possivel definir os membros in icial e final do array, como ser mostrado na decla rao a seguir. Nenhuma dessas opes est d isponvel para os
arrays do Visual Basic .NET .
Portanto, a linha de Cdigo a segui r no vlida no Visual Basic .NET:
Dim
s~gvalues(lS
To Sl)As Single
Atribuio
A atribuio foi simplificada no Visual Basic .NET. Verses mais antigas do Vi sual Basic (Vi~
suai Basic 4 .0 a 6.0) possuem duas maneiras d iferentes de atribu ir um valor a uma varivel uma para variveis simples (incluindo estruturas e arrays) e outra para variveis de objeto. Feliz~
mente, os desenvolvedores do Visual Basic .NET decidiram remover o mtodo de atribu io
usado para as variveis de objeto e empregar apenas o utilizado para variveis simples. Voc vai
atribuir valores s variveis (simples ou de objeto) colocando~as esq uerda de um sinal de igllal~
dade, como mostra o cdigo a seguir:
iSomeVar =1234
oObjectVar =New Something()
NOTA
Da verso 4.0 6.0 do Visua t Basic, as li nhas de atribuio mostradas anteriormente teriam aparecido com a seguinte f o rma:
iSomeVar =1234
Set oObjectVar =New Something
Contudo, as regras de quando usar Set eram con f usas, e a Microsoft removeu
a necessidade dessa palavra-chave.
Constantes
As constantes so outra classe de valores que voc pode usar em seus programas do Visual Basic
.NET. COllstallles so valores que no se alteram nunca ou durante a vida t il de seu programa.
Por exemplo, os meses de um ano, o valor de pi e o serv idor de banco de dados a parti r do qua l
seu programa recupera dados, todos so valores constantes. possvel definir um valor como
constante quando ele for declarado. Qualquer tentativa de alterar o valor de uma constante ser
assinalada como um erro enquanto voc ainda estiver no IDE ( lntegrated Development Environment) e antes de tentar executar o apl icativo. As constantes so declaradas usando-se as duas formas mostradas no cdigo a seguir:
73
COOIGO
ANALISE
Longo (Long)
Para qualquer nmero inteiro declarado.
Duplo (Oouble)
Para qualquer nmero decimal declarado. (Observao: se o valor
fo r efeti vamente muito grande para um tipo duplo, ele ser truncado.)
Para qualquer valor com caracteres.
String
Defina o tipo que quiser quando declarar constantes, exatamente como faz
com as variveis.
NOTA
TipO de Varivel
Prefixo
Exemplo
Byte
byt
bytldade
Curto (Short)
sht
shtContagem
Inteiro (integer)
i ou i nt
iOvelhas
Longo (Long)
l ou lng
1Popul acao
Simples (Single)
,"g
sngGolpe
Dia 3
TABELA
3.5
Tipo de Varivel
Prefixo
Exemplo
Duplo (double)
d ou db 1
dblJuros
Char
cIniciaisIntermediarias
String
s ou s tr
sNome
Booleano
bEstaAberto
Data (Date)
dt
dtDataA I uguel
Tipos definidos
pelo usurio
Variveis criadas, com base em estruturas equivalentes a um ponto ou retnguio poderiam ser chamadas de
ptLocal e retTamanho
Constantes
PI, TAXA_IMPOSTO
Enumeraes
disDiaSemana, corCorFundo
NOTA
Por que essa confuso de um, dois e trs caracteres? Tenho de adm itir que alterei os prefixos que uso com o passar dos anos. Minha filosofia bsica era originalmente empregar s um caractere, para li mitar a desordem que os
prefixos causam. No entanto, alguns deles s iriam provocar mais confuso .
Por exemplo, qual seria o tipo de dado de sVa 1ue? Poderia ser o curto (Short), simples (Si n91 e) ou Stri n9. Para tipos de dados que comeam com a mesma letra, estendi o prefixo em alguns caracteres. Devo admitir, contudo, que ainda tendo a
usar a letra s para strings porque tem sido empregada com freqncia. (Voc
tem de fazer alg uns sacrifcios para evitar a sndrome do esforo repetitivo.)
Quando comea r a usar esses prefixos, voc pode acha r que so um pouco
confusos. No entanto, eles logo se tornam familiares, e as informaes que
fornecem so inestimveis.
Clculos Simples
Apenas
ter alguns valores definidos no produz um programa. Voc precisa fazer algo COm eles.
,
E necessrio efetuar clculos matemticos com os valores ou gerar algo mais substancial. De
maneira semel hante, para tomar seus programas mais compreensiveis, com freqUncia ser preciso usar ou criar procedimentos. O Visual Basic .NET fornecer alguns deles; outros tero de
ser escritos. Esses procedimentos vo de operadores, que executam muitos dos clculos matemticos COmuns, a funes mais complexas que poderiam afetar strings ou nmeros.
75
Usando Operadores
No Visual Basic .NET, os operadores executam clculos simples e ' fu nes' semelhantes. A
maioria dos operadores deve ser fami liar a voc como smbolos algbricos comuns. No entanto,
alguns deles so exclusivos da programao. A Tabela 3.6 lista os operadores mais usados.
TABElA 3.6
Operador
Uso
Exemplo
::
x" 6
Y " X 7
y " X - 4 (Y igual a 2)
y " X / 2 (Y igual a 3)
y " X \ 3 (Y igual a I)
Mod
y :: X Mod 3 (Y igual a 2)
&
."
X +:: 2 (X igual a 8)
X -= 3(Xiguala5)
.~
&~
(Y igual a (3)
I" 5 (X igual a 6)
Funes Internas
Alm das fornecidas pelo .NET Framework , o Vi sual Basic .NET possui muitas funes internas. Essas funes geram vrios recursos lIteis, incluindo a converso de um tipo de dado em outro, clc ulos matemt icos, manipulao de strings e assim por diante. Voc deve conhecer
algumas delas para poder prossegu ir com o estudo do Visual Basic .NET.
Dia 3
76
Funes de Converso
Algumas das funes mais importantes disponve is no Visual Basic .NET so as de converso.
Elas permitem que um tipo de dado seja convertido em outro. As funes de converso se torna
mm ainda mais importantes nessa verso do Visual Basic porque ela muito mais restrita com
relao aos tipos de dados, e no converte automat icamente um tipo em outro como as anteriores
faziam.
Se voc quiser que o Visual Basic .NET converta de modo automtico os tipos
Todas as funes de converso do Visual Basic .NET comeam com a letra 'C' (como na palavra
converso) e terminam com uma forma abreviada do novo tipo. Alm disso, h uma funo genrica, Ctype, que pode efetuar converses para qualquer tipo. A Tabe la 3.7 descreve as principais funes de converso.
TABElA
3.7
Funes de Converso
Funo
Descrio
CBool
Converte para um booleano (Bool ean). O que for avaliado como falso (Fa 1se)
ou Dser configurado como falso (Fa 1se); caso contrrio, ser definido como
verdade iro (True).
CByte
Convene para um tipo Byte. Todos os valores maiores do que 255 ou informaes fracionrias sero perdidos.
CChar
Converte para um nico caractere. Se o valor for maior do que 65.535, ele ser
perdido. Se voce converter uma St ri ng, s o primeiro caractere ser alterado.
CDate
Converte para uma data (Date). Uma das fun es ma is avanadas de converso, CDate pode reconhecer alguns dos formatos mais com uns de insero de
datas .
CObl
Clnt
CLng
CSht
CStr
Converte para uma String. Se o valor for uma data (Date), apresentar o formato abreviado.
77
TABELA
3.7
Funo
Descrio
CType
Converte para qualquer ti po. uma funo poderosa que permite a converso
de qualquer tipo de dado em outro. Portanto, a sintaxe dessa funo um pouco
diferente das outras.
SINTAXE
A s intaxe de Clype
oNovaVariavel = CType(oVariavelAnterior. NovoTipo)
onde oNova Variave 1 e oVori ave lAnterior so lugares reservados para as variveis
resultante e original da converso, respectivamente. O tipo que surgir aps a converso ser o inserido em NovoTipo. Ele pode ser qualquer varive l ace ita depois de
As em uma declarao, portanto, possvel usar essa funo para efetuar converses
para tipos de objeto, enumeraes e estruturas, assim como para tipos simples.
Funo
Exemplo
eh,
Ase
Left
2)
Right
4)
('iValue
Dia 3
TABELA
3.8
Funo
Descrio
Exemplo
Mid
Encontra
uma string dentro de outra.
,
E ti l quando se procura a lguma
string em um arquivo. A sintaxe da
funo Instr
iReturn = Instr(CaractereInicial ,
St ringPesquisada, ltemProcurado.
TipoCorrespondncia)
4)
CoractereInicial a posio na
StringPesquisado, onde o programa
iniciar a busca (a contagem comea
em I). StringPesquisodo onde ser
executada a busca e ltemProcurodo
a string que se quer encontrar.
79
TABELA 3.8
Funo
Exemplo
Lcase
sValue
LCase("OIc1 Mundo")
sValue
UCase("OIc1 Mu ndo")
Value
sValue
sVa lue
Rtrim("
Ol Mundo ")
Trim("
"
oa
Ol Mundo"
Mundo
")
3.9
Funo
Descrio
IsArray
IsDate
IsNumeric
IsObject
TypeName
Retoma o nome do tipo de dado do parmetro, por exemplo, TypeName(sName) retomaria "String" .
Dia 3
TABELA
3.9
Funo
Descrio
Now
Today
Sub-Rotinas
Uma sub-rotina um bloco de cdigo do Visual Basic .NET que executa alguma tarefa - porexempIo, o mtodo Console . WriteLine que voc v em muitos dos exemplos. Ele exibe infonnacs na
tela, mas no retoma nenhum valor. Use as sub-rotinas para executar tarefas em seus programas.
Em geral aconselhvel inserir em uma sub-rotina um cdigo que ser executado mais de uma
vez. De maneira semelhante, se tiver de usar um cdigo em vrios aplicativos, bom que tambm o coloque em uma sub-rotina. As sub-rotinas permitem que um pequeno trecho de seu programa seja isolado, de modo que, em vez de repetir todo o bloco de cdigo, s seja preciso
referenci-lo pe lo nome. Isso no significa que a sub-rotina sem pre executar exatamente as
mesmas etapas, mas que realizar alguma tarefa. Por exemplo, um receita pode instruir, "Adicione
uma poro de vinagre a trs de leo". Em um momento pode-se misturar uma xcara de vinagre
a trs de leo, enquanto em outro, podem ser somente trs co lheres de sopa de vinagre para nove
de leo. De qualquer modo, fo i executada a sub-rotina CrieVinagrete. Sim, estou cozinhando o
jantar enquanto escrevo isso.
Para criar suas sub-rotinas, use a palavra-chave Sub:
SINTAXE
Nessa sintaxe, cada parmetro define um valor que tem de ser passado para a rotina.
A Listagem 3.2 mostra a declarao e o uso de uma sub-rOlina.
COOIGO
LISTAGEM
3.2
81
Nossa sub-rotina comea com a palavra-c have Sub, corno vemos na linha I. A
sub-rotina se chama ShowMessage e usa um parmetro quando chamada. Ela termina com a palavra-chave End Sub (linha 3). No interior est o cdigo real executado pela sub-rotina.
Nesse caso, ela apenas exibe o contedo do parmetro na janela do console. A linha 4 mostra urna
maneira possvel de chamar a sub-rotina, passando a string "Ol Mundo do V; sua 1 Bas; c .NEl" .
ANLISE
Funes
Criar suas funes permitir que voc insira novos recursos em seus ap licativos. Gerar uma funo semelhante a definir novas sub-rotinas, exceto por ter de ser definido o tipo de valor retornado. Dentro do procedimento, identifique o valor a ser retornado, como mostrado abaixo:
SINTAXE
Function NomeFuno(Parmetrol
tornado
As
As
Type)
As
TipoRe-
Nessa sintaxe, cada parmetro define um valor que ter de ser passado para a rotina;
TipoRetornodo o tipo de dado que a funo retoma, e ValorRetornado, o valor que
ser retomado pela funo. A Listagem 3.3 mostra a declarao e o uso de uma funo sim ples.
CDIGO
LISTAGEM
3.3
Escopo
Novo TERMO
Escopo uma dessas palavras adorveis do jargo da infomltica que signi fica
"Quem mais pode me ver?". Formalmente, o escopo define a visibi lidade das vari-
82
Dia 3
veis de um programa, isto , que rotinas poderiam usar uma cena varivel. Voc pode no querer
que todas as rotinas acessem todas as variveis. Penn itir que todas as rotinas conheam todas as
variveis poderia levar uma rotina a 'acidentalmente ' alterar o valor de uma varivel, introduzindo um erro em seu programa.
Al agora, temos em geral declarado as variveis por meio da palavra-chave Oim dentro dos proced imentos. No entanto, voc tambm pode declarar as variveis externamente para torn-las
disponveis a vrios procedimentos. Se fizer isso, poder usar duas outras palavras-chave, Public e Private:
As varivei s Pub 1ie ficam disponveis em todo o aplicat ivo. Elas so variveis globais,
que existem globalmente, ou, por todo o ap licativo. Devem ser usadas parcimoniosamente, mas sero teis quando voc precisar de algum valor que ser empregado em muitos
pontos de seu programa, corno a conexo a um banco de dados, ou um arquivo.
DICA
Quando for criar uma varivel, bom declar-Ia o mais prximo possivel de
onde ela for necessria . Se voc s for usar uma varivel em um procedimento, declare -a dentro dele.
Use as variveis Private e PlJbl ic no nivel de mdulos com m odera o.
o escopo permite que voc isole os dados usados pelos procedimentos de se u aplicativo. Muitas
verses mai s antigas do BA SIC no ti nham o recurso do escopo, e todas as variveis podiam ser
acessadas e alteradas de qualquer parte do programa. Imag ine escrever um programa naquela
poca - voc poderia reutilizar com freqncia (propositada ou acidentalmente) uma varivel
em qualquer local de um programa. Isso poderia levar a uma fa lha se o va lor fo sse a lterado em
algum ponto, s para que se cometesse o erro de Icr posteriorm ente o novo valor. quando o pretendido fosse o original.
83
ele descreve em que outro local de seu programa voc pode usar o procedimento (ou fora de seu
programa, como veremos quando comearmos a criar objetos).
O escopo do procedimento definido com o uso das mesmas palavras-chave empregadas para o
das variveis. Em geral, ele tambm possui o mesmo significado.
Publ i c O procedi mento pode ser chamado de qualquer parte do ap li cat ivo. Esse o
padro se voc no ad icionar nenhuma outra palavra-chave.
Private O procedimento s pode ser chamado a partir de outro que esteja situado
dentro do mesmo mdulo ou classe onde foram definidos. Isso ser ti l quando voc estiver escrevendo vrias rotinas de suporte usadas no decorrer de um clculo, mas as outras
no precisariam us-lo.
Do mesmo modo que com as variveis, as palavras-chave adicionais de escopo sero aplicadas
quando voc estiver criando objetos no Visual Basic .NET. Exam inaremos essas palavras-chave
posterionnente.
1
2
3
4
5
LISTAGEM
3.4
InvestCalc.exe
Saldo Inicial : 10000
Juros Anuais (por exemplo , para 5%, insira 5) :5
Depsito Mensa l : 200
Perodo do Invest imento em Anos: 30
Dia 3
Ini ci al , Juros Anuai s, Depsito Mensal e Perodo do Investimento em Anos). Por sua vez, ele calcular o saldo final. Essa
operao conhecida como clculo do valor futuro (FV), e o Visual Basic .NET a inclu i como
uma de suas funes internas. A frmula do Valor Futuro
Meses
As etapas a seguir descrevem esse procedimento para que voc possa compreender melhor como
funciona:
1. Comece criando um novo projeto no Visual Basic .NET. Selecione um novo aplicativo
do console. O visual Basic .NET criar um projeto com um mdu lo.
2. Feche ajanela do arquivo e o renome ie usando o Solution Explorer. D um clique com o
boto direito do mouse no nome do arquivo, Modul eI. vb, no Solution Exp lorer e selecione Rename. Altere o nome do arquivo para modInvesLvb.
3. Altere o nome de Startup Object tambm. D um clique com o boto dire ito do mouse no
projeto do Solution Explorer e selecione Properties. Na pgina General , altere o Startup
Object para Invest. Ele deve estar na lista suspensa.
4. Voc est pronto para comear a cod ificar. Precisa de ao menos quatro variveis para armazenar a entrada do usurio. Declare-as como mostra a Listagem 3.5. A maioria desses
valores de numeros de ponto flutuante, com exceo de Periodo. Essas declaraes devem ocorrer entre as linhas Modul e e Sub Mai n( ) porque as varive is estaro no nvel do
mdulo.
CDIGO
I
2
3
4
Private
Private
Private
Private
LISTAGEM
3.5
dblJurosAnuais As Double = O
iPeriodo As Integer = O
decSaldolnicia l As Double = O
decOepositoMensal As Oouble = O
5. Use a rot ina Mai n para chamar as rotinas de obteno das entradas do usurio, execuo
dos clculos e exibio do resultado, como na Listagem 3.6.
CDIGO
LISTA GEM
3.6
Rotina Main
CDIGO
LISTAGEM
3.6
85
7
iPeriodo , _
8
decDepositoMensal ,
9
decSaldolnicial)
10
'exib icao do resu lt ado
11
DisplayResults(decResultado)
12 End Sub
Na Li slagem 3 .7, cada fu no principal do apli cativo uma sub-rotina ou funo separada. Isso permitir que voc altere ma is rapidamente as tcnicas para obter as entradas ou
exi bir o resultado posteriormente.
6. Adicione o cdigo da Listagem 3.7 para permi tir ao usurio inserir informaes. O procedimento no usa nenhum parmetro, nem retorna um valor. J que esse um aplicativo
do console, voc empregar a rotina Cons01 e. Read para obter valores.
CDIGO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LISTAGEM
3.7
O bserve que a sub-rotina GetInputVal ues chama a funo GetVal ue. Esse um exemplo da criao de rot inas de suporte. Em vez de reescrever o cd igo para solicitar informaes ao us urio
vrias vezes, isole-o e crie um proced imento para executar a tarefa. Dessa maneira, o cdigo res ultante para GetInputVa 1ues ser simplificado.
86
Dia 3
7. Escreva a rotina que exibir a sada quando for calculada . No final , ela poder ser exibida
em uma janela, mas por enquanto, llse o procedimento Canso 1e . WriteL i ne, mostrado na
Listagem 3.8, para exibir as informaes. Esse procedimento deve pegar o valor a ser
exibido e no retornar nada.
CDIGO
LISTAGEM
3.8
3
4
5
6
7
Console.Wri teL i ne()
8
Console .Wr"iteLlne("Seu saldo final ser : 10:c)" , Resultado)
9 End Sub
Essa uma rot ina simples, composta de vrias chamadas a Consol e. Wri teL i ne para exi
bir os valores inseridos e o resu ltado do clculo.
8. Execute a clculo do valor futuro. Essa rotina deve usar os quatros valores como parme
tros e retornar o resultado do clculo. Como possu i um valor de retorno, esse proced i
menta um a fu no. A Li stagem 3.9 mostra a funo CalculateFV.
CDIGO
LISTAGEM
3.9
A Funo CalculateFV
87
Exatamente como em GetInputVa 1ues, voc poderia ter isolado o cdigo que calculou o valor de
decTemp. No entanto, j que s precisamos desse clculo nessa rotina e bem provvel que ele
no seja mais necessrio, foi melhor no faz-lo.
A Listagem 3. 10 mostra o cd igo completo para o exemplo do aplicativo.
CDIGO
LISTAGEM
3.10
1 Modu le Invest
2
3
Private dblJurosAnuais As Ooub l e = O
4
Priv ate iPeriodo As Integer " O
5
Priv ate decSa ldolnicia l As Double = O
6
Private decDepositoMensal As Double " O
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub MainO
Dim decResultado As Double
'obteno dos valores das entradas
GetlnputValues()
'clculo
decResultado = Ca l culateFV(dbIJurosAnuais.
iPeriodo. _
decDepos itoMensal .
decSa ldoInicia l)
'exibio do resultado
DisplayResults(decResultado)
End Sub
Priv ate Function CalculateVF(ByVal JurosAnuais As Double .
ByVal Periodo As Integer. _
ByVal DepositoMensal As Double ._
ByVal Saldolnicial As Doub l e)As Double
'divida por 1200 para torn - lo um pe rcentual mensa l
Dim decJurosMensais As Double " CDec(JurosAnuais / 1200)
Dim iMeses As Integer = Periodo * 12
Dim decTemp As Double
Dim decReturn As Double
'precisaremos desse valor em alguns loca is
decTemp = CDec1 + decJurosMensais) A iMeses)
decRe turn " COec( OepositoMensal * decTemp -1)
/ decJurosMensais)_
+ (Saldolnicial * dec Temp)
Return decReturn
End Function
37
38
39
88
Dia 3
COOIGO
LISTAGEM 3. 10
40
41
42
43
44
45
Console . Wr'iteLineO
decSaldoln i cial = CDec(GetValue("Saldo Inicial : "))
46
dblJurosAnuais
47
lO
48
49
50
51
52
53
54
Console.WrHeLineO
55
56
Console . WrHeLine(" e investir {O:c} por ms", decDepositoMensal)
57
Console.WrHeLine("durante {O} anos", iPeriodo)
58
Console.WrHeLine("a {O} % de juros.", dblJurosAnuais)
59
Console.WrHeLineO
60
Console.WrHeLine("Seu saldo f inal ser: 10 : c)", Resultado)
61
End Sub
62 End Module
9. Execute o aplicativo. O resultado deve ser semelhante ao mostrado no incio desta seo.
Voc pode executar o apl icativo a partir do IDE dando um clique no boto Pl ay da barra
de ferramentas. No entanto, provvel que a janela exibida desaparea muito rapidamente para que se possa ver a resposta. Em vez disso, execute o programa a partir do
prompt de comando processando o executvel criado.
Voc pode tentar fazer uma experincia surpreendente com esse programa dec1culo. Insira os valores dos depsitos que representam quanto voc costuma gastarem um hbito mensal (almoo no
trabalho, cigarros, dispositivos eletrnicos) . O valor futuro resu ltante em gera l perturbador.
Resumo
A lio de hoje avanou bastante, examinando os diversos tipos de variveis que voc pode criar
no Visual Basic .NET e como empreg-las. A lm disso, explorou o conce ito de fu nes e
sub-rotinas, tanto as que esto embutidas no Visual Basic .NET quanto as que podem ser criadas.
Esses dois tpicos so fundamentais para sua compreenso do Visual Basic .NET e sero usados
cm todos os t ipos de aplicativo.
89
P&R
P Li que o Visual Basic .Net d suporte prog ramao ' sem tipos' . O que isso?
R Quando voc declara o tipo de uma varivel ou funo , define certas regras: que espcie
de informaes ela representa, onde pode ser usada e assim por diante. A programao
sem lipos ocorre quando o ti po no declarado. Todas as varive is so, ento, objetos
que podem conter qualquer tipo de informao. O Visual Basic .NET o nico membro
da fam lia Visual Studio que d s uporte a esse tipo de programao.
P Quando quiser criar um procedimento, ele deve ser uma s ub-rotina ou uma funo ?
R Uma resposta breve seria, " Depende". Voc deve criara tipo de procedimento que fornea a fu ncionali dade necessri a. A lguns so bv ios. Se for preciso gerar um procedimento
que execute alguns clculos ou mani pulaes e retorne o resultado, bom usar uma funo. Outras rotinas - aquelas q ue podem ou no ter de retornar um valor - efelivamente
levam a uma escolha. Alm disso, no h escolha co rreta, apenas prefernc ias. Se for
evidente a inex istncia de um valor a ser retomado, selecionar qual tipo de procedimento
ser criado uma questo de op inio pessoal e/ou empresarial. Algumas pessoas e empresas sempre usam funes; out ras criam sub-rotinas quando necessrio .
P Como posso encontrar a lista d e todas as fun es internas?
R H duas maneiras pelas quais voc pode encontrar informaes sobre as funes internas:
Aj uda on-line A ajuda on- li ne contm descries e exemplos de cd igo de todas as fu nes internas. Voc pode encont r- los (on-U ne) procurando por Visual Basic Language
Reference.
Object Browser Se tudo que voc precisa de uma descrio breve de um a fu no interna, poder encontr- Ia no Object Browser. Abra-o selecionando View, Other Wi ndows e Object Browser. As funes internas se encontram na seo Microsoft. Vis ualBasic.dll .
Workshop
o Workshop foi planejado para aj ud-lo a antecipar possveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, " Respostas dos Testes/Exercicios" .
Dia 3
90
Teste
I. Como devo decidir que ti po de varivel usar quando estiver trabalhando com nluneros?
A: Dim lValue
RaiseToPower(3 . 4)
B: RaiseToPower 3,4
C: Console.WriteLine{RaiseToPower(3,4))
O: Dim lValue =Ra iseToPower 3,4
3. Se uma varivel for declarada com o uso da palavra-chave Pr; vate, onde poder ser usada em um programa?
Exerccios
I. Reescreva o exemplo do aplicativo para clculo do valor futuro de modo que represente
o pagamento de um emprstimo em vez de um investimento. Ele deve sol icitar a quant ia
do emprstimo, os juros anuais, o perodo em meses e calcular o valor de seus pagamentos. A frmula para esse clculo
JurosMensais)
SEMANA
DIA
Controlando o Fluxo dos
Programas
At agora, este livro abordou a criao de programas de computador, mas para escrever um que
seja realmente til, voc precisa de mais alguns elementos essenciais. At o momento, estivemos desenvolvendo prog ramas compostos de uma srie linear de instrues; cada linha era executada em ordem quando o programa era processado. Para que um programa seja realmente
interativo, para que use caminhos diferentes no decorrer do cdigo dependendo das entradas que
receber, preciso um novo tipo de instruo, uma instruo de controle. Quase toda linguagem
de programao possui instrues de controle, e o Visual Bas ic .NET no uma exceo. Nesta
lio voc aprender sobre as duas categorias de instrues de controle:
Instrues condicionais
Jnstrues de lao
Em cada categoria, abordarei di versas variaes dos tipos, e voc aprender que instruo especfica melhor para uma situao em particular.
92
Di a 4
por causa do valor de algumas variveis ou outra circunstncia, permiti ndo que o programa aja
diferentemente dependendo da situao . A necessidade desse tipo de com portamento evidente
quando voc percorre a maioria dos program as que usam pseudocdigo.
Novo TERMO
Quando descrevemos um prob lema por meio de uma linguagem que algo entre
guagem para descrever o que seus programas devem fazer. Muitas pessoas, incl uindo os autores
deste livro, acham essa maneira til para planejar o fluxo de seus programas de um modo que lei-
gos tambm possam compreender. Pode ser muito mais fc il descrever um programa inteiro em
pseudocdigo antes de compor o cdigo real (isso se tomar excessivamente importante quando
voc lidar com programas mais complicados).
Por exemplo, consideremos um cdigo que consistiria apenas em uma pequena parcela de um
aplicativo, a saudao na hora da conexo. Usando a li nguagem com um para descrever o que
esse cdigo faz, voc poderi a dizer, "D as boas-vindas ao usurio que iniciou O programa, usando a saudao apropriada dependendo da hora do dia". Para um trecho to pequeno de cd igo,
essa provavelmente seria a descrio integral fornec ida, e a cod ificao poderia ser iniciada exatamente nesse ponto. Com relao a essa tarefa especfica, o pseudocdigo poderia ter a aparn
cla
a seguIr:
Quando o programa for iniciado ...
Se for antes do meio -dia, exiba "Bom Dia !"
Se for depois do meio-dia , porm antes das 6 da tarde, exiba "Boa Tarde!"
Para qualquer out ra ho ra, exiba "Boa Noite!"
Continue com o restante do programa ...
Mesmo esse exemplo simp les mostra a necessidade de tomar algumas dec ises no cdigo, para
perm itir que o programa ex iba uma mensagem diferen te dependendo da hora do dia. Para transformar isso em cdigo, use urna instruo de controle a fim de que possa verificar uma cond io
(nesse caso, a hora) e, cm seguida, escolha que ao tomar.
A Instruo I f
A instruo de controle I f a mais sim ples, e a mai s comum em quase toda li nguagem de programao. Ela possui vrios formatos diferentes, mas basicamente tem a segu inte aparncia:
If <condio >Then
Cdigo a ser executado se a condio for verdadeira
End If
A <condi o> a parte essencial dessa instruo; ela determina se o bloco de cdigo interno ser
executado ou no. Essa condio torna a fonna de uma expresso, que uma combinao de valores e operadores avaliada no tempo de execuo para gerar um nico valor. J que a instruo
93
Cada uma dessas expresses verdadei ra ou no. No h meio lermo e, portanto, elas se enquadram como a condio de uma instruo I f . Se voc tiver alguma dvida sobre a conformidade
de urna expresso em particular, apenas teste-a no pseudocdigo. Por exemplo, considere estas
expresses:
3+5
John
Quarta-feira
Agora, teste uma dessas expresses em seu pseudocd igo: "Se 3 + 5, ento, encerre o programa". O que isso sign ifica? A expresso "3 + 5" no tem um resultado que possa ser avaliado
como verdadeiro ou fal so e, portanto, a instruo I f no faz nenhum sentido. Expresses que retornam verdadeiro ou fa lso so conhecidas como boo/ealTas; abordarei esse assunto com mais
detalhes ainda nesta lio.
A seguir, iremos voltar ao exemplo original do pseudocdigo, exib indo uma saudao no incio
de um programa.
Quando o programa for iniciado .. .
Se fo r antes do meio-dia, exiba "Bom Dia !"
Se for depois do meio-dia , porm antes das 6 da tarde, exiba "Boa Tarde!"
Para qualquer ou tra hora , exiba "Boa Noite!"
Continue com o restante do programa ...
Antes de voc converter esse pseudocd igo em um programa do Visual Basic .NET, pode valer a
pena aproximar essas mesmas li nhas (legveis pelo usurio) um pouco mais do que seria um cdigo. Isso pode ser feito apenas pe la reformulao do texto para fornecer mais detalhes :
Quando o programa for iniciado ...
Se a hora atual no s i stema for menor que meio-dia
ento , exiba "Bom Dia!"
Se a hora atual no s i stema for igualou maior que meio-d ia
e a hora atual do sistema tambm for menor que 6 da tarde
ento , exiba "Boa Tarde!"
Se a hora atual no s i stema for igualou maior que 6 da tarde
Dia 4
Greet i n9 . vb
1 Imports System
2
3 Public Class Greet i ng
4
'Execute o aplicativo
5
Shared Sub Ma in{ )
6
Dim dtCurrent As System.DateTime
7
Dim iHour As Integer
8
dtCurrent = dtCurrent. Now()
9
iHour = dtCurrent.Hour
10
11
12
13
14
15
16
17
18
19
20
21
22
23 End Class
Voc pode fazer o download de Greeti n9. vb na pgina deste livro na Web e test-lo. Para com pilar
esse programa, e a maioria dos exemplos desta lio, faa o download desse arquivo ou crie um arquivo de texto, insira o cdigo da Listagem 4.1 nele e, em seguida, salve-o como Greet i n9. vb. V
para o console de comando (prompt do DOS), use o comando cd (change director)', alterar diretrio)
para se assegurar de que est trabalhando no mesmo diretrio do arqu ivo Greeti n9. vb e compil e
o programa digitando vbc r:System.dll t:exe Greeting.vb. O compi lador criar, por padro, um programa executve l com o mesmo nome do arquivo-fonte, portan to, nesse caso,
95
ANALISE
Estendendo a Instruo If
Embora a Listagem 4.1 seja bem direta e decerto no o programa mais complicado do mundo,
efetivamente levanta uma questo: por que se preocupar com a execuo de um cdigo depois
que voc tiver obtido sua resposta? Esse um bom ponto. Mesmo que as linhas 18 a 20 da Listagem 4. 1 fossem apenas algumas linhas adic ionais de execuo, poderia haver muitas outras sobrando no final de um programa no mundo real. Nesse programa, a inteno era realmente passar
para a prxima instruo If, s se a aluai fosse falsa. Poderia ter sido mais claro em meu pseudocdigo escrevendo-o da maneira a seguir:
Quando o programa for iniciado ...
Se a hora atual no s istema for menor que meio-dia
ento, exiba "Bom Dia!"
caso contrrio
Dia 4
4.2
Greeting_IFELSE . vb
1 Imports System
2
3 Public Class Greeting
4
'Execute o aplicativo
LISTAGEM 4.2
5
6
7
97
Greeting_IFELSE.vb (continuao)
10
11
12
13
14
15
16
17
18
19
20
If (iHour <12)Then
Conso1e.Write1ine("Bom Dia!")
E1 se
If (iHour >" 12)And (iHour <18)Then
Conso1e.WriteLine("Boa Tarde!")
E1 se
Conso1e .WriteLine("8oa Noite!")
End If
End If
End Sub
21
22
23 End C1ass
Mais simples? No, nem tanto, mas a Listagem 4.2 mais eficiente que a 4.1. Nessa nova verso
da soluo, depois que a saudao correta foi exibida, o programa fo i encerrado. Nenhum cdigo
desnecessrio foi executado.
Nesse programa especfico, aninhei outra instruo I f dentro de cada clusula E1 se, para testar
mais uma cond io caso aanlerior fosse fa lsa. No s um cdigo desse tipo que pode se r inserido em uma clusula E1 se, mas como essas instrues I f aninhadas so freqUentes, o Visual Basic acrescentou mais uma melhoria, a instruo E1 self. Essa instruo combina a funcionalidade
de E1 se, com a possibilidade de oulra instruo If ser aninhada ou aparecer imed iatamente a seguir. Sua sintaxe uma condensao do que voc teria de escrever se usasse I f e E1 se. A seguir,
vemos a sintaxe de uma instruo I f em que a clusula E1 se contm outra instruo I f aninhada,
seguida pela sintaxe que seria usada com a instruo E1esIf:
If <condio #1> lhen
Dia 4
Elself <condio 12> lhen
bloco de cdigo 12
End If
Observe que falta um a instruo End I f complementar na segunda sintaxe do exemp lo. A instruo E1 seI f considerada apenas uma clusula e, portanto, tambm faz parte da instruo I f origi nal. Ainda seria possvel inserir uma clusula Else naquela segunda cond io ou at mesmo
outra clusu la ElseIf. Esses dois exemplos so mostrados aq ui:
If <condio #1> Then
bloco de cd i go I I
ElseIf <condio 12> lhen
bloco de cd igo 12
Else
bloco de cd igo 13
End If
4.3
Greetings_Elself.vb
1 Imports System
2
3
4
5
6
7
8
9
10
11
12
13
14
LISTAGEM 4 .3
Greetings_Elself.vb (continuao)
Conso 1e. Wri teU ne (" Boa la rde! ")
15
16
17
18
19
99
Else
Console.WriteLine{"Boa Noite!")
End If
End Sub
20
21 End Class
>
Esse conceito da linha nica pode ser ampliado com a introduo de urna clusula E1 se:
If iHour
>
Ele pode at ser usado com mais de uma instruo a ser executada em blocos de cdigo verdadeiros ou falsos (ou em ambos) j que instrues mltiplas podem ser separadas com o uso de doispontos, como na linha a segu ir:
If iHour
>
Inclu essa instruo mais para fins de complementaridade do q ue por alguma necessidade real.
No h nada que voc possa fazer com a instruo If em apenas uma linha que no seja possvel
fazer com a forma habitual em bloco. Colocar todo o cdigo em uma linha no far com que seja
executado mais rpido. Tudo que se consegue, na maioria das vezes, produzir um cdigo-fonte
que ocupa menos espao em disco e muito mai s dincil de entender. Ocasionalmente, essa verso de linha nica pode dar a seu cdigo uma aparncia melhor, como mostramos na Listagem
4.4. Nessa listagem, vrias instrues If foram necessrias, todas executando um cdigo simples se suas condies forem verdadeiras. Essas situaes so muito raras para j ust i ficar o uso de
outra sintaxe em uma instruo to simples. Recomendo a adoo da OUlra forma dessa instruo
para que no provoquemos dores de cabea em nossos colegas programadores.
LISTAGEM 4.4
Dia 4
100
1
LISTAGEM 4.4
Operadores de Comparao
O tipo mais comum de expresso usado em programas uma comparao, duas expresses no
booleanas com um operador no meio. Os operadores de comparao a seguir esto d isponve is
para serem usados em expresses:
<>,
diferente de
>=,
maior ou igual a
<=,
menor ou igua l a
Todos esses operadores funcionam tanto com strings quanto com valores numricos. Um operador de comparao adicional, Li ke, tambm est disponvel para verificar a correspondncia de
padres nas strings. O operador Li ke perrnite que voc compare uma varivel de string com pa-
101
dres que empreguem caracteres especiais e comuns. Entre os caracteres especiais que podem
ser usados com Li ke esto:
4.5
PatternMatcher.vb
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Depois de inseri-lo em um arquivo de texto (ou fazer seu download) e compilar (vbc It :exe PatternMatcher. vb), tente executar esse programa com vrias entradas. Por exemplo, voc poderia
usar um padro como C*T e tentar testar valores como CAT, coat, ct e assim por diante.
Operadores Lgicos
o outro tipo de expresso que pode ser usada corno booleana a que emprega operadores lgicos. Esses operadores trabalham com expresses ou valores booleanos e produzem um resultado
102
Dia 4
booleano. J que os valores booleanos so muito semelhantes aos bits (valores binrios, 1 ou O),
os operadores lgicos so freqentemente chamados de comparaes bit a bit. Os operadores
dessa categoria so ANO, DR e XOR, que comparam dois valores ou expresses, e NOT, que usa um
nico valor Oll expresso booleana.
Ao usar o operador ANO entre dois valores booleanos, voc s obtm um resultado igual a verdadeiro se os dois o forem . Com DR, se um dos valores for verdadeiro, ento o resultado tambm
ser. O operador XOR, tambm chamado de exclusil'eOR, gera um resultado verdadeiro, se um dos
valores for verdadei ro e o outro for falso. NOT apenas um operador de negao: retoma o oposto
de qualquer valor que for usado com ele. A Tabela 4.1 lista todas as combinaes possveis de
valores e o que os diversos operadores lgicos produziriam em cada caso . Em todos os exemplos, seria possvel subst ituir os valores True (verdade iro) e Fa 1se (falso) por expresses que pudessem ser aval iadas at chegar a um valor booleano.
TABELA
4.1
Combinaes Booleanas
Expresso
Resultado
TRUE
FAl SE
FAl SE
FAl SE
TRUE DR TRUE
TRUE
TRUE DR FAlSE
TRUE
FALSE DR TRUE
TRUE
FALSE DR FAlSE
FAl SE
FAl SE
TRUE
TRUE
FAl SE
NDT TRUE
FAl SE
NOT FALSE
TRUE
A dispon ibil idade dos operadores lgicos permite que voc combine outras expresses e valores
para produzir expresses booleanas mais compl icadas, como: If X :> 3 ANO X < 8 Then, ou I f
(((X+3) * 5):> (Y*3)) ANO (SystemIsRunning{) DR iHour < 5) Then.Usaremos os dois tipos de
expresses, de comparao e lgica, posterionnente em alguns exerccios envolvendo instrues If.
103
Avaliao Abreviada
De maneira semelhante ao resu ltado de uma eleio, o de uma expresso booleana em geral co~
nhec ido antes que ela tenha sido integralmente aval iada. Cons idere esta expresso booleana: (X
>l)AND (X <10). Se Xfor igual a I, ento, assim que voc avaliar o lado esq uerdo da expresso
(obtendo falso), saber que o direito irrelevante. Dev ido natureza da instruo ANO, no h ne~
cess idade de avaliar o outro lado. A expresso inteira ser falsa, independentemente de que valor
for retomado pela outra extremidade. Chegaramos a essa concluso sem precisar pensar muito
ao avali armos as expresses booleanas, mas nem sempre est to claro para o computador.
o comportamento que esperamos, no avaliando partes desnecessrias de uma expresso, chamado abreviao (hort-circuiting) , mas o Visual Basic .NET, por padro, no trabalha desse modo. Para faz-lo abreviar uma expresso booleana, voc precisa usar
formas alternat ivas dos operadores ANO e DR, ANOALSO e ORELSE . No entanto, no bom apenas
confiar que ele se comportar dessa maneira; um programa simples de teste (veja a Listagem 4.6)
pode ser usado para que examinemos exatamente o que acontecer.
Novo TERMO
LISTAGEM
4.6
9
10
11
12
13
14 End Class
Se a funo Test{ ) retornar fa lso, como fez na Listagem 4.6, ento, voc saber o resultado da
expresso inteira apenas avaliando o lado esquerdo. A execuo do cdigo da Listagem 4.6 produzir s uma linha de resultado, nesse caso, "Esquerda" . Se Test ( ) retornar verdadeiro, os dois
lados precisaro ser executados, e o programa exibir tanto "Esquerda" quanto "Di rei ta". Para
testar o comportamento-padro dos operadores booleanos, tente alterar ANOALSO para somente
ANO, e veja que resultado obteve.
Dia 4
104
1 ..
2 If IngQuantidadePessoas = 1 Then
3
Ca11 RetornalmpostoPerCapta ()
Quando voc comear a testar mais do que algumas opes possveis, todas as diversas clusulas
If se tomaro excessivamente complexas. Para manipular o teste COm mltiplos valores ou vrios
conjuntos de valores, o Visual Basic incluiu a instruo SeI ect Case, que tem a sintaxe a segu ir:
Select Case <varivel ou expresso sendo comparada>
Case <valor ou intervalo de valores>
bloco de cdigo
Case <valor ou intervalo de valores>
bloco de cdigo
Case El se
bloco de cdigo
End Select
105
4.8
Faa
Aborde sempre toda condio possvel incluindo uma clusula Case El se. Isso capturar
toda ent rada inesperada para as quais voe
no usou outra instruo Case. Seu programa
fica r mais consist ente.
Laos
At agora, nesta lio, voc aprendeu a controlar que cdigo ser executado com o uso das instrues lf e Select, mas h outra necessidade mu ito comum - a de processar o mesmo cdigo
Dia 4
vrias vezes. Esse requisito manipulado por meio de outra espcie de instruo de controle, o
lao (loop).
Vrios tipos diferentes de laos esto disponveis no Visual Basic, todos podem executar a maioria das tarefas, mas cada um foi projetado para atender a uma finalidade especfica. Comearemos nosso est udo da repetio examinando o mais bsico dos laos, For ... Next.
For Next
Oobjet ivo do lao executar um bloco de cdigo vrias vezes, em gera l parando quando alguma
condio verdadeira. (Embora um lao no tenha de parar realmente; essa situao chamada
de lao infinito.) O lao For executa um bloco de cdigo um nlmero especfico de vezes. A sintaxe desse controle
For <varivel do contado r>
Cdigo a ser executado
Next <vari6vel do contador>
A incluso da varive l do contador depois da instruo Next final opcional, mas ela ajuda a in-
dicar que lao For essa instruo Next pertence e boa prtica de program ao.
A Varivel do Contador
A varivel do contador incrementada a cada passagem pelo lao, do valor inicial ao final.
Quando esse valor fi nal atingido, o lao encerra sua execuo, e o programa continua na linha imediatamente aps a instruo Next . Para visualizar esse conceito com alguns valores reais, criaremos
uma verso no Visual Basic .NET do pri meiro programa que escrevi (veja a Listagem 4.9).
LISTAGEM
4.9
E claro que em geral uso valores na casa dos milhares ... pois adoro ver meu nome rolando na tela!
A varivel do contador real e, exatamente como na Li stagem 4.9, deve ser declarada antes de
voc us-la como parte de seu lao. Tambm importante se certificar de empregar o tipo de
dado correto para essa varive l. Na Listagem 4.9, a varivel i Counter seria utili zada para armazenar va lores de 1 a 10, o que torna os tipos de dado intei ro (I nteger) e byte os mais adequados.
Em outras situaes, poderamos estar lidando com nmeros muito maiores e, portanto, precisar
de um inteiro longo (Lo ng I ntege r ). Para obter mais informaes sobre os diversos tipos de dados, incl uindo que intervalo de valores cada um pode conter, recorra ao Dia 3. Como j mcncio-
107
nado, a varivel do contador incrementada a cada passagem pelo lao, o que com freqncia
ti l porque ela pode ser usada em seu cdigo.
Faa
No Faa
.~
Use o tipo de dado mais apropriado para a situao; no empregue o inteiro longo se o inteiro puder atender bem. Sendo o intervalo
fechado ou podendo crescer muito, certifique-se de usar o tipo de dado que melhor manipule o maior intervalo possvel para o
contador.
A Listagem 4. 10 mostra como voc poderia lIsar a varivel do contador como parte de seu cdigo . Uma pequena funo chamada WeekDayName produz uma listagem dos dias teis da semana.
LISTAGEM 4 .10
3
4
5
6
7
9
10
11
12
13
14
15
iFirstOay = 2
iLastOay = 6
For iCurrentOay = iFirstDay to iLa stOay
System.Console.WriteLine{WeekdayName(iCurrentDay))
Next iCurrentOay
End Sub
16
17
18
19
20
21
22
23
24
25
26
II
Dia 4
108
LISTAGEM 4 .10
(continuao)
Case 4
27
sWeekdayName
28
29
Case 5
sWeekdayName
30
31
Case 6
sWeekdayName
32
Case 7
33
sWeekdayName
34
35
Case [1 se
36
sWeekdayName
37
Eod Select
38
Return sWeekdayName
39
40
End Function
41 Eod Class
"Wednesday"
"Thursday"
"Friday"
"Saturday"
Observe que na Li stagem 4.10, Sunday considerado o pri meiro dia, portanto, esse cd igo pro
duziria os resultados a seguir:
Monday
Tuesday
Wednesday
Thursday
Fr i day
NOTA
Esse exemplo ainda no est pronto para produo porque gerar a lista de
nomes ape nas em ingls, no levando em considerao as configuraes da
mquina . H outras manei ras, um pouco mais complicadas, de conseguir essa
funci o nalidade integ ral com o suporte a t oda as con figu raes regionai s dos
usurios. Retornaremos a esse tpico no Dia 8, " Int rodu o ao .NET Framework" .
LISTAGEM 4 .11
109
ForExample.vb
1 Imports System
2 Public Class ForExample
3
4
5
6
7
8
10
11
12
iFirstValue ; O
iLastValue : 100
ilncrement : 10
For iCounter = iFirstYalue to iLastYalue Step ilncrement
System . Console . WriteLine{iCounter)
Next iCounter
13
14
15
16
17
End Sub
18 End Class
Uma caracterstica interessante e ti l de ter a opo Step no lao For que ela penn ite que voc
percorra um intervalo de valores de manei ra invertida. Tente os valores 10, O e 1 para as variveis Fi rst, Last e Increment, respectivamente. Nada ser exibido, porque last j ser menor
que Fi rst, mas se o valor de Increment for alterado de 1 para -1, algo interessante acontecer
(no aceite simp lesmente o que digo, tente!).
Ah, voc conseguiu um lao que executado o nmero exato de vezes que quiser, e agora os va-
lores so listados de trs para a frente. dificil acreditar que possa ficar melhor do que est, mas
pode . Espere at chegarmos ao lao Do!
hile End
hile
o lao For, embora til , limitado. Foi projetado para situaes nas quais voc sabe quantas vezes quer percorr-lo, o que no sempre o caso. Por estar atualizado com relao a esse fato, o
Visual Basic possui dois laos mais flexveis. O primeiro deles, Wh; 1e ... End Wh i 1e, continua
sendo executado enquanto uma expresso booleana especfica for verdade ira, como o descrito a
segUI r:
While <expresso booleana>
Cdigo a ser executado
End Whil e
Dia 4
110
1
Qualquer expresso booleana vlida pode ser lIsada, exatamenle como em lima instruo If e,
portanto, possvel dar suporte a cond ies complexas. Por exemplo, um lao Whi 1e pode fornecer com facilidade a mesma func ionalidade do lao For, como demonstramos na Listagem 4.12.
LISTAGEM 4 .12
WhileExample . vb
1 Imports $ystem
2 Public Class WhileExample
3
Shared Sub Main{)
4
Dim iCounter As Integer
5
Dim iFirstValue As Integer
6
Dim ilastValue As Integer
7
Dim i Increment As Integer
8
iFirstValue = O
9
10
11
While iCounter
12
13
14
15
<=
iLastValue
End Sub
16 End Class
,
4.13
Whi l eSearch.vb
1 Imports System
2 Public Class WhileExample
Shared Sub Main{)
3
4
Dim i Counter As Integer
5
6
7
8
9
10
11
12
13
LISTAGEM 4 .13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
31
111
WhileSearch.vb (continuao)
arrList(5) "Paris"
arrList(6) "Winnipeg"
arrList(7)
"Sydney"
arrList(8)
"Calgary"
arrList(9) "Orlando"
Whi 1e iCounter <= 9 ANO iMatch = ~1
If arrlist(iCounter)Like sMatch Then
iMatch = iCounter
El se
iCounter = iCounter + 1
End I f
End While
If iMatch - 1 Then
System . Console .Write Line("Matched" & iMatch)
End If
End Sub
End Class
~
o operador de comparao l i ke usado na Listagem 4.13, o que perm ite que as correspondncias sejam examinadas com o uso de curingas. Ao percorrermos esse cdigo, poderemos perceber que o programa passa para outra etapa logo depois que cada uma das condies de sada
aval iada como verdadeira. O lao Whi 1e muito ti l, mas ainda h outro tipo de lao disponve l,
Do. Se voc for como eu, provavelmente esquecer tudo que viu sobre a instruo Whi 1e, depois
de ter usado o lao Do.
Lao Do
O lao Do, alm de ser mais si mples, apresenta a estrutura de lao mais flexvel d isponvel no Visual Basic. Sua sintaxe, na forma mais bsica, :
Do
C6diga a ser executado
Loop
A si ntaxe, contudo, no especifica nenhuma condio de sada, portanto, o cd igo interno continuar a ser executado de modo infinito. Esse problema facilmente contornado porque a instruo Do d suporte a duas maneiras de iniciar as condies de sada. As opes disponveis so
Whi 1e <condio>, q ue faz com que o lao sej a executado enquanto a condio for verdadeira e
Unti 1 <condio>, que permite a continuao do processamento do lao enq uanto a condio for
falsa.
Qual deve ser usada, Whi 1e ou Unti I? Tecnicamente, no tcm nenhuma im portncia; voc pode
tranqilamente empregar qualquer das duas opes apenas utilizando uma negao em s ua con-
Dia 4
112
1
dio de sada quando apropriado. Esses dois exemplos de cdigo se comportaro da mesma ma~
tle lra:
Do While iMatch
Loop
3)
3 tambm funcionaria
Loop
Portanto, Whi 1e ou Unti 1 no so to diferentes em seu efeito, mas o lao Do oferece Qutra opo
que fornece ainda mais flexibil idade. Voc pode colocar a cond io de sada (usando a clusula
Unt i 1 ou Whi 1e) no incio (com Do) ou no final (com Loop) do lao. Isso significa que possvel
criar laos como o descrito a seguir:
Do
Loop Until bFound ar iCounter
>
iTotal
Diferente de apenas escolher entre Whi 1e Oll Unt i I, a posio de sua condio de sada ter um
efeito maior sobre como seu lao ser executado. Se voc colocar a cond io no incio do lao,
ento, ela ser veri fi cada antes de cada passagem pelo cdigo, antes at da prime ira vez que isso
acontecer. Se essa condio no for atendida, o lao no ser iniciado, e o cdigo no ser executado nem mesmo uma vez. Ao contrrio, se a condio for colocada na instruo Loop, ento, ela
ser verificada depois de cada passagem pelo cdigo. Independentemente do valor da condio,
o cdigo sempre ser executado pelo menos uma vez.
Com todas essas opes, h um total de quatro configuraes diferentes para a instruo do lao
Do, tornando-a, de longe, o mtodo mais nexvcl de executar laos. Voc ainda ter de escolher
entre essas quatro opes, portanto, examinaremos alguns itens para ajudar nessa deciso:
Voc pode alternar entre Whi 1e e Unt i 1 apenas usando uma negao na expresso booleana.
Ao escolher entre Whi 1e e Unti 1, use a que no precisar de uma negao na instruo condicionaI. Isso resu ltar em uma expresso booleana um pouco mais simples, e em termos
de codi fi cao, mais simples em geral melhor.
O posicionamento da instruo condicional muito importante. Se voc coloc-la no incio do lao, ento, ele no ser executado de forma alguma se essa condio no for atendida. Se for inserida no final , o lao sempre ser processado uma vez.
Escolha entre as duas posies possveis definindo se realmente no quer que o lao seja
executado caso a cond io no seja atendida ou se quer que o processamento sempre
ocorra pelo menos uma vez.
11 3
o lao Do
Whi le pode ser usado no lugar de Whi le porque eles possuem exatamente o mesmo efeito. No raro ver os programadores deixarem o lao Whi le
de lado para empregar essa instruo.
NOTA
Condies de Sada
A condio de sada de qualquer lao a expresso que ser avaliada para detemlinar quando ele deve tenn inar. No caso de um lao Whi 1e ou Do, elas so claramente
definidas e aparecem no incio ou no fina l dele. No lao For, a condio de sada deduzida pela
configurao dos I im ites superior e inferior. Entretanto, para cada um desses tipos de lao h outra maneira de espec ificar quando sair deles com o uso da instmo Exi t. H uma instmo Ex i t
correspondente a cada lao (Exi t For. Exi t Do e Exi t Whi 1e). Quando a instruo apropriada
for executada, ele ser abandonado de imed iato, c a execuo do programa continuar na linha seguinte ao fim do lao.
Novo
TERMO
Embora possam ser encontradas muitas ocasies em que essas instrues paream um meio perfeito de fazer o programa se comportar corretamente, elas so um dos muitos exemplos de prtica imprpria de programao. Usando a instruo Exit, voc na verdade s ter especificado
uma parte comp lementar de sua condio de sada, mas de uma maneira mais do que bvia. A
melhor forma de fazer isso seria adicionar essa segunda condio condio principal de sada
de seu lao. Nos exemplos a seguir, veremos algumas maneiras comuns de empregar as instrues Exit e o cdigo correspondente que poderia ser usado como alternativa.
1 to 100
End I f
Next i
o problema existente aqui que o lao For no devia de modo algum ter sido usado, mas no sabemos antecipadamente quantos laos teremos de executar. Uma maneira de tornar esse cdigo
mais objetivo seria empregando um lao Do que controlasse a passagem pelo li mite superior e
procurasse a correspondncia, como descrito a segu ir:
i =1
Do Until i
>
i = i + 1
Loop
100 or arrNomes(i)
"Joe"
Dia 4
114
1
iCurrentGuess
iTarget " 5
Do Until iCurrentGuess = iTarget
iCurrentGuess = GetNextGuess(}
If iCurrentGuess = -1 Then
Exit Do
End If
Loop
Mais uma vez, a condio efetiva de sada mais complicada do que esse lao a faz parecer.
Uma soluo apropriada seria:
iCurrentGuess = O
iTarget = 5
Do Until (iCurrentGuess
iCurrentGuess
iTarget) Dr (iCurrentGuess
-1)
GetNextGuess()
Loop
Se essas instrues Exi t no so adequadas, voc deve estar querendo entender por que as abor-
do. Bem, embora saiba que poder evit-Ias em um cdigo de sua autoria, a maioria dos programadores em geral trabalha com cdigos escritos por outra pessoa, e importante com preender o
que pode ser encontrado neles.
Laos Infinitos
Qualquer lao pode ter erros, mas um incmodo em particular quando ele executado continuamente, forando voc a interromper o programa para encerr-lo. O fato de no ser preciso especificar nenhuma condio em seu lao Do o torna um pouco mais propenso a esse tipo de erro.
Se o programa for executado e parecer no terminar nunca, e, se ele for baseado em DOS, use a
combinao de tec las Clrl+C para causar sua interrupo. Se estiver utilizando o IDE do Visual
Basic, use a combinao de teclas Ctrl+Break para encerr-lo.
Faa
Certifique-se de ter uma condio de saida em
qua lquer lao que criar.
No torne sua condio de sada muito complexa; ela precisa ser avaliada a cada passagem pelo lao.
Algumas causas comuns dos laos infinitos so o esquecimento de que a varivel do contador precisa ser aumentada progressivamente (em laos diferentes de For), a reiniciai izao de Lima varivel que deveria ser crescente e o li SO de uma cond io de sada que nunca possa ser atingida.
11 5
LoopPerfonnance. vb
17
End Cl ass
o nome do usurio fornecido por me io de uma pequena funo que usa o .NET Framework
para obter suas informaes atuais de segurana, mas o mais importante da Listagem 4.14 que
ilustra erros comuns relacionados ao desempenho. A chamada funo UserName ocorre dentro
do lao, o que significa que ela ser executada 1.000 vezes, cada uma provavelmente resultando
em alguma fonna de chamada do sistema operacional para obteno do nome do usurio aluaI.
J que no se espera que o usurio atual seja alterado nesse lao, mu ito mais efi ciente usar um
lao de sua autoria em vez disso, como mostra a Listagem 4. 15 . O valor da funo UserName no
alterado e, portanto, no ser includo nessa segunda listagem.
LISTAGEM 4.15
loopPerfonnance _Better . vb
3
4
5
6
Dia 4
LISTAGEM 4 .15
LoopPerformance_Better.vb (continuao)
8
9
10
11
12
13
End Sub
14
15
16
17
18
19
End Funct i on
20
21 End Class
11 7
Leitura de um Arquivo
Ler um arqu ivo no disco uma necessidade comum de muitos programas, portanto fornec ida
pelo .NET Framework. Nesta lio, voc usar dois objetos diferentes que so parte da seo
System.IO do Framework, System.IO.File e System.IO.StreamReader. Eles representam, respectivamente, o arq uivo real no disco e sua leitura na memria.
O objelo StreamReader criado com o uso do mtodo OpenFi 1e do objeto Fi le, sendo necessrio
especificar o caminho e o nome do arquivo que se deseja abrir. Voc pode usar o objeto StreamReader, para ler cada Iinha do arquivo, uma por vez, atravs de seu mtodo ReadL i ne at que alcance o fina l do arquivo. Para verificar se esse foi atingido, compare o ltimo valor lido com a
constante especial Nothi n9, que diferente de urna linha vazia e permite distinguir entre uma linha em branco em um arquivo e o fim real de todos os dados. J que Nothi n9 um tipo especia l
de valor, utilize o operador i s para comparar sua string com ele, em vez de um operador comum
de igualdade. Na Listagem 4.16, a prime ira etapa inicializar todos, os seus objetos, enquanto
aponta o objeto StreamReader para o arquivo que voc deseja ler. E necessrio um arquivo de
texto para fazer este exerccio, mas qualquer de seus outros exemp los de arquivos de programa
. vb deve serv ir.
LISTAGEM 4 .16
Etapa 1: Configure
8
sFileName" "MySampleFile.txt"
9
srFileReader " System.IO.File.OpenTextCsFileName)
10
11
End Sub
12 End Class
Depois de obter seu objeto StreamReader, que foi inicializado de modo que apontasse para o arquivo de teste, voc poder usar um lao Do Whi 1e (veja a Listagem 4.17) para ler o arquivo, uma
linha por vez. Para que esse programa produza alguma sada, a fi m de tornar possvel saber qua l
sua funo, tambm imprimiremos cada uma das li nhas ao serem lidas.
LISTAGEM 4 .17
1
2
Dia 4
LISTAGEM 4.17
3
4
5
Etapa 2:
In s ira Este Cdigo Acima da Instruo End Sub da
Listagem 4 . 16 (continuao)
Antes de percorrer o lao pela primeira vez, melhor certificar-se de que suas condies sejam
atendidas, portanto, inicialize s InputL i ne para assegurar que no seja Nothi ng. Na Listagem
4.18, voc tentar exibir sInputl i ne mesmo quando for Nothi ng, mas seria bom adicionar uma
instruo If para verificar essa poss ibilidade.
LISTAGEM 4.18
1
2
3
4
5
6
7
Alternativamente (veja a Listagem 4.19), voc poderia usar um mtodo de lao um pouco diferente e assegurar que uma sada no seja exibida depois que o final do arquivo tenha sido atingido.
LISTAGEM 4.19
Um Lao Me l hor
11 9
Qualquer um dos mtodos funcionar, mas o aplicativo final fornecido na Listagem 4.19 produziu o cdigo mais simples (e, portanto, melhor) dentro do lao. Se voc qu iser executar esse cdigo, ter de criar um arq uivo de texto com um contedo de teste no mesmo diretrio que seu
programa executvel compilado.
Um Jogo Simples
Outro uso comum para o lao consultar repetidamente o usurio solicitando uma resposta, at
que se consiga a desejada. Isso pode soar incmodo (de algum modo, parec ido com as perguntas
de uma criana), mas no tipo certo de programa, pode ser lltil. Neste exemplo, voc criar um
jogo simples de adivinhao de nmeros. Essejogo em particu lar foi a maneira que meu pai encontrou para me manter ocupado enquanto espervamos ser atendidos em restaurantes, embora
o jogssemos de lima mane ira menos tecnolgica. Primeiro, ele escrevia um lim ite superior e um
inferior nas extremidades de cima e de baixo de um guardanapo, I e 100, por exemplo, e, em seguida, selecionava um nmero aleatoriamente (a maneira aleatria de meu pai , e no a dos computadores) e o escrevia atrs do guardanapo. Eu comeava a dar pa lpites de nmeros at que
encontrasse o correto, sendo informado a cada vez se meu palpite era mu ito alto ou muito baixo.
Emboraduvido que eu ten ha sido metdico com relao a isso, essas informaes de certo fac il itaram bastante. Como parte da luta contnua para informatizar tudo que no precisa ser informatizado, criaremos um programa de computador para jogar "Adivinhe o nmero!".
Os aspectos bsicos deste programa foram esboados acima; poderamos usar minha pequena
histria como o pseudocdigo para o programa. Seria melhor reformular rapidamente os detalhes em uma defin io mais clara do que o programa deve fazer:
1. Solicitar ao usurio um limite numrico superior e inferior.
2. Detenn inar um nmero aleatrio dentro desse intervalo; ele o alvo.
4. Se o palpite estiver correto, encerrar o jogo e informar ao usurio quantos palpites foram
necessrios.
5. Caso contrrio, informar o usurio se o palp ite mu ito alto ou muito baixo e voltar eta-
pa 3.
Esse pseudocdigo no complexo, mas h um conceito novo nele que voc ainda tem de aprender, a gerao de nmeros aleatrios. Felizmente, o .NET Framework fornece lima classe para
esse fim, System. Random. Com esse objeto, possvel gerar um nmero aleatrio entre um limi te
superior e um inferior com um cdigo como o descrito a seguir:
Dim iTargetNumber,iUpperBound,iLowerBound As Integer
Dim objRandom As System.Random = New System.Random
iUpperBound = lDD
i LowerBound = 1
iTargetNumber = objRandom.Next{ilowerBound , iUpperBound + 1)
Dia 4
120
NOTA
Depois que o objeto Random tiver sido inicializado, voc poder chamar seu mtodo Next sempre
que desejar, e obter um novo nmero aleatrio a cada vez. Agora que sabe como obter um nmero aleatrio, pode gravar o cdigo mostrado na Listagem 4.20 para solicitar os limites ao
13
14
15
16
17
New System.Random()
18
19
20
21
22
'Adivinhao do nmero
iTargetNumber = objRandom.Next(iLowerBound.iUpperBound + 1)
System.Console.Writeline{iTargetNumber)
End Sub
24 End C1 ass
23
Na Listagem 4.20, voc exibiu o nmero depois que o gerou. Isso til para testar seu programa,
mas teria de ser removido ou isolado (marcado com um caractere de comentrio no incio ( , )
para ind icar que no deve ser compilado) na verso final. Em seguida, preciso criar um lao
que solici tar repetidamente um novo palpite at que o alvo seja ad ivinhado. Enquanto o programa estiver executando o lao, tam bm precisaremos de outra varivel para manter o registro da
qllant idade de palpites que foram necessrios para chegar ao alvo. Esse cd igo (veja a Listagem
4.21) teria de ser inserido antes da instruo End Sub para encerrar O programa.
LISTAGEM 4 .21
1
2
3
4
5
6
7
B
9
10
11
12
13
14
15
121
iCurrentGuess : O
iGuessCount : O
Do While iCurrentGuess iTargetNumber
System.Console.Write("Insira um palpite : ")
sInput : System . Console.ReadLine()
iGuessCount : i GuessCount + 1
iCurr entGuess : Clnt(sInput)
If i CurrentGuess < iTargetNumber Then
System.Console . WriteLine{"Seu palpite ba i xo ! ")
El seIf iCu r rentGuess > i TargetNumbe r lhen
System.Console.WriteLine{"Seu palpite alto!")
End If
Loop
System . Console.WriteLine("Voc conseguiu em "
palpites")
Combinadas, as duas listagens de cdi go anteriores produzem o jogo completo que voc poder
compilar e tentar ganhar. bom remover o lt imo comando Wri teL i ne da Listagem 4. 2 1 antes
de jogar, ou pode ficar muito fcil. H um a maneira bastante raci onal e, portanto, chata de jogar,
que garante a obteno da reposta correta com uma cel1a quantidade de palpites. Voc pode apenas fornecer a cada palpite um valor intermed irio para o intervalo, por me io do critrio altolbaixo, para criar um novo intervalo (com a metade da extenso) entre seu palpite e os lim ites
inferior e superior. No jogo do exemplo, q ue usa de I a 100, esse mtodo assegura a descoberta
da so luo em sete palpi tes (ou menos), com base em uma frmula matemtica. Voc sabe que
f rmula info rmar a quantidade de palpites necessrios para qualquer intervalo de valores? A
resposta estar na seo de exerccios desta lio.
Dia 4
122
2 1 = 3628800. (Observe que o resultado bem grande com relao ao valor de n.) Essa frmula pode ser expressa com o uso de um lao For, como vemos na Listagem 4.22.
LISTAGEM
4.22
Factor; aI. vb
la
11
11
13
Next i Counter
14
System.Console .WriteLine{iFactorial)
15
End $ub
16 End Class
NOTA
No entanto, essa no a nica maneira de gerar um fatorialj que essa frmula tambm pode ser
expressa como n * (n-l)!, ou seja, n multip licado pelo fatorial de n-1. Essa expresso define a
frmula recursivamente; a soluo de um fatorial inclui outro fato ria!. Portanto, essa lima definio mais clara que a da frmula n(n-I )(n-2) ... (n-(n-I ( 1) e, se voc o escrever desse modo
(veja a Listagem 4.23), produzir um cdigo que tambm ser mais simples do que a rotina correspondente da Listagem 4.22.
LISTAGEM
4.23
Recursivefactorial.vb
LISTAGEM 4.23
RecursiveFactoria l .vb
(continuao)
11
12
13
6
7
8
9
10
123
14
15
If n
16
lhen
Return 1
= 1
Else
17
18
Return n * Factori al (n-l)
19
End If
20
End Funct i on
21
22 'od C1 ass
o cdigo produzido pode no ser mais curto que o da Listagem 4.22, mas mais si mples e, s
por isso, esse um resultado vlido. Observe que na fun o Factori a 1 ( ), voc procura n =;= 1.
Essa verifi cao assegura que as chamadas recursivas fin almente sejam encerradas, semelhante
ao que se consegue com a condio de sada em um lao. Sem ela, como no lao, o programa
nunca ter s ua execuo encerrada. A recurso pode ser usada para reso lver muitos problemas, e
veremos cdigos que a empregam em sistemas de vrios tipos (e espero que voc escreva o seu).
Resumo
Nesta lio, examinamos as instrues de controle, a base de muitos dos programas de computador que voc criar no futuro. Com essas instrues, possvel comear a converter processos
reais em programas, primeiro passando-os para pseudocdigo e, em seguida, usando esse recurso para gerar o cdigo real necessrio.
P&R
P Meu colega me disse que os laos hi 1e so melhores que os laos Do e que nunca
devo usar o lao For! Que lao o melhor?
R Embora seja possvel usar apenas um lao em lodos os seus programas, no se ganha
nada fazendo isso. No final , tudo que importa que se u cdigo seja o mai s claro e simples que puder. Empregue o lao que melhor resolver o problema . Em geral, o lao For
124
Di a 4
funciona melhor quando preciso uma quantidade fixa de iteraes; use um lao Do ou
Wh i 1e quando esse no for o caso.
P As instrues If de uma linha so mais rpidas que a forma If ... End If?
R No. O compilador do Visual Basic converte as duas formas no mesmo res ultado, por~
tanto, no h diferena na velocidade de execuo desses dois formatos. A d iferena
principal est na facilidade de manuteno e leitura do cdigo.
P Em verses anteriores do Visual Basic c no Visual Basic for Application (VOA), usei
uma forma da instruo lf chamada IllIl1ediate If I1F. Ela existe no Visual Basic
.NET?
R S im, existe. Mas s como elemento de um conjunto especial de objetos (Microsoft. VisualBasic), projetado para fomecer acesso instruo I I F e muitas outras partes da ltima
verso do Visua l Basic que no existem mais no Visual Basic .NET. O fato de essas fun
es no estarem embutidas na verso mais recente do Visual Basic pode sign ificar que
elas rea lmente no estaro disponveis em futuras verses. A variante rIr uma forma
muito til da instruo If; como funo, ela pode ser usada no meio de outra expresso,
por exemplo, quando uma string exibi da. No entanto,j que as prximas verses do Vi
suai Basic podem no inclu ir a instruo I IF, voc deve evitar seu uso se possvel.
Workshop
O Workshop foi planejado para ajudlo a anteci par possveis dvidas, revisar o quej aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Qual dos trs mtodos de lao disponveis mais adequado para um intervalo fi xo de va
lores?
2. Qual dos trs mtodos de lao o mais flexvel ?
3. Por que voc deve te ntar fazer com que o bloco de cdigo interno em um lao seja o ma is
simpl es possvel?
4 . Suponhamos que voc tivesse a expresso booleana a seguir em seu programa: Ca 1cul atedTotalNetWorth(iCustomerIO) < 10000 ANO dtCurrentDate.Hour > 12. Oque poderia
fazer ser fei to para assegurar que ela seja o mais efi ciente poss vel?
125
Exerccios
I. Escreva o inverso do programa NumberGuesser criado nesta lio - um programa com
lim ites superior e inferior que tente determ inar que valor foi selecionado pelo usurio.
Para cada palpite que o programa de computador gerar, voc ter de permitir ao usurio
responder com " A" para muito alto, " B" para muito baixo ou = para correto. Se preferir
usar o mtodo racional nos palpites de seu programa, ento, a quantidade mxima de tentati vas necessrias poder ser encontrada na resoluo dessa equao: (t-l >= Limite Superior - Limite Inferior) onde N a quantidade mxima de tentativas. Por exemp lo, em
1
um intervalo de I a 100, a equao resu ltaria em 7 porque 2" = 64 e 2 = 128.
SEMANA
DIA
Arquitetura dos Aplicativos na
Plataforma .NET
No decorrer deste livro voc est aprendendo a usar o Visual Basic .NET para criar aplicativos,
mas as questes mais importantes se encontram na fase de projeto do processo de desenvolvimento. Esta lio abordar
Alm da abordagem de alto nvel desses tpicos, essa lio tambm inclui uma discusso de alguns cenrios e um estudo da determinao de arquiteturas para cada um de les.
128
Dia 5
o conceito de arquiteto, tanto o profissional quanto os aspectos do projeto pelo qual ele responsvel, foi tomado emprestado pela indstria de desenvolvimento de softwares. A semelhana sugerida entre as duas reas no deve agradar aos verdadeiros arquitetos, e no os culpo por
ficarem incomodados. Se os prdios fossem construdos da mesma maneira que a ma ioria dos
sistemas de software, ento, passaria o resto de meus dias vivendo a cu aberto. Muito do que
est envolvido no desenvolvimento de softwares empresariais feito sem planejamento sufic iente,
resu ltando em sistemas que so instve is, com manuteno difci l e quase sempre com um oramento muito alto.
NO TA
Em projetos menores, possivel gerenciar sem um arquiteto, mas o que estar ocorrendo que voc (ou outro membro da equ ipe de desenvolvimento)
ter informalmente assumido essa funo. O problema das pessoas que assumem a funo de projetista informalmente que a equipe no tem conscincia
de quem o responsvel por nenhum dos aspectos especificos do projeto.
Voc pode ser um iniciante no Visual Basic ou tambm no desenvolvimento. Talvez no queira
assumir o papel do arquiteto de sistemas no futuro prximo. Mas isso no altera a necessidade de
compreender o processo e as decises sobre a arquitetura que sero tomadas em qualquer projeto
com seu envolvimento. No ciclo de evoluo do desenvolvimento de softwares, a equipe inteira
deve estar envolvida no processo integral, porm o arquiteto o principal condutor do planejamento nas fase s inicias da Definio/Escopo, Anlise das Necessidades e Projeto (veja a Figura 5. 1).
129
FIGURA 5.1
No ciclo de evolllao
do desenvolvimento de
sofiwal'es. a
arqlli/elllra est
ellvolvida
prim:ipa{mellfe lias
primeirasfses. em
que o sistema
projetado.
Depois dessas fases iniciais, o foco passa para a equipe de implementao (desenvolvedores de
software) e, em seguida, para os grupos de implantao. O ideal que a pessoa que assumir a
funo de arquiteto seja altamente experiente, com bastante conhecimento tcnico para avaliar
todas as opes disponveis e habil idade operacional suficiente para interpretar com correo os
requisitos do sistema. Em geral, o papel de arquiteto desempenhado por mem bros da categoria
snior de um grupo de desenvolvimento.
130
Dia 5
do e na implementao. Por exemplo, parle da arquitetura do sistema pode ser uma discusso sobre segurana, e nesse nvel a declarao a segu ir poderia ser suficiente para abordar esse tpico:
" O aplicativo basear suas perm isses de segurana nos usurios e em grupos do Windows 2000
j em uso na empresa". Essa declarao o bastante como ponto de partida; o prximo nve l se
tornaria mais detalhado e poderia incluir informaes sobre que reas do aplicativo sero protegidas e a quem ser concedido acesso para cada rea especfica.
Na fase de implementao ou desenvolvimento, o programador teria de determ inar exatamente
como encontrar o logon do grupo e do usurio do Windows, mas esses detalhes decerto no
fazem parte da arquitetura do sistema. Embora ela aborde tudo em um nvel superior, as reas-chave
a segui r devem ser reconhecidas como parte de qualquer arquitetura de aplicativo:
Distribuio tisica e lgica dos cdigos (que cdigo ser executado onde?)
Tecnologias usadas na interface com o usurio, bancos de dados e lgica operacional
Mtodo de comun icao entre componentes diferentes do sistema e entre esse e os outros
sistemas da empresa
Segurana
Acesso aos dados
Escalabilidade e dispon ibi lidade
Cada uma dessas reas por si s importante, mas a arquitetura a comb inao de todos esses
fatores em um projeto que funcion e como um todo. A finalidade de cada rea ser abordada nas
sees seguintes.
131
Tecnologias
Uma das reas mais objetivas, esse elemento da arquitetura do sistema traa um esboo ' geral'
das tecnologias que sero usadas. O segredo nessa rea disponibilizar informaes suficientes
para ser til, enquanto detalhes que possam no ter sido detenninados ou sejam irrelevantes no
nvel da arqu itetura devem ser evitados . Considere esses dois trechos (no se preocupe em compreender os detalhes, s existem para atender finalidad e do exemplo):
Exemplo 1:
A equipe do projeto desenvolver a interface com o us urio por meio do Visual Basic 6.0 (Serv ice Pack 5) e de um controle de grade Act iveX do Janus. Vrias janelas sero criadas, todas com
menus, uma grade principal e diversos botes funcionais. Esses formulrios empregaro o
DCOM para se conectarem com os servidores da camada intermediria, os quais executaro o
Windows 2000 Advanced Server (Service Pack 2). Os servidores da camada intennediria hospedaro cinco componentes dentro do ambiente de serv ios do componente do COM+ do Windows 2000. Esses componentes operacionais sero DLLs do COM, construdas com o uso do
Visual Basic 6.0 (Serv ice Pack 5) e com suas propriedades configuradas como Publ ic. Cada
componente ser composto de ...
Exemplo 2:
A interface com o usurio ser baseada em formulr ios e usar o DCOM para se comunicar com
a camada intermed iria. Dentro dessa camada, os objetos operacionais do COM tero sido instalados no COM+ e manipularo a comunicao com a camada de dados. O ADO ser empregado
para conectar a camada intermediria COm os dados de back-end, e todas as informaes sero
retornadas para a camada de apresentao depois de passarem pela comercial.
Embora o Exemplo I tenha sido interrompido, na verdade ele no estava nem perto de ser concludo e ainda tinha de transmitir tantas infonnaes teis quanto o Exemplo 2. O segredo se
lembrar sempre do pr incipal , que consegui r descrever a arquitetura. A inda falta m o projeto detalhado e as fases da implementao para manipu lar a entrada nesse nivel de particularidades.
Outra regra interessante nunca passar muito tempo discut indo tecnologias especficas. Tente se
concentrar e s discutir a tecnologia em termos do que ela trar para esse projeto.
132
Dia 5
redelfirewall. A platafonna .NET fornece vrias opes diferentes para esse tipo de comunicao
incluindo o SOAP.
Segurana
Um ttulo indefinido para uma rea vaga, a segurana um tpico que deve ser considerado apenas porque toda d iscusso acaba por abord-lo e permanece a se ele j no tiver sido detalhado.
A arqu itetura deve detalhar como a segurana ser proporcionada (usando o Windows 2000
Acli ve Direclory, por exemplo) e conceituaImente como ser implementada ("as opes de interface ficaro ocultas" ou "a segurana ser verificada a cada pgina/formulrio"). necessrio
Escalabilidade e disponibilidade
Esses so dois tpicos importantes e complexos e uma das principais razes pela qual a arquitetma dos aplicativos recebe tanta ateno. Eles esto re lacionados de mu itas manei ras: as tcnicas e
a arquitetura usada para fornecer um servio em geral so utilizadas para disponibilizar o outro.
A escalabilidade descreve a capacidade de um sistema de manipular cargas ma iores, fornecendo
o mesmo nvel de servio (tempos de resposta, quanti dade de solici taes por segundo e assim
por diante) por meio de um incremento no hardware. Lembre-se de que essa no uma medida
de desempenho; um sistema pode scr cscalonvcl e tcr um pssimo desempenho. Como assegurar que um apl icativo possa ter uma boa escalabilidade est alm do escopo desta lio e deste livro, mas um link para outros recursos ser fornecido no final deste captulo caso voc esteja
interessado em uma abordagem mai s profunda desse tpico.
A disponibilidade uma medida que avalia com que freqncia o sistcma est em execuo e
pode processar so licitaes. Agora que os apl icativos da Web com interface pbl ica esto sendo
desenvolvidos, a necessidade de sistemas que estejam sempre disponveis est sendo difundida.
Em geral esse conceito descrito como ' tem po de funcionamento' e em termos da quantidade de
'algarismos nove' existentes na medida de dispon ibi Iidade que um sistema tem fornecido. O termo 'algarismos nove' sc rcfere ao tempo de func ionamento de 99% (dois algarismos nove),
99,9% (trs algari smos nove) ou maior que um sistema possui . Enq uanto redigia esta seo, alguns sistemas de uso comercial foram registrados com um tempo de fu nc ionamento igual a cinco algarismos nove (99,999%). Em termos prticos, um site com um tempo de funcionamento de
ci nco algarismos nove tcria cstado inativo por somentc ci nco minutos em um ano inteiro (24 horas por dia, 7 dias por scmana). Isso quase parece ridculo, e excede muito meu tempo ativo no
133
trabalho, mas se voc estiver executando um site como o Amazon.com , ento, ficar inativo de alguma mane ira pelo espao de tempo que for inaceitvel.
Criar um sistema com esse nvel de disponibi lidade uma combinao de projeto e processo. Do
ponto de vista do projeto, o sistema deve estar completamente a salvo de estouros de memria ou
outras falhas que impediriam o uso cont nuo e deve poder ser executado em vrias Qlltras mq uinas, j que m ltiplos grupos de hardware tm de ser usados para fornecer redundncia. Do ponto
de vista do processo, no entanto, tudo ainda mais comp lexo. Por exemplo, atual izaes de software tero de ser feitas de maneira seqencial para que o conjunto de servidores nunca fique integralmente inativo. As discusses sobre o tempo de funcionamento em geral se concentram no
sistema operacional ou na tecnologia especfica do servidor de banco de dados Iservidorde componentes/servidor Web em uso, sugerindo, digamos, que o Windows 2000 fornece uma certa
quantidade de algarismos nove de tempo de funcionamento. Essa no uma discusso realista.
O sistema operacional ou o servidor do banco de dados s uma parte do sistema, e tudo causa
impacto na sua capacidade de manter uma disponibilidade alta.
Apresentao
Esta camada representa a interface com o usurio e Olltros sistemas, o
aspecto fisico pblico do sistema.
Lgica Operac ional
Todo os cdigos que no estejam envolvidos, em particular, na
criao da interface com o usurio ou outros aspectos da camada de apresentao. Esta camada representa o ncleo do aplicat ivo, o cdigo que realmente faz o trabalho do sistema.
Dados
O banco de dados (ou outra fonte de dados como a XML) e o cdigo que o
acessa so considerados a camada de dados.
Essas trs camadas so a representao lgica de um sistema completo, mas esse pode assum ir
vrias formas: um n ico programa executvel, componentes distribudos na quant idade de servidores que se desejar, ou um simples site da Web. Independentemente do aplicativo em particular, til descrever todos os sistemas com relao a essas trs camadas.
134
Dia 5
Quantas Camadas?
Uma das maneiras mai s comuns pelas quais as arquiteturas de aplicativos tm sido descritas
em termos da quantidade de mquinas diferentes que executam partes do sistema. A arquitetura
mais simples apresentada como um sistema de camada nica, em que o programa (apresentao, lgica operacional e dados) est todo em uma mquina. Essa a arquiteturaempregada pela
maioria dos aplicativos comerciais como o Microsoft Office e muitos softwares empresariais
projetados para serem usados por alguns usurios ao mesmo tempo. S as mquinas que executarem alguma forma de processamento so importantes. Um programa em que os arquivos de
dados estejam localizados em um servidor de arquivos tambm considerado um aplicativo de
camada lInica porque todo o trabalho efetivo feito em uma mquina, e o servidor de arquivos
apenas fornece um local na rede para armazenar dados.
Por outro lado, quando um servidor de banco de dados (como o SQL Server ou o Oracle) usado, ento, e le considerado uma segunda camada porque realmente executa um processamento.
Os sistemas que possuem um software cliente (em geral na mquina de mais de uma pessoa) que
se conecta de modo direto com um banco de dados de back-end so chamados de aplicativos de
duas camadas ou cliente/servidor. A arquitetura cliente/servidor comum nos aplicativos empresariais. Ela permite que muitos usurios trabalhem com o mesmo conj unto de dados enquanto fornece um desempenho muito melhor do que um sistema com base em arquivos, como o
Microsoft Access.
Para concluir, a forma mais recente de arquitetura de aplicativo chamada de trs camadas ou
vrias camadas e descreve sistemas em que o cdigo executado em trs ou mai s sees distintas. A diviso lgica de um sistema desses tambm composta de trs camadas, mas o layout fisico pode exceder trs grupos distintos. Em geral, isso significa que algum tipo de cdigo
cliente, como um site interativo da Web ou talvez um aplicativo Windows, que chama um cdigo executado em outro servidor ou conjunto de servidores para mani pu lar a lgica operacional , e
um banco de dados de back-end esto sendo usados. Essa arquitetura est se tornando mais popular porque fornece muita flexibil idade para a manipulao de diversos usurios e, portanto,
bem adequada para aplicativos com base na Internet. H vrias maneiras tcnicas diferentes de
criar aplicativos de trs camadas, mas o mtodo recomendado pela Microsoft antes da plataforma .NET se tornar di sponvel era chamado de Windows DNA .
Windows DNA
O Windows Distributed Network Architecture (ou Distributed interNet Architecture, dependendo de onde voc encontrar sua definio), o conjunto de tecnologias e diretrizes da Microsoft
anteriores plataforma .NET para criao de sistemas de trs camadas. Com base na idia geral
de que todo aplicat ivo pode ser dividido em trs camadas, de Apresentao, Lgica Operacional
e Dados, o Windows DNA esboou a ' melhor' maneira de desenvolver sistemas distribudos.
Em um aplicativo Windows DNA, o cdigo-cliente era executado como um aplicativo Windows
padro ou como uma interface da Web criada com o Active Server Pages. O cdigo-cliente con-
135
tinha apenas a lgica relacionada interface e acessava toda a operacional chamando componentes do COM localizados localmente ou em outro servidor, componentes que, ento, se
encarregariam de interagir com o banco de dados.
Um princpio essencial do modelo Windows DNA para desenvolvimento de aplicativos que
tudo fl ui atravs de trs camadas, de modo que a camada de apresentao se comunica apenas
com os objetos operacionais, e esses manipulam toda a com unicao com o banco de dados. A
camada de apresentao nu nca acessa diretamente o banco de dados e, portanto, as t rs camadas
so abstratas, o que proporciona a possibilidade de alternar o banco de dados sem que sej a preciso reescrever toda a interface com o usurio, ou criar uma interface totalmente nova sem ser necessrio alterar a camada operacional a lIO banco de dados. A flexibilidade obtida nesse modelo
mais do que compensa qualquer trabalho adicional envolvido para assegurar que as trs camadas
sejam apropriadamente independentes.
Agora, embora o modelo Windows DNA seja bem detal hado, a impl ementao real pode ter
uma entre vrias configuraes diferentes. Em um caso, o ap licativo poderia executar tudo em
um servidor, com o Acti ve Server Pages (interface da Web) se comunicando com os componentes (provavelmente escritos em Visual Basic 6.0), que, por sua vez, funci onariam com uma instalao local do SQL Server. Apenas uma mquina usada, mas as trs camadas ainda so
distintas, e o modelo Windows DNA mant ido. De modo alternati vo, o mode lo tambm pode
ser expandido para quantas mq uinas fo rem necessrias a fim de man ipu lar a carga do sistema.
Um sistema possvel poderia empregar um grupo de 20 servidores Web, todos atendendo ao
Acti ve Server Pages, que se conectaria a um agrupamento de mquinas com bal anceamento de
carga executando o mesmo conj unto de com ponen tes do COM, que, por sua vez, acessariam um
par de servidores processando o SQL Server em uma configurao de grupo. Apesar da implementao em escala muito maior, o mesmo modelo est sendo adotado, o que demonstra a flex ibilidade e escalabilidade do Windows DNA de trs camadas que o tornou to popu lar.
Dia 5
COM nas camadas de apresentao e operacional. No Windows DNA convencional, voc poderia reescrever seus objetos operacionais sem ter de alterar a camada de apresentao ou de dados,
mas apenas se estivesse utilizando uma linguagem compat vel com o COM (em geral o Visual
Basic ou o VC++). A plataforma .NET introduz uma nova mane ira de comunicao que pode
permitir a abstrao real entre as camadas, o SOA P (Simple Object Access Protocol).
A comun icao do SOAP Ioda feita com o uso da XML, em vez de um fo rmato binrio, e executada antes do conhecido protocolo HITP. Para o desenvolv imento de ap licativos distribudos,
isso significa que qualquer linguagem/ferramenta poderia ser usada para criar as camadas do sistema. Seria possvel que os componentes j existentes em sua empresa estivessem escritos em
Java, que poderia fornecer a camada de apresentao do sistema, enquanto o front-end estaria na
plataforma .NET usando o AS P.NET ou um ap licativo Windows . A verso .NET do Windows
DNA at me lhor do que antes quando ele empregava o conjunto antigo de tec nologia para desenvolvimento.
137
Continuando nessa mesma linha de raciocnio, a falta de requisitos de cliente significa que para
seu apli cativo ser executado, nada (alm do requ isito bsico de um navegador da Web de algum
tipo) precisa ser instalado no computador do usurio. Quando voc atualizar seu site, alterando
as pginas armazenadas em seu servidor, o prximo usurio a acess-lo ver a nova verso, e nenhum outro problema relac ionado atualizao ou distribuio. Todos esses beneficios que resultam da falta de requisitos de cliente tomam a escolha de uma interface da Web relativamente
fcil , exceto por dois pontos:
A expe rincia que o usurio tem com um navegador da Web ainda no to boa quanto
com um aplicativo Windows. Considere alguns dos ap licativos Windows que voc tem
util izado, como o Microsoft Office, o Visual Studio .NET, o Adobe Photoshop e outros, e
perceber que quase nada na Web chega prx imo do nve l da interface com o usurio.
possvel produzir uma interface na Web que seja semelhante, mas o trabalho necessrio
ser muito maior se compararmos com um aplicat ivo Windows.
Um aplicativo AS P.NET em geral s func iona quando o usurio est conectado e seus recursos so afetados pela ve locidade dessa conexo.
Alguns itens apenas no funcionam em um sistema com base na Web, como uma experincia
o ff-tine igualmente funcional e satisfatria. Por exem pio, o Outlook capaz de funcionar on-line
ou off-l ine, mas sua contrapartida na Web, o Outtook Web Access, no possui nenhuma funcionalidade off-li ne. Um programa projetado para trabalhar com arquivos ou outros aspectos 'locais' de seu sistema no ter um desempenho to bom se transferido para urna interface com o
us urio com base na Web.
Concluindo, dificil encontrar razes contra o uso de uma interface da Web, e h muitas vantagens em desenvolver um sistema dessa maneira.
o .NET Framework deve se r instalado no cl iente, enquanto no caso do ASP.NET, s necessrio no servidor Web.
138
Dia 5
Atualizar seu aplicat ivo em geral significa lidar com todos os microcomputadores de alguma maneira (ferramentas automatizadas ou opes de download de rotinas ou drivers
especficos podem eliminar um pouco desse esforo).
A dependncia da mquina-c li ente possui um efe ito colateral perni cioso quando se est li dando
com aplicativos pblicos; o desempenho de seu aplicativo depender de uma mquina sobre a
qual voc no tem nenhum controle.
Todos esses requisitos fazem parecer que a opo entre cliente do tipo 'thick' (mais robusto) e do
tipo ' thin ' (mais simples) no absolutamente uma tomada de deciso. Na verdade, contudo,
ainda h vrias vantagens interessantes nos ap li cativos do Windows Forms que valem a pena
mencionar. A primeira grande vantagem que o desenvolvedor que usar o Windows Forms poder criar interfaces com o usurio completas e funcionais e ser possvel faz-lo muito mais rpido do que com o ASP.NET. Apesar de todos os avanos na tecnologia da Web, ainda mais
difcil gerar lima interface complexa nesse local do que no Windows.
NOTA
Urna segunda vantagem est no desempenho da interface eom o usurio, uma interface do Windows em geral responde melhor (responde mais rpido aos cliques e oulras aes do usurio).
Para conc luir, a ltima vantagem em usara Windows Forrns que h aqueles itens (uso off- line,
processamento mais rpido de objetos locais, como por exemplo, arquivos) que simplesmente
no podem ser realizados na Web.
NOTA
139
jeto pode estar fadado falha. claro que os erros sempre podero ser corrigidos, mas nesse
caso, muito trabalho poderia ser eliminado se uma nova arquitetura precisasse ser selecionada.
o fator mai s importante na esco lha da melhor arquitetura so os requisitos do sistema. Esses detalhes, obtidos com os Ideres operacionais do projeto e seus futuros usurios, devem especificar
minuciosamente o que o sislema precisa fazer . Aps conhec-los, o segredo ser projetar um sistema que possa manipular essas necess idades. Voc pode analisar um resumo dos requisitos de
sistemas na seo " Exemplos de Cenrios" para ter uma percepo dessa tomada de decises,
mas primeiro fornecerei um conjunto de perguntas para serem formuladas quando for interpretar
os requisitos ou examinar um grupo j existente deles.
NOTA
Com base em minha experincia, e por ter observado a de outras pessoas que
no foi mu ito agradvel, recomendo nunca desenvolver um sistema (ou pro jetar estimativas ao desenvolver um) com base nos requisitos interpretados pelos outros. Por outros quero dizer algum que no seja voc ou um membro de
sua equipe em cujo trabalho confie. Requisitos incorretos em geral resu ltam
em um sistema inadequado e terminaro defin itivamente em uma estimativa
invl ida . Depois de ocorrido, culpar os requisitos fornecidos no ir ajudar,
portanto, certifique-se de que voc ou um membro de sua equipe est eja envolvido na documentao deles. Se isso no for possivel, ento, estabelea um
tempo maior a seu projeto para revisar a anl ise dos requisitos existentes e
para examinar qualquer parte obscura pesquisandO diretament e a fonte (o
pessoal operacional por trs do projeto, os usurios ou mesmo um sistema anterior que executasse as mesmas aes).
Plataforma Cliente
Como parte de seu planejamento, voc precisa saber alguns detalhes sobre a plataforma em que
seu sistema ser executado:
Qual o nvel de controle que a empresa tem sobre as mqui nas de deslino? Ela controla a
configurao, a instalao do software e a proteo contra vrus? So lues extremas para
essas questes seriam um serv idor s para terminais burros em urna extremidade e computadores pblicos de propriedade dos usurios na OUlra.
Algum dos computadores clientes um laptop? O acesso off- line ou remoto necessrio?
Sero precisos servios de discagem ou eles j existem?
140
Di a 5
Rede
Muitas opes relacionadas arquitetura, corno o tipo de c li ente, a repl icao de bancos de dados e o protocolo usado dependem da rede em que o sistema ser executado:
Os servios de acesso remoto sero necessrios e/ou fornecidos? VPN? Dial -up?
Que tipo (TC P/IP, IPX, NetBEU I c outros) de rede est em uso?
Segurana
Todo sistema precisa ter pelo menos algumas especificaes de segurana; mesmo um aplicat ivo no protegido deve possuir uma declarao de que foi projetado dessa maneira. Uma informao essenc ial que preci sa ser detenn inada, mas que no fc il de converter em uma si mples
pergunta, qual o nvel de im portncia que ser dado segurana do apl icat ivo e seus dados?
Tanto um s istema fin anceiro quanto um que registre a pontuao em jogos de golfe consideram a
segurana, mas o grau de preocupao provavelmente ser um pouco mai s alto em um deles.
A lm dessa parcela da informao, as perguntas a seguir sero pontos de partida te is na determinao das necessidades de segurana do apl icativo:
Esse aplicativo ser responsvel por alteraes na senha ou pelo gerenciamento de outros
recursos de segura na?
Os us urios te ro diferentes nveis de acesso, possivelmente com restries para os recursos do aplicativo que podero usar?
Outras Consideraes
Outros fatore s essenciais no desenvolvimento de uma arquitetura sero li stados aq ui , porm ,
nessas reas que o nvel de experinc ia do desenvolvedortem a maior importncia. Com relao
a esses pontos, no h respostas defi niti vas. mais uma questo de conseguir informaes su fi cientes a fim de inclu-las no planejamento da arquitetura.
Conjunto de habil idades da equipe de desenvolvimento- Algumas formas de desenvolvimento so mai s complexas e, portanto, mais dificei s do que outras. Na maioria dos casos,
141
um sistema cliente/servidor mais simples de escrever do que um completo com trs camadas. Quando escolher uma arquitetura, voc poder tentar desenvolv-la de acordo
com o nvel de habi lidade da equipe ou basear a aptido necessria na arquitetura se lecionada.
Exemplos de Cenrios
As discusses anteriores sobre os falares essenciais se concentraram no que voc precisa apreender durante a fase de anlise dos requ isitos, mas isso na verdade envolve exam inar vrias descries cam estilo de narrat iva e tentar decifrar as informaes que elas contm. Nesta seo,
mostrarei alguns exemplos breves de requis itos de sistema e as informaes sobre a arquitetura
que podem ser obt idas por meio deles.
"Uma cadeia de videolocadoras precisa de um novo sistema para rastrear as fitas, os clientes e as
locaes. Todos os locais atualmente esto conectados ao escritrio central por meio de modems. Cada loja possui um ou mais computadores agindo como term inais de ponto-de-venda. Os
computadores so novos, com placas Pentium II. Os dados sobre as Vendas/Clientes/Vdeos de
cada loja no precisam estar disponveis no escritrio central em tempo real; o sistema atual executa noite alguns comandos em lote que transmitem os dados para o escritrio central, que em
geral so s uficientes para os propsitos da loja."
Discuss o
Esse um cenrio bem COmum - mltiplos locais ou filiais executando a entrada de dados, e um
escritrio central que deseja ser atualizado regu larmente cam os dados desses locais (veja a Figura 5.2). As mquinas no local cliente parecem (de acordo com essa breve di scusso) serde um
padro comum e bastante novas de modo que um aplicativo do Windows Forms uma possib ilidade, e um do ASP.NET sempre ser uma opo. Nesse caso, o fator decisivo terminar sendo a
declarao que diz que a atual izao noturna dos dados atender. Cam esse comentrio e uma
conexo relativamente lenta retornando para o escritrio central, eu consideraria um sistema em
que os dados ficariam armazenados nesse escritrio e seriam replicados para cada local durante
perodos lentos ou noite, depois que cada loja fechasse.
Dia 5
142
Os sistemas para cada loja seriam aplicat ivos do Windows Form s, eliminando, assim , a necessidade de um servidor Web. Um banco de dados local de algum tipo (MSDE ou Access) seria instalado em cada loja, e uma carga programada desses dados seria enviada para o escritrio centra l
toda noite. Se, em vez disso, fosse usado um banco de dados centra l, com todos os escritrios
executando o seu trabalho atravs de uma conexo dial-up, proporcionaramos a vantagem de ter
os dados de todas as lojas disponveis e alualizados no escritrio central, mas o desempenho de
lima conexo via modem provave lmente seria um prob lema. Um front-end com base na Web
que desse suporte a funes que uma videolocadora em geral precisa (seria necessrio pesq uisarmos mais para determinar isso), corno a impresso de recibos e talvez cartes de associados, seria difcil de criar.
FIGURA
5.2
A l'id&olocadOrll
possui lima arquir&IUra
COII/IIn1. COII/ IIII/ilas
filiais se coneclando (I
1/11/ escritrio cel/lral.
A decis{io !Jrincipal
se o clienle deve se
cOllectar dire/amel/le
ao escritrio celllral
ou usar algum lipo de
depsito de dados
local.
Dados
Escritrio
Central
Dados
da Filial
Escritrio
da Filial
Dados
Dados
Acesso Pblico
Considere o que seria diferente se a Iinha a seguir fosse includa nos requis itos da videolocadora:
" Por fi m, esperamos criar um site da Web pblico para nossos clientes, no qual eles podero procurar filme s e verificar se um certo film e existe em estoque em uma loja especfica."
Essa declarao provoca mais alteraes do que voc pode imaginar. Como um ' requisito futuro', poderamos apenas ignor-lo e projetar o sistema com base no resto da informao. Isso produziria um sistema que teria de ser redefinido logo que a empresa passasse para a prxima etapa
de seus planos. Em vez d isso, prefervel tentar desenvolver uma arquilelura q ue aborde os planos atua is e possa manipular os requisitos futuros.
143
Sem enlramos em muitos detalhes, porque voc com certeza iria precisar colelar mais informaes sobre os planos futu ros a fim de criar uma arquitetura adequada para o si te pblico da Web,
considere as alteraes bsicas que seriam necessrias (veja a Figura 5.3 ). O comentrio sobre
"alguns comandos em lote transmitem os dados para o escritrio central toda noite" de certo j
incorreto. Se o site da Web disponibil izasse informaes sobre os filmes, mas estivesse atrasado
em um dia, no seria to til! No necessri o obter as informaes em tempo real, mas um atraso aceitve l teria de ser determi nado (talvez 15 minutos) .
Se o tempo de espera planejado no for to curto, ento, talvez o sistema tambm possa ser projetado com um armazenamento de dados loca l e atualizaes em lote. Para um sistema de computador, 15 minutos muito tempo, e seria preciso uma largura de banda muito menor do que em
uma conexo contnua. Com esse novo requisito, um apli cativo da Web parece mais adequado
porque todos os dados seriam armazenados no escritrio central e alguns cdigos poderiam ser
compartilhados entre os dois sistemas. Mas um site da Web no teria um nve l de resposta to
bom quanto um aplicat ivo do Windows Forms com o armazenamento de dados no local da loja.
FIGURA 5 .3
~ -
\.~
(,-+~
.
Dados
Escritrio . - : _
da Filial ~
Central
\. ' "
~--?::~.
Escritrio
da Filial
Escritrio
da Filial
Internet
{\.~
Escritri o
da Filial
~
l\.;;f}
Escri trio
da Filial
da FilTal
da Filial
"U ma grande empresa imobi liria, de abrangncia nacional, deseja informatizar suas li stagens
de imveis. Os corretores adicionariam as listagens direlamente a um sistema de computador, e
um site pblico da Web seria disponibilizado para os clientes pesquisarem as que estivessem dispon veis e enviarem mensagens para os corretores apropriados. Esses precisariam do servio de
li stagens, assim como de um recurso para inserir listagens novas, e acessariam os doi s de se us
144
Dia 5
laptops. J que esses corretores em geral esto viajando durante todo o dia, eles usam seus lap
tops re motamente a maior parte do tempo."
Discusso:
Dada a descrio anterior, voc poder extrair alguns elementos essenciais logo de imed iato.
Haver um site da Web, que j est defi nido, pelo menos com relao interface com o pblico.
A questo "como manipu lar a interao com os corretores". Eles tm de poder acessar e ai nda
adicionar, atualizar e excluir as listagens que inseriram no servio, tudo enquanto viajam o dia
inteiro. Poderamos sincroniz-los com o sistema quando estivessem no escritrio, fazer o
download das listagens em suas mquinas e carregar qualquer listagem nova que tivessem acres,
centado. E provvel , no entanto, que eles s passem pelo escritrio ocasionalm ente e, portanto,
lima nova li stagem no chegaria a eles ou suas listagens novas no seriam carregadas por cerca
de um dia. Isso aceitve l? Talvez, preci samos de mais informaes.
De modo alternativo, os corretores poderiam usar modems sem fio (com a tecnologia dos cel ulares, como o COMA), que poderiam conect- los ao escritrio central ou Internet de qualquer locaI. Por meio dessa opo, voc agora teria duas escolhas: continuar ut ili zando o ap li cativo
off-li ne, porm executando sua sincronizao atravs de uma conexo sem fi o (resultando em
atualizaes mai s freqentes) ou desenvolver o recurso adicionar/editar/excluir em uma parte
segura do site pbl ico da Web da agncia imobi l iria, ht tp : j jwww . nomedos;te.com . brjagentes,
que os agentes acessariam com um navegador comum pelo modem celular. Devido baixa velocidade (atual) desses modems celu lares, gostaria de considerar as duas opes e executar alguns
testes, mas o site pblico poderia ser iniciado sem espera.
Como voc pode ver, a arquitetura do aplicativo no um conceito definitivo, principalmente
quando se lida s com uma quantidade li mitada de informaes sobre a situao. Em geral, preciso sol icitar todos os requisitos possveis, anal is-los e, em seguida, voltar aos diversos entrevistados e pedi r dados adicionais. Esse processo pode ser apenas para escl arecer as perguntas
originais, ou talvez novas perguntas surjam das respostas fornecidas.
"Como projeto prtico, voc ir desenvolver uma bibli oteca pessoal com informaes sobre
C Ds que os usurios podero instalar em suas mquinas para registrar s uas colces. Ela dar suporte pesquisa por nomes de CDs e ao rastreamento de ttulos na Internet. Todos os detalhes sobre a coleo de CDs do usurio sero armazenados, e o sistema permi tir a gerao de alguns
relatrios simpl es que usem esses dados."
Discusso:
Esse sistema bem simples, e a arquitetura para desenvol v-lo tambm deve ser. O nico item
realmente desconhecido nele a pesquisa de detalhes sobre os CDs na Internet, mas essa no
145
uma questo relacionada arq uitetura. Um aplicativo do Windows Fonn s seria o mai s ad equa~
do, porm voc deve escol her um banco de dados que no seja o SQL Selver porque preferve l
fazer a distribuio sem precisar de nenhum software adicional nas mqui nas dos usurios. Um
arquivo do Access ( . mdb) ou um banco de dados MSDE atenderiam sat isfatoriamente a esse projeto. Como alternativa, todas as infonnaes poderiam ser annazenadas apenas como XML em
um conj unto de dados (DataSet).
Resumo
o un iverso da plataforma .NET novo e poderoso, mas tudo precisa de uma base. O projeto e a
arq uitetura de seus sistem as so crticos para a obteno de xito. Apesar dos novos recursos e
alteraes radicais na tecnologia subjacente, a arquitetura de um sistema. N ET no to diferen~
te do que era para um sistema do Visual Basic 6.0; muitas opes ainda so as mesmas. Cert ifi~
que~se sem pre de basear suas escolhas nos requisitos que obtiver e no esquea de planejar para
o futu ro!
Como foi mencionado, muitos aspectos da arquitetu ra dos sistemas esto alm do escopo desta
lio, mas o MSDN dedicou uma seo de seu site da Web para a arquitetura dos aplicat ivos
.NET. Acesse http://msdn.microsoft. com/l i brary Idefa u1t. asp? ur 1=11 i bra ry len -u sl dnbdal
html/daag.asp para encontrar muitos recursos teis.
P&R
P Ou,ri dizer que o Windows DNA foi abandonado e no mais aplicado agora que a
plataforma .NET existe. Voc afirmou que ele ainda empregado, mas, na verdade,
no um recurso ultrapassado?
R O Windows DNA representa tanto alguns conce itos quanto tec nologias. Algum as das
tecnologias a ele incorporadas, como o Vi sual Studio 6.0, foram s ubstitudas pelas eq uivalentes da plataforma .NET, mas o conceito do Windows DNA (computao distribuda em vrias camadas, separando as de apresentao, operacional e de dados) ainda
vl ido. Os sistemas q ue j foram desenvolvidos com o mode lo do Windows DNA sero
fceis de transferir para o universo da plataforma .NET.
P No universo da plataforma .NET, todos os meus componentes se comunicaro uns
com os outros por meio do SOAP (XML acima do HTTP),emvezdecomo velho pa ~
dro binrio do DCOM?
R Voc est correto com relao ao fato de que o DCOM no mai s o mtodo preferido,
mas a plataforma .NET fornece mai s do que apenas o SOAP como um meio para dois
aplicati vos se comunicarem. O SOAP excelente para a comunicao com a platafonna
.NET ou sistemas que no sejam .NET e especialmente bom quando se trabalha entre
Dia 5
146
duas redes porque ele passa com fac ilidade atravs de firewa lls. O SOAP uma opo,
mas h vrias outras fo rmas de comunicao inc luindo os formatos binrios.
Workshop
o Workshop foi planejado para ajud-lo a anteci par possveis dvidas, revisar o quej aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
1. Nomeie uma vantagem relevante cm usar uma interface com usurio com base na Web
em vez de um aplicativo Windows.
2. Se um apl icat ivo usar um arquivo do banco de dados Access localizado em um serv idor,
ele ser considerado um sistema cliente/servidor ou de uma nica camada?
3. O que tem de ser instalado para que um computador execute um aplicativo criado com a
plataforma .NET (no s procurar um site da Web criado com e la)?
SEMANA
DIA
Depurao
Dia 6
148
dois tipos de excces - exees de hardware e de software. claro que uma exceo de hardware aquela causada pelo hardware - por exemplo, quando seu programa tenta acessar LIma parte
da memria que no deveria ou um evento semelhante que ocorra com base no hardware. Uma exceo de software ocorre quando se tenta atribuir um valor incompatvel a uma varivel ou um
erro parec ido acontece.
o Ira/ame/1/o de excees estruturadas uma estratgia para lidar com erros de hardware ou
software. Tratando os dois tipos de exceo da mesma maneira, o cdigo necessrio para process-las ser mais fci I de escrever e mais consistente. Execute o tratam ento de excees estruturadas para 'proteger' as sees de cdigo que est iverem propensas a serem alvos de excees. Por
exemplo, quando estiver para efetuar uma diviso, poder proteger o cdigo que a calcula. Se por causa de um erro que voc cometeu no programa ou um valor que o usurio inseriu - o programa tentar fazer a diviso por zero, o cd igo protegido poderia lidar com a exceo resultante.
Outras vezes cm que se deve usar o SEl-I so na leitura em bancos de dados, abertura, leitura ou
gravao em arqu ivos, ou qualquer outro momento em que voc ache que um erro possa ocorrer.
NOTA
Sou daqueles que cr ser difcil usar em demasia o SEH. Os benefcios que
pode obter protegendo a si mesmo, seus programas e usurios de erros compensam em muito uma pequena reduo no desempenho que resu lte da utilizao do SEH. Por out ro lado, seja sensat o. Se no ho uver nenhuma
possibilidade (e quero dizer, realmente no existir a possibilidade) de um erro
ocorrer, deixe de lado a digitao adicional.
Erros e Excees
Bem, em que um erro difere de uma exceo? Se voc estiver fam iliarizado com outras verses
do Visual Basic ou mesmo com a maioria das linguagens de programao, decerto se deparou
com o conce ito de erro, mas no de exceo. Qual a diferena? Porque precisamos de uma palavra nova e de algo que soa to extravagante como o tratamento de excees estruturadas?
Problemas e ...
149
Primeiro, uma exceo na verdade um erro. Parte do problema, no entanto, que um erro s i gn i ~
fica muito mais. Um exemplo de erro poderia ser uma funo que retornasse um resultado que
no fosse esperado ou se o programador usasse o algoritmo errado. Uma exceo mais forma l.
A exceo ocorre, para repetir a definio anterior, quando algo acontece em seu cdigo fora do
fluxo normal de controle. O SEH define uma maneira particular de lidar com excees, assegu
rando que tudo seja nonnali zado depois do fato. Alm disso, um outro recurso adequado das ex
cees que hoj e elas so compartilhadas entre todas as linguagens que tenham suporte da
plataforma .NET. Isso significa que seria possvel ter um cdigo que causasse uma exceo em
uma linguagem , mas a tratasse em outra.
A maioria dos erros no Visual Basic tem sido tradicionalmente tratados com o uso da instruo
On Error. Essa instruo lio estruturada e pode resultar em um cdigo confuso que salte de
um local para outro de um proced imento. As excees so tratadas com a ut ilizao de uma
abordagem mais estruturada, ou organizada, como voc ver.
o Bloco Try
Voc deve proteger a seo dos cdigos com Obloco Try ... End Trya fim de tratar asexcecs sem
pre que ocorrerem. Inicie o cdigo que deseja proteger com Try e fina lize a seo com End Try.
Try:
1'y
Catch Ex As Exception
[nd
Try
onde Try o incio da seo do cdigo a ser protegido e [nd Try fina liza o bloco de cd igo. A li
nha Catch marca a seo do bloco que realmente trata as excees que possam ocorrer.
A Seo Catch
Marcar apenas uma seo de cdigo com Try .. . End Try na verdade no produz nenhum resulta
do. Se uma exceo ocorrer no cdigo protegido, ela deve ser ' capturada' e tratada. Capture a ex
ceo com a pa lavra chave Catch.
Cada bloco Try ... End Try pode ter uma ou mais sees Catch. Cada seo Catch em geral se
dest ina a um ou mais tipos de exceo. Se decidir ter vrias sees Catch em seus blocos Try,
cada seo deve capturar tipos diferentes de exceo. Voc pode querer fazer isso para permitir
que cada tipo de exceo seja tratado de modo diferente. Se resolver inseri r todas essas sees
Catch, tambm recomendvel ter uma seo Catch genrica que capturar todas as excees
150
Dia 6
que possam passar pelas outras sees. Essa fonna do bloco Try . . . End Try teria uma aparncia
seme lhante mostrada na Listagem 6.1 .
CDIGO
LI STAGEM
6.1
1 Try
3
4
5
6
7
8
9 End Try
ANALISE
Esse bloco Try foi projetado com a fina lidade de capturar erros em um procedim ento
que processa arq uivos. H sees separadas para tratar excees por arquivos no
encontrados (Fi 1eNotFoundExecpt i ons), de EIS (I OExcept i ons) c outras. Se existisse apenas uma
seo Catch, voc precisaria de algum cdigo que detenninasse a exceo especfica. Dessa maneira, fica mai s evidente que cdigo usado para cada tipo de exceo.
Criaremos um programa com uma exceo intencional , de modo que voc possa ver como ela
func iona. Exam inaremos seus res ultados e o que ela faz ao programa. Em seguida, adicionaremos o tratamento da exceo, e saberemos como ele pode proteger o cdigo.
1. Crie um novo aplicativo do console. Chame-o de Exceptions.
2. Altere o nome do mdulo criado para modExcepti onal.
3. Acesse a caixa de dilogo Project Properties dando um clique com o boto direito do
mouse no nome do projeto do Solution Explorer e selecionado Properties.
4 . Configure o Startup Object como modE xceptiona1. As configuraes fina is devem ficar
como as que so mostradas na Figura 6.1.
Para atender a finalidade deste exemplo, voc usar uma exceo simples e surpreendentemente
comum, Division By Zero, que ocorre quando h uma div iso por zero. Esse erro pode ser demonstrado com facilidade divid indo-se um nmero por uma varivel no iniciali zada. ( uma
das causas ma is comuns dessa exceo).
A Listagem 6.2 mostra que aparncia o cdigo final dever ter:
151
FIG URA 6 .1
A caixa de dilogo
['roj ecl Properlies
_
--
--,
............
..........
: : . c...........
~_ ,
...
"" - _:
_fi"
ww..-,
LISTAG EM 6 .2
<.~
~;
..,..
'
'
0,"""
1 Module modExceptional
2
3
Sub Main()
4
'***Este cdigo contm uma exceo,
5
'e portanto no ser executado at o f i nal
6
Dim dDividend As Decimal; 5
7
Dim dDivisor As Decima l = O
8
Dim dResult As Decimal = O
9
'Essa 1 i nha a que causar
10
' uma Exceo Di vi s i onByZero
11
dResult = dOividend jdDivisor
12
System.Console . ReadLine()
13
End Sub
14
15 End Module
ANALISE
As linhas 6, 7 e 8 declaram suas variveis. Voc usou decimais aqui, mas tambm poderia empregar outros tipos de varivel numrica, Os valores tambm foram inicial izados,
Antes da diviso na linha II , o valor com o qual o divisor foi inicializado, O, no foi alterado.
Portanto, quando o compulador tentar efetu-la, uma exceo ocorrer, Se voc executar esse
programa no IDE, ver um erro como o mostrado na Figura 6,2,
Se voc selecionar Break, o programa ainda ser executado, mas no modo Debug (depurao).
Examinaremos melhor o modo Debug ainda nesta lio, portanto selecione Continue neste momento. Isso far com que o programa continue a ser executado. Neste caso, ele ser final izado.
152
Dia 6
FIGURA
6.2
., '
Mensagelll-padnio
de e.r:ceo.
.. I
"""
Se voc reproduzir o exemplo e tentar execut-lo em umajanela do prompt de comando, o resultado fina l ser semelhante, porm sua correo ser mais difci l. Primeiro, em um computador
de desenvolvimento (que tenha o Vi sual Basic .NET instalado), deve aparecer a caixa de dilogo
Jusl- In-Time Debug . Selecione No; seu programa conti nuar, e este resultado aparecer:
RESULTADO
Essa uma mensagem-padro que voc ver quando uma exceo ocorrer. Vrias
mensagens de erro relacionadas a excees so muito mais longas, no entanto, todas
contm informaes semelhantes. A primeira linha sempre identifica o tipo de exceo que acabou de ocorrer. Neste caso, descobriremos que foi uma do tipo Sys tem.Oi vi deByZeroException.
O tipo de exceo em geral uma grande indicao da natureza do erro e pode at proporcionar
idias de como corrigi-Ia. Aqui, o tipo de cxcco System.OivideByZeroException informa
principalmente dois dctalhes:
ANLISE
A exceo que acabou de ocorrer uma das 'comuns' , isto , que faz parte do espao de
nome System (e no de outro espao de nome, como System. 10. Fi leNotFoundException).
A exceo que acabou de ocorrer envolve lima operao de diviso. Portanto, voc deve
procurar uma possvel causa em seu cdigo, onde estiver efetuando uma diviso.
De maneira seme lhante, o restante da exceo disponibiliza muitas informaes. As outras linhas so uma lista invertida dos procedimentos que estavam efetivamente em execuo quando
a exceo ocorreu . Na sada do exemplo, vemos que na verdade ela surgiu no procedimento
System.Decimal.Divide. Esse procedimento foi chamado por Exceptions.modExceptional,Main.
A principal funo de todas essas informaes localizar candidatos ao erro. Ao encontrar uma
exceo, voc deve primeiro examinar o cdigo de cada um desses procedimentos. Em geral
(mas nem sempre), o erro se encontrar em um deles. Comece com o prime iro item da lista (nesse caso, modExcept i ona 1 . Ma i n) e percorra-a at o final. Mais ad iante, nesta lio, exam inaremos
algumas ferramentas que tornaro esse trabalho mais fcil.
Algumas outras excees comuns esto descr itas na Tabela 6.1 .
153
Esta no uma lista completa de todas as excees possveis. H muitas outras; por favor consulte a ajuda do Visual Basic .NET para obter mais detalhes .
A lm disso, voc pode criar suas prprias excees para adicionar a essa lista
se precisar, como veremos ainda nesta lio.
NOTA
TABELA 6.1
Problemas e ...
Excees Comuns
TipO de Exceo
Ouando Ocorre ?
ArgumentException
Categoria geral para erros que ocorram quando o tipo (ou vaIar) errado for passado para um mtodo. Inclu ArgumentNul1 Exception e Argumen t OutofRangeException. Pode surgir
por causa de um erro do programador ou nas entradas de dados do usurio.
ArgumentNul1Exception
ArgumentOutOfRangeException
Ocorre quando passada uma varivel que grande ou pequena demais para o mtodo, por exemplo, se voc passar o
nmero -1 a um mtodo que foi criado para conter um valor
relativo ao ms (isto , entre 1 e 12).
OivideByZeroException
I ndexOutofRangeExcepti on
NotlmplementedException
Geral mente usada como um espao reservado quando o desenvolvedor est trabalhando pela primeira vez no programa. Voc pode criara shell para seu aplicativo e, em seguida,
lanar essa exceo de qualquer mtodo. Enquanto continuar
no aplicativo, substitua a exceo pelo cdigo efetivo. Isso
assegurar que conclua todos os seus procedimentos.
OurOfMemoryException
OverflowException
Uma exceo bem comum que ocorre quandO voc tenta inserir um valor que muito grande em uma varivel, como,
por exemplo, na atribuio a segui r:
Dim iSmal1ishNumber As Short = 50000
FileNotFoundException
Agora que voc j vi u a exceo e tem (espero) uma idia me lhor do que seja, deve adicionar o
SEH a seu programa para fornecer ao usurio mais informaes quando um erro ocorrer.
154
Dia 6
Abra o projeto Exceptions no Visual Basic .NET. Voc copiar o projeto anterior e far
es para capturar a exceo, como mostram as etapas a seguir:
a1tera~
I. Altere o nOlne do projeto para Excepti ons2. Faa isso selecionando o projeto no Solution
Explorer e, em seguida, selecione File, Save Exception As no menu.
2. Altere o nome do arquivo que contm o cdigo para Excepti ons2 . vb. Faa isso se lecionando o arquivo no Solution Explorer e, em seguida, sc lecione File, Save Excepti on. vb As.
3. Adicione um bloco Try . .. End Try ao cd igo que efetua o clculo. Use uma instruo
Catch genrica para capturar a exceo Di visioll By Zero .
4. Ad icione um cdigo para exibir uma mensagem mais am igve l quando a exceo ocorrer.
o novo cdigo deve ficar com uma aparncia semelhante ao da Listagem 6.3.
COlGO
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Module modExceptional
Sub Main()
'***Este cdigo contm uma exceo.
'e portanto no ser executado at o final
Dim dDividend As Decimal = 5
Dim dDivisor As Decimal = O
Dim dResult As Oec ima l = O
'Esta linha a que causar
'uma exceo OivisionByZero
Try
dResu l t = dOividend I dDivisor
Catch Ex As Exception
System.Console.Write Line("Ocorreu um erro de diviso por zero,")
System.Consol e. WriteLi ne ("Verif iq ue o di vi sor. ")
End Try
17
18
19
System.Console . ReadLine()
End Sub
20
21
End Module
A linha 11 inicia o bloco Try, portanto, o cdigo desse local at o primeiro bloco
Ca tc h da linha 13 est protegido. Nesse caso, a nica linha executvel aque causa a
exceo da divi so por zero na linha 12. Quando essa exceo ocorrer, o programa ser interrompido e procurar algo para tratar dela. J que a seo Catch da li nha 13 genrica, capturar qualquer tipo de exceo. A varive l Ex ser usada pam armazenar a exceo criada, e voc poder
empregar as propriedades dessa varivel para visualizar mais informaes sobre a exceo. Em
ANLISE
155
seguida, ser exibida uma mensagem de eITo, e o cdigo continuar at o final , comeando na linha posterior a instruo End Try.
1
2
3
4
5
6
7
LISTAGEM
6.4
'Abra o arquivo
fsOut = New System.IO.FileStream(FileName,
System. 10. FileMode .OpenOrCreate ,
System. IO .F ileAccess . Write)
10
Tcy
11
12
13
14
15
16
17
18
19
20
21
'Grave no arquivo
strOut =New System.IO.StreamWriter(fsOut)
strOut . Write(DateTime . Today .ToString(
Catch elO As Exception
Console.WriteLine{"No foi poss vel gravar no arquivo: {O} .",
Fi 1eName)
End Try
Catch eFile As Exception
Console.WriteLine("No foi possivel abrir o arquivo: {O}.", FileName)
End Try
End Sub
A Listagem 6.4 um exemplo de gravao em um arqu ivo. Voc examinar esse assunto com mais detalhes no Dia 8. Porm , h dois blocos Try . . End Try neste exemplo. Um dos blocos Try (o que comea na linha lO) est todo contido dentro do outro bloco Try (o
que comea na linha 4). Portanto, o bloco Try interno est aninhado no outro bloco. Se uma exceo ocorrer na gravao que acon tece na linha 14, a in struo Catch da linha 15 a capturar, e o
usurio ver "No foi possvel gravar no arqu i vo SomeFil e .out". Alm disso, se o arqu ivo no
puder ser aberto, o bloco Catch da linha 18 capturar a exceo, exibindo "No fo i possvel
abrir o arquivo: SomeFile .Out ".
ANALISE
Dia 6
Exatamente como com If . .. End If e outros blocos, no h lim ite para a maneira de an inh los.
s vezes, aninhar blocos perm ite que a escrita do cdigo seja fe ita de uma mane ira mais organizada do que se eles no fossem aninhados.
A Seo Finally
Quando voc escrever blocos Try, s vezes se deparar com situaes nas quais, mesmo se uma
exceo ocorrer, ter de executar algo. Por exemplo, se voc escrever um cdi go que grava informaes em um arquivo, deve fech -lo, ocorrendo ou no um erro durante a gravao. Ad icione essa funcionalidade com a seo Fi nal1y. Essa seo surge depois de todas as sees Catch . e
deve conter apenas o cdigo que sempre ter de ser executado. Esse um bom local para fechar
arquivos, con fi gurar variveis com Nothi ng Oll exclu- Ias quando desejar. A Listagem 6.5 mostra
a insero de uma seo Finally no cd igo da Listagem 6.4.
LISTAGEM
COOIGO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
6.5
'Grave no arquivo
strOut "New System.IO.StreamWriter(fsOut)
strOut.Write(OateTime.Today.ToString(
Catch elO As Exception
Console .Write Line("No foi possvel gravar no arquivo:{O} . ",
FileName)
Finally
strOut.CloseO
End Try
Catch eFile As Exception
Console.WriteLine{"No foi possivel abrir o arquivo: {O} . " , FileName)
Fina lly
fsOut.CloseO
End Try
End Sub
157
Aqui, tanto StreamWri ter quanto Fi 1e sero fechados, mesmo se erros ocorrerem.
Embora isso no seja necessrio, boa prtica fazer uma limpeza sempre que no
precisar mai s de uma varivel.
ANALISE
Lanando Excees
Ocasionalmente, pode-se querer not ificar um usurio de que algo de muito errado aconteceu.
Pode ser algo relacionado ao seu aplicativo ou uma exceo ' normal ' . Por exemplo, voc pode
ter criado dois objetos nesse aplicativo, Emp 1oyee (funcionrio) e Cus tomer (cliente). Talvez queira
gerar lima exceo se o programa tentar atribuir uma instncia de Empl oyee a uma varive l criada
para conter objetos Customer. Em vez de criar um novo tipo de exceo, possvel reutilizar
Inval idCastExcepti on. Assim, uma nova exceo Inval i dCastException poder ser gerada e usada como notificao do aplicativo atravs da instruo Throw. Isso mostrado na Listagem 6.6.
CDIGO
LISTAGEM 6.6
Instruo Throw
A linha importante do exemplo a oitava. Ali , voc criou uma nova instncia do objeto InvalidCastException e a ' lanou' , Isso gerar uma exceo adicional que
deve ser capturada por uma instruo Ca tch ou tratada pela rotina-padro, causando o surg imento
do depurador (se houver um ambiente de desenvolvimento instalado) ou de uma mensagem de
ANLISE
OITO .
o tratamento de excees fornece uma maneira estruturada e limpa de proteger seus programas
de erros devido a problemas no hardware, entradas invl idas do usurio ou a seus prprios enganos. Qualquer programa se tornar mais robusto se voc adicionar o tratamento de exceo a um
cdigo que poderia ger-la.
Depurando
a depuraoNovo TERMO To importante quanto a tratar apropriadamente os eITos e excees
o ato (e arte) de tentar encontrare corrigir os erros do cdigo. E claro que isso leva
com freqnc ia pergunta, "Em primeiro lugar, por que h eITos no cdigo? Os desenvolvedores
158
Dia 6
(voc est lendo este livro, no?), s vezes enganos acontecem. Antes que voc possa remover os
erros de seus programas, passemos mais algum tem po examinando corno eles podem surgir.
surja como
Um engano na estratgia usada para executar alguma tarefa . Essas falhas so em geral
chamadas de erros lgicos que s vezes so os mais difceis de corrigir. Eles ocorrem
quando se escreve o cd igo de mane ira errada. Voc poderia estar ordenando lima lista de
nomes, mas o modo usado para faz-l o no levou em conta todos as possibilidades. Por
exemplo, algum com o sobrenome St. Jean deve vir antes ou depois de uma pessoa que
tenha como primeiro nome Santana?
Um engano ao inserir o cd igo, um erro de digitao. Esses podem ser fce is ou dificeis
de resol ver. De certa maneira, esses erros devem desaparecer quase inteiramente,j que o
Visual Basic .NET verifica r a digitao das palavras-chave. Porm, os erros de digitao
podem se tornar um problema, se voc no configurar Option Expl i ci t em seus mdulos.
Se no o fizer, poder cometer um erro acidental ao digitar um nome de varivel posteriormente, fazendo com que o Visual Basic .NET crie de modo automtico uma nova varivel. Essa varivel nova seria inicial izada com o valor O(em varive is numricas), o que
pode no ser o desejado. Por exemplo, sem Opt ion Expl i ci t , o cdigo a seguir seria compilado, mas nunca retornaria nada.
1 Imports System
2 Module Typo
3
4
Sub Main
5
Dim sName As String
6
7
8
9
10
11 End
Como j fo i dito, Option Explicit fa ria com que o Visual Basic .NET capturasse esse
erro. Sem ele, voc tambm poderia captur-lo sem grandes dificuldades. No entanto, h
um subconjunto desses tipos de erros que, por razes que desconheo, o crebro sempre
l corretamcnte. Examinei durante alguns minutos uma seo de cdigo na qual sabia que
havi a um erro de digitao, mas no vi nada. Toda vez que leio a palavra escrita incorretamente, a enxergo da manei ra 'correta' . Nessas situaes, chamamos sempre outra pessoa,
Prob lemas e .. .
159
que olha por cima de nossos ombros e imediatamente percebe o erro, causando algum embarao. Depois de alguns momentos de brincadei ras. os dois voltam ao trabalho.
Um erro causado por entradas do usurio ou pelos dados. Esses so erros difceis de corrigir depois que ocorrem. A melhor sol uo para a entrada ou dados incorretos reduzir a
chance do usurio inserir infonnaes invli das. Voc examinar alguns dos controles
que podem ser usados para isso posteriormente neste livro. Alm disso, ser um 'programador defen sivo' tambm ajudar . Pressuponha que os dados sejam invlidos - voc
deve veril1car os valores, para ter certeza de que so apropriados e proteger as sees de
cdigo que possam gerar excees usando o tratamento de excees estruturadas.
Faa
Use Qption ExpliCit em todos os mdulos.
Isso ajudar o Visual Basic .NET a detectar
muitos erros que voc possa por acidente adicionar a seu cdigo digitando incorretamente
nomes de variveis.
Bem, pode haver muitas fontes de erros em seus programas. Algumas delas estaro sob controle,
enquanto outras no. De qualquer modo, o Visual bas ic .NET fo rnece a voc mui tas ferramentas
para ajud-lo a corrigir, ou depurar, seus programas.
LISTAG EM 6 .7
Juros
5.00
5.25
15
1060.66 790.79
1072.92 803.88
20
25
30
Dia 6
160
1
LISTAGEM 6.7
5.50
5.75
6.00
687.89614.09567.79
1097 . 69830.41 702.08 629.11 583.57
1110.21 843 .86 716.43 644.30 599.55
6.25
6.50
1122 . 80 857.42
1135.4887 1. 11
1148 . 24 884 . 91
1161.08898 . 83
1174.01 912.86
1187.02 927.01
1200 . 11 94 1. 28
1213.28 955.65
1085 . 26 817 . 08
6.75
7.00
7.25
7.50
7.75
8.00
8.25
8.50
8.75
9.00
9.25
9.50
9.75
10.00
1226.53 970.14
1239.86 984.74
730.93
745.57
760.36
775.30
659.67
675.21
690.91
706.78
615.72
632 . 07
648.60
665.30
867.82805.23768.91
1253.27 999.45 883.71 822.14 786.70
1266 . 76
1280 . 33
1293 . 98
1307.70
1321.51
A Listagem 6.8 mostra a tentativa ini cial de criar esse programa e seu resultado, confirmando
que voc precisa executar uma depurao.
COOIGOI
RESULTADO
LISTAGEM 6 .8
1 Option Explicit On
2 Imports System
3 Imports Microsoft.Visua18asic.ControlChars
4
5 Modu le modMain
6
7
8
9
10
11
12
13
14
15
16
17
Sub Main()
Oim sInput As String
CODIGOI
RESULTADO
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
41
161
'Crie a tabela
OutputMortgageTable(dblReturn)
Console.Write("Pressione ENTER para continuar")
Console . ReadLine()
End Sub
40
42
43
44
45
46
Um
Next
End Sub
47
48
Public Function Payment(ByVal Principal As Double.
ByVal Annuallnterest As Double . _
49
ByVal Periods As Integer) As Double
50
Dim dblMonthlylnterest As Double = Annuallnterest / 1200
51
52
Return Pri ncipal * dblMonthlylnterest * 1 +
dblMonthlylnterest ~ Periods / 1 +
53
dblMonthlylnterest ~ Periods -1
54
End Function
55
56
57 Eod Module
162
Di a 6
CODIGOI
LISTAGEM 6.8
RESULTADO
Anos
10
15
415 . 67
5.00
436 . 50
5.25
457 . 33
5.50
478 . 17
5.75
499 . 00
6.00
519 .83
6.25
540.67
6.50
561. 50
6.75
582 . 33
7.00
603 . 17
7.25
624 . 00
7.50
644.83
7. 75
665.67
8.00
686.50
8.25
707 . 33
8.50
728.17
8.75
749.00
9.00
769.83
9.25
790.67
9.50
811. 50
9.75
832.33
10 .00
5. 00
20
25
30
415.67
5. 00
415.67
5. 00
436.50
5.25
436.50
5.25
457.33
5. 50
457.33
5.50
478 . 17
5. 75
478 .1 7 5. 75
499.00
6. 00
499.00
6.00
519.83
6. 25
519.83
6.25
540.67
6.50
540.67
6.50
561. 50
6. 75
561. 50
6.75
582.33
7. 00
582 . 33
7.00
603.17
7. 25
603.17
7.25
624 . 00
7. 50
624 . 00
7. 50
644.83
7.75
644.83
7. 75
665.67
8. 00
665.67
8.00
686.50
8.25
686.50
8.25
707 . 33
8. 50
707 . 33
8. 50
728.17
8. 75
728.17
8. 75
749.00
9. 00
749.00
9.00
769.83
9. 25
769 . 83
9.25
790.67
9.50
790.67
9.50
811.50
9. 75
811. 50
9.75
832.33
10.00
832.33
10.00
Juros
5. 00
415 . 67
5.25
436 . 50
5.50
457.33
5.7 5
478.17
6.00
499 .00
6.25
519 .83
6.50
540.67
6. 75
561. 50
7.00
582 . 33
7.25
603 . 17
7. 50
624.00
7. 75
644 .83
8.00
665 . 67
8.25
686.50
8. 50
707.33
8.75
728 .1 7
9.00
749 .00
9.25
769.83
9.50
790 . 67
9.75
811.50
10 .00
832 . 33
415.67
5.25
436.50
5.50
457.33
5. 75
478.17
6.00
499 .00
6.25
519 .83
6.50
540.67
6. 75
561. 50
7.00
582 . 33
7.25
603 . 17
7. 50
624.00
7. 75
644 .83
8.00
665 . 67
8.25
686.50
8.50
707.33
8. 75
728 .1 7
9.00
749 .00
9.25
769.83
9.50
790 .67
9. 75
811.50
10.00
832 . 33
Prob lemas e .. .
163
ser o modo Design. Para confinnao sobre qual modo est em uso, examine a barra de ttulo da
janel a. Depois das palavras ' Microsoft Visual Basic' , aparecer [design]. De maneira semelhante, quando um programa for executado no IDE, veremos [run], significando que esse o
modo Run. O lt imo modo Break, ou Debug. Esse modo surgir se o programa que est iver em
execuo for interrompido de alg uma fonna. Essa interrupo pode se dar devido ocorrncia
de uma exceo, ou o modo Break pode ser introduzi do no IDE. Veja a Figura 6.3 para ver um
exemplo do IDE no modo Break. Observe que a barra de ttulo inclui o marcador [break].
FIGURA
6.3
.,....,
1'" _
tlot>
. -...
modo Break.
.u
.
... ,.. ,.... . <,.,(.1.,""
,< ,. , ....... ,.
Use o modo Break para auxiliar na depurao de seus programas. Nesse modo, so disponibilizadas vrias ferrame ntas por meio das quais voc poder visualizar o contedo de variveis, monitorar ou alterar o fl uxo do programa, ou testar blocos de cdigo. Essas ferramentas tero um
valor inestimvel na revelao e correo de erros em seus programas. Se quiser introduzir o
modo Break, em pregue a palavra-chave Stop, como mostra a Figura 6.3.
Como alternativa, voc pode inseri r um ponto de interrupo na li nha onde gostaria que o programa fosse interromp ido. Ele ser executado normalmente at que atinja a Iinha e, em seguida,
passar para o modo Break e retornar ao IDE. Seu programa ainda estar em processamento em
segundo plano, mas se encontrar em uma pausa. Um ponto de interrupo pode ser inserido em
seu cdigo de uma entre trs maneiras:
D um clique com o boto direito do mouse na linha do cdigo e selecione Insert Beakpoint. Um crculo vennelho deve aparecer na margem.
164
Dia 6
Selecione Debug, New Breakpoint no menu. Isso abrir a caixa de dilogo New Breakpoint (veja a Figura 6.4). Essa caixa o meio mais flexvel de criar um ponto de interrupo.
Ela no s permite que voc defina um ponto de interrupo para encerrar o programa
quando uma linha for at ingida, como tambm que os crie para situaes em que uma varivel for alterada ou alcanar um valor especfico, ou simplesmente em que uma certa
cond io for verdadeira.
FIGURA 6 .4
Caixa de dilog o
Ne li' Breakpoilll.
.......
__........ ..........
I... 1_ .... 1_ 1
""'<""'"
-,
_~.-
II
1'
1'
I.n ."",
1-
6.5
Execlltando
165
Problemas e ...
t'"' jlooo _
ii: . U IlUHIIl
f'o
1/111
11111
OM Ootu> I.... _
Iotlo
:3 ~I!.
. -.,
. ' R "
.... . . ,...-.,
".,"t.< ,.."
'Go< U. . . ' .... ,
."
Co ... , ....
. , ..... -
(0 .... , . . . . _
"
...".
_""" " 1
... "
Step Into
Esse o comando de etapas mais usado. Toda vez que voc selecion-Io, a
prxima ao disponvel ser executada. Selecione-o de dentro do procedimento Ou tputMortgageTable, e voc deve ver a seta amarela se mover para a linha
OutputMortgageTable(dblReturn)
Selec ione-o novamente, e voc dever passar para o proced imento OutputMortgageTabl e.
Selec ione-o mais uma vez, e estar na linha
Console .Write Line(Tab & "Years" &Tab & "10" &Tab & "15" &
Tab & "20" & Tab & "25" & Tab & "30")
Observe que a linha amarela no se detm nas instrues de declarao de variveis. Isso
acontece porque elas no so consideradas cdigo executvel. A seta amarela s parar
em linhas que executem algo, e no nas que declaram variveis novas.
Step OUI
Ocasionalmente este comando ser ti l se voc passar por um procedimento no qual sabe que no h erros. Ele faz com que o resto do procedimento seja executado
e move a seta amarela para a primei ra linha depois da chamada original. Selecione-o de
166
Dia 6
dentro do procedimento OutputMortgageTabl e, por exemplo, e dever ser enviado de volta ao procedimento Sub Main.
Step Over
Tambm til quando h uma depurao nos procedimentos em que sabemos que no existem erros. O comando Step Over tratar o proced imento como se fosse
apenas uma linha de cdigo. Por exemplo, se a seta amarela estivesse na linha OutputMortgageTabl e de Sub Ma i n, e Step Over fosse selecionado, todo o cdigo de OutputMort gageTable seria executado, e voc seria tran sferido para a prxima linha de Sub Main.
Run To Cursor
Outro comando til quando voc sabe que uma seo de cdigo no
possui erros. O comando Run To Cursor penn itir a execuo de todo o cdigo at a linha
se lecionada. Para usar este modo, selecione a linha ate onde deseja executar o cdigo e a
opo Run To Cursor no menu Debug ou no de atalho.
de Exemplo
Percorrer um programa s vezes pode revelar erros causados pelo desenvolvedor. Esses podem
ser laos que terminam precocemente ou que no so executados o suficiente, ou testes lgicos
que no produzem os resultados esperados.
Para percorrer o programa de exemplo, faa o segu inte:
I. Encerre o programa selecionando o boto Stop Debugging na barra de ferramentas ou selecione Stop Debugging no menu Debug.
2. Remova o ponto de interrupo que voc criou anteriormente dando um cl ique no crculo
vermelho da margem e gere um novo no incio do primeiro lao For dentro de Output MortgageTab 1e.
3. Inicie o programa. Quando as info rmaes fore m sol icitadas, digite 100000 como quantia
do emprstimo. O programa deve entrar no modo Break na linha
For i Rate = 500 To 1000 Step 25
4. Percorra o cd igo (ou se lec ione Run To Cursor) at que alcance a linha
Console .WriteLine{)
5. Exam ine a jane la do co nsole (veja a Figura 6.6). Observe que na verdade h dez itens na
linha, em vez dos cinco que voc esperava (um para cada coluna de 10 a 30). O valor da
taxa dejuros est sendo repetido a cada passagem pelo lao quando s deveria ser executado uma vez antes do lao.
167
FIGURA 6 .6
Exibindo o cabealho.
6. Aps interromper o programa, transfira a li nha de cdigo que exibe a taxa dejuros em
cada linha da tabela para que fique antes do incio do segundo lao For. O resultado deve
ter a seguinte aparncia:
Antes:
For iYea rs ~ 10 To 30 Step 5
Console.Write(Forrnat(dblAnnualInterest . "0.10") & Tab & Tab)
Depois:
Console .Write(Fonnat{dblAnnuallnterest . "0 . 10") & Ta b & Tab)
For iY ears ~ 10 To 30 Step 5
7. Pressione Step [nto para continuar a execuo do programa. Observe que a seta amare la
est novamente no incio do proced imento OutputMortgageTa ble. O Visual Basic .NET
recompi lou e recarregou o procedimento com as alteraes.
8. Agora se voc percorrer o cdigo at a linha da etapa 4, dever ver apenas cinco valores
exi bidos nessa linha, como na Figura 6.7. Eles ainda sero valores incorretos, mas pelo
menos um dos erros foi corrigido.
FIGURA 6.7
Primeira correr.;l1o.
9. Execute o programa at o final usando antes Step Oul para retornar a Sub Main. Examine
ajanela do console para ver os va lores errados (eles so os mesmos para todas as linhas).
Em seguida, retorne ao [DE e selecione Continue para finali zar o programa.
Dia 6
168
Examinando as Variveis
Alm de invest igar o flu xo da lgica de seu aplicativo, o Visual Basic .NET fornece ferramentas
que pennitem a visuali:wo do contedo das variveis. Isso penn ite determinar se se us contedos representam o que voc defi niu e se o clculo est correto.
Exatamente como quando percorreu o cdigo, h vrias ferramentas que voc pode usar para
moni lorar as varive is. Algumas das mais teis so mostradas na Figura 6.8 e descritas a segu ir:
Janela Locais
Estajanela em geral aparece na parte inferior da te la quando se est no
modo Break. Caso contrrio, selecionea na opo Windows do menu Debug. A janela
Locais mostra todas as variveis do proced imento atual , assim como seu tipo e valor no
momento. Isso prtico quando se est percorrendo um cdigo, porque os valores ficaro
com a cor vermelha quando forem alterados. A janela Locais ser til sempre que voc
depurar um procedimento que altere os valores das variveis.
Janela Watch
Estajanela em geral aparece na parte inferior da tela quando se est no
modo Break. Caso contrrio, selecionea na opo Windows do menu Debug. A janela
Watch mostrar as variveis as quai s voc estiver interessado. D um clique com o boto
direito do mouse nas variveis e se lecione Add Watch para adicionlas janela. Se elas
estiverem no escopo, o valor atual ser exibido. Seno, ela o informar que, "O nome
[nome de sua varivel] no foi declarado". Esta janela ti I para monitorar um grupo de
variveis. Em vez de s exam inlas quando est iverem na janela Locais, ser possvel
monitorlas durante toda a sesso de depurao.
Annuallnterest
1200
2. Ad icione um segundo ponto de interrupo linha End Sub de Sub Main para permit ir
que voc vis ualize a tabela antes que o programa se ence rre.
6.8
!lo
Examinando os I'a/ores
das Wlriveis.
""
e._
1l '\:.I . ~ g"
t'ol
1'0
~e. "' ,
.....
.. .p . ~
... _
. -..
169
. ,. ...
~~~
...... <11
.
..
..
"
,,
NOTA
3. Execule O programa at que alcance o ponto de interrupo. Insira 100000 para o valor do
emprstimo.
4. Quando o programa entrar no modo Break, examine ajanela Locais. Observe que ela inclui todos os valores de Principal , Annuallnterest e Periods. Do mesmo modo, se voc
mantiver o cursor do mouse sobre uma varivel (por exemplo, Annua 1Interest) no IDE,
dever ver uma jane la s uspensa mostrando o valor atual.
5. Avance uma etapa para processar essa linha. Podemos notar que a varivel
dblMonthlyInterest se alterou e ficou vermelha na janela Windows.
6. Selecione o cdigo
1 + dblMonthlylnterest
Periods
Em seguida, mantenha o cursor do mouse sobre o texto selecionado. Uma janela suspensa aparecer, informando que o valor 1. Um clculo rpido em algum local confirmar que isso estar
correto se voc executar primeiro a operao exponencial e, em seguida, a adio. No entanto, o
valor certo deveria ser aproximadamente 1.647 porque a adio deve ser efetuada antes, e s ento elevaramos o resultado quantidade referente aos perodos. Esse erro ser repet ido na segunda metade da funo . Acrescente parnteses ao clculo de modo que as adies sejam
executadas antes e, ento, teste o valor novamente.
7. De maneira semelhante, o clculo como um todo sofre de uma grande carncia de parnteses. Interrompa o programa e altere a linha de clcu lo para que fique como a descrita a seguir:
Dia 6
170
DIC A
8. Encerre o aplicativo, remova o ponto de interrupo na linha da funo Pay ment e reexeeLite o programa. Voc deve ver a tabela correta da hipoteca, como mostra a Figura 6.9.
FIGURA
6.9
Tabela correia da
hipoteca.
DICA
Uma boa idia isolar sees de cdigo que sejam especificas do sistema operaciona l ou da interface com o usurio nos procedimentos. Assim, quando
voc precisar alterar a interface com o usurio, s ter de substituir o procedimento, e no o cdigo que o utiliza.
Outra alterao seme lhante simplificar o clculo da funo de pagamento da hipoteca. J que a
expresso (1 + dblMonthlylnterest) " Periods) aparece duas vezes no clculo, voc pode
cri-Ia como uma operao isol ada . Declare uma varive l temporria do tipo duplo para annazenar o contedo e substitua o clculo por essa varivel.
171
Depois que voc tiver feito todas as alteraes no programa do exemplo, ele deve ficar semelhante ao mostrado na Listagem 6.9.
CDIGO
LI STAGEM
6.9
Cdigo Depurado
Option Explicit On
2 Imports System
3 Imports Mi crosoft.Visua 18asic.ControlChars
4
5 Module modMain
1
6
7
8
9
10
11
12
13
14
15
16
Sub Main()
Dim sInput As String
Dim dblReturn As Double
'Solicite a entrada do usurio
Dim dblPayment As Double
Console.Write{"Oigite a quantia do emp rstimo:")
s Input = Console.ReadLine()
dblReturn = CDbl(sInput)
17
18
19
20
21
22
23
24
'Crie a tabela
OutputMo r tgageTab l e(db l Return)
Console .Write ("Pressione ENTE R para continua r" )
Console . Readline()
End Sub
Private Sub OutputMortgageTable(8yVal Princ ipa l As Oouble)
25
26
27
28
29
30
31
32
Console.WriteLine(Tab & "Vears" & Tab & "l O" & Tab & "IS" &
Tab & "20" & Tab & "25" & Tab & "30")
Console.WriteLine{"Juros")
33
34
35
36
37
38
39
40
41
42
43
172
Di a 6
COIGO
44
45
46
47
48
49
50
51
52
53
54
55
56
57 End
LISTAGEM 6 .9
Next
End Sub
Public Function Payment{ByVal Pr incipal As Double,
ByVal Annuallnterest As Double , _
ByVal Peri ods As Integer)As Double
Dim dblMonthlylnterest As Double = Annuallnterest / 1200
Return Pri ncipal * (dblMonthlylnterest * _
((1 +db IMonthlylnterest)
Periods) /_
{({I +dblMonthlylnter est) A Per i ods) - 1
End Func ti on
A
Module
Quickwatch Window
Disponvel no menu Debug quando se est no modo Break.
Abre uma janela que mostra o valor das vari ve is. Esse recurso fi cou um pouco ultrapassado por causa da janela suspensa que j exibe o valor das variveis. No entanto, a jane la
Quickwatch tambm til para testar as expresses tanto quanto as varive is.
Ca]] Stack
Dispon vel no menu Debug, quando se est no modo Break. Abre umajanela que mostra a li sta de procedimentos ativos no momento. Por exemplo, se seu Sub
Ma i n chamasse QutputMortgage Tao 1e, a pi lha de chamadas exibiria os do is proced imentos
(em ordem inversa). Voc pode usar esse recurso para navegar nos dois procedimentos;
isso permitiria a visual izao da linha de Sub Main que chama o segundo procedi mento.
Esta janela pode ser empregada para depurar problemas em que a deciso errada seja selecionada em uma instruo If.
Problemas e ...
173
Disassembly
Disponvel no menu Debug, quando se est no modo Break. Esta uma
ferramenta avanada que mostra a linguagem de mquina efetiva criada para o programa
e s ser realmente til se voc conhecer a montagem.
Threads
Dispon ve l no menu Debug, quando se est no modo Break. Est~ uma ferramenta avanada que mostra as li nhas de execuo ativas em um programa. Uti l quando
se executa urna programao com mltiplas linhas de execuo no Visual Basic .NET.
O Visual Basic .NET fornece muitas ferramentas que o ajudaro a disponibilizar programas sem
erros. A melhor maneira de conhecer as ferramen tas e saber quai s delas o auxi liaro mai s, test-Ias. Em vez de tentar el im inar os erros com a leitura do cd igo, percorra-o minuciosamente,
investigue os valores das variveis utilizadas e isole as falhas empregando essas ferramentas.
Resumo
Todos os programas tm erros. Algumas vezes, o erro est na pessoa que executa o programa.
Em outras, h realmente uma falha ou erro no cdigo. Isso pode acontecer porque o autor do programa no testou todas as possibilidades de entradas ou no protegeu o programa da falta de arquivos ou bancos de dados. Em qualquer dos casos, sua res ponsabi lidade, como
desenvolvedor, tentar assegurar que nenhum desses erros faa o usurio perder informaes.
Voc deve se esforar para tornar seus programas to livres de erros quanto possvel. As ferramentas de depurao do Visual Basic .NET o ajudaro nessa tarefa. Certifique-se de us-Ias para
percorrer seu cdigo e de que o fluxo se encontre da forma que foi planejado. Assegure que as
variveis armazenem os valores corretos e que os clcu los sejam exatos.
De manei ra semelhante, voc pode proteger o programa de erros adicionando o tratamento de
excees estruturadas s sees crticas de cdigo. Pontos propensos falhas - como onde o cdigo abre arquivos, l ou grava informaes, ou faz clculos - devem ser inseridos em blocos
Try ... Catch ... End Try . Esses blocos tratam os erros de modo sofisticado, permitindo perfeitamente que o us urio cont inue a usar o programa.
Na prx ima lio, voc trabalhar com objetos. Como poder ver, j estamos fazendo isso; no
entanto, estudaremos o ass unto com mai s detalhes no Dia 7, "Trabalhando com Objetos".
P&R
P O que acontecer se cu tiver algum cdigo antigo que use n Error Preciso reescrev-lo para empregar o tratamento de excees estruturadas?
R No. Se incluir a referncia Mi crosoft . Vi sua 1Basic, poder continuar a usar On Error
Goto e On Errar Resume Next. Alm disso, o objeto Err est disponvel para voc.
174
Dia 6
Workshop
o Workshop foi planejado para aj ud-Io a antecipar possveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. D o nome de trs ferramentas que podem ser usadas para visualizar o contedo de uma
varivel enquanto voc estiver no modo Break.
Exerccios
I. Voc acabou de herdar o bloco de cdigo a segui r. Ele solici ta ao usurio dois valores.
Em seguida, calcula e exibe uma tabela com a mu ltipl icao de todos os va lores entre os
dois nmeros inseridos. Por exemp lo, se o usurio inserir 5 e 9, o resultado deve ser semelhan te a
RESULTADO
6
30
35
40
5
25
30
35
36
42
42
49
48
56
40
56
64
45
48
56
63
72
63
72
81
5
6
(de5a9)
45
54
Adicione o tratamento de excees e depure o cdigo da Listagem 6.10 para assegurar que ele
gere o resultado desejado.
Cdigo
LISTAGEM 6.10
1 Imports System
2 Imports Microsoft.VisualBasic.ControlChars
3
4 Module modTable
5
6
Sub Main()
7
8
9
10
11
Do
12
13
'solicite valores
Console . Write("Valor mnimo (mximo igual a 20 . O para
finalizar): ")
LISTAGEM 6.10
15
16
17
20
21
24
25
26
27
18
19
23
175
14
22
OutputTable{iLow, ;High)
End If
Loop Unt i 1 iLow " O
Console.Write{"Pressione ENTE R para continuar")
Console.ReadLine{)
End Sub
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
End Module
2. Conforme avanar no livro e ti ver problemas com seu cdigo, tente usar as ferram entas
de depurao para corrigir o programa. Empregue pontos de interrupo para isolar sees que voc achar que possam conter erros, percorra o cdigo e util ize as janelas Locais e Watch para monitorar as variveis.
Dia 6
176
3. Se voc encontrar excees em seus programas, ad icione o Iralamento de excees . Procure na ajuda on-t ine a palavra-chave ' Exception' para examinar os diversos tipos de ex-
SEMANA
DIA
Trabalhando com Objetos
Tanto o uso quanto a criao de objetos so essenciais para o desenvolvimento no Visual Basic
.NET. Embora vocj tenha trabalhado com eles no decorrer deste livro, esta lio ser dedicada
a esse tpico e abordar:
O que so objetos.
Corno runcionarn.
Comearemos com a definio bsica de objeto e todos os termos e conceitos que a acompanham.
Dia 7
o uso de objetos permit ir que seus programas sejam dedicados s entidades com as quais voc
estiver trabalhando, cuj o objetivo final ser prod uzir sistemas que sejam fce is de compreender
e aprimorar. Em vezde um programa em que todas as informaes e cdigos relacionados a apenas Lima entidade estejam espalhados por todo o aplicativo, uma abordagem com base no objeto
consolidar essas informaes trazendo-as para a definio do objeto.
Classes e Instncias
Para compreender os objetos voc ter de passar rapidamente para o conceito de classe. As c lasses, como nas classificaes, descrevem um grupo ou tipo de entidade, e todos os objetos so
membros de alguma c lasse. Elas so a descrio de um objeto, fornecendo deta lhes que definem
seu componamento e relatando que tipos de informao esto disponveis sobre ele. Poderamos, por exemplo, ter uma classe Car (carro) . Ela nos relataria que as informaes a seguir estariam disponveis sobre um carro: s ua cor, veloc idade, peso, marca, modelo e ano. Todos esses
tens so atributos do objeto, parcelas descrit ivas de informao s quais nos referimos como
propriedades. Alm dessas propriedades, a classe tambm descreve o que o objeto pode fazer e
como. Esses com portamentos em geral so chamados de mtodos do objeto, e um objeto carro
poderia ter mtodos como "VirarEsquerda", "A vanar", " DarR" e assim por d iante. com o
uso dessa classe, que fornece in (ormaes sobre as propriedades e mtodos do objeto, junto a alguns outros detalhes, como um modelo, que os objetos so criados.
Retomando ao exemplo do carro, a classe seria a sua especificao, o projeto que descreve como
ele funcio na e se parece. Essa classe ento usada para criar muitos carros, cada um com uma
existnc ia prpria, mas todos eles baseados na mesma especificao. Todos possuem as mesmas
propriedades porque elas provm da especifi cao, como a cor, mas cada um pode ter um valor
diferente para essas propriedades (carro azul , carro verme lho, carro amarelo e assim por diante).
Todos os carros tambm compart il hariam os mesmos comportamentos ou aes (os mtodos da
classe), como "Avanar" e os que fossem construdos a partir da mesma especificao executariam
essa ao da mesma maneira.
Criar um carro com base na especificao equ ivalente a gerarmos um objeto com base em uma
classe. Portanto, enquanto o Ford Thunderbird seria uma classe, o T-Bi rd azul de Bob seria um
objeto. Cada um desses objetos , individualmente, uma instncia da c lasse e no h lim ite para
quantas podem ser criadas. Todas as instncias compartil ham o mode lo, ou descrio, fornecido
por sua classe. Isso signi fica que todas as instncias da classe Car tero as mesmas propriedades
e mtodos e se comportaro da mesma maneira. No entanto, cada instncia ter valores prprios
para suas propriedades; todos os carros tm uma propriedade em comum que a cor, mas cada
um deles possui uma cor diferente.
Referncias
Em programao, um conceito adicional introduzido, o da referncia a um objelo. Uma varivel de objeto, qualquer varivel dec larada como um objeto de algum tipo (Dim myCa r As Car),
179
no contm o objeto propriamente dito, mas apenas uma referncia a ele. diferente dos tipos
comuns de variveis, como os inteiros ou strings, nos quais elas armazenam diretamente o valor.
Isso significa que mais de urna varivel de objeto pode se referir, ou apontar, ao mesmo objeto.
Em geral, esse no o caso. O objeto criado e usado em uma varivel, mas importante compreender a diferena entre os objetos e outros tipos de variveis a esse respeito.
NOTA
ciente sobre a construo de classes para que voc compreenda as que j foram criadas. Esse conhecimento ser til para se aprofundar no .NET Framework no Dia 8, "Introduo ao .NET Framework", e ele fornecer uma viso
inicial para o desenvolvimento de seus prprios objetos no Dia 15, "Criando
Objetos no Visual Basic .NET".
Abra o Visual Studio .NET e crie um novo projeto (Empty Project) na pasta Visual Basic Projects (veja a Figura 7.1).
Esse projcto no contm arquivo de nenhum tipo, portanto precisamos adicionar um a ele; selecione Project, Add Class no menu. Isso adicionar uma classe vazia ao projeto (chame-a
clsCar.vb), um timo ponto de partida para esse exerccio. Agora, foi criado um shell de uma
classe nesse arquivo, fornecendo o cd igo a seguir:
Public Class clsCar
End Class
Neste ponto, uma classe foi criada, mas est comp letamente vazia. Agora, dentro desse she ll, podemos comear a descrever as propriedades e mtodos dos objetos de nossa classe CaroQualquer item
que inserimlOS nessa classe far parte de todas as instncias do objeto criadas a partir dele. Por enquanto, adicionaremos as propriedades Make, Model e Colar.
Dia 7
180
"
iiI~
_", . ~t
FIGURA 7 .1
,_,,,
"""'-=
1;;:1 _ _ " _
(;J_.,,_
[ii~
-'q" -G
J
.... .
-'"
_.
_
--_: "-'''''-,.
l1 .
a ....... c.......-
:J,g
=::.:: '-'"'' ' '
-0 _ _ ""'"
""
1"-'
I~
~-
""
,"
e na ,;
",-
...... In
...
" AOdto_
1- "
_ .... """"'''''''1... _
, ~,
.......,....'''''''_ .."
'
.........
Propriedades
As propriedades so atributos de um projeto que voc pode recuperar e configurar, e que podem
ser adicionados a lima classe de uma entre duas maneiras. O primeiro mtodo, e tambm o mais
sim ples, declarar uma varivel como Publ ic. Como discutimos no Dia 3, " Introduo Programao com o Visual Basic ,NET', Pub 1i c descreve o escopo da varivel. No caso de uma classe,
qualquer item que for declarado como Publ ic estar disponve l para todas as pessoas que usarem
essa classe. Em nossa classe, apenas incluir a linha Dim Year As Integer no criaria uma propriedade exposta porque Year s estaria disponvel internamente. Se Tossemos declarar Yearcomo Pu blic Vear As Integer, ento, de repente ela seria exposta em Iodas as instncias desse objelo.
Instrues de Propriedade
Como alternat iva, as propriedades podem ser declaradas com o uso de uma sintaxe Property especial:
Dim myVar as <Tipo de dado da propriedade>
Public Property <Nome da propriedade>() As <Tipo de dado da propriedade>
Get
Return myVar
End Get
Set(ByVal Value As <Tipo de dado da propriedade
myVar " value
End Set
End Property
As duas partes da definio da propriedade, Get e Set, representam a recuperao do valor dela e
a configurao desse valor. Em geral, o cdigo de Get s retorna o valor de uma varivel interna
(uma varive l no nvel da classe que representa a propriedade, normalmente com o prefixo mpara
indicar um valor membro), e o de Set insere um valor (que for necido por meio da palavra-chave especial Va 1ue) na mesma varivel interna. Para implementar a propriedade da cor em
clsCar, poderamos usar um cdigo como o da Listagem 7.1.
COOIGO
LISTAGEM 7.1
181
2
3
4
5
6
7
8
9
10
11
Agora, adicione o cd igo da propriedade aos de Make e Model , lembrando de tambm acrescentar
duas variveis internas complementares (essas duas propriedades devem usar strings como seu
tipo de dado). No aspecto geral, essa segunda maneira de declarar propriedades pode produzir
resultados semelhantes, mas muito mais fle xve l porque permite que voc defina qual o cdigo
necessrio para controlar apropriadamente a configurao e a recuperao de um valor da propriedade.
182
Dia 7
End 5et
6 End Property
e crie uma sub-rotina Sub Mai n{ ) em seu interior. Nesse ponto, seu mdulo deve ser semelhante
ao cd igo da Listagem 7.2.
COIGO
LISTAGEM 7.2
1 Module Main
2
Sub Main()
3
End Sub
4 End Module
Esse novo procedimento Mai n ( ) o ponto de partida de nossa sol uo. Seu cdigo ser executado quando processarmos esse aplicativo, e a que escreveremos as instrues que trabalharo
com nossa nova classe. Para comear a usla, primeiro lemos de criar uma varivel do lipo apro
priado:
Dim objCar As clsCar 'ou Chapter7.clsCar . examinaremos melhor esse ponto
posteriormente
Essa linha parece estar declarando lima varivel comum, como uma string ou um inte iro, mas ela
muito diferente. Aqui , temos uma varivel que poderia conter a referncia a um objeto do tipo
cl sCar, mas que na verdade no armazena nada. Quando declaramos urna varivel alfanumri
ca, urna string criada. Embora possa no ter nenhum dado, ela realmente existe. Nesse caso,
no temos nada em objCar. Portanto, a prxima etapa criar uma instncia de nossa classe, o que
podemos faze r com a palavrachave New:
objCa r
New clsCar()
Agora sim criamos uma instncia de cl sCar e atribumos varivel objCar uma referncia a esse
novo objeto. J podemos, por meio de objCar, acessar as propriedades desse objeto:
1 objCar.Color " "Red"
2 objCar.Make " "Ford"
3 objCa r.Model " "Esco rt"
Essas propriedades podem ser recuperadas com muita fac ilidade:
Dim sCarDesc As String
183
"& objCar.Model
J que os objetos funcionam por referncia, podemos criar variveis adicionais, todas apontando
para o mesmo local:
1
2
3
4
5
6
7
8
Compare isso com uma varive l que no seja de objeto, como uma string, em que o valor real
transferido entre os locais:
1 Oim sFirstValue As String
2 Oim sSecondValue As St ring
3
4
5
6
7
Normalmente, quando lidamos com variveis, logo que elas saem de escopo (veja o Dia 3 para
obter mais informaes sobre as variveis e o escopo), deixam de existir. J que mltiplas varivei s podem apontar para um nico objeto, as regras que controlam a eliminao dele so um
pouco diferentes. Quando todas as variveis que faze m referncia ao objeto no existirem mais,
ele se tornar inacess vel e acabar sendo elim inado pelos servios em segundo plano da plataforma .NET. Esse processo, que chamado de co/eta de lixo, permite que o programa crie e
libere livremente os objelos sabendo que o sistema o acompanha, limpando tudo que desnecessrio. Dessa maneira, a plalafolma .NET faz a limpeza para seu programa, fornecendo outro serv io
s ubjacente para que nenhum dos cd igos precise se encarregar desse t ipo de operao.
Dia 7
figurar a propriedade Color com qualquer valor alfanumrico, mesmo se ele nem fosse uma cor
(obj Car. Co 1ar = "John"). Para tornar nossa representao do objeto Car um pOllCO mais sofisticada, podemos adicionar um trecho de cdigo que verifique qualquer valor informado em uma
lista de cores e rejeite o que no tiver uma correspondncia. Isso envo lve reescrever a rotina da
propriedade Color como mostra a Listagem 7.3.
LISTAGEM
COIGO
7.3
4
5
6
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 End Class
Agora, uma tentativa de configurar a propriedade com uma cor invlida (invlida na lista interna
de nosso cdigo, que considera a cor popular 'lils' , por exemp lo, como inadequada) resu ltar
no lanamento de uma exceo. Para obter mais informaes sobre as excees e o tratamento
de erros com base nelas, veja o Dia 6, "O Que Fazer quando Programas Bons Apresentam Problemas e para Se Certi fi car de Que Isso No Acontea". Como descrito nessa lio, podemos tratar corretamente essa exceo reescrevendo nosso cd igo de teste (contido em Sub Mai n( )) para
que inclua uma estrutura Try . . . Catch. Esse cdigo alterado mostrado na Listagem 7.4.
COOIGO
LISTAGEM 7.4
185
1 Sob MainO
Dim objCar As cl sCar
2
Dim sColor As String
3
4
5
6
7
8
9
10
11
ob j Car.Color = "Green"
Catch objException As System .ArgumentOutOfRangeException
'Opa! Trate o erro!
Sys tem. Conso I e. Wri teL i ne ("Opa! ")
End Try
seolor = objCar.Color
12
13
14
15
16
objCar.Make = "Ford"
17
objCar .Model'" "Escort"
18
System.Console.WriteL i ne(objCar.Description)
19 End Sub
Alm da validao da propriedade, que por si s j poderosa, uma classe pode conter uma funo ou sub-rotina que no faa parte de nenhum cd igo de recuperao ou configurao da propriedade, geralmente chamada mtodo. Os mtodos so criados para fornecer uma
funcional idade relacionada a um objeto e em geral agem com base nas informaes da propriedade (porque esto disponveis). Para nossa classe cl sCar, um mtodo til pode ser gerar o tempo de existncia do carro comparando a data e a hora aluais com uma propri edade desse que
represente sua data de produo. Criar a propriedade da data de produo relativamente simples. Ser do mesmo modo como a propriedade anterior exceto que uma data, e adicionar esse
mtodo mesmo to fci l quanto criar LIma funo pblica na definio de nossa classe.
Prime iro, a nova propriedade:
1 Dim m- dtManufactured As Date
2
3 Public Property Manufactured() As Date
4
Get
5
Return m- dtManufactured
6
End Get
Set (ByVal Value As Date)
7
m- dtManufactured = value
8
End Set
9
10 End Property
186
NO TA
Dia 7
Se crissemos essa funo como privada, ela poderia ser util izada a partir dessa classe, mas no estaria disponvel para nenhum outro Cdigo. Como alternativa, tambm podemos declarar etementos de nossa classe {propriedades,
funes, sub-rotinasl como Friend. Essa declarao assegura que Cdigos
dentro da mesma montagem possam acessar essas partes da classe como se
fossem pbl icas, mas que elas estejam ocultas (privadas) para qualquer cdi go externo montagem da classe. (As montagens sero abordadas com deta-
~Implan t ando
LISTAGEM 7.5
O Mtodo GetAge
1
2
3
4
LISTAGEM 7.6
Em algumas situaes, o novo mtodo seria mais adequado como uma propriedade (que, ento,
renomearamos para Age, j que seria um atributo, e no uma ao) porque na verdade no executa nenhuma ao e s retorna um valor. Para nossa classe Car, um exemplo melhor de mtodo
poderia ser algo relacionado ao, como StartEngine, cuja implementao fornecida na listagem 7.7.
COOIGO
LISTAGEM 7.7
Com esse cdigo adicionado a clsCar, teramos disponvel um mtodo mais orientado ao.
Por meio de uma combinao de propriedades (algumas com cdigo e outras sem) e mtodos,
possve l criar obj etos complexos. Lem bre-se de que todos os objetos que compem o .NET Framework (como System.Console e outros) foram construdos de acordo com essas regras, e os
que voc criar tero as mesmas caractersticas deles. A nica di ferena existente entre os objetos
do .NET Framework e os seus que esses no precisam ser escri tos no Framework!
Tpicos Avanados
Embora as propriedades e mtodos pennitam que voc crie objetos complexos e poderosos, o
suporte ao objelo na plataforma .NET possu i muitos outros recursos alm desses bsicos. Os recursos avanados facilitaro a representao de conceitos e ent idades em nosso cd igo, produzi ndo um sistema mais simples em termos de utili zao, manuteno e expanso. Apesar de esse
s uporte ser amplo, forneceremos uma v iso geral das cinco reas principais: sobreposio, herana, construtores, espaos de nome e membros estticos da classe.
Sobreposio
Esta seo aborda os aspectos bsicos da sobreposio; deta lhes adic ionais sero discutidos no
Dia 15, quando criarmos nossos prprios o bjetos. A sobrepos io permite que uma nica funo
ou s ub-rotina com vrios parmetros d iferentes seja chamada. Isso possibilita que um s mtodo, por exemplo, aceite os parmetros em combinaes distintas ou usando tipos de dados diversos. Portanto, voltando ao nosso exemplo de c1 sCar, seria possvel projetar o mtodo GetAge de
modo que ele pudesse funcionar de uma entre vrias maneiras. A implementao existente no
usa parmetros e relorna a diferena em dias entre a data aluai e a dc produo, mas talvez tambm qui sssemos perm itir que o usurio de nosso objeto soli citasse a diferena entre a data da
produo e qualquer outra aleatria e ainda especificasse a unidade de tempo a ser usada. Para
fazer isso sem esse conceito de sobreposio, teramos de criar uma funo d iferente para cada
chamada possvel, como na Listagem 7. 8.
COOIGO
LISTAGEM
7.8
188
COOIGO
Dia 7
LISTAGEM 7.8
l.I11
12
Return l ngOays
13 End Function
14
25
26
Case "Days"
1ngUnits : tsDi fference. Days
27
28
29
30
31
Case "Years"
32
lngUnits : tsDifference.Oays \ 365
33
End Select
34
Return lngUnits
35 End Function
Todas essas funes na verdade so apenas variaes de GetAge, mas cada lista de parmetros diferente e seu cd igo correspondente precisa de seu prprio nome de funo. Com a sobreposio, eliminamos essa restrio e podemos criar todas essas funes usando o mesmo nome,
GetAge. Para usar esse recurso, tudo que precisamos fazer adicionar a palavra-chave Overloads
frente de cada (incluindo a original) declarao de funo (antes de Publ ic) e alterar todos os
nomes das funes para que usem apenas um :
Public Overloads Function GetAge() As Long
End Function
Public Overloads Function GetAge(ByVal dtPointlnTime As Date) As Long
End Function
Public Overloads Function GetAge(ByVal sUnit As String) As Long
End Function
No cd igo de nosso exemplo que usa essa funo, j podemos escolher qualquer uma das trs declaraes que ela pode uti lizar (veja a Figura 7.2).
NOTA
189
A sobreposio representa o conceito de que a mesmaao ou solicitao pode ser usada de vrias
maneiras e pennite que voc use esse recurso na modelagem de seu objeto sem ter de recorrer
criao de diversos mtodos diferentes (GetAge, GetAgeFromDate e outros). Essa tcnica lIsada
em todo o .NET Framework para permitir a chamada de funes com vrios conjuntos de parmetros diferentes. Considere, por exemplo, o mtodo Sys tem.Consol e. Wri teL i ne, que pode ser
chamado usando qualquer uma das 18 listas diferentes de parmetros. Como o Framework demonstra, essa uma maneira til de sim plificaros objelos e fornecer mais opes aos programas
que os usam.
7.2
Todas as I'erses
di~pollheis de 1111/0
FIGURA
.oa
fi.
"" "" ' 9I>,!!f .CO!%
$':!I , .... ~ .... ' ' , .<d'
$':!I )O... . ...... I _ ", ...,,I?,,' '''.CO''' ' , ...... L, .. ,.. , ,"' .p.... " llUI
.......
."
Herana
Para algumas pessoas, este um dos recursos mais estimulantes do Visual Basic .NET - um recurso considerado fundamenta l para a criao de sistemas com base em objelos e que raltava no
Visual Basic al esta verso. No vou questionar essa opinio, mas de alguma forma consegui
desenvolver sistemas por muitos anos, sem a herana, antes que a plataforma .NET chegasse.
Independentemente disso, a incluso da herana na linguagem do Visual Basic um recurso importante e vale uma pequena discusso.
Como j abordei nesta lio, os objetos so maneiras de voc representar conceitos ou entidades
no cdigo, e todos os recursos de objetos no Visual Basic foram projetados para ajud-lo a tornar
a representao o mais ti I possvel. Em muitas situaes, uma entidade ou conceito na verdade
Dia 7
190
1
o que chamaramos de um subobjeto de lima entidade ou conceito mai s bsico. Vrios exemplos disso so usados em livros de programao e infelizmente no apresentarei nada to revol u-
cionrio. Considere nossa classe de objetos criada para representar carros, como um Ford
Mustang, um Toyota Celi ca ou um Chevy Cavalier, A classe teria vrias propriedades, como 00 ors (quantidade de ponas que o carro possui), MaxSpeed , Color e Qutras.
A classe Car geral, na verdade, contm vrias subclasses de objetos, como Hatchbacks e Conver
ti bl e5. E claro que essas classes teriam todas as propriedades de sua classe-pai , Car, como Do-
or5, MaxSpeed e Colar, mas tambm poderiam ter propriedades exclusivamente suas. Um carro
de dois mdulos poderia ter propriedades que descrevessem o tamanho e o com portamento de
sua porta traseira. Esse relacionamento, entre Car e suas subclasses, Hatchback e Convertible,
seria considerado um relac ionamento pai-filho, e o mtodo para represent-lo em nossos sistemas chamado herana. Diz-se da classe Hatchback que ela herdeira de sua classe bs ica, Caro
Esse relacionamento sign ifica que, alm de qualquer mtodo e propriedade criados na classe-filha , ela tambm possu ir todas as propriedades e mtodos herdados do seu pai.
O exemplo anterior foi iniciado com nossa classe Car e segu iu da em diante. Usemos o mesmo
ponto de partida, Car, e sigamos em direo a um exemplo mais detalhado de herana. Para comear, poderamos ter uma classe bsica Vehi c1e para representar qualquer tipo de veiculo (barco, carro, cam inho, av io) e que possusse as propriedades MaxSpeed, NumberOfPasssengers,
Co 1or e Oescri ption . Essa classe seria facilmente representada em um cd igo do Vi sual Basic,
como mostra a Listagem 7.9 .
COOIGO
LISTAGEM 7 .9
2
3
4
6
7
10
11
12
13
14
15
16
17
18
19
20
End Get
Set(ByVal Value As Long)
End Set
End Property
Public Property Color() As String
Get
COOIGO
LISTAGEM 7 .9
19 1
21
End Get
22
Set(ByVal Value As String)
23
End Set
24
End Property
25
26
Public function Oescription{) As String
27
End Function
28 End Class
o cd igo que usado em vrios proced imentos dessa classe no re levante para nosso exemp lo,
portanto o deixaremos de fora por enquanto. Se passssemos para algum outro cdigo, tentando
usar nosso objeto (que poderia ser o da sub-rotina Sub Ma i n ( ) de nosso projeto, como em exemplos anteriores), perceberamos que possve l criar objetos do tipo Vehi cl e e trabalhar com suas
propriedades, como na Listagem 7.10.
COOIGO
LISTAGEM 7 .10
1 Module UseVehicle
2
Sub Main()
3
Oim objVehicle As Veh ic le
4
objVehicle = New Vehicle()
5
6
objVehicle.Color = "Red"
7
objVehicle.MaxSpeed = 100
8
End Sub
9 End Module
Agora, adicionando urna classe complementar a nosso projeto (veja a Listagem 7. 11), podemos
criar uma classe (Ca r) que herde caracterst icas de Vehi c I e, exatamente como a classe real de objelos Car uma subclasse ou filha da classe Vehi cl e. J que estamos gerando uma classe projetada para tratar apenas de carros, podemos ad icionar duas propriedades (NumberOfOoors e
NumberOfTi res) especficas dessa subclasse de Vehi ele.
CDIGO
LISTAGEM 7 .11
4
5
6
7
Dia 7
192
COOIGO
9
10
11
End Set
End Property
12
13
14
15
Get
16
End Get
17
18
19
End Set
20
End Property
21
22 End Class
A parte essencial desse cdigo a li nha Inheri t s Vehi cl e, que informa ao Vi sual Basic que a
classe fil ha de Vehicle e, portanto, deve herdar todas as propriedades e mtodos dessa classe.
Novamente, no h nenhum cd igo inserido na definio de qualquer dessas propriedades porque isso no relevante no momento. Depois que esse cdigo estiver posic ionado, sem nenhum
esforo adicional, poderemos ver o efeito da instruo Inherits.
Voltando a nosso procedimento Main{ ), podemos criar um objeto do tipo Car, e logo veremos
ele expor tanto suas propriedades quanto as da classe-pai (veja a Figura 7.3).
Quando uma classe herdada adiciona novos mtodos ou propriedades, diz-se que a classe bs ica
est-se estendendo. Alm da extenso, tambm possvel que uma classe-filha sobreponha alguma ou toda a funcionalidade da classe bsica. Isso acontece quando a classe-filha implementa
um mtodo ou propriedade que tambm definido na c lasse-pai ou bs ica. Nesse caso, o cdigo
da classe-fi lha ser executado em vez do cd igo do pai, permitindo que voc crie verses especializadas da propriedade ou mtodo bsico.
Para uma classe-filha sobrepor alguma parte da classe bsica, essa parcela deve ser marcada com
Overridab 1e na defin io da c lasse bsica. Por exemplo, na verso de Veh icl e listada anteriormente, nen huma de suas propriedades possua a palavra-chave Overridable e, portanto, as
classes-filhas no poderiam forn ecer suas prprias imp lementaes. Em uma de monstrao
de como a sobreposio configurada nas classes bsica e fi lha, o cd igo da Listagem 7. 12 marcar a funo Description{ ) como podendo ser sobreposta e, em seguida, a sobrepor na classe-filha CaroObserve que as pmtes no relevantes das duas classes foram removidas para dar
maior clareza.
FIGURA 7 .3
(do.
As classes expem
__
tJ ~iilGII
193
~_!OOk_'"
:t.~ ft
...,
.. .>J . q
Iodas as suas
propriedades e
mlodos pblico.~. alm
dos da classe em que
esliiv baseadas.
..........'v................. '
_.,L.,........
<O,,,,,,
u
o",
"')'"e.'.', .. V._"
o... ""Co< ... c..
"'J<o<
~. .
Cu!)
I.'
COIGO
LISTAGEM
7.12
5
Public Overridable Function Description() As String
6
Return "Essa minha descrio genrica de veiculo!"
7
End Function
8 End C1ass
9
10 Pub1ic C1ass Car
11
Inherits Vehic1e
12
13
14
15
Pub1ic Overrides Function Description{) As String
16
Return "Essa a descrio do meu carro"
17
End Funct i on
18
19 End Class
Quando sobrepuser um mtodo ou propriedade, como fize mos na Listagem 7.12, voc poder se
referir novamente ao membro origi nal da classe bsica usando o objeto interno MyBase. Por
exemplo, para se referir ao mtodo Descript ion{ ) ex istente na classe Vehi c1 e, poderamos chamarMyBase. Descri pti on ( ) de dentro do mtodo Descri pt i on ( ) de Caro Esse recurso permite o
Dia 7
194
1
que toda fi lha dessa classe deve fornecer sua prpria verso dessa propriedade ou mtodo, e a palavra-chave MustInheri
t significa que essa classe no pode ser usada sozinha (voc deve basear
,
outras classes nela). E importante observar que se lima classe tiver um mtodo marcado com
MustOverride, ento, ela prpria deve ser marcada com MustInherit.
A herana um tpico extenso e no o abordamos completamente, mas com as informaes for
necidas nesta Iio, voc estar pronto para comear a projetar alguns apl icativos que se benefi
ciem desse recurso dos objetos.
LISTAGEM
1 Sub MainO
2
Dim objVehicle As Vehicle
3
Dim objCar As Car
4
objCar " New CarO
5
6
7
objCar.NumberOfDoors " 4
objCar.NumberOfPassengers " 6
COOIGO
195
10
11
objVehicle.Color = "Red"
12
objVehicle. MaxSpeed = 100
13 End Sub
A instncia de Ca r representada por obj Ca r foi fac iImente inserida na varivel obj Veh i c 1e, e desse ponto em diante poderia ser tratada como um objeto Vehicle. Esse fato, de que um objeto-filho pode ser usado corno se fosse urna instncia da classe-pai, permite a criao de um
cd igo genrico que funcionar com urna classe ou qualquer uma de suas subclasses . Essa urna
das maneiras como a herana pode ser empregada para gerar solues melhores, mas h muitas
outras. Apresentei uma viso geral do assu nto herana, e ele merece uma discusso adicional
tanto do ponto de vista do projeto quanto da implementao. Por essa razo, esse tpico e outras
abordagens relacionadas a objetos sero examinados com mais detalhes no restante do livro.
Construtores
Quando voc deseja usar um objeto, tem de trabalhar com uma instncia ex istente ou criar a sua.
A instnc ia de um objeto gerada com a palavra-chave New, que emprega a classe especificada e
estabcl ece uma rea na memria para a instncia dessa classe. Os cOl1slrulores so uma maneira
de fornecer infonnaes para essa classe no momento em que gerada para permitir que ela
mesma se inicialize ou execute outras tarefas de configurao nessa hora. Se uma classe for um
construtor, e muitas classes do .NET Framework so, ento, em geral possvel fornecer parmetros no momento da criao, como parte da chamada a New. O cdigo a seguir mostra esse trabalho na criao de um novo objeto de exceo (veja o Dia 6 para obter mais infonnaes sobre
as excecs e outros tpicos de tratamento de erros), fornecendo uma mensagem de erro como
parmetro para seu construtor. Essa mensagem de erro ser lIsada de modo automtico pelo
novo objeto para preencher uma das propriedades.
Dim exError As System . Exception
Dim sMessage As String
sMessage = "Essa ser a mensagem de erro ."
exError = New System.Exception(sMessage)
A criao de um construtor para nossa classe Vehi cl e relativamente fcil. Primeiro, voc precisa gerar um mtodo chamado New que seja pblico e no tenha parmetros.
Public Sub New()
End Sub
Aps conclu ir a criao desse construtor (isso ainda no produz nenhum resultado), voc ver
pouca diferena em seu cd igo, e at que adicionemos alguma fun cionalidade a essa sub-rot ina
New( ), nada diferente acontecer. O construtor, mesmo sem parmetros, pode ser usado como
Di a 7
um local para inicializar variveis internas, como a data de produo de nossa classe Vehicle
(veja a Listagem 7. 14).
CDIGO
1
2
System.Oate.Now()
End Sub
Exatamente como com qualquer outro mtodo de um objeto, possvel sobrepor esse e fornecer
mais de uma maneira de cham-lo. Ao contrrio dos outros mtodos, no entanto, sobrepor o
construtor no requer o uso da pa lavra-chave Overloads. Voc pode apenas criar m ltip las verses do procedimento New, e cada uma ser tratada como uma verso disponvel do construtor. Em
nosso caso, poderamos rapidamente gerar alguns construtores teis (mostrados na Li stagem 7.15)
cons iderando as diferentes mane iras nas quais algum pode querer inicializar nosso objeto.
CDIGO
1
2
LISTAGEM 7.15 Sobrepondo o Construtor de uma Classe para Fornecer Maneiras de Inicializar Objetos
System.Oate.Now()
End Sub
6
7
8
10
End Sub
11
12
13
14
15
16
17
No caso de uma classe-filha, aquela que herda caractersticas de outra classe, voc pode querer
chamar o construtor da classe bsica de seu procedimento New. Isso pode ser feito fac il mente
com o uso do objeto especial MyBase, empregando um cdigo como MyBase.New( l.
197
Espaos de Nome
o espao de nome um conceito abstrato usado para agrupar vrios mdulos ou classes, permi
tindo que voc categorize logicamente todos esses objetos dent ro de um nico objeto de nvel superior. Portanto, tendo Namespace Chapter7 no in cio de nossas classes e End Namespace no fin al,
criamos de modo efet ivo um agrupamento chamado Chapter7, que contm todas as nossas
classes dentro dele. Depois que esse espao de nome exist ir, ser usado corno padro para referncias a objel0s feitas em um cdigo dentro do mesmo espao de nome, mas tambm poder ser
declarado exp licitamente (Dim objCar as Chapter7 . Car).
H muitas razes pelas quais voc pode querer criar e usar espaos de nome, e no so poucas
delas a base do 'espao de nome' identilicador, como uma maneira de gerar uma rea privada
para assegurar que os nomes de sua classe sejam exclus ivos. Pe la defin io de um espao de
nome, nossa classe Car se torna Chapter7 . Ca r, e, portanto, no entrar mais em conn ito com nenhuma outra classe criada com o nome Caro
Outra razo mais sutil para usar os espaos de nome porque produzem um cdigo em que a manuteno mais fc il. O agrupamen to de classes sob espaos de nome de nvel superior resulta
em um cdigo que definido claramente por algum esquema de categorizao sendo, portanto,
mais legvel e sua manuteno mais sim ples.
Em nossos exemplos no decorrer deste livro, poderamos ter criado espaos de nome com base
no ttulo da lio (por exem plo, o cdigo integral desta lio seria inserido sob o espao de nome
Dia7), podendo todos eles, em seguida, ser posicionados sob um espao de nom e mais abrangente com relao ao livro chamado AprendaV8. Nossas classes poderiam ser criadas apenas corno
Di a7, mas para assegurar que no houvesse ambigidades, tam bm poderamos nos referir a elas
com seu nome totalmente qual ifi cado (Aprenda V8 . Di a7 . Car, por exemplo).
Esse mtodo de agrupar classes semelhante ao conceito de escopo que foi discutido no Dia 3;
lima classe s tem de ser exclusiva dentro de seu espao de nome especi fi co. Se por acaso voc
criar uma classe que com partilhe seu nome com outra que exista em um espao de nome diferente, ento, precisar se certi fi car de especi ficar o nome completo da classe sempre que fi zer referncia a ela de fo ra de seu espao de nome.
Os espaos de nome so hierrq uicos, o que penn ite que voc crie um esquema com vrios nveis
para agrupar suas classes e objetos, exatamente como dentro do prprio .NET Framework. H duas
maneiras de criar um espao de nome de nvel inferior. Defina-o usando o nome totalmente qualificado (veja a Listagem 7. 16) ou aninhe as definies dos espaos de nome (veja a Listagem 7.17).
CDIGO
LISTAGEM 7 .16
1 Imports System
2 Namespace MyApp.Console
3
Modu le Main
4
Sub Main()
Dia 7
198
COOIGO
5
6
7
End Sub
End Module
9
10
11
12
13
14
15
16
Console.WriteLine(Environment.MachineName)
Console.Writeline(Environment.SystemDirectory)
Console.Writeline(Environment.GetLogicalDrives{
Console.Writeline(Environment.Version.ToStri ng(
17
End Sub
18
End Class
19 End Namespace
COOIGO
rarquias de Objetos
1 Imports System
2 Namespace MyApp
3
Namespace Console
4
Module Main
5
6
7
Sub MainO
8
9
10
11
Publlc Class Utilities
12
'Run the application
13
Public Sub PrintOutO
14
Conso 1e. Wri tel i ne (Env i ronment. Mach i neName)
15
Conso 1e. Wri tel i ne (Env i ronment. Sys temOi rectory)
16
Console.Writeline{Environment.GetlogicalOrives{
17
Consol e.Wri tel i ne{Envi ronment. Version. ToStri n9 O)
18
End Sub
19
End Class
20
End Namespace
21 End Namespace
Em seus aplicativos, voc pode usar os espaos de nome como lima maneira de agrupar cdigos
conceituai mente relac ionados, mas alm de seu efeito no escopo das classes, eles no so realmente necessrios na construo de um sistema.
LISTAGEM 7.18 Funes Internas do Visua l Basic 6.0 Foram Substitu das pelos Mtodos Compartilhados no Visual Basic .NET
1 Imports System
2 Module Main
3
Sub Main()
4
Dim dtToday As Date
5
dtToday = DateTi me .Today()
End Sub
6
7 End Module
Esses membros compart ilhados podem ser criados em seu prprio cd igo quando voc quiser
que um mtodo ou propriedade em particu lar esteja se mpre acessvel, sem a sobrecarga de gerar
um objeto. Em geral, no entanto, ev ite usar esse recurso a menos que seja realmente necessrio
porque ter muitos membros comparti lhados quase o mesmo que apenas criar um mdulo cheio
de proced imentos e reduz o sign ificado de seus objetos. Lembre-se de que Modul es um tipo especial de Class, todos os membros de um mdu lo so considerados compartilhados (Shared) por
padro.
Resumo
o .NET Frame\Vork Lima biblioteca de classes que voc pode usar em seus aplicativos, Iodas
elas construdas a partir dos principios bsicos da programao orientada a objetos, comuns s
linguagens. NET. Esses princpios (o conceito de classes, instncias, propriedades, mtodos, herana e assim por diante) tambm sero a base da criao das classes de sua autoria dentro do Vi-
Dia 7
suai Basic .NET. Para desenvolver qualquer aplicativo que v alm do exemplo mais si mples,
ser necessrio empregar o .NET Framework e, com freqnc ia, tambm ser preciso gerar suas
prprias classes, tornando a utilizao de objetos uma habilidade essencial para todos os programadores da platafonna .NET. Nesta lio abordamos, por meio da criao de nossas classes como
exemplo, conceitos bsicos orientados a objetos e mostramos como implement-los em um cdigo
de sua autoria. Na prxima lio, Dia 8, introduziremos as classes disponveis no .NET Framework e ilustraremos como empreg-Ias para desenvo lver poderosos aplicat ivos .NET.
P&R
P Nunca trabalh ei com uma linguagem orientada a objetos antes; posso fi car a penas
nos procedimentos e mdulos?
R Voc no precisa criar objetos no Visual Basic .NET, mas achar difcil usar essa linguagem sem empregar pelo menos alguns de les, como o .NET Framework. Por essa razo, o
enfoque inicial para um desenvolvedor que no conhea objetos se familiarizar com
sua ut ilizao antes de passar para sua criao.
P Li que, no Visual Basic .NET, no possvel dizer exata mente quando um objeto
ser eliminado e que esse um fat or limitante por v rias razes. O qu e significam
esses comentrios, e eles si"io verdadei ros?
R Quando se trabalha com objetos, s ua eliminao nem sempre ocorre em um ponto definido do cdigo, portanto, ser d ifcil fazer com que um certo trecho desse seja executado
sempre que um objeto for destru do. Em algumas linguagens, incluindo as verses anteriores do Visual Basic, havia um mecanismo disponvel para adicionar um cdigo ao
procedimento de um ' evento de el iminao' . O cdigo inserido em um procedimento
desse tipo teria sua execuo garantida sempre que o objeto fosse elim inado. No Vis ual
Basic .NET, o subsistema de coleta de lixo e liminar os objetos quando necessrio, mas
no passiveI criar um cdigo que seja processado na hora da destruio. Em geral, essa
' limitao' no causa mu itos problemas, mas s vezes (principalmente quando se transfere um cdigo antigo do Vis ua l Basic) h a expectativa da execuo de um cdigo no fi nai do ciclo de vida do objeto, e isso no fac ilmente transferido para uma
implementao do Visual Basic .NET.
Workshop
o Workshop foi planejado para aj ud-lo a antecipar possveis dvidas, revisar o quej aprendeu
e comear a pensar em corno colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, " Respostas dos Testes/Exerccios".
201
Teste
I. Se uma classe tiver um mtodo marcado com MustOverride, o que mais acontecer?
2. Qual a palavra-chave que voc pode usar em um construtor para chamar o de uma classe
bsica?
3. O que est errado nos construtores sobrepostos desse cd igo (veja a Listagem 7. 19)?
LISTAGEM
CDIGO
6
7
8
System . DateTime.Now()
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 End Class
Exerccios
Por meio da herana, das classes, das propriedades e dos mtodos, crie um exemp lo de hierarquia de classes comeando em Animal e descendo alguns nveis com algumas classes ilustrativas.
202
SEMANA
Dia 7
Reviso
Agora que voc terminou sua trajetria pela primeira semana de lies, j deve ter uma boa com-
preenso da programao, do Visual Basic .NET e de como tudo se encaixa. (Dias 1 e 2). Tambm
criou alguns exemplos de programas na plataforma .NET, lIsandotantoo IDE quanloa linha de comando para compil-los. Com essa experincia, j pode testar todos os exemplos deste livro e at
.
cnar os seus.
A lio sobre os tipos de dados e as tcnicas bsicas de programao usadas na criao de aplicativos do Visual Basic .NET ( Dia 3) forneceu- lhe uma boa introduo programao simples. O
Dia 4 apresen tou as instrues condiciona is (inclus ive as instrues If) e laos, dois itens que
sero empregados em quase todos os programas que vier a escrever. Pelo fato de o Visual Bas ic
.NET permitir a gerao de tantos tipos diferentes de programas, por meio de uma grande variedade de projetas e diversos arquivos-fonte, o Dia 4 abordou as opes de arquitetura para desenvolver todas as espcies dist intas de sistemas que a plataforma.N ET pode ser usada para criar.
Independentemente da sua habilidade em programao, erros sempre ocorrem em programas.
No importando se eles poderiam ser ev itados, as tcnicas de tratamento de erros abordadas no
Dia 6 permitem que voc lide com o problema de mane ira sofisticada. Para concluir, j que grande parte do .NET Framework baseada em objetos, o enfoque da lio do Dia 7 foi sobre os termos e conce itos necessrios para possi bilitar o uso de objetos em se us prprios programas.
Todas essas informaes, bem com o a prtica da codificao que as acompanhou, devem t- lo
preparado para encarar o primeiro projeto como bon ifi cao (The Game of Li fe - O Jogo da
Vida). Esse projeto, que voc pode encontrar acessando a pgina Web deste li vro no site
www .makron.om.br (veja a Introduo para maiores detalhes), alm de conduzi-lo na criao de
um programa real completo, il ustra o uso de instrues condicionais, arrays, laos, variveis e at
tcnicas de tratamento de erros mostradas no decorrer das lies que acabamos de concluir. Leia o
material, desenvo lva o projeto e faa testes com os resultados durante algum tempo. Quando estiver pronto para seguir em frente, tente modificar o cdigo para alterar como o programa funciona,
criando a sua prpria variao dele.
SEMANA
Viso Geral
Durante esta semana, voc se aprofundar realmente no estimulante mundo do
.NET Framework. Ela comea com uma lio no prprio Framework (Dia 8),
incluindo detalhes sobre o uso das classes Consol e.Math . Random e Envi ronment,
e informaes sobre toda a exce lente funciona lidade das listas e arrays forneci-
Semana 2
Para conc luir, no Dia 14, voc aprender alguns dos mais avanados recursos orientados a
objetos do Visual Basic .NET, incluindo a herana e a sobreposio. Essa lio realmente tomar mais claro o poder dessa verso do Visual Basic e mostrar como possvel usar esses recursos para projetar sistemas que sejam mais fceis de estender e tenham uma manuteno mais
simples.
No final da Semana 2, voc ter aprendido tantos recursos do Visual basie .NET que estar pronto para criar aplicativos complexos. O projeto de bonificao nmero 2 (Parte I do Projeto de
Bnus 2) fornecer a prtica por meio de algumas dessas tcnicas novas.
Semana 2
DIA
Introduo ao .NET Framework
o .NET Framework no especificamente um novo recurso do Visual Basic .NET porque ele
compartilhado com mu itas li nguagens (mais de 20 no momento em que esse texto foi escrito). O
Framework fornece um poderoso conjunto de componentes para voc usar em seus programas.
Ele contm uma quantidade imensa de classes que executam vrias funes, da manipulao de
strings ou nmeros criptografia e o acesso rede. Assimilar o .NET Framework um processo
contnuo, mas conhecer os termos-chave e a maneira como o Framework organizado so co-
nhecimentos valiosos que o aj udaro no desenvolvimento de mais aplicati vos com o Visual Basic .NET.
Hoje, voc aprender:
O que o .NET Framework.
Algumas classes importantes do .NET Framework.
Com o encontrar o que precisa no .NET Framework.
Dia 8
Alm d isso, o .NET Framework possui o COlllmOI1 Langl/age Rl/l1lime (CLR), que responsvel
por executar seu cdigo. O CLR oferece vrias inovaes importantes que afetam os desenvolvedares de aplicativos .NET no Visual Basic .NET ou em outras linguagens que tenham suporte.
A principal alterao que agora todas essas linguagens so compiladas para a Microsoft Itermediate Language (MS1L). Em seguida, ela convertida pel o CLR em cdigo nativo quando
executada pela primeira vez. O resultado final que voc se beneficiar do desempenho de um
cdigo totalmente compi lado, e no de um que seja interpretado no tempo de execuo.
Ainda h mais, todas as linguagens que tm suporte do CLR usam o mesmo tipo de dados. Isso
significa que muito mais fci l para duas (ou mais) linguagens interoperarem. Anteriormente,
se voc precisasse passar infonnaes de uma linguagem (como a C++) para outra (d igamos o
Visual Basic), poderia ter de executar algumas converses para interpretar de modo apropriado a
varivel. Agora,j que as duas linguagens empregaro o mesmo tipo de dados, isso simples. O
CLR pennite que os desenvolvedores ut il izem a linguagem com a qual se sentem mais confortveis, podendo ainda se comunicarem com outras.
Embora o CLR seja importante, ele em geral funciona em segundo plano. A parte essencial e visve l do .NET Framework que voc deve examinar so algumas das classes que o compem.
Console
Vocj viu algumas das classes Conso 1e quando desenvolveu aplicativos anteriormente. Os mtodos Wri teL i ne e ReadL i ne dessa classe tm sido usados com freqUncia para exibir resu ltados
e ler cdigos de vrios dos aplicativos do console, ou de linha de comandos, criados no livro at
agora. Essa a utilizao mais importante da classe Conso 1e. No entanto, h alguns recursos menos empregados dela que vale a pena examinar. Alguns dos mtodos essenciais desta classe so
mostrados na Tabela 8. 1.
TABELA 8 .1
Metodo
Descrio
Read
ReadLine
SetError
Setln
SetOut
Write
Wr; teL; ne
COl/calel/aeia mais uma palavra sofist icada que quer dizer 'combinao de
strings' . Em vez de somar as strings com o smbolo +, como fazemos com os nmeros, usado o smbolo &, como em
Console.WriteLine{"Insira" & ITEM_COUNT & _
"itens. Pressione ENTE R entre os itens.")
Se voc tiver uma st ring complicada, pode ser difcil lidar com todas as aspas e E comerc iais. Em
vez de constru ir uma string complexa usando a concatenao, possvel utilizar esses espaos
reservados nos locais certos e incluir posteriormente as varivei s que sero empregadas em seu
preenchimento, como descrito a seguir:
Console.WriteLine("Insira {O} itens . Pressione ENTER entre os itens . ",
ITEM_COUNT)
o item {O} um espao reservado para a varivel que voc inclui u no final da string. Ela a varivel ITEM COUNT das instrues anteriores. Epossvel inserir vrios espaos reservados (ou at
Dia 8
mesmo usar o mesmo diversas vezes) na string. Assim, as variveis que forem includas depois
da string sero inseridas nela em ordem, comeando com o item "0<'" (primeiro item) e dando
continuidade, percorrendo as variveis e espaos reservados em seqncia ({O}, {I}, {2} e assim por diante). A Listagem 8.1 demonst ra esse recurso.
CDIGO
LISTAGEM 8.1
1 Imports System
ANLISE
o cdigo da Listagem 8.1 bem simples e pretende demonstrar apenas algumas das
maneiras como voc tem usado a classe Conso 1e nessas sete lies.
,
A linha I im porta o espao de nome System. E nesse local que a classe Conso 1e definida, assim
como muitas outras classes importantes. Portanto, voc deve sempre importar esse espao de
nome na maioria dos aplicativos. O ID E do Visual Basic .NET far isso automaticamente para
aplicativos que forem criados quando ele estiver em uso.
Dentro da nica classe definida em seu arquivo, voc declara apenas lima constante, ITEM COUNT
(linha 3), e uma sub-rotina Ma i n (linha 4). A constante usada para substitu ir a insero do nmero 10 em todo o cdigo, prevendo o caso de se querer alterar o valor posteriormente. muito
mais fcil alterar s o valor da constante, em vez de ter de procurar todas as ocorrncias desse vaIar no aplicativo inteiro. O uso de uma constante tambm mostra que o desenvolvedor sabe que
os valores esto re lacionados. Se tivssemos repetido o nmero 10 em todos os locais e examinssemos esse cdigo seis meses depois, poderamos no lembrar se todos indicariam o mesmo
valor ou se seria somente uma coinc idncia.
o procedimento Shared Sub Main , como voc j viu muitas vezes, o primeiro mtodo executado em um aplicativo. Dentro do procedimento, voc declara um array de strings (li nha6) e o preenche com o mtodo Console . ReadLine.
A li nha 7 digna de nota. Dentro do item exibido com Console. Wri teL i ne (ou Canso 1e. Wri te),
voc pode inseri r vrios caracteres, como o item la} no meio da string da linha 7. Posteriormente, cada uma dessas li nhas ser preenchida com variveis. Essas so includas depo is da string na
chamada de Consol e.Wri teL i ne, como fi zemos com a constante ITEM _COUNT.
&
&
Embora isso possa pa recer mais ' natura l', voc pode esquecer de incluir um
caractere de concatenao ("&") quando adicionar as strings. Seu programa falharia na compilao ou na execuo.
Cada linha da entrada lida (linha IO) e exibida em um dos elementos do array. Observe que esses elementos so numerados de O a 9 (li nha 9).
Para concluir, os elementos so exibidos na tela em ordem inversa. Isso fe ito com o uso da
clusula Step da instruo For .. Next (linha 14). Eles so exibidos um por vez na sada atual,
como vemos na linha 15. A Listagem 8.2 demonstra esse tipo de sada.
COOIGOt
LISTAGEM 8.2
RESULTADO
1
2
3
4
5
6
7
8
[c: \ code]Consolel.exe
In sira 10 itens. Pressione ENTER entre os iten s.
Porco-da-terra
Rato gigante da ndia
Casuar
Dugo
qui dna
Tentilho
1210
CDIGO!
Dia8
LISTAGEM 8.2
RESULTADO
9 Girafa
10 Hipoptamo
11 Iguana
12 Chacal
13
14
15
16
18 Tentilho
19 quidna
20 Dugo
21 Casuar
Redirecionamento
Redirecionamenlo significa apenas'env iar algo para um local diferente' . Quando lidamos com a
classe Console, isso quer dizer que voc pode alterar o local onde far a leitura ou ex ibio. Por
exemplo, ela poderia ser usada para exibir o resultado de um apl icativo que recebesse entradas
de linhas de comandos ou de um arq uivo. De maneira semelhante, voc poderia empregar CO Ilsole.WriteLine quando depurasse o apl icativo em testes e, em seguida, o redirec ionasse a um
arquivo a fim de criar uma ferramenta simples de registro para ele.
Voc pode redirecionar a entrada, o resultado ou as informaes de erro de seu programa. Essas
informaes podem ser red irecionadas para qualquer destino onde houver TextReader (para entradas) ou TextWri ter (para sadas e erros). Observe que no possivel criar nenhuma dessas
duas classes diretamente, j que so abstratas. Em vez disso, preciso gerar uma das classes que
implementar ou herdar caracteristicas de TextReader ou TextWriter (veja o Dia 7, "Trabalhando com Objetos" e o Dia 14, "Introd uo Programao Orientada a Objetos", para obter
mais detalhes sobre a abstrao e a herana). Algumas das imp lementaes dessas duas classes
permitem ler e gravar em arquivos, locais na rede e ass im por diante. A Li stagem 8.3 mostra
como se pode alterar o exemplo mostrado na Li stagem 8.2 para que envie o resultado para um arquivo em vez de para a janela das linhas de comando. Observe que os comandos de Consol e.WriteLine no foram alterados; somente o destino foi.
COOIGO
LISTAGEM 8.3
1 Imports System
2 Imports System . IO
COOIGO
LISTAGEM 8.3
10
11
12
13
14
15
16
17
18
19
Console.WriteLine()
Console .SetOut(oFi le)
Console .WriteLine("ltens em ordem inversa:")
For I = ITEM_COUNT - 1 To O Step -1
Console .WriteLine(sItems(I}}
Next
20
oFile.Close()
21
22
23
Console.SetOut(oOut)
Console .WriteLine("Conc l udo")
Console.Read Line()
24 End Sub
25 End Class
Executando o aplicativo:
1 [c: \code]Console2.exe
2 Insira 10 itens. Pressione ENTER entre os itens.
3 Porco-da-terra
4 Rato gigante da ndia
5 Casuar
6 Dugo
7 quidna
8 Tentil ho
9 Girafa
10 Hipoptamo
11 Iguana
12 Chacal
211
Dia 8
13
14 Concludo
A nica alterao entre as Listagem 8.1 e 8.2 foi o acrscimo das linhas 2, 8, 9, 15,
20,2 1e22 . Essas so as linhas que criam o arquivo, e provocam e encerram o redirecionamento da sada. A linha 2 importa o espao de nome $ystem. 10. Ele ser necessrio j que
contm a definio para as classes TextWriter e Fi le que voc usar depois. A linha 8 gera o arqu ivo Output. txt empregando o mtodo CreateText da classe Fi 1e. Observe que na verdade no
preciso criar uma instncia da classe Fi 1e, j que Omtodo CreateText comparti lhado. Se j
houver um arquivo com esse nome, ele ser excl udo. Se em vez disso quisermos continuar a preencher um arquivo existente, devemos utilizar AppendText no lugar de CreateText. A linha 9
usada para sa lvar o destino original da sada, portanto ele poder ser con fi gurado mais uma vez na
linha 21. A linha 15 provoca o redirecionamento para seu arquivo. Todas as sadas que empreguem CansaI e.Wri te e CansaI e. WriteLi ne aps esse redirecionamento sero enviadas para seu
arquivo em vez de para ajane la das linhas de comandos. A ltima linha importante a 20. Se no
consegu irmos fechar o arquivo, o contedo no poder ser gravado e terminaremos com um arquivo sem bytes (vazio).
ANALISE
o cdigo da Listagem 8.3 deve produzir um arquivo Output . txt com o contedo a segu ir:
RESULTADO
2 Chacal
3 Iguana
4 Hipoptamo
5 Girafa
6 Tent il ho
7 quidna
8 Ougo
9 Casuar
10 Rato gigante da ndia
II Porco -da -terra
Introd uo ao .N ET Framewo rk
TABELA 8.2
213
Membro
Propriedades
CorrmandLine
vo.
Currentoi rectory
O$Version
Retorna informaes sobre o sistema operacional atual, por exemplo, se o Wi ndows 9x, o NT ou o 2000.
SystemOi rectory
Version
Exit
GetCorrmandL i neArgs
GetEnvironmentVariable
Retorna o valor de uma varivel de ambiente solicitada. Traz informaes armazenadas no ambiente com o comando Set. como o
ca minho de pesquisa (path), o diretrio para arquivos temporrios
(templ ou outras configu raes.
GetLogicalOrives
Retorna a lista de unidades disponveis. Esse retorno feito na forma de um arrav de strings. O pri meiro (item DI elemento geralmenteA:\.
A classe Envi ronment t il quando voc precisa de informaes sobre o sistema que est ao redor da execuo de seu programa, como quando tem de saber onde gravar seus arquivos temporrios ou em que sistema operacional est sendo executado.
Random
Random uma classe simples, destinada a criar nmeros aleatrios, em geral um inteiro (I nteger)
ou um duplo (Double). Os mtodos importantes dessa classe esto listados na Tabela 8.3.
TABELA 8.3
Mtodo
Descrio
Next
Next(MaxValue)
Dia8
1 214
T ABELA
8.3
Mtodo
Descrio
Next(MinValue,
MaxValue)
Retorna um inteiro entre os valores min i mo e mximo. Essa a variao mais usada quando se precisa de , como valor mnimo.
NextOouble
Por exemplo, se voc quisesse gerar um inteiro aleatrio entre 1e I00 (inclusive), escreveria
Math
A classe Math contm muitas das constantes e funes matemticas importantes. A maioria delas
so mtodos compartilhados e, portanto, podem ser usados sem a criao de uma instncia da
classe Math. Os mtodos mais relevantes so descritos na Tabela 8.4. Se voc examinar a classe
Math na ajuda (Help), ver que h muitos outros mtodos disponveis.
TABELA
8.4
Mtodo
Descrio
Abs
Retorna o va lor absoluto de um nmero (se for negativo, ele retornar o valor
positivo do nmero).
Cs
Max
Min
PI
Round
NOTA
A classe Math em geral til para calcular valores. Mesmo se voc no lembrar (ou nunca tiver
aprendido) o que urna tangente hiperblica, na classe Math que a encontrar.
ArrayList
ArrayL i st Oconjunto que mais se parece com um Array. A principal diferena que foi projetado para permitir um crescimento fc il conforme forem sendo adicionados mais elementos.
Como as outras classes do espao de nome System .Co 11 ecti ons, ArrayL i st foi criado para armazenar um conjunto de variveis Object. Portanto, pode ser usado para conter qualquer tipo de
dado. O uso da classe ArrayL i st ser adequado se voc tiver um conjunto muito dinmico que
possa aumentar ou diminui r com o passar do tempo e se no precisar dos recursos dos outros
conjuntos.
Voc pode criar uma nova instncia da classe ArrayL i st usando um dos construtores disponveis.
Uma verso permite a definio da capacidade inicial do conjunto, e outra configura o tamanho
inicial como 16:
Oim arrList As New ArrayList
, cria um novo ArrayList,com 16 membros inicialmente
Oim arrList2 As New ArrayLi st(20)
, cria um novo ArrayList,com 20 membros inicialmente
Oim arrList3 As ArrayList
Set arrList3 = New ArrayList(52)
, cria um novo ArrayList,com 52 membros inicialmente
As outras propriedades e mtodos importantes da classe ArrayList so usados para ad icionar,
recuperar ou excluir membros do cOI~ unto. A Tabela 8.5 resume alguns dos principais membros.
1216
TABELA 8.5
Dia8
Membro
Descrio
Propriedades
O tamanho aluai da classe ArrayL i st. Configurado pela primeira vez
quando ela criada (16 por padro), podendo aumentar conforme
Capaci ty
Count
Item
Add
Adiciona um novo item ArrayLi st . Se isso fi zer com que Count ultrapasse (apacity, essa propriedade ser aumentada (com sua
quantidade inicial - 16 por padro).
Clear
IndexOf
Retorna a posio de um certo objeto na classe ArrayL ist oEsse mtodo til quando usado depois de uma ordenao.
Insert
Remove
RemoveAt
50rt
ToArray
TrimTo5ize
manhodaaumentar,
classe
st mais adequado na substit uio de arrays quando sabemos que o tamas no tivermos noo de at onde o conjunto avanar. Seu crescimento
USO
ArrayL i
Queue e Stack
Os conjuntos Queue e Stack so semelhantes. So dois tipos ' clssicos' de conjuntos, sendo teis
em muitos esforos de programao. As duas classes so conjuntos que permitiro que voc adicione com faci lidade novos itens. Em geral removem o item quando visualizado porque foram
projetadas para armazenar o conjunto temporariamente. Elas diferem no modo como os itens so
adicionados em cada conjunto e, principalmente, em como so removidos dos conjuntos.
A classe Queue um conjunto 'primeiro a entrar, prime iro a sair' (FIFa, first- in, first-out). Isso
significa que os itens so remov idos da fila na mesma ordem que foram adicionados. Essacaracterstica semelhante da maioria das fi las (ou formaes em seqUncia) que voc possa ter visto. Em geral, em um ponto de nibus, na fila do almoo ou na passagem pela alfndega, as
pessoas que chegam primeiro so atendidas antes. As filas so freqUentemente usadas em pro-
Introd uo ao .N ET Framewo rk
gramao quando esse comportamento desejado. Por exemplo, quando dois programas (ou objetos) esto se comunicando, as mensagens so colocadas em lima fila para o objeto receptor. Em
seguida, ele poder process-las na ordem que foram recebidas. A Tabela 8.6 descreve alguns
dos mtodos e propriedades importantes da classe Queue.
TABelA 8 .6
Membro
Propriedades
Count
Clear
Dequeue
Enqueue
Peek
NOTA
Mtodos
Remove todos os itens da fi la.Nota
Extrai e retorna um objeto para a fila.
Insere um novo objeto na fila.
Permite que voc examine o prximo item sem removlo da fila. Isso
til porque remov-lo poderia imped ir outro mtodo de lidar com a fila
adequadamente.
Por que os mtodos so chamados de Dequeue e Enqueue? Por que no Add e Remove? simplesmente uma questo de manter os nomes tradicionais. Os programadores sempre se referiram ao ato de adicionar um item a uma fi la como enfileirar
o item, portanto, esse termo, assim como desenfileirar, foram adotados.
A classe Stack um conjunto 'primeiro a entrar, ltimo a sair' (F ILO, fi rst-in, last-out). Isso significa que os itens so removidos da pilha na ordem inversa qual foram adicionados. A ordem
FILO anloga a lima pilha de pratos: o prato adicionado por ltimo sempre removido primeiro. As pilhas so a soluo clssica para li dar com problemas que requerem a inverso de uma
ordem de operaes. Mu itos clculos so processados internamente com a ajuda das pilhas. A
Tabela 8.7 descreve alguns dos mtodos e propriedades da classe Stack.
TABelA 8 .7
Membro
Propriedades
Count
Mtodos
Clear
Pop
1218
TABELA 8.7
Dia8
Membro
Descrio
Pus h
Peek
Permite que voc examine o prximo item da pilha sem remov -lo. Queue e
Stack so conjuntos interessantes, em parte por uma perspecti va histrica,
mas tambm porque resolvem probl emas especificos de programao. Quando for necess ri o um conjunto com o comportamento desses dois objetos,
recomendvel lembrar deles.
SortedLi st
A classe SortedL i st possui caracterst icas tanto de ArrayL i st quanto de NameVal ueColl eeti on,
assim como alguns recursos teis adicionais especficos. Semelhante ArrayL is t, a classe SortedLi st pode alimentar, e apresenta as mesmas propriedades Count e Capaci ty daquele conjunto. Como em NameValueCollection, cada item identificado por um nome. Alm disso, os
valores de SortedL i st so ordenados com base no nome fornecido a cada item. Assim, ela ser
til sempre que voc precisar de uma Iista de itens organizados que possa 'crescer", como os participantes de lima con ferncia ou os resu ltados de uma bateri a de provas de uma turma escolar. A
Tabela 8.8 descreve alguns dos metodos e propriedades sign ificativos da classe SortedList.
TABELA 8.8
Membro
Descrio
Propriedades
Capaci ty
Count
Add
Clear
Remove todos os itens de SortedLi st . Count confi gurada como 0, mas Capaci ty no alterada.
IndexOfKey
Item
Propriedade
Keys
Propriedade
Remove
Mtodo
(continuao)
Membro
Tipo
Descrio
Remo~eAt
TrimToSize
Mtodo
Mtodo
Values
Propriedade
Em geral quando voc trabalhar com listas, precisar mant-I as em ordem porq ue ter de exibi-I as para o usurio em uma seqnc ia organizada. Nessas situaes, a classe SortedL i st pode
ser til.
As Regras da Busca
Na maioria das bibliotecas, os livros se encontram organizados. Elas podem usar o sistema decimal de Dewey, algum outro mtodo de catalogao ou apenas a ordem alfabtica (por ttul o ou
sobrenome do autor). Se uma bibl ioteca no fosse organizada, im agine tentar encontrar um li vro
nela. Voc teria de vagar de modo aleatrio at acidentalmente se deparar com o li vro desejado.
Muitas pessoas tentam encontrar classes no .NET Framework de maneira semelhante.
O .NET Framework organizado de maneira hierrquica. A denomi nao para cada espao de
nome composta de urna srie de trechos, separados por um ponto. Espaos de nome inferiores
(os que possuem mais trechos) no esto contidos dentro dos superiores, mas relacionados a
eles. Por exemplo, o espao de nome System.Data .$qlCl ient est relacionado a $ystem.Data,
mas no est contido ne le porque se encontra em um nive l hierrqu ico inferior a Sys tem. Data.
No .NET Framework, h dois nomes de nvel mais elevado, System e Microsoft. Os espaos de
nome $ystem so aq ueles que fazem parte do .NET Framework e esto disponveis para os usurios do Visual Basic .NET, assim como para os de outras li nguagens que em preguem o Framework. As classes Mi crosoft so em geral especficas para o Visual Studio e dest inadas a um ou
Dia 8
mais ambientes. Por exemplo, existe um espao de nome Mi crosoft. Vi sua 1Bas i c que contm
muitos dos recursos que eram encontrados no Visual Basic antes dessa verso.
Introd uo ao .N ET Framewo rk
TABELA 8.9
221
Mtodo
Descrio
FromARGB
Cria uma cor nova com base nos valores de vermelho, verde e azu l (cada
um entre Oe 255). Tambm h outras verses dessa funo. Uma variao
usa um va lor Alpha alm dos de vermelho, verde e azul, enquanto outra
empregada para adicionar o valor Alpha a uma cor existente. Esse valor re
presenta a transparncia da cor. Como os outros valores, Alpha varia de Oa
255, sendo esse ltimo valor o correspondente a completamente opaco. A
ltima variao de FromARGB utiliza um valor intei ro e retorna a cor.
Retorna o inteiro que representa uma composio da cor que usa Alpha,
vermelho, verde e azul.
ToARGB
Alm da capacidade de criar e converter cores, a estrutura Calor contm vrias cores identificadas.
Elas constituem uma ampla variedade de cores diferentes, muitas com nomes representativos e
evocativos, como PapayaWhi p, Ga i nsboro e Bur 1yWood. Esses so atalhos teis se voc quiser colorir algo, mas no estiver certo do valor numrico exato que deseja. Mais vantajoso ainda do que os
nomes que voc no tem de criar uma instncia nova da estrutura Co 1or antes de usar essas cores.
Portanto, poder empreg-las em um programa utilizando um cd igo semelhante a
frmMain.BackColor : Color.SeaShell
Um problema na definio de suas prprias cores, com os valores RGB (vermelho, verde e azul)
ou selecionando uma cor identificada, que sua percepo delas pode ser diferente da de seus
usuri os. Tenho encontrado pessoas que configuram seus microcomputadores com as cores
mais extravagantes, e outras que nunca alteram os padres. De maneira semelhante, estive com
programadores que tinham criado apl icativos estranhos, mu lticoloridos, e outros que embutiram
todas as cores em cdigos de sombreados cinzas. Se voc embut ir as cores em cdigos, seu programa dever se impor nos microcomputadores dos usurios, podendo se tornar irritante. Para
evitar isso, programadores educados configuram a cor dos elementos da tela usando as do sistema
(aquelas definidas no painel de contro le). As cores do sistema esto disponveis na classe Sys temColors, que possui vrias propriedades representando os diferentes elementos que aparecem no
Windows (como o WindowsText, o Controlou o Menu). Colorir as partes de seu aplicativo usando
essas cores sign ifica que elas assum iro qualquer cor que o usurio selecionar para esse item .
Usar a classe Sys temCo 1or semelhante a empregar a estrutura Co 1or. No necessrio criar
urna nova instncia da classe antes de utilizar os valores. Portanto, voc poderia colorir o plano
de fun do de um formu lrio com a cor j definida Desktop por meio do cdigo a seguir:
frmMain . BackColor : SystemColors . Desktop
As cores esto em lodosos locais no Windows, portanto, saber a maneira de cri-las importante.
Dia 8
far no Dia 13, "Usando o Server Explorer". Ou pode querer registrar ou armazenar o nome do
computador para acessar o banco de dados. Essa busca de uma soluo fo i iniciada por mim por
uma necessidade desse tipo. Infelizmente, tambm foi a mais demorada. Sorte sua que encontrei
muitas mane iras que podem ser usadas para determinar o nome de seu computador. Dependendo
de que espaos de nome j tenha importado ou do tipo de ap licativo que est iver executando, pelo
menos uma delas (e provavelmente todas) devem estar dispon veis para voc.
Voc j exami nou a primeira das trs maneiras fceis de obter o nome de um computador em que
um programa est sendo executado: System.Environment. No Windows 2000 e superiores, o
nome do computador armazenado como urna varivel de amb iente chamada CQMPUTERNAME. Se
esse for o caso, o nome do computador local poder ser recuperado com
Console.Writeline("Using Environment: {Q}" ,_
Sys tem . Envi ronment . GetEnvi ronmentVa ri ab 1e (" COMPUTERNAME"))
No entanto, depender de uma varivel de ambiente, mesmo que configurada pelo sistema operacional, me parece confiar um pouco demais. Assim, fui mais fundo.
A rede em geral precisa do nome do computador, portanto System. NET [ui minha prxima parada. Depois de algumas tentativas sem xito, encontrei GetHostName na classe DNS. Isso basicamente faz sentido - o DNS (Domain Naming Service) um servio usado para registrar nomes
de computadores na Internet (ou em redes locais). Voc pode usar a classe DNS para recuperar o
nome de um computador inc luindo o espao de nome System.Net em seu projeto e acessando-o
com um cdigo semelhante a
Console . WriteLine("Using Net.DNS : {O}" , DNS .GetHostName)
Essa sol uo pode no func ionar, no entanto, se voc uti liz-la em um computador que no tenha
o TCP/IP instalado (o que, com a popu laridade da Internet, poderia signi ficar cerca de dois computadores). E assim, sua pesquisa continuaria.
Bem no mago de System.Wi ndows. Forms se encontra urna classe que um tesouro: Sys temI nfonnati on. muito estranho que SystemInfonnation possua informaes sobre o programa alUai e o sistema operacional no qual ele est sendo executado. Se voc examinar essa classe, ver
que ela tem propriedades que representam todas as defi nies essenciais para os aplicativos,
principalmente aqueles com base em formulrios Windows: FrameBorderSize, CaptionHeight,
MenuHei ght e MousePresent. O mais importante para a sua pesquisa que a classe SytemI nforma t i on possui uma propriedade ComputerName, que pode ser usada para recuperar o nome do computador se o espao de nome System .Windows.Forms fo r inclu do em seu ap licat ivo, corno
descrevo a segu ir:
Console . WriteLine("Using SystemInformation : lO} ".
SystemInformation . ComputerName)
No deixe o fato de essa classe estar ocu lta dentro do espao de nome System. Windows . Forms desanim-Ia. Ela pode ser usada em qualquer tipo de aplicativo se o espao de nome for carregado.
Para que ter trs maneiras de obter o nome do computador em que um programa est sendo executado em vez de apenas uma? Bem, apesar de no ser uma das pessoas que decide esse tipo de
coisa, sugeriria algumas razes:
Grupos diferentes trabalhando em sees distintas criaram manei ras diferentes de resolver o mesmo problema.
Cada soluo s apropriada em certas situaes (como, por exemplo, se a varivel de
ambiente for configurada, se voc executar urna rede TCP/IP, se usar fonnulrios Windows e assim por diante).
Na pesquisa atravs do .NET Framework, em geral encontramos ml tiplas solues. Use a que
atender melhor suas necessidades, at encontrar uma ainda mais adequada.
Resumo
Em geral dificil compreender onde o .NET Framework termina e o Visual Basic .NET comea.
A maioria dos recursos do Visual Basic .NET na verdade vem do Framework, inc luindo os que
anteriormente faziam pane da APl do Windows
ou que no estavam disponveis para os progra,
madores do Visual Basic antes dessa verso. E incompleto descrever o .NET Framework como
algo importante para os desenvolvedores do Visual Basic .NET. No Dia 17, "Usando o .NET
Framework", voc passar mais tempo com o conjunto de classes do .NET Framework. Alm
disso, passivei obter mais informaes sobre o .NET Framework na seo do MSDN (Microsoft Developer Network) sobre a plataforma .NET no endereo http://microsoft.com/net.
No Dia 9, "Desenvolvendo uma Interface com o Usurio com os Formulrios Windows", examinaremos outra famlia de classes do .NET Framework, as que permitem a construo de interfaces com o usurio do Windows. Essas classes sero usadas com freqU ncia quando voc criar
solues que empreguem as sofisticadas interfaces com o usurio dos aplicat ivos-padro.
Dia 8
P&R
P Devo usar o .N ET Framework ou uma fun o a ntiga sobre a qual li qu e o Visual Basic d suporte?
R Se voc, no passado, programou no Visual Basic, ou ainda, se leu livros do tipo 'Como
Fazer Isso' ou mesmo artigos de revista que abordavam verses anteriores dessa linguagem, ter visto vrias das maneiras ' antigas' de executar tarefas. Muitas
dessas funes
,
ainda existem, dentro do espao de nome Microsoft. Vi sua 1Basi c. E possve l importar
esse espao de nome para fazer liSO de algumas das funes ou constantes mais antigas,
como as funes matemticas ou a constante vbCrLf (uma constante que significa' Adicione uma nova linha aqui'). No entanto, se possve l, seria melhor empregar os recursos
mais recentes do .NET Framework.
P Por que voc no a bordou o espao de nome "Fill-in- My -Favorite"? Preciso muito
saber com o us-lo em meu prog ram a.
R Com 6 mil classes disponveis dentro do .NET Framework, uma lio como esta mal
consegue abordar mesmo uma pequena poro delas com os detalhes que precisamos.
Voc se aprofundar mais no .NET Framework no Dia 17. Alm disso, tambm iremos
us-lo em outros captulos que compem este livro.
Workshop
o Workshop fo i planejado para ajud-lo a antecipar possveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Como voc poderia fazer uso da classe Console se escrever um aplicativo com base no
Windows ou na Web?
2. Por que seria melhor escolher o conjunto SortedL; st em vez de ArrayL; st se esse possui
um mtodo de ordenao?
3. Qual seria o resultado da execuo do cdigo a segu ir?
Dim oRand As New System.Random
Dim iValue As Integer ~ oRand.Next(l. 6)
Console .WriteLi ne(iValue)
oRand.Next(l. 6)
Exerccios
I. Escreva um pequeno programa do console que aceite vrias palavras na linha de comandos e as exiba na tela em ordem alfabtica.
SEMANA
DIA
Desenvolvendo uma Interface com
o Usurio com os Formulrios
Windows
No Dia 5, organ izando programas, voc aprendeu diferentes maneiras pelas quais os aplicativos
.NET poderiam ser projetados. Uma deciso essenc ial era que tipo de interface com o usurio
criar. A escolha em geral tennina com um ap licativo no estilo Windows ou da Web. Na plataforma .NET, o modo existente para gerar um aplicativo Windows por meio da tecno logia Windows Parms (formu lrios Windows). Na lio de hoje examinaremos:
liSO
de caixas de dilogo.
Alm desses tpicos, sero abordados vrios contro les especiais visveis e ocultos usados nos
formulrios Windows.
226
Dia 9
os sistemas operacionais Windows (veja a Fig ura 9. 1). Empregando esse conjunto de classes e
funes, voc poder adicionar esse est ilo de interface com o usurio, incluindo janelas e caixas
de dilogo, em seus aplicativos.
9.1
A maioria dos
FIGURA
aplicalil'os Windows
eDlI/pani/lla o mesmo
eSlilo de intelface
porque o sistema
operacionalmanipl/la o
desenho das janelas e
EJ
~ Ooor
(t.)
P'lIEl
Antes que voc se aprofunde na criao e configurao de um aplicat ivo Windows, faremos uma
recapitu lao dos principais termos relacionados aos formulrios Windows. O primeiro e mais
difcil de definir 'janela' . Umajallela, na perspectiva dos com putadores, urna rea da te la
lIsada por um aplicativo para exi bir informaes. Um nico aplicat ivo pode ter mais de umajanela, mas cada janela peltence a apenas um aplicativo. Elas podem ser movidas e redimensionadas (incluindo a max imi zao e minimizao), mas essas opes podem ser desativadas pelo
aplicativo que possui ajanela, pennitindo que ela tenha um tamanho ou urna posio fix a. Os subelementas da jane la, corno os botes, caixas de texto, listas ou fi guras (veja a Figura 9.2) compem a interface de um aplicat ivo e so chamados de controles.
Esses controles produzem a interface do aplicativo porq ue podem ser manipulados (cl icados, digitados, ou o que mai s for apropriado) para fornecer entradas ao programa. Eles tambm exibem
informaes para o usurio. As janelas podem estar em um entre doi s estados - moda l ou
no-modal. Asjanelas do tipo modal devem ser manipuladas e fechadas antes que o usurio possa trabalhar com qualquer outro aspecto desse aplicativo - por exemplo, uma janela que pergunte se voc deseja salvar as alteraes de um documento. As janelas do tipo no-modal permitem
que o usurio interaja de urna manei ra menos estruturada, movendo-se entre todas elas em um
ap licativo quando quiser, se assemelhando mais ajanela de um documento do Microsoft Word
ou a Toolbox do Visual Studio .NET. Ajanela modal tambm conhec ida como caixa de dilogo e na plataforma .NET possui recursos especficos que a torna fci l de usar para obter algum
227
tipo de informao de um usurio. As caixas de dilogo sero abordadas com mais detalhes ainda nesta lio .
FIGURA 9.2
Todos os elemelltos de
ullla janela seio
chamados de
eOll/roles.
Configurando o Projeto
A primeira etapa no desenvo lvimento do projeto do Vi sual Basic .NET que usa os formu lrios
Windows criar um projeto novo, selecionando o tipo de projeto ap licativo Windows (Windows
application). Um projeto novo ser gerado contendo um nico objeto fo rmul rio, que estar
pronto para voc COmear a trabalhar. O novo formul rio ser chamado de Fonnl por padro,
mas no pretendemos usar esse nome porque ele no possui um sign ificado em seu ap licativo.
J que voc est desenvolvendo um programa que trabalhar com arqu ivos, renome ie o form ulrio como fnnFi 1er, o que deve ser feito em duas etapas :
I. Renomeie o arq uivo dando um clique com o boto dire ito do mouse em Fonnl . vb najanela do Solution Explorer, seleci onando Rename e, em seguida, digitando o novo valor
frmFiler.vb.
2. D um clique com o boto di reito do mouse no novo formu lrio em branco da janela de
projeto q ue o est iver ex ibindo e selecione Properties. Isso deve exibir a janela Propert ies
Toolbox, por me io da qual voc poder encontrar e alterar a propriedade Name (que pode
ser visual izada na seo Design das propriedades) de Fonnl para fnnF i 1e r. melhor fa-
228
Dia 9
zer isso antes que qualquer cod ificao seja iniciada, evitando situaes em que j tenha
escrito um cdigo que se refi ra a Form1.
Neste ponto, observe que o ttulo do formu lrio ainda ser Form l, e no frrnFi ler como voc esperava. Isso acontece porque ele no est associado ao nome do formu lrio, mas o IDE usa esse
ttulo como padro na criao. Acesse a janela de propriedades do formulrio novamente e encontre a propriedade Text, que representa o ttulo do formulr io. Alterc-o para o que desejar Fi 1er ficaria bom -, e o ver ser exib ido conforme o pretend ido.
FIGURA 9 .3
A seo Willdows
Forms de Toolho.>:
fornece lima grande
I'a/"iedade de cOIl/foles
para sellsformlllrios.
A l.beI
A"''''''
~ &.,t!M
[Obi ro.!So>:
~M!1rIoIenJ
" """'"
R..wr......,
r.
GlOW6ox
QI Plct..e8ox
O,'''
1P O.toGrld
I!".1IlktSo>:
!~ Ched:edJstBox
l!l1 ComboIIo
" lktl'low
"li.:: r,o.'hlw
I
Nessa seo de Toolbox, voc encontrar vrios controles, mas por enquanto s precisaremos dos
botes e caixas de texto. Adicione um controle ao formu lrio dando um clique duplo nele (o que
adiciona o controle ao canto superior esquerdo do formulrio) , dando um clique e arrastando-o
para o form ulrio, ou selec ionando O contro le (d um clique e solte) e, em seguida, dando um clique e arrastando o mouse no fonnulrio para demarcar o local desejado. Qualquer desses mtodos
produzir o mesmo resultado: o controle ser inserido no formul rio. Empregando um dos mtodos que acabaram de ser descritos, adicione trs botes, dois ttulos e duas caixas de texto ao formu lrio. Organize os controles conforme o layout mostrado na Figura 9.4, empregando a
propriedade Text dos botes e ttu los para tornar a interface do formulrio igual da figura.
Desenvo lve ndo uma Interface com o Usurio com os Formulri os Windows
229
.,.............................., f""'.........
"!:l EI
FIGURA
9.4
de orgal1i=al" a
iII/e/face no aplicatil'o
__ _
. _ .. _ _
de exemplo.
..
txtSource e txtOes t i na t i on para as duas caixas de texto, ordenadas de cima para baixo.
btnCopy, btnMove e btnDel ete para os botes. No Visual Basic 6.0 e em verses anteriores,
os botes eram chamados de boies de comando (em vez de apenas ' boto' como no Visual
Basic .NET), portanto, muitas pessoas usavam o prefixo cmd quando os nomeavam.
lblSource e lblOestination para os ttulos.
Renomear um controle igua l a faz-l o com um formulrio: selecione o controle, acesse suas
propriedades e, em seguida, altere a propriedade (Name). Renomeie todos os controles antes de
passar para a prxima parte do exemplo.
Manipulao de Eventos
Para programar uma interface com o usurio, voc precisa entender o conceito de eventos e programao dirigida a eventos. Sempre que o usurio executa uma ao, como dar um clique em
um boto ou digitar um valor na caixa de texto, ela chamada de evenfQ. Se quisermos ter um cdigo que seja processado quando um evento ocorrer, precisaremos criar um manipulador de
eventos para aquele no qual estejamos interessados.
Dia 9
Por meio do IDE do Visual Studio .NET, ser fcil criar um manipulador de eventos para um de
seus controles. Um evento comum para o qual pretendemos ter um cd igo , por exemplo, o clique em um boto de seu formulrio. Essa ao chamada evento Cl ick de um boto, e pode-se
adic ionar ou editar o cdigo associado a esse evento dando um cl ique dup lo no boto. Voc ser
enviado para a janela de edio de cd igos e a uma nova sub-rotina chamada <nome do boto> Click (veja a Listagem 9.1). O nome da rotina no muito impOltante, mas o formato-padro que o IDE uti liza. D um clique duplo no bOio Copy para passar para o cdigo apropriado. Observe que se no tivesse renomeado o boto, seu novo evento Cl ick teria um nome
parecido com Buttonl_Cl i ck, em vez de btnCopy_Cl i ck.
LISTAGEM 9.1
4 End Sub
Agora, qualquer cdigo que voc inserir nessa rotina ser executado quando o usurio der um
clique no boto. Neste exemplo, adicionaremos um cdigo a todos os botes (btnCopy, btnMove e
btnDelete), mas teremos de comear com um, portanto, d um clique duplo em btnCopy e acesse
o cdigo associado aele. Nesse manipu lador de eventos, queremos adic ionar um cdigo que copie
o arquivo especi ficado em IX tSource para o existente em txtDest i na t i on. Para tanto, teremos de
trabalhar com o espao de nome System. 10. Esse espao de nomej foi referenciado em seu projeto porque faz parte de System.DLL, mas podemos tornar seu cdigo muito mais simples de ler e digitar se adicionarmos uma instruo Imports System.lO no incio do cdigo de seu formu lrio.
Depois que a instruo for inserida, voc poder referenciar os objetos desse espao de nome
sem ter de incluir a referncia completa. Para obter uma cpia do arquivo, podemos usar o mtodo esttico Copy da classe System. lO . Fi 1e, mas antes precisamos dos nomes dos arquivos de origem e de destino. Para acessar o contedo de uma caixa de texto, use sua propriedade Text,
referindo-se ao objeto especfico atravs de seu nome.
LISTAGEM 9.2
231
ANLISE
LISTAGEM 9.3
Dia 9
boto Copy. Os dois manipuladores de eventos sero chamados, fazendo a cpia do arquivo e
exibindo a caixa de dilogo com a mensagem.
LISTAGEM
9.4
9.5
233
9.6
A seguir encontramos uma lista com vrios dos controles embutidos mais freqlientemente usados, e uma descrio breve:
labe l /li nk label Estes doi s controles proporcionam uma maneira de inse rir textos estticos (no editve is) em um formulrio. O controle lin k lahel adiciona alguns recursos
complementares, que podem fazer com que uma parte ou todo o seu texto se parea com
um link HTML e possua um evento extra (li nkCl i cked) para ind icar quando um usurio
deu um cli que no trecho do hiperlink contido no nome.
Sutton
O boto-pad ro, com bem mais recursos do que possua em verses anteriores do Visual Basic. Com as propriedades do boto, voc pode adicionar uma fi gura, alterar o layout do texto e da fi gura, configurar o ttulo e muito mai s.
Text Sox
Fornece uma rea para insero de texto em fo rmulrios e d suporte a uma
ed io bsica . Pode ter vrias linhas se a propriedade Mu I ti I i ne for configurada com True
e disponibiliza um menu de atal ho-padro (com um clique no boto direito do mouse) que
d ao usurio o recurso de recortar/copiar/colar.
234
Dia9
e Context Menu
Embora no estejam juntos na Toolbox, esses dois controles
s<1o usados na cria<1o de sistemas com menus para sua janela. O Dia 16, "Formulrios Windows Avanados" detalhar como constmir menus para seus sistemas usando esses dois
cOlltf()les.
Mai n Menu
H muitos outros, mas todos funcionam em essncia da mesma maneira. Voc os insere em seu
formulrio, mani pula suas propriedades por meio de cdigo ou da janela Properties e escreve um
cd igo para manipular seus eventos. Embora no tenha a inteno de abordar cada control e individualrnente, detalharei o uso de dois deles a ttulo de demonstrao.
235
desses controles na caixa e posicione-os em um layou! apropriado. No preciso fazer nada mais
com eles para que ajam como um grupo; isso determinado pelo fa to de que foram inseridos na
mesma caixa de grupo.
Se voc executasse seu projeto neste momento, seu novo formulrio no apareceria porque, ao
ser criado, o projeto con fi g urado para exibir o pri meiro fo rmulrio. Para alterar isso a fim de
que seu novo fonn ll lrio seja executado em vez do primei ro, d um cli que com o boto d ireito do
mouse no projeto, que se encontra na j anela Sollltion Exp lorer (do mesmo modo como quando
adicionou um arquivo anteriormente), e selecione Properties no menu de atalho. Isso abri r um
caixa de dilogo grande contendo vrias opes e configuraes (veja a Figura 9.5). O valor que
precisamos al terar est na pri meira pgi na (Common Properties, General) e se chama Startup
Object. A confi gurao de Startup Object determina qual dos fo rm ulrios, ou outros cd igos,
ser executado quando o projeto for processado. No momento, e le deve ter o valor fnnFi ler (o
nome do primeiro formulrio deste projeto). Altere-o para RadioButtons ou para o nome que
deu ao formulrio que ad icionou por ltimo.
FIGURA
9.5
Usando a caixa de
dilogo das
propriedades do
projelo. I"Oc pode
COII/rolar I'rias
COI!figll/"(U.,eS.
incluindo O Slorlup
Objecl.
-....
......"'"
:. eom...""""_,,.
Agora, se voc executar o projeto, seu novo form ul rio (com seus quatro botes de opo) ser
exibido (veja a Figura 9.6).
9.6
VIII g/"llpo de bales
de oplio lili/a
FIGURA
II/aneiro excelellle de
permilir que O IIsurio
escolha /fil/a op(io
entre Irias.
~.'e'
Dia 9
Depo is que estiverem ativos e funcionando, tente dar um clique nos botes de opo e observe
que apenas um pode ser selecionado. possvel empregar a propriedade Checked para saber se
um boto de opo foi se lecionado usando um cdigo. Para tentar acessar esses controles por
meio de cdigo, voc pode adicionar um scri pt de teste a seu novo forrnulrio. Feche~o (utilizan~
do o boto X do canto superior direito) e vo lte ao seu modo estrutura. Adicione um boto qua l~
quer da Toolbox, altere seu nome para btnT est, o ttulo para "T es t" e, em seguida, d um clique
duplo nele para passar visual izao do cdigo de seu evento~padro (C1 i ck). O cd igo da Li sta~
gem 9.7 demonstra como poderamos verificar que conjunto de botes de opo foi se lec ionado
e exibi r o valor apropriado usando MessageBox. Insira esse cdigo no evento C1 i ck de btnT es t e
execute seu projeto para test~ l o .
LISTAGEM 9.7
Usando Botes de Opo quando apenas uma Opo Puder Ser Se l ecionada
5
6
7
8
9
10
11
12
13
If RadioButtonl.Checked Then
sSelected" "RadioButtonl"
Elself RadioButton2 . Checked Then
sSe1ected " "RadioButton2"
E1seIf RadioButton3.Checked Then
sSe1ected = "RadioButton3"
ElseI f RadioButton4.Checked Then
sSe lected " "RadioButton4"
End If
14
15
Mes sageBox .Show(sSelected , "Se1ected Radio Button")
16 End Sub
17 End Class
237
gum fosse encontrado, sem exibir nenhuma mensagem de erro. Voc pode adicionar uma caixa
de seleo a esse formulrio que d suporte ativao e desativao desse recurso de subst itu io automtica.
Para comear, acesse o primeiro forrnu lrio (Fi ler) no modo estrutura e, em seguida, adicione
um novo controle Check Box da caixa de ferramentas (Toolbox). Mude o ttul o para 'Overwrite
Exist ing' alterando a propriedade Text na janela Properties. Neste ponto, voc tambm pode
configurar o padro ou o valor inicial da caixa de seleo definindo a propriedade Checked na janela Properties. Movao novo controle para a posio abaixo do campo para o destino e, ento, d
um cli que duplo no boto Copy para passar edio do cdigo. Ser preciso fazer uma pequena
alterao tanto em btnCopy_Cl i ck quanto em btnMove_Cl i ck antes que a caixa de seleo possa
ter algum efeito real. No momento, a chamada ao comando Copy e a chamada ao comando Move
usam apenas dois parmetros (origem e destino), mas Copy d suporte a uma opo adicional
(substituir) q ue determina se ele deve exclu ir um arquivo exi stente caso seja encontrado. Con figurando essa nova propriedade da mesma maneira que a propriedade Checked da caixa de seleo, poderemos controlar como um arquivo existente ser manipulado. A Listagem 9.8 mostra a
alterao em btn Cl i ck, que manipula a nova cai xa de seleo.
LISTAGEM
9.8
1
2
3
9.9
btnMove Cl ick
Dia 9
LISTAGEM 9 .9
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Validao de Entradas
Como o nome 'fonnulrio' sugere, as janelas e caixas de dilogo so em geral usadas para per~
mitir a entrada de dados em seu aplicativo. Com freqncia, quando as informaes forem inse~
ridas no sistema, recomendvel que elas passem por alguma forma de validao (verificao
de datas vli das, quantidade correta de dgitos nos nmeros telefnicos e ass im por diante). O
.NET Framework fornec e um modelo para codificao dessa validao.
Dado um formulri o com vrios campos de entrada (caixas de seleo, por exemplo), provvel
que tambm haja um boto ou dois. Pelo menos um desses botes ind icar que o usurio j con~
siderou concluda a digitao de dados. Portanto, quando ele der um clique em OK , voc deseja~
r que o cdigo de val idao seja executado, verificando se est tudo correto nos campos.
Quando o usurio der um clique no boto Cancel , no haver motivo para se preocupar com a va~
lidao dos dados porque ele desejar cancelar o formu lrio .
Verifi car a validade dos dados apenas quando o usurio d um cl ique em OK (ou Save, ou o que
for apropriado em seu apli cat ivo) evitar o surgimento de problemas em locais onde ele tiver de
inserir dados vlidos antes que voc permita que encerre seu aplicativo. Trabalhei com muitos
aplicativos que me foravam a digitar um nmero telefOnico adequado antes que me deixassem
sair de uma caixa de dilogo indesejve l, mesmo quando esse nmero era descartado por eu ter
dado um clique no boto Cancel!
Vrios aspectos das classes dos fonnul rios Windows funcionam em conjunto para fornecer
essa validao: a propriedade CausesVa 1i dat ion e os eventos Va 1ida ti ng jVa 1i dated, que exis~
tem em todos os controles. O processo geral para o uso dessas propriedades e eventos config ll~
Desenvo lve ndo uma Interface com o Usurio com os Formulri os Windows
239
rar CausesVal idation como True (ativado) em todos os controles de entrada efetiva de dados
(caixas de texto, botes de opo, caixas de combinao e outros) e tambm em qualquer boto
que faa cam que os dados sejam usados ou salvos (OK, Save, Continue, Next e outros). Em botes como Help, Cancel, Prev ious ou outros que, ao serem cl icados, voc no prec ise saber se os
dados so vlidos, configure a propriedade CausesValidat i on como False (desativada). A segui r, insira um cdigo no evento Validating para verificar se um campo vlido. Quando o
usurio tentar alternar se u foco para um controle em que Causes Va 1i da t i on = True, o evento Va1i dat; ng ser lanado em todos os controles de edio que tiverem recebido o foco desde a ltima vez em que um controle com CauseValidation igual a True foi accssado. Isso um pouco
complexo, portanto, percorreremos as etapas do processo:
Voc possui um fonn ulrio para inserir/editar endereos (veja a Figura 9.7), com um botoOK e um
Cancel, e vrias caixas de texto para entrada de dados. Voc configurou a propriedade CausesVal idation de todas as caixas de texto como True. Tambm o fez no boto OK , mas no em Cance l.
9.7
ES/(f caixa de dilogo. projetada
para entrada e edio de
endereos, li 1111/ exemplo de 1/111
FIGURA
~Add'M'
EJ
S~eel:
Sl.<leNrov.f"i
.",- -
1"'<-", - - - - ~
bR
[9E052
II
C-:eI
o foco no momento est na caixa de texto txtStreet, e o usurio pressiona Tab a fi m de passar
para a caixa de texto txtCity. Neste ponto, por causa da propriedade CausesValidation de
txtCi ty, o evento Va 1idati ng de txtStreet acionado. Agora, o evento Va 1ida ti ng deve verificar o contedo de txtS t reet e se cert ificar de que seja vlido. Ele pode cancelar a vai idao se os
dados no forem corretos.
Se os dados estiverem corretos (e o evento no for cancelado), ento, o evento Va 1i dated de
txtStreet ser chamado indicando que a va lidao foi bem-suced ida. Se os dados no estiverem
corretos e o evento for cancelado, a tentativa de mover o foco tambm ser anu lada, deixando-o
na caixa de texto txtStreet.
Portanto, sempre que o foco estiver em um controle em que CausesVa 1i dat i on = True, o evento
Validating ser lanado em todos os controles que tenham sido visitados desde a ltima vez que
voc acessou um controle em que a propriedade CausesVa 1i dation esti vesse ativada. Isso no depende da direo, assim, se o usurio tivesse pressionado Tab ou dado um clique novamente em
txtSt reet depois de passar para txtCi ty, o evento Va 1i dat i ng ainda seria chamado em txtC i ty.
Ainda est confuso? A Listagem 9. 1Ocontm o cdigo de vrios eventos de validao para o formulrio de endereos (Address Fonn), o que pode ajudar um pouco. O formu lrio completo tambm pode ser descarregado do site deste livro na Web, para que voc no perca tempo
reescrevendo-o.
Dia 9
LISTAGEM 9 .10
3
4
5
6
7
8
9
10
11
"'*'-"",
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
")
If sPattern <>
Then
If objRegEx . IsMatch(sPostalCode, sPattern)Then
bValidPostalCode " True
End If
End If
If bVal i dPostalCode " False Then
e.Cancel " True
errAddress.SetError(ctlSender, "Cdigo Postal Invlido")
End If
End Sub
II
II
Desenvo lve ndo uma Interface com o Usurio com os Formulri os W in dows
liSTAGEM 9.10
241
53
58
59
60
61
62
63
64
65
66
Quando com binados com o controle ErrorProvi der, que ser discutido ainda nesta lio, os recursos de val idao da platafonna .NET tornam fcil a criao de form ul rios para entrada de
dados.
242
Dia 9
entra em cena. Essa classe usada para exibir textos em lima caixa de dilogo si mples e um conjunto de botes entre os quais o usurio poder escolher sua resposta (veja a Fig ura 9 .). No
possve l criar lima instncia dessa classe, mas ela expe apenas um mtodo estt ico, Show, atravs do qual pode-se configurar a caixa de dilogo da maneira desejada e exibi -Ia, tudo em lima s
chamada.
FIGURA
9.8
A classe MessageBox
1/11/0 jerromellfo
Itil
1/1110
mensagem jl/mo fi
I'rias combinaes de
boies.
Parmetros
o mtodo Shaw aceita sete parmetros diferentes, mas voc pode fornecer apenas os valores que
tiver. Esse mtodo poss ui 12 tipos de sobrepos ies para dar suporte a vrias combinaes de
parmetros. Todos os parmetros que podem ser usados so listados a seguir, com uma breve
descrio de sua final idade:
Text
Representando a mensagem exibida por MessageBox, este parmetro no opcional; todas as sobreposies de Show o inclucm.
Caption Outra string, como Text , este parmetro detennina a barra de ttulo que ser
mostrada por MessageBox.
Buttons
Aceitando um dos valores possveis enumerados, este parmetro controla os
botes mostrados na caixa de mensagens.
Messa geBoxButtons.AbortRetry Ignore far a caixa de dilogo exibir os botes Abort,
Retrye Ignore; MessageBoxBut tons . YesNo exibe os botes Yes e No e assim por diante.
Icon Controla qual figura, se houver alguma, ser exibida junto mensagem. Pode ser
qualquer um dos nove valores, mas as verses atuais dos sistemas operacionais s fornecem fi guras para quatro deles e, portanto, todas as nove opes so convertidas em uma
das quatro fi guras.
Defau l tButton
Quando voc tiver ma is de um boto na caixa de dilogo, s um deles
poder ser o padro. Se o usurio press ionar Return ou Enter quando a ca ixa de mensagem (MessageBox) for aberta, ela ser tratada como se ele tivesse dado um clique no boto-padro. Este parmetro pode ser configurado como Button1, Button2 ou Button3, o
que conduzir a um dos botes apropriados.
Options
Estas opes controlam a aparncia da caixa de mensagem e sero especialmentc teis quando seu apl icativo estiver localizado em outro pas/regio. As opes incluem
tornar o texto justificado direita, legvel da direita para a esquerda e certi ficar que a caixa
de mensagem aparea apenas na rea de trabalho principal do sistema operacional.
243
OwnerWindow
Este parmetro especifica uma janela dentro de seu aplicativo na qual a
caixa de mensagem (MessageBox) deve aparecer. Em geral, esta funcionalidade no necessria, mas est disponvel.
As Figuras 9.9 e 9. 1O mostram alguns exemp los de chamadas, a MessageBox . Show( ) e as caixas
de dilogo resultantes.
FIGURA 9.9
A caixa de
mellsagem-padrcio.
<T
FIGURA 9 .10
Uma caixa de
mensagem
IIIO/S
personali::ada,
especificaI/do o texto.
o lf/llo e os
parmetrus dos
botes.
Obtendo Resultados
Depois que voc tiver escol hi do os botes que quer exibi r, desejar saber em qual o usurio deu
um clique (pressupondo que voc tenha exibido algo mais alm de um boto OK). Essa informao retornada pelo mtodo Show como um valor Di aI ogResult, que pode ser armazenado em
uma varivel, ou a cham ada do mtodo pode ser uti lizada diretamente em uma expresso ou instruo cond icional. A Listagem 9. 1 I mostra como formu lar uma pergunta ao usurio empregando a classe MessageBox e duas maneiras de manipular o resultado.
LISTAGEM 9.11
6
7
8
9
10
'repita
El se
'cancele
Dia 9
LISTAGEM 9.11
11
End If
12
13
Select Case MessageBox.Show("Algo inv l ido oco rreu".
14
"Processo Longo". MessageBoxBu t tons. AbortRet ry Ignore)
Case OialogResult .Abort
15
16
'abor te
17
Case OialogResult.Retry
18
'repita
19
Case Oi alogResult . Cancel
20
'cancele
21
Case E1 se
22
'hrrrn .. . como cheguei aqui?
23
End Select
24 End Sub
Como demonstrao do uso de MessageBox em um sistema real, voc pode adicionar uma funcional idade complementar ao fonn ulrio Fi 1er origina l. Esse formulr io, que penn ite copiar, transferir e excluir arquivos. no apresenta nenhuma mensagem de confirmao (' Est certo de que
deseja excluir c: \test . txt?' ), mesmo quando solici tada a excl uso do arq uivo completo. A
fim de adicionar esse recurso ao fo rmulrio Fi I er, poderamos usar urna caixa de mensagem
para exibir a confi rmao e botes VeslNo, executando ou cancelando a ao conforme a resposta. A Li stagem 9.12 mostra as rot inas dos trs eventos, alteradas para incl uir a etapa de confirmao.
LISTAGEM 9.12
10
11
12
13
I'
15
16
LISTAGEM9.12
17
18
Mes sageBoxIcon.Question. _
Mes sageBoxDefaultButton.Button 2)
DialogResult.Yes Then
19
20
Try
21
File . Copy(sSource. sDestination, chkOverwrite . Chec ked)
22
Catch objException As Except ion
23
MessageBox .Show{objException.Message)
24
End Try
25
End If
26 End If
27 End Sub
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
If MessageBox.Show(sConf irm.
"Confirm Move", MessageBoxButtons . YesNo.
MessageBoxIcon.Question ,_
MessageBoxDefaultButton . Button2) = DialogResult . Yes Then
45
46
47
48
49
50
51
52
53
54
55
56
57
If File.Exists(sOestination)Then
If chkOverwr ite .Checked Then
Fil e.Oe1ete(sOestination)
E1 se
MessageBox .Show( "Transferncia abortada, arquivo de destino j
existe")
Return
End If
End If
File. Move(sSource. sDest i nation)
End I f
End I f
58 End Sub
59
245
Dia 9
LISTAGEM 9 .12
65
66
67
68
69
If File.Exists(sSource)Then
Dim sConfirm As String
sConfirm: String.Format(
"Est certo de que deseja excluir {DI?" ,
sSource)
70
71
72
73
74
If MessageBox.Show(sConfi rm ,_
"Confi rm Oel ete". MessageBoxButtons. YesNo,
MessageBoxlcon.Question, _
MessageBoxDefaultButton.Button2) : DialogResult.Yes Then
75
76
File.Oelete(sSource)
77
End If
78 End If
79 End Sub
Controles Ocultos
Todos os controles usados nesta Iio at agora estavam visveis quando seu proj eto foi executado. Esse o tipo padro de controle com o qual voc trabalhar. No entanto, a plataforma .NET
tambm apresenta controles que so iguais aos habituais em quase tudo, exceto por no possurem lima interface visvel no tempo de execuo. Esses controles tambm tm propriedades, mtodos e eventos e foram projetados como um a maneira modular fc il de adicionar recursos
especficos a um formulrio.
Antes do Visual Basic .NET, os controles ocultos tam bm podiam ser inseridos nos formu lrios,
complicando a interface do tempo de projeto, mas ficando totalmente invisveis no tempo de
execuo. No Visual Studio .NET encontramos uma maneira muito melhor de manipular esse
tipo de controle, posicionando-os cm uma rea separada abaixo da do projeto do fo rmul rio
(veja a Figura 9. 11 ). Voc ainda poder arrastar, selecionar, clicar e exc lu -los, porm sem que
interfiram na vis uali zao do projeto de seu form ulrio.
Desenvo lve ndo uma Interface com o Usurio com os Formulrios Windows
247
FIGURA 9.11
No Visual Sludio
. NET, os co/1/ro/es
IXIlIIOS eSlo
posicionados em lima
rea especial do
projelo, para evitar
~''''' '
.. REI
serem confundidos
com elemell/os da
illlelface visrel.
H vrios desses controles de tem po de projeto, mas abordare i nesta seo a lg uns dos mai s usados : Timer, Notifylcon, ErrorProvider e os controles de caixas de d ilogo.
Timer
o controle Timer foi projetado para permit ir que os cdigos sejam exec utados a certos intervalos
com base em perodos de tempo. Se o controle estiver ativado, ele acionar automat icamente seu
evento Ti ck a intelvalos reg ulares. Pela insero de um cdigo no manipulador do evento Ti ck,
voc poder executar a tarefa que desejar de maneira programada.
O uso do controle Timer envolve apenas algumas etapas:
1. Depois que voc ad icionar esse controle a seu formul rio, ter de configurar suas propriedades; configure Enabled como True para indicar que o deseja ativo, e a propriedade
Interva 1 com o perodo de tempo (em mili ssegundos - 1000 ms so iguai s a I s) que quer
entre os eventos.
2, Ad icione seu cdigo ao evento Tick (d um clique duplo no controle Timer para acessar
rapidamente o mani pulador dele).
Isso tudo o que sc tcm a fazer para que o cd igo inserido no manipulador do evento Tick seja
executado uma vez a cada valor de Interval em mi lissegundos.
Voc pode testar esse controle em um projeto de s ua autoria seguindo estas etapas :
I, Crie um novo projeto vazio - um ap licativo Windows. Um formulrio em branco ser
adicionado ao projeto, Fonnl. Certifi que-se de estar visualizando o modo estrutura desse
formul rio vazio.
248
Dia 9
2. Arraste um controle Timer de Toolbox (no Windows Farms) para o formulrio. Ele ser
adicionado como um contro le rea de controles ocultos (que agora aparecero) com o
nome Timerl.
3. D um clique em Timer 1 para selecion-lo e, em seguida, visualize a janela de propriedades, que deve mostrar a voc os valores de Enab 1ed e Interval que determinam o comportamento do perodo de tempo.
5. D um clique duplo no controle Timer para passar visualizao do cdigo, e acesse a rotina de manipu lao do evento Tid.
Adicione o cdigo mostrado na Listagem 9.13 ao manipu lador do evento Tick.
LISTAGEM 9.13
Me . Text = DateTlme.Now.ToLongTimeString()
6 End Sub
Execute o projeto (pressionando F5 ou selecionando Start no menu Debug), certificandose de
que ele ser o iniciado (d um clique com o boto direito do mouse sobre o projeto no Solution
Explorer e selecione Set em StartUp Project) caso tenha mais de um projeto aberto.
Quando o projeto for executado, o formulrio dever aparecer, e seu ttulo renetir a hora atual
at os segundos. Faa o teste com valores diferentes em I nter . . a1 para ver como essa propriedade afeta o acionamento do evento Ti ck. Para que lique um pouco mais divertido, adicione um bo
to ao formulrio e insira essa linha de cd igo em seu evento Cl ick :
Timerl.Enabled
Not Timerl.Enabled
Tente executar o projeto novamente c d um cl ique no boto algumas vezes para ver o que acontece.
Notifylcon
Quando um programa precisa ser executado continuamente e necessrio algum tipo de noti fi
cao visual, um mtodo comum inserir um cone na bandeja do sistema ou rea da notificao
extrema direita da barra de tarefas. Esse pode no ser o me lhor local para posicionar algum
aplicativo, uma rea quej est muito che ia, mas til para certos utilitrios com finalidades
especiais.
Desenvo lve ndo uma Interface com o Usurio com os Formulrios Windows
249
Antes da existncia da platafonna .NET, adicionar um cone bandeja do sistema envolvia o uso
de vrias chamadas APl do Win 32 e uma tcnica denominada subclass ificao que poderia
tomar instvel seu ap li cativo do Visua l Basic. Na plataforma .NET, tudo que voc precisa fazer
adicionar um controle Not 1fy 1con a seu formu lrio e confi gurar suas propriedades. A propriedade mais im portante 1eon, que pode ser configurada com qualquer arqu ivo de cone para controlar o que ir aparecer na rea de not ificao . Se quisermos que um menu surja quando o
us urio der um cl ique com o boto direito do mouse em seu cone, podemos adicionar um
controle Contex tMenu ao formu lrio e configurar a propriedade ContextMenu de Not i fy1con. Seja
cuidadoso para s usar esse controle quando for apropriado; h tantos aplicativos colocando cones nessa rea que foi adicionado ao Windows XP um recurso de oc ultao automt ica!
ErrorProvider
Outro grande recurso para o projeto de fo rmu lrios de entrada de dados, o controle ErrorProvi der permite que voc indique visualmente (veja a Figura 9. 12) que controles de um fo rmulrio
possuem erros associados a eles.
Para usar este controle, apenas insira-o em seu fonn ulrio e confi gure as propriedades. Na verdade, voc pode fazer isso com ainda menos trabal ho porque os valores-padro costumam ser
adequados para grande parte dos objetivos, a menos que quei ra empregar um cone diferente.
Ento, sempre que quiser indicar que um controle possui um erro associado a ele, chame o mtodo SetError do controle ErrorProvider:
errorProvi der1 . SetError(txtStreet. "Endereo da rua i nvl i do")
Quando o erro tiver sido corrigido, voc poder elim in- lo de ErrorProv i der con fi g urando-o
com uma stri ng vazia :
e rrorProviderl.SetError(txtStreet. " ")
FIGURA
9.12
-'"
"-
I" 190001
IR_
,~
_f'.
os erros de elltrada de
del(los.
A caixa de dilogo do exemplo (de entrada/edio de endereos) abordado rapidamente nesta lio (e que pode ser descarregado do site da Web deste livro) usa esse controle oculto em seu cdigo e urna boa demonstrao a ser exam inada.
250
Dia 9
o 1I1timo tipo de controle oculto abordado nesta lio na verdade se refere a todo um grupo de
controles que vo de Open e Save s caixas de dilogo de seleo de fontes. Esses controles permitem que sejam usadas vrias caixas de dilogo-padro do Windows em seu programa (veja a
Figura 9. 13), o que mui to mais adequado do que ter de voc mesmo cri las.
FIGURA 9.13
A caixa de dilogo
para abertura de
arquil'os manipula
Ioda a COfllllllicao
com o sislemo
operacional e o
sistema de a/'quil'os,
sem filie voc lenha de
escrever nel/huIII
cdigo.
flo_
flo , tjlpO.
Como com os outros controles ocu ltos, possvel arrastar qualquer caixa de dilogo para que
seja usada em seu formulrio ou em uma rea de controles ocultos. Depois que tiver uma instncia do contro le em seu formu lrio, comece a trabalhar com as propriedades dele a fim de configur-l o para seu aplicativo. Conduzirei voc atravs do exemplo de um programa que emprega
as caixas de dilogo para abrir e sa lvar arqu ivos, e tambm podere i utilizar as de fonte e cor, apenas para ser conc lusivo.
O prprio formulrio contm vrios controles incluindo lima caixa Rich Text, quatro botes e
um controle de pai nel, que usado para armazenar os botes. Empregar um controle de painel
dessa maneira, e configur- lo para que fiq ue encaixado dire ita e que a caixa Rich Text ocupe
todo o formulrio, fornecer uma interface que ser alterada de modo correto quando o fonnulrio for redimensionado ou maximizado. No abordarei os detalhes da configurao desses controles, mas o formulrio completo pode ser descarregado a partir do site deste livro na Web.
Alm dos controles visve is, tambm inseri os quatro controles das caixas de dilogo (Open,
Save, Font e Color) no formulrio. Cada um dos quatro botes usa urna das caixas de dilogo
para abrir arquivos, salvar, alterar a fonte ou mudar a cor dela, e seu cdigo est listado nas secs a seguir. Observe que configurei os controles das caixas de dilogo dentro do procedimento
de dar um cli que no bOIo, mu ito embora pudesse ter configurado muitas dessas propriedades
empregando ajanela de propriedades do controle de caixa de dilogo. S agi assim porque esse
um exemplo; qualquer propriedade de controle que seja a mesma durante toda a existncia do
formulrio deve ser configurada apenas uma vez, que o que ocorre quando se manipulam as
251
propriedades por meio da janela referente a elas. Agora percorrerei o cdigo que representa cada
um dos quatro botes e discutirei como o contro le de caixa de dilogo fo i uti li zado em cada caso.
o manipulador de eventos do boto Open (veja a Listagem 9. 14) permite que o us urio se lecione
um nome de arq uivo lIsando a caixa de dilogo Open e, em seguida, exibe esse arquivo no controle da caixa Rich Text.
LISTAGEM 9.14
16
If .ShowOialog()=Di alogResult.OK Then
17
sNewFile = .FileName
18
If IO .File. Exists(sNewFile)Then
19
trNewFi l e = New IO .StreamReader(sNewFile)
20
rtfContents.Text = trNewFile.ReadToEnd()
21
sCurrentF i le = sNewFile
22
End If
23
End If
24
End With
25
End If
26 End Sub
ANALISE
252
Dia 9
ne a extcnsojunlo ao nome do arquivo, a fim de que seja verificado se o cam inho e o arquivo
existem e para que ele seja iniciado na mesma pasta do ltimo arquivo carregado. A propriedade
MultiSelect tambm est configurada como False, indicando que voc deseja que o usurio s6
possa selecionar um arquivo por vez.
A linha 16 ex ibe a caixa de di logo e veri fi ca se o resultado est correto. Se eSli ver, as linhas 18
20 se certificam novamente da existncia do arquivo e, em seguida, o carregam em uma nica leitura na caixa Rich Text. Deveriam ser adicionados mais recursos de manipulao de erros aqui
se esse fosse um sistema de produo, porque a abertura de arqu ivos uma situao propensa a
fal has devido a privil gios de segurana e o utras razes.
1
2
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LISTAGEM 9.15
23
24
25
26
27
28
29
swOutput.Write{rtfContents.lext)
swOutput.Close()
sCurrentFile : sNewFileName
End If
End Wi th
30
31
32
33
253
End If
End Sub
o uso da caixa de dilogo Save seme lhante ao de Open. Depois que o usurio con
ANLISE
firma se deseja salvar o arqu ivo (linha 9), as propriedades da caixa de dilogo so
configuradas para criar a imagem adequada. O nome do arquivo configurado como padro com
o ltimo util izado. A caixa de dilogo informada de que no necessrio ser um arquivo j exis
tente (CheckF i leEx i sts : Fal se), mas a pasta sim (CheckPathExi sts : True). Por padro, o arqu i
vo ser salvo com a extenso. txt (lin ha [6), mas a caixa de dilogo no impedir o usurio de
salv-lo como desejar. Duas opes interessantes, Overwri tePrompt e CreatePrompt , no so apl j.
cadas caixa de di logo Open , mas so imponantes ao sal var. Overwri tePrompt controla se a caj
xa de dilogo avisar o usurio antes de pennitir que ele salve utilizando o caminho e o nome de
um arqu ivo existente. CreatePrompt determina se o usurio deve ser avisado caso tente fazer exa
lamente o contrrio (usar um caminho e um nome que ainda no ex istam).
Depois de pronta, a caixa de dilogo exi bida (I inha 23), e se o usurio sair dela dando um cl ique
em OK, ento, o contedo da caixa Rich Text ser gravado no arquivo (l inhas 24 28).
Dia 9
LISTAGEM 9 .16
6
7
8
End Sub
ANLISE
atuais nela (1 inha 3) e, em seguida, exiba a caixa de dilogo (1inha 5). Se o usurio der
um cl ique em OK, ento, pegue as novas configuraes de fonte e leve-as de vo lta ao destino (nesse caso a caixa Rich Text, linha 6). Isso tudo; funciona perfeitamente.
do que voc necessita para permitir que o usurio escolha uma cor (veja a Listagem 9.17). Ele
pode selecionar uma cor-padro predefinida ou criar sua prpria combinao de cores, tudo por
meio dessa caixa de dilogo.
LISTAGEM
2
3
9.17
5
6
7
End Sub
A caixa de dilogo Color funciona exatamente da mesma maneira que Font; simplesmente carregue os valores das cores atuais (linha 3), ex iba a caixa de di logo (linha 5) e configure o dest ino que usar os valores selecionados nela - contanto que o usurio d um
cl ique em OK (linha 6).
ANLISE
255
dows em uma caixa de dilogo, dando a ele a aparncia e o comportamento de uma, e us-Ia em
seu programa. Existem vrios estgios diferentes, e os percorrerei enq uanto mostro como construir uma caixa de dilogo a ser empregada como a tela de login de um apli cativo. Para acompanhar este exemplo ao avanar nesta seo, crie um novo projeto (do tipo aplicativo Windows).
Agora ad icione os controles necessrios para criar uma caixa de dilogo de logon, duas caixas de
texto (UserlD e Password), dois ttulos (um para cada caixa de texto) e dois botcs (OK e Cancei). A maneira como ir organiz.:,l-los no to importante para os fins de um exemp lo, mas a Figura 9.14 mostra como fiz.
FIGURA
9.14
Nomeie os controles usando as convenes de nomeao que viu no decorrer desta lio, gerando 1b1Useri d, 1b1Password, txtUseri d, txtPassword , btnOK e btnCance 1. Para conclui r, como ltima parte da configurao,visual ize as propriedades de txtPassword e configure PasswordChar
" "*". Com PasswordChar con figu rada, qualquer texto que for inserido nesse campo ser mostrado como uma string desse caTactere.
J que os dois bales foram adicionados ao fonnulrio, voc poder voltar s propriedades do
formulrio e configurar duas que no poderiam ser definidas sem algum boto disponvel. Configure AcceptBut ton e Cance 1Sut ton, respectivamente como btnQK e btnCance 1. O resultado da
configurao dessas duas propriedades que se o usurio pressionar Enter nessa caixa de dilogo, o efeito produzido sera o mesmo de dar um clique no boto OK. Se o usurio pressionar a tecla Escape, isso ler o mesmo resultado de dar um clique no boto Cancel.
Dia 9
256
MessageBox .Show( ), e sua caixa de dilogo a man ipular da mesma maneira. H uma propriedade Di al ogResul t no fom1U lrio, e qualquer valor configurado nela ser retornado para o programa que exibiu a caixa de mensagem. Voc pode configurar essa propriedade usando apenas uma
linha de cdigo como a que aparece a segui r:
DialogResult.Cancel
duas caixas de dilogo e confi gurando a propriedade do resultado da caixa de dilogo do formulrio. Esse cdigo pressupe CausesVal idation igual a False para tudo que existir no form ulrio, e a propriedade Oi alogResult de btnOK igual a None.
LISTAGEM
1
2
3
4
9.18
LISTAGEM 9.18
257
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ANLISE
A rotina C1 i ck no executa nenhuma val idao comp lexa; apenas verifica se o usu-
rio inseriu uma identificao e uma senha (l inhas 9 e 15) e configura o resultado da
ca ixa de dilogo corno OK (linha 21) se isso tiver ocorrido. A configurao da propriedade Di alogResu1 t do fonnu lrio na linha 21 fecha a ca ixa de dilogo para ocultare retornar esse resultado
ao programa que o chamou. Observe que se btnOK. Di a1 ogResult tivesse sido configurada como
OK (por meio da janela de propriedades), ento, a caixa de dilogo seria fechada ao trmino de
seu evento C1ick independentemente de ter sido inserida a identificao/senha do usurio.
Configure a propriedade bt nCance1 . Oi a1 ogResu1t como Cance1 (de modo que sempre execute o
cancelamento, e nenhuma man ipulao de evento seja necessria) por meio dajanela de propriedades, e essa ca ixa de dilogo de logon estar pronta.
Dia 9
258
superior da janela de edio de cdigos. Selecionar essa opo preencher a lista suspensa direita
com a relao de eventos aos quais seu formu lrio d suporte . Selecione Load na lista suspensa,
e poder editar o procedimento do evento Fonnl Load.
Nesse procedimento, voc precisar criar uma instncia de seu formulrio LogonOi aI og, exibi lo
como lima caixa de dilogo e, em seguida, verificar a identificao/senha que o usurio inseriu.
A Listagcm9. 19 fornece um exemplo de como esse procedimento de evento poderia serescrito.
LISTAGEM 9.19
1
2
3
4
5
7
8
9
10
11
12
13
bLogonSuccessful ,. lrue
El se
sFailureMessage = "Senha Invlida!"
End If
E1 se
sFailureMessage = "Identificao do Usurio Invlida!"
End If
El se
sFailureMessage = "Tentativa de Logon Cancelada"
End If
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Uma nova instncia de LogonDi a1 og criada ( linha 3), o que necessrio antes que
voc possa ex ibir esse formulrio . Duas variveis so usadas (linhas 4 e 5) para registraro sucesso/fa lha da tentativa de conexo. A linha 7 emprega o mtodo ShowDia1og do formulrio para ex ibi-lo de maneira restrita. Devido a ShowDia 1og, a prx ima linha de cd igo desse
procedimento no ser executada at que o formulrio esteja ocu lto ou fechado, mas usar apenas
Shaw teria exibido o formulrio de maneira no restrita, e o processamento do cdigo teria continuado antes que o usurio conclusse o logon.
ANLISE
259
o mtodo ShowDi a1og, exatamente como Show na classe Messa geBox, retoma um valor de Dial ogResu 1t , como discutimos anteriormente enquanto voc criava o formulrio LogonDi a1og . A linha
7 verifica o valor retornado, porque se o usurio cancelar a caixa de dilogo, sua identificao e
senha no devem ser processadas. Em segui da, os controles de caixa de texto de LogonDia log so
acessados e seus valores veri fi cados em relao identificao e senha do usurio embutidas no
cdigo (l inhas 9 e 10). Em seus programas reais, voc provavelmente verifi car esses valores
confrontando-os com algum tipo de banco de dados ou IiSla de segurana. Para concluir, se tudo
estiver correto, bLogonSuccessful ser configurado como True (linha II ), ou a mensagem de
erro apropriada ser uti lizada por sFa i 1ureMessage (linha I I 19). Se a conexo no tiver xito, a
mensagem de erro ser exibida em uma caixa de mensagens (l inha 23), e FonnI ser fechado (linha 25) para bloquear o acesso ao programa.
Resumo
Os formu lrios Windows so usados para o desenvolvimento de aplicativos .NET com interfaces do Windows, que um dos dois tipos de apl icativo que voc criar (o outro seria os sistemas
com base na Web). Contendo vrios grandes avanos no existentes em verses anteriores do
Visual Basic e fornecendo um sistema comum para o desenvolvimento de fo rmulrios por toda a
platafonna .NET, o sistema Windows Forms permitir que voc construa a interface que seu
apl icativo precisar. O Dia 16 dar{l cont inuidade a esse tpico e fornecer mais informaes sobre
o uso desses formulri os em seus programas.
P&R
P Posso ter mais de um formulrio Windows em um projeto/aplicativo?
R Sim, voc pode ter quantos desejar. No entanto, apenas um formulrio pode ser definido
para a ini cializao, de modo que ser preciso criar instnc ias dos outros dentro de seu
cdigo e, ento, chamar seu mtodo Show quando quiser exibi-los.
P Quero usar uma caixa de mensagem (Message ox) em um aplicativo do console que
criei, mas no consigo faz-Io funcionar. Ele parece no reconhecer o nome da classe.
R A classe MessageBox faz parte do espao de nome System . Wi ndows. Fonns, portanto, voc
deve t-lo disponvel antes de us-Ia. Quando criar um aplicativo Windows empregando
o Visual Studio, ele automaticamente adicionar a referncia necessr ia, mas no fa r
isso para um aplicativo do console. Utili zando o Solution Explorer, d um clique com o
boto direito do mouse na pasta References dentro de seu projeto e selecione Add Reference. Na caixa de dilogo que aparecer, selecione System.Wi ndows. Fonns .dll na lista.
Outra boa idia adicionar uma linha Imports .System.Windows. Fonns no inicio de seu
arquivo de classes ou mdulo de modo que possa se referir MessageBox sem ter de sempre usar o prefixo System.Windows.Fonns nessa classe.
Dia 9
260
Workshop
o Workshop foi planejado para aj ud-Io a antecipar possveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar se u conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Qual a d iferena entre um formulrio modal e um no-modal?
2. Por que no podemos configurar a propriedade CausesVa 1i dat i on de um boto Cancel
COm o valor True?
Exerccios
I. Dado que um nico procedimento pode manipular vrios eventos (Sub myhandl er( )
Handl es btnOpen . Cl i c k, btnCl ose . Cl i c k, btnSave. Cl i c k), como voc poderia reescrever
LISTAGEM 9.20
261
SEMANA
DIA
Construindo a Interface com o
Usurio com os Formulrios da
Web
Hoje cada vez mais aplicativos so escritos com base em navegadores. Antes do Visual Basic
.NET, era dineil criar esses ap licativos com base em navegador usando o Visual Basic. Com o
Visual Basic .NET, seu desenvolvimento se tornou to fci l quanto o de aplicativos com base no
Windows. Nesta lio, voc examinar como pode gerar interfaces com o usurio com base em
navegador. As ferramentas do Visual Basic .NET ajudam o desenvolvedor na criao de pginas
da Web que fornecem interfaces com o usurio bem so fisticadas para qualquer tipo de navegador. Em particular, esta lio eofoear:
Dia 10
mais importantes, se no o mais popular, aspectos da Internet a World Wide Web (WWW ou
apenas Web). No entanto, freqUente a falta de ferramentas de programao realmente boas
para a criao de ' programas' na Web, em vez de simples pginas da Web. Isso acontece em par~
te porque o desenvolvimento de aplicativos para a Web diferente da gerao dos de microcom ~
putadores, com os quais temos mais contro le. Alm disso, os aplicativos da \Veb precisam lidar
com a rede com mai s periodic idade.
Assim, o que o ' modelo de programao na Web'? apenas um termo usado para descrever
como voc pode projetar, ou desenvolver, um programa que empregue pginas da Web em um
navegador para permit ir que o usurio insira informaes. Essas pginas da Web so projetadas
com a ut il izao de HTML (HyperText Markup Language). Este livro no abordar HTML, mas
h muitos outros no mercado que o fazem.
O navegador um aplicativo que sabe como ler HTML e exibi~la na tela. Em geral (mas nem
sempre), grande parte do traba lho de um aplicativo executado no servidor Web. O servidor
Web outro programa processado em um computador que sabe como retornar HTML quando
so licitado. No Windows NT ou no 2000, esse programa chamado de Internet Infonnation Ser~
vice (II S). As informaes so transferidas entre o navegador e o servi dor por meio de um protocolo, ou linguagem , chamado HTrP (Hypertext Transfer Protoco l).
NOTA
Nos ' primrdios' da World Wide Web, as pginas da \Veb eram estticas. Isto , nunca mllda~
vam realmente. Tudo ficou mais interessante quando as pessoas comearam a criar pginas da
Web dinm icas ou que podiam ser alteradas. Essa foi a origem dos programas da Web. Com
eles, em vez de apenas retornar sempre o mesmo resultado HTML, o servidor Web pode executar algumas tarefas e retornar o resultado HTM L apropriado. Por exem pl o, o usurio pode so l ici~
tar informaes sobre as vendas de um perodo em particul ar. Essas informaes sero passadas
para o servidor. Por sua vez, o servidor poder procur-Ias em um banco de dados e, em seguida,
convert-las em HTML exibindo-as para o usurio. O processo completo semelhante ao da Figura 10. 1.
Como alternativa, o servidor (ou o projet ista da pgi na da Web) pode adicionar informaes de
programao prpria pgina, criando uma que seja, ela mesma, um programa. Em gera l, chamamos esse recurso de Dynamic J-I TML (ou DJ-ITML). Por meio da DHTML, includo na pgina algum cdigo JavaScript (uma linguagem de programao, como o Visual Basic .NET, que
executada em pgi nas da Web) ou de outra Iinguagem. O cdigo pode ser processado no navegador sem precisar retomar nenhuma informao para o servidor. A Figura 10.2 mostra esse modelo em ao.
265
FIGURA 10.1
Modelo de
;::
..Pesquise
-----= s~:"~';
'0+-Resposta--
Servidor
Banco de
Dados
W,b
Navegador
FIGURA 10.2
O modelo de
programao da
DY//(lmic HTML.
.. Pesquisa
Resposte
Servidor
Banco de
Dados
W,b
H vrias tcn icas que podem ser empregadas na criao de um programa da Web. Algumas das
mais usadas no passado foram o ASP (Acti ve Server Pages), a Perl (outra linguagem de programao) ou o JS P (Java Server Pages). A tcnica lItili:wda pelos fonnlllrios da Web um aperfeioamento do ASP, o ASP .NET.
ASP.NET
ASP.NET o nome que a Microsoft deu para sua verso aprimorada do ASP. Embora o ASP
fosse um mtodo fci l de constru ir pginas dinmicas na Web, apresentava alguns problemas
que o AS P.NET resolveu:
O AS P quase sempre exigia muita cod ificao para que algo fosse executado. O
ASP.NET requer menos cd igo (em geral, mu ito menos) para tarefas comuns de programao.
O AS P tambm padecia da quantidade limitada de controles que a I-ITML apresenta. O
ASP.NET adicionou o conceito dos 'controles no lado do servidor' que podem gerar o resultado HTML apropriado para o navegador que o sol icitar. Embora esses contro les no
navegador sejam apenas HTML, podem representar muito da I-ITML e da cod ificao
que voc ser poupado de ter de escrever.
O ASP s aceitava programas cm uma linguagem como o VBScript. O VBScript interpretado no tempo de execuo, no compilado como o Visua l Basic. O ASP.NET permite que voc escreva pginas da Web em um cdigo totalmente compi lado do Visual
Basic .NET.
O ASP.NET tambm fo i projetado para reso lver outros problemas do AS P que no so inerentes
a essa discusso sobre a construo de interfaces com o usurio, como melhorias no redimensionamento e na ut ilizao da memria.
266
Dia 10
Os aplicativos com base na Webtendem a ter mais cdigo no servidor, em vezde no cliente.
Isto , a aparncia de seu programa vir do navegador, mas os recursos avanados estaro
no servidor.
Os aplicat ivos com base na Web dependem dos recursos do navegador usado para visualiz-los. Infe lizmente, os navegadores possuem recursos diferentes uns dos outros, e mui-
tos desenvolvedores da Web tm-se deparado com essas diferenas no momento em que
projetam seus programas.
Quando voc acessar uma pgina da Web, provavelmente ela ser esttica . Embora haja
maneiras de poder atua liz-Ia sem retornar ao servidor (isto , torn-Ia dinmica), esses
mtodos fazem com que sua criao seja mais complexa. Portanto, produzir fo rmulrios
animados (ou qualquer tipo de resposta para o usurio) mais dificil com os aplicativos
com base na Web.
Muitas operaes de aplicativos com base na Web requerem um 'percurso de ida e volta
na rede ' . Isso acontece por causa da separao entre cdigo e projeto. Para fazermos um
boto ou outro controle executar algo, em geral necessrio enviar informaes ao servidor. Assim , ele responder de modo apropriado. Voc deve se lembrar disso quando criar
aplicativos da Web. Esse percurso de envio e retorno na comunicao pode levar algum
tempo, portanto, ele s deve existir quando necessrio.
Os aplicativos com base na Web so restritos, tanto pelas Iimitaes do prprio navegador quan10 pela quantidade de navegadores disponveis no mercado. Os navegadores so limitados nos tipos de controles que podem ser usados, assim como por seus recursos insufi cientes de desenho isto , em geral impossvel desenhar na pgina da Web. Alm disso, se o usurio tiver uma verso ma is antiga de um navegador instalada ou tiver desativado certos recursos, a pgina da Web
poder reagir de vrias manei ras. Essa uma das principais razes pela qual os aplicativos com
base na Web tendem a apresentar grande parte da codificao no servidor. Isso tambm sign ifica
que esses aplicativos tradicionalmente prec isam que muita codificao seja adicionada para que
a aparncia da pgina possa ser alterada conforme o navegador que a visualizar.
Felizmente, os controles dos formu lrios da Web ocu ltam a maioria desses detalhes. Eles fo ram
criados para produzir uma sada dinmica (isto , a pgina pode ser alterada sem que seja necessrio retornar informaes ao servidor) se os controles detectarem que o navegador pode us-Ia.
Se eles no reconhecerem o navegador que estiver em uso ou se esse no der suporte a atualizao dinmica, s a HTML sem formatao ser retomada ao navegador cliente. Isso assegura ao
desenvolvedor que o navegador cl iente receba a pgina da Web como foi projetada, respeitando
as limitaes do navegador.
267
Alm das restries em decorrncia do navegador, os aplicativos com base na Web tambm tor
nam necessrio que o desenvolvedor considere o fato de que o cliente e o servidor esto separados, possivelmente por grandes distncias atravs de uma rede. Isso significa que as operaes
que poderiam levar alguns segundos se o cl iente e o servidor esti vessem prximos (ou ate na
mesma mquina) podero demorar muito tem po. Portanto, operaes como as animaes podem fic ar desfi guradas ou no serem exib idas de maneira alguma at que o download seja concludo. E ainda h a velocidade da conexo. Se voc estiver acessando a pgina da Web por meio
de um modem mais lento, essa diferena se tornar ainda mais relevante.
Com Iodas essas questes para lembrar, voc deve estar pensando "Por que me preocupar em
criar aplicativos da Web?". Embora haja desvantagens em desenvolver apl icativos da Web,
existem muitos beneficias:
Instalao
Para tomar seu aplicativo disponvel , tudo que voc precisa faze r inserir
algum endereo no URL. O apl icativo fica r imediatamente disponvel para uso do cliente. Isso evitar que voc tenha de ir at cada uma das mquinas clientes ou fazer com que
todos os seus usurios instalem o apl icati vo.
Novas verses e/ou correo de erros
Quando voc quiser atualizar uma parte de se u
aplicativo com uma verso mais nova, s ter de instalar as atualizaes no servidor, e
no em cada cliente.
Desempenho
Melhorar o desempenho de aplicativos da Web muito mai s fcil que
faz-lo com aplicativos comuns. Voc pode aperfeioar seu desempenho adicionando
mais servidores e distri buindo as sol icitaes por todos eles.
Conhecimento
Se voc j conhece um pouco de HTML, poder ser muito mais simples criar aplicativos da Web do que do Windows. Eles tambm so ma is fceis de assim ilar, se no houver conhecimento de HTML ou de Windows.
Ento, quando projetar um aplicativo, voc deve criar um programa com base no Windows ou na
Web? A resposta mais fc il (porm insatisfatria) "Depende". Mui tos se encaixam em qualquer tipo, mas as pessoas esto comeando a criar mais aplicativos com base na Web. A capacidade de fazer atualizaes fac ilmente e as correes disponveis so atraentes, portanto, pode ser
prefervel pelo menos considerar pri meiro a criao de programas como aplicat ivos da Web.
No entanto, alguns programas no so candidatos a apl icat ivos da Web. Qualquer programa que
precise de um vnculo contnuo entre o cl iente e o servidor no apropriado, nem os que requerem muitas fi guras (como os jogos). Para concluir, se s tiver um computador envo lvido (isto ,
no for um ap licati vo cliente/servidor como um programa de banco de dados) ou se o aplicativo
s for usado por voc, pode ser mais sensato criar um aplicativo com base no Windows.
268
Dia 10
mum do Visua l Basic .NET. A nica diferena o que acontece no nve l interno. Em vez de se
adicionar um cdigo para criar os controles e confi gurar suas propriedades, as lags HTML so
inseridas na pgina ASP.NET, e o cdigo annazenado em um arquivo do Visual Basic .NET
que funciona internamente.
Os controles que estaro disponveis na criao de um apl icati vo da Web so semelhantes queles que podem ser usados nos ap licativos Windows. A esto includos todos os controles comuns que voc est acostumado a empregar (veja a Figura 10.3). A Tabela 10. t apresenta uma
COII/ro/es-padnio para
os formulrios da lVeb.
.,,>'I ,,,.co
"""
1........
"rt
,
"li
f6Wii """ 3
.'-
0 __
;:~---
11" '
~.,,,
..
.
._,-
,"o..."
lo.
' ~'.~-~
.. . ' ..
-- '
rl""' _,,'1
<o"
~ "" "
TABElA 10.1
,'
Controle
Descrio
Label
Use para inserir texto no formulrio da Web. Como altern ativa, voc pode
apenas dar um clique no formu lrio e digitar. O controle label fornece
uma administrao melho r da f ormat ao e permite a insero do texto
onde fo r dese jado. Para concluir, este contro le tambm possibilita a alterao dinmica do contedo de seu aplicativo, o que no pode ser feito
com o texto adicionado ao formu lrio.
TextBo x
TABELA 10.1
269
Controle
Descrio
Button
Use para fornecer ao usurio algo para dar um clique a fim de executar alguma ao.
LinkButton
Semelhante no resultado ao controle comum Button, lin kB utton um recurso no qual o usurio de seu aplicativo da Web pode dar um clique. A diferena que Button se parece com um boto, enquanto LinkButton um
hyperlink. (Ou seja, o usurio v um bonito ponteiro azul, sublinhado em
algum local.)
ImageBut ton
Semel hante no re su ltado ao co ntrole comum But ton, ImageButton um recurso no qual seus usurios podem dar um clique a fim de executar alguma ao. A diferena que lmageButton uma fi gu ra.
Hype rl i nk
Semelhante a Li nkButton, exceto por no possuir um evento C1 i ck.Isso significa que voc s pode escrever cdigos que lidem com a ao de clicar
em Li nkBu tton, ao passo que Hyperli nk pode ser usado apenas para enviar
o usurio para outro local.
DropDownList
ListBox
Chec kBox
CheckBoxLi 5t
I 270
TABELA 10.1
Dia 10
Controle
Descrio
Radi oButton
O controle Radi oButton semelhante a CheckBox no fato de seu valor s poder ser True ou Fal se. A diferena entre os dois que os controles RadioButton tendem a 'viajar em pacotes' . Embora cada Check80x de um formulrio
possa ser configurado independent ement e como True ou False, apenas
um RadioButton de um conjunto pode ser True. Portanto, voc pode considerar Check80x como um controle que produz uma resposta afirmativa ou
negati va, enquanto Rad i oButton (ou melhor, um grupo de controles Rad i oButton) se assemelha mais a uma pergunta de mltipla escolha para a qua l
O controle RadioButtonList nada mais que um grupo de con t roles Rad i oButton. Ele facilita a criao desse grupo, se voc j tiv er uma lista proveniente de algum outro local (como um banco de dados) .
Image
Pane i
Exatamente como deve ser feito com os controles Windows, para usar os da Web, d um clique
duplo sobre eles na ca ixa de ferramentas ou arraste-os para seu formu lrio. Nesse caso, porm, o
formulrio ser lima pgina da Web.
Iremos criar um ap licativo sim ples com um formulrio da Web para ver como esses controles
noS ajudam a escrever programas na rede.
Inicie o ambiente de desenvolvimento se ele no estiver em execuo e crie um aplicativo da
Web. Chame-o de Madl ib . Ele ser usado como exemplo do desenvolvimento de um aplicat ivo
simples da Web para que possamos ver mui tos dos controles-padro em ao. Selecione File,
Newe Project para abrir a caixa de dilogo New Projecto Abra a pasta Vi sua l Basic Projects e selecione o modelo de projeto Web Applicalion. Altere o nome do projeto para Madl ib e d um clique em OK para poder constru-lo.
NOTA
Exatamente como nos aplicativos com base no Windows, sua primeira etapa ser dispor os controles que usar em seu aplicativo (veja a Figura [0.4 para o resultado final). Comece ad ic ionando uma figura a sua pgina.
271
o programa a seguir conhecido como MadLib. Na verdade, um jogo no qual um partici pante
seleciona uma srie de palavras (em geral pelo tipo de palavra ou uma descrio). Em seguida,
essas palavras so inseridas em locais especficos de uma histria para gerar um resu ltado di ve r~
tido e personali zado ( o que se espera) .
FIGURA 10.4
Formulrio Ma dl i b.
~ ,
~..
..,. ,
~",."."
I/'f~
~_
I'(omo,
, ,:'"":"
l~'
.......
,rII
"
...,.,., .. ~ _ _
lfoIo
II
<......,
_<II . . _
"r.JEI
~ .motio..! ""':
(""
F~d
Arraste um controle Image para o formulrio. No incio, ele deve ter a aparncia de um quadrado
vazio (ou talvez de uma figura incompleta) porque voc precisa configurar o caminho para a fi
gura. Acesse ajanela de propriedades e localize a propriedade ImageUrl. Quando der um clique
na janela Property para acessar a propriedade ImageUrl , ver um boto com trs pontos. Exata~
mente como nos aplicativos Windows, isso significa que uma caixa de dilogo o ajudar a confio
gurar essa propriedade. D um clique no boto e procure uma figura adequada. (Criei uma que
ex ibe Madl ib no programa Paint que vem com o Windows 2000.) D um clique em OK, e a figura j dever estar no formulrio.
Fornecer uma explicao de se u programa em geral uma boa prtica. Adicione um controle La
bel e uma explicao si mples na propriedade Text. O texto que inseri voc encontra no primeiro
pargrafo aps a imagem.
A seguir, voc adicionar pgi na os controles para os vrios itens que inseri r. A Tabela 10.2
descreve as configuraes das propriedades e controles usados.
I 272
TABELA
Di a 10
10.2
Controle
Propriedade
Valor
label
(!D)
lb l Name
Text
Font Bold
True
TextBox
(!D)
TxtName
label
(lO)
Ib l Oate
Text
A date:
Font Bold
True
TextBox
(!D)
TxtDate
Labe l
( lO)
lb l Fruit
Text
A kind of fruit:
Font Bold
True
( lO)
cboFrui t
Items
o controle DropOownl is t
DropDownList
possui uma ca ixa de dilogo que o ajudar a inserir itens nele. D um clique
na propr iedade Items e, em segu ida, no boto resultante Build. Veja a Figu ra 10.5 pa ra visualizar a
caixa de dilogo que surgir. Ad icione v ri as frutas, dando um clique no boto Add e, en to, confjgure a propriedade Tex1. Repita isso pa ra cerca de
dez itens. Adic ionei as f rutas: Mango (manga), Drange
(laranja), Banana, Currant (groselha) , Berry (cerejal.
Kumquat, Peach (pssegoL Kiwi, Apricot (damasco) e
Plum (ameixa).
Labe l
TextBox
label
RadioButtonlist
(lO)
1b1Number
Text
Font Bold
True
(lO)
TxtNumber
Text
SOO
(lO)
Ib l Emotion
Text
An emotional state:
Font Bold
True
(10)
rlstEmotion
TABELA 10.2
Controle
273
Valor
1tems
RepeatCo I umns
( 10)
IblVerb
Text
A verb:
True
TextBox
Font Bold
(ID)
Label
(10)
IblOccupation
Text
An occupat i on:
Font Bold
True
TextSox
(10)
txtoccupat i on
Sutton
(10)
cmdWr te
Text
Wrte Story
10
cmdClear
Text
Cl ear
(10)
IblResult
Text
Deixe este campo em branco (ou seja, exclua o vaIar da propriedade Text)
BorderStyle
Groove
Width
75%
Label
Sutton
label
TxtVerb
Alm disso, voc pode querer inserir uma li nha em certos pontos para organizar melhor os controles na pgina . Veja a Figura 10.5 para a visualizao de um exemplo. Se estiver familiarizado
com a HTM L, tambm poder adicionaras controles em uma tabe la para obter possibilidades de
formatao ainda mais adequadas .
274
Dia 10
H outra tcnica que pode ser usada na insero de controles em um formulrio da Web. Se examinar as propriedades do formulrio da Web (localize
DOCUMENT na lista suspensa de objetos que se encontra na parte superior da janela Property), voc ver uma com o nome pageLayout . Seu padro linearlayout. A alternativa, Gri dLayout. pode ajud-lo a criar formulrios sofisticados na
Web. Se page Layout for con fi gu rada como GridLayout, voc poder inserir controles no formulr io da Web exatamente como em um formu lri o Windows.
FIGURA 10.5
E!
Adicionado itens a
DropDownList.
II!
c....
A maioria das propriedades usadas tem um sentido prprio; no entanto, a lgumas precisam de
uma explicao adicional. Muitos controles que trabalham com listas podem ser 'dest inados' a
um conjunto de itens. Em geral, isso significa que eles podero ser associados s informaes recuperadas em bancos de dados, porm tambm podem fazer referncia a outros conjuntos, como
os arrays. Os controles que possuem essa capacidade podem ser facilmente identificados, j que
possuem um conjunto Items. Esse conjunto aparece najanela Property e permite que voc adicione itens sem vincular um controle a um array ou a outro conjunto. Essa a manei ra mais fci [
de adicionar itens se eles no puderem ser alterados. Se apresentarem a possibilidade de alterao, devero ser armazenados em um banco de dados e ser recuperados no tempo de execuo
para, em segu ida, ser vinculados ao controle. Examinaremos esse procedimento 110 Dia 12,
"Acessando Dados com a Plataforma .N ET".
O controle Rad i aBu t tonLi s t possui uma propriedade relativamente rara: Repea tCo 1umns. Voc
pode configur-la para controlar a quantidade de colunas usadas na exibio da lista de itens.
Essa pode ser uma tima maneira de economizar algum espao na tela, mesmo enquanto todos
os itens so exibidos. Internamente, o controle RadioButtonList gera um cdigo J-ITML para
executar essa tarefa. Esse um dos recursos que tornam esses controles mais fceis de usar do
que escrever seu prprio cd igo HTML.
275
A prxima etapa no desenvolvimento de seu aplicativo da Web adicionar cdigos. Voc s inserir o cdigo dos dois botes. Comearemos com o boto Cl ear. Esse boto apagar as informaes de todos os controles TextBox e dos resultados de Labelo D um clique duplo no boto
Clear c adicione o cdigo mostrado na Listagem 10.1.
CDIGO
LISTAGEM
10.1
ANALISE
o cdigo para esse boto simples. Tudo que ele faz configurar a propriedade Text
de todos os controles TextBox e os resu ltados de Label com" ". Isso esvaziar esses
controles.
o cd igo da Listagem 10.2 tambm simples. A idia bsica que voc crie uma string longa
contendo toda a histria, e que ser exibida nos resultados de Labe 1.
CDIGO
1
2
3
4
5
6
7
8
g
10
11
12
13
14
15
16
l iSTAG EM
10.2
Dia 10
276
LISTAGEM 10.2
CDIGO
17
18
19
ANALISE
o processo comea na linha 7, onde voc declara a string. Em seguida, ela constru-
da da linha 8 16, e o resu ltado inserido na propriedade Text do controle 1b1Re$U 1 t da linha 18. Um smbo lo que provavelmente parecer estranho &= que se encontra nas
linhas 10 16. Sendo um novo recurso do Visual Basic .NET, esse atalho ut ilizado para executar
inseres em uma string. O cdigo das linhas la I I, por exemplo,
10
11
ii
equivalente a:
10
11
sTemp
" Comecei
ii
&txtOate.Text &
II
Voc pode usar o operador &= para tomar seu cdigo mai s curto quando estiver adicionando
mais informaes ao fina l de uma string existente.
Depois que tiver adicionado o cdigo, voc j estar pronto para construir e testar seu programa.
Selecione Build no menu Build e, em seguida, execute o programa. Isso deve iniciar um navegador e carregar sua pgina. Insira alguns itens e d um clique no boto Write StOly para ver sua
histria. A Figura 10.6 mostra o formulrio da Web em ao.
FIGURA 10.6
O formulriO Madl i b
em ao.
whon .,...~ ..
Mad!..d:> ... _
liI<o ~d d
....,. ..
,.1<',,,, ,,,'....
A dOlO: r,- - - - -
A kiod .r r,UI:
.'_""'---"::J
~d
('
h>ln
('
Sboclu:d
A ... tlo: r i- - - - -
fII!;] f3
Th< .... _
....
277
o controle Ca1endar mostra, por estranho que parea, um calendrio mensal. Esse controle permite que o usurio visualize e se lecione datas ma is fac iImente do que com o uso de uma TextBox.
Alm disso, empregando Ca1endar, voc reduz a chance de o usurio inserir uma data em um
formato invlido. O controle Calendar possui uma grande quant idade de propriedades, no entanto, a ma ioria delas diz respeito a sua ex ibio. Quase tudo que est visve l no controle pode ser
ajustado - as cores, a grafia do dia da semana ou do ms e assim por diante. A Tabela 10.3 resume algumas das propriedades mais teis do controle Ca1endar.
TABELA
Item
Propriedade
Descrio
Se1ectedDate
Vis i bleDate
Propriedade
Propriedade
Atualizemos o projeto Mad1i b de modo que use um controle Cal endar em vez de TextBox para a
data inserida. Voc pode editar o formulrio antigo ou cop i-lo se quiser visualizar os dois.
Exclua a caixa de texto Date e adicione um controle Ca 1endar. Neste ponto, voc pode escolher
entre testar as propriedades que afetam a aparncia de Calendar ou faci litar as co isas e selecionar o Iink AutoFonnat, que se encontra na parte inferior da janela Properties quando selecionar o
controle Ca 1endar. Optei por dar um clique no link e selecionei CoI orful 2. (Por que complicar e
criar algo estranho quando um profiss ional j trabalhou em uma opo de aparncia adequada seria essa uma de minhas estratgias de programao?) Configure a propriedade Ca 1endar' s
Name como calDate.
Voc tambm ter de alterar um pouco o cdigo das Listagens 10. 1 e 10.2 por causa da mudana
no nome do controle. As Listagens 10.3 e 10.4 mostram o novo cdigo alterado.
278
Dia 10
CDIGO
LISTAGEM 10.3
2
3
4
5
6
txtVerb . Text
9
10
11
= " "
End Sub
ANLISE
Apenas uma linha de cdigo foi alterada. J que voc no tem mais a caixa de texto
txtOate, no pode configur-Ia com" ". Em vez disso, voc pode reconfigurar Cal endar para selecionar o dia atual (Date Time . TOday), como fez na linha 6.
CODIGO
liSTAGEM 10.4
3
4
5
6
7
8
9
10
ByVal e As System.EventArgs)
Handles cmdW rite.Click
' aqui que associamos as opes
'que o usurio selecionou formando a histria final
Dim sTemp As String
sTemp = "Dirio de " & txtName.Text &_
" de " & DateTlme.Today.ToString & "<br> "
sTemp &= "Em" & calDate.SelectedDate &_
" Comecei a programa r no Visua l 8asic.NET . "
sTemp &= "Estou" & rlstEmotion.SelectedItem .Text &" ! "
sTemp &. "Acho que vou sair e " & txtVerb.Text
sTemp &. " meu novo "& txtNumber.Text
sTemp &. " Pi coHertz " & cboFruit.Selectedltem.Text
sTemp &. " e me tornar um " & txtOccupation . Text & " "
'a histria final armazenada no controle Label
lblResult .Text = sTemp
11
12
13
14
IS
16
17
1B
19
End Sub
Novamente, a nica alterao na Listagem 10.4 foi na linha 10. Em vez de recuperar
a data em Text Box, o cdigo recupera a data selecionada em Calendar com ca 1Da te.SelectedDate.
ANALISE
279
No verdade que as propriedades possuem um sentido intrnseco? E por isso que os criadores
no chamaram o sistema de Visual Complexo .NET.
Requi redFi el dVal i datar Assegura que um campo tenha sido preenchido. Voc pode
us-lo sempre que quiser se cert ificar se o usurio concluiu o preenchimento de um formulrio antes de envi-lo.
CompareVa 1idator Assegura que dois campos estejam coincidindo ou que um campo
seja comparado a algum valor. No primeiro caso, a comparao entre campos ser til
quando voc quiser que o usurio digite sua senha duas vezes. Comparar um campo com
algum valor ser adequado se desejar que o usurio insira um nmero positivo ou se a entrada do usurio tiver de inclu ir um tipo especial de informao (por exemplo, uma data).
RangeVa 1i datar Assegura que o va lor digitado em um campo esteja dentro de um intervalo. O intervalo pode ficar entre dois valores (como uma data inicial e uma final) ou
entre dois controles. Por exemplo, voc pode ter um controle no qual o usurio deve inserir um valor mnimo, e um segundo para o valor mximo. Em seguida, o controle Va 1i da tar se cert ificaria se o valor digitado em um terce iro controle estaria entre os outros dois.
Isso pode ser til como parte de um relatrio, no qual pode-se querer que o usurio selecione uma data que esteja dentro do intervalo de informaes annazenadas em um banco
de dados.
Regul arExpress ianVa 1i datar Assegura que o valor digi tado tenha o formato desejado. O valor comparado com uma expresso regular. Se coincidir, ser considerado vlido. Pode ser ti l para valores que precisem apresentar uma certa estrutura, como nmeros
telefnicos, ISBNs ou nmeros de peas.
CustomVal idator
Permite que voc adicione seu prprio cdigo para validar o campo. Sendo o mais flexvel dos controles de validao, esse cdigo executado no servidor
ou no cliente. Pode ser til quando um dos outros controles de va lidao no atende sua
necessidade ou as informaes vlidas precisem ser detenninadas por meio de algum pro-
280
Dia 10
cesso - por exemplo, se o valor tiver de ser uma entre vrias entradas que se encontrem
em um banco de dados.
Os cinco controles de validao possuem vrias propriedades importantes em comum. Elas esto relacionadas com o controle que monitoram e com a maneira de exibir o erro. As mais importantes entre essas propriedades esto descritas na Tabela 10.4.
TABELA 10.4
Propriedade
Descrio
ControlToValidate
Esta a propri edade ma is importante de todos os controles de val idao. Deve ser configurada para apontar para outro controle
(pelo nome) do mesmo formulrio. Esse o controle que ser monitorado pelo controle de validao. Use a lista suspensa da ja nela
Property para selecionar o controle monitorado.
ErrorMessage
Display
Voc pode usar alguns desses controles para encerrar o aplicativo Madl i b do exemplo. Pode empregar o contro le Requi redFi el dVa 1idator para assegurar que o usurio tenha inserido as infor
maes nos campos certos, e RangeVal idator para se certificar de que um nmero apropriado foi
digitado no cam po txtNumber. Para concluir, possvel abranger todos os erros em um resumo
com o contro le ValidationSunma ry.
Mais uma vez, copie ou abra o projeto ou o fonnu lrio anterior para edit lo. Voc adicionar os
controles Validator a ele.
Arraste um controle RequiredFieldVa lid ator para perto de cada um dos controles TextBox re
manescentes (txtName, txtNumber, txtVerb e txtOccupa t i on). Adicione um controle RangeVa 1i datar prximo ao controle Requi redFi el dVa 1idator que voc posicionou perto do campo
281
txtNumber. Por fim , adicione um controle Val idationSunmary em uma linha prpria entre os bo~
tes e o controle 1bl Resul t. Confi gure as propriedades de cada um desses controles como mostrado na Tabela 10.5.
TABELA 10.5
Controle
Propriedade
Valor
RequiredFieldValidator
10
reqName
ControlToValidate
txtName
ErrorMessage
( 10)
reqNumber
ControlToValidate
t xtNumber
ErrorMessage
Display
Dynamic
(10)
rngNumber
ControlToValidate
txtNumber
ErrorMessage
Display
Dynamic
Type
In teger (inteiro)
MaximumValue
1000
MinimumValue
100
(10)
reqVerb
ControlToValidate
txtVerb
ErrorMessage
Display
Oynamic
(10)
reqOccupation
ControlToValidate
txtOccupation
ErrorMessage
Display
Dynamic
( 10)
valSummary
RequiredFieldvalidator
RangeVa 1 i da tor
RequiredFieldValidator
RequiredFieldValidator
ValidationSummary
Precisamos fazer uma pausa para descrever as trs propriedades de RangeVa 1i datar que voc
no atribuiu antes. Embora seja evidente o sentido de Maxi mumVa 1ue e Mi nimumVa 1ue com relao
a algo chamado Ra ngeVa 1i datar (val idao de interva lo), a propriedade Type no to bvia. J
que Rangev a1i da tar pode ser usado para testar vrios tipos di ferentes de valores (como inteiros,
Dia 10
282
valores financeiros ou datas), a propriedade Type identifica o tipo de informao que ser com
parada. Ela pode ter um dos valores a seguir:
Stri n9
O padro; faz com que o controle verifique se o valor est alfabeticamente entre as duas extremidades.
Integer (inteiro)
Compara o valor com as duas extremidades para assegurar de que
faz parte do intervalo. S os va lores inteiros so usados.
Oouble (dup lo)
O mesmo que o inteiro, porm incluindo a parte decimal do valor e
Currency (moeda)
decima is do valor.
Date (data)
]2
de
abril de 1986.
Agora verificaremos por que os controles Va 1i dator so to teis. Para faz-los func ionar, voc
no prec isa adicionar nenhum outro cdigo. Construa e visualize a nova pgina da Web (veja a
Figura 10.7). Tente deixar alguns cam pos em branco e exclua o algarismo 500 que o valor-padro para o campo do nmero. Voc ver mensagens de erro vennelhas aparecerem no
formulrio. Se isso no acontecer, tente dar um clique no boto Write Story. Provavelmente surgir algo semelhante ao formulrio da Figura 10.8. Tente inserir um valor que esteja fora do intervalo aceito para o campo do nmero. Por fim, digite valores corretos em todos os campos e
selecione o boto Write Story. Todas as mensagens de erro devem desaparecer e nossa histria
ser exibida.
FIGURA 10.7
O fo rmulrio Mad 1i b
mostrando os
COl1lrole.~
de
m/idao.
~ .moti.... ".t.:
(" Enud
,,~ ~r- - - - -
!.........,.., ..........
I
~.SlOtY
--CIo ..
En",
En ,
-.
,,'>&< ~
,.....,
>
FIGURA 10.8
O formulrio Mildl i b
mostrando os erros
enCOlI/rados na
Iolidacio.
rolo
u.
l/IO~
~"
...... ,",.~.,
1_ . '"' '
283
"'r:ll:!
000'
_._. 1_ _
. o [;l t:l
G / . '7 9 '
&
,.. Ma<! II ...,. wb .. o _ pIoyt< ,,10<1' ....... oC_do (aIuaIy t>,,,,. oj"",Of<l O< <lo .... "00)
1Ioeo pkwd """ ...,.., .. 'Pt.&; ",""lO , ..... a~) _ _ pmlliiod eod .. ~
"d.. "' I~
n.." ....do .0
1:
.. 12. ml
.,.:J 1(
........rio.oI ...,.:
.. bu.d
r P_k,.
r Fruw_ r E<_
r!totnped r ~
r SO<i<lm<d r 1..1",",
.-
A .. r\: ,r
r Fn&I~
r lt>wJ
r Sbo<k.<d
r a....
- - - --
Resumo
Os apl icativos da Web esto cada vez mais importantes, e os fonnu lrios da Web tomam sua criao bastante fc il. Eles perm item que voc use as mesmas tcnicas que empregaria para desenvolver ap licativos para microcomputadores na construo de um aplicativo da Web que funcione em qualquer navegador. Colocando o cdigo novamente em um servidor (que voc possa
controlar), possvel extrai r o mel hor que h nas duas alternativas para chegar ao objet ivo pe lo
qual os desenvolvedores se empenharam - uma interface com o usurio sofi sticada e recursos
compatve is com vrios navegadores.
Embora apenas simular uma experincia como a que se obtm no Windows j seja o suficiente
para a maioria das pessoas, os formulrios da Web vo alm, ajudando-o a criar com maior facilidade rotinas de validao e controles complexos.
Na prxima lio, voc comear a exam inara programao orientada a objetos. Aprender qual
a relao que a POO tem com o Visual Bas ic .NET e com a programao em geral. Perceber
que at aqui j esteve invest igando os objetos, na forma do .NET Framework, assim como dos
formulrios e controles que tem usado.
P&R
P Preciso ler um servidor Web disponvel para usar os formulrios da Web?
284
Dia 10
Workshop
o Workshop foi planejado para aj ud-lo a antecipar possveis dvidas, revisar o quej aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
1. Se voc pode adicionar texto a uma pgina da Web apenas por meio da digitao, por que
precisaria dos controles Labe l?
2. Que controles o ajudaro a navegar entre as pginas de um aplicativo da Web?
3. Como posso exibir figuras em um formul rio da Web?
Exerccio
Crie um aplicativo para execuo de registras. Esse novo aplicativo da Web deve permitir que o
usurio digite:
Seu nome . Esse campo de preenchimento obrigatrio.
Um nome de usurio para usar em seu site. Esse campo de preenchimento obrigatrio e
no pode ter mais do que 10 caracteres.
Uma senha nova (lembre-se de que a sen ha deve ser mantida em segredo). O usurio deve
inserir sua senha duas vezes para garanti r que tenha sido digitada de modo correto. Os
dois campos so de preenchimento obrigatrio e devem ter a mesma informao.
Depois que as informaes tiverem sido inseridas, o usurio deve dar um clique em um boto.
Elas sero ento mostradas para ele.
Semana 2
DIA
Introduo aos Bancos de Dados
Computadores so boas ferramentas para trabalhar com dados, principalmente em grandes
quantidades, e, no decorrer da histria desses dispos itivos, a maioria dos programas foi escrita
exatamcnte para fazer isso. Mesmo hoje, cm que se utilizam os computadores para urna enorme
variedade de tarefas, o processamento de dados ainda faz parte de quase todos os aplicativos empresariais e de muitos outros com finalidades diferentes. Nesta lio voc aprender sobre os
bancos de dados, inc luindo:
CDs especficos porque no sabia exatamente o que possua ou, quando sabia, no conhecia sua
localizao. A preocupao com a colco de CDs se tornou real quando ele decidiu limpar sua
grande pi lha de discos e tentou organiz-los em algo parecido com uma classificao.
Dia 11
Porm, organizar os CDs em um nico fichrio no lima tarefa to simples quanto pode parecer,j que h muitas maneiras diferentes de orden-los. Talvez por artista possa ser melhor (certificando-se de que os Barenaked Ladies venham antes do Boney M.), ou por categoria,
separando os discos em grupos de pop, rock, msicas natalinas e por a afora. H tantas decises
a serem tomadas. Brian Adams deve ser colocado na letra A (levando-se em considerao o sobrenome) ou na B (considerando-se o primeiro nome)? E os CDs novos? Depois de colocar esse
mesmo CD do Brian Adams em um dos poucos espaos iniciais de seu fichrio, O que se deve fazer se ele lanar mais um lbum? Ser necessrio mover todos os outros CDs para a frente a fim
dc criar espao, ou ser interessante apenas coloc- lo no final e prej udicar seu timo sistema de
posicionamento alfabtico? No final , pode ser mais simples decidir no comprar mais discos, o
que parece ter sido a escolha feita pelos pais do autor nos idos dos anos 70.
A necessidade de tomar uma deciso se tornou bvia quando, durante a limpeza de CDs, nosso
conhecido autor se deparou com dois (2t) CDs "Queen: Classic Hits, Volume I" . Pois bem - e
isso no nada contra o Queen -, ningum precisa de dois CDs iguais de melhores s ucessos, no
impona quanto ele goste de ouvir"Bohemian Rhapsody" . A lgo tinha de ser feito rapidamente.
A Deciso Tomada
Todas as opes acabaram sendo muito trabalhosas, e o autor chegou a uma concluso s urpreendente: as informaes sobre o CD deveriam ser inseridas em um programa de computador! Para
ser sincero, no assim Io surpreendente - ele chegou a essa concluso em muitas outras situaes (tal vez muitas, se voc perguntar a sua esposa ou a um de seus poucos amigos que continuaram a s-lo). No entanto, a idia de armazenar dados em um computador no to nova; na
verdade ela sempre foi uma das finalidades mais comuns dos sistemas de com putador.
Voc pode organizar os dados de muitas maneiras, mas a vantagem de usar um computador para
executar a organizao que, depois que estiverem no sistema, podero ser visualizados de vrias
maneiras. Isso el imina muitos dos problemas enfrentados pelo pobre autor no cenrio descrito
anterionnente. Se um novo CD tiver de ser inc ludo, poder ser adicionado ao final do arquivo de
dados, mas ser exibido em sua localizao apropriada com base na vis ualizao selecionada. Se
voc quiser visualizar os CDs por anista, apenas ordene os dados usando um campo chamado
Artista. Se preferir v-los pelo ttulo do CD, a reordenao pode ser facilmente executada.
Nesse caso, vamos supor que todos os dados tenham sido inseridos em um arquivo de texto no
computador, com cada linha desse arquivo representando um CD. Os campos e entradas possveis teriam a aparncia a segu ir:
NOTA
287
Em muitos bancos de dados, no so permitidos espaos nos nomes das tabelas ou dos campos, portanto o nome dos campos teve de ser alterado para evitar problemas de compatibil idade.
A primeira linha desse arquivo, chamada linha do cabealho, indica que partes da informao
esto armazenadas em cada linha. Uma nova linha marca o incio do registro de cada lbum. As
virgulas so usadas para separar as campos, tomando esse arquivo um arquivo separado por vrgulas (ou delimitado por vrgulas). To simples quanto parece, esse arquivo um banco de dados e poderi a ser utilizado por um programa de computador que registrasse os lbun s. J que se
trata de um banco de dados, voc pode us-lo para aprender alguns dos termos que empregar
daqui em diante para se referir s diferente s partes de um banco de dados:
Cada CD listado nesse arquivo um registro individual, s vezes chamado de linha
porque os registras em geral so annazenados ou ex ibidos como linhas separadas
com as informaes.
Novo TERMO
Novo TERMO
Novo TERMO
Dia 11
vertermos seus dados para o fonnato de um banco de dados como o Access ou o SQL Server.
Esses sistemas gerenciadores de bancos de dados podem manipular o armazenamento de suas infonnaes e tambm responder solicitaes de recuperao e alterao desses dados, gerenciando
todos os detalhes de layout de arqu ivo e armazenamento. Os sistemas de bancos de dados possuem muitos recursos, mas o serv io comum que eles fornecem manipular os detalhes de armazenamento de dados e liber-lo de qualquer interao fisica com as infonnaes.
Com o banco de dados de CDs como exemplo, se voc quisesse recuperar todos os ttulos de CDs junto com os nomes de seus artistas, poderia executar esta instruo SQL:
SELECT ArtistName, COTitle FROM Oisc
Ela retomaria um conjunto de dados com dois campos, e uma linha para cada registro da tabela Disc. Como alternativa, se voc qu isesse obter todas as colunas de uma
tabela, poderia usar * em vez de uma lista de campos, produzindo uma instruo
como a da linha a seguir:
SELECT
* FROM Oisc
Embora voc provavelmente ir ver instrues SQL como essa em muitos exemplos
e at em aplicat ivos, no uma prt ica recomendvel recuperar todos os campos de
uma vez. O que se deseja sempre recuperar a menor quantidade possvel de infor-
maes, e em geral isso no significa todos os campos. Seja cuidadoso para no prejudicar a longo prazo o desempenho de seu cdigo apenas para obter uma economia
no tempo que leva a digitao em seu programa.
Faa
No Faa
No use * para indicar todos os campos, a menos que esteja certo de que precisar de cada
campo que existe na tabela e de todos os outros que possam ser adicionados posteriormente.
Ordenando os Resultados
A ordem dos registras retornados no foi especi ficada nas duas consultas mostradas at agora,
mas voc pode adicionar uma clusu la instruo SQL para configurar a ordem da classificao. Essa clusula, ORDER BY, usa uma lista de campos, permitindo que possa ser espec ificado
mais de um na ordenao. A instruo SQL a seguir recupera os campos Arti stName e CDTi t1 e
de todos os registras da tabela Disc, ordenando-os primeiro pelo nome do artista (Art is tName) e,
em seguida, pelo titulo do CD (CDTit1e) dentro de cada conjunto de regi stros de artistas:
Faa
Especifique ASe mesmo se estiver usando
DESC; ajudar a evitar confuso.
Dia 11
Especificando um Critrio
As instrues SELECT mostradas at agora recuperavam todos os registras da tabela Disc, mas e
se voc quiser recuperar s um determinado registro ou um conjunto de registras com base em
um critrio especfico? Outra clusula pode ser adicionada a uma instruo SELECT para se encarregar di sso, a clusula WHERE. Nessa clusu la, podem ser especi ficados quantos critrios se desejar para restringir que linhas sero retornadas. Usando esse recurso, a instruo SELECT a seguir
s recuperar os CDs do Sting:
SELECT COTitle. COReleaseYear FRDM Oisc
WHERE ArtistName = 'Sting'
Observe que o campo usado para
restringir os resultados no foi um dos retornados; voc pode
,
uti lizar o campo que quiser. E possvel combinar vrios critrios empregando os operadores
ANO/DR e usar parnteses para determ inar como esses critrios sero apli cados. Para recuperar os
discos lanados depois de 1984 cujo nome do artista St ing e os lanados antes de 1984 pelo
grupo The Pol ice, a instruo SELECT a seguir poderia ser empregada:
SELECT COTitle. COReleaseYear FRDM Disc
WHERE (ArtistName = 'St1ng' ANO COReleaseYear => 1984)
DR (ArtistName= 'The Police' ANO COReleaseYear < 1984)
Essa consulta levanta uma questo relativa aos bancos de dados que sempre foi incmoda: o di sco deve ser inserido como Pol i ce ou Pol ice. The. representando o valor do campo Arti stName?
Detalharei esse e outros problemas comuns relacionados aos bancos de dados, alm das melhores mane iras que conheo para resolv- los, ainda nesta lio em "Problemas Comuns dos Bancos de Dados e Suas Solues".
291
possvel saltar a lista dos nomes dos campos, contanto que a de valores esteja na ordem correta. No entanto, esse outro exemplo de como voc pode econom iZ:'lr tempo na criao do cd igo, porm tomando sua manuteno mai s difci l e fazendo com ele esteja mais propenso a
apresentar alguma fa lha no futuro.
Alterando Registros
A SQL fornece a instruo UPDATE para que modificaes sejam feitas em registros existentes,
permitindo que voc altere de imed iato um ou mais campos de quantos registros quiser. Essa instruo possui a sintaxe bsica a seguir:
SINTAXE
<valor novo>
Como na instruo SELECT, a instruo UPDATE pode ter uma clusula WHERL Sem
essa clusula, ela executar sua atualizao em todos os registros da tabela. Ponanto,
a instruo
UPDATE Disc SET CDTitle
'Novo Ttulo'
configuraria todos os campos COT i t 1e como' Novo Ti tul o' , que provavehnente no
o resultado pretendido. Embora em geral seja atua lizado apenas um registro, til
poder alterar vrios deles com uma instruo UPDATL Novos valores configurados
com o uso dessa instruo podem ser baseados no contedo existente no campo.
Como exemplo, considere esta atualizao em uma tabela fictcia que fornece a cada
funcionrio 10% de aumento:
UPDATE Fu ncionaria SET Salario
Salario * 1.1
Na ma ioria dos casos, no entanto, ser prefervel especificar uma clusu la WHERE para
restringiras registras afetados a um grupo menor ou mesmo a um nico item . A instruo SQL a seguir atualiza todos os registros dos Barenaked Ladies na tabela Disc
alterando seu valor em Mus;cCategories para Pop:
UPDATE Disc SET MusicCategories
292
Dia 11
'5ting',
Art istLastName
WHERE ArtistName
'Sumner'
'5tin9' DR ArtistName
'Mr.Sting'
Na tabela Disc, voc poderia usar essa instruo para remover um ccrto grupo de registros ou, o que mais comum, exclu ir apenas um. A in struo SQL mostrada aqui
removeria todos os di scos de Gordon Lightfoot (exeeto um):
OELETE Di se
WHERE Arti stFi rstName " ' Gordon'
ANO ArtistLastName " 'Lightfoot'
ANO COTitle ! = 'Summertime Oream '
a Passo, Buyens
Outra boa fonte, que voc provavel mente j possui, o material da biblioteca Microsoft Solution
Deve lopers Network (MSDN), que faz parte da instalao do Visual Studio. Tente pesquisar os
com andos SQL descritos anteriormente, rastreando a seo de refernc ias SQL da bibl ioteca
MSDN. Se quiser praticar a SQL fora dos exemplos que executar neste li vro, poder faz -lo
com qua lquer programa de banco de dados q ue tiver disponve l. Se ti ver o SQL Server instalado,
execute o Query Anal izer (veja a Figura 11 . 1), que uma das ferramentas que vem com o SQL
Server e est dispon vel como um cone na pasta do men u desse programa. Essa ferramenta fo i
projetada para permit ir a execuo de consultas e a visual izao dos resultados, embora seja recomendve l ter cautela ao executar algo que no seja uma consu lta SELECT at que j se tenha
mais segurana para especificar as clusulas WHERE.
293
FIGURA 11.1
O Quel)' Alla/yser
permite que I'oci!
execute instrues SQL
direcionadas a seu
. ~.
00
n ~ .. ...
capacidade de aI/alisaI'
o desempellho e a
eSlrl/fl/ra das COlIs/lllas.
Inconsistncias de Atualizao
Suponha que um usurio decida atualizar uma linha da tabela Disc porque o valor de Arti st est
incorreto. Talvez Sling tenha sido especi fi cado quando o certo ser ia Bruce Willis. O usurio poderia executar essa instruo SQ L:
Dia 11
ArtistName, ArtistFirstName, ArtistLastName, CDTitle, CDRelaseYear,
.. MusicCategories
agora teria esta aparncia:
Bruce Willis , Gordon, Sumner, The Return Df Bruno, 1986, Rock/Pop
Arti stName reflete a informao correta, mas Arti stFi rstName e Arti stLastName no o fazem, o
que uma inconsistncia. Isso poderia ter sido evitado se todos os trs campos tivessem sido atua[izados, mas o usurio ou o software teria de assegurar que os dados fos sem consistentes. Voc
tem de fazer tudo que puder no nvel do projeto do banco de dados para evitar a inconsistncia.
Faa
Estruture seu banco de dados para evita r a inconsistncia.
No confie no fato de que seus usurios, inclusive seus prpriOS programas, iro trabalhar com
os dados exatamente da manei ra esperada .
Outra inconsistncia com um que pode ocorrer quando se usa urna estrutura de banco de dados
como a da tabela Disc que podem existir muitas variaes de dados que deveriam ser idnticos.
Aqui esto trs linhas da tabela Disc:
, Maroon, 2000, Pop
Barenaked Ladies, -,
The Barenaked Ladies. - , - , Gordon , 1993. Pop
Barenaked Ladies. - - , Stunt. 1999. Rock/Pop
Uma consulta SQL criada para encontrar todos os lbuns dos Barenaked Ladies poderia ser escrita da segu inle maneira:
SELECT * FROM Disc WHERE ArtistName ; 'Barenaked Ladies'
Esse cdigo retornaria a primeira e a lt ima das trs li nhas listadas do cdigo anterior, mas no
encontraria o CD chamado ' Gordon'. Isso resultaria em um erro exibido para o usurio ou algo
parecido. O usurio simplesmente no conseguiria a infonnao correta.
o terceiro problema com re lao aos campos Arti st ocorrer se um artista alterar seu nome. (Essa
sit uao no comum quando se trata de msica, mas se voc estivesse lidando com depat1amentos de uma empresa ou nomes de produtos em outros bancos de dados, seria um grande problema.)
Suponha que um artista, selecionemos de modo aleatrio o Prince, altere seu nome da simples palavra ' Prince' para um simbolo impronuncivel (que, infelizmente, no lz parte do cdigo ASCII
e, portanto, voc no poder inseri-lo em seu banco de dados). Seria necessrio atualizar cada registro que no momento tivesse o nome Prince nele. claro que essa seria uma instruo simples:
UPDATE Disc SET ArtistName = 'O artista anteriormente conhecido como Prince'
WHERE ArtistName = 'Prince'
Pressupondo que ningum tenha escrito Prince errado em algum local, essa instruo SQL atua\izaria todos os registras necessrios. Novamente, no entanto, voc est confi ando no fato de que
o usurio ou o software esteja ciente de que preciso executar vrias alteraes. Pode ser que
295
eles no usem uma instruo UPDATE como a anterior. Eles podem alterar apenas uma entrada
para o novo valor, em vez de todos os discos de Prince, tornando o banco de dados mais uma vez
inconsistente. A situao fica ainda pior quando descobrimos que precisamos alterar todos os registros retornando-os para ' Prince' no final!
Todas essas questes resu ltam de um problema na estrutura do banco de dados - as informaes
sobre o art ista so armazenadas com o registro de cada disco, embora o nome do art ista na verdade seja um conjunto independente de dados. Para evitar os problemas descritos, voc deve separar as informaes sobre o artista para que fiquem em sua prpria tabela e armazenar apenas um
va lor com o disco para vincu lar as duas tabelas. Para esse valor, poderia ser usado o campo
Arti stName, mas isso trar problemas se ele for alterado em algum momento.
Em geral melhor escolher um valor que com certeza no v ser alterado a menos que o registro
vinculado, na tabela Artist, seja excludo. Ao examinarmos o conjunto aluai de informaes sobre o artista - os valores de Art is tName, Art is tFi rs tName e Arti s tLas tName - , no h nada que
possamos garantir que no ser alterado. Portanto, voc adicionar um campo exclus ivo para
esse fim . Com freqUncia isso que acontece, um campo adicional tem de ser criado apenas para
atuar como um identificador exclusivo de um registro, e o mtodo mais comum gerar um campo contendo um nmero que seja automaticamente incrementado. Inserindo esse campo a seu
conjunto de informaes sobre o artista, obteremos a tabela Artist a seguir:
ArtistID. ArtistName . ArtistfirstName . ArtistLastName
l,5tin9 , Gordon, 5umner
2,The Barenaked Ladies ,
3, 80n Jovi. -
4, Queen , - , 5, The Police , - ,
o campo Arti stIO chamado de chave porque usado para identificar uma entidade individual.
Na tabela Artist, em que Art i s tIO ident ifica apenas um artista espec fico, esse campo seria denominado chave primria. Na tabela Disc, ele pode ser chamado de chave externa porque empregado como um vnculo de retorno a uma tabela diferente (veja a Figura 11.2). Uma tabela em geral
contm vrias chaves externas, vinculando-a a outras tabelas, porm possui s uma chave primria
(embora mais de um campo possa ser usado ao mesmo tempo para formar lima chave primria).
296
Dia 11
FIGURA 11 .2
As tabelas Ar/isl
Artist
pj(
e Oisc contm
campos-chm'e qlle
ArtistlD
ArtistName
ArtistFirstName
AnistLastName
I'inculam lili/a
Olll/'Q,
Disc
FK1 AnistiO
CD Title
CDReleaseYear
MusicCatego ries
Novo TERMO
A chave um valor, em geral um campo, que identifica uma entidade, como o nome
Novo TeRMO
Quando duas tabelas esto vinculadas pelo uso de chaves primrias e externas,
diz-se que e las esto relacionadas.
Por causa da transferncia dos dados do campo Arti st para uma tabela separada, as instrues
necessrias para adicionar e recuperar informaes tero de ser alteradas. Para adicionar dados,
ser preciso exec utar duas instrues INSERT, uma na tabela Artist e outra na tabela Disc, mas a
de Artist ocorrer apenas uma vez a cada artista, e no a cada disco. A criao de tabelas vincula
das separadas elimina os problemas di scutidos anteriormente, mas gera uma nova maneira de in
troduzir dados inconsistentes - chaves externas invlidas. Se um usurio ou programa remover
um valor do campo Artist, ento, todos os discos que fazem referncia a essa identificao do
artista repenti namente se referiro a um registro da tabela Artist que no existe. Discutirei como
lidar com esse problema um pouco mai s adiante nesta lio, na seo " ]ntegridade Referencial" .
A maneira de recuperar dados necessrios no banco de dados tambm foi alterada, j que as in
formaes que voc deseja agora esto contidas em duas tabelas. Os mtodos que usaremos para
obter esses dados tambm sero abordados ainda nesta lio, na seo "Associaes: Consultan
do Vrias Tabelas de uma S Vez".
297
Campos Multivalorados
Um dos campos, Mus i cCategori es, pode conter mais de um valor de uma s vez, por meio do
formato a seguir: Rock/Pop. Esse tipo de campo precisa ser removido de seu banco de dados, ou
voc ter vrios problemas com ele. O pri meiro problema ocorrer quando o usurio tentar recuperar dados com base nas informaes contidas ali :
SELECT * FROM Disc Where Mus;cCategor;es
'Rock'
Isso retornaria os discos em que o valor de Mus i cCategori es fosse igual a Rock, mas no os de
Rock/Pop, Sest of /Rock ou qualquer outra informao relativa a mais que apenas uma categoria .
E preciso ter algum conhecimento sobre o objetivo do banco de dados. Nesse caso, a finalidade
do campo Musi cCategories era agrupar os CDs de um ou mais tipos de msica. Se o usurio quisesse encontrar todos os seus discos de msica pop ou que se enquadrassem tanto no conjunto
rock quanto em 'c lssicos' (seria RoCk/Ses t Of ou Ses t Df /Roc k?), os problemas resultantes tornariam essa categori zao intil. A tualizar os dados de um campo multi valorado tambm quase to difcil quanto a situao comentada. Termi naramos tendo de adicionar o novo valor a um
j existente, nos certificando de que ele j no estivesse l! Tudo fi caria ainda mais complicado
se em algum momento decidssemos renomear uma categoria, alterando-a de Pop para Popular
por exemplo, uma tarefa que seria extremamente dificil de real izar com uma instruo UPDATE.
Para corri gir essa instruo mu ltivalorada e evitar todos os problemas decorrentes dela, separaremos os dados em outra tabela. Diferente das informaes sobre o art ista, no entanto, s uma tabela nova no pode man ipularo relacionamento entre as categorias e os discos. Cada art ista pode
ser associado a um nm ero qualquer de discos (ou a absol utamente nenh um ). Esse relacionamento chamado um-para-muitos ou, o que seria mais correto, nenhum-para-mllifOs. O relacionamento entre o di sco e a categoria mais com plexo; uma n ica categoria pode ser assoc iada a
muitos discos e apenas um disco pode ser associado a muitas categorias. Isso produz um relacionamento muitos-para-muitos que voc poder mode lar usando duas tabelas novas. Uma armazenar as prprias categorias, a outra vincular os discos s cmegorias (veja a Figura 11.3).
Dia 11
298
Dis<:Category
FIGURA 11 .3
Modelar
IIfIl
relac iO/1(1l1le/llo
muitos-para-II/uitos requer
PK
PK
i
Arti~tlD
CD litle
para conect-Ias.
As tabelas resultantes obedecem um padro que sempre poder ser usado para representar um relacionamento muitos-para-muitos . Detalharei como fazer consultas em relacionamentos do tipo
maneiras de constru ir a instruo SHECT quando se quer trabalhar com mltiplas tabelas, mas veja a
seguir um exemplo:
COOIGO
RESULTADO
Di sc
...
NOTA
Quando voc tiver mais de uma tabela envolvida em uma instruo SELECT,
passivei que um campo com o mesmo nome exista em vrias delas. Nesse
caso, preciso especific-lo uti lizando o formato tabe 1a _campo em sua instruo SELECT para assegura r que o banco de dados compreenda qual o campo desejado. No entanto, essa sintaxe pode ser usada em qualquer situao, mesmo
quando s houver uma t abela envolvida.
Essa instruo informa ao banco de dados que recupere todos os registras da tabela Disc e, para
cada um deles, faa uma pesquisa (usando a identificao do artista - Arti st 10 - armazenada na
tabe la Disc) na tabela A rti st em busca do nome correspondente do artista (Art i s tName) . Isso pa-
rece trabalhoso, mas, felizmente, todo o trabal ho manipulado pelo banco de dados, e ele o faz
de modo muito rpido. Portanto, embora voc tenha removido cuidadosamente Arti stName da
tabe la Disc, ainda poder produzir os mesmos resu ltados associando as tabelas Dise e Artist.
Novo TERMO
Vincular duas tabe las em uma consu lta para recuperar dados relacionados chama-se
Qssocwao.
A ltima instruo SQL usava uma clusula WHERE para associar as duas tabelas, o que com certeza funciona r, mas no a melhor manei ra de criar associaes. Em vez disso, voc aprender
lima sintaxe nova com a qual poder especificar as informaes sobre a assoc iao como parte
da clusula FROM de sua instruo SQL. A reconstruo da instruo anterior com a sintaxe correta
produzir
SELECT Artist .ArtistName , Disc.COTitle
FROM Oisc INNER JOIN Artist ON (Artist.ArtistID
Disc.ArtistIO)
Essa instruo gerar os mesmos resu ltados que a do exemplo anterior que usava a clusula
WHERE, e pode ser chamada de associao il1lerna. possvel especificar Disc JOIN Arti st, e a
palavra INNER 'omitida' ser incorporada, porm o Access no aceita essa fonna abreviada.
Disc.ArtistID)
Dia 11
Por outro lado, se voc usasse uma instruo OUTER JOIN como mostro a seguir, o campo Arti stName seria retornado contendo Limp Bi z ki t . J que nenhum registro correspondente seria encontrado na tabela Disc, CoTi t 1e teria um valor llulo para esse registro.
SELECT Artist.ArtistName, Oisc.COTitle
FROM Disc LE FT OUTER JOIN Artist ON (Artist . ArtistID
Disc.ArtistID)
Como voc ViUll0S exemp los, o resultado de uma associao interna pode ser enganoso porque
inclui apenas os valores em que uma correspondncia foi encontrada entre as duas tabelas. Mesmo assim, esse tipo de associao adeq uado para a maioria das consultas.
Relacionamentos Muitos-para-Muitos
Para modelar o relacionamento mui tos-para-muitos dos CDs com as categorias, voc tenninou
com trs tabelas dist intas: Di sc, Category e uma terceira criada apenas para esse relacionamento,
chamada DiscCategory. Para fazer consultas nessas tabelas, ser preciso usar duas associaes~
lima entre Disc e DiscCategory e outra entre DiscCategory e Category. Por exemplo, a instruo
SQL para recuperar todos os CDs que foram atribudos categoria Pop mostrada a segu ir:
SELECT Disc.COTitle
FROM Category INNER JOIN
(Disc INNER JOIN OiscCategory ON Disc .DiscID = DiscCategory . DiscID)
ON Category.CategoryID = DiscCategory.CategoryIO
WHERE Category.Category = "Pop"
Quando voc tiver vrias tabelas relacionadas, poder usar instrues de associao aninhadas
como as mostradas no cdigo anterior, no qual uma tabela est na verdade sendo associada ao resultado da associao de duas outras.
Integridade Referencial
Nos casos em que existem vrias tabelas, h mais probabi lidade de serem encontradas inconsi stncias. Como di scutimos, se um artista for referenciado por sua identificao em um ou mais registros da tabela Disc, ento voc ter dados inconsistentes se ele for excludo. Para evitar isso,
faa com que o banco de dados tenha conhecimento dos vnculos entre suas tabelas defin indo as
chaves e o relacionamento (veja a Figura 11.4). Quando o banco de dados tiver inrormaes dos
relacionamentos existentes em seu sistema, ele poder garantir sua integridade impedindo a excluso de um registro se esse tiver correspondncias em outras tabelas. No sistema especfico
que criamos, ter os relac ionamentos no banco de dados impediria (o banco de dados retornaria
um erro) que o usurio exc lusse um registro da tabela Arlisl se a tabela Disc possusse algum registro com a ident ificao desse art ista.
301
FIGURA 11 .4
Em seu programa de
bal/co de dados. sendo
ele o Access 011 o SQL
Se/Ter. voc pode
criar relacionamenlos
para qlle esses possam
ler S//(/ integridade
garantida.
o primeiro mtodo para gerenciar as chaves est embutido em muitos bancos de dados e um
tipo especia l de campo que incrementa automaticamente seu valor quando uma nova Iinha ad icionada. Esses campos so sempre numricos; eles podem ser configurados para acrescentar
urna quantidade definida, quase sempre 1, e para iniciar a contagem em um valor especfico, que
tambm quase sempre I. Essa uma boa maneira de manipular as chaves porque o banco de
dados real izar todo o trabalho, mas, sob certas ci rcunstncias, uma chave de gerao automtica pode causar problemas. Por exemplo, se voc tivesse de adicionar um novo CD coleo e ele
fosse de um art ista no existente em seu banco de dados, seriam necessrias duas instrues
INSERT - uma na tabela Artist e, em seguida, outra na tabela Disc. Usando as chaves de gerao
automtica, no adicionaramos um valor para Art; s t lOna primeira insero; em vez disso, ele
seria gerado de modo automtico. Entretanto, na segunda insero (em Disc), precisaramos que
o novo valor de Arti stID vinculasse o novo CD ao novo artista. Empregando apenas a SQL, essa
identificao no seria retornada.
Voc poderia fazer outra consulta no banco de dados, mas teria de usar campos como Art ; stNa me para encontrar os dados novamente, e isso estaria propenso a erro. Essa uma razo pela qual
necessrio um mtodo alternativo de obter as chaves; outra razo ser discut ida ainda nesta lio em "Identificadores Exclusivos (GU IDs - Globally Unique Ident ifiers)" .
Dia 11
Chaves Calculadas
Como alternativa s chaves geradas por bancos de dados, voc pode usar as instrues SQL para
deterrn inar a prxima identifi cao na seqncia antes de fazer a insero necessria. Isso envol
ve o emprego de um tipo especial de operador SQ L chamado operador de agregao, que recu
pera um valor calculado com base em todos os campos encontrados por uma clusu la SELECT. H
vrios desses operadores de agregao, mas uti li zaremos o chamado de MAX, que retorna para um
campo o valor mais alto extrado entre todos os registras selecionados.
Para determinar a prxima identificao, voc poderia executar esta instruo (usando a tabela
Art ist como exem plo):
303
aleatrio de 128 bits gerado pelo banco de dados ou pelo sistema operacional. O GU 1D aleatrio o bastante para que seja usado em um cenrio de bancos de dados distri budos.
Gerenciador de Chaves
o lt imo esq uema para a criao de identificaes que discuti rei adequado para sistemas que
no so distribudos (veja a seo anterior sobre os GU IDs), mas para os quais voc precisar
realmente obter a chave no momento exato da insero do registro. (Isso torna problemtica urna
chave gerada pelo banco de dados.) Esse mtodo, chamado sistema gerenciador de chaves, usa
uma tabela ad iciona l em seu banco de dados para armazenar os valores atualmente ma is a ltos das
identificaes de todas as outras tabelas (veja a Figura 11 .5).
FIGURA 11 .5
O mtodo urili:ado
pelo geretlciador de
cllm'es para ger-Ias
reqller 1111/(/ tabela
adicional que comenlla
o Wllol" mais alIo de
idemificao de cada
tabela que usar esse
mlOdo.
Para obter novas identificaes usando esse mtodo, voc ter de procurar na tabela do gerenciador de chaves o valor da identificao aluaI, acrescentar um a unidade a ele, inserir seu novo registro e aluali zar essa tabela com o valor da ident ificao incrementado. As quatro aes
separadas significam que esse mtodo compartilha o mesmo problema da existncia de vrios
usurios encontrado na chave calculada. O problema de reutilizar as chaves dev ido s excluses
evitado porque o valor da identificao armazenado no gerenciador de chaves nunca decrescido, e as identificaes nunca so reuti lizadas.
304
Dia 11
sando Dados com a Plataforma .NET", ser preciso sua prpria cpia do banco de dados do
exemplo. Embora o processo de criao do banco de dados possa ser percorrido manualmente e essa no uma idia ruim se os bancos de dados forem um assunto novo para voc - , tentarei
tornar isso um pouco mais fcil fornecendo trs opes d iferentes de banco de dados que podero ser con figuradas em sua mquina.
As trs verses foram projetadas para ser usadas em trs sistemas de bancos de dados diferentes:
Microsoft SQL Server (2000), Microsoft Database Engine (MSDE 2000) ou Microsoft Access.
O SQL Server e o MSDE daro suporte verso de download do mesmo arquivo, permit indo
que seja criada apenas uma configurao para os dois sistemas . Todas essas opes funcionaro ,
mas o melhor produto para se ter a fim de atender finalidade atual e para a prti ca futura o
SQL Server. Ele um servidor popular de banco de dados e provavelmente ser seu instrumento
de trabalho quando comear a desenvolver sistemas reais. O MSDE gratui to, o que um timo
preo por um sistema de banco de dados bem completo, mas fornecer s algumas ferramentas
para o trabalho com dados externos a seu programa. O Access vem com vrias verses diferentes
do Office 2000/XP e disponibiliza vrias ferramentas para a visualizao de dados, criao e alterao de tabelas, e at para a construo de suas instrues SQL (o Query Builder), portanto
no ser uma opo ruim se voc j o ti ver.
Descubra que produto voc tem e, em seguida, siga a direo apropriada nas prximas sees. Se
no t iver o Access, o MSDE ou o SQL Server, poder simplesmente fazer O download do arquivo .mdb (parte do Access abordada na prxima seo) e us-lo sem instalar o restante do so fiware
do banco de dados.
CO . mdf e CD.ldf
Juntos, esses dois arquivos contm todos os dados que sero usados
com o SQL Server ou o MSDE.
AttachDB . vbs
Antes que os arquivos mdf e Idf possam ser usados a part ir de seu cd i
go, esse arquivo VBScript ( . vbs) deve ser executado para inclu-los em seu SQL Server
ou no MSDE local.
CO.mdb
MSDE.
TestDB .vb
O exemp lo de um programa no Visual Basic .NET que voc pode usar para
testar a configurao de seu banco de dados.
Orders. txt
O banco de dados Access, que voc pode usar se no tiver o SQL Server ou o
problema que pode encontrar ser se tiver uma verso diferente daquela em que o exemplo foi
criado. Se esse for o caso, por padro, s poder visualizar e no ed itar as diversas tabelas e outros objetos de seu banco de dados por meio do Access. Se quiser, util ize as ferramentas de converso de banco de dados do Access a fim de atual izar o banco de dados para a mesma verso
que voc estiver executando.
Dia 11
TextOB.vb
12
13
14
15
16
17
18
19
20
21
22
23
drCD.C loseO
24
connCO.CloseO
25
Conso l e. ReadLineO
26
End Sub
27 End Module
Se voc usar o banco de dados do Access (CD.mdb), sua string de conexo incluir o cam inho
completo para esse arqu ivo como descrito a seguir:
Provider=Microsoft.Jet.OLEDB.4.0Data Source=c:\chapterll\cd.mdb
Certifique-se de alterar essa string de conexo a fim de indicar o caminho apropriado para
CD.mdb em sua mquina.
Se, por outro lado, voc usar SQL Server ou MSDE, e j tiver executado AttachOB. vbs com
sucesso, ento, a string a segu ir deve funcionar em sua mquina:
Provider=SQLOLEDB .lUser ID=saInitial Catalog=CDData Source=(local)
Esta string de conexo SQL (que di vid ida em duas linhas neste livro, mas deve ter apenas uma
linha em seu cd igo) pressupe uma senha em branco para a conta 5a, podendo ser alterada para
que especi fiqu e uma senha se necessrio:
Provider=SQLOLEOB.l;User IO=sa ;Password=peanutbutter;
_ ln i tia1 Cata1og=CD ;Oata Source=(local)
Insira a string de conexo apropriada na Listagem I I. I. Observe que esse cdigo est includo,
como testdb. vb, na pasta Day I I que voc descarregou anteriormente do site do livro na Web.
Agora compile o cdigo como foi orientado nos comentrios do incio do arquivo, e voc dever
ver um arquivo. exe que poder usar para testar sua conexo com o banco de dados. Se tudo der
certo, voc deve obter o segu inte resultado:
RESULTADO
Com esse resultado, voc ler criado um aplicativo que estabelece com sucesso uma conexo
com o banco de dados e estar pronto para passar para tpicos mais avanados sobre bancos de
dados.
Resumo
Esta lio apresentou uma introduo aos bancos de dados e sua funo no desenvolvimento de
aplicativos .NET. Ao dar cont inuidade na criao de sistemas no Visual Basic .NET, voc em
geral ir usar um banco de dados, independentemente do segmento empresarial para o qual desenvolver seus programas. Com freqncia escrever programas que empregaro um banco de
dados j existente.
Di a 11
s vezes, seu trabal ho exigir que voc mesmo projete e implemente esse banco de dados, uma
tarefa que pode ser bem complexa de realizar corretamente. Na lio seguinte, continuaremos a
trabalhar com bancos de dados, passando da teoria diretamcnte para a prtica escrevendo programas que lIsam as classes $ystem .Oata.
P&R
P Nesta lio, voc mencionou trs tipos diferentes d e bancos de dados, mas os bancos
de dados da Microsoft so o nico tipo com o qual posso me conectar?
R Abso lutamente no. Qualquer banco de dados no qual voc tenha um driverdo OLE DB
(ou do ODBC) estar disponvel para conexo com as classes $ystem.Oata.OleOB. Se
voc no tiver um provedor do OLE DB, mas possui r um driver do OOBC, tambm poder se conectar passando por uma camada ad iciona l e usando o provedor do OLE DB
para as conexes do ODBC.
Para obter mais informaes sobre o OLE DB, acesse http://www . microsoft . com/data .
P No banco de dados dos C Ds, voc removeu as informaes sobre o artista da tabela
Disc, mas, em seguida, teve de retorn-Ias em quase todas as sadas usando uma associao em s ua instruo SQL. No seria melhor apenas manter uma cpia das informaes sobre o artista em cada registro de Disc?
R O annazenamento de dados em mais de um local signi fica que, para evitar inconsistncias,
voc ter de se cert ificar de alualizar todos os locais possveis ao mesmo tempo. Os benefcios conseguidos evitando a associao em suas consu ltas sero perd idos pe lo trabalho
adicional necessri o sempre que atualizar os registros na tabela Disc ou na Artisl.
P A XML foi projetada para a rmazenar dados. Ela substitui os bl1DCOS de dados?
R A XML uma maneira de armazenar dados e, embora seja certamente lima subst ituta
para alguns sistemas de bancos de dados no relacionais, ela no substitui sistemas de
bancos de dados relacionais como o SQL Server. A XM L ser usada com mais freq ncia como uma maneira de intercambiar dados entre sistemas e representar a sada gerada
por seus sistemas tradic ionais de banco de dados.
Workshop
o Workshop fo i planejado para aj ud-lo a antecipar possveis dvidas, revisara quej aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
309
Teste
I. Em uma tabela de banco de dados, um ou mais campos so usados para identificarde ma
nei ra exclusiva cada regi stro. Como esses campos, ou campo, so chamados?
2. Dadas as duas tabelas mostradas na Fig ura 11.6, qual seria o resu ltado da instruo SQL
que vemos aqui ?
Make
FIGURA 11 .6
MakelD
2
3
4
5
MakeName
Ford
Audi
BMW
Pontiac
Toyota
3. Examinando novamente as tabelas da Figura 11.6, qual seria a sada desta instruo
SQL?
Exerccios
I. Se voc quisesse expandir sua biblioteca de registro de CDs para que armazenasse a cole
o de CDs de mais de um usurio, como alteraria seu banco de dados? Considere que pre
cisaria registrar infonnaes sobre os prprios usurios e sobre a propriedade dos discos.
2. Dado o conjunto de informaes cont ido em Orders. txt, como voc projetaria um banco
de dados para annazenar as mesmas informaes?
SEMANA
DIA
Acessando Dados com a
Plataforma .NET
Na lio anterior apresentei uma introduo aos bancos de dados e mostrei como eles podem ser
usados em vrios aplicativos. Nesta li o, exami naremos como seus programas trabalharo com
dados do Visual Bas ic .NET. Esta lio inc lu ir:
Alm desses tpicos, no fina l da lio voc aprender alguns dos conceitos e tcnicas mais avan~
ados para o trabal ho com bancos de dados da plataforma .NET.
Dia 12
de acesso a dados do Visual Basic evoluiu com o passar do tem po, passando por muitas verses
diferentes antes que a plataforma .NET entrasse em cena.
o ADO e o OlEDB
No obteramos grandes vantagens percorrendo a histria completa que envo lve o Visual Basic
e o acesso a dados, mas vale a pena fazer um exame resumido da tecnologia mais recente de
acesso a dados (anterior platafOlma .NET). Antes da existncia dessa platafonna era extensivamente usada pelos programadores do Visual Basic 6.0 uma biblioteca de acesso a dados chamada ActiveX Data Objects (ADO), considerada o principal meio de conectar os sistemas do
Visual Basic ou do Visual Basic for Applications (VBA) a quase todos os bancos de dados de
back-end. O ADO era uma bib lioteca do COM que encapsulava a funcional idade da tecnologia
real de acesso a dados, o OlE DB, e que t inha sido projetada para ser uma maneira fcil de trabalhar com essa nova tecno logia.
Para evitar a necessidade de se criar um cdigo para cada banco de dados com o qual voc pudesse se deparar, o ADOIOLEDB usava Lima abordagem seme lhante ao ODBe (http: //www.microsoft . comjdatajodbc), fornecendo uma nica interface de programao independente do
banco de dados e, em segu ida, usando drivers especficos de banco de dados para trabalhar com
cada um deles . Esse mesmo conce ito j tinha se tornado popular e quase todo sistema de banco
de dados possu a um driver de OOBe disponvel. O ADO tambm requer drivers para funcionar,
embora eles sej am conhecidos como provedores de OlEDB, e mu itos dos bancos de dados mais
conhecidos disponibilizam o(s) provedor(es) necessrio(s). Mas j que o ADO mais novo do
que o OOBe, no existem tantos drivers desse tipo. No entanto, possuir apenas o driver do
ODBe j suficiente, j que o ADO vem com um provedor de OlEDB para os drivers de
ODBe. Por meio da combinao dos provedores de OlEDB disponveis com todos os drivers
de OOBe forn ecidos, o ADO poderia ser usado para estabelecer uma conexo com quase todos
os bancos de dados existentes.
A arquitetura integral do ADO fo i estabelec ida no fato de que o cdigo que voc escrevesse s
trabalharia com o ADO, e no com o sistema de banco de dados, porm, o ADO usaria um provedor de OlEDB para converter e transferir suas solicitaes para o sistema de banco de dados
(veja a Figura 12. 1). O ADO expunha vrios objetos-chave que representavam a conexo com O
banco de dados, os comandos relacionados ao banco de dados e os resultados obtidos nas consu ltas - todos projetados para ser fcei s de usar como parte de um programa do Visual Basic.
ADO.NET
O ADO.NET a tecnologia de acesso a dados que faz parte do .NET Framework. Ele ser sua
maneira de obter dados quando programar no Visual Basic.NET e representa o estgio posterior
ao ADO/OLEDR A tecno logia OLEDB s ubjacente ainda permanece em seu lugar, e os provedores de OL EDB ainda so o principal mtodo pelo qual o ADO.NET se comunica com sistemas
especficos de banco de dados, mas acima dessa camada h muito pouca semelhana com os objetos anteriores do ADO.
FIGURA 12.1
3 13
acima do OI.EDB.
qlle IIsa/anto dril'crs
de OLEDR q//all/o de
DOBe para se
COl/cclar COIII os
bal/cos de dados.
'~
j"
ActiveX Data Objects (ADO)
'(
\.
.7
0
pJ:
Dados
Oraele
~
Dados
SybaS6
Dados
Na plataforma .NET, o acesso a banco de dados manipulado pelas classes existentes no espao
de nome System .oata. Esse espao de nome divid ido em duas reas distintas: o conjunto de
classes System.oata.oleoB e as classes System.oata.SQLClient. O primei ro conj unto,
System. Data .01 eoB, foi projetado para permitir que voc se conecte a qualquer banco de dados
para o qual possua um provedor de OLEDB ou (por meio do provedor de OLEDB para o ODBC)
um driver de ODSe e tecnicamente o equivalente camada de acesso a dados do ADO original. A segunda rea, System. oata . SQLCl ient, foi projetada para trabalhar apenas com o Microsoft SQL Server, mas fornece um conjunto de recursos seme lhante s classes OLEDS. A
arqui tetu ra geral das classes de acesso da platafonna .NET mostrada na Figura 12.2, il ustrando
os dois sistemas principais.
Nos exemplos desta li o, voc aprender a trabalhar tanto com bancos de dados OLEDS quanto com sistemas do SQL Server ou do MSDE. Mesmo se s tivera SQL Server, ainda poder testar os dois mtodos porque possve l se conectar com o SQL Server por meio de seu provcdor dc
OLEDS ou com as novas classes da plataforma .NET. Alm das classes SQLCl i ent e OLEOB para
acessar os bancos de dados, Sys tem. Da ta tambm inclui vrias outras classes projetadas para trabalhar com os dados independentemente de sua fonte especifica. Tambm exam inaremos essas
out ras classes, principalmente oataSet, como parte dos exemp los desta lio.
314
Dia 12
System.Data
FIGUR A 12.2
o ADo.NET
dil'idido em dilas
secs principais.
manipu lao de
dados genricos)
ampla
Svstem.Dat3 .SQLClient
(contm objatas espEtel/icos
I'oriedade de fomes de
dados.
System.Oata.OLEOB
,,
,,
,,,
,,
,-- ---- -- --
provedores de Ol EOB)
System.Data.OOBC
(contm objatas especificos
3 15
Apenas por ter o ADO instalado em seu computador- e ele est includo como parte da inst a l a~
o do .NET Framework, portanto voc o tem - , um tipo especial de arqu ivo, o Microsoft Data
Link, fo i registrado. Os arqu ivos desse tipo foram projetados para conter infonnaes sobre a
conexo com o banco de dados e se voc criar um vazio, ento, uma interface grfi ca com o
usurio adequada ser fornecida para a gerao e edio de todos os detalhes da conexo. Depois
de ter trabalhado com essa interface e selec ionado as opes apropriadas para seu banco de
dados, o arquivo ter a stri ng de conexo que poder ser copiada e usada em seu aplicativo do Vi~
sua i Basic .NET. Siga estas etapas para empregar esse artifc io:
I. Crie um arquivo Microsoft Data Link vazio por meio de um novo arquivo de texto (d
um clique com o boto direito do mouse na rea de trabalho e selecione New, Text Docu~
ment no menu que aparecer) e renomeie~o com um ttu lo que possua uma extenso. udl
(New. udl seria perfe ito). Isso ser difcil de fazer se as extenses de arquivo no est ive~
rem vi sve is para que possam ser at ivadas pelo pa inel de cont role Folder Options. Voc
deve ficar atento para o cone de alterao do arqu ivo depo is que tiver mudado sua exten ~
so, indicando seu novo tipo de arquivo .
2. D um cl ique duplo no arquivo novo, e uma caixa de dilogo aparecer com um conju nto
de quatro guias para a criao e ed io das informaes sobre a conexo com seu banco
de dados.
3. Na caixa de dilogo que acabou de ser aberta (veja a Figura 12.3), comece com a p r ime i ~
ra guia, Provi der, e configu re as informaes corretas para seu banco de dados :
Para o arquivo CD .mdb do banco de dados do Access, selecione o provedor Microsoft Jet4.0.
Tanto para o banco de dados do MSDE quanto para o do SQL Server, selecione Mi~
crosoft OLE DB Provider for SQL Server.
FIGURA 12.3
- I - l - I ..
fi caixa de dilogo de
propriedades do Data
Lillk permite que I'oc
cO/ifigure graficamellfe
os detalhes de S/I(1
conexo.
..." I
.. I ""'"'"
4. Na gu ia Connection, voc ver opes diferentes dependendo de qua l dos dois provedores
disponveis selecionou na etapa anterior. Para o Access, s ser preciso inserir o caminho
para O arquivo CO.mdb (veja a Figura 12.4).
316
Dia 12
FIGURA 12.4
A gllia COllneclioll
ser dijerellfe
dependendo do
prol'edor qlle voc
seleciOl/or: as opes
para o Acce~'s
incluem o camillho
parQ
(I
arq/lh'o do
banco de dados.
Para o SQL, voc precisa informar o nome do servidor ou (loca 1) se ele estiver no mesmo
computador, a ident ificao e a senha do usurio e com que banco de dados especifico (CD
neste caso) quer se conectar. A Figura 12.5 mostra a guia Connection configurada para um
banco de dados de um servidor SQL local que usa 'sa' como sua identificao de usurio e
urna senha que foi inserida mas no pode ser lida .
FIGURA 12.5
do bal/co de dados
especifico e a
idenlifica~:iio e
senha de usurio
necessrias para a
cOl/exo.
5. Embora haja mais duas guias, voc conclu iu a digitao de informaes . D um cl ique
no boto Test Conneclion para ver se as informaes que inseriu esto corretas. Se o teste
for bem-sucedido, ento, feche a ca ixa de dilogo dando um clique em O K. Agora, use o
Bloco de notas ou algum outro editor de textos para abrir o arquivo. udl de modo que
possa examinar seu contedo. O conledo exalo depender das informaes que foram
inseridas na caixa de dilogo, mas devemos ver um texto como o desc rito a segui r:
3 17
[oledb]
: Everything after this line is an OLE DB initstring
Provider=Microsof t.Jet .OlEDB.4 . 0:
Data Source=C:\CD.mdb:
Persist Security Info=False
A ltima li nha desse arquivo, que comea em Provi der, uma string de conexo do OLEOB, que o
que voc precisar usar em seu programa do Visual Basic .NET. Se estiver utilizando um banco de
dados do Access, ento, a string anterior dever ser a mesma exceto pelo caminho. O contedo de um
arquivo .ud l con figurado para o SQL Server mostrado no exemplo a segu ir, mas pode ser preciso
alterar ao valores da identificao do usurio (use r i d), da senha (pas sword) e da fon te de dados (Data
Source) para que esta string funcione em seu sistema:
[oledb]
: Eve rything after this line is an OlE DB initstring
Provider=SQlOLEDB .I: Password=password;
Persist Security Info=True User 10=sa ;
1nitial Catalog=CO Oata Source=(loca l)
Observe que a ltima linha na verdade uma longa linha de texto que foi divid ida em vrias outras para que a clareza fosse mantida.
Depois que voc ti ver sua string de conexo, e que souber que ela est correta porque o boto
Test Connection executou um teste bem-sucedido com base nessas informaes, poder comear a escrever algum cdigo para seu banco de dados.
Para gerar uma conexo, voc precisa criar uma nova instncia do objeto System . Data . OleDB
.OlEOBConnecti on ou de System. Data. Sql Cl ient. SQLConnect ion . Se estiver se conectando com
o MSDE ou com o SQL Server, ento, a string de conexo precisar ser um pouco alterada antes
que possamos us-la com o objeto SQLConnection. A string utilizada com o OleDB e, portanto,
com qualquer tipo de banco de dados, o que significa que ela apresenta uma seo Provi der. A
especificao de um provedor no necessria, e deve ser remov ida quando houver uma conexo atravs das classes SQL.
A Listagem 12.1 cria uma nova instncia de OLEOBConnect i on e fornece a string de conexo no
construtor, produzindo um objelo Connecti on quej est con fi gurado com todas as informaes
que voc precisa para se comunicar com seu banco de dados.
LISTAGEM 12.1
I Modu le ModuleI
2
Private Const sConnection As String = "Provider=SQLOLEDB.l " &"Password=password;" &_
3
4
"Persist SecurHy Info=True " &
5
"User 1D=sa'" &6
"InHial Catalog=CD;" &
"Data Source=(local)"
7
Dia 12
LISTAGEM 12.1
g
Sub Main()
10
Dim objConn As New System . Data.OleDb.OleDbConnection(sConnection)
11
End Sub
12 End Module
Nesse momento, voc criou o objeto de conexo e o carregou com os detalhes de seu sistema,
mas nenhuma comunicao real ocorreu com o serv idor do banco de dados. Para estabelecer o
vnculo com o banco de dados, preciso chamar o mtodo Open do objeto OleDBConnecti on:
objConn .Open()
Essa linha em particu lar a primeira que causar uma interao com seu banco de dados, e voc
deve inseri-l a em lima estrutura de tratamento de erros. A Listagem 12.2 mostra um exemplo
completo do estabeleci mento de uma conexo com um tratamento simples de erros.
LISTAGEM 12.2
1 Modu le Modu l eI
2
Private Const sConnection As String = "Provider=SQLOLEDB.l ;" &_
3
"Password=password;" &_
4
"Persist Secu rHy Info=True;" &
5
"Use r ID=sa'" &"InHial Catalog=CD ; " &
6
"Oata Source=(local)"
7
Sub Ma in()
8
Dim ob j Conn As New System . Data.OleDb .OleDbConnection(sConnection)
9
10
Try
11
ob jConn.Open()
12
Catc h myException As System.Exception
13
Conso le.Write Line(myException.Message)
14
End Try
15
Console . ReadLine()
16
End Sub
17 End Module
Para obter mai s infonnaes sobre o tratamento de erros, veja o Dia 6, "O Que Fazer Quando
Programas Bons Apresentam Problemas e para Se Certificar de Que Isso No Acontea". Se
voc quiser testar o cdigo por sua prpria conta, apenas crie um novo aplicativo do console
lIsando o Visual Basic .NET e insira esse cdigo em Modu l el. vb. Lembre-se de substituir Ovalor
de sConnect ion na Listagem 12.2 pela string que criou anteriormente nesta lio. Para ficar ainda mais di vert ido, lente alterar alguns valores da string de conexo, como a senha, para fazer
3 19
com que a tentativa de conexo falhe. Seu tratamento de erros deve produzir uma linha de sada
adequada mostrando o que houve de errado em seu programa.
Para essa tarefa especfica, abrir uma conexo, as classes SQLCl ient podero ser usadas com apenas algumas pequenas alteraes. Primeiro, remova a seo Provi der de sua string de conexo e,
em seguida, altere sua dec larao de objConn para que se refira ao objeto System.Data.SQLCl ient.SQLConnect i on em vez da classe OLEDS. A Listagem 12.3 mostra o cdigo completo, que
produz essencialmente o mesmo resu ltado.
LISTAGEM
12.3
1 Imports System
2 Module ModuleI
3
Private Const sConnection As String
sConnection" "Password"password;" &
4
5
"Persist Security Info'"'"True ; " &
6
"User ID=sa;" &
7
"Initial Catalog"CD;" &
8
"Da ta Sou rce" (loca 1)"
9
Sub Main()
10
Dim ob j Conn As New Data.SqlClient . SqlConnection(sConnection)
11
Try
objConn.Open()
12
Catch myException As Exception
13
14
Console .Wri teLine(myException .Message)
End Try
15
Console.ReadLine()
16
17
Eod Sub
18 End Module
Estabelecer urna conexo ser uma etapa inicial com um, mas sozinha ela no particularrnente
til; voc precisar de alguns outros objetos de banco de dados para comear a trabalhar com os
dados.
Dia 12
e nossa conexo, ento, tudo que precisamos criar uma nova instncia do tipo apropriado de
objeto de comando. Temos a opo de passar a instruo SQL e o objeto de conexo para o construtor quando criarmos o objeto (veja a Listagem 12.4) ou confi gur-los depois do fato (veja a
Listagem 12.5).
LISTAGEM 12.4
1 Modu le Modu l eI
2
Private Const sConnection As String = "Provider=SQLOLEDB.l;" &
3
"Password=;" &_
"User lO=sa;" &
4
"Initial Catalog=CDj" &
5
"Data Source=(local)"
6
7
Sub Main()
8
Dim sSQL As String
9
sSQL = "INSERT INTO CATEGORY (CategorylO , Category)" &
10
"VALUES (7 , 'El ectronic')"
11
Dim objConn As New _
12
System.Oata.OleOb.OleObConnection(sConnection)
13
Oim objCmd As New _
14
System.Oata .OleDb.OleDbCommand(sSQL, objConn)
15
Try
16
objConn.Open{)
17
Catch myException As System.Exception
18
Console . Wri teL i ne (myExcept i on. Message)
19
End Try
20
21
22
25
26
27
28
29
30
31
32
33
34
35
End Sub
36 End Module
LISTAGEM 12.5
321
Recuperando Dados
Se voc qu iser executar uma consulta SQL que retorne linhas de dados, como SELECT, ento, ter
de usar o mtodo ExecuteReader. Esse mtodo existe nas duas variaes dos objetos leitores e retorna 01 eDBDataReader ou SQLDataReader, o que for mais apropriado. Depois que o objeto leitor
tive r sido retornado, poder ser empregado na execuo de um lao pelos dados para recuperar
os va lores de alguns ou todos os campos e linhas no resultado de sua consulta. O objeto leitor
possui muitos mtodos e propriedades, mas os membros-chave so Read( ) e os mtodos de recuperao de conj untos de dados GetS t ri n9, GetDoub 1e, GetDa te Ti me alm de outros, todos utilizando um nmero ordi nal para indicar de que campo devem retornar seus dados.
O mtodo Read avana o leitor de dados para o prx imo registro e retorna um valor booleano indicando se alguma outra linha est disponvel. Depois que voc estiver em um registro (depois
que tiver chamado Read ( ), poder usar os vrios mtodos Get<t ipo de dados> para recuperar
os valores de campos individuais. O cdigo mostrado na Listagem 12.6 foi expandido para incluir a execuo de uma nova consulta SELECT e de um lao para percorrer e exibir os resultados
da consu lta no console.
LISTAGEM 12.6
1 Module Modu l eI
2
Private Const sConnection As String = "Provider=SQLOLEDB.l;" &
"Password= ; " &_
3
4
"Us er ID=sa'" &5
"Initial Catalog=CD; " &
"Data Source=(local)"
6
8
g
10
11
12
13
Sub Main()
Dim sSQL As String
sSQL = "SELECT ArtisLArtistID , " &"ArtisLArtistName, Disc.CDTitle "&
"FROM Artist INNER JOIN Disc ON "&
"ArtisLArtistIO '" Disc.ArtistID ; "
Dia 12
LISTAGEM 12.6
14
15
16
17
18
19
20
T,y
21
22
obj Conn .Open{)
Catc h myException As System.Exception
23
Console.WriteLine(myException.Message)
24
End Try
25
26
Console .Write("Pressione Return para executar SQL: {O}", sSQL)
27
28
Console . ReadLine()
29
If obj Conn .State = ConnectionState.Open Then
30
T,y
31
objReader = objCmd.ExecuteReader{)
32
Do While objReader.Read()
33
34
Console .Wri teLine( "{ O) (I)
(2 )",
objReader . Getlnt32(O) ,_
35
objReader . GetString(I) ,
36
objReader.GetString(2
37
Loop
38
Console . ReadLine()
39
Catch myException As System. Exception
40
Console.WriteLine{myExcepti on .Message)
41
42
Conso l e.ReadLine()
End Try
43
44
End I f
End Sub
45
46 End Module
Os leitores de dados so maneiras rpidas, apenas de leitura ordenada, de recuperar dados, mas
tambm so conjuntos de dados totalmente conectados. Isso significa que quando voc criar um
leitor de dados e executar um lao em suas lin has, cada linha ser recuperada diretamente do
banco de dados. Na verdade, enquanto estiver trabalhando com um leitor de dados, sua conexo
com o banco de dados estar ocupada e no poder ser usada para qualquer outro fim . Esse no
um grande problema e raz parte da razo principal pela qual esses leitores so to rpidos (nada
armazenado na memria do c liente), mas s vezes preciso obter dados que proporcionem um
323
pouco mai s de controle. Como alternativa aos leitores de dados, um modelo desconectado de trabalhar com os dados tambm est disponvel por meio dos DataSets.
Dia 12
objeto de conexo, exatamente como nos exemplos anteriores. Uma nova instncia da classe apropriada do adaptador de dados (OLEOB oU SQL) deve ser gerada a segui r. Use a instruo SQL
que quiser, ou um objeto de comando que se refira instruo SQL correta, e o objeto de conexo no construtor do adaptador de dados, e tudo estar configurado.
Oim sSQL As String
sSQl = "SE LECT Artist.ArtistIO, " &_
"Artist.ArtistName,Oisc.COTit1e "&
"FROM Artlst INNER JOIN Oise ON "&
"Artist.ArtistIO = Oisc.ArtistIO;"
Dim objConn As New 01eOb .01eObConnection{sConnection)
Oim objDataAdapter As New 01eOb.01eDbOataAdapter(sSQl , objConn)
J que voc quer preencher um dataset com o resultado de sua consu lta, um objeto DataSet tambm deve ser criado. Esta linha de cdigo gera uma instncia e rornece um nome para o OataSet
corno parte do construtor:
Oim objDS As New OataSet("CDs")
O mtodo Fi 11 de OataAdapter pode ser usado para carregar os dados no DataSet, mas para que
isso runcione, voc deve conseguir abrir o objeto de conexo:
objConn .Open{)
objOa taAdapter. Fi 11 (obj OS, "Di sc")
Depois que o cdigo anterior ror executado, uma tabe la ter sido criada dentro do OataSet com o
nome "Di se " e preenchida com os resu ltados de sua consul ta SQL. Aps a criao dessa tabela,
voc poder trabal har com se u contedo por meio do conjunto Tables de OataSet :
Conso 1e . Wri te l i ne(" {O} Rows", objOS. Tabl es ("D i se") . Rows.Count)
Mais deta, lhes sobre o acesso aos dados armazenados em um OataSet sero forneci dos ainda nesta lio. E interessante ressaltar que j que o DataSet um objeto desconectado, voc poderia ter
encerrado completamente a conexo com seu banco de dados antes de trabalhar com o contedo
de OataSet :
objOa taAdapter. Fi 11 (obj OS, "Di se")
objConn . Close()
Conso 1e . Writeli ne (" {O) Rows" , obj OS . Tab 1es (" Di sc") . Rows. Count)
O cdigo completo mostrado na Li stagem 12.7, com o tratamento de erros apropriado, usa um
OleDBAdapter para carregar o resultado de uma consulta SELECT em um novo objeto DataSet.
LISTAGEM 12.7
I Modu le Modu l eI
2
Private Const sConnection As String = "Provider=SQLOLEOB.I;" &
3
"Password=;" &"User IO=sa;" &_
325
(continuao)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Try
21
obj Conn. Open ()
22
23
Cateh myExcep tion As System.Exception
24
Conso1e.Writeline(myException.Message)
End Try
25
26
If objConn.State = Conneetio nState.Open Then
27
28
Try
29
obj Da taAdapter . Fi 11 (objOS , "Di se")
obj Conn. C1 ose ()
30
Conso 1e. WriteL i ne (" {O} Rows" , _
31
obj OS. Tab 1es ("Di se") . Rows. Count)
32
Cateh myExeeption As System.Exeeption
33
34
Console.Writeline(myExeeption .Message)
End Try
35
Conso1e.Readline()
36
End If
37
End Sub
38
39 Eod Module
Como em todos os exemplos demonstrados at agora nesta lio, voc pode executar esse cd igo por sua prpri a conta colocando-o em um mdulo de um novo ap licativo do console.
326
Di a 12
poni biliza dois conj untos que so particularmente te is: o conjunto Rows, que contm todos os
registras da tabela, e o conjunto Co 1umns, que possui um grupo de objetos DataCol umn descrevendo cada campo da tabela. O conjunto Rows pode ser empregado de uma entre vrias manei ras
para executar um lao atravs de todos os registras da tabela:
Usando um lao For Each
Dim objRow As DataRow
For Each objRow ln objTable . Rows
Console . Writeline(objRow . ltem("CDTitle"))
Next
Usando um lao For simples
Dim i As lnteger
Dim objRow As Da t aRow
For i = O To objTable . Rows.Count - 1
objRow = objTable . Rows{i)
Console . Writeline(objRow . ltem("CDTitle"))
Next
Qualquer um dos mtodos produz O mesmo resultado nesse caso. Cada registro da tabela representado por um objeto DataRow. Esse objeto conceder acesso a seus campos por meio da propriedade Item (na qual voc pode fornecer o ndice ou o nome do campo que deseja recuperar), e
tambm fornece vrias propriedades teis, como RowState, que retorna o estado de edio atua l
do registro.
O conj unto Col umns contm detalhes dos campos de DataTabl e, cada um representado como um
objeto DataCo 1umn. Por me io desse conjunto, e dos objetos contidos nele, voc obter todas as informaes sobre a estrutura de sua tabela. Como no conjunto Rows anterior, possvel executar
um lao atravs dos campos da tabela usando For Each ou For:
Dim objColumn As DataColumn
For Each objColumn ln objTable.Columns
327
LISTAGEM
1
2
3
4
12.8
6
7
8
9
10
11
12
For j = O To objTable.Columns.Count - 1
objCol = objTable.Columns(j)
Console .Wri te(" {O):{l) " ,
objCo l.ColumnName, _
objCol.DataType . Name)
Next
Console.WriteLine{)
13
14
15
16
17
18
19
20
21
For i = O To objTable.Rows.Count - 1
objRow = objTable.Rows{i)
For j = O To objTable . Columns.Count - 1
Console .Write("{O} " , objRow . Item{j
Next
Conso le.WriteLine()
Next
End Sub
Voc pode testar esse procedimento alterando o exemplo para carregar um DataSet que inc lua
lima chamada a esse novo procedimento, como mostro na Listagem 12.9.
LISTAGEM
12.9
A Funo DisplayTable
1 Private Const sConnec tion As Stri ng = "Prov ide r=SQLOLEOB .l; " &
"Password= ; " &
2
"Persist Security Info=T rue;" &
3
4
"User 10=sa ; " &_
"lnitial Catalog=CO;" &
5
"Data Source ={loca l )"
6
7
8 Sub Main()
Dia 12
LISTAGEM 12.9
9
10
11
12
13
14
15
16
17
18
19
20
21
Tcy
22
objConn,Open{)
23
Catch myException As System.Exception
2'
Console.WriteLine{ myException.Message)
25
26
End Try
27
28
If objConn.State " ConnectionState.Open Then
Tcy
29
objoataAdapter . Fi 11 (obj OS. "Di se")
30
31
objConn.Close()
32
Dim ob j Table As DataTable
ob j Table " objDS.Tables{"Disc")
33
3.
DisplayTable(objTable)
35
36
Catch myExcep tion As System.Except ion
37
Console .Writeline{myException .Message)
38
End Try
39
Console.ReadLine()
40
End I f
41
.2 'od S,b
o objeto DataRow importante; alm de ser o meio pelo qual voc acessa os valores do campo
(como foi feito na Listagem 12.8), ele tambm usado quando se edita, exclui e adiciona registros a um objeto DataTabl e. Na seo a seguir, aprenderemos a alterar o contedo de seu DataSet
usando tanto o objeto OataTable quanto OataRow.
329
Adicionando Registras
Depois de criar urna conexo, um adaptador de dados e carregar alguns dados em seu DataSet ,
voc poder acessar diretamente um objeto OataTable;
objOataAdapter . Fi 11 (objOS, "Di se")
Dim objTable As OataTable
objTable'" objDS.Tables("Disc")
Depois que tiver esse objeto Da ta Tab 1e, poder acessar seu contedo por meio do conjunto Rows,
que retornar um objeto DataRowCollection:
Dim drRows As DataRowCollection
dr Rows = objTable.Rows
Esse objeto representa todos os registras da tabe la como um conjunto de objetos DataRow. O prprio conjunto fornece um mtodo, Add, para criar novos registras. Esse mtodo pode ser chamado de lima entre duas maneiras: com um array de valores para o campo do novo registro ou com
um nico objeto OataRow representando as infonnaes a adicionar. O segundo mtodo, que
chamado COm um OataRow, requer urna mane ira de obter um novo objeto de linha que possua o
mesmo esquema (os mesmos campos, com os mesmos tipos de dados e tamanhos) do resto das
linhas da tabela, e o prprio objeto OataTable fornece esse recurso por meio do mtodo NewRow.
Voc ver um exemplo dos dois estilos nas Listagens 12.10 e 12.11 . A Listagem 12. 10 mostra o
uso de um array, que nos forar a conhecer a ordem dos campos e resultados em um cdigo que
mu ito menos claro que o segundo mtodo. A Li stagem 12.11 mostra o segundo mtodo - empregando um objeto DataRow.
Dia 12
LISTAGEM 12.10
5
6
7
8
10
11
12
13
14
15
LISTAGEM 12.11
5
6
7
8
10
II
12
13
14
Nos dois casos, os dados foram ad icionados tabela, mas isso no sign ifica que sero retornados
ao banco de dados. As alteraes efetuadas no banco de dados do servidor depoi s do momento
em que os dados foram carregados nesse DataSet poderiam impedi r que os registras adicionados
fosse m vlidos (voc poderia espec ificar um artista que tivesse sido excludo da tabe la Artist,
por exemplo), mas voc no veria esse tipo de erro at o estgio da atuali zao. J que est trabalhando em um estado desconectado, ou off-line, quando usa um OataSet, qualquer problema relacionado ao servidor no ser descoberto at que haja a tentativa de atual iz-Io.
331
Editando Registras
Editar regist ras seme lhante a adicionar; rrabalhase atravs dos objetos Da taRow que represen~
tam os registras da tabela. No caso da edio, no entanto, queremos trabalhar com um objelo DataRow existente, em vez de criar um novo como fi zemos na seo anterior, "Adicionando
Registros". Como nos exemplos anteriores, precisamos primeiro criar uma conexo, um coman
do, um adaptador de dados, e ento carregar os dados em um objeto OataSet para criar um objeto DataTable. Depois que tivennos esse OataTable, teremos acesso a seu objeto
DataRowColl eet i on, e estaremos prontos para comear a ed itar os registras.
objOa taAdapter. Fi 11 (obj OS. "Di se ")
Dim objTab1e As OataTable
objTable " objDS.Tables("Disc")
Dim drRows As DataRowCollection
Oim objRow As OataRow
dr Rows " objTable.Rows
objRow " drRows(S)
Cada objeto OataRow possui vrios mtodos que afetam diretamente a ed io: BeginEdit,
EndEdi t e Cancel Edi t. BeginEdi t e EndEdi t colocam o objeto DataRow dentro ou fora do modo de
edio, que um estado especial no qual a linha contm as informaes sobre a edio em progresso e, portanto, eventos de alterao no sero acionados para cada mod ificao de um campo. Voc aprender mais sobre os eventos de alterao ainda nesta li o, na seo "V inculao
de Dados". BeginEdi t opcional, mas indica sua inteno de maneira clara. E possvel acessar e
alterar os valores por meio da propriedade Itemusando o nome ou a posio do campo:
objRow . BeginEdit()
objRow("au_lname") " "Exciting"
objRow.EndEdit()
Quando EndEdi t for chamado, se Begi nEdi t tiver sido usado, as alteraes da linha sero confirmadas dentro do objeto OataTab l e, momento em que qualquer erro que tenha ocorrido durante a
edio se r lanado pelo ADO.NET. Sem a utilizao de BeginEdi t e EndEdi t, todos os erros
ocorrero no instante em que cada campo for ed itado.
Voc aprender a usar um DataSet contendo campos alterados, registros novos e at exclu dos, e
atualizar o banco de dados de origem posteriormente nesta lio.
Excluindo Registras
A excluso de um registro em uma tabela de dados efetuada pelo mtodo Delete do objeto DataRow em questo. Isso sim ples de fazer, mas h um problema com o qual se preocupar. O mtodo Oelete marca a linha como excl uda, mas, na verdade, no remove o objeto OataRow de
DataRowColl eet i on. Isso crt ico porq ue permite que o objeto no seja excludo e fornece as informaes necessrias para atualizar o banco de dados de origem excl uindo esse registro quando
ele estiver novamente na tabela original. H outros mtodos, Remove e RemoveAt, da classe Oata-
Dia 12
RowCollection, que realmente removem o objeto OataRow especfico do conjunto. Usar Remove
ou RemoveAt ser adequado quando voc empregar um objeto DataTabl e sem um banco de dados
de back-end, mas se a inteno for usar todas as alteraes feitas no objeto DataSet para atualizar
a(s) tabela(s) de origem, ser preciso utilizar o mtodo Delete.
A Li stagem 12.12 fornece o exemplo de um lao em uma tabela, que localiza certas linhas especficas e, em seguida, as exclu i. Nenhuma dessas excluses afetaros dados da fonte, o SQL Server, por exemplo, at que voc atualize o servidor.
LISTAGE M
1 Modu le ModuleI
Private Const
2
3
sConnection As String"
4
"Provider"SQLOLEOB.l;" &
5
"Password"i" &_
6
"Pers i st Security Info"True;" &
7
"User ID=sa ; " &_
8
"Initial Catalog"CD; " &
g
"Oata Source"(local)"
10
11
Sub Main()
12
Dim sSQL As String
13
sSQL " "SELECT ArtistIO, DiscID, CDTitle From Oisc"
14
15
16
17
18
19
2D
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim objConn _
As New OleOb.OleDbConnection(sConneetion)
Dim ob j OataAdapter _
As New OleOb . OleDbOataAdapter(sSQL , objConn)
Dim objOS _
As New OataSet("COs")
Try
ob j Conn . OpenO
Catch myException As System . Exception
Console . WriteLine(myExeeption.Message)
End Try
If objConn.State " ConnectionState.Open Then
Try
objOataAdapter . Fil 1 (objOS. "Di se")
objConn. Close ()
Oim objTable As OataTable
objTable " objOS.Tables(UOise")
Dim drRows As OataRowCollection
Dim objCurrentRow As DataRow
333
LISTAGEM 12.12 O Mtodo Oelete Marca uma linha como Excluda (continuao)
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
drRows
objTable . Rows
OisplayTable{objTable)
Console.Write{"Se pretende exclu ir . press ione return para iniciar!")
Console.Readline()
For Each objCurrentRow ln drRows
If CType{objCurrentRow{HArtistIO"), Integer)
obj CurrentRow.Delete()
End If
Next
3 Then
End Sob
Sob DisplayTable{ByRef objTable As DataTable)
")
")
Dia 12
LISTAGEM 12.12
Console.Write("[New]
")
81
Case DataRowState.Unchanged
82
")
Console.Write("[Unchanged]
83
[nd Selec t
84
For j = O To objTable.Columns.Count - 1
85
If objRow.RowState <> DataRowState . Deleted Then
86
Console .Write( "{O) ",
87
objRow.Item(j))
88
Else
89
Console.Write{"{O) ", 90
91
objRow.Item(j, DataRowVersion.Original)
92
End If
93
Next
94
Console.WriteLine()
95
Next
96
End Sub
97
98 Eod Module
Observe que na linha 90, dentro da rotina DisplayTable, uma sintaxe diferente foi usada para
acessar o valor de um campo. Pela incluso do segundo parmetro, DataRowVersion.Origina l ,
esse cdigo especifica que o valor do campo aps a atualizao mais recente, ou no momento em
que for carregado, deve ser exibido em vez do valor do cam po atual (o padro). Nesse caso, isso
particu larmente importante porque uma linha exclu da no possui valores vlidos para o campo atual, e um erro ser gerado se voc tentar acess-los.
335
Novo
TERMO
LISTAGEM
Dia 12
o: o primeiro espao reservado foi vinculado ao primeiro parmetro. Depois que o objeto de
parmetro foi criado, o campo e sua verso correspondentes fo ram especificados nas linhas 5 e 6.
J que estamos lidando com lin has excludas aqui, exatamente como na Listagem 12. 12 anterior,
importante espec ificar SourceVers i on. A verso-padro a do valor atual (Da taRowVers i on. Cu r rent), que no est disponvel para uma linha excluda. A ltima etapa que voc ter de executar
antes do comando ser usado pelo adaptador ser atribu-lo propriedade DeleteCorrmand:
objOataAdapter . DeleteCommand ; objOeleteCommand
A Listagem 12.15 mostra um exemplo completo e muito extenso que cria uma conexo com o
banco de dados e um adaptador e, em seguida, configura os comandos individuais para Upda teConmand, Oe 1eteComnand e I nsertConmand. Por fim, para testar esses comandos, um dataset criado, carregado com dados e alterado e, depois, a fonte de dados atualizada pelo mtodo Update
do adaptador.
LISTAGEM
1 Module ModuleI
2
Private Const
3
sConnection As String =_
4
"Provi der;SQLOl EDB . I: 'o &
5
"Password;;" &
6
"Persist Security Info=True;" &
7
"User ID=sa;" &_
B
"Initial Catalog;CO ; " &
g
"Data Source=(local)"
10
11
Sub MainO
12
Dim sSQl As String
13
sSQl = "SElECT ArtistID. ArtistName From Artist"
14
Dim objConn _
15
As New OleOb.OleDbConnection(sConnection)
16
Dim objOataAdapter _
17
As New OleOb.OleObOataAdapter(sSQL. objConn)
18
Dim ob j OS _
19
As New OataSet("Artists")
20
Dim objOeleteCommand _
21
As New OleOb.OleDbCommand()
22
Dim objUpdateCommand _
23
As New OleOb.OleObCommand()
24
Dim objInsertCommand _
25
As New OleOb.OleDbCommand()
26
Dim sDeleteSQL As String
27
Dim sUpdateSQL As String
28
Dim sInsertSQL As String
LISTAGEM 12.15
29
30
sDeleteSQL
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
objDataAdapter.DeleteCommand
sUpdateSQL
objDeleteCommand
? " &
objUpdateCommand.Connection = objConn
objUpdateCommand.CommandText = sUpdateSQL
ob j Param
53
54
55
56
57
58
59
objDataAdapter.UpdateCommand
objUpdateCommand
60
61
62
63
64
65
66
67
68
69
70
71
sInsertSQL
337
Dia 12
LISTAGEM 12.15
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Try
objConn.OpenO
Catch myException As System.Exception
Console.WriteL i ne{myException.Message)
End Try
Try
Oim sNewArtistSQL As String
sNewArtistSQL " "INSERT INTO Artist " &
"(Art istID, ArtistName, " 8o~
"ArtistFirstName. ArtistLastName)" 8o~
"VAlUES (11. 'Wei rd Al Yankovich' , " &
" 'A l ' , 'Yankovich')"
Oim objNewArtistCmd ~
As New OleDb.OleDbCommand(sNewArtistSQL , objConn)
objNewArtistCmd . ExecuteNonQuery()
Catch e As Exception
'Pode causar um erro porque
'Art istIO ' 11 j existe
'Mas se ocorrer, ser correto.
Console . WriteLine(e.Message)
End Try
103
104
105
106
107
108
109
110
111
112
113
114
LISTAGEM 12.15
115
116
DisplayTab l e(objTable)
117
11B
119
120
121
122
123
124
125
126
127
12B
129
11
130
131
132
133
134
135
136
137
13B
139
140
14 1
142
143
144
145
146
147
14B
149
150
151
152
153
154
155
156
157
"John Doe"
339
Dia 12
LISTAGEM 12.15
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
For j = O To objTable.Columns.Count - 1
objCol " objTable . Columns{j)
Console.Write{"{O}:{l} ",
objCol .Col umnName, _
objCol.oataType.Name)
Next
Console.WriteLine{)
For i " O To objTable.Rows.Count - 1
objRow " objTable.Rows(i)
Seleet Case objRow.RowState
Case OataRowState.Oeleted
Console .Write{"[Oeleted]
")
Case OataRowState.Modified
Console.Write ("[Modified]
")
Case OataRowState.New
")
Console .Write{"[New]
Case OataRowState.Unchanged
")
Console .Writ e{ "[Unehanged ]
End Seleet
For j " O To objTable.Columns.Count - 1
If objRow.RowState oataRowState.Oeleted Then
Console .Write(" {O} ".
obj Row. Item(j))
341
o cdigo da Listagem 12.15 est disponvel para download no site deste li vro na
Web, portanto, no necessrio digit-lo a menos que voc queira mesmo faz- lo. A
primeira seo do cdigo est bem dentro do padro utilizado em todos os outros escritos nesta lio. A string de conexo foi criada, devendo ser substituda pelos valores apropriados para seu
sistema, e usada para instanciar um novo objelO 01 eDBConnec t i on (l inha 14).Um objelO 01 eDB OataAdapter e um OataSet tambm foram gerados e inicializados para tomar possvel se conectar com o banco de dados e retornar os resu ltados da instruo SELECT para seu programa. Como
parte do cdigo de inicial izao, trs novos objetos 01 eDBCorrrnand tambm foram criados c sero
em pregados na representao dos comandos UPDATE, DELETE e IN$ERT para 0leD8DataAdapter.
No entanto, esses objetos de comando no foram realmente gerados nesse ponto; essa etapa manipu lada confomle cada comando vai sendo configurado posterionnente.
ANALISE
Dia 12
esquema bsico (informaes sobre o campo) e incluirtambm infonnaes sobre a chave pri ~
mria. A segu ir, na linha 108, o DataSet carregado com os dados pelo mtodo Fi 11 e com um
parmetro adicional para especi fi car o nome da tabela rec m ~criada, 'Artist' .
Apenas para se certificar de que est claro que esse um processo desconectado, fi linha I09 en~
cerra a conexo com o banco de dados antes que a verdadei ra manipu lao de dados ocorra. De~
pois desse ponto, o cdigo exclui, altera e adiciona registros ao objeto DataTab1e para fornecer
um teste de todos os trs tipos de ed ies que podem ocorrer em um DataTabl e. Para encontrar a
linha correta a exc luir (linha 123) e editar (linha 152), o mtodo Find do objeto DataRowColl ec tion usado. Esse mtodo retorna um objeto DataRow dado um valor de chave primria vlido
para pesquisa, um processo que requer que o objeto DataTab 1e tenha informaes sobre a chave
primria (le ia o pargrafo anterior para obter uma explicao de como a linha 106 fornece essa
informao).
Para concluir, depois de todas as edies, a linha 164 usa o mtodo Update de 01 eDBDataAdapter
para aplicar todas as alteraes de dados ao DataSet. Esse mtodo usa um DataSet como parmetro, junto a uma string indicando que tabela dentro do Da taSet deve ser utilizada para atualizar o
banco de dados. Se o nome da tabe la no for fornecido, o adaptador tentar atualizar o banco de
dados com todas as tabelas disponveis.
O resultado desse cdigo deve ser uma seqnciade instrues SQL executadas em um banco de
dados, cada uma correspondendo a um dos comandos do adaptador. Se voc estiver usando o
SQL Server e quiser ver o que acontece, poder empregar o Profiler para observar todos os comandos sendo processados no serv idor enquanto esse cdigo estiver em execuo. Fornecer detalhes sobre como utilizar o Profiler est alm do escopo deste livro, mas o resultado deve ser
semelhante ao mostrado a seguir:
exec sp_executesql
N'DELETE FROM Artist WHERE ArtistID
90
exec sp_executesql
N' INSERT INTO Artist (ArtistID, ArtistName) VALUES (@P l, @P2)' ,
N'@Pl int ,@P2 char(l2)', 4D, 'Kent Sharkey '
90
Nesse exemplo, s um registro fo i inserido, alterado e excludo, mas o mtodo Upda t e simplesmente chamaria os comandos apropriados para cada registro alterado.
343
Dia 12
11
12
13
14
15
16
17
18
19
20
21
Sub Main()
Dim sSQL As String
sSQL" "SELECT ArtistlD. ArtistName From Artist"
Dim objConn _
As New OleOb.OleObConnection(sConnection)
Dim objDataAdapter _
As New OleOb.01eObDataAdapter{sSQL. objConn)
Dim objCommandBui1der _
As New OleOb.OleObCommandBuilder(objOataAdapter)
Dim objDS _
As New DataSet("Artists")
22
23
24
25
26
27
Try
obj Conn. Open ()
Catch myException As System.Exception
Conso1e . Writeline(myException.Message)
End Try
28
29
30
31
32
33
34
35
36
37
38
39
40
objConn. C1 ose ()
Dim objTable As DataTable
objTab1e" objOS.Tables("Artist")
Dim drRows As OataRowCollection
Dim objCurrentRow As DataRow
drRows " objTab1e.Rows
41
42
DisplayTable(objTable)
43
345
44
45
46
47
48
49
50
51
52
53
54
55
DisplayTable{objTable)
56
57
objConn.Open{)
ob j OataAdapter . Update (obj OS , "Art i s t")
58
59
60
61
62
63
64
65
66
67
68
69
70
End 11
End Sub
Sub DisplayTable(ByRef objTable As DataTable)
Dim objRow As OataRow
Dim objCol As OataColumn
Dim i , j As Integer
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Dia 12
LISTAGEM 12.16
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Como em todos os exemp los desta lio, esse cdigo poderia ser mod ificado para trabalhar com
as classes SQLCl i ent precisando apenas de algumas alteraes menores. A string de conexo te~
ria de ser alterada pe la remoo da seo Provi der, e todos os objetos declarados como classes
01 ED8 precisariam ser substitudos por seus equivalentes SQLCl i ent .
Como exemplo dessa situao, a Listagem 12.17 cria uma conexo com o banco de dados e car~
rega as tabelas Artist e Disc em um novo DataSet. Depois que tudo for carregado, um relaciona~
menta ser estabelecido ent re as duas tabelas.
1 Modu le ModuleI
2
3
Private Const
4
sConnection As String =_
5
"Provider=SQLOLEOB.l;" &_
6
"Password=321dweksp302axn ; " &
7
"Persist Secu r ity Info"'True;"
8
"User ID"'sa ; " &
9
"Initial Catalog=CD;" &
10
"Data Source=(local)"
11
12
Sub MainO
13
Dim sSQLArtist As String
14
Dim sSQLDisc As String
347
Fonte de Dados
&
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
objOataAdapterArtist.MissingSchemaAction '"
MissingSchemaAction . AddWithKey
objOataAdapterOisc.MissingSchemaAction '"
MissingSchemaAction.AddWithKey
32
33
34
35
36
objOS . Rel ati ons . Add ("Oi scArti s t" '_
37
objOS . Tab 1es ("Arti st") .Col umns ("Arti stIO"). _
38
objOS. Tabl es (" Oi sc") .Col umns ("Art i stIO"
39
End Sub
40 End Module
Com os relacionamentos definidos, possvel usar essas infonnaes para perm iti r o acesso estruturado de uma Iinha de dados-pai a qualquer Iinha relacionada com ela na tabela-filha. O cd igo da Listagem 12.18, que pode ser adicionado no local exato que antecede o final do
Dia 12
procedimento da Listagem 12. 17, executa um lao por meio dos registros da tabela Artist e exibe
os CDs associados a esse artista.
LISTAGEM 12.18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A parte essenc ial do cdigo desse exemplo est na linha 9, em que o mtodo GetChi 1dRows do
objeto DataRow usado para retornar um array de DataRows da tabela-filha. Esse array inclui todas as linhas da tabela-filha em que os campos Art i stlO da tabela-pai e da fil ha tm uma correspondncia.
Visualizaes
1 Modu le ModuleI
2
Private Const
3
sConnection As String =_
4
"Provider=SQLOLEOB.l;" &_
5
"Password= ; " &
6
"Persist Security Info"True " &
7
"User ID"sa ; " &_
8
"Initial Catalog=CD;" &
9
"Data Source"(local)"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub Main()
Dim sSQLArt i st As String
sSQLArt i st" "SELECT ArtistID , ArtistName From Artist"
Dim objConn _
As New OleDb.OleObConnection{sConnection)
Dim objDataAdapterArtist _
As New OleDb.OleObDataAdapter(sSQLArtist, objConn)
Dim objDS _
As New DataSet{"CD")
objDataAdapterArtist.Missi ngSchemaAction "
MissingSchemaAction . AddWithKey
objDataAdapterArtisLFill (objOS , "Artist")
Dim objDR As DataRow
Console.WriteLine{"Na tabela " )
For Each objOR l n objDS . Tables("Artist") . Rows
Console.W r it eLine{" {O} {l}" ,
obj OR{"ArtistID"J._
objOR{"ArtistName"
Next
Dim objDV As OataView
objOV "New OataView{objDS.Tables("Artist"
objOV . Sort" "ArtistName"
objOV . RowFilter" "ArtistIO < 8"
36
37
38
39
40
41
42
43
44
349
Dia 12
LISTAGEM
(continuao)
45
End Sub
46 End Module
At a linha 22 no temos nada to diferente dos outros exemplos que vimos at aqui: uma conexo
com o banco de dados foi aberta, e os dados foram carregados em um DataSet. Depois do carregamento de dados, um lao rpido (linhas 26 a 30) os exibiu sem dar a impresso de que percorreu
um objeto DataView (na verdade percorreu a visuali zao de dados-padro). Em seguida, um objeto OataView foi criado e configurado com uma ordem e um filtro sobre os valores das linhas (linhas
32 a 35). Para concluir, esse objeto Da ta Vi ew foi usado para acessar as linhas (linhas 39 a 43), dessa
vez exibindo-as aplicando sua ordem e filtro. O resultado desse cdigo, presumindo que voc tivesse feito todos os exemplos at este ponto, deve se parecer com o apresentado a seguir:
Through Table
1 Natalie Imbruglia
2 The Trag ica ll y Hip
3 Sting
4 Queen
5 Soney M.
6 Sarenaked Ladies
7 Kent Sharkey
8 Janet Jackson
9 Matchbox Twenty
10 Madonna
40 Kent Sharkey
Through DataView
6 Barenaked Ladies
5 Soney M.
7 Kent Sha rkey
1 Natalie Imbruglia
4 Queen
3 Sting
2 The Tragically Hip
Mesmo se sua sa da no estiver exatamente igual ao texto anterior, observe que na li sta Through
Table, I I linhas foram exibidas por ordem de identificao do artista. Em Through DataView, as
linhas foram acessadas por me io da visuali zao recm-criada, e o resultado reflete tanto o filtro
quanto a ordem.
Vinculao de Dados
A vinculao de dados fornece lima maneira de associar um elemento da interface com o usuri o, como uma grade, a uma fonte de dados, como um objeto OataTable ou DataSet. Depois que
351
um elemento da interface vinculado a uma fonte de dados, as alteraes nessa fonte sero refletidas na interface com o usurio, e as que afetarem os dados por meio da interface sero, por sua
vez, retornadas fonte de dados. Para o desenvolvedor, a vinculao de dados resolve todos os
problemas comp lexos de manipular as interaes do usurio com os dados e elimina a necessidade de escrever um cdigo extenso apenas para fornecer um meio de o usurio interagir com seus
dados. Um recurso interessante e poderoso da vinculao de dados da plataforma .NET que ela
no limitada a trabalhar com DataSets. Na verdade, uma ampla variedade de objetos pode usar
a vincu lao de dados, incluindo Arrays, Coll ecti ons, OataVi ews, OataSets, OataTabl e e outros.
Em nossos excmplos, trabalharcmos apenas com DataSets, OataVi ews e OataTables, mas existe
o potencial para vincular todo tipo de informaes
NOTA
Quando um objeto DataSet ou DataTable vinculado a um controle da interface com o usurio, a vinculao na verdade se d com a visualizao-padro
(objeto DataV iew ou DataSetView) de DataTable ou DataSet.
No universo da plalafonna .NET, dois lipos principais de interfaces com o usurio podem ser
criados: o cliente Windows sofi sticado (System. Wi ndows. Fonns) e o cl iente da Internet WebFonns.
Os detalhes da vinculao sero abordados na prxima seo junto a um exemplo passo a passo
ocorrendo entre um dalasel e uma grade. A vinculao de dados nos fonnulrios da Web e o
acesso geral aos dados do ASP.NET no sero detalhados nesta lio.
Vinculao Simples
Os controles que do suporte vinculao simples expem um conjunto DataBindi ngs que pode
ser usado para vincu lar as propriedades a campos de dados. A Listagem 12.20 fornece um exemplo desse tipo de vinculao de dados como parte de um aplicativo com formulrios Windows.
Para voc testar esse cdigo, crie um novo aplicativo Windows no Visual Basic e insira apenas
uma caixa de texto e um boto no formulrio. Deixe os contro les com seus nomes-padro (textboxl e Buttonl) e inclua esse cdigo no evento Cl;ck do boto.
Dia 12
LISTAGEM 12.20
12
13
14
15
16
17
18
19
20
21
22
23
Try
24
25
26
27
28
objConn.Open()
Catch myException As System.Exception
Windows . Forms.MessageBox.Show(myException.Message)
End Try
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
353
Alm do trecho inteiro de cdigo que voc j conhece (linhas I a 34) abrindo a conexo com o
banco de dados e obtendo um DataSet, a linha no final do procedimento (linha 37) que realmente cria a vinc ulao de dados. O mtodo Add do conjunto Da taB i ndi ngs perm ite a especificao de uma propriedade do controle e da fonte de dados (nesse caso a visuali zao de
dados-padro da tabela). Depoi s que isso for feito, o valor do campo Arti stName ser exibido
(veja a Figura 12.6).
Isso no to til assim, considerando que voc est visualizando s o primeiro registro e no
tem COmO se mOver para a frente ou para trs atravs dos dados. Para fornecer uma funcionalidade como essa quando voc usar a vincu lao simples de dados, ser preciso aceS5ar o conjunto
BindingContext do formu lrio-pai. Ao especificar a fonte de dados na qual est interessado,
voc poder obter um objeto Bi nd i ngContext para ela.
FIGURA 12.6
,I!I'"..,.'
IIIII(JEI
No exemplo a seguir, a fo nte de dados original no uma varivel no nvel do formulrio, portanto, o cdigo a acessa percorrendo o conjunto DataBi nd ; ng5 da caixa de texto. S h uma vinculao de dados, assim, especificar um ndice igual a zero retornar somente a fonte de dados
disponvel. Com esse objeto de contexto, se tem acesso a vrias propriedades e mtodos para criao de uma interface que trabalhe com os dados vincu lados. Uma propriedade em particular, Position, til porque perm ite que voc se mova para a frente e para Irs atravs dos dados
conforme desejar. Se adicionar um segundo boto ao formulrio e inserir um cd igo nele, voc
ter a capacidade de se mover para adiante na lista de arti stas. Observe que no h nenhum recurso avanado nesse cdigo; ele ser interrompido se voc tentar ultrapassar os dados disponveis:
Private Sub button2_Click(ByVal sender As System .Dbject ,
ByVal e As System.EventArgs)
Handles button2.Click
Me.Binding Context(text Boxl .DataBindings(O).OataSource).Pos i tion += 1
End Sub
Esse objeto de contexto expe outros recursos como AddNew e CancelCurrentEdit, tornando-o
um objeto com o qual voc trabalhar freqUentemente.
Dia 12
354
Vincular controles a uma fonte de dados inteira, em vez de a um nico campo, chamado de vincu/acio complexa de dados. Esse tipo de vinculao de dados tem su-
porte de dois dos controles que vm com o Visual Stusio .NET, DataGrid e ComboBox. Para
configurar a vinculao de dados com um desses controles, voc definir a propriedade Oata-
Source do controle com o objclO apropriado (DataView neste caso, mas poderia ser Array, Col lect;on, DataSet e outros). Se OataSource tiver mais de um objeto que puder ser vinculado
(como um DataSet com mais de uma tabela), ento, especifique o item apropriado como um vaIar ai fanum rico na propriedade Da taMember. Portanto, se vincular DataGri d a um Da taSet, ter
de fornecer o nome da tabela como a propriedade DataMember. Ocd igo para faze r isso seria idntico ao da Listagem 12.20, exceto pelo fato de ser preciso substituir as linhas 36 a 38 pe las descritas a seguir:
dataGr idI.OataSource
dataGridI .OataMember
=
=
objDS
"Disc"
Para que voc mesmo teste a vincu lao complexa, crie um novo apl icativo Windows e insira
um boto e um controle OataGrid no fonnulrio (os dois esto disponveis na caixa de ferramentas). Deixe tudo com os nomes-padro e insira o cdigo da Listagem 12.20, incluindo as alteraes descritas anteriormente no evento Cl i ck de seu boto. Como resultado desse cdigo, depoi s
que o boto for clicado, o controle OataGrid ser vinculado a ele e, portanto, exibir a tabela
Artists de se u DataSet. Seu fo rmulrio pode no ter exatamente a mesma aparncia da Figura
12.7, mas deve ficar semelhante.
FIGURA 12.7
::!I''''''''
"filEi
Um COIIII'o/e DataGrid
cria 1/m ambiente de
aparllcia profi ssiollal
sem ser necessria
milita codificac7o.
Resumo
o acesso a dados fo i totalmente redesenhado paraa plataforrna .NET, mas ainda d suporte a tecnologia subjacente do OLEDB. Usando os provedores de OLEDB (drivers), voc poder criar
cd igos que sero executados em quase todos os bancos de dados necessrios, sendo prec iso
apenas aprender uma manei ra de programar aplicvel a todos eles. Empregando a natureza desconectada dos DataSets, possvel gerar sistemas comp letamente interativos que no ocupem
355
conexes vai iosas com os bancos de dados. Ao construir interfaces reais com o usurio, a vinculao de dados lhe proporcionar uma maneira rpida e fcil de exibir seus dados em um form ulrio Windows.
P&R
P Em todos os exemplos desta lio, minha string de conexo estava embutida em cdigo. J que ela inclui minha identificao de usurio e senha, isso no me parece muito
seguro.
R Excelente observao. Nos cdigos desta lio, a string de conexo foi inserida diretamente no arquivo. vb, que bem pouco seguro. Uma idia melhor, quando voc no est iver apenas desenvolvendo exemplos, seria inserir o valor da string de conexo no
Registro ou em um arquivo de configuraes no disco. Isso fei to no s por razes de
segurana; no inserindo sua string de conexo no cdigo, ser possvel a lterar os parmetros da conexo com o banco de dados, assim como de outras conexes, sem recompilar seu sistema.
Workshop
o Workshop foi planej ado para aj ud-l o a antecipar poss veis dvidas, revisar o quej aprendeu
e comear a pensar em como colocar se u conheci mento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I . Que propriedade voc precisa configurar (e com que valor) para forar o adaptador de
dados a criar informaes sobre a chave primria quando carregar os dados em um OataSet?
356
Dia 12
2. Qual a diferena entre o mtodo Del ete de um objeto DataRow e o mtodo Remove do ohjeto Da taRowCo 11ec t i on?
Exerccos
I. Crie um aplicativo Windows que use as classes que voc aprendeu nesta lio para rorne
cer uma interface com o usurio que visualize, altere, adicione e exclua itens de seu banco de dados de CDs.
SEMANA
DIA
Usando o Server Explorer
Um dos principais objetivos de um ambiente integrado de desenvolvimento (IDE - lntegrated
Developrnent Environrnent) fornecer fe rramentas que no esto dispon veis para os desenvolvedores que usam compi ladores de linha de comandos com um ed itor de texto. Elas podem ser
recursos aperfeioados de ed io e depurao - ferramentas que permitem aos programadores
desenvolver cdigos melhores e mais rpidos. Um bom IDE tambm pode incluir recursos que
ajudem os desenvolvedores a gerar cd igos sem que seja preciso escrev-los. Os suplementos e
assistentes que fazem parte do IDE do Visual Basic .NET so lodos desse tipo. O Servcr Explo-
rertambrn se encontra nessa categoria. Ele um recurso do Visual Basic .NET que proporciona
um controle fci l dos vrios servios que compem o sistema operacional. Alm disso, ele permite que o desenvolvedor crie rpida e comodamente cd igos para usar esses servios. Nesta lio, aprenderemos
Dia 13
358
pesquisar pastas em um disco rgido ou site da Web, disponibiliza a pesquisa em vrios servido
res de sua rede e a visualizao dos servios que esto em execuo ne les. Alm disso, voc pode
controlar ou escrever um cdigo para usar alguns servios, tudo a partir do Server Explorer. Ele
pode ser visto na Figura 13.1. Se no est iver visvel, pode ter sido fechado anteriormente. Abrao
selecionando View e Server Explorer no menu.
FIGURA 13.1
O Se/Ter Explorer.
(II . .,.,.
1/>/100'
""'.. ,"""_~
1131100"' _ _--.,
o Server Explorer apresenta uma Iista hierrqu ica dos servios disponveis no computador selecionado. Por padro, ele s exibe os serv ios que se encontram no computador de desenvolvi-
mento, mas voc poder adicionar outros quando necessrio. Esses podem ser divididos em duas
amplas categorias:
Conexes de dados
E semelhante ao ambiente de dados disponvel no Visual Basic 6
(presumindo que voc tenha usado essa verso). Permite a conexo e visualizao dos
bancos de dados sem ser necessrio sair do ambiente do Visual Basic .NET. Este recurso
possui algumas fina lidades bv ias caso voc tenha de desenvolver uma programao extensa para acessar e atualizar os bancos de dados, que um dos principais usos no Visual
Basic .NET.
Servidores
Esta a lista de servidores com os quais voc est conectado e os servios
que esto em execuo (ou disponiveis) em cada um deles. As informaes desta seo
incluem a capacidade de acessar os registras de eventos e a monitorao do desempenho
nesses computadores, assim como outros servios, por exemp lo, filas de mensagens, o
SQL Server e assim por diante.
Usaremos o Server Explorer nesta lio concentrando-nos em duas de suas principais funes:
visual izao de informaes e desenvolvimento de programas.
359
o Que um Servio?
NOVOTeRMO
para complementar Osistema operac ional. Esses recursos podem inclui r programas
que trad icionalmente so considerados servidores, como servidores de bancos de dados (por
exemplo, o Microsoft SQL Server), servidores Web (como o Microsoft IIS) ou servidores de correio
(como o Microsoft Exchange). Como altemativa, o servio pode fomeceralgum recurso adicional que
outros programas podem utiliZc1r, como a monitorno do desempenho ou o registro de eventos. O
Windows 95, o 98 e o ME fornecem muito menos servios do que o Windows NT ou o 2000.
Em geral os servios possuem um programa que usado na visual izao de informaes sobre
ele. Por exemplo, o Event Viewer permite que voc visualize os registros de eventos de um computador, ou o SQL Server Enterprise Manager dispon ibiliza a visualizao e administrao de
um SQL Server. O Server Exp lorer complementa essas ferramentas permitindo a utilizao dos
servios sem ser necessri o sair do IDE.
Examinando os Servios
Para visualizar o Server Explorer, selec ione-o no menu View. Por padro, ele aparecer no lado
esquerdo do IDE. Como acontece com outras telas, ele pode ser 'mant ido aberto' ou configurado
para des lizar automaticamente para fora do cam po visual quando no for mais necessri o. Em
um computador que estiver executando o Windows 2000 com o Microsoft SQL Server instalado, ele aparecer como mostrado na Figura 13.2. Em outro computador, com servios diferentes
instalados, esses provave lmente aparecero.
.
FIGURA 13.2
O Se/wr ExploreI'.
_~_
aJ li ' ,.;:
e-_
t"O
II QII J -.
...... v_ - - - !o* _ _
t.'09
e. .,. .. : . Q.
-..
...-. ...,..
,,,....,,,
""" ''''''
,~,
OIIII}(>(I,
o" ........... ,
~'"""._
01111'00'
./lI'O'>I
Dia 13
360
FIGURA 13.3
VislIali=alldo conexes
a_
II!.' .c IJQ
--
"'0/2001
tn/>OO l
....... 'T...
tIl0/2001
TC",,,,"".
tI1I>OOl
....... . ,,," ,, _
.... , 6"'"
Em princpio, s um link, Add Connection, deve estar disponvel na pasta Data Connections.
Dar um cliq ue duplo nessa opo trar a caixa de dilogo Data Link Propel1ies (veja a Figura
13.4). Essa caixa de dilogo permitir que voc configure uma nova conexo de dados. As opes que so selec ionadas nessa cai xa variam dependendo do tipo de dados com os quais se quer
coneclar. As configuraes esto divididas entre vrias guias da caixa de dilogo.
A g uia Provider usada para selecionar o provedor que ser empregado na conexo com o banco
de dados. Dependendo de quais provedores voc tiver instalado, pode haver muitas opes. A
Figura 13.4 mostra os provedores disponveis em minha mqu ina.
FIGURA 13.4
Prol'edores ins/alados
361
Alguns dos provedores mais usados para o acesso aos dados so:
Dependendo do provedor que voc selecionar nessa etapa, diferentes opes estaro d isponveis
nas outras guias. A Tabela 13. 1 resume as opes disponve is na gu ia Connection.
TABElA 13. 1
Campo
Provedor
Finalidade
Access
User name
Todos
Password
Todos
SOL Server
SQL Server
J que o SQL Server pode conter vrios bancos de dados, este campo identifica com qual
dos existentes no servidor se conectar. As guias
Advanced e Ali raramente so usadas. A guia
Advanced contm configuraes que a maioria dos usu ri os no precisa definir, baseadas
no provedor selecionado. A guia Ali apenas
outra maneira de acessar todas as propriedades. Em vez de ter vrios campos para editar,
essa guia uma lista de todas as propriedades, que voc pode editar.
Test Connection
Todos
Este boto permite que voc teste os parmetros da conexo. Isso far com que o IDE tente
se conectar com o banco de dados. Uma conexo bem-sucedida garantir que o banco de
dados possa ser acessado.
Dia 13
362
Depois de inserir todas as informaes necessrias para acessar seu banco de dados, d um clique no boto Test Connection para confirmar. Se o resultado for uma caixa de dilogo exibindo
' Test Connection Succeded ', d um clique em OK para fech-la e continuar. Caso contrrio, a
caixa de dilogo deve sugerir uma mane ira de corrigir o erro (em geral a causa a falta de definio de lima configurao em algum local). Corrija o erro e teste a conexo novamente.
Depois de se conectar a um banco de dados, ele deve aparecer na seo Data Connect ions do Server Exp lorer. Dependendo de seu tipo, a entrada possu ir vrias sees . A Figura 13 .5 mostra os
itens existentes para alguns dos tipos de bancos de dados disponveis.
A Tabela 13.2 descreve os tipos de itens que voc deve ver para os diversos bancos de dados com
os quais normalmente pode se conectar.
FIGURA 13.5
Data COImeclions.
t<O:
""" _
.il h~ QQII
!lO\>
.l_ r. . . . ,o.Q
- ~ ~ m~"~
..
"., ......,
, -~........
,c..........
""""","
.,
OI,",V2001
........,
.....,..,
""012001
TABELA 13.2
Objero
Descrio
Tables (tabelas)
Contm uma lista de t odas as tabelas armazenadas em um banco de dados. Uma tabela um ag rupamento de informaes. Por exemplo, ela
pode conter informaes sobre os funcionrios de uma empresa. os
produt os que ela vende ou itens semelhantes relacionados. Em geral,
esta a seo disponvel mais importante de Data Connections.
Views
(visual izaes)
Stored procedures
(procedimentos
armazenados)
363
TABELA 13.2
Objeto
Descrio
Functions
(fun es)
Databasediagrams
(d iagramas de
bancos de dados)
Em geral s6 so encontrados no SQL Server. So usados para documentar o banco d e dados e para forn ecer uma descrio visual de suas
tabelas. (Veja a Figu ra 13.6 para um exemplo.)
FIGURA 13.6
Diagrama de bal/co de
dados.
"'*"
I)000o , . . _ .........
jI . \:I . ~ "QII lr.ltll e. . . .. .t' . 1:1.
!!lo to<
1>* _
.,.
'-
It' -.
~~"~~~,~~..~Qc.;~~;'.~;;.:~,~~.;'-;";~~;~"'~"'~"'""~,,~,~~:"'-__~",~c~,,a,.c-____~.".~.
.f
Dia 13
364
Bas i c . NET%\Corrmon7\ Too 1S\Si n\nwi nd . mdb. D um clique em OK para aceitar esse banco de dados .
4 D um cl ique no boto Test Connect ion. Uma caixa de dilogo deve aparecer informando que a conexo fo i bem -sucedida. Caso contrrio, certifique-se de que haja um banco
de dados 110 local selecionado. D um clique em OK para aceitar essa conexo de dados.
mazenados.
Faa
No faa nenhuma alterao no banco de dados agora. Se voc alterar esse banco de dados, outros exemplos ou aplicativos podem
no funcionar. Apenas examine as informaes por enquanto. Se quiser tent ar faze r alteraes em um banco de dados, crie um para
teste.
365
Visualizando os Servios
Exatamente como as opes do Data Connections, os serv ios do Server Explorer variam, de~
pendendo do que est iver instalado e em execuo no computador. Alguns dos itens do Server
Exp lorer esto descritos na Tabela 13.3. Esses so os que esto disponveis enquanto escrevia
este texto; muitos outros podero ser disponibilizados posteriormente.
TABELA
13.3
Servio
Registro de eventos
(Event Log)
Descrio
Fornece acesso aos arquivos de regiSlro dos aplicativos (Application), da segurana (Security) e do sistema (System) do Windows
NT ou do 2000. Esses arquivos de registro contm erros e outras informaes sobre os aplicativos que esto em execuo no computador. Isso proporciona a mesma funcionalidade do aplicativo Event
Viewer, sem que seja necessrio sairdo IDE do Visual Basic .NET.
Mdulos carregados
(Loaded Modules)
Dados de gerenciamento
(Management Dala)
Processos (Processes)
Servios (Services)
Servios da Web
(Web Services)
Filas de mensagens
(Message Queues)
366
Dia 13
_ _,
FIGURA 13.7
Adicionando oulro
'O_lo
... ..... _ .......... -.... _, ...
servidor.
Voc pode usar esse recurso para se conectar aos serv idores com os quais trabalha. Por exemplo,
muitos desenvolvedores precisam acessar um servidor de banco de dados, um de teste, e possivelmente um servidor Web quando desenvolvem um programa. O Server Explorer permitiria a
conexo com todos os trs quando fosse preciso monitorar e/ou em pregar os servios.
necessrio escrever (como voc viu no Dia I I, "Introduo aos Bancos de Dados", e no Dia 12,
"Acessando Dados com a Plataforma .NET") o mesmo tipo de cd igo para rec uperar informaes e exibi-Ias para o usurio. Por que perder tempo COm isso, se seu com putador pode faz-lo
para voc?
Criaremos um aplicativo simples para visua li zar os dados de urna tabela em um banco de dados.
Usare i o banco de dados Northwi nd; voc pode escolher qualquer banco de dados COlll o qual tenha uma conexo de sua mquina.
Depois que tiver uma conexo vlida com um banco de dados no Server Explorer, crie um novo
projeto de aplicati vo Windows. O meu se chama DataView; voc pode usar esse nome (no est
patenteado ou algo semelhante) ou esco lher outro. Depois de criar o proj eto, excl ua o formulrio
original dando um clique COm o boto direito do mouse sobre ele no Solution Explorer e se lecionando Delete. Aceite o aviso. A seguir, d um clique com o boto direito do mouse no projeto e
selecione Add e Add Windows Form. Nomeie o fonnu lrio resultante como Customers. D um
clique com o boto direito do mouse no projeto pela ltima veze selecione Propert ies. Configure
o objeto de inicial izao (Startup object) como Customers e selecione OK.
Como sem pre, a prime ira etapa na construo de um apl icat ivo do Visual Basic .NET adicionar
os controles ao formu lrio. Em nosso caso, teremos uma interface com o usurio si mples - nada
a no ser uma grade . Selecione o controle Da t aGri d na caixa de ferramentas e adicione-o a seu
formulrio. Con fi gure as propriedades como mostra a Tabela 13.4.
TABELA 13.4
Controle
Propriedade
Valor
Form
Text
Customer listing
DataGrid
Name
dbgCus tomers
Dock
Fi 11
CaptionText
Customers
Voc tambm pode querer usar o recurso AutoFormat (ou configurar manualmente os valores)
para fazer com que a grade fique com uma boa aparncia.
A seguir, queremos ad icionar o cdigo para o acesso aos dados. Em vez de faz-lo manualmente,
no entanto, usaremos o Server Explorer. Selecione uma tabela em seu banco de dados (escolh i a
tabe la Customers de Northwind), arraste-a do Server Exp lorer e solte-a no formu lrio. Dois ohjelos novos aparecero no form ulrio - OleDbConnecti onl e 01 eObDataAdapterl (veja a Figura
13 .8).
O objeto 01 eObConnect i onl , como voc j deve ter adivinhado, a conexo com o banco de dados. O objeto OleDbDataAdapterl o componente que extrai (e salva) as infonnaes do banco
de dados. Altere o nome dos controles conforme mostra a Tabe la 13.5.
Dia 13
TABELA 13.5
Controle
Propriedade
Valor
01 eDbConnection
Name
ConNW
01eDbDataAdapter
Name
CmdClfstomers
Agora vem a parte di vert ida. D um clique com o boto direito do mouse no adaptador de dados
cmdCustomers e selecione Generate DataSet; configure o nome como Customer$et e marque a caixa que adiciona uma instncia ao projeto (veja a Figura 13.9). Voc deve ouvir mais alguns ruidos no disco rigido e um novo dataset CustomerSetl ser adicionado janela (veja a Figura
13.10). Altere o nome para dsCustomers.
FIGURA 13.8
too
Objefos de conexo
adicionados.
~ lJ ~!;I",
*-
"""....
FIGURA 13.9
Adicionando o
DataSet.
~"'"
I"" _
<II'" _
tA< _
"I:'
.\ibor."
QOI>
. ....
..T...
_
.... _.... _... __._,._------"
::J
r~l-
, (0
P 111" .... _
,.. "
.. " " _.
FIGURA 13.10
O DataSet
adicionado.
___
",~,}'ItoI)_aM
(jJ .
CJ ~
1iI"
lo
""_~
Ie. ., . '.. q
1;, 00 '.,
'.i
-..
. 1M
.~, .. ,
..
\JI o , ,....,
Conectando o OataSet
'"
l.'Ito
;,i) . 1:1 ~
ao OataGri d.
"""'"
1iI"
-..,
<\I"
. .t:'.
rlo ""
.$ 'I!II "~,,
...
~.
.....-
....
....
r.. -...
:o: . '"
i: t: o:
Il!t'
""'.>1
'1:1. .. .
.. ..
1;, . 'o
i:!I"j:;; EI :ii
CDIGO
.... ......
"'
T.......
na Listagem 13. 1,
Dia 13
370
COIGO
o procedimento Fonn
ANALISE
seu programa. Se tudo funcionar, ele deve ter a aparncia da Figura 13.12.
FIGURA 13.12
Executal1do o
aplicativo Da taVi ew.
.....",.,-
......'TtIoInK_
,...,_..
-...:I "",.,
Solos _
-""'".
-_.""-
....'"
UI<
so .:...
_50<1 """',.". _
"-to< Go a"",
~.,;.. . f'.......,..,"~
eldoCoo>oo
&<>o _ '
~ l<tlI ~
hora
Ton._
a - .....
CO<I ...
I"xCoo.f ,
~-
".
~.~
r. &o,...,.,
~
o--.
~~_
tt ~ L>"I<
SOles .........
!,lO;
0<'I!t< .......
[)o""..x",
"'11<ili'O
.....
c:',.,..." ...... attIob
tnct<o
t
~,.,.~
_u.tnn o.....
fn.."eom._Dtv>
..."""
SoIooA_ '"
""'" _ _ ........ <Mo _
.".".,
f _ _ ... c""
~ .... h.oI
'
-..o ...
. _ . ".
.",,,,,
----,-,-
~
~.
~
.~
0=
<w<
(9.)SSS '
9'.1 ....S.
,...
,,......
(OO4)SS'
{'l U'"
(S)SS~7
_w
ou>um
,,,..,,.
"~
{,mm
"M'."-
"".."',
Eventos
Para exam inarmos os beneficias das ferramentas do Server Explorer, construi remos um aplicati
vo pequeno que monitorar alguns dos contadores de desempenho que o sistema operacional
mantm sobre ele prprio. Alm disso, registraremos a data e a hora em que o programa comear
e terminar de registrar os eventos do ap licativo. O resultado fina l deve ter uma aparncia semelhante da Figura 13.13.
371
FIGURA 13.13
O PelfLile em a(io.
10..._1
=.1:::::
Crie um novo ap li cativo Windows. Chame o novo projeto de PerfLite porque ele ser uma verso mais enxuta (ou ' Lite' na linguagem de marketing) do aplicativo Performance Mon itor que
vem com o Windows NT e o Windows 2000. Quando o projeto estiver pronto, feche o formulrio-padro e renomeie-o como frrrtla i n. vb. A seguir, d um clique com o boto direito do mouse
no arq uivo e selecione View Code . Altere todas as referncias a Fonnl para fnnMai n. Usar o comando Replace ajudar (lembre-se de se lecionar Search 1-1 idden Text). Para conclu ir, d um clique com o boto direito do mouse sobre o projeto no Solut ion Explorer, se lec ione Properties e
altere o Startup Object no formulrio resultante para fnnMa i n (veja a Figura 13.14).
FIGURA 13.14
"O.'
Propriedades de
PelfLile.
_............
. ......
,,_o
":i co.mon_,,",
~
"
::,,,":,,,,,
:J CO"Lw..... ~_<M
..... _,
..... ,..,
0A>.0t_,
c, _ _ 'r....... \
"" .....-.,
...... _
~I
Compi le o apli cativo para certificar-se de que todas as alteraes foram fe itas.
Depois de tudo compilado, estaremos prontos para comear a adicionar os controles e configurar
suas propriedades. Confi gure as propriedades do formulrio como mostra a Tabela 13.6.
Dia 13
T A BELA
13.6
Propriedade
Valor
Text
PerfLi te
Si ze
480, 360
Exibiremos algumas informaes sobre o desempenho desenhando-as em um painel. Alm disso, temos de controlar a ve locidade da exibio. Adic ione os controles da Tabela 13.7 e configure suas propriedades como mostrado na tabe la.
T A BElA
13.7
Controle
Propriedade
Valor
Panel
Name
Dock
Height
pnlSweep
Button
TrackBar
label
l a bel
label
Timer
"me
Text
Location
Size
Name
location
Size
Minimum
Maximum
Value
Name
Location
Autosize
Text
Forecolor
Name
location
Autosi ze
Text
Forecolor
Name
location
Autosize
Text
Forecolor
',me
Interval
To,
240
cmdSweep
&Start
8, 248
64, 24
trkSpeed
8, 280
104, 42
1
20
10
lblCPU
240, 248
True
CPU:
Red (ou algo que voc goste/possa ver)
lblProc
240, 272
True
Processes:
Green (novamente, ou algo atrativo)
lblMem
240, 296
True
Memory:
Bl ue
tmrClod
1000
Para exibinnos as informaes sobre o desempenho, precisamos ad icionar os conladores apro-priados ao aplicativo:
373
1. Abra o Server Explorer e selecione um servidor (pode ser seu prprio computador).
2. Abra a seo Performance Counters .
3. Role para baixo at encontrar o item Processor e abra-o.
4 . Abra o item % Processo r Time e selecione o item Total.
5. A rraste esse item sobre o formulrio e solte-o sobre ele. Um item chamado PerformanceCounterl deve ficar visvel em uma nova seo abaixo do formulrio (veja a Figura
13.15).
FIGURA 13.15
Depois de inc/lli/' o
!oK I!tw _
....
l!w 00" _
.., . ,
1.... _
.p Q
.....
-..,
comado/' de
desempenho.
...... -<_ .
" ' L,_~_
..:l
to .. ,......_n_ '_
......
..
-,.....
"'"
~. '"
..d ... . _
.-
--
"
,
,
O>~_
H outra maneira de adicionar um item do Server Explorer a seu aplicativo. Localize o contador
de desempenho System\Processes. Observe que ele no possui nenhum item, como Total em %
Processor Time. D um clique com o boto direito do mouse no contador Processes e selecione
Add to Designer. Em segu ida, voc deve ver outro objeto Perfonnance Counter adicionado pr.
..
Xl mo ao pnmeuo.
Para concluir a insero de nossos contadores de desempenho, selecione e adicione o contador
de desempenho Memory\Commited Bytes.
Renomeie os trs contadores de desempenho como prfCPU, prfProcs e prfMem.
Alm dos contadores de desempenho, tambm podemos adicionar objetos que tornem o acesso
aos dados muito mais fcil do que j possa ter sido. Abra a seo Event Logs do Server Explorer
e selecione Application. Arraste o item Application para o formulrio ou d um cliq ue com o boto direito do mouse e selecione Add To Designer (o que preferir). Um novo item deve aparecer
374
Dia 13
prximo aos trs contadores de desempenho. Con figure as propriedades desse novo objelo conforme descrito na Tabela 13.8. O formulrio final deve se parecer com o mostrado na Figura
13.16.
TABElA 13.8
Propriedade
Valor
Name
logApp
Source
PerfLite
FIGURA 13.16
O PerjLile, pronlo
filo
I0OI
jl \:.I ~ gGII
....
.... 1_ _
:t.1Q1! "' , .. Q
!lO'>
. -..
III ...,..,
para a codificaiio.
_
"lEI [Q>,NOO"
'L
"- .. ....
. . ...
~
.. ,'"'" "'"
_.-;~--"_
Sto<
-~
.._-"--_._-_.O'IJ
_.....
-.
""--~_
Agora que a interface com o usurio est pronta, hora de comearmos a ad icionar a codificao
para fazer nosso programa executar algo. Nesse aplicativo, adicionaremos um cdigo para trs
dos controles e um proced imento para auxi Iiar. O resultado fina l mostrar uma Iinha dei imitadora se movendo pela extenso do painel , com trs linhas coloridas acompanhando-a atrs (veja a
Figura 13. 17).
Para que a linha deli mitadora seja exibida period icamente, usaremos o evento Timer do controle
de mesmo nome. O cdigo est na Listagem 13.2.
375
FIGURA 13.17
O exemplo sendo
execulodo.
i""
! - ........
'1OO1S '"
COIGO
1
2
3
4
5
6
7
8
9
10
11
12
-.
ANALISE
o cdigo desse procedimento tem como sua preocupao bsica duas finalidade s:
13
14
15
16
Private
ByVal
ByVal
Dim
Dia 13
376
COOIGO
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
'o nmero 10000 para dar a memria um valor adequado em minha mquina
voc pode precisar alter-lo se a linha referente memria
41
42
43
44
45
46
47
48
49
50
Eod 5ub
ANALISE
Como voc j deve ter deduzido, essa rotina o ponto central do aplicativo. No se
assuste com a extenso ou as chamadas grficas - uma rotina bem simples.
Comeamos recuperando o objeto Graphics do controle PaneI (linha 16). Todas os elementos
grficos do Visual Basic .NET so criados em um objeto Graphi cs. Qualquer contro le que possa
ser desenhado (como os controles Image e PaneI ou os formulrios) expe esse objeto Graphi cs
com um mtodo CreateGraphics. Por sua vez, ele expe outros objetos e mtodos (e tambm o
controle do continer) para que se possa desenhar nele.
Antes de discutirmos o cdigo propriamente dito, iremos detenninar o que se pretende fazer. O
resu ltado final ser uma linha vertical que se move (horizontalmente) pela extenso do formul*
rio. Enquanto se move, ela seguida por trs linhas coloridas, cada uma representando um dos
trs contadores de desempenho. Quando a linha (delimitadora) vertical chegar ao limite do for*
mulrio, dever ser in iciada mais uma vez no lado esquerdo dele, sendo esse li mpo para a nova
exibio. No fim deveremos ter algo parecido com o monitor das batidas de um corao (sem o
ru do ' ping' ). Portanto, precisaremos de um cdigo para desenhar a linha vertical (e mov*la
pela extenso do fonnulrio) e as trs linhas de desempenho.
Para mover a linha delimitadora, precisamos desenhar uma outra linha (com a cor do plano de
fundo) para apagar a anterior, passar um pouco para cima e iniciar uma nova exibio. Na Lista*
gem 13.3, a linha 23 do cdigo apaga a linha que j havia sido exibida, e uma nova iniciada e
movida das linhas 25 a 41. A razo pela qual isso se torna to extenso que tambm precisamos
testar se estaremos movendo a linha em direo ao lado direito do formulrio . Se isso estiver
ocorrendo (a instruo I f na linha 42), li mparemos o formu lrio e voltaremos ao lado esquerdo
para comear uma nova exibio.
As linhas do contador de desempenho tambm so desenhadas nessa rotina. A diferena ex isten*
te nessas chamadas que tambm precisamos determinar onde desenhar a linha e lembrar do va*
lor anterior para que possamos conectar a linha nova a j ex ibida. Usando o pri meiro contador de
desempenho como exemplo (linhas 25 a 28), isso se resume a trs etapas:
I. Decida qual deve ser o novo valor de Y (a altura) para a nova linha. A linha 25 faz isso
para o contador da cru determinando que percentual da altura total ser ocupado pelo
valor referente CPU (Iembre*se, o contador da CPU um percentual).
2. Desenhe a linha, conectando a anterior recm*criada. As linhas 26 e 27 fazem isso de*
senhando uma linha com a cor definida para a CPU com base nos valores anteriores de X
e Y para iniciar os novos. O novo valor de X determinado pelo incremento (15 unida*
des) do valor anterior, enquanto o novo valor de Y foi calculado na etapa I.
3. Armazene o valor recm*calculado de Y para que seja empregado no prximo lao (linha
28). Ele ser usado na criao de uma nova linha.
As rotinas para o desenho das linhas dos outros dois contadores de desempenho (linhas 29 a 35 e
36 a 39) so seme lhantes - diferindo apenas na maneira como o novo valorde Y calculado.
CDIGO
51
52
53
54
LISTAG EM
Dia 13
378
COOIGO
55
56
57
58
crndSweep.Text = "&Start"
tmrClok.Enabled = False
59
60
61
Eod If
Eod S,b
A finalidade dessa rotina penn it ir que o usurio inic ie e interrompa a exibio. Portania, ela relativamente s imples. Com base no texto do boto, alternaremos entre
ele e nosso timel'. Isto , se o timer estiver alivado, o interromperemos. Se no estiver, o alivareANLISE
mos. Poderamos usar outra varivel para registrar esse status, mas, em vez disso, empregaremos
o texto do boto. Se a propriedade Text dele for igual a &Sta rt (o valor inicial), inic iaremos o ti-
mer e alteraremos Text para &Stop (observe que os dois valores possuem a mesma chave de acesso, a letra S). Corno alternativa, interromperemos o timer e configuraremos o texto de vo lta com
&Start.
A seguir, precisamos perm ilir que o usurio altere a velocidade da Iinha dei im itadora. Isso fe ito
na Listagem 13.5.
COOIGO
62
63
64
65
66
67
68
ANLISE
o cdigo para configurar a velocidade bem bsico. As linhas 64 e 65 apenas se certificam de que o va lor que usamos (a configurao atual para a velocidade) tenha
sido um inteiro. Em seguida, ut ilizamos a velocidade para ajustar o intervalo definido para o timer
(linha 67). Intervalos menores significam que a linha dei imitadora ser exib ida mais rapidamente.
Para concluir, h algumas variveis de que preci saremos em todo o aplicativo. Elas armazenaro
as coordenadas atuais X e Y, usadas quando desenharmos, e as canetas empregadas na criao
das linhas. Adicione o cd igo da Listagem 13.6 ao formulrio, exatamente abaixo da regio marcada como cd igo gerado pelo Windows Form Designer e antes de qualquer outro trecho de seu
cdigo.
COOIGO
69
7D
LISTAGEM
379
71
72
73
74
75
76
77
78
79
80
81
82
As variveis das linhas 69 a 74 so usadas para armazenar as posies aluais da caneta quando no estiverem desenhando as linhas. Uma varivel armazena a posio
atual de X, e as outras as pos ies alua is de Y para cada contador de desempenho. As canetas so
empregadas no desenho de cada linha de desempenho e da linha del imitadora. Por fim, a constante da linha 82 utilizada para registrar o espao definido para o avano da linha delim itadora enquanto ela se move pelo fonnulrio.
ANALISE
Depois que o cdigo estiver estruturado, compi le o programa e execute-o. D um clique no boto
Start, e observe por alguns segundos. Voc comear a ver a barra delimitadora se mover da esquerda para a direita no formulr io, sendo seguida por trs linhas - uma para a CPU (percentual
de uti li zao), outra para os processos (programas em execuo) e mais uma para a memria (em
uso). O texto no boto deve alterar-se para Stop. Altere a barra de registro (configure-a corno
maior ou menor) para observar como ela afela a exibio; tente dar um clique no boto Stop para
ver se ele se altera novamente para Start. Voc pode tentar adicionar alguns outros contadores
exibio corno um exerccio.
Resumo
Os sistemas operacionais mais modernos como o Windows possuem vrios serv ios. Esses servios fornecem recursos que se estendem ao sistema operacional, adicionando funciona lidades,
como bancos de dados ou registros, que enriquecem as capacidades centrais. O Server Explorer
permite que voc visualize ou altere o estado desses servios em seu prprio computador de desenvolvimento ou em outros sem terde sair do IDE do Vi sual Basic .NET. Alm disso, ele simplifica o desenvolvimento de cdigos que usem muitos dos servios disponveis.
Dia 13
Na prxima li o, comearemos nossa saga na descoberta da verdadeira natureza orientada a ohjetos do Visual Bas ic .NET aprendendo o que sign ifica ser ' real mente' orientado a objetos.
P&R
P Tenho alguns itens em meu Server Explorer que no foram mencionados (o u no
tenho alguns que foram mencionados). O que so eles?
R E poss vel que outras empresas criem com ponentes para 'associar' ao Server Explorer.
Isso permiti ria ao desenvolvedor trabalhar com esses servios diretamente, tal como se
pode fazer com os servios comuns. Por outro lado, se o serv idor com o qual voc se conectar no fornecer um determinado servio, ele poder no aparecer na li sta.
P Se os dados do Sen 'er Explorer forem alterados. isso alterar o banco de dados?
R Sim, por favor, tenha cuidado.
Workshop
o Workshop fo i planej ado para aj ud-Io a antecipar poss veis dvidas, revisar o que j aprendeu
e comear a pensar em corno colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, " Respostas dos Testes/Exerccios" .
Teste
I. Cite duas sees do Server Explorer que informariam a voc que programas esto em
execuo em seu computador.
2. O que um servio?
3. O que seria exibido se o cdigo a seguir fosse ad icionado a um programa e executado?
Exerccios
I. Use o Data Connections para se conectar a um banco de dados di spon vel e pesq uisar as
tabelas e outros itens cuj o acesso fo r conced ido (lembre-se de no fazer nenhuma alterao, a menos que voc realmente precise).
2. Pesqu ise o Server Explorer para descobrir o que est dispon ve l em seu computador, assim como os servidores que voc costuma usar para desenvolv imento.
SEMANA
DIA
Introduo Programao
Orientada a Objetos
Na verso .NET, o Visual Basic foi reescrito a partir do zero. Uma das princ ipais razes disso foi
para adicionar recursos orientados a objetos profundamente integrados. Esta lio abordar:
Alm desses tpicos, no final da lio, voc aprender tcnicas da POO para ajudlo a construir
aplicativos.
Dia 14
Na essncia da POO est o conceito de objeto, um bloco da programao que combina informaes especficas e um conj unto de comportamentos relacionados. Na POO, os cenrios so considerados em termos desses objetos em vez da abordagem linear passo a passo que era (e ainda )
usada na maioria dos programas de computador. Os objetos em geral so empregados para descreverentidades, que podem ser reais (um veculo) ou abstratas (um vo reservado em uma companhia area nacional). Essas entidades possuem atributos, como a cor do veculo ou a data de
sada do vo, que descrevem o objeto. Esses objetos tambm apresentam certas aes que podem ser executadas neles, como 'Vender' para o carro e 'Cancelar' para o vo. Na POO, as entidades se tornam objetos, os atributos so conhecidos como propriedades (que voc pode
configurar ou recuperar) e as aes so chamadas de mtodos.
Novo
TERMO
Um objelo uma representao de urna entidade rea l ou abstrata junto s propriedades dessa ent idade e as aes relacionadas a ela que podem ser executadas .
>I<
12).
6. Calcular os pagamentos.
383
Em cdigo, as duas abordagens tambm so diferentes. Considere os doi s blocos de cd igo mostrados nas Listagens 14.1 e 14.2, que poderiam ser executados em um formu lrio Windows ou
da Web para calcular os pagamentos da hipoteca.
LISTAGEM 14.1
1
2
3
4
5
6
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cu rpayment
curPrincipal *_
(1 - (l + dbllnterestRate))_
/ (1 - (l + dblInterestRate)
i Months))
+ dbllnterestRate)
IblMonthlyPayment.Text = cu rPayment.ToString()
End Sub
A
LISTAGEM 14.2
1
2
3
4
5
6
7
'Es tilo
Private
ByVal e
Dim
Dim
Dim
Dim
9
10
11
12
Dia 14
LISTAGEM 14.2
13
I'
15
16
17
18
19
20
A Listagem 14.2 cria uma instncia do objeto Mortgage, (hipoteca) para fazer seus clculos, mas
as operaes matemticas subjacentes so as mesmas. E bom ressaltar que j que o objeto Mort gage ainda no foi definido, voc no poder executar o cdigo da Listagem 14.2. Embora um
resu ltado final semelhante pudesse ser obtido se escrevssemos uma fu no com o cdigo proced ural, como Cal cul ateMortgagePayment ( ), isso ainda no seria uma POO. S com o uso do
objeto Mortgage, que combina as informaes sobre a hipoteca com o cdigo para process-Ias,
estaremos realmente usando a POO.
Esse esti lo de programao no novo para voc, se esteve acompanhando a primei ra metade
deste livro; quase tudo no Visual Basic .NET construdo dessa maneira. Considere o cdigo
usado para trabalhar com controles em um form ul rio Windows: txtpaymenL Text '" 1bl Resul t. Text . Os dois controles so objetos, com uma propriedade Text , exatamente como o objeto
Mortgage do exemplo anterior. Empregar os objetos fornecidos pelo Visual Basic .NET e pelo
.NET Framework no far com que seu cdigo seja orientado a objetos, embora mu itas pessoas
possam lhe dizer que si m. possve l utilizar os objetos e ainda programar com um esti lo proceduraI passo a passo.
385
1 Modu le AllAboutObjects
2
Sub Ma in( )
3
Dim x As myFirstClass
4
x " New myFirstC lass{)
5
End Sub
6 End Modu le
7
Dia 14
A instruo Publ i c Cl ass myFi rstCl ass (linha 8) define uma classe nova; um projeto para os ohjetos. A linha 3 cria uma varivel do tipo myFirstC l ass, que pode conter uma instncia de
myFi rstCl asso A linha4 gera uma nova instncia de myFi rs tCI ass (criando um objelo) e a atribui
a varivel x. Agora x se refere a lima instncia da classe myFi rstCl asso Outro exemplo do uso de
objetos mostrado na Lislagem 14.4.
LISTAGEM 14.4
1 Module AllAboutObjects
Sub Main()
2
Dim x As myFirstClass
3
Dim y As myFirstClass
4
x o New myFirstClass()
5
y o New myFirstClass()
6
7
End Sub
8 Eod Module
Na Listagem 14.4, duas variveis do tipo myFi rs tCI ass so declaradas (nas linhas 3 e 4) e, em seguida, duas novas instncias de myFi rstCI ass so criadas (linhas 5 e 6). Cada instncia referenciada por uma varivel. A varivel x contm uma referncia a um objeto direrente de y, mas os
dois objetos so instncias de myFi rs tCI ass o Esse conceito, instncias comparadas a variveis,
ser examinado mais uma vez em outro exemplo na Listagem 14.5.
LISTAGEM 14.5
1 Module AllAboutObjects
Sub Main()
2
Dim x As myFirstClass
3
4
Dim y As myFi rstClass
5
x = New myFirstClassO
6
y " x
7
End Sub
8 End Module
A Listagem 14.5 torna tudo um pouco mais confuso. Agora duas variveis foram declaradas,
ambas podendo se referir a uma instncia da classe myF i rstCI asso Em seguida, uma nova instncia dessa classe criada (por meio da palavra-chave New) e uma referncia ao novo objeto inserida em x. A seguir, y atribu da a x, e o resultado que y agora contm lima referncia mesma
instncia de myFi rstCI ass que x referenc ia. S h um objeto e, portanto, uma rea da memria,
mas duas variveis que se referem (ou apontam) a ele. Isso ser demonstrado na prxima seo
quando voe aprender as propriedades.
387
Propriedades
As classes podem definir as propriedades que cada instncia delas deve ter. A propriedade um valor
que ex iste como parte de um objeto, e voc pode recuperar ou configur-Ia por meio desse objeto.
A Listagem 14.6 adiciona uma propri edade definio de my FirstC lass por uma varivel pblica.
Essa no a n ica maneira de adicionar uma propriedade, mas abordaremos os outros mtodos no
Dia 15.
LISTAGEM
14.6
=
=
{Q}" , x.Name)
{Q}" , y .Name)
14
=
=
Fr ed
Joe
Cada instncia de lima classe possu i sua prpria parte na memria associada a ela e, portanto, os
valores da propriedade so armazenados independentemente com cada instncia. Retornando
ana logia da casa, todas as instncias de uma casa so criadas do mesmo projeto, mas cada uma
pode ser pintada de uma cor diferente. A cor da casa uma propriedade, e seu valor no determinado pelo projeto; um atributo de cada instncia. A Li stagem 14.7 deve ajudar a ilustrar
como as propriedades esto assoc iadas a uma instncia individual de uma classe.
Dia 14
LISTAGEM 14.7
1 Module AllAboutObjects
2
Sub Main()
3
Oim x As myFirstClass
4
Oim y As myFirstClass
X" New myFirstClass()
5
6
y " x
7
x.Name " "Fred"
8
y.Name " "Joe"
9
Console .Writeline("x.Name" {Ql" . x.Name)
10
Console.Writeline("y.Name" {Ql". y.Name)
11
Console.ReadlineO
12
End Sub
13 End Module
A nica diferena entre as Listagens 14.7 e 14.6 est na linha 6, em que atribuda varivel y
lima refernc ia x em vezde a uma nova instnciademyfi rstClass. Essa diferena sign ifica que
nas linhas 7 e 8, o cdigo trabalha COm a propriedade Name da meSma instncia, e a sada dessa ro~
tina ser
x.Name = Joe
y.Name " Joe
As duas instrues Wri teL i ne produzem o mesmo valor para a propriedade porque tanto x quan~
to y se referem mesma instncia do objeto. Esse conceito especfico, em que mltiplas v ar i~
veis se referem ao meSmO objeto, outro tpico importante, porm confuso. Verifique a seo
6.1 do Visual Basic Language Specification (parte da documentao da plataform a .NET; pes~
quise em "Tipos de Valores e Tipos de Referncia" para encontr~la) para obter mais detalhes.
Na plataforma .NET, as propriedades podem ser apenas de leitura, apenas de gravao ou de le i ~
tura/gravao, permitindo a existncia de um controle sobre como esses valores so acessados.
Voc aprender a controlar o acesso s propriedades de suas prprias classes no Dia 15.
Mtodos
Alm das propriedades, as classes tambm podem ter comportamentos ou aes associados a
elas. Conhecidas como mtodos, essas aes permitem que uma classe possua alguma lgica in~
corporada alm das informaes que so armazenadas por suas propriedades. Urna casa no o
melhor exemplo quando se quer fa lar sobre mtodos, mas uma classe casa criada para ser usada
por um aplicat ivo de uma imobi liria pode possuir mtodos que listem a casa na Web (myHouse. Li st ( )), vendam a casa (myHouse . Sell ( )) ou at exibam uma propaganda (myHouse . Pri ntBrochure ("Printerl")). Esses mtodos so exatamente como qualquer outro procedimento;
eles podem aceitar parmetros quando voc os chama e retornar valores tambm.
389
2
3
4
5
6
Sub Main()
Dim x As myFirstClass
x = New myFirstClass()
x. DoSomethi ng ()
End Sub
End Module
Em segu ida, esse mtodo poderia ser chamado de qualquer instnc ia da classe. Exatamente
como com as propriedades, no entanto, o mtodo de l1nido na classe, porm chamado na instncia. Isso significa que se o mtodo usar alguma das propriedades (privadas ou pblicas) da classe, ento, estar util izando as informaes armazenadas na instncia em questo.
Herana
Um conceito essencial na POO, mas que no era fci l de implementar no Visual Basic antes da
verso .NET, a herana.
Novo TERMO Herana o conceito pelo qual voc pode basear uma classe em outra, em geral para
alterar ou adicionar algo nos recursos dispon veis da classe original.
Acabei de almoar, portanto acho que deixarei de lado a analogia da casa e tentarei confundi-lo
com uma baseada em sanduiches. Considere o ham brguer bsico: dois pes com um pedao de
carne colocado entre eles.
Quando o restaurante decide comear a vender cheeseburgers, ele no criado do nada. cozinhe iro informado para ' fazer um hambrguer, porm adicionando uma fatia de que ij o'. Assim,
urna nova classe de sanduche criada, o cheeseburger, que herda caractersticas da classe hambrguer. Para estender essa analogia at que fiquemos saturados de sanduches, o restaurante poderia agora decidir oferecer um hambrguer de luxo, que herdasse caractersticas do
cheeseburger e incl usse ai face e tomate. Em cada caso, a classe bsica usada corno origem .
Dia 14
Dessa maneira, voc pode criar uma hierarquia de objetos, em que a classe ut ilizada pode estar
no fina l de vrias camadas de herana. possvel ter quantas classes desejar com base em uma
nica classe, portanto o restaurante poderia oferecer um sanduche vegetariano ou de gali nha, os
dois derivados da classe hambrguer e sobrepostos ao tipo de reche io uti Iizado anterionnente.
Sobreposio um tenno usado para indicar que uma classe-fil ha fornece sua prpria implementao de um recurso da classe bsica, quando comparado simples
Novo TERMO
sio, a herana e outros recursos, mas, por enquanto, fornecere i um exemplo simples do emprego da herana na Listagem 14.9.
LISTAGEM
14.9
1 Module AllAboutObjects
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Pu bl i c Sub Ma i n{)
Oim mySn ippet As CodeSnippet
mySnippet " New CodeSnippet()
With mySnippet
.Contents" "txtEntry.Text " Ibllnfo .Text"
.Author " "Joe"
.language " "VB.NET"
.Purpose" "Inserir o texto do ttulo na calXa de texto"
End Wi th
End Sub
End Module
Public Class Snippet
Public Contents As String
Publ i c Author As String
End Class
Publ ic Class CodeSnippet
Inherits Snippet
Publ ic Language As String
Publ ic Purpose As String
End Class
Como voc pode ver, CodeSnippet, que derivada de Snippet, ad iciona duas novas propriedades. Quando for criada uma nova instncia da classe CodeSni ppet (1inha 5), ela ter as propriedades das duas classes disponveis.
391
Em geral, a classe nova precisa sobrepor algum recurso da classe bsica, apenas porque a funcionalidade bsica no leva em considerao as alteraes posteriores fe itas na classe. Considere
um mtodo, chamado GetSni ppet ( ) que existe na classe Sni ppet e foi criado para retornar a
classe Sni ppet comp leta como uma Stri ng, como mostrado na Li stagem 14.10.
LISTAGEM 14.10
Sobreponha uma Fun o para Personaliz -l a a Fim de Que Manipule os Novos Rec ursos de Sua Cl asse
6
7
8
9
10
11
12
With mySnippet
. Contents = "txtEntry .Text - Ibllnfo . Text"
.Author " "Joe"
. Language = "VB.NET"
. Purpose = "Inserir o texto do ttulo na cana de texto"
End Wi th
End Sub
End Module
13
14
15
16 Publie Class Snippet
17
Publ ie Contents As String
18
Public Author As String
19
Publie Overridable Function GetSnippet() As String
Dia 14
LISTAGEM 14.11 Sobreponha uma Funo para Pe r sonaliz - la a Fim de Que Manipu le os Novos Recursos de Sua Cl asse (continuao)
20
21
22
23
2.
25
26
27
28 Public Class CodeSnippet
29
Inherits Snippet
30
Public Language As String
31
Public Purpose As String
32
33
Public Overrides Function GetSnippet{) As String
34
Dim sTmp As String
35
sTmp = MyBase . GetSnippet()&_
36
Sys tem. Envi ronment.NewLi ne &
37
"Language: " & Language &_
38
Sys tem. Envi ronment.NewLi ne &
39
"Purpose: " & Purpose
40
Return sTmp
41
End Function
42 End Class
Para que essa funo seja sobreposta, ela deve ser marcada com Overridab l e na classe bsica
(l inha 19) e, cm segu ida, voc precisa fornecer uma nova implementao na classe derivada
(marcada com Overri des, linha 33). Para obter o resultado da funo da classe bsica como parte
da implementao dessa classe, a palavra-chave especial MyBase pode ser usada (linha 35) para
acessar as propriedades e mtodos da classe bsica. Outra palavra-chave especial, que no foi
empregada nesse exemplo, Me. Ela se refere ao objeto atual , portanto Me. Name que foi utilizada
no procedimento GetSni ppet referia-se propriedade Name da instncia aluaI dessa classe.
Um recurso til da herana que as classes que so derivadas de uma classe bsica especfica
podem ser usadas corno se fossem essa classe bs ica. As instncias da nova classe podem ser inseridas em variveis que utilizem o tipo de dado da classe anterior e passadas corno parmetros
para os procedimentos que esperem o tipo de dado anterior, como most ra a Listagem 14.12.
LISTAGEM 14.12 Use uma Classe Herdada em Qualquer Local Que Der Suporte a Sua
Classe Bsica
1 Option Strict On
2 Option Explicit On
LISTAGEM 14.12
393
Use uma Classe Herdada em Qualquer Local Que Der Suporte a Sua
Classe Bsica (cont inu ao)
4 Modu le AllAboutObjects
5
Public Sub Main{)
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Construtores
Outro recurso novo orientado a objelos nesta verso do Visual Basic a incluso de construtores
para os objetos.
Dia 14
394
Novo TERMO
o construtor uma rot ina chamada quando a instncia de uma classe gerada, e essa
pode especificar que parmetros fornecer na hora da criao. Esse conceito proporcio-
2 Option Explicit On
3
4 Modu le AllAboutObjects
5
Public Sub Main{)
6
Dim mySnippet As CodeSnippet
7
mySnippet "_
8
New CodeSnippet("txtEntry. Text " 1bl Info. Text" ,_
9
"Joe" , "VB.NET" , "Inserir texto do ttulo na caixa de texto")
10
PrintSnippet{mySnippet)
11
Console.ReadLine{)
12
End Sub
13
Public Sub PrintSnippet(ByVal objSnippet As Snippet)
14
Console.WriteLine{objSnippet.GetSnippet())
15
End Sub
16 End Module
17
18 Public Class Snippet
19
20
21
22
23
24
End Sub
25
26
27
28
29
30
31
32
33
34
LISTAGEM
35
36
37
38
14.13
39
40
41
42
43
44
45 Public Class CodeSnippet
46
Inherits Snippet
47
Public Language As String
48
Public Purpose As String
49
50
Public Sub New()
51
MyBase.New()
52
End Sub
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
395
Dia 14
As linhas 22 a 34 so os construtores para a classe Sni ppet, e ilustram a maneira-padro de inicializar um objeto. As linhas 50 a 77 so os construtores para a classe CodeSni ppet, e contm alguns
artificios em como a inicializam . Primeiro, voc pode chamar o construtor da classe bsica por
meio da palavra-chave My8ase (linhas 51 e 55), o que assegura que os cdigos sejam executados
na rotina da classe bsica e, em seguida, tambm sejam processados para sua classe derivada. O
segundo artifcio, empregado em todos os outros construtores, chamar seus construtores mais
sim ples dentre os mais complexos. Utilizar esse esti lo de codificao ev ita a repetio de cd igos; a iniciali zao genrica inserida no primeiro construtor, e qualquer cdigo adicional , requerido para a manipu lao de cada parmet ro novo, pode ser includo apenas no prim eiro
construtor no qual todos os parmetros novos aparecem.
Identifique as entidades.
397
Cada etapa ser abordada ind ividualmente a medida que voc percorrer o processo de descrio
de um jogo de vinte-e-um usando objetos. Seria ti l que voc compreendesse esse jogo de cartas,
antes que lesse estas sees. Se no souber nada sobre ele, consulte as regras procurando "BlackJack" na Encarta (http://encarta.msn . com).
Identificando os Objetos
A primeira tarefa descrever os requisitos de seu sistema, que muito mais trabalhoso do que
pode parecer. Nesse estgio, voc precisa esboar o sistema, apl icativo ou componente proposto
com detalhes suficientes para determinar toda as entidades principais. Um artificio que gosto de
usar para iniciar esse processo empregar todos os substantivos que aparecem nas descries de
meu sistema. Utilizando o vinte-e-um como exemplo, d uma olhada nessa breve e provavelmente incompleta descrio do jogo (recorra ao site da Encal1a para obter informaes mais
completas).
O vinte-e-um umjogo de cartas com dois ou mais participantes, um deles dando as cartas. O
objetivo do jogo fazer com que o valor de suas cartas chegue o mais prx im o possvel de 2 1
sem ultrapassar essa marca, e ele jogado entre os participantes incluindo tambm o jogador
que distribui as cartas. Em caso de empate (quando o jogador que d as cartas e os outros obtm o mesmo valor prximo a 2 1), quem ganha aquele que distribui as cartas. Antes de cada
rodada, os jogadores apostam uma quantia em dinheiro em sua probabilidade de ter uma mo
melhor que a do jogador que d as cartas . Um ou mais baralhos so embaralhados e, em seguida, o jogador que d as cartas distribui uma para cada participante e para ele mesmo.
Nesse ponto, os partic ipantes fazem suas apostas depo is de conhecer somente uma carta. Em
seguida, o jogador que d as cartas distribui mais uma para cada participante e para ele mesmo. A rodada termina se algum chegar a um total igual a 21 com apenas duas cartas. Se ningum consegu ir esse resu ltado, chamado de ' natural', ento, o jogador que d as cartas as
distribui em ordem para cada partic ipante, uma de cada vez, at que ojogadordecida parar ao
atingir 21 ou quando chegar perto. Se ele exceder 21 com as novas cartas que recebeu, perder imediatamente essa rodada. Todos os participantes passam por esse processo, ped indo
mais cartas at que decidam parar ou que excedam o va lor.
Depois que todos os jogadores decid irem parar de receber cartas ou ti verem sido elimi nados
da rodada, o jogador que d as cartas continua a receb-Ias, decidindo se pra ou permanece,
segundo as regras fixadas. Depois que ele e os outros jogadores j tiverem recebido todas as
cartas, ele ter de pagar a todos os jogadores com resultados mais altos que os dele, e os que
tiverem resultados mais baixos tero de pagar a ele. Portanto, j que o jogador que d as cartas sempre ganha em um empate, se ele term inar com 21 , os outros pagaro a ele .
E claro que essa uma descrio breve, no abordando quando as apostas so dobradas, divididas e outras caractersticas do jogo, mas est detalhada o bastante para atender a essa discusso.
Considerando esse exemplo como a parte de uma declarao necessria a seu trabalho, voc
pode comear a procurar as entidades que poderiam ser transformadas em objetos. Lembre-se de
Dia 14
meu conselho sobre os substantivos e tente por sua prpria conta criar uma lista de objetos antes
de exam inar a que consegu i.
Percorrer o exemplo apenas procurando os substantivos produzir mais entidades do que queremos, mas posso fazer uma se leo nessa li sta e obter as sugestes a seguir para os objetos:
Participante
Baralho
Dada essa lista, passaramos para a detenn inao das propriedades e mtodos desses objetos,
que em geral ajudam a defin ir quais deles, se houver a lgum , esto relacionados.
399
uma propriedade Tolal no objelo Carta, para indicar o valor lolal das cartas, mas a regra ' o s
pode va ler 1 Oll II ' tornaria essa propriedade difcil de implementar e seria necessrio um trabalho maior no projeto. Os mtodos do objeto Baralho incluiriam Adicionar/Remover para o conjunto de cartas e um mtodo Embaralhar para misturar esse mesmo conjunto. O mtodo
Adicionar/ Remover seria aplicado ao objeto Mo, mas Embaralhar no seria to ti l.
Os objetos Baralho e Mo no so apenas semelhantes, eles so quase idnticos. Em vez de pensar na herana, uma opo seria transformar os dois na mesma classe, porm contendo quantidades diferentes de cartas. Como alternaliva, voc poderia criar Mo e Baralho como classes derivadas de uma classe ConjuntoCartas mais genrica. A classe Carta bem fcil de definir: naipe
(Copas, Espadas, Ouros e Paus) e valor (2-1 O, K, Q, J, A), e no uma necess idade real de que seja
herdada de qualquer outro objeto.
FIGURA 14.1
. .. . .
A modelagem UML
(Unil-ersal Modefing
Lal/guage) mel/de
a IIl11a
finalidade relacionada
ao proje/o. forneceI/do a
\'oc lili/a visualbao
do es/ado a/ual do
- _.
D
("J
CJ
a docllfllclltao do
/til/doI/amemo ill/erl/O
de seu sis/el1ltl.
O diagrama mostrado na Figura 14.1 foi criado com o uso de um estilo de modelagem chamado
UM L ou Universal Modeling Language. Esse tipo de diagrama pode ser gerado empregando-se
qualquer lima das diversas ferramentas existentes, inc lu indo o Visio e o Rational Rose. A vantagem de modelar seu ap licativo fornecer um diagrama de seu projeto inicial dos objetos e utili-
Dia 14
z- Io quando fizer alteraes com o passar do tempo. Em um ambiente que envolva uma equipe
grande, os recursos de gerao de cdigos da maioria das ferramentas de modelagem tambm
podem ser teis, perm itindo que voc crie o cdigo da estrutura de qualquer conjunto de objetos
de seus diagramas. Ainda com relao gerao do cdigo, o Vi sio e o Rational Rose (e provavelmente outros) do suporte engenharia reversa de cdigos existentes, e podem usar essa tecnologia para produzir um diagrama de objetos a partir desses cdigos. A engenharia reversa uma
tima maneira de documentar um sistema quando no se emprega a mode lagem desde o incio.
Resumo
Os objetos so uma das principais partes do Visual Basic .NET, mas urna abordagem orientada a
objetos diferente de urna procedural comum. Deve-se enfocar primeiro o projeto, na tentativa
de vis ualizar os conceitos e entidades de um sistema como objetos, antes de se preocupar com os
detalhes da implementao do conceito desses objetos. No Dia 15, voc aprender mais sobre a
criao de objetos usando os diversos recursos da POO discutidos em toda esta lio.
P&R
P O U\,j fa la r qu e a C# e a C++ fornec em melho res recursos de prog rama o orientada a objetos do que o Visual Basic .NET. Isso verdade?
R Antes da plataforma .NET, isso era verdade com relao a C++; ela fornece recursos de
POO (como a herana) que o Visual Basic no poss ua. Agora, todas as linguagens .NET
apresentam a mesma funcional idade de POO porque ela est sendo fornecida pela Common Language Specificat ion (com a qual todas as linguagens .NET devem estar em conformidade) em vez de ser especfica de cada linguagem. Isso significa que na plataforma
.NET, o Visual Basic .NET apenas uma linguagem to boa para a POO quanto a C++ ou
a CII .
P A POO melho r ou ma is r pida do que o estilo de programao ' linea r' ou comu m?
R No necessariamente. A POO no produz res ultados diferentes em um aplicativo; simplesmente outra abordagem para projetar e construir esse aplicativo. Em geral , acred ita-se que a POO gera sistemas que possuem uma manuteno mais simples e so mais
fceis de expandir, mas isso decerto estar mais relacionado com o cdigo criado por
voc.
Workshop
O Workshop foi planejado para ajud-lo a antecipar possveis dvidas, revisara que j aprendeu
e comear a pensar em corno colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, ;;Resposlas dos TesteslExerccios" .
401
Teste
I. Que palavra-chave permite que voc se refira classe bs ica quando escreve um cdigo
dentro de lima classe derivada?
2. Que nome dado quando so criadas vrias verses do mesmo mtodo com conjuntos diferentes de parmetros?
3. Qual seria o resultado deste cdigo?
1 Module AllAboutObjects
2
Sub MainO
3
Oim x As myFirstClass
4
Dim y As myFirstClass
5
x " New myFirstClass()
6
y " x
7
y.Name " "Fred"
8
x.Name " y.Name
9
Console . Wri teLine("x.Name - lO}" , x. Name)
10
Console.WriteLine("y.Name" lO}", y.Name)
II
Console.ReadLineO
12
End Sub
13 End Modu le
14
Exerccios
Descreva o que poderia ser um projeto com objetos que registrassem os eventos de um grande
estdio. Leve em considerao vrios tipos diferentes de eventos e produza uma pequena lista
dos objetos que voc poderia projetar para essa finalidade.
SEMANA
Reviso
Na Semana 2, abrangemos lima grande rea, indo da introduo a uma boa mostra das classes do
.NET Framework aos detalhes sobre os recursos avanados orientados a objelos do Visual Basic
.NET. No geral, voc aprendeu o bastante para criar um aplicativo completo de produo com
uma interface com o usuri o, conexes com bancos de dados e at algumas conexes com as
Dia 14
Na ltima lio da Semana 2, o Dia 14, voc retomou ao assunto dos objetos no Visual Basic
.NET, que comeamos l atrs no Dia 7. Nessa lio avanada, abordamos a estrutura e os recursos dos objetos e como us-los para construir apli cativos. Mais inform aes sobre os objetos
ainda esto por vir. Leia o Dia 15 para obter detalhes sobre como possvel desenvo lver seus
objetos e sistemas com base em objetos no Visual Basic .NET.
No final da Semana 2, voc j tem uma compreenso substancial do Vis ual Basic .NET, o que
perm ite a criao de sistemas que vo a lm de si mples exemplos na rea dos ap licativos reais. O
projeto de bnus da Semana 2, uma biblioteca de registras de C Ds/OVOs on-line, colocar
prova seu conhecimento aperfeioado na construo de um aplicativo com uma estrutura interna
mais complicada e uma interface com o us urio tanto no Windows quanto na Web. Verifique todos os trs projetos de bnus na Web em http://www.samspubl ishing.com/detaii sams . cfm?item=0672320665.
SEMANA
Viso Geral
Durante esta ltima semana, voc examinar vrios tpicos avanados para
complementar seu conhecimento sobre o Visual Basic e o .NET Framework.
Primeiro, voc aprender a criar suas classes de biblioteca e componentes no
D ia 15. O Dia 16 ir mostrar-lhe os detalhes da gerao de interfaces com o
usurio mais complexas para aplicativos Windows por me io das classes dos for-
mulrios Windows. Essa lio inclui uma discusso sobre menus, aplicativos
com interfaces de documentos mltiplos (MDI - mult iple doclIment interface)
e vrios dos controles mais complicados fomec idos pelas classes dos formulrios
Windows.
Semana 3
Para concluir, h o terceiro e lt imo projeto de bnus do livro, Hangman, um programa complexo que usa os conceitos da XML do Dia 20, requer algum trabalho com arquivos e figuras (Dia 7)
e envolve a criao de uma interface com o usurio avanada (Dia 16). Esse programa tambm
deve ser divertido. Voc escrever um jogo que poder mostrar para sua famil ia, amigos e colegas, e conseguir que eles se divirtam com um programa que voc criou!
S EMANA
DIA
Criando Objetos no Visual Basic
.NET
Nas lies anteriores, voc aprendeu a usar objetos e projet-los, mas em algum momento pode
querer ou precisar comear a construi r os seus prprios. Esta lio abordar:
Para ilustrar esses conceitos, esta lio incluir a criao de vrios exemplos de classes e a gerao de uma montagem para armazen-las.
Criando Objetos
Os objetos no so criados diretamente no Visual Basic .NET; em vez disso voc construir classes que se tornaro a definio do objeto. Em seguida, os objetos sero gerados a partir da classe,
transformando-se em uma instncia dela. Portanto, as etapas para definir seus prprios objetos
comeam com a criao de uma nova classe do Visual Basic .NET.
408
Dia 15
Escopo
Digitar Publ ic Class Test cria uma classe vazia com escopo pblico (Publ ic), o que significa
que qualquer pessoa com uma referncia a esse projeto pode gerar uma instnc ia de Test apenas
executando my Tes t " New Tes t ( ). Isso em geral o que se quer, portanto voc provave lmente
criar classes de escopo pblico, mas essa no a sua nica opo. Tambm possvel criarclas~
ses privadas, usando a palav ra~chave Pri vate para produzir uma classe que s possa ser uti lizada
por outro cdigo em um escopo no mesmo nvel da declarao, o que quase sempre sign ifica
dentro do mesmo arquivo. Se tivssemos declarado sua classe dentro da declarao de outra
(aninhando classes), ento, qualquer cdigo da classe externa poderia acessar o novo objeto. A
pa l avra~chave Private empregada quando no queremos que lima classe seja criada fora de
nosso bloco de cdigo atual. Para concluir, a outra opo de escopo que mencionarei Fri end.
As classes, as varive is e os procedimentos declarados com o escopo Fri end podem ser acessa~
dos por qualquer cd igo dentro do mesmo programa (montagem, servio da Web, ap li cativo
Windows e assim por diante), mas de maneira nenhuma por algum outro cd igo.
Herana
Como parte da declarao da classe, voc pode especificar apenas uma classe bsica para a nova
herdar caractersticas dela, se a classe for derivada de alguma outra. A Listagem 15. 1 mostra um
exemplo disso.
LISTAGEM 15,1 Uma Classe Pode Herdar Caractersticas de Outra Classe
1 Public C1ass Snippet
2 'definio da cl asse
3
4
5
End C1 ass
End C1ass
409
Alm disso, por meio da palavra~chave Notlnheri t ab I e, adicionada depois do trecho do escopo
na declarao da classe, voc tambm pode especificar que sua classe no permite que caracter s~
ticas possam ser herdadas. Se especificar essa palavra~chave, ento, ningum poder criar uma
nova classe derivada dessa. Isso equivalente ao termo 'Sealed', que usado na C# para indicar
que essa nova classe no permite que caractersticas sejam herdadas dela e empregado na de fi
ni o de muitos objetos da plataforma .NET como System.String.
o contrrio da criao de classes lacradas a gerao das abstratas, que devem ser usadas como
classes bsicas e no podem ser criadas diretamente. Se voc definir os objelos bsicos que no
quer que sejam empregados sozin hos, apenas como parte de sua hierarquia de objetos, ento, a
palavra~chave MustInheri t ser perfeita. Uma utilizao comum dessa pa l avra~chave quando
a classe bsica no funcional isoladamente, e um ou mais mtodos~ chave prec isam impl eme n~
tar classes derivadas antes de surgir algo til.
A Listagem 15.2 ilustra o uso da palavra~chave Mustlnherit. Ela ser til para demonstrar que
voc pode em pregar a pa l avra~chave MustOve rride como parte da declarao de mtodos, a fim
de forar a incl uso deles em todas as verses herdadas dessa classe. Se utilizar MustOverride,
no ter de fornec er nenhuma implementao desse mtodo ou propriedade.
ltSTAGEM 15.2
8
9
10
11
12
13
14
15
16
ANALISE
A classe Shape inti l sozinha; est apenas definindo o modelo geral de todos os ob ~
jetos que a compartilham como classe bs ica. Ela uma classe bsica til porque
penn ite a codificao de vrias rotinas a partir de uma nica classe e automaticamente d suporte
a todas as classes derivadas. Defin indo essa classe como Mustlnherit, voc assegurar que os
programadores no possam contrariar suas intenes e criar urna instncia de Shape diretarnente.
Dia 15
410
provve l que ningum tente gerar uma instncia de Shape - e se algum o fizesse , no haveria
muitos problemas - , mas suas intenes se tomaram claras evitando a ut'i lizao incorreta. Marcar
o mtodo Draw como MustOverri de indica que, quando essa classe for herdada desse mtodo, ele
ter de estar presente na nova classe derivada. Mais lima vez, essa uma mane ira de indicar sua
inteno empregando os recursos do Visual Basic .NET em vez de confiar que os outros programadores sempre ajam da mane ira correta.
Adicionando Propriedades
H duas maneiras principais de adicionar propriedades a uma classe: criando variveis pblicas
(que se tornam propriedades diretamente) ou rotinas completas de propriedades. Criar propriedades por meio das variveis pblicas funcionar, mas voc no ter nenhum controle sobre essas variveis expostas e no haver maneira de executar os cdigos quando seus valores forem
alterados. A Listagem 15.3 apresenta esse mtodo de definio de propriedades, que adequado
quando se est apenas testando as classes no Visual Basic .NET.
LISTAGEM 15.3
As Variveis Pblicas Se Tornam Propriedades Quando So Dec l aradas Dentro de uma Classe
Criar propriedades por meio de uma rotina prpria um mtodo mais complexo que proporcionar um contro le total sobre a propriedade. Primeiro, determine o nome e o tipo de dado da propriedade que voc quer adicionar e, em seguida, digite esta linha dentro dos limites de uma
classe (fazendo as substituies apropriadas para o nome e o tipo de dado da propriedade):
Public Property Name() As String
Quando voc pressionar Enter ao terminar essa linha, o Visual Basic .NET criar a estrutura
completa de um procedimento de propriedade:
Pub l ic Property Name() As String
Get
End Get
Set(ByVal Value As String)
End Set
End Property
As duas partes desse procedimento, Get e Set, manipulam a atribuio de um valor de propriedade e o recebimento de um valor (obj Tes t. Name " "Fred"), respectivamente. J que voc no usa-
411
r uma varivel pblica quando empregar esse tipo de rotina de propriedade, provavelmente
precisar de uma varivel privada declarada para conter o valor da propriedade. Ad icion-Ia,
como m_sName, classe de seu exemplo pennilir a criao do cdigo que ser inserido na rotina
Get/Set de sua propriedade. A varivel da classe privada usa o prefixo m (que representa varivel membro) para indicar que ela uma representao interna de uma propriedade exposta. Nessa forma mais simples, o cdigo inserido na rotina da propriedade (veja a Listagem 15.4) ser
lIsado apenas para transferi r valores para fo ra e para dentro da varivel interna.
LISTAGEM 15.4
5
6
7
8
9
10
11
12
A rotina de propriedade da Listagem 15.4 pblica (Publ i c), o que provavelmente ser preferido, mas voc tambm pode defini-Ia como privada (Private), restringindo, dessa maneira, seu
LISO fora da prpria classe.
As verdadeiras vantagens das rotinas de propriedade sobre simplesmente usar uma varivel pblica esto no fato de que voc pode criar propriedades de leitura ou de gravao e executar a validao dos dados em cada tentativa de gravao em uma propriedade.
Dia 15
LISTAGEM 15.5
As Propr i edades Podem Ser de Leitura/Gra vao. Apenas de Leitu ra ou Apenas de Gravao
1 Dption Strict Dn
2 Dption Explicit Dn
3
4 Modu le AIlAboutDbjects
Publ ic Sub Main()
5
6
9
objSample.FirstName '" "Fred"
10
objSample.LastName '" "Jones "
11
Console.WriteLine(objSample.DisplayName)
12
Console.ReadLine()
13
End Sub
14 End Module
15 Public Class Person
16
Private m_sName As String
17
Private m_sFirstName As String
18
Private m_sLastName As String
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
3'
35
36
37
38
39
40
41
42
43
413
o uso das rotinas de propriedade em vez de variveis pblicas apresenta outro grande beneficio;
com uma rotina de propriedade, voc pode executar um cdigo sem pre que o usurio quiser recuperar Oll confi gurar o valor dessa propriedade. Isso perm ite que muitas coisas sejam feitas, inclusive a validao de dados antes do acesso a seus objetos. A Listagem 15.6, por exemplo,
verifica o nmero de um carto de crdito antes do acesso a um objeto, certificando-se de que ele
vlido e rejeitando a tentativa se no fOL
LISTAGEM 15.6
1 Option Explic it On
2 Opt i on Strict On
3
15
16
17
18
19
20
21
22
23
24
Dia 15
LISTAGEM 15.6
(continuao)
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
LISTAGEM 15.6
(continuao)
67
68
End If
End Function
69
70
71
72
73
74
75
76
77
78
79
80
81
sTemp = sNumber
sCredi tCard " " "
Checksum " O
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
10 1
102
103
104
105
106
107
108
109
110
41 5
Dia 15
LISTAGEM 15.6
III
112
sCreditCard
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
For i = 1 To len{sCreditCard) - 1
iTemp = CInt{Mid{sCreditCard, 16 1 , 1)
iTemp = iTemp * {l + (i Mod 2
If iTemp >= 10 Then
iTemp = iTemp - 9
End If
Checksum = Checksum + iTemp
Next i
Checksum = {lO - (Checksum Mod 10 Mod 10
If Checksum = CInt(Right(sCreditCard, 1 Then
Va l idCreditCard = True
sErrorMsg = " "
Else
ValidCreditCard = False
sErrorMsg = sInvalidCheckSumError
End If
End Function
Public Function CardTypeName{ByVal sCardNumber As Strin9) As String
Oim sTmp As String
If Va li dCreditCard(sCardNumber) Then
Select Case mCardType
Case CardTypes.ccvAMEX
sTmp = "American Express"
Case CardTypes.ccvVisa
sTmp = "Visa"
Case CardTypes.ccvMasterCard
sTmp = "MasterCard"
Case CardTypes.ccvOinersClub
sTmp = "Diners Club"
Case CardTypes.ccvOiscover
sTmp = "Discover Card"
Case CardTypes.ccvEnRoute
sTmp = "enRoute"
Case CardTypes.ccvUndefined
sTmp = "Unknown"
End Select
Else
Throw New ArgumentException(sErrorMsg , "Card Number")
LISTAGEM 15.6
41 7
(continuao)
154
155
156
157
End If
Return sTmp
End Function
End Class
ANALISE
Em geral, no se devem usar varive is pblicas como propriedades; func ionar, mas voc terminar sem um controle e sem opes. O melhor a fazer empregar sempre as rotinas de propriedade e utilizar cop iar/colar para manipu lar a digitao adicional.
Criando Mtodos
Para adicionar mtodos a sua classe, voc criar procedimentos Sub e Funct ion; o tipo exato dependendo de sua situao especi fi ca. Exatamente como com as classes (veja a seo " Escopo"
apresentada no inicio desta lio), possvel criar mtodos que possuam um escopo Publ; c, Pr;vate ou Fr; end . Os mtodos declarados com escopo Pub I ic podem ser acessados por qualquer
pessoa por meio de um objeto desse ti po. Os mtodos Pri vate ficam disponveis apenas dentro
da prpria classe, e os mtodos Fri end s podem ser usados por outro cdigo que esteja dentro da
mesma montagem ou programa executvel. A Li stagem 15.7 mostra a mesma classe de exemplos anteriores (com alguns trechos de cdigo no pert inentes removidos, como as rotinas Property) com um mtodo Pub 1i c adicionado para estabelecer uma conexo com o Out look e tentar
encontrar um endereo de correio eletrn ico para a pessoa em questo.
Dia 15
418
Para usar esse cdigo, voc precisa incluir uma referncia ao Outlook em seu
projeto (e precisa do Outlook 2000 ou do XP instalado e funcionando) . Para adicionar essa referncia a seu projeto, siga estas etapas:
NOTA
LISTAGEM
15.7
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
objOutlook.Session.Logon(NewSession:=False)
objSession = CType(objOutlook.Session , Outlook.NameSpace)
objPerson = objSession.CreateRecipient(Me. OisplayName)
Try
sEmailAddress = String.Format("{O) : {l )" ,
obj Person. Addres sEnt ry. Type , _
obj Person . Addres sEnt ry . Add ress)
Return sEmailAddress
Catch objException As Exception
'Endereo no encontrado
Return " "
End Try
End Funct i on
End Class
Modu le AllAboutOb j ects
Public Sub Ma i n{)
25
26
27
28
29
30
LISTAGEM 15.7
419
31
32
Console . ReadLineO
33
End Sub
34 End Module
Quando voc executar esse cdigo, o Out look poder exibir um aviso (vej a a Figura
15.1) de que um programa est tentando aeessar endereos de correio eletrnico, o
q ue verdade porque isso exatamente o que essa sub-rotina faz.
ANLISE
FIGURA 15.1
Os I/O\'os recursos de
segurana do Out/ook o
a/er/aro e permiliro
que I'uc impea o
acesso program/ko a
seu endereo de correio
ele/rnico e
informaes de conta/o.
/ ,, \
....... k oY<'ll .. _
t <o......
,'tt' t _
W.
Se voc estiver certo de que esse cdigo a causa do aviso, ento, poder dar um cl ique em QK se
quiser que ele obten ha com sucesso um endereo de correio eletrnico. preciso fornecer um nome
que exista em sua pasta Contatos ou em uma de suas listas de endereos, caso contrrio esse cd igo
no conseguir encontrar ningum, e o endereo no ser determinado. A linha 4 cria uma instncia
nova do OUllook; em seguida, a linha 9 obtm a sesso MA P! atua l. A linha 10 captura um objew Na mespace que essencial no mode lo de objetos do Out look e expe tudo que necessrio para o acesso. Usar o mtodo CreateRecip i ent (linha 11) o equiva lente a digitar o valor do nome na caixa
Para de uma mensagem de correio e lelrn ico perm itindo que o Outlook determi ne esse nome. Se
Crea teRee i pi ent falhar (o usurio pode no ser determinado), ento, o bloco Try/Ca tch que incl ui a
obteno do endereo dever impedir que alguma mensagem de erro seja exibida.
Se voc qu iser penn itir que as classes derivadas sobreponham um mtodo defi nido em sua classe bsica, enlo, o mtodo bsico precisar ser marcado com a palavra-chave Overri dab 1e, e o da classe
derivada ter de especificar a pa lavra-chave Overri des. Na Listagem 15.8, a classe Mortgage definida para manipular os clculos da hipoteca (essa classe tambm foi usada no Dia 14, " Introduo ii
Programao Orientada a Objetos" ) e, em seguida, na Listagem 15.9, uma nova classe, Aecel Mort gage, derivada de Mortgage. Nessas Iistagens, as pa lavras-chave Overri dab 1e e Over r i des so usadas para que a nova classe possa acomodar uma agenda de pagamentos que no seja mensal.
Dia 15
LI STAGEM
15.8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
LISTAGEM 15.8
421
(continuao)
1 - (I + dbI Fractio nallnterestRate_
/( 1 - ({I + dblFractionallnterestRate)
+ dblFractionallnterestRate)
46
47
48
49
50
iPayments
Return curPayment
51
End Funct i on
52 End Class
ANLISE
14
15
16
17
18
19
20
21
22
23
24
Dia 15
LISTAGEM 15.9
AccelMortgage Adiciona a Capacidade de Calcular Mais Rapidamen te um Plano de Pagamento da Hipoteca (continuao)
25
26
+ dblFractionallnterestRate)
Return cu rPayment
28
End Function
29 End Class
27
ANALISE
nha 14 faz exatamen te isso declarando um mtodo que ex iste na classe bsica e especificando a palavra-chave Overri des. A prpria funo PaymentAmount foi reescrita para dar
suporte a pagamentos que no sejam mensais. Nessa verso revista da funo, as propriedades necessrias da classe so acessadas por meio da palavra-chave Me (linhas 19, 20 e 22), em vez de se
usar as variveis internas diretamente, porque uma classe derivada no tem acesso s variveis
privadas da classe bs ica. A Listagem 15. 10 um programa cliente simples que usa essas duas
classes, projetado para comparar uma hipoteca comum (com pagamentos mensais) com a mesma
hipoteca quitada com pagamentos antecipados bimestrais.
LISTAGEM 15.10 O
1 Modu le Ma in
2
3
4
5
6
7
Sub Main()
Dim ob jMortgage As New Mortgage()
With objMortgage
.AnnuallnterestRate = 0.07
.NumberOfYears = 25
.Principal = 140000
Consol e . Wri teL i ne (" 10: CI" . PaymentAmountO)
EndWith
8
9
10
11
Dim objNewMortgage As New Acce lMortgage()
12
With objNewMort gage
13
.Annuallnterest Ra te = 0.07
. NumberOfYears = 25
14
15
. PaymentslnYear = 26
16
. Princ ipal = 140000
17
Consol e. WriteL i ne (" I O: CI" . PaymentAmountO)
18
End Wi th
19
Console . ReadLineO
20
End Sub
21 End Module
423
Decidir qual a funo de uma propriedade e a de um mtodo nem sempre fcil e muitos desenvolvedores fazem a escolha errada. No h ' regra' que informe o que fazer, mas posso oferecer-lhe a diretriz que uti li zo e a lgica existente nela. Emprego um teste simpl es quando projeto
meus objetos: "as propriedades devem fazer com que algo acontea". Gosto de escrever classes
de maneira que configurar uma propriedade trs vezes apresente o mesmo resultado final que
configur-Ia uma vez.
Essa diretriz nica evita situaes em que a ordem da configu rao das propriedades de um objeto pode aretar o resultado. Na classe Mortgage, por exem plo, o cdigo poderia ser escri to de
modo que a configurao da propriedade Pri nci pa I fizesse com que o valordo pagamento tivesse de ser recalculado. Se esse fosse o caso, ento, voc poderia querer se certificar de ter configurado as outras propriedades (Annua 1Interes tRa te, NumberOfYea rs) antes de Pri nc i pa 1. Evito
inserir qualquer cdigo em uma rotina de propriedade que altere outras partes internas de minha
classe, que no sejam sua varivel interna correspondente. A funo PaymentAmount da classe
Mortgage poderia certamente ser uma propriedade Oll um mtodo porque no altera nada na classe quando efetua se u clculo. Criei-a como um mtodo nesta lio, porm como uma propriedade no Dia 14; em geral h situaes em que qualquer uma das opes adequada.
Adicionando Eventos
Os eventos so uma parte importante dos objetos na plataforma .NET, principalmente em interfaces grficas com o usurio, mas no restante do Framework tambm . Eles perm item que um objelo informe a todos os interessados que algo aconteceu, o que uma interao muito mais ativa
entre um objeto e o cdigo que o uti liza do que a alternativa em que as propriedades do objeto
so chamadas repetidamente. Os eventos no so adeq uados para todas as situaes, por exemplo, as classes Mortgage e AccelMortgage no apresentam uma necessidade real de possurem
eventos; seu cdigo embutido, e s executado se requisitado. Quando voc precisar de que seu
objeto informe algo a seus usurios, os eventos sero um timo mecanismo para faz- lo.
Considere uma classe projetada para se comunicar com um programa de correio e alertar voc
quando chegar uma correspondncia que atenda a um critrio especifico. Uma propriedade poderia ser con fi gurada como um flag para quando essa nova mensagem chegar, porm , seu programa teria de continuar verificando esse valor. Em vez disso, possvel criar um evento que sua
classe possa lanar com alguns trechos de dados para descrever o que ocorreu. Seu programa
principal no far nenhuma chamada do objeto; apenas escreva o cdigo em um manipulador de
eventos para esse evento de seu objeto. Para criar um evento, adicione uma declarao a sua classe, como no exemplo da Listagem 15.11 .
LISTAGEM
Dia 15
Quando esse evento fo r lanado, voc poder forn ecer valores para cada um dos parmetros, c
esses valores sero enviados para qualquer rot ina que venha a manipul-lo. Para lanar o evento,
o que ser feito em sua c lasse, use a instruo Rai seEvent, como mostra a Li stagem 15.12 (a
classe OutlookMessageWatcher com pl eta).
LISTAGEM 15.12 Listagem Completa do Outlook Message Watcher
1 Imports System
2 Impo rts System . Windows .Forms
3
4 Public Class OutlookMessageWatcher
5
Private WithEvents objInboxItems As Outlook . Items
6
Private ob j Outlook As Outlook.Application
7
Publ ic Event EmailArrived(ByVa l From As String ,
8
ByVal Subject As String , _
ByVal Message As Outlook .MailItem)
9
10
11
12
13
14
15
16
17
18
Private Sub ob j InboxItems_ItemAdd(ByVal Item As Qbject)
19
Handles objInboxItems . ItemAdd
20
Dim ob jN ewMail As Outlook . MailItem
21
Try
22
objNewMail = CType(Item . Qutlook. MailItem)
23
Ra i seEvent EmailArrived(objNewMail . Sende rName ,
24
objNewMail . Subject .
25
ob j NewMai 1)
26
Catch objException As Exception
27
MessageBox.Show(objException.Message)
End Try
28
29
End Sub
30 End Class
425
Depo is de criar um evento em sua classe, voc poder escrever um cdigo para manipular esses
eventos em outras classes declarando seu objeto com a palavra-chave Wi thEvents e, em seguida,
gerar uma rotina de evento por meio de Handles. Por exemplo, a Listagem 15.13 mostra como
essa classe nova poderia ser empregada como parte de um formulrio Windows.
LISTAGEM 15.13 Testando o Message Watcher
1 Public Class FormI
2
Inherits System.Windows.Forms.Form
Private WithEvents objOMW As OutlookMessageWatcher
3
4
7
Pr ivate Sub Forml_Load(ByVal sender As System.Object,
8 ByVal e As System.EventArgs)Handles MyBase.Load
9
objOMW = New OutlookMessageWatcherO
10
End Sub
11
12
Private Sub objOMW_EmailArrived(ByVal From As String,
13
ByVal Subject As String,_
14
ByVal Message As Outlook .Mail Item)
15
Handles objOMW.EmailArrived
16
lbMailltems.ltems.Add(Subject)
End Sub
17
18 End Class
Os dois requisitos para o uso do(s) evento(s) de seu objeto so declarar o objeto por meio de
Wi thEvents e criar um manipulador de eventos empregando a palavra-chave Handl es. Se voc
estiver trabalhando no IDE do Visual Studio, ele poder criar o procedimento do evento automaticamente se o objeto for declarado com o uso de Wi thEvents. Selecione o objeto na li sta suspensa da direita e, em seguida, seu evento na li sta suspensa da esquerda.
Dia 15
da, outras classes podem implementar lima ou mais dessas interfaces, permitindo que sejam
tratadas como se fossem um desses objetos.
As interfaces so usadas em todo o .NET Framework, permitindo que uma quantidade indefinida de classes declare o rornecimento de um conjunto especfico de recursos. Uma das interfaces
definidas no .NET Framework IComparable (os nomes das interfaces em geral possuem um I
maisculo como prefixo), que fornece apenas um mtodo (CompareTo) empregado para com parar o objeto atual com outra instnc ia da mesma classe. Qualquer classe que implemente a interface IComparabl e estar essencialmente declarando que duas instncias dessa classe podem ser
comparadas, e um re lacionamento maior que, menor que ou igual a pode ser determinado.
Para implementar uma interface, uma classe quase sempre precisa fornecer sua prpria verso de
um ollmais mtodos. As classes que implementarem I Comparab I e tero de apresentar sua verso
do mtodo CompareTo. A Listagem 15.14 mostra uma classe que implementa IComparable e a
verso personalizada de CompareTo que a forneceu.
LISTAGEM 15.14
7
Public ReadOnly Property OisplayName() As String
Get
8
9
Return String . Fonnat("{O} {l}" ,
10 m_sFirst Name . m_sLas tName)
11
End Get
12
End Property
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
427
End Set
End Property
32
33
34
35
36
37
38
39
40
If objOtherPerson.LastName < Me. LastName Then
41
Return -1
Elself ob j OtherPerson . LastName > Me . LastName Then
42
Return 1
43
44
El se
45
If objOtherPerson.FirstName < Me.FirstName Then
Return - 1
46
Elself objOtherPerson.FirstName > Me.FirstName Then
47
48
Return 1
49
El se
Return O
50
51
End I f
52
End I f
End Function
53
54 End C1 ass
Implementar IComparabl e faz com que a classe Person possa ser passada para funes como se
fosse um objeto do tipo rComparable e usada com outros objetos que precisam dessa interface
para ser implementados. Um exemplo de como isso poderia ser ti l encontrado na classe SortedLi st do .NET Framework. Essa classe perm ite que seja criada uma lista de objetos, cada uma
com uma chave associada, e mantm a lista ordenada pelos valores das chaves. O segredo que
os objetos fornecidos como chaves devem dar suporte IComparabl e porque SortedL i st depende do mtodo CompareTo exposto por essa interface para executar sua ordenao. Esse requisito
no ser um problema se sua chave for um tipo de dado simples, como uma string, um inteiro ali
uma data, j que todos eles do suporte interface IComparable, mas se voc quiser empregar
uma classe de sua autoria como chave, ela no funcionar a menos que implemente IComparabl e.
A Listagem 15. 15 mostra como poderamos criar uma lista ordenada utilizando instncias da
classe Person como valores das chaves.
Dia 15
LISTAGEM 15.15
1 Option Strict On
2 Option Explicit On
3
4 Modu le AllAboutObjects
5
Public Sub Ma i n{)
6
Oim objPerson l As New Person{)
7
Oim objPerson2 As New Person{)
8
Oim objPerson3 As New Person{)
9
Oim Vall, Va12, Va13 As Integer
10
11
12
13
14
15
16
17
18
19
20
Vall".234
Va12 = 13
Va13 = 500
objPersonl. Fi rstName = "John"
ob j Personl. l as t Name = "Adams"
objPerson2.FirstName = "Quincy"
ob j Person2.lastName = "Wallace"
objPerson3.FirstName = "Arlene"
ob jPe rson3 .last Name"" "Ratuski"
21
22
23
24
25
26
27
28
slPeople.Add{objPersonl, ValI)
slPeople .Add{objPerson2 , Va12)
slPeople .Add{objPerson3 , Va13)
Oim ob j DE As OictionaryEntry
29
30
For Each objOE ln slPeople
31
Console . WriteLine("{OJ {l}" , _
32
CType (obj DE . Key , Person) . Di sp 1ayName ,
33
CType{objOE. Value, Integer))
34
Next
35
Console.Read Line{)
End Sub
36
37 End Module
As interfaces devem ser usadas no lugar da herana quando sua inteno for indicar que uma
classe forn ece alguma fo rma de fu ncionalidade com um (como a capacidade de ser comparada).
A classe Person dos exemplos anteriores tem uma fina lidade comp letamente desvinculada de
429
seu suporte a ser comparada, de modo que esse suporte demonstrado melhor por meio de uma
interface.
o .NET Framework fornece uma ampla variedade de interfaces, mas voc tambm pode criar as
suas de maneira seme lhante ao processo de definio de uma classe nova. A definio de uma interface comea com Pub 1i c Interface <nome da i nterface>, termina com End Interface e contm declaraes de mtodos, propriedades e eventos entre o incio e o fim. Nenhum cd igo entra
em uma interface independentemente do que voc esteja fazendo, portanto as declaraes de
mtodo e propriedade so compostas apenas da pri meira linha de uma declarao com um. A
Listagem 15. 16 define lima interface simpl es, I Debug I nfo, para fornecer algumas informaes
gerais sobre a classe que tem como fina lidade a depurao.
LISTAGEM 15.16 As Interfaces Se Parecem com Cl asses Vazi as
1 Option Expl icit On
2 Option Strict On
3
2 Opt i on Strict On
3
4 Imports System
5 Imports System.lO
Dia 15
LISTAGEM 15.17
Um Procedimento de Registros Aceita Qualquer Classe Que Imple ment e IDebug Info (continuao)
6
7 Public Class LoggingRoutine
8
Const DefaultLogFile As String" IC : \LogFile.txt"
9
Shared Sub LogMsgloFi le(ByVal Message As String ,
10
ByVal FileName As String,_
11
ByVal Source As IDebugInfo)
12
Dim objLogFile As StreamWriter
13
If File.Ex i sts(FileName) lhen
14
ob j LogFi le " File.Appendlext(FileName)
15
ElseIf Directory.Exi sts _
16
(Path.Getoi rectoryName(Fi 1eName)) lhen
17
objLogFile " File.Createlext(FileName)
18
El se
19
'error, use default log file
20
ob j LogFi le " File.Appendlext(DefaultLogFile)
21
End If
22
23
2'
25
26
27
28
29
30
31
objLogFile.Flush{)
32
objLogFile.Close{)
33
End Sub
34 End Class
Essa classe de registras mostra como o uso de uma interface comum para vrios ob
jetos pode ser parte do projeto de um aplicativo. O proced imento compartilhado
LogMsgloFi l e (l inha 9) ace ita vrios parmetros incluindo um objeto do tipo IOebuglnfo, permi
tindo, portanto, que qualquer instncia de uma classe que im plemente essa interface seja passada
para essa rotina. A rotina em si no est fazendo nada excepcional, mas algumas partes dela po
dem ser interessantes. As classes Path, File e Directory so todas do espao de nome
System. ro, e cada uma expe vrias funes compartilhadas ou estticas, portanto, voc pode
usar esses objetos sem precisar criar uma instncia deles. O cdigo da Listagem 15. 18 mostra o
exem plo de uma classe que imp lemen ta lOebugInfo.
ANALISE
Option Explic i t On
Option Strict On
Module Main
Sub MainO
Dim objPer son As New PersonO
obj Per son . Fi r stName " "Duncan"
objPerson . LastName" "Mackenzie"
Console.WriteLine(objPerson.DisplayName(
End Sub
End Module
Public Class Person
Implements IComparable
Implements IDebuglnfo
Private m_sName As String
Private m_sFirstName As Stri ng
Private m sLastName As String
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
43 1
Dia 15
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
6.
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Get
Return m sLastName
End Get
Set(ByVal Value As String)
m sLastName " Value
End Set
End Property
Public Function CompareTo(ByVal obj As Object) As Integer
Implements System.IComparable.CompareTo
'Compare essa instncia com obj, retorne um nmero
'menor que zero para indicar que obj < me, igual a O para indicar que
'obj " me e maior que zero para indicar que obj > me
Dim objOtherPerson As Person
objOtherPerson " CType(obj , Person)
If objOtherPerson.LastName < Me . LastName Then
Return - 1
Elself ob j OtherPerson . LastName > Me . LastName Then
Return 1
El se
If objOtherPerson . FirstName < Me.FirstName Then
Return - 1
Elself objOtherPerson.FirstName > Me.FirstName Then
Return 1
Else
Return O
End If
End If
End Funct i on
Public ReadOnly Property Author() As String
Implements IDebuglnfo.Author
Get
Return "Duncan Mackenzie"
End Get
End Property
83
84
85
86
87
88
89
90
LISTAGEM 15.18
433
91
Public ReadOnly Property Oescription()As String
92
Implements IOebugInfo.Description
Get
93
Return "A classe Person foi projetada para representar" _
94
& " um cliente ou um funcionrio"
95
End Get
96
End Proper ty
97
98
Public ReadOn l y Property SourceFile() As String
99
Imp l ements IOebugInfo.SourceFi le
100
101
Get
102
Return "" 1i qu i dsoap 'bi gproj ect \Source' Person. vb"
End Get
103
End Property
104
105 End Class
ANALISE
A Listagem 15.18 apresenta dois itens: o exem plo de uma classe (Person) que implementa IDebuglnfo (linhas 13 a 105) e de um trecho de cdigo (linhas 4 a II) que cria uma instncia da classe Person e, em seguida, chama o mtodo Di sp l ayName. Como descri to, se voc incluir todo esse
cd igo em um projeto - trs arquivos . vb separados sero adequados - e definir Sub Mai n corno
seu obj eto inicial, ento, o cd igo deve r ser executado sem problemas e produzir um arquivo
(c:, testo txt) contendo suas informaes de rastreamento.
Tanto as interfaces quanto a herana fornecem a capacidade de se ter muitos objetos diferentes
comparti lhando atributos cm comum , mas duas diferenas essenciais as tornam adequadas para
funes distintas. As interfaces no incluem qualquer implementao j unto a esses atributos; a
definio Interface no contm cdigo, e as classes que implementam essa interface devem
fornecer elas mesmas toda a func ional idade. Essa com certeza uma vantagem da herana, o
compartilhamento da funcionalidade implementada na classe bsica com as derivadas, porm,
as interfaces compensam essa diferena com uma flexibilidade muito maior, permitindo que
uma nica classe implemente quantas interfaces quisermos.
No fina l, as duas tecnologias tm alguma semelhana, porm alguns proced im entos diferentes.
Use interfaces quando quiser indicar que uma classe tem determinados (normal mente mais do
que um) recursos, semelhantes a um relacionamento como "m inha classe suporta a interface
Dia 15
Idebug I nfo". Inheri tance. por outro lado, indica " um" relacionamento. Frases como "Cliente uma pessoa" e "Func ionrio uma pessoa" poderiam descrever o relacionamento entre
duas classes derivadas e suas classes-base.
Espaos de Nome
Uma maneira til de criar LIma organizao para suas classes usar espaos de nome. A defi nio de espaos de nome j um mecanismo para a estruturao do cdigo, mas quando voc criar
bibliotecas de classes. a organizao ser ainda mais importante. O .NET Framework emprega
muito os espaos de nome, produzindo classes organizadas de maneira clara pe los espaos de
nome que as contm (System, System . Data, System . 10 e assim por diante), e podemos fazer o
mesmo apenas envolvendo seu cdigo com as definies dos espaos de nome. Eles sero declarados em seu cdigo por meio de Namespace <nome do espoo de nome> e End Namespace. Podero ser aninhados (o que permitiria a criao de urna estrutura na forma
Espaodenomel.Espaodename2.Espaodenome3) pela espec ificao do nome comp leto (Espao denomel . Espaodenome2) , j que no possvel aninhar declaraes Namespace. Quando definidos envolvendo uma classe (veja a Listagem 15.19) ou vrias, elas sero consideradas parte
desse espao de nome e podero ser referenc iadas como Espaodenomel.Classel em seu cdigo.
435
FIGURA 15.2
A caixa de dilogo Neil'
Project iI/c/ui modelos
para a criaio de
bibliotecas de classes.
_ '..i''''''''
_ _ " .....
,_,
~
a ...... co .. _"
-0 ...... , . . .. _,
a ........... ',...".., ~_,
-a ....... .....,wr
,,--
_ .M:I _
--
[ii.j
1'1
ii:;a
wo ,
"""d ........
!JP
-.
.......,.
....>CT _ _ 0....0
..:J
r _to"",,",
_
.""
.................... _
.... 1\0
, ...... ,.
6
End Cl ass
7 End Namespce
B
9 Modu l e modI
10
Sub Ma in O
11
Dim ob j Class2 As libPerso n.Class2
12
13
End Sub
14 End Module
Voc tambm pode usar o mesmo nome para um espao de nome em vrios arq uivos de cdigo e
at em diversas bibliotecas de cdi gos, e o Vi sual Stud io .NET considerar cada definio desse
espao de nome como parte do todo. As Listagens 15.20 e 15.21 ilustram isso, representando
dois arquivos distintos.
LISTAGEM 15.20 O Mesmo Espao de Nome Pode Ser Usado em Vrios Arqui vos
1 Option Explieit On
2 Option Strict On
3 Namespace l i bPerson
4
Publ ie Class Classl
5
Dia 15
LISTAGEM
15.20 O Mesmo Espao de Nome Pode Ser Usado em Vrios Arqui vos
(continuao)
6
End C1 ass
7 End Namespace
LISTAGEM
1
2
3
4
5
6
7
15.21 Para o Programador Que Usar Seu Cdigo. Tudo Parecer Parte de
um nico Espao de Nome
g Module modi
10
Sub MainO
11
Dim objClass2 As libPerson.Class2
12
Dim objC1ass1 As libPerson.Class1
13
End Sub
14 End Module
No final da Listagem 15.2 1, podemos ver o cdigo declarando e usando as duas classes (linhas
I I e 12). Quando voc quiser construir uma biblioteca de cdigos e compil-la em uma OLL, poder envolver todo o seu cdigo em declaraes Namespace para facilitar ao usurio a localizao de suas classes. Como examinaremos um pouco mai s adiante, suas classesj parecero estar
agrupadas depois que forem inseridas em uma biblioteca e fizerem referncia a ela em outro projeto.
437
3. Selecione Add Reference no menu que aparecer, e voc ver a caixa de dilogo Add Reference (veja a Figura 15.3).
4. D um clique no boto Browse e encontre o arqu ivo libPerson.d ll que fo i criado.
'''''~
1 Option Explicit On
2 Option Strict On
3
Module Modu l eI
Sob MainO
Dim objClass As l i bPerson . libPerson.Classl
6
7
End Sub
8 Eod Modul e
4
5
Observe que o uso do espao de nome l; bPerson resultou em um agrupamento secundrio que
provave lmente desnecessrio. Empregue espaos de nome em suas bibliotecas para criar agrupamentos mais granulares do que a biblioteca em sua total idade.
438
Dia 15
Resumo
Fazer a POO trabalhar para voc, em seus apl icativos, no uma questo tcnica, e sim de projeto. Quando for criar o projeto conceituai de seu apl icativo, precisar pensar em termos de objetos. Se consegui r fazer isso, ento, desenvolver o sistema usando objetos no ser uma mudana
completa de parad igma, mas apenas uma passagem do conce ituai para a implementao.
P&R
P Ouvi o term o ' polimorfismo' relacionado programa o orientada a objctos. Isso
significa que preciso ter mais de uma esposa para trabalhar com o Visual Ba sic
.NET ?
R No terna, isso nada tem a ver com suas relaes fami liares. O po limorfismo descreve a
capac idade de tratar muitos objetos diferentes como se fossem do mesmo tipo, permitindo que voc tenha classes d ife rentes, como Crculo, Quadrado e Tri ngulo, porm tratando todas como o tipo Fonna. Esse concei to t il e fornecido pelas tecnologias de herana
e interfaces .
Workshop
O Workshop foi planejado para ajud-lo a antecipar possveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar seu conheci mento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios",
Teste
I. Se voc tiver entidades em sua empresa que sirvam para vrias finalidades (Pedidos,
Cl i entes, I tensDosPedi dos, Eventos), mas todas compart ilharem alguns recursos ou capacidades, qual conceito da POO deve ser usado em sua criao?
439
2. Quando voc ti ver um relacionamento de herana, como Funcionri o e Cl i ente, os dois derivados de Pessoa, como assegurar de que certos mtodos ou propriedades da classe bsica
sejam implementados nas classes derivadas?
3. Novamente, em um relacionamento de herana, como voc cria uma classe bsica que
no possa ser gerada, forando os usurios de seu cdigo a cri ar apenas classes que tenham sido derivadas da bsica?
4. Como voc indi ca q ue nenhuma das caractersticas de uma classe pode ser herdada?
Como isso tambm conhecido?
Exerccios
C ri e um objeto, ou uma hierarquia de objetos, destinado a re presentar um cliente. Tente constru-Ia usando umaou mais classes com um en foque na reutilizao de seu cdigo por outras partes de seu apl icativo.
SEMANA
DIA
Formulrios Windows Avanados
No Dia 9, "Desenvolvendo uma Interface com o Usurio com os Formulrios Windows", voc
viu como construir aplicati vos usando os formulrios Windows (os Windows Forms). Como j
deve ter imaginado, h muito mais a aprender nessa rea. Nesta lio, examinaremos outros tpicos relac ionados criao de ap licat ivos com form ulrios Windows. Em parti cular, nos dedica-
remos aos
Menus.
Menus
Se voc usou alguma verso do Windows, deve estar fami liarizado com os menus. Eles aparecem em quase todo aplicativo e concedem acesso a maioria dos recursos do programa. Voc vai
querer adicionar menus a muitos de seus programas.
Di a 16
442
aparecer em uma nova seo do IDE (veja a Figura 16.1). A segunda diferena entre adicionar
um controle MainMenu e a maioria dos outros controles que em geral s inserido um nico
NOTA
Embora voc realmente possa adicionar v ri os controles Ma i nMenu a um formulrio, s um pode esta r ativo em um dado momento. possvel alternares controles Mai nMenu configurando a propriedade Menu do formulrio com o menu
desejado.
FIGURA 16.1
II'Ir;JEJ
O formlllrio depois
que o COllfrole
MainMenu foi
adiciollado.
Emborao controle MainMenu no aparea no fo rmulrio, ele realmente o altera. Depois de adicionar um controle Ma i nMenu, voc deve ver uma nova faixa no formu lrio, logo abaixo da barra de
ttulo, como mostra a Figura 16.1.
Voc adiciona itens ao menu construindo-o visualmente. Quando o controle MainMenu for selec ionado no IDE, voc dever ver uma rea de texto com as palavras ' Type Here' no canto superior
esq uerdo do formulrio que estiver projetando, onde o menu Fi le norm almente se encontra. D
um clique nesse espao e digite o texto que deseja ver no menu. Ao faz-l o, mais duas reas de
443
texto surgi ro: uma ao lado do item que acabou de ser criado e outra abaixo (veja a Figura 16.2).
Os itens que forem adicionados faixa do menu sero os menus de nvel mais alto de seu aplicativo, enquanto os que fo rem inseridos abaixo deles sero as opes do menu. Por exemp lo, digite
File (Arqui vo) na caixa inic ial. Abaixo, adicione os itens New (Novo) e Exit (Sai r) . D um clique
no espao prximo ao menu File e digite View (Vi suai i ar) para criar um novo menu. Abaixo de
View, insira os itens Red (Vennel ho ), Green (Verde) e Blue (A uI) . Enquanto est iver trabalhando em um menu, os outros menus de nve l mais alto sero fechados. No entanto, podero ser
abertos novamente se precisarmos adicionar novos itens.
FIGURA 16.2
Editio de menus
preparada.
_0__
.,......
r.rEl
T.......
Exatamente como nos outros controles, voc deve estabelecer uma conveno para nomeao
dos itens de seu menu. Sugiro utilizar a desta lio:
o
Os itens do menu de nvel superior devem ser nomeados usando-se o prefixo de trs letras
mnu , seguido do texto para o menu - por exemplo, mnuArquivo, mnuEditar, mnuAjuda.
Itens de menus-filhos devem ser nomeados com base no menu de nve l superior em que
esto contidos, mais o texto do novo item. Voc pode querer abreviar ou escolher apenas
uma parte do texto, esperando que ainda assim o nome resu ltante seja excl usivo. Por
exemplo, mnuArqui voAbri r, mnuAjudaSobre, mnuJanel aHori zonta 1. Os itens repet idos do
menu, como os separadores (as linhas horizontais usadas para agrupar sees de um
menu), devem ser nomeados com o ac rscimo de um nmero no final, a menos que possamos dar a eles um nome exclusivo.
444
Dia 16
Os Teclados e os Menus
Embora os menus proporcionem acesso aos recursos, na verdade, podem lirni tlo para alguns
usurios. Os menus so mesmo tei s, mas podem bloquear as usurios que no tenham experincia ou aptido de usar o mouse. Por outro lado, os usurios avanados podem no querer alternar
constantemente entre o teclado e o mouse. Ao projetar menus para seus aplicativos, lembre-se
desses dois grupos.
O suporte ao teclado pode ser adicionado aos menus de duas manei ras. Primeiro, devem ser adicionadas teclas de acesso a todos os itens do menu. As feclas de acesso so os itens sublinhados
do menu, por exemplo, o A do menu Arquivo. Elas permitiro que as pessoas que no saibam
usar um mouse ou no tenham um, utilizem seus menus. Em geral, a primeira letra de um menu
ou de um item de menu uma tecla de acesso . No entanto, para ev itar ter vrios itens com a mesma tecla de acesso, voc pode ter de usar outra letra da palavra. Por exemplo, em muitos produtos da Microsoft, a tecla de acesso do menu Arqu ivo a letra A, enquanto o menu Ferramentas
utiliza a tecla M.
D um clique no menu File criado anteriormente. Altere a propriedade Text para File. Um travesso aparecer emba ixo do F. Voc tambm pode adicionar esse s ublinhado dando um clique
em um item do men u para selec ion-lo, aguardando um pouco e, em segu ida, dando um clique
novamente para poder editar o texto. Adicione um E comercial (&) antes da letra que qui ser que
seja a tecla de acesso desse item do menu. Associe teclas de acesso aos menus j criados conforme o descrito na Tabela 16.1.
TABELA
16.1
Item do Menu
Tecla de Acesso
File
N,w
Exit
View
R,d
Green
Slue
NOTA
A segunda maneira de adicionar o supone do teclado aos menus por meio de tec las de atalho
ou, como so s vezes conhecidas, aceleradores. As teclas de atalho em geral so assoc iadas s
445
teclas de funo (como F I para ajuda) e so pressionadas junto com a tecla Ctrl- por exemplo,
Ctrl+C costuma ser a combinao de teclas que cri a o atalho para o comando Copy (Copiar).
Elas fornecem aos usurios uma maneira rpida de acessar comandos freqlientemente usados.
No so obrigatrias, mas proporcionam atalhos para ajudar os usurios, principalmente os
acostumados a li dar exclusivamente com teclados ou os usurios experientes . Embora no tenhamos sem pre uma tecla de atalho associada a cada item de menu, voc deve empreg-Ias nos
mais usados. Alm disso, bom adic ion-I as aos itens do menu em que costumamos v-las,
com o nos comandos C ut (Recortar), Copy (Copiar) e Paste (Colar).
As teclas de atalho so ad icionadas aos itens de menu por meio da propriedade Shortcut. Selecione Shortcut na lista suspensa. Crie as teclas de atalho como descrito na Tabela 16.2.
TABElA 16.2
Item do Menu
Atalho
N,w
Ctrl N
Exit
CtrlO
R,d
CtrlR
Green
CtrlG
Blu e
CtrlB
NOTA
As teclas se lecionadas no aparecem no item de menu no tempo de projeto (vej a a Fi gura 16.3);
no entanto, surgiro quando o aplicat ivo for executado (veja a Figura 16.4).
Adicionando Cdigo
Tanto os menus de nvel s uperior quanto os itens de menu do s uporte a vrios eventos. Entretanto, em geral s o evento Cl i ck usado. Ele ocorre quando o us urio se lec iona o item de
menu. Adic ione um cd igo ao man ipulador desse evento para que ele execute alguma ao que
seja necessria. D um clique dup lo nos itens de menu para abrir ajanela de cdigos e ad icione
um ao evento Cl i ck. Adicione o cdigo da Listagem 16. 1 ao formulrio.
446
Dia 16
' - " " _' .................... '1_1 ....... ~ .. I _ I
FIGURA 16.3
0"0
:1 ~ e
10<* _
... : .. ,p . Q
"'"
"~
.,,~~~
. ................
I"Ir:lD
-,._ __
~' ,:"
~~:~:"
I"I[]
..
.-
--.-.-- -
"' ,_' .....~
~-
.-
........ ,......
FIGURA 16.4
feclas de a/afho
110
tempo de execucio.
1
2
3
4
End Sub
6
7
8
9
10
11
12
Me.CloseO
End Sub
'
....
3.,,9 .........
,~
....
'-
,,'
LISTAGEM 16.1
13
14
15
16
17
18
19
20
21
447
End Sub
Private Sub mnuViewGreen_Click(8yVal sender As System .Object ,
8yVal e As System.EventArgs) Handles mnuViewGreen . Click
Me.BackColor = Color.Green
End Sub
Private Sub mnuViewBlue_Click(ByVal sende r As System.Object,
ByVal e As System.EventArgs) Handles mnuViewBlue . Click
Me.BackColor = Color . Blue
End Sub
ANALISE
Compi le e execute o aplicativo. Use os itens File e New (ou press ione Ctrl+N) para abrir vrias
telas do menu. Tente alterar a cor dos formulrios usando os itens Red, Green e Blue do menu
(lembre-se de que tambem existem teclas de atalho para esses itens). A Figura 16.5 mostra o
aplicativo em execuo. Para concluir, feche todos os formulrios usando o item Exit do menu
para encerrar o aplicativo.
FIGURA 16.5
ExecutaI/do o menu de
exemplo.
448
Dia 16
Algumas Sugestes
Como voc viu, os menus fornecem uma maneira comum de acesso aos recursos de seu progra
ma. Contudo, se tomam mais teis quando as pessoas encontram os comandos no mesmo local
em todos os programas. Portanto, ser uma boa prtica configurar seus menus de maneira semelhante de outros aplicativos. Isso ajudar seus usurios a conhecerem seu aplicativo porque
eles encontraro os comandos mais rapidamente se esses estiverem onde se espera encontr-los.
[S50 signi fica que voc deve ler alguns menus comuns e que eles devem estar localizados no
mesmo lugar em que so colocados em outros programas. A Figura 16.6 mostra alguns dos prin-
cipais menus comuns de programas como o Word, o Excel, o PowerPoint, a Calculadora (todos
em ingls) e o Visual Basic .NET. Tente reproduzir aplicativos como esses, se isso for apropria
do para o seu aplicativo.
FIGURA
16.6
kfelll/s COIl1I/IIS.
~ ~ ~
r-
I'<!"_ 1* '''''' _
ljI\>
@ !lIo tdt _
Pt ' - 1_
(/0<.0 _
- !li ~ I ~ --
. 12
.. ___ ' -
Q~ ,, ~ a
(, ~"'"
~..
1=;=" li" _
.J<J~
" ,O -
1_ SIcIo _ _ t!>l>
' e ...
1/
ljI\>
::!l ~
. 1]
/I/
iII :
.a.l.tJ~
:1.--- ><
III .~ "",'.....
Eclaro que se seu aplicativo no usar arquivos ou tiver te las alternativas, voc poder no achar
apropriados alguns desses menus. Por exemplo, o aplicativo Calculadora que vem no Windows
no tem um menu File (Arquivo). Da mesma maneira, muitos aplicativos no precisam de outros
menus comuns, como Edit (Editar), Toais (Ferramentas) ou Help (Ajuda) . No ser necessrio
inclui r esses menus se no precisarmos deles; no entanto, se eles realmente existirem , devem fi
car nos locais esperados.
Exatamente como h menus comuns de nivel superior, voc tambm deve construir menus para
seus aplicativos de modo que sejam semelhantes ao de outros aplicativos utilizados pelos seus
usurios. Por exemplo, o menu Arquivo em geral deve conter os itens Novo, Abrir, Salvar e Sair.
Da mesma maneira, o menu Editar deve apresentar os itens Recortar, Copiar e Colar.
449
Faa
Examine outros aplicativos para obter sugestes de estruturas de menus comuns quando
definir os seus. Use essas estruturas de menus para ajudar seus usurios a encontrar comandos de que precisem.
FIGURA 16.7
Aplicativo com
..rJll
iflfeljace de
doeI/mel/los 1IIllliplos.
Dia 16
documento aberto exibido em sua prpria janela. Portanto, um fonnul rio contm apenas um
documento. Em um aplicativo MOI, pressupe-se que um formu lrio possa conter vrios documentos. Basicamente, isso verdade. No entanto, urna definio melhor seria que uma janela
contm vrios outros formulrios, cada um com apenas um documento. As verses mais antigas
do Microsoft Word usavam essa estratgia . Oe maneira semelhante, o prprioVisual Basic .NET
um apl icativo MOI. Voc pode ter vrios documentos abertos ao mesmo tempo. Cada um deles
exibido em sua prpria janela dentro da jane la-pai do Visual Basic .NET.
Adicionando o Formulrio-pai
A nica diferena entre criar um aplicativo Windows comum e um aplicativo MOI o continer
da MOI. O cominer ou fonn ulrio-pai o fo rmulrio de seu aplicativo que contm seus fi lhos.
Nenhum formulrio interno pode ser retirado do pai MOI. Temos duas razes para isso:
Ele diminui as chances de um ou mais formulrios serem perd idos por usurios iniciantes.
Os usurios menos famil iarizados com a navegao no Windows s vezes perdem um
formulrio selecionando outro e em geral no conseguem local izar o anterior usando a
barra de tarefas.
Em geral, todos os outros formulrios do apl icativo so filhos desse formulrio-pai. No entanto,
voc pode no querer que alguns deles sejam um fi lho. Isso seria desejvel se o formu lrio no
estivesse contido logicamente no formulrio-pai. Por exem plo, no Visual Basic .NET, uma janela de cdigo est logicamente contida dentro dele e, portanto, deve ser um formulrio-fi lho.
Como caixa de dilogo para abri r arquivos, por outro lado, no est logicamente contida no aplicat ivo e, portanto, no uma janela-fi lha.
Voc pode criar um novo formulrio-pai MO I con fi gurando a propriedade IsMdiContainer
como True . Fazer isso adicionar um novo controle ao form ulrio, um controle Mdi Cl i ent. Esse
controle ocupa todo o formu lrio e o continer dos formu lrios-filhos.
Depois que voc tiver um formulrio-pai MOI, poder tornar outros formulrios-filhos dele
configurando sua propriedade Mdi Parent antes de exibi-los. Configure essa propriedade para
apontar para o formu lrio-pai. A Listagem 16.2 mostra um exemplo disso.
LISTAGEM 16.2
1
2
3
4
5
6
LISTAGEM 16.2
7
8
oForrn.MdiParent " Me
oForrn.ShowO
451
End Sub
Para exibir outro formulrio , a primeira etapa criar uma nova instncia do fonnu lrio desejado (linha 6). A seguir, a propriedade Mi dPa rent con figurada como formulrio-pai. Esse f01mulrio deve ter sua propriedade IsMi deonta i ner configurada como True. Para
concluir, o formu lrio exib ido (linha 8). Ele no pode ser removido dos limites do fonnul
rio-paI.
ANALISE
ND T A
Embora os apl icativos MDI forneam muit os benefcios, voc pode no querer
us-los na maioria de seus aplicativos. A Microsoft reduziu bastante o uso que
faz de aplicativos MDI, declarando que muitos usurios iniciantes ficam confusos por causa deles. Por exemplo, tanto o Microsoft Word quanto o Excel eram
aplicativos MDL No entanto, agora so ap licativos SDI e geram uma janela por
documento.
Portanto, como qualquer tecnologia, use a MDI onde apropriada e quando
seus usurios a compreenderem.
A MOI e os Menus
Como de se esperar, quando apenas uma janela puder conter vrias janelas-filhas diferentes, os
aplicativos MDI possuiro configuraes especiais de menu. Elas permiti ro que voc organize
asjanelas-filhas mais fac ilmente. Em geral, os apl icativos MDI possuem um menu Window (Janela) que d acesso a esses comandos.
O menu Window padro tem quatro comandos:
Dia 16
452
FIGURA 16.8
O comal/do Ti/e
Hori:on/ally aplicado
aos formulrios-filhos.
I'II'J EI
j!'I .. ,...........
FIGURA 16.9
O comal/do Ti/e
Ver/kal/)' aplicado (lOS
forllllllrios-fil hO$.
1'I(J Cl
........
lllo1EJ
Cascade (Em cascata) Organ iza as janelas-filhas de modo que tenham todas o mesmo
tamanho. Cada janela posicionada um pouco abaixo e direita das que esto atrs dela,
resultando em uma disposio na qual voc pode visualizar as barras de ttulo de cadajanela-filha (veja a Figura 16.10). Isso t il para demonstrar que documentos esto abenos
110 momento.
453
FIGURA 16.10
Formulrios-filhos em
cascata.
A rrange Icons (Organizar cones) Organ iza todas as j anelas min im izadas de modo que
fi quem d is postas e m linha ao longo da parte infe rior dajanela-pai (veja a Figura 16.11 ).
til para organ izar janelas-fi lhas que no estejam e m uso no momento .
FIGURA 16.11
O comando Arrange
leons aplicado (10$
formlllrios-ji f110$.
A lm dos itens com uns, o menu Window normalmente tambm apresenta uma lista de todas as
jane las-filhas (veja a Figura 16. 12). Em geral esse recurso chamado de lista de jane las. Ele lista
todas as janelas- Iilhas abertas e mantm uma marca de seleo prxima que est iver ativa . Em
vez de voc mesmo desenvolver e faze r a manuteno do cdigo que produzi r esse resu ltado, o
454
Dia 16
Visual Basic .NET facil ita a incluso dessa li sta. Apenas configure a propriedade Mi dLi st como
True para o menu de nvel superior onde quiser ad icionar a lista de janelas.
FIGURA 16.12
Menll com a lis/a de
Tlotpk"Iv
IIo'ttI:oIr
jalle/as.
Para saber como se cria um aplicativo MDI, voc desenvo lver um visualizador simples de figuras. Crie um novo aplicativo Windows e chame-Q de Mui ti PicView. Altere o nome do formulrio
no Solution Explorer para Mdi Parent. Abra a tela de cd igos do formul rio e altere o nome da
classe de Fonn! para Md i Parent. Para concluir, abra as propriedades do projeto e configure Startup
Object corno MdiParent. Configure as propriedades do fonnulrio como mostra a Tabe la 16.3.
TABElA 16.3
Propriedade
Valor
Si ..
4W,360
Text
Picture View
True
o usurio poder acessar um menu que lhe pennitir abrir novos arquivos a fim de visualiz-los.
Adicione os controles Ma i nMenu e OpenFi 1eDialog ao formulrio MDI-pai. Renomeie o objeto
Mai nMenu como mnuMa i n e construa o menu como mostra a Tabela 16.4. Configure as propriedades de OpenFi 1eDi ai 09 como descrito na Tabela 16.5.
TABELA 16.4
Item do Menu
Propriedade
Valor
Nvel superior
(Name)
MnuF il e
Text
Fil e
(Name)
MnuF i I eOpen
Text
&Open
Shortcut
Ctrl +0
(Name)
MnuF il eSep
Abaixo de File
Abaixo de Open
Text
Abaixo do separador
(Name)
MnuFi 1eExi t
Text
E&x i t
Shortcut
Ctrl+Q
TABELA 16.4
Item do Menu
Propriedade
Valor
( Name)
MnuW i ndow
Text
&Window
Mdi Li st
True
(Name)
Text
Tile &Horizontal1y
(Name)
MnuW i ndowVerti ca 1
Text
Tile &Vertically
(Name)
MnuWindowCascade
Text
&Cascade
(Name)
MnuWindowArrange
Text
&Arrange Icons
Abaixo de Window
Abaixo de Tile Horizontally
Abaixo de Tile Vertically
Abaixo de Cascade
TABElA 16.5
455
Propriedades de OpenFileDialog
Propriedade
Valor
(Name)
DlgOpen
Fil ter
o menu File ser usado para abrir novos arquivos de figuras e para encerrar o aplicativo. Adicione o cdigo da Li stagem 16.3 ao formu lrio para os itens do menu.
LISTAGEM 16.3 Cdigo para os Comandos do Menu f ile de MultiPicView
2
3
4
5
6
7
8
9
10
11
12
Dia 16
LISTAGEM 16.3
13
14
15
16
17
18
19
20
21
End Sub
ANALISE
o cd igo deve ser seme lhante ao que j vimos. O manipu lador do evento File, Open
exibe OpenFi I eOi a I og (linha 6). Se o usurio se lec ionar um arq uivo, o cdigo criar
um novo form ulrio frmVi ew, que geraremos logo aps, e configurar sua propriedade Mdi Parent
com o formulrio atual (linha 8). Em segui da, ele configura sua propriedade Picture com o arqu ivo das fi guras e ex ibe o novo formulrio (linha 10). A figura carregada na linha 9 por meio do
mtodo FromFile da classe Image que recupera uma figura armazenada em um arq uivo.
o manipulador do evento File, Exit ai nda mais simples, fechando o fo rmulrio atual. Isso faz
com que todas as janelas-fi lhas abertas tambm sejam fechadas, encerrando o aplicat ivo.
Alm de escrever o cdigo do menu File, voc tambm deve criar o cdigo dos comandos do
menu Window. A Listagem 16.4 mostra esse cdigo.
LISTAGEM 16.4
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
LISTAGEM 16.4
457
(continuao)
ByVal e As System . EventArgs)
Handles mnuWindowCascade . Click
40
41
42
43
44
45
46
47
48
49
50
51
52
ANLISE
Cada um dos quatro menus Window apenas executa o mtodo LayoutMdi do formulrio MO I-pai, configurando a disposio desejada para os formulrios-fi lhos.
Agora voc est pronto para criar o formu lrio que ser usado para exibir as figuras. Adicione
um segundo formu lrio ao projeto selecionando os itens Project e Add Windows Form no menu.
Quando o nome fo r solicitado, nome ie o novo formu lrio como Pi ctureView. Altere sua propriedade Text para Picture View. Adic ione um controle PictureBox ao fOnTIulrio e configure as
propriedades desse controle como mostra a Tabela 16.6.
TABELA 16.6
Propriedade
Valor
(Name)
PieY iew
Dock
Fill
Acesse a tela do cdigo e adicione uma propriedade pblica ao formu lrio chamada Picture que
representa a propriedade Image de Pi ctureBox. Devemos terminar com algo semelhante ao cdigo da Listagem 16.5.
LISTAGEM 16.5 Propr i edade Picture
1
2
3
4
5
6
458
Dia 16
End Set
End Property
ANALISE
Do mesmo modo que voc pode ter propriedades que representem valores privados
armazenados dentro da classe Form, tambm possve l ter propriedades que repre-
Execute o aplicat ivo. Provave lmente voc poder abrir vrios arquivos de figuras , como vemos
na Figura 16.13.
FIGURA 16.13
~ .. ,........
"fJE3
459
situaes. Existem muitos controles disponveis no Visual Basic .NET que no foram abordados
neste Iivro e vrios outros podem ser comprados. Seri a difci l, se no impossve l, abordar todos
os controles disponveis em um n ico livro, ou como parte desta lio. Portanto, mostrarei alguns dos mais importantes e como us los.
TreeView
o controle Tr eeView deve ser fa miliar para qualquer pessoa que tenha usado o Windows durante
algum tempo. E o q ue aparece no lado esquerdo da janela do Explorer, assim como em qualquer
outro lugar em que um modelo hierrquico exibido. Ele permite que voc mostre ao usurio
uma lista de itens e seus relacionamentos. As figuras exibidas para cada item da lista podem ser
alteradas ou no exibidas de maneira alguma. De maneira semelhante, as linhas que conectam os
itens podem ser personalizadas ou removidas . O controle TreeVi ew deve ser considerado sempre
que fo r preciso exibir muitos itens re lacionados e mostrar esses relacionamentos para os usurios por exemplo, para perm it ir que o usurio pesquise os diretrios, as pastas de correio eletrn ico
ou crie a estrutura de um documento. A Figura 16.14 mostra o controle TreeView em uso, exibindo uma lista de pastas de um disco rgido.
FIGURA 16.14
O cOlllrole Tr eeV i ew em
ao.
~!!r'
..
"'-""ti
..
o controle TreeView possui muitas propriedades, mtodos e eventos. A Tabela 16.7 descreve
aqueles usados com mais freqncia:
Dia 16
TABELA 16.7
Membro
Descrio
Pro priedades
Checkbo xes
Adiciona caixas de texto a cada item do controle TreeView. Isso faci l ita a
criao de uma seleo mltipla .
FullRowSelect
Se esta propriedade for igual a True, a l inha inteira ser selecionada quando um item for marcado. Como alternativa, apenas o texto de cada item
marcado ser selecionado.
Nodes
PathSeparator
Se 1ectedNode
ShowLines
ShowRootL ines
Sorted
Co11apseA11
ExpandAll
BeforeCo 11 apse
Ocorre antes que uma subrvore seja fechada . Pode ser usado para can celar o evento ou atualizar outros controles.
BeforeExpand
BeforeSe1 ect
AfterCollapse
Ocorre depois que uma subrvore foi fechada. Esse um bom momento
se voc precisar liberar os recursos usados pela subrvore, como encero
rar as conexes com bancos de dados.
AfterExpand
Ocorre depois que uma subrvore aberta. Pode ser usado para atualizar
outros controles com os ns da rvore recen t emente exibidos.
AfterSelect
Como descr ito na Tabela 16.7, Nodes a propriedade mais importante do controle TreeView.
Cada item desse conjunto
do que executado com o controle TreeVi ew. A Tabel a 16.8 descreve as propriedades e mtodos
importantes da classe TreeNode.
TABELA 16.8
461
Membro
Descrio
Propriedades
Checked
Usada junto com a propriedade Checkboxes do controle TreeVi ew. Esta propriedade ser igual a True se o objeto TreeNode for selecionado.
Full Path
Retorna uma string que contm cada um dos ns aba ixado que foi selecionado. todos separados pela propriedade PathSeparator do controle Tree
View. Em geral. isso cria uma string semelhante a um caminho.
Nodes
Text
Collapse
[xpand
Toggle
Altera a rvore comeando com o n selecionado para minimizado ou expandido; o est ado em que no estiver no momento.
No so s os objetos TreeNode e todo o controle TreeVi ew que devem ser cons iderados impor
tantes, um objeto adicionallambm o
importante conjunto.
TABELA 16.9
Membro
Propriedades
Count
Item
Retorna um dos TreeNodes do conjunto. Esta propriedade pode ser aninhada por exemplo. tvwFo 1ders. Nodes. Item(3). Nodes . Item( 1) seria o segundo n abaixo
do quarto n de TreeView. (lembre-se de que os conjuntos comeam em O.)
Mtodos
Add
Adiciona um novo n ao fin al do con junto atual. Pode ser um o bjeto TreeNode
ou apenas o texto a ser exibido para o novo n.
Clear
IndexOf
Insert
Remove
RemoveAt
462
Dia 16
ListVie
o contro le Li stVi ew tambm deve ser familiar para a maioria dos usurios do Windows como o
lado esquerdo da janela Explorer, assim como em muitos outros locais. Ele semelhante a li stBox, no fato de poder conter vrios itens. No entanto, fornece mais recursos, j que permite a exibio dos itens de diversas maneiras. Os itens podem ser exibidos como uma lista, associados a
cones grandes ou pequenos. Tambm possvel disponibil izar uma lista com detalhes adicionais
de cada item. Para concluir, podemos usar Lis tV iewno lugar de um controle de grade porque ele
tambm pode exibir linhas de grade . A Tabe la 16. 10 mostra algumas das propriedades, mtodos
e eventos mais importantes do controle ListView.
TABElA 16. 10
Membro
Descrio
Propriedades
Checkboxes
Check Indices
Co lumns
FullRowSelect
Gri dl ines
Deter mina se as linhas de grade sero exibidas quando l istView estiver no modo de exibio 'Deta lhe'. Isso permitir que voc faa
ListVi ew se parecer com um simples controle Grid.
Items
View
Determina como li s tVi ew ser exibido. As opes possiveis so Large Icons, $malllcons, Ust ou Deta i!.
Mt odos
C1 ear
ColumnClick
Se 1ectedlndexChanged
Pode ser usado para alterar a ordem das colunas. Exatamente como o conjunto Nodes do controle
TreeView, a propriedade mai s importante de l istVi ew o conjunto Items. Cada item do conjunto
Items um objeto Li stVi ewltem. Esse obj eto, por sua vez, possui mtodos e propriedades que representam o que
possvel
fazer com cada item de L i stV i ew. A Tabela 16.1\ descre ve as mais
TABELA 16.11
Membro
463
Propriedades de ListViewItem
Descrio
Propriedades
Checked
Index
Selected
Subi tems
Enquanto TreeVi ew possui objetos TreeNodeCo 11 ect i on refletindo os conj untos de objetos TreeNode, Li stVi ew apresenta objetos Li stViewItemCol1 ection. Entretanto, esse conjunto menos
imp0l1ante do que a propriedade que corresponde a ele em TreeView, j que Li stVi ew no apresenta a mesma hierarquia de nS. Em vez disso, h basicamente apenas um objeto Li stVi ewItemCoi 1ect ion. A Tabela 16.2 descreve algumas das propriedades e mtodos importantes desse
conjunto.
TABELA 16.12
Membro
Count
Item
Add
Clear
IndexOf
Insert
Adiciona um novo objeto Li s tVi ewI tem ao conjunto em uma posio solicitada.
Remove
RemoveAt
Di a 16
464
arrastar esse separador de um lado para outro, alterando o tamanho relativo dos doi s controles
(veja a Figura 16.1 5). Esse o controle Sp 1itter. Ele um controle si mples, cuja nica finalidade perm ili resse tipo de redimensionamento dinmico. usado junto com dois controles encaixados. Um fica ancorado a um dos lados do formu lrio-pai , enquanto o outro tem sua
propriedade Dock configurada com Fi 1 1.
E raro ter de usar qualquer das propriedades do controle Spl itter. No entanto, h alg umas propriedades q ue voc pode querer configu rar para personalizar o comportamento do controle. Elas
so descri tas na Tabela 16.13 .
TABElA 16.13
Membro
Descrio
BackCol or
Como nos outros controles, esta propriedade defjne a cor de plano de fundo do cont role Sp1 itter. util para ajudar o usurio a perceber a existncia desse controle.
Dock
mi nS i ze
FIGURA 16.15
Ustmdo o comro!e
Sp1 itter.
.,,_
to,)
EJ
...... Cool')
",.'
...
" ' (Do)
~-
,
....
,.~
465
Para ver como esses trs controles podem ser usados no desenvolvimento rpido de um aplicati
vo, criaremos um clone do Explorer, permitindo que o usurio navegue pelas unidades, exami
nando os arquivos armazenados ne las .
Crie um novo aplicativo Windows. Chamei o meu de Pioneer, mas voc pode dar o nome que
quiser ao seu. Altere o nome do arqui vo do formulrio gerado para PioneerFonn, e a classe criada
para frmP ioneer. Confi gure o Startup Object do projeto corn o frmPioneer usando a ca ixa de di
logo Project Properties. Compile o apl icativo uma vez para se certificar de que no haj a erros.
A interface com o usurio ser simples - com posta dos control es TreeVi ew, Lis t Vi ew e Sp 1i t ter
(vej a a Figura 16.16).
Red imensione o formu lrio para torn lo maior que O padro. Configure essa e outras proprieda
des conforme o descrito na Tabela 16.14 .
F1GURA
16.16
...
~.",,:
..
..r.lEl
ti'\>
para Ploneer.
,_o
8,_...... ,m (Dr'
" ~.
$ ,
'.
m(00<"""')
-, ..............
",- '..
13 ' .....
~_
TABELA
16.14
Propriedade
Valor
Name
Text
FrmPioneer
Pioneer
Size
480 , 330
Adicione um controle TreeView ao formu lrio. Configure as propriedades como as que vemos na
Tabela 16.15.
Dia 16
TABELA 16.15
Propriedade
Valor
Name
Dock
TvwFolders
Left
121
Width
Adicione o controle Spl i tter ao formulrio e altere seu nome para spl Vi ew. Suas outras proprie~
dadesj apresentam padres adequados. Agora adicione um controle ListView ao formulrio.
Configure as propriedades como o descrito na Tabela 16.1 6.
TABElA 16.16
Propriedade
Valor
Name
Dock
LvwFi 1es
Fil 1
View
List
Quando o primeiro formulrio for carregado, o controle TreeView deve exibir as unidades dispon~
veis (veja a Listagem 16.6). Como cada unidade selecionada, seus direlrios serdo exibidos em Tre~
eVi ew, e os arquivos de cada diretrio em Lis tVi ew. Em princpio, no entanto, apenas TreeVi ew ser
preenchido com as unidades disponveis. J que o objeto Di rectory usado nesse cdigo, voc tam~
bm deve incluir Imports System.1O no incio dele. Isso pennitir que voc empregue o objeto
Di rectory sem ter de quali fic~lo totalmente (isto , sem ter de escrever Sys tem. 10 . Di rectory).
LISTAGEM 16.6
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
End Sub
467
compartilhado e retorna um array contendo os nomes de todas as unidades disponveis no computador. A esto includas unidades de disquete, de CD- ROM, de rede mapeada e outros dispositivos que se paream
com uma unidade de disco rgido. A linha 6 preenche esse array e o bloco For Each ... Next executa um lao nele. Adicionamos isso ao controle TreeVi ew como um objeto TreeNode (linha I I) e inserimos na linha 13 um n-filho com o texto durnny . Esse n-filho serve a dois propsitos : marca
os ns que ainda no abri mos e assegura que haja um caractere prximo a todos os ns. Se no
houver nenhum n-filho em uma rvore, o controle no adicionar um smbolo de adio e no
ficar evidente a possvel existncia de filhos. Adcionar um n fictcio que ser removido posteriormente uma estratgia comum para fazer com que todos os ns paream ter filhos.
ANLISE
o controle TreeView apresenta duas funes. Quando um diretrio se lecionado, seus arquivos
so adicionados a ListView. E quando um n expandido em TreeView, os diretrios-filhos do
diretrio selecionado so adicionados ao controle TreeVi ew. A Listagem 16.7 mostra esses dois
manipuladores de eventos.
LISTAGEM
17
18
19
20
21
22
23
2.
25
26
27
28
29
30
16.7
31
32
33
34
35
36
37
38
39
40
41
42
Dia 16
LISTAGEM 16.7
43
44
45
46
47
48
49
lvwFiles.ltems.Clear()
50
51
52
53
54
55
56
57
58
59
60
61
Private
Oim
Dim
Dim
62
63
64
65
66
67
68
69
70
Private Function StripPath(ByVal path As String) As String
71
'remova o caminho principal do nome do arquivo
72
Dim i Pos As Integer
73
'encontre o ltimo caractere \
74
iPos = path.lastlndexOf("\")
75
'tudo que estiver depois dele o nome real do arquivo
76
Return path.Substring{iPos + 1)
77
End Function
78 End Class
Um dos recursos do controle TreeView que para cada operao que afete os ns da
rvore h um evento Before e um After. Os eventos Before, como o man ipu lador de
eventos 8eforeExpand (linhas 17 a 30 da listagem do cd igo), fornecem uma chance para cancelar
o evento ou fazer alteraes antes que seus efeitos sejam ex ibidos. No caso do evento BeforeExpand, voc pode alterar o contedo dos filhos do n antes que a lista seja expandida. Lembre-se de
que anterionnente adicionamos um n fictcio para garantir que cada n tivesse um sinal de adi-
ANALISE
469
o prximo a ele, implicando que poderia ser expandido. O manipulador de eventos BeforeExpand o melhor local para remover esse n fictcio e adicionar os reais. Depois, se no houver ns
fictcios, no teremos de fazer nenh uma alterao porque TreeV i ew conhecer os ns adicionados.
A rotina comea pela atribuio do n afetado a uma varivel temporria. Isso no totalmente
necessrio porque o cd igo poderia ter sido escrito com o uso de e.Node em vez de oNode. No entanto, usar uma varivel temporria como essa ou o bloco Wi th ... End Wi th um bom hbito, j
que um pouco mais efici ente. A seguir, o cdigo tenta encontrar o n fictcio (linha 24). Se ele
existir, ser removido, e os filhos reais sero adicionados por meio da sub-rotina GetChi 1dren
(descrita mais frente). Se o n fictcio no existir, nada ser fei to porque j preenchemos TreeVi ew com os ns-filhos apropriados.
AfterSe1 ect onde Li stView preenchido com os arquivos do TreeNode selecionado. No inicio ele recupera os nomes de todos os arquivos usando o mtodo comparti lhado GetFiles da classe Directory (l inhas 21 e 22). Esse mtodo retorna o
caminho completo para todos os arquivos em um diretrio solicitado. O segundo parmetro para
o manipulador de eventos AfterSe 1ect, e, possui duas propriedades de interesse:
Act i on
Por que o n foi se lecionado? Isto , isso aconteceu durante uma operao de
expanso, de recolhimento ou apenas quando o usurio selec ionou O n?
Node O n que foi selecionado. Essa urna manei ra mais fc il de recuperar o n se lecionado do que a alternativa tvwFo1ders.Se1ectedltem.
Qualquer n de um controle TreeView pode recuperar seu caminho nesse local. O caminho
composto de todos os caminhos-pais, comeando com o n-raiz, separados pelo caractere PathSeparator do controle TreeVi ew. J que ele tem corno padro o caractere de barra invertida, essa
urna maneira fcil de recuperar um caminho semel hante ao da unidade. Por exemplo, se o n
Sys tem32 fo r fi lho do n Wi nnt, que filho de C: \, a propriedade Fu 11 Path do n Sys tem32 seria
C: \Wi nnt\System32. Esse cami nho passado para o mtodo GetFi 1es, que um mtodo compartilhado da classe Di rectory e retorna um array de strings com todos os arquivos do diretrio. Um
lao For Each ... Next (linhas 27 a 29) usado para preencher l istView com todos os nomes de
arqu ivo, porm, primei ro o contedo completo de li s tView apagado (l inha 25) . Observe que o
contedo de cada diretrio recuperado sempre que TreeNode selec ionado; nenhuma tentat iva
de armazenar essa Iista Feita.
o procedimento GetChlT dren usado para preencher um TreeNode com seus ns-filhos (linhas
58 a 68) . O n que ser ad icionado passado para a rotina a fim de ajudar a deterrninar os subd iretrios e identificar o TreeNode que ser preenchido. Observe que o caminho existente do n selec ionado no passado porque isso pode ser determinado por meio do mtodo Fu11 Path do n
(l inha 59) como fi zemos anteriormente no manipulador de eventos AfterSel ect. O mtodo compartilhado Di rectory .GetDi rectori es usado para recuperar um array de strings que contm os
subd iretrios do diretrio selecionado. O cdigo restante semelhante ao usado quando as unidades Foram adicionadas a TreeView. O caminho removido do nome do diretrio selecionado
(l inha 64), e um n fictc io adicionado para assegurar que o n tenha a aparncia de que pode
ser expandido (linha 66).
470
Dia 16
A funo StripPath usada por outros procedimentos para remover o caminho de um nome de
arquivo, deixando apenas o nome . Essa rotina (linhas 70 a 78) usa o mtodo Last i ndexOf do ob-
jeto de st ring para encontrar a ltima posio de um caractere selecionado, nesse caso a barra invertida, "\" , Tudo que estiver antes dessa ltima barra invertida deve ser o caminho, enquanto o
que houver depois dela pode ser o nome real do arquivo. Para concluir, a linha 76 extrai e retorna
16.17
O Piol/eer em ao.
FIGURA
-' .
"'_...-.1.."'.--.....- ,...
.,--"-"
.... .... ...
$- ..... . ,
II> R[C"I"t\.lR
. ~
(':
~ "'. _ ct ,
-..
"" _ H'
e... _
~
e 0.,.11
Resumo
E claro que h muitos outros tpicos a aprender relacionados aos formulrios Windows. Alm
disso, vrios outros controles que esto disponveis na caixa de ferramentas no foram descritos.
Teste-os para ver como podem ajud-lo em seus apli cativos. Se voc encontrar em outro aplicativo um recurso que goste, tente encontrar o controle, ou possive lmente a configurao da propriedade, que permitir reproduzi- lo em seus prprios aplicativos.
471
Voc deve ter percebido que, na verdade, temos usado objetos em todos os nossos aplicativos.
No entanto, voc deve aprender a criar seus prprios objetos. No prximo captu lo (Dia), contimiaremos nosso aprend izado sobre o .NET Framework e algum as classes im portantes que sero
usadas com freqlinc ia.
P&R
P Como voc associaria Ctrl+B a um item de menu de modo que I)ressionando essa
P Qual seria o resultado da execuo deste cdigo se tv Folders fosse um controle TreeVie de um formulrio?
Dim oItem as TreeNode
oItem '" tvwFolders.Nodes .Add( "Dne")
With oItem.Nodes.Add{"Two")
. Nodes . Add (" Three")
. Nodes . Add (" Faur")
End Wi th
R Quatro itens seriam adicionados a TreeV i ew. O n-raiz teria o texto Dne e um n-filho, Two,
que possuiria dois ns-filhos, Three e Four. O bloco Wi th ... End ... With uma alternati va a
armazenar um n em uma varivel TreeNode quando ns-fil hos forem adicionados.
Workshop
o Workshop foi planejado para ajud-lo a anteci par possveis dvidas, revisara quej aprendeu
e comear a pensar em como colocar se u conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Qual a mel hor maneira de organizar as janelas-fil has de um apl icativo M DI para visualizar as barras de ttulo de todos os filhos?
Dia 16
472
Exerccios
I. Encontre exemplos de aplicativos MOI e $D I que voc normalmente use . Fica mais fcil
ou mais difcil manter o regi stro de vrios documentos quando se trabalha com eles?
2. Atualize o ap licativo Pioneer que voc desenvolveu durante esta lio para que exiba os
arquivos por meio do modo de exibio ' Detalhe' do controle Li stVi ew. Adicione colu
nas para apresentar os atributos ReadOnly, Hi dden e System de cada arquivo . Alm d isso,
mostre em outra coluna a ltima vez que o arquivo foi alterado.
SEMANA
DIA
Usando o .NET Framework
No Dia 8 , " Introduo ao .NET Framework", voc examinou pela primeira vez o .NET Framework e algumas das classes que ele disponibiliza. Corno deve ter percebido, discutimos classes
naque la lio. Agora, aprenderemos alguns dos grupos mais comuns de classes que so usados
regularmente. Entre eles esto:
Fluxos e Arquivos
Muitos aplicativos do Visual Basic .NET que voc escrever tero de lidar com arquivos de algum tipo. Pode ser preciso criar arquivos, ler arquivos de configurao ou encontrar arquivos
nas unidades do usurio. Portanto, aprender a trabalhar com arquivos uma habilidade importante, necessria ao desenvolvedor do Visual Basic .NET.
Quando voc comear a trabalhar com as classes do .NET Framework, principalmente ao escrever aplicat ivos para lidar com arquivos, se deparar com freqncia com itens que usam a palavra 'Stream', por exemplo: Fi 1eStream, TextStream, StreamWriter e NetworkStream. Como deve
ter percebido, eles esto relacionados. Os projetistas do Visual Basic .NET e do .NET Framework tentaram facilitar o uso do Framework definindo tudo da maneira mais consistente possivel. Uma maneira pela qual fizeram isso roi empregando os mesmos tipos de objelos em muitos
locais. Um grupo desses objetos o objelo Stream, seus filhos e as classes utilizadas para trabalhar com Slreams. Essas outras classes incluem vrias classes Reader e Wri ter, Encoders e mui-
474
Dia 17
tas outras. Enfocaremos as essenciais, mas medida que avanarmos mais, ser perceptivel a
familiar idade de outras classes dessa famlia.
o Que um Stream?
o termo 'st reams', como muitos usados em computao, uma tentativa de nomear algo que
lembre urna equ ivalncia do mundo real. Um stream no mundo real uma pequena quantidade
de gua, nuindo. Um fluxo de computador semelhante - um fluxo de informaes que passam de maneira seqencial. No entanto, a menos que voc tenha um arquivo sobre os rios do
mundo, tenho certeza de que provavelmente no pensar em gua quando exam inar os arquivos
da unidade de seu disco rgido. Porm, imagine-se corno parte de sua unidade de disco rgido que
l arquivos. Tudo o que ela v LIma srie de informaes, fluindo seqencialmente-um fluxo.
Depois de imaginar os arq uivos como um fluxo, ser mais fcil trabalhar com eles. Ento, seja o
arquivo binrio ou algum que contenha texto, ser possvel lidar com ele da mesma maneira. Isto
, abra o arquivo, manipu le-o e grave nele utilizando os mesmos mtodos porque so todos fluxos. Alm d isso, essas habilidades tambm se aplicam a outros itens que se parecem com fluxo s.
No os abordaremos neste livro, mas a se incluem as comunicaes de rede, a memria de seu
computador, dados criptografados e muitos outros recursos. Aprendendo a ler e gravar arquivos
sim ples de texto, j saberemos como trabalhar com qualquer um desses fluxos.
Arquivos e Diretrios
Antes de comearmos a criar fluxo s, no entanto, passaremos algum tempo examinando como
encontrar, gerar e excluir di retrios e arqu ivos. Isso permitir que voc localize arquivos e crie
diretrios para armazenar seus aplicativos.
Como vimos no Dia 8, o .NET Framework divid ido em lima srie de espaos de nomes. Cada
um contm vrias classes que esto relacionadas de algum modo. Lembre-se de que no Dia 8,
trabalhamos com conjuntos (como ArrayL i st e Queue), e eles foram reunidos no espao de nome
System. Coll ect i ons. De maneira semelhante, todas as classes de arquivos e de diretrios (e fluxos) esto agrupadas no espao de nome System. 10. Esse espao de nome no est, como se
pode pensar, relacionado lua altamente vulcnica de Jpiter, mas, em vez disso, entrada e
sada. O espao de nome System. IO um dos mais usados no .NET Framework por essa razo.
Embora um espao de nome relacionado com a lua de Jpiter pudesse ser til, no seria to utilizado. Sempre que quiser abri r, ler, gravar ou apenas manipular um arquivo ou fluxo, voc precisar desse espao de nome. Felizmente, o Visual Basic .NET sempre o inclui quando cria um
novo aplicativo Windows, portanto ele em geral est disponvel.
Se voc pesquisar o espao de nome System. 10 na ajuda on-line, ver duas classes que no iro
s urpreend-lo - Fil e e Di rectory. Essas duas classes so convert idas em arqu ivos e diretrios.
Elas possuem propriedades e mtodos que representam o que se espera de arquivos e diretrios.
Por exemplo, a classe Di rectory possui mtodos para recuperar s ubdiretrios, acessar a lista de
arquivos do diretrio e assim por diante. De maneira semelhante, a classe Fi l e tem mtodos que
475
so usados para abrir o arquivo, copilo e recuperar infonnaes sobre e le. A Tabela 17.1 li sta
os m todos importantes do objeto Di rectory, enq ua nto a Tabela 17.2 mostra os mtodos impor
tantes da classe Fi 1e.
TABELA
Mtodo
Descrio
CreateDirectory
Oelete
Remove um diretrio.
E:d sts
GetCurrentOirectory
GetDirectories
Getfi l es
TABELA
Mtodo
Descrio
COpy
Copia um arquivo.
Create
CreateText
Oelete
Exclu i um a rquivo .
Exi sts
Open
OpenRead
Verso especial izada de Open que sempre abre o arquivo para leitura.
OpenText
Verso especia lizada de Open que abre arquivos de texto apenas para lei
tura. Esse seria um atalho prtico caso voc estivesse escrevendo um
aplicativo que precisasse ler informaes sobre configurao ou um ar
quivo de registras.
OpenWri te
Verso especia lizada de Open que sempre abre o a rquivo para gravao.
Criando Arquivos
Como voc pode ver nas Tabelas 17.1 e 17.2, vrios mtodos das classes Fi 1 e e Di rectory p<r
dem ser usados na pesquisa e criao de arquivos e diretrios. Esse um timo exemplo da orientao a objetos e m ao- classes q ue re presentam obj etos do mundo real agindo como esse objeto. Po r exem plo, um diretrio deve ter conhecim ento de que d iretrios- fi lhos possui. De maneira
semelhante, deve-se poder solicitar a um arquivo que abra a si mesmo.
Dia 17
476
red). Isso sign ifica que voc no precisa cria r um objele para us-los; apenas
empregue a classe pa ra acess-Ios. Por exemplo, o mtodo Exi sts da classe
Fil e compartil hado. Para saber se um arquivo existe, no necessrio declarar uma inst ncia da classe Fi 1e; utilize a prpria classe. Porta nto, em vez de
escrever:
Dim oFile As New File(}
bExists z oFile . Exists(" algumarquivo . txt n )
determine se um arqui vo existe com o cd igo a segui r:
bExists z File.Exists("algumarquivo.txt"}
Depois que voc criar um arquivo, prec isar ter condies de ler seu conteMo. E a que as clas-
ses Stream entram em cena, assim como as vrias classes Reader e Writer. Quando um arq uivo
for aberto, uma dessas cl asses invariave lmente ser passada, quase sempre uma classe Stream de
um tipo ou de outro. Em seguida, ser possvel ler as informaes do arquivo usando a classe
Streamou aplicando StreamReader a ela. J que a classe Stream com a qual mai s provvel que
lidemos Fi 1eStream, passaremos mai s tempo examinando-a.
Fi leStream uma classe Stream que se obtm quando um arq ui vo lido. O arquivo pode ser de
texto ou binrio. Fi 1eS t ream possui vrios mtodos que pennitiro que voc leia o arquivo e propriedades que estaro relacionadas a ele. A Tabela 17.3 descreve os mais importantes.
TABElA
Nome
Descrio
CanRead (Propriedade)
Igual a True se voc puder pesqu isa r (isto , mover-se para a frente
e para trs) no arquivo. uma boa propriedade em testes para evitar que uma exceo ocorra quando um arquivo no qual no for
possvel mover-se para trs for lido. Isso raro nos arquivos, mas
freqente em alg uns outros tipos de fl uxos.
CanWri te (Propriedade)
Length (Propriedade)
Close (Mtodo)
Finaliza FileS tream. Sempre encerra a classe FileSteam (ou qua lq ue r classe Stream) quando voc t ermina de us-Ia.
TABELA
477
Nome
Descrio
Read (Mtodo)
Seek (Mtodo)
Wri te (Mtodo)
o problema dos mtodos Read da c lasse Fi 1eStream que tendem a no ser muito convenientes
porque todos lidam com bytes. Em vez de us-los, voc pode aplicar StreamReader Fi 1eStream
para ler as infonnaes do arquivo de uma maneira mais natural. A Tabela 17.4 mostra os mtodos importantes de StreamReader.
TABELA
Nome
Descrio
Close
Read
ReadBlod
Readl; ne
L a prxima lin ha de Stream. uma maneira adequada de manipular arquivos que fornecem informaes organizadas por linhas.
ReadToEnd
A Li stagem 17. 1 mostra uma maneira comum de abrir um arqu ivo de texto e ler o contelldo em
1
2
3
4
5
6
7
8
g
LISTAGEM
478
Dia 17
Descrio
Close
que voc possa ter criado. Se isso falhar, poder causar a perda das ai
teraes feitas no arquivo.
Wri te
Grava em Stream.
WriteLine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LISTAGEM
Os mtodos de StreamWri ter devem ser familiares; so os mesmos que usamos na classe Console. Essa tambm uma classe StreamWri ter - projetada para gravar no console.
Agora rena leitura e gravao e crie um aplicativo simples que use as trs classes principai s que
discut imos: Fi 1eStream, StreamReader e StreamWr"i ter. Como exemplo, geraremos um substitu-
479
to simples para o Bloco de notas que permiti r a leitura e gravao de arq uivos de texto . Posteriormente ele poder ser estendido para permitir a criao de outros tipos de informaes.
Crie um novo aplicativo Windows e chame-o de Note. Afina l, um programa seu. Como sempre, a primeira etapa aps a criao do projeto se certificar de que o formu lrio principal no
seja chamado de Fonnl. Abra o formulrio na tela do cd igo, localize e substit ua Fonnl por
frT1l'-1ain. Da mesma maneira, renomeie o arquivo como frmMain.vb. Para concluir, abra a ca ixa
de dilogo das propriedades do projeto e configure Startup Object como frnto1a i n. Execute uma
compilao para assegurar que no haja erros.
Adicione um controle TextBox ao fOn1ll1lrio e conligure suas propriedades conforme o descrito
na Tabela 17.6.
TABELA
Propriedade
Valor
(Name)
Multil ine
Text
Scrollbars
Dock
TxtText
True
(deixe em branco)
Vertical
Fi 11
Para fazer com que seu bloco de notas fique igual ao do Windows, voc precisar de um menu.
D um clique duplo no item Mai nMenu da caixa de ferramentas para ad icionar um . Como sempre,
altere o nome para mnuMain . Adicione os itens mostrados na Tabela 17.7.
TABELA
Item
Propriedade
Valor
Caption
Name
Caption
Name
ShortCut
Caption
Name
Shortcut
Caption
Name
Shortcut
Caption
&Fi le
mnuFil e
&New
mnuFi 1eNew
CtrlN
&Dpen ...
mnuFi 1eOpen
Ctrl0
&Save
mnuFi 1eSave
CtrlS
Save &As ...
Abaixo de &Fi 1e
Abaixo de &New
Abaixo de &Save
Dia 17
T ABELA 17.7
Item
Abaixo de Save &As ...
Abaixo de -
Abaixo de Cu&t
Abaixo de &Copy
Abaixo de &He 1p
Propriedade
Valor
"""
Caption
mnuFi I eSaveAs
N,""
mnuFi I eSep
Caption
E&xit
Name
mnuFi I eExi t
Shortcut
CtrlQ
Caption
&Edit
N,""
mnuEdit
Caption
Cu&t
N,""
mnuEditCut
Shortcut
CtrlX
Caption
&Copy
Name
mnuEditCopy
Shortcut
CtrlC
Caption
&Paste
N,""
mnuEditPaste
Shortcut
CtrlV
Caption
&Help
N,""
mnuHe l p
Caption
&About
N,""
mnu He 1pAbout
FIGURA 17.1
Execulando o nOI'o
exemplo.
TABELA 17.8
481
Objeto
Propriedade
Valor
FileOpenDialog
Name
dlgOpen
Fi lter
Name
OlgSave
Filter
FileName
notel
FileSaveDialog
Primeiro, adicionaremos o espao de nome System . IO ao projeto e ao formu lrio. Abra a pasta
References no Solution Explorer.Voc deve ver um espao de nome System includo na listagem , mas no System. IO, o que bom . Os itens da caixa de dilogo References representam as
bibliotecas (DLLs) que sero realmente usadas para loca lizar o cdigo quando seu aplicat ivo estive r em compilao. Cada uma dessas OLLs pode conter vrios espaos de nome. Um deles
System . 10. Para tornar tudo mais fcil no momento da codificao, no entanto, tambm podemos querer importar os espaos de nome q ue empregaremos. Isso permitir a utilizao de atalhos quando fize rmos referncia s classes. Para obter mais detalhes, veja a nota a seguir.
Importe o espao de nome System. IO para economizar na digitao. Ad icione a Imports
System.IO a primeira linha, antes de Public Class fnnMa;n.
NOTA
Muitas pessoas que comeam a usar o Visual Basic .NET confundem-se com
as referncias e quando emprega las no lugar da instruo Imports. As referncias so adicionadas po r meio do Solution Explorer ou do menu Project. Elas
representam os outros componen tes que seu aplicativo usara. Se voc for empregar um cdigo que exista em o utra DLl - qualquer dos espaos de nome
que vm com o .NET Framework que no sejam automaticamente adicionados
ou um cdi go que fo i escrit o por o utro desenvolvedor ou empresa -, ser preciso ad icionala s referncias de seu projeto. A instru o lmports pode ser
considerada como uma fe rram enta para encurtar seu cdigo. Utilizando essa
instruo, possvel evita r a necessidade de escrever no mes longos de classes. Por exemplo. quando o controle TextBox f or adicionado a um fo rmulrio,
o Visual Basic .NET usara a linha de cdigo a seguir:
Private WithEvents txtText As $ystem.Wi ndows. Forms. TextBox
Portanto, o nome completo da classe System . Windows . Forms. TextBox. No entanto, se voc adicionar Imports $ystem . Windows.Forms ao incio do arquivo,
poder encurtar isso para:
Private WithEvents txtText As Te xtBox
Quando o Visua l Basic .N ET ler TextBox, usara o espao de nome adicionado
com a instru o Imports para procurar a classe Text Box.
Assim, se voc usar um espao de nome, ele dever ser includo na seo References. Se quiser encurtar seu Cdigo, utilize a instruo Imports .
Dia 17
A seguir, adicione duas propriedades novas ao fonnulrio. Adicione uma propriedade para controlar o nome do arqu ivo (com o caminho) e se algo foi alterado. Acrescente o cdigo da Listagem 17.3 ao programa logo aps a linha Inherits System. Windows. Forms. Form.
CDIGO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
LISTAGEM
ANALISE
483
A seguir, adicione a caixa Aboul (Sobre). Afinal, ela a parte mais importante de muitos aplicativos: permite que as pessoas saibam quem o responsvel por eles. Para simplificar, use MessageBox para mostrar a informao.
D um clique duplo no item Help, do menu About, para acessar o editor de cdigos. Adicione o
cdigo mostrado na Listagem 17.4 .
CDIGO
LISTAGEM 17.4
NOTA
Dia 17
Agora hora de fomecer alguma funciona lidade ao programa. Comece com o menu File, como
na Listagem 17.5.
CDIGO
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LI STAGEM
CDIGO
LISTAGEM
485
486
CDIGO
Dia 17
ANALISE
Esse cd igo pode parecer muito extenso, mas analisaremos algumas etapas isoladamente para ver o que ele faz., comeando com o comando New do menu File das li-
nhas I a 15. Ad icionamos a propriedade Di rty para que nos pennita detenninar se o texto foi
alterado de alguma maneira. Se tiver sido, precisamos nos cert ificar de que o usurio no tenha
ac identa lmente eliminado essas alteraes. Portanto, se ele solic itar um novo arquivo depois de
fazer as alteraes, devemos avis-lo. Esse nada ma is e do que o comportamento adequado - proteger o usurio de pressionar uma tecla por acidente. Se o arquivo estiver sujo (alterado), perguntaremos se no h problemas em perder as alteraes (linhas 3 a 9) e criar um arqu ivo novo. Se
no houver problema (li nha IOda listagem) ou se no houver alteraes (l inha 13 da listagem),
criaremos NewFi 1e. O procedimento NewFi 1e ser gerado posterionnente. J que h vrios locais
onde podemos criar um arqu ivo novo, uma boa idia inserir esse cdigo cm um procedimento
prprio.
A seguir, vemos o item Open do menu Fi le (linhas 16 a 40). Aqui comeamos a usar as classes
para trabalhar COm os arqu ivos. Empregaremos tam bm um objeto Fi leStream(linha 19) e um
St reamReader (Iinha 20). Lem bre-se de que Fi 1eStream na verdade apenas um tipo especial de
objeto St ream. Depois de declarar essas duas variveis, pennit imos que o usurio se lecione um
arq ui vo a ser aberto (linha 2 1) utilizando o controle Fi 1eOpenDi alog ad icionado ao fonnulrio.
Se ele tiver selecionado um arquivo, poderemos abri-lo. Observe que estamOS tentando abrir
esse arquivo dentro de um bloco Try . End Try (linhas 23 a 38). Abrir arquivos pode ser propenso a excees - o arquivo pode no ex isti r, no estar disponvel, ter sido bloqueado por out ro
usurio e assim por diante. Qualquer dessas ocorrncias poderia levar a uma exceo. Portanto,
sempre que voc quiser abri r um arquivo, deve usar um bloco Try ... End Try.
Faa
USE um bloco Try ... End Try para capturar excees ao lidar com arquivos - quando for
abrir, excluir ou salvlos. Empregue sempre
a seo Fi na 11y do bloco para fechar o arquivo e outras classes de flux o, leitu ra ou gravao que tenha utilizado para acess-Io.
Dentro do bloco Try ... End Try, primeiro recuperamos o nome do arquivo (inclusive o caminho)
para que seja aberto na caixa de dilogo ( linha 24). Esse nome ser exibido na barra de ttulo da
jane la de Note. A segui r (linha 25), usamos o mtodo compartilhado OpenRead para abrir o arquivo. Lembre-se de que os mtodos compartilhados no precisam de urna instncia do arqu ivo,
mas dele prprio. Essa uma rea que poderia levar a uma exceo, portanto bom que esteja no
bloco Try ... End Try. A varivel oFile da linha 25 do tipo Fi 1eStream de modo que representa
uma srie de bytes do arqu ivo (isto , um fluxo). Para ler esse fluxo, passamos esse objeto Fi 1eStream para o construtor de um StreamReader (linha 26). Essa varivel StreamReader (oReader)
pode seremprcgada para ler todo o contedo de Fi 1eStream(linha 27) e pass-lo para o principal
TextBox util izado no formulrio.
Se urna exceo ocorrer na abertura ou leitura do arquivo (mais provvel que seja na abertura), a
capturaremos na li nha 28 e apenas a ex ibiremos para o usurio nas linhas 30 a 33. Uma rotina de
tratamento de excees idea l provavelmente tentaria ajudar o usurio a corrigir o erro. Por
exemplo, se o usurio estivesse proibido de abrir O arquivo devido a razes de segurana (uma
Securi tyExcept i on seria lanada), voc poderia inform-lo de que seria preciso solicitar pennisso ao proprietrio do documento antes de tentar abrir o arqu ivo. Para concluir, nas linhas 36 a
37, encerramos os objetos StreamReader e Fi 1eStreamo Feche sempre esses objetos para assegurar que no permaneam abertos, podendo impedir outros programas de visualizar ou alterar o
arquIvo.
No final do item Open do menu File, j devemos ter se lecionado um arquivo para ed itar, e o contedo provavelmente estar em TextBox. A segu ir, precisamos lidar com duas maneiras relacionadas de salvar o arquivo - elas so os itens Save e Save As do menu File.
Dos dois itens do menu File relacionados a salvar o arq uivo, Save o mais complicado. Na verdade, como voc ver, o item Save As no precisa de nada alm dele para exec utar sua ao . O
cd igo do item Save do menu File mostrado nas linhas 41 a 72. Primeiro tente saber se o usurioj nomeou o arquivo (linha 45). Se ele no tiver feito isso, chamaremos a rotina mnuFileSa veAs Cl i ck (isto , o item Save As do menu File) para obter um nome (linha 70). Supondo que o
arquivo tenha um nome, ele ser aberto para edio na linha 50. Depoi s de aberto, criaremos um
objeto StreamWri ter para tornar possvel a edio do arquivo (linha 52) e a gravao do contedo de TextBox no arqu ivo recm-criado (linha 54). J que o arquivo no possui mais nenhuma alterao, configuramos o flag Di rty corno Fa 1se.
Se urna exceo ocorrer quando da gravao no arquivo, a capturaremos na linha 57. Exatamente como fizemos com qualquer exceo que pudesse ocorrer na leitura do arquivo, apenas ex ibiremos o erro (linha 58 a 62). Mais urna vez, como o aplicado leitura, essencial fechar os
objetos StreamWri ter e Fi 1eStream (l inhas 65 e 66). Isso ainda mais importante na gravao do
que na leitura porque as alteraes feitas podem no ser gravadas at que os objetos de fluxo e o
arquivo estejam fechados.
No final do item Save do menu File, o contelldode TextBox deve estar gravado no arquivo sol ici tado. Voc pode confirmar isso abrindo o arquivo no Bloco de notas ou em algum outro editor.
Dia 17
Ocdigo do item Save As do menu File muito mais simples do que o usado para salvar o arquivo porque ele util iza o trabal ho executado em outra rotina. Esse cdigo empregado apenas para
gerar um novo nome para o arquivo. Usamos Fi leSaveDi aI og, que adicionamos ao form ulrio
na linha 76, para perrn itir que o usurio selecione um local e um nom e para o arq uivo. Se ele der
um clique em OK para fechar a caixa de dilogo, daremos prosseguimento configurando a propriedade Fi 1eName com o novo nome (linha 78) e, em segu ida, chamando a rotina mnuF ileSave Cl i ck para realmente salvar o arquivo (li nha 80). Como alternativa, poderamos ter colocado
o contedo completo do cd igo salvo aq ui , mas isso teria gerado um nvel alto de dupl icao.
Para concluir (o menu File), ocorre o cdigo do comando Ex it do menu File. Nesse momento,
apenas fechamos o fo rmu lrio, encerrando o aplicat ivo (linha 86).
Grande parte do cdigo relacionado a Stream est no menu File (onde se imaginava), permit indo
que voc abra e salve arquivos. Na Listagem 17.6, exam inaremos o cdigo do menu Edit que
permite recortar, copiar e colar da mesma maneira que em um aplicativo como o Bloco de notas
ou o Word.
CDIGO
LISTAGEM
II
ANALISE
Fel izmente, o cdigo dos comandos Edit bem menor do que o de File. Alm disso,
podemos ver outro objeto poderoso do .NET Framework - o objeto Cl i pboard .
Comeando com ocd igo Cut do menu Edil, pegamos o texto selecionado em TextBox e o copiamos
para a rea de transferncia (linha 3). A classe C1 ipboard uma abstrao da rea de transferncia do Windows compartil hada por todos os aplicativos. Ela possui mtodos que permitiro a
voc atribuir programalicamenle texto, figuras ou outras informaes rea de transferncia e
recuperar os dados desse local. A Tabe la 17.9 descreve esses dois mtodos. Depois de copiar as
489
informaes para a rea de transferncia, exclumos o texto selecionado em TextBox (linha 4).
Isso cria o comportamento esperado de recorte do texto - adicion-lo rea de transferncia e remov-Ia do fonnulrio.
TABElA 17 .9 Mtodos da Classe C1 i pboard
Mtodo
Descrio
SetDataObject
Atribui informaes rea de transferncia. Esse mtodo usa um objeto e, portanto, voc pode gravar o que quiser na rea de transferncia.
bom ressaltar que na verdade h duas verses desse mtodo. Ou seja,
ele um mtodo sobreposto. A segunda verso inclui um valor booleano que determina se o contedo deve permanecer depois que o aplicativo for encerrado. O comportamento normal manter as informaes
na rea de transferncia depois que o programa for interrompido .
GetOataObject
TABElA 17.10
Mtodos de IDataObject
Mtodo
Descrio
GetOata
Recupera as informaes armazenadas na rea de transferncia. Formul rios intermedirios permitem que voc as converta em um forma to especifico.
GetFormats
GetOataPresent
o cdigo Copy do menu Edit semelhante ao do comando Cut do menu Ed it (linha 9), exceto
por no exclu irmos Otexto selecionado. Os dois comandos, no entanto, resu ltam na cpia das informaes para a rea de transferncia.
Ocd igo do comando Paste do menu Edit parece complexo, mas se toma simples quando dividi mos as linhas 14 e 15 em uma srie de etapas. A primeira etapa para a recuperao de informaes da rea de transferncia obter, por meio de GetOataObject, a interface IDataObject
armazenada nesse local. A segu ir, usamos o mtodo GetData de IDataObject para recuperar as
informaes, solicitando-as no formato de texto simples. Embora tenhamos definido esse formato, se trata de um objeto. Portanto, para atribu-lo a TextBox, devemos convelt-lo em uma
string. Poderamos ter usado a funo CStr ou CType, mas optamos pela ltima. Para concluir-
Dia 17
LISTAGEM 17.7
2
3
4
5
6
7
9
10
11
12
13
ANALISE
Para concluir, a Listagem 17.8 mostra trs rotinas que voc pode adicionar ao apli cativo para
complementar a funcionalidade.
LISTAGEM 17.8
LISTAGEM 17.8
491
10 End Sub
11
Como voc deve se lembmr, o procedimento NewFi 1e chamado por mnuFi 1eNew_Cl i ck quando um novo arqu ivo criado. Esse procedimento atribui os padres
ao arquivo novo: apaga as informaes de TextBox (linha 2), configum a propriedade Fi 1eName
como ' Unlilled ' (linha 3) e a propriedade Di rty como Fa 1se (l inha 4).
ANALISE
Queremos que o aplicativo e o usurio tenham conhecimento quando o documento for alterado.
Essa a finalidade da propriedade Di rty. Podemos nos beneficiar do evento TextChanged para
alterar o valor dessa propriedade. Se alguma alterao ocorrer, por causa de uma edio, cpia
de informaes da rea de transferncia ou digitao do usurio, esse evento ser acionado, configurando o flag Di rty como True.
Para concluirmos, mais uma vez queremos nos cert ificar de proteger o usurio de pressionar teclas aleatoriamente. O evento Closi ng ocorre quando o formulrio fechado. um timo momento para determ inar se o usurio quer salvar as informaes. S devemos solicitar a ele que
sal ve as alteraes se houver alguma, portanto, nossa primeira etapa (Iinha 14) descobri r se foram feitas alteraes desde a ltima vez que as informaes foram salvas. Se no houver, no
precisamos fazer nada, e o fonnulrio poder ser fechado. No entanto, se houver alteraes, teremos de perguntar ao usurio se deseja salv-Ias antes de sair. As linhas 15 a 20 criam e exibem
uma caixa de mensagens com os botes Yes e No. Se o usurio selecionar o boto No, sign ifica
que no deseja fechar o arquivo. Portanto, podemos cancelar esse evento (e o conseqente fechamento do formulrio) configurando a propriedade Cancel do objeto EventArgs (passada para todos os eventos) como True, como na linha 21.
A est -cerca de 100 linhas de cd igo, e voc tem um ed itor de texto nmc ionando que pode ser usado corno base para uma implementao mais completa. Essa verso pennite abrir e salvar arquivos, e
usar lima rea de transferncia. Utilizamos os objetos FileStream, StreamReader e StreamWriter
Dia 17
para manipular os arquivos de texto com os quais ela trabalha. Criar um aplicativo semelhante para
abrir e salvar arquivos binrios, como os gerados pelas classes de figuras, quase idntico.
O espao de nome
Sys tem. Drawi ng.
TABELA 17 .11
493
Item
Tipo
Descrio
Bi tmap
Classe
Brush
Classe
Usada quandO reas so preenchidas com cores. H tipos diferentes de classes Brush, incluindo as que empregam cores
slidas e outras que aplicam texturas. Essas texturas em gerai se baseiam em um bitmap.
Colar
Estrutura
Font
Classe
A classe Font ser usada sempre que voc quiser inserir tex-
to em uma figura.
Graphics
Classe
Poe
Classe
Pai nt
Estrutura
Usada para representar um loca l em uma superfcie de desenho. Define coordenadas X e Y para o local.
Rectangl e
Estrutura
Representa uma rea retangular em um local preestabelecido. definida como uma regio comeando em um ponto,
com largu ra e altura conhecidas.
Size
Estrutura
Voc usar muito as classes da Tabela 17. 11. Por exemplo, se desenhar um quadrado na tela, ele
ser criado em um objeto Graphics, com uma classe Pen especfica, com uma estrutura Calor
atribuda, dentro de uma estrutura Rectangl e . Essa ltima, por sua vez, se ria composta de uma
estrutura Point e uma Size. Para concluir, seria possvel preencher o quadrado com a classe
Brush que fosse selecionada.
Para demonstrannos o LISO das c lasses de figuras , criaremos um programa simples de desenho . A
Figura 17.3 mostra esse aplicativo em execuo. Voc pode estend-lo posteriormente para criar
desenhos mais complexos .
,-' -_- - - - - - - - - - - - - "1;)1:1-
FIGURA
17.3
O programa Scribble
em ao.
S<nbblel
'.
VB.net
Rocksf
"
Dia 17
494
Comece criando um novo projeto de aplicativo Windows. D o nome de Scribble a ele. Como
voc pode ver na Figura 17.3, o Llsurio tem trs ferramentas de desenho disponveis: uma cane-
ta, formas e texto. Todas elas possuem seu prprio conj unto de opes que afetaro o modo de
desenhar. Alm disso, cada uma pode ser usada com lima cor se lecionada. A ampla rea branca
de desenho um controle Pi ct ure Box.
Altere sempre o nome do formu lrio. Feche o gerador de formulrios. Altere o nome do formulrio no Solution Exp[orer para fnn$cri bbl e. Passe para o modo de v isualizao do cdigo e altere
todas as referncias a ronnI para fnnScri bbl e. D um clique com o boto direito do mause sobre
o projeto no Solution Exp lorer e se lecione Propert ies. Na gu ia General Properties, altere o Startup Object para frrnScri bbl e. Compile e execute o aplicati vo para assegurar que Iodas as alteraes tenham sido processadas.
Agora podemos comear a adicionar controles ao formulrio. Abra-o no modo estrut ura e insi ra
os controles como descrito na Tabela 17. 12. Use a Figura 17.3 para ajud-lo, mas no se preocupe se eles no ficarem no lugar exato.
TABELA
17.12
Controle
Propriedade
Valor
Forn
Height
332
Wi dth
SOO
Text
Scribble
BorderStyle
FixedSingle
Menu
Name
mnuMai n
Menu Fil e
Name
mnuFile
File , New
Name
mnuFi 1eNew
Shortcut
CtrlN
Text
&New
Name
mnuFileOpen
Shortcut
CtrlO
Text
&Open...
Name
mnuFileSave
Shortcut
CtrlS
Text
&Save
"'""
Shortcut
mnuFileExit
CtrlQ
Text
E&xi t
Name
dlgOpen
OefaultExt
Brnp
Fi lter
Name
dlgSave
File, Open
File, Save
File, Exit
OpenFileDialog
SaveF;leOialog
TABELA
11.12
Controle
RadioButton
RadioButton
RadioButton
RadioButton
Pi ctureBox
Panel
Label
ComboBox
495
Valor
DefaultExt
Brnp
Fi 1ename
Scribblel
Fi lter
Dock
OockSty l e .left
Width
64
Name
optPen
Appearance
Button
Checked
True
location
8,8
Size
48 , 36
Text
p,"
TextAlign
Mi ddl eCenter
Name
opt Shape
Appearance
Button
location
8,48
Si ze
48 , 36
Text
Shape
TextAlign
Mi ddl eCenter
Name
optText
Appea ra nce
Button
Locat ion
8,88
Si ze
48 , 36
Text
Text
TextAlign
Mi ddl eCenter
Name
picDraw
White
BorderStyle
Fi xed3D
Dock
Fi 11
Name
pnlOptions
Dock
Bottom
Height
72
Name
lblColo r
location
8, 8
Si ze
48 , 16
Text
Color :
Name
cboColors
DropDownS t yl e
OropDownList
Dia 17
TABELA
11.12
Controle
Panei
Label
Nume ri cUpOown
Panei
Label
OropDown
Label
NumericUpOown
Label
Valor
Location
8, 24
Wi dth
136
Name
pn I PenOpt i ons
Location
160, 8
Size
274 , 56
Name
IblPenWidth
Location
8, 8
Size
80 , 16
Text
Pen Wi dth:
Name
updpenWidth
Locat ion
96 , 8
Maximum
10
Mi nimum
Si ze
48 , 20
Val ue
"me
pnlShapeOptions
Location
160, 8
Size
274 , 56
Name
IblShapeType
Location
8, 8
Si ze
48 , 16
Text
Type:
Name
cboShapeType
DropDownStyle
OropDownList
Locat i on
64 , 8
Wi dth
121
Name
IblShapeHeight
Location
8, 32
Size
48 , 16
Text
He ight :
Name
updShapeHeig ht
Location
64 , 32
Maximum
1000
Minimum
Si ze
48, 20
Va l ue
20
Name
IblShapeWidth
TABELA
11.12
Controle
Numer i cUpOown
Panel
Label
TextBox
Label
OropDown
Label
Numer i CUpOOWIl
Valor
Location
128 , 32
Si ze
48 , 16
Text
Width:
Name
updShapeWidt h
Location
184 , 32
Maximum
IODO
Mi nimum
Size
48, 20
Value
20
Name
pnlTextOptions
Locat ion
160 , 8
Size
274, 56
Name
lblText
Location
8, 8
Size
40 , 16
Text
Text:
Name
txtText
Location
48 , 8
Si ze
208 , 20
Text
Scribble !
Name
lblTextFon t
Location
8, 32
Size
40 , 16
Text
Font:
Name
cboTextFont
DropDownStyl e
OropDownL is t
Location
48 , 32
Wi dth
104
Name
Location
Si ze
Text
Name
lblFontSize
160 , 32
40, 16
Size :
updFontSize
Location
Maximum
Mi ni mum
Size
Val ue
208 , 32
72
6
48, 20
12
497
Dia 17
498
NOTA
Quando adicionar os controles RadioButton ao painel de ferramentas, lembre-se de dar um clique sobre o controle na caixa de ferramentas e, em seguida, arrast -lo at o painel. Isso assegurar que ele fique situado nesse local.
Voc tambm deve fazer isso com os controles do painel de opes.
Outro ponto a ressaltar que os t rs painis de opes (pnl PenOptions, pnl ShapeOptions e pnlTextOptions) so todos do mesmo tamanho e ficam no mesmo
Cl i pRectangl e O retngulo que deve ser redesenhado. Isto permite que voc oti mize o
seu cdigo de desenho para s atual izar a rea alterada, em vez de redesenhar sempre a figura compl eta. No lIsaremos este parmetro em nossos aplicativos.
,
Graphi cs
A superfcie em que a figura ser desenhada. E usada para o desenho das for,
mas que serao necessanas.
'
Como alternativa, voc pode usar o mtodo CreateGraphi cs de um controle para criar seus prprios objetos Graphic de desenho.
Dim oGraphics As System.Orawing.Graphics
oGraphics = picDraw.CreateGraphics()
Qualquer mtodo que voc usar para criar um objeto Graphi c poder ser empregado para desenhar vrias formas.
Annazenarernos o objeto Graphi cs no apli cativo Scri bble para que seja usado por vrias ferramentas de desenho. Alm disso, precisamos registrar as ferramentas ativas e disponveis. Ad icione o cdigo da Li stagem 17.9 ao projeto Scribb le.
ENTRADA
1
2
3
4
5
7
8
g
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Dia 17
500
ENTRADA
(continuao)
27
Return m_bOrawing
28
End Get
29
30
31
m_bDrawing
Value
End Set
32
33
End Property
34
35
36
Get
Return m eCurrentTool
37
End Get
38
39
m eCurrentTool = Value
40
41
42
43
44
45
End Property
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
ENTRADA
(continuao)
70
71
72
pn l ShapeOptions.Visible = False
pnlTextOptions.V i sible = False
End Sub
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
.Add("Green")
.Add("Blue")
End Wi th
cboColors.SelectedIndex
110
111
112
501
Dia 17
502
ENTRADA
(continuao)
113
"'
116
. Add("Courier New")
End With
cboTextFon t.SelectedIndex - O
115
117
End Sub
ANALISE
Primeiro declaramos uma nova enumerao (l inhas I a 5). Essa enumerao ser
usada para registrar as ferrame ntas disponveis e assegurar que a propriedade ClIrrentToo 1 (declarada postcriomlcnte) s possa ser configurada com um dos valores vlidos. Se depois voc q uiser adicionar outras ferramentas de desenho, dever faz-Io nessa enumerao.
As linhas 7 a 9 so as varive is membro das trs propriedades expostas pelo formulrio. Essas
propriedades (linhas 16 a 23, 25 a 32 e 34 a 45) so basicamente simpl es, com lima exceo. No
trecho Set da propriedade CurrentToo 1, as linhas 4 1 a 43 se destacam . As ferramentas de desenho como canetas, pincis e fontes se encontram em um local especial no Wi ndows. S uma
quantidade lim itada desses componentes fica dispon vel. Portanto, voc deve sempre se lembrar
de chamar o mtodo Di spose desses componentes para assegurar que eles sejam li berados para o
prximo usurio. Em geral, possvel chamar Di spose diretamente nesses objetos. O cdigo da
linha 42 necessrio porque oTool foi declarada como um objeto na li nha 12. Esse um exemplo
dos sacrificios feitos quando se escreve um cdigo genrico; s vezes isso sign ifica mai s \J'abalho adiante.
O evento Fonn Loa d (linhas 47 a 61) o local onde con fi guramos o formulrio, carregando as listas suspensas e preparando os e lementos grficos do desenho. A linha 51 chama a rotina Fi 11 Lis ts que escreveremos posteriormente. A seguir, nas linhas 53 a 55, criamos um novo Bi tmap e
o atribumos a Pi ctureBox. Esse o Bi tmap no qual desenharemos. Os parmetros usados definem o tamanho da nova figura e o tipo de Bi tmap que ser criado. Aqui geramos uma figura de 24
bits . Isso signi fi ca que podemos em pregar qualquer uma das 16777216 cores quando selecionarmos uma.
A linha 56 extrai o objeto Graphics de Bitmap e o atribui ao fo rmulrio. Usaremos esse objeto
mais tarde quando formos desenhar. Para criar urna superficie adequada e Iim pa para o desenho,
apli caremos Clear ao objeto Graphics configurado-o corno White, e para assegurar que tenhamos lima ferramenta defin ida, selecionamos Peno
Todas as trs rotinas a seguir executam a mesma tarefa. So usadas quando o usurio seleciona
uma nova ferramenta. Essas roti nas configuram CurrentTool como a fe rramenta desejada e asseguram que o conjunto correto de opes da ferramenta atual fique visvel e os oulros no.
503
cores, fonnas e fontes e seleciona o primeiro item de cada. Voc pode estender isso se quiser incluir
outras cores, formas e fontes.
Desenhando Formas
Depois que voc tiver um objeto Graphi e5, precisar saber como us-lo. O objeto Graphi es possui vrios mtodos que so empregados para incluir diversas linhas, formas e texto em uma superfcie. Esses mtodos se encontram em duas categorias amplas:
Mtodos Draw
Estes mtodos so uti lizados para o desenho com o uso da ferramenta
Pen (caneta). Em geral, s criam uma fonna vazia.
Mtodos Fi 11 Estes mtodos so utilizados para o desenho cam o uso da ferramenta
Brush (pincel). Criam uma forma que preenchida com uma cor ou textura.
A Tabela 17.13 descreve alguns dos mtodos mais usados da classe Graph i cs.
TABELA 17.13
Mtodo
Descrio
Clear
OrawEl1 ipse
Orawl i ne
OrawRectangle
Desenha um retngu lo ou quadrado no objeto Graphi cs usando a cane ta atribuda. Se a altura e a largura forem iguais, voc ter um quadrado; seno, apa recer um retngulo .
DrawString
FillEllipse
FillRectangle
Agora estamos prontos para adicionar o cdigo do apl icativo Scribb le que far realmente o desenho. Quando estivermos no modo Shape ou Text, desenharemos um retngulo ou urna elipse, ou
adicionaremos um texto onde o usurio der um clique. No entanto, o desenho de linhas um
pouco diferente. Na verdade no podemos desenhar uma lin ha quando o usurio der um clique
no boto do mouse; devemos aguardar que ele mova o mouse. Em vez disso, quando o mouse estiver com o boto pressionado, apenas o definiremos corno inativo. Depois, quando o usurio
mover o mouse, se se u boto estiver pressionado, comearemos a desenhar. A Listagem 17. 10
mostra o cd igo dos manipuladores de evento de Pi ctureBox.
Dia 17
504
LISTAGEM 17.10
COOIGO
1
2
3
4
5
6
sngX : e.X
sngY:e.Y
'force um redesenho
10
Me.picOraw.RefreshO
11
12
End If
End Sub
13
14
15
16
17
18
19
20
End Sub
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
ByVal e As System.Windows.Forms.MouseEventArgs)
Hand1es picDraw.MouseDown
'comece a desenhar
'Shape e Text so formas, Pen funcionar ao mover o mouse
'precisamos criar a ferramenta
'e desenhar ou estar prontos para isso
Se1ect Case Me.CurrentToo1
Case DrawingToo1s.Shape
Select Case Me.cboShapeType.Text
Case "Rectangle"
oGraphics.FillRectangle(
New SolidBrushC
Co1or.FromName{Me.cboColors . Text ,
e.X ,
e . Y,
Me.updShapeWidth . Va1ue , _
Me.updShapeHeight .Value)
Case "E11 i pse"
oGraphics . FillEl1ipse(
New SolidBrushC
Co 1or . FromName (Me. cboCo 1ors. Text) ) ,
e.X,
e.V,
CDIGO
45
46
47
LISTAGEM 17.10
Me.updShapeWidth.Value, _
Me.updShapeHeight.Value)
Case Else
End Select
'force um redesenho
Me.picOraw.Refresh()
Case DrawingTools.Text
'crie uma fonte
oToo1 : New System.Drawing.Font(_
Me.cboTextFont.Text, Me.updFontSize.Value)
'escreva o texto no loca l em Que o mouse est agora
oGraphics.DrawString(Me.txtText.Text,
oTool ,_
New SolidBrush(_
Color.FromName(Me.cboColors .Text ,
e . X,e .Y)
'fo r ce um redesenho
Me.picDraw.Refresh()
Case DrawingTools.Pen
'crie a caneta (para desenhar quando o mouse se mover)
oTool : New System.Drawing.Pen( _
Color. FromName(Me.cboColors.Text) ,
Me.updPenWidth.Value)
sngX " e.X
sngY -; e.Y
Me.Drawing " True
End SeTect
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 Eod Sub
ANALISE
No modo de desenho, a primeira etapa desenhar uma linha usando a caneta atual (linha 6). As
variveis sngX e sngY so variveis privadas no nve l do formu lrio usadas para registrar a ltima
posio do mouse. Sem pre que desenharmos uma linha, o faremo s a partir dessa posio armazenada at a posio atual do mouse. A posio atual do mOllse fo rnecida como propriedade da
classe MouseEventArgs passada para o manipulador de eventos. Copiamos a posio atual no locai de armazenamento temporrio nas linhas 7 e 8 para a prxima vez que o evento for chamado.
Para concluirmos, na linha 10, foramos uma atualizao de Pi ctureBox. J sso garante que qualquer alterao que tenhamos fe ito seja exibida para o usurio.
Dia 17
o manipulador do evento MouseUp (linhas 14 a 19) simples. S ser usado para encerrar o modo
de desenho se est ivermos nele. Posteriormente, os eventos MouseMove sem Drawing configurado
como True no possibilitaro desenho algum.
Se a ferramenta atual fo r Shape, precisaremos detenninar o tipo de forma a selecionar. O cdigo
do desenho semelhante. Usamos o mtodo Fi 11 para desenhar um retngulo ou uma elipse na
posio aluaI do mouse com os tamanhos selecionados nos controles NumericUpOown. A posio
atual do mouse fornecida pelo parmetro MouseEventArgs do manipulador do evento MouseDown.
Se a ferramenta atual for Text, a primeira coisa a fazer ser criar uma fonte nova (linhas 53 a 54).
Essa fonte ser usada quando escrevermos o texto em Pi ctureBox (linhas 56 a 60). Ele ser escrito na fonte gerada, com um pince l recm-criado.
Para concluir, se estivermos desenhando linhas com a ferramenta Pen, teremos de criar o novo
objeto Pen (linhas 65 a 67). Ele ter a cor selecionada e a largura da caneta. A seguir, armazenaremos a posio aluai do mOllse para uso posterior no manipulador do evento MouseMove (linhas
68 a 69) e ativaremos o modo de desenho (linha 70).
Salvando Figuras
Depois de criar uma figura, use o mtodo Save do objeto Bi tmap para armazen-Ia como um arquivo. Esse mtodo perm ite que a fi gura seja sal va com um tamanho e formato especficos.
Vrios formatos diferentes tm suporte do objeto Bitmap. Entre eles esto:
Bitmap
Um formato comum de figuras usado no Windows, sendo normalmente bem
amplo. Pode dar suporte a uma quantidade ili mitada de cores, e a extenso ut il izada
BM P.
GIF
Abreviatura de Graphics lnterchange Format; este um fo rmato comum de figuras usado na Internet. Normalmente, os desenhos G1F so peq uenos porque so com pactados; no entanto, s podem empregar 256 cores por figura . A extenso uti lizada para
esses arq uivos GIF.
JPEG
Abreviatura de Joint Photographic Experts Group; este outro formato comum de figura usado na Internet. O formato JPEG normalmente empregado para armazenar fotografias ou outras figuras que precisem de muitas cores para ser exibidas . Ele
pode ser bastante compactado; no entanto, arqu ivos altamente compactados podem perder informaes ou qualidade. A extenso para estes arquivos J PG .
PNG
Abreviatura de Portable Network Graphics; este um formato de arquivo relativamente incomum. Foi criado para substituir os arquivos G1F e TI FF. So arquivos bastante pequenos, embora em geral no tanto quanto nos formatos GIF ou JPEG. O suporte
raro, mesmo com o Internet Explorer e outros programas podendo exibi-l os. A extenso
para estes arqu ivos PNG.
TIFF
Abreviatura de Tagged lmage File Format; este um formato raramente encontrado que costumava ser comum. Os arqu ivos TIFF podem ser grandes ou pequenos, de-
pendendo de qual das muitas variantes desse formato seja empregada para armazen los.
A extenso TIF a usada nestes arquivos.
NOTA
Formato
Tamanho do arquivo
BMP
340. 134
10.088
20.971
10.262
15.492
GIF
JPG
PNG
TIFF
Agora podemos terminar nosso aplicativo adicionando o cdigo aos comandos do menu Fil e
como vemos na Listagem 17.1 1.
ENTRADA
1
2
3
4
5
6
LISTAGEM 17.11
Comandos do Menu
8
9
10
11
12
13
14
15
16
17
1B
19
20
508
Dia 17
ENTRADA
23
24
25
26
27
28
29
30
31
32
33
35
36
37
38
39
40
sFileName = dlgSave.FileName
Select Case dlgSave.Filterlndex
Case O 'salve como bitmap
oFormat = System.Drawing.lmaging.lmageFormat.Bmp
Case 1 'salve como PNG
oFormat = System.Orawing. Imaging. ImageFormat.Png
Case El se
'no deve acontecer
End Select
' possvel exceo ao salvar
Try
Me.p i cDraw.lmage.Save(sFileName . oFormat)
21
22
34
LISTAGEM 17.11
Catch ex As Exception
' por enquanto apenas exiba
MessageBox.Show(ex.Message. Erro ao salvar arquivo".
MessageBoxButtons.OK. MessageBoxlcon.Error)
End Try
End If
End Sub
41
42
43
44
45
ANLISE
disco, inseriremos a figura em um bloco Try .. . End Try . A linha 32 representa a operao efetiva
de salvar, se beneficiando da capacidade de que todos os objetos possuem de salvar a si mesmos.
Finalmente, o comando Exit do menu File fecha o fo rmulrio, encerrando o aplicativo.
Salvar figuras annazenadas em um objeto Image fcil, com o carregar uma nova figura. Na
verdade, esse um dos melhores exemplos dos beneficios de usar objetos porque trabalha-se
com o que seria urna ta refa complexa e o cdigo necessrio e ncapsulado em objetos Graphi cs,
Image e Bltmap.
Resumo
Aprender todas as classes, estruturas, propriedades, mtodos e e ve ntos que compem o .NET
Framework leva algum tempo. No entanto, conhecer a lgumas classes fundamentais o ajudar
sempre, j que os conceitos representados por elas se repetem em todo o Framework. Depois que
voc tiver conhecido um fluxo, toda vez que se deparar com um, saber o que fazer. De maneira semelhante, aps aprender a desenhar com as classes Graphi es, poder faz-lo em qualquer local.
No prximo captulo, voc aprender a adicionar os ' retoques finai s' a nossos aplicativos.
P&R
P O Que Unicode?
R Um problema mundial que nunca houve uma linguagem com a qual todos pudessem reconhecer. Muitas de las usam o mesmo conjunto de caracteres ou um semelhante ao e mpregado na Amrica do Norte c Europa Ocidental. Esses caracteres foram definidos
corno o conjunto ASCII (American Standard Code for Information Interchange). Ele ut iliza 255 caracteres (de um byte) para representar os que so usados nessas linguagens.
Por exemplo, a letra ' A' representada pe lo algaris mo 65 em todos os conj untos de caracteres que usam a codificao ASC II.
No entanto, outros idiomas, como o tmil ou o japons, precisam de uma quantidade muito
maior de caracteres. Conseqentemente, o conjunto de caracteres Unicode foi definido
pela International Standards Organization (ISO). O Unicode usa dois bytes para codificar cada smbolo de qualquer dos id iomas terrestres (e alguns extraterrestres - h uma
converso de Klingon para Unicode em http: //anubis.dkuu g.d k/ Hc1 /sc2/wg2/
docs/n1 643/nl643. htm). Por exemp lo, o caraclere Unicode 20AC sempre representar o
curo. Os primeiros 256 caracteres da codificao Unicode so os mesmos da ASC II por
"'
.
convenlencm.
Portanto, uma resposta direta seria que um valor de dois bytes capaz de identificar um
s mbolo usado e m qualquer conjunto de caracteres. Por que se preocupar? Em algum
momento, voc ver um grupo de caracteres que se parecero com ?????, e j saber o
mot ivo. Provave lmente sero Un icode, e preciso saber como convert-los em ASCII ou
exibir os caracteres nativos.
Dia 17
510
P Quero desenhar uma forma complexa. H comandos em System. Dra ing para desenhar forma s como octgonos tambem?
R Vrios mtodos do objeto Graphi cs podem ser usados para criar formas mais complexas.
Entre eles esto inc ludos OrawArc, DrawCu rve, DrawL i nes, OrawPa th e OrawPo 1Y90n. Para
desenhar um octgono, voc deve empregar o mtodo Orawpolygon , passando a canela
que utili zar no desenho, e um array de pontos (Points). Esse array descrever cada ngulo do octgono.
Workshop
o Workshop fo i planejado para ajud-lo a antecipar possveis dvidas, revisara quej aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
Teste
I. Qual dos trechos de cd igo a seguir voc usaria para saber se um arqu ivo existe?
A. Dim aFile As New File
Dim bExists As Boolean :: oFile.Exists("algum arquivo" )
B. Dim bExists As Boolean " Directory.Exists("algum arquivo")
C. Dim bExists As Boolean " File.Exists("algum arquivo")
Exerccios
I. Um dos probl emas do programa Note que escrevemos que ele permite o uso dos comandos Cut (Recortar), Copy (Copiar) e Paste (Colar) sem haver nenhum texto selecionado ou na rea de transferncia. Veja se consegue descobrir uma manei ra fcil de at ivar
e desativar esses itens de menu antes que o menu seja exibido para o usurio. (Dica: adicione um evento ao item de menu mnuEdit.)
2. Altere o formato usado para salvar figuras e compare os tamanhos dos arq ui vos resultantes. Qual o menor form ato para desenhos simples em prelo-e-branco? E para fotos?
SEMANA
DIA
Retoques Finais
Este livro dedicado a ensin-lo a programar com a plataforma .NET, mas h muitos aspectos a
considerar no desenvolvimento de um aplicativo completo. Esta lio abordar alguns detalhes
que preciso compreender para a criao de um sistema real, principalmente se for grande e
complexo, incluindo:
Esses dois tpicos so opcionais; voc no precisa execut-los para produzir um sistema que
funcione, mas fazem parte de quase todo grande projeto de desenvolvimento.
Dia 18
Use seu tempo de maneira sensata. No comente o bvio; em vez disso, empenhe-se em
esclarecer as parles complexas de seu sistema.
1
2
3
4
5
6
7
8
9
10
11
Option Explicit On
Option Strict On
Imports System
Imports System.IO
Modu le Modulel
Sub Main()
Dim Pathl As String = "C:\file.t xt"
Dim Pat h2 As String = "C:\file new. txt"
Retoques Fina is
LISTAGEM 18.1
12
13
14
15
16
17
18
19
20
21
22
23
24 End Module
LISTAGEM 18.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit On
Option Strict On
Imports System
Imports System . IO
Modu le WorkWithFiles
Sub CopyFiles()
Dim sInputFilePath As String" "C:\test.txt "
Dim sOutputF ll ePath As String " "C : \output. txt"
Dim fi le Input As New StreamReader(sInputFilePath)
Dim fileOutput As New StreamWriter(sOutput FilePath)
Dim sline As String
15
16
17
18
19
20
21
22
23
24
25
End Sub
26
27
Sub Main()
Dia 18
514
LISTAGEM 18.2
CopyFiles()
End Sub
30
31 End Module
ANALISE
prio nome do mdulo e da sub-rot ina; os valores-padro no fornecem nenhuma infonnao, enquanto o nome Copyfi 1es para o procedimento uma indicao bem direla da finalidade da
rotina. A prxima diferena o espaamento. Na Listagem 18.2, as linhas em branco so usadas
para reunir trechos relacionados no cd igo, agrupando o cdigo de inicializao (linhas 10 a 14),
o de leitura de arqu ivo (linhas 16 a 20) e o de limpeza (linhas 22 e 23). Essas linhas em branco no
tero abso lutamente nenhum efeito sobre o resuItado final desse sistema - os dois exemplos sero
executados com a mesma velocidade obtendo resultados igua is - , mas agrupar o cdigo o torna
mais legvel.
A diferena essencial restante entre os dois exemplos de cdigo est na nomeao da varivel,
um tpico sobre o qual discorri brevemente em lies anteriores. As variveis podem ser nomeadas de qualquer forma, contanto que voc no use uma palavra-chave ou outro valor reservado
plataforma .NET. Podemos considerar o nome da varivel como um mecanismo interno de documentao. A Listagem 18.1 um exemplo extremado; grande parte dos cdigos que vemos
no to ruim no que diz respeito nomeao de variveis. Mas essa uma tentativa de ilustrar o
efeito de variveis mal nomeadas. Referir-se aos dois arquivos como fi lelnput e fi 1eOutput
(comparados com Fi 1el e Fi le2) documenta a fina lidade das variveis sem a necessidade de
qualquer comentrio adicional. Opes semelhantes foram feitas para os nomes das outras variveis, e quando elas forem usadas juntas (como na linha 12 da Listagem 18.2), a finalidade do cdigo estar quase completamente expl icada apenas pelos nomes empregados.
Uma prtica comum e til na codificao tambm usada na escolha dos nomes das variveis; a
cada nome dado um prefixo com um ou mais caracteres para indicar o tipo de dado da varivel.
Na Listagem 18.2, as strings tm o prefixo s, e os objetos StreamReade rjStreamWriter empregam fi 1e para indicar sua finalidade de ler e gravar arquivos. Esse mtodo de nomeao de variveis baseado na notao hngara, em que os caracteres iniciais so empregados para
descrever o tipo de dado e o escopo (global versus local, pblico versus privado) das varivei s.
Digo que baseado nesse tipo de notao, em vez de di zer que '' a Notao Hlmgara porque em
geral ap li co um padro de nomeao muito menos rgido do que o conjunto original de regras
descrito como notao hngara por seu criador (Charles Simonyi da Microsoft). Abordarei a nomeao de variveis ai nda nesta lio, na seo "Melhores Prticas e Padres de Codificao".
Retoques Finais
Uma questo fina l sobre a criao de um cdigo si mples, que no demonstrada no exemplo anterior, como a estrutura de seu cd igo pode facilitar a sua compreenso. Gosto de gerar meus
sistemas usando muitos procedimentos, mesmo cm cdigos que no sero necessariamente reutilizados de algum modo. O resultado de estruturar seu sistema dessa maneira que procedimentos de nvel mais alto podem ser lidos e compreendidos, ao mesmo tempo em que tambm
evitam os detalhes mais complexos (e mais confusos). A Listagem 18.3 fornece um exemplo.
LISTAGEM
18.3
1 Module Startup
Public Sub Main{)
2
Dim sPasswo rd, sData. sFilePath As String
3
4
sFilePath" "C:\InpuLtxt"
5
InitializeSystemVariables{)
6
7
8
9
sPassword = GetPassword{)
sData = ReadData(sFilePath)
sData = Enc ryptData{sPassword , sData)
la
WriteData{sFilePath, sData)
11
End Sub
12 End Module
A Li stagem 18.3 no executa nada sozinha; a essncia real desse sistema est contida nos procedimentos que ele faz referncia. Apenas ler essa rotina dar a voc uma boa idia do que o sistema realiza, e possvel examinar as rotinas individuais se necessrio. Se seu cdigo for
estruturado de modo correto, rotinas de nve l superi or podero agir como uma viso da Reader's
Digesr de todas as rot inas de nvel inferior que elas chamam. Vale a pena observar que, embora
possamos ler o cd igo da Listagem 18.3 e compreender o que est ocorrendo, apenas com uma
documentao apropriada teramos certeza de sua finalidade!
Evitando Conjecturas
Ao comear a documentar seu cdigo, provvel que tenha em mente (de maneira consciente ou
inconsciente) um pbli co para esses comentrios. Poder escrever como se fosse o nico a leresses comentrios, ou talvez voc possa imaginar que outros desenvolvedores de sua equipe atual
sejam as pessoas que precisaro compreender seu cdigo para efetuar manutenes. O problema
Dia 18
em considerar um pblico-alvo que haver a tendncia de escrever uma documentao diferente para cada tipo de pessoa.
No pressuponha que os comentrios sero lidos apenas por pessoas com experincia em e++
ou mesmo em Visual Basi c .NET. No imagine que eles sero exam inados por indivduos que
compreendam o objetivo final do sistema ou que conheam algo, em qualquer nvel, sobre o lado
operaciona l da abordagem. Suas pressuposies podem parecer vlidas - talvez voc tenha uma
equipe s de espec ialistas - , mas tudo muda. Seu cdigo poderia terminar nas mos de uma firma
de consultaria encarregada de alualiz-Io para uma em presa que comprasse aquela em que voc
est atualmente, ou um trecho individ ual de seu cdigo poderia ser usado em outro projeto.
Mesmo as s uposies mais simples, que o le itor compreenda os termos de bancos de dados, por
,
exemplo, devem ser abordadas no comeo de qualquer documento que voc criar. E claro que h
um limite para essa regra; se voc no pudesse pressupor pelo menos um conhecimento bsico
de Visual Basic, ento, teria de explicar cada aspecto individual do cdigo.
Abordagem/escopo
Projeto detalhado
Retoques Finais
517
A definio de cada um desses tipos de documentao varia bastante para metodologias de desenvolvimento e pessoas diferentes, mas a inteno bsica do documento minha nica preocupao aqui. Os detalhes sobre o objetivo geral dessa documentao so fomecidos nas sees a
segui r, porm a pergunta que voc provavelmente se far quando os examinar ser: " Tenho de
escrever tudo isso? Pensei que tivesse terminado! " . Essa uma boa pergunta. Se no existir nenhuma documentao e seu sistema estiver concludo, no h chance de que ela seja criada. Mas
no assim que deve funcionar. A idia que essa documentao seja gerada antes que o sistema
seja desenvolvido, a sua maioria antes que qualquer cdigo efetivo seja escrito a no ser um prottipo e alguma parte dela durante a prpria fase de cod ificao. No Dia 1, "Bem-Vindo ao Visual Basic .NET', abordei o ciclo de vida do desenvolvi mento dos softwares, mas veja novamente
como fonte de referncia (veja a Figura 18.1 ).
FIGURA 18.1
O e/o de vida
/l O
desenvoll'imelllo de
soft1t'are.~ 1111/ processo
que no tem fim. elll
gemI represelllado
como //111 crClllo qlle se
conecta I/ovamente a ele
prprio para il/dicar
1/111
ciclo cOl/lil/llo.
Verstio
Conclulda Escopo
Implantetio
e Ma nutenli~
Requisitos
e Projeto
Desenvolvimento
/
1Abrangncia I
Abordagem/Escopo
A documentao sobre a abordagem/escopo descreve o objetivo definido para o sistema e deve
ser determinada no incio do desenvolvimento. Como referncia para fins de manuteno, bom
comear a compreender qual a finalidade do sistema desde o incio. Um exemplo de abordagem
e escopo em seu nve l mais simples poderia ser :
"O sistema de Registro das Habi li dades do Funcionrio armazenar uma listagem dos funcionrios e registrar seu nvel de especializao em vrias aptides relacionadas ao cargo
com a finalidade de desenvolver equ ipes e planejar projetos ."
Observe que essa declarao no explica lodos os detalhes: que habi li dades? Quem usar o sistema? Onde ser obtida a lista de funcionrios? Essas e outras perguntas no fazem parte da abordagem. Elas precisam ser respondidas, mas sero encontradas em outra documentao.
Dia 18
Projeto Detalhado
Muitos documentos se enquadram nessa categoria - qualquer item que fornea mai s dela lhes do
que a documentao sobre os requ isitos. A inteno dos documentos dessa categoria detalhar
como o sistema funciona: que etapas segue internamente para executar os requisitos do usurio
descritos no documento anterior. Espere ver Ouxogramas, diagramas de estado e listas de componentes, procedimentos e outros elementos de cd igo como parte desse material.
Histrico de Alteraes
Se os aplicativos atendessem exatamente suas especificaes quando fossem implantados, seria
um milagre. Se h uma constante no desenvolvimento de aplicativos, que sempre so fei tas alteraes . Grande parte do trabalho de desenvolvimento de um sistema registrar e contro lar essa
alterao, impedindo-a de desv iar totalmente o projeto do que foi planejado. Esse rastreamento
em geral conhecido como cOfllrole de alleraes e envolve o registro de cada alterao solicitada, obedecendo algum processo de aprovao para determinar quais delas puderam ser incorporadas ao sistema e, em seguida, a documentao dessas decises e o efe ito que cada alterao
produz no planejamento do proj eto. Se as que ocorrerem em seu sistema forem documentadas,
esse material ser um recurso inestimvel para os desenvolvedores que estiverem trabalhando
em novos recursos e na manuteno dos existentes, e para os projetistas e gerentes que planejarem novas verses de seu software .
Retoques Finais
519
S uso essa notao para indicar o tipo de dado; no adiciono informaes sobre o escopo,
a no ser incluir o smbolo m para indicar uma varive l membro (privada) de lima classe.
No especificar o escopo uma questo de simplificao porque raramente emprego algo
diferente de variveis no nvel do procedimento ou da classe. Dessa maneira no preciso
ter nenhum tipo de indicador do escopo nas variveis em nvel de procedimento.
Todas essas convenes de nomeao se aplicam a nomes internos, como variveis privadas, controles de seu fonnulrio e assim por diante. Ao criar classes, propriedades pblicas e mtodos pblicos, voc definir uma interface externa, e esses nomes devem ser
simp les e legveis por qualquer pessoa. Por exemp lo, posso chamar a varive l de um contador interno de; Count (para indicar que um nmero inteiro), mas uma propriedade semelhante em uma classe pblica deveria ser chamada apenas de Count.
O objetivo final tornar seu cdigo mais e no menos legvel. Alm da notao hngara,
certifique-se de que os prprios nomes das variveis tenham um significado!
Tipos de Dados
Em geral uso o menor nmero de caracteres possvel em minha notao dos tipos de dados e,
portanto, nem mesmo tento empregar a mesma quant idade para todos e les (diferentemente da referncia anterior ao artigo da Microsoft). Lembre-se de que forneo minha notao na Tabela
18. I, mas incl uo alternativas comuns entre parnteses, onde apropriado. No seria prtico abordar todos os tipos de dados da plataforma .NET, incl usive todas as classes do .NET Framework,
de modo que tentarei mostrar exemplos suficientes para lhe dar uma idia de como nomeio minhas variveis.
Dia 18
Notao Hngara
String
S [str]
I [int]
Double (Duplo)
Ob1
Single (Simples)
L [I ng]
Soolean (Sooleano)
S [bool]
Date/Time (Data/Hora)
dt
d,
System.Data.DataColumn
d,
Dbject (Dbjeto)
obj
algo que seja bem incomum, que eu use freqentemente, costumo empregar apenas um
nome descritivo com o prefixo obj, como em objWebRequest.
Para
Controles
Os exemplos da Tabela 18.2 se aplicam igualmente aos controles usados nos formul rios da
Web e aos controles Windows.Forms .
TABELA 18.2 Prefixos de Controles Comuns
Controle
Notao Hngara
Boto
lb1
Caixa de texto
t,t
lb
Caixa de combinao
Botes de opo
'pt
<h k
Grade de dados
dg
Itens de menu
521
Blocos de Comentrio
No incio de cada procedimento e classe, voc pode inclu ir um comentrio amplo de vrias linhas descrevendo esse trecho do cdigo. Esses blocos de comentrio so muito usados como o
local onde se fornece qualquer tipo de informao aplicvel ao trecho com pleto do cd igo em
vez de a uma nica linha ou estrutura. Em geral ulil izo as informaes a seguir nos cabealhos de
comentrio da classe (incluindo o mdulo):
1
2
3
4
5
6
7
8
10
11
12
13
14
18.4
Imports System
Imports System . Data
Imports System . Data.SqIClient
' **********************************************************
'Nome da classe:
'Dependnc i as:
'Finalidade :
GetAuthors
System . Data. o SQL Serve r deve estar disponvel
Acessar o SQL Serve r e recuperar dados
na tabela Authors do banco de dados Pubs
Sample
'Autor:
Ouncan Mackenzie
'Editado pela lt ima vez por:Duncan Mackenzie
'Editado pela lt ima vez em:09!08/2001
'Comen trios :
Alterado para que o nome do SQL Server seja passado
em vez de estar embutido no cdigo.
15 ' **********************************************************
16
17 Public Class GetAuthors
18 End Cl ass
522
Dia 18
Dependncias (referncias requeridas por essa sub-rotina ou funo, outras classes, requisi tos do sistema como o SQL Server)
Finalidade
Parmetros (incluir todos os possveis se voc tiver um bloco de comentrio para vrias
verses sobrepostas, ou apresentar apenas a verso atual se um bloco de comentrio for
inserido antes de cada verso sobreposta)
No dificil escrever um suplemento para a plataforma .NET que lhe fornea pelo menos o modelo de um bloco de comentrio e o poupe de alguma digi tao, portanto se voc tiver tempo,
pode achar interessante desenvolver um como projeto de fim de semana.
Extraindo o Cdigo
Depois de ativar o contro le do cdigo-fonte no Visual Stud io .NET instalando a parte relativa ao
cliente do VSS, voc ter disponveis algumas novas opes de menu. No menu File, um submenu chamado Source Control fornecer vrias opes, dependendo de um projeto estar aberto no
momento. Caso contrrio, haver a opo de abrir um diretamente do sistema de controle do cdigo-fonte, porm, na primeira vez em que se usa o VSS, mais sensato acessar um projeto e adicion-Ia a esse sistema. Qual projeto ser aberto no realmente importante no momento, mas
Retoques Finais
tambm podemos apenas criar um novo aplicativo do console para us-lo neste exemplo. Chame-o de SCC Sam pIe e insira o cdigo mostrado na Listagem 18.5 em seu mdulo, permitindo
que cu aproveite e introduza uma pequena demonstrao de acesso a contedo da Wcb enquanto
examinamos o controle do fonte.
LISTAGEM 18.5
1 Imports System.Net
2 Imports System.IO
3 Module SCC_Sample
4
5
Sub MainO
6
Dim sOutput As String
7
Dim sURl As String
8
sURl = ''http://msdn.microsoft.com''
g
Try
10
Dim objNewRequest _
11
As WebRequest = HttpWebRequest.Create(sURl )
Dim ob jRes ponse
12
13
As WebResponse = objNewRequest . GetResponse
14
Dim ob j Stream _
15
As New StreamReader(objResponse .GetResponseStream(
16
sOutput = objStream.ReadToEnd()
17
Catch eUFE As UriFormatException
18
sOutput = "Error in URL Format: [" & sURL & ")" &
19
System . Environment .NewL ine()& eUFE .Message
20
Catch eWEB As WebException
21
sOutput = "Error With Web Request: " _
22
& System.Environment .NewLine() & eWEB.Message
23
Catch e As Except ion
24
sOutput = e.ToString
25
Finally
26
Console . Write(sOutput)
27
End Try
28
Console .Read Line()
29
End Sub
30 End Module
Agora, salve todos os se us arquivos selecionando File, Save Al I no menu. Com o projeto iniciado e contendo alguns dados, a prxima etapa inseri-lo em seu sistema de controle do cdigo-fonte. Selecione a opo Microsoft Visual SourceSafe no menu File e, em seguida, esco lha
Source Control e fina lmente d um clique em Add Solution to Source Control.
Dia 18
524
NOTA
Isso abrir uma caixa de dilogo que lhe permitir escolher um caminho dentro do sistema de cdigo-fonte para armazenar sua soluo e os projetas dela (veja a Figura 18.2).
fiGURA 18.2
Ao incluir seu cdigo.
voc ler de escolher
onde armazenar o
cdigo-fonte.
.-ao
"
~.
~""''''h
1
1
1
1
Sua caixa de dilogo provavelmente no exibir nada alm da raiz da rvore de controle do cdigo-fonte, $/, masj existem alguns projetos em meu sistema de contro le. possvel criar subd iretrios digitando o nome desejado e dando um clique em Create. Certifique-se de que a rai z
esteja selecionada na caixa de dilogo e em seguida, d igite Teach oursel f Vi sual asic
NET (Ensinamos a voc o Visual Basic .NET) e d um clique em Create. Agora, o novodiretrio
estar se lecionado, que o que queramos, portanto, digite Day 18 e d um clique em Create.
Para concluir, digite o nome que deseja para sua soluo (SCC Sam pie uma boa escolha; veja a
Figura 18.3) e d um clique em OK. Voc ser quest ionado se o projeto j no existe e se quer
cri-lo automaticamente, que o desejado, ento, d um clique em Yes.
FIGURA 18.3
(f;
~I
R
"
1_
. '0
........... """Hl:1
-I
-I
Agora, o Visual Sludio .NET adicionar esse projeto ao controle do cdigo-fonte e o armazenar
ao mesmo tempo, o que significa que voc ter de extra-lo antes de poder alter-lo. Observe que
Retoques Fina is
525
seus arquivos a partir desse momento sero apenas de leitura, como indicado na barra de titulo
do Visual Studio .NET e do Solution Explorer (veja a Figura 18.4).
FIGURA 18.4
VII/a das illlelles do
cOl1lrole do
cdigo-fonte permitir
que o desenl'o/I'edol" s
edile 1/11/ c</igo de
cada I"e=. 1)01'/(11110.
apenas o cdigo que for
exlrado podel' ser
allel'ado.
Nesse momento, voc poder extrair seu cdigo, porque por fim o inseriu completamente pela
primeira vez. Selecione o mdu lo no Solut ion Explorer, que nomeei como SCCSamp 1 e. vb em
meu projeto, e d um clique nele com o boto direito do mouse. No menu suspenso que surgir,
haver uma nova opo, Check Out Now (veja a Figura 18.5), que permitir que s esse arq uivo
seja extrado e editado. At que um arquivo seja extrado, ele ser apenas de leitura e quando for
acessado, poder ser editado somente na mquina onde for recuperado.
Outra opo, que pode ser mais til, Check Out Now (Recursive), mostrada na Figura 18.6, que
extrai a sol uo ou projeto e todos os arquivos de le, e estar disponvel se voc der um clique
com o boto direito do mouse no projeto ou soluo. Essa opo aparecer, para que seja tudo
extrado de uma s vez, apenas se Display Si lent Check-Out Command in Menus for se lecionado. Esse recurso encontra-se na pasta Source ContraI da caixa de dilogo de opes, que pode ser
acessada selecionando-se os itens de menu Tools e Options .
Depois que um arquivo for extrado, ele apresentar esse status por meio de um novo cone prximo a seu nome no Solution Explorer, como mostrado na Figura 18.7, e pelo fato de que no
ser mais apenas de leitura. Agora voc pode fazer quantas alteraes q uiser nesses arquivos,
mas elas no sero refletidas no sistema Source Safe at que eles sejam introduzidos novamente
nesse local.
Dia 18
526
FIGURA 18.5
(I
-FIGURA 18.6
Usar a ex/rao
rl!cursil'o para acesso,.
lodos os arquivos de
seu projelO de lima s
ve=. em geral mais
fcil do qlle ex/ra-Ios
1/111 de cada I'e:.
Armazenando o Cdigo
Quando um cd igo for extrado, outros programadores que usarem o sistema do cdigo-fonte s
tero acesso a uma cpia de leitura dele; voc ter acesso exclusivo cpia que extraiu. No
nossa inteno manter os arqu ivos fo ra do sistema se no os estivermos usando, a menos que
conscientemente no pretendamos que eles sejam alterados por mais ningum, portanto armazene seu cdigo mais urna vez depois que tiver feito (e, em geral, testado) suas alteraes.
Retoques Finais
527
,,(.lEI
FIGURA 18.7
O Solmioll E.xplorer
indicar se
111/1
orqllil'o
con/role do
cdigo-folll em seu
projelo.
No cdigo de seu exemplo, que, em confonn idade com o desenrolar desta explicao, no momento no foi extrado, faa algumas alteraes no mdu lo, corno remover Conso 1e. Readl i ne
da li nha 28 e alterar o trecho do URL na linha 8 para http: j jwww.microsoft.com. Agora, salve
seus arquivos e, em segu ida, voc poder armazen-l os novamente em Source Safe. H vrias
maneiras de armazenar arquivos, mas a mais simples dar um cl ique com o boto direito do
mouse na so luo ou projeto (o mesmo nvel do qual foram retirados) e selecionar Check In. Isso
abrir lima caixa de dilogo (veja a Figura 18,8) que perm itir a especi ficao de que arquivos da
sol uo devem ser incluidosjuntamente com um comentrio explicando o que foi alterado e qual
o motivo.
FIGURA 18.8
Qualldo voc
arma=ellar 1IQ)'amel/le
os arquivos. poder
-_..........
!l o fi
~~~
--
adiciol/ar comemrios
para d(X'lImelllar as
fI'_'"''''
fI'_''''''...
1/'''''''''
." '0" .
1/'CW2OD' t,"""
...
r _ ..... .......,
. 4 ~ --..
Dia 18
528
cdigo-fonle alterado
no siSfelll(J
essa
1I0WI
de COI/Iro/e,
\'erso ser
mamida para
~
~
I
I
referencias filluras.
"-
Selecione a primeira verso, que representa o arqu ivo original introduzido em Source Safe e, em
seguida, d um clique no boto Diff. Isso abrir lima caixa de dilogo na qual ser possvel se
certificar de que a opo Visual est selecionada para que, em segu ida, voc possa dar um clique
em OK. Agora, ser exibida uma janela (veja a Figura 18.10) que deta lha o estado atual do arquivo e como ele era na verso selecionadae descreve as diferenas. Esse formato visual torna claro
o que foi alterado, mas ocupa muito espao para mostrar as alteraes de um arquivo-fonte grande. Os outros doi s formatos (Unix e Source Safe) forn ecem um breve resumo das a lteraes entre as duas verses, o que pode ser mais de seu gosto.
Voltando janela History, voc pode retornar uma verso anterior de um arquivo, se quiser desfazer muitas alteraes e no se preocupar em perder tudo o que foi alterado de uma verso para
a outra. Retornar a verso, comparado a visualizar as diferenas e desfazer manualmente uma
quantidade selecionada de alteraes, urna operao rad ical, mas s vezes a nica maneira de
voltar a um estado conhec ido que funcione. Selec ione a primeira verso desse arquivo na lista do
histrico e, em seguida, d um clique no boto Rol1back. Ser exibido um aviso de que essa ao
no pode ser desfeita, mas v em frente e execute-a de qualquer modo. Agora, s haver uma
verso. Suas cpias locais sero atual izadas para essa verso, e se voc ou outra pessoa acessasse
esse arquivo em Source Safe, essa a verso que receberiam. Todas as alteraes fei tas aps a
verso selecionada foram totalmente removidas.
Retoques Finais
529
FIGURA 18.10
Resumo
A documentao considerada por muitas pessoas como um mal necessrio na programao.
Em geral feita no final de um projeto, de maneira apressada, forn ecendo uma quantidade mnima de comentrios para que voc possa dizer que est tudo concludo. A chave para tornar a docum entao til e muito menos difcil de ser terminada trabalhar nela durante o
desenvolvimento. Seguir as diretrizes desta lio far COm que seu cdigo fique to fc il de compreender quanto for possvel e os comentrios preenchero qualquer falha no entendimento que
possa exist ir.
530
Dia 18
P&R
P O comentrio no apenas uma maneira de compensar um cdigo confuso? Se seu
cdigo for bem escrito, nilo dever precisar de nenhum comentrio.
R Tenho ouvido essa declarao algumas vezes e ela parcialmente verdadeira. Quanto
mai s claro for seu cd igo, menos comentrios sero necessrios. Coloque em prt ica
esse pensamento, e voc concluir que um cd igo realmente claro no precisa de comentrios. Concordo, mas cre io que qualquer programa composto de mais de 10 linhas de cdigo nunca conseguir ser to claro porque o pb lico em potencial que ir l-lo muito
variado. Faa com que seu cd igo fique to c laro quanto possvel, diminuindo assim os
comentrios, mas comentar um pouco sempre ser necessrio.
P Achei que a plataforma .NET inclusse comentrios com base cm XML, mas voe
no a abordou nesta lio.
R Infelizmente, o comentrio com base em XML um recurso da C#, e no do Visual Basic
.NET (ou de qualquer outra li nguagem .NET). Se voc estiver interessado, examine os
materia is de referncia da C# que vm com o .NET Framework para obter mais detalhes
sobre os comentrios em XML.
Workshop
o Workshop fo i planejado para ajud-lo a antecipar poss veis dvidas, revisar o quej aprendeu
e comear a pensar em corno colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
1. Com base nos padres de nomeao abordados nesta li o, o que voc pode dizer de uma
varive l chamada sConnectionlnfo?
2. O Visual Source Safe fo rnece servios de controle do cdigo-fonte ao Visua l Studio
.NET. Cite no mnimo duas razes pelas quais voc gostaria de usar um sistema de controle do cdigo-fonte.
3. Qua l o nome dado quando se usa o sistema de cd igo-fonte para que a verso anterior de
um cdigo volte a ser usada?
SEMANA
DIA
Implantando Seu Aplicativo
Depois de desenvolver um aplicativo, voc ter de faz-lo chegar a seus usurios . O processo de
passar um sistema da etapa de produo utilizao conhecido como implanlao e em geral
considerada uma das fases mais difceis de qualquer projeto de desenvo lvimento. Esta lio
abordar as etapas bsicas da implantao de um aplicativo por me io do Visual Studio .NET, in-
cl uindo:
A introduo implantao.
Introduo Implantao
Imp lantar um aplicativo , ralando de maneira bem simples, disponibiliz-lo para as pessoas que
iro us-lo. A implantao ter significados distintos para tipos diferentes de aplicativos. Para
um aplicativo da Web, ela pode significar colocar seu cdigo e pginas em um servidor Web, enquanto para um aplicativo Windows, pode ser dispon ibilizar seu arquivo .exe para todos os usurios. Em geral, lidamos com vrios arquivos direrentes, e cada um apresenta seus prprios
requisitos, complicando todo o processo. Uma dependncia acontece quando um arquivo, que
poderia ser seu executvel, prec isa de outro, como uma bi bl ioteca (.dll), para ser executado cor-
532
Dia 19
feIamente. Portanto, seu aplicativo pode depender de um ou mai s arquivos, mas esses, por sua
vez, tambm podem ter dependncias e assim por diante. Implantar seu arquivo .exe de modo
que ele funcione de maneira correta pode requerer a instalao de vrios outros arquivos!
A dependncia mais comum que encontraremos, porque ela ser necessria a todos os aplicativos .NET que forem criados, o .NET Framework. Como voc deve se lembrar, o .NET f'rame\Vork foi introd uzido como parte da instalao do Visual Sludio .NET e composto de muitos
arquivos que contm todas as bibliotecas de classes, o Com mom Language Runtime (CLR) e
outros componentes importantes. Para evi tar que seja preciso incluir todos esses arquivos dife-
Im plantando S eu Aplicativo
pregar essa tecno logia, seus programas de instalao podero se beneficiar de muitos recursos
excelentes, todos fazendo parte da plataforma SDK .
As pginas MSDN que fazem parte da plataforma SDK apresentam uma tendncia incmoda de
ter seus UR Ls alterados com o tempo, portanto o conduzirei na descida pel a rvore da biblioteca
em vez de fornecer um link d ireto. Acesse http://msdn.microsoft . com/librarye,em seguida,
localize o n da rvore (no lado esquerdo da pgina) chamado Setup and System Adm ini stration.
Abra esse n e, ento, prossiga na desc ida atravs de Setup, Windows Instal ler e SDK Documentati on. No !inal, voc estar no Windows Instai ler (ele aparece duas vezes no caminho; no se incomode com isso). O bom que h informaes dispon veis sobre o Windows Installer, mas
talvez a melhor maneira de aprender seja test-lo por Slla prpria conta.
o exemplo ser criado com a colocao de um novo aplicativo Windows em sua prpria sol uo. Percorrerei cada etapa relevante, e voc poder acompanhar ou faze r o down load do cdigo
completo que se encontra no site deste livro na Web.
Dia 19
clique no boto More se ele j no tiver sido expandido . D um nome apropriado ao projeto,
como AuthorList e, em seguida, assegure-se de que a opo Create Directory For Sol ution esteja
selecionada, permi tindo que um nome seja fornecido para sua soluo. Crie um nome para ela,
como Pubs Demo, ind icando que algo mais do que apenas esse projeto pode ex istir nesse local.
Para conclu ir, d um clique em OK a fim de gerar a soluo e o projeto. Crie um diretrio para
qualquer soluo que tenha mais de um projeto de modo que promova uma organi:U1o automtica em seus arquivos, situando todas as propriedades que fazem parte da mesma so luo j untas
em um diretrio. Um projeto e uma soluo sero criados com os nomes que voc escolheu.
Adicione o Cdigo
A fina lidade deste ap licativo exibir uma lista de autores, portanto, o cd igo tem de estabelecer
a conexo com o banco de dados, acessaressa lista e ex ibi- la no controle da caixa de lista. Todas
essas etapas foram abordadas como parte do Dia 12, de modo que s mostrarei para voc o cd igo concludo (veja a Listagem 19. 1), que chamado no construtor do formulr io. Ad icione o cdigo da linha 8 sub-rotina New de seu formulr io e, em seguida, insira a rotina LoadAuthors em
qualquer local dele, exeeto dentro de outro procedimento.
LISTAGEM 19.1
2
3
4
Adicionando o Cdigo ti
Sub-rotina
New
de Seu Formulrio
7
8
9
10
LISTAGEM 19. 1
Adicionando o Cdigo
535
(continuao)
11
12
13
14
15
16
17
18
19
20
21
22
23
24
connPubs.Open()
daAuthors. Fi 11 (dsAuthors, "Authors")
25
26
27
28
Preci so desviar um pouco do tpico e discutir algo comum quando chegamos aos estgios finai s
de um aplicativo. H um item no cdigo mostrado na Li stagem 19.1 que causar problemas
quando esse for im plantado. Ele usa (local) para especificar o nome do SQL Server (Data
$ource na string de conexo da Listagem 19.1). Isso informa plataforma .NET que voc quer
se conectar com O SQL Server na mquina local, o que provave lmente correto quando estamos
desenvolvendo, mas quando esse cdigo estiverem execuo em um grupo de mquinas clientes
diferentes, pode ser melhor que todas acessem o mesmo SQL Server central. H duas manei ras
de corrigir isso: a rpida que embutir no cdigo o nome do SQL Serverdesejado, ou a um pouco
mais complicada que permitir que o nome do servidor seja alterado sem a recompilao do cdigo. claro que quero mostrar as duas, portanto, comearei com o mtodo mais fcil, em que
apenas a lteraremos a string da conexo para que inclua o nome real do computador de seu SQL
Server:
sConnectionString = "Data Source=Olivaw;" &
"Initial Catalog"Pubs;" &
"User I D"sa; password"danee I"
Nada mais precisa ser alterado, e agora, independentemente de em que mquina esse cdigo seja
executado, ele tentar local izar o servidor com base no nome "01 i vaw" .
possvel que o nome desse servidor seja a lterado ou voc pode preferir usar um servidor di ferente para este aplicativo. Em geral, o servidor que empregado no desenvolvimento e o utiliza-
Dia 19
do na produo so duas mquinas diferentes. Seria benfico poder alterar o servidor com o qual
esse apl icativo se conecta sem que fosse preciso recompilar o cdigo. Antes da plataforma
.NET, esse tipo de fun cionalidade era obtida com o uso do Registro. Essa opo ainda est disponvel, mas um dos principais conceitos novos do VS .NET que seu aplicativo deve poder ser
instalado apenas por meio da cpia de seu diretrio em uma mquina (que tenha o .NET Framework). Possuir infonnaes que precisam estar disponveis no Registro pode impedi r que esse
tipo de instalao funcione corretamenle.
Perseguindo o objetivo de fornecer instalaes e reinstalaes fce is para os apl icativos, a plataforma .NET introduziu um novo sistem a para armazenamento das configuraes de seu aplicativo, que mai s parecido com a tecnologia antiga dos arquivos .ini do que com a do Registro. Esse
novo sistema funciona com o uso de arquivos de configurao, documentos XML que podem ser
associados a toda urna mquina ou a ap li cativos individuais. Depoi s que voc concluir essa instalao simples, abordarei a utilizao dos arqu ivos de configurao na prxima seo.
Teste o Projeto
Agora voltemos ao objeti vo original de criar um arquivo de instalao. Ed ite a st ring de conexo
da maneira certa para certificar- se de que ela poder estabelecercorretamente uma conexo com
um SQL Server e encontrar o banco de dados Pubs do exemplo. Concluda essa etapa, execute o
projeto para ter certeza de que est funciona ndo e de que voc possa ver uma li sta de nomes de
autores no controle de caixa de li sta. Se tudo der certo e voc tiver fornecido algo di ferente de
(loca 1) como nome do servidor em sua string de conexo, ento, teremos um aplicativo concludo para o qual poderemos desenvolver um programa de instalao.
537
lador para distribuir nosso cdi go-fonte, arqu ivos de depurao ou outro contedo. Para este
exemplo, se lecione Primary Output from AuthorList.
FIGURA 19.1
Voc pode usa/" o Sefllp
lVi::ard 01/ simplesmel/fe
selecionar Sefllp
Projecf para adiciol/al"
individualmenle lodos
os al"quivos de que
precisa.
- , I ~'
........" Ic_ ...... _.~ ooo OU\' ::J
FIGURA 19.2
O Selllp lVi=ard o
condllzir pela crialio
de 1/11/ projelO simples
de inslOlalio para sua
soluo.
~-_
II ~-> I
FIGURA 19.3
Se I'oc quiser cria/"
lima inslalao griifica
em I/l1Ia l1Iquina
JVindow.s. seleciolle a
inslalao-padro para
1/11/ aplica/i\"(}
lVindows.
_ no
OlJ D.... _
.......................... ,...
- """""._"".,,,...-'
"""'._lu.""'_"" .
W
r-
D. _ _ .... _
.. ..
r-""""._ .. -",,,,,,,,,,,-_
r- c.. .... >l> 'Lldoblo CAt Ilt
,r ,. 11
538
Dia 19
FIGURA 19.4
Os resultados de 1/111
projeto s(io
conseqiincia de seu
de.~enl'oll'illlel1lo.
1/111
arquivo .exe
.........
seja
01/
.d/l.
Con:d
, e.co.
II u""
roi,..
Alm dos resultados de um ou mais de nossos projetas (se houvesse mais de um projeto na soluo, que no fosse o de instalao, ento, todos eles teriam sido includos na lista de saidas), voc
tam brn pode selecionar qualq uer arquivo adicional que queira inc lu ir (veja a Figura 19.5). Em
meu exemplo, inclu um arquivo readme, mas esse poderia ser seu mtodo de distribuir quase todos os tipos de arquivos inclusive algum contedo XML ou at um banco de dados do Access
(arquivo .mdb).
FIGURA 19.5
Adicionar arq/lil'os
C/lao r.lg . , o _
liIoo """ ..
You.., '"*'
.config. readme e
doclIl/lelllar(io so
apenas algllmas das
.....- I
-I
lIlilidades da seo de
arquil'os adiciolla' do
projeto de insfalaiio.
,art
II
N.,
Para concluir, um resumo (veja a Figura 19.6) exibido, e o assistente ser fechado quando voc
der um clique em Finish. Nesse ponto, o projeto de instalao ter de se esforar um pouco para
determinar as dependncias das sadas selecionadas, examinando os arquivos do projeto correspondente. Quando essa operao estiver concluda, ser possvel ver o projeto de instalao em
seu Solution Explorer, e dentro da subpasta Dependencies, as dependncias que encontrou. Na
jane la de propriedades do prprio projeto e de seus vrios arqu ivos, pode-se alterar como o programa de instalao ser criado, mas por enquanto, deixarei tudo corno est,
FIGURA 19.6
A janela do resu/IIo
jonllJcer algl//IIas
informaes bsicas
sobre o que o projeto
de il/slalao criara,
/lias o trabalho eje/ivo
mio comeara at que
\'oc d 11m clique em
Finish.
539
C<eoto
lho _ ProjoU
.. , ... _ _ _ _ ... .... _
.............. ,,'
~,-"",,,,,
1-....
"' ..........,....
..
c"t- . ,....
Coocot!
.9o<i
".
II
f .....
Compilando a Instalao
Exatamente como em qualquer outro projeto, para gerar a sada deste projeto de instalao, voc
precisa compil-lo. Press ione Ctrl+Shift+B ou selec ione Buid e Build Solution no menu para
compilar todos os projetos da soluo, inclusive o novo projeto de instalao. Essa compilao
leva algum tempo devido basicamente ao projeto de instalao, que com pacta todos os arquivos
.NET redistribuveis necessrios em um nico arquivo .msi . Vrios outros arquivos sero compilados e includos no diretrio da sada de seu projeto de instalao mas, na verdade, eles so
apenas arquivos de s uporte para a tecno logia do Windows Installer.
O Visual Stud io .NET usa a verso 2.0 do Windows Installer, que pode ser a instalada no momento em sua mquina de destino. Se ela j no estiver na mquina, esses arquivos de suporte
perm it iro que o usurio a instale. Se voc puder se cet1ificarde q ue todos os usurios possuem a
verso correta do Windows Installer, devido a s ua verso do sistema operacional, por exemplo,
ou porque tm outro programa .NET instalado, ento poder optar por incluir apenas o arquivo
.msi em sua implantao. As configuraes que controlam a incluso dessas instalaes podem
ser encontradas quando voc verificar se seu projeto de instalao est selecionado e, em seguida, selec ionar Properties no menu Project (veja a Figura 19.7).
NeTA
o termo
540
Dia 19
FIGURA 19.7
' c_-.,,_
.. -
""""'lo".',,,
1 _'_
r .......... _
"_no I
hOllver alguma) do
Windows IlISlaller
estar disponvel no
mquina de deslillo.
certifique-se de incluir
os (lrqllh'os necessrios
para aluoli=ar 011
il1s/(llar (I \'erscio
,------
apropriada.
Na pasta de dependncias de seu projeto de instalao, voc ver vrios arquivos, todos eles necessrios para que se u ap li cativo seja executado. Agora, ser possvel saber que no preciso
instalar um certo arquivo ou arquivos, mas o programa de insta lao os incluir independentemente disso. Se quiser forar a excluso de um arquivo, d um clique nele com o boto direito do
mouse e selecione Exclude no menu que aparecer. Tambm podemos visualizar as proprieda
des de um arquivo e a lterar a propriedade Exclude para True se quisermos: as duas operaes te
ro o mesmo efei to. Uma razo comum para a excluso de arquivos que sabemos que o .NET
Framework j est instalado e queremos tentar reduzir o tamanho da instalao para que fique
adequada.
Isso conclui a criao de um programa de instalao s imples, mas o teste real pegar aquele ar
quivo .msi (que, no momento em que escrevi este texto, estava com pactado em cerca de 25 MB)
e implantlo em uma mquina de dest ino. Apenas copie o arquivo (que estar no diretrio de
depurao da pasta do projeto de instalao) para o destino ou insirao em um CD. Em seguida,
na mquina de destino, d um clique com o boto direito do mouse no arquivo .msi e selecione
[nstal l. Nesse momento, voc receber uma mensagem de erro se no tiver a verso mais recente
do Windows Installer na mquina de destino, caso contrrio, a instalao deve prosseguir e inse
rir o .NET Frame\Vork e se u arq uivo .exe nessa mquina.
Voc pode ter alguns problemas para encontrar o que foi instalado, mas os arqu ivos sero inseri
dos em \Program Files\<Autor do projeto de instalao>\<Ttulo da instalao> na m
quina de destino, que por padro se r \Program Fi 1es\Mi crosoft\Setupl. Antes de compilar um
programa de instalao que atenda a seus props itos, certifiquese de alterar as propriedades
Au thor e Setup Ti t 1e, que esto d isponveis najanela de propriedades do proj eto de instalao.
Arquivos de Configurao
Os arquivos de con figurao so documentos XML associados ao seu aplicativo .NET com base
no nome e local. Eles usam o formato s imples de nomeao com o nome completo dos aplicati
vos (AuthorList.exe, por exemplo) seguido de .config (prod uzindo AUlhorList.exe.config) e fi
541
cam localizados no mesmo diretrio dos aplicati vos propriamente ditos. O contedo do
documento de XML padro, mas o formato real (ou esquema, usando os termos da XML) definido pela plataforma .NET. A proCura por ' esquema de arquivos de configurao ' na documentao do .NET Framework gera vrios resultados tei s que detalham como criar arquivos de
configurao.
Uma introduo bsica seria que o arquivo composto de uma ou mais sees, cada uma com
seu prprio nome e contendo confi guraes relacionadas. Cada seo de confi gurao deve ser
descrita como uma li nha dentro de um conjunto de tags <configSections><jconfigSections>.
No entanto, tambm existem arquivos de configurao no nvel da mquina, de modo que as sees descri tas nesse nvel podem ser usadas (sem serem descritas novamente) nos arquivos de
confi gurao especfi cos do apl icativo. Uma das sees principais. AppSet t i ngs, pr-descrita
no arqui vo de configurao da mquina, portanto voc pode apenas seguir em frente e us-I a na
configurao de seu aplicativo. Construi um arquivo de configurao para o aplicat ivo Aut hor
List, que mostro a segu ir, como um exemplo de como poderiam os empregar esse tipo de arquivo . Ele contm, na seo AppSett i ngs , apenas uma linha com o nome "Serve r" e o valor "01 ivaw" , representando o nome de meu SQL Server:
<configuration>
<appSettings>
<add key"'''Server'' value=o"O l ivaw" j>
<jappSettings>
<jconfiguration>
Agora, voltando a meu cdigo, preciso faze r alteraes para que o nome do servidor em but ido
no cdigo da string de conexo seja, de modo alternativo, carregado a partir do arqu ivo de configurao. A verso alterada de Loa dAuthors, que foi reescrita para usar o arquivo de configurao a fim de determinar o nome do SQL Server, fornecida na Listagem 19.2.
LISTAGEM 19.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
connPubs .Open()
daAuthors. Fi II (dsAuthors, "Authors")
Dia 19
LISTAGEM 19.2
15
16
17
18
19
20
21
22
23
24
25
A linha 22 executa todo o trabalho que usa o arquivo de configurao, trabalho esse
que ficou muito mais simp les porq ue meu arq ui vo de configurao s uliIizou sees
j ex istentes. Se eu quisesse inclu ir minhas prprias sees, teria de descrever a nova seo como
uma linha dentro do bloco confi gSect i ons dos arquivos de configurao do apl icativo ou mquina e, em seguida, adicionar as configuraes individuais como linhas dentro dessa nova seo.
Nesse caso, a linha 22 retorna como uma string qua lquer que seja o va lor do atribulo na Iinha do
arquivo de configurao, de modo que posso empregar essa string na criao de minha conexo
(linha 3).
ANALISE
543
1 Option Explicit On
2 Option Strict On
3
4 Imports System
5 Imports System.Data
6 Imports System.Data.SqlClient
7
21
22
23
connPubs .Open()
daAuthors.Fill (dsAuthors. "Authors")
2'
25
Return dsAuthors
26
27
End Function
28 End Class
Observe que o n ico mtodo dessa classe, AuthorLi st (lin ha 10), usa o nome de um
servidor corno parmetro, pennitindo que passemos essa informao do aplicativo
principal. Agora o aplicativo original precisa ser reescrito para usar a biblioteca nova, o que tambm req uer que ad icionemos uma referncia ao projeto. Para adicionar a referncia, d um clique
com o boto direito do mouse na pasta References (do projeto original) e selec ione Add Reference. Isso abrir a caixa de dilogo Add Reference, e nesse momento voc poder encontrar o novo
projeto de biblioteca de classes na gu ia Projecls (veja a Figura 19.8). Certifique-se de que o projeto PubsDataAccess esteja realado c, cm seguida, d um clique em OK para adicionar uma referncia ao projeto principal.
ANALISE
Com essa referncia adicionada, voc poder reescrever o cdigo de seu formu lrio para que use
a biblioteca, criando o cdigo descrito na Listagem 19.4.
544
Dia 19
LISTAGEM
19.4
8
lbAuthors.OataSource " dsAuthors.Tables(O) . OefaultView
IbAuthors.OisplayMember" "Name"
9
lO:End Sub
11
12
13
14
15
16
FIGURA
19.8
de
0 1111'0
_10::0\_1
_m
-I
/ocal.
mesmo se seus
resultados /leio tirerem
sido compilados.
Para que possamos ad icionar outro projeto de instalao, d um clique no existente e selecione
Remove para retir-lo da soluo atual. D um cli que com o boto direito do mouse na soluo,
selecione Add e New Projecl no menu suspenso que aparecer e abra a caixa de dilogo New
Projecto Selecione o Setup Wizard para obter um tipo de projeto, insi ra um nome diferente do padro para evitar o conflito com o projeto criado anteriormente e, em seguida, d um clique em
OK . O mesmo Setup Wizard que j usamos deve aparecer, mas uma das etapas, Choose Project
Outputs to [nclude, exibir algumas informaes di ferentes das da ltima vez que esse assistente
545
foi executado. Dessa vez, os arquivos de resultado tanto do aplicativo principal quanto da nova
biblioteca sero exibidos (veja a Figura 19.9).
FIGURA 19.9
Quando desenvolvemos
//fIlO instalao em 111110
solll(;o com mais de
um projeto (excluindo a
prpria insta/a(io).
Voo , .... _
..... _
............ _
.. _ 1
O _~ _.........-
O l _ _ ...... , ' ..
O D..... S_ _ ...........
oO s......f
C<rito"O ' .........., :td
... _........u.
[] -
~-
M,c, .,'",""
_ _ """,~ " "'D
O D_S_ ....
rodas as sadas
possveis de todos os
projetos .ficam
disponwis para o
programa de
inswla(io.
l _~
P>..t<Il_,
""'"
<.00'
II """
Apesar das diferenas e de todas as opes que fica ram visveis na etapa C hoose Project Outputs, voc s deve selecionar o resultado bsico do aplicativo principal. Nesse caso, ele AuthorL i st, o projeto que contm apenas um formu lrio Windows, portanto preciso selecionar
apenas as sadas princ ipais desse projeto. Depois que as sadas desejadas forem selec ionadas, feche o assistente. Em seguida, o Setup Wizard determinar as dependncias da(s) sada(s) selecionada(s) e, em nosso exemplo, encontrar uma dependncia adicional que a DLL PubsDataAccess. Por causa dessa dependncia, a DLL necessria ser instalada, mesmo no tendo sido
selecionada como uma das sadas desejadas. Se fosse necessrio selecionar as duas sadas, isso
no faria com que a instalao falh asse, mas um aviso seria exibido durante a compilao de seu
arq ui vo de instalao: "Avi so: Do is ou mais objetos possuem o mesmo local de destino
[ta rgetdi r) \pubsdataaccess. dll
(
I ) ".
A instalao desse projeto no parecer diferente para o usurio fin al, mesmo sendo instalada
uma bibl ioteca adicional, e tudo ir para a mesma mqu ina de destino.
Resumo
Imp lantar sistemas uma das etapas finai s da criao de um aplicativo e em geral muito mais
complicado do que os desenvolvedores esperam. A plataforma .NET tomou a implantao muito mais simples, mas s desenvolvendo seu aplicativo, sua instalao e, em segu ida, testando a
implantao em quantas mquinas for possvel voc ter alguma certeza de que seu estgio rea l
de implantao foi bem-suced ido.
P&R
P A tccnologia Windows Installcr parcce ter muito mais opes do quc possh 'cl encontrar nos projctos Setup c Deployment. Como posso dcscO\'ol\'cr uma instalao
com recursos como os quc \'ejo nas instalacs comerciais?
Di a 19
546
Workshop
o Workshop foi planejado para ajud-lo a antecipar possveis duvidas, revisaro que j aprendeu
e comear a pensar em como colocar se u conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios" .
Teste
I. Se voc no estiver certo de que o .NET Framework estar disponve l em todas as suas
mq uinas de destino, ter de desenvolver duas instalaes (uma com ele e outra sem)?
2. Se voc criar um aplicativo composto de apenas um projeto principal e vrios projetos de
bibliotcca quc clc usc, tcr de gcrar mhipl as instalaes?
3. Como configurar uma nica instalao para que tenha vrios tipos, como, por exemplo, a
norm al, a completa e a mnima?
4 . Como voc inc luiria um arq uivo de co nfigurao (.config) ou outros arquivos ad iciona is
junto a sua instalao?
Exerccios
1. Desenvolva um aplicativo com form ulrios Windows que use um arquivo de configurao para determ inar que nome (propriedade Tex t do formulrio) inserir na barra de ttulo
do Windows e, em segu ida, crie um arqu ivo .config para ele e um programa de instalao. Implante o projeto e, ento, tente a lterar o contedo do arquivo .config e executar
novamente o aplicativo.
SEMANA
DIA
Introduo XML
A menos que voc tenha evitado, durante os ltimos anos, qualquer pessoa no mesmo prdio que
tenha olhado, tocado ou estado com um computador, pode ter ouvido falar do ac rnimo de trs
letras XML. A XML (eXtensible Markup Language) est Cm todos os lugares atualmente - aparecendo at em revistas de variedades do grande mercado. Nesta lio tentarei desmi stificar um
pouco do sensacionali smo e exam inar em que a XML pode auxiliar seus programas. Em particular, esta lio enfocar:
O que XML?
A XML na prtica.
o Que XML7
A Extensible Markup Language (XML - se analisannos deveria ser EM L, mas essa abreviatura
no chegaria nem perto do nome moderno que dado atualmente) uma maneira de adicionar
informaes ao texto. XML o termo popular usado nos softwares -l inhas de produtos e empresas inteiras foram criadas ou modificadas apenas para adicionar XML ao seu material de propaganda -, e h muitos mitos e mal-entendidos relacionados ao que ela pode fazer e qual sua
finalidade.
No entanto, antes de tratarmos dos mal-entend idos, examinaremos primeiro o que ela faz. A
XML uma maneira de adicionar inrormaes ao texto. Que tipo de inrormaes? Inrormaes
sobre o texto. Pode soar como um crculo vicioso, mas estou falando srio, e isso na verdade tem
um nome - metadado. O metadado a infonnao sobre inrormaes. A definio formal
548
Dia 20
Dados sobre dados. O metadado descreve como, quando e por quem um conjunto especfico
de dados foi colctado e como eles esto fo rmatados. O metadado essencia l para a compreenso das informaes armazenadas em depsi tos de dados (definio encontrada na Webopedia do lnternet.com).
Para apreendermos o conceito do metadado, examinaremos o livro que voc est lendo neste
momento. claro que h uma parte essencial no livro-as informaes que ele contm. Elas so
os dados. A lm delas, ainda h as informaes sobre o livro - a quantidade de lies, a existnc ia
dos cabealhos nas sees e assim por diante. At a fonnatao fornece informaes sobre o livro. Se apliquei negrito a alguma parte do texto, voc perceber que ela mais importante do
que o restante . Essas so as informaes sobre o texto do livro - o metadado. O metadado uma
idia poderosa; fornece s informaes urna estrutura e finalidade.
Voc pode ad icionar metadados de mu itas maneiras. Por exemplo, em um banco de dados, o metadado se encontra na forma de nomes e dimenses referentes s colunas das tabelas. Ele informa que tipo de dados deve exist ir nesse local, qual seu tamanho e s vezes um nome que induzao
contedo. A HTML tambm fornece metadados de acordo com a importncia relat iva de alguns
textos. Isto , eles ficam em urna tag de cabealho e, nesse caso, indicam o nvel. No entanto, a
HTML no um exemplo adequado porque foi projetada para ser usada na fonnatao, e no na
identi fi cao de informaes.
Algo que a HTM L realmente nos mostra, entretanto, a relevncia de usar simples tags para adicionar a formatao, ou seja, metadados, ao texto. As lags so os itens que possuem colchetes angulares (dessa <forma que vemos quando nos deparamos com a HTML. Se nunca tiver visto
um cdigo HTML ou s quiser ter uma idia de sua aparncia, d uma ol hada no cdigo-fonte de
qualquer pgina da Web. possvel fazer isso selecionando Exibir e Cdigo fonte no Internet
Exp lorer. Voc deve ver vrias lags. A HTML usa essas tags para identificar qual texto deve ficar em negrito ou em itlico, onde uma tabela ou figura deve ser inserida e assim por diante. Ela
tambm demonstra o fi nal de cada urna dessas sees. Portanto, se examinssemos o cd igo-fonte da pgina da Web mostrada na Figura 20. 1, veramos
<html><body><strong>Aprl l 22 , 1970<Jstron9><body><html>
A tag <strong> marca tudo que estiver entre ela e a tag de fech amento <Jstrong> como algo importante, e a maioria dos navegadores exibiria esse trecho em negrito. Essa tag adic ionou informaes ao texto, portanto metadado.
A XM L semelhante a HTML ; na verdade, elas esto re lacionadas. H muitos anos, um pouco depo is da idade das trevas (nos anos 60), vrios pesquisadores, preocupados com a quantidade de mane iras pelas quais um ponto importante pode ria ser ident ificado , criaram algo
chamado Standard General ized Markup Language (SGML). A SGML introd uziu mui tas
idias inovadoras:
Introduo XML
549
FIGURA 20.1
O marcador deve identificar a si mesmo como tal usando um conjunto de caracteres que
raramente aparecem na escrita comum. Em seu caso, os autores da SGML escolheram os
colchetes angulares (< .
O marcador relacionado ao signi ficado acima deve idem ificar a si prprio como referente
ao marcador anterior usando as informaesj empregadas, adicionando ainda um caractere que no tenha probabi lidades de aparecer nas informaes de origem.
Como voc j deve ter adivinhado, a HTML descendente da SGML. um dos muitos tipos de
uti lizao especial da SGML. Veja bem, a SGML no era na verdade uma maneira de marcar documentos especficos, mas, em vez di sso, modo de definir os ti pos de tags que poderiam ser
adicionados a um documento e, portanto, o modo de identificar os metadados dele. A seguir, seria criada a definio de um documento (isto , uma lista das tags que poderiam ser usadas) que
comearia a ser empregada na criao desses documentos. Conseqentemente, a HTML apresentava vrias tags que poderiam ser uti lizadas para a formatao, e que foram usadas pelas pessoas para criar todas as pginas excelentes que existem na World Wide Web (WWW).
A XML parente da HTML - ou seja, as duas herdaram muitas das idias da SGML. No entanto,
a XML mais parecida com a SGML do que a HTML. Em vez de defin ir um tipo especfico de
documento (como uma pgina da Web), ela estabelece um a maneira de identificar as partes dele
Dia 20
(como a SGML faz ia). Ela usa os mesmos conceitos bsicos da SGM L; emprega tags para marcar o comeo e o final de uma seo de informaes. Essas tags so palavras entre colchetes angulares que devem fornecer informaes sobre os dados que contm. Em outras palavras, a
XML tem a mesma aparncia dos trechos anteriores de HTML e SGML.
Por que os autores da XML criaram algo to parec ido com os dois padresj existentes? Eles fizeram isso porque a SGML com plexa, e a HTML, na verdade, s tem a final idade de adicionar
a um documento informaes sobre a formatao. A XML foi projetada para ser uma SGML
simpli ficada que poderia ser usada na criao de vrias linguagens ou conjuntos de lags especficas de um segmento da indstria ou de uma tecnologia. Muitas dessas li nguagens esto disponveis, incl usi ve as que descrevem equaes matemticas (MathML), receitas e at uma verso da
HTML que foi defi nida com o liSO da XML (XHTML) . Cada urna delas defi ne os metadados que
podem ser ap licados s informaes; no entanto, todas fazem isso conforme as regras da X M.L.
Ento, quais so as regras da XML? Elas foram oficialmente definidas da seguinte maneira:
Os documentos XML devem ser sufic ientemente claros e de fcil leitura pe las pessoas.
Voc tem de escolher entre o Visual Basic .NET e a XML. Embora a XML seja uma linguagem, no uma linguagem de programao como o Vi s ual Basic .NET. As pessoas
parecem ficar confusas com essa parte da 'li nguagem' e comeam a fazer perguntas
como, " Devo aprender Visual Basic .NET ou XML?". A XML no uma linguagem de
program ao, s uma maneira de descrever informaes.
A XML comp licada e dificil de ler. Por que adicionar toda essa 'confuso' ao documento quando X(alguma outra tcnica) faria o mesmo? A resposta simples . uma maneira
fci l de identificar as partes de um documento. Por exemplo, mu itas pessoas sugerem que
algo chamado de Valores separados por vrgula (CSV - Comma-separated values) me-
Introduo XML
551 [
Ihor do que a XML por ser mais simples, fc il de produzir e os arquivos serem menores
(veja o prximo item). No entanto, qual dessas duas listagens descreve mais detalhes sobre as informaes exibidas:
<funcionrios>
<i dent i fi cao funci onri 0="1 ">
<primei ronome>John<jprimei ronome>
<sobrenome>Bul1<jsobrenome>
<jfuncionrio>
<i dent i fi cao funci on ri 0="2 ">
<primei ronome>Mary<jprimei ronome>
<sobrenome>Tel1<jsobrenome>
<jfunci onri o>
<jfuncionrios>
1, John. BulI
2. Mary. Te ll
Na minha opinio, a primeira (a XML) muito mais compreensvel.
A XML torna o trabalho lento (ou muito extenso). Essa afinnao em geral proferida
por aqueles veteranos que acham que se estivennos usando um caractere a mais, estaremos desperdiando velocidade/esforo da memria/processador. Embora s vezes isso
me preocupe, a XML no uma das reas onde ocorre. O argumento que voc pode ouvir
algo como, "Todas essas tags de abertura e fechamento ocupam muito espao e seu uso
consome tempo. Devemos usar X (co locam algo aqui de que e les gostam mais) em vez
disso". A maioria das pessoas que estiver lendo este texto provavelmente se lembrar do
res ultado de um pensamento desse ti po: ele foi chamado de bug Y2K. Real mente h o que
se chama (em minha opinio) de cdigo superolimizado. Em algumas situaes, usar uma
tcnica menos eficiente que torne mais fcil compreender a inteno produz uma resposta
bem superior(mais uma vez, apenas minha opinio). A XML uma dessas tcnicas menos efic ientes, porm mais inteligveis.
A resposta XML. Qual a pergunta? A XML no vai resolver o problema da fome mundial, impedir a guerra ou mesmo fazer caf para voc de manh. T udo que pretende gerar informaes sobre um bloco de texto. Muitas pessoas tentam tornar a XML a sol uo
para tudo ou aplic- Ia onde no pode, ou deve, ser usada. Se parece que ela ir causar mais
problemas do que se deseja resolver ou se no estiver nem mesmo resolvendo problema
algum, no a uti lize. Encontre uma soluo melhor.
Elementos
Vrios itens podem ser usados na criao de um documento XML; no entanto, voc encontrar
duas partes importantes em quase todo documento XML - elementos e atributos.
552
Dia 20
Atributos
Embora grande parte de qualquer arquivo XML seja de elementos, tambm podem existir atributos nele. Os atributos so usados para fornece r informaes adicionais sobre um elemento.
Se voc usou HTML no passado, provavelmente saber o que um atributo. Por exemplo, no
fragmento HTML
<a href="http:j jmsdn.mi crosoft .comjvbas i c">Home Page do Vi sua 1 Basi c<ja>
o termo href um atributo que define um local para o eleme nto a (ou ncora). Ele estabelece
para onde o elemento ncora deve direcionar seu navegador quando voc der um clique nele.
Para os que no conhecem HTML, a linha anterior de cdigo adiciona um hiperlink (um daqueles links s ub linhados) para uma pgina da Web.
De manei ra seme lhante, outros atributos fornecem informaes para elementos diferentes. Isso
leva a uma das maiores diferenas entre os atributos e elementos: os atri butos no so independentes e precisam ser aplicados aos elementos. Um atributo sem pre aparece dentro da tag de
abertura de um elemento. Alm disso, ele sempre apresenta a forma a seguir:
nome="valor"
Ou seja, um atributo composto de duas partes: um nome e um valor. O nome deve ser exclusivo
dentro de cada elemento, embora dois elementos possam ter o mesmo atributo. Alm disso, um
elemento pode ter muitos atributos.
Introduo XML
NOTA
553
<funcionrio>
<identificao>l<jidentificao>
<primeironome>John< jp rimeironome>
<sobrenome>Bul1</ sobrenome>
<jfunci onri o>
Do o utro lado esto aqueles que sugerem que se um trecho de informaes for
sobre outro elemento (como uma propriedade pa ra um elemento), ele deve
ser um atribut o. Isso torna os arquivos XML menores e em algumas situaes
mais compreensveis. Essas pessoas definiriam nosso funcionri o Johnny da
maneira a segui r:
<i dent i fi cao funci onri 0=" 1" primei ronome="John" sobrenome="Bu 11"
I>
claro que voc livre para usar qualquer uma das duas alternativas, ou at
um hbrido delas, como seu esti lo . No entanto. lembrese de alguns pontos
quandO decidir se algo deve ser um elemento ou at ributo:
Um atributo no pOde ter filhos. Isso sign ifica que definir algo como um
atributo uma via de mo nica. Voc no pode resolver posteriormente
adicionar novas informaes sem alterar a estrutura de um arquivo. Os
elementos, por outro lado, permitem que sejam adicionados em um momento posteri or novos atributos ou elementos-filh os q uando necessrio .
Um documento com muitos atributos em geral menor do que um com
vrios elementos. Quanto mais atributos voc tiver em seu cdigo XM L
comparado com a q uantidade de elementos, menor ele ser. Isso acontece principalmente porque os atributos no possuem uma tag de fecha mento.
Esquemas
Embora os esquemas na verdade no faam parte da XML, desempenham um papel importante
em sua utilizao. e isso se tornar mais relevante quando eles se tornarem um padro oficial. No
momento em que escrevo este texto, os esq uemas XML acabaram de ser definidos corno um padro recomendado. Os esquemas XML so, em primeiro lugar, um aplicativo em XML. Exatamente corno qualquer outro cdigo XML, eles so informaes sobre informaes (metadados j ficou cansado de ouvi r este termo?). Os esquemas XM L defi nem uma maneira apropriada de
estruturar um arquivo XML. Isso inclui os tipos de dados para cada elemento e atributo, o que
pode ser um elemento-fil ho de qualquer outro elemento, e at quais so os elementos vlidos
para um arquivo especfico.
Alg uns de vocs podem se perguntar por que os esquemas so necessrios. Eu no disse que
voc poderia criar um arq uivo XM L contendo q ualq uer combinao de elementos e atributos?
Bem, na verdade, sim. No entanto, h uma diferena entre criar um arq uivo XML para conter al-
554
Dia 20
guns dados e um cdigo XML que defina um tipo especfico de dado. Por exemplo, se trabalhssemos com um arq uivo que t ivesse dados de fu ncionrios, poderamos esperar ver certos itens nome, identificao do funcionrio, algumas informaes de cantata e assim por diante. Entretanto, no temos idia do loca l em que se encontram essas infonnaes no arqu ivo, nem que tags
podem ser chamadas. Sem um esquema, teramos de examinar o arquivo e escrever um cdigo
especfico para ler cada um deles. Com um esquema, conheceremos a estr utura dos dados anteci-
padamente. Nem todos os campos sero necessrios ou que eles estejam exatamente no mesmo
local em todos os arquivos, mas saberemos com certeza quais desses campos sero chamados e
teremos informaes suficientes para recuper-los por meio do DOM ou usando um objeto
XMLTextReader. Exam inaremos esses objelos em breve. A Figura 20 .2 mostra um esquema XM L
s imples.
NOTA
Se voc leu algo antes ou se decidir fazer uma leitura adicional sobre XML, se
deparar com o conceito chamado Document Type Definition (DTO) . Os DTDs
foram uma tentativa anterior de defin ir uma est rutura apropriada para arquivos XMl. Na verdade, os DTDs datam da poca da SGMl. Eles parecem executar a mesma ta refa que os esquemas XM l ; no entant o, h algumas d iferenas
importantes:
o
Os esquem as XML so escritos com o uso da XML; os DTDs no . Eles empregam um formato semelhante, mas que no a XML, pa ra a definio
da estrutura adequada de um arquivo XML. Isso importante porque significa que voc precisa de um conjunto de ferramentas para trabalhar com
os DTDs, e outro para ma ni pular a XML resultante . J que os esquemas
XML so XML, possivel trabalhar com eles usando as mesmas ferramentas.
Os DTDs no defi nem os t ipos de infor maes. Eles descrevem a estrutura
delas (isto , que elementos podem estar contidos em outro), mas no se
u m dado element o deve ser um inteiro, string ou out ro tipo de dado. Os
esquemas XML fornecem a capacidade de adicionar essa informao.
Como j foi descrito muitas vezes neste livro, um dos principais objetivos do Visual Basic .NET
tornar mais fcil o trabalho com tecno logias complexas. Portanto, no deve surpreender o fato
de ele possuir um ed itor que pennita a visualizao e edio de esquemas XML. A criao de esquemas tambm produz um efeito agradvel que tornar mais simples o trabalho com os documentos XM L. A Figura 20.2 mostra um esq uema XM L bsico. Ele se encontra em um editor
grfico que permite a gerao de vrios dos ti pos e estruturas que compem os esquemas XML.
Depois de criar um esquema, voc poder associ-lo a um arquivo XML, e o Visual Bas ic .NET
fornecer os recursos de lntelJisense para os elementos e atributos definidos nesse esquema (veja
a Figura 20.3).
Introduo XML
FIGURA
Criando
20.2
esquema
XML com o Visual
Basic .-"lEr
IIfIl
555
1"* _
t*I '"""" _
I ".q~ 'EJ
tIOI>
, '_
~
.~
., - ., -,
~
"
'
.....
,"
~
~
A .. _n
I
o
II
FIGURA
20.3
O Imellisellse e a X HL.
.... ... u
'''''0_>1 ,lO)
..
<.1""0_'
<... ,
,<
<"" . ..
~
~,-
D'"
0_
~.
556
Dia 20
Informaes sobre configurao - Muitas pessoas usam a XML para armazenar informaes sobre configurao. Na verdade, o prprio Visual Basic .NET emprega a XML em
dados sobre configurao. A se incluem informaes como as configuraes de segurana para aplicativos Web, locais de mdulos necessrios e assim por diante. Utilizar a
XML para formatar seus arquivos de configurao pennitir que voc descreva melhoras
valores. Pode-se usar o arquivo de configurao existente ou criar um. Gerar seu prprio
arquivo em geral ser mais seguro porque a configurao definida no ser afetada.
Transferncia de dados - A XML um formato excelente para a transferncia de informaes entre computadores. Qualquer computador que a receber poder ler as infonnaes contidas independentemente do sistema operacional ou da linguagem de
programao. Examinaremos um exemp lo sobre esse assunto no prximo captulo quando abordarmos o SOAP (Simple Object Access Protocol); no entanto, voc pode usar seu
prprio formato para enviar XML de uma maneira to fcil quanto essa.
Armazenamento de dados - A XML um grande substituto dos bancos de dados pequenos. Ela permite a criao de formatos de arquivo si mples que sejam autodescritivos e
possibilita a definio de relacionamentos, podendo ser editada por programas ou manualmente .
Nesta lio, examinaremos duas maneiras pelas quais o Visual Basic .NET torna fcil trabalhar
com arquivos XML. Nos concentraremos mais na leitura de XM L, mas tambm veremos como
possvel cri-la. As duas tcnicas que o Vi sual Basic .NET fornece para se trabalhar com a XML
so:
Introd uo XML
557
A idia existente por trs do DOM consiste em que qualquer arquivo XML pode ser descrito em
termos de uma rvore com ns . A Figura 20.4 mostra como isso poderia ser representado conceitualmente, dado o exemp lo XML a seguir:
FIGURA
e lemento
20.4
ESII"IIl/(ralgica de
cliII
11111
arquivo XML.
atributo
....
e lemento
ordem
identific~o
atributo
data
elemento
itens
elemento
item
elemento
id ent ilica lio item
texto
100
elemento
item
elemento
quantidade
texto
IDO
elemento
identificaoitem
texto
b"
e lemento
quantidade
texto
Dia 20
TABELa
Tipo de N
Descrio
Xml El ement
XmlAttribute
Xml00cument
XmlCollIDent
Um beneficio de ter vrios tipos de ns herdados de um nico n que todos comparti lham um
conj unto de propriedades e mtodos. Isso pennitir que voc aprenda mais facilmente como trabalharcom o DOM. A Tabela 20.2 resume as propriedades e mtodos usados com mais freqncia.
TABElA 20.2
Membro
Descrio
Propriedades
Attributes
ChildNodes
FirstChild
InnerText
Name
NextSibling
NodeType
AppendChi 1d
Introduo XML
559
Usar Xml Document para trabalhar com a XML semelhante ao que vemos na rvore de ns da
Figura 20.4. No topo da hierarquia se encontra um nico n-rai z, de nome cl iente. Ele e todos
os outros ns do DOM possuem um conjunto de ns-filhos. Por sua vez, todos esses ns tambm
tm ns-filhos e assim por diante. Os objetos possuem mtodos que o ajudaro a navegar nessa
hierarquia. A Tabela 20.3 descreve alguns desses mtodos e propriedades. Alm disso, Xml Docu ment d suporte s mesmas propriedades e mtodos da classe XmlNode.
TABELA 20.3 Mtodos
Membro
DocumentElement
O n-raiz do documento.
Mtodos
CreateNode
Usado para criar novos ns que sero adicionados ao documento. Este mtodo genrico permitir que voc gere qualq uer tipo
de xml Node.
CreateEl ement
CreateAttribute
Load
LoadXml
XML em
um documento_
tm XML.
Save
XML em
um arquivo.
Dia 20
560
Esse processo tambm consome muito tempo, principalmente se tudo o que voc precisar for de
um ou dois itens do documento.
o Visual Basic .NET possui outra estratgia para trabalhar com a XML -
objetos de leitura e de
gravao. Para ser mais especl1co, XmlTextReader e XmlTextWriter. O objeto XmlTextReader
concede acesso veloz s de avano a blocos XML, enquanto XmlTextWri ter fornece uma maneira
rpida e resumida de criar XML. Embora em algumas situaes eles no sejam to intu itivos
quanto usar o DOM, na verdade so mais aperfeioados que ele em duas reas principais :
No preciso carregar todo o arquivo antes que o documento comece a ser processado ele no precisa nem mesmo estar disponvel. Isso poder acontecer quando for executado
o download de um arquivo XML da Internet. Por no prec isar de todo o arquivo na memria, Xml TextReader e Xml TextWri ter podem reduzir enormemente os requ isitos gerais
de memria de seu aplicativo.
Os objctos Xml TextReader e Xml TextWri ter so rpidos. Muito rpidos. Isso devido ao
fato de nllo precisarem construir todas as estruturas de memria, como as li stas de ns,
que o DOM usa.
Descrio
Propriedades
Name
Nome do n atual.
NodeType
Read
O objeto Xml TextWri ter usado na construo do documento XML, acrescentando as tags ind ividuais de abertura e fechamento dos elementos . Ele pode ser urna maneira natural de criar um
Introduo XML
561
documento chamando mtodos para gerar cada parte. A Tabela 20 .5 descreve as propriedades e
mtodos de XmlTextWriter q ue so geralmente usados.
TABELA 20.5 Propriedades e Mtodos Comuns de XmITextWriter
Membro
Descrio
Propriedades
Fonnatting
Close
Encerra o objeto de edio. Como com os outros objetos de edio que examinou, voc deve sempre encerra-lo quando no for
rnais us-lo.
WriteElementString
WriteStartElement
lendo XMl
Embora voc pudesse usar os mtodos IndexOf e SubStr; ng da classe Str; ng para ler XML e conhecer seu contedo, essa no a mane ira mais eficiente de fazer isso. Como a lternativa, recomendvel usar o DOM ou os objetos XmlTextReader para ler XML. Essas duas famlias de
objetos podem interpretar com maior facilidade arquivos XML.
O DOM ser mais apropriado se voc tiverde ler um arqu ivo XML que esteja todo na memria e
trabalhar com ele. Como descrevi, o DOM nos permite percorrer o arqu ivo avanando ou retornando, relacionar uma seo com outra e alterar o arquivo no momento em que estivermos lendo. Por outro lado, Xml TextReader mai s apropriado q uando precisamos apenas ler o arq uivo
percorrendo-o uma n ica vez.
Para saber como os dois conjuntos de objetos fu nc ionam, seria bom v-los em ao em um
exemplo. Mui tos aplicat ivos precisam ser personalizados pelos usurios, como pode ser feito
por meio das configuraes de Toais na caixa de dilogo Opt ions. Essas informaes podem ser
facilmente armazenadas em um arquivo XML, permi tindo que voc ou seus us urios leiam ou
562
Dia 20
alterem as configuraes sem problemas. Inserir o cd igo dessa funcionalidade em um componente proporc ionar uma reuti li zao mais fcil dela. A classe Settings permite o armazenamento de definies de configurao em um arqu ivo e que essas sejam retomadas para leitura
posteriormente. O contedo do arquivo ser seme lhante ao da Figura 20.5. Criar uma c lasse dessas o ajudar a penn it ir que o usurio personalize o aplicativo confonne suas necessidades. A
Listagem 20 .1 mostra as propriedades e mtodos bsicos dessa classe. Depois adicionaremos a
ela a capacidade para leitura e edio das configuraes.
FIGURA
20.5
Arq1/i1'o de
configuraro.
<.,-,,,,,..
0,>0<:1<0"
,bo'9h t>n,ho,pt.
<1." >c<,'
..,,
<0",_ , h1 ",,</ ,< 10,.,
_p'
<1.,_,<\_>
LISTA GEM
1 Imports System.Xml
2
7
8
9
10
11
12
13
Introd uo XML
LI STAGEM
I'
15
16
17
18
19
20
21
22
23
2.
25
26
27
28
29
30
31
32
33
563
End Sub
Pub1ic Property Fi1eName() As String
Get
Return m sFi1eName
End Get
Set(ByVal Value As String)
m sFileName : VaI ue
LoadDOMO
End Set
End Property
Pub1ic Prope rty Items() As Hashtable
Get
Return m oItems
End Get
Set(ByVal Value As Hashtable)
m oItems : Va1ue
End Set
End Property
34
35 End C1 ass
ANALISE
A classe possui do is construtores (linhas 7 a 10 e 12 a 14). Isso foi feito paraadic io-
nar nex ibil idade. O programador pode criar uma instncia dessa classe usando oSetti ngs : New Settings( ), caso em que o arquivo em pregado o padro, composto do nome do
aplicativo, seguido pela extenso .cfg. Como alternativa, ele pode gerar o objeto Settings nomeando o arquivo que contm as infonnaes sobre a configurao, como em oSettings : New
Sett i ngs ("AI gumArqui vo .xml") . De qua lquer uma das duas maneiras, a propriedade Fi leName
configurada. Depois que isso feito (linhas 20 a 23), a varivel interna m_sF i 1eName confi gurada, e o mtodo loadOOM (que ser criado em breve) chamado. Esse mlOdo carrega no conjunto
HashTab 1e interno as configuraes que foram estabelecidas no arquivo desejado. HashT ab 1e um
dos conjuntos definidos em System .Collections . Ele armazena vrios itens por nome, como a
propriedade Tables do objeto DataSet . Isso penn itir que voc recupere itens da propriedade
I tems usando um cdigo parecido com oSett i ngs. I tems (" A1gumaConfi gurao").
Eclaro que antes de poder usar essa classe, voc deve ad ic ionar a funciona lidade que carregar
as configuraes. A Listagem 20.2 mostra como fazer isso com Xm1 TextReader, enq uanto a Listagem 20.3 descreve o mesmo, porm empregando o DOM.
Dia 20
LISTAGEM 20.2
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Try
oReader : New XmlTextReader(FileName)
While (oReader.Read)
Select Case oReader.NodeType
Case XmlNodeType.Element
If oReader.Name <> "appSettings" Then
m_oItems .Add(oReader.Name , Not hing)
slastElement = oReader.Name
End If
Case XmlNodeType. Text
m_o Items .ltem(sLastElement) : oReader.Va lue
Case Else
[nd Select
[nd While
Catch ex As Exception
Finally
oReader.CloseO
oReader : Nothing
[nd Try
End Sub
Primeiro o mtodo LoadReader inicializa HashTable (tinha 39) e declara o obj eto
Xml TextReader alm de uma varivel string que ser usada durante o processamento.
J que esse processamento executado em um arquivo que pode ou no exist ir, sua abertura e leitura so protegidas pela insero em um bloco Try ... End Try (linhas 43 a 61). Corno antes, a
clusula Fi nally desse bloco (que comea na linha 58) garante que o objeto de leitura seja fechado e eliminado, mesmo se um erro ocorrer.
ANALISE
Grande parte desse mtodo representada pelo lao Whi 1e ... [nd Whi 1e das linhas 45 a 56. Ele l
cada n do arquivo. Quando um n lido, primeiro o cdigo determina seu tipo (linha 46). Nesse
cdigo, s nos preocupamos com ns de elemento e de texto porque eles so os nicos tipos de
ns que exislem no arqui vo. Se o n aluai for um elemento e no for o n appSettings (o
n-raiz), o cdigo adicionar um novo item a HashTabl e (linha 49) e salvar o nome desse item
recm-adicionado na varivel string. O prximo mtodo Read deve retornar o n de texto asso-
Introduo XML
565
ciado ao elemento, e isso servir para adicionar o valor ao ltimo item inserido em HashTabl e.
No final da rotina, HashTab l e deve conter todas as configuraes armazenadas no arquivo.
LISTAGEM 20.3
63
64
65
66
67
68
69
oOoe.Load(FileName)
70
71
72
73
74
75
76
77
78
79
80
81
Cateh ex As Exeeption
Finally
oOoe = Nothi ng
End Try
End Sub
ANALISE
Table . Aqui, no entanto, ele cria um objeto Xml Oocument e um Xml El ement para armazenar os ns quando o arquivo for lido. Novamente, um bloco Try ... End Try usado como
proteo caso um erro ocorra na leitura do arquivo. Primeiro, o arquivo carregado (linha 69).
Lembre-se de que nesse estgio o arqu ivo inteiro carregado na memria, e o DOM constru do.
Na linha 71 , duas operaes de navegao so dcrin idas. Em primeiro lugar, DocumentE I ement (o
n appSetti n9s) selecionado; em seguida, o primeiro filho desse n, fi rstChil d, tambm o .
Quando esse cdigo for conc ludo, dever apresentar como resu ltado oNode apontando para o primeiro n contido dentro do n appSetti n9S. A seguir, o cdigo executa um lao pelos innos desse n, adicionando itens a HashTabl e. Quando no houver irmos, o mtodo NextSi bl i n9
retornar Nothi n9, e o lao terminar . Como antes, Xml Document configurado como Nothi n9 (linha 79) no final da execuo.
Agora voc pode adicionar essa classe a outros projetas, ou a uma biblioteca de classes de sua
autoria e convert-la em uma DLL. Quando terminar, ser passivei usar a classe COmO mostra a
Listagem 20.4 para configurar seu aplicativo.
Dia 20
LISTAGEM
1:
2:
3:
4:
5:
6:
7:
8:
9:
10
11
12
13
20.4
Para ler as configuraes e atribu i-Ias ao aplicativo atual , primeiro inicial ize o objeto
Settings (l inha 5). Lembre-se de que ele carrega as configuraes nesse momento.
Em segu ida, le ia cada configurao e atribua-as propriedade desejada do formul rio, a um controle dele ou use-as quando necessrio (linhas 6 a 12).
ANLISE
Gravando XML
Exatamente como quando lemos a XML. possvel cri-la apenas usando strings. ISlo , voc
pode gerar um cdigo XML adicionado as tags apropriadas de abertura e fechamento do elemento a uma varivel string. No entanto, ser muito mais provvel que voc crie um arquivo XML
corretamenle se empregar o DOM ou as classes XmlTextWriter.
A Listagem 20.5 mostra o cd igo necessri o para salvar as informaes de confi gurao no objeto
Sett ings usando Xml TextWri ter, enquanto a Listagem 20.6 descreve o meSmO cdigo paraobjetos
XmlDocument. Esses cdigos devem ser adicionados ao objeto Settings criado anteriormente.
LISTAGEM
82
83
84
85
86
87
88
20.5
89
90
91
92
Introduo XML
LISTAGEM 20.5
Criando Definies
de
567
(continuao)
oWriter .WriteEndElement{)
93
94
95
96
oWriter . Fl ush{)
oWriter . Close()
97
98
End Sub
ANLISE
que pode parecer estranha o objelO oltemdeclarado na linha 84. Os itens de HashTable so os declarados como OictionaryEntry; portanto, para pemti r o uso de um lao For
Each ... Next no processamento da tabela, precisamos de um desses objetos.
o cdigo da gravao comea abrindo o arquivo (linha 86) e atribuindo que a formatao deve
ser recuada. Lembre-se de que isso para beneficiar a pessoa que for ler, e no necessrio para
nenhum cd igo. A segu ir, o elemento inicial do n-raiz criado (li nha 88), e todos os itens so
gravados no arquivo XML durante o lao For Each .. Next (l inhas 90 a 92). O mtodo WriteElemen tString cria tanto a tag de abertura quanto a de fechamento com base no nome do item de
HashTable, assim como o texto contido nas tags baseado no valordesse item. Para concluir, a lag
de fechamento do n-raiz criada (linha 93), e o cd igo encerrado, gravando as informaes
no arquivo real.
LISTAGEM 20.6
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
oOoc.Save{m_sFileName)
End Sub
Dia 20
568
ANLISE
o cdigo para edio com o DOM comea criando o n-raiz e inserindo-o no documento. Todos os outros ns sero acrescentados ao n appSettings . Isso feito em
um lao For Each . . . Next corno aconteceu no mtodo SaveWri ter. Os ns so criados (linha [09);
o texto atribudo (I \O) e adicionado ao n appSettings.
Agora que o cdigo para salvar as configuraes foi adicionado, voc pode alterar o programa
que o usar para que as sal ve na prxima vez que o aplicativo for executado. Em geral isso feito
no evento Closing de um formulrio, como vemos na Listagem 20.7 .
LISTAGEM 20.7
14
15
ByVal e As System.ComponentModel.CancelEventArgs)
Handles MyBase.Clos ing
With Me
oSettings.Items("heig ht") " .He ight
oSettings . Items("widt h") " .Wi dth
oSettings .Items("left") :: . Le ft
oSettings.Items("top") :: . Top
oSettings.Items{"caption") " .Text
End With
oSettings . SaveWriter{)
End Sub
16
17
18
19
20
21
22
23
24
25
Antes que voc possa salvar as configuraes no arq uivo, elas devem ser copiadas
com os valores reais. Normalmente, isso seria feito quando a caixa de dilogo Options da opo Tools fosse fechada ou o aplicativo fosse encerrado. Quando todas as definies de
configuraes forem copiadas, poderemos usar o metodo SaveWriter ou SaveDOM para salvar as
configuraes no arquivo. Depois de adicionar esse cd igo, tente executar o projeto (veja a Figura
20 .6). Altere o tamanho do fo rmu lrio e mova-o para outra posio na tela. Feche o formulrio ,
encerrando O aplicat ivo, e execute-o mai s uma vez. O fomlu lrio deve aparecer na mesma pos io da te la, com o tamanho para o qual foi alterado. Fazer com que seu aplicativo saiba as pos ies do fonnul rio dessa maneira, em geral aprec iado pelos usurios.
ANLISE
FIGURA 20.6
Tesfondo a classe
Settings.
II - - I
Introduo XML
569
Resumo
A XML uma dessas tecnologias que podem ser examinadas em muitos nveis. simples, ainda
que tenha efeitos profundos. Voc pode cri-Ia com um programa ou em um simples editor de
texto. De maneira semel hante, possvel escrever um programa para process-Ia e ao mesmo
tempo ela ainda poder ser lida pelas pessoas. No entanto,, criando ou processando-a, a XML fornece uma maneira poderosa de formatar informaes. A parte todo o exagero, acho que ela
uma das mai s importantes inovaes em computao, ficando atrs apenas do ASC II . Dessa maneira, sua responsabilidade aprender pelo menos um pouco do que ela pode fazer para ajud-lo
e a seus aplicativos.
No prximo captulo, concluiremos nosso estudo do Visual Basic .NET examinando uma nova
maneira de desenvolver ap licativos - os servios Web. O aprendizado da XML ser lItil porque
os servios Web a utilizam bastante.
P&R
P Li sobre outra maneira de processar XML. O que SAX?
R O SAX (Simple APl for XML) ainda outra maneira de ler XML que se tornou popular
570
Dia 20
R Infelizmente, o Visual Basic .NET por enquanto no d suporte a esse recurso. No entanto, uma verso simp les de como adicion-lo a seu aplicativo est on-line. Esse ap licativo
permite que voc adicione tags <surrmary> a cada propriedade c classe dos metodos de
seu programa inserindo-as em um documento XML que poder ser utilizado como a base
da documentao de suas classes (veja as Figuras 20.7 e 20.8).
FIGURA 20.7
Documelllo17o XAlL
<h"" ."""",,', .0" _ _ .... '/-r I,
-.<SOC>
..........
'
<nOrnO'''PpSO'''''9><''''''''''
.._-.,
</..,
001. >
", ,, ,,~
"...,
,,_.. ....
</mO.,tz >
~.'
tl"'l. ~
_ 'M,,,,,,..-,
,:-
</I" .d,~
.....>
the _
</I",mb,
_Ii "_..
"_oP:". ",,>
<.........,.,""p..... ... ,.... """ . <:tl... a' ."'lng. ~
<lMmIl.,
</tl".w>-
:Lo"""der'">
.",I, .
(JI ,,,.Dv.>
_
'M ."",, ~
.. ....,.....:l.e""""'>
. r 'he lO"""" ",. "',. " ,,, ,' M.ble u''''II
FIGURA 20.8
D(X'lIf11elllao XAlL
Settings
I NewO ",,,thod
tio,..... , ,,,,,.tfUclor
I New() "'''U~
I FileNltme property
. . p'........
ne ...S proper ty
.. lho
,010<'''''' ur '''''''9'
I Lm>dOOM( ) methd
~
Introduo XML
571
Workshop
o Workshop foi planejado para ajud-lo a antecipar poss veis dvidas, revisaro quej aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Como posso adicionar rapidamente um novo elemento, inc luindo as tags de abertura e de
fechamento e algum texto, a um arquivo XML usando XmlTextWriter?
2. Em que situao voc optaria por usar o DOM para ler um arquivo XML em vez de empregar a classe XmlTextReader?
3. O que metadado?
Exerccios
o cdigo mostrado nesta li o, que testa a classe Sett; ngs, no momento define o uso do mtodo
LoadDOM para carregar as configuraes e do mtodo SaveWri ter para salv-Ias. Escreva outro
formulrio de teste que salve vrias configuraes e permita que o usurio selecione qual dos
dois mtodos empregar para salvar e recuperar.
SEMANA
DIA
Criando Servios Web com o
Visual Basic .NET
A menos que voc tenha vivido cm uma caverna (ou cm uma il ha do Pacfico Sul , aguardando
resgate) nos ltimos anos, provavel mente ouv iu falar da InterneI. aquela inveno maravilhosa - imagine uma rede mundia l- ah, ouv iu comentrios sobre ela. De qualquer modo, a Internei
uma ferramenta valiosa para os desenvolvedores se benefi ciarem dela. Fornece uma rede essencialmente gratuita que pode ser usada para a transferncia de informaes de seus programas
para outros, em qualquer 1ligar do planeta onde possam estar. Portanto, criar programas que uli lizem a Internei obviamente muito importante para os desenvolvedores do Visual Basic .NET.
Nesta lio, abordaremos:
Dia 21
574
NOTA
Interag imos com um serv io 'normal' na Web navegando em alguma pgina na Internet, preenchendo um fo rmulrio e enviando essas informaes a qualquer outra pgina da Web. fcil , e
essa si mplicidade no uso contribuiu definiti vamente para o cresc imento e a popularidade da
Internet. No entanto, no h uma manei ra fcil de pegar as informaes que voc obtm em um
servio na Web e us- Ia em um programa. Por exemplo, possve l util izar um servio na Web
que procure o valor aluaI de urna ao na qual podemos estar interessados. Em geral, digitamos o
sm bolo da ao, damos um clique em um boto e acessamos uma pgina da Web que apresenta
o preo aluai dela. No raro, tambm obtemos outras informaes, como os preos de abertura e
fechamen to, as a lteraes desde o ltimo fechame nto e s vezes um demonstrat ivo com as alteraes recentes da ao. Tudo isso mu ito prtico quando navegamos na Web, mas, se o desejado fosse apenas obter o preo atual da ao e us- lo em outro programa, seramos forados a
tomar uma entre duas medidas:
o
Fazer com que o usurio procure a informao, preencha o fo rmulrio, aguarde o resultado e, em seguida, digite-o em se u programa. O problema aqui bem bvio - a maioria dos
us urios no far isso com freq ncia. Imagine tentar executar essas operaes com algum valor, como o preo de aes, em que as alteraes so constantes. Ou tentar persuadir algum a inserir infonnaes em uma pgina da Web, dar um clique em um boto e
digitar um valor em seu programa com uma freqUncia maior do que uma ou duas vezes
por hora.
Fazer com que seu programa pesqui se a pgina da Web (em segundo plano), a analise
(leia) e extraia as informaes que voc quer. Isso em geral conhecido como varrer uma
pgina da Web. O probl ema encontrado aq ui ocorrer se os autores da pgina alterarem o
layout, forando-o a alterar seu programa para que analise o novo layout. Alm di sso, se
resolver alterar o site da Web que estiver usando para suas infonnaes provavelmente
tambm ter de reescrever o cd igo que ana li sa a pgina da Web.
Certo, e os Servios Web? Esses so programas que fornecem algum serv io na Internet, mas
so projetados para perm iti r que outros programas se comuniquem com eles, em vez de precisar
que pessoas faam isso. Portanto, agora, algum poderia criar um Serv io Web que permitisse a
outros programas recuperar preos de aes, executar pesquisas e assim por diante. Um recurso
adequado dos Servios Web que podem ser escritos em qualquer sistema operacional e linguagem de programao. Eles usam um formato de mensagem que pode ser lido e criado facilmente.
O Vi sual Basic .NET torna a criao desses Servios Web to fcil quanto gerar qualquer outro
tipo de ap licativo. Os detalhes da criao e leitura da mensagem tm sua visualizao bloqueada
pelo prprio Visual Basic .NET. De maneira semelhante, o Visual Basic .NET faz com que o uso
dos Serv ios Web seja to simples quanto chamar algum olltroobjeto, porm ele poderia estar na
575
o Protocolo
Embora os deta lhes reais do protocolo SOAP estejam ocultos no .NET Framework, voc pode
ficar curioso para descobrir o que acontece em segundo plano. Portanto, examinemos qual a aparncia de uma mensagem SOAr e como ela pode ser usada para enviar um objeto pela rede.
Dia 21
A mensagem SOA P nada mais do que uma mensagem XML que usa um formato especfico, ou
esquema. O esquema define a estrutura geral da mensagem (veja Dia 20, "Introduo XML",
para obter mais detalhes sobre os csqucmas). Esse fonnato penn ite a insero de uma grande
quantidade de inform aes na mensagem, incluindo objetos e dados adicionais sobre como cada
lado da comunicao deve interpretla. Por exemplo, a mensagem pode conter informaes so
bre segurana, por meio da ident ificao do usurio que fez a solicitao. A Li stagem 21.1 mos
tra uma soli citao SOAP simples.
COOIGO
1
2
3
4
5
6
7
8
9
10
11
12
Nessa mensagem h trs sees principais. A primeira (nas linhas 2 a 5) a tag Envelope. Esse o elemento-raiz da mensagem SOA r. Os espaos de nome incluidos definem a estrutura da mensagem, o tipo de codificao e a utili zao de esquemas XML.
ANALISE
A segunda seo ocorre na linha 6, com a declarao do corpo (Body) da mensagem, que contm
a solicitao real. Essa solicitao, que a terceira seo, definida nas linhas 7 a 10. Nesse
caso, uma solicitao Add, com dois valores, x e y.
577
A W$DL depende de outro padro, os esquemas XML, que, como voc aprendeu no Dia 20, definem a estrutura das mensagens XML. Ela lisa os esquemas para defini r as duas mensagens que
compem a comunicao tpica do Servio Web, a solicitao e a resposta. Os esquemas para a
sol icitao e a resposta so uma parte do arqu ivo WSDL. Outra parte desse arquivo descreve o
fato de duas estruturas estarem relacionadas. Para concluir, o arquivo WSDL identi fica o destino
ao qual o cl iente deve enviar a mensagem SOA P a fim de que ela possa ser processada. A Listagem 2 1.2 mostra um exemplo de contrato WSDL.
NeTA
LISTAGEM 21.2
Se voc teve a oportunidade de trabal har com verses Bet a anteriores do Visual Basic .NET, como a lanada na Professional Oevelopers' Conferen ce (POC),
pode ter ouvido falar de algo chamado SOL (Service Oescription l angu8ge). A
SOL um formato mais antigo que fo i substitu do pela WSOl.
Um Contrato WSOL
578
Dia 21
LISTAGEM 2 1.2
30 :
31 :
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
<js: sequence>
<js:complexType>
</s:e1ement>
<s:e1ement name,,";nt " type""s:int" I>
</s:schema>
<jtypes>
<message name""Add2IntsSoapIn">
<part name""parameters" e1ement""sO:Add2Ints" I>
</message>
<message name ""Add2IntsSoapOut">
<part name""parameters" e1ement""sO:Add2IntsResponse" I>
<jmessage>
<message name""Add2Int sHt tpGetIn">
<part name="X" type="s:string" I>
<part name""y" type="s:string" j>
</message>
<portType name""ServicelSoap">
<operation name="Add2Ints">
<input message="sO:Add2IntsSoapln" j>
<output message:"sO :Add2IntsSoapOut " I>
</operation>
<jportType>
<binding name :"ServicelSoap" type="sO :Service lSoap">
<soap:binding transport:''http://schemas.xmlsoap.org/soap/http''
sty1e="document" j>
<operation name,,"Add2Ints">
<soap: opera t i on soapAct i on=" ht tp: 1jtempuri . orgl Add2 I nts"
sty1e:"document" I>
<input>
<soap:body use: "litera1" I>
</input>
<output>
<soap: body use=" 1 itera 1" I>
</output>
<joperation>
<jbinding>
<servi ce name="Servicel">
<port name="ServicelSoap" binding="sO:ServiceISoap">
<soap:address
loca t i on= ''http://10ca1 hos tj Add2 I nts/Serv i Ce 1. asmx" I>
<jport>
<jservice>
</definitions>
579
Discovery
Depois de definir uma mensagem e uma maneira de descrev-Ia, o prximo recurso que as pessoas esperaro obter poderem encontrar o Servio Web. De certo modo, isso semelhante a ter
um nmero de telefone ou fax em um carto de visitas. Pela incluso dos nmeros no carto, estamos anunciando essencialmente o fato de que h um Servio Web com o qual se comunicar
usando essas fe rramentas. Para o SOAP e os Serv ios Web, esse carto de visitas o Discovery,
ou DISCO na abreviatura. O DISCO, alm de ser um estilo de msica dos anos 70, um fonnato
XML (poderia ser algo mais?) que descreve os servios que tm suporte de um servidor. Outros
computadores podem empregar esse arquivo DISCO para descobriras recursos de uma mquina
especfica. O arquivo DISCO em geral colocado no diretrio-raizde um site da Web, permitindo que os clientes o encontrem com facilidad e.
O Visual Basic .NET d suporte a dois tipos de arquivos DISCO. O primeiro editado manualmente, como o da Listagem 21.3. Esse arquivo lista cada servio que tem suporte. Voc pode criar
com facilidade um desses arquivos adicionando um novo arquivo Disco a um projeto e inserindo
manualmente os servios desejados como vemos na listagem.
COIGO
LISTAGEM
2
3
4
5
6
7
8
9
10
11
12
Cada arqu ivo DISCO composto de vrios contratos. Cada confrato (ou contractRej) identifica um arquivo WSDL que descreve um Servio Web. Para cada servio
Web listado, h trs atributos importantes:
ANALISE
O segundo tipo de arquivo DISCO que o Visual Basic .NET d suporte o de busca dinmica.
Esse o tipo de arquivo de busca criado quando se in icia um projeto de Servio Web. Para dife-
Dia 21
renci-Io do arq ui vo DISCO manual, ele apresenta a exlenso vsdisco. Esse arquivo pesquisa Iodos os diretrios do serv idor Web, e loca liza todos os Servios Web expostos. Em seguida,
retorna essa lista (em formato DISCO simples) para o cliente. Esse tipo de arquivo DISCO
conveniente porque torna desnecessria qualquer alterao para que se adicione um novo Servio Web. Ele ser encontrado de modo automtico pelo arquivo DI SCO dinmico. Voc pode
preferir no usar esse tipo de arquivo DISCO se quiser controlar mais rigidamente os servios
que dispon ibil izar. A Listagem 2 1.4 mostra o exem plo de um arquivo DI SCO dinmico.
CDIGO
v"
v"
v"
ANALISE
A manuteno dessa fonna de arquivo DISCO muito mais fcil do que a do arquivo
_...""
FIGURA 21.1
Criando 11m Projeto de
Serl'io Web.
581
,_.
"""'-
..
"
[ii"gj
~
,,,,,
ill
~~~
a _ _ ... ,
~
,
""
""""' lO..,.
~-
, .'
~~
I ,,,,,.
I..,,,,,,, ::;;j
... I
1- 1 -
.......... _
.. N:!I<I" . ......&0.< .
Para saber o que est envolvido em sua criao e utilizao, voc gerar um Servio Web bem
bsico - um servio 'matemtico' . Esse um exemplo simples de um Servio Web. Embora seja
um servio bsico, e le demonstra bem como seu funcioname nto. Qua lquer funciona lidade
mais complexa no ser muito diferente. A lgica existente na criao de um Servio Web
sempre a mesma.
Criando o Projeto
Quando est iver no ambiente de desenvolvimento, selec ione New Projecl e ASP.NET Web Servi ce. Chame o novo Servio Web de MathService.
Aps sua criao, o projeto apresentar vrios arquivos.
Web. Config Este o arquivo usado pelo processador A$P.NET para sua configurao.
Ele pode ser empregado na alterao das configuraes do diretrio virt ual utilizado para
esse Servio Web. Por exemplo, voc poderia ativar Traci 119, o que permit iria uma melhor monitorao da utilizao. O exemplo no alteraria estc arquivo.
Globa 1 .asax Este o arquivo usado pelo processador A$P.NET para o amlazenamento
de manipuladores de eventos. Voc pode em pregar este arquivo na criao de cdigos
que sero executados quando eventos importantes ocorrerem durante a existncia do aplicativo Web. O exemplo no alteraria este arquivo.
Servi ce I . asmx
Web.
Di a 21
582
CDIGO
LISTAGEM
1 Imports System.Web.Services
2
14
15
16 End Sub
17
18
19
20
21
22
23
24
25
26
27
33 IEnd Region
34
35
36
37
38
39
40
41
COOIGO
42
43
LISTAGEM 21.5 O
HelloWorld
End Fu nction
583
44
45 End Class
ANALISE
o mdulo do Serv io Web comea como a ma ioria dos arqu ivos do Visual Basic
.NET, com os espaos de nome includos. O espao de nome mais importante existente nesse caso System. Web. Servi ces. Ele contm as rotinas essenciais que adicionam a funcio na lidade do Servio Web.
Observe na linha 4 que a classe herda caractersticas de System. Web . Servi ces . WebServi ce. Isso
fornece vrias propriedades a seu Servio Web, como pode ser vislo na Tabela 2 1.1. A maioria
perm ite que ele acesse o interior do AS P.NET. Entre essas esto as propriedades Reques t . Response, Session e Appl i cation.
TABElA 21 .1 Propriedades do Servio Web
Propriedade
Descrio
Applicat ion
Fornece acesso s variveis armazenadas no obieto App 1i cati on dentro do ASP .N ET. uma propriedade que resume Context. App 1i ca t i on.
Context
Server
Session
User
O cdigo das linhas 6 a 33 da Listagem 21.5 fo i inserido em uma rea 'Regian. Esse cd igo na
verdade minimi zado no ambiente de desenvo lvim ento (veja a Figura 21 .2). Essa uma tcn ica
ti l, nova no Visual Basic .NET, que lhe permite tornar seu cdigo menos complexo ocultando
os detalhes que possam no ser relevantes. Nesse caso, ela oculta o cdigo usado pelo prprio
IDE. Esse o cd igo que permite arrastar e soltar itens na superficie visvel. Em geral, ele no
deve ser alterado manualmente, portanto faz sentido ocu lt- lo no editor.
584
Dia 21
FIGURA 21 .2
filo
O Sel'l'io Web no
esulgio inicial.
..
. D '~
~"-
.... - . .
!<do _
. ...
gil! !J ~ I!.
~\
too\>
.,:. .SJ ~I
."
"'"
,.
"'''o~''dU
~~".,
no
'" -
........ ..
, "".00".
''''Lo ... ,."
"
",....
o cd igo das linhas 41 a 43 um exemp lo de como voc adicionar ia um novo mtodo a esse Servio Web. Observe que ele fica desativado por padro. Se quiser expor esse mtodo, apenas rcmova os caracteres de comentrio.
Adicionando o Cdigo
Agora que voc possui um Servio Web bsico, precisa adicionar o cdigo que executar as tarefas dele. Isso fe ito em um Servio Web pela insero de mtodos Pllblicos em sua classe. Tambm poderamos adicionar propriedades pblicas, porm teria um sign ificado menos relevante
(como veremos posteriormente). Os mtodos pblicos de um Servio Web so os mesmos de
qualquer outra classe, com mais um item , o atributo <WebMethod{
585
se, mtodo ou propriedade. Na sintaxe do exemplo, o atributo adiciona o Servio Web para que
estabelea a comunicao com um mtodo especfico por meio do SOA P. Qualquer mtodo
marcado com esse atributo ser exposto publicamente como parte do Servio Web.
No exemplo a seguir, adicionei apenas um mtodo sim ples ao Servio Web, incluindo o cdigo
da Listagem 2 1.6 no projeto do Servio Web, depoi s do mtodo do exemp lo. Como alternativa,
voc pode excluir o comentrio e substitu-lo por esse mtodo.
LISTAGEM 21.6
Voc poderia adicionar mais mtodos, ou mtodos mais complexos, neste momento. No entanto, isso no necessrio. Escreveremos um Servio Web mais realista ainda nesta lio.
o Servio Web compi lado da mesma maneira que outros projetos. Selecione Build no menu
Build. Isso criar uma DLL (que ser inserida no diretrio bin sob o diretrio-raiz do Servio
Web) contendo o cdigo efetivo do Servio Web. Depois de compi lar o servio, voc poder
pesquisar o arquivo ASMX criado. D um clique com o boto direito do mouse sobre o arquivo
ASMX no Server Explorer e selecione View in Browser para v-lo cm ao. O arqu ivo ASMX
aquele que contm a funcionalidade do Servio Web, do mesmo modo que o arquivo .exe um
programa ou o ASPX um formulrio Web. As Figuras 2 1.3 e 2104 mostram visualizaes do
projeto de exemplo. O URL visualizado
http: //loca lhost/ MathService/servlcel .asmx
A primeira te la que veremos mostrar a descrio do Servio Web,junto aos nomes de todos os
mtodos aos quais foi adicionado o atributo WebMethod (veja a Figura 21.3).
586
Dia 21
FIGURA 21.3
~ di ~
Pgina de teste do
Servio Web.
Servicel
'01, "' ",k.ludn, .... '/{ m.ori .... / K "0.11 nom., .... .
_.............................,._,
R.<o'"_....ll : o
",-..
" ....,. ._ "''''''0', .........._ ..... ,.. _. r .. " ........... , .......... ". , _ _ , ',
''''' ..... """-' ................ ",. ........ . .... .....,...., _ , 0.0 ,......,. , ....... _ ................ "'"' .... ""'
...... to _ ~ "' ~ ... "'" ".-. , .... ,...." ......... oco,
....... ,.)
_t .. _ ............... _"'0..........
.1",
,Tho
.. ......................
" ...................................
.- ............................._
_ _, ............ _rt,.
..
'.,.,_nd........... i _
~
.. _
..... , ... .... _ ' ' - to __ " ' _...... .....,.. ......
" ,._
.... '..
, ~_.P_.
~...,_
rv'~.IJ
/I ""p I _ b acio
Se voc selecionar um dos mtodos, como o mtodo Add recm-criado, deve ver outra pgina de
teste que possui um formulrio que pennite que sejam inseridos valores de teste no Servio Web
(veja a Figura 21.4). Alm disso, e la exibe um exemplo das mensagens SOA P de solicitao e
resposta desse m todo.
FIGURA 21 .4
Inserindo m/ores na
pgina de leste.
Servicel
To"
To\..~ _
....
!
!
SOA.'
. " ;' ._ .' "'
. . . . .i .
i>(II'jT
;~
""'010 w.,.
,I<&,_
....<o".rv.oo .__ """, .
"".li...,
ilo. . . .
..
..
00
587
Essa pgina de teste ser gerada automaticamente quando voc visualizar um arqui vo ASMX.
Ela fornecer informaes sobre os mtodos que o Servio Web disponibiliza. Alm disso, cria
um fonnu lrio de teste para cada mtodo, pennitindo que alguns valores sejam inseridos e a funo executada. Digite alguns valores nos campos de texto da seo do mtodo Add e d um clique
no boto Invoke. Outra janela do navegador deve ser aberta mostrando o total, como na Figura
2 1.5.
FIGURA 21.5
Adiciol/(lI1do ralores
com o Sen,io lfIeb.
__
\:J 'roi'
""'_l"_~
g ill
l'
.. _ I I
....... " _
"1._ """",_""""
<ln,
,. h"p'II'.mp,,~.~1'> 46 <1ort'>
Novo TERMO
588
Dia 21
Cliente Servidor
FIGURA 21.6
F/llxo de informaes
entre o cliellle. o pro:ry
c o Se/Tio Jl'eb.
fIIIII:;;]fJ
,
,. O cliente
chama
o mtodo
5. O proxy converta
II resposta SOAP
pera o cliente
no proxy
2. O proxy gere
8 solicito SOAP
3. O Servio Web
executa a solicitao
Servio Web
"''''Y
4. O SEtrvio Wab cria
a resposta SOAP
Criando o Projeto
Embora voc pudesse gerar um cliente usando um forrnulrio Windows ou Web (at mesmo outra biblioteca ou Servio Web), nesta seo, examinaremos a criao de um Servio Web cliente
por meio de um formu lrio Windows. Esse ser o exemplo de um dos usos possveis para os Servios Web, em que ele representar um meio de estender os clientesj ex istentes (ou futuros) de
589
Adicionando o Cdigo
Quando chamamos outro objeto no Visual Basic .NET, em geral temos de carregar uma refern~
cia a ele . Isso perm ite que o IDE conhea as vrias propriedades e mtodos do objeto. No entanto, voc no pode fazer isso com um Servio Web, porque ele no possui todas as informaes
expostas de um objeto local. Em vez disso, preciso carregar uma referncia da Web, que um
ponteiro para um arqu ivo WSDL. Lembre-se de que esse arquivo descreve todos os mtodos de
um Servio Web e seus parmetros.
Adicionar uma referncia da Web fcil: d um clique com o boto direito do mouse no projeto
MathClient e selecione Add Web Reference. Voc deve ver a caixa de dilogo da Figura 21.7.
FIGURA 21 .7
Adicionando lili/a
referncia da Web.
,. ... o rn
....... _......... _-_ ....,... _-.
,
.
.
.
_
.
,
.
.
.
_n
.
.
.
.
_._"'
.
.
.
.
.
.
.
_
.........
....
_
...
__
..
....
I
&""'" II
lO
"."
"~I
...... _ _ ., _ ...
..,
(-
.........
--I
!
!
A caixa de dilogo solicita o URL para um arquivo DI SCO ou para O local da WSDL do Serv io
Web. Normalm ente, eles seriam fornecidos pelo autor do servio. No caso de MathService, o
URL deve ser: http : // l oca 1hos t / MathServ i ce/Ma thServi ce. vsd i sco. Digite esse URL e d um
cliq ue na seta de busca. Se funcionar da maneira ideal, depoi s de uma pausa, ele deve encontrar o
Servio Web. como mostra a Figura 21.8.
Depois de encontrada a referncia da Web, d um clique no boto Add Web Reference. Isso adicionar uma nova seo ao projeto (Web References), que deve ter trs arquivos na seo Localhos!: Service l. wsdl , MathService . vsdisco e Reference.Map. O compilador usar esses
arqu ivos no tempo de compilao para ad icionar um proxy ao programa cl iente, que saiba como
se comunicar com o Serv io Web.
Di a 21
590
Agora que seu programa cliente sabe como se comunicar com o Servio Web, voc pode adicionar o cd igo para chamar o servio. Para tanto, ad icione duas caixas de texto, um ttulo e um boto ao formulrio. Con fi gure as propriedades como na Tabela 2 1.2.
FIGURA 2 1.8
Loca/bal/do a
referncia da Web.
1,3
I"
<1>001 v.....",.,.O"
_0d!<'9
' _ _,_
.,..,f-iI' 1'>
- <do<cov"'Y
.... ", p 'II ..:"",,"., ,"""'OOP ."'lI1 ~'.""I"~
<ln" oel OIof
..1.'1>1.' p:/ /101:011 .... ' .....' U'8oNIce/S ..... 1ce L. ,
.. ,di'
_ ... r."hll p :/lloctlIIoO<l/""" hSo",'"" IS."'1oo
---.
--
'-
" ._ _
I
,
-TABELA 2 1.2
Controle
Propriedade
Valor
F,,,,
Text
$ize
248, 160
BorderStyle
FixedSingle
Name
TxtX
Text
123
Locati on
16, 24
Size
100 , 20
Name
Txty
Text
456
Location
16, 56
Size
100, 20
Name
CmdAdd
Text
&Add
TextBo x
TextBo x
Button
TABELA
Controle
Label
591
(continuao)
Propriedade
Valor
Location
128, 56
Size
75. 23
Name
LblResult
Text
Locat i on
16,88
Size
100 , 23
Por fim , voc est pronto para adicionara cd igo da Listagem 21 .7, que chamar o Serv io Web.
D um cli que com o boto direito do mouse no boto Add para adicionar este cd igo.
ENTRADA
LISTAGEM
Algo que deve ficar imediatamente bvio que o cdigo muito semelhante ao usado para o acesso a objelos comuns. A n ica diferena entre o cd igo das linhas 5 e 6 e
o mesmo cdigo que acessa um objeto loca l que o nome completo do objeto tem corno base o
servidor que fornece o Servio Web, nesse caso, local host . Servi ceI. Um item importante a observar que o nome do Servio Web ser alterado com base no host do servio.
ANALISE
o programa resultante deve poder encontrar e chamar o Serv io Web, estando ele na mesma mqui na, como mostrei aqui , ou procurar pe la Internet. A Figura 21.9 mostra o resultado.
FIGURA
21.9
..., 1
Embora esse servio que foi adicionado parea sim ples (e ), como declarei anteriormente, ele
apresenta toda a lgica de criao e uso de um Servio Web :
592
Dia 21
Cria um projeto para o Servio Web (ou adiciona o Servio Web em um projeto Web
existente)
Adic iona uma referncia Web a um aplicativo cliente, que aponte para o WSDL do Servio Web
Cria uma nova varivel que aponte para o Servio Web e executa um ou mais de seus m
todos.
Pedido de um produto
Uma diferena entre este Serv io Web e o do exemplo anterior que o atual mostra que voc
pode recuperar objetos. Qualquer objeto interno ou criado pelo usurio pode ser enviado ou re
tornado de um Servio Web. O objeto convert ido para XML de modo que passe pela rede e volte a ser um objeto para uso do cliente.
Criando o Servio
Como no servio si mples, voc comear criando o Servio Web. No Visual Basi c .NET crie um
projeto de Servios Web. Esse poder ser chamado de Nonhwind . A Figura 21 . 1Omostra a caixa
de dilogo New Project.
FIGURA 21 .10
........ '
.. _
~.
13'
593
Feche o gerador e altere o nome do arquivo Servi cel . asmx para Products. asmx. Abra o arquivo
Products. asmx no modo de exibio do cdigo e altere a linha
Pub l ic Class Servi ce I
para
LISTAGEM 21.8 O
4
5
6
7
8
9
10
11
ebMethod
Public Function GetCategories As String
Oim oCon As Ne SqlConnection DSN
Oim sSQl As String
sSQl "SElECT CategoryName FR MCategories"
Oim oCmd As Ne SqlDataAdapter sSQl oCon
Dim oDS As Ne DataSet
Dim sReturn As String
Dim I As Integer
12
13
14
15
16
17
18
19
20
21 ebMethod
22 Public Function GetProducts
23
yVal categoryName As String As DataSet
24
Dim oCon As Ne SqlConnection DSN
25
Dim sSQl As String
26
sSQl "SElECT ProductID ProductName nitPri ce "
594
Di a 21
CDIGO
(continuao)
"QuantftyPer nH Di scontinued CategoryName "
"FR MCategories INNER lN Produ ct s "
27
28
29
30
II
II
31
32
33
34
II
N Categories . CategoryID
Products.CategoryID"
. .
35
36
Return ods
"products"
37 End Function
38
39
ebMethod
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
11
Tcy
oCon. pen
oCrnd . Exec uteNonQuery
Return True
Catch
Return False
End Try
End Fun c tion
ANALISE
o pri me iro dos trs mtodos, GetCategories, retoma um array de strings contendo
os nomes de cada categoria de produtos. Ele poderia ter retornado um OataSet com a
mesma faci lidade (na verdade, teria sido ma is fc il), no entanto, fizemos assim para mostrar que
arrays tambm podem ser retomados.
A stri ng de conexo que ser usada para o acesso ao banco de dados foi criada como uma constante nas 1inhas 1 e 2. Isso ter de ser alterado se seu banco de dados estiver armazenado em outro
loca l ou se forem necessrias credenciais espec fi cas para a conexo com ele. Os objetos apropriados para o acesso aos dados foram criados nas linhas 5 a 11. Aqui empregamos os mtodos
de acesso ao banco de dados SQL. Portanto, ser necessrio incluir o espao de nome
595
System. Data . Sql C1 ient nesse arquivo. Alm disso, se voc for acessar um banco de dados que
no seja SQL, deve utilizar os objetos de conexo do ADO, que esto armazenados no espao de
nome System, Data. 01 eDb. Observe que recuperamo os apenas uma co luna da tabela Categori es
(linha 7).
A linha 13 recupera os dados e preenche o DataSet. As linhas 14 a 17 extraem as informaes do
DataSet para us-Ias no preenchimento do array. Por fim , o array retornado para a funo da
chamada na linha 18.
o segundo mtodo, GetProducts, mais simples do que o primeiro. Nele, retornado um Data Set preenchido com todos os produtos ainda vlidos da categoria solicitada. A parte mais complexa do mtodo o cd igo das linhas 26 a 3 1, em que a inst ruo SQL criada para recuperar a
lista. O ideal seria que isso fosse mantido como uma visualizao ou um procedimento armazenado no banco de dados. A string final teria a aparncia descrita a seguir:
SELECT ProductID, ProductName, UnitPrice, ..
QuantityPerUnit, Discontinued, CategoryName ..
FROM Categories INNER JOIN Products ..
ON Categories.CategorylD = Products . CategorylD ..
WHERE (Discontinued = Q)AND (CategoryName LIKE 'Bev%'
A instruo SQL resultante retornaria todos os campos so licitados em que o produto ainda fosse
vlido e o nome da categoria comeasse com Bev.
O ltimo mtodo, InsertCategory, demonstra que voc tambm pode solici tar que o Servio
Web faa algo diferente de uma recuperao. Nesse caso, ser inserida uma nova categoria no
banco de dados.
Comeamos de mane ira semelhante aos do is mtodos anteriores, pela criao de uma conexo
com o banco de dados e escrevendo a instruo SQL. Nesse caso, a instruo final criada nas linhas 45 a 48 se parecer com a demonstrada a seguir:
INSERT INTO Categories(CategoryName . Descr;pt;on) "
VALUES('Algum produto', ' Outro produto que estamos vendendo')
Uma diferena nesse mtodo que em vez de criar um adaptador Sql DataAdapter, voc gera um
comando Sql Corrrnand. Os comandos Sql Corrrnad, como aprendemos no Dia 12, so mais adequados para inseri r, exc luir e alterar dados, do que para recuper-los. Outro ponto que vale a pena
ressaltar o bloco Try .. . Catch das li nhas 50 a 56. Nesse caso, tentamos executar a instruo
SQL. Se ela for bem-suced ida, o mtodo retornar True. Se uma exceo ocorrer, por alguma razo, ele retornar Fa I se. Nonnalmente, no ocorreria uma exceo nesse mtodo, a menos que o
banco de dados no estivesse em execuo ou se no houvesse espao em disco.
596
Dia 21
Pgina de teste do
Serl'i~'o
Web
Nonhwil/d.
eootJO;,,"~
...
.....
_..
._
,.,;,;;"
1.. t
-TIM'-'
,
~If~
'4.l. .
. ,"ru.......
.............
.. k .
.., .. ~ __
' " ,
-...-_....... _. .................,_.._.... _
"_ .............. ....... ....
a" ............. ' , .......... ........ . _ ".1<'
. ..........
,~
.... .............. ' "'H" ""' _ _ """ _, ,,,.. _ o . . _ _ _ ,' ..... H'_
..."
"'
',-""'-"' ..-...,
. .. . . ..MT ............,. " " ........ , ...., . - ...................... ................ ' , ,', H ......... _ " "
:21 El """
FiGURA 21.12
testando
GetCategories.
too
{;OI
:i! . \:>
~ ~
..,g i'
_
...
CIo:!>OO.._,I:.~~ ,:-..
_
~~::::
'J'
*
'
:
-'
, ........, -,_ . ... , , 1/,.
~,....::......""""_,
a......,c :
K... c_ _
:OO c:i' ~ !
.--:DI
O..,Pr_~(jo~....... M.a!Il'....,_.S..cood_S""'"
J
!
O
597
Criando o Cliente
Como no caso anterior, agora voc est pronto para criar seu Servio Web. Dessa vez, no entanto,
criar um cliente com base nos fonnulr ios Web. Ele poderia ser um site usando um Servio Web
para que esse lhe fornecesse contedo, porm empregando seu prprio layout. Como alternativa,
poderamos representar esse cl iente que usa formulrios Web como um aplicativo de intranel.
FIGURA 21 .13
Testando GetProducts.
- "'" -----
"'"
.ii. ~
\:l ' oi' 101 " .r. ~ ."
.. O !ii o::l~".a ID ijJ
_.-..
""""",-~
""'.~.
...,.-
",~, 01''' ... o, .....,..NQwo.., ~9. ' ...",,,.' ItOa,.5o" " ",. '.
</><d,"'.........
"''''.!
,'lOwOlo,...,., ,. ,..,
. <p<O<1ue"
... p"'du<:l<1 _t.rowo< .... II:>
<00 ' ''"O>l<jPr-.:tlO:>
....... ,
<0<> ..'0'-....,' ,O<lQu."."-....,~
<Do""' .....
<JI)oSCon, ......".
cIoff~,
d> f~I
FIGURA 21 .14
feslando
I nsertCategory.
[<II:
"'"
010 _
.r.~ 11Io
lOIO _
tIOIO
"" lO
Dia 21
In icie a criao do cliente adicionando um novo projeto de apli cativo Web. Esse voc chamar
de NWCl i ent (que provm de cliente Northwind). D um clique com o boto direito do mouse no
nome do projeto e selecione SeI as Startup Project. Feche o gerador e renomeie o arquivo WebFonnl.aspx como Products .aspx . Para concluir, abra mais uma vezo geradore gere uma interface bem simples. Faremos assim principalmente porque tenho poucas habilidades grficas, mas
tambm para limitar a quantidade de cdigo adicional que pode complicar o exemplo.
As propriedades dos controles da pgina esto descritas na Tabela 21.3.
TABElA 21.3 Propriedades do Formu lrio Web NWCl ient
Controle
Propriedade
Valor
Document
title
Northwi nd Products
PaneI
( 10)
pnl NewCategory
Height
181px
Width
368px
( 10)
lblNewCategory
Text
New Category
( 10)
IblName
Text
Name:
( 10)
txtName
Height
24px
Width
213px
( 10)
IblDes cription
Text
Description:
( 10)
txtDescrption
Height
41px
Width
222px
TextMode
Multi Li ne
( 10)
cmdAdd
Tex t
Add
( 10)
lblResult
He i 9ht
19px
Width
329px
BackColor
Silver
( 10)
lblCategories
labe I
Label
TextBox
Label
TextBox
Button
label
Label
T ABELA
Controle
OropDownL is t
OataGri d
599
(continuao)
Propriedade
Valor
Text
Categories
( 10)
cboCategory
Height
22px
Width
202px
AutoPostBack
True
( 10)
dbgProduc t s
Height
265px
Width
438px
ANLISE
Uma propriedade de DropDownL; st que vale a pena ressaltar AutoPos tBack. Como voc aprendeu no Dia 10, "Construindo a Interface com o Usurio com os Formulrios da Web", AutoPostBack faz com que o formu lrio seja retomado ao servidor imediatamente, em vez de aguardar
que um boto Submi t seja pressionado. Em nosso exemplo, o formulr io ser enviado sempre
que o usurio alterar o contedo de OropOownL i s t.
Depois de DropOownL i st, defin imos o controle DataGrid. Voc tambm pode usar o recurso Au10Format do gerador do Da taGri d para tornar sua aparncia mais adeq uada do que a usada no
padro.
A Figura 2 1.15 mostra qual deve ser a aparncia da interface com o usurio no Vi sual Basic
.NET.
Dia 21
600
FIGURA 21.' 5
Cliente Norlhwind
(lo
""'
"..
....
__
' ...
v- ,,_ I'<
.!
_ . ""'!~ ........... -
I """"'" _
"'I
Coi _
C.1U/11111
Colwnn2
.~
~-
i~
"
..
-l '
,f~
,~
li.w C"'p)'
~_.rr-------
Adicionando o Cdigo
Estamos quase l. Tudo que prec isamos fazer conectar algumas rotinas. Queremos que a ca ixa
de combinao Calegories seja preenchida quando o usurio examinar a pgina pela primei ra
vez, e que a grade apresente os resultados da categoria. Alm disso, queremos que a grade seja
atuali:wda sempre que o usurio selecionar uma nova categoria. Para conclui r, nossa inteno
adic ionar uma nova categoria quando o usurio der um cl ique no boto Add.
Antes que voc possa adicionar o cdigo, deve acrescentar uma referncia da Web ao Servio
Web. D um clique com o boto direito do mouse no projeto NWClient e selecione Add Web
Reference. O arqu ivo DISCO criado para o Servio Web http://l ocalhost/
northwi nd jnorthwi nd . vsdi sco. A Figura 2 1.16 mostra o resultado da consulta a esse arqu ivo.
Em vez de comear preenchendo a caixa de combinao, inicie com a grade. Voc j decidi u que quer atual izar a grade se m pre que o contedo da cai xa de com b inao for aI terado.
O evento apropriado ao qual o cdigo deve ser adicionado Se 1ectedI ndexChanged. D um
c lique duplo na caixa de combinao e alualize o man ipulador de evento como vemos na Listagem 2 1.9.
601
FIGURA 21.16
Locali=alldo o sel1'io
Norl/ll t'illd.
c?xml .....
- <""co ..",
""", . 'h" P :11 se hUnla . ><n ,1.Od p. onJ/ dl.co/">
<c""I<~<lReI
,.w
""
-'*"-"'"
"""'_, _
v""
</<100'."'>
. -----'=
CDIGO
LISTAGEM
=-----'
ANLISE
Quando a grade estiver sendo atuali zada automaticamente, ser a hora de nos preocuparmos com
a caixa de combinao. Ela deve ser preenchida com a li sta de categorias quando o usurio carregar a pgina pela primeira vez. O evento apropriado para fazer com que isso acontea WebForrnl_ Load. A Li stagem 2 1.10 mostra esse mtodo.
602
Dia 21
CDIGO
11
12
13
14
15
16
17
18
19
20
21
22
cboCategory.Data 1nd
cboCategory SelectedIndexChanged Me Nothing
End If
End Sub
ANALISE
Como voc aprendeu no Dia 10, a propriedade IsPostBack usada para determinar
se essa a primeira vez que lima pgina da Web visualizada ou se ela est retoman-
do. Em geral, s queremos executar tarefas como preencher controles uma vez., portanto ad icionamos o cd igo seo If Not IsPostBack. No evento que carrega a pgina, inicialmente criamos
uma nova instncia do Servio Web (linha 15). A seguir, chamamos o mtodo GetCategories (linha 17), que retorna um array de strings.
Uma prtica interessante usada nas linhas 18 e 19 no evento que carrega a pgina. Os controles
no s podem ser conectados a DataSets como tambm a Arrays (e a conjuntos). Portanto, voc
pode conectar um array de categorias diretamente a uma caixa de combinao.
O cdigo da linha 20 merece alguma exp licao. Quando a caixa de combinao preenchida, o
ndice se lecionado no considerado como alterado. Portanto, chamamos expl icitamente o manipulador de evento para a caixa de combinao a fim de assegurar que a grade seja preenchida
quando o usurio visitar a pgina pela primeira vez.
A Figura 2 1. 17 mostra o resultado que obteremos ao carregar a pgina da Web, enquanto a Figura 21. 18 ilustra o que ser exibido se mudarmos a categoria.
603
FIGURA 21.17
VislIoli=ondo o cliel1le
Norlhll'ind.
!jIo
t.. _
_,
(!otvj
,
1~ LJ ~ gO lllilo."
I'"
,
_. ........_' ......... _.
.........
,, -, "-:=:'__"
;!
I ..
... _ t - . -
II,.
'.
IS' ~
..
"
N_,rl- - - - - -
"
"I
!
!
.
o
"
FIGURA 21.18
Allerando a calegoria
selecionada.
(!lo
""
"""
SMq",k~
AI<
Stt.1cy< St<>IIt
"
"
"
"
to< _
,.,
,.,
,.,
,.,
,.,
s.........'
s....."".
~~,
B.......
B ......,
~
(!otvj
b ~ lIil
, ll "' e.
.. OmGl 'l): (DfQ\
!OO"
........._ .. ,"'-_'-.....N_rl-----
"
"
Lo POSIOfa
Got,'''''.
"
.
" ""'"
'9 8
,.~
~., ,
"
'"
.
,.
,
,.,
,~
0..,_..
O"'l' Pso.ix ..
D.., I'rodot..
o...,Pso.ix"
Para conclu ir, voc adicionar o cd igo que far o boto Add acrescentar lima nova categoria ao
banco de dados. D um clique duplo no boto Add para abrir ajanela do cdigo. Adicione o cd igo da Listagem 21. 11 ao procedimento.
604
Dia 21
CDIGO
23
24
25
26
yVal e As System.EventArgs
Handles cmdAdd.Click
27
28
29
30
Else
31
lblResult.Text
End 11
32
33
End Sub
ANALISE
Felizmente, no h nada muito complexo aqui. Voc criou uma nova instncia do
FIGURA 21.19
DaI/do UIII clique
bONlo Add
110
0.."",_.
!t . . . . . b . p ,. ti..
" ck <0< <o ...
,"to.
,
"
S"'lq< SI ...
"
"
"
"
U"
,.,.
,.,~
,~
B""
ti .........
ti .....""
ti,. . . .'
ti .."".,
Resumo
Os Servios Web so uma nova maneira de acessar programas e componentes por meio de uma
rede ou da InterneI. Eles so tei s tanto na Web quanto em ap licativos tradicionais de microcom-
605
P&R
P Posso proteger um Servio Web para controlar quem tem permisso para acess-lo?
R Sim, os Servios Web do suporte integral ao uso do I-ITIPS (e do SSL) para o controle
de acesso.
P Os Sen'ios Web s so adequados para solucs que usem os produtos da Microsoft?
R No, os Servios Wcb podem ser usados para a comunicao com qualquer sistema operacional . Contanto que o cl iente seja capaz de interpretar a solicitao SOA P (e criar uma
resposta SOAP), ele poder ser uli lizado na inleroperao com um cliente ou servidor escrito com o Vi sual Basic .NET.
P O que aconteceria se eu tentasse accssar um Servio Web, e ele estivesse inativo?
R lnfel izmente, h pouco que se possa fazer nessas situaes . Em geral, preciso adicionar
um cd igo ao cliente para que ele reaja de modo apropriado a esse problema. O cliente
pode fa lhar ou armazenar em cache e reutilizar a ltima reposta quando adequado.
Workshop
O Workshop foi planejado para aj ud-Io a antecipar pass iveis dvidas, revisar o que j aprendeu
e comear a pensar em como colocar seu conhecimento em prtica. As respostas do teste esto
no Apndice A, "Respostas dos Testes/Exerccios".
Teste
I. Qual a final idade do arquivo DISCO?
Exerccios
Tente ad icionar outros mtodos aos dois Servios Web que criamos. Por exemp lo, acrescente os
mtodos Subtract, Mul t i pl y e Di vi de a MathServi ce. Atual ize seu cliente para que trabal he com
os novos mtodos.
SEMANA
Resumo
A Semana 3 abordou um conjunto pesado de tpicos, mencionando vrios recursos com os quais
ser preciso gastar ainda mais tempo no futuro. Para comear, voc aprendeu como criar se us
prprios objetos na plataforma .NET, construindo blocos de cd igo que podem se tornar autnomos e ser reutilizados por outros projetas quando necessrio. O Dia 16 o conduziu por algumas
das mai s avanadas tcnicas e tecnologias para a criao de aplicativos com base no Windows
por meio da plataforma .NET, como os menus e os controles de diviso.
O Dia 17 forneceu uma abordagem de duas reas do .NET Frarnework freqentemente necessrias: a biblioteca de figuras, em que mostramos como man ipu lar imagens e a aparncia de se us
aplicativos, e os recursos de manipu lao de arquivos da plataforma .NET, com detalhes de
como criar, abrir e alterar esses arquivos. No Dia 18, voc aprendeu a tornar a manuteno e o
s uporte de seu apl icativo to fceis quanto possvel, incl uindo a documentao de seu cdigo e o
uso do controle do cdigo-fonte para proteger seu precioso trabalho. O Dia 19 deu prosseguimento ao tpico distribuio, incluindo vrias consideraes sobre a redistribuio dos arquivos
.NET necessrios para que seu programa funcione corretam ente. Criar programas de instalao,
aprender as opes de instalao remota e fornecer a documentao do usurio, todos esses itens
fizeram parte do Dia 19.
Os Dias 20 e 2 1 abordaram duas tecnologias que so a base do conceito .NET: a XML e os Servios Web. Voc aprendeu como a plataforma .NET forncce classes para leitura, criao, al terao
e compilao de documentos XM L, e que a XML pode ser usada em seus aplicativos. O Dia 21
mostrou os Serv ios Web, um dos principais recursos da plataforma .N ET, e aprendemos corno
eles permi tem a exposio da funcio nalidade de seu s istema na Web por me io dos padres I-ITIP
e XML. O desenvolvimento de Servios Web e o uso deles em seu prprio aplicativo tambm foram discutidos, embora a abordagem completa desse tpico esteja alm do escopo deste livro.
Para concluir, o projeto de bnus da Semana 3, que est disponve l na Web (veja a Introduo),
mostrou-l he como os conceitos abordados nos captulos anteriores, como a ut ilizao de arquivos, as figuras, a XML e at algumas tarefas avanadas com os fonnulrios Windows, podem ser
usados na criao de um programa completo. Nesse caso, criamos um jogo, mas essa foi apenas
uma maneira mais agradvel de aprender as tcnicas que podem ser aplicadas a quase todo tipo
de sistema que for preciso gerar.
Resumo
Com a concluso deste livro, voc tambm chegou ao fim dos 2 1 dias de Visual Basic .NET e j
obteve uma compreenso geral da linguagem , da estrutura subjacente e de como pode usar as
duas para comear a criar seus prprios sistemas. No desenvolvimento, o aprendizado um processo contnuo que nunca tenn ina realmente, mas passamos por uma introduo bem profunda a
uma linguagem fantstica. recomendvel sair do nvel introdutrio de estudo por algum tempo
e se concentrar em desenvolver vrios aplicativos (de exemplo ou reais, dependendo de seu traba lho atual) para fixar todas as informaes que abordamos nestas trs semanas. Certifi que-se de
estar codi fi cando na plataforma .NET o mximo que puder; no h maneira melhor de ganhar
confiana e uma compreenso adicional em uma linguagem e uma tecnologia novas.
ApNDICE
Respostas dos
Testes/Exerccios
Respostas do Dia 1
Teste
I. Primeiro a Microsoft produziu um compilador para a linguagem BAS IC
ori ginal, chamando esse produto de Microsoft BAS IC. A verso seguinte desse comp ilador, que antecedeu o Visual BASIC, fo i o Quick
BASI C, ou QBASIC.
2. Todas as ling uagens .NET compartilham
esses recursos porque o Com,
mon Language Runtime os fornece. E por meio dessa funcionalidade de
tempo de execuo que todas essas linguagens trabalham com a plata-
fo rma .NET.
3. Esse processo chamado de comp ilao.
4 . Se voc no declarar explicitame nte um a rquivo de sa da, usando
jout :<nomedoa rquivo>, o compilador empregar o nome do arq uivo-fonte no lugar do executvel. Nesse caso, a sada seria My$ourceCode,exe,
A pnd ice A
610
Exerccios
I. Para gerar um arqu ivo executvel espec fi co, voc s precisa de jout:<nomedoarquivo>
no compil ador da li nha de comando. A fim de executar essa tarefa, acesse o console
(prompt de comando). Navegue (usando o comando cd) at a pasta que contm seus arquivos de trabal ho relacionados aos exemplos anteriores, especi ficamente s tep3 . vb.
Agora, execute o compilador d igitando vbc step3. vb t:exe out: hat S.exe e pressionando Entel'. Isso compilar step3, mas salvar o resultado compil ado em um arquivo
chamado WhatOS.exe.
2. H muitas propriedades diferentes dispon veis na parte Enviromnent do .NET Framework, portamo existem vrias maneiras pelas quais voc poderia ter respondi do a essa
pergunta. No fina l, entretanto, todas as respostas se pareceriam com a soluo a seguir,
que ex ibe a verso do .NET Framework:
Public Class FrameworkVersion
Sha red Sub Main()
System . Console.WriteLine(System . Environment.Version.ToString(
End Sub
End Cl ass
Esse cd igo produz o resultado a seguir (esse resu ltado gerado quando a verso Beta 2
da plataforma .NET usada; voc obter resu ltados diferentes se empregar a verso oficial):
CDIGO!
RESULTADO
Como alternativa, voc pode querer ex ibir o caminho para o diretrio System ou um dos
mui tos outros valores, todos seguindo o mesmo padro bsico. Um exemp lo do uso do
valor SystemDirectory most rado a seguir:
Publ;c Class SysD;r
Shared Sub Main()
System. Console .WriteLine(System.Environment . SystemDirectory)
End Sub
End Class
CDIGO!
RESULTADO
6 11
C: \ T V \ Cl SysDir
C: \WINNT\System32
Respostas do Dia 2
Teste
1. Voc usaria o Solution Explorer, que mostra todos os projetos abertos e os arquivos que
existem neles . Podemos tornar essa janela visvel pressionando a combinao de teclas
CTRL+R.
2. Por padro, os projetas so colocados sob a opo My Documents fol der\ Vi sual Studi o
Projects do usurio at ual e em uma nova pasta com o nome do projeto. Quando voc criar
um projeto novo, esse cam inho ser exibido na caixa de dilogo New Project, podendo
ser alterado quando for conven iente .
3. Escolha um cone na caixa de dilogo Project Properties, que voc pode acessar dando
um clique com o boto direito do mouse sobre o projeto no Solution Explorer e selecio*
nando Properties no menu suspenso. Tambm possve l esco lher um arquivo .i co (de
cone) em Com mon Properties\Build.
4. Na janela Command, digitar >cmd e pressionar Return o colocar no modo Command.
Digitar 1mmed e pressionar Return o conduzir novamente para o modo Immediate.
Exerccio
Com a introduo de uma chamada MessageBox.Show no evento TextChanged de uma caixa de
texto, uma mensagem ser exibida sempre que o contedo dessa caixa fo r a lterado. Embora esse
seja um locallltil para cdigos que val idem a entrada de texto do usurio, exibir uma mensagem
dentro desse evento logo se tornaria incmodo!
Respostas do Dia 3
Teste
I. Voc deve usar o tamanho e o tipo de varivel mais apropriados entre os tipos disponveis.
2. A e C esto corretas . Quando uma funo chamada, os parmetros tm de ser colocados
entre parnteses . Alm disso, a funo retornar um valor, portanto em geral preciso
que se faa algo com o resultado. Atribua*o a outra varivel ou exiba*o.
3. Se uma varivel for declarada com a palavra*chave Private, estar disponvel para todo
o mdulo ou classe onde fo i especificada.
Apndice A
612
Exerccios
Uma so luo possvel para o exerccio do programa de clcu lo de pagamentos seria
Module Payment
3
4
5
7
8
9
Sub Main()
Oim dblResult As Double
10
11
12
13
14
15
dblResult
16
CalculatePayment(dblLoanAmount.
dblAnnuallnterest.
iYears)
17
18
19
DisplayResults(dblResult)
20
21
22
End Sub
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
End Function
40
41
42
43
48
49
50
dblAnnuallnterest =
CObl{GetValue{"Annual Interest (e .g. for 5% , enter 5):
iVea r s = CInt{GetValue("Vears of loan: lO~
Console . WriteLine()
End Sub
6 13
lO~
51
52
53
54
55
56
57
58
Console.Write(Prompt)
Return Console . ReadLi ne
End Function
Private Sub DisplayResults{ByVal Result As Double)
Console . WriteLine()
59
60
61
62
63
64
65
66
67
68
69
Respostas do Dia 4
Teste
I. o lao For mais adequado para esse tipo de soluo, embora qualquer dos laos pudesse ser usado.
2. Embora os laos possam ser usados para sim ular uns aos outros, o lao Do mais flexve l
devido a seu suporte s clusulas Whi 1e e Unti 1 e s posies de entrada e sada onde poder ser inserida a expresso cond icional.
3. O bloco interno o cdigo que ser executado em cada iterao do lao, portanto, o desempenho obtido ou a quant idade de iteraes do lao apresentar um resultado melhor
dentro do lao.
4. Considerando-se Cal cul atedTotal NetWorth ( ) um pouco mais comp lexa do que o cd igo executado em d tCu r rentDa te . Hour( }, seria melhor que voc invertesse os do is lados
Apndi ce A
614
da expresso. Isso assegurar que, se a primeira expresso, dteu rrentOa te. Hour ( )
for falsa, a rotina maior e mais demorada no seja nem mesmo executada.
>
12,
Exerccio
I. H muitas manei ras diferentes pelas quais voc poderia escrever o programa NumberGucsser, mas o resultado geral seria semelhante ao descrito a seguir:
sInput = System.Console.ReadLine()
iUpperBound = CInt(sInput)
'Solic it e ao usurio Que escolha um nmero
System. Console .WriteLine("Pick a number between " & iLowerBound
" and " & i UpperBound & " . and remember i t! ")
System . Console .Wri teL ine("Hit Return To Continue")
System.Console.ReadLine()
iCurrentGuess = O
sGuessStatus = " "
Do Until sGuessStatus = "="
iCurrentGuess = GetMyGuess(iLowerBound, iUpperBound)
System.Console . Writeline("My Guess Is : " & i CurrentGuess)
System.Console.Write("How did I do ? ")
sGuessStatus = System. Console .ReadL ine()
sGuessStatus = sGuessStatus .ToUpper()
Select Case sGuessStatus
Case "H"
i UpperBound = iCurrentGuess - 1
Case "L"
iLowerBound = iCurrentGuess + 1
End Selec t
&
6 15
LOOp
End Sub
Shared Function GetMyGuess(iUpper As lnteger, iLower As lnteger)
- As Integer
If iUpper = iLower lhen
GetMyGuess = ilower
Else
GetMyGuess = ilower + ((iUpper - ilower - 1)\2)
End If
End Function
End C1 ass
Respostas do Dia 5
Teste
I. H vrias vantagens, porm a mais importante que no necessrio distribuir nada antes que o aplicativo possa ser usado ou para alual iz-Io. Outro beneficio essencial est relacionado aos ap li cativos com uma interface Web poderem ser acessados em
plataformas que no sejam Windows.
2. A inda assim ser um sistema de uma camada. Os nve is diferentes dos aplicativos so baseados nos locais onde o cd igo e/ou o processamento so executados. Nesse exemp lo,
nenhum tipo de processamento man ipu lado pelo servidor; ele apenas contm o arquivo
que ser usado pelo aplicativo cliente. Toda a parte ligada lgica, ao processamento e
ao cdigo tratada somente no sistema cliente.
3. O requisito bs ico o .NET Framework, que deve ser insta lado em qualquer sistema que
venha a executar um cdigo .NET, inclusive um servidor que processe um site ASP.NET
na Web.
Respostas do Dia 6
Teste
I. Asjanelas Local, Watc h, Immediate e Quickwatch e ajanela suspensa Watch.
Exerccios
I. A Listagem 6. 1 I mostra uma soluo possvel.
616
A pndice A
LISTA GEM
COIGO
1 Imports System
2 Imports Microsoft.VisualBasic . Co ntrolChars
3
4 Module modTable
5
6 Sub MainO
7
8
10
11
Do
'solicite valores
12
13
14
sInput : Console.ReadLine()
iLow = Clnt(sInput)
15
16
17
18
19
If i Low O lhen
Console . Write("Hig h value (maximum of 20): lO)
sInput = Console.ReadLine()
iH i gh = Clnt(sInput)
20
21
OutputTable(iLow , iHigh)
22
23
24
End If
Loop Unt i 1 i Low
25
26
27
28
29
30
31
32
33
34
35
End Sub
36
37
38
39
40
41
42
43
44
'escreva o cabealho
For iCount = MinValue To MaxVa l ue
Console . Write(Tab & CStr(iCount)}
Next
Console.Wri teLine(}
'Crie cada linha da tabela
For iCount = MinValue To MaxVa l ue
CDIGO
45
46
47
48
49
50
LISTAGEM 6. 11
6 17
51
52 End Module
Respostas do Dia 7
Teste
I. Se um mtodo inserido em uma classe for marcado com MustOverride, ento, a classe
deve ser marcada com Mus tlnheri t. Isso acontece porque o primeiro requ isi to, que todas
as classes clientes devem implementar seu prprio cdigo para esse mtodo, fora a incluso da palavra-chave MustInheri t j que a classe bsica no sobrepe o mtodo.
2. A palavra-chave MyBase permite que sejam chamados os membros da classe-pai ou da
classe bsica. Voc pode usar MyBase.New( ) para chamar o construtor-padro de sua
classe bsica.
3. Doi s dos construtores sobrepostos so efetivamente os mesmos para o compi lador do Visual Basic e, portanto, no so perm it idos.
Publ ic Sub New(ByVal sColor As String)
m_dtManufactured = System.OateTime.Now()
m sColor = sColor
End Sub
Publ ic Sub New(ByVal sName As String)
End Sub
Nesse caso,j que os dois procedimentos compartilham o mesmo nome e os parmetros, o compilador do Visual Basic os considerar iguais, portanto, no pennitir que ambos existam. O fato
de que um argumento chamado sColor e o outro sName irrelevante para a finalidade dessa
questo.
Exerccios
l-l vrias maneiras que voc poderia usar para criar esse exemplo, mas apresentada a seguir
uma imp lementao possvel (veja a Figura 7.4):
Apndice A
Namespace Biology
Public Class Animal
Public Overri dable Property Name{ ) As String
Get
End Get
Set(ByVal Va l ue As String)
End Set
End Property
Public Overri dab l e Property NumberOfL imbs() As Integer
Get
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overri dable Property Cor()As String
Get
End Get
Set(ByVal Value As Stri ng)
End Set
End Proper ty
Public Overri dable Property Weight() As Si ng le
Get
End Get
Set(ByVal Value As Single)
End Set
End Property
Public Overri dable Property AirBreather() As Boolean
Get
End Get
Set (ByVa 1 Va 1ue As Boo 1ean)
End Set
End Property
End Cl ass
Public Class Reptile
Inherits Animal
End C1 ass
Publ i c Class Mammal
Inherits Animal
Public Overrid es Property Air8reather() As 8001ean
Get
Return True
End Get
Set(ByVal Value As Boolean)
Throw New System.Exception(UAll mammals breathe air U)
End Set
6 19
End Property
End C1 ass
Public C1ass Human
Inherits Manma1
Public Overrides Property NumberOfLimbs() As Integer
Get
Return 4
End Get
Set(ByVal Value As Integer)
End Set
End Property
End C1 ass
End Namespace
FIGURA 7.4
O Objecl 8rowser
mO~'lra as classes que
compem esse exemplo
e .~eu relacionamento
IIfI/OS com as oulras.
No se preocupe se seu cdigo no ficar to parecido com esse exemplo, contanto que fun cione c
voc possa usar alguns dos recursos dos objetos descritos na lio do Dia 7.
Respostas do Dia 8
Teste
I. Voc poderia redirecionaros fluxos de resultados ou erro para um arquivo com a
dade de regi str~ los.
fi na l i~
620
Apndice A
2. O conjunto SortedL i st ordenar de modo automtico os itens em uma lista medida que
forem adicionados, portanto, voc no tem de se lembrar de chamar repetidamente o m*
Exerccios
Para criar o programa do console descrito, voc usaria o mtodo GetCorrmandArgs da classe Environment e o mtodo 50rt da classe Arrayl i st . Dessa maneira, seriam necessrios os espaos de
nome System e System . Co 11 cet i ons . Siga estas etapas:
I. Crie um apl icativo do console . O meu se chama SortedArgs.
2. Altere o nome do mdu lo de Modu leI para modMain. Salve o arquivo resultante como
Main . vb.
3. D um clique com O boto direito do mouse sobre o nom e do projeto no So lution Exp lorer e selecione Properties. Altere o Slarlup Objecl para modMain . Selec ione OK para fe char a caixa de dilogo .
4. O mtodo GetCoJll1landArgs da classe Envi ronment retorna um array de strings de cada argumento listado na linha de comando (incluindo o nome do ap licativo). Voc pode usar
isso na criao de um conj unto ArrayL i st e em pregar a funciona li dade de ordenao interna para organizar sua li sta.
5. J que o nome do aplicativo est em seu conjunto ArrayL is t , voc deve remov- lo antes
de ordenar a lista.
6. Depois de orden-la, voc poder usar o mtodo Conso 1e. Wri teL i ne para exibi r a lista re-
sultante. Empregue um lao For ... Next para visualizar todos os itens dela.
O cdigo-fonte comp leto para o exemplo est na Listagem 8.4.
CDIGO
LISTAGEM
8 .4
1 Module modMain
2
3
4
5
6
7
8
9
10
11
12
13
Sub Main()
Dim oArgs As New ArrayList(Environment .GetCommandL i neArgs())
Dim I As Integer
With oArgs
. RemoveAt(O)
. 50rtO
ForI=O To .Count -l
Conso l e.Writeline(.Item(I))
Next
Eod With
End Sub
End Module
ANLISE
621
A Listagem 8.4 pequena, mas demonstra vrias tcn icas para a manipulao de
GetC01l1TlandL i neArgs. Essa tcnica est disponvel para muitos dos conjuntos definidos em
System. Coi I ect i ons. Ela permi te que voc pegue um array existente, insira-o em um conjunto
(ArrayL i st, Queue ou Stack) e defina seu comportamento adicional. Nesse caso, ela executa a remoo do item indesejado (linha 6) e ordena os restantes (linha 7). Para concluir, o cdigo que
vai da linha 8 a 10 exibe o array resultante. A execuo do aplicativo deve produzi r o resultado a
segu1 r:
RESULTADO
2
3
4
5
6
7
8
9
10
11
12
Respostas do Dia 9
Teste
1. Modal versus no-modal: quando uma janela exibida de maneira modal , o usurio no
pode interagir com nenhuma parte do aplicativo at que ajanela seja fechada. Cdigos
que exibem formulr ios modais tm sua execuo interrompida at o momento em que
esse formulrio fique oculto ou seja fechado. Quando um formulrio no-modal exibido, o usurio no impedido de trabalhar com qualquer outra parte do aplicativo, e o cdigo que o exibiu continuar a ser executado sem ter de esperar que o formulrio seja
fechado.
2. A propriedade Causes Vai idat i on configurada como True para indicar que desejamos
assegurar a existncia de dados vlidos nos campos de entrada de dados quando o usurio usar esse controle. Se voc configurar essa propriedade em um boto Cancel, ento, o
usurio ter de inserir informaes vlidas mesmo quando quiser apenas cancelar o processo!
622
Apndice A
3. A instruo Handl es, seguida de um OLl mais nomes de eventos especficos, L1sada para
indicar que o procedimento um manipulador de eventos. Ter Handl es btnOpen.Cl i ck no
final de um procedi mento significa que ele ser chamado sempre que o evento C1 i ck de
btnOpen ocorrer (quando o usurio der um clique em btnOpen).
Exerccios
1. A estratgia para manipular os trs eventos com apenas uma rotina determinar que
evento especfico ocorreu quando ela fo i chamada. Pe la converso do parmetro sender
em um objeto $ystem. Wi ndows. Fonns . Control, voc poder acessar sua propriedade
Name, que fornecer o nome do controle que a origem do evento. O novo procedimento
de eventos, que s ubstituiria os outros trs, mostrado na Listagem 9 .21.
L ISTAGEM 9.21
Procedimento de Eventos
5
Dim sEventSource As String
6 - CType(sender. Control).Name
7
Dim sSource As String
Oim sOestination As String
8
9
sSource = txtSource.Text{)
10
sDestination = txtOestination . Text{)
11
12
Select Case sEventSource
13
Case "btnCopy"
14
Fi le.Copy{sSource, sOestination)
15
Case "btnMove"
16
File .Move{sSource, sDestination)
17
Case "btnDelete"
18
File.Del ete{sSource)
19
Case Else
20
'no faa nada
21
End Select
22 End Sub
623
Respostas do Dia 10
Teste
1. Os controles Label fornecero a voc o recurso de alterar posteriormente o texto de manei ra dinmica.
2. Os controles LinkButtan e HyperLink.
3. Use os controles Image ou ImageBut to n (se a figura tiver como fina l idade ser cl icada), ou
apenas selecione Insert e Image no menu.
Exerccios
Por causa das condies do formulr io, devem ser usados os controles Va 1i datar. Adicione-os a
todos os outros controles. A maior parte ser de controles Requ i redF i e 1dVa 1 i da tors, mas tambm ser necessrio um CompareVa l idator para assegurar que as duas senhas coincidam . Alm
disso, voc ver corno se cria um campo de senha.
Crie um projeto (ou adicione um novo fonnulrio a um projeto existente). Adicione urna tabela
nova (Table, lnsert, Table) ao fonnulrio , com trs colunas e seis linhas. Veja a Figura 10.9 para
obter detalhes.
Adicione trs titulas ao novo fonnulrio, um para cada urna das trs primeiras linhas da primeira
coluna. De maneira semelhante, ad icione quatro controles TextBox s primeiras quatro Iinhas da
segunda coluna. O res ultado final deve fi car parecido com a Figura 10.10.
FIGURA 10.9
.- --,,'
._. . ......, r--,
_ , [>00 -.."
::3
e.d<"'-_'
r,:.~,--""
.., 3
---=-'1
3.:::1
ri
., .,.
~~~ , rl----c=c------ .d
,~.,
-"",,",
cIlo<t
...............
, ...,- _
.....,
""=~.,-""
3.:::1
3.:::1
3..:::J
~===~
3.:::1
lJ , __ ..,
c .........
"
"
....,
f,
1<
"
.........., Ir---"
3
IQ 0.'1" ID .mo.
.,.,
" A'
~.
,
!
i
.....
624
Apndice A
10.10
O formulrio lVeb
. ~"' "
~,,~,.h
FIGUR A
sendo criado.
w,"'""",
.. r;J i:!
,
~
; ,-,
-"
,~
................. ,
t 1='
I;;i ,,'....
,....,,-.-
.-,
",-
,,
4H, .........
:;1 .. "
""
.LIa.......'
ii ....-
....
''''
.-
w .........
..--
,. ~.="='~'
'I
Para concluir a segunda coluna, ad icione um controle Button e outro Label. Por fim , na tercei ra
coluna, adicione (de cima para baixo) trs controles Requ i red Fi e1dVa 1i dators e um Compa reVa1i datar. Configure as propriedades de todos os controles como descrito na Tabela 10.6.
TAB ELA 10.6
Controle
Propriedade
Valor
Label
( ID)
lblName
Text
Name;
Font Bold
True
( ID)
lblAlias
Text
Alias:
Font Bold
True
(10)
lbl Password
Text
Password:
Font Bold
True
TextBox
( 10)
txtName
TextBox
( 10)
txtAlias
MaxLength
10
( 10)
txtPassword l
TextMode
Password
( 10)
txtPassword2
TextMode
Password
Lahel
Label
TextBox
TextBox
625
Propriedade
Valor
Sutton
(ID)
cmdRegi ster
Text
Register
( ID)
lblSulTIDary
BaekColor
IEOEOEO
BorderColor
Silver
BoderStyl e
Groove
BorderWi dth
1"
Text
<blank>
( ID)
reqName
ControlToVa l idate
txtName
ErrorMessage
( 10)
reqAlias
txtAlias
ErrorMessage
( 10)
reqpassword
txtPasswordI
ErrorMessage
(ID)
cmpPassword
ControlToCompare
txtPassswordI
ControleToValidate
txtPasssword2
ErrorMessage
Label
Validator
Validator
Validator
CompareValidator
Por fim , voc est pronto para adic ionar o cdigo. Como antes, no necessrio inserir um que
manipule a validao porque os controles gerenciam isso. Portanto, no h um cdigo extenso a
ser adicionado a pgina. S preciso criar aquele que ser executado quando o usurio der um
clique no boto de registro (Register). Ele ser processado apenas se todos os erros forem corrigidos e s exibir uma mensagem no campo do resultado (summary). D um clique duas vezes
no boto Register e adicione o cdigo da Listagem 10.5.
CDIGO
1
2
3
LISTAGEM
626
Apndice A
Compile e execute o projeto. Quando o navegador estiver di sponvel , tente usar valores diferentes nos campos. Exclua qualquer entrada que tiver inserido nos campos Name e Alias. Voc deve
ver as mensagens de erro desses controles. Digite duas senhas diferentes para ver o controle CompareVal idator em ao (veja a Figura 10.11). Para conc lu ir, insira valores nos campos Narne e
Alias, e senhas iguais para ver a mensagem final. Veja a Figura 10. 12.
FIGURA 10.11
Formulrio de registro
com er/'os.
FIGURA 10.12
FO/"/11l1lrio de registro
preenchido
cor/'etamenle.
-_.
627
Respostas do Dia 11
Teste
1. o campo (ou campos) usado para identificar de maneira exclusiva o reg istro de um banco de dados chamado de chave primria.
2. Esse cdigo SQL executou lima instruo l EFT OUTER JOIN entre essas duas tabelas, especificando que lodos os registras de Marca e Modelo que atendam condio da associao sej am includos no resultado. Os resultados a seguir sero gerados:
Marca
Modelo
Fo rd
Mustang
Ford
Explorer
Audi
<Nu lo>
BMW
<Nu lo>
Pontiac
Grand Am
Pontiac
Grand Prix
Po ntiac
Aztek
Tovota
Rav 4
Tovota
Camry
3. Essa instruo SQL espec ifi ca lima associao interna, que o tipo mais comum de
unio. Ela produzir resultados apenas com os registras das duas tabe las em que a cond io da associao for atend ida, como vemos a seguir:
Marca
Modelo
Ford
Mustang
Ford
Explorer
Pontiac
Grand Am
Pontiac
Grand Prix
Pontiac
Aztek
Tovota
Rav 4
Tovota
Camry
Observe que Audi e BMW, que no tm registras na tabela Modelo, no foram inc lu dos
no resu ltado da segunda instruo SQ L.
628
Apndice A
Exerccios
I. H muitas maneiras pelas quais voc poderia estender seu banco de dados de CDs para
abranger os usurios; veja a seguir a mais sim ples:
Primeiro, adic ione uma tabela de usurios (User) que ler o campo da identificao do
usurio (UserlD) como chave prim ria. Que outros campos sero includos nessa tabela
irrelevante, mas provavelmente ela ter informaes como o nome e endereo elelrnico do usurio, e ta lvez uma senha, de modo que voc possa garantir a segurana c impedi r que os usurios alterem a coleo de CDs de outras pessoas.
A segu ir, voc traba lhar com base no fato de que se dois usurios tiverem o lbum " Fields af Gold" do Sting, deve haver apenas uma ent rada relacionada a Sling na tabela
Art ist, e apenas uma em Disc referente a esse CD especfico. Com isso definido, no final
teremos um relacioname nto muitos-para-muitos entre User e Disc, que pode ser expresso como uma tabela de relacionamentos UserD isc. O banco de dados alterado mostrado
na Figura 11.7.
2. Mesmo com as in formaes de Order s. txt sendo apresentadas de maneira inadequada,
no raro receber dados nesse formato, principalmente quando so originrios de uma
plan ilha. Para coloc-los em um banco de dados eficiente, voc tem de separar as informaes sobre o cl iente das referentes ao pedido e ai nda inserir os itens de cada pedido (e
se um cliente qu isesse pedir quatro itens no mesmo pedido?) em sua prpria tabela. Durante o processo, tambm poderiam ser removidos alguns campos que produzem resultados calcu lados (total do pedido, custo total do item X) que em vez disso seri am obtidos
como parte de uma consulta. O layo ut desse banco de dados mostrado na Figura 11.8.
Artist
FIGURA 11 .7
S precisamos
adiciollar dilas tabelas
para 'ralls/ormar seu
banco de dados de CDs
em 111/1 sislem(J
l/1ull i usurio.
PK
PK
PK
Category
I
User
DjsclD
ArtistlD
CDntle
FIGURA 11 .8
Banco de dados de
pedidos "eestrllturado.
629
CustomBr
PK
_
CalegorvlO
CategoryName
Order
PK Omerlo
CuslomerlO
OrderDate
ShipOate
OrdemltBm
PK
QrderlO
OrderllemlO
Item SKU
Item COSI
Item auan~
Se quisesse, voc poderia ir adiante com esse banco de dados, criando uma tabela de itens para
armazenar um registro de cada SKU com posto do preo e da descrio do item e remover esses
campos da tabela Orderltem. Observe que em um banco de dados de entrada de pedidos s vezes
necessrio existir alguma duplicao - armazenar o custo dos itens com os itens do pedido, por
exemplo - para permitir que os preos dos itens sejam alterados com Otempo sem que isso afete
as informaes de pedidos anteriores.
Respostas do Dia 12
Teste
1. A propriedade em questo Mi ss i ngSchemaAction, ea configurao de AddWi thKey que
mtodo ExecuteNoQuery do objeto Corrmand . Seu cdigo pode ficar com a aparncia a se
glllr:
Sub MainO
Dim sSQL As String
sSQL = "OELETE FROM Artist Where ArtistID=3"
Dim objConn As New _
System . Data.OleOb . OleObConnection(sConnection)
Oim objCmd As New _
System . Data.OleDb . OleDbCorrmand(sSQL. objConn)
630
Apndice A
objConn.Open()
objCmd.ExecuteNonQuery()
End Sub
Exerccios
Voc poderia criar uma interface para seu banco de dados de registro de CDs de muitas maneiras, mas as partes essenciais sero as mesmas em todos os casos.
Respostas do Dia 13
Teste
I. Loaded Modules e Processes (e voc tambm pode obter essa informao no Managemen! lnforrnation).
2. O servio um programa executado em segu ndo plano no seu computador, que fornece
algum recurso. Por exemplo, o SQL Serverdispon ibil iza recursos de bancos de dados.
Respostas do Dia 14
Teste
I. A palavra-chave MyBase fornece a funciona lidade desejada e pode ser usada para se referir a propriedades ou mtodos da classe bsica.
2. Criar mltiplas verses do mesmo proced imento, porm com diferentes conj untos de parmetros, chamado de sobreposio.
3. O resultado ser
x.Name = Fred
y.Name = Fred
Tanto x quanto y se referem mesma instncia de myFi rstCl ass , e x. Name
nada porque equivalente a x.Name = x.Name.
y. Name no altera
Exerccios
Um caminho possvel para o projeto seria manipular os diversos tipos de evento usando uma hierarq uia de objetos, em vez de empregar apenas uma propriedade de tipo ou categoria em uma
nica classe Event. Voc poderia criar uma classe bsica Event, com algumas propriedades comuns como o nome do evento e talvez as informaes de cantata referentes a esse evento. Deri-
631
vadas dessa classe, outras poderiam ser criadas como SportingEvent (herda de Event),
ConcertEvent, ComedyEvent, Pub 1 i cSpea ki ngEvent e assim por d iante. A hierarquia poderia ser
levada ainda mais para baixo, conduzindo a classes como Baseba 11 Game (herda de Sport i ngEvent). Po 1 it i ca lEvent (herda de Pub 1i cSpeaki ngEvent) e outras. As propriedades individuais
das diversas classes derivadas podem ser descritas no nvel de detalhe desejado, mas devem evitar a repetio. Se duas classes tiverem propriedades semelhantes, considere passar as propriedades em comum para uma classe bsica .
Respostas do Dia 15
Teste
I. As interFaces Fornecem esse tipo de Funcionalidade, permi ti ndo a demonstrao de que
muitas classes diFerentes comparti lham alguns recursos. Elas so bastante adequadas a
essa tarefa porque uma nica classe pode implementar vrias interfaces distintas.
2. A palavra-chave MustOverri de pode ser usada para indicar que uma propriedade ou mtodo especfi co deve ser sobreposto em uma classe derivada.
3. A palavra-chave MustInherit transforma uma classe bsica em ' abstrata', que no pode
ser instanciada, mas, em vez disso, deve ter classes derivadas dela.
4 . As classes marcadas como NotInheritable tambm so conhecidas como ' lacradas', e
no podem ser usadas como uma classe bsica (outras classes no podem herdar caractersticas dela).
Exerccios
H muitas maneiras pelas quais voc poderia criar uma hierarquia de objetos que inclu sse o
cliente, mas a Figura 15.4 ilustra um exemplo. Nesse caso, a classe Cl iente fo i derivada de uma
classe Pessoa mais genrica, e os aspectos das informaes de contato foram gerados diretamente nessa classe bsica de origem.
632
Apndice A
FIGURA 15.4
Classe PesaDa
Primeiro Nome
Sobrenome
Identificao das
serem remili=a(/as s
w=es pode gerar lima
es/rlllllra mais
complexa.
Clnse de Informaes
de Contato
Endereo
Cidade
Informaes de Contato
Data de Nascimento
Cadastro na Previdncia
Endereo Eletrnica
Herda Pessoa
Primeiro Noma
Sobrenome
na Previdncia
Classe Cliente
Governamental
HEtrda CliElnla
Primeiro Nome
Sobrenome
Identificao das
'---- Herda - - -
Informaes de Contato
Data de Nascimento
Cadastro na Previdncia
Identificao do Cliente
Cliente Desde (data)
Categoria do Cliente
Agncia Governamental
Identificao do Pedido
do Governo
Um projeto alternativo, na Figura 15.5, ilustra como uma verso mais simples com as mesmas
informaes pode ser estruturada.
FIGURA 15.5
Classe Clianta
O mesmo cOIyunlo de
informaes pode ser
modelado de vrias
mal/eiras.
Identificao do Cliente
Cliente Desde Idata)
Categoria do Cliente
Primeiro Nome
Sobrenome
Data de Nascimento
Cadastro na Previdncia
Endereo
Cidade
Estado
Cdigo Postal
Pas
Telefone
,,,
Endereo Eletrnico
- - Herda
633
Cliente Classe
Governamentel
Herda Cliente
Identificao do Cliente
Cliente Desde (datal
Categoria do Cliente
Primeiro Nome
Sobrenome
Data de Nascimento
Cadastro na Previdncia
Endereo
Cidade
Estado
Cdigo Postal
Telefone
,,,
Endereo EletrOnico
Agncia Governamental
Idenfica1io do Pedido
do Governo
Respostas do Dia 16
Teste
I. Use o mtodo LayoutMdi do formu lrio MDI-pai para configurar o layout como Mdi La yout . Cascade. Isso organizar as janelas- fi lhas de modo que Iodas as suas barras de ttulo
fiquem visveis.
Exerccios
I. Na verdade, urna preferncia pessoal. Em geral, prefi ro o modelo SDI porque posso ver
as janelas individualmente na barra de tarefas. No entanto, em alguns apl icativos que podem abrir mltiplos arquivos, como um que use figuras, prefiro o MOI , para armazenar
todas elas no mesmo local.
2. Os mtodos GetAttri butes e GetLastWri teTime da classe Fi 1e so teis quando essas informaes so recuperadas em um arquivo. Os dois so mtodos comparti lhados da classe Fi 1e, portanto voc no precisa criar a instnc ia de um arquivo antes de us-los. Para
Apndice A
634
adicionar essa funcionalidade , voc pode alterar o aplicativo Pioneer original ou copiar
todos os arquivos do diretrio dele em um novo diretrio e alter-los.
Altere a propriedade Vi ew de Li stVi ew para Detai 1, Isso ativar o recurso com o qual voc poder adicionar vrias colunas Li stVi ew. Adicione trs col unas li s tView usando o editor da
propriedade Co 1umn$. A Tabela 16.1 7 descreve as propriedades dessas co lunas .
TABElA 16.17
Propriedades da Coluna
Coluna
Propriedade
Valor
Primeira
Name
hdrName
Te)(t
File Name
Width
180
Name
hdrAttributes
Text
Attributes
Tex tAlign
Canter
Name
hdrModi fi ed
Text
last Modified
Text Align
Right
Width
80
Segunda
Terceira
Modifi ed. AItere o manipulador de eventos tvwFo 1ders AfterSe 1ec t para criar essas col unas (veja a
Listagem 16.8).
LISTAGEM
1
2
3
16.8
5
6
7
8
10
lvwFiles.ltems.Clear()
11
12
13
14
LISTAGEM 16.8
15
16
17
18
19
635
ANLISE
Para concluir, voc deve criar uma rotina com a final idade de exibi r os atributos defin idos para o
arquivo. Adicione o cdigo da Listagem 16.9 a fim de exec utar essa operao.
LISTAGEM 16.9
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Fun o GetAttributeString
35
36
37
38
39
40
34
636
Apndice A
LISTAGEM 16.9
,. "S"
Else
sReturn ,. "-"
41
sReturn
42
43
44
End 11
45
46
47
48
Return sReturn
End Function
ANALISE
NOTA
System
Di rectory
Archive
Device
Norma 1
Temporary
Sparse File
Reparse Point
Compressed
Off1 i ne
Not Content Indexed
Encrypted
~
4
16
32
64
128
256
512
1024
2048
4096
8192
16384