You are on page 1of 662

I 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: Fone:

(11) 3611 9686 (II) 3613 1213

Endereo Eletrnico: Endereo Postal:

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


Pearson Education do Brasil Rua Em lio Goeldi, 747 - Lapa
So Paulo - SP/ 05065-110

...
CI

...
~

cc

CI

cc

CI

cc

.e
cc

(II

CI

"" cc E

..,
~

cc CI

cc CI

.N

II)

ln

N
~

.( II

~
C,)

CI
o
o

cc -

CI

:$

'" cc
~

CI

-cc
(II

CIl

cc

...
CI

co
~

.>
cc
II)

cc

CI

cc

-= = ... c..
<C

cc CI

..,

C>
~

...
~

cc CI

cc CI

CI

:$

cc '"I C

"" :$
~

CI

CI

cc

co
CI

ln
~

cc

CI

cc

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

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

Controlando o Fluxo dos Programas

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
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 .. .. . .. ... . .. .... . .. ... . .. ... . ... .. . . .. . . . .. .
Dia 5 Arquitetura dos Aplicativos na Plataform a .NET
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' ....................................................

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

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

Dia 6

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

XII

A prenda Visual Bas ic .N ET em 21 Dias

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 SEMANA 2 Viso Geral


Dia 8

202 203

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 225

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

Dia 13 Usando o Server Explorer

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 381

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

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

403 405

SEMANA 3 Viso Geral Dia 15 Criando Objetos no Visual Basic .NET

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
Dia 16 Formulrios Windows Avanados

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

441 Menus ......................................... .. .......... 44 I Adicionando um Menu a um Formu lrio' ............. o 441 Os Teclados e os Menus ' . . ........ . .. .. ... . ... .. .. .. . ... .. . 444 Adicionando Cdigo .. .. . ........ .. . .. ... . ... .. . .. . ... .. . 445 Algumas Sugestes ' ..... . ........ . .. .. ... ... . .. .. ...... .. . 448 Programas de Interrace de Documentos Mlt ip los ......... . .......... 449 , O Que E uma Interrace de Documentos Mltiplos? ... .. ... . . .. ... .. . 449

S um rio

XV II

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' ..................
Dia 17 Usando o .NET Framework

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

.. .........

47 1 47 1 47 1 472

473 Fluxos e Arquivos' .............. . ....... . .... .. ...... ..... 473 , O Que E um Stream? .......... .. . . .. ... . .... .. ...... .. .. 474 Arquivos e Diretrios' ............... .. . .. . .... .. .. . .. .... 474 Lendo um Arquivo de Texto ' ...... .. .. .. ... . .. .. . ... . . . .. . . 476 Gravando em um Arqu ivo de Texto ' . ... . .. ... . ... .. . . .. .. . ... .. . 478 Desenhando com as Classes de Figuras .. .. .. .. ... .. .. . .. . . .. . .... . 492 Exam inando as Classes de Figuras' .................. . ........... 492 Onde Posso Desenhar? . .. . .... . .. .. .. .. ... . ... .. . .. . .. ... . 498 Desenhando Fomlas . .. .. . ... .. .. ... . .. ... . ... .. . . .. ... .. . 503 Salvando Figuras ' . ... . .. .... . .. . .. ... . ... .. . . . .... .. . 506 Resumo . .. ... .. . .. ... .. . ... .. .. . .. ... . ... .. . .. . ... .. . 509 P&R .......................... . ....................... 509 Worksho p' ...................... . ............. . ........ .. 510

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

511

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

XVIII

Aprenda Visual Basic .N ET em 21 Dias

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 ......... . . .. ... ..
Dia 20 Introduo XML
,

... . .... ... . .. . . . . .. .. . 542 ... . ... . . ... . .... . . .. . .. 545 ....... . . .. .. ...... .. . .. 545 . . . .. .. .... .. . ... ...... 546 . . . . ... . ..... . ...... ..... 546 . . .. . . . . ..... .. . .. . . ..... 546
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

Sumrio

XIX

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 SEMANA 3 Resumo

592

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


597 596 597


600 604

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

605 605 605 605


606

Apndice A - Respostas dos Testes/ Exerccios

609

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

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

609 609 610 61 I 611 611 611 611 612 613 6\3
614

615 615 615 615 615 617


617 617

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

. . .. . . .

... . ..

619 619
620

621 621

622
623 623

67'

-,

xx

A prenda Visual Bas ic .NET em 21 Dias

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

Teste' .. .. . .. . .. . .. ... . .

Exerc cios' Respostas do Dia 12 . . .. . .

. . . . . . . . . . . . . . . . 627 . . . . . . ... ... .. . . . . . . . . 628

.. .

627

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

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

Teste ' . . .... . ...... .. . . .... ... . . . . . ... . . ... ... .. ... .... . . . 629

63 1

63 1 63 1
633 633 633 638 638

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

638
639 639

Exerc c ios ... .. .. ... .. . .. . .. . .. ..... . ... . . . . . Respostas do Dia 21 .. .. . .. . .. . . . . . . Teste' .. . . . .. . ... .. . . . . . .. . .. .. ... . . .. . . ... . .. .. .
ndice

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 ... . .. e ruins que devem ser evitadas.

Novo TERMO

Os cones Novo Termo assinalam locais onde uma nova lenninologia foi usada e definida pela primeira vez. Essa terrninologia aparece destacada com uma fonte em itlico. Os cones Cdigo so usados em exemplos de cdigo que o usurio deve inserir. Os cones Anlise apontam para discusses com explicaes sobre os exemplos de cdigos.

CDIGO

ANLISE

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
a segUI r:

Hoje, o introduzirei no universo da programao do Visual Basic respondendo s perguntas .

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

Aplicativo do Usurio (incluindo seus programas!)

Sistema Operacional Drivers de Dispositivos Componentes do Hardware Drivers de Dispositivos

Iwrdll'lIrc.

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

~~ ...

daIo(J boxl

exibitio de elementos de GU!.s (Gl'aphicaf


UseI' Ime/faces.

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

fme/faces gr4ficas com o usurio) como esta caixa de dilogo. o que fa= pane do. servios que ele fornece aos programas.

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

" , (crie/Edite o Cdigo)

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

Encontre erros)

C Compile ) ------'-~
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


peJ'mi/ell/ que voc crie

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

1iI"

... . . .

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

Projeto

"-

Distribuio

'\

