Você está na página 1de 662

I

"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

Guatemala Mxico Peru Porto Rico Venezuela

2003 Pearson Education do Brasil


Tilulo Original: Sams, Teach Yourself Visual Basic .NET in 21 Days
2002 Sams Publishing
1! Edio em ingls Sams Teach Yourself Visual Basic .NET
in 21 Days publicada pela Pearson Education Inc. ,
sob o selo Sams Publishing
Todos os direitos reservados
Diretor Editorial: Jos Martins Braga
Editora: Gislia do Carmo Costa
Produtora Editorial: Marileide Gomes
Designer de Capa: Marcelo da Silva Franozo
(sobre o projeto original de Aren Howell)
Editorao Eletrnica: ERJ Composio Editorial e Artes Grficas LIda
Impresso: So Paulo - SP

Dados Internacionais de Catalogao na Publicao (CIP)


(Cmara Brasileira do Livro, SP, Brasil)

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
,

Indices para catlogo sistemtico


1. Visual Basic.NET: Linguagem de programao:
Computadores: Processamento de dados 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.

Diga-nos o Que Voc Acha!


Como leitor deste livro, voc nosso crtico e colaborador mais importante. Valorizamos sua
opinio e queremos saber o que estamos fazendo corretamente, o que poderamos fazer melhor,
sobre quais reas voc gostaria de nos ver publicando c qualquer outra sugesto importante que
deseje passar para ns.

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-

mos fazer para tornar nossos li vros me lhores.

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:

(11) 3611 9686

Fone:

(II) 3613 1213

Endereo Eletrnico:

clientes@makron .com.br e livros_infonnatica@pearsoned .com.br

Endereo Postal:

Pearson Education do Brasil


Rua Em lio Goeldi, 747 - Lapa
So Paulo - SP/ 05065-110

...

...

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

SEMANA 1 Viso Geral


Dia 1

Bem-Vindo ao Visual Basic .NET

3
Compreendendo a Programao de Computadores ' .. ... . .. ... .. . .. . .. .. 3

A Funo dos Sistemas Operacionais .. .. .. .. . .... . ... .. .. . .... . .. . 4


O Papel das Linguagens de Programao' ........................... 5
Por Que Escrever Programas de Com putador? ..... . ................. ... . 8
Um Breve Histrico sobre o Visual Basic" ........................ 10
O Que ,NET? . .. ... . .. .. ... . ... .. .. .. .. . ...... .. .. . .... . .. . 13
Servidores .NET . .. .. ... .. .. .. .. .. .. .. ... . . ... .. .. .. .....
.NET Framework ... . .. .. ... . .. .. .. .. ... . ... . ... .. . ........
Serv ios .NET ...............................................
Disposit ivos .N ET ............................................
Desenvolvendo seu Primeiro Aplicativo no Visual Basic .NET ..
Preparando-se para Codi ficar .. . ... .. .. .. ... . ... .. .. ..
Onde Est meu ID E? . .. .. ... . ... .. .. .. ... . ... .. . ...
Uma Tarefa S imples' ............ .. .. .. ... .. .. ..
Escrevendo o Cdigo ...... . . . . .. . .. ... . . . ...
Resumo' ................. . . . . . .. . .. .... . . . . .

..
..
..
..
..
..

14
14
15
16

. .... . ... 17
. .... . .. . 17
. ... . . 21
. .... . 2 1
. .. ... 22
. ..... 27

P&R ')7
Workshop . ... . ... . .. .. . .. - ... . . .. .. . .. ..... - . . . .. . 28
Teste .. ... . .. .. .. .. .. ... . ... .. . . .. . . . . .. .. .. . . . . ... 28
Exercfdos ....................... . .. ... .. .. .. . . . ..... 28
Dia 2

Trabalhandocom o Visual Basic .NET

29

O IDE do Visual Studio . .. .... . . .... ..... ... . . .. . . . .. . . .... .


Inic iando' ...... . ....... ... ............. . .. .. .. . . . .....
A Janela Principal do IDE do Visual Studio' . ... . . ........ . . .. .
Solues e Projetos ' .. ... . ... .. .. .. .. .. ... . . . ..... . . . . .. .
Arqu ivos' .. . .. ...... .. ... ... . .. . ... .. .. . .. . . . . . . . ... . .
Criando Nosso Primeiro Aplicativo Windows ....... .. .. . . . . . ......
Crie o Projeto' ............................ .. .. .. . . .. .....
Desenvolva a Interface com o Usurio' . .. .. ... . . . . . . .. .. . ... . .. .
Executando o Projeto ... . ... . ... .. .. .. ... . . ... .. .. . .... . .. .
Construindo o Projeto' .. ... .. . ... .. .. .. ... . . .... .. .. . .... . ...
Adicionando Seu Prprio Cdigo .............. . ...............
Resumo' .. . ... . ........................... .. ...............

29
30
32
50
52
53
54
54
55
56
58
60

Aprenda Visual Basic .N ET em 21 Dias

P&R ......... .. .. .. ... ... . . . . .. .. . . . .. .. . . . . . . . .. . 60


Workshop . ... . .. . . .. . . . ... . . .. . . ... . .. .. . .. . . ... . . 61

Teste 61
Exercc ios' .. .. ... . .. .. ... . ... .. .. .. .. .. ... . . , ... , . . . .. . 61
Dia 3

Introduo Programao com o Visual Basic .NET

63

Variveis e Atribu io' . .. .. ... . ... .. .. .. ... . ... . .. ... .. . .. .. . . 64


O Que uma Varive l? . .. ... .. .. .. .. .. ... . ... . . . . . . . . . .. . .. . 64
Tipos de Variveis Disponveis' .... .. . . .. ... .. .. .. . . . ..... 64

Variveis Simples' . .. .. ... .. . ... . .. . .. ... . . . . ... . . ... . . 65


Declarando Variveis' .. ... .. .. .. . .. .. . . .. . .. . .. . .. . .. . . .. ... . . 69
Arrays .. .. .. .. ... . .. .. . . .. . .. . . .. .. . . . . .... . . . .. . 70
Atribu io' ............................... .. . . . . . . . ..... 72
Constantes' ............. ...... ............ .. .. .. . . . . .... 72
Algumas Sugestes para os Padres de Nomeao' .... .. . . . . . . . ..... 73
Clculos Simples' ............................ .. . . . . . . . ..... 74
Usando Operadores .. .. .. ... . ... .. .. .. ...... .. . .. .. . ... . .. . 75
Funes Internas' .. .. ... . ... . ... .. .. .. .. .. . .. ... .. . ... .. .. . 75
Escrevendo Suas Prprias Rotinas ' . ... .. .. ... .. . . .... .. .. . .... . ... 80
Sub-Rotinas ............................... .. ............... 80
Funes ' ... . .. .. .. .. ... . ... .. .. .. .. .. .. ... .. . ... .. . ... ... . . 81
Escopo ' . ... . .. .. .. .. ... . ... .. .. .. .. .. .. ... .. . ... .. . .... . ... 8 1

Exemplo de Aplicativo: Calculando um Valor Futuro' ... .. . ... .. .. ... . .. . 83


Resumo' .. ... . .. ... . .. .. ... . ... .. .. .. .. .. ... .. . ... .. .. ... . .. . 88

P&R89
Workshop ................. . .............. . ............... 89
Teste' ........ .. ... . ... . . . .. .. .. ....... .. ............... 90
Exerc cios' .. .. .. .. .. .. ... . ... .. .. .. .. .. .. .. .. .. .. . .... . .. . 90
Dia 4

Controlando o Fluxo dos Programas

91
Tomando Decises com as Instrues de Controle ' ..... .. .. ....... . .. . 91
A In struo If . .. .. .. .. ... . ... .. .. .. .. .. .... . .. .. .. . ... ... . . 92

Estendendo a Instruo If ................................... 95


Instrues If em SeqiJncia na Mesma Linha' .... . ............... 99
Expresses e Lgica Boo leana' ....................... .. .......... 100
Operadores de Com parao' ....... .. .. .. ... . ... .. .. . .. . ... .. . 100
Operadores Lgicos . .. . .... . .. .. ...... ... . ... .. . ... ... . ... .. . 101
Avaliao Abreviada' .. .. . .... . .. ... . .. ... . ... .. .. .. ....... . .. 103
Lidando com M ltiplas Possibilidades: A Instruo SeI ect Case 104
Laos' ...................................................... 105
For ... Next . . ... .. .. . ....... .. .. .. ... . ... .. .. .. ... . ... .. . 106
A Varivel do Contador ' . . .... . .. .. .. .. ... . ... .. .. .. . .. .. .. .. . 106
Espec ificando O Valor do Incremento com O Uso de Step .. .. . .... .. .. . 108
While ... End While 1 09

Sum rio

Dia 5

Dia 6

Lao 00 .............. .. .... . .. .. ... . .... ... ...... ....


Condies de Sada ' ... . ... .. .. .. .. ........ . .. . . ....... . . . .
Laos Infi nitos ' . . . ... . . .. .... .. ....... .. .... .. ... . . . .. ... .. .
Implicaes sobre o Desem penho' .. .. .. .. ... . ... .. .. .. .. .. ... .. .
Ap licativos Que Faro Uso de Seu Conhecimento Recem-Adqu irido' ........
Leitura de um Arqu ivo' .......................................
Um Jogo Simples' ...........................................
Evitando Laos Complexos por Meio da Recurso ' . . ... .. .... ..... .. . ..
Resumo' .. ... .. . ... .. .. . .... . .. .. .. .. ... . ... .. . ... - ..... .. .
P&R .... . ... . ... . ........ . ... . ............ . ... . . ........ .
Workshop' ...... . .... .......... .. .........................
Teste' ....................................... . ..........
Exerclcios .. .. . .. ... . .. .... . .. ... . .. ... . ... .. . . .. . . . .. .

ttt
113
t t4
t t5
116
117
119
121
123
123
124
124
125

Arquitetura dos Aplicativos na Plataform a .NET

127

O Que E a Arquitetura do Aplicativo?' ..............................


Funo do Arquiteto de Softwares" . .. .. .. ... . ... .. .. .. ... . ... . ..
Que Partes de um S istema So Consideradas Arquitetura do Aplicativo? ' .. .
Arqu iteturas Viveis na Platarorma .NET . ... . ... .. ...... .. .. . .... .
Os Trs Elementos de Qualquer Aplicat ivo'" ......................
Quantas Camadas? .. .. .. . .... . .. .. .. .. ... . ... .. . .. . .. ... .
Windows DNA . .. ... . .. ... .. .. ... . .. ... . ... .. . . .. ... .. .
Onde a Platarorma .NET Se Encaixa? ... . .. ... . ... .. . . .. ... .. .
Escolhendo uma Tecno logia de C liente" . .. ... . ... .. . . .. ... .. .
Decid indo Que Arquitetura Usar ' ...............................
Fatores Essenciais Que Influenciaro Sua Deciso' ....... . ........ ..
Exemplos de Cenlrios' ........................... . . .........
Resumo' .. .. ... . ... .. .. . ... .. .. .. .. .. ... . ... .. . .. ...... .. .
P&R .. . .. ... .. . ... .. . .. . . . . . .. . .... . ... .. ...... . . ..
Workshop' .... . . . ........... .. ............... ...... . ..... ....
Teste' ....................................................

127
128
129
133
133
134
134
135
136
138
139
141
145
145
146
146

O Que Fazer Quando Programas Bons Apresentam Problemas e para


Se Certificar de Que Isso No Acontea

147

Tratamento de Excees Estruturadas' ..............................


O Que o Tratamento de Excees Estruturadas?' . .. ... . . .. . . . ...
Erros e Excees .. ... . ... .. .. .. ... . .. ... . ... .. . .. . ... .. .
O Bloco Try' .. . ... .. .. . .... . .. .. .. .. ... . ... .. .. ...... .. .
A Seo Catch' ...........................................

148
148
148
149
149

Aninhando Blocos Try . . End Try 155


ASeoFina l ly 156
Lanando Excees . .. . ... ... . .. .. .. .. ... . ... .. . . .. . .. ... .. . 157
Depurando ' ... .. . ... .. . .. .... . . . . .. ... . ... .. . .. . . . .... .. . [57
A fonte dos Erros' . ... . .... . .. . .. .. . . . . . ... . . ... . ... ... . 158

A prenda Visual Bas ic .N ET em 21 Dias

XII

Aprendendo a Depurar com a Prtica' ..... . ... . ...... ... ....... . ..


Os Modos na Vida de um Programa ' ... . ...... . .. . . .. .... . . . . .
Percorrendo Seu Cdi"o ' . .. .... .. .... ...... ....... . .... .. .. .. .
"
Exam inando as Variveis'
.. ... . .. ... . ..... . .. . . .... . . .. .. .
Outras Ferramentas para Depurao' ..... . ..... ..... . ...........

159
167
165
[68
172

Resumo ' ........................... . . ... . .... .. ..... ..... 173

P&R .............................. .. ... . .... .. . ... . ..... 173


Workshop .. .. . . . .... . . . . . .. . . .. . .. . . .... . ... . 174

Teste 174

Exercfc ios .. . ... . ........ . ... . ............ . ... . .. .. . .... . 174


Dia 1

Trabalhando com Objetos

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

SEMANA 2 Viso Geral

203

Dia 8

Introduo ao .NET Framew ork


205

O Que E o .NET Framework?' ....................... . .......... . 205

Classes Importantes do .NET Framework' .. . .. ... . ... .. .. .. . ... .. . 206


Console ' ... .. . ... .. . .. ... .. .. ... . .. ... . ... .. .. .. . ... .. . 206
Resultados Ma is Simples . .. ... . .. ... . .. ... . ... .. . . .. . ... .. . 207
Envi ronment (Amb iente) ....................... . .......... 212
Random . ... .. .. .. .. . ... .. .. . . . . .. ... . ... .. . . . .. . .. 213

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

Desenvolvendo uma Interface com o Usurio com os Formulrios Windows

Viso Geral dos Fo rmulrios Windows' ... , ... , , . , , , .. , .... , , .


Criando um Aplicativo com Fom1Ulrios Windows' , .. , , ....... . , .
Configurando o Projeto' , , .. , , .. , , ...... , , , . , , , ... .. . ...
Adicionando Controles ao Fonnulrio ... , ... , , .. , , ... .. . . . .
Nomeando Seus Controles . ....... .. .. .. ... . ... .. .. .. ... .
Manipu lao de Eventos . .. .. .. .. ... . .. ... .. .. .. .. .. ... .

225

, , , .. , 225
. , , ... 227
. , , .. , 227
. , , .. , 228
... . .. 229
... .. . 229

Criando Vrios Manipuladores de Eventos para um Unico Evento , . ... .. . 23 1


Encontrando Objctos c Eventos por Meio do Editor de Cdigos' , , . , , , .. , 232
Mltiplos Eventos com um Manipu lador . .. ... . ... .. .. .. ... . .. ... . 233
Mais In fomlaes sobre os Controles .. ... . .. ... . ... .. .. .. .. .. ... .. . 233
Criando Grupos de Botes de Opo .. .. .. ... . ... .. .. .. . . ....... . 234
Adicionando uma Ca ixa de Seleo ao Exemplo de Fi 1er .. .. . .. . ... . .. 236
Va lidao de Entradas' ... , ... , , .. , , ... , ... , , . , , , ...... , , , . , , .... 238
Usando a C lasse MessageBox .. , , .. , , ....... , , . , , , ....... , , . , , ... , 24 1
Parmetros' .. , .. , , ... , .... , .. . . , .... , ... , ... ... ... , , .. . 242
Obtendo Resultados .. .. . ..... . . . .. ... . ... .. . .. .. . ... .. . 243
Controles Ocultos . .... . . . . . . .. .. .. .... . ... .. . .... .. . .. 246
Timer' . , ... . , ... , .. . . . ' , . .. . .. ... ' ... .. .... . , ... 247
Noti fy l con . , , .. , , .. , , ... , , . , , . . . . . . ... . , ... .. .... . , , .. ,248
ErrorProvi der' . , , .. , , .. , , .. , , .. . . . ..... , .... .. .. . .. , , .. , 249
Controles das Caixas de Dilogo ... .. ........ . .. .. ... . .. .. .. . 250
Construi ndo Suas Caixas de Di logo .. .. .. ... ..... , .. . . ..... .. .. . 254
Criando a Ca ixa de Dilogo ...... ... . .. ....... .. . . .... . . .. .. . 255
Con figurando o Resultado da Caixa de Dilogo' , . , , , .. , .. . ... . , , .. , 256
Exibindo a Caixa de Dilo"o' . , , .. , ... , ... , , .. , , ... .. .. .... , .. , 257
Resumo' .. ... .. . ... .. .." . .. , ........ .. ... . ... .. . .. . ... . . , .. . 259
P&R .. . .. ... .. . ... .. .. . ... . .. .. . .. ... . ... .. . ... ...... .. . 259
Workshop .. .. . . .. .. .. .. ... . . . . .. ... . ... .. . . .. ...... .. . 260
Teste' , , ... , , .. , , .. , ... , , , . , , .. , ... , , .. , , ... .. . , , . , , , .. , 260
Excrcfcios ... , .. , ... .. ... , .. .. , .... , .. , , .... , .... , ... 260

XIV

Aprenda Visual Basic .NET em 21 Dias

Dia 10 Construindo a Interface com o Usurio com os Formulrios da Web


263
Modelo de Programao da Web . . ................. . ............. 263

ASP,NET ........ . ................................. 265


Como a Criao de Programas com Base na Web Difere da de Programas com
Base no Windo ws ' .. .. .. . ....... .. .. .. ... . ... .. .. .. ....... .. . 266

Usando os Controles-padro dos Formu lrios da Web ... .. .. .. ... . .. . . .. 268


Usando os Controles Avanados dos FomlU lrios da Web ..... . ..... .... 277

Usando os Controles Va 1i dator ........................ . . .... ... . . 279


Resum o ' .. ... .. . ... .. .. . ... . .... .. . .. ... . ... .. .. . ...... .....
P&R .. . .. ... .. . ... .. .. . ... .. . . ....... . . .. . . ...... .. . ..
Workshop .. .. .. . ... .. ... . .... . ... . .. .. ...... .. . ..
Teste' ..................... . .. . . . . .... . ..... .. ..... .....
Exerc c io' .................................................
Dia 11 Introduo aos Bancos de Dados

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

Dia 13 Usando o Server Explorer

0.0

357

O Que o Server Exp lorer .. . ....... . .. ... . ... .. . .. . ... .. . 357


O Que um Servio?' . .. o ....... .. .. . o ... .. .. .. .. .. ... . ... . .. 359
Examinando os Servios' 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 o359
Caminho a Ser Percorrido para Estabelecer uma Conexo com o Banco de Dados
. . . o. . o. . . . o. . o o. . . o. . . . . . . o. . . o. . . . o. . . o. . . o. . . . . . . o o. . . 363
Trabalhando com os Servios' ....... .. .. .. ... . ... .. .. .. ... . ... .. . 364
Visualizando os Serv ios' .. ... . ... .. ... o ... . . .. o . o. o o .. o .. 365
Conectando-se com Outro Servidor' o.. o . .. o . o. o . oo o o oo o o . o. o o. o . o366
Escrevendo Programas Que Usam os Servios' .. o o.. o o... o... o o.. o o.. o366
Escrevendo Cdigos de Acesso a Dados com o Server ExploreI' . o o. o o o.. o366
Resumo' .. ... .. . ... .. .. .. ...... ... . .. ... . ... .. .. .. ... . ... . .. 379
P&R .. . .. .. ... . ... .. .. .. .. .. .. .. .. ... .. . ... .. .. .. .. .... . . .. 380
Workshop' . ... .. . o o. o o .. o.. o o. . .. . o o. o o .. o . . 380
Teste' 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 o380
Exerccios' .. o.. o o.. o.... o o.. o... o... o o.. o... ... o . o.. o380
Dia 14 Introduo Programao Orientada a Objetos

Viso Geral da Programao Orientada a Objetoso o o. o o o.. o...


Comparando a Programao Orientada a Objetos com a Linear'
Usando os Objetos na Organ izao do Cdigo .. . ... .. .. ..
Conceitos Importantes na POO o ... . .. ... . .. ... .. .. .. .. ..
Classes, Objetos e Instncias o o o. o o o.. o... o o o. o o.. o ..

381

o o o. o o o. o o381
... . . .. .. . 387
... . o .. .. . 384
o .. o o .. o . . 385
o.. o o o. o o385

XVI

Aprenda Visua l Basic .NET em 21 Dias


Propriedades' ..... . . .. ... ... .. . . .. . .. . ..... .. ... ....... 387
Mtodos ' .. ... . .. . .. ... . . . . . . . . ... .. .. . . .... . . .. . .. 388

Herana' ... .. .. .. .. .. .. ... . .. ... . ... ... ..... ... ...... .. .. . 389
Construtores' .. . ... .. .. . ....... .. .. .. ... . . .. .. ... ...... .. . .. 393
Projetando um Aplicativo com o Uso da roo .... . . .. .... .. .. . ....... 396
Ident ificando os Objelos ................... . . ... .. ... ....... 397

Determinando as Propriedades e Mtodos' ..... . . .. .... .. . ... ...... 398


M odelando Seus ObjclOs' . . ........ . ... . . . .. . .. . .. .... . .. . .. 399
Resumo . .. ... .. . ... .. .. . ... .. .. .. .. .. ... . ... .. . - ..... .. . 400

P&R .. . .. .. ... . .. ... . ... .. .. . . . . ... .. .. .. .. . ... . .... .. . 400


Workshop' ................................................ 400
Teste' ...................... .............. .. ......... 401
Exercidos .. .. . .. .. .. . ....... . .. ... .. .. .. . ...... .. . 40 I
SEMANA 2

Reviso

SEMANA 3 Viso Geral


Dia 15 Criando Objetos no Visual Basic .NET

403
405

407
...... 407
. .. .. . 408
. .. .. . 408
. .. .. . 410

Criando Objetos .................................. .. . ...


Declarando uma Classe Nova no Visual Basic .NET .. .. .. ... ..
Herana' ... .. . ... .. .. . ....... .. .. .. ... . ... .. .. .... .
Adicionando Propriedades ' . ....... .. .. .. ... . ... .. . .. ... .
Usando Rotinas de Propriedade para Validar Dados' ...... .. . ... ...... 413
Criando Mtodos' . ... .. .. .. .. .. ...... ... . ... ... . ... . .. .. ... 41 7
Adicionando Eventos' ........................... .. . ... ...... 423
Defin indo e Usando Interraces' ..... .. . . .. ... . ... .. .. .. .. . ... . . 425
Usando os Objetos Que Voc Criou' ................... . . .. .. .... 434
Espaos de Nome' .. .. .. . . . . ... . ...... ... . ... .. . .. . .. . ... ... 434
Criando e Usando urna DLL da Biblioteca' ............ . .......... 436
Resunlo . .. ........... .. ....... . ....... .. . ... ... . .. . ... ... 438
P&R .. . .. ... .. . ... .. . ... .. .. .. ... . .. ... . ... .. .. .. . ... . .. 438
Workshop' .............. . ......... . ....... .. .. ...... .. . 438
Teste' .. ... .. ...... . ... .. .. .. . . ... .. .. .. .. . . ... .. .. . 438
Exerccios' .................... .. ............. .. .......... 439

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

Dia 16 Formulrios Windows Avanados

S um rio

XV II

Adicionando o Fonnulrio pai ............... . .... ... .. . .. ..... 450


A MD I e os Menus ' ... . ... .. .. .. ... . .. ... . . . .. . . .... .. . . . . . 45 1
Controles Avanados dos Formu lrios Windows' .. . . . .. . . ...... .. .. . 458
TreeView 459
ListView 462
Controles Splitter 463
Resumo ' ............... . ... .. . .. . .. . .... .. . ... ..... 470
P&R
Worksho p
Teste
Exercc ios' ..................




.. .............




.. .........

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

Dia 17 Usando o .NET Framework

Teste 510
Exerc cios' ... . ... .. .. . ..... . . . .. ... . ... .. . .. ...... .. . 5 10
Dia 18 Retoques Finais

511

Documentando Seu Aplicativo' ....... . .. ... . ... .. .. .. . ... . .. 5 11


Crie So lues Mais Simples ' ... . .. .. .. .. ... . ... .. . . .. ... .. . 5 12
Evitando Conjecturas' ........................... . .......... 515
No comente o bvio, S6 o Que For Confuso' .................... 516
Documente o Sistema, e No Apenas o Seu Cdigo ...... . .......... 516
Melhores Prticas e Padres de Cod ificao ' . .. ... . ... .. . .. . . .. ... .. . 5 18
Nomeao de Variveis, Controles e Objetos ' ... . ... .. . . ... .. . .. . . . 519
Blocos de Comentrio' . .. . ... .. .. ... . .. ... . . .. . .. . . . .. .. . .. 52 1
Usando o Controle do Cdigo fontc ................. .. .. .. ... ... 522
Extraindo o Cdigo' ............................ .. ...... .... 522
Annazenando o Cdigo' .. . ....... .. .. .. ... . ... .. .. .. ... . . .. .. . 526
Visua lizando e Retomando Suas Alteraes'" .. . ... .. .. .. ... . . . 528
Cons ideraes sobre Segurana no Uso do Visual Source Safe . . . .. .. . . . 529
Resumo' .................................................... 529

Aprenda Visual Basic .N ET em 21 Dias

XVIII

P&R ..... .. .. . ...... .. . . ... . .. . .. . .... ... . .. ....... 530


Workshop' . ... .. . ... .. .. . ...... . . . . ... . . ... . .. . . . . .. . .. 530

Teste' . .... .. .. .. .. .. .. .. . ... . . ... . ... . . .. .. ... ..... . .. .. . 530


Dia 19 Implantando Seu Aplicativo
53'
Int roduo Implantao ' .. . ....... . . . . .. ... . ... .. .. . .. . ... . .. 53 1
Criando uma Instalao Simples . .. . . .. .. ... . .. .. . . ... . . . .. .. . 533
Crie o Projeto e a Soluo ' . ....... . . .. .. ... . . .. . .. ... .. . .. .. 533
Arqu ivos de Configurao' ......... .. . .. . .. . ..... ... . .. . ...... 540

Implantaes de Mltiplos Projetas ' . .. . .


Resum o' .. ... .. . ... .. .. . ... . .....
P&R .. . .. .. ... . ... .. .. . ... . ... . .
Workshop' ....... . . .... .. ... .
Teste' ........... .... . ... ..
Exerccios ......... . . .. ... ..

... . .... ... . .. . . . . .. .. . 542


... . ... . . ... . .... . . .. . .. 545
....... . . .. .. ...... .. . .. 545
. . . .. .. .... .. . ... ...... 546
. . . . ... . ..... . ...... ..... 546
. . .. . . . . ..... .. . .. . . ..... 546

Dia 20 Introduo XML


,

547

O Que E XML? ....... .. .. ... . .. . . .... .... .. . .... .... . 547


E[ementos .. .. . ... .... . .... ... . ... . . .. . . ...... .. .. . 55 1
Atributos' .. .. . ... .. .. . ... .. .... . . . . .. . . . ... .. . .. 552
Esquemas' . ... . ... .. .. . ..... . ....... . .. .. ...... .. . .. 553
Trabalhando com a XML ............. .. . ..... . .. .. .... ...... 556
O Document Object Model .......... . . .. ... . .... .. . .... ..... 556
Objetos de Leitura e de Gravao' .... . . .. . .. . .... .. . .. . .... . . 559
LendoXML ,, 56 1
Gravando XML . .. ... .. . ........ . . . .. ... . ... .. . . . .. . ... .. . 566
Resumo . .. ... .. . ... .. .. .. ... . . . . . .. ... . ... .. . . . ...... .. . 569
P&R .......................... . .............. .. .......... 569
Workshop' .... .. . .... . .. ... ..... ... ... . ... .. . .. . ... . .. 571
Teste' .. ... .. . ... .. . .. ... .. .. .. .. .. ... . ... .. . . .. .. ... . 571
Exercc ios' ... . ... .. .. . ....... .. .. .. ... . ... .. .. ...... .. . 57 1
Dia 21 Criando Servios Web com o Visual Basic .NET

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

Um Servio Web Mais Complexo


Criando o Servio' .. .. .
Testando o Servio Web'
Criando o Cliente ' .. .
Adicionando o Cdigo

Resumo

P&R ..


Workshop '

Teste' .
Exercfc ios

. . . .. . . .. . ...

. . . .. . . ... .. .
. . . .. .

592

600
604

605
605
605
605

SEMANA 3 Resumo

606

Apndice A - Respostas dos Testes/ Exerccios

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

A prenda Visual Bas ic .NET em 21 Dias

Respostas do Dia 11 ... ... ..

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

Respostas do Dia 15 ....... . ....... . .. .. . .... ....


. . . . .. .. .. . ..
Teste' .. . . . .. . .. . . . . . . ... .. ..
Exerc cios
. . . . . . . . . . . . . . .
. .. . ... .. . . . ....
Respostas do Dia 16 ' . ... . . . . ... . .. . .. ... . ... .. . . .. ... . . .
Teste ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...... . . .
Exerc c ios' . . . . . . . . . . . . . . . . .
. . .. . .... . .. . .. . . . ...... . ..
Respostas do Dia 17 . . ... . ... . . .. . .. ... .. . .. . .. . .... . ... ... .
Teste' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. ... .. .
.... .. . .. . ..
Exerccios
... .. . . . .
. .. . . . . . . . . . . .. . ... .... ..
Respostas do Dia 18 . ... . .. .. .
Teste' ............. . .. .. . .. . .. .... . ..
Respostas do Dia 19 ..... . .. .. . . . . ... .... ..
.. ..
Teste' .............. .. .. . . . . .

........ ..... .. ..
..
..

.. . ..
..... . . .. . . .


Exerc cios
Respostas do Dia 20 .. . ... .. . . . . . . . .... . .. . . .... . . .. .
Teste ' .. ... .. . ... . . ...
. .. . . ...
. ... . . . . .

Exerc c ios ... .. .. ... .. . .. . .. . .. .....


. ... . . . . .
Respostas do Dia 21 .. .. . .. .
.. . . . . . .
Teste' .. . . . .. . ... .. . . . . . .. . .. .. ... . . .. . . ... . .. .. .
ndice

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

Aprenda Visua l Basic .NET em 21 Dias

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.

Quem Deve ler Este livro?


Embora o objetivo principal deste livro sejam as pessoas iniciantes na at ividade de programao
em geral e no Visual Basic .NET especificamente, ele ser t il a uma variedade maior de leito
res. Se vocj for um programador do Visual Basic, ento, procure nos diversos tpicos do livro
algumas das timas explicaes e exemplos que envolvam os novos recursos. Ser possvel per
ceber que h mu itas diferenas no universo do Visual Bas ic 6.0, e o nvel de abordagem forneci
do neste li vro deve ajudlo a fazer a transio.
Se voc j for um programador experiente que no conhece o Visual Basic, poder ficar tentado
a saltar ou ler de modo superficial grande parte das primei ras Iies. Independentemente de seu
nvel de habilidade, ser bom examinar com detalhes a introduo (Dia I) para compreender o
conceito geral da plataforma .NET e a abordagem do IDE (Dia 2) para ganhar ve locidade ao tra
balharcom o Visual Studio .NET. Em seguida, poder passar pelo resto do livro com seu prprio
ritmo, verificando por alto algumas das sees que abordam conceitos gerais de programao e
se dedicando aos captulos que explicam como o Visual Basic .NET realiza tarefas avanadas,
como a criao de objetos, o acesso a bancos de dados e a gerao de aplicativos na Internet.

o Que Voc Aprender


Este livro ensi nar a voc como criar vrios tipos di ferentes de aplicat ivos usando o Visual Basic
.NET, incluindo tanto os cliente/servidor quanto aque les com base na Web. Quando passar pe los
tpicos sobre o Visual Basic .NET, tambm aprender muito sobre o .NET Framework e conhe
cer alguns servidores .NET, inclusive o SQL Server e o Internet Informati on Services.
No que diz respeito ao projeto e arquitetura, voc aprender sobre os recursos orie ntados a ob
jelos do Visual Basic .NET, como, por exemplo, a criao de classes e o uso de objetos, alm dos
princpios bsicos da herana, sobreposio, anulao e outras funciona lidades avanadas fome
cidas por esse tipo de programao.
Na etapa de desenvolv imento que envo lve a interface ou sada, voc aprender a criar aplicat i
vos ' Windows' por meio dos novos recursos de formulr ios do Visual Basic .NET, a construir
interfaces com base em pginas da Web usando fo rmulrios da Web e a gerar um servio simples
disponvel na Web que podera ser utilizado por qualquer linguagem ou plataforma de programa
o capaz de acessar a rede e compreender a XML.

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

Sistema operac ional


Windows XP Professional, Windows 2000 (Dalacenler Server,
Advanced Server, Server ou Professional) ou Windows NT 4.0 Server. O Visual Stlldio se
encarregar da instalao de qualquer pacote de servios. arquivos atllalizados de acesso a
dados e da verso 6 do Internet Explorer, todos sendo req uisitos para o Visual Studio .NET.
Hardware Pentium II com 450 Mhz ou equ ivalente, 128 MB de RAM, placa de vdeo
com capacidade para resoluo de 800 x 600 pi xels, 256 cores e no mn imo I OB de espao em disco rgido. Uma unidade de CD-ROM necessria para instalao, mas voc
pode colocar seus CDs em out ra mquina e instalar por meio de uma conexo LAN.

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

Ap renda Visua l Bas ic .NET em 21 Dias

Habilidades Que Voc Precisa Ter


Este um livro destinado a programadores iniciantes, mas algumas habilidades bs icas so necessrias. Espera-se que voc esteja familiarizado com o uso de computadores com base em
Windows, incluindo o sistema operacional que esti ver instalado para executar a platafonna .NET.

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 .

Alm desse conhecimento bs ico em computadores, voc no precisa ser um programador ou

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.

Layout dos Captulos


Vinte e um dias um perodo longo, portanto, alm de dividir as lies em dias, organizamos o
livro em sees com durao de trs semanas (ou partes). Na primeira parte, nos dedicaremos a introduzi-lo nos conceitos gerais de programao e da platafonna .NET, e abordar a sintaxe e tcnicas bsicas para a criao de programas COI11 o Visual Basic .NET. Na segunda parte nos
aprofundaremos no .NET Framework para fomecer uma compreenso mais detalhada dessa base
essencial de toda a programao e tambm discutiremos os fundamentos da criao de programas
reais, como a maneira de gerar uma interface com o usurio (com formulrios Windows e da Web)
e como trabal har com bancos de dados. A llltima pm1e introduzir alguns dos tpicos mais avanados da programao .NET, incluindo a cfiao de seus prprios objetos, a implantao de seu aplicativo nos computadores de outras pessoas e o trabalho com a XML e os servios da Web. Como
falamos anteriormente, tente percorrer essas lies em ordem, mas fique vontade para saltar
adiante se houver um tpico sobre o qual queira muito ler mais no momenlo que desejar.

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.

Convenes Usadas Neste Livro


Este livro usa vrias convenes para ajud-lo a priorizar e recorrer s informaes que ele contm:

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

As dicas rea lam as informa es que podem tornar sua programao no VB


mais eficaz.

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

. .. e ruins que devem ser evitadas.

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

Os cones Cdigo so usados em exemplos de cdigo que o usurio deve inserir.

ANLISE

Os cones Anlise apontam para discusses com explicaes sobre os exemplos de


cdigos.

o cdigo apresentado em fonte monoespaada.

SEMANA

Viso Geral
Durante esta parte, voc aprender varias tpicos essenciais:

O Visual Basic .NET c o conceito de programao (Dia 1).

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

Organizao e projeto de uma soluo no Visual Basic .NET (Dia 5).

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 programao e por que seria interessante aprend-la?

Como o Visual Basic se encaixa em tudo isso?

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.

A Funo dos Sistemas Operacionais


Para fornecer essa camada bsica de funcionalidade nos equ ipamentos, os sistemas operacionais
foram criados. Eles mesmos so programas de computador, mas sua funo manipular todos os
detalhes de gerenciamento de memria, entradas/sadas do disco (E/S) e outras tarefas de nvel
inferior. Quando h um sistema operacional (OS, Operat ing System) em um computador, outros
programas podem ser escritos que no tenham de lidar com todos os detalhes de nve l inferior; se
os programas precisarem abrir um arquivo ou formatar um d isquete, podero solicitar ao sistema
operacional que execute essa funo para eles. Examinando isso graficamente (veja a Figura
1. 1), voc poder vis uali zar as relaes entre o hardware do computador e o sistema operacional,
ou desse com outros programas, como vrias camadas de funcionalidade.

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.

Aplicativo do Usurio (incluindo seus programas!)

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-

Be m -Vi n do ao Vis u a l Basic .NET

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

p.,tef ... Gr~lcel Use. Interf~e.

UseI' Ime/faces.

fme/faces gr4ficas com


o usurio) como esta
caixa de dilogo. o que
fa= pane do. servios
que ele fornece aos
programas.

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.

o Papel das linguagens de Programao


Ento, agora voc sabe o que o sistema operacional fornece, mas e os programas propriamente
ditos - como so criados? Antes, neste captulo, defini um programa de computador como um
conj unto de instrues para o hardware. J que o hardware s pode real izar operaes re lativamente fceis, as instrues tambm devem ser simples. O resultado final do programa um cd igo que o hardware pode entender, chamado com freqnc ia de linguagem de mquina ou cdigo
nativo. As instrues, depois de carregadas na memria pelo sistema operacional , so compostas
de comandos como "transfira a memria de um local para outro" ou "execute uma funo matemtica com os valores". Milhares desses comandos formam um programa comp leto.

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

o processo de converter uma linguagem de computador de alto nve l em cdigo de

mquina ou nativo conhecido como compilao. Os programas que fazem essa


converso so chamados de compiladores.

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

simplista decla rar que as linguagens de programao evoluem apenas para


tornar o desenvolvimento mais rpido. A velocidade no desenvolvimento
apenas uma das motivaes por trs das melhorias que ocorreram. Outros objetivos e resultados so a produo de aplicativos mais rpidos ou estveis (com
menos falhas ) ou at mesmo a criao de aplicativos mais fceis de instalar.

Originalmente, a maioria das linguagens de programao era composta de apenas um item, um


compilador. O programa era criado com o uso de um ed itor de texto, como o Bloco de notas, e o
compilador era executado, passando o nome do arquivo ou programa-fonte. Em seguida, ele produziria o resultado final , um programa executvel, pressupondo a inexistncia de erros. O resu ltado compilado era executado, testado para a verificao de erros e, ento, voc voltaria a seu
editor de texto para fazer alteraes no cdigo. Ele seria com pi lado mais uma vez, e o ciclo se repetiria. Esse processo de desenvolv imento (veja a Figura 1.3) no era de uma linguagem especfica; era uma atividade comum para todos os programadores.

Bem-Vindo ao Visual Basic ,NET

FIGURA 1,3

Os compiladores
eOlll'erlem o
cdigo-fonle de
lillguagells de alIo nirel
em instrues qlle o
computador possa
compreender.

" , (crie/Edite o Cdigo)

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

O Visual Studio 11m


IDE quefomece lima
ime/face nico para
qualquer lipo de
linguagem, inell/sire
para o Visual Basic.

,
"'. . 01 .

.... """

r. ".c".. ,................,

.... . _""o U

... . .

CO_I . ' ' ' '~," <0< <o ""."0. . . . . '


OO _ ' . . . . . . C, . . 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.

Por Que Escrever Programas de


Computador?
Mencionei antes que a pergunta mais comum que ouo : "O que faz um programador de computadores?" . Depoi s de ter explicado o conceito geral do trabalho, quase sempre ouo a segunda
pergunta mais com um, " Por que voc iria querer fazer isso?" . A resposta, "Porq ue divertido escrevercdigos", parece nunca satisfazer as pessoas. Portanto, j que comeamos a aprender aescrever programas, vale a pena ded icar um pouco do tempo considerando o que iremos escrever e
por qu.

Be m-Vi ndo ao Visual Basic .NET

FIGURA

1.5

As jerramenlas I'isuais
de desellvolvimenlo

[dt"-~""'_ry-l'"
tJ ~
~
Sl -l;t

1iI"

... . . .

peJ'mi/ell/ que voc crie

inlelfaces graflcamenle
e. elll segl/ida. ge/'e o
cdigo lIecessrio.

.... ,

A primeira coisa a compreender sobre programao de computadores o tipo de programa que


ser desenvolvido. Quando solicitada a dar exemplos de aplicativos, a maioria das pessoas responde com programas como o Microsoft Word ou o Excel, algumas podem mencionar jogos de
computador e muito poucas incluiriam o prprio Windows na lista. Todos esses so definitivamente aplicativos de computador e algum tem de program-l os, mas a categoria maior de programas a que quase nunca mencionada. Os programas mais comllns so os sistemas que
vemos a toda hora. A menos que voc esteja interessado em (ou obcecado por) programao, no
pensa com freqncia nos meses ou anos da vida do programador que so gastos no desenvolvimento. Esses programas, como o sistema de computador na locadora prxima ou o programa
que o governo local usa para rastrear licenas de motori sta, so desenvolvidos para um nico cliente ou um pequeno nicho de mercado. Fora de seu universo de apl icao, no so to diferentes de
softwares prontos como o Microsoft Word. No entanto, sua natureza ind ividualizada sign ifica
que h uma taxa mu ito alta de trabalhos de programao por cliente.
A funo de um programador abrange muitos aspectos diferentes no desenvolvimento de soft\Vares, principalmente no mundo do software personalizado. Mas o ciclo do desenvolvimento de
soft\Vares (SOLC, Software Oevelopment Life Cyc le) contm vrias outras elapas essenc iais
(veja a Figura 1.6).
Antes de a cod ificao comear, deve-se saber que o novo sistema destinado, isto , seus requisitos. Essas info rmaes devem se tomar uma planta geral para o aplicativo de computador,
ou seja, o projeto . Podemos dizer que essa planta , em li nhas gerais, uma interpretao das necessidades do cl iente na fo rma de partes de um sistema de computador, e mais tarde se tornar o
guia por me io do qual o programador trabalhar. O resultado desejado um sistema de computador que atenda s necessidades originalmente especificadas pe lo usurio. Esse sistema completo

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

O de/o de vida de 1/111


projeto de
de.~en\'oll'illlel1lo de
software passa por
vrias etapas dis/imas.

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.

Um Breve Histrico sobre o Visual Basic


A histria do Visual Basic na verdade comea com a inveno do BASIC (Beginner's
A ll-purpose Symbol ic Instruction Code) em 1964, uma linguagem que facilmente assi milada e
usada por programadores iniciantes. Essa Iinguagem se tornou popular, e, durante os 15 anos seguintes, vrias pessoas e empresas criaram compiladores e interpretadores para o BASIC.
Em 1975, quando a Microsoft era uma empresa nova, uma verso da linguagem BASIC foi um
dos primeiros produtos que ela c riou, e que se tornOllllm sucesso. O BAS IC da Microsoft e seu
s ucessor, o Quick BASIC (ou QBASIC, como tambm conhecido), se transformaram nas verses do BASIC mais amplamente disponveis nos PCs. Elas ainda possuem uma quantidade bastante grande de usurios (se voc estiver interessado, acesse o endereo http: //www . qbasic . com
para obter recursos e Iinks sobre essa linguagem). O Quick BASl C estava disponvel para Windows quando foi lanado, mas era necessrio um trabalho considerve l para cod ificar uma inter-

Be m-Vi ndo ao Visual Basic .NET

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

Visllal Bosic paro


Windows fornecia
IIIlIilos dos recursos
essel/ciais COIIIIII/S em
vrias jcrromcmos
ali/ais. e

//Iais

.. -

imp0l'lome foi sua


forma 1'isllal de
a/'/'asta/' c solta/' IIsada
no descl/vohimcllfo.

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

Bem-Vindo ao Visual Basic .NET

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

Na verdade, o Visual Basic .N ET possui um nmero real de verso, 7.0- s que


ele no muito usado. Da mesma maneira como o Windows 2000 na realidade a verso 5.0 do Windows NT, quanto mais simples ou assimilvel o nome,
mais ele usado. No entanto, no espere ouvir Visual Basic 7.0 com freqn da; havia at uma penalidade em dinheiro dentro da Microsoft para quem se
referisse ao Windows 2000 como NT 5.0.

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 lIIais do que


apenas um i/em: UI1l
cOIyllnlO de .wjilrares e
cOl/ceitos qlle
fUllciollam juntos para
permilil' a criao de
solues para
empresas.

Aplicativo do Usurio (in cluindo seus programas!)

.NET Framework

Servidores .NET
Windows, BizTalk, Exchange, SQL, App Center.
Dispositivos .NET

Componentes de Hardware

14

Dia 1

Servidores .NET

o pri nc ipal objelivo do conceito .NET diminuir o desenvolvimento de sistemas di stribudos,


nos quais o trabalho feito em vrios locais difere ntes. Em geral, esse tipo de sistema faz seu trabalho no back-end, no nvel do servi dor. A Mi crosoft fornece um conjunto de softwares quejun-

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 sistema operacional do serv idor, o Microsoft Windows (Server, Advanced Server e


Datacenler Server)

So ft wares de agrupamento e balanceamento como o Microsoft App Center e o Microsoft


Cl uster Server

Um servidor de banco de dados, o Mi crosoft SQL Server

Um sistema colaborat ivo de correio eletrnico com armazenamento de informaes de


fo rma li vre, o Microsoft Exchange Server

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.

Bem-Vindo ao Visua l Basic .NET

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

Aplicativo do Usurio (incluindo seus programasl)

.NET Fremework

Sistema Operacional

Componentes de Hardware

Para uma linguagem de programao se beneficiar do ambiente de tempo de execuo e outros


recursos do .NET Framework, o compi lador deve produzir um cdigo que adote um certo padro. A Microsoft fornece esse padro, o Common Language Specification, como uma maneira
de fazer com que qua lquer compilador possa ser usado na plataforma .NET. Ela criou os compiladores do Vis ual Basic, Vi sual C++ e C# que se destinam ao .NET Framework, mas (ambm
disponib ilizou o Common Language Especification fora da Microsoft de modo que outras empresas pudessem desenvolver compi ladores para outras Iinguagens. O resultado que, alm das
linguagens fornecidas pela Microsoft, muitas outras existentes (como o COBOL, APL, Smalltalk e assim por diante) foram desenvol vidas sobre exatamente a mesma base do Visual Basic.
NET.
Neste ponto, im portante distinguir os recursos fornecidos pelas linguagens e os proporcionados pelo .NET Framework. O Visual Basic e o COBOL compartilham todos os recursos do Framework, mas, j que so linguagens diferentes, tambm possuem suas prprias funes e
sintaxe exclus ivas. Ao dar prosseg uim ento leitura, voc aprender tanto sobre os recursos especficos do Visual Basic quanto os fornecidos pelo Framework.

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,

Windows 2000 '"'"''''''' , ' _


Servios di Web

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

ferrsment.e de deseovolvimenlO que d suporte" HTTP.

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

Bem-Vindo ao Visua l Basic .NET

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.

Desenvolvendo seu Primeiro Aplicativo no


Visual Basic .NET

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?".

Preparando-se para Codificar


Antes de realizar qualquer trabalho com o Visual Basic .N ET, ser preciso instal-lo. Voc deve
ter vrios CDs ou um OVO (dependendo de onde conseguiu o produto) pelos quais possa fazer a
instalao. Tambm possvel instalar de um local da rede, mas o processo basicamente o mesmo nos trs casos, sendo a principal diferena a alternncia de CDs se voc tiver a verso que
vem em vrios deles.
A primeira tela que voc ver quando inserir o disco I ou executar a instalao pelo CD ou pela
rede, ser um a caixa de dilogo que apresentar trs etapas distintas (veja a Figura 1.11 ).
A primeira etapa elevar os componentes do sistema operacional de sua mquina at o nvel que
a plataforma .NET exige. Isso chamado de Windows Component Update (WCU), e se voc der
um clique na primeira opo da caixa de dil ogo da instalao (veja a Figura 1.11), ser solicitado a fornecer o disco de WCU, se necessrio, e a instalao comear. O que visto durante a

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.

"" ......... _. 00"""" "'''"',

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.

Be m-Vi ndo ao Visual Basic .NET

19

FIGURA 1.12

Voc pode examinar e


selaciollar quais

compol/emes do Visual

II

SlIIdio .N ET deseja

il/slGlar.
Cj .... _ _ ... -

111 0 >< _ ' "


Iil~"""'"

".,.. ....w, ......... _ ........ , ,,,_o


L

.. ,,_.,_

O lil~ ' ''_.o._

Iil.v _ _ _ """"",--",
i/l.~ _""'_'_"

til i/l~ _""'sro


1II 1il ~ "' ....... _
___
ill~'
.
Iil

..

. ... .

_._.....

-..-_~ 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 ....... _ _

localmetl/e para que se

.... "" I , .... , , - ....:,


TI>O _ ..... ." _
... _

.
.
...
"" ..
........... ,,"'" ,.
-"... ............ ,... _.
.....

' """"'"'"'
""' ,, @ .
.....

oblenl1ll mais
velocidade.

, ... "") ""'.......... , , _ ..

_ _ 1'....,

. .... ..... (. _' a1

.--.. . . Io.''''... R....

, . ., . . 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

Se algo der errado

duranle a il/oSla/arao,
voc ser iIIfo rmado do
pr oblema neSla feIa.

Setup is complete.
':::~ ::;::.::':::~

..... "..... _ '..... ,... _.~" .. ,.H....

_~_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.

.,,"o! _,..,. , .. s _ _ " to ...... s.",,,,,, , "'.. uo', ..


, ..... ,,,,," _ .... ,.... , ... _ .. "",,", s...... lO<T, s ...............

............ " 01 " .................. ,~ , """"

"'0

OIOOM ... _ ' ' ' ' ' ' _ ' ' ..... s-c.Pod."'" ..... ",.
......
_ 1"'_ ... ""_ .. _ ......... ...
s...... P", .... ......
_~

"0.. ,mo.oo."

[a",.,

Bem-Vindo ao Visua l Basic .NET

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.

Onde Est meu IDE?


Agora estudaremos o Visual Studio .NET, um dos mais avanados pacotes de desenvolvimento
di sponvel , e seu primeiro programa vai ser elaborado com o uso do Bloco de notas e do prompt
de comando. Sim , exalamente o que leu, o prompt de comando. No incio desta lio, expliquei
que muitas linguagens de program ao eram compostas apenas de um compi lador. Em urna Iinguagem desse tipo, os programas so escritos como arquivos de texto e, em segu ida, o compilador chamado para converter esse cdigo (pressupondo-se que no tenham sido comet idos
en-os) em um programa executvel. Na maioria das linguagens, isso nunca foi alterado. A finalidade de um IDE fornecer um ambiente nico de trabalho, mas ele ainda estar usando a mesma
seqUncia de edio/comp ilao/execuo do processo manual. Antes do Visual Basic .NET,
urna linha de comando podia ser usada para compilaras programas, mas isso era o mesmo que
executar o IDE de modo no visvel. O Visual Basic .NET separa as duas funes , compilao e
edio, pelo fornecimento do compilador como um programa completamente distinto.
Com O IDE, voc nunca precisar examinar a compi lao. Ela ser manipulada de modo automtico, mas ainda assim ser executada. A principal diferena entre o compi lador do Visual Basic .NET e o de verses anteriores que aquele totalmente independente do IDE; no h nada
que voc possa fazer no IDE que no possa ser feito com o uso apenas do compilador da linha de
comando e o Bloco de notas. J que o IDE um programa grande e complicado, ser mais simples se concentrar na linguagem e trabalhar no nvel da linha de comando de tempos em tempos.
A lio de amanh - Dia 2, "Trabalhando com o Visual Basic .NET" - introduzir o IDE e percorrer os fundamentos de seu uso para edio, execuo e compi lao de seus programas.

Uma Tarefa Simples


Para criar seu primeiro programa, voc precisar de um objetivo, algo para ele executar. No minha inteno produzir programas "HelIo World!" neste livro, aqueles que no possuem uma finalidade. Isso particularmente difici I quando se tenta escrever o primeiro pequeno trecho de cdigo.
Novo

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 _

...

~---_
@ .... _.-.~

':!l __ '" ... ~ .........toO;;,;n

I!il -- _"''''''''l
~w

_ _

lfI __ f'I ....... ~ .:1


<1_~

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.

Execuo Passo a Passo


Sempre que voc escrever um cdigo, e principalmente quando fi zer algo novo, tente resolver o
caso em vrias etapas. Dessa maneira, ao se deparar com um problema, saber que partes do programa fun cionaram e quais no tiveram xito.
Na primeira elapa, voc se certificar de que pode criar um aplicativo por meio do compilador de
linha de comando. Para tanto, precisar de um cdigo, porm ele no precisar executar realmente nada. Apenas ter de apresentar o formato correiO. O cdigo a segu ir representa a estrutu-

Bem-Vindo ao Visua l Basic .NET

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
\

0ffI>0 " ""

'"'=\""'"
,"'-',
...........
,.. =',.....

a plataforma .NET

'","""'o.., .."" ''''

a IJarlil' de lili/O finha


de cOlI/ando.

--- .
_

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

Microsoft (R)Visual Basic.NET Compiler version 7.00.9254


for Microsoft (R) .NET CLR version 1.00.2914.16

Copyright Microsoft Corp 2001. Al1 rights reserved.


Visual Basic Compiler Options

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:

Voc rea lmente tem o Visual Basic .NET instalado.

Voc possui as permi sses apropriadas para executar o comp ilador.

O sistema pde encontrar o arquivo vbc. exe.

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:

Microsoft (R)Visual Basic.NET Comp iler version 7.00.9254


for Microsoft (R).NET CLR version 1.00.2914.16
Copyright Microsoft Corp 2001. All rights reserved.
Isso significa que a comp ilao foi bem-sucedida, e se voc estivesse examinando essa pasta
agora, por meio do Windows ou emitindo um comando OIR, veria que j h um novo arquivo
Stepl.exe. Processar esse executvel (dig itando Step I no prompt de comando e pressionando
Enter) no produzir nenhum resu ltado visvel, o que de esperar porque o cd igo de Stepl. vb,
na verdade, no tem uma fina lidade. O fato de que foi compilado e executado demonstra que ele
at aqui est correto.

Be m-Vi ndo ao Visua l Basic .NET

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.

Vejamos a Exibio do Resultado


Agora, lembrando-se de seu objetivo fina l de retornar a verso do sistema operacional, tente exibir algum texto. Antes de conseguir um resultado efetivo em um programa do Visual Basic
.NET, preciso informar ao compilador que partes, se houver alguma, do .NET Framework sero usadas. Nesse caso, ser empregado ape nas o root (raiz) ou o objeto do nve l superior do Framework, System, portanto, adicione a linha Imports System ao incio do arquivo de cdigo.
Agora voc pode se referir a esse objeto, System, e usar seus recursos em seu cdigo. Um dos
membros ou partes da classe System do Framework o objeto Conso I e. Esse objeto permite que
os usurios leiam e gravem atravs da interface de linha de comando. Nesse exemplo, empregue
a instruo Console,Wri teU ne para retornar algum texto jane la do comando. No importa que
texto ser retornado, apenas um teste de exibio de informaes. Em seu cdigo, foi uti lizado
o texto aqui que entraro as informaes sobre a verso do sistema operacional! para deixar
claro que esse s um espao reservado. Salve esse novo arquivo de cdigo alterado (que deve
se parecer com o cdigo a seguir) como Step2. vb e, em seguida, volte para ajanela do comando
a fim de compil-lo:
Imports System
Public Class Step2
Shared Sub Main()
System.Console .WriteLine(" aqui que entraro as infonnaes sobre a
verso do sistema operacional !")
End Sub
End Class
A instruo de compilao ser quase a mesma da etapa anterior, exceto por voc especificar o
nome do novo arquivo-fonte, vbc Step2. vb I t: exe. A execuo dessa instruo de compilao
produzir um arquivo chamado Step2. exe, que poder, em seguida, ser executado do prompt de
comando digitando-se Step2 e pressionando-se a tecla Enter. Se sua compi lao funcionou e no
houve problemas no cdigo, o resultado a seguir deve aparecer em resposta a seus comandos:

26

COOIGol
RESULTADO

Dia 1

C: \TYVB \C1>vbc step2.vb jt:exe


Microsoft {R)Visual 8asic.NET Compiler version 7 . 00 . 9254
for Microsoft (R) ,NET CLR version 1.00.2914.16
Copyright Microsoft Corp 2001. All rights reserved.

C: \TYVB \Cl>step2
Eaqui que entraro as informaes sobre a verso do sistema operacional!

Adicionando a Funcionalidade das Informaes sobre a Verso


Voc sabe que o cd igo est correto at este ponto (porque funcionou), portanto, ele fornece um
bom ponto de partida para a prxima etapa. O que precisamos fazer agora obter as informaes
reais sobre o sistema operacional e, em seguida, ex ibi ~las no lugar do trecho genrico de texto.
Teremos de usar o .NET Framework novamente para conseguir essas informaes, por meio de

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.

Usando o Compilador de Linha de Comando


Nos exemplos anteriores, voc usou um compilador de linha de comando para especificar dois
itens, o desti no dele (ft: exe) e o arquivo-fonte a ser compilado (step I . vb, por exemplo). O compilador fu ncionou muito bem com essas duas opes, produzindo automaticamente programas

Be m -Vi n do ao Vis u a l Basic .NET

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.

lout:<nomedoarquivo> usado para especificar o nome do arquivo criado. Em seus


exemplos, voc o omitiu, fazendo com que vbc empregasse o nome de seu arquivo-fonte
(Stepl. vb) para gerar o arqu ivo de sada (Stepl.exe, por exemplo).

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.

Iverbose faz o compilador produzir resultados mais detalhados durante a compilao e


pode aj udar a solucionar problemas.

Ireference:<nomedoorquivo> (abreviando-se temos Ir :<nomedoarquivo L1sado para


informar ao com pilador que seu cdigo requer alguns arquivos complementares alm do
que est includo como padro. Por exemplo, se voc quisesse trabalhar com as partes de
System.Web do .NET Framework, precisaria adicionar uma linha Imports System . Web no
incio de seu cdigo e, em seguida, especi ficar Ir: sys tem. web . dI 1 quando o compi lasse.

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

no Apndice A, " Respostas dos Testes/Exercc ios" .

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:

O IDE do Visual Studio

Solues, projetas e arquivos

Criao e execuo de um exemplo de projeto no Windows

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.

o IDE do Visual Studio


A finalidade do IDE (Integrated Development Environment, ou Ambiente Integrado de Desenvolvimento) ser um ambiente (mico de trabalho para os desenvolvedores. Em geral, o cd igo-fonte composto apenas de texto e poderia ser inserido e ed itado em qualquer ed itor de texto
(o Bloco de notas, por exemplo), e compiladores podem ser usados na linha de comando sem
muito problema, portamo, tecnicamente o IDE desnecessrio. Apesar disso, h poucos programadores que concordariam em trabalhar com uma linguagem que no possusse algum tipo de

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.

Trabal hando co m o Vis ual Bas ic .N ET

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

. _ ........ ........,.,..... '_.... '_1 "",,_

"QEI

.-

-....... . _..,... ...

....,,"' ,' ,., ..

. , ' " l ....

~--------

( ....... s-.....

I"',..' ,"'.

1.... , , ..- o.......

... ,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...

......

"''''

...

As opes laterais restantes apresentam :

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)

Um link direto para pesquisas na Web (Search On line)

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.... _

1'1. ~ " " .~ r..

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 ... _
~,~

............' _ .... 0 ...

""cWTd "."""

,_~ ~

"'.... ,... o'" A<H'" 0 ....... -0 <>tU CoM_'


............ . ' .>IfT, " _"'IT

c_

,"'11_ 1 _..... _ '


'M_n
...... o.ww .......... _r........ 01 SQL .......

PKtK"""" .....

"0' Toom T...... ' ,. ...,to.

_
>001
...... _,,"" ....."c_.. c""" ... _ _ o .... _

.".. _"'." ""'""....


"" 'H"'_~'" __ .
C' .". wo"'o_o. h",,,,,,"

A Janela Principal do IDE do Visual Studio


Mesmo sendo to liti l, essa pgina in icial apenas uma das vrias janelas disponveis como parte
do Visual Studio, e iremos percorrer a maioria delas nesta lio. Com o perfil Visual Basic Developer selecionado, voc j ter diversas janelas visveis : o navegador da Web interno discutido
anterionnente, o Solut ion Explorer, Properties e Toolbox no lado esquerdo. As outras janelas,
que abordaremos nesta lio, mas que no se tornam visveis no perfi l atual por padro, so:

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

Trabalhando com o Vis ual Basic .N ET

Recursos Comuns das Janelas


Todos os recursos destas jane las, incluindo o conceito de m lti plas janelas, fo ram desenvolvidos
para proporcionar urna uti Iizao mais efi ciente do espao. Em qualquer I DE, e principalmente
no Vi sual St udio .NET. a quantidade de opes e ferramentas disponveis quase infin ita, mas a
rea de seu monitor no . Uma sol uo para esse probl ema uti Iizar um monitor de 2 1 polegadas (ou maior! ). Por alguma raz<lo desconhecida, essa medida ainda no fo i adotada, portanto,
outros mtodos foram desenvolv idos. Um deles dividir as opes d is ponveis em janelas diferentes, que a abordagem usada pelo Visual Stud io .NET. Agora, o objetivo tornar o posicionamento dessas janelas fcil e fl exvel o sufici ente para que os desenvolvedores cri em seu
ambiente ideal de trabalho. Elas so chamadas indiv idualmente dejanelas defe/"/"amel7las. Todos os membros de urna janela de ferramentas comparti lham alguns recursos com uns, corno a
capacidade de estar encaixados/desencai xados, ocultos, associados em grupos de guias de janelas e assim por diante. Todos eles podem ser redimensionados de vrias fo rmas.

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

Quando o Visual Sflldio


.NEr cOI/figurado
com o pelfil de
desel/l'olt'edor do
Visual Basic. ele
ol"gani=a suas jallelas
de fo rmo aproximada
ii do ID E do Visual
Basic 6.0.

._
~

.........,.., ..... ,..... """' .... ""'... _'

too _

t.<d C!tOvo 10<1> _

f~'..

I'Ir;J1:!

__

, u Ii' Qc, '~I'1:" .., ; .jJ ql , ';'"

.... " ..... N. . O


. . . ao . . .... O

.... u e.II u ",,,.. d b. . . . . . oe

'."'."'""_ "'.'(1

'14d ~. '~,.,.' o.

... ....

"t" ...

"0'...... ,,,"". d ....... <o el . . . . . . .

,o.o<ud

""',,00<1> """.... ,... ""

"

N,.. , _... ~. . I. Ho<b, ... ,

" 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.

. _ _ ......... , ...... " " ... ...... , ( _ ) .... . ....


!!lo
_
_
_
_
tJOI>
~'"

..tl!3

\lJ ~ IiI!1' :II ~e. i

v,.... St.o</oo.Nf1 ...''''1<,. CIo<> ".",' ...

, , ..... "..

.....,,,.,

..,.,.."

,- .

......., ....." ........",...

tIO'" , .... ,
'h.~

~,

H,O.,

.....

~. '

VI,.", ... ,~ ...........

...............

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

Se I'Vc liwr bastante


espao lia leIa. poder
deixaI' sI/as jane/as
desencaixadas.

."

" . ,.....,

""""t"

......... ,_...
"

.. x
.......

Trabalhando com o Visual Basic .N ET

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

.~....... _, ............. _ " " I _ J ' .... ' ... I _ J

"r::IEJ

FIGURA

ferramentas podem ser

fechadas por meio do


peq1leno bouio X q1le

, ....,

I"lflEJ

as ocultar da te/a at

que sejam lIecessrias


f/OI'Gmente.

..-

~,

ii ' ... ' .. ~


0 -

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

Trabalhando com o Visua l Basic .N ET

37

. _ " __ ._""""' .... .,.'1_) ' ..m''''I_)

..r:lD

2.9

Voc pode IIsor

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'

.." ,' '.0 .

',.....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>

Trabalhando com o Visual Basic .NET

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

""'""" .....

Voc pode desenhar


elemenlos l'is/lais,
como caixas de lexlo.
em /1/1/ forll/ulrio
depois qlle os rireI"
selecionado na
Too/box.

l<d> _

e., ""; &\ r..1 ,'_


. - ., ..

_ ' ..'I

o
;.

Jl

.
c

" " '"

. ..

., .

40

NOTA

Dia 2

H um pouco de impreciso nas descries anteriores, que podem fazer voc


pensar que a Toolbox mais difcil de usardo que parece. Bem, a falta declareza resultado da natureza do IDE do Visual Studio, que fo i projetado para atender a uma grande variedade de linguagens de programao, nem t odas
disponveis hoje. Portanto, seu comportamento exalo (ou de Qualquer parte
dele, como a Toolboxl difcil de descrever. Mas, pode esta r certo de que, no
aspecto geral, ele sempre funcionar como o descrito, independentemente da

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

.. ,"""' ............. ""7_1 , "'''' , ...


_
_
1_ _
ti<\>

1.J ,, ~iI
i.~ ... : .., :

11'190

,p ql .--"

, .~ , ,,'

" 0'_

. "t <& , . . ~oS .. . . ~


. Ch.mU . . . . . . . . ' yot_ . 'Ta . . .

. co.., . .. . ' ........ 1" . . '.ot_.'


"" .N
_ ' ,.,'
.Tu , ...... ,.

......_,.""., e' ."'1

qualquer Olllro comrole

''"' ...

dela.

' , ...

C... , T. . "",,

c_ .. ,.

Trabal hando co m o Vis ual Bas ic .N ET

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.

Trabalhando com o Visua l Basic .NET

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

Command/lmmediate nem sempre o transferir para outra l inha dela. Em vez


disso, se voc j t iver comeado a inserir algum texto, poder passar pelos comandos executados. Se voc selecionar uma l inha que j passou (na janela) e
comea r a adicionar texto nela, ser criada de modo automtico uma cpia
dessa linha, com suas novas alteraes, na parte inferior da janela. Isso torna
qualquer texto antes da ltima linha da janela efetivamente de leitura.

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.

Trabal hando co m o Vis ual Bas ic .N ET


_ " " " .......... _

FIGURA 2 .15

A janela Dyllamic Help


tellla !/IOSlra/"
informaes Ileis

:!O<'

....

..... ' '' '[ .. _1 , ~ ,..


Jooh _
tIOI>

' \!J - t;: g " .l~ ~I ~ -.,- $)- r.. I , _

me.mlO anles qlle voc

45
I!IIIIgE!

' Tono'

as solicite.

. h'OS'.Ld . . . . . . . " ... .

s,., ....., ,"" ..... ", ,

" . Chn'S". "II.. Sy",_.""''''''S",,,",, .,, )

' .
.... IN..
".H_
"
"ro "
.. ....... " "r.,,.,,
C.~"OI'."""

.. . ... _

.... ...

. ,

.... ..,., 1'0"01

....
,
,
..............
"
...
,_.,
.
....
.
.._....."...,_..... , .._. ......,
~

"

"

~ ,, -_

,.. ,

,,_ . ,-~, .,.

'

'., . . . . . . . . " . . . , _. . . . . , L. . . . .

..........-.".." ............"." . . .........


'.,........', . .. , _ , 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

sel1'idor local qllal/lo

... . . 'oOC., ......s, ....... h ...... r ., ....... ( ,

de outras mquinas.

......_L.yo.'''.,..,

" .C!! "". ......." ....O<u' ... . . ''"I'"'. n,)


.. ," $,,, .,_.""' .c ,,,

... ~.o .. . _

.... . ",."""

.....

" . To . . . " ono"

..,

........,
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

as propriedades sejam em geral preenchidas automaticamente, com valores-padro, preciso

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

Trabalhando com o Vis ual Basic .N ET

2.17
Quando IIfIl objeto for

FIGURA

se/eciollado lia jalle/a

de ediiio (lima caixa

..

,,~m'

de texto em UIII

formulrio /lesse caso),


ajal/ela Properties
exibir todos os seus

--.
..
---_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

Adicionar novos arquivos a um projeto (d um cliq ue com o boto direito do mouse no


projeto e selecione Add)

Remover arquivos (d um cl ique com o boto direito do mouse em um arquivo especfico


e selecione Remove)

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~

A janela C/oss View


moslra seu {)ro)elo

OIgani::ado por seus


objelos e 11(10 por sellS

arq/lil'os fsicos. e
fomece acesso direlo
00 il//erio/' desses
objelOs.

lOIREI

. ...,
r

.'"

. .........,...

"

'"'

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

Trabalhando com o Visual Basic .NET

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"

permile qlle sejam


examinadas as classes

fomeddas pelo .NET

~~-_
o

' w ,"'~ CII


o

""'...,. . _

....

.........,

,, ~ e.I,,!

....

-,'

" ' _ I i . - . . . , . "' I"-rl

"..

,...

Framell'ol"k e de
qualquer oufra

bibliOleca que voc


fel/ha criado

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

lisra de farefas bem


orguni=ada.

Pnv., . . . . .

,.,.... , lO "
''f<(),

...... l _ , . . ' ,"_ . ~.l'<'


....."" . .. <0.) ...
b,oeO'7 . e,,< ~

C~.ycl1< ~ (

~_"._

oh,.,

""u

.... . ..... ...... <OCoprC " 1

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

Trabal h ando co m o Vis u a l Bas ic .N ET

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.

Criando um Novo Projeto


Existem algumas maneiras de criar um novo projeto, mas o mtodo mai s comum usa as opes
File, New e Project do menu. Essas opes apresentam uma caixa de dilogo que mostra todos os
diferentes tipos de projetas que o IDE pode gerar (veja a Figura 2.2 1). Jque o IDE do Visual Studio trabalha com vrias linguagens, a caixa de dilogo mostra as opes com base nas linguagens
que voc tem instaladas e podem apresentar uma aparncia diferente da exibida na Figura 2.2 1.
Por enquanto, desenvolveremos projetos com base nas opes da pasta Vis ual Basic Projects.
_ .... _

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.

lo,y>oo .., ..... ~1H1 ............11 3

_ ..

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.

Abrindo um Projeto Existente


Quando o Visua l Studio for encerrado, ele perg untar se voc deseja salvar o que esteve usando
e fechar tudo de modo automtico. Para que se possa voltar a um projeto anterior, esse precisar

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.

Adicionando Arquivos a um Projeto


Alm dos arquivos que so criados de modo automtico corno parte de seu novo projeto, voc
tambm pode querer adicionar mdulos, classes e formulrios complementares ou outros tipos
de arquivos de cdigo. Por meio do menu Project ou do que surge com um clique no boto direito
do mouse sobre o projeto da janela Solution Explorer, possvel optar por acrescentar qualquer
arquivo de vrios tipos. Independentemente da opo espec fica do menu que foi escolhida, com
exceo de Add Existing Item, todas o conduziro caixa de dil ogo Add New ilem (veja a Figura 2.22). Se, em vez de criar um novo item, voc quiser ad icionar um arquivo existente ao disco, a opo Add New Exist ing Item do menu apresentar, para esse fim , uma caixa de dilogo
para abertura de um arquivo-padro.
FIGURA 2 .22

Da mesma maneira qlle


a caixa de dilogo Neli'
Projecl. a ime /face
para adicionar ilens
lIoms ao pr ojeto
expallsheI.

.......... ".no ,...,

,- ,
~

c,,__ ,
8 U""~',qK"t _

-O'~

"'-

"'lO
o .....,.

~~

[j,

-'!m- ";:!li- --

c,"

''' '1fIT'\ _""" <I,' _ ""

[ii.]

iD

~ ,~

..,.,.

I """,-~

Trabalhando com o Visual Basic .NET

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_

_.........
_.-,

-~

.""" ..... C<b.


~

...

p _

"""""'" _ _ _ bo.>Id ..... "

~ _

, .... <t...-.hot ~ - . , . _

..... """""" .... "91

I'. r.
"II r

..... _

El I

,, "'"

"' _ - . .

"....,c"' .... ~ t._-......,

r o.nl .... ot...,."'.

......

0 _" c""" ..
Cl l.,. EdOor

D_

O 0 ..... _ 11<

D_

~"-~-~------''

Criando Nosso Primeiro Aplicativo Windows


Agora que voc aprendeu alguns princpios bsicos relativos ao uso do IDE do Visual Studio,
pode usar essas infonnaes para desenvolver um aplicativo sem precisar codificar muito. Esse
exerccio se concentrar no uso do prprio IDE, o que significa que iremos gerar um aplicativo
relativamente simples. No exemplo, criaremos um apl icativo Windows (um apl icativo que lisa a
interface com o usurio do Windows e executado localmente em sua mquina) que permite ao
usurio inserir dois nmeros. Em segui da, o aplicativo adicionar os nmeros, exibindo o resultado final.

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.

Desenvolva a Interface com o Usurio


Voc precisa de trs caixas de texto e apenas um boto no formu lrio. A posio no assim to
importante, mas voc pode desejar que sua interface tenha uma aparncia semelhante da Figura 2.24. D um cl iq ue duplo em Form 1 no Server Explorer, trazendo-o para a janela de projeto no
centro do IDE. Agora, com o formu lrio no modo Design, selecione ou abra ajanela Toolbox.
Essajane la, que mostrar todos os objetos disponveis que podem ser colocados em seu formulrio, contm um controle TextBox e um controle Button. Para inserir um desses controles em seu
formulri o, d um clique nele e arraste-o para a posio correta. Quando ele estiver no formulrio, selecione o controle e use suas alas para redimension-lo at a forma e tamanho desejados.
Trabalhe com o redimensionamento e a posio desses controles at que consiga que todas as
trs caixas de texto e o n ico boto estejam no formulrio com a aparncia do exemplo (Figura
2.24). Depois que tudo estiver posicionado, altere algumas propriedades desses controles.
FIGURA 2 .24
~

O'gani=e as Irs caixas


de lexto e o nico
boIo em sell

A.

'Il1o

'Ii. .

formulrio para que


lenllam lima aparncia

semelhanle a esta

jigum.

. :._ -_.-

o .
~ __

111-(:1

I
I
.... I I

I
I

... I I

Trabalhando com o Vis ual Basic .N ET

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.

Configuraes para a Construo de Projetos


Para construir um projeto, selecione Build no menu Build (no so nomes muito criativos para
os menus, mas so fceis de entender), que parecer ser de muito pouca utilidade. Sem fornecer
muito em termos de informao, as configuraes-padro de Build criaram um arquivo
Adder .exe, inserindo-o no subdiret6rio bin da pasta de seu projeto. A menos que voc tenha optado por personal izar Ocaminho exibido quando criou este projeto, ele deve estar localizado em
My Oocuments \ Vi sua 1 Stud i o Proj ects \Adder, e o arquivo executvel em \bi n\Adder. exe dentro desse diretrio. Para examinar todas essa configuraes-padro, e, quem sabe, alter-Ias, d
um clique com o boto direito do mouse em seu projeto na janela Soluti on Explorer e selecione
Properties no menu suspenso que aparecer. A caixa de dilogo das propriedades de seu projeto
contm vrias configuraes, mas as que so relevantes para o processo de construo esto descritas a seguir.
Em Common Properties\General:

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

Trabalhando com o Vis ual Basic .N ET

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.

FIo .... <icn

1.0.2'314.16

-------

0Ih0r ..."", rl'."i_".':"'~

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.

Outras Configuraes de Construo


Na parte superior da caixa de dilogo Projcct se encontra uma lista s uspensa chamada Configumlion. O Solulion Contigural ions um recurso til do IDE do Visual Sludio, que permite que
voc crie mais de um grupo de configuraes para o mesmo projeto. Por padro, duas configuraes so fornecidas (Release e Debug), projetadas para indicar se esto sendo construdos resultados para fins de teste (Debug) ou para desenvolvimento real (Re lease). As definies para
essas con fi guraes-padro so um bom exemplo da fi nalidade do Solution Configurations, que
define o status de vrios recursos de depurao e at de um local diferente de resultado para cada
um deles.

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

Conflgural lon M<lMg~r

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.

Criando um Arquivo Executvel


A melhor maneira de entender um recurso do IDE usando-o, o que significa que hora de construir O projeto do exemplo e produzir um arquivo executvel. D um cl ique na opo Build do
menu de mesmo nome, e ver uma infonnao piscar rapidamente na janela Output (exibida na
parte inferior de sua tela, se voc no a tiver mudado de lugar). Se tudo correr bem e no houver
erros em nenhum cdigo que tenha sido adic ionado ou alterado, o processo de construo produ~
zi r um arquivo executvel. Esse arquivo, que foi chamado de Adder . exe, ser criado no subdire~
trio bi n da pasta de seu projeto (por padro, My Documents\Visua l Studio Projects\Adder).
Minim ize o IDE do Visual Studio, use o Windows Explorer para encontrar o arquivo e, em se~
guida, d um clique duplo nele para executar seu ap licativo Windows recm~criado. O formu l~
rio, com suas diversas caixas de texto e botes, aparecer para mostrar que o programa est
sendo processado e continuar a ser at que esse mesmo formulrio seja fechado. Esse arq uivo
executvel, j unto com o .NET Framework, tudo que necessrio para fazer a distribuio para
a mquina de um usurio de modo que esse possa executar seu programa.

Adicionando Seu Prprio Cdigo


At aqui, o exemplo do projeto em que voc esteve trabalhando continha apenas o cdigo gerado
pelo IDE do Visual Stud io, que tem sido timo para mostrar O formu lrio, mas no faz mais
nada. Como j deve ter sido percebido pelos nomes e layout do forrnu lrio, esse aplicativo adi~
danar valores primeira e segunda ca ixas de texto e colocar o resultado em uma terceira e l ~
ti ma. Para tanto, ser preciso acrescentar um cdigo ao projeto que ser executado quando o
usurio der um clique no boto Add.

Trabalhando com o Visual Basic .NET

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

para nmeros. O cdigo a seguir, se colocado no lugar da chamada de MessageBox, adicionada


anteriormente, far o que prec isamos :
txtResult . Text =(Clnt(txtFirstValue.Text)
+Clnt(txtSecondValue.Text)).ToString
Esse cd igo converte o contedo das duas caixas de texto em nmeros (inteiros, neste caso), faz
a soma e, em seguida, converte o resultado de novo para lima string (texto) de modo que ele possa ser inserido na terceira caixa de texto. So necessrias algumas etapas para fazer algo que aparentemente muito fcil quando descrito pela primeira vez, e o resultado final pode parecer um
pouco confuso. Tudo ficar mais claro ao darmos prosseguimento no Dia 3, " Introduo Programao com o Visual Basic .NET".

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.

P Posso adiciona r meus prpr ios recursos ao ID E do Visual Studio?


R Com certeza! O IDE d suporte personalizao por me io de vrios mtodos diferentes,
incluindo macros e complementos. No abordarei a personalizao do IDE neste livro,
mas, por hora, examine os ti mos exemplos de macros nas opes TooIs, Macros e Macros IDE do menu.

Trabalhando com o Vis ual Basic .N ET

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

Os tipos de variveis que pode criar com o Vi sual Bas ic .NET.


Alguns operadores e funes simples disponveis no Visual Basic .NET.
Os princpios bsicos para escrever cdigos no Visual Basic .NET, inclusive como desenvolver procedimentos.

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.
,

O Que E uma Varivel?


Uma varivel um depsito. um local para guardar as informaes at que sejam necessrias.
Voc usar variveis em toda a extenso de seus programas para reter valores temporrios durante os clculos, armazenar ent radas do usurio e preparar as informaes que sero exibidas
posteriormente para eles.

Tipos de Variveis Disponveis


Exatamente como acontece com as calas, s um tamanho no atende a todas as variveis.
Embora seja poss vel criar e usar uma varivel que seja capaz de conter o que for, essa nem sem
pre a melhor soluo. E fcil deduzir que uma varivel que contm strings deve executar algo
diferente de outra criada para annazenar nmeros. Alm disso, mesmo tipos diferentes de nmeros requerem tipos d istintos de variveis. Alguns nmeros, como I ou 5280, no possuem casas
decimais, enquanto 3, 14 I 59265358979 e 16,50 apresentam essa caracterstica. Uma varive l
gerada para conter um nmero dec ima l deve ter uma manei ra especfica de manlero registro dos
valores depois da vrgula. claro, que isso significa que os nmeros decimais provavelmente
consumiro mais memria. Sempre que um computador ou programa realiza um trabalho maior,
em geral precisa de mais memria. Portanto, importante lembrar no s do tipo de informao
que voc prec isa annazenar, mas tambm do espao da memria que o computador ter de man ipular para registrar a varivel.
/-l trs tipos abrangentes de varive is que voc pode criar com o Visual Basic .NET. O primeiro
conjunto engloba as variveis que mmazenam valores simples, como nmeros ou strings. H
muitas desse t ipo, cada uma foi projetada para conter valores de vrios tamanhos. A segunda categoria a das variveis complexas, que contm alguma combinao de variveis simp les e incluem arrays e tipos definidos pelo usurio. Os arrays so variveis que armazenam muitas
outras, e os tipos definidos pelo usurio permitem que o usurio crie novos tipos de variveis. A
terceira categoria a das variveis de objeto.
Os tipos definidos pelo usurio (tambm conhecidos como estruturas) e as variveis de objeto
sero abordados no Dia 7, "Traba lhando com Objetos". A discusso desta lio se concentrar
nas variveis simples e arrays.

Introduo Prog ramao co m o Visua l Basic .N ET

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

Tipos de Varivel de Inteiros


Tamanho
(Bytes)

Abrangncia

Comentrios

Byte

o a 255

Um pouco limitado e, diferente dos outros tipos de dados inteiros; o Byte no


d suporte a nmeros negativos. Isso
acontece porque ele representa o valor
que o computador realmente am1azena
em cada byte da memria. Para armazenar nmeros negativos, o computador
usa uma parte de cada byte para guardar a
poro 'negativa' . t il quando se mantm registros de numeros pequenos que
nunca so negarivos, como os dias de um
ms ou os meses de um ano.

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

A varivel de inteiros-padro. Em geral, o


inteiro o tipo mais ve loz de varivel para

2.147.483.647

se usar, j que ele requer menos trabalho


do computador. Um emprego para esse
tipo de varivel seria registrar a quantidade de ovelhas da Nova Zelndia (aproximadamente 47.394.000 em 1997).

- 9.223.372.036.
854.775.808

O tipo de varivel perfeito para esta po-

a
9 .223.3 72 .036.8
54.775.807

ca em que estamos trabalhando com nmeros mu ito, muito grandes (isso


sign ifi ca -9 quintilhes a +9 quintilhes
ou aproximadamente 9 x lO ' ~ para a manuteno de registros). Um tipo longo seria til se voc esti vesse annazenando a
quantidade de estrelas no universo (estimada em cerca de 10").

Nmeros com Casas Decimais


Uma grande quantidade de processamento numrico realizada sem casas decimais. No entanto, mais clcu los, principalmente em engenharia, finanas e cinc ias, requerem que voc tambm possa armazenar valores decimais. A Tabela 3.2 descreve os dois principais tipos de
variveis dec imais. Decidirqual usar depende do grau de preciso que for necessrio manter, em
vez do tamanho dos valores, j que todos eles podem ter nmeros bastante grandes. Caso no se

Introduo Programao com o Visua l Basic .NET

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

Tipos de Varivel Decimal

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

O tipo duplo uma varivel de

'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

Tipos de Variveis de Strings


Tamanho

de Dado

Cha r

(Bytes)

Abrangncia

Comentrios

Um caractere

Adequado para annazenar um n ico carac-

tere.

String

10 + 2
por

caractere

At dois
bilhes de
caracteres

Use um tipo Stri ng para armazenar aque le

romance que sempre quis escrever. Se estio


ver calcu lando cinco caracteres em md ia
por palavra e 250 palavras por pgina, sai
ba que uma nica varivel alfanumrica
pode conter 1,7 milho de pginas de texto.

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

finiu. Em ASC II , um byte igua l a um caractere, e todos os computadores que usa


vam essa linguagem sempre dispunham os mesmos caracteres na mesma posio da lista.
Portanto, o valor65 em ASC II era sempre a letra ' A', e o smbolo '@' possuava loriguala64. Se
voc quisesse fazer o mesmo com todos os outros smbolos que as pessoas usam na escrita, no en
tanto, precisaria de mais caracteres. Para reso lver esse problema, um novo sistema fo i desenvolv i
do, chamado Unicode.

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.

Introduo Prog ramao co m o Visua l Basic .N ET

69

Outros Tipos de Varivel Simples


Nunca fal ha quando se tenta categorizar as coisas. Algo sempre desafia a categorizao (apenas
imagine o primeiro zologo que se deparou com o ornitorrinco). Da mesma maneira, h algumas
variveis que no se encaixam bem nas categorias descritas anteriormente. No Visual Basic
.NET, existem dois desses tipos de variveis 'd iversas', o lipo booleano (Boolean) e a data
(Date). Eles so descritos com mais detalhes na Tabela 3.4.
TABELA

3.4

Tipo

de Dado

Booleano
(Boo 1ean)

Ti pos Diversos de Variveis Simples


Tamanho
(Bytes)

Abrangncia

Comentrios

Verdadeiro
(True) ou falso

Se est annazenando apenas verdade iro ou


falso , para que dois bytes? O Visual Basic
tem usado trad icional mente Oe- I para fa lso
e verdadeiro. Definir esses dois va lores requer dois bytes .

(False)

Data
(Date)

1 de jane iro

de 100a3 1 de
dezembro de

9999

Esta varivel pode conter a maioria das datas


com as quais voc lidar (a menos que seja
um historiador ou gelogo). Ela tambm segue todas as regras do calendrio (como adicionar um dia em anos bissextos), portanto,
se acrescentannos I ao valor '28 de feverei ro de 2000' da varivel de data, obteremos
'29 de fevereiro de 2000', mas se fizenn os o
mesmo para '28 de feve reiro de 200 I', a resposta ser' 1 de maro de 200 1' . A nica limitao efetiva da varivel de data seu
tamanho.

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:

Dim iAlgumNumero As Integer


Isso criaria a nova varivel iA 1gumNumero, que possui quatro bytes e pode annazenar um nmero
com um tamanho aproximado a 2 bilhes. Veja algumas declaraes de variveis possveis:

Dia 3

Dim sPrimeiroNome As String


Dim dblProdutolnternoBruto As Double
Dim bAprendido As Boolean
Um recurso novo no Visual Basic .NET a capacidade de fornecer um valor varivel quando
ela estiver sendo criada. Faa isso usando a mesma linha da instruo Dim:
Dim dtDataDeAssinaturaDaCartaMagna As Date =IJune 15,12151
Dim lPessoasNaTerra As Long = 6000000000
Examinaremos algumas outras maneiras de declarar variveis posteriormente, quando discutirmos o escopo.

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

'Alterando o tamanho de um array existente


ReDim dtDates(4)
'p reencha a lista de datas
dtDates(0)="15/6/1215" 'As sinatura da Carta Magna
dtDates(1)="28/8/1962" 'Mart in Luther King J r. pronuncia "Tenho um sonho"

Introduo Programao co m o Visua l Basic .NET


COOIGO

LISTAGEM 3.1

71

Declarando Arrays (continuao)

13
14
15
16
17

dtDates(2)="20 j7jI969" 'A Apollo 11 aterrissa na Lua


dtDates(3)="14 j 2j 1946" 'ENIAC revelado ao pb lico
'Declarao com Inicializao
Dim sMonthsOAs String ={"Jan","Fev","Mar" , "Abr","Maio","Jun",
"Ju 1" , "Ago" , "Set" , "Out" , "Nov" , "Dez"}

18
19
20
21
22

' Usando arrays


Console .WriteLine("")
Console .WriteLine("Segundo valor em iVa l ues '" {O)" ,iValues(I)
Console .WriteLine("Terce i ra date em dtDates " {O}",dtDates(2
Console .WriteLine("Dcimo primei ro ms do ano = {O}" ,sMonths(IO

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:

Introduo Programao co m o Visua l Basic .NET

73

Const PI " 3.1415 As Double


Const DSN As String" "Random"

COOIGO

Se o tipo da constante no for descrito em uma declm-ao, o compilador ter de usar


o tipo de valor que melhor se encaixar. No entanto, ele nem sempre se leciona o melhor tipo posslvel. Em geral, quando constantes so declaradas, se o tipo do valor no inclu ido, o
Visual Basic .NET cria os tipos de variveis a seguir:

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

Algumas Sugestes para os Padres de


Nomeao
Com lodos esses tipos diferentes de variveis e tantos programadores usando-os, h muitos nomes que podem ser empregados ao declar-las. Isso pode levar a um problema quando as examinarmos posteriormente. A menos que a declarao esteja visve l, podero existir dificuldades
para se conhecer o tipo da varivel. De maneira semelhante, se o cdigo for herdado de um escrito por outro desenvolvedor, pode ser preciso algum tempo para compreender como ele nomeou
suas variveis. As convenes de nomeao, de preferncia comparti lhadas, reduzem essas duas
espcies de dificuldade pela identificao do tipo da varivel.
Uma conveno de nomeao normalmente usada adicionar um prefixo em minsculas aos nomes das variveis. O prefixo identifica o tipo de varivel. A Tabela 3.5 mostra sugestes para um
conjunto de prefixos.
TABELA 3 .5

Convenes de Nomeao Sugeridas

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

Convenes de Nomeao Sugeridas (continuao)

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

Dois ou trs caracteres importantes do nome da estrutura

Variveis criadas, com base em estruturas equivalentes a um ponto ou retnguio poderiam ser chamadas de
ptLocal e retTamanho

Constantes

Nenhum prefixo. O nome


todo em maisculas, com
cada palavra separada pelo
caractere sublinhado U

PI, TAXA_IMPOSTO

Enumeraes

Dois ou trs caracteres significativos

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.

Introduo Program ao co m o Visua l Basic .N ET

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

Opera dores Com uns do Visual Basic .NET

Operador

Uso

Exemplo

::

Atribu i um valor a outro

x" 6

Soma dois va lores

Y " X 7

Subtrai um valor de outro

y " X - 4 (Y igual a 2)

Multi plica dois valores

y " X 2(Yiguala (2)

Divide um valor por outro

y " X / 2 (Y igual a 3)

Divide um valor por outro, mas s retoma


um nmero inteiro

y " X \ 3 (Y igual a I)

Mod

Abrev iatura de mdu lo; retorna o reslO de


uma diviso

y :: X Mod 3 (Y igual a 2)

&

Associa duas strings

."

S " "01 " & "Mundo" (S


igual a "Ol Mundo")

Sm bolo para adicionar um valor e atribuir


o resultado

X +:: 2 (X igual a 8)

Sm bolo para subtrair um valor e atribu ir o


resultado

X -= 3(Xiguala5)

Smbolo para mu lt iplicar um va lor e atribuir


o resultado

x *" 6 (X igual a 30)

Smbolo para dividir por um valor e atribuir


o resultado

Smbolo para acrscimos a strings e atribuio do resu ltado

S &= " . John" (S igua l a


"Ol Mundo, John")

Eleva um valor a potncia de um expoente

3"4 (3 elevado a 4, retoma 8 I)

.~

&~

(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

de dados, poder desativar a verificao restrita de tipos adicionando Option


Stri ct Off no inicio de seus arquivos. bom saber, no entanto, que isso poderia levar a resultados inesperados em seu cdigo (ou seja, erros) se o Visual
Basic .NET converter uma varivel quando essa operao no for esperada.

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

Converte para um tipo duplo (Doubl e).

Clnt

Converte para um inteiro (Integer). As fraes so arredondadas para o valor


mais prx imo.

CLng

Convene para um tipo longo (Long). As fraes so arredondadas para o valor


mais prximo.

CSht

Converte para um tipo curto (Short). As fraes so arredondadas para o valor


mais prximo.

CStr

Converte para uma String. Se o valor for uma data (Date), apresentar o formato abreviado.

77

Introduo Programao com o Visua l Basic .NET

TABELA

3.7

Funes de Converso (continuao)

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.

Funes de Manipulao de Strings


A maioria das fun es anteriores re lacionadas a stings no Visual Basic foi substituda no Visual
Basic .NET pela funciona lidade interna da classe String (exam inaremos a classe String com
detalhes no Dia 7). No entanto, voc pode ver alg umas das funes do cdigo anterior listadas na
T abela 3.8 para se familiarizar com e las.
TABelA 3.8

Funo

Funes de Manipulao de Stri ngs


Descrio

Exemplo

Retorna o comprimento de uma


string.

iValue " Len("Olc'i"}


igual a 3).

eh,

Retorna o earaetere com base no valor


ASCII oU Unieode inserido.

sValue " Chr(56} ('sValue igua l a


letra A).

Ase

Retoma o valor ASCII ou Unicode

iValue" Asc("A") ('iValue igua la


56).

Left

Retorna caracteres de uma string, comeando com o da extrema esquerda.


Tambm precisa da quantidade de caracteres a retomar.

sValue" Left("Olc'i Mundo",


('sValue igual a O).

2)

Right

Retorna caracteres de uma string, comeando com o da extrema direita (o


oposto de Left). Tambm precisa da
quantidade de caracteres a retomar.

sValue" Right("O lc'i Mundo",


('sValue igual a undo).

4)

('iValue

Dia 3

TABELA

3.8

Funes de Manipulao de Stri ngs (continuao)

Funo

Descrio

Exemplo

Mid

Retorna caracteres que no esto em


nenhuma das extremidades de uma
string. Mid retorna qualquer nmero
de caracteres. Sua sintaxe sReturn "

sValue = Mid("OU Mundo", 3, 5


('sValue ig ual a Mun).

Mid(String, InIcio, Comprimento)


onde Inicio o caractere a part ir do
qual retornar, e Comprimento a quantidade de caracteres (inclu indo Infcio) a retomar. Um recurso
interessante que se voc omitir Comprimento, produzir o retomo de todos os caracteres desde InIcio .
Instr

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)

sVa lue - Mid("Oli Mundo",


('sValue igual a Mu ndo).

4)

iVa l ue = Instr(l, "Ol Mundo" , "1")


('iValue igual a 2). Lembre-se de
que a string que voc est procurando
pode ter vrios caracteres, portanto,
em uma busca por "Mundo", como a de
iValue = InstrO, "Ol Mundo",
"Mundo" 'i Val ue igual a 5.

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.

TipoCorrespondncio deteml ina se a


busca ir diferenciar maisculas de
minsculas. Se estiver configurado
como O (cOliespondncia binria), a
pesquisa diferenciar maisculas de
minsculas. Se for ignorado ou config urado como 1 (correspondncia textual), no diferenciar. A varive l
i Retu r n seria igua l a posio na
StringPesquisoda onde o ltemProcu rodo comea. Se a string procurada
no for encontrada, i Return ser
igual a O.

79

Introduo Programao com o Visua l Basic .NET

TABELA 3.8
Funo

Funes de Manipulao de Strings (continuao)


Descrio

Exemplo

InstrRev pesquisa do lado direito da


string; no resto, idntica a Instr.
I nstrRev ser til quando voc estiver
pesqu isando uma string que apresente um caminho de diretrio e quiser
visualizar primeiro os diretrios infe
nores.
iValue = InstrRev("OIc1 Mundo",
"o") 'iValue igual a 9.
Converte uma Slring em minsculas.

Lcase

sValue

LCase("OIc1 Mundo")

'sValue igual a ol mundo


Ucase

Converte uma string em maiscu las.

sValue

UCase("OIc1 Mu ndo")

'sValue igual a OL MUNDO


LTrim
Rtrim
Trim

Remove todos os espaos que precedem uma string

Value

Remove todos os espaos que sucedem uma string

sValue

Remove todos os espaos que antecedem e sucedem uma string

sVa lue

Ltrim(" Ol Mundo ")

'sVa 1ue igual a "01 Mundo


=

Rtrim("

Ol Mundo ")

'sValue igual a"


=

Trim("

"

oa

Ol Mundo"
Mundo

")

'sValue igual a "Ol Mundo"

Outras Funes teis


Finalizaremos com algumas funes geralmente teis que no se enquadram nas outras categorias.
Aqui encontraremos as que pennitem a determinao do tipo de uma varivel, assim como funes de manipulao de datas. A Tabe la 3.9 descreve algumas dessas funes.
TABELA

3.9

Funes Internas Diversas

Funo

Descrio

IsArray

Retoma True (verdadeiro) se o parmetro for um array.

IsDate

Retoma True se o parmetro for reconhecido como uma data.

IsNumeric

Retoma True se o parmetro for reconhecido como um nmero.

IsObject

Retoma True se o parmetro for algum tipo de objeto.

TypeName

Retoma o nome do tipo de dado do parmetro, por exemplo, TypeName(sName) retomaria "String" .

Dia 3
TABELA

3.9

Funes Internas Diversas (continuao)

Funo

Descrio

Now

Retorna a data e a hora atual.

Today

Retoma a data atual, com a hora configurada como 0:00:00 a.m.


(meia-noite).

Escrevendo Suas Prprias Rotinas


Embora as funes internas sejam bastante teis, sempre haver vezes em que voc precisar
criar suas rotinas. Pode ter de selecionar um conjunto de funes internas que sejam chamadas
da mesma maneira ou talvez gerar alguma funcionalidade excl usiva. De qualquer modo, o Visual Basic .NET tornar fc il a criao de suas rotinas.
H dois tipos de rotinas usadas no Visual Basic .NET. Um deles a rotina que executa algo, mas
no retorna nenhum valor. So as chamadas sub-rotinas (ou, na abreviatura, sub). O outro tipo
de procedimento executa algo, porm retornando um valor. Essas so denominadas funes.

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

Sub NomeSubRot i na{Parametrol As Type,Parametr02 As Type, ...


.. ParametroN As Type)
'I nsira o que quiser aqu i
End Sub

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.

Introduo Programao co m o Visual Basic .NET

COOIGO

LISTAGEM

3.2

81

Criando e Usando uma Sub- rotina

1 Sub ShowMessage(ByVal Message As String)


Console,Write Li ne( Messa ge)
2
3 End Sob
4 ShowMessage("Ol Mundo do Visual Basic .MEl")

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

Type , ... ParametroN

As

Type)

As

TipoRe-

'Insira o que quiser aqui


Return VolorRetornado
End Function

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

Cri ando e Usando uma Funo

1 Function Volume(ByVa l leng th As Integer ,


2
ByVal Width As Integer . ByVal Hei ght As Integer) As Integer
3 Return length *Width *Height
4 End Funct i on
5
6 Conso l e.Writeline(Volume(3,4,5

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.

As variveis Priva te ficam disponveis no mdulo ou classe onde so declaradas. Elas


so usadas com freqncia em apl icat ivos quando se precisa de uma (mica varivel que
possa ser empregada em vrios procedimentos. Criando-a com a palavra-chave Pri vate,
estaremos perm itindo que todos os procedimentos de um mdulo ou classe acessem a varivel . As variveis Pri va t e so tei s para comparti lhar informaes com uns necessrias
a uma tarefa, como um valor intermedirio que possa ser utilizado por funes diferentes
para executar um clculo.

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.

Por Que o Escopo Importante?

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.

o Escopo e os Procedi mentos


Exatamente como as variveis podem ter um escopo, os procedimentos (sub-rotinas e funes)
tambm possuem um. O escopo para os procedimentos significa o mesmo que para as varive is:

Introduo Prog ramao co m o Visua l Basic .N ET

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.

Exemplo de Aplicativo: Calculando um Valor


Futuro
Agora que voc j explorou a criao e uso de varivei s e proced imentos, poder gerar um aplicati vo que execute o clcu lo de um investimento. Esse ap licativo pennitir a an lise dos beneficias maravilhosos do investimento regular e dos juros compostos. Neste exemplo de apli cativo
do console evitaremos a complexidade que uma interface grfica com o usurio adicionaria. A
Listagem 3.4 most ra o cd igo de uma execuo do programa.
CDIGol
RESULTADO

1
2
3
4
5

LISTAGEM

3.4

O Programa de Clculo de Investimentos

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

7 Se voc comea r com U$$10.000 , OO


8
e investir US$200,OO por ms
9
durante 30 anos
10
a 5% de juros.
11 Seu saldo final ser : $211.129,17
Aqui vemos o resultado de se comear com um saldo de US$1 0.000 adicionando US$200 por
ms durante 30 anos, com juros fixos de 5 %.

Dia 3

o programa requer que o usurio insira os quatro valores (Sal do

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

FV = DepositoMensal *((1 + JurosMensais) A Meses - 1 )


.. jJurosMensais )+ Saldolnicial * ( 1 + JurosMensais )

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

Declaraes para o Clculo do Valor Futuro

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

I Shared Sub Main()


2
Dim decResultado As Double
3
'obtencao dos valores das entradas
4
GetlnputValues()
5
'c alcu l o
6
decResultado = CalculateFV(dblJurosAnuais.

Introduo Program ao co m o Visua l Basic .N ET

CDIGO

LISTAGEM

3.6

85

Rotina Main (continuao)

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

A Rotina das Entradas Console . Read

Private Sub GetlnputValues()


Console . Writeline()
decSaldolnicial " CDec L
GetValue("Saldo Inic i al: "))
dblJu rosAnua i s " CDb l(_
GetValue("Juros Anuais (por exemplo , para 5% , ins ira 5) : "))
decDeposHoMensal =COec(GetValue{"DepsHo mensal : "))
iPeriodo " Clnt(GetValue{"Perodo do i nvest imento em anos: "))
Console.Writeline()
End Sub
Private Funct i on GetValue(ByVal Prompt As St r ing) As String
Console . Write(Prompt)
Return Conso l e.Readline
End Function

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

A Rotina de Sada Console . WriteLine

1 Private Sub DisplayResults(ByVal Resultado As Double)


2

Console .WriteL i ne()

3
4
5
6

Console.WriteUne("Se voc comear com {O:c). " , decSaldolnicial)


Console . WrlteUne(U e investir {O:c} por ms" , decOepositoMensal)
Console.Write Li ne(U durante {O) anos". iPe riodo)
Console . WriteUne(" a {O) % de juros.". dblJurosAnuais)

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

1 Private Function CalculateFV(ByVal JurosAnuais As Double ,


2
ByVal Peri odo As Integer. _
3
ByVal DepositoMensal As Double . _
4
ByVal Saldoln i cial As Double) As Double
5 'divida por 1200 para torn-lo um percentual mensal
6 Dim decJurosMensais As Double = CDec(Juros Anuais /1200 )
7 Dim iMeses As Integer = Perodo * 12
8 Dim decTemp As Double
9 Dim decReturn As Double
10 'precisaremos desse valor em alguns locais
11 decTemp = CDec((1 +decJurosMensais) A iMeses)
12 decReturn = CDec(DepositoMensal * _
13
((decTemp - 1) / decJurosMensais)
14
+ (Saldoln;cia l * decTemp
15 Return decReturn
16 End Function

Introduo Programao co m o Visua l Basic .N ET

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

O Programa Completo de Clculo de Investimentos

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

Pr iv ate Function GetValue(ByVal Prompt As String) As Stri ng


Console .W rite(Prompt)

88

Dia 3

COOIGO

LISTAGEM 3. 10

O Programa Completo de Clculo de Investimentos


(continuao)

40
41

Return Console . ReadLine


End Function

42

43

Private Sub GetlnputValues()

44
45

Console . Wr'iteLineO
decSaldoln i cial = CDec(GetValue("Saldo Inicial : "))

46

dblJurosAnuais

47

CObl (GetValue("Juros Anuais (para 5%. insira 5):

lO

48
49
50
51

decDepositoMensal = CDec(GetValue("Depsito mensal: ")


iPeriodo = Clnt(GetValue("Perodo do investimento em anos : ")
Console . WrHeLine()
End Sub

52
53

Private Sub DisplayResults(ByVal Resultado As Oouble)

54

Console.WrHeLineO

55

Console.WrHeLine("Se voc comear com {O:c}, ", decSaldo Inicial)

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.

Introd uo Prog ramao co m o Visual Bas ic .N ET

89

No Dia 4, "Controlando o Fluxo dos Programas", continuaremos a explorar a criao de cdigos


no Visual Basic .NET examinando como voc pode gerenciar as decises em se us programas.

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?

2. Qual a maneira correia de chamar esta sub-rotina?

Function RaiseToPower(ByVal Number As Integer , ByVal Power As Integer)As


Long

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

Pagamento = Quontiofmprestimo * (JurosMensois * 1


Meses) I (1 + JurosMensois) A Meses) - 1))

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.

Tomando Decises com as Instrues de


Controle
As inslrues de COnlrole so aque las parles de lima linguagem de programao que existem
apenas para determinar que outras partes do programa sero executadas. A determinao ocorre

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

nossa maneira habitual de falar e cdigos de computador, chamamos essa descrio


'quase em cdigo' de pseudocdigo. Esta Iio fornece vrios exemplos do uso desse tipo de lin-

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

Controlando o Fluxo dos Programas

93

I f d suporte a apenas duas aes possveis - o cdigo executado ou no - , a expresso s deve


ter dois valores. Isso significa que qualquer expresso usada como uma condio tem de apresentar um resultado definitivo "sim ou no" (Verdadeiro ou Fal so), como estes exemplos:

Estamos em um horrio antes do meio-dia.


Estamos em um horrio depois do meio-d ia, porm antes das 6 da tarde.
A quantidade de alunos excede de cadei ras.

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

ento , exiba "Boa Noite!"


Continue com O restante do pr ograma ...
Agora, para escrever esse programa, tudo que voc precisa saber como obter a hora atual do
sistema; o resto no deve ser to dific il. A hora atual do sistema est disponvclno objcto Now{ ),
que tam bm inclui infonnaes sobre a data atual e exibe vrias propriedades teis como Hour,
Mi nute, DayofWeek e Seconds. Para nossa final idade, podemos nos dar por satisfe itos usando apenas Hour, que retornar a hora atual representada em um perodo de 24 horas (valores de Oa 23).
Traduzir da mane ira mais literal possve l do pseudocdigo para o Visual Basic. NET produzi r o
programa da Listagem 4.1.
LISTAGEM 4 .1

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

If (iHour < 12) Then


Console .Writeline("8om Dia !" )
End If
If (iHour >= 12)And (iHour < 18)Then
Console .WriteLine{"Boa Ta r de!")
End If
If (iHour >= 18) Then
Console.WriteLine("Boa Noite!")
End If
End Sub

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,

Co ntrol ando o Flu xo dos Prog ramas

95

tenninaremos com um arquivo novo, no mesmo diretrio, chamado Greeting.exe. A execuo


do programa executvel recm-criado produzir o resultado apropriado, dependendo da hora do
dia em que ele for processado.
Para compreender me lhor como essas trs condies I f funcionaram, percorreremos o cdigo e
examinaremos o que aconteceu. Voc poderia fazer isso dentro do IDE do Visual Stud io, mas
usaremos o papel para deixar todo esse esforo da mqu ina para mai s tarde.
A primeira linha executada foi a 9, que inicializa a varive l de data com a hora e data
atuais; em seguida, a linha 10 salva a hora atual em outra varivel, i Hour. A primeira
instruo If executada na linha 12. Nesse ponto, a expresso (iHour < 12) avaliada. A varivel iHour igual ao valor da hora atual , que 13 (de acordo com o relgio do sistema, para os fins
deste exemplo, apenas suponha que a dcima terce ira hora I da tarde). Agora, a expresso, que
foi reduzida a 13 < 12, ser reduzida ainda mais para um si mples valor booleano Fa 1se (13 no
menor do que 12, ao menos no pe lo que aprendi em matemtica). Portanto, um valor fa lso informa instruo I f para no executar seu bloco de cdigo, e o processamento imediatamente passa
para a linha 14, End If. Essa instruo na verdade apenas um espao reservado, portanto, nada
acontece at a li nha 15, a prxima instruo If. Nesse caso, a instruo If, (iHour >= 12) And
(iHour <:: 18), primeiro red uzida para (13 >= 12) And (13 <:: 18) e, em seguida, para True And
True (Verdade iro e Verdadeiro). Quando comb inamos (And) dois valores booleanos, s consegu imos um resultado verdadeiro se ambos o forem , o que parece ser o caso aqui. Assim , a instruo
If tennina com uma condio verdadeira, o bloco de cdigo executado (linha 16), e a to estimulante mensagem 80a Ta rde! exib ida no console. Agora, nosso programa executou todo o seu
trabalho; exibimos a mensagem correta para essa hora do dia. O cdigo no encerrou sua execuo,
no entanto; no h nada que o infonne que no h motivos para conti nuar, portanto, a execuo
prosseguir em End If e, depois, na ltima instruo da linha 18. Essa instruo tem a expresso
(iHour >= 18) como sua condio, que se toma (l3 >= 18) e tennina como falsa. Felizmente a
execuo passa para a ltima instruo End I f na linha 20 e, em segu ida, encerra o programa.

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

Se a hora atual no sistema for igualou maior que meio-dia


e a hora atua l do sistema tambm for menor que 6 da tarde
ento. exiba "Boa Tarde!"
caso contrrio
Se a hora atual no sistema for igualou maior que 6 da tarde
ento, exiba "Boa Noite!"
Conti nue com o restante do prog rama ...
Esse exemplo quase o mesmo que o do cdigo anterior, mas agora est claro que voc s passar para a prxima instruo I f quando o valor da expresso no atender condio da aluaI.
Como j deve ter sido percebido, a capacidade de aninhar inst rues If, como aqu i, uma necessidade comum na programao de computadores, portanto, o Visual Basic e a maioria das outras
linguagens fornecem uma maneira de expressar exatamente esse conceito com a instruo I f.
Estivem os examinando a forma simples desta instruo:
If <condio> Then
bloco de cdigo
End If
Se a avaliao da condio apresentar como resultado True, ento, o bloco de cdigo ser executado; se obtiver Fa l se, o bloco ser ignorado, e a execuo continuar depois de End If. Voc
pode tornar isso um pouco mais complexo adicionando uma nova clusula, El se. Agora, a sintaxe se parecer com a descrita a seguir:
If <condio> Then
bloco de cdigo # 1
El se
bloco de cdigo ' 2
End If
Nessa nova estrutura, se a condio encontrar um resultado True, o bloco de cdigo # I ser execUlado, e o programa continuar depois de End I f. No entanto, se a condio obtiver Fa 1se, ento, o bloco de cdigo #2 ser executado, e o programa continuar depois de End If. J que a
condio deve ser uma expresso booleana e todas elas so verdadeiras ou falsas, um dos dois
blocos de cdigo ter de ser processado; essa instruo nunca far com que os dois ou nenhum
deles sejam executados ao mesmo tempo.
Reescrever o cdigo para se beneficiar dessa nova instruo If aperfeioada produzir a Listagem 4 .3.
LISTAGEM

4.2

Greeting_IFELSE . vb

1 Imports System
2
3 Public Class Greeting
4
'Execute o aplicativo

Controlando o Fluxo dos Programas

LISTAGEM 4.2
5
6
7

97

Greeting_IFELSE.vb (continuao)

Shared Sub MainO


Oim dtCurrent As System.OateTime
Oim iHour As Integer

dtCurrent =dtCurrent .Now


iHour =dtCurrent.Hour

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

bloco de cdigo ' 1


E1 se
If <condio '2> then
bloco de cdigo 12
End I f
End If
passa a ser

If <condio '1> l hen


bloco de cdigo ' 1

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

If <condio I I> Then


bloco de cd i go 1 1
ElseIf <condio '2> lhen
bl oco de cd igo 12
ElseIf <condio '3> lhen
bloco de cd igo 83
End I f
Mesmo com outra clusula E1 self, todo o bloco considerado parte da instruo I f origi nal , e
s uma instruo End I f necessria. Voltando ao primeiro exemplo, a exibio da saudao
apropriada depender da hora do dia, e a clusula El self (veja a Li stagem 4.3) permitir que
voc simpli fique bastante o cdigo.
LISTAGEM

4.3

Greetings_Elself.vb

1 Imports System
2

3
4
5
6
7

Public Class Greeting


'Execute o aplicativo
Shared Sub Ma in()
Oim dtCurrent As System.OateTime
Oim iHou r As ln teger

8
9

10
11

12
13
14

dtCurren t ~ dtCurrent. Now


iHour ~ dtCurrent.Hour
If (iHour < 12)Then
Conso l e .Writeline(nBom Dia!")
Elself (iHour >~ 12)And (iHour < 18)Then

Controlando o Fluxo dos Programas

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

Instrues If em Seqncia na Mesma Linha


Alm da forma em bloco apresentada anteriormente, na qual um conjunto interno de cdigo inserido entre as instrues If e End If, tambm possvel expressar urna instruo If em urna
nica linha. Aqui est um exemplo, em que urna condio verificada e uma ao tomada, tudo
em apenas uma linha:
If iHour

>

11 lhen System.Console.WriteLine("No de manh!")

Esse conceito da linha nica pode ser ampliado com a introduo de urna clusula E1 se:

If iHour

>

11 lhen DoSomething{) Else DoSomethi ngEl se( )

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

>

11 lhen DoSomething{): DoMore{) Else DoSomethingElse()

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

Instrues If em uma nica linha Podem Dar ao Cdigo uma


Aparnci a Mel hor

1 If X=5 lhen strChar = "A"


2 If X=23 lhen strChar = "8"

Dia 4

100
1

LISTAGEM 4.4

Instrues If em uma nica linha Podem Dar ao Cdigo uma


Aparncia Melhor (continuao)

3 If X=2 lhen strChar " "C"


4

Expresses e Lgica Booleana


Todas as instrues de controle dependem, de alguma maneira, de tomada de deciso, com base
no valor de uma varivel, constante ou fato relacionado com a situao alua i. Independentemente de que valor esteja sendo verificado, o resu ltado s pode ser verdadeiro ou fa lso. Como j discutimos, todas as expresses booleanas geram uma entre duas respostas: sim ou no, verdadeiro
Oll falso. No Dia 3, " Introduo Programao com o Visual Basic .NET', voc aprendeu sobre
as variveis booleanas, um tipo de varivel que s pode conter valores verdadeiros ou falsos.
Esses so os nicos tipos de expresso e valores permitidos como parte de uma instruo de controle porque e la precisa tomar urna deciso com base nesse valor. Expresses que no so booleanas apenas no funcionam; no produziriam urna resposta positiva/negativa ou verdadeira/falsa, e o programa no saberia o que fazer.
Os dois estados mais simples das expresses booleanas so verdadeiro e falso; todas as expresses booleanas, quando avaliadas, term inam com um desses dois valores. No entanto, no h
muitos programas que os usem diretamente. Em vez disso, so criadas expresses mais complicadas que so comparaes entre dois valores no boo leanos, operaes lgicas com valores
booleanos ou uma combinao desses dois tipos de expresses.

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:

>, ma ior que


<, menor que
=, igual a

<>,

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-

Controlando o Fluxo dos Programas

101

dres que empreguem caracteres especiais e comuns. Entre os caracteres especiais que podem
ser usados com Li ke esto:

*, para indicar a quantidade de caracteres adic ionais

?, para representar um caractere


#, para representar um dgito (0-9)
Intervalos ( [a -g)), por exemplo) para especi ficar que qualquer caractere dentro dele deve
ser considerado uma correspondncia

Desenvolveremos um pequeno programa para testarmos a instruo If e o operador Li ke. Esse


programa (veja a Listagem 4.5) aceitar um valor de teste e um padro como entradas e, em seguida, verificar se o valor de teste coincide com o padro .
LISTAGEM

4.5

PatternMatcher.vb

1 Pub1ic C1ass PatternMatcher

2
3

4
5
6
7
8

9
10
11
12

13

Sha red Sub Main{)


Dim sInput As String
Dim sPattern As String
Dim sMatch As String
System . Console.Write("Insira um padro:")
sInput = System.Console . ReadLine{)
sPattern = sInput
System.Console.Write("Insira uma string para a comparao:")
sInput = System.Console.ReadLine()
sMatch = sInput

14

15
16
17

18
19

20
21

If sMatch like sPattern Then


System.Console.WriteLine(sMatch & " Matched with " & sPattern)
E1se
System . Console.WriteLine(sMatch & " no coincid iu com "& sPattern)
End If
End Sub
End Class

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 ANO TRUE

TRUE

FALSE ANO TRUE

FAl SE

TRUE ANO FAl SE

FAl SE

FALSE ANO FALSE

FAl SE

TRUE DR TRUE

TRUE

TRUE DR FAlSE

TRUE

FALSE DR TRUE

TRUE

FALSE DR FAlSE

FAl SE

TRUE XDR TRUE

FAl SE

TRUE XDR FAl SE

TRUE

FALSE XDR TRUE

TRUE

FALSE XOR FA LSE

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.

Co ntrol ando o Fluxo dos Prog ramas

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

ShortCi reuit i n9. vb

1 Public Class ShortCircuiting


2
3
Shared Sub Main()
lf Test("Esquerda")ANOAlSO Test("Oireita")Then
4
5
'execute algo
End lf
6
7
End Sub
8

9
10
11
12

Shared Function Test(sInput As String) As Boolean


System.Console.WriteLine(sInput)
Test = FALSE
End Function

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

lidando com Mltiplas Possibilidades: A


Instruo Se 1ect Case
A instruo If pode manipuJarquase todo l ipo de requ isito para tomada de decises, mas na verdade, foi criada para lidar com opes de apenas uma ramificao. Se diversos valores diferentes
precisarem ser verificados e uma ao d ist inta for tOmada para cada um, as instrues I f podero
se tornar inadequadas. Considere o exemplo de um programa para insero de dados de imposto
de renda com roti nas separadas para manipular cinco categorias diferentes de clientes. A categoria do cliente baseada na quantidade de pessoas em um endereo domicili ar. Voc prefere d iredanar os usurios para a rotina correIa com base nesse valor. Com o liSO das instrues I f, o

cdigo pode ficar com a aparncia da Listagem 4.7.


LISTAGEM 4.7

Usando Muitas Instrues If Aninhadas

1 ..

2 If IngQuantidadePessoas = 1 Then
3
Ca11 RetornalmpostoPerCapta ()

4 Elself IngQuantidadePessoas = 2 Then


5
Call Retorna lmpostoOuasPessoas ()
6 Elself lngQuant i dadePessoas = 3 OR l ngQuantidadePessoas = 4 Then
7
Call RetornalmpostoOomiclioMdio ()
8 Elself IngQuant i dadePessoas > 4 ANO lngQuantidadePessoas < 10 Then
9
Call RetornalmpostoOomiclioGrande()
10 El se
11
Ca 11 Retorna Impos toOomi cl i oMuitoGrande ()
12 End If
13

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

Co ntrol and o o Flu xo dos Prog ramas

105

o uso da instruo Se I eet

Case no lugar das instrues If da Listagem 4.7 produzir o cdigo


alternat ivo mostrado na Listagem 4.8.
LI STAGEM

4.8

O Comando Select Case Pode Simplificar Muito Seu Cdigo

1 Select Case lngQuant i dadePessoas


2
Case 1
3 Call RetornalmpostoPerCapta ()
4
Case 2
5 Call RetornalmpostoDuasPessoas ()
6
Case 3,4
7 Call RetornalmpostoDocmiclioMdio()
Case 5 to 9
8
9 Ca 11 RetornalmpostoDomi cil i oGrande ()
10
Case Else
11
Call RetornalmpostoDomiclioMuitoGrande ()
12 End Select
A clusula Case El se usada exatamcnte como a clusula El se em uma instruo 1f, cxceto por,
nesse exemplo, ser executada se nenhuma das condies for atendida. Observe que, na Listagem
4.8 , apenas uma das condies poderia ser verdadeira a cada vcz. No h sobreposio entre as
diversas condies Case, o que faz muito sentido. Na verdade, as sobreposies no so evitadas
de modo algum pelo Visual Basic; possvel ter condies sobrepostas nas quais mais de uma
condio Case pode co incidir com um valor especifico. Se esse for O caso, s a primeira condio
que tiver uma correspondncia ser executada porque o programa sai da instruo SeI ect Case
depois que uma correspondncia foi encontrada e o bloco de cdigo apropriado fo i processado.
Embora no cause um erro, a sobreposio de condies pode ser confusa para o programador, e
mel hor evit-la apenas por isso.

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.

No use m lt iplas condies em sua instruo


Seleet Case se um nico valor puder ter correspondncia com mais de uma delas. Esse
t ipo de cdigo no um erro para o Visual Basic, mas ser d ifcil de entender o que no
muito desejvel.

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>

<valor inicial> to <valor final>

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

Ex i bi ndo Seu Nome Repet i damente

1 Dim iCounte r As Integer


2 For iCounter = I to 10
3
System. Console .Wri teL i ne( "Ouncan Mackenzie")
4 Next iCounter

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-

Controlando o Fl u xo dos Programas

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.

No altere o valor da varivel do contador


dentro do lao. A funciona lidade interna do
lao For aumenta o valor da varivel do contador sempre que o cdigo do lao executado,
mas voc no tem impedimentos para alterar
por sua prpria conta esse valor. Resista ten tao, ela s resultar em erros desconhecidos e em um cdigo incompreensvel.

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

Usando a Varivel do Contador

1 Public Class DaysOfTheWeek


2

3
4
5
6
7

Shared Sub Main()


Dim sOayName As String
Dim iFirstDay As Integer
Dim i LastOay As Integer
Dim iCurrentDay As Integer

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

Shared Function WeekdayName{ByVa l iDayNumber As Integer)As String


Dim sWeekdayName As String

19

20
21

22

23
24

25
26

Select Case iDayNumber


Case 1
sWeekdayName "Sunday "
Case 2
sWeekdayName "Monday "
Case 3
sWeekdayName "Tuesday

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"

"Inval id Day Number"

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" .

Especificando o Valor do Incremento com o Uso de Step


Nos exemp los anteriores, a varivel do contador era incrementada em I cada vez que o lao era
percorrido, mas possvel espec ificar o valor desse aumento. Depois do trecho com o valor final
da instruo For, voc pode inserir Step <valor do aumento>, e a varivel do contador ser incrementada com base no valor que fo r fornecido . Usando o exemplo do cd igo na Listagem 4 .1 1
corno ponto de partido, tente valores diferentes para Fi r st , Last e Increment e veja os res ultados.

Co ntrol and o o Flu xo dos Prog ramas

LISTAGEM 4 .11

109

ForExample.vb

1 Imports System
2 Public Class ForExample
3

4
5
6
7
8

Shared Sub Ma i n{)


Dim iCounter As Integer
Dim iFirstValue As Integer
Dim iLastValue As Integer
Dim iIncrement As Integer

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

iLastValue " 100


i Increment " 10

11

While iCounter

12
13
14

'<Insira o bloco de cdigo aqui>


iCounter = iCounter + iIncrement
End While

15

<=

iLastValue

End Sub

16 End Class
,

E claro que reproduzir a funcionalidade do lao For no uma maneira


til de usar seu tempo.
,
No precisamos selecionar apenas um lao; temos de utilizar todos! E prefervel empregar o lao
Wh i I e na exec uo de operaes mais compl icadas, como varrer um array em busca de um trecho especifico de dados. Na Listagem 4.13 , voc se preparar para essa pesquisa carregando um
array com algumas strings. Em segu ida, usando o lao Whi I e, varrer o array at ultrapassar a extenso dele ou encontrar a correspondncia que procura.
LISTAGEM

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

Dim arrList(9)As String


Dim iMatch As Integer ~ -1
Dim sMatch As String
sMatch = "Winnipeg"
arrList(D) "San Diego"
arrList(1) "Toronto"
arrList(2) - "Seattle"
arrList(3) "Londres"
arrList(4) "Nova York"

Controlando o Fluxo dos Programas

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

Do Unt;l Not (iMatch


'iMatch

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.

Co ntrol and o o Flu xo dos Prog ramas

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.

Exemplo 1: Usando um Lao For para Pesquisar um Array


Voc poderia criar um lao For para executar uma varredura em um array de tamanho fi xo, abortando-o com Exit For quando a correspondncia fosse encontrada.
For i
If

1 to 100

arrNomes(l) = "Joe" Then


System . Console . Writeline("Encontrado em I" & i)
Exit For

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

Exemplo 2: Procurando um Valor de Escape


Nos laos em que se quer capturar a entrada do usurio e ainda permitir que eles a cance lem,
duas condies de sada e lima instruo Exit em geral so usadas em um deles:

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.

Co ntrol and o o Flu xo dos Prog ramas

11 5

Implicaes sobre o Desempenho


H vrias dicas te is para ajud lo a conseguir o melhor desempenho com os laos em seu cdi
go . Primei ro, lembre-se sempre de que toda otimizao do desempenho em um lao muitas vezes mais benfica do que em outro local do programa. J que o cd igo do lao executado
repetidamente, qualquer melhoria no desempenho desse cdigo incrementada pela quantidade
de iteraes. Como exemplo, considere o cdigo da Listagem 4. 14.
LISTAGEM 4.14

LoopPerfonnance. vb

1 Pub l ic Class l oopPerformance


2
3
Shared Sub Main()
4
Dim i As Integer
5 6
For i " 1 to 1000
7
System.Console .Writeline(UserName())
Next i
8
9
End Sub
10
11
Shared Funct i on UserName() As String
12
Dim sName As String
13
sName " System.Environment.UserName
14
UserName " sName
15
End Function
16

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

1 Public Class LoopPerfonnance


2

3
4
5
6

Shared Sub Main()


Dim i As Integer
Dim sName As String
sName = UserName{)

Dia 4

LISTAGEM 4 .15

LoopPerformance_Better.vb (continuao)

8
9
10

For i " 1 to 1000


System . Console.WriteLine(sName)
Next i

11

12
13

End Sub

14
15

Shared Function UserName() As String


Dim sName As String
sName " System.Environment.UserName
UserName = sName

16
17
18
19
End Funct i on
20
21 End Class

Outra dica de desempenho impoltante, ao usar expresses booleanas, certificarse de que as


partes mais simples da expresso sejam colocadas em seu lado esquerdo e, em seguida, uti lizar
as clusulas de abreviao ANDALSO e ORELSE. Com essas verses dos operadores booleanos,
possve l que apenas o lado esquerdo da expresso seja avaliado, portanto prefervel que ele
contenha a mai s rpida das duas clusu las.

Aplicativos Que Faro Uso de Seu


Conhecimento Recm-Adquirido
Agora que voc sabe como usar instrues condicionais, como If e Sel ect Case, e vrios tipos de
laos, poder usar essas instrues para criar alguns exemplos interessantes de programas. Para
desenvolver esses exemplos, ser necessrio algo alm dos recursos do Visua l Basic aprendidos
at agora; precisaremos das classes do .NET Framework. Presentes de alguma fonna em todos os
exemplos anteriores, essas classes so conj untos de cdigos j existentes que foram empacotados e
disponibilizados para os programas pelo fato de o Visual Basic ser uma linguagem .NET. Esses
conj untos de cd igo so fornec idos como objetos, o que em essncia uma maneira de representar
um conceito ou entidade dentro de cdigos. Sempre que um objeto como System .Console ou
System.Securi ty . Pri nci pal for empregado, estaremos trabalhando com lima parte do .N ET Fra
mework. Para fazer isso, em geral prec iso informar ao Visual Basic que se cogita ulil izlo incluindo uma li nha como Imports System. Securi ty. Pri nci pal em seu cd igo. Considere esses ob
jetos como parte da platafonna .NET; eles podem trazer para os programas um conjunto enorme
de recursos para que os programadores no precisem desenvolver essa fu ncionalidade individualmente. Esse um conceito crtico do Visual Bas ic .NET, mas ainda o abordarei nos prximos captulos, portanto, no se preocupe se no parecer muito claro neste momento.

Co ntrol and o o Flu xo dos Prog ramas

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

1 Public Class ReadFromFile


2
3
Shared Sub Main{)
4
Dim sFileName As String
5
Dim srFileReader As System.IO.StreamReader
Dim sInputline As String
6
7

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

Etapa 2: Insira Este Cdigo Acima da Instruo End Sub da


Listagem 4. 16

sInputLine " "a l go"


Do Until sInputline is Nothing

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)

sInput Line = srF il eReader.ReadLine()


System.Console.WriteLine(sInput Line)
Loop

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

Adic i onado uma Verificao de Nothing

sInput Line = "algo"


Do Until sInputLine is Nothing
sInputLine = srFileReader.ReadLine()
If Not sInputLine is Nothing Then
System.Console.WriteL i ne(sInputL i ne)
End I f
Loop

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

1 Public Class Rea dFromFile


2
3
Shared Sub Main{)
4
Dim sFileName As Stri ng
5
Oim srFileReader As System.IO.StreamReader
6
Dim sInput l ine As String
7
8
sFileName = "MySampleFile.txt"
9
srFileReader = System .I O. Fi l e.OpenText{sFi l eName)
10
sInputline = srFileReader.ReadLine()
11
Do Until sInputL i ne i s Nothing
12
System.Console.WriteLine(sInputLine)
13
sInputline = srFileReader.ReadLine()
14
Loop
15
End Sub
16 End Class

Co ntrol and o o Flu xo dos Prog ramas

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.

3. Solic itar ao usurio um palpite.

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

Esse mtodo de gerar nmeros aleatrios retorna valores que so maiores ou


iguais ao limite inferior e menores que o superior li LowerBound <: )( " iUpper
Bound). Voc precisa especificar um valor superior que seja maior do que o mais
alto que deseja permitir. O Cdigo deste exemplo j faz isso.

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

usurio e, em seguida, usar esses valores para obter seu alvo.


LISTAGEM 4.20

Obtendo as Infonnaes Neces srias com o Usurio

1 Public Class NumberGuesser


2
Shared Sub Main()
3
Dim iTargetNumber As Integer
4
Dim iUpperBound As Integer
5
Dim iLowerBound As Integer
6
Dim iCurrentGuess As Integer
7
Dim iGuessCount As Integer
8
Dim sInput As String
9
Dim objRandom As System.Random
10
11
12

13
14
15

16
17

New System.Random()

System .Console.Write("I nsira o limite inferior: ")


sInput ; System.Console.ReadLine()
iLowerBound ; Clnt(sInput)
System.Console.Write("Insira o limite superi or: ")
sInput = System.Console.ReadLi ne()
iUpperBou nd = Clnt(sInput)

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.

Control ando o Fluxo do s Prog ramas

LISTAGEM 4 .21

1
2
3
4
5
6
7
B
9

10
11

12
13

14
15

121

Lao das Entradas de seu Jogo

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 "

&iGuessCount & "

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.

Evitando Laos Complexos por Meio da


Recurso
Em geral, h ma is de lima mane ira de resolver um certo problema e, embora um lao-padro possa fu ncionar, pode existir um modo mais simples. Se um problema for estruturado de modo correto ou voc puder reestrutur-lo da maneira certa, ento, ser possvel usar a recurso como
alternativa aos laos com uns. Em programao, a recurso ocorre quando um programa a li proced imento chamaa e le prpri o em um esforo para resolve r um problema. Os problemas que podem ser solucionados por meio da recurso so aqueles nos quais um subconj unto de les tem
exatamente a mesma estrutura que o seu todo. A melhor maneira de explicar esse conceito com
um exemplo, o clculo de um fatoria!. A fnn ula para o fatori al de um valor (n !)
n( n- I)(n-2) .. . (n-(n- I )( 1). Para um valor como I O, a fnn ula seria 10* 9 * 8 * 7 * 6 * 5 * 4 * 3 *

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

1 Public Class Factorial


2
Shared Sub Main{)
3
Oim sInput As String
4
Oim iInput As Integer
5
Oim iCounter As Integer
6
Oim iFactoria l As Integer
7

$ystem.Console.Write(UInsira um nmero: lO)

sInput " System.Console .ReadLine()

iInput " Clnt(sInput)


iFactoria l " 1
Fo r iCounter " O to (iInput - 1)
i Factori aI - (i Input - i Counter) * ; Factor i aI

la
11
11
13

Next i Counter

14

System.Console .WriteLine{iFactorial)

15

End $ub

16 End Class

NOTA

Quando experimentar esse programa, voc precisar manter o valor de seu


teste (10 em nosso exemplo) menor ou igual a 12. Qualquer valor maior produzir um fa torial que exceder o tamanho mximo de uma varivel de inteiros
(veja o Dia 3). Se tiver de dar suporte a va lores mais altos, use outros tipos de
varivel como o longo.

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

1 Public Class Recursivefactorial


Shared Sub Ma ln()
2
3
Dim sInput As String
Dim ilnput As Integer
4

Controlando o Fluxo dos Programas

LISTAGEM 4.23

RecursiveFactoria l .vb

(continuao)

11

Dim iCounter As Integer


Dim iFac toria l As Integer
System . Console.Write("I nsira um nmero: U)
sInput = System.Console.ReadLine{)
iI nput = Cl nt{sInput)
System.Console.Writeline(Factorial (ilnput
End Sub

12
13

Shared Function Factoria l (n as I nteger)as Integer

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?

Co ntro land o o Flu xo dos Prog ramas

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

O que 'arqu itet ura do ap licativo' ?

Que opes de arqu itetura a plataforma .NET fornece?

O que est envolvido na escolha de uma arquitetura de aplicativo?

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.

o Que a Arquitetura do Aplicativo?


Anterior construo e muito antes de um prdio estar pronto para ser usado, um arquileto manipulou a fase do projeto. Depois que se obteve um consenso sobre sua concepo bsica, so criados esboos que mostram as particularidades do edifcio proposto com maior transparncia e
formam a base do projeto detalhado que deve ser criado antes que qualquer trabalho de construo seja iniciado. No decorrer desse processo, no s no comeo, o arquiteto com toda a equipe
do projeto, responsvel por produzir o resultado correto.

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.

Funo do Arquiteto de Softwares


Independentemente da apropriao do nome de uma profisso existente, as semelhanas podem
ser traadas. Quando um edifcio est em fase de projeto, os arquitetos usam seu conhecimento
avanado tanto da funo quanto do projeto para idealizar e planejar sua estrutura e fundao geral com base nos requisitos que forneceram a eles. Com os softwares, o mesmo processo ocorre.
Um arquiteto de softwares (ou sistemas) desenvolve um planejamento para construir o sistema
com base em requisitos. Nos dois casos, o planejamento no final se toma um projeto detalhado
de como deve ser construdo, e outras equipes de profissionais se encarregam de manipu lar a implementao real.
Embora algumas pessoas no consigam ver essa atividade como algo prximo complexidade
do projeto e construo de um imenso arranha-cu, o desenvolv imento de softwares complicado, e a funo de um arquiteto de extrema necessidade em sistemas de quase todos os tamanhos. Independentemente da dimenso do aplicativo que voc estiver construindo ou de quo
pequena for sua contribuio individua l para o sistema, uma arquitetura ter sido escolhida (talvez de modo informal) e estar sendo usada.

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

Arquitetura dos Aplicativos na Plataforma .NET

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.

Que Partes de um Sistema So Consideradas Arquitetura


do Aplicativo?
Uma resposta breve para essa pergunta seria ' todas', mas ela muito abrangente para ser til . Os
aspectos que envo lvem a arquitetura de um sistema so os ' grandes detalhes', como que tipo de
interface com o cliente ser usada, se sero executados aplicativos Windows ou da Web e como
o cdigo da pgina da Web se comunicar com o banco de dados de back-end. O aspecto principal que a arquitetura do sistema tem relao com a base e a estrutura do aplicativo, e no com as
opes de implementao que sero selecionadas dentro dessa estrutura.
O arquiteto, no entanto, ser envo lvido na fase de impl ementao, mesmo se parecer que todos
os 'grandes detalhes' j foram determinados e s restaram os mais fcei s relacionados implementao. Ele continua engajado por duas razes principais: para veri ficar se a arquitetura escolhida provou ser a correta (fazendo os ajustes necessrios para lidar com os problemas que
aparecerem) e para se cert ificar de que o projeto esteja sendo impl emcntado como foi plancjado.
Pode ser difici l de acreditar, mas s vezes os desenvolvedores se desv iam do projeto de um sistema, produzindo resultados indesejados.
Para responder a pergunta mais especificamente, em sistemas .NET, a arqu itetura deve fornecer
urna viso geral de alto nvel de cada aspecto do apli cativo. O essencial o nvel de detalhes; a
maioria dos itens discutidos na fase da arquitetura ser abordada novamente no projeto detalha-

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.

Distribuio Lgica e Fsica dos Cdigos


No nvel da arquitelUra, as decises podem ser tomadas com base em uma organ izao pretend ida, penni lindo que os cdigos sejam categorizados em grupos como cdigo de acesso aos dados, cdigo de segurana, cdigo de intelface com o usurio e outros. Na real idade, qualquer diviso de cdigos depende de cada programador e do resto da equipe do projeto. Nada relacionado plataforma .NET (ou qualq uer outra ferramenta de desenvolvi mento) o forar a manter os
cd igos agrupados de maneira organizada. No entanto, no deixe que a realidade o bloqueie;
para as finalidades do projeto, importante categorizar os cd igos mesmo se essa organizao
nunca existir efetivamente. O que deve ser deterrninado sobre esses grupos onde sero executados; sero todos processados como parle de um nico aplicativo em apenas uma mqu ina ou o
cd igo de acesso aos dados ser executado em um servidor independente?
Mai s frente nesta lio, abordarei o conceito de camadas, em que toda a funcionalidade de um
aplicativo dividida de modo lgico. Essas camadas so, ento, tratadas como se fossem conj untos de cd igo independentes, os quais podem ser movidos vontade. As dec ises a respeito
de onde executar cada camada de um aplicativo e de quantos serv idores sero usados para cada
uma delas constituem esse elemento da arqu itetura do sistema.

A rqu itetura dos Aplicativos na Plat aforma .NET

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.

Comunicao entre Componentes


Se voc estiver desenvolvendo um sistema distribudo, para ser executado em vrias mquinas,
ento, alguma forma de comunicao precisa exisl'ir entre os diversos componentes. H muitas
opes diferentes, mas no nve l da arquitetura, s preciso ser especfico com detalhes quej forem definitivos ou relevantes devido a algum outro aspecto do projeto. Nessa rea, pode ser necessrio definir o protocolo de comunicao se ti vermos de nos conectar com outro sistema ou se
os detalhes tcnicos forem cruciais para um projeto paralelo como a configurao da

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

detalhar exatamente como os programadores implementaro esses recursos.


Acesso aos Dados
Que reas de cd igo acessaro os dados? Como fa ro isso? Esta seo detalha como o ap li cativo
se conectar aos dados (provedor OLEDB usando a segurana do SQL Server, por exemplo).
Questes mais complexas, como o projeto e a organizao do banco de dados efetivo, so mais
bem defi nidas na fase do projeto detalhado ou como parte da implementao final.

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

Arqu itetura dos Aplicativos na Plataforma .NET

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.

Arquiteturas Viveis na Plataforma .NET


No h uma quantidade fixa definida para as arquiteturas que podem ser desenvolvidas - todas
as opes diferentes poderiam ser combinadas para produzir um universo dc variaes - , mas
existem certas arquileturas generalizadas dentro das quais a maioria dos sistemas .NET falharia.

Os Trs Elementos de Qualquer Aplicativo


As di ferenas entre todas as arquiteturas possveis residem em como as trs camadas di stintas de
um sistema de computador so distribudas. Essas trs camadas so li stadas aqui , junto a uma
descrio breve:

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-

Arquitetura dos Aplicativos na Plataforma .NET

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.

Onde a Plataforma .NET Se Encaixa?


A plataforma .NET uma mudana radical no desenvolvimento, mas podem ser aplicados a e la
os mesmos conceitos gerais de arquilet ura. Muitos sistemas .NET seguem os modelos e exemplos di scutidos anteriormente e podem ser classificados como de somente uma camada, cliente/servidor ou at como aplicativos Wi ndows. A tecnologia pode mudar (AS P. NET em vez de
ASP, classes .NET em vez de objetos do COM e assi m por diante), mas a arquitet ura ainda a
mesma. No entanto, a lg umas outras opes esto disponvei s para aprimorar a arquitelura do
Windows DNA quando a platafo rma .NET for usada.
O primeiro conceito novo envolve a comun icao entre as camadas. No Windows DNA tradicional, as pginas da Web se comunicavam com os objetos operacionais do COM usando o
DCOM (Distributed COM), que um padro binrio usado para ligar todos os aplicati vos con fi gurados para COM atravs de uma conexo de rede . A abstrao entre as camadas li mitada por
esse mtodo de comunicao porque s possvel empregar as tecnologias que podem usar o

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.

Escolhendo uma Tecnologia de Cliente


Uma das escolhas mais polmicas quando se projeta um sistema que tipo de cliente ser criado,
que em geral uma discusso sobre a possibi lidade de do t ipo'thick' ou do t ipo 'thin'. As principais opes na platafonna .NET so as mesmas que j esto disponveis por algum tempo,
ASP.NET para criar um aplicativo da Web ou Windows Forms (Fonnu lriosou Aplicativos
Windows) para gerar um aplicativo Windows. O segredo determinar qual mais adequada
para um sistema ou projeto especfico . As sees a seguir descrevem as duas tecnologias, abordando seus benefcios e problemas. Posso fornece r a voc lima regra simples para informar que
tecnologia usar em qual situao? No, mas ainda nesta lio, disponibilizarei uma lista geral de
perguntas que pode ser usada para ajudar a tomar vrias decises sobre a arquitetura, inclu indo
que tipo de cliente usar.

Sistemas de cliente do Tipo 'Thin' (ASP.NET)


As Aclive Server Pages so desenvolvidas com o uso das linguagens .NET padro (como o Vis ual Basic.NET) e so projetadas para processar solicitaes recebidas de usurios e retornar o
resu ltado apropriada em seus navegadores. O cdigo que voc escrever para urna pgina
ASP.NET ser executado no servidor Web, e no no cliente, que o ponto mais importante
quando se compara esse tipo de interface com qualquer outra. O ASP.NET no possui nenhum
requisito de cliente alm do acesso rede e alguma forma de navegador. Podem ser desenvo lvidas pginas AS P.NET que exibam um contedo HTML mais sofisticado e que term ine com uma
sada que precise da maior e mais recente verso do Internet Explorer, mas essa urna opo exclusivamente sua. Tambm possvel escrever as pginas da Web de modo que elas retornem o
contedo HTML mais simples j visto, permi tindo que at o primitivo navegador Mosaic consiga visualiz- Ias. O sistema operac ional do cliente tambm no um problema. Exatamenle
como na Web. suas pginas podem ser visualizadas de qualquer plataforma em que a Internet
esteja disponvel.

Arqu itetura dos Aplicativos na Plataforma .NET

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.

Aplicativos Windows (Windows Formsl


Em geral, difici l explicar o que quero dizer com 'aplicat ivo Windows' porque esse o nico
tipo de aplicativo que a maioria das pessoas j viu. Basicamente, um ap licativo Windows algo
que voc pode criar usando uma combinao dejanelase caixas de dilogo para ser executado na
plataforrna Windows. Quase todos os aplicativos que estamos acostumados a utilizar - o M icrosoft Oftice, o Quicken e at o Solitai re - so exemplos do que pode ser desenvol vido com o uso
dos recursos do Windows Forms da plataforma .NET.
Depois de ler a seo anterior sobre o ASP.NET, voc pode estar se perguntando por que no
usar sempre uma interface da Web, e no o nico. Um aplicativo do Windows Fonn s possu i alguns requi sitos para a mquina cliente:

o .NET Framework deve se r instalado no cl iente, enquanto no caso do ASP.NET, s necessrio no servidor Web.

O Framework s executado em platafonnas Windows.

Seu aplicativo deve ser instalado.

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

Muitos desenvolvedores da Web no concordariam com m eus comentrios de


que o ASP.NET ma is difcil de usar no desenvolvimento do que o Windows
Forms, mas apesar das diversas virtudes que apresenta, a que ele se torna
compl icado.

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

Com o uso do Dynamic HTML, controles ActiveX e outras tecnologias mais


complexas da Web possvel melhorar algumas das questes descritas anteriormente. Ao fazer isso, no entanto, algumas vantagens do ASP.NET sero perdidas j que voc estar criando um aplicativo com suporte restrito s plataformas (os controles ActiveX s so executados em certos sistemas operacionais
e processado res, e o Dynamic HT ML no tem suporte em qualquer navegador)
e que pode at ter alguns requisi t os de implantao .

Decidindo Que Arquitetura Usar


Tomar uma deciso efetiva quanto arquitetura, mesmo antes das alteraes especficas do aplicativo serem feitas , decerto valer a pena independentemente de quanto voc precisar pagar para
um desenvo lvedor de sistemas experiente. Se tomar adec iso errada nesse momento, todo o pro-

Arqu itetura dos Aplicativos na Plataforma .NET

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.

Fatores Essenciais Que Influenciaro Sua Deciso

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:

Que sistemas operac ionais esto instalados nos sistemas de destino?

Quais so as especificaes de hardware das mquinas de destino (CPU/RAM/espao em


disco)?

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:

Qual a velocidade de comunicao disponvel entre os usurios e os servidores de


back-end (ou o que estar d isponvel, se os servidores de back-end ainda no existirem)7

Os servios de acesso remoto sero necessrios e/ou fornecidos? VPN? Dial -up?

Os computadores-cliente tm acesso Internei?

H algum software/hardware de firewall entre os usurios e os servidores de back-cnd?

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:

Corno os us urios sero autenticados na rede existente?

As mqui nas clientes pertencem a um domn io do Windows 20001NT?

Se pblico, o acesso ser annimo ou os usurios tero de se ident ificar?

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.

Velocidade das alteraes na lgica operacional- Se a lgica operacional que conduz o


s istema se alterar rapidamente, isso afetar a freqncia com que o cl iente em um sistema
cl ieme/servidor teria de ser atual izado . Alteraes maiores na lgica operacional decerto
precisariam at mesmo de um a atualiz.:'lo tambm do cliente.

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,

Arqu itetura dos Aplicativos na Plataforma .NET

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.

Requisitos/planos futuros - Ao desenvolver a arquitetura para um sistema, voc ter de


enxergar a lm dos requisi tos al uais e consideraras de amanh. No mnimo, mesmo se no
tiver informaes sobre quais sero os planos futuros, desenvolva um sistema que possa
ser aprimorado. Se j souber os detalhes especficos, documente-os em seus requisitos e
projete de modo apropriado. Como exemplo desse tipo de infonnaes, imagine um sistema planejado para ser usado por duas pessoas, mas que ser aberto para a comunidade da
Web em alguns meses.

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.

Sistema de uma Videolocadora


Narrativa dos Requisitos:

"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.

Arquitetura dos Aplicativos na Plataforma .NET

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

A deciso de ler 11m


sile pblico da "'eb
allerou a ar{fuilelura
da I'ideolocadora para
asseguror qlle os
dados do escritrio
celllral fiquem
alllali=ados.

~ -

\.~
(,-+~
.

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

Servio de Listagens Imobilirias


Narrativa dos Requisitos:

"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.

Biblioteca Pessoal com Informaes sobre CDs


Narrativa dos Requisitos

"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

Arquitetura dos Aplicativos na Plataforma .NET

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

o Que Fazer Quando Programas


Bons Apresentam Problemas e
para Se Certificar de Que Isso No
Acontea
Pode acontecer um erro quando seu programa estiver sendo executado (normalmente causando a
interrupo dele). Se ocorrer no momento em que um cliente estiver processando seu programa,
algo bem pior poder acontecer (voc pode no ser pago). Portanto, seria melhor se pudssemos

evitar esses problemas antes que acontecessem .


H duas tcnicas importantes que o ajudaro a ev itar erros. Primeiro, voc deve detectar quando
as falhas ocorrerem em seus programas e lidar com elas em vez de permitir que a mensagem de
erro padro surja como resposta. Em segundo lugar, bom se certificar de que seu aplicativo tenha a menor quantidade de erros possvel.
Hoje, voc aprender as duas princ ipais maneiras de evitar problemas em seu cdigo:

Tratamento de excees estruturadas

Depurao

Dia 6

148

Tratamento de Excees Estruturadas


As verses mais antigas do Visual Basic usavam o tratamento de erros para proteger um aplicativo. O Visual Basic .NET a primei ra verso adar s uporte a um conceito melhorem linguagens
de programao - o tratamento de excees estruturadas.
,

O Que E o Tratamento de Excees Estruturadas?


Antes que voc possa examinar o que Structured Exception Handl ing (SEH, trataNovo TERMO
mento de excees estruturadas), deve aprender apenas o que significa urna excet70
eSlrulllrada - ou at uma exceo neio eSfrulllrada. Caso contrrio, no saber o que est tralando.
Uma exceio algo que sa i da rotina (e em geral de maneira inesperada) cm seus aplicativos. H

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?

o Que Faze r Qu and o Programas Bons Apresentam

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.

A Sintaxe de Try ... End Try


SINTAxe

o cdigo a seguir mostra a sintaxe do bloco Try ... End

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

Capturando Vrias Excees

1 Try

3
4
5
6
7
8

Catch eNoFile As Fi l eNotFoundException


' trate aqui a exceo causada por arquivos no encontrados
Catch elO As IOExcept ion
' trate aqui a exceo causada por uma entrada/resultado
(atch Ex As Except i on
' trate aqui as outras excees

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:

o Qu e Faze r Qu an do Progra m as Bons Apresentam

Prob lem as e ...

151

FIG URA 6 .1

A caixa de dilogo
['roj ecl Properlies

para 1/11/ programa


com lili/ti exce[io.

_
--

--,

............

::II ' : tv<'......

..........

: : . c...........

~_ ,

...

"" - _:
_fi"
ww..-,

LISTAG EM 6 .2

<.~

. ....... """".....- - - ......,.." ,,"".....

~;

..,..

'

'

0,"""

Um Programa com Exceo

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

1 Unhandled Exception: System.DivideByZeroException:


2 An exception of type System.OivideByZeroException was thrown.
at System.Decimal.Divide(Oecimal dI , Decimal d2)
3
4
a t Except i ons .modExcept i ena 1 . Ma i n () i n
5 C:\Code\Day06\Exceptions\modExceptional .vb:l i ne 11

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 .

o Que Fazer Quando Programas Bons Apresentam

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

Ocorre quando voc passa um valor nulo para um mtodo, e


ele no o aceita.

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

Ocorre quando se tenta efetuar uma dviso por uma varivel


no inicializada ou que contenha o valor zero. Em geral s
acontece quando h erro do programador.

I ndexOutofRangeExcepti on

Ocorre quando se tenta acessar o membro de um array que


no existe. Em geral acontece por causa de erro do programador, mas tambm poderia ser causada por entradas invlidas do usurio.

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

Ocorre quando seu programa no tem memria suficiente.


Isso poder acontecer ao preencher arrays extensos ou ao
executar um lao .

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

O exemplo de um erro que no definido no espao de nome


$ystem. Nesse caso, a exceo definida no espao de nome
System_ 10 (veja o Dia 8 , ~Introduo ao .NET Framework~,
para obter mais informaes sobre os espaos de nome).
Esta exceo ocorre quando voc tenta acessar um arquivo
que no existe. Isso pode acontecer porque talvez ele no tenha sido criado ou o ca minho est incorreto .

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

LISTAGEM 6. 3 Ad icionando o Bloco Try ... End Try

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

o Que Fazer Quando Programa s Bons Apresentam

Pro blemas e ...

155

seguida, ser exibida uma mensagem de eITo, e o cdigo continuar at o final , comeando na linha posterior a instruo End Try.

Aninhando Blocos Try .. End Try


Voc pode encontrar LIma si tuao na qual que ira proteger duas sees de cdigo com blocos
Try .. . End Try, mas deseja lidar com as excees de maneira diferente. Se os doi s forem blocos
separados de cdigo, no haver prob lema. No entanto, se um dos blocos estiver contido no outro (veja a Listagem 6.4), no h opo. Nesse caso, preciso aninhar os blocos Try ... End Try,
como mostra a Listagem 6.4 .
COOIGO

1
2
3
4
5
6
7

LISTAGEM

6.4

An i nhando Blocos Try .. . End Try

Sub WriteToF i le{ByVal FileName As String)

Dim fsOut As System. IO.FileStream


Dim strOut As System . IO.StreamWriter
Tcy

'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

Usando a Seo Fi nall y

Sub WriteToFile{ByVa l FileName As String)


Dim fsOut As System.IO.FileStream
Dim strOut As System . lO.StreamWriter
Try
'Abra o arquivo
fsOut "
New System. IO .F ileSt ream{FileName ,_
System. IO.FileMode .OpenOrCreate .
System.lO .F ileAccess.Write)
Tcy

'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

o Qu e Faze r Qu an do Progra m as Bons Apresentam

Prob lemas e ...

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

1 Dim oCust As Customer " New Customer("Bob" , "Sjerunk l lO)

2 Dim oEmp As Employee " New Employee("Phil","Barr")


3 Dim o$omething As Object

4 o$omething " oEmp


5 If TypeOf oSomething Is Customer Then
6
oCust = oSometh i ng
7 Else
8
Throw New InvalidCastException("No possvel atribuir Employee a Customer,")
9 [nd If

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

no tm de ser astutos?", Mesmo sendo verdade que todos os desenvolvedores so talentosos

(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.

A Fonte dos Erros


Um erro (em um programa de computador) pode aparecer de vrias maneiras. possvel que

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

Console . WriteLine("Digite o nome : ")


Name = Console. ReadL i ne ()
Console.WriteLine("D nome digitado foi {DIli , sNmae)
End Sub
Module

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,

o Qu e Faze r Qu an do Progra m as Bons Apresentam

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.

No esquea tambm de ativar Opti on Stri ct.


Essa opo assegurar que voc sempre esteja a par quando um valor for passado a uma
varivel de um tipo diferente. Aconverso automtica pode levar a erros traioeiros. Consciente de sua necessidade, voc poder
executar a tarefa de modo mais apropriado .

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.

Aprendendo a Depurar com a Prtica


Como j foi dito, a depurao quase tanto uma arte quanto uma cincia. s vezes, ela requer
urna certa destreza para que se descubra o que pode estar causando um erro. Portanto, tenho a
impresso de que umas das melhores manei ras de aprender a depurar utilizar esta tcnica em
um programa real , e no apenas examinar suas ferramentas (o que pode ser um pouco subjetivo).
Por isso, voc depurar um programa que calcula uma tabela de valores de hipoteca. Ele most ra
os diversos pagamentos mensais que seriam necessrios a emprstimos de vrios perodos e taxas de juros. A Listagem 6.7 contm a sada procurada envo lvendo um emprstimo de 100 mil
dlares.
RESULTADO

Resultado de um Programa Que Calcula a Tabe la de


Pagamentos de uma Hi pateca

LISTAG EM 6 .7

Digite o valor do emprstimo:


100000
Anos 10

Juros
5.00
5.25

15

1060.66 790.79
1072.92 803.88

20

25

30

659.96 584.59 536.82


673.84 599.25 552.20

Dia 6

160
1

LISTAGEM 6.7

Resultado de um Programa Que Calcu l a a Tabela de Pagamentos de


uma Hipoteca (continuao)

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

790.38 722.81 682.18


805.59 738.99 699.21
820.95 755.33 716 . 41
836.44 771.82 733.76
852.07 788.45 751.27

867.82805.23768.91
1253.27 999.45 883.71 822.14 786.70
1266 . 76
1280 . 33
1293 . 98
1307.70
1321.51

1014.27 899 . 73 839.20 804 . 62


1029.19 915 . 87 856.38 822 . 68
1044.22 932.13 873.70 840.85
1059.36 948.52 891.14 859.15
1074.61965.02908.70877 .57

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

Um Programa Que Preci sa de Depurao

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

Oim dblReturn As Oouble


'Armazena a entrada do usurio
Dim dblPayment As Double
Console .Write(UDigite o valor do emprstimo:")
sInput = Console.Readline{)
dblReturn = CObl (sInput)

o Que Fazer Quando Programas Bons Apresentam


LISTAGEM 6.8

CODIGOI
RESULTADO

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Private Sub OutputMortgageTable(ByVal Principal As Oouble)


Oim iYears As Integer
Oim i Rate As Integer
Oim dblAnnuallnterest As Oouble
Console.Writeline(Tab &"Years" &Tab & "10" &Tab & "15" &
Tab & "20" &Tab & "25" &Tab & "30")
Conso 1e . Wri tel i ne (" Juros ")
For iRate : 500 To 1000 Step 25
dblAnnuallnterest = iRate / 100
For iYears = 10 To 30 Step 5
Console.Write(Fonnat(dblAnnuallnterest , IO .#O")& Tab & Tab)
'iYears * 12 para obter o nmero de meses (pressupondo
" pagamentos mensais)
Conso 1e. Wri te (Fonna t (payment (pri nc i pa 1. _
dblAnnualInterest.iYears * 12), "0 . 00") & Tab)
Next
Console.Writeline()

41

161

Programa Que Precisa de Depurao (continuao)

'Crie a tabela
OutputMortgageTable(dblReturn)
Console.Write("Pressione ENTER para continuar")
Console . ReadLine()
End Sub

40
42
43
44
45
46

Um

Prob lemas e ...

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

Digite o valor do emprstimo: 100000

162

Di a 6

CODIGOI

LISTAGEM 6.8

Um Programa Que Precisa de Depurao (continuao)

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

Os Modos na Vida de um Programa


Durante a criao dos programas no Visual Basic .NET. eles passaro por trs modos distintos.
Quando voc iniciar pela primeira vez o VB .NET e estiver trabalhando em um programa, esse

o Que Fazer Quando Programa s Bons Apresentam

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

O Visuall3asic .NEr 110

[00 [<II. "'" _

.,....,

1'" _

tlot>

u !ii:g" 1o r.ta r...,. ' . .>J.

. -...

modo Break.

... . .,._.... . . .,.


'Co . . . . ,.,",

c.....,. . ,,,,, .. , , . ,,. , .... _ .. t , " )

.u
.
... ,.. ,.... . <,.,(.1.,""

. , .... , . 0;0 . . . ' . . . .. , , , , _ ,,

,< ,. , ....... ,.

o." .' Oo"_ T"" . ,""Par-'"


'.uh

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 na margem colorida esquerda da janela do cdigo, prximo linha na qual


gostaria que estivesse o ponto de interrupo. Um crculo vermelho deve aparecer na
margem.

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-

Usando Pontos de Interrupo para Examinar o Programa de


Exemplo
Carregue a verso inicial do programa no IDE (do diretrio OriginalMortgage), de modo que
voc possa testar os pontos de interrupo. Com o mdu lo modMai n. vb aberto no editor, d um
clique na margem colorida, prximo lin ha
dblReturn : CObl(sInput)
Dever aparecer um crcu lo verme lho perto da linha. Se isso acontecer, inic ie o programa no
IDE. A janela do console deve surgir, perrnitindo que seja digitado um valor para o emprstimo.
Insira 10000 e pressione Enter. Voc dever ser enviado novamente ao IDE onde uma seta amarela ser adicionada ao crculo vermelho, como vemos na Figura 6.5. A seta amarela sempre
mostra a prxima linha a ser executada.

o Oue Fazer Ouando Programas Bons Apresentam


FIGURA

, _ _ .........., ........ .. '''-''',(1)00 ... ) - . -... ).....

6.5

Execlltando

165

Problemas e ...

t'"' jlooo _
ii: . U IlUHIIl

f'o

1/111

prog rallla com


pOlllo de
inlerrupcio.

11111

OM Ootu> I.... _
Iotlo

Iro ... . ,. &:I.

.:. )C~~.J "', ~'.

:3 ~I!.

. -.,
. ' R "

.... . . ,...-.,
".,"t.< ,.."
'Go< U. . . ' .... ,

."

Co ... , ....
. , ..... -

(0 .... , . . . . _

"

...".

_""" " 1

... "

.*>l ...... _C ... , 1"',U<l


C . . . . . " .. , ... ,

...,,"""_T... '.I ....o<....1

Percorrendo Seu Cdigo


Um dos recursos mais teis d isponveis no modo Break a capacidade de percorrer o cdigo. Ele
permite que o usurio visualize o fluxo ou lgica de um programa, possivelmente encontrando
erros em laos ou durante chamadas de procedimentos. Depois que voc tiver entrado no modo
Break, poder comear a percorrer seu cdigo linha a linha. Isso permitir que examine o efeito
de cada uma delas sobre as variveis ou que se certi fique de que os programas executem realmente as etapas que planejou. H quatro funes principais relativas s etapas, disponveis no
menu Debug ou na barra de ferramentas de depurao. Elas so:

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.

Usando o Recurso de Percorrer o Cdigo para Examinar o Programa

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.

o Que Fazer Quando Programas Bons Apresentam

Prob lemas e ...

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:

Pesqu isa em janela suspensa


Se voc mantiver o cursor do m Ollse posicionado sobre
uma varivel do procedimento aluai, uma pequena janela aparecer most rando seu valor
no momento. possve l ver isso na Figura 6.8, em que a varivel dbl Return atualmenle
annazena o valor 100000. Essa uma ferramenta til e prtica se s quisennos fazer uma
verificao breve de um valor ocasionalmente . Outro beneficio dessa ferramenta que se
pode sclecionar a parcela de um clculo para saber seu valor, sem precisar que todo ele
seja executado.

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.

Examinando Variveis para Depurar o Programa de Exemplo


J que voc deu uma aparncia melhor para o layout da tabelada hipoteca, o n ico erro que ainda
,
poderia existir estaria no clculo de cada varivel. E recomendvel depurar a funo Payment
para se certificar de que apenas os valores corretos estaro em uso. Siga estas etapas:
I. Encerre o programa se ele est iver em execuo agora. Remova todos os pontos de interrupo existentes e adic ione um primeira linha da funo Payment. A linha deve ser esta
Dim dblMonthlylnterest As Double

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.

o Qu e Faze r Qu an do Progra m as Bons Apresentam


FIGURA

6.8

!lo

Examinando os I'a/ores
das Wlriveis.

""

e._

1l '\:.I . ~ g"

t'ol

1'0

~e. "' ,

.....

.. .p . ~
... _

Prob lemas e ...

. -..

169

. ,. ...

~~~

...... <11

.
..
..
"

(.... ,. ,.. ".1., .. U

,,

NOTA

Mesmo comeando com uma declarao, essa linha executvel porcausa da


atribuio.

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

Return Principal * (dblMonthlyInterest *_

((1 + dblMonthlyInterest) A Periods) 1_


(((1 + dblMonthlylnterest) A Periods) - 1))
Os parnteses no custam nada. Quando voc estiver escrevendo uma funo
matemtica, no economize em seu uso - empregue quantos precisar pa ra se
certificar de que as operaes sejam efetuadas na ordem correta. Como alternativa, possvel colocar cada etapa em uma linha, embora isso exija mais va riveis temporrias no clculo.

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.

Retoques Finais no Programa de Exemplo


H algumas outras alteraes menores que voc pode fazer para organizar melhor este programa . Por exemplo, o cd igo que usado para formular uma pergunta ao usurio poderia ser inserido em uma funo. Isso permitiria s ua posterior substituio por um cdigo que processasse
uma funo semelhante, porm com formulrios Windows, da Web, ou em alguma outra tela.

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.

o Que Fazer Quando Programas Bons Apresentam

Pro blemas e ...

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

Dim iVears As Integer


Oim iRa te As Integer
Oim dblAnnua l lnterest As Oouble

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

For iRat e = 500 To 1000 Step 25


dblAnnualInterest = iRate / 100

36
37
38
39

40
41
42
43

Console .W rite(Fonnat(db lAnnualInterest ," O.IO") & Tab & Tab)


For iVears = 10 To 30 Step 5
'iVears * 12 pa r a obter o nmero de meses (pressuponha pagamentos
- mensai s)
Console.Write(Fonnat(Payment (Principal .
dblAnnualInterest , iYears * 12),"0 . 00")& Tab)
Next
Console.WriteLineO

172

Di a 6

COIGO

44
45
46
47
48
49
50
51
52
53
54
55
56
57 End

LISTAGEM 6 .9

Cdigo Depu r ado (continuao)

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

Outras Ferramentas para Depurao


Muitas outras ferramentas esto disponveis para ajud-lo na depurao . Muitas de las so avanadas e no fazem parte do escopo deste livro, mas voc deve ao menos saber que ex islem. Entre
elas destacamos

lmmed iate Window


Est sempre disponvel no menu Debug, Windows. Abre uma
janela que permite inserir uma li nha de cd igo a ser executada imediatamente. Isso possibil ita o teste de pequenos trechos de cdigo. J que est disponve l havendo ou no a depurao, pode-se usar a janela lmmediate para testar pequenos clcu los enquanto os
programas so escritos. Um emprego comum para esta janela exibir o contedo das variveis ' disponibi lizando-o' nesse local, por exem pl o:
?db l Mo nthlylnterest
4. 16666666666667 [ -D3

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.

o Que Fazer Quando Programas Bons Apresentam

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

Tabela de Multip li cao

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

Cdigo da Tabela de Multiplicao

1 Imports System
2 Imports Microsoft.VisualBasic.ControlChars
3

4 Module modTable
5
6
Sub Main()
7
8
9
10

Dim iLow.iHigh As Integer


Oim sInput As String

11

Do

12
13

'Permita vrias execues da geraao da tabela

'solicite valores
Console . Write("Valor mnimo (mximo igual a 20 . O para
finalizar): ")

o Qu e Faze r Qu an do Progra m as Bons Ap resenta m


Cdigo

LISTAGEM 6.10

15
16
17

20
21

24
25
26

27

Cdigo da Tabe la de Multiplicao (continuao)

If iLow <>0 Then


Console.Write("Valor mximo (mximo ig ua l a 20): ")
sInput = Console.ReadLine{)
iHigh " CInt(sInput)

18
19

23

175

sInput " Console.ReadLine{)


iLow = CInt{sInput)

14

22

Prob lem as e ...

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

Private Sub OutputTable(ByVal MinValue As Integer,


ByVal MaxValue As Integer)
Oim iCount, iCount2 As lnteger
Console.WriteLine{)
Console.WriteLine{"Tabela de multiplicao ({O) a {l}" ,
MinValue,MaxValue)
' exiba o cabealho
For iCount = MinValue To MaxValue
Console.WriteLine(Tab & CStr(iCount
Next
Console.WriteLine{)
'Exi ba cada uma das linhas da tabela
For iCount = MinValue To MaxValue
For iCount2 " MinValue To MaxVa l ue
Console.Write(CStr(iCount)& Tab & CStr(iCount * iCount2
Next
Console.WriteLineO
Next
End Sub

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-

cees. Corno altemativa, pesquise a li sta selccionando Exceptions no menu Debug, do


Windows.
4 . Use o aplicativo do exemplo para testar os tipos diferentes de pontos de interrupo. Ten-

te configurar um quando o pagamento est iver abaixo de um certo valor.

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.

Onde os objetos sero inseridos em seus programas.

Comearemos com a definio bsica de objeto e todos os termos e conceitos que a acompanham.

Para Comear: O Que um Objeto?


Para definir o termo ' objeto', poderamos retornar no tempo at o lat im medieval , 'obiect urn ' ou
'coisa colocada na frente da mente ' , mas para usarmos um termo mais si mples comearemos
apenas com a palavra ' coisa' . Um objeto uma descrio genrica de qualquer coisa que se pode
querer discutir, ou usar no trabalho. Em conversas corriqueiras, o temlO objeto em geral se desti
na a descrever apenas coisas materiais, mas em programao, em que mu ito pouco realmente
tisico, essa definio ampliada para incluir qualquer entidade. Podemos nos referir a um carro,
pessoa Oll prdio como um objeto, mas tambm aceitvel usar esse termo para descrever algo
menos tangvel como uma taxa dejuros ou lima regra que ser apl icada correspondncia eletr(}.
nica recebida.

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),

Trabalhando com Objetos

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.

Passando o Conceito para o Cdigo


Passemos alguns desses conceitos para cdigo. Primeiro, para criar objetos, voc deve ter urna
classe. Existem muitas classes disponveis que foram criadas por outras pessoas; na verdade, o
.NET Framework inteiro uma ' biblioteca de classes', um conjunto de classes pr-existentes
que podem ser usadas em seus programas. Em nosso exemplo, no entanto, criaremos nossa prpria classe, Car, porque algo simples de fazer.

NOTA

A finalidade desta lio no ensinar tudo a respeito de classes, e sim o sufi-

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

VIII projeto m=io ti

iniciado sem comer


nenhul/I orq/lh'o.

,_,,,

"""'-=
1;;:1 _ _ " _
(;J_.,,_

[ii~

-'q" -G
J
.... .
-'"
_.
_
--_: "-'''''-,.
l1 .

a ....... c.......-

:J,g
=::.:: '-'"'' ' '
-0 _ _ ""'"

""

1"-'
I~

~-

""

,"

' . . _ _ ""...-.""", UI lO"

e na ,;

",-

...... In

...

...,...o ~_ ...., :::J

" AOdto_

1- "

_ .... """"'''''''1... _
, ~,

i " ...... ..",.'f"Sol.b>o

.......,....'''''''_ .."

'

.........

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.

Trabalhando com Objetos

COOIGO

LISTAGEM 7.1

181

Criando Propriedades em Classes

1 Publ ic Class clsCar

2
3
4

5
6
7
8
9
10

11

Dim m- sColor As String


Public Property Color()As String
Get
Return m- sColor
End Get
Set(ByVal Value As String)
m- sCola r " value
End Set
End Praperty
End Class

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.

Propriedades Read nlye rite nly


No ser faro surgi rem propriedades que
voc achar melhor serem de leitura, como a de uma
,
verso ou talvez uma data de criao . E muito menos comum , se no imposs vel, haver uma propriedade que possa ser alterada, porm no lida, como um campo de senha. Em verses anteriores do Vi sual Basic, voc poderia criar essas propriedades de leitura e de gravao apenas
optando por no im pl emelllaro trecho Set ou Get de suas definies. Isso parcialmen te o que se
faz no Visual Basic .NET. Se uma propriedade de leitura estiver sendo criada, o trecho Set de
ser includo, porm ReadOnly dever ser especificada como palasua definio no deve
,
vra-chave ad icional. E o que mostra o cdigo a seguir com a propriedade Descri pt ion, que um
valor calculado e, portanto, no faria muito sentido grav-lo. No seria interessante configurar
uma propriedade como Description porque, na verdade, ela apenas o resultado de um clculo.
1 Public ReadOnly Praperty Description()As String
2
Get
3
Return m sColar &" "& m sMake &" "& m sModel
4
End Get
5 End Property
A palavra-chave usada para uma propriedade de gravao Wri teOnly e, nesse caso, s inserido o trecho Set em sua defi nio:
1 Dim m_sPassword As String
2 Publ ic WriteOnly Property Password() As String

182

Dia 7

5et(ByVal Value As String)

m sPassword " Value

End 5et

6 End Property

Criando a Instncia de um Objeto


Depois que voc tiver essa classe, poderemos gerar uma instncia dela em outra parte de nosso
projeto. Adicione um mdu lo a ele (se lecione Project, Add Module no menu) chamado Ma i n. vb

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

Criando um Mdulo Novo para Teste

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

Trabalhando com Objetos


sCarDesc " objCar.Color & "

"& objCar.Make &"

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

Oim objCar As clsCa r


Oim objCar2 As clsCar
Oim sMake As String
objCar " New clsCar()
objCar2 " objCar
objCar. Make " "Ford"
objCar2 .Make " "Chevy"
'objCar2 . Make i gua l a objCar . Make

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

sFirstValue " "Oog"


sSecondValue " sFirstValue
sSecondValue " "Cat"
' sFi r stValue <> sSecondValue

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.

Encapsulando Cdigos em Suas Classes


Agora voc j viu, no cd igo, a criao de uma c lasse, a instanciao de objetos com base nessa
classe e a manipulao das propriedades desse objeto. Dando continuidade, considere a idia de
lima classe, diferente de um UDT , (novamente, veja o Dia 3 para obter mais informaes sobre
as estruturas ou t ipos definidos pelo usurio), que descreva mai s do que apenas um conj unto de
valores, podendo incluir tambm o comportamento. Para fornecer essa implementao do comportamento, a classe apresentar mais do que apenas simples cdigos de configurao e recuperao de valores; ela tambm poder possuir um cdigo para executar a validao da
propriedade e outras aes. Em nossa classe clsCar, podemos demonstrar esse recurso adicionando um cd igo de validao a nossas propriedades. Em sua est rutura atual, voc poderia con-

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

Adicionado Validao Propriedade Color

1 Public Class clsCar


2
Oim m sColor As String
3

4
5
6
7
8

Public Property Color() As String


Get
Return m sColor
End Get

10
11
12
13
14
15
16
17
18
19

20
21

22
23
24
25

Set(ByVal Value As String)


Select Case Value.ToUpper()
Case "REO"
m sColor = Value
Case "YELLOW"
m- sColor = Value
Case "BLUE"
m sColor = Value
Case Else
Oim objException As System.Exception
objException = New System.ArgumentOutOfRangeException()
Throw objException
End Select
End Set
End Property

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.

Trabalhando com Objetos

COOIGO

LISTAGEM 7.4

185

Includo Tratamento de Erros em Nosso Cdi go de


Teste

1 Sob MainO
Dim objCar As cl sCar
2
Dim sColor As String
3
4

5
6

7
8
9
10
11

objCar :: New cl sCarO


objCar. Year = 1999
Try

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-

lhes como parte da implantao no Dia 19,

~Implan t ando

Seu Aplicativo"; por

enquanto considere-as como as vrias partes de uma mesma soluo.)

A Listagem 7.5 mostra o novo mtodo.


COOIGO

LISTAGEM 7.5

O Mtodo GetAge

1 Publ ic Function GetAge() As Long


Dim l ngDays As long
2
Dim dtCurrent As Date
3
4
dtCurrent ; System . DateTime.Today
5
lngDays = dtCurrent.Subtract( m_dtManufactured).Days
6
Return l ngDays
7 End Funct i on
Depois que tivermos adicionado esse cdigo a nossa classe, poderemos cham-lo por meio de
qualquer instncia (objCar.GetAge( ), como na Listagem 7.6.
COOIGO

1
2
3
4

LISTAGEM 7.6

Usando Nosso Mtodo Novo

Dim objCar As clsCar


objcar = New clsCar()
objCar.Manufactured = 130/1/2 0001
System. Console.WriteLine(objCar.GetAge())

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

Nosso Novo Mtodo Orientado Aao

1 Public Sub StartEngine()


2 Sys tem. Conso 1e. Wri teL i ne (" Vroom , Vroom . .. ! ! ! ")
3 End Sub

Trabalhando com Objetos

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

Criando Vria s Opes em um nico Mtodo

1 Pub1ic Function GetAge()As Long


2
Dim lngDays As long
3
Dim dtCurrent As Date
dtCu rrent = System . DateTime . Today
4
5
1ngDays = dtCurrent.Subtract(m_dtManufactured).Days
6
Return 1ngDays
7 End Funct i on
8

9 Pub1ic Funct i on GetAgeAtDate(ByVal dtPointlnTi me As Date) As long


10
Dim lngDays As long
11
1ngDays = dt Po i ntlnTime.Subtract(m_dtManufactured).Days

188

COOIGO

Dia 7

LISTAGEM 7.8

Criando Vrias Opes em

l.I11

Unico Mtodo (continuao)

12
Return l ngOays
13 End Function
14

15 Public Function GetAgelnUnits(ByVal sUnit As String) As long


16
Dim lngUnits As Long
17
Dim dtCurrent As Date
18
Dim tsDifference As System. TimeSpan
19
dtCurrent : System.DateTime.Today
20
tsDifferenee : dtCurrent.Subtraet(m_dtManufaetured)
21
Seleet Case sUnit
22
Case "Hours"
23
1ngUnits : tsDi fference. Hours
24

25
26

Case "Days"
1ngUnits : tsDi fference. Days

27

28
29

Case "Mi nutes"


1ngUnits : tsDi fference .Mi nutes

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

Trabalhando com Objetos

NOTA

189

Cada declarao de fun o deve ser diferente de alguma maneira - quantidade


de parmetros, tipo de dados do parmetro ou do valor de retorno -, ou no
poder ser usada.

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

funo serlio mostradas


por meio do
ImelliSense qllal/do
voc IIsar o Visual
5/l/dio . NET para criaI"
1/111 c/ieme.

.oa
fi.
"" "" ' 9I>,!!f .CO!%
$':!I , .... ~ .... ' ' , .<d'
$':!I )O... . ...... I _ ", ...,,I?,,' '''.CO''' ' , ...... L, .. ,.. , ,"' .p.... " llUI

""'C" " "" .,"""'!,

. . l C...... .. . . ' . .. d " I>O" DON

. , ...... c..... . . ... ,u L, .. ,OOIle"" .0"'_ 0)

.......

."

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

Nossa Classe de Veculos

1 Public Class Vehicle

2
3
4

6
7

Public Property MaxSpeed () As Long


Get
End Get
Set(ByVal Value As Long)
End Set
End Property

10
11

Public Property NumberOfPassenge r s{) As Long


Get

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

Traba lh a ndo com Objetos

COOIGO

LISTAGEM 7 .9

19 1

Nossa Classe de Veculos (continuao)

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

Trabalhando com Nossa Classe de Veculos

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

Cri ando uma Cl asse - fi 1ha

1 Publ i c Class Car


2
Inherits Veh i cle
3

4
5
6
7

Public Property NumberOfTires() As Integer


Get
End Get

Dia 7

192

LISTAGEM 7.11 Criando uma Classe - Filha (continuao)

COOIGO

Set(ByVal Value As Integer)

9
10
11

End Set
End Property

12

13

Public Property NumberOfOoors() As Integer

14
15

Get

16

End Get

17

Set(ByVal Value As Integer)

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.

Traba lh a ndo com Objetos

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

"'lV,.,.'o.CoLo, ' '"",,"


LOO

_.,L.,........
<O,,,,,,
u

o",
"')'"e.'.', .. V._"
o... ""Co< ... c..

"'J<o<

~. .

Cu!)

I.'
COIGO

LISTAGEM

7.12

Usando as Pa l avras - Chave Overridable e Overrides

1 Public Class Vehicle


2
3
'Cdigo removido para fins de simplificao . .. .
4

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

'Cdigo remov i do para fins de simpli f icao ....

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

fornecimento de uma funcionalidade adicional podendo-se empregar a sobreposio sem que


depois seja necessrio recompor todo o cdigo original.
Alm de marcar o cdigo como Overridabl e, tambm possvel marcar um mtodo ou propriedade como MustOverri de e lima classe como Mustlnheri t. A palavra-chave MustOverride indica

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.

A Base de Todas as Classes Bsicas


Se voc examinar a li sta do que exposto por essa nova instncia da classe Car, ver mais do que
as propriedades de Vehi c1 e e de CaroOs mtodos ToStri ng ( ) e GetType( ) so expostos por esse
objeto, mas no fazem parte dessa classe ou de sua classepai. Esses mtodos so na verdade ou
tro resultado da herana . Enquanto Car herda caractersticas de Vehic1e, tanto Vehicle quanto
Car (e todas as outras classes da plataforma .NET) herdam caractersticas da classe bsica
Sys tem. Obj cct. Essa classe bsica definitiva fornece alguns mtodos que automaticamente faro
parte de toda classe que criarmos.
Urna conseqnci a adicional da herana, que decerto vale a pena mencionar, se percebe na rea
dos tipos de dados. Como disc utimos no Dia 3, toda varivel se enquadra em algum tipo de dado,
e os objetos no so excees. Quando declaramos urna varivel corno do tipo Car, isso to res
trito quanto a tipificao de dados corno inteiros e strings. Se criannos o parmetro de urna fun
o com esse tipo, ento, apenas esse tipo de objeto poder ser passado para ela. Em uma
situao de herana, a classe-fi lha atua como se fosse urn a instnc ia da classe-pai. Isso significa,
em nosso exemplo, que podemos inserir nossos objetos Car em argumentos de procedimentos e
variveis que sejam do tipo Vehi c1 e. A Listagem 7.13 mostra um exem plo.
CDIGO

LISTAGEM

7.13 Uma Classe-Filha Agindo como uma Instnc ia da


Classe-Pai

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

objVehicle " objCar

Trabalhando com Objetos

COOIGO

195

LISTAGEM 7.13 Uma Classe - Filha Agindo como uma Instncia da


Cl asse - Pa i (continuao)

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

LISTAGEM 7.14 Usando um Construtor para Inicializar os Membros


de uma Cl asse

Public Sub New()


m dtManufactured

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

Public Sub New()


m dtManufactured

System.Oate.Now()

End Sub

6
7
8

Public Sub New(ByVal sColor As String)


m dtManufactured = system.Oate.Now
m seolor = sColor

10

End Sub

11

12
13
14
15
16

17

Public Sub New{ByVal dtManufactured As Date,


ByVal sColor As String)
m dtManufactured = dtManufactured
m sCo l or = seolor
End Sub

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.

Trabalhando com Objetos

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

Decla r ando um Espao de Nome com Vria s Partes

Dia 7

198

COOIGO

LISTAGEM 7.16 Declarando um Espao de Nome com Vrias Partes

Dim objHW As New MyApp.Console.Utilities()


objHW,PrintOut()

5
6
7

End Sub

End Module

9
10

Public Class Utilities

11
12

'Run the application


Public Sub PrintOutO

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

LISTAGEM 7.17 Usando Espaos de Nome Aninhados para Criar Hie -

rarquias de Objetos

1 Imports System
2 Namespace MyApp
3
Namespace Console
4
Module Main
5

6
7

Sub MainO

Oim objHW As New MyApp.Console . Utilities()


objHW.PrintOut()
End Sub
End Module

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

Trabalhando com Objetos

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.

Membros e Objetos Compartilhados


No comeo desta lio, quando descrevemos o relacionamento entre as classes e os objetos, voc
aprendeu que para usar qualq uer propriedade ou mtodo especificado em uma classe teria de
empregar ou criar uma instncia dessa classe. Em geral, isso que acontece; no possvel trabalhar diretamente com uma classe, apenas com as instncias dela que forem criadas. H uma
maneira de expor uma certa funcionalidade por meio da prpria classe, no entanto, independentemente de qualquer instncia particular dela, com o uso da palavra-chave Shared. Essa palavra-chave, como os outros descritores que foram vistos (como Publ i c, Pri vate e Fri end),
significa que parte de uma classe est disponvel sem a criao de uma instncia. O .NET Frame\Vork usa esse recurso em suas classes, como a propriedade exposta Today da classe System. Da teTime (cujo exem plo mostrado na Li stagem 7.18).
CDIGO

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".

Traba lh a ndo com Objetos

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

7.19 Verses Diferentes de Construtores Disponveis para


a Classe Vehicle

1 Public Class Vehicle


Dim m dtManufactured As Date
2
3
Dim m_lngNumberOfPassengers As Long
4
Dim m_sColor As String
5

6
7
8

Public Sub New()


m dtManufactured
End Sub

System . DateTime.Now()

10
11
12
13

Public Sub New(ByVal sColor As String)


m dtManufactured = System.DateTime.Now()
m sColor =sColor
End Sub

14

15
16

Public Sub New(ByVal sName As String)


End Sub

17
18
19

20
21
22

Public Sub New(ByVal dtManufactured As Date,


ByVal sColor As String)
m dtManufactured = dtManufactured
m sColor = sColor
End Sub

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-

da pelo Framework. Alm de todas essas particularidades, essa li o tambm


inclui uma introduo a como encontrar o recurso necessrio no .NET Framework por sua prpria conta - informaes valiosas quando voc iniciar projetas
de sua autoria usando a plataforma .NET.
As prx imas duas lies, Dias 9 e 10, enfocam a criao de uma interface com o
usurio em seus aplicativos, para Wi ndows (usando os formulrios Windows,
Dia 9) ou para a Web (usando a tecno logia dos fonnulri os da Web, abordada
no Dia 10). Poucos programas so exec utados sem alguma interface com o
usurio, o que torna essas duas lies absolutamente essenciais.
Quase todo aplicativo empresarial existente usa algum tipo de banco de dados,
portanto, voc passar duas lies exam inando esse tpico. O Dia I I aborda os
conceitos subjacentes aos bancos de dados e o conduz pela criao de um deles
para um aplicativo de registro de CDs. O Dia 12 d prossegu imento lio sobre dados mostrando como se conectar ao banco de dados de seu exemplo e desenvolver um aplicativo que permita adicionar, editar e excl uir CDs de sua
coleo.
O trabal ho com os bancos de dados introduzir voc no Server Explorer, mas o
Dia 13 mostrar como usar seus vrios recursos. Nessa lio, trabalharemos
com contadores de desempenho e registras de eventos, e aprenderemos uma
maneira mais fci l de configurar uma conexo de banco de dados.

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.

o Que o .NET Framework?


o tenno .NET Framework foi o nome dado a vrios componentes e servios que foram combinados para criar um ambiente poderoso de desenvolvimento. Ele inclui uma grande quantidade de
classes (mais de 6 mil ) que fornecem grande parte da fu ncionalidade anterionnente existente no
Visua l Basic ou na APl do Windows. Isso permitir que voc escreva aplicat ivos com base no
Windows e na Web, acesse a rede, crie elementos grficos e muito mais .

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.

Classes Importantes do .NET Framework


Voc usar muitas classes do .NET Framework quando desenvolver aplicativos no Visual Basic
.NET. No entanto, empregar algumas delas com mai s freqncia do que outras. Entre as classes
mais teis esto

Console Permite a lei tura e a exibio na linha de comando.


Environment Pemlite a leitura e a gravao nas variveis de ambiente do sistema.
Permite a gerao de nmeros aleatrios.
Random
Inclui vrios clculos matemticos.
Math
Co 11 ect i ons
Fornece vrias classes para diferentes estratgias de armazenamento de
conjuntos de itens.

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.

Introd uo ao .NET Framewo rk

TABELA 8 .1

Mtodos da Classe Conso 1e

Metodo

Descrio

Read
ReadLine
SetError

Setln

SetOut
Write
Wr; teL; ne

L informaes da linha de comandos (ou outro cdigo). No precisa que


a linha termine com Enter.
L informaes da linha de comandos. L todos os caracteres at o Enter,
sem inclu-lo.
Altera o destino das mensagens de erro a serem exibidas enquanto seu
programa estiver em execuo. Pode ser usado na criao de um mecanismo sim ples de registro de erros em seu aplicativo.
Altera a origem da entrada de Read e Readl ine. Pode ser usado na alterao de um aplicativo de linha de comandos para que leia um arquivo ou
local de rede. Veja a seo "Redirecionamento", mais frente nesta lio.
Altera o destino dos mtodos Wri te e Wri tel ine. Pode ser usado na alterao do destino da sada para registro ou outra finalidade. Veja a seo
"Redirecionamento", mais adiante nesta lio.
Exibe informaes na linha de comandos (ou outra sada). No termina
com uma nova linha.
Exibe informaes na linha de comandos (ou outra sada). Termina a sada com uma linha nova.

Resultados Mais Simples


J que a classe Ccnso le com freqUncia usada para sadas, seria bom se tornasse sua vida mais
fc il quando voc executasse essa tarefa. Felizmente, ela faz isso. Quando empregamos os mtodos Wri te ou Wri teL i ne para exibir informaes, nos beneficiamos de sua capacidade de utilizar
espaos reservados para as variveis. Em geral, quando se quer exibir uma string que contm informaes armazenadas em variveis, uma tcnica conhecida como concatenao usada.
Novo TERMO

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

Usando a Classe Console para Entradas e Resultados

1 Imports System

2 Public Class ConsoleTest


3 Private Const ITEM_COUNT As Integer ~ 10
4 Shared Sub Main()
5
Dim I As Integer
6
Dim sItems(ITEM_COUNT) As String
7
Console.WriteLine("Insira (Olitens." & _
8
Pressione ENTE R entre os itens.",ITEM_COUNT)
9
For I ~ O To ITEM COUNT-I
10
sItems(I)= Console.ReadLine
11
Next
12
Console .WriteLine()
13
Console.WriteLine("Itens em ordem inversa:")
14
For I ~ ITEM_COUNT - 1 To O Step - 1
15
Console .WriteLine(sItems(I))
16
Next
17
End Sub
18 End Class

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.

Introduo ao .NET Fram ework

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.

Usar a abordagem de ca racteres na construo de uma string pode ser til,


mas, se far ou no sentido depender um pouco de critrios pessoa is. Nessa
tcn ica, cada va lor substituir um caractere na ordem que eles aparecerem,
comea ndo com Oque o primeiro. As variveis podem ser nu mricas, alfanumricas ou qualquer outro tipo que possa ser convertido em uma string. Por
exemplo, se voc quisesse usar essa tcn ica para escrever uma string com
quatro va riveis includas, ela teria a seg uinte apa rncia:

Console .WriteLine( "{O}+{I} '" {2} : {3} ", I, I, 2,


"Bertrand Russell, 1912")
Os desenvolvedores experientes do Visual Basic podem estar um pouco mais
familiarizados com uma abordagem alternativa. Nela voc constri a string
concatenando stri ngs e variveis. A stri ng anterior poderia ser construda e
exibida com o cd igo:

Console .WriteLine(valuel & "+"


sSource)

&

value2 & ":"

&

result & " : " &

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

Executando o Apl i cati vo do Console

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

Executando o Aplicativo do Console (continuao)

RESULTADO

9 Girafa
10 Hipoptamo
11 Iguana
12 Chacal

Itens em ordem ; nversa:


Chacal
Iguana
Hipoptamo
17 Gi rafa

13
14
15
16

18 Tentilho
19 quidna

20 Dugo
21 Casuar

22 Rato gigante da ndia


23 Porco -da -terra

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

Redirecionando a Sada do Console

Introd uo ao .NET Framewo rk

COOIGO

LISTAGEM 8.3

Redirecionando a Sada do Console (continuao)

3 Public Class ConsoleTest


4
Private Const ITEM COUNT As Integer
5
6
7
8
9
10

10

Shared Sub Main()


Dim I As Integer
Dim sItems(ITEM_CDUNT)As String
Dim aFi le As TextWriter = File.CreateText("Output.txt")
Dim oOut As TextWri ter = Console.Out

11
12
13

Console.WriteLine( "lnsira (Of itens. Pressione ENTE R entre os


- itens . " ,_ITEM_COUNT)
For I = O To ITEM COUNT-l
sltems(I) = Console.ReadLine
Next

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

I Itens em ordem inversa:

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

[nvi ronrnent (Ambiente)


Saber seu lugar em geral produz a diferena entre sucesso e constrangimento. E essa percepo
vem freqentemente da vizinhana, ou do ambiente. De maneira semelhante, em programao,
voc envolvido por um ambiente especfico. O ambiente em que seus programas so executados composto de informaes sobre o sistema operacional, assim como muitas variveis e outras confi guraes que afetam seu computador. Esse ambiente permite que voc consulte
configuraes para o usurio, como o local do diretrio de seus arquivos temporrios, o contedo de seu caminho de pesquisa ou at outros itens sobre a linha de comandos. Algumas das propriedades e mtodos mais importantes da classe Envi ronment so listados na Tabela 8.2. Observe
que todas essas propriedades e mtodos so compartilhados.

Introd uo ao .N ET Framewo rk
TABELA 8.2

213

Mtodos e Propriedades da classe Environment


Descrio

Membro

Propriedades

CorrmandLine

Representa a linha de comandos completa que iniciou o aplicati-

vo.
Currentoi rectory

Retorna o caminho do diretrio atual.

O$Version

Retorna informaes sobre o sistema operacional atual, por exemplo, se o Wi ndows 9x, o NT ou o 2000.

SystemOi rectory

Retorna o caminho do diretrio do sistema (\winnt\system32 no


Windows NT ou no 2000) .

Version

Retorna informaes sobre a verso de uma montagem .


Mtodos

Exit

Encerra um aplicativo, opcionalmente retornando um cdigo de


erro que pode ser usado pelo sistema operacional.

GetCorrmandL i neArgs

Retorna todos os itens listados na linha de comandos quando o


aplicativo foi iniciado. Esse retorno feito na forma de um arraV de
strings. O prprio executvel o elemento zero (primeiro) do arrav

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

Mtodos da Classe Random

Mtodo

Descrio

Next

Retorna um inteiro entre Oe o valor mximo possvel para um inteiro


(aproximadamente 2 bilhes).

Next(MaxValue)

Retorna um interi ro entre O e o valor de MaxValue (a lgum inteiro).

Dia8

1 214

T ABELA

8.3

Mtodos da Classe Random (continuao)

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

Retorna um tipo duplo entre O e 1.

Por exemplo, se voc quisesse gerar um inteiro aleatrio entre 1e I00 (inclusive), escreveria

Oim oRand As New Random


Dim iValue As Intege r : oRand.Next(1.10Q)

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

Mtodos da Classe Math

Mtodo

Descrio

Abs

Retorna o va lor absoluto de um nmero (se for negativo, ele retornar o valor
positivo do nmero).

Cs

Retorna ocosseno de um ngulo (medido em radianos; veja a Nota a seguir).

Retorna um tipo duplo representando o valor de e (2.7182818284590451).

Max

Retorna o valor mximo entre dois valores.

Min

Retorna o valor mnimo entre dois valores.

PI

Retorna um tipo duplo representando o valor de pi (3. 1415926535897931).

Round

Arredonda um nmero para o nmero intei ro mais prximo.

NOTA

Para aqueles entre ns que dormiram durante as aulas de geometria, um ra


diano aproximadamente igual a 57 .296 graus. Porque um nmero to redondo? Os radia nos esto relacionados circunferncia de um circulo - a medida
exata
I Radianos = (I graus * pi) / 180
Os radianos so usados em computao devido aos clculos e, portanto, esto
alm do escopo deste livro. Simplesmente lembre-se de converter seus ngu
los de graus para radianos antes de empregar qualquer dos mtodos de Math
relacionados aos ngulos.

Introd uo ao .NET Framewo rk

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.

Classes de Conjuntos no .NET Framework


Voc j conheceu o tipo de dados Array no Dia 3, '; Introduo Programao com o Visual Basic .NET". O .NET Framework possui vrias outras classes de conjuntos que adicionam mais recursos a Array. Essas classes permitem o armazenamento de uma lista de informaes
exatamente como nos arrays, mas, alm disso, elas tm recursos como a ordenao de listas e a
possibi lidade de inclu ir e recuperar com maior facilidade na lista. Vrias classes de conjuntos (a
maioria no espao de nome System.Collections) esto dispon veis. Algumas sero descritas
ainda nesta lio. Se precisar de outros tipos de colees, verifique nesse espao de nome antes
de procurar em outro local.

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

Mtodos e Propriedades da Classe ArrayList

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

mais elementos forem adicionados.

Count

A quantidade efetiva de itens na classe ArrayList.

Item

Retorna um elemento especifico da classe ArrayList.


Mtodos

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

Remove todos os itens de ArrayList . Count co nfigurada com O,


mas Capacity no alterada.

IndexOf

Retorna a posio de um certo objeto na classe ArrayL ist oEsse mtodo til quando usado depois de uma ordenao.

Insert

Adiciona um novo elemento ArrayL i st em uma posio solicitada.

Remove

Remove o objeto solicitado de ArrayList.

RemoveAt

Remove o elemento da posio solicitada.

50rt

Ordena os membros de ArrayList.

ToArray

Copia toda ou pane de uma classe ArrayList em um array.

TrimTo5ize

Diminui ArrayList de modo que tanto Count quanto Capacity sejam


iguais quantidade atu al de elementos na classe .

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

ilimitado permite que os itens sejam adicionados quando necessrio.

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

Mtodos e Propriedades da Classe Queue


Descrio

Propriedades
Count
Clear
Dequeue
Enqueue
Peek

NOTA

A quantidade de itens na fila.

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

Mtodos e Propriedades da Classe Stack


Descrio

Propriedades
Count

A quantidade de itens na pilha.

Mtodos
Clear
Pop

Remove todos os itens da pilha.


Remove e retorna o prximo item para a pilha. Exatamente como a fila possui
Enqueue e Oequeue, os dois mtodos usados tradiciona lmente para lida r com pilhas so Pop e Push.

1218

TABELA 8.7

Dia8

Mtodos e Propriedades da Classe Stack icontinuao)

Membro

Descrio

Pus h

Insere um novo objeto na pilha.

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

Mtodos e Propriedades da Classe SortedList


Tipo

Descrio

Propriedades

Capaci ty

O tamanho atual da classe Sorted Li st. Configurado pela


primeira vez quando ela criada (16 por padro), podendo aumentar conforme mais elementos forem adicionados.

Count

A quantidade efetiva de itens em SortedList.


Mtodos

Add

Adiciona um novo item SortedList. Se isso fizer com


que Count ultrapasse Capaci ty, essa propriedade sera aumentada com sua qua ntidade inicial - 16 por padro.
Propriedades

Clear

Remove todos os itens de SortedLi st . Count confi gurada como 0, mas Capaci ty no alterada.

IndexOfKey

Retorna a posio de um certo objeto em SortedL ist. Isso


muito til aps a execuo de Sort.

Item

Propriedade

Retorna um elemento especfico de SortedList.

Keys

Propriedade

Retorna todas as chaves armazenadas em SortedLi st.

Remove

Mtodo

Remove o objeto solicitado de SortedList.

Introd uo ao .NET Fram ework


TABELA 8.8

Mtodos e Propriedades da Classe SortedList

(continuao)

Membro

Tipo

Descrio

Remo~eAt

TrimToSize

Mtodo
Mtodo

Values

Propriedade

Remove o elemento da posio solicitada.


Diminui SortedLi st de modo que tanto Count quanto Capac i ty sejam iguais qua ntidade atual de elementos na
classe.
Reto rna todos os valores armazenados em SortedList,
em ordem de suas chaves.

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.

Encontrando o Que Precisa no .NET


Framework
Com mais de 6 mil classes no .NET Framework, encontrar o que voc precisa s vezes ser a parte mais difici l de seu uso. No entanto, exatamente como achar um li vro em sua livraria favorita
ou um site na Internet, conhecer algumas regras bsicas o aj udar a encontrar a classe de que necessita para termi nar seu apli cativo. Esta seo o auxi liar a descobrir vrias classes diferentes
no Framework, demonstrando como se faz para encontr-Ias. Espero que isso seja til em suas
prprias buscas.

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.

A Saga pela Classe Perfeita


A fim de demonstrar algumas das tcnicas que voc pode usar para encontrar recursos dentro do
.NET Framework, apresentarei o processo de busca de trs procedimentos. Tentarei descrever
alguns dos erros que cometi ao tentar encontrar o recurso e o resultado obtido. Pode haver outras
maneiras de rastrear a funcionalidade procurada, ou outras respostas dentro do .NET Framework, mas essas so as que encontrei.

Que Cor Tem Aquele Pincel na Janela? Nomeando Cores


Essa pesquisa fo i iniciada por uma necessidade simples, a de descrever uma cor. Os controles
podem ser coloridos e a cor pode ser alterada no tempo de execuo. Alterar a cor no tempo de
projeto fci I; apenas selecione a cor na Iista suspensa apropriada (por exemp lo, BackCo 1ar ou
ForeCo 1or). No entanto, para alterar uma cor no tempo de execuo, voc precisar saber como
ident ifi c-I a.
Todas as cores do Vi sual Basic .NET podem ser descritas com base nos percentuais de vermelho, verde e azul que as compem. Nessa linguagem cada uma das trs cores citadas varia em vaIar dentro de um intervalo entre Oe 255, elevando a quantidade total de cores disponveis para
16.58 1.3 75. Portanto, voc pode identi ficar qualquer cor atravs de suas propores de vermelho, verde e azul. Uma cor composta com cada uma dessas outras trs com 50% de saturao, ou
com um valor de 128, teria uma tonali dade cinza-clara.
Em outras situaes, pode-se querer identificar uma cor pelo nome - isto , quando 'vermelho'
for mais relevante do que saber que o valor da cor -65536.
Voc poderia considerar que, por serem as cores to importantes, suas denominaes apareceriam no espao de nome System. No entanto, se pensasse assim (e foi o que aconteceu comigo, na
primeira busca), estaria errado. As cores com denominaes conhecidas e a capacidade de criar
outras novas so encontradas 110 espao de nome System. Drawi ng.
Dentro do espao de nome Sys tem. Drawi ng, h dois conj untos de cores: a estrutura Co 1or e a classe SystemColors.
A estrutura Color tem duas finalidades principais. A primeira seu aspecto 'funcional'. Dois
mtodos, descritos na Tabela 8.9, pennitem que voc crie uma core descubra seu valor numrico.

Introd uo ao .N ET Framewo rk
TABELA 8.9

221

Mtodos da Estrutura Colar

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.

Quem Sou Eu? Encontrando o Nome de Seu Computador


Muitos programas prec isam conhecer o nome do computador em que esto sendo executados.
Por exem plo, voc pode estar tentando acessar alguns recursos ou servios do sistema, como

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.

Introd uo ao .NET Framewo rk

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.

Um Certo Dia na Histria


A busca dessa soluo foi iniciada em lima funo que existia no Visual Basic 6, WeekOayName.
Essa funo retorna o nome do dia da semana. Voc pode descobrir esse dia em qualquer data
usando
sOayName :: WeekOayName(WeekOay(COate("May 6. 1937")))
S para registro, Odesastre com O Hindenburg foi em uma tera-fe ira .
Essa funo, como muitas outras que existiam em verses mais antigas do Visua l Basic, pode ser
encontrada de maneira bastante fcil, no espao de nome Mi crosoft . Visua 1Basi c. Esse espao
de nome carregado de modo automtico quando o IDE utilizado no desenvo lvimento, permitindo que cdigos escritos para verses anteriores do Visual Basic sejam executados. Ponanto,
se tudo que voc deseja uma funo que ' costumava existir', provavelmente ela estar nesse
espao de nome.

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:

A adio e manipulao de controles em um formulrio.

A manipulao em cdigo de eventos da interface com o usurio.

A aceitao e validao de entradas do usurio.

liSO

de caixas de dilogo.

Alm desses tpicos, sero abordados vrios contro les especiais visveis e ocultos usados nos
formulrios Windows.

Viso Geral dos Formulrios Windows


Os formulrios Windows (Windows Forms) so ut ilizados na criao de aplicativos que fazem
uso de interfaces com o usurio com uns (com pequenas variaes na aparncia fina l) em todos

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

,"""0:.0.,) ..... """(1:<)


""......

~ Ooor

(t.)

P'lIEl

Olllros recursos dela.

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

Desenvo lve ndo um a Interface com o Usurio com os Formulri os Windows

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.

Criando um Aplicativo com Formulrios


Windows
Como exemplo, voc pode desenvo lver um aplicativo simples com form ulrios Windows que
aceite entradas do us urio e demonstre como esses objetos da interface funcionam. Associado ao
aprend izado sobre os formulrios Windows, este exemplo tambm mostrar como executar algumas manipulaes si mples de arquivos usando as classes System . IO do .NET Framework. Primeiro, o conduzirei pela criao deste exemplo simples e, em seguida, abordarei diretamente
tpicos individuais sobre procedimentos de eventos e controles.

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.

Adicionando Controles ao Formulrio


Antes que um formulrio possa ler alguma ut ilidade, voc precisa inserir controles nele . Todos
os controles embut idos nos formu lrios Windows esto dis ponveis por meio dajanela Toolbox.
Exiba-a na tela e localize a seo Windows Fonns (veja a Figura 9.3).

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

Uma maneira possvel

de orgal1i=al" a
iII/e/face no aplicatil'o

__ _

. _ .. _ _

de exemplo.

..

Nomeando Seus Controles


Antes de criar um mani pulador de eventos, renomeie todos os nomes-padro de seus controles
(Buttonl , Button2, TextBoxl e assim por diante). Voc ter de usar o nome para acessar o controle e seus atributos, portanto, recomendo que utilize alguma forma de conveno de nomeao.
Veja a seguir minhas sugestes para esses controles, com base na conveno de nomeao que
tenho usado (e muitas outras pessoas tambm) no Visual Basic h anos:

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

Listando um Manipulador de Eventos Vazio para o Evento Copy

1 Private Sub btnCopy_Click(ByVal sender As System.Object.


2 ByVal e As System.EventArgs) Handles btnCopy.Click
3

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

Copiando Arquivos por Meio dos Mtodos Estticos do Objeto File

1 Private Sub btnCopy_Cl ick(ByVal sender As System.Object.


ByVal e As System . EventArgs) Handles btnCopy . Click
2
Dim sSource As String
3
Oim sDestination As String
4
sSource: txtSource.Text()
5
sDestination : txtOestination . Text()
6
File,Copy(sSource, sDestination)
7 End Sub

Desenvo lvendo uma Interface com o Usurio com os Formulrios Windows

231

Com os valores que voc precisa annazenados em variveis alfanumricas, a cpia


efetiva do arqu ivo pode ocorrer. J que Copy um mtodo estt ico da classe Fi le,
no necessrio criar uma instncia; basta chamar Fi 1e . Copy. No entanto, s essa linha (linha 6
da Listagem 9.2) no representa todo o processo, porque um tratamento apropriado de erros deve
ser ad icionado. No caso de uma cpia de arquivo, muitos erros diferentes poderiam ocorrer, desde
'o arquivo de destino no ex iste' at 'no h espao suficiente em disco'. Sempre que um erro
acontecer, poderemos apenas comunicar ao usurio usando o mtodo estt ico Show da classe MessageBox. Essa classe, quej foi em pregada neste livro, faz parte do espao de nome System. Wi ndows . Fonns e uma maneira rpida e fcil de inserir uma caixa de dilogo. A Listagem 9.3
fornece um exemplo da utilizao do mtodo MessageBox. Show em reposta a urna exceo.

ANLISE

LISTAGEM 9.3

Usando a Classe MessageBox para Exibir um Erro

1 Private Sub btnCopy_Click(ByVal sender As System .Object,


2 ByVal e As System.Even tA rgs) Hand1es btnCopy.Click
3 Oi m sSource As String
4 Oim sOestination As String
5 sSource = txtSource.Text()
6 sOestination = txtOestination.Text()
7 Try
8
Fi1e . Copy(sSource. sOestinat ion)
9 Catch ob j Exception As Exception
10
MessageBox.Show(objException. Me ssage)
11
End Try
12 End Sub
,

Criando Vrios Manipuladores de Eventos para um Unico


Evento
A parte importante da rotina do manipulador de eventos no seu nome, btnCopy Cl i ck. mas
Handl es btnCopy C1i ck que fo i adicionada no fina l da declarao. Essa instruo informa ao Visual Basic .NET que essa rotina o manipulador desse evento. Diferente das verses anteriores
do Visual Basic, que usavam apenas o nome da rotina para associar o cdigo a eventos especficos, no Visual Basic .NET possvel ter um nico procedimento manipulando mltiplos eventos
ou s um evento com vrios manipuladores. Copie toda a rotina btnCopy C1 i ck e a renomeie
como CopyCl i ck, deixando a mesma lista de parmetros e ainda usando Handl es btnCopy. C1 i ck.
A identidade do procedimento (que composta de sua li sta de parmetros e do valor retornado,
se houver algum) deve ser exatamente a mesma vista no proced imento original para que atue
como um manipulador de eventos, mas o cdigo pode ser qualquer outro. Agora, altere o cdigo
desse segundo procedimento para que apenas exiba urna mensagem em vez de realizar todo o
trabalho de cpia do arquivo (veja a Listagem 9.4). Tente executar seu projeto e d um clique no

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

A Instruao Handles Vincula uma Rotina a um Evento Especfi co

1 Private Sub CopyCl i ck(ByVa l sender As System .Object ,


2 ByVal e As Sys tem. EventArgs) Handles btnCopy . Cl ick
3 MessageBox. Show ("CopyC1 i c k")
4 End Su b
Remova a rotina Copye1 i ck selecionando e exclui ndo o texto, e passe para as rotinas dos eventos
dos dois outros botes.

Encontrando Objetos e Eventos por Meio do Editor de


Cdigos
Em vez de voltar janela do projeto e dar um clique duplo em cada um dos outros dois botes,
voc pode passar para a roti na de manipulao do evento C1 i ck diretamente na janela do cd igo.
Selecione o nome do objeto (btnMove, por exemplo) na prim eira lista suspensa (lado esquerdo)
acima do editor de cdigos e, em seguida, selecione o evento desejado (C1i ck) na segunda li sta
suspensa. Isso ter o mesmo efeito de dar um clique duplo no objeto do projeto, portanto, os dois
mtodos podem ser usados. O cdigo dos botes Move e Delele empregaro os mtodos estticos correspondentes do objelo Fi 1e. A Listagem 9.5 mostra uma mane ira com a qual esses do is
botes poderiam ser codificados.
LISTAGEM

9.5

Transferi nd o e Excluindo Arquivos por Meio dos Mtodos Estticos


do Objeto File

1 Private Sub btnMove_Click(ByVal sender As System.Object,


2 ByVal e As System.EventArgs) Handles btnMove. C1ic k
3 Dim sSource As String
4 Dim sDestination As St r ing
5 sSource; tx t Source. Text()
6 sDestination = txtDestination . Tex t()
7 File.Move(sSource , sDestination)
8 End Sub
9

10 Private Sub btnDe1ete_C1ick(ByVa1 sender As Object ,_


11 ByVal e As System.EventArgs) Handles btnDelete . Click
12 Dim sSource As String
13 sSource = txtSource .Text()
14 Fi1e.De1ete(sSou r ce)
15 End Sub

Desenvo lve ndo um a Interface com o Usurio com os Formulri os Windows

233

Mltiplos Eventos com um Manipulador


Como alternativa, voc pode mani pular os trs eventos C1 i ck por meio de um procedimento, ai
terando a instruo Handl es para que inclua todos eles. Apenas a declarao dessa rotina de manipulao de eventos mostrada na Listagem 9.6; os detalhes foram deixados para os exercc ios
desta lio.
LISTAGEM

9.6

Usando a Palavra -C have Hand1es para Vin cula r Vrios Eventos a um


nico Proced imento ou Vrios Procedimentos a um nico Evento

1 Pr ivate Sub DoEverything{ByVa l sender As Object ,


2 ByVal e As System. EventArgs) _
3 Hand les btnCopy.Cl i ck. btnMove.Click. btnDelete.Click
A nica restrio q uantidade de eventos que voc pode man ipular com apenas uma roti na que
todos tm de em pregar o mesmo conjunto de parmetros. O evento Cl ick de um boto, por
exemplo, recebe dois parmetros (System. Object e System. EventArgs), enq uanto o evento ChangeUICues do mesmo boto recebe parmetros diferentes (System.Object e System.Windows. forms.UICuesEventArgs) . Portanto, os dois no poderi am ser mani pulados por uma n ica
rotina. A fina li dade desses parmetros fornecer infonnaes sobre oevento a seu manipu lador,
porm alguns eventos passam informaes de tipos diferentes das de outros.

Mais Informaes sobre os Controles


O exemplo no qual voc acabou de trabalhar fez com que adicionasse caixas de texto, ttulos e
botes a um fonnulrio novo, mas muitos outros controles esto disponveis.

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

Estes do is contro les so usados para exibir e inserir valores


simpl es si m/no ou verdadeiro/falso. Em geral so empregados para mostrar urna Iista de
opes que devem ser ati vadas ou desativadas, mas a diferena entre eles est em corno
manipulam a se leo de outro controle do mesmo tipo dentro de seu grupo. Em um grupo
de botes de opo, a inteno que apenas um deles seja ativado por vez. Por outro lado,
vrias caixas de se leo podem ser se lecionadas, o que significa que voc pode marcar
quantas desejar.
Picture Box
Disponibiliza um loca l para voc exibir uma fi gura interessante ou desenhar fi guras usando a biblioteca de elementos grficos.

Check Box/Radio Button

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.

Criando Grupos de Botes de Opo


Corno j mencionei, os botes de op<1o e as caixas de seleo s<1o usados para representar as
configuraes que podem ser at ivadas ou desat ivadas, mas os dois tipos de contro le apresentam
uma diferena importante. Os botes de opo foram proj etados para ser usados apenas em grupos de dois ou mais, e apenas um boto do grupo pode ser selecionado. Dar um cl ique em um boto de opo faz com que ele seja selecionado e, automaticamente, desat iva o boto at ivado
antes. As caixas de seleo, por outro lado, tambm so ativadas e desativadas por meio de um
clique, mas uma quantidade aleatria delas pode ser selecionada ao mesmo tempo em um grupo.
Considere esses dois tipos de controles em termos de um exame de m ltipla escolha : as caixas de
seleo seriam adequadas para uma pergunta em que a resposta fosse elaborada como "Selecione todas as respostas corretas", enquanto os botes de opo s serviriam em perguntas do tipo
"Se lecione a resposta mai s apropriada".
Para criar um grupo de botes de opo, primeiro preciso gerar um novo fo rmulrio, porque o
anterior, fi 1er, j est bem che io. Com o projeto que contm fi 1er aberto na janela Solution
Explorer, d um clique nele com o boto direito do mouse, selecione as opes Add e Add Windows Form no menu que aparecer, e digite um nome para seu novo formulrio na caixa de dilogo resu ltante (voc poderia digitar Radio uttons, por exemplo). D um cl ique em OK para
adicionar esse formulr io novo ao projeto atual. Agora, no fo rmulrio recm-criado, use a Toolbox para adicionar um controle Group Box. Esse controle, que possui uma aparncia retangular
com um ttulo e bordas de aparncia bem definida, usado na criao de grupos e contm outros
controles. Mova e redimensione a caixa de modo que ocupe a tela quase toda. Para criar um conjunto de botes de opo, s temos de comear a adicion-los a essa caixa de grupo. Insira quatro

Desenvo lve ndo um a Inte rface co m o Usu rio co m os Fo rmul ri os W in dows

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.

-....

......"'"

" " - 001.....,

:. 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

1 Private Sub btnTest_C1ick(ByVal sender As System.Object,


2 ByVal e As System.EventArgs) Hand1es btnTest.Click
Dim sSe1ected As String
3
4

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

Adicionando uma Caixa de Seleo ao Exemplo de Filer


Se voc substitusse os botes de opo do exemplo anterior por caixas de seleo, poderia sele~
cionar quantas delas desejasse ao mesmo tempo (ou mesmo nenhuma). No entanto, o cdigo de
teste ainda funcionaria, (presumindo que voc desse s caixas de seleo o mesmo nome dos botes de opo ou alterasse o cdigo incluindo nomes novos) porque as caixas de seleo tambm
fornecem a propriedade Checked.
Um exemplo mais til de uma caixa de se leo pode ser criado pela alterao do primeiro rormll~
lrio que voc gerou (Fi 1er). Nesse formu lrio, se o usurio inserisse o nome de um arquivo de
destino que j existisse e, em seguida, desse um clique nos botes Copy ou Move, um erro ocor~
reria. Como alternativa, o cdigo poderia apenas substituir o arquivo existente sempre que a l ~

Desenvolvendo uma Interface com o Usurio com os Formulrios Windows

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

Adicionando uma Caixa de Se l eo

1 Private Sub btnCopy_Click(ByVal sender As System.Object.


2 ByVa l e As System.EventArgs) Handles btnCopy.C l ick
3
Di m sSource As String
4 Dim sOestination As Stri ng
5
sSource = txtSource . Text()
6
sDestination = txtDest i nation.Text()
7
Try
8
File.Copy(sSource, sDest i nation, chkOverwrite.Checked)
9
Catch objExcept i on As Exception
10
MessageBox.Show(objException.Message)
11
End Try
12 End Sub
Manipular essa mesma situao no caso do comando Move um pouco mais complicado. Em vez
de apenas alterar um parmetro, voc ter de gerar uma resposta ao erro de arqu ivo ex istente e
abortar a tentativa de transferncia ou excluiro arquivo inadequado. A Listagem 9.9 mostra uma
maneira de manipular o evento btnMove Cl ick.
LISTAGEM

1
2
3

9.9

Ma nipu l ando o Evento

btnMove Cl ick

Private Sub btnMove_Click(ByVal sender As System.Object .


ByVal e As System . EventArgs) Ha ndles btnMove .Click
Dim sSource As String

Dia 9

LISTAGEM 9 .9

4
5
6
7
8
9
10
11

12

13
14

15
16

17
18

Manipu l ando o Evento

btnMove Cl ick (continuao)

Dim sDestination As String


sSource = txtSource.Text {)
sDestination = txtDestination . Text{)
If File. Ex ists(sSource)Then
If File.Exists(sDestination)Then
If chkOverwrite.Checked lhen
File.Delete(sDestination)
El se
MessageBox.Show(UTransferncia abortada . o arquivo de destino j
existe")
Return
End If
End If
File .Move(sSource. sDestination)
End If
End Sub

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

formlllrio de elllrada de dados e

eSlt dispollrel para dOlVllload /lO


site da Web desle Iil'/"o.

~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

Eventos de Va l idao do fonnulrio de Endereos

Private Sub txtZi p_Va lidating(ByVal sender As Object ,


ByVal e As System.ComponentModel.CancelEventArgs)
Handles txtZip . Validating
'converta o parmetro sender em um controle da cl asse System.Windows. Fonns.Control
Dim ctlSender As Control
ctlSender " CType{sender, Control)
Dim bValidPostalCode As Boolean " False
'Aceite como vlido somente o formato de cdigo postal dos EUA/Canad .
'Verif ique se txtCountry " Canada , caso contrrio pressuponha EUA
'Man i pule a possibilidade de trs formatos,
'EUA curto 1'1" , EUA longo
Cdn AIAIAI

"'*'-"",

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

Dim sPostalCode As String


Dim sPattern As String
Dim objRegEx As Regex
sPostalCode" ctlSender . Text. Trim.Rep lace (" ", " ")
If txtCountry . Text.Tri m. ToUpper " "CANADA" Then
If sPostalCode . Length " 6 Then
sPa t tern ,, " [ABCEGHJKLMNPRSTVX Y] \d [A -Z] \d [A -Z] \d"
End If
El se
If sPostalCode . Length " 10 Then
sPattern " "\d\d\d\d\d-\d\d\d\d"
ElseIf sPostalCode.Length " 5 Then
sPattern " "\d\d\d\d\d
End If
objRegEx . IsMatch(sPostalCode,
End If
II

")

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

Private Sub GenericValidated(ByVal sender As Object ,


43 ByVal e As System.EventArgs) _
44 Handles txtSt reet . Validated, txtCity.Validated, _

Desenvo lve ndo uma Interface com o Usurio com os Formulri os W in dows

liSTAGEM 9.10

241

Eventos de Validao do Formulrio de Endereos (continuao)

txtCountry . Validated, txtZip . Validated,


46 txtState . Val i dated
47
'conve rta o parmetro sender em um controle da classe
System.Windows.forms.Control
48
Dim ctlSender As Control
49
ctlSender " CType(sender,Control)
50
'Elimine erro , se existir algum
51
errAddress. SetE rror(ctl Sender , " ")
52 End Sub
45

53

Pr ivate Sub GenericNotEmpty(ByVal sender As Object,


ByVal e As System.ComponentModel.CancelEventArgs)
56 Handles txtStreet . Validating . txtCity . Validating ,
57
txtState . Va l i dati ng
54
55

58

59
60
61

62
63

64
65

66

'converta o parmetro sender em um controle da classe


System.Windows.Fonns.Control
Oim ct lSender As Control
ctlSender" CType(sender , Control)
If ctlSender . Text. Trim" " " Then
e.Cancel " True
errAddress . Set Error (ct 1Sender , "Preenchi mento ob ri gatri o")
End If
End Sub

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.

Usando a Classe Message ox


Uma caixa de dilogo um tipo especial de form ulrio exibido de maneira restritiva, o que sign ifica que o usurio prec isa lidar com ela antes de poder interagi r com qualquer outra parte do aplicat ivo. Em geral so usadas para informar algo ao usurio (como um erro) ou obter alguma
informao. Elas no so empregadas na ex ibio de informaes de status ou progresso, devido
a sua nat ureza restrit iva; devem ser utilizadas apenas quando voc tiver de se comunicar de imediato com o usurio, antes de dar continuidade a algum tipo de execuo.
Voc mesmo pode criar caixas de dilogo como se fo ssem qualquer outro formulrio Windows,
e mostrarei como fazer isso da maneira correta mais tarde nesta li o. Em geral, no entanto, no
preciso algo complexo; s queremos formular uma pergunta si mples (cuja resposta ser
sim/no ou OK/cancele) ou exibir uma mensagem para o usurio. a que a classe MessageBox

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

que pode exibir

......11> _" ""

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.

Desenvo lvendo uma Interface com o Usurio com os Formulri os Windows

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

chamada apenas com


o lexlo da mensagem
(o ml/imo).

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

Usando a Classe MessageBox para Fonnul ar Perguntas Simples e,


em Seguida. Atuar sobre a Resposta

Private Sub btnTest_Cl ick(ByVal sender As System .Object .


2 ByVal e As System.EventArgs) Hand l es btnTest.Click
3
Oim drResult As DialogResult
4
drResult = MessageBox.Show("O que deseja fazer?".
5
"Exemplo" . MessageBoxButtons.RetryCancel)
1

6
7

8
9

10

If drResult = OialogResult,Retry lhen

'repita
El se
'cancele

Dia 9

LISTAGEM 9.11
11

Usando a Classe MessageBox para Formular Perguntas Simples e.


em Segu ida. Atuar sobre a Resposta (continuao)

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

Usando o Mtodo MessageBox .Show para Sol i ci tar Confi rmao

1 Private Sub btnCopy_Click(ByVal sender As System.Object . _


2 ByVal e As System.EventArgs) Hand l es btnCopy . Cl ick
3
Dim sSou r ce As String
4
Dim sDest inat i on As String
5
sSource ~ txtSou rc e . Text()
sOestination ~ txtOestination.Text()
6
)

If File .Exi sts(sSou r ce) Then

10
11

12
13
I'
15

16

Dim sConfirm As String


sConfinn "String.Format("Est certo de que deseja copiar lO} em III?".
sSource . sOestination)
If MessageBox.Show(sConfirm,
"Confirm Copy" ,
MessageBoxButtons.Yes No. _

Desenvo lve ndo um a Interface com o Usurio com os Formulri os Windows

LISTAGEM9.12
17
18

Us ando o Mtodo MessageBox .Show para Sol i ci tar Confi rmao


(continuao)

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

Private Sub btnMove_C lick(ByVa l sender As System.Object.


ByVal e As System.EventArgs) Ha nd les btnMove.Clic k
Dim sSource As String
Dim sDestination As String
sSource = txtSource.Text()
sDestination = txtDestination.Text()
If Fi le.Exists(sSource)Then
Dim sConfirm As String
sConf i rm = String.Format(_
"Est certo de que dese j a transferir {O} para (I}?" .
sSource. sDestination)

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

Usando o Mtodo MessageBox.Show para Solicitar Confirmao


(continuao)

60 Private Sub btnDelete_Click(ByVal sender As Object ,


61 ByVal e As System.EventArgs) Handles btnOelete.Click
62 Dim sSource As String
63 sSource: txtSource . Text()
64

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.

4. Configure Enabled corno True, e Interval igual a 1000 (1 segundo).

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

Cdigo Que Far com Que o Titulo do Formulrio Aja como um


Relgio

1 Private Sub Timerl_Ti ck{SyVal sender As System.Object,


2 ByVal e As System.EventArgs) Handles Time r l .Tick
3

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

Com 11m eOll/role


ErrorProvider em seu
formulrio, .ser fcil
mostrar aos usurios

-'"

"-

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

Controles das Caixas de Dilogo

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_

!M,R.... I......... FJo.ot

flo , tjlpO.

Il ... iIn l"1

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

Desenvo lvendo uma Interface com o Usurio com os Formulrios W in dows

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.

Caixa de Dilogo Open

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

Manipulador de Eventos do Boto Open

1 Private Sub btnOpen_Click(ByVal sender As System.Object.


2 ByVa l e As System.EventArgs) Handles btnOpen.C l ick
3
Dim sNewFile As String
4
Dim trNewFile As System . IO.TextReader
5
If MessageBox .Show("Sobrepor o contedo atual?" , _
6
"Open New File", MessageBoxButtons.YesNo. MessageBoxlcon.Question.
7
MessageBoxOefau l tButton.Button2)= OialogResult.Ves Then
8
With dl gOpen
9
. Filter = "Text files (* . txt) I*.txt"
10
.AddExtension = True
11
.Chec kFi leExists = True
12
.CheckPathExists : True
13
.InitialOirectory = IO.Path.GetD i rectoryName(sCurrentFile)
14
.Multi select = Fal se
15

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

As linha 2 7, depois de declararem as variveis necessrias, confirmam se o usurio


quer carregar um novo arquivo, sobrepondo, portanto, o contedo atual da caixa de
texto. Uma caixa de mensagem usada para fomlular essa questo porque ela resu lta em uma resposta simples YesJNo. Se o usurio responder Yes, s iga em frente e sobreponha o contedo atual.
Em seguida, a caixa de dilogo Open e laborada das linhas 8 14. Um filtro configurado para
,
restringir os tipos de arquivo aos somente de texto. E infonnado a caixa de dilogo para que retor-

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.

Caixa de Dilogo Save


Quando voc prec isar que o usurio fornea o nome de um arquivo de destino, a caixa de dilogo
Save ser necessria. Ela faz parte do sistema operacional , portanto, tem conhec imento das unidades, pastas, comparti lhamentos de arquivos, Unks de atalho e o que o mais o Windows possa
lanar ne la. Escrever Li ma caixa de dilogo desse tipo seria dificil e precisaramos de LIma manuteno contnua, j que os recursos do sistema de arquivos do sistema operacional so a lterados
com Otempo. O uso das caixas de d ilogo internas torna seu sistema melhor integrado ao sistema
operacional (veja a Listagem 9.15).
LISTAGEM 9 .15

1
2

Us ando as Caixas de Dilogo Internas

Private Sub btnSave_Click{ByVal sender As System .Object.


ByVal e As System.EventArgs) Handles btnSave . Click

4
5
6

Dim sNewFileName As String


Dim swDutput As IO.StreamWriter

7
8

sNewFileName " sCurrentFile

9
10
11
12
13
14
15
16
17
18
19
20
21

If MessageBox.Show{"Salvar com um nome diferente de arquivo?" ,

22

"Save Fi le", MessageBoxButtons.YesNo . MessageBoxIcon.Question , _


MessageBoxOefaultButton.Button2) " DialogResult.Yes Then
Wi th di gSave
.FlleName " sCurrentFile
. Check FileExists '" False
. CheckPathExists " True
.OefaultExt " "txt"
. Fi lter" "Text files (* . txtJI*.txt"
.AddExtension " True
.Init i alO i rectory " IO.Path.GetDirectoryName(sNewFileName)
.OverwritePrompt '" True
. CreatePrompt" False

Desenvo lvendo uma Interface com o Usurio com os Formulrios Windows

LISTAGEM 9.15

Us ando as Cai xas de Di logo Internas (continuao)


If .ShowDialog() : Dia logResult .OK lhen
sNewFileName : . FileName
swOutput : New IO . StreamWriter(sNewFileName)

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

Caixa de Dilogo Font


Os nomes, tamanhos disponveis e esti los das fontes da mqu ina de um usurio podem ser um
conjunto razovel de informaes, e essa caixa de dilogo man ipula tudo isso para voc enq uanto fornec e uma interface que provavelmente aparece em muitos dos programas com as quais o
usurio trabalha. A Listagem 9. 16 mostra como a caixa de dilogo Fon! pode ser usada para per~
mitir que o usurio selec ione a fonte e o estilo de uma fonte.
LISTAGEM 9.16
1
2
3

Usando a Caixa de Dilogo Font

Private Sub btnFont_Click (ByVal sender As System .Object .


ByVal e As System . EventArgs) Handles btnFont.Click
dlgFont.Font = rtfContents .Font

If dl gFont . ShowOialog(): DialogResult.OK lhen

Dia 9

LISTAGEM 9 .16

rtfContents. Font '" dl gFont. Font


End If

6
7
8

Usando a Caixa de Dilogo Font (continuao)

End Sub

ANLISE

A caixa de dilogo Font simples de usar: apenas carregue as configuraes de fonte

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.

Caixa de Dilogo Color


A menos que prec ise de alguma funciona lidade avanada, a caixa de dilogo Color exatamente

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

Adicionando uma Seleo Grfica de Cores a um Aplicativo

Private Sub btnColor_Click{ByVal sender As System .Object.


ByVal e As System.EventArgs) Handles btnColor.Click
dlgColor.Color = rtfContents.ForeColor

5
6
7

If dlgColor . ShowOialog{)= OialogResult .OK lhen


rtfContents.ForeColor = dlgColor.Color
End If

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

Construindo Suas Caixas de Dilogo


A classe MessageBox fornece uma manei ra de exibi r caixas de dilogo simples, mostrando uma
mensagem e/ou solicitando ao usurio para que faa uma escolha em um conjunto fixo de opes
(Yes/No, OK/Cancel , Abort/Rctry/lgnore). Mas haver vezes em que voc precisar de uma caixa de dilogo com recursos mais complexos. possvel transfonnar qualquer fonnu lrio Win-

Desenvo lvendo uma Interface com o Usurio com os Formulri os Windows

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

Criando a Caixa de Dilogo


Uma caixa de dilogo no s se comporta de modo diferente de um fo rmulrio Windows comum, mas ela tambm possui outra aparnc ia. Adicione um novo fo rmulrio a seu projeto, chamado LogonDi ai og, e acesse-o no modo estrutura. D um clique no formulrio e acesse ajane la
de propriedades. Para fazer com que ele se parea com uma caixa de dilogo, configure as propriedades a seguir:
Isto impedir que a caixa de dilogo seja redimensioFonnBorderStyle" FixedDialog
nada.
Este o ttulo, e Logon mais apropriado do que LogonDi ai og.
Text " "Logon"
Maximi zeBox e Mi nimi zeBox configuradas como Fa 1se
No necessrio mi nimi zar ou
maximizar uma caixa de dilogo.

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

Este formlllrio foi


redimel/siollado para
ler lima aparncia
COII/llm somenre com

algllns cOlllroles ne/e.

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

Configurando o Resultado da Caixa de Dilogo


Quando a caixa de d ilogo for exibida e o usurio a fechar dando um clique em OK ou em Cancei, se u programa ler de determinar dois itens: primeiro, se o usurio deu um cl ique em OK ou
em Cancel e, em segundo lugar, o que o usurio inseriu nas caixas UserlD e Password. A primeira informao, que boto foi pressionado, semelhante ao que retornado de uma chamada a

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:

MC.Oia logRes ult

DialogResult.Cancel

H outra maneira de configurar esse resultado, que definir a propriedade DialogResult de


btnOK e btnCancel (corno OK e Cancel, respectivamente). Se esses valores forem configurados,
ento, a caixa de dilogo ser fechada automaticamente quando o usurio der um clique
em um
,
dos botes, e seu resultado ser definido como Ovalor da caixa de dilogo do boto. E tudo uma
questo de controle e de onde voc planejou executar a validao.
Se a propriedade CausesVal idation for configurada corno True em txtUseri d, txtPassword, e
btnOK (e corno Fa 1se em btnCance 1), ento, poderemos usar o evento Va 1i da t i ng em txtUseri d
e txt Password para veri ficar a entrada do usurio. Como alternat iva, voc pode querer executar
toda a verificao no evento Cl i ck de btnOK, situao na qua l seria desejvel que btnOK . Di a1ogResul t fosse configurada como None, para que a caixa de dilogo no fosse fechada automaticamente quando dessem um clique no boto. Em cdigo, sempre possvel fecharmos ns mesmos
o formu lrio configurando a propriedade Di a1ogResul t diretamente. Em qualquer um dos mtodos, podemos deixar a propriedade DialogRe sul t de btnCancel configurada como Cancel, porque nenhuma validao deve ocorrer se o usurio der um clique nesse boto.
Qual dessas duas maneiras a melhor? Em um fonnulrio com apenas dois campos de texto,
provavelmente no far dife rena, mas se voc ti vesse urna caixa de dilogo grande com um nvel alto de val idao, seria recomendvel usar os eventos de validao e a propriedade CausesValidation.
A listagem 9. 18 mostra o cdigo para o evento Cl ic k de btnOK, validando os dados inseridos nas

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

Us ando as Propr i edades de VaI idao

Pr i vate Sub btnOK_Click(ByVal sender As System .Object ,


ByVal e As System.EventArgs) Handles btnOK.Click
Oim sUserID As String
Dim sPassword As String

Desenvo lvendo uma Interface com o Usurio com os Formulrios Windows

LISTAGEM 9.18

257

Usando as Propriedades de Validao (continuao)

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

24

sUserID = txtUserid . Text


sPassword = txtPassword.Text
If sUserID. Trim()= " " Then

MessageBox. Show(" Ident i fi cao do usurio obri gatri a. "


& " i ns i ra uma i dentifi cao de usu r io adequada .". "Erro r"
MessageBoxButtons.OK, MessageBoxIcon.Error)
txtUserid.Select{)
El se
If sPassword.Trim() = " " Then
MessageBox.Show("A senha obrigat r ia . " &
"ins ira uma senha apropriada . ". "Erro r ".
MessageBoxButtons.OK. MessageBoxlcon.Error)
txtPassword.Select{)
E1 se
Me.Oia1ogResu1t = Oia1ogResu1t.OK
End If
End If
End Sub

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.

Exibindo a Caixa de Dilogo


Para usar sua nova caix.:'l LogonOia 1og, voc precisa que ela seja exibida. Configurar esse fo rmulrio como o objeto a ser in iciado em seu projeto no seri a til porque ele exec utaria a caixa de
dilogo, mas o apl icativo seria encerrado quando o usurio inserisse uma identi ficao e uma senha. preciso chamar LogonDialog antes de ex ibir Forml , que o objeto de in icializao desse
projeto. Exatamente como os botes, os formu lrios tambm possuem eventos, e um em particular, Load, perfeito para esse propsito porque chamado antes de o formu lrio ser exibido. Visual ize o cd igo de Forml e se lecione Base Class Events no menu suspenso da esq uerda, na parte

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

Exibindo um Formulrio como uma Caixa de Dilogo

Private Sub Forrn l_Load{8yVal sender As Object ,


ByVal e As 5ystem.EventArgs) Handles MyBase.Load
Dim frmLogon As New LogonDialog()
Dim bLogonSuccessfu1 As Boo1ean = Fa1se
Dim sFailureMessage As String

7
8
9
10

If frmLogon . ShowDialog()= DialogResult.OK Then

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

If frmLogon. txtuserid . Text = "Duncan" lhen


If frmLogon. txtpassword. lext = "password" lhen

If Not bLogonSuccessfu l Then


MessageBox . Show(sFailureMessage. "No foi possvel efetuar logon".
MessageBoxButtons.OK . MessageBoxIcon.Error)
Me.C10se()
End If
End Sub

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

Desenvolvendo uma Interface com o Usurio com os Formulrios Windows

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?

3. Que instruo adicionada no final da declarao de um procedimento para indicar que


ele um manipulador de eventos?

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

esses trs procedimentos de eventos em um nico procedimento?


Dica: Voc precisa converter (usando CType) o parmetro sender em um controle de
System. Windows. Fonos . Contro 1 ou System.Wi ndows. Fonos. Button antes de poder acessar o conjunto comum de propriedades de controle.
LISTAGEM 9.20
1
2
3
4
5
6
7
8

Usando a Palavra -Chave Handles para Crlar um nico procedimento


chamado por vrios eventos

Private Sub btnCopy_Click(ByVal sender As System .Object ,


ByVal e As System.EventArgs) Handles btnCopy.Click
Dim sSource As String
Oim sDestination As String
sSource = txtSource.Text{)
sDestination = txtOestination .Text{)
File . Copy(sSource , sOestination)
End Sub

10 Private Sub btnMove_Click{ByVal sender As System .Object ,


11
ByVal e As System.EventArgs) Handles btnMove . Click
12
Oim sSource As String
13
Oim sOestination As String
14
sSource = txtSource.Text{)
15
sOestination = txtOestination.Text{)
16
File .Move(sSource . sDestination)
17 End Sub
18

Desenvolvendo um a Interface com o Usurio com os Formulri os Windows

LISTAGEM 9.20

261

Us ando a Palavra -Chave Handles para cr i ar um n ico procedimento


chamado por vr i os eventos (continuao)

19 Private Sub btnDelete_Click(ByVal sender As Objecto


20
ByVal e As System.EventArgs) Handles btnDelete.Click
21
Dim sSource As String
22
sSource : txtSource.Text()
23
File . De le te(sSource)
24 End Sub

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:

Corno o modelo de programao da Web difere do tradicional com base no Windows.


O uso dos controles-padro dos formulrios da Web.
O uso dos controles avanados dos formulrios da Web.
Os uso dos controles Validator.

o Modelo de Programao da Web


s vezes, parece que todas as pessoas no mundo tm acesso Internet, principalmente quando a
velocidade da minha conexo fica bastante lenta porque todos esto navegando, conversando e
enviando correspondncias eletrnicas (porm, nada relacionado a trabalho). claro que um dos

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

o nome efetivo do II S foi alterado com as diferentes verses. No Windows NT


4.0 Server, ele chamado Internet tnformation Server. No Windows 2000, foi
denominado de Internet Information Services, enquanto no Windows NT 4.0
Professiona l, seu nome Personal Web Server.

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.

Co nstrui ndo a Interface com o Usurio com os Formulrios da We b

265

FIGURA 10.1
Modelo de

;::

programao lia JVeb.

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

Como a Criao de Programas com Base na Web Difere da


de Programas com Base no Windows
Ao projetar um programa por meio dos fonnulrios da Web, h vrias diferenas que voc deve
ter em mente. Algumas delas so:

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.

Construindo a Interface com o Usurio com os Formulrios da Web

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

Usando os Controles-padro dos Formulrios


da Web
Projetar urna pgina da Web usando o Visual Basic .NET seme lhante a criar um aplicat ivo co-

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

descrio resumida desses controles.


FIGURA 10.3

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

,'

Contro les-padro dos Formulrios da Web

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

Use pa ra fornecer ao usurio um campo o nde i nserir info rmaes. Este


em geral o controle mais comum adicionado a um aplicativo da Web.

Construindo a Interface com o Usurio com os Formulrios da Web

TABELA 10.1

269

Controles-padro dos For mulrios da Web (continuao)

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

Os controles DropDownList so comuns nos formulrios da Web. Trata-se


de uma lista que inicialmente s ocupa uma linha. Voc pode dar um clique na seta suspensa para abrir e ver a l ista completa. Depois de um item
ser selecionado ela ser fechada, e s uma linha ser mostrada, contendo
sua opo. Esses controles podero ser usados nas situaes em que seu
usurio tiver de selecionar apenas um item em uma lista e quando se quiser economizar espao na tela - por exemplo, para selecionar o cdigo de
um Estado ou pas.

ListBox

Os controles ListBox permitem que o usurio selecione um ou mais itens


em uma lista de opes. Eles diferem de OropOownLi st pelo fato de a lista fi car sempre visvel. Outra diferena que possvel selecionar vrios itens
em Li stBox. Use este controle quando voc precisar do recurso de seleo
mltipla (porm, examine CheckBoxL i stj, quando quiser que o usurio possa ver todas as opes ou quando houver bastante espao na tela.

Chec kBox

O controle CheckBox representa a resposta afirmativa ou negativa a uma


pergunta. marcado ou desmarcado e, portanto, usado quando se quer
que o usurio selecione ou no uma opo. Ele difere de RadioButton, no
fato de que CheckBox no depende de outros controles iguais a ele, enquanto RadioBut t on em geral uma opo entre muitas.

CheckBoxLi 5t

O controle CheckBoxli st composto de vrios controles CheckBox. Mesmo


sendo todos independentes, o controle Chec kBox list uma maneira prtica de adicionar vrios controles CheckBox a uma pgina. Este controle especialmente ulil quando se tem um con junto de itens (que podem ter sido
recuperados de um banco de dados) entre os quais o usurio deve selecionar. CheckBoxList tambm um substituto adequado para ListBox quando
se pretende que o usurio selecione vrios itens. No entanto, recomen dvel usar ListBox se houver mais de seis itens.

I 270
TABELA 10.1

Dia 10

Controles-padro dos Formulrios da Web (continuao)

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

s uma resposta correta.


RadioButtonlist

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

o controle lmage permite que voc insira uma f igura na pgina.

Pane i

O controle Panei semelh ante ao label no fato de ser apenas um espao


reservado para texto . A diferena que Panei pode conter outros controles. Portanto, um timo recurso a ser usado quando voc precisa separar
ou realar informaes ou controles. Controles semelhantes ou relacionados podem ser ag rupados em Panei para que se destaquem.

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

Antes de criar um aplicativo da Web, voc deve instalar ou poder acessar o


Internet Info rm ation Servi ces (ou o Internet Inform ation Server).

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.

Constru ind o a Interface com o Usurio com os Formulrios da Web

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~

. "" ,1 ,, , '" 1.''' '01 ~." , b ... , '


t-oJO<O _
l!t~ ' .. mot '.tolo !"''''

e. "': .. &l o11

~_

I'(omo,

, ,:'"":"

l~'

.......

,rII

"

...,.,., .. ~ _ _

lfoIo
II

<......,

.bno .... pl&ycr ..Ie<l <fI<. of_<b


by typ< of_d. or d<",~->. n.. ..
~d dO. n.., .. ", . ;Y "",n ,. CI.OI< .~) "'"""'I. p<fl."",...d md , .....

A MacI UI> ... _

_<II . . _

"r.JEI

:t. d.,.,r-r- - - " Idod .rr,.m"r.r~;;;~;;;----~"

1.. aomIo... tn....1OO .. lOOOJ - -

~ .motio..! ""':
(""

("" P_I<T (""

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

Controles Usados no Formulrio Madl ib da Web

Controle

Propriedade

Valor

label

(!D)

lb l Name

Text

Your fi rst name:

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

A number from 100 to 1000:

Font Bold

True

(lO)

TxtNumber

Text

SOO

(lO)

Ib l Emotion

Text

An emotional state:

Font Bold

True

(10)

rlstEmotion

Constru indo a Interface com o Usurio com os Formu lrios da Web

TABELA 10.2
Controle

273

Controles Usados no Formulrio Madl i b da Web (continuao)


Propriedade

Valor

1tems

A propriedade Items de RadioSuttonList semelhante a de DropDownL i st e possui o mesmo editor.


Adicione alguns de seus estados emocionais favoritos aqui . Inseri o seguinte: Excited (excitado),
Frustrated (frustrado), Intrigued (intrigado), Saddened (triste), Panc~y (aterrorizado), Ecstatic
(extt i CO). Angry (zangado). Jea1 OUS (enci umado), Frightened (apavorado), Happy (feliz), Shocked
(chocado) e 8lue (melanclico).

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

!!' ,,,,,,,,, (011""." t d""

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.

Constru indo a Interface com o Usurio com os Formu lrios da Web

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

Cdigo para o Boto Clear

1 Pri vate Sub cmdClear_Click( 2


ByVa 1 sender As System.Object .
ByVal e As System.EventArgs)
3
Handles cmdClear .Cli ck
4
5
txtName.Text " "
6
txtDate. Text " " "
7
txtVerb . Text " " "
txtNumbe r.Text - " "
8
9
txtOccupation . Text - " "
lblResult.Text " "
10
11 End 5ub

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

Cdigo para o Boto Write Story

Private Sub cmdWrite_Click(


ByVal sender As System.Object.
ByVal e As System.EventArgs)
Handles cmdWrite .Click
' aqui que associamos as opes
'que o usurio selecionou fonnando a histria final
Dim sTemp As String
sTemp " "Dirio de " & txtName.Text &_
" de " & OateTlme .Today. ToString & "<br>"
sTemp &= "Em" & txtDate.Text &_
" Comecei a programar no Visual Basic.NET. "
sTemp &= "Estou" & rlstEmotion . SelectedItem.Text & "! "
sTemp &= "Acho que vou sair e " & txtVerb. Text
sTemp &" " meu novo" &&txtNumber.Text
sTemp &= " PicoHertz " & cboFruit.Selectedltem.Text
sTemp &" " e me tornar um " & txtOccupation.Text & " "

Dia 10

276

LISTAGEM 10.2

CDIGO

17
18
19

Cdigo para o Boto Write Story (continuao)

'a histria final annazenada no controle Label


lblResult.Text " sTemp
End Sub

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

sTemp &= "Em" & txtDate. Text &_


" Comecei

ii

programar no Visual Basic.NET. "

equivalente a:

10
11

sTemp

sTemp & "Em

" Comecei

ii

&txtOate.Text &

II

programar no Visual Basic . NET."

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.

'!J h~. // "'/...., / ... ,, ' ' .." ...."

whon .,...~ ..

Mad!..d:> ... _

liI<o ~d d

....,. ..

,.1<',,,, ,,,'....

0._" "" "' 0 "" 0>

""<I> '''''' oe_do (......aty", trI>< ofwot<l. '" ...

rp<di< <potJ '" cr ..... ()<.oJ><fuIIJ) ~ f><'Ioo..W.<d <ndftn

r..... r"', ...... :r'-----

A dOlO: r,- - - - -

A kiod .r r,UI:

A."""' .. f..". 100 '. 1000: ri- -

.'_""'---"::J

AlI .... tio ... " ... :

(" Ezao.d (" Pneq (" F....... d


(" F""".... d (" E<_ (' HoppJ
('

~d

('

(' SOilil, .. d ('

h>ln

('

Sboclu:d

l....... (' m..

A ... tlo: r i- - - - -

AlI O""PoIi'lO: ri- - - - -

fII!;] f3

Th< .... _

....

Co nstrui ndo a Interface com o Usurio com os Formu lrios da Web

277

Usando os Controles Avanados dos


Formulrios da Web
Apesar de ser fc il criar um formulrio com os controles que esto dispon veis como parte da
HTML, os formulrios da Web se tornam ainda mais teis (alm de coloridos e fce is de usar)
quando so aplicados alguns dos controles mais avanados, como Ca 1endar, AdRotator ou Data.
Embora sejam construdos com o uso de controles mais simples, eles faci litam a criao das interfaces com o usurio.

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

10.3 Prop riedades Importantes do Controle Ca1endar

Item

Propriedade

Descrio

Se1ectedDate
Vis i bleDate

Propriedade
Propriedade

A data que ser retornada por esse controle.


A data mostrada no controle. Embora em geral ela
seja a mesma de Se 1ectedDate, pode ser diferente,
principalmente se voc estiver tentando configur-Ia por meio de cdigo.

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

Cdigo Alterado do Boto Clear

Private Sub cmdClea r_Click(

2
3

ByVal sender As System.Object.


ByVal e As System.EventArgs)

4
5
6

Handles cmdClear . Click


txtName . Text" " "
calDate .SelectedDate " DateTime . Today

txtVerb . Text

txtNumber.Text = " "


txtOccupation.Text " "
lblResult . 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

Cdigo Alterado do Boto Write Story

Pr;vate Sub cmdWrite_Click(

ByVal sender As System.Object.

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

Co nstruind o a Interface com o Usurio com os Formu l rios da Web

279

No verdade que as propriedades possuem um sentido intrnseco? E por isso que os criadores
no chamaram o sistema de Visual Complexo .NET.

Usando os Controles Va 1; dator


Quando voc criar formu lrios de entrada de dados para a Web, em geral ser necessrio assegurar que eles sejam preenchidos de modo correto. Isso pode significar campos especficos preenchidos, ou apenas alguns deles, mas com valores que estejam dentro de um intervalo. No
passado, poderamos fazer isso escrevendo um cdigo no servidor ou no cliente. Se o cdigo estivesse no servidor, poderia fazer com que as informaes fossem passadas entre o cliente e o
servidor desnecessariamente. Se, em vez disso, colocssemos o cdigo no cliente, enfrentaramos problemas com a incompat ibilidade de alguns navegadores.
Vrios controles Va 1i dator que tomam a validao de fomlUlrios muito mais fcil foram includos no Visual Basic .NET. Os controles processaro a va lidao no servidor ou no cliente se
detenn inarem que o navegador tem essa capacidade. Cinco controles de val idao esto disponveis
no Visual Basic .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.

Alm desses cinco, tambm h o controle Va 1i dat ionSumnary,


que exibe todas as mensagens de
,
erro de todos os controles VaI idator na mesma pgina. E ti l por fornecer um nico local para
todas essas informaes.

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

Prop riedades Com uns aos Controles de Val idao

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

a mensagem a ser exibida se houver um erro com o controle de


validao, por exemplo, se o campo for deixado em branco. Ela
deve ter informaes suficientes para permitir que o usurio determine o que est errado e como corrigir o erro.

Display

Esta uma propriedade um pouco estranha que def ine como o


controle Va l idator apa recer na pgina da Web. Por padro, ela
configurada como Static; no entanto, h duas o utras opes, Dynami c ou Nane. Se o valor fo r defi nido como Stat i c, o espao ocupado
por ErrarMessage estar sempre preenchido, mesmo se essa mensagem no fo r exibida. Isso ser ti l se voc quiser garant ir a o rganizao de sua pgina da Web. O valor Dynamic sig nifica q ue o
controle no ocupa r espao at que a propriedade ErrarMessage
seja exibida. t adequado quando no se deseja espaos em branco
no formu lrio. Para concluir, se esta propr iedade for configu rada
como None, ErrorMessage nunca ser exibida. Essa configurao s
ti l com o controle Val idationSUlTIlIiIry (que mostrar o erro).

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

Construindo a Interface com o Usurio com os Formulrios da Web

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

Prop riedad es para os Contro les Val idatar do Formulrio Madl ib

Controle

Propriedade

Valor

RequiredFieldValidator

10

reqName

ControlToValidate

txtName

ErrorMessage

Please enter a name

( 10)

reqNumber

ControlToValidate

t xtNumber

ErrorMessage

Please enter a number

Display

Dynamic

(10)

rngNumber

ControlToValidate

txtNumber

ErrorMessage

Please ente r a number from 100 and


1000

Display

Dynamic

Type

In teger (inteiro)

MaximumValue

1000

MinimumValue

100

(10)

reqVerb

ControlToValidate

txtVerb

ErrorMessage

Please enter a verb

Display

Oynamic

(10)

reqOccupation

ControlToValidate

txtOccupation

ErrorMessage

Please enter an occupation

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

das extrem idades do interva lo.

Currency (moeda)

o mesmo que o inteiro, porm incl uindo as quatro primeiras casas

decima is do valor.

Date (data)

Compara os valores como se fossem datas, portanto, um valor igual a 27

de agosto de 1964: seria aceito em um intervalo entre 23 de novembro de 1963 e

]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

(" P-k1 (" F"""""d


(" F"' ..... d (" E<..- (" H~
(" ~d (" lo."f1'I (" Sbo<ld
(" S. dd t_ d (" l,,",,,, (" Bb:

,,~ ~r- - - - -

!.........,.., ..........
I

~.SlOtY

--CIo ..

"'' ' >&< I c

En",
En ,

-.

,,'>&< ~

,.....,

>

f,;.,.,......., .... b ln .. ,op.tioo: ~r- - - - -

Co nstruind o a Inte rface com o Us u rio com os Fo rmul rios da We b

FIGURA 10.8
O formulrio Mildl i b

mostrando os erros
enCOlI/rados na
Iolidacio.

,. ."0 11" " , .m f ~"h",~. ,,,.

rolo

u.

l/IO~

~"

...... ,",.~.,

1_ . '"' '

0 ..1, '.'" 00 , . "

283
"'r:ll:!

000'

_._. 1_ _

. o [;l t:l

a: .......... a.. eS._ I!I'.'_'

G / . '7 9 '

&

_.. II!l ....,,".............._ .... ...

,.. Ma<! II ...,. wb .. o _ pIoyt< ,,10<1' ....... oC_do (aIuaIy t>,,,,. oj"",Of<l O< <lo .... "00)
1Ioeo pkwd """ ...,.., .. 'Pt.&; ",""lO , ..... a~) _ _ pmlliiod eod .. ~

r.... r"" nua"


---"I<in~ orr..li!: ",."_
. .- - -""'13
1

"d.. "' I~

n.." ....do .0

1:

.. 12. ml

A n.......rf' . .. 100 lO 1000:

"f';-- 11.., ....". """","bo"",,,,

.,.: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....

- - - --

PIt." ..." ftII> ..... upolioo: r ,- - - -- PIt.,....'" ..

l'lt_ = """".. brIW ... le ) 0Dd 1000


l'lt... <=r a..rn
l'lt....".... "'.' ,~_

~;;. c::================Jr::rr:cr: ~~_

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

R S im, os aplicativos da Web precisam de um servidor Web que reconhea o ASP.NET,


como o Internet Informatian Server (11 5). O 11 5 vem com um serv idor gratui to da Web
que faz parte do Windows NT Server ou do Windows 2000 Server.

P Posso usar o Windows 98 ou o Windows Me para criar c implantar os aplicativos da Web?


R Esses sistemas operacionais j possuem, ou d isponibili zam, o Personal Web Server
(PWS). No possvel usar o PWS para criar ap licat ivos da Web. Os sistemas Windows
9x podem ser empregados na gerao de aplicativos da Web, mas no so plataformas
boas para sua imp lantao. Voc deve criar aplicativos da Web uti lizando o [I S no Windows NT 4 Server ou no Windows 2000 .

P Como posso aprend er mais sobre escreve r cdigos HTML?


R Embora os fo nnulrios da Web tornem o conhecimento da HTML quase opcional, ter
uma boa formao prtica nessa linguagem ajudar. Exam ine um dos bons livros que se
encontram no mercado para aprender mais.

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:

Termos importantes relac ionados aos bancos de dados.

Aspectos bsicos da SQL.

Dicas sobre proj etas de bancos de dados.

Uma breve introduo aos dados na platafonna .NET.

Um Banco de Dados a Soluo para Todos


os Problemas Cotidianos
Nos ltimos anos, um dos autores deste livro foi ficando cada vez mais atrapalhado com a sua
coleo de CDs. S h pouco tempo, ele percebeu que quase sempre ouvia apenas um ou dois

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:

ArtistName, ArtistFirstName, ArtistLastName, COTitle , CDReleaseYear ,


.. MusicCategories
Sting, Sting, ,Brand New Day, 2000, Pop
Queen, Queen, , Classic Hits Volume 1, 1987, Rock/Pop/Best Of
Sting , Sting, , Fields Of Gold, 1994, Pop/Best Of

Introduo aos Ba ncos de Dados

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

Dentro de cada registro, vrios trechos da infonnao sobre cada CD so registrados,


e cada item desses chamado de campo (nesse caso, Art istName, CDTitle, CDReleaseYeare outros). Como os registras, os campos em geral so conhecidos por oUlro nome, co/unas, porque so com freqUncia annazenados e exibidos como colunas individuais com
infonnaes.

Novo TERMO

o grupo completo de registras (todos com o mesmo conjunro de campos) chamado


de tahela, e um banco de dados pode conter muitas delas, embora o exemplo desta lio, at o momento, s6 apresente uma.

Novo TERMO

A Passagem para um Banco de Dados Real


Certo, ento agora voc conhece todos os termos que preci sar para descrever seu pequeno banco de dados, que contm uma nica tabela de registras de CDs que chamaremos de Disc. (Espero
que a utilizao que se faz do termo ' registro' para descrever tanto os lanamentos musicais
quanto uma parte do banco de dados no gere confuso.) Com seus termos e o banco de dados
definidos, como iremos trabalhar com esses dados em seus programas de computador?
Como j mencionei, o banco de dados do exemplo um simp les arquivo de texto, e esse tipo de
arquivo relativamente fcil de ler. (Veja o Dia 4, "Controlando o Fl uxo dos Programas", para
ver um exemplo da leitura de um arquivo ou o Dia 17, " Usando o .NET Framework", para obter
mais detal hes sobre as exce lentes classes de le itura de arquivos do Framework.) No entanto,
corno o exemplo se encontra no mOmento, voc meSmO teria de analisar cada linha dos dados e
manipular todas as cal unas. Mesmo se pudesse ler o arquivo, seria prefervel poder manipul-lo
usando alguma das maneiras-padro, inclusive encontrar registros especficos, adicionar novos
itens, excluir outros e alterar todo ou parte de um registro. Para implementar esses recursos, seria
necessrio escrever urna codi fica o extensa, mas no ser preciso man ipular nada disso se COIl-

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.

Uma Introduo SQL


Depois que os dados forem armazenados em um banco de dados, voc ainda ter de manipul- los a partir do programa, mas no precisar mais se preocupar com todos os detalhes. A SQL
(Struclured Query Language) fo i desenvolv ida para fornece r uma linguagem com um de acesso
aos bancos de dados. Essa linguagem contm comandos para manipulao de registros nas tabelas do banco de dados e tem suporte at certo ponto de quase todos os softwares gerenciadores de
bancos de dados dispon veis. Muitos comandos diferentes da SQL podem ser usados, mas os que
abordarei aq ui manipu lam:

A recuperao dos registras dos dados.


A incluso de novos registros.

A alterao dos regist ros existentes.


A excluso de registras.

Recuperando Registras com a Instruo SELECT


Em SQL, a instruo SELECT usada para recuperar dados de um banco de dados. Esta instruo,
em sua forma bsica, tem a aparncia a seguir:
SINTAXE

SELECT <nome dos campos> from <Tabela>

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-

Introduo aos Ba ncos de Dados

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

Especifique cada campo que quiser recuperar


em uma instruo SQL.

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.

Recupere a menor quantidade de dados ou de


campos e registras passivei pa ra fornece r um
desempenho melhor.

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:

SELECT ArtistName. CDTitle FRDM Oisc ORDER BY ArtistName , COTitle


Por padro, um campo especificado na clusula ORDER BY ser classificado em ordem crescente
(em relao ao valor ou ordem alfabtica, at atingir o ult imo registro retornado), de A a Z se o
cam po armazenar texto. Se voc quiser que a ordem seja inversa, decrescendo de Z a A, ento,
especifique uma palavra-chave DESC prxima ao trecho da clusu la ORDER BY que deseja que seja
classificada na ordem inversa. O exemplo a seguir ordenar por artista em ordem alfabtica inversa e, em seguida, por ttulo de CD em ordem crescente.
SELECT ArtistName , CDTitle FROM Disc ORDER BY ArtistName Desc, CDTitle
A ordem-padro, crescente, tambm pode ser especificada com o uso da palavra-chave ASC eX3tamente como Desc empregada. A instruo SQL a seguir possui o mesmo efeito que a anterior,
mas mais exp lc ita sobre o que est acontecendo.

SELECT ArtistName, CDTitle


FROM Di sc
DRDER BY ArtistName Desc , CDTitle ASC

Faa
Especifique ASe mesmo se estiver usando
DESC; ajudar a evitar confuso.

No ordene mais campos do que os necessrios porque isso afetar o desempenho.

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".

Adicionando Novos Registras


A ordem na qual esta li o aborda essas instrues SQL se apresenta um pouco invertida. Voc
aprendeu a recuperar dados no banco de dados antes de saber como inseri-los! Embora alguns
deles sejam apenas de leitura, na maioria dos casos os registros novos so adicionados s tabelas
regularmente. O comando SQL empregado para inserir esses registros novos chamado INSERT
e apresenta este formato bsico:
INSERT INTD <Tabela> (campo l.campo 2... ) VALUES (valor l.valor 2 .. . )
Vo ltando ao exemplo da biblioteca de registro de CDs, voc poderia usar uma instruo I NSERT para
adicionar um disco novo:
INSERT INTO Oisc (ArtistName. ArtistFirstName . ArtistLastName . COTitle.
" COReleaseYear. MusicCate90ries) VALUES ('Lenny Kravitz'. 'Lenny' .
" .'Krav it z ' , 'Greatest Hi ts' . 2000 , ' Rock/Pop/Sest Df')
Observe as aspas simples usadas em todos os valores excelO em COReI easeYear. Essas aspas so
necessrias em qualquer valor text ual em pregado nas instrues SQL para diferenci-lo dessas
instrues. J que CORe I easeYea r no um valor textual. no precisa ser co locado entre aspas.

291

Introduo aos Ba ncos de Dados

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

UPDATE <Nome Tabela> SET <nome campo>

<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

'Pop' WHERE ArtistName

'Barena ked Ladie s'

Esse tipo de reavaliao de categorias e agrupamentos em um banco de dados algo


que voc pode querer fazer de vez em quando para evitar confuso.
Embora os exemplos desta lio tenham sido simples, a instruo UPOATE pode executar aes mais complexas. Por exemplo, voc pode atualizar vrios campos de
uma s vez, separando cada atribuio com uma vrgula, e tornar uma clusula WH ERE
to intrincada quanto quiser.

292

Dia 11

UPOATE Oisc SEr ArtistName

'5ting',

Art i stFirstName " 'GordOrl',

Art istLastName

WHERE ArtistName

'Sumner'

'5tin9' DR ArtistName

'Mr.Sting'

Removendo Registros Indesejados


Voc recuperou, adicionou e alterou seus registras, sem exec utar uma operao bsica, a excl uso. A SQL forn ece uma instruo DELETE que usa uma sinta'(c simples:
SINTAXE

DELETE <Tabela> WHERE <critrio>


Nesse caso, como com UPDATE, a clusu la WHERE opcional, porm importante por-

que sem ela, voc excluir todos os registras da tabela especificada.

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 '

Para Onde Ir a Partir Daqui Abordando a SQL


A SQL realmente importante, mas tambm um tpico extenso e complexo em s ua abrangncia. Voc aprender mais detalhes sobre ela no decorrer desta lio, mas esses exemplos no fornecem uma abordagem com pleta do assunto. Quase todos os bancos de dados usam a SQL em
algum nvel, e h vrios li vros dedicados somente a essa linguagem. Alguns muito bons so :
Pas~o

Desenvolvendo Bancos de Dados na lVeb -

Dominando SQL Serva 2000, Gunderloy

MS SQL Serva 2000 - Passo a Passo, Riordan

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.

Introduo aos Bancos de Dados

293

FIGURA 11.1

O Quel)' Alla/yser
permite que I'oci!
execute instrues SQL
direcionadas a seu

. ~.

00

n ~ .. ...

bal/co de dados. mas o


recurso mais aval/rado
se el1comra lia sua

capacidade de aI/alisaI'
o desempellho e a
eSlrl/fl/ra das COlIs/lllas.

Problemas Comuns dos Bancos de Dados e


Suas Solues
Os softwares de bancos de dados armazenaro s uas tabelas, cam pos e registros, mas como os dados sero estruturados algo que s compete a voc e, portanto, a que a maioria dos problemas
ocorre. H muitas maneiras diferentes pelas quais possvel organizar o mesmo conjunto de dados, mas apenas algumas de las funcionaro bem em um sistema de banco de dados. O objetivo
produzir um banco de dados que seja eficiente para a pesquisa, mas aconselhvel dificultar a
introduo de dados inconsistentes. A inconsistncia o maior problema dos bancos de dados.
Se partes diferentes dele no estiverem em concordncia, os dados no sero confiveis. Considere o exemplo de uma tabela, na qual intencionalmente cometemos alguns dos erros mai s comuns. Nessa tabela, fci l gerar dados inconsistentes porque ela niio foi estruturada para evitar
ou pelo menos minimizar esses problemas. Percorrere i cada um dos princ ipa is problemas de
lima tabela desse tipo e mostrare i como evit-los nos bancos de dados que forem criados.

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:

UPOATE Oisc SET ArtistName = 'Bruce Willis '


WHERE ArtistName = 'S ting' and COTitle = 'The Return Of Bruno'
Essa uma instruo SQL perfeitamente adequada, mas, se a linha origina l de dados fosse como
a descrita a seguir:

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

Introduo aos Ba ncos de Dados

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

45. Janet Jackson, Janet. Jackson


Cada registro da tabela Disc ainda prec isa ser associado a um artista, portanto, voc ad icionar
um campo a essa tabela que ter um valor de Art i stIO para cada registro.
A tabela Disc agora teria a aparncia a segu ir:
Ar tistID. COTitle, CDReleaseVear, MusicCategories
I, Brand New Day , 2000, Pop
4, Greatest Hits, 1988 , Rock/Pop

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

de um estudante, de um autor ou um nmero de seguro social. Quando um campo


identifica exclusivamente cada registro de uma tabe la, chamado de chave primria da tabela. A
chave primria de uma tabela que inser ida em um campo de outra tabela para vincular as duas
entidades conhecida na ltima tabela como chave externa.

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".

Introduo aos Bancos de Dados

297

Inconsistncia entre Locais Versus Dados Incorretos


No novo layout da tabela, as informaes sobre o artista est o armazenadas na tabela Artist,
separadas das relacionadas ao CD, que se encontram em Disc. O objetivo dessa separao
coibi r info rmaes inconsistentes. Queremos evitar situaes em que duas partes diferentes
do banco de dados sejam discorda ntes sobre o mesmo trecho de dados. No estamos tentando impedir a ocorrncia de dados incorretos, embora esse seja um problema real.
Na verdade no um problema de um projeto de banco de dados se o campo Fi rstName de
Sting for configurado como George em vez do nome certo Go rdon, co ntan t o que todo o banco de dados esteja consisten te e armazenando apenas um valor, no caso George. Isso pode
parecer um pouco estranho porque os dados incorretos so uma questo de importncia relevante, mas o objeti vo do projeto do banco de dados evitar a introduo de erros devido ao
layout dos dados. O software e seus usurios que precisa m estar atentos para evitar os dados incorre tos.

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

trs tabelas: as dilas

emidades que eSTo


relacionadas e lima tabela

PK

i
Arti~tlD

especial qlle exiSla apel/os

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

um-para-multos e mUltos-para-mu ltos na seao a segUIr.

Associaes: Consultando Vrias Tabelas de uma S Vez


Agora que voc separou de modo adequado seus dados em vrias tabelas, ser prec iso mais do que as
s imples consu ltas SELECT que executou anteriormente para obter as informaes que deseja. Neste
momento h algumas tabelas distintas, porm uma se relacionando com a outra atravs de campos-chave. Usando esses mesmos campos-chavej podemos associar os dados de uma tabela com os
correspondentes da outra tabela, ou tabelas, e produzir um nico conjunto de resu ltados. H diversas

maneiras de constru ir a instruo SHECT quando se quer trabalhar com mltiplas tabelas, mas veja a
seguir um exemplo:
COOIGO

SELECT Art is t . Arti stName


WHERE

RESULTADO

Di sc . CDTitle FR M Art ist

Di sc

Artist.ArtistIO '" Oisc.ArtistIO

Nothi ng Li ke lhe Sun


Sting
Brand New Oay
Sting
lhe Barenaked Ladies
Maroon
lhe Barenaked Ladies
Gordon

...

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-

Introduo aos Ba ncos de Dados

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.

Associaes Internas versus Externas


Com uma associao interna, a consulta retorna apenas os registros em que uma correspondncia foi encontrada nas duas tabe las. No exemplo, isso signi fi ca que se um art ista foi listado na tabela Art ist, mas no teve nenhum registro correspondente na tabela Disc, ele no far parte do
resultado. Se esse no for o resultado esperado, se em vez disso voc quisesse todos os art istas
listados na tabela Artist em seus resu ltados (mesmo se no tivesse nenhum disco de alguns deles), poderia usar urna associao externa. As associaes externas vinculam as tabe las uti Iizando as mesmas informaes, mas se no consegu irem encontrar nen hum valor correspondente em
uma delas, mesmo assim retornaro os campos da primeira e anu laro (removero) os valores
dos campos que estiverem na segunda tabela. A palavra-chave OUTER pode ser preced ida por
LEFT oU RIGHT para espec ificar em que direo a associao deve trabalhar.
Voc deve estar se perguntando qual tabela seria a primeira e qual seria a segunda. Bem, se voc
especificar RI GHT OUTER JO lN, ento, ser considerada a primeira tabe la aquela que estiver direita
da instruo JOIN. Se especificar LEFT OUTER JOIN, a tabela esquerda ser a primeira.
Digamos que, no banco de dados do exemplo, voc tivesse o artista Limp Bizkit na tabela Artist ,
mas no houvesse nenhum disco na tabela Disc executado por ele. A instruo INNER JOIN mostrada no cdigo a segu ir produziria um conj unto de registros, mas o artista Limp Bizkit no seria
mencionado nos resultados.
SELECT Artist.ArtistName. Disc .COT i tle
FROM Di sc INNER JOIN Artist ON (Artist.ArtistID
ORDER BY Artist.ArtistName

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.

Introduo aos Ba ncos de Dados

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.

Criando Chaves Primrias


No exemplo, voc term inou com chaves numricas para todas as tabelas (Arti stID, CategoryID,
Di seIO), mas Oque no abordamos a necessidade de obter ou gerar essas chaves sempre que um
novo registro for inserido. I-l mu itas maneiras pe las quais possvel man ipul ar esse req uisito:
recursos internos do banco de dados, clculo na hora da insero, usar GUIDs em vez de nmeros simples, ou um sistema que gerencie e incremente as chaves chamado gerenciadorde chaves.

Recurso do Banco de Dados

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):

SELECT MAX(ArtistID) fROM Artist


Essa instruo retornaria apenas o registro de um campo contendo o valor mais alto relativo s
identificaes existentes atualmente na tabela. Adicione um a esse valor, e voc ter a prxima
identificao, que ento ser usada em uma insero.
Essa abordagem, embora vlida em algumas circunstncias, apresenta dois prob lemas principais.
O primeiro ocorre porque mais de um programa poderia estar usando ao mesmo tempo esse ban
co de dados - do is ou mais usurios poderiam estar adicionando art istas no mesmo momento.
Em uma situao dessas, seria possvel que alguns usurios executassem sua primeira instruo
SELECT antes que o usurio anteriortivesse executado sua instruo INSERT, portanto eles teriam
obtido o mesmo valor para a identificao.
Esse prob lema pode serevitado com o uso de transaes, outro dos conceitos de bancos de dados
que no abordarei nesta lio.
O segundo problema no pode ser ev itado com tanta faci lidade. Ele ocorre quando um ou mais
registros do fi nal da tabela (as ident ificaes mais altas) so excl udos. Q ualquer registro novo
primeiro selecionar MAX (A r t i s tI O) e obter os valores de identificao anteriormente atribu
dos aos registros exc ludos. Em um sistema em que se pretende que os valores das identificaes
sejam exclusivos, ter registras diferentes compartilhando a mesma identificao em momentos
distintos no muito aconselhvel.

Identificadores Exclusivos (GUIOs - Globallv Unique Identifiersl


Em algumas sit uaes, uma chave crescente - criada pe lo banco de dados ou por meio de seus
prprios clcu los - no adequada. Um exemplo em que isso acontece seria quando temos ban
cos de dados distribudos, nos qua is h vrias cpias do banco de dados e essas so regularmente
unificadas. As inseres podem ocorrer em quaisquer das cpias. Se voc usasse umachave com
o recurso incremental, ento, sempre que as inseres ocorressem em mais de um local, seriam
produzidas identificaes dupli cadas. Uma soluo seria empregar alguma forma de identifica
o gerada ao acaso, aleatria o suficiente para que pudesse ser criada em vrios locais com pou
ca ou nenhuma chance de ser duplicada. O mtodo em geral aceito para a criao de
identi fi caes aleatrias a utilizao de um GU IO (Globally Unique ldent ifier), um nmero

Introduo aos Bancos de Dados

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.

Procedimentos Armazenados e Chaves de Gerao Automtica


Enq uant o descrevia o tipo de dado de incremento automtico como o po para a criao de
chaves, mencionei que difcil obter a chave depois de executada uma instru o INSERT, e que
essa uma das razes principais para escolher um mtodo alternativo de gerao de chaves.
Embora esses coment rios anteriores sejam realmente procedentes, h um mtodo em gera l
usado para obteno de uma chave gerada pelo sistema depo is de uma insero. Esse mtodo s estar disponvel se voc empregar um procedimento armazenado para inserir seus registras, o que no sera abordado com detalhes neste livro. Se quiser obter mais informaes
sobre esse mtodo de insero de registros e obteno da nova identificao gerada, pesquise a biblioteca do MSDN.

304

Dia 11

Criando o Banco de Dados de Exemplo


Para os exemplos do restante desta lio e para o cd igo que voc ir escrever no Dia 12, "A ces-

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

Este arquivo usado no Exerccio 2 no fim desta lio.

Access 2000 ou Access 2002


Para os usurios que possuem o Access, ou que no t iverem nenhum sistema de banco de dados,
no ser necessrio criar uma configurao; voc s precisar saber o caminho para o arquivo
. mdb que usar nos exemplos. Se quiser empregar o Access para trabalhar com os dados, o n ico

Introduo aos Ba ncos de Dados

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.

MSDE e SQL Server 2000


Tanto para o MSDE quanto para o SQL Server, os dois arqu ivos (cd.mdf e cd.ldf) representam
,
um banco de dados isolado. E possvel incluir novamente esse banco de dados na sua cpia do
SQL ou do MSDE. O cdigo fornec ido no arquivo de script AttachOB . vbs vincular esses dois
arqui vos a seu sistema de banco de dados. Embora o arqui vo deva funcionar 'como est' para a
maioria das pessoas, na verdade ele contm a identificao de usurio e a senha do administrador
do sistema em seu cdigo, tendo como padro as configuraes sa e uma senha em branco. Se
seu sistema no tiver uma sen ha em branco para a conta sa, voc precisar editar esse arqu ivo.
Esse arquivo de script tambm foi projetado para ser executado (com um clique duplo nele) no
mesmo diretrio dos arqui vos . mdf e . ldf e na mesma mquina de seu sistema de banco de dados. V em frente e d um clique duplo nesse arquivo, depoi s que tiver feito todas as alteraes
necessrias na identificao do usurio e na senha armazenadas no cdigo.

Testando a Configurao com System.Data


Agora que voc fez o download e configurou os dados de seu exemplo, poder criar um pequeno
aplicativo de console no Visual Basic .N ET para confirmar se tudo func iona como deveria. Para
tanto, ser preciso usar o espao de nome System.Data com o .NET Framcwork. Essas classes
contm tudo que necessrio para acessar dados em quase todos os tipos de banco de dados e so
divididas em duas reas princ ipais - as classes projetadas para acessar o Microsoft SQL Server
(incluindo o MSDE) e as que acessam qua lquer banco de dados que possua um driver de OLE
DB (o que significa quase todos os bancos de dados).
No me deterei muito em detalhes sobre eomoessas classes funcionam. Em vez disso, o exemplo a
segu ir apenas testar se seu banco de dados est configurado corretamente antes de passannos para
a prxima lio, na qual me aprofundarei no acesso aos dados por me io da platafom1a .NET.
O cdigo que ser usado para testar o banco de dados estabe lecer uma conexo com ele empregando o conjunto de c lasses do OLE DB do espao de nome System.Data . OLEOB. As classes
System . Data . Sql Cl ient podem ser utilizadas se voc tiver o SQL Server ou o MSDE, mas, j
que o Access tambm pode estar sendo usado, ser mais simples utilizar as classes que podem
acessar os dois tipos de bancos de dados. Quando empregar um dos mtodos de conexo com o
banco de dados, o trecho-chave da infonnao o que chamado deslring de conexo, um texto
que fornece todas as informaes necessrias para a conexo com seu banco de dados. Esse o
nico trecho do cd igo que ter de ser alterado para que se encai xe em sua configurao especfi-

Dia 11

ca. A Listagem 11.1 contm o procedimento completo, e fornecerei informaes adicionais so


bre os valores da string de conexo depois desta listagem.
LISTAGEM 11 .1

TextOB.vb

1 'Substitua a string de conexo pelo valor apropriado


2 ' sua configurao (explicado nes ta lio)
3 'e, em seguida, compile com :
4 '''vbc jr:System.OLL jr:System.Data.DLL Tes tOB.vb"
5 Imports System
6 Imports System . Data
7 Module TestDB
8
Sub Main()
Dim sConnectionString, sSQL As String
9
sConnect i onString " <consulte abaixo>
10
11

12
13
14
15

16
17

18

19

20
21
22

sSQL = "SELECT COTit le FRDM Disc ORDER BY ArtistID Ase"


Oim connCO As New OleDb .OleDbConnection(sConnectionSt ring)
Dim cmdCO As New OleOb.OleObCommand(sSQL, connCO)
Oim drCD As OleOb.OleDbDataReader
connCO . Open ()
drCO = cmdCO.ExecuteReader()
Do While drCO.Read()
Conso I e. Wri teL i ne (drCO. I teme "CDTi t I e") )
Loop

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)

Introduo aos Bancos de Dados

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

Left Of The Midd le


the tragica 11 y hip
Road Apples
Oay for Ni ght
Phantom Power
Brand New Oay
Mercury Falling
Fields of Go1d
Classic Queen
20 Greatest Chri5tmas Songs
Gordon
Born on a Pirate Sh ip
Maroon
Tail 5
Fi recracker
Janet
The Ve lvet Rope
Design Of A Decade 1986-1 996
Mad Season
Music

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".

Introduo aos Ba ncos de Dados

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 ?

SELECT Make.MakeName. Model.Mode lName


FROM Make LEFT OUTER JOIN Model ON Make.MakeID '" Model .Make

Make

FIGURA 11 .6

Exibio das labe/as


referemes li
perg1ll1la 2 do Tesle.

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?

SElECT Make.MakeName. Model.Mode lName


FROM Make INNER JOIN Mode l ON Make . MakeI O '" Model.Make

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:

Uma viso geral da arquitetura de acesso a dados da plataforma .NET.


Conexo a um banco de dados.

Execuo de instrues SQL.

O uso da vincu lao de dados com os fonnul rios da Web e do Windows.

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.

Uma Viso Geral do Acesso aos Dados na


Plataforma .NET
Os bancos de dados so usados em quase todos os aplicativos empresariais que j foram criados
e em muitos sistemas pessoais e de microcomputadores. Eles j eram encontrados em uma dessas formas mesmo antes da criao do Visual Basic. Esse longo histrico dos bancos de dados e
de seu uso em programas de computador assegurou que os programas do Visual Basic j acessassem dados e bancos de dados desde suas pri meiras verses. Da mesma manei ra, a tecnologia

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.

Acessando Dados co m a Pl atafo rma .N ET

FIGURA 12.1

3 13

Aplicativos do Visual Basic

O ADO foi projetado


COIIIO 11111(1 c all1ada

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

Provedo res de aLE DB

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

(contm objatas para

o ADo.NET
dil'idido em dilas
secs principais.

manipu lao de
dados genricos)

OLED/3 e SQL. que


permiTem q/le voc se
cOl/eele a lili/a

ampla

Svstem.Dat3 .SQLClient
(contm objatas espEtel/icos

I'oriedade de fomes de
dados.

para conexes com o


Microsoft SQL Server)

System.Oata.OLEOB

,,
,,
,,,
,,

,-- ---- -- --

(contm objatos especificas


para conexes por meio de

provedores de Ol EOB)

System.Data.OOBC
(contm objatas especificos

para conexes por meio


de drivers de OlEOB)

Como na verso Beta 2. nlio inclulda no Visual Studio .NET


mas disponvel como download da Web, (I ADO.NET dividido

em duas sees principais. OlEOB e SOL, que permitem que


voc S8 conecte II uma ampla variedade de fontes de dados.

Tarefas-padro dos Bancos de Dados


Em vez de abordar as classes System.Data em um formato referenc ial que examine cada classe,
esta seo enfocar as tarefas que normalmente so executadas. Essas tarefas, como a conexo a
um banco de dados, a execuo de uma instruo SQL ou a recuperao de dados, fornecero um
ponto de partida natural para a discusso dos objetos subjacentes.

Conectando-se ao Banco de Dados


Antes que voc possa comear a trabalhar com algum dado, precisar estabelecer uma conexo.
A conexo representa e contm todas as configuraes necessrias para que se u banco de dados
seja encontrado e acessado. Em verses anteriores do ADO, ela envolvia dois itens principais, o
objeto da eonex,10 e uma string de conexo. A string de conexo, uma linha de texto que inclui
algumas Oll todas as informaes necessrias para o acesso a seu banco de dados, ainda a chave
para configurar uma conexo de banco de dados no ADO.NET, em bora agora existam do is objetos diferentes de conexo (um para o OLEDB e outro para o SQL Server). Antes de comearmos
a codificar, devemos obter a string apropriada de conexo com o seu banco de dados. Mesmo
sendo apenas um valor textual e podendo, portanto, ser criado manualmente, a manei ra mais fci l de obter uma string correta usar um pouco de astucia.

Acessando Dados co m a Pl atafo rma .N ET

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

Para o SOL SerreI".


os deralhes da
cOI/exilo incluem o
IIOII/e do sel1'idol',

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:

Acessando Dados com a Plataform a .N ET

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

Uma String de Conexo

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

Uma String de Conexo (continuao)

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

Abr i ndo uma Conexo

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

Acessando Dados com a Plataforma .NET

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

O Tratamento de Erros Essencial Quando Se Lida com Bancos de


Oados

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.

Executando uma Instruo SQL


Agora que voc tem uma conexo estabelecida, com certeza desejar ter a capacidade de adicionar, excluir, alterar e recuperar registros. Para conseguir realizar qualquer uma dessas tarefas,
voc poder usar um objeto de comando (SQLCorrmand ou 01 eDBConmand) para representar c, em
seguida, executar uma instruo SQL. Antes de poder empregar um objeto de comando, precisar da instruo SQL que quer executar e de um objeto de conexo (SQLConnection ou 01 eDBConnection). O objeto de conexo no precisa ser aberto quando o objeto de comando estiver sendo
criado, mas ter de ser antes da execuo efetiva do comando. Se tivermos nossa instruo SQL

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

Executando Consultas no Banco de Dados

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

Console.Wrlte("Pressione Return para executar a consulta: (O}" , sSQL)


Console.ReadLine()
If objConn.State = ConnectionState.Open Then
Try
objCmd . Execu teNonQuery ()
Catch myException As System.Exception
Conso 1e. Wri teL i ne (myExcept i on. Message)
Console.ReadLineO
End Try
End If

34
35
End Sub
36 End Module

Acessando Dados co m a Pl atafo rma .N ET

LISTAGEM 12.5

321

Configurando as Propriedades Individualmente

1 Dim objCmd As New Ol eDbCommand()


2 objCmd . Connect i on = objConn
3 objCmd.CommandText = s5QL
A execuo da inst ruo INSERT cfetuada pelo mtodo ExecuteNonQuery do objeto de comando
(l inha 13), mas esse mtodo fo i projetado para ser usado apenas com os comandos da SQL que
no retornem linhas.

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

Acessando os Resultados de uma Consulta ao Banco de Dados

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

Acessa nd o os Resultados de uma Consulta ao Banco de Dados


(continuao)

Dim obj Conn As New _


System.Oata.OleOb .OleObConnection (s Connection)
Dim obj Cmd As New _
System.Oata .OleDb.OleDbCommand(sSQL , objConn)
Dim objReader As _
System.Oata.OleOb.OleObOataReader

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

Acessando Dados com a Platafo rma .N ET

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.

Trabalhando com Data Sets


Na seo anterior, voc usou um leitor de dados para recuperar informaes em seu banco de dados. Esse foi um tipo de acesso a dados conectado, em que preciso estar conectado com o banco
de dados durante lodo o processo. Conseqentemente, esse esti lo de acesso a dados mais adequado quando se quer rec uperar rapidamente um conjunto de informaes e no h planos de
continuar a us-las por um tempo mais longo (mais de alguns segundos). Como alternativa, se
recuperarmos dados e, em seguida, continuarmos processando-os, alterando, exibindo, filtrando, executando ou ainda manipulando esses dados por muito tempo ou relendo-os corno uma
forma de cache, ento, o tipo de acesso a dados conectado no ser a me lhor escol ha.
Como outra opo, a plataforma .NET fornece um mode lo de acesso a dados totalmente desconectado por meio do Dala Set (System . Data .0ataSet). possvel carregar informaes nos Data
Sets, em geral de um banco de dados, embora possam provi r de outras fontes , tornando-as independentes de sua origem. A independncia da fo nte dos dados o motivo pelo qual essas in formaes so cons ideradas desconectadas e podem ser mantidas pe lo tempo necessrio em um
ambiente total mente off-line. Se vocj usou a verso anterior do ADO, ento, isso pode parecer
semelhante ao objelO desconectado Reco rdS et dessa tecnologia. parecido com esse objeto de
muitas maneiras, mas possui muitos outros recursos. Um Data Set pode conter vri as tabelas
com informaes, mon itorar os relacionamentos entre elas e at manter ln ltiplas visualizaes
diferentes de cada tabela de dados. Esses objelos so como bancos de dados completos que usam
a memria e ainda so capazes de fornecer uma ut ilizao simples com um conjunto nico de resultados.
Nas sees a seguir, voc aprender a carregar dados em um DataSet e, em segu ida, tendo armazenado-os, a navegar por essas informaes. Depois de abordados esses aspectos, usaremos alguns dos recursos mais complexos, incluindo tabelas, visua li zaes e relacionamentos m ltiplos. Para concluirmos, examinaremos como retomar ao banco de dados, depoi s que tivermos
ed itado, excl udo e ad icionado linhas, as alteraes efetuadas em um dataset.

Inserindo Dados em um DataSet


Para carregar as informaes de seu banco de dados em um OataSet, voc precisar usar outro
tipo de objeto, um adaptador de dados. Os objetos adaptadores de dados, SQLOataAdapter e
01 eDBOataAdapter, foram projetados para fornecer a unio ou vnculo entre se u banco de dados e
um objeto OataSet. Esse vncu lo funcio na em duas etapas, preenchendo o DataSet e, em seguida,
retornando as alteraes do DataSet fo nte dos dados para atual izar o registro original. Aprenderemos como funciona o estgio de atual izao desse processo ainda nesta lio, mas antes que
possamos atualizar alguma coisa, temos de carregar os dados. Primeiro, devemos criar um

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

Preenchendo um DataSet com os Resultados de uma Consulta

I Modu le Modu l eI
2
Private Const sConnection As String = "Provider=SQLOLEOB.I;" &
3
"Password=;" &"User IO=sa;" &_

Acessando Dados com a Plataforma .NET


LISTAGEM 12.7

325

Preenchendo um DataSet com os Resultados de uma Consulta

(continuao)
5
6
7
8
9
10
11
12

13

"Initia1 Catalog=CD ; " &


"Data Source=(loca1)"
Sub Ma in()
Dim sSQl As String
sSQL" "SELECT ArtisLArtistID , " &
"ArtisLArtistName , Disc.CDT it1e " &
"FROM Artist INNER JOIN Oise ON " &
"Artist . ArtistIO = Oisc . ArtistID ; "

14

15
16
17
18
19

Dim objConn As New _


01eOb.OleDbConnection(sConneetion)
Dim ob j OataAdapter As New _
OTeDb .01eObDataAdapter(sSQl,objConn)
Dim ob j OS As New DataSet("CDs")

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

Navegando pelos Dados


Depois que voc carregar alguns dados em seu DataSet, pode querer exam inar essas infor~
maes. Oobj eto com o qual trabalhar na verdade no o Oata5et, porq ue ele representa potencialmente vrias tabe las diferentes, mas sim o objeto DataTab 1e correspondente aos dados carregados nos quais esti ver interessado. O cd igo a seguir mostra como poder obter um DataTable a
partir do DataSet que o contm:

Dim objTable As DataTable


objTable " objDS.Tables(UDisc")
J que o cdigo que inseriu os dados no DataSet forneceu o nome "Di se" para a tabela recm-carregada, voc pode usar esse nome para acessar a mesma tabe la. O objeto DataTab le dis-

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

Acessando Dados com a Platafo rma .NET

327

Console.WriteLine("Column Name: {O} Data Type : (1}" ,_


objColumn . ColumnName,_
objColumn . DataType.FullName)
Next

o cdigo do proced imento Di spl ayTabl e do exemp lo descrito na Listagem

12.8 mostra como


voc poderia usar as propriedades Rows e Col umns de um DataTabl e para escrever um procedimento genrico a fim deexibir todas as informaes sobre a tabela com os cabealhos da coluna.

LISTAGEM

1
2
3
4

12.8

Exibindo o Contedo de um OataTable

Sub OisplayTable(ByRef objTable As OataTable)


Oim objRow As OataRow
Oim objCol As OataColumn
Oim i , j As Integer

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

A Funo DisplayTable (continuao)

Dim sSQL As String


sSQL " "SELECT ArtisLArtistID , " &"ArtisLArtistName, Di sc.CDTitle " &
"FROM Artist INNER JOIN Di sc ON " &
"Artist.ArtistIO " Disc.ArtistID "

14

15
16
17

Dim objConn As New _


OleDb .Ol eDbConnection(sConnection)
Dim objOataAdapter As New _
OleOb.01eDbOataAdapter(sSQL,objConn)
oim objoS As New _
DataSet("Cos")

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.

Acessando Dados com a Platafo rma .N ET

329

Editando Dados (Adicionar, Editar e Excluir)


Nesta seo, voc escrever um cdigo para alterar seu banco de dados por meio do objeto OataSet. No entanto, o banco de dados propriamente dito no tem conhecimento algum desses objetos DataSets e acabar sendo alterado pelas instrues SQL. As alteraes que fo rem feitas no
DataSet sero convertidas pelo DataAdapter em instrues SQL que tero de ser executadas visando ao banco de dados. claro que seria poss vel apenas executar cada instruo UPDATE,
INSERT e OELETE diretamente, mas o modelo DataSet possui os beneficias de ser desconectado
(evitando o uso de recursos do servidor enquanto aguarda a interao com o usurio) e si mples
(usando mtodos do objeto, como OELETE, em vez de instrues SQL personalizadas).
Usando os trs tipos de alterao de dados - adicionar, editar e excluir - um de cada vez, voc
ver como pode man ipular facilme nte seus dados por meio dos mtodos dos objetos DataTable e
OataRow.

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

Usando um Array (listagem parcial do cdigo)

1 Dim drRows As DataRowCo llect ion


2 Dim objNewRow As DataRow
3 drRows =' objTable.Rows
4

5
6
7
8

'Neste caso, temos 3 colunas


'A rti stIO
'A rti stName
'CDTitle

10
11
12
13
14
15

'Usando o mtodo do array produziremos


Dim arrFields(3) As Object
arrFields(O) = 10
arrFields(I) = USting U
arrFields(2) = uO ream of Blue Turtles"
objNewRow =' drRows . Add(arrFields)

LISTAGEM 12.11

Fornecendo um Objeto OataRow como Parmetro para o Mtodo Add

1 Dim drRows As DataRowCo llect ion


2 Dim objNewRow As DataRow
3 drRows =' objTable.Rows
4

5
6
7
8

'Neste caso , temos 3 colunas


'A rtistIO
'A rtistName
'CDTitle

10
II
12
13
14

objNewRow =' objTable.NewRow{)


objNewRow(UArtistro") =' 3
objNewRow(UArtistName U) =' uGeorge Orwell u
objNewRow(UCOTitle U) =' "Party like it 's 1984 U
drRows.Add(objNewRow)

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.

Acessando Dados com a Platafo rma .N ET

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

12.12 O Mtodo Delete Marca uma Linha como Excluda

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

Acessando Dados co m a Plataforma .N ET

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

Console.Write{"Aps a excluso . press i one return para visua li zar")


Console.Readline()
OisplayTable(objTable)
Catch myException As System.Exception
Console.WriteLine(myException.Message)
End Try
Console.ReadLine()
End If

End Sob
Sob DisplayTable{ByRef objTable As DataTable)

Oim objRow As DataRow


Dim objCol As DataColumn
Dim i. j As Integer
For j = O To objTable.Columns.Count - 1
objCol = objTable.Columns(j)
Console.Write{"{OI:{11 ".
objCol . ColumnName._
objCol . DataType . Name)
Next
Console.WriteLine()
For i = O To objTable.Rows.Count - 1
objRow = objTable.Rows{i)
Select Case objRow . RowState
Case OataRowState.Oeleted
Console.Write{"[Oeleted]
Case OataRowState.Modified
Console.Write("[Modified]
Case OataRowState.Added

")
")

Dia 12

LISTAGEM 12.12

O Mtodo Delete Marca uma Linha como Excluda (continuao)

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.

Atualizando O Banco de Dados


Depois de adicionar, edi tar ou exc luir os registras, voc ter de atualizar a fonte original dos dados (o banco de dados) antes que essas alteraes tenham efeito. O proced imento que usa um Da taSet alterado para atualizar o banco de dados de origem o mesmo, independentemente das
mod ificaes feitas , e envolve o uso da classe de adaptadores de dados.

Especificando os Comandos de Atualizao, Inser o e Excluso


Quando voc criou um adaptador de dados para carregar informaes em seu DataSet, forneceu
um objeto de comando ou uma instruo SQL que o adaptador, em seguida, usou para recuperar
os dados de seu banco de dados. Esse comando na verdade um entre os quatro aos quais o adaptador de dados pode dar suporte, tendo cada um sido projetado para manipu lar uma taret diferente na transmisso de dados entre o banco de dados e os DataSets. S um dos comandos,
aquele quej foi usado, manipula a extrao de dados do banco de dados e chamado de Select-

Acessando Dados com a Platafo rma .N ET

335

COlTflland. Os outros trs (UpdateColTflland, DeleteColTflland e InsertColTflland) manipulam edies,


excluses e inseres no banco de dados. Cada um desses comandos deve conter um valor apropriado, seja uma instruo SQL ou uma chamada a um procedimento armazenado no servidor,
antes que a ao que lhe compete possa ser executada. Cada propriedade dessas representa um
objeto COlTflland do tipo apropriado (01 eDBColTflland ou SQLColTflland), que ser criado ou inicializado antes de ser atribudo propriedade.
Para que voc mesmo crie esses comandos, prec isar usar um tipo de consulta que
no fo i abordada at agora nesta lio, um comando com parmetro.\". Um comando
dessa espc ie deixa espaos reservados especia is em sua instruo SQL - parmetros - que so preenchidos com valores especficos antes que o comando seja executado. Os pontos de interrogao
so usados na instruo SQL para representar os parmetros, como mostrado na Listagem 12.13:

Novo

TERMO

LISTAGEM

12.13 Os Adaptadores de Dados Preci sam de Comandos com Espaos


Reservados

1 Dim objDeleteCommand As New 01eDb .OleDbCommand()


2 Dim sDeleteSQL As String
3

4 sOeleteSQL ,,"DElETE FROM Artist WHERE ArtistID " ?"


5

6 objDeleteCommand . Connection " objConn


7 objDeleteCommand.CommandText = sDeleteSQl
Os detalhes devem ser fornecidos para cada espao reservado pela incluso de um objeto de parmetro (01 eOBParameter ou SQLParameter, dependendo do ambiente em que voc trabalha) no
conjunto de parmetros do comando. Cada objeto de parmetro vincu lado a um campo especi ficado do OataSet por meio da propriedade SourceCol umn, e tambm pode ser associado a uma verso espec ificado campo por meio da propriedade SourceVersion. A Listagem 12.14 mostra o cdigo
necessrio para adicionar um parmetro e configurar algumas das propriedades disponveis.
LISTAGEM

12.14 Criando Parmetros em um Objeto de Comando

1 Oim objParam As OleOb.OleObParameter


2
3 objParam = objDeleteColTflland . Parameters . Add{_
4
"@ArtistID" , OleDb.OleObType .Integer)
5

6 objParam . SourceColumn = "AristID"


7 objParam . SourceVersion = DataRowVersion.Original
Nesse exemplo, o nico ponto de interrogao fornecido para a SQL foi associado a esse novo
objeto de parmetro. Os espaos reservados foram assoc iados aos parmetros com base na posi-

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

12.15 As Alteraes No Tm Efeito at Que o Mtodo Update Seja


Chamado

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

Acessando Dados co m a Platafo rma .N ET

LISTAGEM 12.15

29
30

As Alteraes No Tm [feito at Que o Mtodo Update Seja


Chamado (continuao)

sDeleteSQL

"OELETE FROM Artist WHERE ArtistI O " ?"

31

32
33

objOeleteCommand . Connection = objConn


objOeleteCommand.CommandText = sOeleteSQL

34

35
36
37
38
39

Dim objParam As OleDb.OleDbParameter


ob j Param " objOeleteCommand.Parameters.Add(_
"@ArtlstlO". 01 eOb. 01 eDb Type. Integer)
objParam . SourceColumn = "ArtistIO"
objParam . SourceVersion " DataRowVersion .Ori9inal

40

41
42
43
44
45
46
47
48
49
50
51
52

objDataAdapter.DeleteCommand
sUpdateSQL

objDeleteCommand

"Update Artist SET ArtistName


"WHERE ArtistlO = ?"

? " &

objUpdateCommand.Connection = objConn
objUpdateCommand.CommandText = sUpdateSQL
ob j Param

objUpdateComma nd. Parameters .Add(_


"@ArtistName" , OleDb .OleObType . Char)
objParam.SourceColumn = "ArtistName"
objParam.SourceVersion " DataRowVersion.Current
=

53

54
55
56
57

ob j Param " objUpdateCommand.Parameters.Add(_


"@ArtlstID". OleDb.OleDbType.lnteger)
objParam . SourceColumn = "ArtistlO"
objParam.SourceVersion " DataRowVersion.Original

58

59

objDataAdapter.UpdateCommand

objUpdateCommand

60

61
62
63
64
65
66
67
68
69
70
71

sInsertSQL

"INSERT INTO Artist " &


"(ArtistlO. ArtistName) " &
"VALUES (? ?) "

ob j InsertCommand . Connection = objConn


objlnsertCommand . CommandText = sInsertSQL
objParam " objlnsertCommand.Parameters.Add(_
"@ArtistID" . OleDb.OleDbType.Integer)
ob j Param . SourceCo1umn = "ArtistlO"
objParam . SourceVersion " DataRowVersion . Current

337

Dia 12

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja


Chamado (continua o )

72
73
74
75
76

objParam " objlnsertCommand.Parameters.Add(~


"@ArtistName" , OleOb.OleObType .Char)
objParam . SourceColumn" "ArtistName"
objParam . SourceVersion " OataRowVersion . Current

77

78

objOataAdapter . lnsertCommand " objlnsertCommand

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

If objConn.State " ConnectionState.Open Then


Try
objOataAdapter . MissingSchemaAction
"Mi ss i ngSchemaAct i on . AddWi thKey
ob j OataAdapter . Fil l {objOS . "Artist")
ob j Conn . Cl ose O
Oim objTable As DataTable
objTable " objDS.Tables("Artist")
Oim drRows As OataRowCollection
Oim objCurrentRow As OataRow
drRows " objTable . Rows

Acessando Dados com a Plataforma .NET

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja


Chamado (continua o )

115

116

DisplayTab l e(objTable)

117

11B
119
120

121
122
123
124
125
126
127
12B
129

Console.Write("Se pretende excluir , " &_


" pressione re turn para in ic iar!")
Console.Read l ine ()
'Exclua a linha com chave primria
drRows.Find(ll) . Delete{)

11

Console.Write("Aps a excluso , " &


II press i one return para vi sua 1i zar os resul tados")
Console.ReadLine()
DisplayTable(objTable)

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

Console.Write("Se pretende inserir , " &


pressione return para in ic iar!")
Console.ReadLine()
II

Dim drRow As Data . DataRow


drRow = objTable . NewRow
drRow("ArtistID") " 40
drRow("ArtistName") = "Kent Sharkey"
ob j Table . Rows.Add(drRow)
Console.Write("Depois de inserir , " &
" pressione return para visualizar! ")
Consol e.Readl ine()
DisplayTable{objTable)

Console.Write("S e pretende atualiz ar," &


" pressione return para inicia r! ")
Console.Readline{)
' Acesse a linha com chave primria ig ual a 7 (lisa loeb)
drRow = drRows . Find{7)
drRow.8eginEdit()
drRow{"Art istName")
drRow . End Edit ()

"John Doe"

339

Dia 12

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja


Chamado (continua o )

158
159
160
161
162
163
164
165
166
167
168

Console.Write("Oepois de atual i zar , " &


" pressione return para visualizar os resultados")
Console.ReadL ine ()
oisp l ayTable(objTable)

169
170
171
172
173
174
175
176

obj Conn. open ()


obj Da taAdapter. Upda te (objoS , "Art i s t")
Ca teh myExeeption As System.Exeeption
Console .Writ eLine( myExeeption .Message)
End Try
Console.Write{"Pressione Return para finalizar.")
Console. Read Li ne O
End If
End Sub
Sub OisplayTable{8yRef objTable As OataTable)
Oim objRow As OataRow
Oim objCol As OataColumn
Oim i , j As Integer

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

Acessando Dados com a Platafo rma .N ET

341

LISTAGEM 12.15 As Alteraes No Tm Efeito at Que o Mtodo Update Seja


Chamado (continua o )
201
Else
202
Conso le.Write (" {O} " . ~
203
ob j Row.Item(j , OataRowVe r sion.Original))
204
End I f
205
Next
206
Console.Writel ine()
207
Next
208 End Sub
209 End Module

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

As li nhas 30 a 4 1 criam e configuram o objelo de comando Delete, adicionando o nico objeto


de parmetro para Art i s t ID (a chave primria). Observe corno a li nha 39 especifica que $ourceVersion seja OataRowVersion.Original porq ue os dados aluais no so vlidos para urna linha
exclu da. As linhas 43 a 59 ,configuram o comando Update e, em seguida, as linhas 61 a 78 manipulam o comando Insert. E bom ressaltar que para Update e Insert, muitos parmetros so necessrios, devido ao fato de que todos os campos da tabela tm de ser enviados nesses comandos.
Voltando ao cdigo que comum a todos os exemplos desta lio, as linhas 80 a 84 configuram a
conexo com Obanco de dados. A seguir, uma n ica linha de dados inserida no banco de dados
pe lo mtodo ExecuteNonQuery( ) de um objeto de comando. Essa linha adicionada de modo
que possa ser excluda posterionnente, porque a tentativa de remover qualquer outro registro de
Artist fa lharia devido existncia de registras-fi lhos (CDs desse artista na tabe la Dise). Em vez
de usar o dataset e o adaptador de dados no modo desconectado, essa insero fe ita de imediato
por uma operao direta.
A linha 106, que ocorre depois que a conexo abelta e que o nico registro novo tiver sido inse
rido, infomla ao adaptador de dados como manipular a configurao de lima tabela quando no
existe nenhum esquema (as info rmaes sobre o tipo de dados e o layout referente aos dados).
Essa configurao especifica, AddWi thKey, comunica ao adaptador para criar automaticamente o

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:

INSERT INTO Artist (ArtistID, ArtistName , ArtistFirstName. ArtistLastName)


VALUES (11, 'Weird AI Yankovich ' , 'A I' , 'Yankovich')
90

SELECT ArtistID, ArtistName From Artist


90

exec sp_execu tesql


N'Update Artist SET ArtistName ~ @Pl
WHERE ArtistID = @P2' , N' @Pl char(8),@P2 int', ' John Doe', 7
90

exec sp_executesql
N'DELETE FROM Artist WHERE ArtistID

@Pl', N' @PI int ' , 11

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.

Acessando Dados co m a Pl atafo rma .N ET

343

Usando Comandos Gerados Automaticamente


Como alternativa a voc mesmo especificar os comandos, possvel de ixar que o ADO.NET
crie automaticamente os comandos necessrios, o que pode ser mais simples, embora haja algumas etapas a seguir para se alcanar esse objetivo. O primeiro requisito para os comandos gerados de modo automt ico que seu oataSet deve conter pelo menos informaes sobre a chave
primria das tabe las re levantes. Essas informaes podem ser fornec idas de uma entre vrias
maneiras, j que todas elas produziro o efeito desejado.
Primeiro, voc pode especific- Ias manualmente usando a propriedade PrimaryKey de um objeto
oataTable. Essa propriedade configurada com o campo apropriado, que pode ser obtido pelo
conjunto Columns de oataTable:
oim PK(O) As oataColumn
PK(O) " objTable . Columns("Art istIo")
objTable.PrimaryKey " PK
Voc tambm pode de ixar que o adaptador de dados obtenha as informaes apropriadas na fonte dos dados, incluindo a chave primria e muitos outros detalhes sobre a tabela, por meio do mtodo Fi IISchema. Esse mtodo cria o objeto oataTable antes de carreg-lo e preenche a tabela
com sua lista de colunas, informaes sobre a chave primria e qualquer outra restrio que possa descobrir na fonte de dados:
objoa taAdapter . Fi 11 Schema (obj OS , Schema Type . Mapped . "Art is t")
Para concluir, voc pode fazer com que o adaptador crie as infonnaes necessrias para o esquema durante o carregamento dos dados, configurando o valor da propriedade Mi ssi ngSche maAc t i on antes de chamar Fi 11.
Essa propriedade possui algumas configuraes interessantes, mas AddWi thKey necessria para
esse fim. Add (o valor padro) cria automaticamente as informaes sobre a coluna (nomes e tipos de dados) se esses detalhes j no exist irem na tabela, enquanto AddWi thKey adiciona informaes sobre essa mesma coluna e tambm configura a propriedade PrimaryKey a cada tabela
que preencher.
objoataAdapter .Mi ssingSchemaAction _
" MissingSchemaAction .AddW ithKey
objOa taAdapter. Fi 11 (obj OS. "Art is t")
Independentemente do mtodo que voc usar, depoi s que o objeto OataTabl e, ao ser atualizado,
tiver informaes sobre a chave primria, os comandos Update, Insert e oel ete podero ser gerados de modo automtico. Primeiro, uma instncia da classe apropriada do criador do comando
(01 eOBConmandBu ; der Oll SQLConmandBu; 1der) deve ser gerada e inicial izada e, em seguida, quando o mtodo Update do adaptador for chamado, se algum comando necessrio est iver faltando,
ele ser criado. A Listagem 12. 16 demonstra esses conceitos carregando alguns dados simples
em um DataSet, fazendo algumas alteraes e chamando Update .

Dia 12

LISTAGEM 12.16 D Mtodo Update Executa os Comandos Correspondentes no Banco de


Dados de Dr; gem
1 Module ModuleI
Private Const
2
3 sConnection As String =
4
"Provider=SQLOLEOB.l j" &
5
"Password = j" &_
6
"Persist Security Info"True " &
7
"User ID"saj" &
8
"Initia1 Catalog"CD;" &
9
"Oata Source=(loca1)"
10

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

If objConn.State " ConnectionState.Open Then


Try
objOataAdapter.MissingSchemaAction
" Mi s s i ngSchemaAc t i on. AddWi thKey
objOataAdapter.Fill(objDS. "Art i st")

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

Acessando Dados co m a Platafo rma .N ET

345

LISTAGEM 12.16 O Mtodo Update Executa os Comandos Correspondentes no Banco de

Oados de Origem (continuao)


Console . Write("Se pretende editar , " &
" pressione return para inic i ar!")
Console . ReadLine{)

44
45
46
47
48

'Exclua a linha com c have primria " 11


drRows.Find(7)("ArtistName") " "Kent Sharkey"

49
50

51
52
53
54

Console.Write("Depois de editar , " &_


" pressione return para visualizar os resultados")
Console . ReadLine()

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

Catch myException As System.Exception


Console.WriteLine{myException.Message)
End Try
Console.Write("Pressione Return para finalizar.")
Console . ReadLine{)

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

For j " O To objTable.Columns.Count - 1


objCol " objTable.Columns(j)
Console . Write("{O} : {1} " ,
objCol . ColumnName , _
objCol.OataType.Name)
Next
Console . WriteLine()
For i " O To objTable . Rows . Count - 1
ob j Row " objTable . Rows(i)
Select Case objRow . RowState
Case DataRowState.Oeleted
")
Conso l e . Write("[Oeleted]
Case DataRowState.Modified
Console.Write("[Modified]
")
Case DataRowState.Added

Dia 12

LISTAGEM 12.16

87
88
89
90

91
92
93

94
95
96
97

98

99
100
101
102
103

O Mtodo Update Executa os Comandos Correspondentes no Banco de


Oados de Origem (continuao)

Console.Wri te(" [New ]


")
Case DataRowState.Unchanged
")
Conso 1e. Wri te (" [Unc hanged J
End Select
For j : O To objTable .Columns . Count 1
If objRow.RowState <> DataRowState.Deleted Then
Console.Write("{OI ",
obj Row. !tem(j) )
E1 se
Console .Write("{OI ",_
objRow .ltem(j . DataRowVersion .Original))
End If
Next
Console.Wri teLine()
Next
End Sub
End Module

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 .

Trabalhando com Mltiplas Tabelas


Quando os dados so carregados cm um DataSet, so inseridos em tabelas individuai s, o que per~
mite que um nico DataSet possua os resultados de mui tas consultas diferentes. Depois que
voc tiver um DataSet com mais de uma tabela, ser possvel especificar relacionamentos entre
elas, como entre as tabelas Artist e Disc (baseado nos exemplos que desenvolvemos at agora).
Todos os relacionamentos que ex istem dentro de um DataSet so representados por objetos do
conjunto Re1ations , que pode ser acessado como uma propriedade do prprio objeto DataSet.
Para criar um relac ionamento entre duas tabelas, use o mtodo Add do conj unto Rel at i ons. Esse
mtodo possui muitas opes de parmetros, perm it indo que seja chamado de sete maneiras di~
ferente s, mas se qui sermos configurar um relacionamento sim ples com base em um nico cam~
po (coluna) da t abe l a~pai c um da tabe l a~ filha , ento, esta sintaxe funcionara bem:
objNewRelation

objDS.Relations .Add(RelationName , ParentColumn ,Ch ildColumn)

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.

Acessando Dados com a Platafo rma .NET

LISTAGEM 12.17 O OataSet Reflete Algo Semelhante

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

sSQLArtist = "SELECT ArtistID. ArtistName From Artist"


sSQLOisc = "SELECT ArtistID. CDTitle From Oisc"
Dim ob j Conn _
As New DleDb.OleDbConnection(sConnection)
Oim ob j OataAdapterArtist _
As New DleDb.OleDbDataAdapter(sSQLArtist, objConn)
Oim ob j DataAdapterDisc _
As New OleDb.OleDbOataAdapter(sSQLDisc . objConn)
Dim ob j OS _
As New OataSet("CD")

27
28
29
30
31

objOataAdapterArtist.MissingSchemaAction '"
MissingSchemaAction . AddWithKey
objOataAdapterOisc.MissingSchemaAction '"
MissingSchemaAction.AddWithKey

32
33
34

objOataAdapterArtist.Fill (objOS . "Artist")


ob j OataAdapterOi sc . Fi 11 (objDS. "Di sc")

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

Acessando as li nhas - Filhas de Qualquer linha - Pai Especfica po r


Meio do Mtodo GetChildRows

Dim objDRParent As OataRow


Dim objDRChild As DataRow
Dim objChildRows()As DataRow
For Each objORParent ln objDS.Tables("Artist").Rows
Console.WriteLine("{O} {I}",
objDRParent("ArtistIO to) ,_
obj DRParen t (" Art i s tName"
obj Ch i 1dRows '" obj DRPa rent. GetChi 1dRows (" Di scA rt i s t")
For Each objORChild ln objChildRows
Console.WriteLine("
lO}" ,
objDRChi I d ("CDTi t I e"})
Next
Next
Console.Readline{)

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

o ADO.NET inc lui o conceito de visualizaes de dados, a capacidade de especificar a ordem de


classificao, um fi ltro sobre as linhas e um filtro com base no estado da linha (alterada, excluda, inalterada ou nova). Essa visualizao (OataView), quando criada, pode ser acessada pe la
propriedade Oefaul tV i ew da prpria tabela ou pelo conjunto ReI ations, que uma propriedade
do prprio DataSet.
A Listagem 12. 19 apresenta o cdigo-padro para a abertura de um banco de dados, o preenchimento de uma tabela com dados e, em seguida, a criao de um objeto OataV i ew usando a tabela
como seu construtor. Depois que a visualizao for gerada, ela poder ser configurada com uma
combinao aleatria de trs propriedades diferentes: RowStateFil ter, Sort e/ou RowFil ter. A
visualizao propriamente dita pode ser vinculada a um cont role dos forrnulrios Windows (veja
a prxima seo para obter informaes sobre a vinculao de dados), ou voc pode acessar seu
contedo diretamente como um conjunto de objetos OataRowView.

Acessando Dados co m a Platafo rma .N ET

LISTAGEM 12.19 Vrios Objetos DataView Apontando para o Mesmo DataTable

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

Dim objDRV As DataRowView


Console . WriteLine{"No objeto DataView")
For Each ob j ORV ln objOV
Console.WriteLine("{O} {l}" ,
objORV("ArtistID") ,_
objORV("ArtistName"
Next
Console.Read Line{)

349

Dia 12

LISTAGEM

12.19 Vrios Objetos OataView Apontando para o Mesmo DataTable

(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

Acessando Dados com a Plataforma .NET

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 de Dados com os Formulrios Windows


Todos os contro les dos formu lrios Windows que do suporte vincu lao de dados vm em
duas verses pri ncipais: os que do suporte vinculao simples e os que podem manipular a
vincu lao complexa. A vinculao simples acontece quando uma propriedade de um controle
associada ao campo de uma fonte de dados. A vinculao complexa ocorre quando o controle
associado a uma fonte de dados comp leta (como um objeto DataTable), e entre os objetos embutidos ela tm suporte apenas dos controles DataGrid e ComboBox.

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

A Vinculao de Dados Pode Ser Criada Dinami camente em Cdigo

1 Private Sub buttonl_C l ick(ByVal sender As System.Object .


2
ByVal e As System.EventArgs)
3
Handles buttonI.Click
4
Dim sConnection As String =
5
"Provider=SQLOLEDB . I ; " &
6
"Password=;" &_
7
"Persist Security Info=True ; " &
8
"User IO=sa ; " &
"Initial Catalog=CO;" &
9
10
"Data Source=(local )"
11

12
13
14

15
16
17
18
19

20
21

Oim sSQL As String


sSQL '" "SELECT ArtistIO . ArtistName From Artist"
Dim objConn _
As New OleDb.OleObConnection(sConnection)
Dim objDataAdapter _
As New OleOb.OleDbOataAdapter(sSQL . objConn)
Dim objOS _
As New OataSet("Artists")
Dim objDV
As OataView

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

If objConn.State '" ConnectionState . Open Then


Try
obj Oa taAdapter. Fi 11 (obj OS, "Di sc")
objConn . Close()
Dim objTable As DataTable
obj Table -; objoS . Tables("Disc")
obj OV '" objTable . OefaultView
textBoxl.DataBindings .Add("Text",
objDV,_
"ArtistName")
Catch myException As System.Exception
Windows . Forms.MessageBox .Show(myException.Message)
End Try
End 11
End Sub

Acessando Dados com a Platafo rma .N ET

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

Podemos ler ///1/(/


\'illculao simples de
dados com rrios
eomroles diferemes ao
mesmo tempo. permitindo
que voc exiba os campos
de seus dados de vrias
maneiras.

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

Vinculao Complexa de Dados


Novo TERMO

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

Acessando Dados com a Platafo rma .N ET

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.

P Ao atualizar o banco de dados, o que acontecer se o registro a ser atualizado tiver


sido alterado depois que voc extraiu seus dados originais?
R Quando lidar com atualizaes em um banco de dados, voc deve estar atento aos problemas de simultaneidade, em que duas ou mais pessoas a lteram os mesmos dados no mesmo momento. No caso dos OataSets, j que foram projetados para ser usados off-line,
provvel que o perodo entre o down load e a atualizao seja re lativamente longo. Durante esse tempo, o utro usurio poderia ler alterado esses mesmos dados de alguma manei ra. Se usarmos os comandos de atualizao gerados de modo automtico, eles
incluiro um cdigo que verifica esse probl ema antes de alUalizar. Caso contrrio, se
constru irmos os comandos manualmente, ns mesmos leremos de confrontar os dados
originais com os aluais no banco de dados.

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?

3. Como voc deve executar esta instruo SQL?

DELETE FROM Artist Where ArtistID=3?

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

O que o Server Explorer.


A explorar os servios.
A trabalhar com os servios.
A escrever programas que usem os servios.

o Que o Server Explorer


O Server Explorer uma fe rramenta que est disponvel no IDE do Visual Basic .NET. Como o
Exp lorer e o Internet Explorer, ete permite a pesquisa de um conjunto de recursos. Em vez de

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"' _ _--.,

__ ....... I. Mow ''''0'' J

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

Usan do o Serve r Ex pl o rer

o Que um Servio?
NOVOTeRMO

o servio um programa executado em segundo plano, que fornece algum recurso

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

. ......... ~'''''"'''''-*[_l ''..._


1:1'> ~ \'10'< ,""" _
aO\>

VislIali=alldo conexes

oil ' Ill'~ "CII

de dados COIII o Serre,.


Explore,..

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

pal'a acesso (/ dados.

Usando o Server Explorer

361

Alguns dos provedores mais usados para o acesso aos dados so:

Microsoft Jet4 .0 OLE OB Provider


soft Access (arqu ivos .mdb).

Permite o acesso aos bancos de dados do Micro-

Microsoft OLE OS Provi der for oose Oatabases


Permite o acesso a qualquer banco de dados que possua um driver de ODBC instalado. Muitos drivers de OOSC esto
disponveis, pOl1anto, esse provedor pode ser usado para acessarquase todos os bancos de
dados existentes. Porm, ele s deve ser empregado em llltimo caso porque acessa as informaes utili zando tanto o OLE DB quanto o ODBe. J que h mai s camadas entre seu
programa e o banco de dados, esse em geral o provedor mais lento.

Microsoft OLE OB Provi der for Oracle


Oracle.

Microsoft OLE OS Provider for SQL Server


do Microsoft SQL Server.

Permite o acesso aos bancos de dados do


Perm ite o acesso aos bancos de dados

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

Opes da Caixa de Dilogo Data li nk Properties

Campo

Provedor

Finalidade

Select, or enter a database name

Access

Este campo identifica o banco de dados do


Access (arquivo MOS) com o qual se conectar.

User name

Todos

A con t a do usurio a ser usada na conexo


com o banco de dados.

Password

Todos

A senha a ser usada na conexo com o banco


de dados.

Select, or enter a server


name

SOL Server

Select the data base o n


the 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.

Este campo id ent ifica o servidor com o qual se


conect ar. Selecione '(local) ' para se conectar
com seu prprio computador se voc estiver
execut ando o SOL Server localmente.

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

Objetos de bancos de dados

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)

Contm uma lista das visualizaes de dados do banco de dados. A vi


sualizao uma maneira de examinar as informaes - por exemplo,
ela pode no exibir todos os campos, ordenar as informaes de um
modo diferente ou incluir dados de vrias tabelas.

Stored procedures
(procedimentos
armazenados)

Contm uma lista dos prog ramas armazenados no banco de dados. Ai


esto includas as consultas que podem retornar informaes, assim
como programas que podem exclui r, atualizar ou inserir dados.

363

Usando o Server Explorer

TABELA 13.2

Objetos de bancos de dados (continuao)

Objeto

Descrio

Functions
(fun es)

Semelhante aos procedimentos armazenados. porm. as funes so


especficas para alguns bancos de dados. Em geral so usadas para retornar pequenos trechos de informao e. por enq uanto, so parecidas
com as funes que usamos no Visual Basic .NET.

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

Caminho a Ser Percorrido para Estabelecer uma Conexo


com o Banco de Dados
Como descrevi anteriormente, a seo mais importante de Data Connections so as tabelas. Elas
representam um conjunto de informaes armazenadas no banco de dados. Com esse objeto,
voc pode visualizar os dados do banco de dados, alterar as tabelas e assim por diante. Usaremos
o Data Connections para a conexo e visualizao de um banco de dados. Empregaremos o ban
co de dados Northwind que vem com o Vi sual Basic .NET como exemp lo.
1. D um cl ique duplo em Add Connect ion para acessar a cai xa de dilogo Data Link Pro
perties.
2. Selecione a guia Provider e Mi crosoft Jet 4.0 OLE DB Provider. D um cliq ue em Nexl.
3. D um clique no boto prximo ao cam po Selecl or Enter a Database Name. Navegue
para encontrar um banco de dados do Access. Deve haver um em %di rectory to Vi sua 1

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.

5. A conexo resul tante possui vrias tabelas, visualizaes e procedimentos armazenados.


Abra a pasta Tables e d um clique duplo na pasta Employees. Uma nova janela deve
ser aberta, mostrando a lista de funcion rios da empresa Northwind. Tambm deve
ser possvel dar um clique em outras tabelas para abri-Ias e visualizar os dados nelas ar-

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.

Trabalhando com os Servios


Alm de permitir que voc visualize os bancos de dados, o Server Explorer tambm torna fcil o
acesso, a visualizao e o controle dos servios.
Bem, o que um servio? Um servio um aplicativo que executado em segundo plano, fornecendo alguns recursos ao sistema operacional. Eles so fami liares aos desenvolvedores que tm
usado o Windows NT c o Windows 2000. No entanto, os que utilizam o Windows 95, o 98 ou o
ME podem no conhec-los tanto porque esses sistemas operacionais tendem a ter menos servios em execuo. Alguns dos servios processados no Windows NT e no 2000 so o registro de
eventos (um registro central que envolve o sistema, a segurana e os aplicativos), os contadores
de desempenho (registram diversos valores significativos relativos ao sistema operacional e outros aplicativos) e o spooler de impresso (gerencia os trabalhos de impresso). A lm desses, outros serv ios podem ser instalados, como o 11 5, o SQL Server (banco de dados) ou o Message
Queue Server (perrn ite a comunicao assncrona, ou desconectada, de um aplicativo com o outro, semelhante ao correio eletrnico).
No Windows 95, no 98 e no ME, os servios fazem parte do prprio sistema operacional ou so
programas que costumam aparecer na barra de tarefas.

Usando o Server Explorer

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

Servios do Server Explorer

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)

Fornece uma lista de todas as DLLs carregadas na memria e dos


programas que as utilizam. Essa lista pode ser longa, dependendo
do que voc esteja executando em um dado momento. Pode ser
til para se saber se uma DLL especfica est carregada na memria e, caso esteja, se est sendo usada por um aplicativo.

Dados de gerenciamento
(Management Dala)

Permite ao servidor acessar o Windows Management Information


(WM I). O WMI um meio de consultar informaes em um computador. Essas informaes variam de valores simples, como a
CPU ou o sistema operacional instalado, a programas em execuo, e so precisas como as configuraes das impressoras instaladas. O WMI uma ferramenta poderosa e melhor quando usada
para recuperar informaes, e no para alter-Ias.

Contadores de desempenho (Performance


Counlers)

Concede acesso a dados sobre o desempenho do computador. O


Windows NT e o Windows 2000 registram constantemente informaes quando voc executa seus programas. A esto includas
info rma es sobre o tempo necessrio para executar tarefas, a
memria uti lizada e muito mais. Podem ser acessados para avaliar
a uti lizao da CPU, a memria e assim por diante.

Processos (Processes)

Fornece uma lista de todos os aplicativos em execuo. Voc


pode se surpreender ao ver quantos programas so processados
em seu computador.

Servios (Services)

Mostra uma lista dos servios em execuo no computador.


Esses so os aplicativos processados em segundo plano. Um 6timo recurso que voc pode usar essa seo para inicarou encerrar os servios (dependendo da segurana).

Bancos de dados do SQL


Server (SQL Serve r
Dalabases)

Fornece mais uma maneira (a seo Data Connections a outra)


de acessar os bancos de dados do SQL Server. Disponibiliza informaes semelhantes Data Connections (no entanto, s sobre os
bancos de dados do SQL Server).

Servios da Web
(Web Services)

Fornece uma lista dos servios da Web instalados no computador


(para obter mais delalhes, veja o Dia 21, NCriando Servios da
Web com o Visual Basic .N ET).

Filas de mensagens
(Message Queues)

Fornece uma lista das fila s de mensagens disponveis . Elas so


usadas quando so criados aplicativos com base em mensagens
(porm no se aplicam a aplicativos de correio eletr6nico).

366

Dia 13

Conectando-se com Outro Servidor


Para examinar alguns dos serv ios listados na Tabela 13.3, pode ser necessrio se conectar a um
servidor. D um clique duplo no item Add Server do Server Explorer, digite um nome de servidor vlido na caixa de dilogo (veja a Figura 13.7) e d um clique em OK. Voc deve poder (dependendo da segurana da rede) visualizaras servios carregados nessa mquina, assim como os
da s ua. Voc pode especificar lima conta de usurio diferente para ser usada se esse tiver direito
de acesso a outro computador.

_ _,

FIGURA 13.7
Adicionando oulro

'O_lo
... ..... _ .......... -.... _, ...

servidor.

., ,------"""'" '11M M" ..... " "C"

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.

Escrevendo Programas Que Usam os


Servios
Um dos recursos mais interessantes do Server Explorer que ele pennite que voc no s visualize os servios e trabalhe graficamente com eles, mas tambm que escreva com facilidade aplicativos que se comuniquem com eles. Por exemplo, os objetos disponibilizados pelo Server
Exp lorer podem ser usados para incluir em um aplicati vo o acesso aos dados. A lm disso, poss vel adicionar objetos a seu aplicativo que possam controlar ou interagi r com os servios como ler contadores de desempenho ou ainda ler ou gravar informaes nos registros de eventos
do Windows NT ou do Windows 2000. Esses so recursos que precisavam de uma codificao
extensa e agora podem ser obtidos em algumas linhas, com a alterao das propriedades e execuo dos mtodos dos objelos que os representam .

Escrevendo Cdigos de Acesso a Dados com o Serve r


Explorer
Embora o Server Explorer sej a ti l quando se quer visualizar os servios, se torna muito mais
quando a inteno acess-los. Ele pode ser usado na criao de cdigos extensos, poupando-o
de ter de desenvolv-los - por exemplo, na criao de aplicativos de acesso a dados. Em geral,

Usando o Server Explorer

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

Propriedades da Grade de Dad os

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

Propriedades da Conexo e do Coma nd o

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-

,,- f" .. ""


p - _ _ .. _ .." " _
'' 0

, (0

P 111" .... _

,.. "

.. " " _.

Usando o Server Explorer


' ..._ _ _ - " - ' 1_1 ' <___ "'_1'

FIGURA 13.10

O DataSet
adicionado.

___

",~,}'ItoI)_aM

(jJ .

CJ ~

1iI"

lo

""_~

Ie. ., . '.. q

1;, 00 '.,

'.i

-..

. 1M

.~, .. ,

..

\JI o , ,....,

Antes de escrevermos o cdigo, devemos conectar o banco de dados e o DataSet ao OataGri d.


Configure a propriedade DataSource do OataGrid como dsCustomers, e OataMember como Customers. Ao faz-lo, os cabealhos da co luna devem aparecer 110 DataGr id (veja a Figura 13. 11).
FIGURA 13.11

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

Agora vem a parte trabalhosa - ai nda precisaremos escrever um cdigo. Localize o


procedimento Form Load e atuali ze-o para que preencha o OataSet como mostrado

na Listagem 13. 1,

Dia 13

370

COIGO

LISTAGEM 13.1 Alteraes no Novo Procedimento

1 Private Sub Customers l oad(ByVal sender As $ystem.Object .


2 ByVal e As System.EventArgs) Handles MyBase.Load
3
cmdCustomers . Fi l l(dsCustomers)
4 End Sub

o procedimento Fonn

Load ser padro para os aplicat ivos Windows, com a adio


da linha 3. Ela chama o mtodo Fi 11 do adaptador de dados cmdCu$ tomers. O OataSet dsCus tomers foi criado quando selecionamos Generate DataSet. Em outras pa lavras, em vez
de tennos de d igitar o que precisvamos nessa linha, foi tudo gerado para ns. Construa e execute

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 _

~oI.nto .... ~~Oo""_

-""'".
-_.""-

....'"
UI<

so .:...

_50<1 """',.". _
"-to< Go a"",
~.,;.. . f'.......,..,"~

eldoCoo>oo

_Sotrr.>< o...... ... ''''''''


Soon

&<>o _ '

~ l<tlI ~

hora

Ton._

_Oe '" ...

a - .....

CO<I ...

I"xCoo.f ,

C....... ~f'_Ct~ _.....,"'" Moo<co


eh Y>n W""l
o.",...
~<!>'btd

~-

".

~.~

r. &o,...,.,
~

o--.

~~_

tt ~ L>"I<

"",... ....... SoIeo ......... UI<


____

" ' _~h

SOles .........

!,lO;

0<'I!t< .......

[)o""..x",

"'11<ili'O

...... ...,.,.,., Soe""""'"

.....
c:',.,..." ...... attIob
tnct<o
t

~,.,.~

_u.tnn o.....

fn.."eom._Dtv>

..."""

SoIooA_ '"
""'" _ _ ........ <Mo _
.".".,
f _ _ ... c""
~ .... h.oI

flss,t.,.""" _.- ....


"

'

-..o ...
. _ . ".

.",,,,,

----,-,-

~
~.
~

.~

0=

<w<

(9.)SSS '
9'.1 ....S.

,...
,,......

(OO4)SS'

{'l U'"
(S)SS~7

_w

ou>um
,,,..,,.

"~

{,mm

"M'."-

"".."',

Acessando os Contadores de Desempenho e os Registras de

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

Usando o Server Explorer

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

1'- - ' - 31:::J


~':::i:'~"''',,''''''"'------------I""'
~

..... _,

..... ,..,

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

Propriedades do Formu lrio PerfLite

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

Contro les para o Formu lrio PerfUte

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

Usando o Server Explorer

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" _

,.,. \!l o li' g ai ;:r. II;, e.

.., . ,

1.... _

.p Q

.....

-..,

[jIo " ''''

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

Propriedades do Objeto Event Log

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

"- .. ....
. . ...
~

.... _.''o~' e''''''

.. ,'"'" "'"

_.-;~--"_

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

Usando o Server Explorer

FIGURA 13.17
O exemplo sendo
execulodo.

i""

! - ........

'1OO1S '"

LISTAGEM 13.2 Cdigo do Controle Timer

COIGO

1
2
3
4
5
6
7
8
9
10
11
12

-.

Private Sub tmrClock_Tick(ByVal sender As System.Object.


ByVal e As System.EventArgs) Handles tmrClock.Tick
Dim sngCPU As Single ; prfCPU .NextValue() / 100
Dim sngProcs As Single ; prfProcs .N extValue()
Dim sngMem As Single ; prfMem. NextValue / 1024
'desenhe o painel del imitador
DrawSweep(sngCPU. sngProcs . sngMem)
'atualize os ttulos
lblCPU . Text." "CPU: " & sngCPU . ToString("p")
lblProc . Text ; "Processes: " & sngProcs
lblMem.Text ; "Memory: "& sngMem.ToString("fO") & "KB"
End Sub

ANALISE

o cdigo desse procedimento tem como sua preocupao bsica duas finalidade s:

converteras valores dos contadores de desempenho em variveis com o tipo de dado


simples e atualizar os controles Label. As linhas 3 a 5 recuperam os valores de cada contador de
desempenho. Observe que estamos atribu indo os valores s variveis enquanto as criamos. Em
seguida, passamos esses va lores para a rotina DrawSweep (linha 7 - veja a Listagem 13.3) para a
ex ibio. Para conclui r, cada valor fonnatado e exibido em cada um dos controles Labe 1 (Iinhas
9 a II). Dois itens que parecem estranhos so as chamadas ToStrin9 nas linhas 9 e II. O mtodo
ToStri ng permite que um formato opcional seja aplicado quando o nmero convertido em uma
string. A linha 9 formata o valor como um percentual, enquanto a linha I I o fonnata como um nmero com lima quantidade fixa de casas decimais, e essa quantidade igual a O.
COIGO

13
14
15
16

Private
ByVal
ByVal
Dim

LISTAGEM 13.3 Desenhando a Li nha Oe 1 imi tadora


Sub DrawSweep(ByVal CPU As Single ,
Processes As Single ,
Memory As Single)
oGraf ix As Graphics = pnlSweep.CreateGraphics()

Dia 13

376

LISTAGEM 13.3 Desenhando a linha Delimitadora (continuao)

COOIGO

17
18

Oim sngHeight As Single = pnlSweep.Height


'para os pontos
Oim sngCPUY As Single
Oim sngProcsY As Single
Oim sngMemY As Single
'apague a li nha deli mitadora anterio r
oGrafix.DrawLine{penBack, m_sngX, O. m_sngX , sngHeight)
'desenhe os pontos dos dados
sngCPUY = sngHeight - (CPU * sngHeight) - 1
oGrafix,DrawLine(penCPU,_

19

20
21
22
23
24

25
26

rn_sngX - incremento rn_sngCPUY . rn_sngX. sngCPUY)


m_sngCPUY = sngCPUY
sngProcsY = sngHeight - Processes
oGraf i x. DrawLine(penProcs .
rn_sngX - incremento rn_sngProcsY. rn_s ngX. sngProcsY)
rn_sngProcsY = sngProcsY

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

no for exibida corretamente


sngMemY = sngHeight - ( Memory / 10000)
oGrafix.DrawLine(penMem.
m_sngX - INCREMENT. m_sngMemY. m_sngX. sngMemY)
m_sngMemY = sngMemY
'aumente x
m_sngX += increment
If m_sngX > pnlSweep.Width Then
'reinicia l ize para voltar ao ponto de origem
m_sngX = O
'e limpe a superfcie de exibi o
oGrafix.Clear(SystemColors.Control)
End I f
'desenhe a linha nova
oGrafix.OrawLine{penFore. m_sngX. O. m_s ngX. sngHeight)

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

Usando o Server Exp lorer

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

13.4 Ativando e Desativando a Li nha Delimitadora

Private Sub cmdSweep_Click(ByVal sender As Objecto


ByVal e As System. EventArgs) Handles cmdSweep.Click
'Alterne entre o texto e o timer no boto (at i vado ou desativado)
If cmdSweep. Text = "&Start " Then

Dia 13

378

LISTAGEM 13.4 Ativando e Desativando a Linha Delimitadora


(continuao)

COOIGO

55
56
57
58

cmdSweep.Text '" "&Stop"


tmrClock.Enabled = True
El se

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

LISTAGEM 13.5 Configurando a Velocidade

Private Sub trkSpeed_Scroll (ByVal sender As Object,


ByVal e As System.EventArgs) Handles trkSpeed.Scro ll
Dim iValue As Integer
iValue = Clnt(trkSpeed. VaI ue)
'configure o intervalo de tempo com o valor que esco l heu
tmrClock.Interval = iValue * 100 'ms
End Sub

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.

Usando o Server Explorer

COOIGO

69
7D

LISTAGEM

379

13.6 Variveis no Nvel do Formu lrio

Dim m sngX As Single


Dim m_sngY As Single

71

72
73
74
75
76
77
78
79
80

Dim m_sngCPUY As Single


Dim m_sngProcsY As Single
Dim m_sngMemY As Single
Dim
Dim
Dim
Dim
Dim

penCPU As New System.Orawing . Pen(Color . Red)


penProcs As New System. Orawing.Pen(Color.Green)
penMem As New System.Orawing.Pen(Color . Blue)
penFore As New System.Orawing.Pen(SystemColors .WindowText)
penBack As New System.Orawing.Pen(SystemColors.Control)

81

82

Const INCREMENT As Single

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?

Dim prfCPU As New PerformanceCounter("processor" ,


"%P rocessor Time" , "_total")
Console .W riteL i ne{prfCPU.NextValue{

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:

Uma viso geral da programao orientada a objetos (POO).

Concei tos importantes da POO.

Corno incorporar a POO nos sistemas de sua autoria.

Alm desses tpicos, no final da lio, voc aprender tcnicas da POO para ajudlo a construir
aplicativos.

Viso Geral da Programao Orientada a


Objetos
A programao orientada a objetos (POO) no uma tecnologia ou linguagem especfica; uma
maneira de projetar e construir aplicat ivos. Para tomla ainda mais abstraIa, voc poderia pen
sar nela como um modo de considerar o projeto e o desenvolv imento de aplicat ivos. A POO possui um histrico acadmico e no tentarei fornecer lima data exala na qual foi concebida pela
primeira vez, mas ela foi adotada de maneira ampla pela indstria de softwares nos anos 80.
Agora quase sempre presume-seque a POO est sendo usada, mas com freqU ncia o termo cmpregado com pouca compreenso do que realmente significa.

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 .

Comparando a Programao Orientada a Objetos com a


Linear
A diferena entre a programao linear ou procedmal e a POO pode parecer sim ples, mas um
conceito complexo em gera l mal compreendido. Mostrarei a voc duas descries referentes a
um processo de clculo do pagamento de uma hipoteca. Um descrito em etapas lineares (tambm chamado de programao proceduraf) e o outro a partir de um ponto de vista orientado a
objetos :
O processo linear segue estas etapas:
I. Obter a quantia principal.
2. Obter a taxa anual de juros.

3. Obter o perodo em anos.

4. Calcular a taxa de juros por ms.


5. Calcular a quantidade de pagamentos (anos

>I<

12).

6. Calcular os pagamentos.

o processo orientado a objetos inclui estas etapas:


1. Criar uma nova hipoteca.
2. Configurar as propriedades referentes ii quantia principal, taxa de juros e ao periodo da
hipoteca.
3. Recuperar a propriedade do pagamento.

Introduo Programao Orientada a Objetos

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

Abordagem procedural para um Programa de Clculo de Hipoteca

'Est ilo linear


Private Sub btnCalc_Click(ByVal sender As System.Object .
ByVal e As System.EventArgs) Handles btnCa lc . Click
Dim iYears As Integer
Dim iMonths As Integer
Dim dbllnterestRate As Double
Dim curPri ncipal As Decimal
Dim curPayment As Oecimal

10
11
12
13

iYears = Clnt(txtPayments. Text)


iMonths = iYears * 12
dbllnterestRate = CType(txtlnterest . Text. Ooub le)
curPrincipal -; CType(txtPrincipal . Text, Decimal)

14

15
16

'div ida a taxa de juros por 12 pa ra obter a taxa mensal


dbllnterestRate /= 12

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

Abordagem Orientada a Objetos para um Programa de Clculo de


Hipoteca
orientado a objetos
Sub btnCalc_Click(ByV al sender As System. Object .
As System.EventArgs) Handles btnCa lc.Click
iYears As Integer
dbllnterestRate As Double
curPrincipal As Decimal
curPayment As Oecimal

9
10
11
12

iYears = Clnt(txtPayments .Text)


dbllnterestRate = CType(txtlnterest.Text. Ooub le)
curPrincipal = CType{txtPrincipal. Text, Decimal)

Dia 14

LISTAGEM 14.2

13
I'
15
16
17
18
19
20

Abordagem Orientada a Objetos para um Programa de Clculo de


Hipoteca (continuao)

Dim objMort As New Mortgage()


objMort .AnnuallnterestRate '" dbllnterestRate
objMort.NumberOfYears '" iVears
objMorLPrin cipal '" curPrincipal
lblMonthlyPayment.Text '" objMort.PaymentAmount.ToString
End Sub

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.

Usando os Objetos na Organizao do Cdigo


Na programao proced ural, sem o LISO das tcnicas da POO, comum dividir os recursos em
sub-rotinas ou funes q ue podero, em seguida, ser chamadas de qualquer parte do programa.
Tambm no raro agrupar essas sub-rotinas (em geral com outras sub-rot inas relacionadas) em
mdulos, DLLs ou outra forma de estrutura de cdigo. A segui r, voc poderia adicionar esses
grupos de sub-rotinas a seu programa como unidades individuais e chamar qualquer uma delas
quando necessrio. Portanto, todas as suas fu nes matemticas poderiam ser agrupadas em um
arquivo ma th. dll , e todas as funes de strings em s t ri ng. dl l, criando um sistema organizado.
Essa fonua de codificao ainda seria procedural em vez de orientada a objetos. Isso no reduz
seu valor como uma boa maneira de organizar o cdigo, mas comea a ficar Illu ito semelhante
POO com chamadas como Math.SquareRoot(x) em execuo. Ao programar na plataforma
.NET, voc precisar usar objetos para agrupar os procedimentos desse modo. Incluir 20 procedimentos diferentes como mtodo de um objeto uma tcnica ti l, mas lembre-se de que esse es-

Introduo Programao Orientada a Ob jetos

385

tilo de agrupamento no POO; si mplesmente como o cdigo organizado na platafonna


.NET. Seu cdigo s ser orientado a objetos quando empregar objetos para representar as entidades e conceitos que compem seu ap licativo.
Na plataforma .NET, os objetos que no representam uma entidade real ou abstrata, exist indo
apenas para agrupar cd igo, em geral designam a si mesmos e a todos os seus mtodos como estti cos ou compartilhados. Voc aprender mais sobre esses tipos de objetos na prxima lio
(Dia 15, "Criando Objetos no Visual Bas ic .NET), mas apenas lembre-se de que h uma maneira
especfica de construir essas bibliotecas procedurais de cdigo.

Conceitos Importantes na POO


Alg uns termos foram definidos para serem usados na POO, e eles so re lativamente universais
para todas as tecnologias e linguagens de programao. Nesta seo, explicarei os termos mais
comuns e forn ece rei um exemplo de como cada um func iona.

Classes, Objetos e Instncias


Os prim eiros tennos q ue prec isam de discusso so aqueles usados em qualquer material que envolva a POO: classe, objeto e instncia. Esses conceitos sero a base para seu trabalho com a
POO, e como tal devem fi car c laros antes de prosseguirmos.
A classe um modelo para um objeto; ela descreve a estrutura bsica do objeto. Muitas analogias
diferentes so usadas para descrever o relacionamento entre a classe, o objeto e a instncia. Uma
das mais com uns considerar esses conceitos em termos de casas e da construo delas. Empregando uma analogia desse tipo, a classe seria o projeto para a casa, e a casa propriamente dita seria um obj eto. Mui tas casas poderiam ser criadas com base no mesmo projeto, e muitos objetos
podem ser gerados com base na mesma classe. Cada objeto criado a parti r de uma classe chamado instncia dessa classe. Para examinar isso nos termos do Vis ual Basic, considere a Li stagem 14.3.
LISTAGEM 14.3

Inserindo Vrias Classes em um nico Arquivo

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

8 Public Class myFirstClass


9 '<a def inio da classe e o cdigo entram aqui>
10 End Class

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

Variveis e Instncias No So a Mesma Coisa

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

Instncias Comparadas com Variveis

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.

Introduo Programao Orientada a Ob jetos

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

Adicionando uma Propr ieda de Definiao de myFirstClass

1 Module AllAboutOb j ects


2
Sub Main()
Oim x As myFi rs tCl ass
3
Oim y As myFirstClass
4
5
x = New myFirstClassO
6
y = New myFirstClass()
7
x.N ame = "Fred"
8
y. Name = "Jae"
9
Console .WriteLine("x.Name
10
Console .WriteLine("y.Name
11
Console . ReadLi neO
12
End Sub
13 End Module

=
=

{Q}" , x.Name)
{Q}" , y .Name)

14

15 Public Class myFirstClass


16
Publ ic Name As String
17 End Cl ass
Como antes, duas variveis so declaradas, x e y, duas novas instncias de myFi rs tCl ass s."o criadas,
e so inseridas referncias nas duas varive is. A seguir, nas linhas 7 e 8, um valor inserido na
propriedade Name de cada instncia de myF i rstCl ass, e essa propriedade acessada por meio das
variveis que fazem referncia ao objcto. As instrues Consol e. Wri te Li ne (linhas 9 e 10) produzem a sada a seguir:
x.Name
y.Name

=
=

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

As Variveis x e y Apontam para a Mesma Instncia de um Objeto

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.

Introduo Programao Orientada a Ob jetos

389

Na Listagem 14.8, um mtodo (DoSomething) foi adicionado a myFirstClass por meio de um


proced imento Pub 1 i c (Sub) na defi ni o da classe.
LISTAGEM 14.8

Adicionado um Mtodo myFirstClass

1 Module AllAboutOb j ects

2
3
4

5
6

Sub Main()
Dim x As myFirstClass
x = New myFirstClass()
x. DoSomethi ng ()
End Sub
End Module

9 Public Class myFirstClass


10
Public Name As String
11
Public Sub DoSome thing()
12
'o cd igo entraria aqui
13
End Sub
14 End Class

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

adio de novos recursos.


No Dia 15, voc aprender a criar seus prprios objetos no Visual Basic .NET usando a sobrepo-

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

Usan do a Herana para Criar Hierarquias de Objetos

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.

Introduo Programao Orientada a Objetos

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

Inclua Todos os Recursos de Sua Nova Classe

1 Pub l ie Class Snippet


Public Contents As String
2
Public Author As String
3
4
Publie Funetion GetSnippet() As String
Di m sTmp As String
5
6
sTmp = "Author: " & Author _
& System . EnvironmenLNew Line
7
& Contents
8
Return sTmp
9
10
End Funetion
11 End Cl ass
Essa funo exibe apenas as duas propriedades da classe bsica, portanto se voc no as sobrepuser nova classe, suas duas novas propriedades no sero manipuladas. A classe CodeSn i ppet
da Listagem 14.11 mani pula isso sobrepondo a funo GetSni ppet da classe bsica.
LISTAGEM 14.11

Sobreponha uma Fun o para Personaliz -l a a Fim de Que Manipule os Novos Rec ursos de Sua Cl asse

1 Modu le AllAboutOb j ects


2
Public Sub Main()
3
4
5

Dim mySnippet As CodeS nippet


mySnippet = New CodeSnippet{)

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.

Dim sTmp As String


sTmp = "Author: " & Author
&System.Environment.NewLine
& Contents
Return sTmp
End Funct i on
End Class

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

Introduo Programao Orientada a Ob jetos

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

Dim mySnippet As CodeSnippet


mySnippet : New CodeSnippet()
With mySn i ppet
.Contents = "txtEntry.Text = IbIInfo.Text"
.Author : "Joe"
. Lang uage = "VB.NET"
.Purpose : "Inserir ttulo do texto na caixa de texto"
End With
PrintSnippet{mySnippet)
Console.ReadLine()
End Sub

Public Sub PrintSnippet{ByVal objSnippet As Snippet)


Console .Writeline(objSnippet . GetSnippet(
End Sub
22 'od Module
Quando um objeto passado como seu tipo bsico, como na linha 15 da Listagem 14.1 2, as propriedades e mtodos adicionados pe la classe herdada no ficam disponveis. Portanto, objSni ppet. Language no seria compi lada se voc a inserisse na linha 20 j que ela no uma
propriedade vlida para a classe Sni ppet. Os mtodos sobrepostos ficam disponveis porque
existem na definio da classe bsica, mas a implementao da classe deri vada ser chamada em
vez da bsica. A Listagem 14. 12 produziria o seguinte resultado:
Autho r: Joe
txtEntry . Text : Ibl lnfo.Text
language : VB .N ET
Purpose : Inserir texto do ttulo na caixa de texto
Voc aprender mais sobre a herana e a capacidade de tratar um objeto derivado como se fo sse
sua classe bsica, durante a prxima lio (Dia 15).

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-

na uma maneira de in icializar seu objeto na hora da criao.

No Visual Basic .NET, o construtor representado por um procedimento New na definio da


classe, e (exatamente como qualquer procedimento) voc pode ter a quantidade de verses sobrepostas que quiser dele, fornecendo vrias maneiras pelas quais o objeto pode ser criado. Na
Listagem 14. 13, diversos construtores so adicionados s classes Sn; ppet e CodeSnippet, permitindo que esses objetos sejam inic ializados de muitas maneiras.

LISTAGEM 14.13 Os Construtores Criam e Inic i alizam Seu Objeto


1 Option Strict On

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

Public Contents As String


Public Author As String

21

22
23

Public Sub New()

24

End Sub

25
26
27
28
29

30
31
32
33
34

Public Sub New{ByVal Contents As String)


Me.Contents " Contents
End Sub
Public Sub New{ByVal Contents As String,
ByVal Author As Stri ng)
Me.Contents " Contents
Me.Author " Author
End Sub

Introd uo Prog ram ao Ori entada a Objetos

LISTAGEM

35
36

37
38

14.13

Os Const r utores Criam e Inicializam Seu Objeto (continuao)

Public Overridable Function GetSnippet() As String


Oim sTmp As String
sTmp " "Author: " &Author &System.Environment .NewLine
&Contents
Return sTmp
End Function
End Class

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

Public Sub New(ByVal Contents As String)


MyBase . New(Contents)
End Sub

57

58
59
60
61
62

Public Sub New(ByVal Contents As St r ing,


ByVal Author As Stri ng)
Me.New(Contents)
Me.Author " Author
End Sub

63

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

395

Public Sub New(ByVal Contents As Strin9 .


ByVal Author As Stri ng,_
ByVal Language As String)
Me.New(Contents , Author)
Me . Language " Language
End Sub
Public Sub New(ByVal Contents As String,
ByVal Author As String ,_
ByVal Language As String,
ByVa l Purpose As String)
Me . New(Contents . Author . Language)
Me . Purpose " Purpose
End Sub
Public Over rides Function GetSnippet()As String

Dia 14

LISTAGEM 14.13 Os Const rutores Criam e Inicializam Seu Obje to (continuao)


80
Dim sTmp As String
81
sTmp : MyBase.GetSnippet()&_
82
Sys tem. Envi ronment.NewLi ne &
83
"Language: " & Language &_
84
System.Environment.NewLine &
85
"Purpose: " & Purpose
86
Return sTmp
87
End Function
88 End Class

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.

Projetando um Aplicativo com o Uso da POO


A programao orientada a objetos no um conceito tcnico e no est relac ionada apenas
programao de um sistema. A POO est envolvida na criao de um sistema com base em um
projeto conceituai. Voc deve decid ir se vai projetar um sistema usando as tcnicas orientadas a
objetos, e a im plementao no est envolvida nessa deciso. Antes da plataforma .NET, o Visual Basic no possua recursos para perm itir a herana, a sobreposio de proced imentos e outros
conceitos da POO, mas os programadores ainda pod iam projetar um aplicativo empregando esses conceitos e, em seguida, implement-los utilizando vrias etapas ou artificios para conseguir
o que o Visual Basic .NET possui embutido atualmente. Depois que voc tiver sua fase de abrangnc ia/escopo e o trabalho de anl ise dos requisitos concludos em um projeto, passar para o estgio conceituaI. Durante a fase de projeto, voc comear a incorporar objetos em seus
aplicativos. Siga estas etapas para criar esse projeto:
I

Identifique as entidades.

2. Detenn ine as propriedades e mtodos.


3. Crie hierarquias de objetos.
4. Modele seus objetos.

Introduo Programao Orientada a Objetos

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

Jogador que d as cartas (seria includo como um participante?)

Rodada (uma jogada)

Jogo (o jogo completo)

Baralho

Mo (cartas do participante ou do jogador que d as cartas)

Carta (uma nica carta do jogo)

Aposta (representando uma aposta do part ici pante)

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.

Determinando as Propriedades e Mtodos


Atendo-se apenas a um subconj unto das entidades encontradas, comearei a examinar Participante, Jogador que d as cartas, Baralho, Mo e Carta. Cada uma delas poss ui vrios atributos
que podero ser propriedades, e diversas aes provveis que podem se tornar mtodos. Um Participante pode ter um Nome, uma Mo atual, uma Posio D que o jogador que das cartas o faz
em uma ordem especifi ca entre os participantes, a posio pode ser necessria) e o Total em dinheiro como propriedades. Os mtodos do objeto Participante poderiam incluir Permanecer, Parar, Apostar e outros. O Jogador que d as cartas pode ter o Nome, a Mo aluai e o Total em
di nheiro tambm, alm dos mtodos Permanecer e Parar do objeto Part icipante. S dois objetos,
e j estamos vendo um certo padro. Por causa das semelhanas entre Part icipante e Jogador que
d as cartas, poderia ser melhor que eles fossem o mesmo objeto ou que existisse um relacionamento de herana entre eles.
Perceber esses re lacionam entos uma parte essencial do processo de identifi cao dos objetos, e
pode afetar muito o aplicat ivo resultante. Se os objetos Jogador que d as cartas e Participante tivessem sido herdados do mesmo obj eto bsico, ou Jogador que d as cartas fosse herdado de
Participante, ento, voc poderia escrever um cd igo que lidasse com as duas entidades apenas
tratando-as como instncias da classe bsica.
Continuando a percorrer a lista de objetos, o Baralho teria um conjunto de obj etos Carta e uma
propriedade Quantidade (para indicar a quant idade de cartas atualmente no baralho, diminu indo
quando elas fossem distribudas). De maneira semelhante, o objeto Mo, representando as cartas
que um participante ou o j ogador que d as cartas estivesse segurando no momento, tambm teria um conjunto de objetos Carta e lima propriedade Quantidade. Voc tambm poderia querer

399

Introduo Programao Orientada a Ob jetos

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.

Modelando Seus Objetos


Ao percorrer o processo de detenninao dos objelos na anlise de requisitos, seria ti l que voc
criasse diagramas ou modelos para ilustrar os objetos e seus relacionamentos. O Visual Studio
.NET Architect Edition fornece ferramentas de modelagem, e elas tambm esto disponveis em
uma cpia autnoma do Microsoft Vis io. Por enquanto, para demonstrar a aparncia de um diagrama de modelagem de objetos, veja a Figura 14.1 .

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

modelo de obje/o de seu


aplicalil'O, e represelllo

- _.
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" .

Introduo Programao Orientada a Objetos

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

15 Public Class myFi rstClass


16
Public Name As String
17 End Class

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

funes do servidor como o registro de eventos.


O Dia 8 apresentou vrias das parles mais teis do .NET Framework e tambm o conduziu pelo
processo de explorao do Framework por sua prpria conta. Esse conhecimento permiti r que
voc encontre qualquer recurso de que precisar no Framework; uma apt ido inestimvel quando
tiver de fazer algo que este livro no teve tempo de abordar.
Embora os aplicativos da Web sejam a tendncia atual, os aplicativos Windows ainda so comuns, e o Dia 9 mostroulhe como constru los no Visual Basic .NET. Essa abordagem dos for
mulrios Windows introduziu a razo original pela qual a palavra 'V isual ' foi adicionada ao
Visual Basic - a criao de interfaces com o usurio com operaes de arrastar e soltar. Usando
os controles, propriedades e alguma codificao, j possvel criar seu aplicat ivo Windows.
claro que voc tambm tinha de aprender a construir uma interface com o usurio com base na
Web, e o Dia 10 foi exatamente a lio de q ue precisava. Sua introduo aos fonnulrios da Web
mostrou como criar um aplicativo da Web que pudesse ser programado com o mesmo modelo
dirigido a eventos que os aplicativos Windows usaram durante anos.
Nos Dias II e 12, voc estudou os bancos de dados - alguma teoria, porm muito mais prtica.
Essas lies mostraram como as classes System . Data do Framework podem ser usadas para esta
belecer uma conexo com um banco de dados, recuperar as informaes necessrias e, em segui
da, manipular esses dados quando preciso. No decorrer do cam inho, conseguimos saber mais do
que talvez quisssemos sobre o gosto musical de peta menos um dos autores (e no disse qual).
No Dia 13, abordamos outro dos principais recursos novos do IDE do Visual Studio, o Server
Exp lorer, e como voc pode uslo no Visual Basic .NET para se conectar aos servidores, visua
lizar e criar contadores de desempenho, e trabalhar com o Event Logs do Windows
XP/2000fNT. Agora os aplicativos que voc criar podero agir como programas no nvel empre
sarial , fornecendo infonnaes sobre desempenho, erros e de auditoria por meio das ferramentas
com as quais os administradores de sistemas j esto familiarizados.

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.

Como voc viu no decorrer dos primeiros 14 captulos, o .NET Framework


amplo e complexo, mas essa estrutura fornece todos os recursos que sero necessrios em seus aplicativos. Por essa razo, o Dia 17 explora mais reas do
Framework, incluindo o trabalho com a funcionalidade de manipulao de arquivos e figuras da plataforma .NET.

Os Dias 18 e 19 fornecem as informaes sobre finalizao de que voc precisa


para concluir seu aplicativo e instal-lo na mquina que ser o destino final, seja
ele um servidor Web ou os microcomputadores de vrios usurios. Uma discusso sobre a redistribuio do .NET Framework e sobre os req uisitos bs icos do
cliente tambm est includa nesses captulos.
O Dia 20 uma introduo XML, a linguagem comum para os dados que fluem
por toda a plataforma .NET. Esse captulo aborda tanto a prpria XML quanto
as partes da plataforma .NET (Systems. Xml) que fac ilitam ao seu cdigo a leitura, gravao e manipulao de informaes XML.
O ltimo captulo deste livro, o Dia 21, aborda os servios da Web, cdigos que
podem ser chamados pe la Web por meio de tecno logias-padro da indstria
como o SOAP, a XML e o HTTP.

o lugar que os servios da Webocupam em seus sistemas foi discutido no Dia 5,


mas o material do Dia 21 mostrar a voc como criar e testar um servio da Web
simples usando o Visual Basic .NET.

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:

A defin io de obj etos no Visual Basic ,NET.

O uso de seus prprios objetos em seu cdigo.

O desenvolvimento de suas classes em montagens e o uso dessas montagens a partir de


outro apl icativo.

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

Declarando uma Classe Nova no Visual Basic .NET


Criar uma classe nova to fci l quanto digitar Pub 1i c C1 ass Test na janela de edio de seu cdigo (dentro de um arquivo do Visual Basic .NET) e pressionar Enter. Pressupondo que voc no
tenha tentado isso dentro de um procedimento real (sub-rotina ou funo), poderia dizer que fo i
bem-sucedido porque o Visual Basic .NET adiciona uma linha End Class automaticamente.
Essas instrues declaram uma nova classe e indicam o inicio e o fim da definio da classe.
Denlro dessa classe so definidos os mtodos, as propriedades e os eventos, mas antes preciso
compreender a declarao da classe.

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

6 Public C1ass CodeSnippet


Inheri ts Snippet
7
8 'definio da classe
9

End C1ass

Criando Objetos no Visual Basic .NET

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

Mustlnherit e MustOverride Permitem Que Voc Especifique Que uma


Classe No Pode Ser Usada Diretamente

1 Public Mustlnherit Class BaseShape

Public MustOverride ReadOnly Property NumSides() As Integer


3
Public MustOverri de Sub Draw ()
4 End Cl ass
5
6 Public Class Square
7
Inherits BaseShape

8
9
10
11
12
13

14
15

16

Public Overrides Sub Draw()


desenhe um quadrado
[nd Sub
Public Overrides ReadOn ly Prope r ty NumS ides() As Integer
Get
Return 4
End Get
[nd Property
[nd Class
I

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

1 Publ i c Class Person


2
Pub I i c Name As String
3
Pub 1i c FirstName As String
4
5

Pub 1i c SecondName As String


End Cl ass

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-

Criando Objetos no Visua l Basic .N ET

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

Os Procedimentos de Propriedade So uma Alternativa ao Uso de


Variveis Pbl ic as

1 Public Class Test


2
Private m sName As String
3
4

5
6
7
8
9
10
11
12

Public Property Name{) As String


Get
Return m sName
End Get
Set(ByVal Value As String)
m sName = Value
End Set
End Property
End Class

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.

Criando Propriedades de Leitura e de Gravao


As rotinas de propriedade so definidas como de leitura ali de gravao na declarao da propriedade. Se a propriedade for declarada sem palavras-chave adic ionais, como na Listagem 15.4, ento, ela ser de leitura/gravao, e voc prec isar inclui r tanlo o trecho Get quanto Set na rotina.
Como alternativa, possvel especificar Publ ic ReadOnly Property para criar uma propriedade
que no possa ser lida. As propriedades apenas de leitura, embora no sejam to comuns quanto
as de leitura/gravao, podem ser teis em vrias situaes. A Listagem 15.5 mostra como trs
propriedades, duas das quais de leitura/gravao e uma apenas de leitura, podem ser empregadas
para produzir lima classe til.

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

Dim objSamp le As New Person()

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

Public ReadOnly Property OisplayName() As String


Get
Return String . Fonnat("{O} {lf", m sFirstName , m_sLastName)
End Get
End Property

25

26
27
28
29
30
31
32
33
3'
35
36
37
38
39
40
41

42
43

Public Property FirstName(} As String


Get
Return m sFi rstName
End Get
Set(ByVal Value As String)
m sFirstName = Value
End Set
End Property
Public Property LastName() As String
Get
Return m sLastName
End Get
Set(ByVal Value As String)
m sLastName = Value
End Set
End Property
End Class

Criando Objetos no Visual Basic .NET

413

As propriedades apenas de gravao so um pouco mais confusas; pessoalmente no vejo muitas


razes para a existncia de uma propriedade que o usurio pode configurar, mas no visualizar.
Se ele pode configur-Ia, ento,j deve saber o valor e, portanto, por que voc iria querer impedi-lo de visualiz-Ia? A (mica situao que posso imaginar na qual uma propriedade apenas de
gravao poderia ser ti I quando Iidamos com senhas. Considere uma classe que vai ser usada
para estabelecer uma conexo com um banco de dados de back-end e uma de suas propriedades
a senha do banco de dados. Em algumas situaes, pode-se querer passar uma instnc ia desse
objeto outra rotina, com suas propriedades j preenchidas, sem expor nenhuma informao de
segurana.

Usando Rotinas de Propriedade para Validar Dados

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

Os Procedimentos de Propriedade Permitem a Validao de Dados

1 Option Explic it On
2 Opt i on Strict On
3

4 Public Class CreditCardValidation


5
Public Enum CardTypes
6
ccvVisa
7
ccvMasterCard
8
ccvOiscover
ccvAMEX
9
10
ccvOinersClub
11
ccvEnRoute
12
ccvUndefined
13
End Enum
I'

15
16
17

18
19

20
21

Private Const Numbers As Stri ng = "0123456789"


Private Const sInvalidCheckSumError As String
= "O nmero do carto de crdito contm um erro" &
"em um ou mais dgitos (Checksum Error)"
Private Const slengthError As String _
= "O nmero do carto de crdito no tem o taman ho certo" &
"para esse tipo de carto (Length Error)"

22

23
24

Private sErrorMsg As String


Private mCardType As CardTypes

Dia 15

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados

(continuao)
25
26

Private sCardNumber As String


Private bValid As Boolean

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

Public Property CardNumber() As String


Get
Return sCardNumber
End Get
Set(ByVal Va1ue As String}
bVa l id ~ ValidCreditCard(Va1ue)
If bVa1id l hen
sCardNumber " Va1ue
E1se
lhrow New System.ArgumentException(sErrorMsg,
"Ca rdNumber")
End If
End Set
End Property
Private Function ClPrefix(ByVal sCard As String) As Cardlypes
If CType(Left(sCard , 2) , Integer) > 50 AndAlso
Clype( l eft(sCard , 2} , Integer) < 56 lhen
Return Cardlypes.ccvMasterCard
E1seIf Left (sCard, 1) " "4" lhen
Return Cardlypes.ccvVisa
ElseIf Left(sCard , 4) " "6011" lhen
Return Cardlypes.ccvDiscover
E1seIf Left(sCard , 2) " "34" OrElse
Left(sCard, 2} = "37 " lhen
Return Cardlypes.ccvAMEX
E1seIf Left(sCard , 2) = "36" lhen
Return Cardlypes.ccvDinersC1ub
E1 se
Return Cardlypes.ccvUndefined
End If
End Function

59

60
61
62
63
64
65
66

Private Function Prefix(ByVa1 slest As String, _


ByVa1 sArg As String} As Boolean
If Left(sArg , l en(slest = slest lhen
Prefix = lrue
E1 se
Prefix = Fa1se

Cri ando Objetos no Visual Basic .N ET

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados

(continuao)
67
68

End If
End Function

69
70
71
72
73
74
75
76
77

Private Function ValidCreditCard(8yVal sNumber As String)


As Boolean
Dim sTemp As String
Dim iTemp As Integer
Dim sCreditCard As String
Dim iCardlength As Integer
Dim Checksum As Integer
Dim i As Integer

78
79
80
81

sTemp = sNumber
sCredi tCard " " "
Checksum " O

82
83
84
85
86
87

For i " 1 To len{sTemp)


If InStr{Numbers, Mid{sTemp, i, 1
O lhen
sCreditCard " sCreditCard & Mid(sTemp, i, 1)
End If
Next

88
89
90
91

mCardlype " CTPrefix(sCreditCard)


sCardNumber " sCreditCard
iCardLength " l en(sCreditCard)

92
93
94
95
96

97
98
99
100
10 1
102
103
104
105
106
107
108
109
110

41 5

Select Case mCardlype


Case Cardlypes . ccvAMEX
If iCardlength 15 lhen
ValidCreditCard = False
sErrorMsg = slengthError
End If
Case Cardl ypes.ccvVisa
If (iCardlength 13) AndAlso (iCardlength <~ 16) lhen
ValidCreditCard " False
sErrorMsg " slengthError
End If
Case Cardl ypes.ccvMasterCard, CardTypes.ccvOiscover
If iCardlength <> 16 lhen
ValidCreditCard = False
sErrorMsg " slengthError
End If
End Select

Dia 15

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados


(continuao)

III

112

sCreditCard

Right{"OOOOOOOOOOOOOOOO" & sCreditCard , 16)

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")

Cri ando Objetos no Visual Basic .N ET

LISTAGEM 15.6

41 7

Os Procedimentos de Propriedade Permitem a Va i idao de Dados

(continuao)
154
155
156
157

End If
Return sTmp
End Function
End Class

Esse cdigo apenas verifica se o nmero vlido, e no se mesmo de um carto de


crdito. Esse nmero tambm pode se referir a uma conta de carto de crdito cance lada, expirada ou ainda invlida. O trecho Set dessa rot ina de propriedade ace ita uma string e, em seguida, usa uma soma de verificao para detenn inar se ela um nmero vlido de carto de crdito,
somando os digitas de uma maneira especifica para verificar o total no ltimo dgito. Se a string fornecida for invlida, ento, uma exceo ser lanada. Essa exceo deve ser capturada pelo programa com a configurao da propriedade CardNumber exatamente como aparece nesse exemplo.

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

1. D um clique com o boto direito do mo use na pasta References de seu


projeto no Solution Explorer e d um clique em Add Reference no menu
suspenso.
2. D um clique na guia COM e localize Microsoft Outl ook na lista .

3. D um cl ique no boto Select e, em seguida, feche a caixa de dilogo dando


um clique em QK. Provavelmente voc ser questionado se quer criar uma
montagem de interoperabil idade, e deve dar um clique em Yes para responder a essa pergu nta.

LISTAGEM

15.7

Esta Fun o Recupera Informaes no Outlook

1 Public Class Person


2 'cdigo no pertinente removido da l istagem
3
Public Function LookUplnOutlook() As String
4
Oim objOutlook As New Outlook.Application()
5
Oim objSession As Outlook . NameSpace
6
Oim objPerson As Outlook.Recipient
7
Oim sEmailAddress As Stri ng
8

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

Oim objSample As New Person()


objSample.FirstName = "Joel"
objSample.LastName = "Semeniuk"
Console .Write l ine{objSample . OisplayName)
Console .Writel ine{objSample.LookUplnOutlook{

Criando Obj etos no Visual Basic .NET

LISTAGEM 15.7

419

Esta Funo Recupera Infonnaes no Outloo k (continuao)

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 .. _

...... ......... .... .....

_od~a.tkd. ""yru ..... " ' _ ....,

t <o......
,'tt' t _
W.

bo . "'" "" yru <h>..O;j

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

A Herana uma Boa Mane i ra de Adicionar Func i onalidade

1 Public Class Mortgage


2
'Programa muito simples de clculo de hipoteca
'Configure AnnuallnterestRate, NumberOfYears e Principal
3
4
'Em seguida, recupere a propriedade PaymentAmount
5
Private m dbllnterestRate As Double
6
Private m_iDuration_Years As Integer
Private m_curPrincipal As Decimal
7
8

9
10
11
12
13
14
15
16

Public Property AnnualInterestRate() As Double


Get
Return m dblInterestRate
End Get
Set(ByVal Value As Double)
m dblInterestRate " Value
End Set
End Property

17

18
19
20
21
22
23
24
25

Public Property NumberOfYears() As Integer


Get
Return m- iDuration- Years
End Get
Set(ByVal Value As Integer)
m- iOuration - Years " Value
End Set
End Property

26

27
28
29
30
31
32
33
34

Publ ic Property Principal () As Decimal


Get
Return m_c urPrinc i pal
End Get
Set(ByVal Value As Decimal)
m_curPrincipal '" Value
End Set
End Property

35

36
37
38
39
40

Public Overridable Function PaymentAmount() As Decimal


Dim iNumPaymentsPerYear As Integer " 12
Dim i Payments As Integer
Dim dblFractionalInterestRate As Oouble
Dim curPayment As Decimal

41

42
43

iPayments " m_iDuration_Years * iNumPaymentsPerYear


dblFractionalInterestRate "m dbllnterestRate / iNumPaymentsPerYear

44

45

curPayment '" m_curPrincipal *

Criando Obj etos no Visual Basic .NET

LISTAGEM 15.8

421

A Herana E uma Boa Mane i ra de Adicionar Func i onalidade

(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

Os detalhes da Listagem 15.8 no so muito re levantes, exceto pe la maneira como


essa classe teve de ser escrita para peml itir que voc baseasse nela um a nova classe
de antec ipao da hipoteca. Na li nha 36, a Fu no PaymentAmount declarada por meio da palavra-chave Overri dab I e. Sem essa palavra-chave, Acce I Mortgage (veja a Listagem 15.9) no poderia fornecer sua prpria verso da funo PaymentAmount.
LISTAGEM 15.9 AccelMortgage Adiciona a Capacidade de Calcular Mais Rapidamente
um Plano de Pagamento da Hipoteca
I Public Class Accel Mortgage
2
Inherits Mortgage
3
Private m_iNumberOfPaymentsl nYear As Integer '" 12
4
5
Public Property PaymentslnYear() As Integer
6
Get
7
Return m_iNumberOfPaymentslnYear
8
End Get
9
Set(ByVa l Value As lnteger)
10
m_iNumberOfpaymentslnYear '" Value
II
End Set
12
End Property
13

14
15

16
17
18
19
20
21
22
23
24

Public Overrides Function PaymentAmount() As Decimal


Oim iPayments As Integer
Oim dblFractionallnterestRate As Oouble
Oim curPayment As Decimal
iPayments ; Me . NumberOfYears * Me . PaymentslnYear
db l Fr act i onal lnterestRate;
Me . Annua l ln t erestRate / Me . PaymentslnYea r
curPayment '" Me.Principal *_
({I - (I + dbI Fractio nall nterestRate _
/{I - ({1 + dblFractionalInterestRate) A iPayments

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

A Listagem 15.9 ilustra a sobreposio de um mtodo de uma classe derivada, e a Ii-

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

Programa Cl i ente Chama os Doi s Cal cul os da Hi poteca

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

Criando Objetos no Visual Basic .NET

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

15.11 Adicionando uma Declarao de um Evento

1 Public Class OutlookMessageWatcher


2
3
Publ ic Event EmailArr ived(ByVa l From As String,
4
ByVal Subject As String, _

Dia 15

LISTAGEM 15.11 Ad i cio nando uma Declarao de um Evento (continuao)


5
ByVal Message As Outlook .Ma iIItem)
6
7 End Class

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

Publ ic Sub New()


objOutlook = New Outlook.Application()
ob j Outlook . Session . Logon(NewSession : =False)
objInboxItems = objQutlook .Session . GetOefaultFolder
(Qutl ook .01 Oefaul tFol ders . 01 Foi derlnbox) . Items
End Sub

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

Criando Objetos no Visual Basic .NET

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

5 'O cdigo gerado pelo Windows Form Designer foi omit i do


6

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.

Definindo e Usando Interfaces


Um dos recursos mais importantes da programao orientada a objetos (POO) a capacidade de
tratar um objeto como se fosse uma instncia de outra classe. Quando voc lidar com a herana,
isso sign ifica que poder tratar qualquer classe derivada como se fosse algum de seus antecessores. Isso Mil e em geral um estimulante essencial na criao de classes bsicas, mas seu uso limitado s classes com relacionamento de herana.
Outra maneira de produzir um resultado semelhante, classes que podem ser trat adas como se
fossem outras, usar interfaces. Uma intelface um tipo especial de classe que no contm cdigo, mas empregada como uma alternativa para descrever a aparncia de um objeto. Em segui-

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

IComparable Permite Que Sua Classe Funcione

1 Public Class Person


2
Implements IComparable
Private m_sName As String
3
Private m_sFirstName As String
4
5
Private m_sLastName As String
6

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

Publ ic Property FirstNameO As String


Get
Return m sFirstName
End Get
Set(ByVal Value As String)
m sFirstName = Value
End Set
End Property
Pub l ic Property LastName() As String
Get
Return m sLastName
End Get
Set(ByVal Value As String)
m sLastName = VaI ue

Criando Objetos no Visual Basic .NET

427

LISTAGEM 15.14 rComparable Permite Que Sua Classe Funcione (continuao)


29
30
31

End Set
End Property

32

Pub1ic Function CompareTo(ByVal obj As Object) As Integer


Implements System.IComparable.CompareTo
'Compare esta instncia com obj, retorne um nmero
'menor que zero para indicar obj < me , O para indicar
'obj ~ me , e maior que zero para indicar obj > me
Oim objOtherPerson As Person
objOtherPerson ~ CType{obj, Person)

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

Implememtar IComparable Permite Que uma Classe Func i one em uma


Lista Ordenada

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

Oim slPeople As New Sortedlist{)

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

Criando Objetos no Visual Basic .NET

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

4 Publ ic Interface IOebugInfo


ReadOnly Property ClassName () As String
5
6
ReadOn ly Property Author() As String
7
ReadOnly Property SourceFile() As String
ReadOnly Property Description() As String
8
9 End Interface
As interfaces so semel hantes s classes em alguns aspectos, mas como voc pode ver na Listagem 15.16, bem diferentes em outros. Dentro da declarao Interface (linhas 4 a 9), os membros so defin idos apenas com sua declarao, e nenhum cdigo de implementao fornecido.
Oescopo tambm no includo como parte dessas declaraes, mas Publ i c sera o padro quando essa interface for implementada em uma de suas classes. Independentemente do escopo escolhido em sua classe, esses membros estaro disponveis por meio da interface IOebugInfo. No
caso dessa interface, as propriedades sero as mesmas para todas as instncias de uma n ica
classe e estaro dest inadas a descrever essa classe especfica. A natureza dessas propriedades
pennite valores apenas de leitura, mas as interfaces podem apresentar o tipo de propriedade que
for necessrio. Um exemplo contendo um a rotina de registros, mostrado na Listagem 15. J7, armazena infonnaes de rastreamento sobre qualquer classe que d suporte IOebuglnfo.
LISTAGEM 15.17 Um Procedimen to de Registras Ace ita Qualquer Classe Que Imple mente IDebugInfo
1 Option Explicit On

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

objLogFile.WriteLine(" ...................... ..... ")


objLogFile.WriteLine(Message)
objLogFile.WriteLine{"From {O} ({l}) by {2}" ,_
Source.ClassName , Source . SourceFile , Source . Author)
objLogFi 1e.Wri teL i ne( "Oescri pti on: (O)" ,
Source.Oescription)
objLogFile.WriteLine{" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ")

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

Criando Obj etos no Visual Basic .N ET

LISTAGEM 15.18 Usando a Interface IDebuglnfo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

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

Public Sub New()


LoggingRoutine . LogMsgToFi l e _
("Started Up" . "C:\tesLtxt". Me)
End Sub
Public ReadOnly Property OisplayName() As String
Get
LoggingRoutine . LogMsgToFi l e _
(String . Format("OisplayName called , {O} {I}output" .
m_sFirstName . m_sLastName) , "C : \tesLtxt" . Me)
Return String . Format("{OI {I}". m_sFirstName. m_sLastName)
End Get
End Property
Publ ic Property FirstNameO As String
Get
Return m sFirst Name
End Get
Set(ByVa l Value As String}
m sFirstName " Value
End Set
End Property

44

45

Public Property LastName() As String

43 1

Dia 15

LISTAGEM 15.18 Usando a Interface IDebuglnfo (continuao)


46
47

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

Public ReadOnly Property ClassName() As String


Implements IDebugInfo.ClassName
Get
Return "Person"
End Get
End Property

Criando Objetos no Visual Basic .NET

LISTAGEM 15.18

433

Usando a Interface IDebuglnfo (continuao)

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

Para usar esse programa, re na a interface IDebuglnfo (Listagem 15.16), a rotina de


registras (Listagem 15.17) e esse cdigo (L istagem 15.18) em um projeto, porm em
arquivos separados. V at as propriedades do projeto e cel1ifi que-se de que a rot ina Mai n da Listagem 15.18 esteja selecionada como objeto inicial (Startup object), e tudo deve funci onar bem.
Lem bre-se de que esse cdigo pode ser descarregado da pgina do livro, portanto, se quiser, voc
poder evitar a digitao.

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.

Usando os Objetos Que Voc Criou


Depois de definir um conjunto de classes e interfaces, provavelmente voc desejar us-las
como parte de um ap licativo. Nos exemplos que vi mos at agora, apenas um projeto esteve envolvido, portanto, utilizar suas classes foi to simp les quanto declarar novas variveis. Esse poder ser o caso em seus sistemas reais, mas faze r com que as definies de classes sejam parte de
cada projeto no ser til e decerto no funcionar bem quando quisermos que muitos projetos
compart ilhem as mesmas defi nies de um conj urlto de classes e interfaces. Para tornar seu cdigo fac ilmente disponvel para qualquer projeto que precise us-lo, necessrio criar um projeto
Class Library. Esse tipo de projeto no tem como finalidade ser executado isoladamente, mas,
em vez disso, contm um cdigo que poder ser usado por outros projetos.
1. Selecione File. New e Project no menu, o que deve abrir a caixa de dilogo New Project
(veja a Figura 15.2).
2. Selecione o modelo de projeto Class Library e observe a descrio adequada do texto
(" Um projeto para a criao de classes a serem usadas em outros ap licativos") que confirma a finalidad e desse mode lo.
3. Fornea um nome para esse novo projeto, no lugar do padro C1 assl i braryl , e d um clique
em OK para cri-l o.
Os projetos desse tipo so compostos de quantos arquivos de cdigo repletos de classes voc
,
quiser ad icionar e nenhum objeto inicial. E possvel d isponibilizar suas classes tendo apenas
uma delas em um arquivo ou reunindo todo o seu cdigo; o resultado final o mesmo.

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

Criando Objetos no Visual Basic .NET

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 _

--

1"""" .. ..-..-....... - ......

[ii.j
1'1

ii:;a

wo ,

"""d ........

!JP

-.

.......,.

....>CT _ _ 0....0

..:J

r _to"",,",
_

..... . . - .. <>~ .. \>ty_

.""

.................... _

.... 1\0

, ...... ,.

LISTAGEM 15.19 Os Espaos de Nome Ajudaro a Organizar Suas Classes


1 Option Explicit On
2 Option Strict On
3 Namespace l ibPerson
4
Public Class Cl ass 2
5

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

Option Exp l icit On


Option Strict On
Namespace 1ibPerson
Public C1ass Class2
End C1 ass
End Namespace

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.

Criando e Usando uma DLL da Biblioteca


Depois de adic ionar todas as suas classes e interfaces a seu projeto de biblioteca, para construi r a
DLL final voc s ter de selecionar Build no menu Bui ld ou pressionar as tec las Ctrl+Shift+B.
Isso cria uma DLL, em geral chamada <nome do projelo>.dll , localizada no diretrio bin sob seu
projeto. Esse local e o nome so adequados, mas para testar sua nova biblioteca, ser preciso fechar essa soluo e abrir um novo projeto de ap licativo do console.
I. Selecione New e Project no menu File e crie um novo apl icat ivo do console no Visual
Basic .NET.
2. Depois que o novo projeto tiver sido aberto, d um clique com o boto direito do mouse
na pasta References da tela do Solution Explorer em que ele aparecer.

Criando Obj e tos no Visua l Basic .NET

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.

'''''~

5. Depois de localizar a DLL desejada, d um clique em OK para confirm-Ia na caixa de


di logo Add Reference; em seguida, d um cli que em OK mais uma vez para retornar a
seu cdigo com a recm -adicionada referncia disponve l para seu projeto.
Para usar essa bibl ioteca de classes, voc pode trat-la como qualquer parte do .NET Framework. As
classes propriamente ditas sero encontradas no fina l do caminho <nome do projeto> . <espaa de
nome> . <classe>. Supondo que seu projeto seja chamado de 1i bPe r son e uma re ferncia a esse nome
seja adicionada, ento, a Listagem 15.22 ilustra como as instncias das classes de sua biblioteca poderiam ser manipuladas.
LISTAGEM

15.22 Usando Sua Bibl i oteca

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 .

P Tenho de programar com objetos para usar o Visual Basic .NET?


R Para ser breve, sim. O Visual Basic .NET, e todo o .NET Framework, fo i desenvolv ido
em torno dos objetos, e sempre que voc usar qualquer das classes do .NET Framework
estar trabalhando com eles. Os programas de sua autoria, no entanto, podem empregar
muito ou pouco os objetos, conforme desejar. Todos os cdigos criados ficaro armazenados em classes (ou mdu los, que so apenas uma forma um pouco estranha de classes)
e, portanto, no se pode evitar completamente os objelos, mas a opo de construir todo o
seu sistema com entidades represe ntadas como objetos sua.

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?

Criando Objetos no Visual Basic .NET

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.

Programas com vri as interfaces de documentos.

Controles avanados dos formulrios Windows.

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.

Adicionando um Menu a um Formulrio


Voc pode adicionar um menu a seu aplicativo da mesma maneira que insere qualquer outro
controle, com duas peq uenas diferenas . Ao dar um clique com o bOio direito do mouse no controle Mai nMenu da caixa de ferramentas para adicionar um novo menu a seu formulrio, ir se deparar com a prime ira diferena. Em vez de ver um exemp lo do menu no formulrio , O controle

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

controle Ma i nMenu em cada formulrio.

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.

Me. Menu mnuSecond


Voc desejar faz er isso nos casos em que seja usado apenas um formu lrio
para realizar mu lti pias tarefas - por exemplo, se voc carregar diferentes tipos
de arquivos em um controle, no fo rmulrio. Voc poder alterar os menus para
refletir as operaes que podero ser executadas no arquivo. En tretanto, uma
soluo prtica para esse problema poderia ser ocultar e exibir os itens de
menu de acordo com sua necessidade .

FIGURA 16.1

. """"" _, ..... v'''''' .... .. ' l _ l """"""""l"""",r

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

Formulrios Wi ndows Avanados

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

Teclas de Acesso do Menu de Exemplo (em ing ls)

Item do Menu

Tecla de Acesso

File

N,w

Exit

View

R,d

Green

Slue

NOTA

Ao observ armos a l ista de teclas de acesso, percebemos que a maioria delas


o primeiro caractere, com exceo de Exit (Sair). Nesse caso o padro usar as
letras X como teclas de acesso.

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

Formul rios Windows Avanados

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

Teclas de Ata lho

Item do Menu

Atalho

N,w

Ctrl N

Exit

CtrlO

R,d

CtrlR

Green

CtrlG

Blu e

CtrlB

NOTA

Ao examinarmos a lista, perceberemos novamente que s uma tecla de atalho


parece no seguir o padro - Exit. Preferiuse o uso de Ct rl+Q em vez de Ctrl+X
porque essa combi nao em geral associada ao comando Recortar (Cul).

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

Teclas de atalho 1/0


tempo de proje/o.

10<* _

... : .. ,p . Q

"'"

"~

.,,~~~

. ................

I"Ir:lD
-,._ __

~' ,:"

~~:~:"

I"I[]

..

.-

--.-.-- -
"' ,_' .....~

~-

.-

........ ,......

FIGURA 16.4

feclas de a/afho

110

tempo de execucio.

LISTAGEM 16,1 Cdigo para o Menu de Exemplo

1
2
3
4

Private Sub mnu FileNew_Click(ByVal sender As System . Object.


ByVal e As System.EventArgs) Handles mnuFileNew.Click
Oim frrnNew As New fnnMenuO
frrnNew.Show()

End Sub

6
7

Private Sub mnuFileEx i t _Click(ByVal sender As Object,


ByVal e As $ystem. EventArgs) Handles mnuFileExit . Click

8
9

10
11
12

Me.CloseO
End Sub

Private Sub mnuViewRed_Click(ByVal sender As System . Object.


ByVal e As System.EventArgs) Handles mnuViewRed . Cl l ck
Me.BackColor : Color.Red

'

....

3.,,9 .........
,~

....

'-

,,'

Formulrios Windows Avanados

Cdigo para o Menu de Exemplo (continuao)

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

o manipulador de eventos mnuFi 1eNew

Cl i ck esta re lacionado aos itens Fi le e New


do menu. O cd igo para esse evento (linhas 1 a 5) cria uma nova instnc ia do formulrio atual e a exibe. Isso permite que voc veja vrias cpias do fornlU lrio simultaneamente. Por
outro lado, o cdigo do evento mnuFi 1eExi t C1 i ck (itens Fi le e Exit das linhas 6 a 9) fecha o formulado ativo. O aplicativo encerrado quando o ltimo fOnTIulario fechado. Os trs manipu ladores de eventos finais esto relacionados aos itens Red, Green e Blue do menu. Eles apenas
alteram a cor do plano de fundo do fOnTIulario ativo para a cor que fo i selecionada.

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

" a a 1). 1"" Ir!, I' .. ii. 1:] 1-

@ !lIo tdt _

Pt ' - 1_

(/0<.0 _

- !li ~ I ~ --

. 12

.. ___ ' -

Q~ ,, ~ a

(, ~"'"

~..

1=;=" li" _
.J<J~

" ,O -

1_ SIcIo _ _ t!>l>

' e ...

1/

ljI\>

Q ~ g l al1l.~ ,l.fQt!, -, - il,1:/. !l O I!l ~ I -

::!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.

Formulrios Windows Avanados

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.

NO encare isso como uma regra absoluta.


Se um menu no for apropriado, no hesite
em deix-lo de fora. Por exemplo, se seu apli.
cativo no usar arqu ivos, voc pode evitar a
utilizao do menu Arquivo. No entanto, ainda
seria possivel inclui r o item Sair como o ltimo item do primeiro menu.

Programas de Interface de Documentos


Mltiplos
Com freqncia, precisamos cri ar um programa que lide com vrios itens semelhantes, como um
editor de texto que precise de vrias janelas abertas ou urna ferramenta de banco de dados que
permita ao usurio visualizar os resultados de diversas consultas. Embora no seja obrigatrio,
esses tipos de programas podem ser projetados como um apl icativo MOI (Multiple Oocument
Interface) para aj LIdar seus usurios a visualizar o relacionamento entre as janelas abertas. A Figura 16.7 mostra um apli cativo MOI.

FIGURA 16.7

Aplicativo com

!'! .... ,.........

..rJll

iflfeljace de
doeI/mel/los 1IIllliplos.

O Que E uma Interface de Documentos Mltiplos?


Para descrever a MO I, devemos compar-Ia com um aplicativo SDI (Si ng le Document Interface
- interface de apenas um documento). Em um ap licat ivo com um , como o 810co de notas, cada

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.

Refora a idia de que os fo rmulrios-fil hos esto relacionados entre si e associados ao


formulrio-pa i. Se os formulr ios no puderem ser transferidos de modo independente,
sero considerados como dependentes uns dos outros.

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

Cr iando um Formulrio - filho

Private Sub mnuFileOpen_Click{


ByVal sender As System.Object.
ByVal e As System . EventArgs)
Handles mnuFileOpen.Click
Dim oForm As New fnnView{)

Form u lrios Windows Avanados

LISTAGEM 16.2

Criando um Formulrio - filho (continuao)

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:

Tile Horizontally (Lado a lado horizontalmente) Organiza as janelas-filhas de modo que


cada uma seja uma faixa hori zontal ocupando a tela (veja a Figura 16.8). Isso ser til
quando voc tiver de comparar informaes que precisem ser exibidas em uma linha inteira, como dois documentos para o processamento de textos.
Tile Vertically (Lado a lado verticalmente) Organiz:1. as janelas- fi Ihas de modo que cada
uma seja uma faixa vertical do lado da outra ao ocupar a tela (veja a Figura 16.9). Isso ser
til ao se comparar pequenas reas de dois ou mais documentos ou quando voc executar
uma varredura rpida em dois documentos para encontrar alteraes.

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$.

1I ... 'w .......

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.

Formul ri os Windows Avanados

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.

/IIr ange !"""

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

Propriedades do Formulrio MDI-pai

Propriedade

Valor

Si ..

4W,360

Text

Picture View

I sMdi Contai ner

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

Estrutura do Menu do Formulrio MDI -pai

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

Formul rios Windows Avanados

TABELA 16.4

Estrutura do Menu do Formu lrio MOI-pai (continuao)

Item do Menu

Propriedade

Valor

Menu de nvel superior

( Name)

MnuW i ndow

Text

&Window

Mdi Li st

True

(Name)

MnuWi ndowHori zonta 1

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

Graphics Files l*.gif;* . bmpj*.jpgIAll files l**

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

Private Sub mnuFileOpen_Click(


ByVal sender As System . Object.
ByVal e As System . EventArgs)
Handles mnuFileOpen.Cl i ck
If dlgOpen . ShowDialog() : Dia l ogResult . OK l hen
Dim oForm As New frmView()
oForm .Mdi Parent : Me
oForm.Picture : I mage.FromFile{ dlgOpen.FileName)
oForm.Show()
End If
End Sub

Dia 16

Cdigo para os Comandos do Menu File de MultiPicView (continuao)

LISTAGEM 16.3
13

14
15
16
17
18
19

Private Sub mnuFileExit_Click(_


ByVal sender As System.Object .
ByVal e As System.EventArgs) _
Handles mnuFileExit.Click
Me . CloseO

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

Cdigo para os Comandos do Menu Windows de MultiPicView

Private Sub mnuWindowHorizontal_Click(


ByV al sender As System.Object .
ByVal e As System.EventArgs) _
Handl es mnuWi ndowHori zontal . CI ick

26
27
28

Me . LayoutMdi (MdiLayout . TileHo rizon tal)


End Sub

29
30
31
32
33

Private Sub mnuWindowVertical_Click(


ByVal sender As System.Object .
ByVal e As System . EventArgs)_
Handles mnuWindowVertical.Click

34
35
36

Me. LayoutMdi (MdiLayout.TileVertical)


End Sub

37
38
39

Private Sub mnuWindowCascade_Click(


ByVal sender As System.Object .

Form u l ri os Wi ndows Avanados

LISTAGEM 16.4

457

Cdigo para os Comandos do Menu Windows de MultiPicView

(continuao)
ByVal e As System . EventArgs)
Handles mnuWindowCascade . Click

40
41
42
43
44
45

Me. LayoutMdi (MdiLayout.Cascade)


End Sub

46

Private Sub mnuWindowArrange_Click(


ByVal sender As System.Object.
ByVal e As System . EventArgs)_
Handles mnuWindowArrange . Click

47

48
49
50
51

Me. LayoutMdi (MdiLayout.Arrangelcons)


End Sub

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

Propriedades do Contro le Pict ureBox

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

Publ ie Property PictureOAs Image


Get
Return picView.Image
End Get
Set(ByVal Value As Image)
picView . lmage = Value

458

Dia 16

LISTAGEM 16.5 Propriedade Picture (continuao)


7

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-

sentem os controles no f01mulrio ou propriedades exclusivamente relacionadas aos controles.


Nesse caso, a propriedade Pi cture foi usada para acessar a propriedade Image do controle picVi ew. Embora isso pudesse ter si do resolvido se tornassem os pblico o contro le, seria proporcionado um nvel muito amplo de acesso a ele. Isso perm ite que o cd igo le ia ou altere com faci lidade a
figura, sem deixar que o cdigo de um fommlrio dife rente modifique outras infol1Tlaes sobre
Pi ctureBox.

Execute o aplicat ivo. Provave lmente voc poder abrir vrios arquivos de figuras , como vemos
na Figura 16.13.
FIGURA 16.13

~ .. ,........

"fJE3

Multi Pi cView em aio.

Controles Avanados dos Formulrios


Windows
Embora seja quase sempre possvel desenvo lver um aplicativo usando apenas os contro les mais
comuns, como Label , TextBox e Pi ctureBox, voc provavelmente precisar de outros cm certas

Fo rmul ri os W indows Avanad os

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

Membros do Controle TreeView

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

Esta a propriedade mais importante do controle TreeVi ew. Ela contm a


lista de todos os itens de nvel superior desse controle.

PathSeparator

Usada quando um caminho recuperado em um n do controle TreeView.


Esse caractere empregado entre cada um dos ns. O padro ut ilizado
a barra invertida (\) .

Se 1ectedNode

O n selecionado atualmente no controle TreeView.

ShowLines

Determina se sero t raadas linhas entre os ns do controle TreeView.

ShowPl usMi nus

Determina se os caracteres + e- sero exibidos prximos aos ns do con


trole TreeVi ew.

ShowRootL ines

Determina se sero traadas linhas para conectar os ns do nivel superior


do controle TreeVi ew.

Sorted

Determina se os itens adicionados ao controle TreeView devem ser orde


nados quando inseridos.
M t odos

Co11apseA11

Fecha todos os trs ns.

ExpandAll

Expande todos os trs ns.


Eventos

BeforeCo 11 apse

Ocorre antes que uma subrvore seja fechada . Pode ser usado para can celar o evento ou atualizar outros controles.

BeforeExpand

Ocorre antes que uma subrvore seja aberta. um timo manipulador de


eventos para conduzir atualizao os itens da subrvore antes de execu
tar a exibio para o usurio.

BeforeSe1 ect

Ocorre antes que um n seja selecionado.

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

Ocorre depois que um n da rvore selecionado. Pode ser usado para


atualizar outros controles com base no n selecionado.

Como descr ito na Tabela 16.7, Nodes a propriedade mais importante do controle TreeView.
Cada item desse conjunto

um objelo TreeNode, e esse objeto o ponto central de grande parte

do que executado com o controle TreeVi ew. A Tabel a 16.8 descreve as propriedades e mtodos
importantes da classe TreeNode.

Formulrios Windows Avanados

TABELA 16.8

461

Propriedades e Mtodos de TreeNode

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

O conjunto de TreeNodes desse TreeNode.

Text

O texto desse TreeNode.


Mtodos

Collapse

Recol he a rvore comeando com o n atual.

[xpand

Expande a rvore comeando com o n selecionado.

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

quando lidamos com esse controle. E le o conjunto re

presentado pe las propriedades Nodes - os objetos TreeNodeCollecti on . Um desses conjuntos se


encontra no nvel mximo da rvore e refletido na propriedade Nodes de TreeView. Alm disso,
cada TreeNode desse conjunto possui seu prprio conjunto Nodes, represe ntando todos os
nsfilhos desse TreeNode.

A Tabela 16.9 descreve algumas das propriedades e mtodos d esse

importante conjunto.
TABELA 16.9
Membro

Mtodos e Propriedades de TreeNodeCollection


Descrio

Propriedades
Count

Determina quantos itens existem no conjunto.

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

Remove todos os ns do conjunto selecionado.

IndexOf

Retorna o nmero ref erente posio do n selecionado no conjunto.

Insert

Adiciona um novo TreeNode lista de ns em uma posio definida.

Remove

Remove do conjunto um n solicitado.

RemoveAt

Remove um n pelo ndice no conjunto .

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

Propriedades, Mtodos e Eventos Importantes do Controle listView

Membro

Descrio
Propriedades

Checkboxes

Determina se as caixas de seleo sero exibidas prximas a cada


item da lista. Essa uma maneira excelente de criar uma lista com
seleo mltipla.

Check Indices

Retorna o valor do ndice de cada item selecionado em Li stview.lsso


permite que voc saiba que itens foram selecionados quando usar
ListView para criar listas com seleo mltipla.

Co lumns

Quando listView estiver no modo de exibio 'Detalhe', as colunas


podero aparecer para que a lista fique organizada.

FullRowSelect

Determina se a linha inteira ou apenas o texto do item ser marcado


quando um item for selecionado.

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

Representa o conjunto de todos os it ens de ListView.

View

Determina como li s tVi ew ser exibido. As opes possiveis so Large Icons, $malllcons, Ust ou Deta i!.
Mt odos

C1 ear

Remove todos os itens de ListView.


Eventos

ColumnClick

Ocorre quando o usurio d um cl ique no cabealho de uma coluna.


Ocorre quando o usurio seleciona um novo item em ListView. Permite que voc atualize outros controtes com base nessa seleo.

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

importantes entre essas propriedades.

Formulrios Windows Avanados

TABELA 16.11

Membro

463

Propriedades de ListViewItem
Descrio
Propriedades

Checked

Usada junto com a propriedade Checkboxes de ListView, esta propriedade


ser igual a True se um item for selecionado.

Index

Retorna a posio do item em ListView.

Selected

Determina se ListViewltem foi selecionado .

Subi tems

Usada junto com o modo de exibio 'Detalhes' e a propriedade Co 1umns.


Esta propriedade contm as informaes que sero exibidas nas colunas
adicionais.

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

Propriedades e Mtodos de ListViewItemCollection


Descrio
Propriedades

Count

A quantidade de itens em ListViewCollection.

Item

Retorna o objeto ListViewltem da posio solicitada.


Mtodos

Add

Adiciona um novo objeto ListViewItem ao final do conjunto. O novo item


pOde ser um objeto Li stViewltem ou o texto a ser exibido para o item.

Clear

Remove todos os it ens do conjunto.

IndexOf

Retorna o ndice, ou posio, do objeto ListViewltem solicitado.

Insert

Adiciona um novo objeto Li s tVi ewI tem ao conjunto em uma posio solicitada.

Remove

Remove um objeto ListViewItem do conjunto.

RemoveAt

Remove um item do conjunto pela posio.

Controles Spl; tter


Embora seja poss vel que voc j tenha visto os controles TreeVi ew e Li stV i ew, menos provvel que conhea o controle Spl i t ter; no entanto, pode t-lo usado. O contro le Spl i tter uti lizado para redimensionar os controles-filhos de uma jane la no tempo de execuo. Por exemplo, no
Explorer, se passarmos o mouse sobre a linha ci nza que separa TreeView e Li stVi ew, poderemos

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

Propriedades Importantes do Controle Splitter

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

Configura a direo do controle Sp1 itter. Se configurada para um lado,


ser usado na alterao da altu ra dos dois controles. Se for encaixado na
parte superior ou inferior do formulrio, ser emprega do para alterar a largura dos dois controles.

mi nS i ze

Define um tamanho minimo para o controle que no for configurado como


Fi 11 . Ser util se voc no quiser que as informaes de um lado do cont role Sp1 i tter fi quem ocu ltas.

FIGURA 16.15

Ustmdo o comro!e
Sp1 itter.
.,,_

to,)

EJ

...... Cool')

",.'

...
" ' (Do)

_ ...... ,,_ .. _ '-. ,ffj LiU B


_ ... _ ..... _."'-.' ~ .... Coo-<nj- - """"w
(l,)

~-

,
....

,.~

Formul rios Windows Avanados

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

.......... .... ....". ....... ......... '1 _

16.16

Imel.face com o Ifsuarlo

...

1 -....... ......' . 1"""-)


""'" _

~.",,:

..

..r.lEl

ti'\>

para Ploneer.

,_o
8,_...... ,m (Dr'
" ~.

$ ,

'.

m(00<"""')

-, ..............
",- '..
13 ' .....

~_

TABELA

16.14

Propriedades do Formulrio Pioneer

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

Propriedades do Controle TreeView

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

Propriedades do Controle ListView

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

Adicio nando a Lista de Unidades a TreeView

Private Sub PioneerForm_Load(ByVal sender As System .Object.


ByVal e As System.EventArgs)
Handles MyBase . Load
'adicione as unidades visualizao da rvore
Dim sDrives() As String = Directory.GetLogicalOrives()
Dim sDrive As String
Dim tvwNode As TreeNode

9
10
11

12
13
14

For Each sDrive ln sDrives


tvwNode = tvwFolders.Nodes.Add(sOrive)
'adicione um n fictcio
tvwNode . Nodes. Add (" durrrny")
Next

15

16

End Sub

Formul rios Windows Avanados

467

o mtodo GetLogi cal Dri ves da classe Di rectory

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

Manipuladores de Eventos de TreeView

Private Sub tvwFolders_BeforeExpand(ByVal sender As Object ,_


ByVal e As System .W indows.Forms .TreeViewCanceIEventArgs)
Handles tvwFolders.BeforeExpand
'examine se j sabemos quais so os f il hos
, (se ainda houver um n fictcio aqui porque nao sabemos)
Dim oNode As TreeNode ; CType{e .Node , TreeNode)
If oNode .Nodes{O) .Text :: "durrrny" Then
'remova o n fictcio
oNode.Nodes{O).Remove{)
'adi ci one os filhos reais
Get Ch i ldren{oNode)
End I f
End Sub

31

32
33
34
35
36
37
38
39
40
41
42

Private Sub tvwFolders_AfterSelect(ByVal sender As Objecto


ByVal e As System.Windows.Forms.TreeViewEventArgs)
Handles tvwFolders.AfterSelect
Dim sFiles{) As String
Try
sFiles ; Oi rectory.GetFiles(tvwFolders.SelectedNode.FullPath)
Catch ex As Exception
'simplesmente ignore a exceo
'a causa mais provvel da exceo
' ser 'A unidade no est pronta' se voc estiver acessando um

Dia 16

LISTAGEM 16.7

43

Manipuladores de Eventos de TreeView (continuao)

, disquete sem que ele esteja na unidade


End Try

44
45
46
47
48

If Not IsNothing(sFiles) then


Dim sFile As Stri ng
Dim oItem As listViewltem

49
lvwFiles.ltems.Clear()

50
51

52
53
54
55
56

For Each sFile ln sFiles


oItem = lvwFiles.ltems.Add(StripPath(sFile
Next
End I f
End Sub

57
58
59
60
61

Private
Oim
Dim
Dim

Sub GetChildren{ByVal node As TreeNode)


sDirs() As String = Oirectory.GetDirectories(node .Fu llPath)
sDi r As String
oNode As TreeNode

62
63
64

65
66
67
68

For Each sOi r ln sOi rs


oNode " node.Nodes.Add(StripPath(sOir
'adicione um n fictcio como filho
oNode . Nodes. Add ("du1TfllY")
Next
End Sub

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

Form u l ri os Windows Avanados

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.

o manipulador de eventos tvwFo1 ders

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

o texto comeando pelo caractere aps a ltima barra invertida.


Compi le e execute o aplicativo. Voc deve ver algo semelhante Figura 16. 17, dependendo de
seu conjunto de unidades e diretrios. Voc tambm pode navegar pelos d iretrios, e os arquivos
de cada um deles ser exibido. Agora temos um ponto de partida para criar seu prprio explorador de arquivos. Talvez queira estender Pioneer para adicionar outros recursos, como a capacidade de inserir diretrios, alterar a visualizao dos arquivos, adicionar figuras e assim por
diante.

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.

Formul rios Windows Avanados

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

combinao de teclas um cdigo fosse executado para esse item?


R Adicione uma tecla de atal ho a um item de menu por meio da propriedade ShortcutKey.

Selecione o item CtrlB na lista suspensa dessa propriedade.


P O que acontece se a propriedade Mdi Parent de um formulrio no for configurada
antes de sua exibio?
R Se voc no definirMdi Parent para um formulrio com a propriedade IsMdiContai nerconfigurada como True, o novo form ulrio no ficar annazenado dentro de Mdi Parent e poder ser transferido para fora dos limites do fo rmulrio-pai.

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:

Os arquivos e as classes relacionadas.

O desenho com as classes de figura s.

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

Usando o .NET Framewo rk

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

17.1 Mtodos da Classe Directory

Mtodo

Descrio

CreateDirectory

Cria um ou mais diretrios. Uma das funes mais poderosas des


ta classe gerar uma rvore inteira de diretrios.

Oelete

Remove um diretrio.

E:d sts
GetCurrentOirectory

Retorna True se o di retrio existir.

GetDirectories

Retorna um a rray contendo os diretrios-filhos do diretrio desejado .

Getfi l es

Retorna um array contendo os arquivos do di retrio solicitado.

TABELA

Retorna o camin ho completo do diretrio atual.

17.2 Mtodos d a Classe File

Mtodo

Descrio

COpy

Copia um arquivo.

Create

Cria um novo arquivo.

CreateText

Uma verso especial de Create que cria um arquivo de texto.

Oelete

Exclu i um a rquivo .

Exi sts

Retorna True se o arquivo existir.

Open

Abre um a rquivo para leitu ra, gravao ou ambos.

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

Muitos dos mtodos das classes File e Directory so compartilhados (shaNOTA

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"}

lendo um Arquivo de Texto


,

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

17.3 Mtodos e Propriedades de FileStream

Nome

Descrio

CanRead (Propriedade)

Igua l a True se o arquivo puder ser lido. Esta uma propriedade


adequada em tes tes para evita r uma exceo que poder ocorrer
se o arquivo estiver bloqueado ou for aberto apenas para gravao.

CanSeek (Propri edade)

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)

Igua l a True se voc puder gravar no arquivo. Essa uma boa


propriedade em testes para evitar uma exceo que poder
ocorrer se o arquivo estiver bloqueado ou for abe rt o apenas
para leitu ra .

Length (Propriedade)

Quantidade de bytes do arqu ivo.

Position (Prop riedade)

A posio atual do arquivo.

Close (Mtodo)

Finaliza FileS tream. Sempre encerra a classe FileSteam (ou qua lq ue r classe Stream) quando voc t ermina de us-Ia.

Usando o .NET Framewo rk

TABELA

477

17.3 Mtodos e Propriedades de FileStream (continuao)

Nome

Descrio

Read (Mtodo)

l vrios bytes de Fi 1eStreamo Eles so retornados para voc em


um array.

Seek (Mtodo)

Provoca a movimentao para a frente e para trs em um arquivo.

Wri te (Mtodo)

Grava vrios bytes em FileStream.

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

17.4 Mtodos Importantes de StreamReader

Nome

Descrio

Close

Finaliza StreamReader. Sempre encerra suas classes St reamReader q uando


voc termina de us-Ias.

Read

l o prximo caractere de Stream. Ser adequado se voc estiver lendo


um caractere das informaes de cada vez.

ReadBlod

l um bloco de ca racteres de Stream. Pode ser uma maneira rpida de ler


as informaes de uma classe Stream.

Readl; ne

L a prxima lin ha de Stream. uma maneira adequada de manipular arquivos que fornecem informaes organizadas por linhas.

ReadToEnd

l todos os caracteres de Stream de uma s vez. o meio mais rpido de


extrair todas as informaes de Stream e inserir em uma varivel.

A Li stagem 17. 1 mostra uma maneira comum de abrir um arqu ivo de texto e ler o contelldo em

lima varivel string.


COIGO

1
2
3
4
5
6
7
8
g

LISTAGEM

17.1 Lendo um Arquivo

Oim oFile As Fi leStream


Oim oReader As StreamReader
Oim sContents As String
oFile = New FileStream("MyFile . txt", FileMode.OpenOrCreate. FileAccess.Read)
oReader = New StreamReader(oFile)
sContents = oReader.ReadToEnd()
oReader.Close()
oReader = Noth ing
oFile = Nothing

478

Dia 17

Gravando em um Arquivo de Texto


Exatamente como na leitura, voc pode usar o objeto $tream para gravar algo nele mesmo. No
entanto, muito mais fcil empregar StreamWriter para fazer isso. Da mesma maneira que com
StreamReader, aplique StreamWri ter a um objeto Stream existente e utilize os mtodos Write e
Wri tel i ne para adicionar as informaes. A Tabela 17.5 resume os mtodos significativos de
StreamWri ter.
TABELA 17.5 Mtodos Importantes da Classe StreamWriter
Nome

Descrio

Close

Finaliza StreamWriter. Sempre encerrar alguma classe StreamWriter

que voc possa ter criado. Se isso falhar, poder causar a perda das ai
teraes feitas no arquivo.

Wri te

Grava em Stream.

WriteLine

Grava em $tream, finalizando as informaes adicionadas com uma


nova linha.

A Listagem 17.2 mostra um exemplo tpico de uma gravao em um arquivo de texto.


COIGO

1
2
3
4
5
6
7
8
9
10
11
12
13
14

LISTAGEM

17.2 Gravando em um Arquivo

Oim oFile As FileStream


Dim oWriter As StreamWriter
oFile" New FileStream("MyFile.txt".
FileMode.DpenDrCreate, FileAccess.Write)
oWriter = New StreamWriter(oFile}
'Grava o inteiro 123 no arquivo
oWriter.Write(123)
'G rava a string "Customer" no arquivo
oWriter.Write("Customer")
'G rava a string "John Bull" no arquivo, as prximas gravaoes ficaro em uma
linha nova
oWriter .WriteLine("John Bull")
oWriter.Close()
oWriter = Nothing
oFile " Nothing

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-

Usando o .NET Framework

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

17.6 Propriedades de TextBox

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

17.7 O Menu Principal

Item

Propriedade

Valor

Menu de nvel superior

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 &Open ...

Abaixo de &Save

Dia 17

T ABELA 17.7

O Menu Principal (continuao)

Item
Abaixo de Save &As ...
Abaixo de -

Item de nvel superior


Abaixo de &Ed; t

Abaixo de Cu&t

Abaixo de &Copy

Item de nvel superior

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

o resultado final deve se parecer com os menus mostrados na Figura 17.1.


Para concluir o formulr io, adicione um controle Fi leOpenDialog e um Fi leSaveDia l og a ele e
configure as propriedades como mostra a Tabela 17.8.

FIGURA 17.1

Execulando o nOI'o
exemplo.

Usando o .NET Framewo rk

TABELA 17.8

481

Outros Controles do Formulrio

Objeto

Propriedade

Valor

FileOpenDialog

Name

dlgOpen

Fi lter

Text Files [ *.txt [All Fi les l **

Name

OlgSave

Filter

Tex t Files [ *.txt IAll Fil es I *. *

FileName

notel

FileSaveDialog

Agora que a interface com

usurio est configurada, precisamos ad icionar o cdigo.

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

17.3 Propri edades do Apl i cat i vo Note

Private m_sFileName As String


Private m_bDirty As Boolean
Public Property FileName() As String
Get
Return m sFileName
End Get
Set(ByVal Value As String)
m sFileName '" Value
Me . Text :: "Note - " & m sFileName
End Set
End Property
Public Property Oirty{) As Boolean
Get
Return m_bDirty
End Get
Set(ByVal Value As Boolean)
m_bDirty " VaI ue
Me.Text '" "Note - " & m sFileName & "*"
End Set
End Property
Publ;c Sub NewFi le()
Me .txtText.Text :: " "
Me.FileName:: " "
Me.Dirty :: False
End Sub

o cd igo um conjunto de instrues de propriedade relativamente simples. As


duas primeiras linhas declaram campos privados que armazenaro os valores das
propriedades. As linhas 3 a 11 representam a propriedade Fi leName. Essa propriedade salva o
nome do arquivo para acesso posterior no campo m sFi 1eName. Ao ser configurada, Fi 1eName tambm includa no ttulo do fonnulrio (linha 9).

ANALISE

De maneira semelhante, a propriedade Di rty (linhas 12 a 20) annazena suas informaes no


campo m bOi rty e adiciona um asterisco ao final da barra de ttulo.

Usando o .NET Framework

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

Item Help, do menu About

1 Private Sub mnuHelpAbout_Click(ByVal sender As System.Object,


2
ByVal e As System.EventArgs) Handles mn uHe lpAbout .C l i c k
Dim sMessage
- As String
3
sMessage = "Note - um editor de texto simples" & ControlChars.CrLf &
4
"Exclusivo do l ivro Aprenda Visual Basic . NET em 21 Dias." &_
5
controlchars.CrLf &
6
"copyright 2001.Di reitos totai s de di stri bui o fornecidos pelo autor . "
7
MessageBox.Show(sMessage,
8
"Note",
9
MessageBoxButtons.OK, MessageBoxIcon.Information)
10 End Sub

A caixa About do aplicativo Note apenas uma caixa de mensagens . No cdigo,


criamos e preenchemos uma varivel string (linhas 3 a 6). Observe que estamos adicionando novas linhas mensagem inserindo Cont ro 1Chars. CrL f no meio da string. Esse smbolo
representa uma combinao de retomo de carro (Carriage-retum) e a limentao de linha (line-feed) incl uda na string, o que cria uma linha nova. Para conclu ir, exibimos MessageBox (linha
7), inclu indo o boto OK e o cone Infommtion.
ANALISE

NOTA

Qual a inteno de se usar 'Carriagereturn, line feed'? Por que no empregar


apenas newline ou algo mais simples? Como sempre, as razes esto baseadas nos dias longnquos e obscuros da computao (talvez 30 anos atrs).
Antigamente, quando as pessoas usavam computadores, no trabalhavam
com monitores e mouses. Utilizavam mquinas de teletipo, que funcionavam
de maneira muito parecida com as mquinas de escrever com as quais se assemelhavam. Como qualquer pessoa que j tenha trabalhado com uma mquina de escrever sabe, quando chegamos ao final de uma linha e ouvimos o
sinal, hora de empurrar a alavanca de retorno. A alavanca de retorno executa
duas operaes, nos leva de volta ao incio da linha e para a lin ha seguinte.
Retorno de carro = mover o carro (o objeto que contm o papel e o cilindro) de
volta posio de retorno (ou incio da linha). Alimentao de linha ", passar
para a prxima linha. Portanto, retorno de carro, alimentao de linha significa
"passe para o incio da prxima linha". Carriagereturn, linefeed uma grande quantidade de palavras at para os profissionais de computao de modo
que costumava ser abreviada para CRLF. No Visual Basic .NET, esse recurso
est disponvel como ControlChars.Crlf.

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

17.5 Comandos do Menu File

Private Sub mnuFileNew_Click(ByVal sender As System. Object.


ByVal e As System.EventArgs) Handles mnuFileNew.Click
If Me.Dirty = lrue lhen
If MessageBox.Show(
"Voc fez alteraes no arquivo que sero perdidas . " &
"Deseja continuar?" ,
"New File" ,
MessageBoxButtons.YesNo . MessageBoxlcon.Question) =_
Dia log ResultO . Yes Then
NewFileO
End If
El se
NewFileO
End If
End Sub

16 Private Sub mnuFileOpen_Click(ByVal sender As System.Obj ect ,


17 ByVal e As System.EventArgs)
18 Handles mnuFileOpen.Click
19
Dim oFile As Fi leStream
20
Dim oReader As StreamReader
21
If Me . dl gOpen .ShowOialog = OialogResult() . OK Then
22
'Certo, podemos tentar abrir e ler o arquivo
23
Try
24
Me. FileName = Me.dlgOpen.FileName
25
oF i le = File .OpenRead(Me.FileName)
26
oReader = New StreamReader(oFile)
27
Me . txtText . Text = oReader . ReadToEnd
28
Catch ex As Exception
29
'exibiremos apenas o erro por enquanto
MessageBox .Show(ex.Message ,
30
31
"Erro ao abrir o arquivo" ,
32
MessageBoxButtons .OK ,
33
MessageBoxlcon . Error)
34
Finally
35
' lembre-se de sempre encerrar suas cl asses de le itura e arquivos
36
oReader. CloseO
37
oFile . CloseO
38
End Try
39
End If
40 End Sub

Usando o .NET Framewo rk

CDIGO

LISTAGEM

485

17.5 Comandos do Menu File (continuaiio)

41 Private Sub mnuFileSave_Click(ByVal sender As System.Object ,


42 ByVal e As System.EventArgs)
43 Handles mnuFi 1eSave . Click
44
's devemos tentar salvar esse arquivo se ele tiver um nome
45
If Me. FileName <> "Untitled" lhen
46
'Certo, tentemos salvar o arquivo
47
Oim oFile As Fi leStream
48
Oim oWr i ter As StreamWriter
49
Try
50
oFile = File.OpenWrite(Me.FileName)
51
'converta o contedo de TextBox em um array de bytes
52
oWriter = New StreamWriter(oFile)
53
'e 9rave no arquivo
54
oWriter.Write(Me.txtText.Text)
'a90ra no teremos mais alteraes
55
Me.Oirty = Fa1se
56
57
Catch ex As Exception
'por enquanto , s exibiremos uma mensagem de erro
58
59
MessageBox.Show{ex.Message, _
"Erro ao salvar o arquivo" ,_
60
61
MessageBoxButtons.OK,
MessageBoxlcon.Error)
62
Fina1ly
63
'lembre-se de encerrar todas as classes de gravao e de fluxo
64
65
oWriter.C10se{)
66
oFile.CloseO
67
End Try
68
E1 se
69
' se ainda no houver, crie um nome
70
mnuFileSaveAs Click{sender, e)
71
End If
72 End Sub
73 Private Sub mnuFileSaveAs_Click(ByVa1 sender As System . Object ,
74
ByVa1 e As System.EventArgs)
75
Hand1es mnuFileSaveAs.Click
76
If Me.dlgSave.ShowOialog = OialogResult().OK Then
77
'se de rem um clique em OK , definiremos o nome do arqulvo e salvaremos
Me . FileName = Me.dlgSave . FileName
78
'use o cdigo j existente no item File, Save para salvar o arquivo
79
80
mnuFileSave_Click{sender.e)
End I f
81
82 End Sub

486

CDIGO

Dia 17

LISTAGEM 17.5 Comandos do Menu File (continuaiio)

83 Private Sub mnuFileExit_Click(ByVal sender As 5ystem.Object ,


84
ByVal e As System.EventArgs)
85
Handles mnuFileEx i t.Click
86
Me,e lose ()
87 End Sub

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.

Usando o .NET Framework

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

17.6 Comandos do Menu Edit

1 Private Sub mnuEd i tCut_Click(ByVal sender As System.Object ,


2 ByVal e As System.EventArgs)Handles mnuEditCut.Click
3
Clipboard.SetDataObject{Me .txtText.SelectedText)
4
Me.txtText.SelectedText =
5 End Sob
"

II

7 Private Sub mnuEditCopy_C1ick{ByVal sender As System.Object ,


8
ByVa1 e As System.EventArgs) Handles mnuEditCopy . Click
9
Clipboard.SetDataObject{Me.txtText.SelectedText)
10 End Sub
11

12 Private Sub mnuEd itPaste_Click{ByVal sender As System .Object,


13
ByVal e As System.EventArgs)Handles mnuEditPaste.Click
14
Me .txtText .SelectedText =
15
CType{Clipboard .GetDataObject .Ge tData (OataFormats .Tex t) , String)
16 End Sub

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

Usando o .NET Framework

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

Usado para recuperar as informaes da rea de transferncia ou sobre


o seu con ted o. Na verdade, esse mtodo retorna uma interface - IDa taObject, que empregada na execuo efetiva da recuperao . A Tabela 17.10 descreve os mt odos importantes da interface IOataObject .

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

Usado para determinar que formatos esto armazenados na rea de


transferncia. Por exemplo, se uma figu ra tiver sido copiada para a
rea de transferncia, este mtodo retornar todos os formatos com os
quais ela pode ser colada.

GetOataPresent

Determina se algum dado de um formato especfico est armazenado


na rea de transferncia. Este mtodo poderia ser usado para voc definir se permitir que o usurio cole informaes em seu aplicativo . Por
exemplo, se houver informaes grficas armazenadas na rea de
transferncia, no deixaremos que o usurio as cole em nosso aplicativo Note.

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

mos, utilizamos o texto resultante da substituio de SelectedText em TextBox. Empregamos


Se 1ectedText, e no Text porque, se substituirmos Text, ento, o conte do de TextBox ser composto apenas das infonnaes da rea de transferncia. Esse no o comportamento esperado
quando se usa a rea de transfernc ia. Por meio de SelectedText, s substitumos o texto realado. Se nada estiver realado, o texto da rea de transferncia ser adicionado posio do cursor.
O lt imo dos menus que usaremos Help. A Listagem 17.7 mostra o cd igo do procedimento
About do menu Help.
ENTRADA

LISTAGEM 17.7

Comando About do Menu Help

1 Private Sub mnuHelpAbout_Click{ByVal sender As System.Object,

2
3
4
5

6
7

9
10
11
12
13

ByVal e As System. EventArgs) Handles mnuHelpAbout . Click


Dim sMessage As String
sMessage "" Note - - um editor de texto simp l es" &
ControlChars . CrLf &
"Exclusivo do livro Aprenda Visual Basic .NH em 21 Dias . " &
ControlChars.CrLf &
"copyright 2001. Direitos totais de distribui o fornecidos pelo
autor. "
MessageBox . Show{sMessage ,
"Note",
MessageBoxButtons.OK,_
MessageBoxlcon.lnformation)
End Sub

Embora no fosse necessrio nesse exemp lo, ad icionamos o comando About do


menu Help para que ele ficasse comp leto. uma rotina simples que cri a uma string
(l inhas 4 a 8) e a exibe para o usurio (li nhas 9 a 12). Em um aplicativo mais avanado, voc teria
um formu lrio s para executar a exibio para o usurio.

ANALISE

Para concluir, a Listagem 17.8 mostra trs rotinas que voc pode adicionar ao apli cativo para
complementar a funcionalidade.
LISTAGEM 17.8

Outro Cdigo para o Apl icativo Note

1 Publ ic Sub NewFile()

Me . txtText. Text " " "


Me.FileName = "Untitled"
4
Me.Oirty " false
5 End 50b
2
3

7 Private Sub txtText_TextChanged{ByVa l sender As System .Object ,


8
ByVal e As System.EventArgs) Hand l es txtText.TextChanged
Me . Oirty = True
9

Usando o .NET Framework

LISTAGEM 17.8

491

Outro Cdigo para o Apl icativo Note (continuao)

10 End Sub
11

12 Private Sub frmNote_C losing{ByVal sender As System ,Object, _


13
ByVal e As System.ComponentModel .CanceIEventArgs) Handles MyBase.Closing
14
If Me.Dirty = l rue lhen
15
If MessageBox.Show(
16
"Voc fez al teraes no arqulVO que serao perdidas. Deseja continuar?",
17
"New File",
MessageBoxButtons.YesNo,
18
MessageBoxlcon.Question, _
19
MessageBoxDefaultButton.Button2)= DialogResult().No Then
20
21
e.Cancel = True
22
End If
23
End lf
24 End Sub

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.

Desenhando com as Classes de Figuras


o Visual Basic .NET (na verdade, o .NET Framework) possui um conj unto sofisticado de ferra
mentas de desenho que o ajudaro a criar linhas, caixas, crculos e outras formas em vi rtualmen
te qualquer superfcie de seus formulrios. Acesse essas ferram entas por meio das classes de
System. Drawi ng e de outros espaos de nome relacionados. As ferramentas fornecem uma ampla
variedade de recursos para desenhar elementos grficos e trabalhar com diversos arquivos de fi
guras. O espao de nome System. Drawi ng contm muitas das classes essenciais que sero neces
srias para qualquer tipo de desenho, inclu indo: Co10r, Brush, Image e outras. Examinaremos
essas classes importantes em breve.
O prximo espao de nome em importncia relacionado s figuras System. Drawi ng. Drawi ng20.
Ele contm as classes referentes ao desenho efetivo das linhas, formas e assi m por diante. Voc
ainda usar mu itas dessas classes nesta lio e sempre que qu iser adicionar formas simples a um
formul rio ou figura.

Examinando as Classes de Figuras


Com um ap licativo Windows aberto, inicie o Pesquisador de Objetos (selecione View, Other
Windows, Object Browser). Encontre o espao de nome System . Drawing e abrao, como vemos
na Figura 17.2. A quantidade total de classes, estruturas e enumeraes pode parecer enorme
primeira vista. No entanto, mu itas dessas classes raramente so usadas. Na verdade, s alguns
itens desse espao de nome devem ser considerados como de conhecimento necessrio. Os mais
importantes entre eles esto descritos na Tabela 17.11.
FIGURA 17.2

O espao de nome
Sys tem. Drawi ng.

Usando o .NET Framework

TABELA 17 .11

493

Classes e Estruturas Importantes do Espao de Nome System.Drawing

Item

Tipo

Descrio

Bi tmap

Classe

o bi tmap que representa uma figura, como os formatos GIF,


BMP o u JPG . Esta classe usada em geral quando se carrega
e trabalha com figuras.

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

A estrutura Calor contm informaes sobre todas as cores


comuns que j possuem uma denominao definida, assim
como pode criar outras novas.

Font

Classe

A classe Font ser usada sempre que voc quiser inserir tex-

to em uma figura.
Graphics

Classe

A mais importante das classes de System.Drawing. Esta a


classe que contm todos os mtodos usados para desenhar
e constitui a superfcie sobre a qual sero feitos os desenhos.

Poe

Classe

Usada no desenho de linhas coloridas.

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

Representa uma rea retangular. Essa rea possu altura e


largura.

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

Controles do Aplicativo Scribble

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

Bitmap fi lesl *bmp IPNG files l*png

Name

dlgSave

File, Open

File, Save

File, Exit

OpenFileDialog

SaveF;leOialog

Usando o .NET Framewo rk

TABELA

11.12

Controle

RadioButton

RadioButton

RadioButton

RadioButton

Pi ctureBox

Panel

Label

ComboBox

495

Contro les do Aplicativo Scribble (continua o)


Propriedade

Valor

DefaultExt

Brnp

Fi 1ename

Scribblel

Fi lter

Bitmap filesl*.bmpIPNG filesl*png

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

Bac kCo 1or

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

Contro les do Aplicativo Scribble (continua o)


Propriedade

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

Usando o .NET Framewo rk

TABELA

11.12

Controle

Numer i cUpOown

Panel

Label

TextBox

Label

OropDown

Label

Numer i CUpOOWIl

Controles do Aplicativo Scribble (continuao)


Propriedade

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

local. No tempo de execuo, s6 um ficar visvel a cada vez. No entanto, isso


pode ser difcil de conseguir na hora da criao. A maneira mais fcil de resolver esse problema trabalhar com eles individualmente. Quando um dos painis estiver concludo, configure a propriedade Location de modo que o painel
fique fora da tela. Configurar a propriedade Left com -10000 um modo simples de fazer isso. Quando todos os trs painis estiverem concludos, configure Location novamente com o valor original deles.

Onde Posso Desenhar?


Voc pode desenhar em quase todos os controles dos formulrios Windows, assim como em
muitos dos controles de formulrios da Web. Isso significa que possvel alterar faci lmente um
dos controles existentes ou apenas adicionar uma figura ou smbolo a quase tudo que fizer parte
de seus programas. Esse recurso ao mesmo tempo til e nex vel, permitindo que se us formulrios e controles sejam personal izados de maneira simples adicionando-se uma figura e um toque
exclusivos a eles.
Sua primeira etapa ao desenhar sem pre ser obter um objeto Graphi C5. Esse objeto pode ser obtido como parte de alguns eventos, como o evento Pai nt, ou por meio do mtodo CreateGraphi C5.
Esse mtodo compartilhado por todos os controles, inclusive por formulrios.
Sempre que o Windows detenninar que precisa redesenhar todos os seus formulrios ou controles, ou apenas parte deles, voc acionar o evento Pa i nt para o item que ser alvo da operao.
Isso acontece quando uma nova janela criada e em qualquer momento em que um formulrio
adic ional for aberto em sua janela. Por exemplo, se voc exibir uma caixa de mensagem, quando
ela for fechada, a parte de seu fonnulrio que fico u embaixo dela ter de ser redesenhada. Como
conseqncia, o evento Paint de todos os controles que ficaram cobertos e do formulrio ser
chamado. O evento Paint de um formu lrio possui a estrutura a seguir:
Pr ivate Sub fnnScribble_Paint(ByVal sender As Objecto
ByVal e As System.Windows.Fonns.PaintEventArgs)
Handles MyBase.Paint
End Sub
Nesse exemplo, o formulrio tem o nome fnnScri bbl e. Como em todos os eventos, so passados
dois objetos - sender e EventArgs. No caso do evento Paint, no recebemos o objeto bsico
EventArgs , mas um dos filhos, Pai ntEven tArgs . Ele possui duas propriedades apenas de leitura:

Usando o .NET Framewo rk

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

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

Public Enum DrawingTools


Pen
Shape
Text
End Enum

7
8
g
10
11
12
13
14

Private m_sFileName As String


Private m_bOrawing As Boolean
Private m_eCurrentTool As OrawingTools
Private
Pr iv ate
Private
Private

oGraphics As System. Orawing .Graphics


oTool As Object
sngX As Single
sngY As Single

15

16
17
18
19

20
21
22
23
24
25
26

Public Property FileName() As String


Get
Return m sFil eName
End Get
Set(ByVal Value As String)
m sF il eName = Value
End Set
End Property

Public Property Orawing() As Boolean


Get

Dia 17

500

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

ENTRADA

(continuao)
27

Return m_bOrawing

28

End Get

29

Set(ByVal Value As Boolea n)

30

31

m_bDrawing

Value

End Set

32
33

End Property

34

Public Property CurrentTool() As DrawingTools

35

36

Get

Return m eCurrentTool

37

End Get

38

Set(ByVal Value As DrawingTools)

39

m eCurrentTool = Value

40

'el imine a ferramenta existente


If Not oTool Is Noth i ng Then

41
42
43
44

45

Clype (o T00 1 lOi sposab 1 e) . Di spose O


End If
End Set

End Property

46

47
48
49
50
51

52
53
54
55
56
57
58
59
60
61

Private Sub frmScribble_Load(ByVal sender As Objecto


ByVal e As System.EventArgs)
Hand l es MyBase.Load
'configure a caixa de combinao de cores
FillListsO

'crie a figura sobre a qual desenharemos


Me.picOraw.lmage = New Bitmap(picOraw.Wi dth,
picOraw.Height, _
System . Orawing.lmaging.PixelFormat.Fo rmat24bppRgb}
Me.oGraphics = Graphics . Fromlmage(Me . picOraw . lmage}
'configure o plano de fundo com a cor branca
Me.oGraphics.Clear(Color.White)
'configure a ferramenta inicial como Pen
optPen_Click(Nothing, Nothing)
End Sub

62

63
64
65
66
67
68
69

Private Sub optPen_Click(ByVal sender As Object ,


ByVal e As System.EventArgs}
Hand l es optPen.Click
'configure a ferramenta como Pen
Me.CurrentTool = DrawingTools . Pen
'ocul te todos os outros painis de ferramentas
pnlPenDptions.Vis ib le = True

Usando o .NET Fram ewo rk

ENTRADA

LISTA GEM 17.9

Propriedades e Cdigo Geral do Aplicativo Scribble

(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

Private Sub optShape~Click(ByVal sender As Objecto


8yVal e As System.EventArgs)
Handles optShape.Click
'configure a ferramenta como Shape
Me . CurrentToo l = OrawingTools.Shape
'oculte todos os outros painis de ferramentas
pnlPenOptions.Visible = False
pnlShapeOptions.Visible = True
pnlTextOptions . Visible = False
End Sub

84

85
86
87
88
89
90
91
92
93
94

Private Sub optText_Click(8yVal sender As Object o


ByVal e As System.EventArgs)
Handles optText.Click
'conf i gure a ferramenta como Text
Me . CurrentTool = OrawingTools . Text
'oculte todos os outros painis de ferramentas
pnlPenOpt i ons.Visible = False
pn l ShapeOptions.Visible = False
pnlTextOptions.Visible = True
End Sub

95

96
97
98
99

100
101
102
103
104
105
106
107
108
109

private Sub Fi l lLists()


With cboCo l ors.ltems
.Add(IBlack")
.Add("'ed"}

.Add("Green")
.Add("Blue")
End Wi th
cboColors.SelectedIndex

With cboShapeType . Items


.Add("Rectangle")
.Add("Ell i pse")
End With
cboShapeType .SelectedIndex

110

111
112

501

With cboTex tFont.Items


.Add("Arial")

Dia 17

502

ENTRADA

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

(continuao)
113

.Add("Times New Roman")

"'
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.

Usando o .NET Framework

o procedimento Fi 11 Li sts (linhas 96 a

503

105) preenche os controles DropDownL i st com vrias

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

Mtodos da Classe System.Orawing.Graphies

Mtodo

Descrio

Clear

Remove todo o contedo do objeto GraphiC$, substituindo-o pela cor


solicitada.

OrawEl1 ipse

Desenha uma elipse ou crculo no objeto Graphi cs usando a ca neta que


for atribuda. Se a altura e a largu ra forem iguais, voc terminar com
um crculo; caso contrrio, ela ser ova l.

Orawl i ne

Desenha uma linha no objeto Graphics usando a caneta atribuida.

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

Escreve um texto no objeto Graphics.

FillEllipse

Preenche uma rea ovalou circular do objeto Graphics usando o pincel


atribudo.

FillRectangle

Preenche uma rea retangular ou quadrada do objeto Graphics usando


o pincel atribudo.

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

Manipu l adores de Evento de PictureBox

Private Sub picOraw_MouseMove(ByVal sender As Object,


ByVal e As System.Windows.Forms.MouseEventArgs)
Handles picOraw .MouseMove
If Me.Drawing lhen

'isso s ser verdadeiro se a ferramenta atual for uma caneta

5
6

oGraphics.DrawLine{oTool. sngX. sngY, e.X, e. Y)

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

Private Sub picOraw_MouseUp(ByVal sender As Object ,


ByVal e As System.Windows.Forms.MouseEventArgs)
Handles picDraw .MouseUp
'agora podemos parar de desenhar
Me. Orawi ng = False

19
20

End Sub

21

Private Sub picOraw_MouseDown(ByVal sender As Objecto

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,

Usando o .NET Framewo rk

CDIGO

45
46
47

LISTAGEM 17.10

Manipuladores de Evento de Pi ctureBox (continuao)

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

As li nhas so desenhadas durante o evento MouseMove de Pi cture80x. S queremos


desenhar a linha se estivermos no modo de desenho; portanto, a primeira etapa testar a propriedade Orawi ng (linha 4). Essa propriedade ser configurada como Tru e posteriormente
no evento MouseDown.

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-

Usando o .NET Framewo rk

pendendo de qual das muitas variantes desse formato seja empregada para armazen los.
A extenso TIF a usada nestes arquivos.

NOTA

Em geral, quando exibimos a figu ra em uma pgina da Web, a sa lvamos no


formato GIF (se tiver menos de 256 cores) oU JPEG. Como alternativa, se voc
salvar a figu ra para usar em um aplicati vo de microcomputador, deve testar todos os formatos para ver qual fornece a melhor combinao de tamanho do arquivo e qualidade para atender suas necessidades. Normalm ent e, o formato
JPEG adequado quando a fi gu ra usa muitas cores (como uma fotografia), enquanto o PNG ou o BMP so interessa ntes para f ig uras mais sim pl es. Como
exemplo, a Tabela 17.14 mostra as dimenses do mesmo bitmap simples salvo em cada um dos formatos.
TABELA 17.14

Comparao dos Formatos de Figuras

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

Private Sub mnuFileNew_Click(ByVa l sende r As System. Object ,


ByVal e As System.EventArgs) Handles mn uFileNew.C lick
Me.oGraphics.Clear(Color .Wh ite )
'force a atualizao
Me.picOraw.Refresh()
End Sub

8
9
10
11
12

Private Sub mnuFileOpen_Click()


lf Me .dlgOpen.ShowDialog = OialogResult .OK Then
Me .picOraw.lmage .From File(Me .dlgOpen.FileName)
End If
End Sub

13

14
15
16
17

Private Sub mnufileSave_Click(ByVal sender As Object ,


ByVal e As System.EventArgs) Handles mnufileSave.Click
Dim sF i leName As String
Dim oFormat As System.Orawing.lmaging.lmageFormat

1B

19
20

'obtenha o nome do arquivo com o qual salvar


lf dlgSave.ShowDia log = OialogResult.OK Then

508

Dia 17

ENTRADA

23
24

25
26
27

28
29

30
31

32
33
35
36
37
38
39
40

Comandos do Menu (continuao)

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

Private Sub mnuFileExit_Click(ByVal sender As System.Object.


ByVal e As System.EventArgs) Handles mnuFileExit.Click
Me . Close()
End Sub

ANLISE

As linhas I a 6 mostram o cdigo do comando New, do menu File. Ele simples;


tudo o que faz apagar o contedo ex istente no objeto oGraphi es, na linha 3, substituindo-o por um novo e adequado plano de fundo branco. Como antes, foramos a atua li zao de
PietureBox (linha 5) para que exiba a figura alterada.
Abrir o arquivo quase to fci l quanto apagar a figura. Na linha 9 do cdigo exibimos a caixa de
dilogo File Open. Se o usurio selecionar um arqu ivo, o carregaremos no objeto lmage de Pi ctureBox. Esse controle determinar o tipo do arquivo e o exibir adequadamente.
Ocd igo necessrio para salvar a figura um pouco mais longo, mas continua simples. Comeamos (l inha 20) exibindo a caixa de dilogo-padro Fi le Save. Depois que o usurio tiver selecionado o local e o tipo do arquivo a ser salvo, poderemos continuar. Para resumirmos as ltimas
linhas, salvamos o nome do arqu ivo selecionado em urna varivel. Nossa caixa de dil ogo solicita ao usurio para selecionar entre dois formatos diferentes de figura - Bitmap ou PNG. Usamos
essa opo na configurao de outra varivel para o formato que empregaremos ao salvar a figura . Por fim , estamos prontos para salv-Ia. Para o caso de uma exceo, como falta de espao em

Usando o .NET Framework

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

no Apndice A, " Respostas dos Testcs/Exercicios".

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")

D. Di m oDi r As New Di rectory


Dim bExists As Boolean " oDir . Exists("algum arquivo")
2. Qual o relacionamento entre as classes St ream, StreamReader e StreamWriter?
3. Que fonnatos de figuras voc pode criar (ou ex ibir em um controle Image)?
4. Qual a dife rena entre Point, Size e Rectangle?

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:

A documentao de seu aplicativo.

O uso do controle do cdigo-fonte.

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.

Documentando Seu Aplicativo


s vezes, quando se cria um sistema, todo o cdigo escrito e distribudo para os usurios, e ningum o v novamente . Essa lima exceo, e no a regra, e provavelmente s ocorre com siste,
mas pequenos. E mais comum que o cdigo seja revisto vrias vezes quando o sistema original
for alterado para a inc luso de recursos e correo de erros, podendo ser usado at mesmo como
base para verses completamente novas do mesmo sistema. Para fazer alteraes e reutili zar seu
cdigo da maneira mais fcil possvel para voc ou o utros programadores, recomendvel documentar seu sistema.
Esse tipo de documentao diferente de registrar o sistema para seus usurios, o que discutirei
posteriormente nesta lio. Ela fornece informaes sobre o funcionamento de seu sistema para

Dia 18

as pessoas que tm acesso ao cdigo e varia amplamente na quantidade de detalhes porque no


h um mtodo exclusivo de document- lo. Um cam inho para se chegar a uma documentao
adequada considerar prime iro o motivo pelo qual essas infonnaes so fornec idas. A documentao ex iste para assegurar que todo o conhecimento sobre um sistema fique registrado - sejam os requisitos da empresa ou a lgica por trs das decises tcnicas - para simplificar a
manuteno por meio de mais informaes dispon veis sobre seu cdigo. A documentao pode
ser divid ida em a lgumas d iretri zes essenciai s (no necessariamente por ordem de importnc ia), e
a primeira no est de maneira alguma ligada documentao:

Crie a soluo mais simples que puder para resolver o problema.

Documente seu sistema com o menor nvel de especu lao possvel.

Use seu tempo de maneira sensata. No comente o bvio; em vez disso, empenhe-se em
esclarecer as parles complexas de seu sistema.

Explicaes detalhadas de seu cdi go sero irrelevantes se no houver uma compreenso


da finalidade geral do sistema. Documente o sistema, cada um de seus componentes e o
cdigo propriamente dito.

Crie Solues Mais Simples


Se o motivo da documentao de seu cdigo for facilitar sua compreenso, no seria melhor
cri-lo da mane ira mais simples possvel desde o in c io? Seu objetivo deve ser um cd igo que
seja inteligvel sem qualquer explicao adicional, e os comentrios devem complement-lo
onde voc no conseguir atingir esse resu ltado. H duas maneiras princi pais dc chegar a isso: escrever um cd igo claro e desenvolver solues simples. Abordarei o conceito de cdigo limpo
primeiro, mas a questo mais sign ificativa decerto a criao de solues sim ples.

Escrevendo um Cdigo Limpo


Considere as Li stagens 18.1 e 18.2, sabendo-se que as duas foram projetadas para executar a
mesma tarefa.
LISTAGEM 18.1

1
2
3
4
5
6
7
8
9
10
11

O Cdigo Pode Ser Mais Comp lexo do Que Necessrio

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

O Cdigo Pode Ser Mais Complexo do Que E Necessrio (continuao)

Dim FileI As New StreamReader(Pathl)


Dim File2 As New StreamWriter(Path2)
Dim x As String
X " File1.Read l ineO
Do Until x Is Nothing
File2.Writeline(x)
X " File1.Read l ineO
loop
File2.CloseO
File1.CloseO
End Sub

23
24 End Module

LISTAGEM 18.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Tornando Seu Cdigo Mai s Fcil de Compreender , Voc Poder Ter


uma Documentao Menor

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

sline " f i le lnput . Readli ne()


Do Until sline Is Nothing
fi leOu tput.Writeline(sline)
sline " filelnput.Readl i neO
loop
fileOutput.CloseO
fileInput.CloseO

24
25

End Sub

26
27

Sub Main()

Dia 18

514

LISTAGEM 18.2

Tornando Seu Cd ig o Ma i s Fcil de Compreender , Voc Poder Ter

uma Documentao Menor (continuao)


28
29

CopyFiles()
End Sub

30
31 End Module

ANALISE

As Listagens 18.1 e 18.2 lem um arquivo e o gravam em outro, porm a segunda


muito mais clara do que o mesmo cdigo na Listagem 18.1. A primeira razo o pr-

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

Os Procedimentos So Outra Manei ra de Faci 1i tar a Compreenso


de Seu Cdi go

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!

Simplificando Seus Sistemas


Criar um cdigo limpo um aspecto da primei ra diretriz, mas no o mais importante . O mais
relevante que a sol uo efetiva gerada, ou seja, como voc decidiu at ingi r os objetivos do sistema, seja a mais simples possvel.

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.

No Comente o bvio. S o Que For Confuso


Esta regra, na verdade, est relacionada intimamente com a prime ira porque quanto mais simples e claro voc puder tornar seu cdigo, menos comentrios sero necessrios. Considere as
Listagens 18.1 e 18.2 e como poderia coment-Ias para assegurar que tenham uma manuteno
fcil. No final , precisar gastar muito mai s tempo comentando o primeiro exemplo, explicando o
significado de variveis como Pathl e Path2, enquanto o segundo exem plo j de alguma
maneira auto-explicativo. Um nome de varivel como sInputFi 1ePath informa tudo que prec iso saber, sem ser necessrio ad ic ionar qualquer comentrio. O uso da notao hngara, abordada
posterionnente nesta lio, junto a nomes signi ficativos para as variveis fornece at infonnaes adicionais, permitindo saber que, nesse caso, trata-se de uma varivel string e reduzindo
tambm a necess idade de comentrios .

Documente o Sistema. e No Apenas o Seu Cdigo


A questo final de nossos princpios gerais de documentao que voc precisa sem pre se concentrar no objetivo, que facil itar a outras pessoas a compreens,10 de seu sistema. Documentar
cada varivel com detalhes e cada lao no me ajudar a entender seu sistema se eu no souber
qual a s ua finalidade. Fornea uma documentao com vrios nveis dist intos, desde a abordagem e escopo originais por trs do sistema at os detalhes de cada linha de cdigo. Os d iferentes
trechos de uma documentao que deveriam estar disponveis sobre um sistema incluem os descritos a seguir:

Abordagem/escopo

Requi sitos/situao na qual util iz-lo

Projeto detalhado

Algum modo de solicitao de um histrico/alteraes do sistema

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.

Requisitos e Situaes em Que Ser Utilizado


A documentao sobre os requisitos e a utilizao pode ser feita em separado ou em conjunto.
Independentemente de sua escolha, a mesma finalidade ser atendida.

Dia 18

Os requisitos de um sistema documentam as funes individuais que os usurios executaro com


ele, e as situaes em que ser utilizado tentam descrever interaes representativas que acontecero com o seu uso. Cada um fornece uma listagem de funes que o sistema tem de real izar e
pretende passar uma idia de como essas funes devem func ionar. Esses documentos disponibil izam uma viso geral do aplicativo do ponto de vista do usurio, mas ser prec iso procurar informaes adicionais sobre como o sistema executa realmente essas funes.

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 .

Melhores Prticas e Padres de Codificao


Quando se trata da documentao de seu cdigo, haver algumas ' prticas mais adequadas' que
vale a pena usar ou pelo menos considerar. A primeira estabelecer um conjunto de padres comuns (comuns pelo menos para sua equipe) para nomear variveis, controles e objetos. A segunda fornecer blocos de cabealho em seu cdigo - comentrios no inc io dos mdulos, classes e
procedimentos que usem um formato comum e d isponibilizem informaes sobre esse cdigo
em um nico local. Abordarei cada uma delas e descreverei alguns exemplos de como manipul-Ias dentro de sua equipe.

Retoques Finais

519

Nomeao de Variveis, Controles e Objetos


A questo mais importante com relao ao modo de nomeao que ele tem de ser um padro;
todas as pessoas de sua equipe precisam usar as mesmas convenes de nomeao sem exceo.
Na verdade, a nomeao deve ser apenas uma parte de um documento maior que detalhe os comentrios, a manipulao de excees, o controle do cdigo-fonte e mais - tudo que o desenvolvedor precisar saber para funcionar como parte de sua equipe. Se voc puder fazer com que
todos empreguem seu padro de nomeao, o estabelecimento efetivo desse padro ser uma facilidade.
A notao hngara urna manei ra de nomear, abordada de modo resumido anteriormente nesta
lio, que lisa prefixos para fornecer infonnaes sobre a varivel, controle aLi objeto. Esses prefixos so compostos de uma ou mais letras e so projetados para representar pelo menos o tipo de
dado e s vezes tambm o escopo do objeto retirado. Em meu cdigo, emprego um conjunto bem
simples de convenes de nomeao que evoluram para um conjunto de convenes que realmente utilizo. Aprofundarei minha abordagem das convenes, mas h algumas diretrizes gerais
para discutir antes .

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!

Em todos os exemplos de nomeao a seguir allerno maisculas e minsculas, onde o prefixo


fica em minsculas e o nome da varivel em maisculas, produzindo nomes mais legveis.

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

TABELA 18.1 Prefixos de Tipos de Dados Comuns


Tipo de Dado

Notao Hngara

String

S [str]

I nteger (Intei ro). I nt32

I [int]

Double (Duplo)

Ob1

Single (Simples)

sng [f (para flutuante, um tipo da C++)]

Long (Longo), Int64

L [I ng]

Soolean (Sooleano)

S [bool]

Date/Time (Data/Hora)

dt

Sys tem. Da ta. DataSet

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

btn [cmd (em verses anteriores ao VB.NET)]

Ttulo (la bel)

lb1

Caixa de texto

t,t

Caixa de lista (List Box)

lb

Caixa de combinao
Botes de opo

'pt

Caixas de seleo (Check Boxes)

<h k

Grade de dados

dg

Itens de menu

Retoq ues Finais

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):

Nome (da classe)


Dependncias (referncias requeridas por essa classe, oul ras classes, requisitos do sistema como o SQL Server)
Fi nalidade
Autor (em geral o autor original)

Quem editou pela ltima vez


Data da ltima edio
Comentrios (observaes sobre problemas, erros encontrados e corrigidos, qualquer
item que no seja especfico de uma linha dentro da classe e que valha a pena ressaltar)
A Listagem 18.4 mostra um exemplo de um bloco de comentrio de uma classe.
LISTAGEM

1
2
3
4
5
6
7
8

10
11
12
13
14

18.4

Blocos de Comentrio Consistentes Valem o Esforo

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

No bloco de comentrio de um procedimento, incluo um conjunto um pouco diferente de informaes :

522

Dia 18

Nome (do procedimento)

Dependncias (referncias requeridas por essa sub-rotina ou funo, outras classes, requisi tos do sistema como o SQL Server)

Finalidade

Autor (em geral o autor original)

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)

Quem editou pela ltima vez

Data da lJltima edio

Comentrios (observaes sobre problemas, erros encontrados e corrigidos, qualquer


item que no seja especfico de uma linha dentro do procedimento e que valha a pena ressaltar)

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.

Usando o Controle do Cdigo-fonte


o cdigo-fonte que voc criar ser valioso; ele representa o resultado de seu esforo e a base
para trabalhos futuros. Tanto antes do desenvolvimento quanto depois do fato consumado, preciso encontrar uma maneira de annazenar seu cdigo. Os requisitos principais para armazenar
esse cdigo so que ele esteja seguro e as alteraes fiquem registradas de modo que seja possvel comparar duas verses diferentes. No Visual Studio .NET, so fornecidos recursos para o
acesso a um sistema de controle do cdigo-fonte, e o que a Microsoft disponibiliza essencialmente o mesmo que foi includo no Visual Studio 6.0, o Visual SourceSafe (VSS) 6.0c.
Para ativaro suporte ao VSS na platafonna .NET, apenas instale o servidor e o cliente (ou apenas
o cliente, pressupondo que um serv idor j exista em algum outro local) em sua m{lquina, e seriio
at ivados os comandos do menu apropriado no Vis ual St udio .NET. Nesta seo, percorrerei os
aspectos bsicos do uso do controle do cdigo-fonte, abordando como introduzir e extrair um
cdigo desse sistema, e como retornar uma alterao anterior.

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

Recuperando uma Pgi na da Web

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

As identificaes e senhas do usurio so necessrias no Visual Source Safe, e


voc pode configur-Ias executando o programa Administrator na pasta Visual
Source Safe do menu Prog rams. Por enquanto, se for solicitado a inserir uma
identificao de usurio ou senha, use apenas Admin e um espao em branco
para a senha (que esto configurados como o padro),

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

Voc pode criar lima


hierarquia comple/a
para armazel/ar seus
proje/os com base lias
calegorias que queira
IIsar.

(f;

~I

R
"
1_

. '0

........... """Hl:1

-I
-I

-"'::' Q.. ,lf

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

Voc pode e.tlrai,.


i IIdil'idualmenle

qualquer arquivo com


qual de.~eje trabalhar,

(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

. _,"""''''''''-'''''' _ _ 1_1 '>lI...........

,,(.lEI

FIGURA 18.7

O Solmioll E.xplorer

indicar se

111/1

orqllil'o

esl arma=ellado 011


lio. depois qlle WJc

opiar por IIsor

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

alteraes que f e=.


<

fI'_'"''''
fI'_''''''...

1/'''''''''
." '0" .
1/'CW2OD' t,"""

...

.,""" - . . _ _ ...... "",IA .... _ .

r _ ..... .......,

. 4 ~ --..

Dia 18

528

Visualizando e Retornando Suas Alteraes


Agora, com seus arquivos armazenados novamente, voc pode manipular alguns dos recursos
mais avanados da util izao do controle de cdigo-fonte. O primeiro que voc poder testar a
visualizao do histrico de um arquivo, exibindo cada inc luso/extrao em que alteraes foram
reitas. Selecione o mdulo no Solution Explorer e, em seguida, selecione File, Source Control e
History no menu. Isso far com que voc possa configurar a listagem do histrico, mas apenas
dar um clique em OK trar uma listagem das verses disponveis desse arquivo (veja a Figura
18.9).
FIGURA 18.9

Toda I'e= que voc


inclllir 1I01'01/lel/le 1111/

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

O SOIll"Ce Safe pode


forllecer /111/(/ iI/te/face
visual para delalhar as
alteraes ellfre uma
verso e Olllra. Isso
10/"lla fcil locallt" a
origem de I/m problema
em lima rersiio
especifica.

Consideraes sobre Segurana no Uso do Visual Source


Safe

o usurio que armazenou


o arquivo aparecer na caixa de dilogo History, e nesse caso ele ser
,
sempre' Admi n'. E importante que todos se conectem com seu prprio nome de modo que voc
possa saber quem fez quais alteraes cm seu cdigo-fonte e para que as senhas sejam configuradas a fim de que ningum possa fazer alteraes usando o nome de outra pessoa. O Visual Source Safe no parece poder ser integrado segurana do Windows 20001NT, mas possvel
contornar isso criando usurios com os mesmos nomes das identificaes de seus desenvolvedores na rede e fazendo-os us-Ias quando se conectarem ao VSS. Utilizando a interface do Visual
Source Safe, podemos configurar a segurana no nvel do projeto COm base na identificao de
logon do usurio, o que permite limitar o acesso a um projeto quando necessrio.

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.

O desenvolvimento de um programa de instalao no Windows.

As opes de distribuio de um programa de instalao.

A plataforma .NET conseguiu reduzir bastante as dificu ldades relacionadas im plantao de


aplicativos, mas esse ainda um processo necessrio e geralmente mais complicado do que parece.

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-

rentes e suas dependncias individualmente, um mdulo de intercalao foi fornecido.


Novo TERMO

o mdulo de intercalalio um arquivo (mico que representa essencialmente todo

um programa de instalao, podendo ser includo corno parte de sua im plantao. Os


mdulos de intercalao (que so annazenados como arq uivos .msm em disco) so uma maneira
excelente de empacotar todas as configuraes, dependncias e arquivos necessrios para uma biblioteca ou aplicativo. Voc pode criar seus prprios mdulos de intercalao, se j tiver uma bi blioteca ou outro projeto que geralmente includo em outras insta laes, mas o Visual $tudio
.NET possui muitos desses arquivos M$M prontos para serem usados. Esses mdulos de intercalao, armazenados em \Program Files\ColllTlom Files\Merge Modul es\, incluem as partes do
.NET Framework necessrias para implantar seu aplicativo em oUlra mquina.

Antes da plataforma .NET, a instalao quase sempre envolvia o registro de componentes do


COM, o que sign ifi cava a criao de entradas no registro do sistema para esses componentes de
modo que eles pudessem ser encontrados e gerados pelos aplicativos que quisessem us-los. Na
platafonna. NET, essa necessidade de alterar o registro para instalar um apl icativo foi removida;
todas as configuraes e metadados sobre um aplicativo ou componente (como uma biblioteca
de classes) so armazenados dentro do prprio arquivo ou como arquivos adicionais no mesmo
diretrio. Essa eliminao do registro permite instal aes' X-Copy'. em que os apl icativos podem ser completamente instalados apenas por meio da cpia dos arqu ivos de uma mquina para
outra.
Com isso em mente, a necessidade de criar uma instalao real no fica muito clara. Em geral ,
instalar um apl icativo significa mais do que apenas conseguir que ele seja executado na mquina
de desti no: preci sam ser criados cones na rea de trabalho e no menu Iniciar, dependncias
como o .NET Framework tm de ser instaladas, uma opo de desinstalao precisa ser fornecida e, s vezes, at entradas no registro para as configuraes do apl icativo tm de ser criadas. Todas essas aes, recursos comuns que podem fazer parte da instalao de muitos aplicativos,
ficam di sponive is com a criao de um programa completo de instalao.
No Visual Studio .NET, a implantao manipulada pela criao de arq uivos do Windows
lnstal ler. O Windows Insta ller uma maneira relativamente nova de tecnologia de instalao
que tem um suporte maior do sistema operacional e est em uso por muitos produtos, inclusive o
prprio Visual Studio .NET, o Microsoft Office e muitos outros. suficiente dizer que ao em-

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.

Criando uma Instalao Simples


Pararei de falar sobre implantao e o cond uzi rei pela criao da instalao bsica de um aplicativo simples. A fim de que esse seja um exemplo perreito, voc precisa de mai s uma mqu ina
(sem ser a que tem o ambiente .NET instalado), de prefernc ia que no possua a plataforma
.NET. Essa segunda mquina, se houver, deve ser conectada a uma primei ra rede, ou ser necessrio algum outro meio de transferi r arquivos grandes, como um gravador de C Ds. Porm, se s
houver uma mquina, o processo tam bm poder ser executado, mas a demonstrao no estar
to prxima da realidade em que so processados os programas reais de im plantao.
O objetivo deste exemplo criar um aplicativo .NET sim ples, sem que seu contedo real tenha
alguma importncia. No entanto, voc j le u neste livro que no criaramos nenhum ap li cativo
do ti po ' heli o world! ' como verso de demonstrao. Com isso em mente, precisamos gerar um
apl icativo real para desenvolver nosso exemplo a partir de le. Entretanto, a simplicidade ainda o
objetivo, de modo que usaremos apenas um formu lrio conectado a um banco de dados do SQL
Server e que exi ba uma li sta de autores (do banco de dados Pubs do exemplo). Isso ser fe ito em
apenas um formu lrio, o que no a melhor maneira de escrever um aplicati vo para uso no mundo real, mas queremos manter o exem plo sim pl es e desenvolveremos outro mais apropriado um
pouco mais ad iante nesta lio. Abordarei o cdigo brevemente; para obter mai s detalhes, retorne ao Dia 12, " A cessando Dados com a Plataforma .NET", no qual encontrar uma abordagem
do trabalho com bancos de dados e classes System . Data.

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.

Crie o Projeto e a Soluo


Se voc estiver com urna so luo aberta, selecione Fil e e Close Solution no menu para fech- Ia.
Agora, sem nada aberto, selecione New e Project no menu File. Aparecer a caixa de dilogo
New Project; selecione a pasta Visual Basic Proj ects e o modelo de projeto Windows Applicat ion. A seguir, certifique-se de que a verso completa dessa caixa de di logo foi exibida dando um

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.

Configure o Novo Formulrio


No projeto do apl icativo Windows, um novo formulrio ter sido criado por padro, com o nome
Fonnl. Renomeie esse formulrio com fnnDi spl ayAuthors que mais explicat ivo e, em seguida,
adic ione um controle caixa de lista ao, at ento, formu lrio vazio. Configure o nome da nova
caixa de lista como 1 bAuthors, sua propriedade Dock como Fi 11 , e Integ ra1Hei ght como Fa 1se.
Essas configuraes criaro uma grade de dados que abranger todo o formulrio, mesmo se ele
for redimensionado pelo usurio. A configura,10 de Integral Height exclusiva para caixas de
lista e determina se o controle deve ser sempre dimensionado como um m ltiplo da altura de um
nico item da lista, de modo que nenhum item parcial dela fi que visvel. Se voc no con fi gurar
Integra 1 Height como Fal se, a caixa de lista nem sempre preencher toda a altura do formulrio,
o que no d uma aparncia muito adequada.

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

Publ ic Sub New()


My8ase.New()
'Esta chamada requisitada pelo criador do fonnu l rio Windows .
InitializeComponent()

7
8
9

10

'Adicione o que tiver de ser inicializado depois da chamada


'InitializeComponent()
LoadAuthors O
End Sub

Implantando Seu Aplicativo

LISTAGEM 19. 1

Adicionando o Cdigo

535

Sub- rotina New de Seu Formulrio

(continuao)
11
12
13
14
15
16
17
18
19
20
21

Private Sub LoadAuthors()


Dim sConnectionString As String
sConnectionString" "Da ta Source"(1ocal):" &
"Initial Catalo9"Pubs;" &_
"User ID"sa ;password"danee l "
Dim connPubs As New SqlConnection(sConnectionStrin9)
Dim cmdAuthors As New SqlCommand(_
"Select au fname +' '+ au lname as Name from Authors",
connPubs)
Dim daAuthors As New SqlDataAdapter(cmdAuthors)
Dim dsAuthors As New DataSet("Authors")

22
23
24

connPubs.Open()
daAuthors. Fi 11 (dsAuthors, "Authors")

25
26
27
28

l bAuthors.DataSource " dsAuthors .Tables(O). DefaultView


lbAut hors.DisplayMember " "Name "
End Sub

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.

Adicionando o Projeto de Instalao


No VS.NET, adicione os projetos de instalao soluo que possua um ou mais projetas que
voc queira impl antar. Nesse caso, s temos um projeto que produzir um arquivo .exe, e o resultado final precisa ser a instalao desse arq ui vo na mquina de destino. A fim de desenvolver
uma instalao para esse apl icativo, adicione um novo projeto soluo atual (selecionando
File, Add Projete e New Project no menu) e selec ione o Setup Wizard (veja a Figura 19. 1) porque esse um bom ponto de part ida.
Quando voc adicionar esse projeto, ele iniciar automaticamente o assistente (veja a Figura 19.2).
Esse assistente tem conhecimento dc que faz parte de uma so luo e suas opes so baseadas
nos projetos disponveis nela. A configurao-padro para o tipo de instalador (veja a Figura
19.3) criar uma instalao para um aplicat ivo Windows, e isso que voc quer usar neste
exemplo. Na prxima tela (veja a Figura 19.4) sero exibidas as opes as quais o se u programa
de insta lao ir implantar e aquelas que refletem as vrias partes disponveis de outros projetos
dessa soluo. Neste exemplo, queremos implantar a opo de sada (resultado) de nosso aplicativo Windows sim ples, que um arquivo .exe neste caso, mas tambm poderamos usar o insta-

Impl a nta nd o Seu Aplicativo

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.

Welcome tolhe Setup Project


Wilard

.....,- ....." .._ "' ..... -!~

_ _ " " .... ......"Iho_oI_

~-_

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-""""._ .. -",,,,,,,,,,,-_
r- c.. .... >l> 'Lldoblo CAt Ilt

,r ,. 11

538

Dia 19

FIGURA 19.4

Chao .. projKl CJoJtpul. 1 0 _

Os resultados de 1/111
projeto s(io
conseqiincia de seu
de.~enl'oll'illlel1lo.
1/111

arquivo .exe

y", ,"" ... !.Oe ........ _ _ _ ,

.........

"""."""'_!J'_oIo ... _"_

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.., '"*'

P,," ,...... "",._ ,,"" _

.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,

Im plantando Seu Aplicativo

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

mquina de destino em geral se refere mquina que executar o


aplicativo e que precisar de seus arquivos instalados nela. O alvo fica bem
claro quando falamos em aplicativos Windows - as mquinas de todos os
usurios -, mas lembre-se de que pa ra os aplicativos da Web (formul rios da
Web, por exemplo), a mquina de destino o servidor Web, e no a do usurio
final.

540

Dia 19

FIGURA 19.7

Se I'oc lio estireI'


certo de que \'erslo (se

' 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

Impl a nta nd o Seu Aplicativo

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

Usando um Arquivo de Configurao para Tornar Seu Cdigo Mais


Flexvel

Pr iv ate Sub LoadAuthors()


Oim sConnectionString As String
sConnectionString =o "Da ta Source=o" & GetServerNameO & " . " &
"Initial Catalog=Pubs i " &
"User ro"'sa i password"danee I "
Oim connPubs As New SqlConnection(sConnectionStr i ng)
Oim cmdAuthors As New SqICommand(_
"Select au fname +
+au Iname as Name from Authors " ,
connPubs)
Oim daAutho r s As New SqlDataAdapter(cmdAuthors)
Oim dsAutho r s As New DataSet("Authors")
I

connPubs .Open()
daAuthors. Fi II (dsAuthors, "Authors")

Dia 19

LISTAGEM 19.2

Usando um Arquivo de Configurao para Tornar Seu Cdigo Mais


Flexvel (continuao)

15

16
17
18

lbAuthors.DataSource = dsAuthors .Tables(O).DefaultView


1bAuthors. Di sp 1ayMember = "Name"
End Sub

19

20
21
22
23
24
25

Private Function GetServerName()As String


Dim sServerName As String
sServerName =Confi gura t i on. Confi gura t i onSett i ngs . AppSet t i ngs. Get (" Server")
Return sServerName
End Function

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

Implantaes de Mltiplos Projetos


o aplicativo de exemplo criado nesta li o se encontrava completamente dentro de um nico
projeto, mas comum o desenvolvimento de sistemas em que alguns recursos do ap li cativo so
colocados em um ou mais componentes diferentes. Quando voc desenvolver esses sistemas no
Visual SlUdio .NET, em geral ler todos os projetas envolvidos (pelo menos os que estiverem
sob seu controle ou de sua equipe) como parte da mesma soluo. Em lima situao dessas, as
opes apresentadas pelo Setup Wizard sero diferentes porque ele no consegue definir exatamente que projeto o apl icativo ' principal'.
Para i Iustrar essa questo, dividirei aquele apl icativo individual em do is projetos, removendo o
cd igo de acesso a dados do primeiro e inserindo-o em uma bibl ioteca de cd igos separada. O
cd igo, como est agora, mostrado na Listagem 19.2 e se encontra encapsulado na sub-rotina
LoadAuthors. Adicione um novo projeto so luo aluaI, urna bibl ioteca de classes do Visual Basic, e d a ele o nome PubsDataAccess. Esse novo projeto ter um nico arquivo de classes, que
no incio estar basicamente vazio e ser chamado de Cl assl . vb. Renomeie o arquivo e a prpria
classe para GetAuthors (GetAut hors.vb para o nome do arquivo) e, em seguida, subst itua seu
contedo pelo cd igo da Listagem 19.3.

Implantando Seu Aplicativo


LISTAGEM 19.3

543

Usando uma Classe Separada para Isolar Seu Cdigo de Acesso a


Dados

1 Option Explicit On
2 Option Strict On
3

4 Imports System
5 Imports System.Data
6 Imports System.Data.SqlClient
7

8 Public Class GetAuthors


9
10
Pub1ic Function Authorlist(ByVa1 sServerName As String) As DataSet
11
Dim sConnectionString As String
12
sConnectionString = "Data Source=" & sServerName & ";" &
13
"Initia l Cata l o9=Pubs ; " &
14
"User IO=sa ;password=daneel"
15
Dim connPubs As New SqlCo nnection(sConnectionStr i ng)
16
Dim cmdAuthors As New Sq1Command(_
17
"Sel ect au fname +
+ au lname as Name from Authors".
18
connPubs)
19
Oim daAuthors As New SqlOataAdapter(cmdAuthors)
20
Dim dsAuthors As New DataSet("Authors")
I

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

Adicionando o Cdigo para Carregar os Valores em Seu Apl i cativo

1 Oim sServerName As String


2 Private Sub LoadAuthors()
Oim dsAuthors As OataSet
3
4
Oim objOA As New PubsOataAccess.GetAuthors()
5
6
dsAuthors" objOA.Authorlist(sServerName)
7

8
lbAuthors.OataSource " dsAuthors.Tables(O) . OefaultView
IbAuthors.OisplayMember" "Name"
9
lO:End Sub
11

12
13
14
15
16

Private Sub frmOisplayAuthors_Load


(ByVal sender As System.Object .
ByVal e As System . EventArgs)
Handles MyBase.Load
sServerName "
Confi gura t i on. Confi gura t i onSet t ; ngs. AppSet t i ngs. Get ("Server")
17 End Sub

FIGURA

19.8

A g uia Projects permile


que voc referencie
direlamellle Olllros
projetas de sua so!u(io,
01/

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

Im p lanta nd o Seu Aplicativo

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

Choo p ' Djod .... poh . o . -

Quando desenvolvemos
//fIlO instalao em 111110
solll(;o com mais de
um projeto (excluindo a
prpria insta/a(io).

Voo , .... _

..... _

WN.< _ _ " " " " ' ' ' _ odhon.

............ _

.. _ 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

R Os recursos de instalao fomecidos pelo VS .NET so excelentes, mas eles abrangem


apenas as necessidades bs icas de um programa de instalao. Embora haja mais recursos nos projetas de instalao do VS .NET do que mostrei nesta lio, para conseguir todos os recursos disponveis na tecnologia Windows Insta ller. ser preferve l que voc
trabalhe com um programa de instalao de oulros fornecedores como o Install Shield
(http:\ \www . i ns ta 11 shi e 1d . com) ou o Wise Jnstaller (ht tp: / jwww . wisesol ut i 011 . com) .
P Achei que no iria ter de escrever programas de instalao com a plataforma .NET.

Achei que pudesse apenas usar um comando XCOPY.


R Isso verdade, voc no tem de criar um programa de instalao para seu aplicativo, apenas copiar seu diretrio deve fornecer a funcional idade de que precisa. Mas a instalao
do .NET Framework um pouco ma is complexa e ser necessria em muitas mquinas
antes que seu aplicativo possa ser executado. Alm di sso, um arquivo .bat executando
um comando XCOPY deve funcionar, mas uma instalao grfica com caixas de dilogo
e outras opes urna escolha muito mai s profi ssional para mostrar a seus usurios.

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

VII/a dala a ser


lembrada,
Aprilll. 197'0

Devemos identilicar o comeo de uma seo de informaes com um marcador.

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 tambm deve ter algumas informaes, no importando se forem resumidas,


sobre os dados conti dos.

Devemos identi fi car o trmino das informaes com outro marcador.

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.

O resultado final pode se parecer muito com o descrito a segui r:


<strong>Apri 1 22, 1970<{s trong>

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:

A XM L deve ser simples de usar na Internet.

Deve dar suporte a urna ampla variedade de aplicat ivos.

Deve ser compatve l com a SGML.

Deve fac il itar a criao de programas que processem documentos XML.

A quantidade de recursos opcionais da XML deve ser mantida em um mnimo rigoroso,


cujo ideal seria nenhum.

Os documentos XML devem ser sufic ientemente claros e de fcil leitura pe las pessoas.

O projeto XM L deve ficar pronto rapidamente.

O projeto que usar XML deve ser formal e conciso.

Os documentos XML devem ser fcei s de criar.

A abreviao na marcao XML tem uma importncia mnima.

Portanto, isso o que a XML. E aqueles mal-entendidos mencionados anteriormente? Parece


haver muitos deles. Vrios surgi ram pela maneira com que diversos departamentos de marketing
promoveram o uso que sua empresa fazia da XM.L ; outros foram causados pelos escritores que
passaram para as pessoas idias estranhas sobre ela, mas claro que no sou um deles .
Os pri ncipais mal-entendidos que vejo com freqncia so

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

Um elemento O bloco de construo fundamental de todo arquivo XML. Ele composto de


LIma tag inicial, da uma tag de fechamento e do contedo entre elas. Como exemplo, h trs ele-

mentos na XML a seguir:


<identificao funcionrio="l">
<primei ronome>John<jprimei ronome>
<sobrenome>Bul1 <jsobrenome>
<j func ion rio>
Um elemento funcionrio. O elemento funcionrio comea com a tag funcionrio funcionrio, tennina com a tag de fechamento funcionrio /func ionrio e contm as duas outras
tags, <primei ronome> e <sobrenome>. O elemento primeiro nome comea com a tag <primei ronome>, tennina com a tag de fechamento <jprimei ronome> e contm o texto John.
Os e lementos definem dois ' itens' importantes do arquivo XML. claro que a XML anterior
descreve o funcionrio de uma empresa e que e le tem um primeiro nome e um sobrenome. Para
associar isso s lies dos captulos passados - os elementos so semelhantes aos objetos e propriedades que examinamos no Dia 7, "Trabalhando com Objetos". Esse exemplo poderia descrever um objeto funcionrio que possui duas propriedades.

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

A comunidade XMl se divide em duas faces. De um lado esto as pessoas


que sugerem que devemos usar os elementos em todos os locais. Todos os
trechos de informaes devem ser elementos contidos dentro de outros elementos. Essa lgica em geral pode ser resumida como Ao mesmo tempo que
pode se parecer com uma propriedade agora, posteriormente voc pode precisar ter algo como uma propriedade dela u Por exemplo, considere que ainda
precisemos dividir uma propriedade, que represente um endereo, em propriedades como rua, cidade e cdigo postal. Essas pessoas que acham que
'no existe nada a no ser elementos' definiriam nosso exemplo do funcionrio John Buli usando o trecho XMl a segui r:
U

<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 '"""" _

,." . ~g i:l :l~ll\i ;:- .p - o.

I ".q~ 'EJ

tIOI>

, '_
~

.~

., - ., -,
~

"

'

.....

,"

~
~

A .. _n

I
o

II

FIGURA

20.3

O Imellisellse e a X HL.

< p . . . . " ,tioo . . , . .. . . <. .

.... ... u

'fi' ...'" , ,0<.'0..0." pt '00, ~. >

do_"O ""' , 1.<,.0<-.>

<., .......O</d' . ......,

'''''0_>1 ,lO)

..

<.1""0_'

<10"'''''''.'''' " .... "''' v ..,,, 00..../ .... """,, ....


"'0'1 ... " ,.

<... ,

,<
<"" . ..
~
~,-

D'"

0_

~.

556

Dia 20

Trabalhando com a XML


Agora que voc possu i uma compreenso geral do que seria na verdade esse monstro chamado
XML, como poder us-lo em seus aplicativos? A XML nexvel em sua utilizao. H muitas
aplicaes possveis, mas as mais comuns so:

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:

O Document Objecl Model

Objetos de leitura e de gravao

o Document Object Model


O Document Object Model (DOM) uma maneira desajeitada de dizer ' a forma-padro de ler e
criar XML ', mas isso que ele . O DOM representa a interface de programao-padro recomendada pelo World Wide Web Consortium (www.w3.org)parasetrabal har com XML. Essa a
mesma organizao que padronizou a XML e todas as tecnologias relacionadas com ela. Existe
uma verso do DOM disponvel nos sistemas operacionais mais populares, que pode ser uti lizada pela maioria das linguagens de programao, inclusive o Visual Basic .NET. Ela uma
Application Programming Interface (A Pl) para consultas a arquivos XML.

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

<?xml version ""1.0"?>


<identificao cliente""12345">
<data ordem""O l /0 4/01">
<itens>
<i tem>
<identificaoitem>foo</identificaoitem>
<quantidade>100</quantidade>
<I item>
<item>
<identificaoitem>bar</identificaoitem>
<quantidade>I</quantidade>
<Ii tem>
<Ii tens>
</ordem>
<I cliente>
H duas maneiras de exami nar qualquer um dos ns de um DOM. De certo modo, todos so ns.
No entanto, tambm so tipos especficos de ns. Por exemplo, o n ordem representa um n de
elemento, enquanto o n data um n de atributo. Cada tipo de n d suporte a todos os recursos
de um n genrico, assim como a mtodos e propriedades especficos de seulipo. A Tabela 20 . 1
descreve os tipos de n mais usados.

Dia 20

TABELa

20.1 Ns Mais Usados em Arquivos XML

Tipo de N

Descrio

Xml El ement

Representa um elemento de um arquivo XMl.

XmlAttribute

Representa um atributo de um arqu ivo XMl.

Xml00cument

Representa o documento como um todo.

XmlCollIDent

Representa um comen trio de um arquivo XML. Os comentrios em


XM l comeam com <I .. e terminam com - o>.

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

Propri edades e Mtodos Comuns a Todos os Ns XMl

Descrio
Propriedades

Attributes

Conj unto de t odos os atributos desse n . Permite a navegao pela


lista de atributos em cada nvel da h ierarquia.

ChildNodes

Conjunto de todos os ns-filhos desse n. Essa uma das manei ras


principais de navegar pelo DOM, percorrendo os fil hos com um lao
For ... Next.

FirstChild

Retorna o primeiro n-filho do n atua l. Essa outra das principais


maneiras de navegar pelo DOM, encontra ndo o pri meiro nfilho e,
em seguida, executando um lao enquanto NextSibling (discutido
posteriormente nesta tabela) retorna um valor.

InnerText

O texto contido dentro de cada n . A se inclui qualquer n-fi lho que


ele possua.

Name

O texto existente nos colchetes angulares do n atual.

NextSibling

Retorna o prximo n disponvel no mesmo nvel do atual. Por


exemplo, na Figura 20.4, se o n atual estivesse armazenado na varivel oNode e apontando para o n i tem, e voc chamasse oNode" oNode.NextSibl ing, oNode seria apontado para o prximo n item.

NodeType

Retorna o t ipo do n atual- por exemplo, Xml Element, XmlAttri bute e


assim po r diante.
Mtodos

AppendChi 1d

Adiciona um novo filho ao n atua l. assim que possvel estender


um conjunto de ns existente.

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

e Propriedades de Xml Document


Descrio
Propriedades

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

Semelhante a CreateNode; no entan to, CreateEl ement usado


para criar elementos.

CreateAttribute

Semelhante a CreateNode; no entanto, CreateAttribute usado


pa ra criar atribut os.

Load

Ca rrega o contedo do arquivo

LoadXml

Ca rr ega em um documento o contedo de uma string que con-

XML em

um documento_

tm XML.
Save

Sa lva o contedo do documento

XML em

um arquivo.

Ao usar XmlDocument e o DOM para ler XM L, voc em geral em pregar ChildNodes ou


Fi rstChi 1djNextSi bl i ng para percorr-la e encontrar os ns nos quais estiver interessado_ Ut il izar o DOM pode dar um pouco de trabalho porque s o n Xml Document capaz de criar os vrios
elementos, atributos e ass im por diante. Depois que o n especfi co for criado, ser possvel adicion-lo ao conjunto desejado com o mtodo AppendChi 1d.
O DOM uma maneira-padro de ler e criar arq uivos XML Em geral, ele til quando se trabalha com arqu ivos que so relat ivamente pequenos.

Objetos de Leitura e de Gravao


Embora o DOM seja uma mane ira poderosa de ler e criar XML, na verdade apresenta vrias limitaes. A mais significativa delas que quando se carrega um documento XML no DOM,
esse documento tem de ser carregado integralmente na memria. Nesse momento, o DOM constri a rvore inteira descrevendo o documento, com todos os ns, li stas de ns e assim por diante.
Como voc deve ter deduzido, se o arquivo XM L ror grande, isso poder ocupar muita memria.

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.

No entanto h uma desvantagem em se trabalhar com XmlTextReader e XmlTextWri ter. J que


eles no armazenam o documento integral na memria, s vezes pode se tornar dificil relacionar
uma parte de le com a outra. Se voc precisar manter o registro de vrias partes do documento e
ainda usar XmlTextReader e Xml TextWriter, ter de escrever um cdigo para fazer isso.
Por meio de Xml TextReader, voc pode ler o arquivo executando um lao com o mtodo Rea d, parando em cada n do documento XML. A seguir, decida se est interessado no n atual e, caso
esteja, aplique a ele as outras propriedades e mtodos. A Tabela 20 .4 mostra alguns dos mtodos
e propriedades de XmlTextReader mais usados .

TABElA 20.4 Propriedades e Mtodos Comuns de Xml TextReader


Membro

Descrio
Propriedades

Name

Nome do n atual.

NodeType

o tipo de n atual - se elemento, atributo e assim por diante.


Mt odos

Read

L o prximo n do documento XMl. Acada vez que este mtodo


chamado, ele passa para o prximo n.

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

Usada para configurar se a XML resultante ser forma t ada. Em


geral, quando a finalidade for sua leitura pelas pessoas, esta propriedade dever ser con figurada como Formatting. I ndented, j
que essa configurao cria um documento mais legvel. Como alternativa, se esta propriedade no estiver configurada ou se seu
valor for Formatt j ng. None, toda a XML aparecer em uma nica linha.
Mtodos

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

Cria um elemento no documento. Esse elemento novo possuira


as tags de abertura e de fechamento, assim como qualquer texto
que se refi ra a ele. Este o mtodo que voc deve usar quando criar um elemento independente que no tenha nenhum nfilho.

WriteStartElement

Cria um elemento no documento. Este mtodo s gera a ta9 de


abertura para o elemento. Voc deve usa-lo quando criar elementos que tenham nsfilho s.

Wri teEndEl ement

Cria a ta9 de fecham ento para o elemento atual.

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"

'" 'd<h>' T/<, dt.'

,bo'9h t>n,ho,pt.

<1." >c<,'
..,,
<0",_ , h1 ",,</ ,< 10,.,

_p'

<1.,_,<\_>

LISTA GEM

20.1 C1 asse AppSetti ngs

1 Imports System.Xml
2

3 Public Class Sett i ngs


4
Private m sFileName As String
5
Private m oItems As Hashtab1e
6

7
8
9
10

Public Sub New()


Me.FileName = AppOomain.CurrentOomain.BaseDirectory &_
AppDomain.CurrentDomain.FriendlyName & ".cfg"
End Sub

11

12
13

Public Sub New(ByVa1 fi1eName As String)


Me.FileName = fileName

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

20.1 Cl asse AppSetti ngs (continuao)

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

Carregando as Configuraes Por Meio de XmlTextReader

Public Sub LoadReader()


'carrega contedo do arquivo de configurao em
HashTable
m_oltems : New Hashtable()
Dim oReader As XmlTextReader
Dim sLas tE lement As String

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

Carregando Configuraes com o Uso do DOM

63
64
65
66
67
68
69

oOoe.Load(FileName)

Public Sub LoadDOM()


m_oItems '" New Hashtable()
Dim oOoc As New XmlOocument()
Dim oNode As XmlElement
Tcy

70

71
72
73

oNode '" oDoC.DocumentElement.FirstChild


Do While Not IsNothing(oNode)
m_oltems.Add(oNode.Name, oNode . lnnerText)
oNode = oNode . NextSibling
Loop

74
75

76
77

78
79
80
81

Cateh ex As Exeeption
Finally
oOoe = Nothi ng
End Try
End Sub

ANALISE

o cdigo comea de maneira seme lhante ao da Iistagern anterior, inicializando Hash -

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

Usando a Classe Settings

Private Sub frmTest_Load(ByVal sender As System.Object.


ByVal e As System.EventArgs)
Handles MyBase.Load
' ' comentrios: blah
oSett i ngs : New Settings()
With Me
.Height " oSettings. Items("height" )
.Width : oSettings . ltems("width")
.Left : oSettings. Items ("lef til)
.Top " oSettings.Items(ltop")
.Text " oSett i ngs.Items("caption")
End Wi th
End Sub

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

Criando Def i nies de Configurao com XmlTextWriter

Public Sub SaveWriter()


Oim oWriter As XmlTextWriter
Oim oItem As Oict i onaryEntry
oWriter : New XmlTextWriter(m_sFileName , Nothing)
oWriter . Formatting : Formatting.Indented
oWri ter. Wr"i teS ta rtEl ement (" appSet t i ngs ")

89

90
91
92

For Each oltem ln m oItems


oWriter.WriteElementString(oItem.Key, oItem.Value)
Next

Introduo XML

LISTAGEM 20.5

Criando Definies

de

567

Configurao com XmlTextWriter

(continuao)
oWriter .WriteEndElement{)

93
94
95
96

oWriter . Fl ush{)
oWriter . Close()

97

98

End Sub

o mtodo SaveWri ter comea instanciando as variveis necessrias. Uma varivel

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

Cr iando Definies de Configurao com o DOM

Public Sub SaveOOM()


Oim oOoc As New XmlOocument()
Oim oRoot As XmlElement
Dim oItem As DictionaryEntry
Dim oNode As XmlElement
oRoot " oOoc.CreateElement{"appSettings")
oOoc.AppendChild{oRoot)
For Each oltem ln m oItems
oNode " oOoc.CreateElement{oItem.Key)
oNode.InnerText " oItem.Value
oRoot.AppendChild(oNode)
Next

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

Cdigo para Salvar as Configuraes

14

Private Sub frmTest_Closing{ByVal sender As Object ,

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

graas aos desenvolvedores de Java e s verses posteriores do MSXML (analisador


XM L para o COM da Microsoft). Ele foi desenvolvido por David Megginson e a li sta de
distribuio XML-DEV uma maneira simp les de ler XML. semelhante a Xml TextReader por no carregar o documento inteiro na memria. No entanto, quando usado,
em muitos aspectos o oposto de XmlTextReader. Enquanto esse objeto um modelo de
'recuperao', extraindo trechos da XML, o SAX um modelo de 'eventos' . Quando um
processador SAX l um arq uivo XML, ele aciona eventos, como Begi nEl ement, EndEl ement, BeginDoc ument e assim por diante. Voc deve criar os manipuladores de eventos
nos quai s estiver interessado para processar a XML.
P Ouvi falar de vrios outros acrnimos relacionados XML. como XSLT, XPath,
SOAP e oulros. Onde posso encontrar mais informaes sobre eles?
R H muitos padres estabelecidos e propostos para tratamento da XML - uma quantidade
muito grande para que abordemos aqui. Se voc estiver interessado em aprender mais sobre
como usar esses outros padres, deve procurar um bom livro sobre XML (existem muitos
deles) ou encontrar um site interessante de alguma comunidade na Web que fornea essas infonnacs (o endereo http: //msdn.microsoft.com/ xml seria um bom ponto de partida).
P Disseramme que algumas linguagens, como a Java e a C#. permitem que sejam
adicionados documentos a um arqui\'ofonte quando ele estiver sendo escrito por
meio da converso dos comentrios em documentao. Posso fazer isso com o Visual Basic ,NET?

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

-=-, llT ........"1:S ..

", ,, ,,~

"...,

,,_.. ....

</mO.,tz >
~.'

tl"'l. ~

_ 'M,,,,,,..-,
,:-

............ ' ''''''.l rod.<>r lho' 01 .. . .. 1. 11",,,,,,,,,,<1...........,.,

</I" .d,~

"",",,,to ......... P :'~ .,.

.....>

<..........",. ... p .... ~ ....

the _

oring lho <;D nt;gu .~'.m .... ';09 . 4$..........,.,.

</I",mb,

_Ii "_..

"_oP:". ",,>
<.........,.,""p..... ... ,.... """ . <:tl... a' ."'lng. ~

<lMmIl.,

</tl".w>-

:Lo"""der'">

<.........",.l oed. ,ho ""n' ont r 'h. ....

.",I, .

(JI ,,,.Dv.>
_

'M ."",, ~

,"'g. Hro ln'. ' .... Ite.hTeb'e u''''II eo

.. ....,.....:l.e""""'>
. r 'he lO"""" ",. "',. " ,,, ,' M.ble u''''II

FIGURA 20.8
D(X'lIf11elllao XAlL

com uma folha de estilo


aplicada a ela.

Settings
I NewO ",,,thod
tio,..... , ,,,,,.tfUclor
I New() "'''U~

,,,,,.tfUc,,,, thot ....." .. " ........

I FileNltme property
. . p'........

lho No "<>m<J 'ho ,"", ..,...., .,., """'9'.

ne ...S proper ty

.. lho

,010<'''''' ur '''''''9'

I Lo1>dReadeiO ",e thod


1.0001 ,110 ,,",,.. ti of ""

"""'l' No . "0 ,.......oItT_ """'I .... """".,.._

I Lm>dOOM( ) methd
~

' hO ,,",,,,,,, 01 ' hO

" ""'9' No " 'O 'hO .... h ' _ ~ O<:IM

I Si!'IvewriterO rn" t1~

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:

O que um Serv io Web.

O SOAP Ce qual s ua relao com os Se rvios Web).

Como cri ar um Servio Web no Visual Basic .NET.

Como criar um Servio Web cliente no Visual Basic .NET.

o Que um Servio Web?


bvio para qualquer pessoa que j tenha usado a World Wide Web que h muitos servios di s~
ponveis nesse local. Eles podem ser utilizados em q uase qualquer lugar; servios de meca ni s~
mos de busca, de compras, servios que recuperam informaes e assim por diante. Portanto, por
que dedicar uma lio criao de Servios Web em um livro sobre o Visual Basic? Esta li o
explica a diferena entre um servio na Web e um Servio Web.

Dia 21

574

NOTA

A guisa de esclarecimento, m e referi rei aos servios comuns na Web em letras


minsculas e aos Servios Web criados no Visual Basic .N ET com uma combinao de maisculas e minsculas.

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

Cria ndo Se rvios Web co m o Visua l Basic .NET

575

Internet e at ter sido escrito em outra linguagem de programao ou executado em um sistema


operacional diferente.
Os Servios Web no s permitem que dois programas se comuniquem pela Internet, mas tambm que um programa retina infonnaes de vrios Servios Web em um nico aplicativo, aumentando potencialmente o valor dos dados. Por exemplo, um aplicativo que manipu lasse aes
poderia no s exibir o valor aluaI de vrias aes diferentes (possivelmente recuperadas de diversos Servios Web que lidassem com aes), como tambm incluir as recomendaes atuais
de analistas com base nas aes exibidas, empresas semelhantes, notcias sobre a empresa e assim por diante, tudo recuperado de vrios Servios Web diferentes.
Os Servios Web se com unicam uns com os outros e com os clientes por meio dos protocolos-padro da Internet. Eles podem empregar o protocolo comum HTTP,o mesmo que os navegadores utili zam. Nesse caso, eles usam os comandos GEl e POSl que os navegadores da Web
empregam. Como alternativa, um Servio Web pode uti lizar o SOAP para se comunicar com um
cliente ou outro servio. Usar o SOAr permite que a comunicao seja mais sofisticada porque
ele deixa que objelos sejam transferidos entre dois apl icativos, e o H1TP no.

o Simple Object Access Protocol


O SOAr um protocolo relativamente novo. Ele define uma maneira de formatar a XML para
que seja usada como uma mensagem. Os Servios Web em geral empregam o SOAP para comunicar a sol icitao e a resposta entre dois programas. Ele uti liza os protocolos comuns da InterneI, como o H1TP, que usado pelos navegadores da Web, ou o SMTP, que manipu la a
correspondncia na Internet. Porm, o SOAP permite uma comunicao mai s sofi sticada do que
a que existiria se voc s utilizasse mensagens simples.
O SOA r foi desenvol vido inicialmente por vrias empresas, inclusive a Microsoft, para permitir
lima comunicao sofisticada de objeto a objeto entre programas. De certo modo, o objet ivo do
SOAP era defin ir uma maneira de trabalhar com objetos na Internet, por meio dos protocolos e
formatos- padro, em vezde formatos binrios e protocolos proprietrios. Depo is de ficar disponvel por algum tempo, os desenvolvedores melhoraram seus recursos. Agora e le um formato
geral de troca de mensagens que pode ser usado por qualquer protocolo e atende a muitas necessidades alm da criao de Servios Web. No entanto, esta lio exam inar o SOAr apenas no
contexto de sua utilizao na criao e uso de Servios Web. Para obter mais detalhes sobre o
SOAP, leia a especi ficao. Ela est disponvel na Internet em ht tp : / j www.w3.org jTRjSOAP.

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

LISTAGEM21.1 Uma Solicitao SOAP Simples

xml vers;on "1.0" encoding "utf-8"


soap:Envelope
xmlns:xs; "http:
. 3.org 2001 MlSchema-;nstance"
xmlns:xsd "http:
. 3.org 2001 MLSchema"
xmlns:soap "http: schemas.xmlsoap.org soap envelope"
soap: ody
Add xmlns "http: tempuri .org "
x ; nt
i nt
Add
soap: ody
soap: Envel ope

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.

Web Service Description Language (WSDL)


Depois que tiver uma maneira de se com unicar, voc precisar de um meio para descrever a
mensagem. Quando se trata de linguagens, chamamos isso de gramtica. A gramtica define
como construir uma mensagem e identi fi car partes importantes dela.
Embora o SOAP defina o forma to da mensagem, voc tambm pode precisar de uma maneira de
descrever a gramtica das mensagens SOAP. Isso perm itir que os clientes e os servidores gerem e reconheam automaticamente mensagens SOAP vlidas. A Web Service Descripliol/ Language (WSDL) uma maneira de descrever Serv ios Web. Ela define as mensagens (m todos)
que tm suporte de um Servio Web e os componentes (parmetros) de cada mensagem. De certo modo, a WSDL o 'contrato' que conecta o cl iente ao servidor.

Criando Servios Web co m o Visua l Basic .NET

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

1: <?xml version""l.O" encoding""utf-8" ?>


2:
<de fi n i ti ons xml ns: s"" http ://www w3. org/2001/XMLSchema"
3:
xm 1ns : http" ''http://schemas.xmlsoap . org /wsd 1Ihttp/"
4:
xm I ns : mi me" ''http://sehemas . xml soap. org/wsdl Imi mel"
5:
xm I ns: tm"" http: //mi crosoft . eom/wsdl Imi me/textMa teh i ng/"
6:
xm I ns: soap" ''http: //sehemas.xmlsoap . org/wsdl I soap/"
xm I ns: soa pene" ''h ttp: //sehemas . xm1soap. org/soap/encod i ng/"
7:
8:
xml ns: sO"" http://tempu ri .orgl"
9:
ta rgetNamespace "" http: //tempuri .org/"
10:
xm I ns"" http: //schemas .xm I soap. org/wsdl I">
11:
<types>
12:
<s: schema a tt ri buteFonnDefau 1t"" qua 1if i ed"
13 :
el ementFormOefaul t="qual i f ied"
ta rgetNamespace"" ht tp; Iltempuri . orgl ">
14:
15:
<s:element name,,"Add2Ints">
16:
<s:complexType>
<s : sequence>
17:
18:
<s:element minOccurs""l" maxOccurs"" I "
19:
name""X" type="s:int" II>
20:
<s:element mi nOceurs,,"1 " ma xOceu rs =" I"
21 :
name""Y" type="s:int" II>
22 :
</s:sequence>
</s:complexType>
23,
</s:element>
24 :
25:
<s:element name="Add 2Ints Response">
26:
<s:complexType>
<s: sequence>
27 :
<s:element minOccurs="I" maxOccurs="I"
28 ,
29,
name,,"Add2IntsResult" type="s: i nt" I>

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:

Um Contrato W$DL (continua o)

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

Criando Servios Web com o Visual Basic .NET

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

21.3 Um Arquivo DISCO Simples

xml vers10n "1.0"


d1scovery xm1ns "http: schemas.xmlsoap.org DISC "
contractRef ref " demos Async Add.asmx sdl"
docRef " demos Async Add.asmx"
xmlns "http: schemas.xmlsoap.org DI se sel "
contractRef ref " demos Interop CCValidator.asmx sdl"
docRef " demos Interop CCVal idator .asmx"
xmlns "http: schemas.xmlsoap.org DISC sel II
contractRef ref "demos ebServices Async 99 ottles.asmx sdl"
docRef "demos ebServ;ces Async 99 ottles.asmx"
xmlns "http: schemas.xmlsoap.org DI se sel II
discovery

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

ref - O local de um arquivo WSDL


docRef - O local de um Servio Web
xml ns - O espao de nome que define o formato do arquivo WSDL. Isso permite que um
nico arquivo DISCO seja usado com vrias linguagens de descrio de servio.

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

LISTAGEM 21 .4 Um Arquivo DISCO Dinmico

'mI versl0n "LO "

2 dynamlcDiscovery xmlns "urn:schemas-dynamicdiscovery:DISC . 2000 -03-17"


3 exc1 ude path "
cnf"
4 exc1 ude path "
pvt"
5 exc1 ude path " vti log"
6 exc1 ude path " vti script"
txt"
7 exc1 ude path "
8 exc1 ude path " eb References"
dynamicDis covery
9

v"
v"
v"

ANALISE

A manuteno dessa fonna de arquivo DISCO muito mais fcil do que a do arquivo

de busca simples. Em vez de identificar todos os Servios Wcb (ou os arquivos


WSDL) que tm supol1e, ele lista os locais onde no se deve procurar arquivos WSDL. Cada linha
<exc 1ude path=" " /> listada identifica um diretrio que no deve ser pesqu isado. Esse tipo de arquivo DISCO um pouco mais lento que o manual porque precisa que o mecan ismo de busca pesquise
todos os subd iretrios, em vezde apenas verificar os listados na instruo <exc 1ude pa th=" " / >.
Agora que voc tem tudo preparado (ou pelo menos conhece os protocolos que usar), pode utili zar o Visual Bas ic .NET para criar um Servio Web.

Criando um Servio Web Simples


Voc pode criar o aplicativo de um Servio Web, por estranho que parea, adicionando um
projeto de Servio Web sol uo ou gerando uma que j tenha um projeto desse tipo (veja a
Figura 21.1).

Criando Se rvios Web co m o Visua l Basic .NET

_...""

FIGURA 21.1
Criando 11m Projeto de
Serl'io Web.

581

,_.

"""'-

..

"

[ii"gj

II-p::::.,;' , ,-'l- f/iJ


.. 1
--"""-'--"--._
""
.~- -':.:1-"
w_c
..-_

~
,,,,,

ill

~~~

a _ _ ... ,

~
,

""

""""' lO..,.

~-

",,"M!T_ "'M!T _ _ """'"

, .'

~~

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.

MathService.vsdisco Este o arquivo de busca do Servio Web. Ele permite que o


cl iente encontre os servios Web expostos nesse diretrio virtual. O arquivo DI SCO criado no projeto de busca dinmica, portanto, voc no precisa fazer nenhuma alterao

para expor maIS servIos.

Servi ce I . asmx
Web.

Este o arquivo que voc editar para criar a funcionalidade do Servio

A Listagem 21.5 mostra o cd igo do arquivo Servi cel .smx .

Di a 21

582

CDIGO

LISTAGEM

21.5 O Arquivo de um Servio Bs i co

1 Imports System.Web.Services
2

3 Public Class Servi ce I


4
lnherits System.Web.Services.WebService
5

6 'Regian " Web Servi ces Designer Generated Code "


7

8 Public Sub New()


9
MyBase.New()
10
11
12
13

14

'Esta chamada necessria para o gerador de Servios Web .


Initia l izeComponentO

'Adicione seu prprio cdigo de i nicial i zao depois da chamada


' Initia l izeComponent{)

15
16 End Sub
17

18
19
20
21
22
23
24
25
26

' Necessria para o gerador de Servios Web


Private components As System.ComponentModel.Container
'OBSERVAO :O procedimento a seguir necessrio para o gerador de Servios Web
'Ele pode ser alterado com o uso do gerador de Servios Web .
'No o altere usando o editor de cdigos.
<System.D i agnostics.DebuggerStepThrough(Private Sub Initia l izeComponent()
components = New System.ComponentModel.ContainerO
End Sub

27

28 Protected Overl oads Overrides Sub Dispose(ByVa l disposing As Boo l ean)


29
'CODEGEN : Este procedi mento necessrio para o gerador de Servios Web
30
'No o altere usando o ed i tor de Cd i gos .
31 End Sub
32

33 IEnd Region
34

35
36
37
38
39
40
41

EXEMPLO DE SERVIO WEB


O servio HelloWorld() do exemplo retorna a string Hel lo World.
Para compil -l o, eli mine os caracteres de comentrio das l inhas a seguir,
salve e compile o projeto.
Para testar este serv i o da Web , certif i que-se de que o arquivo .asmx a
pgina inicial
e pressione F5.
'<WebMethod(Public Function He l loWorld() As String

Criando Servios Web co m o Visua l Basic .N ET

COOIGO

42
43

LISTAGEM 21.5 O

HelloWorld
End Fu nction

583

Arquivo de um Servio Bs ico (continuao)


"Hell o World"

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

Concede acesso a todos os dados fornecidos no ASP.NET. Isso inclu i


os obietos Request e Response reais, o obieto Cache e outras propriedades da solicitao.

Server

Fornece acesso ao obieto Server. Esse obieto usado em co nsultas ao


servidor Web que estiver hospedando o Servio Web ou na codificao de mensagens (por exemplO, pa ra converter uma stri ng comum
em uma string de consulta (Querystring) vlida, adiciona ndo todos os
caracteres + e %20 apropriados alm de outros mais). uma propriedade que resume Context.Server .

Session

Fornece acesso s variveis armazenadas no obieto Sess i on dentro do


ASP.NET. uma propri edade que resume Context.Ses sion.

User

Fornece acesso s informaes sobre o usurio que estiver fazen do a


solicitao.

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

."

.tI ",,,,,,el ....",,1..

"'"
,.

"'''o~''dU

~~".,

no

'" -

"_10 .. ""e. <o,""'" , ...,"" ." ...<,._

., , ..... u , ... " ... , ... o......... """. ,,.. ><oJoe,.

'"o< ,Mo .... ,,,vl<o, ...... 'hu , .. . .... '''0 ,. , .. OU", . _

..... 'u" ' $.

........ ..

, "".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{

A Sintaxe dos Mtodos do Servio Web


SINTAXE

A sintaxe do mtodo do Servio Web

<WebMethod( Public Function MethodName{ByVal Parameter As Type)As ReturnType


'Cdigo do mtodo
End Function
na qual MethodNome o nome do mtodo, Porameter a lista de parmetros do mtodo, Type o tipo de cada parmetro e ReturnType O tipo retomado pelo mtodo
Web.
A incluso em um mtodo comum indicada por <WebMethod ( na declarao normal. Esse o
exemplo de um QlribufO, um elemento .NET que adiciona um novo comportamento a uma clas-

Criando Servios Web com o Visua l Basic .NET

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

Cdigo para um Exemplo de Mtodo de Servio Web

1 <WebMethod( Publ l C Functlon Add(


2 ByVal X As Integer.
3 ByVal Y As Integer) As Integer
4
Return X + Y
5 End Funct i on
Esse mtodo apenas soma dois nmeros, relornando o total. Embora voc possa desconsider-lo
por ser muito bsico, ele possui tudo que em gera l comum em todos os Servios Web:

Contm o atributo <WebMethod> na declarao


Retorna um valor

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.

Compilando o Servio Web

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

, ' . I.ull .010"'0<0 ,."- ,.,

.... ..... I" h ... ~ . publi",

. _ ~ , ...................... """",..,,.",""_ ......... <Mm _


..... " ' _ " ""'" _ , , ...... .
..... _ _ " " ......... _ , , _~ .... , ......................... ~ ...................... 0 ,"""".

",-..
" ....,. ._ "''''''0', .........._ ..... ,.. _. r .. " ........... , .......... ". , _ _ , ',
''''' ..... """-' ................ ",. ........ . .... .....,...., _ , 0.0 ,......,. , ....... _ ................ "'"' .... ""'
...... to _ ~ "' ~ ... "'" ".-. , .... ,...." ......... oco,

....... ,.)

_t .. _ ............... _"'0..........
.1",

,Tho
.. ......................
" ...................................
.- ............................._
_ _, ............ _rt,.
..
'.,.,_nd........... i _
~

.. _

..... , ... .... _ ' ' - to __ " ' _...... .....,.. ......

" ,._

.... '..

, ~_.P_.

.... ' 11.,..........

0"""' . 'ao .......... <V, ~ ,

~...,_

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

cOeI< ..... ......... "m ... .. 00"'_'.

To"
To\..~ _

....

"" i_. ..........

!
!

., ""' " r"':":':_--------------

SOA.'
. " ;' ._ .' "'
. . . . .i .

i>(II'jT

;~

""'010 w.,.

""",,, .... ....., ........... . ho ..... , ... "'" .... ,

,I<&,_
....<o".rv.oo .__ """, .
"".li...,

lo . . " " " " ,. _

ilo. . . .

eonooot -r... , , .., , _, e....... ~" e

(.ou., ... _., .....,.

..

..

00

Criando Servios Web com o Visua l Basic .NET

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'

.... 00Gl ~ GJIi'ti


, ......,>! _

.. _ I I

....... " _

"1._ """",_""""

<................. ,.0" _ _ >;1 ....,(-

<ln,

,. h"p'II'.mp,,~.~1'> 46 <1ort'>

Criando um Servio Web Cliente


Embora a pgina de teste criada para o arquivo ASMX seja til como demonstrao, no recomendvel que os usurios a utilizem para trabalhar com seu Servio Web . Em vez disso, voc
deve criar um cliente (um formulrio Windows ou Web) que se comunicar como o Serv io
Web. A comunicao entre esse cliente e o Servio Web ser executada com o auxlio de uma
classe intermed iria, tambm conhecida como proxy.
Sob um ponto de vista genrico, o proxy um substituto ou representante autorizado.
um intermedirio. Para os Servios Web, um proxy um pequeno componente no
lado do cliente que se parece com o Servio Web para o programa cliente. Quando o programa
cliente faz uma chamada no proxy, ele gera a solicitao SOA P apropriada para o Serv io Web e a
transmite. Quando o Servio Web reage com uma reposta SOAP, ele a converte novamente para o
valor de retomo esperado pela funo e envia isso para o cliente. A Figura ? 1.6 mostra esse processo.

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.

Tesl Malh $ervlce

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

um microcomputador, como o Microsoft Office. Criar um cliente usando os formulrios Web


semelhante.
Crie o projeto de um novo aplicativo Windows e chame-o de MathClient. Voc pode optar por
cri-lo na mesma soluo de MathService para manter os dois juntos, embora isso no seja necessrio. Selecione File, New e Proj ect. Na caixa de dilogo New Project, selecione Windows
Application e digite MathCl ient no campo do nome. Certi fique-se de que Add to Solution esteja
selecionado e, em seguida, d um cl ique em OK . O Visual Basic .NET deve criar um projeto
com apenas um formulrio. Antes de prosseguir, feche o gerador de formulrios e renomeie o arquivo FonnI. vb como fnnTest . vb. A seguir, abra o formu lrio no modo de exibio do cdigo e
altere todas as referncias de FonnI para fnnTest. Depois, d um clique com o boto direito do
mouse no projeto MathClient e selecione Propert ies . Na pgina General, altere o Startup Object
para frmTest e selecione OK . Para concluir, d um clique novamente com o boto direito do
mouse no projeto MathClient e selecione Set as Startup Project. Isso assegurar que esse projeto
seja o primeiro a ser executado quando a soluo for iniciada.

Criand o Se rvios Web com o Visua l Basic .NET

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

...... _ _ ., _ ...

..,

(-

.. _l. .........., .... ( ....... _ .......... _.,,' ...

.........

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

.. 0[;) &tO_ [,"-'I""' ......$00

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

.'h. lp J /.d"'m._ . "" 'oop.""jl ,II ...... /.d


</"'""ot'I>

---.
--

:oii _ l/O< ....."'" _


-~

'-

" ._ _

I
,

-TABELA 2 1.2

Proprieda des do Form ul rio MathCl ien t

Controle

Propriedade

Valor

F,,,,

Text

Test Math Servi ce

$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

Criando Servios Web com o Visua l Basic .NET

TABELA

21.2 Propriedades do Form ulrio MathClient

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

21.7 Chamando o Servio Web

1 Private Sub cmdAdd_Click{


2 ByVal sender As System. Object ,
3 ByVal e As System . EventArgs)
4 Handles cmdAdd.Click
5
Oim oMath As New localhost.Servicel()
6
lbl Result.Text = oMath.Add{Clnt{txtX .Text), Clnt{txtY.Text))
7 End Sub

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

Usando o c/ieme para


chamar u Servio Web.

..., 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)

Adiciona um ou mais mtodos publicos com o atributo <WebMethod(

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.

Um Servio Web Mais Complexo


Para mostrar que realmente aprendeu tudo sobre a criao de Servios Web. voc criar um que
faa mais do que apenas somar dois nmeros. Ser gerado um Serv io Web que poder ser exposto a part ir de um depsito, nesse caso, o Northwind . Ele permitir que as tarefas a seguir se
jam executadas:

Recuperao de uma lista de categorias de produtos

Recuperao de uma lista de prod utos de uma nica categoria

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

........ '

Criando o Sen'io Web


No/"Ihwind.

.. _

..... . . -.. _ " ' " ' _ - . : 1 .

~.

13'

Criando Servios Web co m o Visua l Basic .NET

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

Public Class ProductManager


A seguir, voc adicionar os trs mtodos. O primeiro retomar um array contendo todas as cate
gorias. O segundo retomar um DataSet contendo todas as informaes sobre os produtos de
lima categoria especifica e o terceiro inserir novos dados na tabela Categories. A Listagem 2 I .8
mostra esses trs mtodos. Para obter mais infonnaes sobre o cdigo de acesso a dados desses
mtodos, veja o Dia 12, " Acessando Dados com a Plataforma .NET" . Adicione esse cdigo aps
a regio marcada como ' Web Services Designer Generated Code'. porm antes da linha End
C lass. Alm disso, ser preciso adicionar duas instrues Imports, uma para importar o espao
de nome System , Data e a outra para importar System.Data.SqlCl ient. Insira essas duas instru
es logo aps a linha Imports System.Web . Services .
CDIGO

LISTAGEM 21.8 O

Cdigo para o Serv i o Web dos Produtos

1 Private Const OSN As String


2 "server localhost database north ind user id sa pass ord "
3

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

oCmd . Fill oDS "Categories"


ReDim sReturn oDS.Tables O .Ro s.Count
For lOTo oDS.Tables O .Ro s.Count - 1
sReturn I
CStr oDS.Tables O .Ro s I .Item O
Next
Return sReturn
End Function

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

LISTAGEM 21 .8 O Cdigo para o Ser vio Web dos Produtos

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"

HERE Discontinued O ANO


CategoryName LI E " categoryName
11

. .

Dim oCmd As Ne SqlDataAdapter sSQL oCon


Dim ods As Me DataSet

35

oCrnd . Fill ods

36

Return ods

"products"

37 End Function
38
39

ebMethod

40 Public Function InsertCategory


yVal categoryName As String
41
42

43
44
45
46

47
48
49
50

51
52
53
54
55
56
57

yVal description As String As oolean


Di m oCon As Me SqlConnection OSN
Dim sSQL As String
sSQl "INSERT INT Categories"
" CategoryName Des cription
. categoryName . .
"VAL ES
. " des cription "
Di m oCmd As Ne SqlCommand sSQl oCon

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

Criando Servios Web com o Visua l Basic .NET

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

Testando o Servio Web


Exatamente como foi fe ito no Servio Web si mples, possvel usar a fun cionalidade interna
para testar o servio Web que acabamos de criar. Compile o projeto, abra um navegador Web e
pesquise em http://l oca 1hos tjnorthwi ndsjproduc t5. asmx. Voc deve ver a pgina de teste gerada na Figura 21.11.
bom testar cada um dos trs mtodos antes de COI1tinuar. As Figuras 2 1. 12, 2 1.13 e 21. 14 mostram o resultado de cada mtodo em ao. O segundo foi testado com a string Bev, e o terceiro
com as strings Algum pr oduto e Outro produto que estamos vendendo.
FIGURA 21 .11

Pgina de teste do
Serl'i~'o

Web
Nonhwil/d.

eootJO;,,"~

...

.....

_..

... "U ~ 'ICIII 1 -' '' " .. ~.Q


.,. .. O li) til '2 mIG\ ....".;., h ...,

._
,.,;,;;"

1.. t

-TIM'-'
,

~If~

'4.l. .

Ui, i r 14. _ _................... . 1!fi?'ifL,),5i .. ,i~ ~


ProductManager

. ,"ru.......

.............

'hI, .... .. _ . " ..... ....'11" ..........'

.. k .

.., .. ~ __

' " ,

-...-_....... _. .................,_.._.... _
"_ .............. ....... ....
a" ............. ' , .......... ........ . _ ".1<'

."" . . ..... _ .... , ........, __ , _ .. _

. ..........

....... '" ..... _" ,. ..... """ " ~

............. "t. "" ......, _....... _ . _ _ ,

-....... .... .... .

.......... _ J"-_" ................__."'.. " ........... ",- ....... _ ...............,.


....,..... """"
, _ _ , . . - _ .. _
, . , _.. _ ..... , .. _ , r.. , , _. , " " _ ... , _ _
,
, ......... -"'""',
" ,"'
__ to ......... ................... (" " , ................. ' "'" .... " .)

,~

.... .............. ' "'H" ""' _ _ """ _, ,,,.. _ o . . _ _ _ ,' ..... H'_
..."
"'
',-""'-"' ..-...,

. .. . . ..MT ............,. " " ........ , ...., . - ...................... ................ ' , ,', H ......... _ " "

:21 El """

FiGURA 21.12

testando

GetCategories.

too

{;OI

:i! . \:>
~ ~

..,g i'
_

...

CIo:!>OO.._,I:.~~ ,:-..
_

o III S , '2 m lii\ ....',... ,

~~::::
'J'
*
'
:
-'
, ........, -,_ . ... , , 1/,.

~,....::......""""_,

a......,c :

K... c_ _

:OO c:i' ~ !

.--:DI

O..,Pr_~(jo~....... M.a!Il'....,_.S..cood_S""'"

J
!
O

Cria ndo Se rv ios Web co m o Visua l Bas ic .N ET

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

_.-..

""""",-~

<1 ..,. "'''''''0''.0" _-.go u,H,.. 1>


<00, ..... , ,,' ". MWII'~mp,,"'.Q"I/"

<CI>Mna "'"N. .. OmeSQt , _ I I l _ p....


.ml..,,, .d.h"~" I ....... ,.".D"I/,.... '/ X" ........ mo _ . "'.~., .. um"<:h ~ m~.
,,,,''''', """<um, .mln .. dm ~'>

""'.~.

...,.-

",~, 01''' ... o, .....,..NQwo.., ~9. ' ...",,,.' ItOa,.5o" " ",. '.

</><d,"'.........

"''''.!

_ !o ff~, ",rf~... .-.s.


um "<:h.,,,~ .... oIcn>.of1_CGm,"mlm.d~'~
- , .<>"'Y- 'um :<<:hu,~ .... ml", m. <om,"ml dn U',,'" . ,">

,'lOwOlo,...,., ,. ,..,
. <p<O<1ue"
... p"'du<:l<1 _t.rowo< .... II:>
<00 ' ''"O>l<jPr-.:tlO:>
....... ,
<0<> ..'0'-....,' ,O<lQu."."-....,~
<Do""' .....
<JI)oSCon, ......".
cIoff~,

<Pr"'"-'<:IJI_, Clo" ' ~'

d> f~I

FIGURA 21 .14

feslando

I nsertCategory.

[<II:

"'"

010 _

jl- U -oi' g "


.. O

.r.~ 11Io

lOIO _

tIOIO

iii o::l ..1l ID Ial ~

<1 ..,. ...........1.0" oncOfl\l. ..tfD'" h


_MI

"" lO

""W' 1" ."'pu"'. "'9/':>' ",.<,Ib<oaIo...,

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

Criando Se rvios Web co m o Visua l Basic .NET

T ABELA

21 .3 Propriedades do Formulrio Web NWClient

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

Voc adicionar ao formulrio os controles ComboBox (DropDownL i st) e DataGri d.


Eles sero usados para ex ibir o resultado das chamadas a GetCategories e GetProducts. Alm disso, haver um painel contendo duas caixas de texto, um boto e um ttulo. Esses
sero utili:mdos pelo mtodo I nsertCa t egory.

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

il l.tl!l e. ", : ,p 1l 1 .:......

.!

_ . ""'!~ ........... -

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.

Criando Servios Web com o Visual Basic .NET

601

FIGURA 21.16

Locali=alldo o sel1'io
Norl/ll t'illd.

c?xml .....

"".'.0 . """""'9_,",1'8' 1>

- <""co ..",
""", . 'h" P :11 se hUnla . ><n ,1.Od p. onJ/ dl.co/">
<c""I<~<lReI

rel_' h" p ://loc<olhost / northwlnd /Product >.8sm


..,di'
CIOC~.f. http://localho<l/,,orth.dnd/product
,..,...,._ 'h"p: 11.~he",~ . ~ ," I.c ~p.~ '91 di> 00/.01

W"" ... ,r"

!iii " 0/1>01"' ........ _

,.w
""
-'*"-"'"

"""'_, _

v""

</<100'."'>

. -----'=

CDIGO

LISTAGEM

=-----'

21.9 Atua li zando a Grade

1 Private Sub eboCategory SeleetedlndexChanged


2
yVal sender As System. b eet
3
yVal e As System.EventArgs
4
Handles eboCategory.SeleetedlndexChanged
5
Oim oProduets As Ne loealhost.ProduetManager
6
Oim oDS As OataSet
7
oOS oProduets.GetProduets eboCategory.Seleetedltem.Text
8
dbgProduets . OataSouree oOS.Tables O . DefaultVie
9
dbgProduets.Data ind
10 End Sub

Esse mtodo comea instanciando um novo PrOductManager (o Servio Web). Em


seguida, recupera a lista de produtos (como um DataSet) do Serv io Web, usando o
mtodo GetProducts (linha 7). Para concluir, nas linhas 8 e 9, ele conecta DataSet ao controle DataGri d e faz com que esse seja atualizado.

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

LISTAGEM 21.10 Carregando as Categorias

CDIGO

11
12

13
14

Private Sub Page load


yVal sender As System. b ect

yVal e As System.EventArgs Handles My ase.Load


If Not IsPost ack lhen
Dim oProducts As Ne localhost.ProductManager
Dim sCategories As String
sCategories
oProducts.GetCategories
cboCategory.DataSource sCategories

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

Criando Servios Web co m o Visual Basic .NET

FIGURA 21.17

VislIoli=ondo o cliel1le
Norlhll'ind.

!jIo

t.. _

_,

(!otvj

,
1~ LJ ~ gO lllilo."

I'"
,

" ... ..~ . ......

_. ........_' ......... _.

1.... OlDa 'l): (DIQj_'""u;~ ....... _

.........

,, -, "-:=:'__"

;!

I ..

... _ t - . -

II,.

'.

IS' ~

..

"

N_,rl- - - - - -

"

"I

!
!

.
o

"

FIGURA 21.18

Allerando a calegoria
selecionada.

(!lo

""

"""

SMq",k~

AI<

Stt.1cy< St<>IIt

"
"
"
"

cal< d< ru.,. 2635

to< _

,.,
,.,

,.,
,.,
,.,

s.........'
s....."".
~~,

B.......
B ......,
~

(!otvj

b ~ lIil
, ll "' e.
.. OmGl 'l): (DfQ\

!OO"

........._ .. ,"'-_'-.....N_rl-----

"

"

... 'o c.t......


~,o 111"",110",

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

LISTAGEM 21.11 O Boto Add

23
24

Private Sub cmdAdd Click


yVal sender As System. b eet

25
26

yVal e As System.EventArgs
Handles cmdAdd.Click

27
28
29

Dim oProducts As Ne localhost.ProductManager


If oProducts.InsertCategory txtName.Text txtDescription.Text Then
lblResult.Text
"Adicionada nova categoria:"
txtName.Text

30

Else

31

lblResult.Text
End 11

32
33

"No foi poss vel adicionar nova categoria"

End Sub

ANALISE

Felizmente, no h nada muito complexo aqui. Voc criou uma nova instncia do

Serv io Web e chamou o mtodo InsertCategory. passando o contedo dos doi s


campos. Quando ele retomar ( True ou Fa 1se), ocontedo de Label ser alterado com uma mensagem de que a operao foi bem-suced ida ou fa lhou. A Figura 21 .1 9 mostra o resultado da execuo desse mtodo.

FIGURA 21.19
DaI/do UIII clique
bONlo Add

110

-,-'" ......... _,"-_ .

0.."",_.

!t . . . . . b . p ,. ti..
" ck <0< <o ...

,"to.

, __ r.IB=".=, =.c.- - - -30-

ctt.: <I< ~t",

,
"

S.. <IWI<h Ale

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-

Criando Servios Web co m o Visua l Basic .NET

605

putadores. Fornecem si mplicidade no desenvolvimento e utilizao de clientes Web com objetos


em vrias plataformas. Um beneficio essenc ial que eles podem ser escritos em qualquer Iinguagem de programao e proporcionam interoperabilidade com todos os sistemas operacionais. Podemos esperar queos Servios Web se tornem mais relevantesconfonne forem mais difundidos.

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?

2. Qual o objeti vo de um proxy?


3. Por que o SOAP importante para os Servios Web?

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

C: \ T V \ Cl vbc Frame orkVer si on.vb t:exe


Microsoft (R) Visua l Basic .NET Compiler version 7. 00 . 9254
for Microsoft (R) .NET CLR version 1.00.2914.16
Copyright (C)Microsoft Corp 2Q01.All rights reserved .
C: \ T V \ Cl Frame orkVers ion
1.0.2914.16

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

C:\ T V \ Cl vbc SysDir,vb t:exe


Microsoft (R) Visual Basic .NET Compiler version 7. 00 . 9254
for Microsoft (R) .NET CLR version 1.00.2914.16
Copyright (C) Microsoft Corp 200 1. All rights reserved.

Respostas dos Testes/Exerccios

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

Private dblAnnuallnterest As Oouble = O


Private iYears As Integer = O
Private dblLoanAmount As Double = O

Private dblMonthlyDeposit As Double

7
8
9

Sub Main()
Oim dblResult As Double

10
11
12
13
14
15

'armazena os valores informados


GetlnputValues()
'calc ula

dblResult

16

CalculatePayment(dblLoanAmount.
dblAnnuallnterest.
iYears)

17

18

'proceda a exibio do resultado

19

DisplayResults(dblResult)

20
21
22

End Sub

23
24

Private Function CalculatePayment(Byval LoanAmoun t As Oouble .


ByVal AnnualInterest As Double ,_

25

26
27

28
29

30

ByVal Years As Integer) As Double

'd ivida por 1200 para torn-lo um percentual mensal


Dim dblMonthlyInterest As Double = CDec(AnnualInterest I 1200)
Dim iMonths As Integer = Years * 12
Dim dblTemp As Oouble
Dim dblReturn As Ooub l e

31

32
33
34

35
36
37

' precisaremos desse valor em alguns loca is


dblTemp = COec(1 + dblMonthlyInterest) A iMonths
dblReturn = LoanAmount *
(dblMonthlylnterest * dblTemp l( db lTemp - 1
Return dblReturn

38

39

End Function

40

41
42
43

Private Sub GetlnputValues()


Console.WriteLineO
dblLoanAmount = COec(GetValue("Loan Amount: "

Res postas d os Testes/Exe rccios


44
45
46
47

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~

Private Function GetValue(ByVal Prompt As String) As String

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

Console . WriteLine("If you borrow {O :c), ", dblLoanAmount)


Console . WriteLine("at {O) % interest." , dblAnnual Interest)
Conso l e . WriteLine("for {O}years", iYears)
Console . WriteLine()
Console . WriteLine("Vour monthly payment would be: {O:c)". Result)
End Sub
End Module

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:

Public Class GamePlayer


Shared Sub Main()
Dim iUpperBound As Integer
Dim iLowerBound As Integer
Dim iCurrentGuess As Integer
Dim sInput As String
Dim sGuessStatus As String
System.Conso l e.Write{"Please enter the lower bound: ")

sInput = System. Console . ReadLine()


iLowerBound = CInt(slnput)
System.Conso l e.Write("Please enter the upper bound: ")

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

&

Respostas dos Testes/Exe rccios

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

6.11 Tabela de Multiplicao Concluda

1 Imports System
2 Imports Microsoft.VisualBasic . Co ntrolChars
3

4 Module modTable
5
6 Sub MainO

7
8

Oim iLow , iHigh As Integer


Oim sInput As String

10

'Permita mltiplas execues na gerao da tabela

11

Do

'solicite valores

12
13
14

Console.Write{" l ow value (maximum of 20 . O to end): ")

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

Console.Write("Press ENTE R to continue")


Console . ReadLine{)

27

28
29
30
31
32
33
34
35

End Sub

Private Sub OutputTable(ByVal MinValue As Integer ,


ByVal MaxValue As Integer)
Dim iCount . iCount2 As Integer
Console . WrHeLine()
Console . Wri teLine("Multiplication Table
MinValue . MaxValue)

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

({O }to II}}" ,

Respostas dos Testes/Exe rccios

CDIGO

45
46
47
48
49
50

LISTAGEM 6. 11

6 17

Ta bela de Multiplicao Concluda (continuao)

For iCount2 " MinValue To MaxValue


Console.Write(Tab & CStr(iCount * iCount2))
Next
Console.WriteLineO
Next
End Sub

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

Res postas dos Testes/Exerccios

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*

todo 50rt. O conjunto ArrayUst no possui essa funo.


3. Um nmero entre 2 e 12 seria exibido no console.

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

Ordenando os Argumentos da Li nha de Comando

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

Respostas dos Testes/Exerccios

ANLISE

621

A Listagem 8.4 pequena, mas demonstra vrias tcn icas para a manipulao de

conjuntos, assim como a recuperao de argumentos da li nha de comando.


A linha 3 cria um novo conjunto ArrayL i st, copiando o array de strings retornado pelo mtodo

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

SortedArgs As imov Hei n1ei n radley Ni ven


Pournelle Cl arke Herbert Card LeGu i n Haldeman
Asimov
Bradl ey
Card
Cl arke
Haldeman
Heinlein
Herbert
LeGuin
Niven
Pournelle

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

1 Private Sub DoEverything(ByVal sender As Object o


2 ByVa l e As System.EventArgs) _
3 Handles btnCopy.Click, btnMove.Click, btnDelete.Click
4

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

Respostas dos Testes/Exerccios

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

Caixa de dilogo Insel'l


Table.

,", ... " ".


w........ , . ~"

.- --,,'
._. . ......, 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 .........

"

"

....,

"""'" T"> ....

f,

1<

"

.........., Ir---"
3

3.:::1 "w". ""


~""" OI

IQ 0.'1" ID .mo.

.,.,

" A'

~.
,

!
i

.....

624

Apndice A

10.10
O formulrio lVeb

. ~"' "

~,,~,.h

. .... I ' .... ,,'[ .. .... 1

FIGUR A

sendo criado.

w,"'""",

.. r;J i:!

,
~

; ,-,

-"

,~

................. ,

-.. -- -----=--- --=--- -..

t 1='

I;;i ,,'....

,....,,-.-

.-,
",-

,,

4H, .........

:;1 .. "

""

.LIa.......'

ii ....-

....

" e>oo .....


~: .".
.";,,

''''

.-

.,.,... ,... ,i"

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

Propriedades do Formulrio de Registro

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

Respostas dos Testes/Exe rccios

625

TABELA 10.6 Propriedades do Formulrio de Registro (continuao)


Controle

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

Name is a required field.

( 10)

reqAlias

Contro lToVa I i date

txtAlias

ErrorMessage

Alias is a required field .

( 10)

reqpassword

Contro lToVa 1i date

txtPasswordI

ErrorMessage

Vou must enter a password .

(ID)

cmpPassword

ControlToCompare

txtPassswordI

ControleToValidate

txtPasssword2

ErrorMessage

Two passwordS must mateh.

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

10.5 Cdigo do Boto Register

Public Sub cmdRegister_Click(ByVal sender As Object, ByVal e As


" System.EventArgsl
IblSurrmary . Text ="Welcome . " & txtAlias . Text
End Sub

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.

-_.

Respostas dos Testes/Exerccios

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

Respostas dos Testes/Exerccios

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

assegurar que as informaes da chave primria sejam criadas.


2. O mtodo Delete marca a lin ha como exc luida, mas no a remove da tabela; ela permanece para que a rotina Update saiba que tem de excluir essa linha do banco de dados. O
mtodo Remove extrai imediatamente o objeto OataRow do conjunto Rows, porm ele no
remov ido do banco de dados quando Update chamado.
3. Esse um comando que no retorna registros, portanto, voc deve cham-lo usando o

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.

3. O valor aluaI do percentual de CPU em uso (% ProcessorTime) seria exibido no console.

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-

Respostas dos Testes/Exe rccios

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

Projetar c/asses para

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

Contm uma instncia de


Estado
_____-->~ Cdigo Postal
Pais
Tel efona
f"

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.

Respostas dos Testes/Exe rccios

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

o unico cdigo necessrio o que adiciona as infonnaes s colunas Attributes e last

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

Criando Colunas Adicionais

Private Sub tvwFolders_AfterSelect(ByVal sender As Objecto


ByVal e As System .Windows.Forms.lreeViewEventArgs)
Handles tvwFolders.AfterSelect

5
6
7
8

Dim sFilesO As String =_


Directory.GetFiles(tvwFolders.SelectedNode.FullPath)
Oim sFile As String
Oim oItem As li stViewItem

10

lvwFiles.ltems.Clear()

11

12
13
14

For Each sFile ln sFiles


oItem = lvwFiles.ltems.Add{StripPath{sFile))
If lvwFiles .ltems .Cou nt > O lhen

Respostas dos Testes/Exerccios

LISTAGEM 16.8

15
16
17
18

19

635

Cri ando Colunas Adicionais (continuao)

oItem.SubI tems . Add(GetAttributeString(sFile))


oItem.SubItems . Add(File.GetLastWritel ime (sFile))
End If
Next
End Sub

Os trechos adicionados foram a declarao de Li stV i ewItem na linha 8 e o cd igo


das linhas 13 a 17. Quando um novo objeto Lis tV i ewI tem adicionado Li stVi ew, o
item inserido retomado pelo mtodo Add. Se voc adicionar apenas um item a lista, como fizemos antes, no ser importante salv-lo em uma nova varive l. No entanto, j que estar adicionando subitens a esse novo item, deve armazen- lo em uma varivel, como vemos na li nha 13.
Depois de adic ionar o item , usamos a propriedade Sub I tems de cada Li s tVi ewI tem para inserir novos valores nas colunas criadas anterionnente. Primeiro, o cdigo chama a funo GetAttri buteStri ng , que ser criada em breve, para adicionar a string que representa cada atributo do
arquivo. Em seguida, a linha 16 insere na coluna Last Modi fied a hora e a data em que o arqui vo
foi gravado pela l ti ma vez.

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

Private Function GetAttributeString(ByVal fileName As String)


As String
Oim sReturn As String
Oim oA ttr As FileAttributes ~ Fi l e.GetAttributes(fileName)
If (oAttr And fileAttribute s.ReadOnly)
fileAttributes.ReadOnly lhen
sReturn " "R"
El se
sReturn
" "
End If

35
36
37

If (oAttr And fil eAttributes . Hidden) "


f ileAttributes.Hi dden lhen
sReturn +" "H"
Else
sReturn +" " "
End If

38
39
40

If (oAttr And fileAttributes.System) fileAttributes.System lhen

34

636

Apndice A

LISTAGEM 16.9

Funo GetAttributeString (continuao)

,. "S"
Else
sReturn ,. "-"

41

sReturn

42

43
44

End 11

45

46

47
48

Return sReturn
End Function

ANALISE

A funo GetAttributeString recupera os atributos de cada arquivo e os converte

em uma string para visualizao. O mtodo Fi le.GetAttributes retorna um valor


Fi leAttributes que contm a soma de todos os atributos definidos para o arqu ivo (linha 23). A
instruo If das linhas 25 e 26 testa esse valor para saber se ele inclui o atributo ReadOnly. Esse
teste usa o operador lgico ANO para comparar o valor integral que contm todos os atributos com
o atributo Fi 1eAUri butes. ReadOnly. Se o valor de Fi leAttributes. ReadOnl y fizer parte do total ,
esse teste o retornar. Isto , se voc associar doi s nlun eros ao operador ANO, o valor retornado
ser o comum aos dois ou Ose no compartilharem nada. Por exemplo, 33 ANO 1 retornaria I, enquanto 33 ANO 2 retornaria O. Se o arquivo realmente possuir o atributo ReadOn 1y configurado, o
cdigo acrescentar uma letra R string; caso contrrio, acrescentar um hfen. Os testes dos atributos Hidden e System so idnticos, exceto pelo atributo desejado. Para concluir, na linha 46, a
string completa retornada para ser adicionada coluna ListView.

NOTA

o valor retornado de GetAt t ri butes um bit mask de todos os atributos de um


arquivo . Bitmask o termo aplicado a um valor em que cada bit usado como
um fl ag, para ma rcar alguma caracteristica. Por exemplo, se voc examinar alguns dos valores reais de cada atributo da enumerao de FileAttributes
(veja a Tabela 16.1 8), ver que h intervalos entre eles.

TABELA 16. 1B Passiveis Valores dos Atributos do Arquivo

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

Você também pode gostar