./

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).
_ ............. _ ( _ 1

FIGURA 1.7

"13

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

Aplicativo do Usurio (in cluindo seus programas!)

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

.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

15

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

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
Windows 2000 '"'"''''''' , ' _ Servios di Web

Aplicativo. Cliente,

Grande QUlntidade de Servios Dispon(Yeis

Servidores Web

=
O. servios Web podem ser e><l>O$lo, a partir de qualquer sislema operacional" criados com qualquer

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
SlIIdio .N ET deseja

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

II
111 0 >< _ ' "
O lil~ ' ''_.o ._

Iil~"""'"

Iil.v _ _ _ """"",--",
til i/l~ _""'sro 1II 1il ~ "' ....... _ ___ ill~' .
Iil ~

.. ,,_ ,_ .

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


L . ... .

i/l.~ _""'_'_"

_ ..... ._
. .......... I'u.)

-..-_~ I

.Iil:._. ........ ,,.. 'w"' . .Iil,,""'" __. _


Iil:'_ ' _
. Iil~ , _

..

Iil~

___

_o.w, ...

,~_

..... ",

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

localmetl/e para que se


oblenl1ll mais velocidade.

---_ _._(1 ....... _ _

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


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

.... "" I , .... , , - ....:, TI>O _ ..... ." _ ... _

.....

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

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

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

"'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 um programa que no faz nada de til, ou mais espec ificamente, nada mais til do que apenas exibir a mensagem solicitada.
TERMO

A expresso programa "Helio lVorld! " ou "Ol Mundo! " descreve o exemplo de

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
muilOS Olllros

III/I

~"'
_...

(1l"(llIil'O de lexlo e documelllos.

0 .~

9><>"'"

fl _

~_<MO

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

...

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

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


_ _

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 Fraports System ao incio do arquivo de cdigo. mework, System, portanto, adicione a linha Im 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

Dia 1

COOIGol
RESULTADO

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 C lass Step3 Shared Sub Main{) System.Console.WriteLi ne{ System.Environment.OSVersion.ToString{)) nd E 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

31
"QEI

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

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

._
~

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


... ,ou<,
.

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


,

. , ' " l ....


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

~--------

I"',..' ,"'.
1.... , , ..- o.......

... ,...,

j(.. .....j

CJ CJ CJ

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

,,_._,.

t.vd<f, ......., . _

o.,....,... I

~,

......

J...

"''''
t

.. til""'"
~."",

...

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

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

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


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

""cWTd "."""

,_~ ~

sees da pgina inicial do Visual Sllfdio.

PKtK"""" .....

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

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

,"'11_ 1 _..... _ ' 'M_n ...... o.ww .......... _r........ 01 SQL .......

c_

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

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.

Trabalhando com o Vis ual Basic .N ET

33

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

._
~

too _

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


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

f~'..
~

I'Ir;J1:!

__

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.

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

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

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

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


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

... ....

"t" ...

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

,o.o<ud
"

" O u_'''' _.

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


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

'D<l "

."" "
. I

.. .. ..... _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
. _ _ ......... , ...... " " ... ...... , ( _ ) .... . .... !!lo _ _ _ _ tJOI>
~ '" ~ ~

..tl!3

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.

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

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

..,.,.."

, , ..... "..

..,,,., ...

,. -

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

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

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

~,

.....

H,O.,
~. '

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

Se voc deixasse ajanela de ferramentas nesse ponto, ela ficar ia ' desencaixada' , o que tambm conhecido como jane lajlutuallle (vej a a Figura 2.6), pos io na qual ela no estaria mais fixada a nenhuma borda do IDE.
FIGURA 2 .6

Se I'Vc liwr bastante espao lia leIa. poder deixaI' sI/as jane/as desencaixadas.

" . ,.....,

."

""""t"

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

.. x
....... a

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.
.~....... _, ............. _ " " I _ J ' .... ' ... I _ J
~

2.7 As j anelas de
FIGURA

"r::IEJ

ferramentas podem ser

fechadas por meio do peq1leno bouio X q1le


as ocultar da te/a at

, ....,

I"lflEJ

que sejam lIecessrias


f/OI'Gmente.

~,

..0 -

ii ' ... ' .. ~

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
2.8

Di a 2

FIGURA

T()(!as as janelas de ferram ellfas possuem 1/11/ pequeno pino que


permite que
.~e jalll

.... _ ot<o l"'" _ .\ ~ II!. .,: $I- Q

!!O\>

. '""""

'w.. '

-,,,"'

_.,"'~~~

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.

Trabalhando com o Visua l Basic .N ET

37

FIGURA

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

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


~e, ..,: .._!""'-~ $I. qj .:_

..r:lD

As gllias permitiro que voc tenha IIIl1ita.~ janelas diferentes de

... :O:'!'!' ..

1'I' .. m'
"
~

jerramelllas abertas cnqllalllO OCllpam o mesmo espao precioso


da tela.

.....""'
"'r.JC!

..

"

,,

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


",

" .. ,' '.0 .


<00

_ 'lO'

",'

-. . . 0;,

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


IZ r... _
J;IlI"'~_

<.....,

.. "(

,,-

.'-_EJ _.-......
.~-

,1 ~t. L>

."-" """",>

,,,,, ',.,,,

. ..

'"

0 _

0 .....-.._

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

""'""" .....

l<d> _

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

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


_ ' ..'I ., .

.
c

" " '"

Jl

. ..

40

Dia 2

NOTA

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 .
. _ _ .. _ .. ,"""' ............. ""7_1 , "'''' , ... _ _ 1_ _ ti<\> 11'190

FIGURA 2.13

~'"

'fJ<w

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
qualquer Olllro comrole

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

,p ql .--"

, .~ , ,,'
. "t <& , . . ~oS .. . . ~ . Ch.mU . . . . . . . . ' yot_ . 'Ta . . .

"0 '_

dela.

''"' ...

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

. co.., . . ' ........ " .N, ........ ,. 1" . . '.ot_.' _ ' ,.,' " .T u

' , ...

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

42

Dia 2

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
Debu!I ... X

A barra de fermmenra.l fornece boIes para


iniciar e imerromper li

II

ai

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


_ " " " .......... _ ..... ' '' '[ .. _1 , ~ ,.. Jooh _ tIOI>

45
I!IIIIgE!

FIGURA 2 .15

A janela Dyllamic Help tellla !/IOSlra/" informaes Ileis


me.mlO anles qlle voc

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

:!O<'

....

as solicite.

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

' . ".H_ " "r.,,.,,.... IN.. " "ro" .. .......


C.~"OI'."""

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

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


. ,

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


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

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


~

.... ...
" "

.. . ... _

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

,.. ,

~ ,, -_

,,_ . ,-~, .,.

'

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

sel1'idor local qllal/lo


de outras mquinas.

'onol

.....
c .....

-_L.yo.'''.,.., ......
.... . ",."""
" . To . . . " ono"

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


... ~.o .. . _

" .C "". ......." ....O<u' ... . . ''"I'"'. n,) !! .. ," $,,, . ,_.""' .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).

Trabalhando com o Vis ual Basic .N ET

47

FIGURA

2.17 Quando IIfIl objeto for


,,~m'

se/eciollado lia jalle/a

de ediiio (lima caixa


de texto em UIII

..
-, I

formulrio /lesse caso),


ajal/ela Properties exibir todos os seus
0-

atribllfos.

~r _~

o o o

-. .. -- ... -_0- .-0. _


"""' . ., ...
~

_., ..
o

o~

''''1, , o
o
p' ,
~~

o~

o~
~

- 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

A janela C/oss View


moslra seu {)ro)elo

l ltle. .c~

p.*:I

(>oco

!II> _

'"'

.'"

OIgani::ado por seus


objelos e 11(10 por sellS

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

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

"

. ...,
r

lOIREI

R ' ' ... ,_"

"'." ."M/
r . ' ''J
r-R ''o:''

,.

Object Browser
Toda a programao na plataforma ,NET baseada em objetos - os objetos fornecidos como parte do .NET Framework, os que voc criar e at os que outros participantes de sua prpria equipe desenvolverem. Todos esses objetos possuem propriedades e mtodos por meio dos quais
possvel interagir com eles, mas como saber o que est disponvel? O Object Browser foi projetado para ajud- lo no trabalho com todos esses objetos, permitindo que voc navegue e pesquise em um catlogo de objetos disponveis. Esse catlogo inclui os objetos (c lasses) expostos por qualquer biblioteca de classes que for referenciada, alm das classes contidas em seu prprio projeto. Semelhante em alguns aspectos Class View, o Object Browser vai alm da funcionalidade dessa outra janela, incluindo objetos externos ao seu projeto. Essa janela mais til como uma maneira de documentao ou referncia, permit indo que classes sejam encontradas dentro do .NET Framework ou outras bibliotecas de c lasses e seus detalhes visualizados, como s uas propriedades e mtodos. Na Figura 2. 19, podemos ver o Object Browser sendo usado para pesquisar o contedo da biblioteca System .oata, exibindo infonnaes detalhadas que vo at o nvel dos parmetros necessrios para uma celta chamada de mtodo.

Lista de Tarefas
Em qualquer projeto de desenvolvimento, mesmo os concludos, h a probabilidade de ficarem vrias tarefas pendentes para serem completadas. As sees do programa podem prec isar de ajuste no desempenho. Pode haver erros conhecidos ou recursos que necessitem ser remediados. Quando as tarefas pendentes podem ser relacionadas em uma rea do cdigo, uma prtica comum entre os programadores marcar essa rea com comentrios. Quando os programadores incluem consistentemente certas palavras-chave como TODO ou BUG nesses comentrios, mais

Trabalhando com o Visual Basic .NET

49

fcil varrer o cdigo procurando-as para encontrar os trechos apropriados. O Visual Studio .NET forma lizou esse processo fornecendo uma lista real de tarefas que preenchida de modo automtico com referncias a qualquer seo de seu cdigo que contenha uma das vrias palavras-chave como TODO (mas, voc pode especificar a palavra-chave que qu iser). Cada comentrio encontrado ser, em seguida, relacionado em uma lista fcil de usar, detalhando no somente o prprio comentrio, mas tambm o arq uivo e a linha onde foi encontrado (veja a Figura 2.20).

FIGURA 2.19 O Objecl !JrOll'sel"

~~-_ o

' w ,"'~ CII


o

,, ~ e.I,,!

....

.........,

permile qlle sejam


examinadas as classes

....

-,'

""'...,. . _

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


o

fomeddas pelo .NET


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., . . . . .
''f<(),
C~.ycl1< ~ (

,.,.... , lO "

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

~_"._

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

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

.. .

~~

""_

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

I~~~~~'~'.~.~~~~~~~~~~~==~
, L.

_ ..

, ~,

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

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


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

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

-O'~

c,"

"'lO o .....,.

"'-

,- , ~

[ii.]

-'- " -!m ;:!li


iD
~~
~ ,~

[j,

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


I """,-~

..,.,.
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.
""' ,o~

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.

- (noW_

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

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

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

-~

p _

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


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

_
...
,, "'"

El I

~ _

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

I'. r. "II r

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

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


_ ......

..... _

"' _ - . .

D_

O 0 ..... _ 11<

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

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.

54

Dia 2

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
~ __

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

FIo .... <icn

1.0.2'314.16

especificadas antes de sI/a cOllstruc7o.

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.

58

Dia 2

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
Conflgural lon M<lMg~r

13

O Configuratioll Mal/ager permite que \'oc crie co/!figuracs diferenles para fillalidades distintas (leste. depurao.
aCeifa(io do 1I.WI'iO,

liberao e ol/Iras). cada IIlIIa podendo ter configuraes diferemes no lIIel/lI Build.

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

I T.". M=- I

em gera/usada fases de
depurao/lesfe,

11m'
1'1'0'"

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
Novo 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,
TERMO

Dia 3
Tipos de Varivel de Inteiros
Tamanho (Bytes) Abrangncia Comentrios

TABELA 3 . 1

Tipo de Dado

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. 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 varivel de inteiros-padro. Em geral, o inteiro o tipo mais ve loz de varivel para

Curto (Short)

-32.768

a
32.767

Inteiro (Integer)

- 2.147.483.648

a
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).
O tipo de varivel perfeito para esta po-

Longo (Long)

- 9.223.372.036. 854.775.808

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


Tamanho (Bytes)

Tipo de Dado

Abrangncia

Comentrios

Simp les (Single)

- 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.
O tipo duplo uma varivel de

Duplo (Doubl e)

- 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 IO para nmeros lm positivos

'ponto flutuante com preciso dupla', portanto, annazena duas vezes mais dgitos sign ificativos que o tipo simples ou 15 casas decimais. Use um tipo duplo sempre que voc fizer clculos com nmeros grandes ou quando quiser evitar os erros de arredondamento que podem acontecer no tipo simples, como ao efetuar clculos em aplicativos cientficos ou de engenharia.

68

Dia 3

Strings e Caracteres
Os nmeros so adequados se voc precisa armazenar quantidades ou espaos de tempo, mas com freqUnc ia tambm necessrio lidar com palavras na programao. O Visual Basic .NET fornece variveis para armazenamento de strings: os tipos de dado Char e Stri n9. O tipo Char

apropriado para o armaze namento de apenas um caractere (da o nome), enquanto o tipo Stri ng pode conter strings de comprimento maior. A Tabela 3.3 descreve os dois tipos de dados com
mais detalhes.
TABElA 3.3

Tipos de Variveis de Strings


Tamanho
(Bytes)

Tipo

de Dado

Abrangncia

Comentrios

Cha r String

Um caractere

Adequado para annazenar um n ico carac-

tere.

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

o cenrio o que o conjunto de caracteres ASCII (ou ANS I), popular no passado, de

No Unicode, cada caractere representado por dois bytes . Isso permite o armazenamento de todos os caracteres da li sta ASCI I, bem como os dos idiomas russo, grego, japons e tailands, os dos matemticos e ass im por diante. Em Un icode, 65 ainda representa a letra ' A' , mas 8800 o caraclere [iJ . O caraclere japons Hiranaga "IEM' ('no') representado por 12398. O Visual Basic .NET usa os valores Unicode para todos os caracteres, portanto o ti po Cha r usa dois bytes, e cada caractere de um tipo String acrescenta dois bytes de espao complementar de armazenamento.

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

Ti pos Diversos de Variveis Simples


Tamanho (Bytes) Abrangncia Comentrios

Tipo

de Dado

Booleano (Boo 1ean)

Verdadeiro (True) ou falso


(False)

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

Data (Date)

1 de jane iro

de 100a3 1 de dezembro de

9999

Voc poderia usar outro tipo de dado para armazenar datas como strin gs ou inteiro representando o perodo em dias aps alguma dat a especfica.

Declarando Variveis
Agora que voc conhece os ti pos de variveis dispon veis, como cri-las em seus programas? A maneira mai s si mples com a palavra-chave Dim (abrev iatura de ' Dimenso'), seguida pelo nome da varivel, a palavra-chave As e, por fim , pelo tipo da varivel. A aparncia a seguinte:

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 13 14 15 16 17 18 19 20 21 22 LISTAGEM 3.1 Declarando Arrays (continuao)

71

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

72

Dia 3

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

COOIGO

Const PI " 3.1415 As Double Const DSN As String" "Random"

ANALISE

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:

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

NOTA

Defina o tipo que quiser quando declarar constantes, exatamente como faz com as variveis.

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


Prefixo Exemplo

TipO de Varivel

Byte Curto (Short) Inteiro (integer) Longo (Long) Simples (Single)

byt sht

bytldade shtContagem iOvelhas 1Popul acao sngGolpe

i ou i nt l ou lng
,"g

Dia 3
3.5

TABELA

Convenes de Nomeao Sugeridas (continuao)


Prefixo Exemplo

Tipo de Varivel

Duplo (double) Char String Booleano Data (Date) Tipos definidos pelo usurio

d ou db 1

dblJuros cIniciaisIntermediarias sNome bEstaAberto dtDataA I uguel Variveis criadas, com base em estruturas equivalentes a um ponto ou retnguio poderiam ser chamadas de ptLocal e retTamanho
PI, TAXA_IMPOSTO

c
s ou s tr
b

dt
Dois ou trs caracteres importantes do nome da estrutura Nenhum prefixo. O nome todo em maisculas, com cada palavra separada pelo caractere sublinhado U Dois ou trs caracteres significativos

Constantes

Enumeraes

disDiaSemana, corCorFundo

NOTA

Por que essa confuso de um, dois e trs caracteres? Tenho de adm itir que alterei os prefixos que uso com o passar dos anos. Minha filosofia bsica era originalmente empregar s um caractere, para li mitar a desordem que os prefixos causam. No entanto, alguns deles s iriam provocar mais confuso . Por exemplo, qual seria o tipo de dado de sVa 1ue? Poderia ser o curto (Short), simples (Si n91 e) ou Stri n9. Para tipos de dados que comeam com a mesma letra, estendi o prefixo em alguns caracteres. Devo admitir, contudo, que ainda tendo a usar a letra s para strings porque tem sido empregada com freqncia. (Voc tem de fazer alg uns sacrifcios para evitar a sndrome do esforo repetitivo.) Quando comea r a usar esses prefixos, voc pode acha r que so um pouco confusos. No entanto, eles logo se tornam familiares, e as informaes que fornecem so inestimveis.

Clculos Simples
Apenas ter alguns valores definidos no produz um programa. Voc precisa fazer algo COm eles. , E necessrio efetuar clculos matemticos com os valores ou gerar algo mais substancial. De maneira semel hante, para tomar seus programas mais compreensiveis, com freqUncia ser preciso usar ou criar procedimentos. O Visual Basic .NET fornecer alguns deles; outros tero de ser escritos. Esses procedimentos vo de operadores, que executam muitos dos clculos matemticos COmuns, a funes mais complexas que poderiam afetar strings ou nmeros.

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


Uso Exemplo

Operador

::
+

Atribu i um valor a outro Soma dois va lores Subtrai um valor de outro Multi plica dois valores Divide um valor por outro Divide um valor por outro, mas s retoma um nmero inteiro Abrev iatura de mdu lo; retorna o reslO de uma diviso Associa duas strings Sm bolo para adicionar um valor e atribuir o resultado Sm bolo para subtrair um valor e atribu ir o resultado Smbolo para mu lt iplicar um va lor e atribuir o resultado Smbolo para dividir por um valor e atribuir o resultado

x" 6
Y " X 7

(Y igual a (3)

y " X - 4 (Y igual a 2) y " X 2(Yiguala (2) y " X / 2 (Y igual a 3) y " X \ 3 (Y igual a I)

/
\
Mod
&

y :: X Mod 3 (Y igual a 2) S " "01 " & "Mundo" (S igual a "Ol Mundo")
X +:: 2 (X igual a 8) X -= 3(Xiguala5)

."
.~

x *" 6 (X igual a 30)


X

I" 5 (X igual a 6)

&~

Smbolo para acrscimos a strings e atribuio do resu ltado Eleva um valor a potncia de um expoente

S &= " . John" (S igua l a "Ol Mundo, John") 3"4 (3 elevado a 4, retoma 8 I)

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.

76

Dia 3

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
Descrio

Funo

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). Convene para um tipo Byte. Todos os valores maiores do que 255 ou informaes fracionrias sero perdidos. 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. 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 . Converte para um tipo duplo (Doubl e). Converte para um inteiro (Integer). As fraes so arredondadas para o valor mais prx imo. Convene para um tipo longo (Long). As fraes so arredondadas para o valor mais prximo. Converte para um tipo curto (Short). As fraes so arredondadas para o valor mais prximo. Converte para uma String. Se o valor for uma data (Date), apresentar o formato abreviado.

CByte CChar CDate

CObl
Clnt CLng CSht CStr

Introduo Programao com o Visua l Basic .NET

77

TABELA

3.7

Funes de Converso (continuao)


Descrio

Funo

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

Funes de Manipulao de Stri ngs


Descrio Exemplo

Funo

Retorna o comprimento de uma string.

iValue " Len("Olc'i"} igual a 3).

('iValue

eh,
Ase
Left

Retorna o earaetere com base no valor ASCII oU Unieode inserido. Retoma o valor ASCII ou Unicode Retorna caracteres de uma string, comeando com o da extrema esquerda. Tambm precisa da quantidade de caracteres a retomar. Retorna caracteres de uma string, comeando com o da extrema direita (o oposto de Left). Tambm precisa da quantidade de caracteres a retomar.

sValue " Chr(56} ('sValue igua l a letra A). iValue" Asc("A") ('iValue igua la 56). sValue" Left("Olc'i Mundo", ('sValue igual a O).
2)

Right

sValue" Right("O lc'i Mundo", ('sValue igual a undo).

4)

Dia 3

TABELA

3.8

Funes de Manipulao de Stri ngs (continuao)


Descrio Exemplo

Funo

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). sVa lue - Mid("Oli Mundo", ('sValue igual a Mu ndo). 4)

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)

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.

Introduo Programao com o Visua l Basic .NET

79

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. Lcase Ucase LTrim Rtrim Trim Converte uma Slring em minsculas. Converte uma string em maiscu las. Remove todos os espaos que precedem uma string Remove todos os espaos que sucedem uma string Remove todos os espaos que antecedem e sucedem uma string sValue sValue Value sValue sVa lue
=

LCase("OIc1 Mundo") UCase("OIc1 Mu ndo")

'sValue igual a ol mundo


=

'sValue igual a OL MUNDO


=

Ltrim(" Ol Mundo ")

'sVa 1ue igual a "01 Mundo


=

"

Rtrim(" Trim("

Ol Mundo ") Ol Mundo" Mundo ")

'sValue igual a"


=

oa

'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


Descrio

Funo

IsArray IsDate IsNumeric IsObject TypeName

Retoma True (verdadeiro) se o parmetro for um array. Retoma True se o parmetro for reconhecido como uma data. Retoma True se o parmetro for reconhecido como um nmero. Retoma True se o parmetro for algum tipo de objeto. Retoma o nome do tipo de dado do parmetro, por exemplo, TypeName(sName) retomaria "String" .

Dia 3
TABELA

3.9

Funes Internas Diversas (continuao)


Descrio

Funo

Now
Today

Retorna a data e a hora atual. 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


3.2 Criando e Usando uma Sub- rotina

81

COOIGO

LISTAGEM

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

ANLISE

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

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 LISTAGEM

3.4

O Programa de Clculo de Investimentos

1 2 3 4 5
6

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
A

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 LISTAGEM

3.5

Declaraes para o Clculo do Valor Futuro

I 2 3 4

Private Private Private Private

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

85

CDIGO

LISTAGEM

3.6

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

LISTAGEM

3.7

A Rotina das Entradas Console . Read

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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
3 4 5 6

Console .WriteL i ne()


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 DepositoM ensal 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 D ouble = 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 R eturn 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
37

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 DepositoM ensal 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 D ouble '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 Pr iv ate Function GetValue(ByVal Prompt As String) As Stri ng Console .W rite(Prompt)

38 39

88
LISTAGEM 3. 10

Dia 3

COOIGO

O Programa Completo de Clculo de Investimentos


(continuao)

40 41
42

Return Console . ReadLine End Function Private Sub GetlnputValues()


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

43
44 45

46
47
48 49 50 51

dblJurosAnuais

=
lO

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

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

52 53
54

Private Sub DisplayResults(ByVal Resultado As Oouble)


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

90

Dia 3

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 N oite!" 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

20 21 22 23 End Class

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

Voc pode fazer o download de G reeti 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.
ANALISE

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.

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

97

LISTAGEM 4.2 5 6 7
8

Greeting_IFELSE.vb (continuao)

Shared Sub MainO Oim dtCurrent As System.OateTime Oim iHour As Integer dtCurrent =dtCurrent .Now iHour =dtCurrent.Hour 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

9
10
11

12
13 14

15
16
17

18 19
20

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
8
9

Public Class Greeting 'Execute o aplicativo Shared Sub Ma in() Oim dtCurrent As System.OateTime Oim iHou r As ln teger dtCurren t ~ dtCurrent. Now iHour ~ dtCurrent.Hour If (iHour < 12)Then Conso l e .Writeline(nBom Dia!") Elself (iHour >~ 12)And (iHour < 18)Then

10 11

12
13
14

Controlando o Fluxo dos Programas

99

LISTAGEM 4 .3

Greetings_Elself.vb (continuao) Conso 1e. Wri teU ne (" Boa la rde! ") Else

15

16
17 18 19

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"

100
1

Dia 4

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
o

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

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

9 10 11
12

13
14

15 16
17

18
19

20
21

Depois de inseri-lo em um arquivo de texto (ou fazer seu download) e compilar (vbc It :exe PatternMatcher. vb), tente executar esse programa com vrias entradas. Por exemplo, voc poderia *T usar um padro como C 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
1

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 Resultado TRUE FAl SE FAl SE FAl SE TRUE TRUE TRUE FAl SE FAl SE TRUE TRUE FAl SE FAl SE TRUE

Expresso TRUE ANO TRUE FALSE ANO TRUE TRUE ANO FAl SE FALSE ANO FALSE TRUE DR TRUE TRUE DR FAlSE FALSE DR TRUE FALSE DR FAlSE TRUE XDR TRUE TRUE XDR FAl SE FALSE XDR TRUE FALSE XOR FA LSE NDT TRUE NOT FALSE

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

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. 4.6 ShortCi reuit i n9. vb

LISTAGEM

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
13

Shared Function Test(sInput As String) As Boolean System.Console.WriteLine(sInput) Test = FALSE End Function

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.

104

Dia 4

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


LI STAGEM

Case no lugar das instrues If da Listagem 4.7 produzir o cdigo alternat ivo mostrado na Listagem 4.8. 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
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 Faa
.~

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
8

Shared Sub Main() Dim sOayName As String Dim iFirstDay As Integer Dim i LastOay As Integer Dim iCurrentDay As Integer iFirstOay = 2 iLastOay = 6 For iCurrentOay = iFirstDay to iLa stOay System.Console.WriteLine{WeekdayName(iCurrentDay)) Next iCurrentOay End Sub Shared Function WeekdayName{ByVa l iDayNumber As Integer)As String Dim sWeekdayName As String Select Case iDayNumber Case 1 sWeekdayName "Sunday " Case 2 sWeekdayName "Monday " Case 3 sWeekdayName "Tuesday

9 10
11 12

13 14

15
16

17 18
19

20
21

22

23 24

25 26

II

108

Dia 4

LISTAGEM 4 .10

(continuao)
Case 4
"Wednesday" "Thursday" "Friday" "Saturday"

27

sWeekdayName 28 29 Case 5 sWeekdayName 30 31 Case 6 sWeekdayName 32 Case 7 33 sWeekdayName 34 35 Case [1 se 36 sWeekdayN ame 37 E Select od 38 Return sWeekdayName 39 40 End Function 41 Eod Class

"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

109

LISTAGEM 4 .11

ForExample.vb

1 Imports System 2 Public Class ForExample


3

4 5 6 7 8
9

Shared Sub Ma i n{) Dim iCounter As Integer Dim iFirstValue As Integer Dim iLastValue As Integer Dim iIncrement As Integer iFirstValue ; O iLastValue : 100 ilncrement : 10 For iCounter = iFirstYalue to iLastYalue Step ilncrement System . Console . WriteLine{iCounter) Next iCounter

10 11 12

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

110
1

Dia 4

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
12 13 14
15

While iCounter

<=

iLastValue

'<Insira o bloco de cdigo aqui> iCounter = iCounter + iIncrement End While


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 D iMatch As Integer ~ -1 im 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

111

LISTAGEM 4 .13

WhileSearch.vb (continuao)

14

15
16 17

18 19
20 21

22

23
24

25
26

27 28 29 31

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 W 1e, depois hi 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-

112
1

Dia 4

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
Loop

3)

3 tambm funcionaria

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

NOTA

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.

o lao Do

Condies de Sada
Novo 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.
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 Loop

>

100 or arrNomes(i)

"Joe"

i = i + 1

114
1

Dia 4

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
=

iTarget) Dr (iCurrentGuess

-1)

iCurrentGuess
Loop

GetNextGuess()

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
2

loopPerfonnance _Better . vb

1 Public Class LoopPerfonnance 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
11

For i " 1 to 1000 System . Console.WriteLine(sName) Next i End Sub Shared Function UserName() As String Dim sName As String sN ame " System.Environment.UserName UserName = sName

12 13
14 15

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

Etapa 2: Insira Este Cdigo Acima da Instruo End Sub da Listagem 4. 16

1 2

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) L oop

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)

120

Dia 4

NOTA

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.

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

New System.Random()

13
14 15

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) 'Adivinhao do nmero iTargetNumber = objRandom.Next(iLowerBound.iUpperBound + 1) System.Console.Writeline{iTargetNumber)

16
17

18
19

20 21 22
23

End Sub 24 End C1 ass


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

121

LISTAGEM 4 .21

Lao das Entradas de seu Jogo

1 2 3 4 5 6 7 B
9

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 "

10
11

12
13

14 15

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

122

Dia 4

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)

8
9

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
Next i Counter

la
11 11 13

14
15

System.Console .WriteLine{iFactorial)
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 C lass Recursivefactorial Shared Sub Ma ln() 2 3 Dim sInput As String Dim ilnput As Integer 4

Controlando o Fluxo dos Programas

123

LISTAGEM 4.23

RecursiveFactoria l .vb

(continuao)

5
6 7

8 9 10
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 Shared Function Factoria l (n as I nteger)as Integer If n Else lhen Return 1
= 1

12 13
14

15
16
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
1

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
1

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

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
1

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.

142

Dia 5

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
Dados Escritrio Central Dados da Filial

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.

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

146

Dia 5

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

148

Dia 6

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


1'y
Catch Ex As Exception

Try:

[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


FIG URA 6 .1

Prob lem as e ...

151

A caixa de dilogo ['roj ecl Properlies

para 1/11/ programa com lili/ti exce[io.

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

_ --

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

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

--,

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

...

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

'

<.~
~; '

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

..,..

0""" ,

LISTAG EM 6 .2

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

ANLISE

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

Problemas e ...

153

NOTA

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.

TABELA 6.1

Excees Comuns Ouando Ocorre ? 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. Ocorre quando voc passa um valor nulo para um mtodo, e ele no o aceita. 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). 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. 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. 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. Ocorre quando seu programa no tem memria suficiente. Isso poder acontecer ao preencher arrays extensos ou ao executar um lao . 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 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 .

TipO de Exceo ArgumentException

ArgumentNul1Exception ArgumentOutOfRangeException

OivideByZeroException

I ndexOutofRangeExcepti on

NotlmplementedException

O urOfMemoryException

OverflowException

FileNotFoundException

Agora que voc j vi u a exceo e tem (espero) uma idia me lhor do que seja, deve adicionar o SEH a seu programa para fornecer ao usurio mais informaes quando um erro ocorrer.

154

Dia 6

Abra o projeto Exceptions no Visual Basic .NET. Voc copiar o projeto anterior e far es para capturar a exceo, como mostram as etapas a seguir:

a1tera~

I. Altere o nOlne do projeto para Excepti ons2. Faa isso selecionando o projeto no Solution Explorer e, em seguida, selecione File, Save Exception As no menu.
2. Altere o nome do arquivo que contm o cdigo para Excepti ons2 . vb. Faa isso se lecionando o arquivo no Solution Explorer e, em seguida, sc lecione File, Save Excepti on. vb As.

3. Adicione um bloco Try . .. End Try ao cd igo que efetua o clculo. Use uma instruo Catch genrica para capturar a exceo Di visioll By Zero .
4. Ad icione um cdigo para exibir uma mensagem mais am igve l quando a exceo ocorrer.

o novo cdigo deve ficar com uma aparncia semelhante ao da Listagem 6.3.
COlGO

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 System.Console . ReadLine() End Sub End Module

2 3

4 5 6 7
8

9
10
11 12 13 14

15 16
17

18
19

20
21

ANLISE

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

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 LISTAGEM

6.4

An i nhando Blocos Try .. . End Try

1 2 3 4 5 6 7
8
9

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

10
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

ANALISE

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

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

LISTAGEM

6.5

Usando a Seo Fi nall y

1 2 3 4 5 6
7

8 9 10
11 12

Sub WriteToFile{ByVa l FileN ame 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.FileM .OpenOrCreate . ode System.lO .F ileAccess.Write)
Tcy

13

14
15 16
17

18
19

20 21 22 23 24 25 26

'Grave no arquivo strOut "New System.IO.StreamWriter(fsOut) strOut.Write(OateTime.Today.ToString( Catch elO As E xception 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} . " , FileNam e) Fina lly fsOut.CloseO End Try End Sub

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


ANALISE

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.

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

ANLISE

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
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
Novo TERMO To importante quanto a tratar apropriadamente os eITos e excees a depurao 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 LISTAG EM 6 .7

Resultado de um Programa Que Calcula a Tabe la de Pagamentos de uma Hi pateca

Digite o valor do emprstimo:


100000
Anos 10
15

20

25

30

Juros 5.00 5.25

1060.66 790.79 1072.92 803.88

659.96 584.59 536.82 673.84 599.25 552.20

160
1

Dia 6

LISTAGEM 6.7 5.50 5.75 6.00


6.25 6.50
6.75

Resultado de um Programa Que Calcu l a a Tabela de Pagamentos de uma Hipoteca (continuao)

687.89614.09567.79 1097 . 69830.41 702.08 629.11 583.57 1110.21 843 .86 716.43 644.30 599.55
1085 . 26 817 . 08
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

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

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

1226.53 970.14 1239.86 984.74

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

U Programa Que Preci sa de Depurao m

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

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)

17

o Que Fazer Quando Programas Bons Apresentam


CODIGOI RESULTADO

Prob lemas e ...

161

LISTAGEM 6.8

Um

Programa Que Precisa de Depurao (continuao)

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

'Crie a tabela OutputMortgageTable(dblReturn) Console.Write("Pressione ENTER para continuar") Console . ReadLine() End Sub 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() Next End Sub

42 43 44 45 46
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 Q ue Precisa de Depurao (continuao)

RESULTADO Anos Juros

10 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

15 5. 00

20 415.67

25 415.67 436.50

30 5. 00 5.25 5. 50 5. 75 6. 00 6. 25 6.50 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 415.67 436.50 457.33 5. 00 5.25 5.50

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

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

457.33 478 . 17 499.00 519.83 540.67 561. 50 582.33 603.17 624 . 00 644.83 665.67 686.50 707 . 33 728.17 749.00 769.83 790.67 811.50 832.33

478 .1 7 5. 75 499.00 519.83 540.67 561. 50 582 . 33 603.17 624 . 00 644.83 665.67 686.50 707 . 33 728.17 749.00 769 . 83 790.67 811. 50 832.33 6.00 6.25 6.50 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

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

[00 [<II. "'" _

.,....,

1'" _

tlot>
~

O Visuall3asic .NEr 110

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

. -...

modo Break.

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


,< ,. , ....... ,.
'.uh

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


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

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


'Co . . . . ,.,",

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

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

Problemas e ...

165

6.5
1/111

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

f'o

Execlltando

t'"' jlooo _ ii: . U IlUHIIl


a

OM Ootu> I.... _
Iotlo

Iro ... . ,. &:I.

prog rallla com pOlllo de inlerrupcio.

11111

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

:3 ~I!.

. -., . ' R "

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

.... . . ,..".,"t.< ,.." .-.,


'Go< U. . . ' .... ,

."

"
_""" " 1

...".

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


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

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

... "

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


FIGURA 6 .6

Prob lemas e ...

167

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.

168

Dia 6

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

Prob lemas e ...

169

6.8

!lo

""

e._

t'ol

1'0

Examinando os I'a/ores das Wlriveis.

1l '\:.I . ~ g"

~e. "' ,

.. .p . ~
... _

.....
. -..

. ,. ...

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

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:

170

Dia 6

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

FIGURA

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 M odule modMain


1

6 7 8 9 10 11 12 13 14 15

Sub M ain() 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) '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) Dim iVears As Integer Oim iRa te As Integer Oim dblAnnua l lnterest As Oouble Console.WriteLine(Tab & "Vears" & Tab & "l O" & Tab & "IS" & Tab & "20" & Tab & "25" & Tab & "30") Console.WriteLine{"Juros") For iRat e = 500 To 1000 Step 25 dblAnnualInterest = iRate / 100 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

16
17
18 19 20 21

22 23
24

25
26

27
28

29
30 31 32

33
34 35

36
37 38 39

40 41 42 43

172

Di a 6 Cdigo Depu r ado (continuao)

COIGO

LISTAGEM 6 .9

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

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

M odule

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
RESULTADO

Tabela de Multip li cao


5 6
7

(de5a9)

5 25 30 35
40

6 30
36 42

8
40

35
42 49

48 56
64

45 54
63 72

8
9

45

48 56

56
63

72

81

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
11

Dim iLow.iHigh As Integer Oim sInput As String

'Permita vrias execues da geraao da tabela


Do

12 13

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

Prob lem as e ...

175

LISTAG 6.10 EM

Cdigo da Tabe la de Multiplicao (continuao)

15
16 17

sInput " Console.ReadLine{) iLow = CInt{sInput) If iLow <>0 Then Console.Write("Valor mximo (mximo ig ua l a 20): ") sInput = Console.ReadLine{) iHigh " CInt(sInput) OutputTable{iLow, ;High) End If Loop Unt i 1 iLow " O Console.Write{"Pressione ENTE R para continuar") Console.ReadLine{) End Sub 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 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.

18 19
20 21

22
23

24 25 26

27
28

29 30 31
32 33

34 35 36 37
38

39 40
41

42 43
44

45

46

47 48 49 50
51

52

176

Dia 6

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.

nham.

Onde os objetos sero inseridos em seus programas.

Comearemos com a definio bsica de objeto e todos os termos e conceitos que a acompa-

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 M Model e Colar. ake,

180

Dia 7
_", . ~t

FIGURA 7 .1

VIII projeto m=io ti

iniciado sem comer


nenhul/I orq/lh'o.

-" 'q G J .... . -- _'" _ . --_: "-'''''-,. :J,g=::.:: '-'"'' ' ' -0 _ _ ""'"
1 "-'
I~

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

,_,,,
.

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

""

l1 .

" iiI~
[ii~ ~

e na ,;

""

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

",-

,"

...... In

~-

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


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

...

I I

" AOdto_

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

1 " -

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


'

.........
I

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

181

COOIGO

LISTAGEM 7.1

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 M e Model , lembrando de tambm acrescentar ake 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 sua definio no deve ser includo, porm ReadOnly dever ser especificada como pala, 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
1

Dia 7

3
4

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 &" "& objCar.Model

183

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 sM ake As String objCar " New clsCar() objCar2 " objCar objCar. M ake " "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.
COIGO
LISTAGEM

7.3

Adicionado Validao Propriedade Color

1 Public Class clsCar 2 Oim m sColor As String


3

4 5 6 7 8
9

Public Property Color() As String Get Return m sColor End Get 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

10
11 12 13 14 15 16 17 18 19

20
21

22 23 24 25
26

27 End Class Agora, uma tentativa de configurar a propriedade com uma cor invlida (invlida na lista interna de nosso cdigo, que considera a cor popular 'lils' , por exemp lo, como inadequada) resu ltar no lanamento de uma exceo. Para obter mais informaes sobre as excees e o tratamento de erros com base nelas, veja o Dia 6, "O Que Fazer quando Programas Bons Apresentam Problemas e para Se Certi fi car de Que Isso No Acontea". Como descrito nessa lio, podemos tratar corretamente essa exceo reescrevendo nosso cd igo de teste (contido em Sub Mai n( )) para que inclua uma estrutura Try . . . Catch. Esse cdigo alterado mostrado na Listagem 7.4.

Trabalhando com Objetos

185

COOIGO

LISTAGEM 7.4

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

objCar :: New cl sCarO objCar. Year = 1999


Try

7 8 9 10
11

12 13 14 15 16 objCar.Make = "Ford" 17 objCar .Model'" "Escort" 18 System.Console.WriteL i ne(objCar.Description) 19 End Sub

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

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 dtM - anufactured 6 End Get Set (ByVal Value As Date) 7 m dtManufactured = value 8 End Set 9 10 End Property

186

Dia 7

NO TA

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

LISTAGEM 7.6

Usando Nosso Mtodo Novo

1 2 3 4

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

Dia 7

COOIGO

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
27

Case "Days" 1ngUnits : tsDi fference. Days Case "Mi nutes" 1ngUnits : tsDi fference .Mi nutes

28 29
30

31 Case "Years" 32 lngUnits : tsDifference.Oays \ 365 33 End Select 34 Return lngUnits 35 End Function Todas essas funes na verdade so apenas variaes de GetAge, mas cada lista de parmetros diferente e seu cd igo correspondente precisa de seu prprio nome de funo. Com a sobreposio, eliminamos essa restrio e podemos criar todas essas funes usando o mesmo nome, GetAge. Para usar esse recurso, tudo que precisamos fazer adicionar a palavra-chave Overloads frente de cada (incluindo a original) declarao de funo (antes de Publ ic) e alterar todos os nomes das funes para que usem apenas um : Public Overloads Function GetAge() As Long End Function Public Overloads Function GetAge(ByVal dtPointlnTime As D ate) 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

189

NOTA

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 "" ' 9I>,!!f .CO!% fi. ""


$':!I , .... ~ .... ' ' , .<d' $':!I )O . ...... I _ ", ...,,... I?,,' '''.CO''' ' , ...... L, .. ,.. , ,"' .p .... " llUI
. . l C...... .. . . ' . .. d " I>O" DON

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

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

190
1

Dia 7

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

8
9

Public Property MaxSpeed () As Long Get End Get Set(ByVal Value As Long) End Set End Property Public Property NumberOfPassenge r s{) As Long Get End Get Set(ByVal Value As Long) End Set End Property Public Property Color() As String Get

10 11
12

13
14

15 16 17 18 19

20

Traba lh a ndo com Objetos

19 1

COOIGO

LISTAGEM 7 .9

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

192

Dia 7

COOIGO

LISTAGEM 7.11 Criando uma Classe - Filha (continuao)

8
9
10 11

Set(ByVal Value As Integer)


End Set End Property

12

13
14 15
16

Public Property NumberOfOoors() As Integer


Get
End Get

17
18 19

Set(ByVal Value As Integer)


End Set

20
21

End Property

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

193

FIGURA 7 .3

(do.

As classes expem

tJ ~iilGII

__

~_!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.'.',c.. V_" .. . o... ""Co< ...


~. .

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

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

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

194
1

Dia 7

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 U Classe-Filha Agindo como uma Instnc ia da ma Classe-Pai

1 Sub MainO 2 Dim objVehicle As Vehicle 3 Dim objCar As Car 4 objCar " New CarO
5

6 7
8

objCar.NumberOfDoors " 4 objCar.NumberOfPassengers " 6 objVehicle " objCar

Trabalhando com Objetos

195

COOIGO
10

LISTAGEM 7.13 Uma Classe - Filha Agindo como uma Instncia da Cl asse - Pa i (continuao)

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

LISTAGEM 7.14 Usando um Construtor para Inicializar os Membros de uma Cl asse


=

1 2
3

Public Sub New() m dtManufactured End Sub

System.Oate.Now()

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

LISTAGEM 7.15 Sobrepondo o Construtor de uma Classe para Fornecer Maneiras de Inicializar Objetos
=

1 2
3

Public Sub New() m dtManufactured End Sub

System.Oate.Now()

4
5

6 7 8
9

Public Sub New(ByVal sColor As String) m dtManufactured = system.Oate.Now m seolor = sColor End Sub Public Sub New{ByVal dtManufactured As Date, ByVal sColor As String) m dtManufactured = dtManufactured m sCo l or = seolor End Sub

10
11

12 13
14 15 16

17

No caso de uma classe-filha, aquela que herda caractersticas de outra classe, voc pode querer chamar o construtor da classe bsica de seu procedimento New. Isso pode ser feito fac il mente com o uso do objeto especial MyBase, empregando um cdigo como MyBase.New( l.

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

Decla r ando um Espao de Nome com Vria s Partes

1 Imports System

2 Namespace MyApp.Console 3 Modu le Main 4 Sub Main()

198

Dia 7

COOIGO

LISTAGEM 7.16 Declarando um Espao de Nome com Vrias Partes

5 6
7

Dim objHW As New MyApp.Console.Utilities() objHW,PrintOut()


End Sub

8
9 10
11 12

End Module
Public Class Utilities
'Run the application Public Sub PrintOutO

13 14 15 16
17

Console.WriteLine(Environment.MachineName) Console.Writeline(Environment.SystemDirectory) Console.Writeline(Environment.GetLogicalDrives{ Console.Writeline(Environment.Version.ToStri ng(


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 Sub MainO

6 7

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

Oim objHW As New MyApp.Console . Utilities() objHW.PrintOut() End Sub End Module

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 M ain 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)?
CDIGO

LISTAGEM

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
9

Public Sub New() m dtManufactured End Sub

System . DateTime.Now()

10 11 12 13
14

Public Sub New(ByVal sColor As String) m dtManufactured = System.DateTime.Now() m sColor =sColor End Sub Public Sub New(ByVal sName As String) End Sub Public Sub New(ByVal dtManufactured As Date, ByVal sColor As String) m dtManufactured = dtManufactured m sColor = sColor End Sub

15 16
17
18
19

20 21 22

23 24 End Class

Exerccios
Por meio da herana, das classes, das propriedades e dos mtodos, crie um exemp lo de hierarquia de classes comeando em Animal e descendo alguns nveis com algumas classes ilustrativas.

202

Dia 7

SEMANA
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 .m akron.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


Descrio

Metodo

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 M , como voc j viu muitas vezes, o primeiro mtodo executaain
do 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
RESULTADO LISTAGEM 8.2

Executando o Apl i cati vo do Console

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 C asuar Dugo qui dna Tentilho

1210
LISTAGEM 8.2

Dia8
Executando o Aplicativo do Console (continuao)

CDIGO!
RESULTADO

9 Girafa 10 Hipoptam o
11 Iguana 12 Chacal

13 14 15 16

Itens em ordem ; nversa: Chacal Iguana Hipoptamo 17 Gi rafa


19 quidna

18 Tentilho

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

Redirecionando a Sada do Console

1 Imports System 2 Imports System . IO

Introd uo ao .NET Framewo rk

211

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 11 12 13 14 15 16 17 18 19 20 21 22 23

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 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 Console.WriteLine() Console .SetOut(oFi le) Console .WriteLine("ltens em ordem inversa:") For I = ITEM_COUNT - 1 T O Step -1 o Console .WriteLine(sItems(I}} Next oFile.Close() Console.SetOut(oOut) Console .WriteLine("Conc l udo") Console.Read L ine()

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 Hipoptam o 11 Iguana 12 Chacal

Dia 8

13 14 Concludo
ANALISE

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

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


Membro Mtodos e Propriedades da classe Environment Descrio Propriedades

213

CorrmandLine Currentoi rectory O$Version SystemOi rectory Version

Representa a linha de comandos completa que iniciou o aplicati-

vo.
Retorna o caminho do diretrio atual. Retorna informaes sobre o sistema operacional atual, por exemplo, se o Wi ndows 9x, o NT ou o 2000. Retorna o caminho do diretrio do sistema (\winnt\system32 no Windows NT ou no 2000) . Retorna informaes sobre a verso de uma montagem . Mtodos

Exit GetCorrmandL i neArgs

Encerra um aplicativo, opcionalmente retornando um cdigo de erro que pode ser usado pelo sistema operacional. 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 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. Retorna a lista de unidades disponveis. Esse retorno feito na forma de um arrav de strings. O pri meiro (item DI elemento geralmenteA:\.

GetEnvironmentVariable

GetLogicalOrives

A classe Envi ronment t il quando voc precisa de informaes sobre o sistema que est ao redor da execuo de seu programa, como quando tem de saber onde gravar seus arquivos temporrios ou em que sistema operacional est sendo executado.

Random
Random uma classe simples, destinada a criar nmeros aleatrios, em geral um inteiro (I nteger) ou um duplo (Double). Os mtodos importantes dessa classe esto listados na Tabela 8.3. TABELA 8.3
Mtodo

Mtodos da Classe Random


Descrio Retorna um inteiro entre Oe o valor mximo possvel para um inteiro (aproximadamente 2 bilhes). Retorna um interi ro entre O e o valor de MaxValue (a lgum inteiro).

Next Next(MaxValue)

1 214
8.3

Dia8

T ABELA

Mtodos da Classe Random (continuao)


Descrio
Retorna um inteiro entre os valores min i mo e mximo. Essa a variao mais usada quando se precisa de , como valor mnimo. Retorna um tipo duplo entre O e 1.

Mtodo

Next(MinValue, MaxValue)
NextOouble

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
Retorna o va lor absoluto de um nmero (se for negativo, ele retornar o valor positivo do nmero). Retorna ocosseno de um ngulo (medido em radianos; veja a Nota a seguir). Retorna um tipo duplo representando o valor de e (2.7182818284590451). Retorna o valor mximo entre dois valores. Retorna o valor mnimo entre dois valores. Retorna um tipo duplo representando o valor de pi (3. 1415926535897931). Arredonda um nmero para o nmero intei ro mais prximo.

Abs
Cs

Max
Min
PI

Round

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
Membro

Dia8

Mtodos e Propriedades da Classe ArrayList


Descrio Propriedades O tamanho aluai da classe ArrayL i st. Configurado pela primeira vez quando ela criada (16 por padro), podendo aumentar conforme
mais elementos forem adicionados.
A quantidade efetiva de itens na classe ArrayList.

Capaci ty

Count

Item

Retorna um elemento especifico da classe ArrayList.


Mtodos
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).
Remove todos os itens de ArrayList . Count co nfigurada com O, mas Capacity no alterada.
Retorna a posio de um certo objeto na classe ArrayL ist oEsse mtodo til quando usado depois de uma ordenao.

Add

Clear
IndexOf

Insert Remove RemoveAt 50rt ToArray TrimTo5ize

Adiciona um novo elemento ArrayL i st em uma posio solicitada. Remove o objeto solicitado de ArrayList. Remove o elemento da posio solicitada. Ordena os membros de ArrayList. Copia toda ou pane de uma classe ArrayList em um array. Diminui ArrayList de modo que tanto Count quanto Capacity sejam iguais quantidade atu al de elementos na classe .

daaumentar, mas st tivermos noona substit uioconjunto avanar.sabemos que o taclasse mais adequado de arrays quando manho no de at onde o 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

Mtodos e Propriedades da Classe Queue


Descrio

Membro

Propriedades Count Clear Dequeue Enqueue


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

NOTA

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

Mtodos e Propriedades da Classe Stack


Descrio

Membro

Propriedades Count Clear


Pop

A quantidade de itens na pilha.

Mtodos 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

Dia8

TABELA 8.7

Mtodos e Propriedades da Classe Stack icontinuao)

Membro
Pus h
Peek

Descrio
Insere um novo objeto na pilha.
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. A quantidade efetiva de itens em SortedList. Mtodos

Count
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 IndexOfKey Item Keys Remove


Propriedade Propriedade Mtodo

Remove todos os itens de SortedLi st . Count confi gurada como 0, mas Capaci ty no alterada. Retorna a posio de um certo objeto em SortedL ist. Isso muito til aps a execuo de Sort. Retorna um elemento especfico de SortedList. Retorna todas as chaves armazenadas em SortedLi st. Remove o objeto solicitado de SortedList.

Introd uo ao .NET Fram ework TABELA 8.8


Membro
Remo~eAt

Mtodos e Propriedades da Classe SortedList


Tipo Descrio

(continuao)

TrimToSize Values

Mtodo Mtodo Propriedade

R emove 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


Mtodo

221

Mtodos da Estrutura Colar


Descrio

FromARGB

ToARGB

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.

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, MenuH ght e MousePresent. O mais importante para a sua pesquisa que a classe SytemI nforma ei 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. O
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

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


""...... P'lIEl

EJ

~ Ooor

(t.)

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
~ &.,t!M

A"''''''
~M!1rIoIenJ

[Obi ro.!So>:

" """'" R..wr......,


r.
GlOW6ox

QI Plct..e8ox

1P O.toGrld
I!".1IlktSo>: !~ Ched:edJstBox

O,'''

l!l1 ComboIIo

" r,o.'hlw li.::


I

" lktl'low

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
"!:l EI

FIGURA

9.4

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

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

ANLISE

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. U sando a Classe MessageBox para E xibir um Erro

LISTAGEM 9.3

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.

:. eom...""""_,,.

-....
~

......"'"

" " - 001.....,

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
14

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

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 um Caixa de Se l eo a

1 Private Sub btnCopy_Click(ByVal sender As System.Object. 2 ByVa l e As System.EventArgs) Handles btnCopy.C l ick 3 D m sSource As String i 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

9.9

Ma nipu l ando o Evento

btnMove Cl ick

1 2 3

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

Manipu l ando o Evento

btnMove Cl ick (continuao)

4 5 6 7 8 9 10
11

12

13
14

15
16

17 18

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
~Add'M'
S~eel:

EJ

formlllrio de elllrada de dados e

1", - - - - ~ " '<bR

Sl.<leNrov.f"i .",- -

[9E052

eSlt dispollrel para dOlVllload /lO site da Web desle Iil'/"o.

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

Eventos de Va l idao do fonnulrio de Endereos

3 4
5

6 7
8

9
10
11

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

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

20 21 22 23 24 25 26 27 28
29 30 31

32
33

34

35 36 37 38 39 40
41 42

If sPattern <> Then If objRegEx . IsM atch(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

241

liSTAGEM 9.10

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 " C Type(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
Itil

A classe MessageBox

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

1/11/0 jerromellfo

que pode exibir

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.
chamada apenas com o lexlo da mensagem (o ml/imo).

<T

FIGURA 9 .10

Uma caixa de
mensagem
IIIO/S

personali::ada, especificaI/do o texto.


o lf/llo e os

parmetrus dos

botes.

Obtendo Resultados
Depois que voc tiver escol hi do os botes que quer exibi r, desejar saber em qual o usurio deu um clique (pressupondo que voc tenha exibido algo mais alm de um boto OK). Essa informao retornada pelo mtodo Show como um valor Di aI ogResult, que pode ser armazenado em uma varivel, ou a cham ada do mtodo pode ser uti lizada diretamente em uma expresso ou instruo cond icional. A Listagem 9. 1 I mostra como formu lar uma pergunta ao usurio empregando a classe MessageBox e duas maneiras de manipular o resultado.
LISTAGEM 9.11

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) H l es btnTest.Click and 3 Oim drResult As DialogResult 4 drResult = M essageBox.Show("O que deseja fazer?". 5 "Exemplo" . MessageBoxButtons.RetryCancel)
1
6 7

If drResult = OialogResult,Retry lhen

8
9

10

'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 M todo 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
)

8
9

If File .Exi sts(sSou r ce) Then Dim sConfirm As String sConfinn "String.Format("Est certo de que deseja copiar lO} em III?". sSource . sOestination) If MessageBox.Show(sConfirm, "Confirm Copy" , M essageBoxButtons.Yes N _ o.

10 11

12
13 I' 15

16

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

245

LISTAGEM9.12 17 18
19

Us ando o Mtodo MessageBox .Show para Sol i ci tar Confi rmao (continuao)
=

Mes sageBoxIcon.Question. _ Mes sageBoxDefaultButton.Button 2)

DialogResult.Yes Then

20 Try 21 File . Copy(sSource. sDestination, chkOverwrite . Chec ked) 22 Catch objException As Except ion 23 MessageBox .Show{objException.Message) 24 End Try 25 End If 26 End If 27 End Sub
28

29 30 31 32 33 34 35 36 37 38 39
40

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) If MessageBox.Show(sConf irm. "Confirm Move", MessageBoxButtons . YesNo. M essageBoxIcon.Question ,_ MessageBoxDefaultButton . Button2) = DialogResult . Yes Then 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. M ove(sSource. sD i nation) est End I f End I f

41 42 43 44
45

46 47 48 49 50
51 52 53

54 55 56 57 59

58 End Sub

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
70

If File.Exists(sSource)Then Dim sConfirm As String sConfirm: String.Format( "Est certo de que deseja excluir {DI?" , sSource) If MessageBox.Show(sConfi rm ,_ "Confi rm Oel ete". MessageBoxButtons. YesNo, MessageBoxlcon.Question, _ MessageBoxDefaultButton.Button2) : DialogResult.Yes Then

71
72

73
74
75

File.Oelete(sSource) 77 End If 78 End If 79 End Sub

76

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

4
5

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
os erros de elltrada de

'"

I" 190001 IR_


,~

"-

_f'.
I

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
flo_
flo , tjlpO.

cdigo.

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


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

Us ando as Caixas de Dilogo Internas

1 2
3

Private Sub btnSave_Click{ByVal sender As System .Object. ByVal e As System.EventArgs) Handles btnSave . Click Dim sNewFileName As String Dim swDutput As IO.StreamWriter sNewFileName " sCurrentFile
If MessageBox.Show{"Salvar com um nome diferente de arquivo?" ,

4 5 6
7 8

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

"Save Fi le", MessageBoxButtons.YesNo . M essageBoxIcon.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

22

Desenvo lvendo uma Interface com o Usurio com os Formulrios Windows

253

LISTAGEM 9.15
23
24

Us ando as Cai xas de Di logo Internas (continuao) If .ShowDialog() : Dia logResult .OK lhen sNewFileName : . FileName swOutput : New IO . StreamWriter(sNewFileName) swOutput.Write{rtfContents.lext) swOutput.Close() sCurrentFile : sNewFileName End If End Wi th

25 26 27 28 29
30 31

32
33

End If End Sub

ANLISE

o uso da caixa de dilogo Save seme lhante ao de Open. Depois que o usurio con

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
4

Usando a Caixa de Dilogo Font

Private Sub btnFont_Click (ByVal sender As System .Object . ByVal e As System . EventArgs) H andles btnFont.Click dlgFont.Font = rtfContents .Font If dl gFont . ShowOialog(): DialogResult.OK lhen

Dia 9

LISTAGEM 9 .16

Usando a Caixa de Dilogo Font (continuao)

6 7 8

rtfContents. Font '" dl gFont. Font End If 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

9.17

Adicionando uma Seleo Grfica de Cores a um Aplicativo

2
3
4

Private Sub btnColor_Click{ByVal sender As System .Object. ByVal e As System.EventArgs) Handles btnColor.Click dlgColor.Color = rtfContents.ForeColor If dlgColor . ShowOialog{)= OialogResult .OK lhen rtfContents.ForeColor = dlgColor.Color End If End Sub

5
6 7

ANLISE

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

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

FIGURA

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.

256

Dia 9

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 i toda a verificao no evento Cl i ck de btnOK, situao na qua l seria desejvel que btnOK . D 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 D ialogRe 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

9.18

Us ando as Propr i edades de VaI idao

1 2 3 4

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

257

LISTAGEM 9.18

Usando as Propriedades de Validao (continuao)

6 7
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

sUserID = txtUserid . Text sPassword = txtPassword.Text


If sUserID. Trim()= " " Then

24

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 . O a1 ogResu1t como Cance1 (de modo que sempre execute o i 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

258

Dia 9

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 Exibindo um Formulrio como uma Caixa de Dilogo

1 2
3

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 If frmLogon . ShowDialog()= DialogResult.OK Then
If frmLogon. txtuserid . Text = "Duncan" lhen If frmLogon. txtpassword. lext = "password" lhen

4 5
6

7 8 9 10
11 12 13

14 15
16 17 18 19

20
21 22 23 24

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 If Not bLogonSuccessfu l Then MessageBox . Show(sFailureMessage. "No foi possvel efetuar logon". MessageBoxButtons.OK . MessageBoxIcon.Error) Me.C10se() End If End Sub

25 26 27

ANLISE

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.

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

260

Dia 9

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
9

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

261

LISTAGEM 9.20

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.

-----= Resposta-+-- s~:"~'; '0Navegador

;: :

..Pesquise
Banco de Dados

Servidor

W,b

FIGURA 10.2 O modelo de

programao da DY//(lmic HTML.

_
Resposte

.. Pesquisa
Banco de Dados

Servidor

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.

.'11" '
~.,,, .

.,,>'I ,,,.co

"""

1........

"rt

,
"li

f6Wii """ 3

0 __
;:~---

..

,"o..."

-' -

<o"

._,~ "" "

lo.

' ~' . . . - ' .. .~-~

rl""' _,,'1

,'

TABElA 10.1 Controle Label

Contro les-padro dos Formulrios da Web Descrio 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. 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.

TextBo x

Construindo a Interface com o Usurio com os Formulrios da Web

269

TABELA 10.1

Controles-padro dos For mulrios da Web (continuao)

Controle
Button LinkButton

Descrio
Use para fornecer ao usurio algo para dar um clique a fim de executar alguma ao. 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.) 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. 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. 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. 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. 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. 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.

ImageBut ton

Hype rl i nk

D ropDownList

ListBox

Chec kBox

CheckBoxLi 5t

I 270
TABELA 10.1

Dia 10

Controles-padro dos Formulrios da Web (continuao)

Controle
Radi oButton

Descrio
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 Pane i

o controle lmage permite que voc insira uma f igura na pgina.


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
.
~ , ~",."." I/'f~

Formulrio Ma dl i b.

..,. ,

~..

. "" ,1 ,, , '" 1.''' '01 ~." , b ... , ' t-oJO<O _ l!t~ ' .. mot '.tolo !"''''

"r.JEI
I'(omo,
l~'

e. "': .. &l o11

~_

.......

lfoIo

, ,:'"":"

,rII

"
L

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

II

A MacI UI> ... _

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

<......,

: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


Propriedade
(!D)

Controle

Valor
lb l Name

label

Text
Font Bold

Your fi rst name:


True

TextBox
label

(!D)

TxtName

(lO)

Ib l Oate
A date:

Text
Font Bold

True TxtDate

TextBox
Labe l

(!D)

( lO)

lb l Fruit
A kind of fruit:
True

Text
Font Bold
DropDownList

( lO)

cboFrui t
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

Items

o controle DropOownl is t

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

(lO)
Text Font Bold

1b1Number A number from 100 to 1000: True TxtNumber

TextBox

(lO)
Text

SOO
Ib l Emotion An emotional state: True rlstEmotion

label

(lO)
Text Font Bold

RadioButtonlist

(10)

Constru indo a Interface com o Usurio com os Formu lrios da Web

273

TABELA 10.2
Controle

Controles Usados no Formulrio Madl i b da Web (continuao)


Propriedade
1tems

Valor

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

RepeatCo I umns Label


( 10)

IblVerb A verb: True TxtVerb IblOccupation An occupat i on: True txtoccupat i on cmdWr te Wrte Story cmdClear Cl ear IblResult Deixe este campo em branco (ou seja, exclua o vaIar da propriedade Text) Groove
75%

Text TextBox Label Font Bold (ID)


(10)

Text Font Bold TextSox Sutton Sutton label


(10) (10)

Text
10

Text
(10)

Text BorderStyle Width

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

l iSTAG EM

10.2

Cdigo para o Boto Write Story

1 2 3 4 5 6 7 8 g 10 11 12 13 14 15 16

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

276

Dia 10

CDIGO

LISTAGEM 10.2

Cdigo para o Boto Write Story (continuao)

17 18
19

'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

program no Visual Basic.NET. " ar

equivalente a:

10
11

sTemp

sTemp & "Em


ii

II

&txtOate.Text &

" Comecei

program no Visual Basic . NET." ar

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.
'!J h~. // "'/...., / ... ,, ' ' .." ...."

FIGURA 10.6 O formulriO Madl i b em ao.

,.1<',,,, ,,,'....

0._" "" "' 0 "" 0>

fII!;] f3

Mad!..d:> ... _

whon .,...~ ..

liI<o ~d d

....,. ..

rp<di< <potJ '" cr ..... ()<.oJ><fuIIJ) ~ f><'Ioo..W.<d <ndftn

""<I> '''''' oe_do (......aty", trI>< ofwot<l. '" ...


A dOlO: r,- - - - A."""' .. f..". 100 '. 1000: ri- -

Th< .... _

....

r..... r"', ...... :r'----A kiod .r r,UI:

.'_""'---"::J
l....... (' m..
h>ln ('
Sboclu:d

AlI .... tio ... " ... :

(" Ezao.d (" Pneq (" F....... d (" F""".... d (" E<_ (' HoppJ
('
~d

('

(' SOilil, .. d ('

A ... tlo: r i- - - - -

AlI O""PoIi'lO: ri- - - - -

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


Propriedade Descrio

Item

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

1
2 3

Private Sub cmdClea r_Click(


ByVal sender As System.Object. ByVal e As System.EventArgs)

4 5 6
7
B

Handles cmdClear . Click txtName . Text" " " calDate .SelectedDate " DateTime . Today
txtVerb . Text
= " "

9 10 11

txtNumber.Text = " " txtOccupation.Text " " lblResult . Text - " "
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

1
2

Pr;vate Sub cmdWrite_Click(


ByVal sender As System.Object.

3 4 5 6 7 8 9 10
11 12 13 14 IS 16

17
1B

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
End Sub

19

ANALISE

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.

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


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

Propriedade

ControlToValidate

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
Controle

Prop riedad es para os Contro les Val idatar do Formulrio Madl ib


Propriedade
10

Valor

RequiredFieldValidator

reqName txtName Please enter a name reqNumber t xtNumber Please enter a number Dynamic rngNumber txtNumber Please ente r a number from 100 and 1000 Dynamic In teger (inteiro) 1000
100

ControlToValidate ErrorMessage RequiredFieldvalidator


( 10)

ControlToValidate ErrorMessage Display RangeVa 1 i da tor


(10)

ControlToValidate ErrorMessage Display Type MaximumValue MinimumValue RequiredFieldValidator


(10)

reqVerb txtVerb Please enter a verb Oynamic reqOccupation txtOccupation Please enter an occupation Dynamic valSummary

ControlToValidate ErrorMessage Display RequiredFieldValidator


(10)

ControlToValidate ErrorMessage Display ValidationSummary


( 10)

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 m umVa 1ue e M nimumVa 1ue com relao i 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,

282

Dia 10

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)
decima is do valor. Date (data) abril de 1986.

o mesmo que o inteiro, porm incl uindo as quatro primeiras casas


]2

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

de

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.:
(" P-k1 (" F"""""d (" F"' ..... d (" E<..- (" H~
(" ~d (" lo."f1'I (" Sbo<ld (" S. dd t_ d (" l,,",,,, (" Bb:

(" Enud

!.........,.., ..........
~.SlOtY
En", En ,

,,~ ~r- - - - -

f,;.,.,......., .... b ln .. ,op.tioo: ~r- - - - -

-- Io .. C

"'' ' >&< I c


,,'>&< ~

-.
>

,.....,

Co nstruind o a Inte rface com o Us u rio com os Fo rmul rios da We b


,. ."0 11" " , .m f ~"h",~. ,,,.

283
"'r:ll:!

FIGURA 10.8 O formulrio Mildl i b

rolo

u.

~"

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

1_ . '"' '

0 ..1, '.'" 00 , . "

000'

l/IO~

_._. 1_ _

mostrando os erros enCOlI/rados na Iolidacio.

_.. II!l ....,,".............._ .... ...

. o [;l t:l

a: .......... a.. eS._ I!I'.'_'

G / . '7 9 '

&

,.. Ma<! II ...,. wb .. o _ pIoyt< ,,10<1' ....... oC_do (aIuaIy t>,,,,. oj"",Of<l O< <lo .... "00) 1Ioeo pkwd """ ...,.., .. 'Pt.&; ",""lO , ..... a~) _ _ pmlliiod eod .. ~

n.." ....do .0

1:

r.... r"" nua" - - -


"I<in~ orr..li!: ",."_.- - -""'13 .
1
.,.:J 1(

"d.. "' I~

.. 12. ml

A n.......rf' . .. 100 lO 1000:

"f';-- 11.., ....". """","bo"",,,,

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

.-

- - - --

. c::================Jr:rrcr: ~~_ ~;; ::


Resumo

l'lt_ = """".. brIW ... le ) 0Dd 1000 l'lt... <=r a..rn l'lt....".... "'.' ,~_

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

287

NOTA

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:
Novo TERMO

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. 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
Especifique cada campo que quiser recuperar em uma instruo SQL. Recupere a menor quantidade de dados ou de campos e registras passivei pa ra fornece r um desempenho melhor.

No Faa
No use * para indicar todos os campos, a menos que esteja certo de que precisar de cada campo que existe na tabela e de todos os outros que possam ser adicionados posteriormente.

Ordenando os Resultados
A ordem dos registras retornados no foi especi ficada nas duas consultas mostradas at agora, mas voc pode adicionar uma clusu la instruo SQL para configurar a ordem da classificao. Essa clusula, ORDER BY, usa uma lista de campos, permitindo que possa ser espec ificado mais de um na ordenao. A instruo SQL a seguir recupera os campos Arti stName e CDTi t1 e de todos os registras da tabela Disc, ordenando-os primeiro pelo nome do artista (Art is tName) e, em seguida, pelo titulo do CD (CDTit1e) dentro de cada conjunto de regi stros de artistas:

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.

Introduo aos Ba ncos de Dados

291

possvel saltar a lista dos nomes dos campos, contanto que a de valores esteja na ordem correta. No entanto, esse outro exemplo de como voc pode econom iZ:'lr tempo na criao do cd igo, porm tomando sua manuteno mai s difci l e fazendo com ele esteja mais propenso a apresentar alguma fa lha no futuro.

Alterando Registros
A SQL fornece a instruo UPDATE para que modificaes sejam feitas em registros existentes,

permitindo que voc altere de imed iato um ou mais campos de quantos registros quiser. Essa instruo possui a sintaxe bsica a seguir:
SINTAXE

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

'Sumner'
=

WHERE ArtistName

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

Desenvolvendo Bancos de Dados na lVeb Dominando SQL Serva 2000, Gunderloy

Pas~o

a Passo, Buyens

MS SQL Serva 2000 - Passo a Passo, Riordan

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
I'inculam lili/a
Olll/'Q,

ArtistlD ArtistName ArtistFirstName AnistLastName

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. Quando duas tabelas esto vinculadas pelo uso de chaves primrias e externas, diz-se que e las esto relacionadas.

Novo TeRMO

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

298

Dia 11
Dis<:Category

FIGURA 11 .3

Modelar

IIfIl

relac iO/1(1l1le/llo

muitos-para-II/uitos requer
trs tabelas: as dilas

PK

emidades que eSTo relacionadas e lima tabela


especial qlle exiSla apel/os

PK

i
Arti~tlD

para conect-Ias.

CD litle
I

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

SELE Art is t . Arti stName CT


WHERE

Di sc . CDTitle FR M Art ist

Di sc

Artist.ArtistIO '" Oisc.ArtistIO

RESULTADO

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 SE CT para assegura r que o banco de dados compreenda qual o campo deLE sejado. 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. D .COT i tle isc FROM D sc INNER JOIN Artist ON (Artist.ArtistID i 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. O banco de dados Access, que voc pode usar se no tiver o SQL Server ou o

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

sSQL = "SELECT C OTit le FRDM Disc ORDER BY ArtistID Ase" O connCO As New OleDb .OleDbConnection(sConnectionSt ring) im D cmdCO As New OleOb.OleObCommand(sSQL, connCO) im 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

16
17

18

19

20
21 22

23 drCD.C loseO 24 connCO.CloseO 25 Conso l e. ReadLineO 26 End Sub 27 End Module Se voc usar o banco de dados do Access (CD.mdb), sua string de conexo incluir o cam inho completo para esse arqu ivo como descrito a seguir: Provider=Microsoft.Jet.OLEDB.4.0Data Source=c:\chapterll\cd.mdb Certifique-se de alterar essa string de conexo a fim de indicar o caminho apropriado para CD.mdb em sua mquina. Se, por outro lado, voc usar SQL Server ou MSDE, e j tiver executado AttachOB. vbs com sucesso, ento, a string a segu ir deve funcionar em sua mquina: Provider=SQLOLEDB .lUser ID=saInitial Catalog=CDData Source=(local)

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

FIGURA 11 .6

Make MakelD

Exibio das labe/as referemes li perg1ll1la 2 do Tesle.

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

3 13

FIGURA 12.1

O ADO foi projetado


COIIIO 11111(1 c all1ada

Aplicativos do Visual Basic

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

SybaS6

~
Dados

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
(contm objatas para manipu lao de dados genricos)

o ADo.NET
dil'idido em dilas secs principais.

FIGUR A 12.2

OLED/3 e SQL. que permiTem q/le voc se


cOl/eele a lili/a

ampla

I'oriedade de fomes de dados.

Svstem.Dat3 .SQLClient (contm objatas espEtel/icos

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

3 17

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


8

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 M odule 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 M l el. vb. Lembre-se de substituir Ovalor odu 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

321

LISTAGEM 12.5

Configurando as Propriedades Individualmente

l 1 Dim objCmd As New O 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

Acessa nd o os Resultados de uma Consulta ao Banco de Dados (continuao)

14 15 16
17

18
19

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 = objCm d.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 M odule
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 D ataSet 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 nes, ta 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 Preenchendo um DataSet com os Resultados de uma Consulta

325

(continuao)
5 6 7 8 9 10 11
12

"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 ; " 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")

13
14

15 16 17 18
19

20 Try 21 obj Conn. Open () 22 23 Cateh myExcep tion As System.Exception 24 Conso1e.Writeline(myException.Message) End Try 25 26 If objConn.State = Conneetio nState.Open Then 27 28 Try 29 obj Da taAdapter . Fi 11 (objOS , "Di se") obj Conn. C1 ose () 30 Conso 1e. WriteL i ne (" {O} Rows" , _ 31 obj OS. Tab 1es ("Di se") . Rows. Count) 32 Cateh myExeeption As System.Exeeption 33 34 Console.Writeline(myExeeption .Message) End Try 35 Conso1e.Readline() 36 End If 37 End Sub 38 39 Eod Module
Como em todos os exemplos demonstrados at agora nesta lio, voc pode executar esse cd igo por sua prpri a conta colocando-o em um mdulo de um novo ap licativo do console.

326

Di a 12

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


Console.WriteLine("Column Name: {O} Data Type : (1}" ,_ objColumn . ColumnName,_ objColumn . DataType.FullName) Next

327

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. 12.8 Exibindo o Contedo de um OataTable

LISTAGEM

1 2 3 4
5

Sub OisplayTable(ByRef objTable As OataTable) Oim objRow As OataRow Oim objCol As OataColumn Oim i , j As Integer 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{) 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

6 7 8 9 10 11 12
13

14 15 16 17 18 19 20 21

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

A Funo DisplayTable (continuao)

9 10
11 12

13
14

Dim sSQL As String sSQL " "SELECT ArtisLArtistID , " &"ArtisLArtistName, D sc.CDTitle " & i "FROM Artist INNER JOIN D sc ON " & i "Artist.ArtistIO " Disc.ArtistID "

15
16 17

18 19 20 21 Tcy 22 objConn,Open{) 23 Catch myException As System.Exception 2' Console.WriteLine{ myException.Message) 25 26 End Try 27 28 If objConn.State " ConnectionState.Open Then Tcy 29 objoataAdapter . Fi 11 (obj OS. "Di se") 30 31 objConn.Close() 32 Dim ob j Table As DataTable ob j Table " objDS.Tables{"Disc") 33 3. DisplayTable(objTable) 35 36 Catch myExcep tion As System.Except ion 37 Console .Writeline{myException .Message) 38 End Try 39 Console.ReadLine() 40 End I f 41 .2 'od S,b

Dim objConn As New _ OleDb .Ol eDbConnection(sConnection) Dim objOataAdapter As New _ OleOb.01eDbO ataAdapter(sSQL,objConn) oim objoS As New _ DataSet("Cos")

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 ELETE, em vez de instrues SQL personalizadas). (usando mtodos do objeto, como O 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
9

'Neste caso, temos 3 colunas 'A rti stIO 'A rti stName 'CDTitle '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)

10 11 12 13 14 15

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
9

'Neste caso , temos 3 colunas 'A rtistIO 'A rtistName 'CDTitle objNewRow =' objTable.NewRow{) objNewRow(UArtistro") =' 3 objNewRow(UArtistName U =' uGeorge Orwell u ) objNewRow(UCOTitle U =' "Party like it 's 1984 U ) drRows.Add(objNewRow)

10 II 12 13 14

Nos dois casos, os dados foram ad icionados tabela, mas isso no sign ifica que sero retornados ao banco de dados. As alteraes efetuadas no banco de dados do servidor depoi s do momento em que os dados foram carregados nesse DataSet poderiam impedi r que os registras adicionados fosse m vlidos (voc poderia espec ificar um artista que tivesse sido excludo da tabe la Artist, por exemplo), mas voc no veria esse tipo de erro at o estgio da atuali zao. J que est trabalhando em um estado desconectado, ou off-line, quando usa um OataSet, qualquer problema relacionado ao servidor no ser descoberto at que haja a tentativa de atual iz-Io.

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 ataele estiver novamente na tabela original. H outros mtodos, Remove e RemoveAt, da classe O

Dia 12

RowCollection, que realmente removem o objeto OataRow especfico do conjunto. Usar Remove ou Rem oveAt 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

Acessando Dados co m a Plataforma .N ET

333

LISTAGEM 12.12 O Mtodo Oelete Marca uma linha como Excluda (continuao)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
71

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

72

73 74 75 76
77

") ")

78
79

80

Dia 12
O Mtodo Delete Marca uma Linha como Excluda (continuao)

LISTAGEM 12.12

Console.Write("[New] ") 81 Case DataRowState.Unchanged 82 ") Console.Write("[Unchanged] 83 [nd Selec t 84 For j = O To objTable.Columns.Count - 1 85 If objRow.RowState <> DataRowState . Deleted Then 86 Console .Write( "{O) ", 87 objRow.Item(j)) 88 Else 89 Console.Write{"{O) ", 90 91 objRow.Item(j, DataRowVersion.Original) 92 End If 93 Next 94 Console.WriteLine() 95 Next 96 End Sub 97 98 Eod Module Observe que na linha 90, dentro da rotina DisplayTable, uma sintaxe diferente foi usada para acessar o valor de um campo. Pela incluso do segundo parmetro, DataRowVersion.Origina l , esse cdigo especifica que o valor do campo aps a atualizao mais recente, ou no momento em que for carregado, deve ser exibido em vez do valor do cam po atual (o padro). Nesse caso, isso particu larmente importante porque uma linha exclu da no possui valores vlidos para o campo atual, e um erro ser gerado se voc tentar acess-los.

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

337

LISTAGEM 12.15

As Alteraes No Tm [feito at Que o Mtodo Update Seja Chamado (continuao)


=

29 30
31

sDeleteSQL

"OELETE FROM Artist WHERE ArtistI O " ?"

32 33
34

objOeleteCommand . Connection = objConn objOeleteCommand.CommandText = sOeleteSQL 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 objDataAdapter.DeleteCommand sUpdateSQL
= =

35 36 37 38 39
40

41 42 43 44 45 46 47 48 49 50 51 52
53

objDeleteCommand
=

"Update Artist SET ArtistName "WHERE ArtistlO = ?"

? " &

objUpdateCommand.Connection = objConn objUpdateCommand.CommandText = sUpdateSQL objUpdateComma nd. Parameters .Add(_ "@ArtistName" , OleDb .OleObType . Char) objParam.SourceColumn = "ArtistName" objParam.SourceVersion " DataRowVersion.Current
=

ob j Param

54 55 56 57
58

ob j Param " objUpdateCommand.Parameters.Add(_ "@ArtlstID". OleDb.OleDbType.lnteger) objParam . SourceColumn = "ArtistlO" objParam.SourceVersion " DataRowVersion.Original objDataAdapter.UpdateCommand sInsertSQL
= =

59
60

objUpdateCommand

61 62 63 64 65 66 67 68 69 70 71

"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

Dia 12

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja Chamado (continua o )

72
73 74 75 76
77

objParam " objlnsertCommand.Parameters.Add(~ "@ArtistName" , OleOb.OleObType .Char) objParam . SourceColumn" "ArtistName" objParam . SourceVersion " OataRowVersion . Current objOataAdapter . lnsertCommand " objlnsertCommand 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 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 D ataTable objTable " objDS.Tables("Artist") Oim drRows As OataRowCollection Oim objCurrentRow As OataRow drRows " objTable . Rows

78

79
80 81 82 83 84 85 86 87 88

89 90
91 92 93

94 95 96 97 98 99 100

101
102
103

104 105
106 107 108

109
110 111 112 113 114

Acessando Dados com a Plataforma .NET

339

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja Chamado (continua o ) DisplayTab l e(objTable) 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{)
=

115

116
117

11B 119
120

121 122 123 124 125 126 127 12B 129


130

11

Console.Write("Aps a excluso , " & II press i one return para vi sua 1i zar os resul tados") Console.ReadLine() DisplayTable(objTable) Console.Write("Se pretende inserir , " & pressione return para in ic iar!") Console.ReadLine()
II

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

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"

Dia 12

LISTAGEM 12.15

As Alteraes No Tm Efeito at Que o Mtodo Update Seja Chamado (continua o ) Console.Write("Oepois de atual i zar , " & " pressione return para visualizar os resultados") Console.ReadL ine () oisp l ayTable(objTable) obj Conn. open () obj Da taAdapter. Upda te (objoS , "Art i s t")

158 159 160 161 162 163 164 165 166 167 168

169 170 171 172 173 174 175 176


177

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

178 179 180 181 182 183 184 185 186 187 188
189 190 191 192 193 194 195 196

197 198 199 200

Acessando Dados com a Platafo rma .N ET


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

341

ANALISE

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.

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


90

@Pl', N' @PI int ' , 11

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 .M ssingSchemaAction _ i " 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") Try obj Conn. Open () Catch myException As System.Exception Conso1e . Writeline(myException.Message) End Try 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") objConn. C1 ose () Dim objTable As DataTable objTab1e" objOS.Tables("Artist") Dim drRows As OataRowCollection Dim objCurrentRow As DataRow drRows " objTab1e.Rows DisplayTable(objTable)

22
23 24 25 26 27

28
29 30 31 32 33

34
35 36 37 38 39 40
41 42

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)

44 45 46 47 48
49 50

Console . Write("Se pretende editar , " & " pressione return para inic i ar!") Console . ReadLine{) 'Exclua a linha com c have primria " 11 drRows.Find(7)("ArtistName") " "Kent Sharkey" Console.Write("Depois de editar , " &_ " pressione return para visualizar os resultados") Console . ReadLine() DisplayTable{objTable) objConn.Open{) ob j OataAdapter . Update (obj OS , "Art i s t") Catch myException As System.Exception Console.WriteLine{myException.Message) End Try Console.Write("Pressione Return para finalizar.") Console . ReadLine{)

51 52 53 54
55

56 57
58
59

60 61

62 63 64 65
66 67 68 69 70
71

End 11
End Sub Sub DisplayTable(ByRef objTable As DataTable) Dim objRow As OataRow Dim objCol As OataColumn Dim i , j As Integer 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

72 73 74 75 76 77 78 79 80 81 82

83 84
85

86

Dia 12 O Mtodo Update Executa os Comandos Correspondentes no Banco de Oados de Origem (continuao)

LISTAGEM 12.16

87 88 89
90

91
92 93

94 95
96 97

98

99 100 101 102 103

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

347

LISTAGEM 12.17 O OataSet Reflete Algo Semelhante

Fonte de Dados

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

&

15
16 17 18 19 20 21 22 23 24 25 26 sSQLArtist = "SELECT ArtistID. ArtistN ame 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") objOataAdapterArtist.MissingSchemaAction '" MissingSchemaAction . AddWithKey objOataAdapterOisc.MissingSchemaAction '" MissingSchemaAction.AddWithKey objOataAdapterArtist.Fill (objOS . "Artist") ob j OataAdapterOi sc . Fi 11 (objDS. "Di sc")

27
28 29 30 31

32
33 34

35
36 objOS . Rel ati ons . Add ("Oi scArti s t" '_ 37 objOS . Tab 1es ("Arti st") .Col umns ("Arti stIO"). _ 38 objOS. Tabl es (" Oi sc") .Col umns ("Art i stIO" 39 End Sub 40 End Module

Com os relacionamentos definidos, possvel usar essas infonnaes para perm iti r o acesso estruturado de uma Iinha de dados-pai a qualquer Iinha relacionada com ela na tabela-filha. O cd igo da Listagem 12.18, que pode ser adicionado no local exato que antecede o final do

Dia 12

procedimento da Listagem 12. 17, executa um lao por meio dos registros da tabela Artist e exibe os CDs associados a esse artista.
LISTAGEM 12.18

Acessando as li nhas - Filhas de Qualquer linha - Pai Especfica po r Meio do Mtodo GetChildRows

2
3 4 5 6 7 8 9 10 11

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

12

13 14 15

A parte essenc ial do cdigo desse exemplo est na linha 9, em que o mtodo GetChi 1dRows do objeto DataRow usado para retornar um array de DataRows da tabela-filha. Esse array inclui todas as linhas da tabela-filha em que os campos Art i stlO da tabela-pai e da fil ha tm uma correspondncia.

Visualizaes

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 O ataV 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

349

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" 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{)

36
37 38 39 40 41 42 43 44

Dia 12 12.19 Vrios Objetos OataView Apontando para o Mesmo DataTable

LISTAGEM

(continuao)
45 End Sub 46 End Module At a linha 22 no temos nada to diferente dos outros exemplos que vimos at aqui: uma conexo com o banco de dados foi aberta, e os dados foram carregados em um DataSet. Depois do carregamento de dados, um lao rpido (linhas 26 a 30) os exibiu sem dar a impresso de que percorreu um objeto DataView (na verdade percorreu a visuali zao de dados-padro). Em seguida, um objeto OataView foi criado e configurado com uma ordem e um filtro sobre os valores das linhas (linhas 32 a 35). Para concluir, esse objeto Da ta Vi ew foi usado para acessar as linhas (linhas 39 a 43), dessa vez exibindo-as aplicando sua ordem e filtro. O resultado desse cdigo, presumindo que voc tivesse feito todos os exemplos at este ponto, deve se parecer com o apresentado a seguir: Through Table 1 Natalie Imbruglia 2 The Trag ica ll y Hip 3 Sting 4 Queen 5 Soney M. 6 Sarenaked L adies 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 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.

NOTA

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.OleDbO ataAdapter(sSQL . objConn) Dim objOS _ As New OataSet("Artists") Dim objDV As OataView Try objConn.Open() Catch myException As System.Exception Windows . Forms.MessageBox.Show(myException.Message) End Try 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

22
23

24 25 26 27 28
29 30 31

32
33

34 35 36 37
38

39 40
41

42 43

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 ataSet, a linha no final do procedimento (linha 37) que realbanco de dados e obtendo um D mente 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.

354

Dia 12

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

358

Dia 13

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. M ''''0'' J ow

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

Usan do o Serve r Ex pl o rer

359

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

...... v_ - - - !o* _ _

FIGURA 13.2

e-_

t"O

t.'09

O Se/wr ExploreI'.

aJ li ' ,.;:

II QII J -.

e. .,. .. : . Q.

-..

...-. ,,,....,,,...,..
,
o" ........... ,
~'"""._

""" ''''''
,~,

OIIII}(>(I,

01111'00' ./lI'O'>I

360

Dia 13
. ......... ~'''''"'''''-*[_l ''..._ 1:1'> ~ \'10'< ,""" _ aO\>
oil ' Ill'~ "CII

FIGURA 13.3

--

VislIali=alldo conexes

a_

II!.' .c IJQ

de dados COIII o Serre,. Explore,..

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


....... 'T...

"'0/2001 tn/>OO l
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
Select, or enter a database name User name Password Select, or enter a server name Select the data base o n the server

Provedor
Access Todos Todos SOL Server

Finalidade
Este campo identifica o banco de dados do Access (arquivo MOS) com o qual se conectar. A con t a do usurio a ser usada na conexo com o banco de dados. A senha a ser usada na conexo com o banco de dados. 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. 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. 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.

SQL Server

Test Connection

Todos

362

Dia 13

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:

""" _

!lO\>

.il h~ QQII

.l_ r. . . . ,o.Q

- ~ ~ m~"~

..

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

OI,",V2001

........,

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

.....,..,

""012001

.,

TABELA 13.2
Objero

Objetos de bancos de dados


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

Views (visual izaes)

Stored procedures (procedimentos armazenados)

Usando o Server Explorer

363

TABELA 13.2

Objetos de bancos de dados (continuao)


Descrio

Objeto

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

Databasediagrams (d iagramas de bancos de dados)

FIGURA 13.6

!!lo to<

Diagrama de bal/co de dados.

"'*" I)000o , . . _ ......... jI . \:I . ~ "QII lr.ltll e. . . .. .t' . 1:1.


_
~

1>* _

.,.

'-

~~"~~~,~~~Q.~~;';;.:~, ~.; " ;~~;~'~"'~"'""~,,~,~ :'-__~",c~,a,.c-____~.".~ ..c; .~ ~ '-; " ~ " ~, .

It' -.

.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

364

Dia 13

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. 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. 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. 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. Fornece uma lista de todos os aplicativos em execuo. Voc pode se surpreender ao ver quantos programas so processados em seu computador. 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). 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). 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). 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).

Mdulos carregados (Loaded Modules)

Dados de gerenciamento (Management Dala)

Contadores de desempenho (Performance Counlers)

Processos (Processes)

Servios (Services)

Bancos de dados do SQL Server (SQL Serve r Dalabases) Servios da Web (Web Services) Filas de mensagens (Message Queues)

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
Controle

Propriedades da Grade de Dad os


Propriedade Valor

Form DataGrid

Text
Name Dock CaptionText

Customer listing dbgCus tomers Fi 11 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


Propriedade
Name Name

Controle
01 eDbConnection 01eDbDataAdapter

Valor
ConNW 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

*-

~"'"

tA< _

<II'" _

I"" _
~ . ....

QOI>

Objefos de conexo adicionados.

~ lJ ~!;I",

.\ibor."

"I:'

..T...

"""....

FIGURA 13.9

Adicionando o

DataSet.

_ _...._..._.... _._,._------"
r~l-

::J

,,- f" .. ""


p - _ _ .. _ .." " _
'' 0 , (0
, ,.. "

P 111" .... _

.. " " _.

Usando o Server Explorer


' ..._ _ _ - " - ' 1_1 ' <___ "'_1'

FIGURA 13.10

",~,}'ItoI)_aM

O DataSet adicionado.

(jJ .

CJ ~

1iI"

___

""_~

lo

Ie. ., . '.. q

-..

. 1M

.~, .. ,

..

1;, 00 '.,

'.i

\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

'"

l.'Ito

Conectando o OataSet

;,i) . 1:1 ~

1iI"

"""'"

-..,

<\I"

.....-

....

....

rlo ""

. .t:'.
...

r.. -...
i: t: o:

Il!t'

""'.>1
'1:1. .. .

ao OataGri d.
~.

.$ 'I!II "~,,

:o: . '"

.. ..

1;, . 'o

.... "' ......

i:!I"j:;; EI :ii

T.......

CDIGO

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,

370

Dia 13

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

ANALISE

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

o procedimento Fonn

seu programa. Se tudo funcionar, ele deve ter a aparncia da Figura 13.12.

FIGURA 13.12

Executal1do o
aplicativo Da taVi ew.
.....",.,-

-...:I "",.,

......tIoInK_ ,...,_.. 'T


tt ~ L>"I<

Solos _

....'"
UI<

~oI.nto .... ~~Oo""_

so .:...

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

eldoCoo>oo
&<>o _ '
CO<I ...

_50<1 """',.". _ "-to< Go a"", ~.,;.. . f'.......,..,"~

_Sotrr.>< o...... ... '''''''' Soon


hora
____

Ton._

_Oe '" ...


~

~ l<tlI ~

~,.,.~

a - .....
I"xCoo.f ,

r. &o,...,.,
~~_

"",... ....... SoIeo ......... UI<

"'11<ili'O

o--.
t I

C....... ~f'_Ct~ _.....,"'" Moo<co eh Y>n W""l o.",... ~<!>'btd

~-

..... c:',.,..." ...... attIob tnct<o


[)o""..x",

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


" ' _~h

~
!,lO;
~

SOles .........
0<'I!t< .......

_u.tnn o.....

..."""

~.~

SoIooA_ '" ""'" _ _ ........ <Mo _ ."."., f _ _ ... c"" ~ .... h.oI

fn.."eom._Dtv>

flss,t.,.""" _ .... ."


'

-..o ... . _ . ".

-, ,~. ~

.",,,,,
~

.~

0=

<w<

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

(9.)SSS ' 9'.1 ....S.


(OO4)SS'

{'l U'"
(S)SS~7

_w

u>um o ,,,..,,.

"~

{,mm

"M'."-

"".."',

Acessando os Contadores de Desempenho e os Registras de


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.

Usando o Server Explorer

371

FIGURA 13.13

O PelfLile em a(io.

10..._1

=.1:::::

Crie um novo ap li cativo Windows. Chame o novo projeto de PerfLite porque ele ser uma verso mais enxuta (ou ' Lite' na linguagem de marketing) do aplicativo Performance Mon itor que vem com o Windows NT e o Windows 2000. Quando o projeto estiver pronto, feche o formulrio-padro e renomeie-o como frrrtla i n. vb. A seguir, d um clique com o boto direito do mouse no arq uivo e selecione View Code . Altere todas as referncias a Fonnl para fnnMai n. Usar o comando Replace ajudar (lembre-se de se lecionar Search 1-1 idden Text). Para conclu ir, d um clique com o boto direito do mouse sobre o projeto no Solut ion Explorer, se lec ione Properties e altere o Startup Object no formulrio resultante para fnnMa i n (veja a Figura 13.14).

FIGURA 13.14
"O.'

Propriedades de PelfLile.

,,_o

":i co.mon_,,",
~
~

. ......

:J CO"Lw..... ~_<M

::,,,":,,,,,

_. . ..........

"

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


Valor

Propriedade

Text Si ze

PerfLi te
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


Propriedade Valor

Controle

Panel

Name Dock Height

pnlSweep

To,
240

Button

"me

TrackBar

Text Location Size Name location Size

cmdSweep &Start 8, 248 64, 24 trkSpeed 8, 280


104, 42
1

label

l a bel

label

Minimum Maximum Value Name Location Autosize Text Forecolor Name location Autosi ze Text Forecolor Name location Autosize Text Forecolor

20
10

Timer

',me

Interval

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:

Usando o Server Explorer

373

1. Abra o Server Explorer e selecione um servidor (pode ser seu prprio computador). 2. Abra a seo Performance Counters . 3. Role para baixo at encontrar o item Processor e abra-o. 4 . Abra o item % Processo r Time e selecione o item Total. 5. A rraste esse item sobre o formulrio e solte-o sobre ele. Um item chamado PerformanceCounterl deve ficar visvel em uma nova seo abaixo do formulrio (veja a Figura 13.15).

FIGURA 13.15 Depois de inc/lli/' o

!oK I!tw _

....

l!w 00" _

1.... _

.....

,.,. \!l o li' g ai ;:r. II;, e.

.., . ,

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

Propriedades do Objeto Event Log


Valor

Name

logApp

Source

PerfLite

FIGURA 13.16 O PerjLile, pronlo

filo

I0OI

....

.... 1_ _

!lO'>

jl \:.I ~ gGII

:t.1Q1! "' , .. Q

. -..

III ...,..,

para a codificaiio.

"- .. ....... ..
~

_ "lEI [Q>,NOO" 'L

.. ,'"'" "'"

.... _.''o~' e''''''

.
;

_.-;~--"_

.._-"--_._-_.O'IJ

Sto<
-~

_ . ....

""--~_

-.

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.

Usando o Server Explorer

375

FIGURA 13.17
O exemplo sendo execulodo.

i""

! - ........

-.
_

'1OO1S '"

COIGO

LISTAGEM 13.2 Cdigo do Controle Timer

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 . sngM em) '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

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

13 14 15 16

Private ByVal ByVal Dim

376

Dia 13

COOIGO

LISTAGEM 13.3 Desenhando a linha Delimitadora (continuao)

17 18
19

20 21 22 23
24

25
26

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 m itadora anterio r oGrafix.DrawLine{penBack, m_sngX, O. m_sngX , sngHeight) 'desenhe os pontos dos dados sngCPUY = sngHeight - (CPU * sngHeight) - 1 oGrafix,DrawLine(penCPU,_

27 28 29 30 31 32 33 34 35 36 37 38 39 40
41

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
'o nmero 10000 para dar a memria um valor adequado em minha mquina voc pode precisar alter-lo se a linha referente memria

42 43
44

45
46

47 48 49 50

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

LISTAG EM

13.4 Ativando e Desativando a Li nha Delimitadora

51 52 53
54

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

378

Dia 13

COOIGO

LISTAGEM 13.4 Ativando e Desativando a Linha Delimitadora (continuao)

55 56 57 58
59

cmdSweep.Text '" "&Stop" tmrClock.Enabled = True


El se

crndSweep.Text = "&Start" tmrClok.Enabled = False


Eod If Eod S,b

60 61

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

379

COOIGO

LISTAGEM

13.6 Variveis no Nvel do Formu lrio

69 7D
71

Dim m sngX As Single Dim m_sngY As Single D m_sngCPUY As Single im 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)
=

72 73 74 75 76 77 78 79 80
81

82

Const INCREMENT As Single

ANALISE

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.

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

Abordagem procedural para um Programa de Clculo de Hipoteca

1 2 3 4 5 6 7 8
9

'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 D curPri ncipal As Decimal im D curPayment As O im ecimal iYears = Clnt(txtPayments. Text) iMonths = iYears * 12 dbllnterestRate = CType(txtlnterest . Text. Ooub le) curPrincipal -; CType(txtPrincipal . Text, Decimal) 'div ida a taxa de juros por 12 pa ra obter a taxa mensal dbllnterestRate /= 12 curPrincipal *_ (1 - (l + dbllnterestRate))_ / (1 - (l + dblInterestRate) i Months)) + dbllnterestRate) IblMonthlyPayment.Text = cu rPayment.ToString() End Sub
=
A

10 11 12 13
14

15 16
17

18 19 20 21 22 23

cu rpayment

LISTAGEM 14.2

A bordagem Orientada a Objetos para um Programa de Clculo de H ipoteca 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 O ecimal

1 2 3 4 5 6 7
8

'Es tilo Private ByVal e Dim Dim Dim Dim

9 10 11
12

iYears = Clnt(txtPayments .Text) dbllnterestRate = CType(txtlnterest.Text. Ooub le) curPrincipal = CType{txtPrincipal. Text, Decimal)

Dia 14

LISTAGEM 14.2

Abordagem Orientada a Objetos para um Programa de Clculo de Hipoteca (continuao)

13 I' 15 16 17 18 19 20

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

1M odule AllAboutOb j ects 2 Sub Main() O x As myFi rs tCl ass im 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 M odule
14

= =

{Q}" , x.Name) {Q}" , y .Name)

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 As Variveis x e y Apontam para a Mesma Instncia de um Objeto

LISTAGEM 14.7

1 Module AllAboutObjects 2 Sub Main() 3 Oim x As myFirstClass 4 Oim y As myFirstClass X" New myFirstClass() 5
6
y " x

7 x.Name " "Fred" 8 y.Name " "Joe" 9 Console .Writeline("x.Name" {Ql" . x.Name) 10 Console.Writeline("y.Name" {Ql". y.Name) 11 Console.ReadlineO 12 End Sub 13 End Module A nica diferena entre as Listagens 14.7 e 14.6 est na linha 6, em que atribuda varivel y lima refernc ia x em vezde a uma nova instnciademyfi rstClass. Essa diferena sign ifica que nas linhas 7 e 8, o cdigo trabalha COm a propriedade Name da meSma instncia, e a sada dessa ro~ tina ser x.Name = Joe y.Name " Joe As duas instrues Wri teL i ne produzem o mesmo valor para a propriedade porque tanto x quan~ to y se referem mesma instncia do objeto. Esse conceito especfico, em que mltiplas v ar i~ veis se referem ao meSmO objeto, outro tpico importante, porm confuso. Verifique a seo 6.1 do Visual Basic Language Specification (parte da documentao da plataform a .NET; pes~ quise em "Tipos de Valores e Tipos de Referncia" para encontr~la) para obter mais detalhes. Na plataforma .NET, as propriedades podem ser apenas de leitura, apenas de gravao ou de le i ~ tura/gravao, permitindo a existncia de um controle sobre como esses valores so acessados. Voc aprender a controlar o acesso s propriedades de suas prprias classes no Dia 15.

Mtodos
Alm das propriedades, as classes tambm podem ter comportamentos ou aes associados a elas. Conhecidas como mtodos, essas aes permitem que uma classe possua alguma lgica in~ corporada alm das informaes que so armazenadas por suas propriedades. Urna casa no o melhor exemplo quando se quer fa lar sobre mtodos, mas uma classe casa criada para ser usada por um aplicat ivo de uma imobi liria pode possuir mtodos que listem a casa na Web (myHouse. Li st ( )), vendam a casa (myHouse . Sell ( )) ou at exibam uma propaganda (myHouse . Pri ntBrochure ("Printerl")). Esses mtodos so exatamente como qualquer outro procedimento; eles podem aceitar parmetros quando voc os chama e retornar valores tambm.

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 m yFirstClass

1 M odule AllAboutOb j ects

2
3 4

5
6

7
8

Sub Main() Dim x As myFirstClass x = New myFirstClass() x. DoSomethi ng () End Sub End M odule

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

Sobreposio um tenno usado para indicar que uma classe-fil ha fornece sua prpria implementao de um recurso da classe bsica, quando comparado simples

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 M odule AllAboutObjects

2
3 4

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

5
6 7 8

9 10
11 12

13 14 15 16 17 18 19 20 21 22 23 24 25

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 m ySnippet = New CodeSnippet{) 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

6
7 8

9
10 11 12

13 14 15 16 Publie Class Snippet 17 Publ ie Contents As String 18 Public Author As String 19 Publie Overridable Function GetSnippet() As String

Dia 14

LISTAGEM 14.11 Sobreponha uma Funo para Pe r sonaliz - la a Fim de Que Manipu le os Novos Recursos de Sua Cl asse (continuao)

20 21 22 23

2.

25 26 27 28 Public Class CodeSnippet 29 Inherits Snippet 30 Public Language As String 31 Public Purpose As String 32 33 Public Overrides Function GetSnippet{) As String 34 Dim sTmp As String 35 sTmp = MyBase . GetSnippet()&_ 36 Sys tem. Envi ronment.NewLi ne & 37 "Language: " & Language &_ 38 Sys tem. Envi ronment.NewLi ne & 39 "Purpose: " & Purpose 40 Return sTmp 41 End Function 42 End Class

Dim sTmp As String sTmp = "Author: " & Author &System.Environment.NewLine & Contents Return sTmp End Funct i on 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

393

LISTAGEM 14.12

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

394

Dia 14

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 Public Sub New() End Sub 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

21

22 23
24

25 26 27
28 29

30 31 32 33
34

Introd uo Prog ram ao Ori entada a Objetos

395

LISTAGEM

14.13

Os Const r utores Criam e Inicializam Seu Objeto (continuao)

35 36

37
38

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

Public Overridable Function GetSnippet() As String Oim sTmp As String sTmp " "Author: " &Author &System.Environment .NewLine &Contents Return sTmp End Function End Class

54 55 56
57

Public Sub New(ByVal Contents As String) MyBase . New(Contents) End Sub Public Sub New(ByVal Contents As St r ing, ByVal Author As Stri ng) Me.New(Contents) Me.Author " Author End Sub 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

58 59 60 61 62
63

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

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

Introduo Programao Orientada a Ob jetos

399

uma propriedade Tolal no objelo Carta, para indicar o valor lolal das cartas, mas a regra ' o s pode va ler 1 Oll II ' tornaria essa propriedade difcil de implementar e seria necessrio um trabalho maior no projeto. Os mtodos do objeto Baralho incluiriam Adicionar/Remover para o conjunto de cartas e um mtodo Embaralhar para misturar esse mesmo conjunto. O mtodo Adicionar/ Remover seria aplicado ao objeto Mo, mas Embaralhar no seria to ti l. Os objetos Baralho e Mo no so apenas semelhantes, eles so quase idnticos. Em vez de pensar na herana, uma opo seria transformar os dois na mesma classe, porm contendo quantidades diferentes de cartas. Como alternaliva, voc poderia criar Mo e Baralho como classes derivadas de uma classe ConjuntoCartas mais genrica. A classe Carta bem fcil de definir: naipe (Copas, Espadas, Ouros e Paus) e valor (2-1 O, K, Q, J, A), e no uma necess idade real de que seja herdada de qualquer outro objeto.

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 A llAboutObjects 2 Sub M ainO 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 M le odu
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 Q Voc Especifique Que uma ue 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 E Get nd [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.

410

Dia 15

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

7
8

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
25

Public ReadOnly Property OisplayName() As String Get Return String . Fonnat("{O} {lf", m sFirstName , m _sLastName) End Get End Property Public Property FirstName(} As String Get Return m sFi rstName E Get nd 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

26 27 28 29 30 31 32 33 3' 35 36 37 38 39
40 41

42 43

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)" Private sErrorMsg As String Private mCardType As CardTypes

22

23 24

Dia 15

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados

(continuao)
25 26
27

Private sCardNumber As String Private bValid As Boolean 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

28 29 30 31 32 33 34 35

36
37
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
59

60 61 62 63 64 65 66

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

41 5

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados

(continuao)
67 68 End If End Function 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 sTemp = sNumber sCredi tCard " " " Checksum " O For i " 1 To len{sTemp) If InStr{Numbers, Mid{sTemp, i, 1 O lhen sCreditCard " sCreditCard & Mid(sTemp, i, 1) End If Next mCardlype " CTPrefix(sCreditCard) sCardNumber " sCreditCard iCardLength " l en(sCreditCard) 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

69
70 71 72 73 74 75 76 77

78
79 80 81

82
83 84 85 86 87

88
89 90 91

92
93 94 95 96

97 98 99 100 10 1 102 103 104 105 106 107 108 109


110

Dia 15

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem aVal idao de Oados (continuao)


=

III

112
113

sCreditCard

Right{"OOOOOOOOOOOOOOOO" & sCreditCard , 16)

114 115 116 117 118 119 120 121 122 123 124
125 126

127

128 129
130 131
132 133

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

134 135 136


137

138 139 140 141 142


143

144
145 146 147 148 149 150 151 152 153

Cri ando Objetos no Visual Basic .N ET

41 7

LISTAGEM 15.6

Os Procedimentos de Propriedade Permitem a Va i idao de Dados

(continuao)
154 155 156 157
End If Return sTmp End Function End Class

ANALISE

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.

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.

418

Dia 15

NOTA

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

objOutlook.Session.Logon(NewSession:=False) objSession = CType(objOutlook.Session , Outlook.NameSpace) objPerson = objSession.CreateRecipient(Me. O isplayName) 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{) Oim objSample As New Person() objSample.FirstName = "Joel" objSample.LastName = "Sem eniuk" Console .Write l ine{objSample . OisplayName) Console .Writel ine{objSample.LookUplnOutlook{

26
27 28
29 30

Criando Obj etos no Visual Basic .NET

419

LISTAGEM 15.7

Esta Funo Recupera Infonnaes no Outloo k (continuao)

31 32 Console . ReadLineO 33 End Sub 34 End M odule

ANLISE

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.

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
17

Public Property AnnualInterestRate() As Double Get Return m dblInterestRate End Get Set(ByVal Value As Double) m dblInterestRate " Value End Set End Property 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 Publ ic Property Principal () As Decimal Get Return m urPrinc i pal _c End Get Set(ByVal Value As Decimal) m_curPrincipal '" Value End Set End Property Public Overridable Function PaymentAmount() As Decimal Dim iNumPaymentsPerYear As Integer " 12 Dim i Payments As Integer Dim dblFractionalInterestRate As Oouble Dim curPayment As Decimal iPayments " m_iDuration_Years * iNumPaymentsPerYear dblFractionalInterestRate "m dbllnterestRate / iNumPaymentsPerYear curPayment '" m_curPrincipal *

18 19 20 21 22 23 24 25
26

27 28 29 30 31 32 33 34
35

36 37 38 39 40
41

42 43
44

45

Criando Obj etos no Visual Basic .NET

421

LISTAGEM 15.8
46

A Herana E uma Boa M i ra de Adicionar Func i onalidade ane

(continuao)
47 48 49 50
1 - (I + dbI Fractio nallnterestRate_ /( 1 - ({I + dblFractionallnterestRate) + dblFractionallnterestRate)
A

iPayments

Return curPayment 51 End Funct i on 52 End Class

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 M ortgage 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

ANLISE

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 D ecimal 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)
+ dblFractionallnterestRate)

25 26
27

Return cu rPayment 28 End Function 29 End Class

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

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

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

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. M ailItem) 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 E Set nd End Property Pub l ic Property LastName() As String Get Return m sLastName E Get nd 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
32

End Set End Property 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
21

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" Oim slPeople As New Sortedlist{) slPeople.Add{objPersonl, ValI) slPeople .Add{objPerson2 , Va12) slPeople .Add{objPerson3 , Va13) Oim ob j DE As OictionaryEntry

22

23
24 25 26 27 28

29
30 For Each objOE ln slPeople 31 Console . WriteLine("{OJ {l}" , _ 32 CType (obj DE . Key , Person) . Di sp 1ayName , 33 CType{objOE. V alue, 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 D escription() 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
26

27
28

29
30

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

31 objLogFile.Flush{) 32 objLogFile.Close{) 33 End Sub 34 End Class

ANALISE

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.

Criando Obj etos no Visual Basic .N ET

43 1

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 M odule 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 M odule Public Class Person Implements IComparable Implements IDebuglnfo Private m_sName As String Private m_sFirstName As Stri ng Private m sLastName As String 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 N ame End Get Set(ByVa l Value As String} m sFirstName " Value End Set End Property Public Property LastName() As String

20
21 22 23 24 25 26 27 28
29 30 31

32
33 34 35 36 37 38 39 40 41 42 43
44

45

Dia 15

LISTAGEM 15.18 Usando a Interface IDebuglnfo (continuao)


46 47

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 Public ReadOnly Property ClassName() As String Implements IDebugInfo.ClassName Get Return "Person" End Get End Property

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

83
84 85 86 87 88

89

90

Criando Objetos no Visual Basic .NET

433

LISTAGEM 15.18

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 IO ebugInfo.SourceFi le 100 101 Get 102 Return "" 1i qu i dsoap 'bi gproj ect \Source' Person. vb" End Get 103 End Property 104 105 End Class

ANALISE

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.

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.

Criando Objetos no Visual Basic .NET

435

FIGURA 15.2
A caixa de dilogo Neil' Project iI/c/ui modelos para a criaio de bibliotecas de classes.

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

,_,
~
_ .M:I _

[ii.j
1'1

a ...... co .. _" -0 ...... , . . .. _, a ........... ',...".., ~_, -a ....... .....,wr

,,-.""

ii :;a

"""d ........

wo ,

....>CT _ _ 0....0

!JP

1 .. ..-..-....... - ...... """"


r _to"",,",
_ ..... . . - .. <>~ .. \>ty_

--

-.

.......,.

..:J

.................... _

.... 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 M l e modI odu 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 3N amespace l i bPerson 4 Publ ie Class Classl 5

Dia 15 15.20 O Mesmo Espao de Nome Pode Ser Usado em Vrios Arqui vos

LISTAGEM

(continuao)
6 End C1 ass 7 End Namespace

LISTAGEM

15.21 Para o Programador Que Usar Seu Cdigo. Tudo Parecer Parte de um nico Espao de Nome

1 2 3 4 5 6 7
8

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

442

Di a 16

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, m nuArquivo, m nuEditar, 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
File

Tecla de Acesso
F

N,w
Exit View

V
R

R,d
Green Slue

G
B

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


Atalho

Item do Menu

N,w
Exit

Ctrl N

CtrlO
CtrlR CtrlG CtrlB

R,d
Green Blu e

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
FIGURA 16.3

Dia 16
' - " " _' .................... '1_1 ....... ~ .. I _ I
0"0
~

I"Ir:lD
-,._ __

Teclas de atalho 1/0 tempo de proje/o.


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

:1 ~ e

... : .. ,p . Q
I"I[]

10<* _

"'"

"~

~~:~:"

~' ,:"

.,,~~~

.-

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

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

~-

.. .
'-

'

....
,

3.,,9 .........
,~

....

,,'

FIGURA 16.4

feclas de a/afho

110

tempo de execucio.

LISTAGEM 16,1 Cdigo para o Menu de Exemplo

1 2
3 4
5

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
8
9

Private Sub mnuFileEx i t _Click(ByVal sender As Object, ByVal e As $ystem. EventArgs) Handles mnuFileExit . Click
Me.CloseO
End Sub

10 11 12

Private Sub mnuViewRed_Click(ByVal sender As System . Object. ByVal e As System.EventArgs) Handles mnuViewRed . Cl l ck Me.BackColor : Color.Red

Formulrios Windows Avanados

447

LISTAGEM 16.1

Cdigo para o Menu de Exemplo (continuao)

13 14 15 16 17 18 19 20 21

End Sub Private Sub mnuViewGreen_Click(8yVal sender As System .Object , 8yVal e As System.EventArgs) Handles mnuViewGreen . Click Me.BackColor = Color.Green End Sub Private Sub mnuViewBlue_Click(ByVal sende r As System.Object, ByVal e As System.EventArgs) Handles mnuViewBlue . Click Me.BackColor = Color . Blue End Sub

ANALISE

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.

o manipulador de eventos mnuFi 1eNew

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

FIGURA

~ ~ ~

kfelll/s COIl1I/IIS.

" a a 1). 1 Ir!, I' .. ii. 1:] 1""


Pt ' - 1_
(/0<.0 _ ljI\>

r-

I'<!"_ 1* '''''' _

ljI\>

- !li ~ I ~ --

. 12

1/

~..

1 li" _ =;="
.J<J~

@ !lIo tdt _

Q ~ g l al1l.~ ,l.fQt!, -, - il,1:/. !l O I!l ~ I -

" ,O -

/I/

iII :

::!l ~

.. ___ ' -

1_ SIcIo _ _ t!>l>

.a.l.tJ~

Q~ ,, ~ a

' e ...

(, ~"'"

. 1]

: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
iflfeljace de
doeI/mel/los 1IIllliplos.

!'! .... ,.........

..rJll

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

Cr iando um Formulrio - filho

1
2
3

4 5
6

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

451

LISTAGEM 16.2

Criando um Form ulrio - filho (continuao)


oForrn.MdiParent " Me oForrn.ShowO

7 8

End Sub

ANALISE

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.

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.

452

Dia 16

FIGURA 16.8

O comal/do Ti/e Hori:on/ally aplicado aos formulrios-filhos.

j!'I .. ,...........

FIGURA 16.9

I'II'J EI

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


Valor

Propriedade

Si ..
Text I sMdi Contai ner

4W,360

Picture View True

o usurio poder acessar um menu que lhe pennitir abrir novos arquivos a fim de visualiz-los.
Adicione os controles Ma i nMenu e OpenFi 1eDialog ao formulrio MDI-pai. Renomeie o objeto Mai nMenu como mnuMa i n e construa o menu como mostra a Tabela 16.4. Configure as propriedades de OpenFi 1eDi ai 09 como descrito na Tabela 16.5.
TABELA 16.4
Estrutura do Menu do Formulrio MDI -pai
Propriedade
(Name)

Item do Menu
Nvel superior

Valor

MnuF il e Fil e MnuF i I eOpen &Open Ctrl +0 MnuF il eSep nuFi 1eExi t M E&x i t Ctrl+Q

Text
Abaixo de File
(Name)

Text Shortcut
Abaixo de Open
(Name)

Text
Abaixo do separador
(Name)

Text Shortcut

Formul rios Windows Avanados

455

TABELA 16.4

Estrutura do Menu do Formu lrio MOI-pai (continuao)


Propriedade Valor

Item do Menu

Menu de nvel superior

(N ame) Text Mdi Li st

MnuW i ndow &Window True MnuWi ndowHori zonta 1 Tile & orizontal1y H MnuW i ndowVerti ca 1 Tile &Vertically MnuWindowCascade &Cascade MnuWindowArrange &Arrange Icons

Abaixo de Window Abaixo de Tile Horizontally Abaixo de Tile Vertically Abaixo de Cascade

(Name) Text (Name) Text (Name) Text (Name) Text

TABElA 16.5
Propriedade

Propriedades de OpenFileDialog
Valor

(Name) Fil ter

DlgOpen 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

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

5 6
7 8

9
10 11
12

Dia 16

LISTAGEM 16.3
13

Cdigo para os Comandos do Menu File de MultiPicView (continuao)

14 15 16 17 18 19
20

Private Sub mnuFileExit_Click(_ ByVal sender As System.Object . ByVal e As System.EventArgs) _ Handles mnuFileExit.Click Me . CloseO End Sub

21

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 W indows de MultiPicView

Private Sub mnuWindowHorizontal_Click( ByV al sender As System.Object . ByVal e As System.EventArgs) _ Handl es mnuWi ndowHori zontal . CI ick Me . LayoutMdi (MdiLayout . TileHo rizon tal) End Sub Private Sub mnuWindowVertical_Click( ByVal sender As System.Object . ByVal e As System . EventArgs)_ Handles mnuWindowVertical.Click Me. LayoutMdi (MdiLayout.TileVertical) End Sub Private Sub mnuWindowCascade_Click( ByVal sender As System.Object .

26
27 28

29
30 31 32 33

34
35 36

37
38 39

Form u l ri os Wi ndows Avanados

457

LISTAGEM 16.4
40
41 42 43 44 45

Cdigo para os Comandos do M enu Windows de MultiPicView

(continuao)
ByVal e As System . EventArgs) Handles mnuWindowCascade . Click Me. LayoutMdi (MdiLayout.Cascade) End Sub Private Sub mnuWindowArrange_Click( ByVal sender As System.Object. ByVal e As System . E ventArgs)_ Handles mnuWindowArrange . Click Me. LayoutMdi (MdiLayout.Arrangelcons) End Sub

46
47

48
49 50 51

52

ANLISE

Cada um dos quatro menus Window apenas executa o mtodo L ayoutMdi do formulrio MO I-pai, configurando a disposio desejada para os formulrios-fi lhos.

Agora voc est pronto para criar o formu lrio que ser usado para exibir as figuras. Adicione um segundo formu lrio ao projeto selecionando os itens Project e Add Windows Form no menu. Quando o nome fo r solicitado, nome ie o novo formu lrio como Pi ctureView. Altere sua propriedade Text para Picture View. Adic ione um controle PictureBox ao fOnTIulrio e configure as propriedades desse controle como mostra a Tabela 16.6. TABELA 16.6
Propriedade

Propriedades do Contro le Pict ureBox


Valor

(Name) Dock

PieY iew 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 FullRowSelect

Adiciona caixas de texto a cada item do controle TreeView. Isso faci l ita a criao de uma seleo mltipla . 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. Esta a propriedade mais importante do controle TreeVi ew. Ela contm a lista de todos os itens de nvel superior desse controle. 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 (\) . O n selecionado atualmente no controle TreeView. Determina se sero t raadas linhas entre os ns do controle TreeView. Determina se os caracteres + e- sero exibidos prximos aos ns do con trole TreeVi ew. Determina se sero traadas linhas para conectar os ns do nivel superior do controle TreeVi ew. Determina se os itens adicionados ao controle TreeView devem ser orde nados quando inseridos. M t odos

Nodes PathSeparator

Se 1ectedNode ShowLines ShowPl usMi nus ShowRootL ines Sorted

Co11apseA11 ExpandAll

Fecha todos os trs ns. Expande todos os trs ns. Eventos

BeforeCo 11 apse BeforeExpand

Ocorre antes que uma subrvore seja fechada . Pode ser usado para can celar o evento ou atualizar outros controles. 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. Ocorre antes que um n seja selecionado. 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. Ocorre depois que uma subrvore aberta. Pode ser usado para atualizar outros controles com os ns da rvore recen t emente exibidos. Ocorre depois que um n da rvore selecionado. Pode ser usado para atualizar outros controles com base no n selecionado.

BeforeSe1 ect AfterCollapse

AfterExpand AfterSelect

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

461

TABELA 16.8
Membro

Propriedades e Mtodos de TreeNode


Descrio

Propriedades Checked Full Path Usada junto com a propriedade Checkboxes do controle TreeVi ew. Esta propriedade ser igual a True se o objeto TreeNode for selecionado. Retorna uma string que contm cada um dos ns aba ixado que foi selecionado. todos separados pela propriedade PathSeparator do controle Tree View. Em geral. isso cria uma string semelhante a um caminho.

Nodes Text Collapse [xpand Toggle

O conjunto de TreeNodes desse TreeNode.


O texto desse TreeNode.
Mtodos Recol he a rvore comeando com o n atual. Expande a rvore comeando com o n selecionado. 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. importante conjunto. TABELA 16.9
Membro

A Tabela 16.9 descreve algumas das propriedades e mtodos d esse

Mtodos e Propriedades de TreeNodeCollection


Descrio

Propriedades Count Item Determina quantos itens existem no conjunto. 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. Remove todos os ns do conjunto selecionado. Retorna o nmero ref erente posio do n selecionado no conjunto. Adiciona um novo TreeNode lista de ns em uma posio definida. Remove do conjunto um n solicitado. Remove um n pelo ndice no conjunto .

Clear IndexOf Insert Remove RemoveAt

462

Dia 16

ListVie

o contro le Li stVi ew tambm deve ser familiar para a maioria dos usurios do Windows como o
lado esquerdo da janela Explorer, assim como em muitos outros locais. Ele semelhante a li stBox, no fato de poder conter vrios itens. No entanto, fornece mais recursos, j que permite a exibio dos itens de diversas maneiras. Os itens podem ser exibidos como uma lista, associados a cones grandes ou pequenos. Tambm possvel disponibil izar uma lista com detalhes adicionais de cada item. Para concluir, podemos usar Lis tV iewno lugar de um controle de grade porque ele tambm pode exibir linhas de grade . A Tabe la 16. 10 mostra algumas das propriedades, mtodos e eventos mais importantes do controle ListView.
TABElA 16. 10 Propriedades, Mtodos e Eventos Importantes do Controle listView

Membro
Checkboxes

Descrio
Propriedades

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. 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. Quando listView estiver no modo de exibio 'Detalhe', as colunas podero aparecer para que a lista fique organizada. Determina se a linha inteira ou apenas o texto do item ser marcado quando um item for selecionado. 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. Representa o conjunto de todos os it ens de ListView. Determina como li s tVi ew ser exibido. As opes possiveis so Large Icons, $malllcons, Ust ou Deta i!.
Mt odos

Check Indices

Co lumns FullRowSelect Gri dl ines

Items View

C1 ear
ColumnClick Se 1ectedlndexChanged

Remove todos os itens de ListView. Eventos 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.

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

463

TABELA 16.11

Propriedades de ListViewItem
Descrio
Propriedades Usada junto com a propriedade Checkboxes de ListView, esta propriedade ser igual a True se um item for selecionado. Retorna a posio do item em ListView. Determina se ListViewltem foi selecionado . Usada junto com o modo de exibio 'Detalhes' e a propriedade Co 1umns. Esta propriedade contm as informaes que sero exibidas nas colunas adicionais.

Membro
Checked Index Selected Subi tems

Enquanto TreeVi ew possui objetos TreeNodeCo 11 ect i on refletindo os conj untos de objetos TreeNode, L stVi ew apresenta objetos L stViewItemCol1 ection. Entretanto, esse conjunto menos i i 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

Propriedades e Mtodos de ListViewItemCollection


Descrio
Propriedades

Membro

Count Item

A quantidade de itens em ListViewCollection. 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. Remove todos os it ens do conjunto. Retorna o ndice, ou posio, do objeto ListViewltem solicitado. Adiciona um novo objeto Li s tVi ewI tem ao conjunto em uma posio solicitada. Remove um objeto ListViewItem do conjunto. Remove um item do conjunto pela posio.

Clear IndexOf Insert Remove RemoveAt

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

464

Di a 16

arrastar esse separador de um lado para outro, alterando o tamanho relativo dos doi s controles (veja a Figura 16.1 5). Esse o controle Sp 1itter. Ele um controle si mples, cuja nica finalidade perm ili resse tipo de redimensionamento dinmico. usado junto com dois controles encaixados. Um fica ancorado a um dos lados do formu lrio-pai , enquanto o outro tem sua propriedade Dock configurada com Fi 1 1. E raro ter de usar qualquer das propriedades do controle Spl itter. No entanto, h alg umas propriedades q ue voc pode querer configu rar para personalizar o comportamento do controle. Elas so descri tas na Tabela 16.13 .
TABElA 16.13
Membro
BackCol or

Propriedades Importantes do Controle Splitter


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

Dock

mi nS i ze

FIGURA 16.15

Ustmdo o comro!e
Sp1 itter.
.,,_ ...... Cool')

EJ

...
" ' (Do)

to,)

",.'

_ ...... ,,_ .. _ '-. ,ffj LiU B _ ... """"w _ ..... _."'-.' ~ .... Coo-<nj- - (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 TreeV ew, Lis t V ew e Sp 1i t ter i i (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 .
16.16
.......... .... ....". ....... ......... '1 _
_
~

1 -....... ......' . 1 """-)


""'" _ ti'\>

..r.lEl

F1GURA

Imel.face com o Ifsuarlo


para Ploneer.

...

~.",,:

..

,_o 8,_...... ,m(00<"""')


m (Dr' " ~.
$ ,

'.

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


13 ' .....
~_

TABELA

16.14

Propriedades do Formulrio Pioneer


Valor

Propriedade

Name Text Size

FrmPioneer Pioneer 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 Valor


TvwFolders Left 121

Propriedade
Name Dock

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


Valor
LvwFi 1es Fil 1

Propriedade
Name Dock 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

Adicio nando a Lista de Unidades a TreeView

2
3 4
5

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 For Each sDrive ln sDrives tvwNode = tvwFolders.Nodes.Add(sOrive) 'adicione um n fictcio tvwNode . Nodes. Add (" durrrny") Next End Sub

6
7
8

9
10 11

12
13 14

15

16

Formul rios Windows Avanados

467

ANLISE

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.

o mtodo GetLogi cal Dri ves da classe Di rectory

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

16.7

Manipuladores de Eventos de TreeView

17 18 19 20 21 22 23

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

2.
25

26
27 28

29
30
31

32 33 34 35 36 37 38 39 40 41 42

Dia 16

LISTAGEM 16.7

Manipuladores de Eventos de TreeView (continuao)

43
44 45 46 47 48

, disquete sem que ele esteja na unidade End Try

If Not IsNothing(sFiles) then Dim sFile As Stri ng Dim oItem As listViewltem


lvwFiles.ltems.Clear() For Each sFile ln sFiles oItem = lvwFiles.ltems.Add(StripPath(sFile Next End I f End Sub 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

49
50 51

52
53 54 55 56

57
58 59 60 61

62
63 64 For Each sOi r ln sOi rs oNode " node.Nodes.Add(StripPath(sOir 'adicione um n fictcio como filho oN . Nodes. Add ("du1TfllY") ode Next End Sub

65 66
67 68

69
70 Private Function StripPath(ByVal path As String) As String 71 'remova o caminho principal do nome do arquivo 72 Dim i Pos As Integer 73 'encontre o ltimo caractere \ 74 iPos = path.lastlndexOf("\") 75 'tudo que estiver depois dele o nome real do arquivo 76 Return path.Substring{iPos + 1) 77 End Function 78 End Class

ANALISE

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-

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

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.

FIGURA

16.17 O Piol/eer em ao.


~

"'_ .-...-.1.-- ,... ."' ..... .,- .... ... -"-" ....
$- ..... . ,

-' .

II> R[C"I"t\.lR
. ~

(': ~ "'. _ ct ,

... e_ ~ e 0.,.11

"" _ H'

..

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 IsM diContai 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?

472

Dia 16

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


Descrio

Mtodo

CreateDirectory Oelete E:d sts GetCurrentOirectory GetDirectories Getfi l es


TABELA

Cria um ou mais diretrios. Uma das funes mais poderosas des ta classe gerar uma rvore inteira de diretrios. Remove um diretrio. Retorna True se o di retrio existir. Retorna o camin ho completo do diretrio atual. Retorna um a rray contendo os diretrios-filhos do diretrio desejado . Retorna um array contendo os arquivos do di retrio solicitado.

17.2 Mtodos d a Classe File


Descrio

Mtodo

COpy Create CreateText Oelete Exi sts Open OpenRead OpenText

Copia um arquivo. Cria um novo arquivo. Uma verso especial de Create que cria um arquivo de texto. Exclu i um a rquivo . Retorna True se o arquivo existir. Abre um a rquivo para leitu ra, gravao ou ambos. Verso especial izada de Open que sempre abre o arquivo para leitura. 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. Verso especia lizada de Open que sempre abre o a rquivo para gravao.

OpenWri te

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.

476

Dia 17

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


Descrio
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. 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. 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 . Quantidade de bytes do arqu ivo. A posio atual do arquivo. Finaliza FileS tream. Sempre encerra a classe FileSteam (ou qua lq ue r classe Stream) quando voc t ermina de us-Ia.

Nome
CanRead (Propriedade)

CanSeek (Propri edade)

CanWri te (Propriedade)

Length (Propriedade) Position (Prop riedade) Close (Mtodo)

Usando o .NET Framewo rk

477

TABELA

17.3 Mtodos e Propriedades de FileStream (continuao)


Descrio

Nome

Read (Mtodo) Seek (Mtodo) Wri te (Mtodo)

l vrios bytes de Fi 1eStreamo Eles so retornados para voc em um array. Provoca a movimentao para a frente e para trs em um arquivo. 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


Descrio

Nome

Close Read ReadBlod Readl; ne ReadToEnd

Finaliza StreamReader. Sempre encerra suas classes St reamReader q uando voc termina de us-Ias. l o prximo caractere de Stream. Ser adequado se voc estiver lendo um caractere das informaes de cada vez. l um bloco de ca racteres de Stream. Pode ser uma maneira rpida de ler as informaes de uma classe Stream. L a prxima lin ha de Stream. uma maneira adequada de manipular arquivos que fornecem informaes organizadas por linhas. 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

LISTAGEM

17.1 Lendo um Arquivo

1 2 3 4 5 6 7 8 g

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
Finaliza StreamWriter. Sempre encerrar alguma classe StreamWriter

Close
Wri te WriteLine

que voc possa ter criado. Se isso falhar, poder causar a perda das ai
teraes feitas no arquivo.

Grava em Stream.
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 LISTAGEM

17.2 Gravando em um Arquivo

1 2 3 4 5 6 7 8 9 10 11 12 13 14

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


Valor

Propriedade

(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


Propriedade Valor

Item

Menu de nvel superior Abaixo de &Fi 1e

Abaixo de &New

Abaixo de &Open ...

Abaixo de &Save

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

Dia 17

T ABELA 17.7

O Menu Principal (continuao) Propriedade Valor

Item Abaixo de Save &As ... Abaixo de -

""" Caption
N,""
Caption Name Shortcut

mnuFi I eSaveAs

mnuFi I eSep E&xit mnuFi I eExi t CtrlQ &Edit mnuEdit Cu&t mnuEditCut CtrlX &Copy mnuEditCopy CtrlC &Paste mnuEditPaste CtrlV
&Help

Item de nvel superior Abaixo de &Ed; t

Caption

N,""
Caption

N,""
Shortcut
Abaixo de Cu&t

Caption Name Shortcut

Abaixo de &Copy

Caption

N,""
Shortcut
Item de nvel superior

Caption

N,""
Abaixo de &He 1p

mnuHe l p &About mnu He 1pAbout

Caption

N,""

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

481

TABELA 17.8

Outros Controles do Formulrio

Objeto
FileOpenDialog

Propriedade
Name Fi lter

Valor
dlgOpen Text Files [ *.txt [All Fi les l ** OlgSave Tex t Files [ *.txt IAll Fil es I *. * notel

FileSaveDialog

Name Filter FileName

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

LISTAGEM

17.3 Propri edades do Apl i cat i vo Note

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

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

ANALISE

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

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

LI STAGEM

17.5 Comandos do Menu File

2 3
4 5
6 7

8
9
10

11 12

13 14 15

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

485

CDIGO

LISTAGEM

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 m 1eSave . Click nuFi 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 E Try nd 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

Dia 17

CDIGO

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 ... E Try. nd

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 C Type{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
SetDataObject

Descrio

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

GetOataObject

TABElA 17.10

Mtodos de IDataObject
Descrio

Mtodo

GetOata

Recupera as informaes armazenadas na rea de transferncia. Formul rios intermedirios permitem que voc as converta em um forma to especifico. 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. 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.

GetFormats

GetOataPresent

o cdigo Copy do menu Edit semelhante ao do comando Cut do menu Ed it (linha 9), exceto
por no exclu irmos Otexto selecionado. Os dois comandos, no entanto, resu ltam na cpia das informaes para a rea de transferncia. Ocd igo do comando Paste do menu Edit parece complexo, mas se toma simples quando dividi mos as linhas 14 e 15 em uma srie de etapas. A primeira etapa para a recuperao de informaes da rea de transferncia obter, por meio de GetOataObject, a interface IDataObject armazenada nesse local. A segu ir, usamos o mtodo GetData de IDataObject para recuperar as informaes, solicitando-as no formato de texto simples. Embora tenhamos definido esse formato, se trata de um objeto. Portanto, para atribu-lo a TextBox, devemos convelt-lo em uma string. Poderamos ter usado a funo CStr ou CType, mas optamos pela ltima. Para concluir-

Dia 17

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

ANALISE

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.

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
6

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

491

LISTAGEM 17.8

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

ANALISE

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

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

493

TABELA 17 .11

Classes e Estruturas Importantes do Espao de Nome System.Drawing


Tipo Descrio

Item

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. 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.
A estrutura Calor contm informaes sobre todas as cores comuns que j possuem uma denominao definida, assim como pode criar outras novas.
A classe Font ser usada sempre que voc quiser inserir tex-

Brush

Classe

Colar

Estrutura

Font Graphics

Classe Classe

to em uma figura.
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 Estrutura Estrutura

Usada no desenho de linhas coloridas. Usada para representar um loca l em uma superfcie de desenho. Define coordenadas X e Y para o local. Representa uma rea retangular em um local preestabelecido. definida como uma regio comeando em um ponto, com largu ra e altura conhecidas. Representa uma rea retangular. Essa rea possu altura e largura.

Pai nt Rectangl e

Size

Estrutura

Voc usar muito as classes da Tabela 17. 11. Por exemplo, se desenhar um quadrado na tela, ele ser criado em um objeto Graphics, com uma classe Pen especfica, com uma estrutura Calor atribuda, dentro de uma estrutura Rectangl e . Essa ltima, por sua vez, se ria composta de uma estrutura Point e uma Size. Para concluir, seria possvel preencher o quadrado com a classe Brush que fosse selecionada. Para demonstrannos o LISO das c lasses de figuras , criaremos um programa simples de desenho . A Figura 17.3 mostra esse aplicativo em execuo. Voc pode estend-lo posteriormente para criar desenhos mais complexos .
,-' -_- - - - - - - - - - - - - "1;)1:1-

FIGURA

17.3
S<nbblel

O programa Scribble em ao.

'.

V net B.
Rocksf
"

494

Dia 17

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


Propriedade Valor
332

Controle
Forn

Height Wi dth Text BorderStyle

SOO
Scribble FixedSingle mnuMai n mnuFile mnuFi 1eNew CtrlN &New mnuFileOpen CtrlO &Open... mnuFileSave CtrlS &Save mnuFileExit CtrlQ E&xi t dlgOpen
Brnp

Menu Menu Fil e File , New

Name Name Name Shortcut Text

File, Open

Name Shortcut Text

File, Save

Name Shortcut Text

File, Exit

"'"" Shortcut
Text Name OefaultExt Fi lter

OpenFileDialog

Bitmap fi lesl *bmp IPNG files l*png dlgSave

SaveF;leOialog

Name

Usando o .NET Framewo rk

495

TABELA

11.12

Contro les do Aplicativo Scribble (continua o)


Propriedade Valor
Brnp

Controle

DefaultExt Fi 1ename Fi lter Dock Width RadioButton N ame Appearance Checked location Size Text TextAlign RadioButton N ame Appearance location RadioButton Si ze Text TextAlign RadioButton N ame Appea ra nce Locat ion Si ze Text TextAlign Pi ctureBox

Scribblel Bitmap filesl*.bmpIPNG filesl*png OockSty l e .left 64 optPen Button True 8,8 48 , 36

p,"
Mi ddl eCenter opt Shape Button 8,48 48 , 36 Shape Mi ddl eCenter optText Button 8,88 48 , 36 Text Mi ddl eCenter picDraw White Fi xed3D Fi 11 pnlOptions Bottom
72

Name
Bac kCo 1or BorderStyle Dock

Panel

N ame Dock Height

Label

N ame location Si ze Text

lblColo r 8, 8

48 , 16
Color : cboColors OropDownList

ComboBox

N ame DropDownS t yl e

Dia 17
11.12
Contro les do Aplicativo Scribble (continua o)
Propriedade Valor

TABELA

Controle

Location Wi dth Panei N ame Location Size Label ame N Location Size Text Nume ri cUpOown Name Locat ion Maximum Mi nimum Si ze Val ue Panei

8, 24
136

pn I PenOpt i ons
160, 8
274 , 56

IblPenWidth
8, 8
80 , 16

Pen Wi dth: updpenWidth


96 , 8
10
1

48 , 20
1

"me
Location Size ame N Location Si ze Text

pnlShapeOptions
160, 8
274 , 56

Label

IblShapeType
8, 8

48 , 16
Type: cboShapeType OropDownList
64 , 8
121

OropDown

N ame DropDownStyle Locat i on Wi dth

Label

N ame Location Size Text

IblShapeHeight
8, 32

48 , 16
H ight : e updShapeHeig ht
64 , 32 1000
1

NumericUpOown

N ame Location Maximum Minimum Si ze Va l ue

48, 20
20

Label

N ame

IblShapeWidth

Usando o .NET Framewo rk

497

TABELA

11.12

Controles do Aplicativo Scribble (continuao)


Propriedade Valor

Controle

Location Si ze Text Numer i cUpOown ame N Location Maximum Mi nimum Size Value Panel Name Locat ion Size Label N ame Location Size Text TextBox Name Location Si ze Text Label Name Location Size Text OropDown ame N DropDownStyl e Location Wi dth Label Name Location Si ze Text ame N Location Maximum Mi ni mum Size Val ue

128 , 32 48 , 16

Width: updShapeWidt h
184 , 32

IODO
1

48, 20

20
pnlTextOptions
160 , 8

274, 56

lblText
8, 8
40 , 16

Text: txtText
48 , 8 208 , 20

Scribble ! lblTextFon t
8, 32 40 , 16

Font: cboTextFont OropDownL is t


48 , 32
104

Numer i CUpOOWIl

lblFontSize 160 , 32 40, 16 Size : updFontSize


208 , 32 72 6 48, 20 12

498

Dia 17

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
6

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

Public Enum DrawingTools Pen Shape Text End Enum 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

7 8 g 10 11 12 13 14
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

500

Dia 17

ENTRADA

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

(continuao)
27
28

Return m_bOrawing
End Get

29
30

Set(ByVal Value As Boolea n)


m_bDrawing
=

Value

31
32 33

End Set
End Property

34
35

Public Property CurrentTool() As DrawingTools


Get

36
37

Return m eCurrentTool
End Get

38
39

Set(ByVal Value As DrawingTools)


m eCurrentTool = Value

40
41 42 43
44

'el imine a ferramenta existente If Not oTool Is Noth i ng Then


Clype (o T00 1 lOi sposab 1 e) . Di spose O End If
End Set

45
46

End Property

47 48 49 50
51

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

52 53 54 55 56 57 58 59 60 61
62

'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

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

501

ENTRADA

LISTA GEM 17.9

Propriedades e Cdigo Geral do Aplicativo Scribble

(continuao)
70 71 72
73

pn l ShapeOptions.Visible = False pnlTextOptions.V i sible = False End Sub 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 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 private Sub Fi l lLists() With cboCo l ors.ltems .Add(IBlack")
.Add("'ed"}

74 75 76 77 78 79 80 81 82 83
84

85 86 87 88 89 90 91 92 93 94
95

96 97 98
99

100 101 102 103 104 105 106 107 108 109
110

.Add("Green") .Add("Blue") End Wi th cboColors.SelectedIndex

With cboShapeType . Items .Add("Rectangle") .Add("Ell i pse") End With cboShapeType .SelectedIndex With cboTex tFont.Items .Add("Arial")

111 112

502

Dia 17

ENTRADA

LISTAGEM 17.9 Propriedades e Cdigo Geral do Aplicativo Scribble

(continuao)
113

.Add("Times New Roman")


. Add("Courier New")

"' 116
115

End With cboTextFon t.SelectedIndex - O

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 C urrentTool 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

503

o procedimento Fi 11 Li sts (linhas 96 a

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 D raw Estes mtodos so uti lizados para o desenho com o uso da ferramenta Pen (caneta). Em geral, s criam uma fonna vazia. Mtodos Fi 11 Estes mtodos so utilizados para o desenho cam o uso da ferramenta Brush (pincel). Criam uma forma que preenchida com uma cor ou textura.

A Tabela 17.13 descreve alguns dos mtodos mais usados da classe Graph i cs.
TABELA 17.13 Mtodo Clear OrawEl1 ipse

Mtodos da Classe System.Orawing.Graphies


Descrio Remove todo o contedo do objeto GraphiC$, substituindo-o pela cor solicitada. 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. Desenha uma linha no objeto Graphics usando a caneta atribuida. 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 . Escreve um texto no objeto Graphics. Preenche uma rea ovalou circular do objeto Graphics usando o pincel atribudo. Preenche uma rea retangular ou quadrada do objeto Graphics usando o pincel atribudo.

Orawl i ne OrawRectangle

DrawString FillEllipse FillRectangle

Agora estamos prontos para adicionar o cdigo do apl icativo Scribb le que far realmente o desenho. Quando estivermos no modo Shape ou Text, desenharemos um retngulo ou urna elipse, ou adicionaremos um texto onde o usurio der um clique. No entanto, o desenho de linhas um pouco diferente. Na verdade no podemos desenhar uma lin ha quando o usurio der um clique no boto do mouse; devemos aguardar que ele mova o mouse. Em vez disso, quando o mouse estiver com o boto pressionado, apenas o definiremos corno inativo. Depois, quando o usurio mover o mouse, se se u boto estiver pressionado, comearemos a desenhar. A Listagem 17. 10 mostra o cd igo dos manipuladores de evento de Pi ctureBox.

504

Dia 17

COOIGO

LISTAGEM 17.10

Manipu l adores de Evento de PictureBox

1 2 3
4

Private Sub picOraw_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picOraw .MouseMove
If Me.Drawing lhen

5 6

'isso s ser verdadeiro se a ferramenta atual for uma caneta


oGraphics.DrawLine{oTool. sngX. sngY, e.X, e. Y)

7
8

sngX : e.X
sngY:e.Y

9
10
11
12 End Sub

'force um redesenho
Me.picOraw.RefreshO
End If

13

14 15 16 17 18
19 20

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
End Sub

21
22 23 24 25 26 27 28 29 30
31

Private Sub picOraw_MouseDown(ByVal sender As Objecto


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,

32 33 34 35
36 37 38

39 40
41 42 43 44

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

LISTAGEM 17.10

Manipuladores de Evento de Pi ctureBox (continuao)

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 Eod Sub

Me.updShapeWidth.Value, _ Me.updShapeHeight.Value) Case Else nd E 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

ANALISE

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.

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
340. 134 10.088 20.971 10.262 15.492

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

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.picO raw.Refresh() End Sub Private Sub mnuFileOpen_Click() lf Me .dlgOpen.ShowDialog = OialogResult .OK Then Me .picOraw.lmage .From File(Me .dlgOpen.FileN ame) End If End Sub 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 'obtenha o nome do arquivo com o qual salvar lf dlgSave.ShowDia log = O ialogResult.OK Then

8 9 10 11 12
13

14 15 16 17
1B

19 20

508 ENTRADA LISTAGEM 17.11

Dia 17 Comandos do Menu (continuao)

21 22
23 24

25 26
27

28
29

30
31

32 33
34

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) 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 Private Sub mnuFileExit_Click(ByVal sender As System.Object. ByVal e As System.EventArgs) Handles mnuFileExit.Click Me . Close() End Sub

35 36 37 38 39 40
41

42 43 44 45

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

ANLISE

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.

510

Dia 17

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

O Cdigo Pode Ser Mais Comp lexo do Que Necessrio

1 2 3 4 5 6 7 8 9 10 11

Option Explicit On Option Strict On Imports System Imports System.IO Modu le Modulel Sub Main() Dim Pathl As String = "C:\file.t xt" Dim Pat h2 As String = "C:\file new. txt"

Retoques Fina is
O Cdigo Pode Ser Mais Complexo do Que E Necessrio (continuao)

LISTAGEM 18.1

12 13 14 15 16 17 18 19 20 21 22

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

Tornando Seu Cdigo Mai s Fcil de Compreender , Voc Poder Ter uma Documentao Menor

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Option Explicit On Option Strict On Imports System Imports System . IO Modu le WorkWithFiles Sub CopyFiles() Dim sInputFilePath As String" "C:\test.txt " Dim sOutputF ll ePath As String " "C : \output. txt" Dim fi le Input As New StreamReader(sInputFilePath) Dim fileOutput As New StreamWriter(sOutput FilePath) Dim sline As String 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 End Sub Sub Main()

15
16 17 18 19 20 21 22 23

24
25

26
27

514

Dia 18

LISTAGEM 18.2
28 29

Tornando Seu Cd ig o M i s Fcil de Compreender , Voc Poder Ter a

uma Documentao Menor (continuao)


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

odule Startup 1 M Public Sub Main{) 2 Dim sPasswo rd, sData. sFilePath As String 3 4 sFilePath" "C:\InpuLtxt"
5

InitializeSystemVariables{)

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!

6 7 8 9

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
ciclo cOl/lil/llo.
1/111

Verstio Conclulda Escopo

Requisitos e Projeto

Implantetio e Ma nutenli~

1Abrangncia I

Desenvolvimento /

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
String I nteger (Intei ro). I nt32 Double (Duplo) Single (Simples) Long (Longo), Int64 Soolean (Sooleano) Date/Time (Data/Hora) Sys tem. Da ta. DataSet System.Data.DataColumn Dbject (Dbjeto)

Notao Hngara
S [str]
I [int]

Ob1
sng [f (para flutuante, um tipo da C++)]
L [I ng]

S [bool] dt

d,

d,
obj

Para

algo que seja bem incomum, que eu use freqentemente, costumo empregar apenas um nome descritivo com o prefixo obj, como em objWebRequest.

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 Ttulo (la bel) Caixa de texto Caixa de lista (List Box) Caixa de combinao Botes de opo Caixas de seleo (Check Boxes) Grade de dados Itens de menu

btn [cmd (em verses anteriores ao VB.NET)]

lb1

t,t
lb

'pt
<h k
dg

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

18.4

Blocos de Comentrio Consistentes Valem o Esforo

1 2 3 4 5 6 7
8

Imports System Imports System . Data Imports System . Data.SqIClient


' **********************************************************

10 11 12 13 14

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.

'Nome da classe: 'Dependnc i as: 'Finalidade :

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.

524

Dia 18

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

.-ao
"
~""''''h

~ ~ ~.

onde armazenar o cdigo-fonte.

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.

526

Dia 18

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
. _,"""''''''''-'''''' _ _ 1_1 '>lI...........

527
,,(.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=.


< ...

. 4 ~ --..

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

1/''''''''' ." '0" . 1/'CW2OD' t,"""


d

.,""" - . . _ _ ...... "",IA .... _ .

r _ ..... .......,

528

Dia 18

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

Adicionando o Cdigo ti

Sub-rotina

New

de Seu Formulrio

2
3 4

Publ ic Sub New() My8ase.New() 'Esta chamada requisitada pelo criador do fonnu l rio Windows . InitializeComponent() 'Adicione o que tiver de ser inicializado depois da chamada 'InitializeComponent() LoadAuthors O End Sub

5
6

7
8
9

10

Implantando Seu Aplicativo

535

LISTAGEM 19. 1

Adicionando o Cdigo

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") connPubs.Open() daAuthors. Fi 11 (dsAuthors, "Authors") l bAuthors.DataSource " dsAuthors .Tables(O). DefaultView lbAut hors.DisplayMember " "Name " End Sub

22
23 24

25
26 27 28

Preci so desviar um pouco do tpico e discutir algo comum quando chegamos aos estgios finai s de um aplicativo. H um item no cdigo mostrado na Li stagem 19.1 que causar problemas quando esse for im plantado. Ele usa (local) para especificar o nome do SQL Server (Data $ource na string de conexo da Listagem 19.1). Isso informa plataforma .NET que voc quer se conectar com O SQL Server na mquina local, o que provave lmente correto quando estamos desenvolvendo, mas quando esse cdigo estiverem execuo em um grupo de mquinas clientes diferentes, pode ser melhor que todas acessem o mesmo SQL Server central. H duas manei ras de corrigir isso: a rpida que embutir no cdigo o nome do SQL Serverdesejado, ou a um pouco mais complicada que permitir que o nome do servidor seja alterado sem a recompilao do cdigo. claro que quero mostrar as duas, portanto, comearei com o mtodo mais fcil, em que apenas a lteraremos a string da conexo para que inclua o nome real do computador de seu SQL Server: sConnectionString = "Data Source=Olivaw;" & "Initial Catalog"Pubs;" & "User I D"sa; password"danee I" Nada mais precisa ser alterado, e agora, independentemente de em que mquina esse cdigo seja executado, ele tentar local izar o servidor com base no nome "01 i vaw" .

possvel que o nome desse servidor seja a lterado ou voc pode preferir usar um servidor di ferente para este aplicativo. Em geral, o servidor que empregado no desenvolvimento e o utiliza-

Dia 19

do na produo so duas mquinas diferentes. Seria benfico poder alterar o servidor com o qual esse apl icativo se conecta sem que fosse preciso recompilar o cdigo. Antes da plataforma .NET, esse tipo de fun cionalidade era obtida com o uso do Registro. Essa opo ainda est disponvel, mas um dos principais conceitos novos do VS .NET que seu aplicativo deve poder ser instalado apenas por meio da cpia de seu diretrio em uma mquina (que tenha o .NET Framework). Possuir infonnaes que precisam estar disponveis no Registro pode impedi r que esse tipo de instalao funcione corretamenle. Perseguindo o objetivo de fornecer instalaes e reinstalaes fce is para os apl icativos, a plataforma .NET introduziu um novo sistem a para armazenamento das configuraes de seu aplicativo, que mai s parecido com a tecnologia antiga dos arquivos .ini do que com a do Registro. Esse novo sistema funciona com o uso de arquivos de configurao, documentos XML que podem ser associados a toda urna mquina ou a ap li cativos individuais. Depoi s que voc concluir essa instalao simples, abordarei a utilizao dos arqu ivos de configurao na prxima seo.

Teste o Projeto
Agora voltemos ao objeti vo original de criar um arquivo de instalao. Ed ite a st ring de conexo da maneira certa para certificar- se de que ela poder estabelecercorretamente uma conexo com um SQL Server e encontrar o banco de dados Pubs do exemplo. Concluda essa etapa, execute o projeto para ter certeza de que est funciona ndo e de que voc possa ver uma li sta de nomes de autores no controle de caixa de li sta. Se tudo der certo e voc tiver fornecido algo di ferente de (loca 1) como nome do servidor em sua string de conexo, ento, teremos um aplicativo concludo para o qual poderemos desenvolver um programa de instalao.

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

_ no

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.

- """""._"".,,,...-' . """'._lu.""'_"" W
rD. _ _ .... _ .. ..

OlJ D .... _

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

,r ,. 11

r-""""._ .. -",,,,,,,,,,,-_ r- c.. .... >l> 'Lldoblo CAt Ilt

r ' " "., , ...,

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

y", ,"" ... !.Oe ........ _ _ _ ,

.........

"""."""'_!J'_oIo ... _"_

seja
01/

arquivo .exe

.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

lIlilidades da seo de arquil'os adiciolla' do projeto de insfalaiio.

.....- I -I

,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

539

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.

C<eoto ProjoU _ _ _ ... .... _ lho _ .. , ... _

..

~,-"",,,,, 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

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.

o termo

540

Dia 19

FIGURA 19.7

Se I'oc lio estireI' certo de que \'erslo (se

' c_-.,,_ .. -

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

1 _'_

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

r .......... _

,------

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

lbAuthors.DataSource = dsAuthors .Tables(O).DefaultView 1bAuthors. Di sp 1ayMember = "Name" End Sub 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

20 21 22 23 24 25

ANALISE

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

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 I

21

22 23

connPubs .Open() daAuthors.Fill (dsAuthors. "Authors")

2'
25 Return dsAuthors 26 27 End Function 28 End Class

ANALISE

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.

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 19.4

Dia 19 Adicionando o Cdigo para Carregar os Valores em Seu Apl i cativo

LISTAGEM

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/

_10::0\_1

_m

-I

de

0 1111'0

/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

Im p lanta nd o Seu Aplicativo

545

foi executado. Dessa vez, os arquivos de resultado tanto do aplicativo principal quanto da nova biblioteca sero exibidos (veja a Figura 19.9).
FIGURA 19.9

Choo p ' Djod .... poh . o . Voo , .... _


WN.< _ _ " " " " ' ' ' _ odhon.

Quando desenvolvemos //fIlO instalao em 111110 solll(;o com mais de um projeto (excluindo a prpria insta/a(io).

..... _

............ _

.. _ 1

O l _ _ ...... , ' .. O D S_ _ ........... .....

O _~ _.........-

o s......f'... _........u. C<rito"O .........., :td O


o
l _~

rodas as sadas
possveis de todos os projetos .ficam disponwis para o programa de inswla(io.

[] -

M,c, .,'","" _ _ """,~ " "'D O D_S_ ....

~-

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

546

Di a 19

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 <htm l><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

553

NOTA

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

555

FIGURA

20.2
IIfIl

t*I '"""" _

1"* _

tIOI>

esquema XML com o Visual Basic .-"lEr

Criando

,." . ~g i:l :l~ll\i ;:- .p - o.

, '_
~
o

I ".q~ 'EJ

.~

,"

. - ., -, ,
~
"
'

.....

~ ~

A .. _n

I
o

II

FIGURA

20.3

O Imellisellse e a X HL.
'fi' ...'" , ,0<.'0..0." pt '00, ~. >

< p . . . . " ,tioo . . , . .. . . <. .

.... ... u

do_"O ""' , 1.<,.0<-.>

<., .......O</d' . ......,

'''''0_>1 ,lO)

,< < . .. ""


0_

<... ,

<10"'''''''.'''' " .... "''' v ..,,, 00..../ .... """,, .... "'0'1 ... " ,.

..

<.1""0_'

D'"

~ ~,-

~.

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

20.4
11111

e lemento cliII atributo


identific~o

ESII"IIl/(ralgica de

arquivo XML.

....

e lemento ordem

atributo data

elemento itens

elemento item elemento quantidade

elemento item elemento identificaoitem

elemento id ent ilica lio item

e lemento quantidade

texto 100

texto

IDO

texto b"

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


Descrio
Representa um elemento de um arquivo XMl. Representa um atributo de um arqu ivo XMl. Representa o documento como um todo. Representa um comen trio de um arquivo XML. Os comentrios em XM l comeam com <I .. e terminam com - o>.

Tipo de N
Xml El ement XmlAttribute Xml00cument XmlCollIDent

Um beneficio de ter vrios tipos de ns herdados de um nico n que todos comparti lham um conj unto de propriedades e mtodos. Isso pennitir que voc aprenda mais facilmente como trabalharcom o DOM. A Tabela 20.2 resume as propriedades e mtodos usados com mais freqncia.
TABElA 20.2

Propri edades e Mtodos Comuns a Todos os Ns XMl

Membro

Descrio
Propriedades

Attributes ChildNodes

Conj unto de t odos os atributos desse n . Permite a navegao pela lista de atributos em cada nvel da h ierarquia. 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. 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. O texto contido dentro de cada n . A se inclui qualquer n-fi lho que ele possua. O texto existente nos colchetes angulares do n atual. 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" oN ode.NextSibl ing, oNode seria apontado para o prximo n item. Retorna o t ipo do n atual- por exemplo, Xml Element, XmlAttri bute e assim po r diante. Mtodos

FirstChild

InnerText Name NextSibling

NodeType

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 ocu hierarquia. A Tabela 20.3 descreve alguns desses mtodos e propriedades. Alm disso, Xml D 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. Semelhante a CreateNode; no entan to, CreateEl ement usado para criar elementos. Semelhante a CreateNode; no entanto, CreateAttribute usado pa ra criar atribut os. Ca rrega o contedo do arquivo

CreateEl ement CreateAttribute Load LoadXml Save

XML em

um documento_

Ca rr ega em um documento o contedo de uma string que con-

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

560

Dia 20

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 X TextReader ml


Membro Descrio Propriedades
Name NodeType

Nome do n atual. 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. 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. 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. Cria a ta9 de fecham ento para o elemento atual.

WriteElementString

WriteStartElement

Wri teEndEl ement

lendo XMl
Embora voc pudesse usar os mtodos IndexOf e SubStr; ng da classe Str; ng para ler XML e conhecer seu contedo, essa no a mane ira mais eficiente de fazer isso. Como a lternativa, recomendvel usar o DOM ou os objetos XmlTextReader para ler XML. Essas duas famlias de objetos podem interpretar com maior facilidade arquivos XML. O DOM ser mais apropriado se voc tiverde ler um arqu ivo XML que esteja todo na memria e trabalhar com ele. Como descrevi, o DOM nos permite percorrer o arqu ivo avanando ou retornando, relacionar uma seo com outra e alterar o arquivo no momento em que estivermos lendo. Por outro lado, Xml TextReader mai s apropriado q uando precisamos apenas ler o arq uivo percorrendo-o uma n ica vez. Para saber como os dois conjuntos de objetos fu nc ionam, seria bom v-los em ao em um exemplo. Mui tos aplicat ivos precisam ser personalizados pelos usurios, como pode ser feito por meio das configuraes de Toais na caixa de dilogo Opt ions. Essas informaes podem ser facilmente armazenadas em um arquivo XML, permi tindo que voc ou seus us urios leiam ou

562

Dia 20

alterem as configuraes sem problemas. Inserir o cd igo dessa funcionalidade em um componente proporc ionar uma reuti li zao mais fcil dela. A classe Settings permite o armazenamento de definies de configurao em um arqu ivo e que essas sejam retomadas para leitura posteriormente. O contedo do arquivo ser seme lhante ao da Figura 20.5. Criar uma c lasse dessas o ajudar a penn it ir que o usurio personalize o aplicativo confonne suas necessidades. A Listagem 20 .1 mostra as propriedades e mtodos bsicos dessa classe. Depois adicionaremos a ela a capacidade para leitura e edio das configuraes.

FIGURA

20.5

Arq1/i1'o de configuraro.

<.,-,,,,,..
0,>0<:1<0"
,bo'9h t>n,ho,pt.

'" 'd<h>' T/<, dt.'

<1.,_,<\_>

_p'

<1." >c<,'..,, h1 ",,</ ,< 10,., <0",_ ,

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
11

Public Sub New() Me.FileName = AppOomain.CurrentOomain.BaseDirectory &_ AppDomain.CurrentDomain.FriendlyName & ".cfg" End Sub Public Sub New(ByVa1 fi1eName As String) Me.FileName = fileName

12 13

Introd uo XML

563

LI STAGEM

20.1 Cl asse AppSetti ngs (continuao)

I'

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

15 16 17 18 19 20 21 22 23 2. 25 26 27 28 29 30 31 32 33
34

Get
Return m oItems End Get Set(ByVal Value As Hashtable) m oItems : Va1ue End Set End Property

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 i 1eName confi gura_sF da, 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 1 I tems usando um cdigo parecido com oSett i ngs. I tems (" A gumaConfi 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

Carregando as Configuraes Por Meio de XmlTextReader

36
37

38

39 40 41
42

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

43 44 45 46 47 48 49 50 51 52 53
54

Try oReader : New X mlTextReader(FileN ame) While (oReader.Read) Select Case oReader.NodeType Case XmlNodeType.Element If oReader.Name <> "appSettings" Then m_oItems .Add(oReader.Name , N hing) ot slastElement = oReader.Name End If Case X lNodeType. Text m 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

55 56 57 58 59 60 61 62

ANALISE

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.

Grande parte desse mtodo representada pelo lao Whi 1e ... [nd Whi 1e das linhas 45 a 56. Ele l cada n do arquivo. Quando um n lido, primeiro o cdigo determina seu tipo (linha 46). Nesse cdigo, s nos preocupamos com ns de elemento e de texto porque eles so os nicos tipos de ns que exislem no arqui vo. Se o n aluai for um elemento e no for o n appSettings (o n-raiz), o cdigo adicionar um novo item a HashTabl e (linha 49) e salvar o nome desse item recm-adicionado na varivel string. O prximo mtodo Read deve retornar o n de texto asso-

Introduo XML

565

ciado ao elemento, e isso servir para adicionar o valor ao ltimo item inserido em HashTabl e. No final da rotina, HashTab l e deve conter todas as configuraes armazenadas no arquivo. LISTAGEM 20.3 63 64 65 66 67 68 69
70

Carregando Configuraes com o Uso do DOM

Public Sub LoadDOM() m_oItems '" New Hashtable() Dim oOoc As New XmlOocument() Dim oNode As XmlElement
Tcy

oOoe.Load(FileName) oNode '" oDoC.DocumentElement.FirstChild Do While Not IsNothing(oNode) m_oltems.Add(oNode.Name, oNode . lnnerText) oNode = oNode . NextSibling Loop Cateh ex As Exeeption Finally oOoe = Nothi ng End Try End Sub

71 72 73
74 75

76 77

78
79 80 81

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

20.4

Usando a Classe Settings

1: 2: 3: 4: 5: 6: 7: 8: 9: 10 11 12 13

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

20.5

Criando Def i nies de Configurao com X mlTextWriter

82 83 84 85 86 87 88
89

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 ") For Each oltem ln m oItems oWriter.WriteElementString(oItem.Key, oItem.Value) Next

90 91 92

Introduo XML Criando Definies Configurao com XmlTextWriter

567

LISTAGEM 20.5

de

(continuao)
93 94 95 96
97

oWriter .WriteEndElement{) oWriter . Fl ush{) oWriter . Close() End Sub

98

ANLISE

o mtodo SaveWri ter comea instanciando as variveis necessrias. Uma varivel

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

Cr iando Definies de Configurao com o DOM

99 100 101 102 103 104 105 106 107 108 109 110 111 112
113

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 oOoc.Save{m_sFileName) End Sub

114
115

568

Dia 20

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
15
16

Private Sub frmTest_Closing{ByVal sender As Object ,


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

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 for, nece 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/ xm seria um bom ponto de partida). l 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>

.._-.,
</..,

..........' '''''9><'''''''''' <nOrnO'''PpSO


001. >

-=-, llT ........"1:S ..


", ,, ,,~

". ..,

</mO.,tz >
~.'

............ ' ''''''.l rod.<>r lho' 01 .. . .. 1. 11",,,,,,,,,,<1...........,.,


<..........",. ... p .... ~ ....

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

_ 'M,,,,,,..-,

tl"'l. ~

,
the _ oring lho <;D nt;gu .~'.m .... ';09 . 4$..........,.,.

</I" .d,~

"",",,,to ......... P :'~ .,.


<lMmIl.,

.....>

_Ii "_..
</tl".w>-

</I",mb,

"_oP:". ",,> <.........,.,""p..... ... ,.... """ . <:tl... a' ."'lng. ~


:Lo"""der'">

<.........",.l oed. ,ho ""n' ont r 'h. ....

(JI ,,,.Dv.>
_

.",I, .

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


lho No "<>m<J 'ho ,"", ..,...., .,., """'9'.

I FileNltme property
. . p'........

I
_

ne ...S proper ty
.. lho

,010<'''''' ur '''''''9'

I Lo1>dReadeiO ",e thod


1.0001 ,110 ,,",,.. ti of ""
~

"""'l' No . "0 ,.......oItT_ """'I .... """".,.._


" ""'9' No " 'O 'hO .... h ' _ ~ O<:IM

I Lm>dOOM( ) methd
' hO ,,",,,,,,, 01 ' hO

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.

574

Dia 21

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

LISTAGEM21.1 U Solicitao SOAP Simples ma

2
3 4 5 6 7 8 9 10 11 12

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

ANALISE

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.

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

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.

LISTAGEM 21.2

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 . xm soap. org/soap/encod i ng/" 1 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 U Arquivo DISCO Simples m

2 3 4 5 6 7 8 9 10 11

12

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

ANALISE

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

581

FIGURA 21.1
Criando 11m Projeto de Serl'io Web.

_ "" ...
"""'~- -':.:1-"..-_ w_c

,_.

[ii"gj
~~~

"

II-p::::.,;' , ,- f/iJ 'l.. 1 -"""-'--"--._ "" .~ ,,,,,

..

ill

a _ _ ... ,

""""' lO..,.

""

~ ,

~~

",,"M!T_ "'M!T _ _ """'"

, .'

~~

I ,,,,,.

I..,,,,,,, ::;;j

1 1-

... I

.......... _

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

582

Di a 21

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

'Esta chamada necessria para o gerador de Servios Web .


Initia l izeComponentO

14
15

'Adicione seu prprio cdigo de i nicial i zao depois da chamada ' Initia l izeComponent{)

16 End Sub 17

18 19 20 21 22 23 24 25 26
27

' 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

28 Protected Overl oads Overrides Sub Dispose(ByVa l disposing As Boo l ean) 29 'CODEGEN : Este procedi m ento 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

583

COOIGO

LISTAGEM 21.5 O
=

Arquivo de um Servio Bs ico (continuao) "Hell o World"

42 43
44

HelloWorld End Fu nction

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 Context

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. 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. 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 20 caracteres + e % apropriados alm de outros mais). uma propriedade que resume Context.Server . Fornece acesso s variveis armazenadas no obieto Sess i on dentro do ASP.NET. uma propri edade que resume Context.Ses sion. Fornece acesso s informaes sobre o usurio que estiver fazen do a solicitao.

Server

Session User

O cdigo das linhas 6 a 33 da Listagem 21.5 fo i inserido em uma rea 'Regian. Esse cd igo na verdade minimi zado no ambiente de desenvo lvim ento (veja a Figura 21 .2). Essa uma tcn ica ti l, nova no Visual Basic .NET, que lhe permite tornar seu cdigo menos complexo ocultando os detalhes que possam no ser relevantes. Nesse caso, ela oculta o cdigo usado pelo prprio IDE. Esse o cd igo que permite arrastar e soltar itens na superficie visvel. Em geral, ele no deve ser alterado manualmente, portanto faz sentido ocu lt- lo no editor.

584
FIGURA 21 .2
O Sel'l'io Web no
filo _ _

Dia 21

.... - . .

. D '~
~"-

esulgio inicial.

..

gil! !J ~ I!.
~\

. ...
'" -

!<do _

too\>

.,:. .SJ ~I

."

"'"
,.
no

.tI ",,,,,,el ....",,1..


"'''o~''dU
~~".,

..... 'u" ' $.

'"o< ,Mo .... ,,,vl<o, ...... 'hu , .. . .... '''0 ,. , .. OU", . _

., , ..... u , ... " ... , ... o......... """. ,,.. ><oJoe,.

"_10 .. ""e. <o,""'" , ...,"" ." ...<,._

",....

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

Pgina de teste do Servio Web.

~ di ~

Servicel

'01, "' ",k.ludn, .... '/{ m.ori .... / K "0.11 nom., .... .

R.<o'"_....ll : o

. _ ~ , ...................... """",..,,.",""_ ......... <Mm _ ..... " ' _ " ""'" _ , , ...... . ..... _ _ " " ......... _ , , _~ .... , ......................... ~ ...................... 0 ,"""".

",-..""""-' ................ ",. ........ . .... .....,...., _ ,_.,......,. ,........... ,_.......... ". , _"'"' .... ""' ....,. ._ "''''''0', .........._ ..... ,.. 0.0 r .. " ....... ................ _ , ', ''''' .....
...... to _ ~ "' ~ ... "'" ".-. , .... ,...." ......... oco,
~

_.............................,._,
0"""' . 'ao .......... <V, ~ ,
/I ""p I _ b acio

, ' . I.ull .010"'0<0 ,."- ,.,

.... ..... I" h ... ~ . publi",

,.. ...................... . . " ....................................- ............................._ _ _, ............ _rt,. Tho '.,.,_nd........... i _


.. _ ..... , ... .... _ ' ' - to __ " ' _...... .....,.. ......

_t .. _ ............... _0.......... "' .1",


.... ' 11.,..........
~...,_

....... ,.)

" ,._

.... '..

, ~_.P_.

rv'~.IJ

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

I
! !

To"
To\..~ _

" ': ., ""' " r ":':_-------------SOA.'


. " ;' ._ .' "'
. . . . .i .

....

"" i_. ..........

;~

""'010 w.,.

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


i

lo . . " " " " ,. _

i>(II'jT

ilo. . . .

(.ou., ... _., .....,.

..

eonooot -r... , , .., , _, e....... ~" e


.. 00

,I<&,_..., <o".rv.oo .__ """, . .... "".li

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.

__

""'_l"_~

\:J 'roi'
, ......,>! _

.... 00Gl ~ GJIi'ti


.. _ I I

g ill l'

.
....... " _

"1._ """",_""""
b

<ln,

<................. ,.0" _ _ >;1 ....,(-

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

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.

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
no proxy

5. O proxy converta
II resposta SOAP

pera o cliente

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
"~I

lO

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

.. _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 / M thServ i ce/Ma thServi ce. vsd i sco. Digite esse URL e d um a 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.

590

Di a 21

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 "


<1>001 v.....",.,.O"

' _ _,_

I"
_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

:oii _ l/O< ....."'" _


-~

.'h. lp J /.d"'m._ . "" 'oop.""jl ,II ...... /.d </"'""ot'I>

---. --

" ._ _

'-

I
,

-TABELA 2 1.2

Proprieda des do Form ul rio MathCl ien t


Propriedade Valor

Controle

F,,,,
TextBo x

Text
$ize

Test Math Servi ce


248, 160

BorderStyle
Name Text Locati on Size TextBo x Name Text Location Size Button Name Text

FixedSingle
TxtX

123
16, 24
100 , 20
Txty

456 16, 56
100, 20

CmdAdd &Add

Criando Servios Web com o Visua l Basic .NET

591

TABELA

21.2 Propriedades do Form ulrio MathClient


Propriedade

(continuao)

Controle

Valor

Location Size Label Name Text Locat i on Size

128, 56

75. 23
LblResult
O

16,88

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

ANALISE

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.

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

FIGURA

Usando o c/ieme para chamar u Servio Web.

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

FIGURA 21 .10
Criando o Sen'io Web No/"Ihwind.

.. _

..... . . -.. _ " ' " ' _ - . : 1 .

~.

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
12

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

13 14 15
16

17 18 19 20 21 ebMethod 22 Public Function GetProducts 23 yVal categoryName As String As DataSet 24 Dim oCon As Ne SqlConnection DSN 25 Dim sSQl As String 26 sSQl "SElECT ProductID ProductName nitPri ce "

594

Di a 21

CDIGO

LISTAGEM 21 .8 O Cdigo para o Ser vio Web dos Produtos

(continuao)
27 28
29 30

"QuantftyPer nH Di scontinued CategoryName " "FR MCategories INNER lN Produ ct s "


II

N Categories . CategoryID
11

Products.CategoryID"

II
II

31
32
33 34

HERE Discontinued O ANO CategoryName LI E " categoryNam e

. .

Dim oCmd As Ne SqlDataAdapter sSQL oCon Dim ods As Me DataSet


oCrnd . Fill ods "products"

35

36

Return ods

37 End Function 38
39 ebMethod

40 Public Function InsertCategory yVal categoryName A String s 41


42

43 44 45 46

47 48 49
50

yVal description As String As oolean Di m oCon As Me SqlConnection O SN Dim sSQL As String sSQl "INSERT INT Categories" " CategoryName Des cription . categoryName . . "VAL ES . " des cription " Di m oCm As Ne SqlCommand sSQl oCon d

11

Tcy

51
52 53 54 55 56 57

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

eootJO;,,"~

...

.....

_..

Pgina de teste do
Serl'i~'o

Web Nonhwil/d.

... "U ~ 'ICIII 1 -' '' " .. ~.Q .,. .. O li) til '2 mIG\ ....".;., h ...,

._
,.,;,;;"

Ui, i r 14. _ _ ................... . 1!fi?'ifL,),5i .. ,i~ ~

1 t ..

TIM'-'
,

~If~
.

'4.l. .

ProductManager

. ,"ru.......

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

I
.

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


a" ............. ' , .......... ........ . _ ".1<'
."" . . ..... _ .... , ........, __ , _ .. _
{;OI

'hI, .... .. _ . " ..... ....'11" ..........'

.. k .

.., .. ~ __

' " ,

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

.......... _ J"-_" ................__."'.. " ........... ",- ....... _ ...............,. ....,..... """" , _ _ , . . - _ .. _ , . , _.. _ ..... , .. _ , r.. , , _. , " " _ ... , _ _ , , ......... -"'""', " ,"'
,~

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

__ to ......... ................... (" " , ................. ' "'" .... " .)

-....... .... .... .

. .. . . ..MT ............,. " " ........ , ...., . - ...................... ................ ' , ,', H ......... _ " "

.... .............. ' "'H" ""' _ _ """ _, ,,,.. _ o . . _ _ _ ,' ..... H'_ ..." "' ',-""'-"' ..-...,

FiGURA 21.12
too

:21 El """

testando

:i! . \:>
~ ~

GetCategories.

o III S , '2 m lii\ ....',... ,


K... c_ _

..,g i'
_

...

!>OO CIo: .._,I:.~~ ,:-..


_

~~:::: 'J',*': 1/,. -' , ........, -,_ . ... ,

:OO c:i' ~ !

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

.--:DI

a......,c :

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. ~ ' oi' 101 " .r. ~ ." \:l .. O !ii o::l~".a ID ijJ

"'"

""""",-~

<1 ..,. "'''''''0''.0" _-.go u,H,.. 1> <00, ..... , ,,' ". MWII'~mp,,"'.Q"I/"

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

""'.~.

",~, 01''' ... o, .....,..NQwo.., ~9. ' ...",,,.' ItOa,.5o" " ",. '.

<CI>Mna "'"N. .. OmeSQt , _ I I l _ p.... .ml..,,, .d.h"~" I ....... ,.".D"I/,.... '/ X" ........ mo _ . "'.~., .. um"<:h ~ m~. ,,,,''''', """<um, .mln .. dm ~'>
R ...,.-

_ !o ff~, ",rf~... .-.s. um "<:h.,,,~ .... oIcn>.of1_CGm,"mlm.d~'~ - , .<>"'Y- 'um :<<:hu,~ .... ml", m. <om,"ml dn U',,'" . ,">

</><d,"'.........

"''''.!

,'lOwOlo,...,., ,. ,.., . <p<O<1ue" ... p"'du<:l<1 _t.rowo< .... II:> <00 ' ''"O>l<jPr-.:tlO:> ....... , <0<> ..'0'-....,' ,O<lQu."."-....,~ <Do""' ..... <JI)oSCon, ......".
cIoff~, <Pr"'"-'<:IJI_, Clo" ' ~'

d> f~I

FIGURA 21 .14

[<II:

"'"

010 _

.r.~ 11Io

lOIO _

tIOIO

feslando

jl- U -oi' g "


.. O

I nsertCategory.

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 PaneI

title
( 10)

Northwi nd Products pnl N ewCategory 181px 368px lblNewCategory New Category IblName Name: txtName 24px 213px IblDes cription Description: txtDescrption 41px 222px Multi Li ne cmdAdd
Add

Height Width labe I


( 10)

Text Label
( 10)

Text TextBox
( 10)

Height Width Label


( 10)

Text TextBox
( 10)

Height Width TextMode Button


( 10)

Tex t label
( 10)

lblResult 19px 329px Silver lblCategories

He i 9ht Width BackColor Label


( 10)

Criando Se rvios Web co m o Visua l Basic .NET

599

T ABELA

21 .3 Propriedades do Formulrio Web NWClient


Propriedade

(continuao) Valor

Controle

T ext OropDownL is t
( 10)

Categories cboCategory 22px 202px True dbgProduc t s 265px 438px

Height Width AutoPostBack OataGri d


( 10)

Height Width

ANLISE

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.

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.

600

Dia 21

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

!iii " 0/1>01"' ........ _

W"" ... ,r"


v""

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

"""'_, _

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

ANLISE

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.

Quando a grade estiver sendo atuali zada automaticamente, ser a hora de nos preocuparmos com a caixa de combinao. Ela deve ser preenchida com a li sta de categorias quando o usurio carregar a pgina pela primeira vez. O evento apropriado para fazer com que isso acontea WebForrnl_ Load. A Li stagem 2 1.10 mostra esse mtodo.

602

Dia 21

CDIGO

LISTAGEM 21.10 Carregando as Categorias

11 12

Private Sub Page load yVal sender As System. b ect

13 14
15 16 17

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

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.

Criando Servios Web co m o Visual Basic .NET

603

FIGURA 21.17

VislIoli=ondo o cliel1le Norlhll'ind.

, 1~ LJ ~ gO lllilo."

!jIo

t.. _

_,

(!otvj

1.... OlDa 'l): (DIQj_'""u;~ ....... _

.........

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

" ... ..~ . ......


I ..
t

I'" ,

,, -, "-:=:'__"
, II,. '.

;!

IS' ~

... _ t - . -

..

"

"I

"
! !
o

N_,rl- - - - - -

.
,
,

""

"

"""
,

SMq",k~

AI<

" "
" "

Stt.1cy< St<>IIt

cal< d< ru.,. 2635

,., ,., ,.,

,., ,.,

s.........' s....."".
~~,

B....... B ......,
~

FIGURA 21.18

(!lo

to< _

(!otvj

!OO"

Allerando a calegoria selecionada.

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

b ~ lIil ll "' e. , .. OmGl 'l): (DfQ\

"

"

... 'o c.t......


~,o 111"",110",

Lo POSIOfa
,.~

" . " '9 8 ""'"

Got,'''''.
~., ,

" '"

. ,.
,~

, ,.,

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
27 28 29
30

yVal e As System.EventArgs Handles cmdAdd.Click


Dim oProducts As Ne localhost.ProductManager If oProducts.InsertCategory txtName.Text txtDescription.Text Then lblResult.Text "Adicionada nova categoria:" txtName.Text
Else

31

32
33

lblResult.Text End 11
End Sub

"No foi poss vel adicionar nova categoria"

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

S.. <IWI<h Ale

"
~

S"'lq< SI ...

ctt.: <I< ~t",

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

610

A pnd ice A

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 M ain() 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.

612

Apndice A

Exerccios
Uma so luo possvel para o exerccio do programa de clcu lo de pagamentos seria

1
2

Module Payment

3 4 5
6
7 8 9

Private dblAnnuallnterest As Oouble = O Private iYears As Integer = O Private dblLoanAmount As Double = O


Private dblMonthlyDeposit As Double
Sub Main() Oim dblResult As Double
=

10
11 12 13 14 15

'armazena os valores informados GetlnputValues()


'calc ula

dblResult

16
17

CalculatePayment(dblLoanAmount. dblAnnuallnterest.
iYears)

18
19

'proceda a exibio do resultado


DisplayResults(dblResult)

20
21 22 End Sub

23 24
25

Private Function CalculatePayment(Byval LoanAmoun t As Oouble . ByVal AnnualInterest As Double ,_


ByVal Years As Integer) As Double

26
27

28
29

30
31

'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 ' precisaremos desse valor em alguns loca is dblTemp = COec(1 + dblMonthlyInterest) A iMonths dblReturn = LoanAmount * (dblMonthlylnterest * dblTemp l( db lTemp - 1 Return dblReturn
End Function

32 33
34

35 36 37
38

39
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

6 13

48 49 50
51

dblAnnuallnterest = CObl{GetValue{"Annual Interest (e .g. for 5% , enter 5): iVea r s = CInt{GetValue("Vears of loan: lO~ Console . WriteLine() End Sub

lO~

Private Function GetValue(ByVal Prompt As String) As String Console.Write(Prompt) Return Console . ReadLi ne End Function Private Sub DisplayResults{ByVal Result As Double) Console . WriteLine() 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

52 53 54 55 56 57 58
59

60 61 62 63 64 65 66

67 68 69

Respostas do Dia 4
Teste I. o lao For mais adequado para esse tipo de soluo, embora qualquer dos laos pudesse ser usado. 2. Embora os laos possam ser usados para sim ular uns aos outros, o lao Do mais flexve l devido a seu suporte s clusulas Whi 1e e Unti 1 e s posies de entrada e sada onde poder ser inserida a expresso cond icional. 3. O bloco interno o cdigo que ser executado em cada iterao do lao, portanto, o desempenho obtido ou a quant idade de iteraes do lao apresentar um resultado melhor dentro do lao. 4. Considerando-se Cal cul atedTotal NetWorth ( ) um pouco mais comp lexa do que o cd igo executado em d tCu r rentDa te . Hour( }, seria melhor que voc invertesse os do is lados

614

Apndi ce A

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 num between " & iLowerBound ber " 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("H did I do ? ") ow 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

COIGO

LISTA GEM

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
9

Oim iLow , iHigh As Integer Oim sInput As String

10
11

'Permita mltiplas execues na gerao da tabela


Do

12 13 14

'solicite valores
Console.Write{" l ow value (maximum of 20 . O to end): ")

15

sInput : Console.ReadLine() iLow = Clnt(sInput)


If i Low O lhen Console . Write("Hig h value (maximum of 20): lO)

16
17 18 19

20
21

sInput = Console.ReadLine() iH i gh = Clnt(sInput) OutputTable(iLow , iHigh)


End If Loop Unt i 1 i Low
=

22
23
24

25 26
27

Console.Write("Press ENTE R to continue") Console . ReadLine{)


End Sub

28 29
30 31 32 33 34 35

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) '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}}" ,

36
37 38 39 40 41 42 43 44

Respostas dos Testes/Exe rccios


Ta bela de Multiplicao Concluda (continuao)

6 17

CDIGO

LISTAGEM 6. 11

45 46 47 48 49 50
51

For iCount2 " MinValue To MaxValue Console.Write(Tab & CStr(iCount * iCount2)) Next Console.WriteLineO Next End Sub

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 N ame{ ) 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 M ammal 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


End Property End C1 ass Public C1ass Human Inherits Manma1 Public Overrides Property NumberOfLimbs() As Integer
Get

6 19

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 M odule modM ain

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

621

ANLISE

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

r,:.~,--"" .., 3

e.d<"'-_'

ri

~~~ , rl----c=c------ .d

---=-'1 3.:::1

"

., .,.
I
" "

" A'

~. ,

f ,

,~.,

""=~.,-"" 3.:::1
3.:::1 3..:::J

lJ , __ ..,

c .........

-"",,",

., .,

1 <

!
I

c..... , ...,- Ilo<t..........


_ .....,

~===~ 3.:::1

r---" .........., I 3
~""" OI

3.:::1 "w". ""


.....

!
i

....,

IQ 0.'1" ID .mo.
"""'" T"> ....

624

Apndice A

FIGUR A

10.10 O formulrio lVeb

. ~"' "

~,,~,.h

. .... I ' .... ,,'[ .. .... 1

w,"'""",

sendo criado.

; ,-,
,~

.
""

.. r;J i:!
,
~

-"

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

-.. -- -----=--- --=--- -..

w .........

t 1='
~

I
I

..-I;;i ,,'....

.-, ",:;1 .. "

4H, .........

,....,,-.-

, ,

I
,

ii ....-

.LIa.......'

" e>oo ..... ~: .". .";,,

....

I
''''
,. ~.="='~'

.TAB ELA 10.6

.,.,... ,... ,i"

'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.
Propriedades do Formulrio de Registro
Propriedade
( ID)

Controle
Label

Valor
lblName
Name;
True

Text
Font Bold
Lahel

( ID)

lblAlias

Text
Font Bold
Label
(10)
Text Font Bold TextBox TextBox

Alias:
True

lbl Password
Password: True txtName txtAlias

( 10) ( 10)
MaxLength

10
txtPassword l Password txtPassword2 Password

TextBox

( 10)
TextMode

TextBox

( 10)
TextMode

Respostas dos Testes/Exe rccios

625

TABELA 10.6 Propriedades do Formulrio de Registro (continuao)


Controle Propriedade
(ID)

Valor

Sutton

cmdRegi ster Register lblSulTIDary

Text Label
( ID)

BaekColor BorderColor BoderStyl e BorderWi dth Text Validator


( ID)

IEOEOEO
Silver Groove

1"
<blank> reqName txtName Name is a required field. reqAlias txtAlias Alias is a required field . reqpassword txtPasswordI Vou must enter a password . cmpPassword txtPassswordI txtPasssword2 Two passwordS must mateh.

ControlToVa l idate ErrorMessage Validator


( 10)

Contro lToVa I i date ErrorMessage Validator


( 10)

Contro lToVa 1i date ErrorMessage CompareValidator


(ID)

ControlToCompare ControleToValidate ErrorMessage

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 LISTAGEM

10.5 Cdigo do Boto Register

1 2 3

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
Fo rd Ford Audi BMW Pontiac Pontiac Po ntiac Tovota Tovota

Modelo
Mustang Explorer <Nu lo> <Nu lo> Grand Am Grand Prix Aztek Rav 4 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
Ford Ford Pontiac Pontiac Pontiac Tovota Tovota

Modelo
Mustang Explorer Grand Am Grand Prix Aztek Rav 4 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
PK

FIGURA 11 .7

User

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

DjsclD ArtistlD CDntle

Category
I

Respostas dos Testes/Exerccios


CustomBr

629

FIGURA 11 .8

Banco de dados de pedidos "eestrllturado.

PK
_

CalegorvlO CategoryName Order

PK Omerlo

CuslomerlO OrderDate ShipOate

I
PK

OrdemltBm

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
FIGURA 15.4
Classe PesaDa

Apndice A

Projetar c/asses para

serem remili=a(/as s w=es pode gerar lima


es/rlllllra mais

Primeiro Nome Sobrenome Identificao das

Clnse de Informaes de Contato


Endereo Cidade

complexa.

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

633

FIGURA 15.5

Classe Clianta
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

O mesmo cOIyunlo de informaes pode ser modelado de vrias mal/eiras.

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 Eletrnico

- - Herda

,,,

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

634

Apndice A

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
Coluna

Propriedades da Coluna
Propriedade
Name
Te)(t

Valor
hdrName

Primeira

File Name
180

Width
Segunda
Name Text

hdrAttributes

Attributes
Canter
hdrModi fi ed

Tex tAlign
Terceira
Name

Text
Text Align

last Modified
Right

Width

80

o unico cdigo necessrio o que adiciona as infonnaes s colunas Attributes e last

Modifi ed. AItere o manipulador de eventos tvwFo 1ders A fterSe 1ec t para criar essas col unas (veja a Listagem 16.8).
LISTAGEM

16.8

Criando Colunas Adicionais

1 2 3
4

Private Sub tvwFolders_AfterSelect(ByVal sender As Objecto ByVal e As System .Windows.Forms.lreeViewEventArgs) Handles tvwFolders.AfterSelect Dim sFilesO As String =_ Directory.GetFiles(tvwFolders.SelectedNode.FullPath) Oim sFile As String Oim oItem As li stViewItem lvwFiles.ltems.Clear() For Each sFile ln sFiles oItem = lvwFiles.ltems.Add{StripPath{sFile)) If lvwFiles .ltems .Cou nt > O lhen

5 6 7 8
9

10
11

12
13 14

Respostas dos Testes/Exerccios


Cri ando Colunas Adicionais (continuao)

635

LISTAGEM 16.8

15
16 17 18

19

oItem.SubI tems . Add(GetAttributeString(sFile)) oItem.SubItems . Add(File.GetLastWritel ime (sFile)) End If Next End Sub

ANLISE

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.

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

Fun o GetAttributeString

20
21

22 23

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
~

24 25 26
27 28 29

30 31 32 33
34

35 36 37
38 39 40

If (oAttr And fil eAttributes . Hidden) " f ileAttributes.Hi dden lhen sReturn +" "H " Else sReturn +" " " End If If (oAttr And fileAttributes.System) fileAttributes.System lhen

636

Apndice A
Funo GetAttributeString (continuao) sReturn

LISTAGEM 16.9

41
42

43 44
45

,. "S" Else sReturn ,. "-"


End 11

46

Return sReturn End Function

47 48

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

You might also like