Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
NET
em Dias
Duncan Mackenzie
Kent Sharkey
Tradução:
Aldir José Coelho Correa da Silva
Revisão Técnica:
Marcos Jorge
Consultor Especialista na Platafonna .NET
Analista de Sistemas
PEARSON
Makron
Books
São Paulo
Mackenzie, Duncan
Aprenda Visual Basic .NET em 2 1 Dias I Duncan Mackenzie, Kent
Sharkey; tradução: Aldir José Coelho Correa da Silva; revisão
técnica: Marcos Jorge. -- São Paulo: Pearson Education do Brasil,
2003.
02-4239 CDD-005-133
•
lndices para catálogo sistemático
1. Visual Basic.NET: Linguagem de programação:
Computadores: Processamento de dados 005.133
2003
Proibida a reprodução total ou parcial.
Os infratores serão punidos na forma da lei.
Direitos exclusivos para a língua portuguesa cedidos à
Pearson Education do Brasil,
uma empresa do grupo Pearson Education
Av. Ermano Marchetti, 1435
CEP 05038-001 - Lapa - São Paulo - SP
Tel. (11) 3613-1222 Fax: (1 1) 3611 -0444
e-mail: vendas@pearsoned.com
Dedicatória
De Duncan Mackenzie:
Enquanto trabalhava neste livro, quase tudo em ,ninha vida se modificou, ,nas em 6TJ·ande
parte, isso não estava relacionado com ele. Agora tenho um filho, Connor, me mudei para
outra região e estou co,n um novo trabalho na Microsoft. Gostaria de dedicar este livro a
,ninha esposa, Laura, que sempre apoiou a iniciativa de escrevê-lo, independente,nente de
quantos rneses ultrapassamos o prazo inicial, e a meu filho, que não tinha a niínilna idéia
de que este livro estava sendo escrito e ,nes,no assiln estava ,nuito feliz e solidário. Para
concluir, tenho de agradecer a Kent, porque ele escreveu metade do livro, e não acho que
eu teria sobrevivido se tivesse que fazê-lo sozinho.
De Kent Sharkey:
Em princípio, pretendia parecer inteligente e escrever u,n poema aqui, tnas esse lado de
meu cérebro está com problemas nestes últilnos dias. Portanto, eni vez disso, essa será uma
lista bastante típica de todas as pessoas que me ajudarani neste livro. Gostaria de agrade-
cer ao meu co-autor, Duncan. Obrigaclo pela oportunidade e por nunca aceitar u,n "não"
ou "Desisto" corno reposta. Obrigado a todos os editores que trabalharan1 no livro, princi-
palmente Sondra e Todd. Obrigado a Squirrel por tne tnanter são e salvo e a Cica por dei-
xar meu laptop aquecido e, às vezes, sem atividade. Por último, mas não nienos irnportante,
obrigado a Margaret por ,ne apoiar enquanto trabalhava nesta atividade, um novo trabalho
em u,n novo local. Agora tere,nos nova,nente essa coisa que cha,na,n 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) da Microsoft etn Redmond, Washington. Ele é um pro-
gra,nador dinâ1nico do Visual Basic .NET que possui o aborrecido hábito de escrever a1iigos
ocasionais. Duncan também atua como instrutor de Visual Basice 1ninistra n1uitos cursos, que
abrange1n da progra1nação interrnediária à avançada do VB. Escreveu vários livros eco.laborou
em tantos outros sobre as tecnologias da Microsoft. E' ainda orador em 111uitas conferências que
enfoca,n o desenvolvimento da Microsoft.
Kent Sharkey é MCSD, MCSE, MCT e MCP+SB. No momento trabalha na Microsoft co1no
Instrutor Técnico no Grupo de Soluções .NET, em que sua ocupação atual é o .NET Framev.1ork
e o Visual Studio .NET. Antes de entrar para a Microsoft, Kent já possuía anos de experiência
co1no instrutor e consultor, concentrando-se e,n projetos e desenvolvimento de aplicativos corn
o uso do Visual Basic. Ele escreveu e colaborou em diversos livros, incluindo sobre MCSD e Vi-
sual Basic. Faz exposições regular1nente ern conferências de desenvolvedores dando ênfase ao
desenvolvimento da Microsoft.
Diga-nos o Que Você Acha!
Como leitor deste livro, você é nosso crítico e colaborador mais importante. Valoriza1nos sua
opinião e queren1os saber o que esta1nos fazendo correta1nente, o que poderíatnos fazer 1nelhor,
sobre quais áreas você gostaria de nos ver publicando e qualquer outra sugestão importante que
deseje passar para nós.
R.eceberemos com satisfação seus cornentários. Você pode enviar um fax, e-mail ou escrever di-
reta1nente, para que possatnos saber do que gostou ou não neste livro-assim co1no o que pode-
mos faze r para tornar nossos livros rneJhores.
Por favor, entenda que não pode1nos ajudá-lo com probletnas técnicos relacionados ao tópico
deste livro e que, devido ao grande vo.lume de correspondência que recebemos, talvez não possa-
mos responder a todas as 1nensagens.
Quando você escrever, ce1tifique-se de incluir o título e o autor deste livro, assim co1no seu
no,ne e nútnero de telefone ou fax. Examinare1nos seus comentários cuidadosamente e os com-
partilhare1nos com os autores e editores que trabalharam no livro.
Crie seus objetos Aprofunde-se 1nais na Aprenda a acessar Quando a codificação O aplicativo não Aprenda sobre a Aprenda sobre o
completando-os con1 criação de aplicativos arquivos e figuras por estiver concluída, o estará concluído até XML e con10 você SOAP e os serviços
propriedades, corn os fonnulários 1neío das classes do trabalho ai.oda não que os usuários o pode usá-la e,n seus da Web. Veja con10
111étodos e eventos. Windo·ws. Aprenda a Visual Basic .NET e terá acabado. tenhan1 instalado, e prograrnas. eles possibilitan1 o
Aprenda a gerar e gerar n1enus e do .NET Frame1vork. Aprenda a você precisa funcionan1ento de seu
usar n10111agens da trabalhe co1n docu1nentar seu desenvolver o aplicativo na rede ou
biblioteca de classes. controles avançados. sisterna e outras progran1a de na Inte111et.
etapas de finalização instalação. Aprenda a
no desenvolvin1ento cnar esses progran1as
de aplicativos. por 111eio da
cecnologia do
Windo1vs Tnstaller.
Sumário
lntroduç.ão· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · XXI
Crie o Projeto· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 54
Desenvolva a Interface com o Usuário· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 54
Executando o Projeto · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 55
Construindo o Projeto · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 56
Adicionando Seu Próprio Código · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 58
Rest.1mo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 60
X Aprenda Visual Basic .NET em 21 Dias
P& R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 60
Works.hop · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 61
Teste······ · ·· ················ · ·· ·· ·· ·· ··· ······ ·· ·· ··· · ···61
Exercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 61
Dia 3 Introdução à Programação com o Visual Basic .NET 63
Variáveis e Atribuição · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 64
O Que É uma Variável? · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 64
Tipos de Variáveis Disponíveis· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 64
Variáveis Simples· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 65
Declarando Variáveis · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 69
A.rrays · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 70
Atribt1 ição · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 72
Consta.ntes · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 72
Algumas Sugestões para os Padrões de Nomeação · · · · · · · · · · · · · · · · · · · · · · · 73
Cálculos Simples · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 74
Usando Operadores · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 75
Funções Internas· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 75
Escrevendo Suas Próprias Rotinas · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 80
s·ub-Rotinas · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 80
F·unções · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 81
E-scopo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 81
Exemplo de Aplicativo: Ca.Iculando u,n Valor Futuro· ··· ·· ·· ·· ······· ·· · · 83
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 88
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 89
Workshop · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 89
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 90
E.xercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 90
Dia 4 Controlando o Fluxo dos Programas 91
Totnando Decisões com as Instruções de Controle · · · · · · · · · · · · · · · · · · · · · · · 91
A Instrução I f · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 92
Estendendo a Instrução I f · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 95
Instruções I f em Seqüência na Mesn,a Linha · · · · · · · · · · · · · · · · · · · · · · · · 99
Expressões e Lógica Booleana· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 00
Operadores de Co1nparação · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 00
Operadores Lógicos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l Ol
Avaliação Abreviada· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 03
Lidando co1n Múltiplas Possibilidades: A Instrução Se 1ect Case· · · · · · · · · · · 104
Laços· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 105
For ... Next · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 106
A Variável do Contador · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 06
Especificando o Valor do Jncre,nento co,n o Uso de Step · · · · · · · · · · · · · · 108
Whi l e ••• End Whi le · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109
Sumário
Laço Do · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 111
Condições de Saída· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · ···· l l3
Laços Infinitos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · ···· 114
hnplicações sobre o Desernpenho · · · · · · · · · · · · · · · · · · · · · · · · · ·· · ···· 115
Aplicativos Que Farão Uso de Seu Conhecimento Recém-Adquirido· · ·· · ···· 116
Leitura de um Arquivo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · ···· 117
Um Jogo SiJnples · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · ···· 119
Evitando Laços Con1plexos por Meio da Recursão · · · · · · · · · · · · · · · ·· · ·· ··
12 1
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 123
P&.R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 123
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 124
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 124
Ex.e1·cfcios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 125
Dia 5 Arquitetura dos Aplicativos na Plataforma .NET 127
O Que É a Arquitetura do Aplicativo?· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 127
Função do Arquiteto de Softwares · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 128
Que Partes de um Sistema São Consideradas Arquitetura do Aplicativo? · · · · 129
Arquiteturas Viáveis na Plataforma .NET· · · · · · · · · · · · · · · · · · · · · · · · · · · · · 133
Os Três Elementos de Qualquer Aplicativo · · · · · · · · · · · · · · · · · · · · · · · · · 133
Quantas Camadas? · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 134
Windo\.vs DNA · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 34
Onde a Plataforma .NET Se Encaixa? · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 135
Escolhendo uma Tecnologia de Cliente · · · · · · · · · · · · · · · · · · · · · · · · · · · · 136
Decidindo Que Arquitetura Usar · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 138
Fatores Essenciais Que Influenciarão Sua Decisão · · · · · · · · · · · · · · · · · · · · 139
Exernplos de Cenários· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 14 l
Resu. mo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 145
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 145
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 146
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 146
Dia 6 O Que Fazer Quando Programas Bons Apresentam Problemas e para
Se Certificar de Que Isso Não Aconteça 147
Tratan1ento, de Exceções Estruturadas · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 48
O Que E o Tratamento de Exceções Estruturadas? · · · · · · · · · · · · · · · · · · · · 148
Erros e Exceções · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 148
O Bloco Try· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 149
A Seção Catch · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 149
Aninhando Blocos Try .. . End Try · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 155
A Seção Fi na 11y · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 15 6
Lançando Exceções · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · l 57
Dept1ran.do · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 157
A Fonte dos Erros················· · · ·· ········ · ··· · ··· · ··· · ·· 158
XII Aprenda Visual Basic .NET em 21 Dias
Matl1 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 214
Classes de Conjuntos no .N ET Frame,vork· · · · · · · · · · · · · · · · · · · · · · · · · · 215
Encontrando o Que Precisa no .NET Framework · · · · · · · · · · · · · · · · · · · · · · · 219
As Regras da Busca · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 2 19
A Saga pela Classe Pe,feita · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 220
Resu1no · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 223
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 224
Workshop · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 224
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 224
Exercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 224
Dia 9 Desenvolvendo uma Interface com o Usuário com os Formulários Windows 225
Visão Geral dos Formulários Windo,vs · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 225
Criando um Aplicativo co,n Fonnulários Windows· · · · · · · · · · · · · · · ··· · · · · 227
Configurando o Projeto· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 227
Adicionando Controles ao Formulário · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 228
Notneando Seus Controles · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 229
Manipulação de Eventos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 229
'
Criando Vários Manipuladores de Eventos para tun Unico Evento · ··· · · · · 23 1
Encontrando Objetos e Eventos por Meio do Editor de Códigos · · · ··· · · · · 232
Múltiplos Eventos com um Manipulador · · · · · · · · · · · · · · · · · · · · ··· · · · · 233
Mais lnfonnações sobre os Controles· · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 233
Criando Grupos de Botões de Opção · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 234
Adicionando u1na Caixa de Seleção ao Exen1plo de Fi ler · · · · · · · ··· · · · · 236
Validação de Entradas· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 23 8
Usando a Classe MessageBox · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 241
Parâmetros · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 242
Obtendo Resultados · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 243
Controles Ocultos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · · · · 246
Timer· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 247
Not i f y I con · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 248
ErrorProvi der · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ··· · ···· ··· · · · · · 249
Controles das Caixas de Diálogo · · · · · · · · · · · · · ··· · ··· · ·· ·· ··· · · · · · 250
Construindo Suas Caixas de Diálogo · · · · · · · · · · · · ··· · ··· · ·· ·· ··· · · · · · 254
Criando a Caixa de Diálogo · · · · · · · · · · · · · · · · ··· · ··· · ·· ·· ··· · · · · · 255
Configurando o Resultado da Caixa de Diálogo · · ··· · ··· · ···· ··· · · · · · 256
Exibindo a Caixa de Diálogo· · · · · · · · · · · · · · · · ··· · ··· · ···· ··· · · · · · 257
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ··· · ·· ·· ··· · · · · · 259
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 259
Workshop · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 260
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 260
Exercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 260
XIV Aprenda Visual Basic .NET em 21 Dias
ADO.NET··············································· · ·312
Tarefas-padrão dos Bancos de Dados · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 l 4
Conectando-se ao Banco de Dados · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 314
Executando uma Instrução SQL· · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 319
Recuperando Dados · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 321
Trabalhando com Data Sets · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 323
Inserindo Dados e,n u,n DataSet · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 323
Navegando pelos Dados · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 326
Editando Dados (Adicionar, Editar e Excluir)· · · · · · · · ··· · ···· ···· · · · · 329
Editando Registros · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 331
Atualizando o Banco de Dados · · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 334
Trabalhando com Múltiplas Tabelas · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 346
Visualizações · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 348
Vinculação de Dados · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 350
Vinculação de Dados con1 os Formulários Windo\.vs· · · ··· · ···· ···· · · · · 351
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 354
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 355
Workshop · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ···· ···· · · · · 355
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ··· · ·· ·· ···· · · · · 355
ExercJcios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 356
Dia 13 Usando o Server Explorer 357
O Que É o Server Explorer · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 357
O Que É um Serviço?· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 359
Examinando os Serviços · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 359
Ca,uinho a Ser Perco1Tido para Estabelecer u1ua Conexão com o Banco de Dados
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 36 3
Trabalhando com os Serviços · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 364
Visualizando os Serviços· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 365
Conectando-se com Outro Servidor · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 366
Escrevendo Programas Que Usam os Serviços · · · · · · · · · · · · · · · · · · · · · · · · · 366
Escrevendo Códigos de Acesso a Dados con1 o Server Explorer · · · · · · · · · · 366
Rest1mo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 379
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 380
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 380
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 380
Exercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 380
Dia 14 Introdução à Programação Orientada a Objetos 381
Visão Geral da Progra1nação Orientada a Objetos· · ··········· ·· · ·· · · · · · 381
Comparando a Programação Orientada a Objetos com a Linear· ·· · ·· · · · · · 382
Usando os Objetos na Organização do Código · · ··········· ·· · ·· · · · · · 384
Conceitos Importantes na POO · · · · · · · · · · · · · · · ··········· ·· · ·· · · · · · 385
Classes, Objetos e Instâncias· · · · · · · · · · · · · · · ··········· ·· · ·· · · · · · 385
XVI Aprenda Visual Basic .NET em 21 Dias
Propriedades· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 87
Métodos···· ·· · ······· · · ·· · ··· ··· ······ ·· ·· ·· ·· ··· ······ · ·· 388
Hera11ça · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 389
Construtores· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 393
Projetando um Aplicativo com o Uso da POO · · · · · · · · · · · · · · · · · · · · · · · · · 396
Identificando os Objetos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 397
Detenn inando as Propriedades e Métodos · · · · · · · · · · · · · · · · · · · · · · · · · · 398
Modelando Seus Objetos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 399
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 400
P&.R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 400
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 400
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 401
Ex.e1·cfcios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 40 l
SEMANA 2 Revisão 403
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 530
Works.hop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 530
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 530
Dia 19 Implantando Seu Aplicativo 531
Introdução à Implantação · · · · · · · ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 53 1
Criando uma Instalação Simples ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 533
Crie o Projeto e a Solução· · · · · ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 533
Arquivos de Configuração· · · · · ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 540
In1plantações de Múltiplos Projetos ··· · · ··· ···· · ··· · ··· · ·· ·· ···· · · · · 542
Rest1.mo · · · · · · · · · · · · · · · · · · · · ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 545
P&R · · · · · · · · · · · · · · · · · · · · · · ··· · · ··· ···· · ··· · ··· · ···· ···· · · · · 545
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 546
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 546
Exe1·cícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 546
Dia 20 Introdução à XML 547
O Que E' XML? · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 547
Elementos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 551
Atributos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 552
Esquemas·· ··· · ······· · ······· ·· ··· · ··· · ··· ·· ·· ·· ······· · ·· 553
Trabalhando co,n a XML · · · · · · · · · · · · · ·· ···· · ··· · ··· · · · · · · · · · · · · · 556
O Docu1uent Object Model · · · · · · · · · · ·· ···· · ··· · ··· · · · · · · · · · · · · · 556
Objetos de Leitura e de Gravação · · · · · ·· ···· · ··· · ··· · · · · · · · · · · · · · 559
Lendo XML · · · · · · · · · · · · · · · · · · · · · ·· ···· · ··· · ··· · · · · · · · · · · · · · 56 l
Gravando XML · · · · · · · · · · · · · · · · · · ·· ···· · ··· · ··· · · · · · · · · · · · · · 566
Resumo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 569
P&R · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 569
Workshop· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 57 1
Teste · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 571
Exercícios · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 571
Dia 21 Criando Serviços Web com o Visual Basic .NET 573
O Que É um Serviço Web? · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 573
O Simple Object Access Protocol · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 575
O Protocolo · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 575
Web Service Description Language (WSDL) ·· · · ··· · ··· · ···· ··· · · · · · 576
Discovery · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · · ··· · ··· · ·· ·· ··· · · · · · 579
Criando un1 Serviço Web Simples · · · · · · · · · · ·· · · ··· · ··· · ···· ··· · · · · · 580
Criando o Projeto · · · · · · · · · · · · · · · · · · · · ·· · · ··· · ··· · ···· ··· · · · · · 581
Adicionando o Código · · · · · · · · · · · · · · · · ·· · · ··· · ··· · ·· ·· ··· · · · · · 584
Con1pilando o Serviço Web· · · · · · · · · · · · · ·· · · ··· · ··· · ·· ·· ··· · · · · · 585
Criando um Serviço Web Cliente · · · · · · · · ·· · · ··· · ··· · ·· ·· ··· · · · · · 587
Criando o Projeto · · · · · · · · · · · · · · · · · · · · ·· · · ··· · ··· · ···· ··· · · · · · 588
Adicionando o Código · · · · · · · · · · · · · · · · ·· · · ··· · ··· · ···· ··· · · · · · 589
Sumário
Visão Geral
O .NET Framevvork é o conjunto básico de conceitos e tecnologia subjacente ao 1nais novo gru-
po de ferra1nentas de desenvolvi1nento da Microsoft e constituirá a base para a nova série de ser-
vidores, aplicativos e serviços co,n base na Web itnplantados ao redor do inundo. Con10 já é de
se esperar, a plataforma .NET não é algo que possa ser completatnente discutido em uma hora ou
1nesmo em 21 dias, portanto, este livro terá uma abordagem 1nais específica. Você precisará se
tornar produtivo rapida1nente e isso é o que conseguirá nos próximos 21 dias enquanto ler este li-
vro e trabalhar com os exercícios dele. Pelo fornecimento dos ele1nentos básicos da linguagem
do Visual Basic .NET e uma explicação suficiente do próprio .NET Fran1ework, você estará
pronto para já cotneçar a programar e preparado para continuar aprendendo ao progredir.
Desde o início, é importante observar um fato essencial sobre a plataforma .NET: a linguagem
que você usa é ,nenos relevante do que foi no passado. O Fra,nework (o conjunto de tecnologia
e1n que toda a plataforma .NET está baseada) é a própria plataforma .NET e também pode ser
acessado se1n proble1nas por qualquer linguage1n .NET (incluindo o Visual Basic, C#, C++ e ou-
tras). Essas são notícias excelentes tanto para os desenvolvedores novos do Visual Basic quanto
para os experientes. O Visual Basic não é 1nais u1na linguage1n de segunda classe, com certos re-
cursos avançados do siste1na operacional restritos apenas aos progra1nadores que usain C++.
Agora, qualquer sistema, independentemente do tipo, pode ser criado no Visual Basic.
Essa independência ta,nbém significa que você (ou sua e1npresa) está livre para escolher qual-
quer linguagem com a qual queira trabalhar. Dada essa opção, mui.tas pessoas, incluindo os auto-
res deste livro, irão adotar o Visual Basic .NET. Sua sintaxe e estilo fáceis de usar o tornara,n a
linguagem de progra1nação ,nais popular do mundo, .mesmo co1n as !.imitações que a versão an-
terior apresentava. Agora, co,n a platafonna .NET, nada irá i1npedi-la de ser usada en1 qualquer
projeto de todos os tipos de empresa.
Se você estiver interessado e1n 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
urna abordagem de como usar o .N.ET Frarnework, conhecimento que pode ser transferido facil-
mente para qualquer linguage1n .NET.
Este livro foi planejado como uma série de lições, cada lnna representando algun1 conceito im-
portante no desenvolvi1nento de aplicativos (co,no o acesso a bancos de dados) ou u,n trecho es-
XXII Aprenda Visua l Basic .NET em 21 Dias
sencial com conhecilnento para tornar você produtivo (ouso do IDE, por exemplo). Essas lições
podem ser exa1ninadas e1n qualquer orde1n, mas se você for novo na atividade de progra1nação
em geral, então, será mais vantajoso seguir a partir do início, na primeira vez que o livro for usa-
do. A 1naioria das lições, 1nes1no a prin1eira, inclui algu1n exe1nplo de código e exercícios para os
quais será necessária a elaboração de mais u1n pouco de codificação. Para aproveitar ao máxi1no
o tempo gasto no livro, tente realizar todos esses exen1plos e exercícios. Nada aun1entará sua
compreensão desses tópicos mais rapidamente do que colocar a mão na 1nassa e codificar.
Nosso objetivo é prepará-lo nos próximos 21 dias para que você possa criar tnuitos de seus pró-
prios aplicativos sirnples no Visual Basic .NET e trabalhar como parte da equipe que está desen-
volvendo wn grande aplicativo Windows ou com base na Web.
Requisitos
Já que se trata de tun livro sobre o Visual Basic .NET, o requisito 1nais pren1ente é urn sistema
que execute o Visual Stud.io .NET, e que tenha no mínirno as especificações básicas a seguir:
• Siste1na operacional WindO\VS XP Professional, Windows 2000 (Datacenter Server,
Advanced Server, Server ou Professional) ou Windows NT 4.0 Server. O Visual Studio se
encarregará da instalação de qualquer pacote de serviços, arquivos atualizados de acesso a
dados e da versão 6 do Internet Explorer, todos sendo requisitos para o Visual Studio .N ET.
• 11ard\vare Pentiurn fl co1n 450 Mhz ou equivalente, 128 MB de RAM, placa de vídeo
con1 capacidade para resolução de 800 x 600 pixeis, 256 cores e no n1ínin10 1 GB de espa-
ço em disco rígido. Utna unidade de CD-ROM é necessária para instalação, mas você
pode colocar seus CDs em outra n1áquina e instalar por meio de u1na conexão LAN .
Além do Visual Studio, os exemplos deste livro requere1n a possibilidade de acesso a u1n servi-
dor Web que esteja na 1nesn1a rnáq uina do Visual Studio ou tenha o SDK do .NET Frame,~ ork 1
instalado nela. O melhor a fazer é se certificar de que sua máquina principal de desenvolvimento
tenha um servidor Web ern execução nela, como no Windows 2000 ou no Windows NT. Outro re-
quisito básico usado pelos exeinplos na última 1netade deste livro é o acesso a u1n banco de dados,
especificarnente o SQL Server 7.0 ou 2000. Se você não tiver o SQL Server, então poderá usar o
Microsoft Data Engine (MSDE), que funciona de 1naneira 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 lições de acesso a bancos de dados para fazê-los funcionar se1n o SQL Server.
XXIV Aprenda Visua l Basic .NET em 21 Dias
O Site da Web
Este livro possui u,n site da Web associado a ele no endereço http://www.makron.com. br. Loca-
lize a página do livro no site, digitando seu título na caixa Pesquisa. Ao entrar na página do livro,
procure o link MATERIAL COMPLEMENTAR. Você pode fazer o download de todos os códi-
gos do livro e alguns links ou ,nateriais
,
comple1nentares que acha,nos ser úteis para o leitor com-
preender o Visual Studio .NET. E claro que é totahnente possível usar este livro e acompanhar
todos os exe1nplos, sem ser preciso visitar o site, mas em alguns dos exemplos 1nais longos, pode
ser 1nelhor economizar algu1n esforço en1 digitação fàzendo o do\.vnload dos arquivos que con-
tê1n os códigos.
Retorno
Trabalhan1os duro para tornar este livro u1na ferratnenta útil de aprendizado da platafonna .NET
e u1na aquisição valiosa para sua biblioteca de desenvolvin1ento. Se você achar que devería1nos
ter gasto mais ou menos tempo em alguLn tópico específico ou tiver sugestões para melhorar o li-
vro, faça contato conosco (e1i entes@makron.com. br). Tentaremos incorporá-las e1n livros futu-
ros e, se for o caso, na próxi1na revisão deste 1nesmo vol.t11ne.
As notas fornecem informações úteis em destaque, que você pode ler imediata-
NOTA mente ou retornar a elas sem perder o fluxo do tópico que estiver examinando.
Faça •
Os quadros Faça/Não Faça enfatizam práticas ... e ruins que devem ser evitadas.
boas que você deve adotar ...
Novo TERMO Os ícones Novo Termo assinalan1 locais onde uma nova terminologia foi usada e defi-
nida pela primeira vez. Essa terminologia aparece destacada com un1a fonte em itálico.
CÓDIGO Os ícones Código são usados em exe1nplos de código que o usuário deve inserir.
ANÁLISE Os ícones Análise apontam para discussões co1n explicações sobre os exemplos de
códigos.
Visão Geral
Durante esta parte, você aprenderá vários tópicos essenciais:
• O Visual Basic .NET e o conceito de programação (Dia 1).
• Configuração e uso do Visual Studio .NET para começar a escrever pro-
gran1as (Dia 2).
• A sintaxe e as técnicas de programação do Visual Basic para tipos de da-
dos, procedi1nentos e variáveis (Dia 3); o controle do fluxo dos programas
- laços e instruções condicionais (Dia 4); e o tratamento de erros (Dia 6).
• Organização e projeto de u1na solução no Visual Basic .NET (Dia 5).
• Conceitos importantes relacionados ao desenvolvilnento orientado a ob-
jetos con1 os quais você trabalhará por todo o livro (Dia 7).
Esta pa11e é importante. Ela define os fundamentos do conhecirnento básico nos
quais todos os outros conceitos de progran1ação do Visual Basic .NET se basea-
rão. O Dia I preparará você para co1neçar a explorar e aprender o Visual Basic,
por 1neio da introdução dos conceitos fundamentais de programação e da plata-
forma .NET, junto corn urn breve histórico do próprio Visual Basic. No Dia 2,
aprendere1nos a usar o ambiente de desenvolvi1nento com todos os recursos do
Visual Studio para criar projetos.
Nos Dias 3 e 4, você irá progran1ar com rnuitas informações sobre a sintaxe e
conceitos (incluindo variáveis, laços, instruções i f e mais) que farão parte de to-
dos os progra1nas do Visual Basic escritos desse ponto en1 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 e 7 retornam ao mundo prático da codificação em que apren-
dere1nos a lidar con1 erros e a usar objetos en1 progran1as.
Esta pa11e fornecerá as infonnações de que você precisa para prosseguir co1n a
leitura do livro, provendo todos os detalhes sobre os quais os outros capítulos se
desenvolverão.
SEMANA 1
DIA
Compreendendo a Programação de
Computadores
E1nbora falemos corn freqüência em computadores no que diz respeito ao hardware (é co1nurn
ouvir comentários co1no "Tenho u1n Pentiu1n III co1n 600 MHz e 256 MB de RAM", por exem-
plo), só isso não é o bastante. A CPU (Central Processing Unit ou unidade central de processa,..
1nento do co1nputador), por exen1plo, pode realizar 1nuitas tarefas i1nportantes como cálculos
matemáticos ou a transferênc.ia de dados entre várias pa1tes do sistema. Sozinho, no entanto, não
é capaz ne.m mesmo de ler um arquivo no disco rígido. Um progra,na de computador é um con-
4 Dia 1
junto de instruções para todos esses elementos de hardv.,are, em geral escrito para execução de
alguma tarefa que esse não poderia concluir sozinho. Todas as operações básicas que envolve,n
o uso de unidades de disco, me1nória, n1onitor e i1npressora são complexas. Um progra1na que ti-
vesse de interagir co1n essas operações gastaria a maior pa,te de seu tempo nelas, e só u1n peque-
no percentual seria e1npregado em sua finalidade real. Escrito no hardware, u,n progra1na para
calcular os pagamentos de u1na hipoteca provavehnente teria centenas ou ,nilhares de linhas
para gerenciar a exibição e outras questões, e apenas alguinas linbas para fazer o cálculo. Assim
a programação era fe ita no passado, se1n que fosse inuito produtivo porque 1nuito pouco te1npo
podia ser gasto na finalidade real do aplicativo. O que se precisava era de alguma maneira pela
qual todos esses detalhes fossetn manipulados para que os progra1nas pudessem se dedicar a suas
tarefas específicas.
Co,n frequência, os relaciona1nentos não são definidos co1n 1nuita clareza; u,n progra1na pode
precisar acessar o hardv,are diretamente (sem passar pelo sistema operacional) para usar um re-
curso dele ao qual o siste,na operacional não dê suporte ou para tentar melhorar o dese1npenho.
Isso dece1to foi o que aconteceu, no início, co,n um dos prilneiros sistemas operacionais de PCs,
no qual ,nuitos programas tinha,n de interagir direta,nente co,n o hardware. Essas li1nitações
significavain mais trabalho para as pessoas que quisesse,n escrever softv.,ares para PCs, já que
cada progra1na precisava 1nanipular suas próprias impressoras e outros detalhes. Ao 1nes1no tem-
po e,n que versões sucessivas dos sistemas operacionais fornecia1n um au,nento na fu ncionali-
Bem-Vi nd o ao Visua l Basic .NET
dade, se tornou mais fácil escrever progran1as para eles. Por fim, o Windows substituiu esses
sistemas. Uma das 1naiores 1nelhorias oferecidas pelo Windows é que o sistema operacional
agora provê recursos de interface de usuário para outros programas. No Windows, se un1 progra-
ma de computador precisar rnostrar u1na caixa de diálogo na tela (con10 a da Figura 1.2), ele ape-
nas solicita ao siste1na operacional para exibi-la e fornece a mensagen1 que a acompanhará. Para
acessar toda a funcionalidade que o sistema operacional provê, utn cot~unto de APis (Applicati-
on Progra1n1ning interfaces) é disponibilizado. .Essas APis representa1u a exposição de todos os
recursos do siste,na operacional e pode1n, portanto, ser usadas em seus progra1nas.
FIGURA 1.2
O Hlindo11 1s 111anipula a This is a dalog boxl
exibição de ele,nentos Part of a Graphlcal User Irxerface
de GU!s (Graphical
User lnte,jàces,
lnte,jaces gráficas co111
o usuário) co,110 esta
caixa de diálogo, o que
.faz parte dos se111iços
que ele .fornece aos
progra111as.
O resultado de todas essas n1elhorias é que cada programa ten1 de ,nanipular cada vez menos
operações genéricas do computador e pode, po1tanto, se dedicar a sua final idade real. Outro
grande beneficio da remoção de códigos específicos de hardware dos aplicativos é que, quando
ocorre1n alterações no hardware (i1npressoras e unidades novas de disco rígido, CPUs 1nais velo-
zes), o siste,na operacional pode ser atualizado para manipular o equipamento novo, mas os pro-
gra1nas executados nesse co1nputador não deve1n ser afetados.
O que isso significa para você como programador do Visual Basic? Be1n, significa que poderá
criar prograrnas de computador para realizar u1na tarefa específica setn ter de saber nada sobre
corno o Windows desenha as figuras no 1nonitor, emite docu1nentos na i1npressora ou salva ar-
quivos no disco rígido. Você se tornará produtivo rapidarnente, co1n a ajuda deste livro.
É possível escrever programas usando diretamente esse código nativo, com a criação de um ar-
quivo no disco rígido repleto de instruções, mas seria necessário 1nuito trabalho para produzir
até mes1no u1n progra1na 1nais simples. Para evitar todo esse esforço e per1nitir que os progrruna-
dores se dedique1n à fina lidade de seus progra1nas, linguagens de nível superior fora,n criadas.
Essas linguagens pennitetn que você use instruções 1nais avançadas e co1nplexas que são, então,
convertidas para as diversas instruções necessárias que sejan1 correspondentes às outras na lin-
guage1n de máquina. U1na única linba de uma linguage1n desse tipo provavebnente poderia se
transfonnar em dez instruções separadas na linguage1n de 1náquina.
Novo TERMO O processo de converter u1na linguagem de computador de alto nível e1n código de
máquina ou nativo é conhecido con10 compilação. Os progra1nas que fazem essa
conversão são cha1nados de co,npiladores.
Muitas dessas linguagens foram criadas con1 o passar dos anos. FORTRAN, COBOL, APL, Pas-
cal, C e BASIC são apenas alguns exe1nplos, mas centenas de li nguagens diferentes estão dispo-
níveis. Cada linguagem possui seu próprio conjunto de comandos e, co1n o tempo, novos
comandos são criados para simplificar ainda 1nais o esforço de progratnação. Assirn co1no os
computadores evoluíram progressiva1nente, o 1nes1no aconteceu às linguagens usadas para pro-
gramá-los, sendo adicionados novos recursos às existentes ou com a criação de novas lingua-
gens co1110 a C++ (que, co1110 você deve ter adivinJ1ado, foi baseada na C) e a JAVA. E,n geral,
os apritnorarnentos nas linguagens têm o objetivo de au1nentar a produtividade da programação,
pennitindo que o desenvolvedor crie o progra1na desejado da 1naneira 1nais fácil possível.
co,nputador possa
co111preender.
e----- Execute )
Enq uanto as linguagens de prograinação evoluía1n, esse ciclo foi 1nelhorando também, resultan-
do no desenvolvimento de co1npiladores 1nais avançados e no conceito de um Ambiente Tntegra-
do de Desenvolvime11to (IDE, Integrated Development Environment). A finalidade de um IDE é
combinar os co1nponentes de edição, depuração e co1npilação do desenvolvin1ento de softwares
e.1n uma única interface para o progra1nador (veja a Figura 1.4). Apesar da interface única, a tec-
nologia real é 1nuito sen1elhante. Na 1naioria dos casos, o código ainda é co1npilado (veja a Nota
a seguir para mais informações) e o progra1nador ainda cria arquivos de texto, 1nas o ambiente de
trabalho é muito mais amigável.
rJj 11 ,
Sub Pou~e (J
conso1e . vr 1ceL1ne('"P~e9s I nt@r t.o cont.1nue .. . '")
Con.:,olC! . Rol\..dLi nc O
. Cnd Sub
1- ~
-
Cdl (h
_J INS
8 Dia 1
NOTA
- Além das linguagens compiladas (em que o código-fonte deve ser processado
em um compilador antes que possa ser executado), existe um outro tipo cha-
mado linguagem interpretada. Nessas linguagens, o código-fonte não é com-
pilado. Em vez disso, um programa especial executa o código 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 são processadas mais lentamente do que as com-
piladas, nas quais a análise só ocorre uma vez, na hora da compilação. O Visual
Basic já foi uma linguagem interpretada, mas esse não é mais o caso.
A criação de lDEs gerou algu1na confusão entre quais serian1 os seus recursos e os da linguagem
a ser usada. Isso é realmente verdade no caso do Visual Basic, para o qual o IDE fornece muitos
recursos que permitem ao programador criar con1 facilidade u1na funcionalidade avançada.
Esses recursos quase se1npre geram o código do Visual Basic, e é ele que executa o trabalho.
Nesse caso, é o IDE que adiciona a funcionalidade, e não a linguagen1, 1nas ambos são em geral
vistos como o mesmo ele1nento. Hoje, quando for introduzido o conceito do Visual Studio .NET,
você verá que u1n fDE pode dar suporte a 1nuitas linguagens, e talvez seja i1nportante co1npreen-
der a diferença entre ele e sua linguagen1 subjacente.
Outro avanço i1npo1tante na história das linguagens de programação foi a criação das linguagens
'visuais', co1no o Visual Basic. Essas linguagens são cha1nadas 'visuais' porque permitem age-
ração de progra1nas que use1n u,na interface gráfica. O recurso ,nais co1num desse tipo de lin-
guagen1 é a possibilidade de inserir botões, texto e outros itens e,n un1a tela para construir u1n.a
interface co1n o usuário (veja a Figura 1.5). Mais u,na vez, na verdade, un1 código real freqüente-
mente é gerado, tuas o programador tem u1n trabalho muito mais agradável com a criação das
partes gráficas de seu aplicativo. Abordarei a posição ocupada pelo Visual Basic co1no lingua-
gen1 de progran1ação u1n. pouco n1ais adiante na lição de hoje.
por que.
Bem-Vindo ao Visual Basic .NET 9
·•. OrGUtOolNfT 4 _Collec:llom, • M1cro,ofi Vi,U<kl oa,lcMT ( de-,lqn) • r om, l.vb [Oew,gn]• l!!!lr;:J' E'J
FIGURA 1.5
As ferra111entas visuais --·
de desenvolvin1ento
per111iteni que você crie
inte1:faces grafica111ente
......---------- . ,
e, e111 seguida. gere o 1:
.. . .
..................
'
f
código necessário. i.. :: : butonl
..". '
. . . . .' . .
. ...."
.. : ...r ched:.BOll:1
'
''.
. ' .. .
....... .. .'' ..
' . ..
a... . ' ... ..... . . .'.'.' . . ...
. ..... ......... ............ .... . ........... ....... ..' .
.. .. ........' ..... ...' ..' .' .. . .. .. ............... .
.
.... .... ...' .... . .. .......... .. . .. .. .. .......' .' .. ..' . . . . ..
. . . . . ' . . . . . . . . . . . . . . . . . . . .......... .
.. . .. .. .' . . . ..." . .. . .. . . . . . . ... .:.J
--= 9 X
°" 1
deve, então, ser distribuído para os usuários, com manutenção e aprimoramentos posteriores. Os
erros - proble,nas no sistema - deve,n ser corrigidos, e novos recursos adicionados.
Distribuição Implementação
Esse ciclo é a vida e o trabalho do desenvolvedor de soft'vvares. Mas, para a maioria dos progra-
madores, o ,notivo pelo qual programam pode ser definido e1n tennos 1nais si1nples: eles escre-
vem códigos que fazem algo de útil. A finalidade efetiva da progra,nação é fazer o hardware do
con1putador realizar tarefas práticas; é isso que guia a 1naioria dos desenvolvedores de softwa-
res. Meu co-autor e eu n1antive1nos esse conceito e,n mente por todo o livro e nos certificamos de
que quase todos os progra1nas que mostran1os executasse u,na função de utilidade, alén1 de for-
necer a experiência para o aprendizado. É esse o objetivo real, criar aplicativos úteis, que conduz
muitas pessoas ao Visual Basic,já que ele é considerado por muitas delas como o ca,ninho n1ais
rápido para passar da idéia ao aplicativo.
face co1n o estilo do \Vindows, de 1nodo que ele não era muito apropriado para codificação nesse
novo a1nbiente.
No entanto, a Microsoft apresentou um novo produto que combinava a linguagem popular e fácil
de aprender do BASIC co1n utn a1nbiente de desenvolvimento que permitia aos progra1nadores
criar graticamente a interface con1 o usuário para u1n progra1na. Esse produto, como você já deve
ter adivinhado, era o Visual Basic 1.0. No início, ele não foi adota.do, mas fornecia reahnente u,n
a1nbiente veloz para o desenvolvi1nento de interfaces gráficas co1n o usuário (GUls). O que pode
ser uma surpresa é que o Visual Basic, na verdade, con1eçou com uma versão em DOS, embora
tenha sido logo transferido para o Windo\.vs (veja a Figura l .7).
ex
FIGURA 1.7
A. pritneira versão do
Visual Basic para
Windou,s .fornecia ...... . .... .. .. ........ .. ............. ....... .. ...... .. ............. .. .. I v-r-1 v-co.ie I
...... ...................................................
. ..... .. .········
.................. ..... . ......·····
.. ... ... ············
' '
......... . ....
!!: :::: ::: :::::: ::::: ::: ::::::::: :::::::::: '
::: : :: :: ::::::::::::
arrastar e soltar usada .....' ..' ... ... .. ... ... ... ... ... ... ... ..... ... ... .. ..' .. . .. ... ...... ... .. .. ... ... ... ... ... ... ... ... ..... ... ... ... ... ... ... ... .. ... .. . .........
.
.
. .
. . . . . . .. . ..
no desenvolvilnento. ........... ............... . . .... .. ... ......... ...
.
. .
"
...
. .
. . ................. . ... . . ....... .. .. .
.
O Visual Basic cresceu em popularidade co,n o tempo. U1n único recurso se 1nostrou essencial
para seu sucesso. Era a possibilidade de a Microsoft, o programador e outros fornecedores cria-
retn co1nponentes de interface personaliza.dos que podiam ser adicionados aos programas. As
empresas rapida1nente entraram nesse 1nercado, desenvolvendo componentes que adicionavan1
vários recursos aos aplicativos do Visual Ba.sic, como a geração de gráficos, edição de iinagens,
conexões com 1nodems e 1nuitos outros. Esses co1nponentes permitiam que o progra1nador do
Visual Basic criasse aplicativos 1nais avançados combinando vários componentes con1 seu pró-
prio código. Isso au,nentou 1nuito o desenvolvi1nento rápido possibilitado pelo Visual Basice
ajudou a torná-lo u1na das linguagens mais populares de programação.
Toda. versão atualizada. do Visual Basic adicionava. novos recursos, o que o tornava. cada. vez
1nais u1na ferra1nenta de desenvolvimento cornpleta1nente capacitada. U1na alteração importan-
te, em particular, foi na maneira co1no o Visual Basic era processado no tetnpo de execução. Até
a versão 5 ser lançada en1 l 997, o Visual Basic era urna linguage1n interpretada, o que resultava
ern um desempenho relativamente fraco se co1nparado com o do Visual C++, Delphi e outras lin-
12 Dia 1
guagens compiladas. O Visual Basic 5.Otornou possível criar versões compiladas ou interpreta-
das de programas, e o dese1npenho 1nelhorou de 1nodo considerável.
Outra alteração essencial no Visual Basic foi a possibilidade de criar cornponentes. Em progra-
mação, encontra-se con1 freqüência u1n trecho de código, como u1na rotina de cálculo de hipote-
ca, que poderia ser usado e1n muitos locais do programa e potenciahnente até 1nes1no em vários
progra1nas diferentes. O compartilharnento desse código dentro de um prograrna e1n geral é con-
seguido escrevendo-o como um procedimento, um bloco de código que é digitado uma vez no
prograina, ,nas pode ser cha1nado de qualquer local do aplicativo. O co1npartilhamento entre
progra1nas pode ser feito apenas copiando-se o código do procedin1ento e1n cada novo aplicativo
que for desenvolvido, mas isso gera um problen1a. Sempre que você, ou outra pessoa, fizer u1na
alteração nesse bloco de código (para corrigir um erro ou rnelhorar a maneira do código funcio-
nar), precisará copiar o código para todos os aplicativos que o utilizam.
Uma maneira de melhor compartilhar o código é criar u1na biblioteca de códigos armazenada en1
tun arquivo separado dos prograrnas que o utilizrun e que possa ser alterado de modo indepen-
dente. Essa biblioteca é conhecida co1no coniponente e é criada quase sempre na forma deu.mar-
quivo .d ll. Usar tuna biblioteca é o rnétodo preferido de co1npartilhar códigos. No decorrer do
desenvolvimento de novas versões do Visual Basic, sua capacidade de criar esses componentes
foi avançando regularmente. A versão 4.0 (lançada en1 1996) foi a prilneira a permitir a criação
ele co,nponentes, e hoje esse é tun recurso extrema1nente essencial e1n projetos de desenvolvi-
1nento. Discutire1nos os con1ponentes com 1nais detalhes no Dia 14, "Introdução à Programação
Orientada a Objetos".
Muitos recursos co1nplementares foram adicionados ao Visual Basic, mas tudo foi construído
ern cin1a da base existente. Isso não é raro. A 1naioria das ferra1nentas de desenvolvi,nento pro-
gride dessa maneira, contudo há o efeito colateral de acumular lixo. As versões novas de uma
ferra1nenta tenta1n 1nanter a co1npatibilidade co,n todos os aspectos muito pouco eficazes das an-
teriores. Reescrever uma linguage1n a pa1tir do zero é quase impensável. O trabalho necessário
poderia ser enonne, e romper a co1npatibilidade co1n o código já existente para o usuário pode
não ser betn aceito. O benefício de uma mudança dessas seria tuna imple1nentação nova e limpa
por co,npleto, que poderia manter o que fosse bom e desca1tar as partes inválidas da linguagen1
anterior.
lsso foi exatamente o que a Microsoft fez na passagem do Visual Basic 6.0 para o Visual Basic
.NET. Ela reescreveu a linguagem para criar uma versão limpa que eli1ninasse o lixo que se acu-
mulou por tun.a década de atualizações sucessivas. Isso significa uma curva de aprendizado se-
vera para as pessoas que tinham experiência na versão anterior da linguage1n, n1as o resultado
final vale o esforço. A alteração radical faz com que este seja u1n grande momento para ser inician-
te no Visual Basic,já que os conceitos ensinados neste livro terão uma vicia útil 1nuito mais longa
do que aquilo que se aprenderia co1n um material relacionado à versão anterior.
Há muitos benefícios nessa mudança, todos eles foram estimuladores dessa decisão, mas a n1oti-
vação n1ais significativa foi a necessidade de adaptação ao novo ainbiente .NET. No decorrer
Bem-Vindo ao Visual Basic .NET
desta lição, você aprenderá mais sobre a plataforma .NET, o que é e como o Visual Basic se en-
quadra nela.
,
O Que E .NET?
À prin1eira vista, .NET pode parecer apenas um conceito de marketing, uma maneira de evitar
mais u1n nú1nero após Visual Basic, 1nas é ,nuito mais que isso. .NET representa toda u1na gan1a de
tecnologias e conceitos que forma,n uma plataforma na qual você pode desenvolver aplicativos.
Na verdade, o Visual Basic .NET possui um número real de versão, 7.0- só que
NOTA ele não é muito usado. Da mesma maneira como o Windows 2000 é na realida-
de a versão 5.0 do Windows NT, quanto mais simples ou assimilável é o nome,
mais ele é usado. No entanto, não espere ouvir Visual Basic 7.0 com freqüên-
cia; havia até uma penalidade em dinheiro dentro da Microsoft para quem se
referisse ao Windows 2000 como NT 5.0.
No início desta lição, expliquei co1no o sistema operacional fornece u,n nível de funcionalidade
básica aos aplicativos (co1no a possibilidade de ler arquivos de u1n disco rígido ou disquete). A
plataforma .NET pode ser explicada de maneira se1nelhante; ela é uma camada que existe abaixo
de seus progratnas e fornece u1n conjunto de serviços e funções básicas. Essa camada conté1n urn
grupo de aplicativos e sistemas operacionais chamado servidores .NET; um conjunto básico de
objetos cha1nado .NET Framework; e um conjunto de serviços que dá supo1te a todas as lingua-
gens .NET chamado Con1mon Language Runtin1e (CLR). Cada uma dessas partes da plataforma
.NET (veja a Figura 1.8) será abordada individualmente.
Componentes de Hardware
14 Dia 1
Servidores .NET
O principal objetivo do conceito .NET é di1ninuir o desenvolvimento de siste1nas distribuídos,
nos quais o trabalho é feito e1n vários locais diferentes. E1n geral, esse tipo de siste1na faz seu tra-
balho no back-end, no nivel do servidor. A Microsoft fornece um conjunto de softwares que jun-
tos são conhecidos como .NET Enterprise Servers. Eles fora1n projetados para substituir os
recursos de back-end necessários ao siste1na distribuído. Esses produtos incl.uem:
• Um siste1na operacional do servidor, o Microsoft Windows (Server, Advanced Server e
Datacenter Server)
• Softwares de agrupa1nento e balanceamento como o Microsoft App Center e o Microsoft
Cluster Server
• Um servidor de banco de dados, o Microsoft SQL Server
• Um siste1na colaborati.vo de correio eletrônico com armazenamento de informações de
forn1a livre, o Microsoft Exchange Server
• Um 1necanismo de transfonnação de dados com base e1n XML (falarei 1nais sobre a XML
no Dia 20), chan1ado Microsoft BizTalk Server
• Un1 servidor para o acesso a sistemas legados, como o AS/400s, cha1nado Host lntegrati-
on Server
• E mais ...
Juntos, esses servidores fornecerão os serviços básicos a seus aplicativos .NET, fonnando o ali-
cerce dos sistemas. Este livro se referirá a eles algumas vezes, mostrando onde podem ser usados
e1n seus sistemas .
.NET Framework
Na passage1n para o Visual Basic .NET muitas coisas fora,n radicahnente alteradas; u1na delas
foi o desenvolvimento de urna nova base para todas as ferramentas .NET de desenvolvimento.
Essa base, conhecida como .NET Framework, fornece dois itens essenciais: o ambiente princi-
pal de tempo de execução e u1n conjunto de classes básicas. O a1nbiente de te1npo de execução é
se1nelhante ao siste1na operacional por proporcionar u1na ca,nada entre seu programa e as co1n-
plexidades do resto do siste,na, executando serviços para seu aplicativo e si1nplificando o acesso
aos recursos das camadas inferiores. As classes básicas fornecem um vasto conjunto de recursos,
empacotando e detinindo essas tecnologias co1no protocolos da Internet, acesso a siste1nas de ar-
quivos, manipulação de XML e 1nais.
O verdadeiro poder dessa estrutura será explorado com mais detalhes no Dia 8, "Introdução ao
.NET Fra1nework". Por enquanto, só temos de entender que o .NET Fra1ne\.vork é e1n 1nuitos as-
pectos semelhante ao sistema operacional e que fornece seu próprio conjunto de APTs a fim de
facilitar aos programadores o aproveitrunento de seus recursos. A Figura 1.9 ilustra o relaciona-
mento do Framework conJ o seu código e com os serviços subjacentes do siste1na operacional.
Bem-Vi ndo ao Visual Basic .NET
FIGURA 1.9
Aplicativo do Usuário (incluindo seus programas!)
O .NET Fra1ne111ork
fornece outra ca,nada
de abstração sobre o .NET Framework
siste,na operacional,
exatamente como esse
.faz para o har<Íl11are Sistema Operacional
do co111putador.
Drivers de Dispositivos Drivers de Dispositivos
Componentes de Hardware
Serviços .NET
A platafonna .NET inclui certos conceitos que se estendem além dos detalhes de programação
para descrever como os sisten1as deve1n ser desenvolvidos e pode1n interagir. Um desses concei-
tos essenciais é a idéia de serviços da Web, recurso distribuído de uma 1naneira consistente de
modo que sua execução fique totalmente confinada em seu a1nbiente. Um exe1nplo desse tipo de
serviço pode ser uma folha de pagamentos, para a qual u1na empresa possui servidores e aplicati-
vos e1n sua própria organização que pode1n 1nanipulá-la. A e1npresa fo,nece esse serviço para
outras por 1neio de u,n serviço da Web (veja a Figura 1.1O). lsso é diferente de apenas disponibi-
lizar u1n site da Web; é u1na interface que outros aplicativos ou sites da Web poden1 acessar atra-
vés de código.
16 Dia 1
FIGURA 1.10
Uni se1,1iço da l Veb
1
per111ite que as
e,npresas .forneça,n
serviços coni base em
sof1111are pela Internet e Servidores do Aplicativos Clientes
que outros aplicativos Windows 2000 Executando
e/011 sites Serviços da Web
da Web os 11tilizen1.
........
=
•
-
Grande Quantidade Servidores Web
de Serviços Disponíveis
•o
Essa tecnologia pode ser usada de várias 1naneiras, 1nas o conceito de serviços da Web consiste
em que há certos serviços básicos ou fundatnentais de que 1nuitos aplicativos precisam, como
autenticação, organização de calendário, envio de tnensagens (correio eletrônico) e outros. Se
esses tipos de recursos foren1 serviços da Web, qualquer pessoa no n1undo poderá se beneficiar
deles para reduzir o ten1po de desenvolvimento de seu próprio sistetna. A Microsoft, como parti-
cipante da ini.c iativa .NET, está fornecendo alguns desses serviços para autenticação (con.hecido
como Microsoft Passpo1t, www . passport. com), envio de 1nensagens (hotrnail, www. hotma i 1 . com)
e outros.
Posteriormente, no Dia 21, "Criando Serviços Web co1n o Visual Basic .NET", forneceren1os
urna introdução apropriada aos serviços da Web e nos aprofundaremos em corno você pode
usá-los em seus aplicativos.
Dispositivos .NET
Atualmente, há uma grande variedade de sistemas que podern ser usados para se conseguir aces-
so à Internet, à rede de sua e1npresa ou a suas infonnações pessoais. Sendo eles PCs cornpletos,
tenninais da Internet corn base em TVs, simples clientes ou Personal Digital Assistants (PDAs);
todos são possíveis dispositivos utilizados pelo usuário para acessar um aplicativo .NET. Essa
Bem-Vindo ao Visual Basic .NET
instalação do WCU depende do sistema, porque apenas os itens que ainda não foran1 atualizados
o serão. Algumas das instalações possíveis são a do Windows 2000 Service Pack 2, do MDAC
2.7 (co1nponentes atualizados de acesso a dados) e do Internet Explorer 6.0. U1n item que será
instalado na maioria dos siste1nas é o próprio .NET Fran1ev.1ork, que não inclui o IDE do Visual
Studio .NET, mas fornece todas as classes e arquivos de suporte do Fran1ev,rork necessários à
execução dos aplicativos .NET. Dependendo de que co1nponentes foren1 precisos, o programa
de instalação pode ter de reinicializar seu computador u1na ou mais vezes. Quando essa instala-
ção estiver concluída, você retornará à primeira caixa de diálogo de instalaçã.o, co1no mostra a
Figura 1.11.
FIGURA 1.11
O processo de
instalação do Visual
Studio .NET é dividido
Wlndnw!j: Comonnent Updotc
ern três etapas. Re1nslbll Wln-dows ccmponents fo r Visu~I Studio..NET to
énsuTc t.h4t thc)' .:ire n()t C:Ol'l'Upléd, o r msto11 \'I n e i,1 vcni.on
ot the Windovvs Component Updo\e,
Dê um clique na etapa 2 para iniciar a próxi1na parte da instalaçã.o do Visual Studio .NET. Você
será solicitado a inserir a chave do produto e aceitar ou não o Contrato de Licença de Usuário Fi-
nal (EULA, End User License Agreement) antes que a instalação principal possa ser iniciada.
Depois que as inforrnações solicitadas forem fornecidas e o EULA aceito, surgirá uma tela corn
várias opções em que poderão ser selecionados os ele1nentos do Visual Studio .NET que você
deseja instalar (veja a Figura 1. 12).
A Figura 1. 12 foi baseada no Visual Studio .NET Beta 2 e algumas das opções podem se alterar,
mas no geral você deve ver a mesma lista. Se estiver planejando progra1nar grande parte no
Visual Basic .NET, sugiro a seleção das mesrnas opções que podemos ver na Figura 1.12. A pri-
meira escolha digna de nota foi a seleção do Visual Basic e do Visual C# na opção das lingua-
gens. O Visual C# não é necessário, ,nas veremos que ,nuitos exemplos de código estarão
disponíveis nessa linguagem, e é n1ais provável que façamos testes co1n a C# do que con1 a C++.
També1n é possível selecionar o Visual C++, rnas só é aconselhável fazê-lo se houver reahnen-
te a pretensão de usá-lo já que ele ocupa mais espaço e,n disco do que qualquer das outras Iin-
guagens.
Bem-Vindo ao Visual Basic .NET 19
..
• - X
FIGURA 1.12
:. '
Você pode examinar e
selecionar quais
co,nponentes do Visual ....... ~loolS
Studio ./liET deseja Sebl ltetn:L to iru,loll; f•IJJ, F' ,.;.\Aog#ll Fff'1~0:.1C1tOltVnuol SOJdot.'[ T\
instalar.
8 li!! b Vlsu,ol StodioJrEI (ntc, p,*1,c EdoUon
e !atblfi,\l@ij$tt:tN
!p.xeRc~ .........
e,i:t,........... O ff!,>tur,;: dNc,lpUon
O X -Ctt
'i' l<!.!J»IWI e, uoouaoe To.ois
1/S De>veloomtnt f11ffonmeM. ~d l-6nouaot woi.s. .d
Q 121itJ lott'rtMI~ Dc-vrlol)me:flt lcwik
9!t,c,ysul P,e,c»u t~ ~elSWJo..1-El
.:.J
fi!!~ V!JWI ~E,«,fffie YttttibCtt
e Bó•""'"""°lt+!I
til ít]ct) Erter?'se So!mles
Show/HHfe Qrfv~•· I
E!o"""'-"'""" o,~c:
m21~
l Eaí!)Ai~Cent«
0$1:Y\sWil !hdo/wly:fJt
lilitl"""'""'-.....
Sctve,- (M'OO(le1'U
Ttstl~\t,u,ilstvd,) ,.C
"'
. Vk'dSpJCt C,AQI)
.ft'e!!c).!(.e(4.lGS)
Rrniao: Qcfaul"
A seguir, certifique-se de que marcou todas as opções disponíveis e1n Enterprise Tools, Server
Con1ponents e Tools for Redistributing Apps. Não explicarei o que essas opções contêm, n1as
marcá-las assegurará que você tenba todos os recursos disponíveis en1 sua versão do Visual Stu-
dio (versões distintas do Visual Studio possue1n conjuntos diferentes de opções de recursos).
Para concluir, selecione MSDN e 1nantenha a configuração-padrão Run from source, que solici-
ta.acesso a seu CD, DVD ou local de instalação na rede, ou se tiver bastante espaço e1n disco, al-
tere para a instalação etn utn caminho específico (veja a Figura 1.13). Executar o MSDN do local
de instalação é 1nais lento do que tê-lo en1 sua 1náquina local, mas a decisão e1n geral é baseada
no espaço disponível e1n disco e1n vez de na velocidade.
FIGURA 1.13 :. :. 1 •
As bibliotecas lv/SD1V,
que contêm ,nuitos
docu,nentos e artigos
úteis, podendo os Sdttt ilcn~ lo in.1tól:
e fa\!)Vh.u.ol Shtdio.N.Y foterpri1< fdit.lon
exe,nplos ser instalados &-121±,t.nou"'OCI lool~ 1 1
(i!~......... O rcotu,e ~iption
locabnente para que se O X VtAJlJCH NS01'1 for Vbuol 5tudlo,NET
~ QfâVdUdC• Th,e Mile:rotoft Oov,IOPi:r u ,ti,r,o,~ (MSO.N) Libtor'f lf th11 u1c.M:11I
obtenha 111ais G S!ls!>tntcrpri,cOcvdoc,mcnt toob rr.'ct.r,nco fOf' dovelqper$, ..tth ffiOf"O th-,-. • ç1oi1by,o o! tctchncol
proi:;r am!"IW'JQ 1nforrn.l~on
$ f;!l~Servcr (OO~f'lt.S Aooessino m. lib,.,ry, "l'O\I c.in 'l'iew:
velocidade. e 52!,:blool, for RC'di,.triblAá,,g Afl9•
& l<l(:l~ -
Ga~vàut1Sh.d:10oo.,riertd,Jon
50<-
&J~Vd>.l:J~Docu'!~·-teU:11 Drive C:
~ (;}V8J1'C# o « ~ • UJecJ!Ciac~ (7.tc:iB)
9 @ ,V~!IIC+.- Docuud.!,U!r'! • M'H !ic)a(e (..; :3 G8)
(i!(i:,.,.,., '--'"
&l(i:!.""""" " " -
(i! • Md_..,...__
Ci1(l:.V~lll~ T@.an:ls;o.: Ooo.ncrt.tl:lon
O,.iYo D:
!ill.;!...,,..._ ............
20 Dia 1
Depois que você fizer todas as suas escolhas, dê um clique no link Install Now! na parte inferior
da caixa de diálogo para iniciar a instalação. Vários trechos de texto que descrevetn os recursos
da platafonna .NET serão exibidos enquanto a instalação progride, encerrando por fim com u1na
tela de tértnino (veja a Figura 1. 14). Se algo der errado durante a instalação, será exibido nessa
tela.
- C' X
FIGURA 1 .14
Se algo der errado
durante a instalação,
você será inforrnado do
11roble111a nesta tela. Setup is complete.
Thtr• wel'e no t rrofS dunno serup. To femove umo,ont'l files W t wtft c,u~td ~ntl(I ttt!JCI!, ,ou m•r w1sh to ,esurt
,out o,mpui.r. \'ÍJU-tl $'tl.,d10,li!T ~ uftl't bt run iK •nr1.tmt,
fO< lnform.,tion on ctiegnosino p,obi.m• SH tht ~ .
FOt" detti!ed Wo,mttion- on tht insulltlion s. . lht <11rrcw tog
Por fim, quando você tiver retornado à tela inicial da instalação, a terceira opção estará disponí-
vel. Dar um clique nessa opção, Service Releases, o conduzirá à outra caixa de diálogo (veja a
Figura 1.15), etn que poderão ser selecionadas as atuaUzações da instalação pela Web ou pelo
disco. Se houver conectividade co1n a Internet, reco1nendo escolher a pri1neira opção para asse-
gurar a obtenção da lista mais recente de atualizações.
FIGURA 1.15
O progra,na de
instalação do Visual
Studio .NET pode fazer \lts-uõl Studio.ffET 1 .O Setu? olloYJs you to 1ostoll Service Rcleoses thot updoto
your JJStem w•th thc lotcst vor11on of v,s.u-.11 Stvd10 .f<ET, Serv10l" Releote:.: olso
o doivnload e instalar 1nelucf!: updotes o{ requ,red Vl,ndow$ eomp<Wient~.
Agora o Visual Studio .NET está instalado e deve estar pronto para ser executado, portanto, você
pode passar para a próxi,na seção etn que co,neçará a escrever alguns códigos.
Novo TERMO
A expressão programa "Hei/o World!" ou "Olá Mundo! " descreve o exemplo de
u,n programa que não faz nada de útil, ou ,nais especificamente, nada mais útil do
que apenas exibir a n1ensagen1 solicitada.
Você vai corneçar co.m u1n programa que poderá executar da linha de co,nando e que retornará
u1n texto pequeno. Ern seguida, mostrarei co,no esse progra,na ilustra quase tudo que é preciso
saber para desenvolver um utilitário proveitoso que exiba infonnações sobre a versão de seu sis-
tema operacional (por exetnplo, no lançamento do Windo\.VS 2000 houve uma versão nº
5.00.2195). Isso pode ou não ser útil como utn utilitário de linha de comando, mas de1nonstra o
conceito básico de sua criação.
22 Dia 1
Escrevendo o Código
Já que você con1eçará e,n u,n editor de texto (como o Bloco de notas) e,n vez de no JDE, nada
será feito de ,nodo auto,nático, e o arquivo a princípio estará vazio. Isso significa que será preci-
so configurar a estrutura básica de seu programa antes de começar a escrever u1n código que seja
compilado corretatnente. Para iniciar, crie utn arquivo novo de texto e,n algun1 local de seu co,n-
putador; para os exemplos deste livro, crie u1n diretório e1n seu computador cha,nado
C: \ TYVB\Cl \ . Para gerar o novo arquivo de texto, dê um clique co1n o botão direito do mouse na
pasta apropriada e selecione Nev.1 (Novo) e Text Docu,nent (Documento de texto) (veja a Figura
1.16). lsso criará um arquivo de texto cotn extensão txt. Renomeie esse arquivo para que indi-
que seu conteúdo final alterando para Stepl. vb.
FIGURA 1.16 •
An~I~ •
O ,nenu de atalho do l-., Up IC<ltlS
Relre,t,
E.xplorer.fornecerá a
voce 11111a 1nane1ra
A •
Com o arquivo reno1neado e no diretório correto, você poderá dar prossegui,nento e começar a
configtirar seu código efetivo. Abra o arquivo no Bloco de notas dando um clique nele com o bo-
tão direito do n1ouse e selecionando Abrir con1. Isso abrirá un1a caixa de diálogo por meio da
qual será possível selecionar o Bloco de notas ou outro editor de texto (o Word Pad, por exem-
plo). Depois de ter selecionado um progrruna, dê u,n clique e1n OK, e o arquivo será aberto. Nã.o
deve haver nada nele neste 1non1ento; você terá de adicionar tudo que o fará funcionar.
ra básica de um programa do Visual Basic .NET; digite-o na janela de seu Bloco de notas e, em
seguida, salve-o co1no Stepl. vb.
Public Class Stepl
Shared Sub Main()
End Sub
End Class
Ao tentar salvar seu código como Stepl. vb, você pode acabar com alguns re-
ALERTA sultados estranhos. Por causa da tendência do Bloco de notas de criar arquivos
de texto e dependendo das configurações de seu sistema com relação às ex-
tensões, pode terminar com um arquivo chamado stepl. vb. txt em seu disco
rígido. Para evitar isso, certifique-se de ter desmarcado a opção Ocultar exten-
sões de tipos de arquivo conhecidos (guia Modo de exibição em Opções de
pasta no menu Ferramentas do Windows Explorer).
A seguir, inicie urn prompt de co,nandodo progran,a Visual Studio .NETTools, como na Figura 1.17.
FIGURA 1.17
Selecionar o pro,npt de
~
~
-,..
~-·-•ools
t~f«Wl'dows:M'
~ _ ,omc. roo1s
co,nando do Visual !llll
lJ -t,wo,t E-c,
Studio .NET é a ,nelhor
nianeira de trabalhar !E oso1,_""'
'""""'"
QJ; .....
@ .....oso1,E><d
li:S ""°'"''...__
~-.-....
co111 a plataforrna .NET
a partir de 111110 linha
de con,ando. ~-u-
~,.,.
ISl ....oso1,_
liil ....oso1,W..d
s-....
·--
til P1ow01flc<....,,... o
--lloye,
Õl.dOOlc.Exprt"Ss
~-
{j OoenOll<• - - ,f!!:
o -"'" ~ "'<r00ft SQl Sctw1
,
E essencial que você use essa opção para acessar a linha de comando, porque só através dela será
possível conseguir que o(s) caminho(s) correto(s) seja(rn) configurado(s) para executar ferra-
mentas .NET como o compilador do Visual Basic (vbc.exe). Se quiser e1npregar uma linl1a de
comando habitual, terá de adicionar a configuração do carninho apropriado (execute urna pes-
quisa ern vbc. exe para encontrar o diretório que precisa estar e,n seu ca1ninho) à sua rnáquina.
Isso apresentará um console de comando (corno rnostra a Figura 1.18). Desse local, navegue
para o diretório que contém seu arquivo Step J. vb. Agora você pode compilar seu progra1na,
24 Dia 1
criando um executável, 1nas adie um pouco mais adicionando uma etapa co1nplementar antes da
cotnpilação.
FIGURA 1.18
O 11so do co,npilador
de linha de co,nando é
Jeito por ,neio do
console (ou do prompt
do 1\!!S-DOS; co,110 é
ji·eqüente111ente
cha1nado).
No prompt de co1nando, digite vbc e pressione Enter. Você deve ver este resultado
seguido por utna grande quantidade de informações de ajuda sobre o uso do cotnpilador do Visu-
al Basic. Se isso funcionar, você terá confirmado vários itens:
• Você realmente te1n o Visual Basic .NET instalado.
• Você possui as pennissões apropriadas para executar o compilador.
• O sistema pôde encontrar o arquivo vbc . exe.
Ao testar primeiro o vbc auto1natican1ente, você poderá eliminá-lo co1no fonte de qualquer pro-
ble1na que encontrar ao tentar co1npilar um progra1na efetivo. Continuando esse raciocínio, ago-
ra pode1nos co1npilar seu progra1na salvo, Stepl. vb, inserindo um comando do vbc, Stepl. vb
/t: exe e, e1n seguida, pressionando Enter. Se tudo der certo, deve aparecer este resultado:
Isso significa que a co1npilação foi be1n-sucedida, e se você estivesse exa1ninando essa pasta
agora, por n1eio do Windows ou e1nitindo um comando DIR, veria que já há um novo arquivo
Stepl .exe. Processar esse executável (digitando Step I no prompt de co1nando e pressionando
Enter) não produzirá nenhun1 resultado visível, o que é de esperar porque o código de Stepl. vb,
na verdade, não te1n uma finalidade. O fato de que foi compilado e executado demonstra que ele
até aqui está correto.
Bem-Vi ndo ao Visua l Basic .NET
A chan1ada ao vbc pode aceitar u1na grande variedade de parâmetros opcionais (comandos com-
plementares adicionados à linha de cotnando, em geral separados por barras [/]), como você
pode ver na execução automática do vbc. No entanto, nesse caso, só foran1 usados dois. Com o
forneci1nento do non1e do arquivo-fonte, stepl. vb, foi infonnado ao vbc que arquivo compilar.
A segunda opção para / t (que significa 'destino' e ta1nbém pode ser digitado co1no /target)
pode ser un1 programa winexe, exe, uma biblioteca ou un1 módulo. Todas essas opções serão
abordadas depois, mas, por enquanto, só as duas pritueiras são particulannente relevantes; wi11e-
xe cria u1n aplicativo do Windows e exe, uma linha de co1nando ou aplicativo do console (que é
nosso objetivo). Por padrão, quando vbc for executado, ele usará /t :exe.
A instrução de co1npilação será quase a 1nes1na da etapa anterior, exceto por você especificar o
no1ne do novo arquivo-fonte, vbc Step2. vb /t: exe. A execução dessa instrução de co1npilação
produzirá un1 arquivo chamado Step2. exe, que poderá, em seguida, ser executado do prompt de
cotnando digitando-se Step2 e pressionando-se a tecla Enter. Se sua com pi lação funcionou e não
houve problemas no código, o resultado a seguir deve aparecer em resposta a seus comandos:
26 Dia 1
C: \TYVB \Cl>step2
É aqui que entrarão as informações sobre a versão do sistema operaci ona 1 !
A compilação do código vbc step3. vb /t: exe não será diferente do que foi feito nos dois exem-
plos anteriores. Essa compilação produzirá um progra1na executável co1n o non1e s tep3. exe.
Executar esse programaexe, digitando Step3 Enter najanelaabe1ta da linha de co1nando, gerará
o resultado a seguir:
C:\T V \Cl step3
Microsoft Windows NT 5.0.2195.0
Observe que o resultado indica un1 co1nputador Windows 2000 (NT 5.0); outros resultados serão
gerados para co1nputadores diferentes. Agora você te1n um pequeno programa exe que retornará
a versão do sistema operacional, decerto ele será útil pelo menos para administradores de rede. O
aplicativo é cha1nado de s tep3. exe, mas seu nome pode ser facilmente alterado para algo mais
próxi1no de sua finalidade real.
executáveis com o mesmo no1ne do arquivo-fonte, mas há muitas opções co1nplementares dis-
poníveis co1no parte desse co1nando. Aqui estão alguns parâ1netros de linha de comando que po-
dem ser mais úteis quando co1neçannos a fazer testes com o Visual Basic .NET:
• /target:<winexe, exe, library,ou module>(podesercha1nadoco1no/t)especificaque
tipo de resultado deve ser criado pelo co1npilador. A opção wi nexe cria um aplicativo do
Windows. A opção exe, usada em nossos exemplos, gera um aplicativo do console ou de
linha de comando e é o padrão se nenhum. parâ1netro /t for e1npregado. As duas outras
opções, 1i brary e module, são util izadas na criação de resultados que não possa1n ser usa-
das direta1nente, 1nas que esteja1n destinadas a fazer parte de outro aplicativo. Você
aprenderá 1nais sobre todos esses tipos de saída nos dias posteriores.
• /out: <nomedoarqui vo> é usado para especificar o nome do arquivo criado . .E1n seus
exen1plos, você o 01n itiu, fazendo cotn que vbc empregasse o nome de seu arquivo-fonte
(Stepl . vb) para gerar o arquivo de saída (Stepl. exe, por exemplo).
• /he l p (ou/?) é equivalente a executar o vbc sem opções: em qualquer das duas formas, o
resultado será uma listage1n detalhada de todos os parâtnetros disponíveis.
• /verbose faz o coinpilador produzir resultados 1nais detalhados durante a compilação e
pode ajudar a solucionar problemas.
• /reference:<nomedoarquivo> (abreviando-se te1nos /r : <nomedoarquivo>) é usado para
inforrnar ao cornpilador que seu código requer alguns arquivos cornple1nentares alé1n do
que está incluído como padrão. Por exe1nplo, se você quisesse trabalhar com as partes de
Sys tem . Web do .NET Fran1ework, precisaria adicionar un1a linha lmports System. Web no
início de seu código e, em seguida, especificar /r: syst em. web. dl 1 quando o con1pilasse.
Resumo
Nesta lição abordamos u1n pouco do histórico da programação, o Visual Basic e a plataforma
.NET antes de criar um programa pequeno. Agora, você está pronto para passar ao aprendizado
da Jinguagein propriamente dita e escrever progran1as 1nais co1npJexos. O Visual Basic é uma
das linguagens de progra1nação 1nais populares do mundo, ejá cobri1nos u1n dia na direção que
conduz ao seu domínio.
P&R
P Por que o Visual Basic .NET é tão diferente das versões anteriores do Visual Basic?
R O Visual Basic tem evoluído co1n o ternpo. Cada versão te1n sido rnuito semelhante à an-
terior, mas, en1 certos pontos, uma revisão 1naior co1no a da plataforma .NET era neces-
sária para assegurar que a linguagem acompanhasse outras alterações da indústria, co1no
a Internet e a computação distribuída.
P Ouvi falar sobre outra linguagem .NET, a C#. Devo aprendê-la em vez do Visual
Basic .Net ou estudar as duas?
28 Dia 1
R AC# é u1na ótima linguagem nova, uma 1naneira 1nais simples e fácil de usar a C++, mas
não, você não tem de aprendê-la. Todas as linguagens .NET são iguais em termos de suas
capacidades; se você
,
puder criar um certo tipo de aplicativo em C#, poderá fazê-lo no Vi-
suai Basic .NET. E possível que as pessoas achem que muitos exe1nplos da M.icrosoft
aparecerão em C#, apenas porque é uma linguagem que tanto os progra1nadores do Visu-
al Basic quanto da C++ achan1 relativa1nente fácil de ler.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e con1eçar a pensar em como colocar seu conheci1nento em prática. As respostas do teste estão
.no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Qual produto da Microsoft foi o predecessor do Visual Basic?
2. Por que todas as linguagens .NET (Visual Basic, C# e outras) co1nparti lha1n certos recur-
sos co1nuns (o .NET Fra1nework, métodos de criação e uso de objetos e 1nais)?
3. Co1no se denomina o processo de converter o cód igo-fonte (seus programas) e1n código
nativo de 1náquina (co1no um arquivo exe)?
4. Considere o código a seguir:
Public Class MyClass
Shared Sub Main()
End Sub
End Cl ass
Se esse código fosse salvo e,n um arquivo cha,nado MySourceCode . vb e, em seguida, fosse exe-
cutado o comando vbc /t: exe MySourceCode. vb, que arquivo seria criado?
Exercícios
1. Nos exe,nplos desta lição, você não especificou un1 no1ne para o arquivo de resultado
quando compilou, o que fez co1n que o compilador usasse o no1ne do arquivo-fonte co1no
padrão. Reco1npi le s tep3. vb, definindo um nome para o arquivo de resultado igual a
WhatOS. exe.
2. Para obter infonnações sobre a versão, você e1npregou o objeto System. Envi ronment,
que possui várias outras propriedades úteis. Use a documentação de ajuda que está insta-
lada no Visual Basic (veja a seção "Preparando-se para Codificar" ) para saber o que
1nais está disponível e, em seguida, crie outro programa para exibir u1na ou mais dessas
propriedades con1plementares.
SEMANA 1
DIA
IDE. Mesmo as tarefas si1nples de edição e compilação de seu código serão muito simplificadas
pelo IDE do Visual Studio que fornece ,nuitas possibilidades complementares que apenas não
existiriam sem ele.
Iniciando
Antes que você possa usar o IDE do Visual Studio, ele deve ser instalado en1 sua 1náquina. O
processo usado para fazer isso fo i detalhado na lição de onte,n, portanto, leia esta seção se preci-
sar concluir a instai.ação antes de continuar.
Configurações do Perfil
O primeiro ite1n que você verá quando injciar o Visual Studio .NET será uma interface parecida
co,n u1na página da Web (que foi chamada de Visual Studio Home Page) solicitando a confinna-
ção das configurações de seu perfil. O conceito de perfi l é novo nesta versão do Visual Studio,
tuna variação da idéia de preferências do usuário que provê a capacidade de configurar n1uitas
opções diferentes em um único perfil. As opções básicas fornecidas foram projetadas para facili-
tar sua transição para este ambiente dependendo de sua experiência particular. Essa disponibili-
dade de padrões me levou a escolher rapidamente as configurações mostradas na Figura 2.1. No
entanto, depois de algu1nas horas de uso, as alterei para algo um pouco diferente de qualquer dos
perfis-padrão. É provável que você faça o mesmo.
Por enquanto, selecione o perfil Visual Basic Developer, e depois você poderá voltar à caixa de
diálogo para alterar essas configurações se desejar. Dê um clique em Get Started para sair da pá-
gina de configurações de perfil. O que apareceu agora é considerada a área principal de trabalho
do IDE do Visual Studio, uma localização geral que contém conteúdo de vários tipos, como o có-
digo editado ou as páginas da Web projetadas. Ela tambéin inclui u1n navegador da Web interno,
que é aberto por padrão; ele é usado para 1nostrar u1na interface para o Visual Studio co1n jeito de
Web.
Na I-Iome Page (veja a Figura 2.2), você encontrará várias opções úteis. A prin1eira, Get Started,
é a página que será ,nostrada sempre que o Visual Studio for aberto. Projetada como un1a prepa-
ração inicial para seu trabal.ho, essa página fornece tanto u1na lista dos projetos recentemente
abertos quanto u1n link para a criação de um novo, permitindo que se dê prosseguin1ento co1n um
sin1ples clique em algum local dela. Por hora, selecionare1nos uma das opções de navegação que
se encontra1n no lado esquerdo da página
T rabalhando com o Visual Basic .NET 31
FIGURA 2 .1
·•. Mluosoít Dl!Velo,pment E:nviNJnmenl ( deslc)n] - .,tart Paqe
· liõ! ii' ~ ·:
. , .. t ' J!, .
personalizado para
tornar ,nais fácil a . .... r
desenvolvin1ento,
eoH,r -----..... ~·..iel C e,elo"e r
incluindo a versão
tt•Jbo.wd Sehem•: (v,su~I 8.os•c6 .:.)
anterior do Visual
l!l•ndc>w u,out: lvisu,,1 Stucho Ocfoult ::J
Basic. tielP r.tter-: !{no tltl.e r) ::::::J
..:1
FIGURA 2.2
/1 página inicial
fornecida pelo Visual
''· Mlcr°"oll Devdopment rnvmmment [d~lgn)- Stm-t Poge
!jlo [dt l')cw !col! l!ó'<low !!<O
ISJ · "'· iã: liil OI ~ 6 1,, : r.. ç-.r;.J •
1 1 -- • W
Studio disponibiliza
urna visualização ..•..
. ..
..
~
..:1
• Um link de retomo à página de seleção de perfis que é apresentada por padrão na pri1neira
execução do IDE (My Profile)
Todos esses recursos estão disponíveis para o desenvolvedor do Visual Studio, o que torna essa
página inicial un1 bo1n ponto de partida para muitas pessoas. No entanto, se você quiser adicio-
nar algo a essas opções ou substituir por completo o conjunto de páginas, a fonte integral da pá-
gina padrão está disponível em \Program Files \Microsoft Visual Studi o. NET\HTML. Porém, aí
vai un1 aviso - as páginas-padrão não são simples, e seria fácil danificá-las se1n que possan1 ser
reparadas. Faça uma cópia do diretório como backup antes de começar a personalizar!
pode,11 com fi·eqiiência An ppdate for Visuol Stud,o,NET ,S .svad111blo. Cltck ho;e·to do,..,nJood.
da Web
msdn.Microsoft. com,
Oot, Op"rotlOf'ls on 1-liora,C,,.,uJ Row O.ot•
que é realçado &u ld• 0 1dnW.'"'<1 A l11e~bOru: 'l'<fh ~j f f
Encaixando/ Desencaixando
No perfi l Visual Basic Developer, tanto o Solution Explorer quanto Prope1ties ficam alinhados
no lado direito da tela do Visual Studio, e Toolbox fica no lado esquerdo (veja a Figura 2.4). O
posiciona,nento de u1najanela rente à outra área é descrito con10 encaixar essa janela. Quando
está encaixada, a janela é bloqueada por essa área em u,n ou dois lados (dois lados, se estiver en-
caixada em um canto). Todas as janelas de ferramentas do Visual Studio .NET pode1n ser encai-
xadas e não há lirnite para as margens nas quais é possível alinhá-las.
·~. Wridowt.Appl1c ól:wn8 - Milt:""'on Vh.u.aJ Ba-ucMT {dewgn) - fonnl .vb l!lliJ EJ
2.4
FIGURA @, [dt l(lo• &oi<« ~ ~ tod, ~ tt,lp
. . '
Quando o Visual Studio l:.il · UJ ·câ:lilO
'
Ji~e.1.-..: . :. ~· r.+I , ·....., . ~
. Qlli'*
í lfi \. ~ At I• ! '1-; :: ,, U u' J'. ,
':
.NET é configurado -:---:--:-"l!""~~-
....,,,.....
~*·~~-='=a;s=~~
[SCWlnE,g>io<e<· ~ · · · ~ X
~ . locb:tx
~-
co111 o pe1fil de ~dRr,q f l • I f'\:r,om'1 (Windowi.Ac,,plic<1U.;J lll\ (Ocdo,0Uoni.)
,i:-1=======;:::!=! r- E Pub 11c- e 1us f'ol"tl>t
3 .íB :e tfl fã> ;::-
·- S o l J t \ : l n ~ ~(1 tt
desenvolvedor do i lit' Ptt(o, •• • ÍI lnhertt!I SV8te?D, V1ndiOOS . f'Or1113, f 0'0:11 .!. 6 ~ WindowsApplic•UonB
Visual Basic, ele : ~ Reo1on .. lhndov.s r orm Des1~r qenecat.ed
• 8tl A.tfffft'Ut
~ .........,,,,......
fiJ Fermt.~
organiza suas janelas
PUb U e Sw> Nevo
de .forrna aproxi111ada Y.ve~c .Nev( )
à do IDE do Visual •
Basic 6.0.
'Tbu c;oll u rcq\lU:4:d by the 1hM , ~· ~ - - -
I nitiali:eOom~onent () .
..
'Add ouy 1n1t1aJt:etlon atter thc • X
•
tnd Sl&b
Para rnover uma janela encaixada para outra área da tela, deve-se dar u1n clique e rnanter pressio-
nado o botão do ,nouse na barra de título da janela de ferramentas e, e,n seguida, arrastá-la para a
34 Dia 2
nova posição. Enquanto ela estiver sendo arrastada, um contorno aparecerá na tela para 1nostrar
onde a janela seria posicionada se você soltasse o botão do mo use. Para encaixar a janela e1n ou-
tro lado do IDE, apenas arraste-a para u1na borda deJe, 1nantendo o botão do n1ouse pressionado
e soltando-o quando o contorno da janela 1nostrar o resultado desejado. No trajeto, pode-se ter a
impressão de que o contorno não foi encaixado em nenhu1na parte do IDE (veja a Figura 2.5).
·~. WW1dow,,,App.!1c õttonO · Muro,ofl V11ou6f O,n1,1tJl<í 1 ( dM.lor,) · \tllft Png" f!IQ E3
FIGURA 2.5 ,.a. <i!t l"" f)'o)ect ~ QebJ9 Iocls Jll.hdow t!<I>
- ~' •
O contorno de zuna I~ · W • e.;;: liJ Gil I x. ~ P..l •0 ; e,· ~ · 14] ,'- · r,;'
. ' .
1.. .. o @! ~ . 12 ru ti';\
'
1-·"'·'""
· 1Q r.1i' *
.. t, i.&: .
':
janela que está sendo
arrastada se altera
~
Se você deixasse a janela de ferramentas nesse ponto, ela ficaria' desencaixada', o que também é
conhecido como janelaflutuante (veja a figura 2.6), posição na qual ela não estaria 1uais fixada a
nenhuma borda do IDE.
• tl X
FIGURA 2.6 t<o ,~ l(1e,< l;rOJect ~ o,obu9 Oi'> I°"' 'iUvltiw ~
Se você tiver bastante l~ · lli . e.;;: "~ 1 j, ~ e-1,, ~ ~·. J;:. C.J •:- rli,
1 . l ,i "'I ,-; 41) "' 1... tl ~L &.l ,,,.. i;o: !':' ~ -~ }: ê: o: 1!§1 ~ 'l'4o 'ii .
espaço na tela, poderá Forml.vb [De1i9n]
deixar suas janelas D ' D • D
_!'.rorm1 Solutlon hcplort:r - Wlndow\.A llrnllonO ti
desencaixadas. .... . ... .. ... .. .. '' ..
....
.
..
,.., _
~ F C IUM
A ......
·~~~==·=--~-,---;:::=============~
((!) ,.._,
-~-~•
wtb 5fS XSK b t\»fNed COO:
ô .......... S<+.tm El!L'bã
,!,J M«> ~
)'W!f l},sç «:d )lWI e• rxemu
~ Tex.18ox ~ . í:'19!:m+ MdfJN
:ili- A$Sttâ!tl Wtb S::o+:r:1 lo Mm,a,:,J Co6:
lHQ;:1 tht Pclun:r.
~ Chod8ox
1.i~......,..
~ ..
9'bo!!dlU)O
_J 'ft2rl sm· $rds Iro"=,
'!1:Bf:;l 2'Pg $:xrP:1
li®t!éft:·ti~ Toobox I 1 • ~
1
Trabalhando com o Visual Basic .NET 35
Quando as janelas estivere1n desencaixadas, você poderá reencaixá-las seguindo o mesmo pro-
cedimento que acabou de usar.
Pode ser complicado levar uma janela encaixada de volta ao local exato do
NOTA qual a moveu, portanto, aí vai uma pequena dica: em vez de arrastar a janela
para encaixar e desencaixá-la, dê u m clique duplo na barra de título. Isso de-
sencaixará a janela de ferramentas que estiver encaixada ou levará uma janela
flutuante de volta a seu local original.
Ocultação
Encaixadas ou não, as janelas ainda ocupa1n espaço e,n sua tela, ,nas é possível ocultar ou fechar
janelas específicas que você não queira que permaneçam visíveis. Toda janela de ferra1nentas
possui um botão X (veja a Figura 2.7), sen1elhante ao ícone comum de fechan1ento de outras ja-
nelas. Dar um cJique nesse botão fechará a janela de ferran1entas, removendo-a da tela.
Clo<e
' .
. necessar,as "
e
• S O W l n -00- (1 ,.0Je<l)
que se;a,n JD~lboic 9 :lil
1
VMdo,,sApp11c•Uon8
@) ~ ferences
Dota
novan1enre. _..,,,,,
~
t!) AsseiillyWo8b
J~ tillUIM
[ lt -
A l4b<I
A""..-
,;,l ......
i;;i , - .
it""*"'<nu
p Che68o>< •
(li) 11$
Qooo«d Rho 1~1 W@ Jro'.i;N"" ~F:W"}Ccd::
G<rc,4' J ~Eml.mr
Ufk!l Sõ\JIM fYml e,
Yw:I bk ::iM 'lorJ e, Prr>::<!t
......,..,., eton,. ,ed FJ!,s
AcCM8:n Wtb scrwa ln M!QIMsf Cod!
l/!Ql tt,o lldllow
!= = = = = = = = = = = = = 0• 5an'liples
Para trazer a janela de volta, você precisará usar uma opção do menu. Por exemplo, se der u1n cli-
que no botão X do Solution Explorer, esse desaparecerá da tela. Para trazê-lo de volta, é preciso
selecionar Solution Explorer no n1enu View (ou pressionar Ct rl +R). Não é tão difícil, principal-
1nente para u1najanela que não é utilizada com freqüência, n1as e aquelas que pode1n não estar
sendo usadas agora, porém, e,n geral, o são? O Visual Studio .NET fornece tuna ,naneira de re-
cuperar o espaço da tela utilizado por essas janelas, tornando-as ainda assim fácil de acessar - o
recurso Auto-Hide. Toda janela de ferra1nentas encaixada possui u1n ícone ern sua barra de título
que se parece com u1n pequeno pino (veja a Figura 2.8).
36 Dia 2
·•. WindowsApphcilÜOnU - '1k.roson YlMJal Bask:. <\f:. f { desql) - f o,m l .vb (Ocstgn] "g EJ
FIGURA 2 .8 fio [dt ~ ~...
1
~ - ~
• •.
!oob ~ •!;oi>
Todas as janelas de li&l · ttl · ~ ld? l 1>~ e. ·':"·· .JJ ·q_t , o.ouo • ~.
.f'erra,nentas possue,n l l'.t . 1 ,!, •:1 ;, <li '""' 1~ ti· iO ~ I * ~ ~ ~ I ~: ~; CI: ~ f"1 Ili ' .
u,n pequeno pino que
per111ite que seja,n
D tJ O
.. . .' .' .' .' .' ' . ..• . .• li:180lC1 , __.,,._(l p,oJ,ct)
<
. ........ .. 8· j!
s
w--.............
~..,........ í
confinadas e112 urna !!) .. _,"º·"'
posição onde .fican1 foollH»C ti Eãi#A61
abertas.
,,_
"""
O)rrpontru
WR:lows Forms
• •
1. ,!
~-
A ld>d
âlrilU
'°"""wnm:Ei ~ 1oeciox l
t:HíP.1
s+Jk'o Em«u
wm SoiJtbn Qxbcr
YlP>" ~m m 'm!nl ct t:wxt,
~ . OOJNJJ+ ;)Q!lffN.
fWflt9 Wdt S,,W:, kJ C:J:#»:l':d Cô
Esse é um botão de dois estados que controla se a janela deve ou não ser auto1natica1nente oculta
quando não estiver em uso. Por padrão, a janela do Server Explorer é configurada para e,npregar
esse recurso e, portanto, aparece apenas co,no u,na guia ou botão cinza no lado esquerdo do IDE.
Passar o ponteiro do mouse por cima dessa guia fará com que o Server .Explorer se torne visível
por co,npleto, deslizando para a tela. Qualquer janela de ferran1entas con1 a opção Auto-Hide
ativada será minimizada automaticamente em u1na guia na lateral do IDE onde estiver encaixa-
da. A janela oculta será trazida à tela sempre que o usuário passar o ,nouse sobre essa guia, o que
significa que só ocupará espaço quando for necessária. Esse recurso, junto da opção do ,nenu
Window, Auto J-lide Ali, é utilizado por 1nitn para configurar o Visual Studio co1n a aparência
que desejo (veja a Figura 2.9). Isso deixa o máxi,no de espaço para a janela principal, onde o có-
digo aparecerá quando você tiver aberto u,n trabalho. U1na interface extre,na como essa pode ser
desnecessária quando se trabalha em um ,nonitor grande, ,nas, cotno usuário de laptop, a acho
perfeita.
Guias
Outro recurso para econo1n izar espaço: as janelas de ferramentas múltiplas podem ser agrupadas
e,n uma única área da tela onde auto1natica1nente se transfonnarão em guias individuais de uma
janela com várias guias (veja a Figura 2. l O). No perfil Visual Basic Developer, diversas janelas
já fora,n agrupadas (o Solution Explorer compartilha o espaço con1 a janela Class View, e Pro-
perties e Dynarnic Hel.p foram configuradas de 1naneira semelhante), tnas qualquer co1nbinação
de janelas de ferramentas é possível.
Trabalhando com o Visual Basic .NET 37
FIGURA 2 .9
Você pode usar
Auto-ffide para
111axin1izar sua área
,i o.t• . : -
central de trabalho, 6- !ili !li
""'" IC'sf R:i:S!q')!t
!!! d •kma)"ty
que é onde editará rnsContrctttrt F\Bl2rn
......... -~-"....
-2 Fotml ,'ti>
.. ~--__!'!!.~-~ ..·:....--rr::"7
- ~ ·- ---'L~
. ..
.. ...
:: :: ~:··:: : :: ~::::::::::······· IB
...
WlndowsAl)plkatlooS
1~ li' ·~ .1 !'.! <11 lol I·•· ~D i.+.i 1.,. !<': '!-"~ l'. t: ·~: l>:
<= t!O~
rll,
~ Ili 'li "- .
que você tenha rnuitas PIOfJ$1* 9 x1 ". Fonnl ,vb [Design) Foimt.-.b 1 1 I' X
janelas diferentes de ro«nl $Yltem,wn:bws,Founs.krm ' D
férra,nentas abertas . . . . ..
' '
• ••••••••• :::::: •• ::: l.J;!Boocl
enquanto ocu1~an1 o
r11es1110 espaço precioso ...
Ac<f'OdMton
da tela.
,..,..........
C,cn:el'Uton
._
loc.attdtk
W~Ciilyle
Cortio&>x
Hctb,ttcn
IJM$C~dr,e,
.....,
'""
'""'
~ (1..,)
'""' JJ::::: ..
111: : : : : : : : j 11 : : : :
. . . .....
........
...
. .' . . ...............
.. . . . . . .. . ..
'
:n~i: :1;
.
.... .... .
--
Ms:d,i:f8ox
'""
("""") - ·· -· . ~· · ··· ··--· ···· - · · · - -··
'""
"......
Para adicionar u1na janela a utn grupo de guias ou criar utna janela co1n guias, arraste u,najanela
de ferra1nentas (dando u1n clique em seu título e arrastando) para outra, soltando o botão do
1nouse quando o contorno se alterar para 1nostrar u1na janela com guias, exibindo a extensão de
u.r.na pequena guia na pa11e inferior dele. Consegue-se a remoção de u1najaoela de 1naneira pare-
cida. Apenas arraste u1na das guias para fora do grupo até que o contorno perca o fonnato de guia
e, em seguida, arraste-a para o novo local desejado e solte.
138 Dia 2
Redimensionando
Qualquer janela de ferramentas pode ser redimensionada, mas, se estiver encaixada, só o poderá
ser ao longo de suas bordas desencaixadas. Para redimensionar umajanela, mova o ponteiro do
1nouse sobre a n1argem dela, até que ele se transfor1ne en1 utn indicador de reditnensionamento,
mostrando a direção permitida para a alteração. Quando o ponteiro indicar que você está co1n o
1nouse na posição certa, dê um clique e arraste para estender ou retrair a borda da janela até o ta-
tnanho desejado. Observe que o reditnensionamento entre duas janelas encaixadas estará na ver-
dade alterando ambas porque urna deve encolher para pennitir que a outra se expanda.
Toolbox
U1na das janelas mais usadas, a Toolbox (caixa de ferran,entas) fornece u1na listage1n de vários
trechos de texto, elementos de interface com o usuário e outros itens que são disponibil izados
para serem adicionados aos projetos. A seleção de itens 1nostrados dependerá do que estiver sen-
do editado no rnornento na janela principal do IDE. Por exetnplo, se nada ou apenas o navegador
da Web for selecionado na janela principal, então, o único item disponível na Toolbox será o íco-
ne Pointer. Esse ícone, que está sempre presente, é fornecido como u1na rnaneira de desmarcar
qualquer outro item da janela Toolbox. Se você estiver editando algo, corno o código HTML da
página inicial do Visual Studio (dê urn clique com o botão direito do mouse no navegador da
Web e selecione Exibir código fonte), guias cotnplementares serão adicionadas à janela Tool-
box. No caso da edição do código, uma guia HTML foi adicionada (veja a Figura 2.11) contendo
vários itens que representa1n diferentes tags HTML.
e/e111entos de Ui típicos
da linguage111 _fica111 .' <html>
disponíveis na Toolbox. ..J IWOn <hf'ad.>
l.J R.t:Mt 81.tton <, í t le-></t. u ; l e>
!.J ~ & . tton <meto. c.!lltl!:• "'GENC:R.\TOR" cont.enr..• "n
<lhead.>
r.i , ... ""4
(li Te«t Aleo
Á
"'(
- - _J <body>
</body)
r;n Hefie)J </ html>
p Ch«t.bo~
·-
r. Rado fUton
º
E]_.._ .....
T,t;c
el Crid..._......
gJ ,,,,..,.
l!li lklbccc
lill ""'°"""'
........, ~·.__~~~~~~~~-''·~
1=
9fbo!'==d~.....
~ Jodbc;«
•
La Desl,i, 1a Hlfl\.
--- ~
Trabalhando com o Visual Basic .NET 39
Qualquer ite1n, con1 exceção do especial, Pointer, pode ser usado de uma das duas 1naneiras:
• Dê u1n clique e arraste o iten1 para a janela de edição (soltando quando você tiver movido
o mouse para o local desejado).
• Dê u,n clique duplo no ite,n, o que fará co,n que seja adicionado à janela de edição no
ponto de inserção selecionado (qualquer que seja o local onde o cursor estiver posiciona-
do na janela de edição quando houver o clique duplo sobre ele).
Esses dois métodos de uso dos itens estão disponíveis para qualquer tipo de documento que esti-
ver sendo editado, mas, se uma interface gráfica com o usuário (algu1n documento visual se,n
texto co1no um forn1ulário Windows) for o docu,nento atual, então, as duas opções anteriores se
co,nportarão de maneira um pouco diferente. Utna terceira opção também está disponível:
• Dar um cl ique e arrastar o ite,n para o docu,nento visual funciona da n1es1na forma que
para um texto, mas, em vez de aparecer um ponto de inserção do cursor, será mostrado um
contorno real do item quando você 1nover o ,nouse sobre o docu1nento.
• Dar um clique duplo também funciona, mas, já que um documento visual nen1 se,npre
possui u,n ponto de inserção selecionado naquele momento, o novo ite,n e,n geral é ape-
nas criado no centro do documento.
• Uma terceira opção, que não está disponível para edição de texto, é selecionar o item dando
u,n clique nele, realçá~lo na Toolbox e, e,n seguida, dar um clique e arrastá-lo para o docu-
1nento visual. lsso esboçará o ta1nanho e o local no qual você deseja que haja a inserção no
docutnento, e o novo item será criado de acordo co,n o definido (veja a Figura 2.12).
. -=.,,,"-...- - - - - - - - - - 1 - - !.l
D '· D
~-'
r.i I....S..
p O>e<ISOx
r.~on
~- .. D
. .::::::. .
.... .... ...::::: .
. .. .. .. .. .. ... .... . .. .
.......... . '
.......... . . ..... ·· ·· ·
'
...i.« .: :: . :.
' ........... ...
' '
ir -
i;;:, .......... ..........
......
'
!E; """""
ai--.. -·~ .
' '
ttJ CotnbOGOJC
::i IJst~
CJeo.>:d...,., _...,t ::.J
. . .fi. .;j~
40 Dia 2
Apresentarei de modo detalhado um exemplo de uso da Toolbox com um docu1nento visual pos-
teriorn1ente nesta lição, quando você criar um formulário Windows como parte de seu primeiro
aplicativo e1npregando o lDE. A Toolbox pode conter qualquer trecho arbitrário de texto, além
de fornecer alguns para a edição de HTML, desenvolvi1nento de forn1ulários e muitos outros ti-
pos de trabalho, o que significa ser possível gerar seus próprios itens que represente1n seções do
texto. Esse recurso é uma maneira útil de selecionar um frag1nento de texto (que pode ser, e pro-
vaveln1ente será, código) que se espera utilizar co1n freqüência e torná-lo facihnente disponível.
Para conseguir esse excelente feito de produtividade, selecione o texto desejado na janela de edi-
ção (o que pode incluir primeiro a digitação do texto) e arraste essa opção para a janela da Tool-
box. Tndependente,nente da guia que você arrastar, o texto dela detenninará onde seu ite,n
aparecerá. Como podemos ver na Figura 2.13, o item apresentará um nome inoportuno e bastan-
te se1n sentido, como HTML Fragment, ,nas é possível dar u1n clique nele co1n o botão direito do
mouse e selecionar Rena1ne (ten1 para fornecer uma descrição apropriada. Voilà! Agora temos
u1n novo ite1n personalizado na Toolbox, que pode ser usado sempre que se desejar apenas arras-
tando-o para a janela de edição.
J
toot,ox fo,ml.vb* ,
trechos de texto pode111 c:Job!!o<d"!!l
~lft- Poriter
--
_J-:1 l.·J
f: ronnl (Wlnelow,Appli<ot.:) la•8"tto,,I_Clid< .:)
ser inseridos na ,...,.__ _ _ _ _ _ _ _ _ _ _ _ _
M.t: , !lutton.L. Si:c • 1.:e1o1 System. l>r6~
Ne , Bu'ttonl , Te.blnd ex O i
cc
# l!nd Rcoton
t nd 5Ub
_)
(d I o, 1 DIS
Trabalhando com o Visual Basic .NET 41
A Toolbox, assi1n como o resto do IDE, possui n1uitas opções co1nplementares que não aborda-
rei, co1no a capacidade de adicionar 1nais guias (guias são aquelas seções deslizantes da janela
Toobox), renon1eá-las e alterar a visualização da lista de ícones de qualquer seção. Esses outros
recursos podem ser acessados por meio do 1nenu suspenso da Toolbox (o menu que é acessado
com u1n clique no botão direito do mouse) e també1n estão docu1nentados nos arquivos de ajuda
do IDE.
Command/lmmediate
Você já se surpreendeu executando o console de co1nando (ou a janela do DOS, como alguns
gosta1n de cha1ná-lo) para efetuar un1a tarefa? Para muitas pessoas, algu1nas tarefas só pode,n
ser processadas 1nais rapidamente com o uso do teclado e de uma interface de linha de comando
em vez de se empregar o mouse para navegar pelos ícones, 1nenus e caixas de diálogo. Já que a
produtividade do progra1nador é o objetivo final, qualquer rnétodo que puder ser n1ais veloz vale
a tentativa. O Visual Studio .NET possui uma janela que fornece duas fonnas com base no con-
sole de interagir com o IDE. Uma fez parte do Visual Basic por algum tempo, a janela Immediate
e a outra esteve presente no Fox Pro por muitos anos e acabou adicionada ao Visual Studio, aja-
nela Co1nn1and.
En1 tennos de utilização, elas são reahnente duas janelas, ,nas fora,n associadas para tornar a
operação u1n pouco 1nais confusa. Você pode considerá-las como duas janelas (sei que vou fazer
isso), depois que tiver aprendido dois itens essenciais: como alternar o modo da janela (de Com-
mand para ltnmediate e vice-versa) e como informar e1n que 1nodo a janela está atualmente. Pri-
meiro, o prioritário-tornemos essa janela visível; selecione View, Other Windo,..vs e Com1nand
Window no menu, exibindo assirn essa nova janela.
Essa janela, agora co1n o non1e de Con1mand Windo,.v, deve conter apenas u1na linha e1n branco
seguida de u1n prompt > (quase exatarnente como o console de comando ou o prompt do DOS
com o qual está acostumado). Ela já está no modo Co1nmand, e você pode inserir o comando que
quiser e executá-lo pressionando Return. Para passar essa janela para o ,nodo Immediate, apenas
digite o co1nando immed (e pressione Return ou Enter) no proinpt fornecido. Agora, a janela terá
passado para o modo hn1nediate, distinto do ,nodo anterior pelo acrésci,no de - Immedi ate ern
sua barra de título e pela remoção do prompt > de seu texto efetivo. Para retornar ao modo Com-
mand, digite cmd e pressione Return (sin1, você mesmo precisa incluir o pro1npt >). Agora que
sabemos como alternar rapidamente entre esses dois modos, pode1nos examinar a final idade e o
uso de cada urn.
O 1nodo Co1nn1and dessa janela pern1ite que você controle o IDE por meio de comandos digita-
dos - por exemplo, digitando Fi 1e. Ne Pro ect para realizar a mesma tarefa que seria executada
se selecionasse os itens File, New e Project no 1nenu. Uma interface do console em geral pode
ser 1nais veloz do que uma interface gráfica corno usuário. Essa duplicação de funcionalidade é
fornec ida co1no un1a 1naneira potencial de acelerar seu trabalho dentro do IDE. U1na grande
quantidade de comandos está disponível , n1as o modo mais rápido de encontrar muitos deles é
142 Dia 2
percorrer os nomes dos ,nenus visíveis. Depois que tiver digitado um non1e (co,no Edit ou
Fi 1e), adicione um ponto, e será 1nostrada u1na lista suspensa co1n os comandos disponíveis para
esse no1ne de tnenu. Aqui está u1na lista curta de comandos que é bom conhecer:
File.NewProject
File.SaveAll
Wi ndow.AutoH ideAll
A janela hnmediate fornece a capacidade de avaliar as instruções do código direta1nente (de
imediato!). Isso permitirá que você insira un1a única linha de código e veja os resultados se1n ter
de criar um protótipo inteiro do projeto. Esse recurso é útil quando se está no 1nodo de interrup-
ção, e,n que se interrompe a execução de um progra1na e,n curso. treinos desenvolver u,n exem-
plo si1nples de projeto, no qual usare1nos u1n 'ponto de interrupção' para provocar o
ence1Ta1nento da execução do programa e1n Luna certa linha de código. (O ponto de interrupção
será abordado co1n ,nais detalhes no Dia 6, "O Que Fazer Quando Progra1nas Bons Apresentam
Prob.le,nas e para Se Ce1tificar de Que fsso Não Aconteça", porque ele é reahnente uma ferra-
menta de depuração).
Você usará a janela Co1n1nand no início deste exe1nplo apenas para ter u1na noção de como ela
poderá ser útil no futuro. Certifique-se de que a janela Command tique visível e no modo Com-
mand, selecionando View, Other Windows e Co1nmand Window na barra de 1nenu. Agora, aja-
nela Command deve estar visível con1 u1n pro1npt > 1n.ostrando que está no 1nodo Co1nn1and.
Digite o co1nando Fi 1e. Ne Pro ect e pressione Enter. Uma caixa de diálogo aparecerá, solici-
tando a criação de utn novo projeto. Selecione a pasta chamada Visual Basic Projects na lista da
esquerda e o tipo individual de projeto chatnado Windows Appl ication, na caixa à direita. Dê um
clique e,n OK para fechar a caixa de diálogo, gerando un1 novo projeto em branco.
O projeto criado conté1n apenas um formulário Windows, e você ainda precisa adicionar seu
próprio código. No entanto, o Visual Basic já inseri u de ,nodo autornático tnn pequeno trecho de
código nele, um pouco do trabalho que é necessário para gerar e inicializar o novo formulário em
branco. Esse código pode ser visto co1n un1 clique no botão direito do mouse sobre o novo for-
mulário (najanela central do IDE) e selecionando-se Vie\.v Code. Esse procedi1nento irá adicio-
nar e selecionar u,na guia nova na janela central, un1a janela de código que exibe aquele
associado a esse formulário. Já que nada foi adicionado ao formulário, o código é um pouco limi-
tado, mas suficiente para o exemplo.
Selecione a linha Forml = Me, rolando para baixo a fim de encontrá-la, se necessário. Agora, você
quer n1arcar essa linha co,n u,n ponto de interrupção, portanto, a execução desse código será en-
cerrada ou 'interron1pida' quando ele a atingir. l-Iá três 1naneiras difere11tes de marcar a linha.
Urna é dar urn clique na margem (a área cinza-claro no lado esquerdo da janela do código), outra
é dar u1n clique com o botão direito do 1nouse e selecionar Insert Breakpoint, e a terceira é usar o
atalho do teclado para essa função, pressionando F9. Empregando o 1nétodo que quiser, adicione
o ponto de interrupção, e verá um ponto vermelho aparecer na 1nargen1 próxima à linha. Ela indi-
ca a presença de um ponto de interrupção.
Trabalhando com o Visual Basic .NET 43
Com esse ponto de interrupção inserido, você poderá executar o projeto, e o processa1nento será
encerrado quando ele atingir essa linha. Co1no para o ponto de interrupção, há três 1naneiras
principais de iniciar u1n projeto: u1na é usar o botão da barra de ferramentas (que se parece co1n o
botão de reprodução dos CD players ou videocassetes - veja a Figura 2.14), outra é utilizar as
opções Debug e Start do 1nenu, e a terceira é empregar o atalho do teclado, FS. É claro que a op-
ção a ser usada é un1a preferência pessoal. Muitos programadores achan1 que, no final das con-
tas, os atalhos do teclado são a forma mais fácil de acessar as funções mais co1n.uns.
Quando você iniciar a execução do projeto, ele será rapidamente encerrado e exibirá a linha de
código marcada co1n un1 ponto de interrupção. Agora, esta,nos no 1nodo de interrupção, como
indicado por [break] na barra de título do IDE do Visual Studio. A setaan1arelaque pode ser vis-
ta na 1nargern da janela do código indica a linha que está para ser executada (processada). Nesse
ponto, pode-se alterar a janela Command para o modo Jm1nediate e testá-lo.
Se sua janela Co1nmand estava visível antes da execução do projeto, ainda deve estar presente,
e1nbora o layout possa ter sido u111 pouco alterado quando ceitas janelas foratn abettas auto1nati-
camente no momento e1n que você estava no meio do processamento do projeto. Se a janela
Cornrnand não estiver visível, abra-a usando as opções Viev.1, Other Windows e Co1nmand Win-
dow do menu.
Debug • x
FIGURA 2.14
A barra de f erra,nentas ~ li • C1 1 + l+Ji e~ ~ 1 Hex 1 @ •
fornece botões para
iniciar e interron1per a
ex ecução de
progra,nas, usando
ícones parecidos com
os controles de
videocassetes.
Dê um clique na janela para selecioná-la (tomando-a a janela ativa no IDE) e digite irrmed (segui-
do da tecla Enter) para passá-la para o modo hntnediate. Agora você pode inserir qualquer ins-
trução do Visual Basic, e ela será avaliada imediatamente (daí o no1ne). Tente as instruções a
.
seguir:
? Me.Width
Me.Width = 50
? Me.Width
? 3 + 5
? 3 = 5
44 Dia 2
NOTA
- Usar as teclas de seta para cima e seta para baixo enquanto estiver na janela
Command/lmmediate nem sempre o transferirá para outra linha dela. Em vez
disso, se você já tiver começado a inserir algum texto, poderá passar pelos co-
mandos executados. Se você selecionar uma linha que já passou (na janela) e
começar a adicionar texto nela, será criada de modo automático uma cópia
dessa linha, com suas novas alterações, na parte inferior da janela. Isso torna
qualquer texto antes da última linha da janela efetivamente de leitura.
Notou o ponto de interrogação e1n frente a algu1nas das instruções anteriores? Isso indica 'exi-
bir' e, se1n ele, o Visual Basic não saberá o que fazer co1n as instruções que retornam um valor.
Por exe1nplo, 3 + 5 produzirá 8, mas, se1n a instrução de exibição, 8 não será um comando válido
do Visual Basic. Por outro lado, instruções co1no Me. \~i dth = Me. \•li dth * 2 são trechos de código
válidos do Visual Basic e não precisam do ponto de interrogação e1n sua frente.
Pressione FS para fazer com que a execução do código continue após o ponto de interrupção, e o
forrnulário aparecerá na tel.a 1uaior do que o tan,anho original se você processou as instruções do
exemplo fornecido anteriorn,ente. Como pode ver, é possível afetar pa1tes de seu progra1na a
partir da janela Im1nediate, o que a faz uma ótima ferramenta de depuração.
Dynamic Help
Esta janela de ferra1nentas é configurada como uma guiacon1 ajanelaProperties (se você estiver
usando as configurações do perfil Visual Basic Developer) e fornece referências, co,n base no
contexto, da docu1nentação dos arquivos de ajuda do Visual Studio. E1n vez de esperar que você
solicite ajuda, esta janela de ferramentas age de 1nodo proativo quando a tecla F1 é pressionada
ou algo é selecionado no 1n.enu Help. Cotn base em sua opção ou tarefa atual, ela exibirá tuna lis-
ta de tópicos relacionados. Na Figura 2.15, a janela de ferramentas Dyna1nic Help 1nostra u,n
conjunto de tópicos de ajuda sobre a tag HTML atualmente selecionada na janela de edição de
códigos. Além dos tópicos relacionados, essa janela en1 geral exibe u1n link para vários tópicos
mais genéricos como (nesse caso) a seção Coding Techniques and Progra1nming Practices (Téc-
nicas de Coditicação e Práticas de Progra111ação) da docu1nentação. Essa janela de ferramentas
ta1nbé1n fornece um link direto para as seções de pesquisa, conteúdo e índice da docu1nentação
de ajuda por meio de três ícones da barra de ferratnentas.
Trabalhando com o Visual Basic .NET 45
I. .... ···--·
End SUb
(Ui f".cttlno St,a,tcd
wt»S's tlNt kl l:ffl.l'N::t
t,.mJ.»e CMm!s hYM 6$
'mid2udow.tfthfe,d)f
(yats:,;r;nq tbc Qm):,MWI, (m:k«mm1
Custo;ri;,hQ Px\:'W!!C H:'Q
'D• h ,v.ltOO&.U-r'I' : t.o s.d•d. • e: \uinr.c.\ ;,,.tcro•o ! t . l\n, \ tr·~•vo<k\ vl . O. ?9H \ 1a.,1 c ll'Lf'cdtjnq ~ S tudo.t-ET
'VLndov1>.pplí.cat.iont•: t.0 "411.d ' D:\.'Doc1.1&•r.t• 4lnd S11.ttlnqt\l)\u\c-a\ Hy Do '1l'2,l;l$yôo1l(l
'v,.octovsA,ip.Uc•eJ. ont. •••' : l.o ad•d ' e: \vi.l'W$t.\ u ,11.-.J,ly\qa<\ • Y• tt.•, uj l\dov•
' V1ndovflpplicae1ont.••• ': Lo ad•d •c: \VÜlnt\•••~ l y\q~\sytt . .\ l ,O.Z41
' V1ndov1A.pplic•tiont.•••': Load•d •c:\v1:nnt.\••••lll>ly\ ~a,c\fY•t••· d r •vin~
' W1ndo~;Applicaeiont.e1e': Lo ad•d 'c:\v1J::r.t.\ a.s$1lably\ qac\ •Cc•ss~ility\
the p~ov~aa 'l 1Sa.81 Vindov,A.ppl1ca~ion8. e1•' ha.s • • 1ted v i th code O iOc
•
r li<!
Server Explorer
Estajanela de ferra1nentas (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 co-
nexões estabelecidas entre seu projeto e vários servidores de banco de dados, e pennite que você
explore esses bancos de dados para examinar tabelas, procedimentos annazenados e outras in-
formações úteis.
O segundo conjunto de infonnações, Servers, representa qualquer 1náquina co1n a qual você pos-
sa se conectar e que forneça un1a interface visual para os recursos que ela possa tornar disponível
para seu progra1na. Esses recursos inclue1n contadores de dese1npenho, registros de eventos, fi-
las de mensagens e 1nais, todos faci hnente encontrados por meio desta janela de ferra1nentas.
O Dia 13, "Usando o Server Explorer", se aprofunda no uso dessa janela de ferramentas para en-
contrar e manipular recursos de servidores.
46 Dia 2
-·
a l!!! e.... ,..,, 1tc .J.utoSC(IIJcBe11a.e!:hc • Ne v 9 y#te.J11. Drelvtno.sue(S. 1·
de outras 111áquinas. rte . Cl 1ent.S1:e • New S y:9te.11:t. Dravia.q. S i u (292, 273 J
ne. control:J . .ldd.Ra.nae p:e v sv:,tcln, 11u1.covs . ronns . cont.r•
.
'il ;
.:J
-'""'
Sea..rlty
:,') l!!! ........
ne .Ho.me •
n.e.. Text •
'"foem1"
.. t·o~l"
a 'frl MHS410e Quews nc . Rc~umc:Loyout (Fa lo~)
'll D
r.: (J ""'" -
J\.tilc {\.111)..JeS
$ c:i ........ _
(!l; G) Pttfcriro~o Cwtt<S t/lnd P.eg1on
q;,, s.n,,.,
8 6J sq.,..,_,
JJ e,,~
1
•
•
•
Properties
O IDE do Visual Studio pennite que você trabalhe com 1nuitos itens, projetos, soluções, fonnu-
lários e classes diferentes, além de outros recursos, todos possuindo atributos e propriedades.
Essas propriedades são inforn1ações que descreve,n o ite1n, como o nome de u,n projeto. E1nbora
as propriedades seja1n em geral preenchidas auto1natica1nente, co,n valores-padrão, é preciso
uma maneira de alterá-las. A janela Properties fornece essa funcionalidade. Se1npre que um item
for selecionado no IDE, os atributos desse objeto serão exibidos nesta janela de ferramentas
(veja a Figura 2.17). Alguns desses atributos pode1n ser de leitura (não podem ser alterados),
mas, se assim o for, então, será possível dar u1n clique neles na janela Properties e alterá-los
quando necessário.
Solution Explorer
De ,nuitas maneiras, o Solution Explorer é se,nelhante ao recurso do Windov;s Explorer usado
•
no Wi.ndows. .E a interface de gerenciamento de arquivos do Visual Studio .NET. No Visual Stu-
dio .NET, o código que você criar poderá ser organizado e,n ca,nadas diferentes de agrupa1nen-
to: soluções, projetos e arquivos. A janela Solution Explorer per,nite que sejan1 visualizados
todos os objetos que estejam abe1tos no mo1nento, e,n seus respectivos grupos ou janelas. Aja-
nela Solutions contém projetos, isto é, aplicativos e componentes individuais, co,no u,n sistema
completo, incluindo co1nponentes executados tanto no cliente quanto no servidor. Dentro de
cada janela Project estão todos os arquivos efetivos do projeto (classes, formulários e outros ele-
1nentos).
Trabalhando com o Visual Basic .NET 47
.••. W1ndo...sApp"c t1t1on8 • MK,o~on Vl'SU<II 1:1.l-UC..Nl l {dNlf.,nJ · fom, 1.vb ( ONIQn] l!!!lg Ei
FIGURA 2 .17 Bt tdt ~;,., ~;,ct ~ l!!buo - Iods ~ ~
Quando urn objeto for !b1 • fu • ~ lil ~ 1 ,. ~ e. 1-~: <• • ~ • c.1 •~ · flf.
selecionado na janela - l $ 1 - '11 ,li 1... ~ +L ,<H I"" ~,: ~ ?.
,_ Form1•.i.(o..q,J
*: -: ·~: •
ê! ~ 'tJ, " •
,_
de edição (111110 caixa ITe>elBoMI
--
SySt!9'1..WindoM..fOtms, Text.80:..:] •
exibirá todos os seus •: : : : • ; : : : 8"10\l f::: :'. ::.:::::~ '. A(<tPUlob F4',c,
,...
.!!l ""'"'
Jiu •: • • • • ••• : • • • ••• . AbfOloOQ ...
tã:J --
0 •.....i
......... . .
.
.
.
.
....... .. . . . . ....
'
...........
.. . . . .......
. . . . ...
' '
.' ... '"'"
.....
llkleortl'ol
3Z767
... .
.
. . . . .. .. .. .. . . . ..
i;:i ......... .
' '
.' .
~ UStBox . '
~-.-
'!; C:0,,-
!!l~
~~
.. -~,-
Além de permitir que você visualize o que está abe110 no 1no1nento, a janela Solution Explorer
fornece vários recursos. Por 1neio dela, poden1os
• Adicionar novos arquivos a un1 projeto (dê u1n clique co1n o botão direito do 1nouse no
projeto e selecione Add)
• Re1nover arquivos (dê um cl ique com o botão direito do mouse em u1n arquivo específico
e selecione Remove)
• Adicionar e re1nover projetos inteiros de um grupo Solution (dê u1n cl ique co1n o botão
direito do mouse na solução para adicionar um projeto e em u1n projeto para a opção de
removê-lo da solução atual)
Class View
Como parte da discussão sobre o Solution Explorer, expliquei que poderia haver n1uitos arqui-
vos diferentes envolvidos e1n tun único projeto ou solução. Esses arquivos en1 geral correspon-
dem às classes criadas (como uma classe Veículo ou Conta), mas não há um requisito para que a
organização do arquivo se pareça com a organização conceituai das classes no projeto. A janela
Class View (veja a Figura 2.18) foi projetada para pertnitir que você visualize a estrutura do ob-
jeto de seu projeto e use essa visualizaçã.o para navegar em seu código.
Dentro desta janela, você pode minin1izar e expandir os objetos exibidos, para acessar as diver-
sas propriedades e n1étodos que eles expõem. Dar um clique duplo e1n um item específico de
Class View o levará para essa classe, 1nétodo, evento, propriedade ou procediinento. Se o item
sobre o qual houve o clique duplo não estiver disponível co1no parte de seu código, Class View o
conduzirá para a definição dessa parte da classe dentro do Object Bro\.vser (veja a próxi1na se-
ção). A janela Class View é útil como uma maneira de exa1ninar seu projeto através das classes
definidas nele, ignorando os detalhes físicos dos arquivos reais.
48 Dia 2
• 1 Y te e r, •
.. lools 1!L'ldow ti't>
· · J: · c.1 , -
'
· "'•
mostra seu projeto 1.;!!' •
•
1~ . I"' ~. l'.l .... .,, "" 1~ l:1- t f.?.l ... !": '!'!' ~ ,., f : *; ê! ~ ~ 'tl "' .
•
organizado por seus ·: ·,,...,-
e I ~ ~ - ~ - - ,,~
objetos e não por seus e- O F&!<
arquivos fisicos, e r G.~Ol!l , ,: f ;, e -<>i; f,fl!'R!r
1j1 º ; ..... ,,,11,....1""'
.fornece acesso direto ... .......
(' A<1dc8\Alonl
"l'
... .. . . . .. .
r-Raóc&clon2
.
•• : • , ,• •,
:: : :··:· ;; ;:
iá• boY:opy_Od(c»,..,,E
IJJ• bb'Oelcte_Cld(Ob;ed,,E
ao interior e/esses
e.
(" R,ddl..,..,:J ; :: .... ~· Wl..,,._06(Cbl0(.l,E_.,.
à• CopyCl<l(Cble<t,-
... CisPO~!ltdcon)
~o ) ,
objetos.
. .. :·:..:! .: .
• $•
.. f"R,ck&aoM ::::
' Lt ::zA
l!'i!t'!t , 62:.:w ' ,;;r;s;;ç.;, m!.:,!!, , •
OoEv~ O bllC<t.f
~• w 1o1• ~ 0
• :...
... - -, - ----:
r .., !".. • r~w()
....... . . .... . . . . .. . ... ..... ..
: -
, '
t~l'; btN:(ipy
yl) W'Oclcte
t/>btrl"ove
... .. . . . . .. . . . . . . . . . . . . . .
... . .
..... .
. .
"
'
' '
. . . . '
'
' r,/;
IÍ'
e,h\;O\>ffllrio
'""'«-,
,/; l'G>~
• • ~<"; tlSou·ce
./ >txtO~
,{I b:\SOwce
l!J ~ -
~ =;=~-------------~·~·.__________.__..!.!
....., E) "'""
Object Browser
Toda a prograrnação na plataforrna .NET é baseada ern objetos - os objetos fornecidos como
parte do .NET Frame\-vork, os que você criar e até os que outros participantes de sua própria
equipe desenvolverern. Todos esses objetos possuern propriedades e 1nétodos por meio dos quais é
possível interagir corn eles, ,nas co1no saber o que está disponível? O Object Browser foi proje-
tado para ajudá-lo no trabalho corn todos esses objetos, permitindo que você navegue e pesquise
e1n utn catálogo de objetos disponíveis. Esse catálogo inclui os objetos (classes) expostos por
qualquer biblioteca de classes que for referenciada, alé1n das classes contidas e1n seu próprio
projeto. Sen1elhante em alguns aspectos à Class Yiew, o Object Browser vai além da funcionali-
dade dessa. outra janela, incluindo objetos externos ao seu projeto. Essa janela é n1ais útil corno
urna 1naneira de documentação ou referência, pennitindo que classes seja1n encontradas dentro
do .NET Framework ou outras bibliotecas de classes e seus detalhes visualizados, coino suas
propriedades e rnétodos. Na Figura 2. 19, podernos ver o Object Browser sendo usado para pes-
quisar o conteúdo da biblioteca System.Data, exibindo infon11ações detalhadas que vão até o ní-
vel dos parâmetros necessários para uma. certa cha.rnada de método.
Lista de Tarefas
E1n qualquer projeto de desenvolvimento, 1n.es1no os concluídos, há a probabilidade de ficaren1
várias tarefas pendentes para serern completadas. As seções do prograrna podem precisar de
ajuste no desempenho. Pode haver erros conhecidos ou recursos que necessiten1 ser re,nediados.
Quando as tarefas pendentes podem ser relacionadas em u1na área do código, urna prática. co-
mu1n entre os prograrnadores é marcar essa área corn con1entários. Quando os programadores in-
cluem consistentemente certas palavras-chave como TODO ou BUG nesses con1entários, é mais
Trabalhando com o Visual Basic .NET 49
fácil varrer o código procurando-as para encontrar os trechos apropriados. O Visual Studio .NET
formalizou esse processo fornecendo uma lista real de tarefas que é preenchida de modo automá-
tico con1 referências a qualquer seção de seu código que contenha uma das várias palavras-chave
como TODO (1nas, você pode especificar a palavra-chave que quiser). Cada comentário encontra-
do será, en1 seguida, relacionado em uma lista fácil de usar, detalhando não so1nente o próprio
comentário, ,nas ta1nbé111 o arquivo e a linha onde foi encontrado (veja a Figura 2.20).
~---·
referenciado. (+) ~ , Corne<t5!>rPOOLCÇU"(Or
.....
~-""'
8 '>i; sct.:am~
9-
~~-.,.-,~~~ --·-
~ Sd(oo,,,<too
t>i; $ql'.).at,nA~ «
.. ~r~-----.==~=-------------......c
~
~~~
Co1n u1n rápido clique duplo em u1na tarefa pendente, você será levado de imediato para o códi-
go, no qual poderá trabalhar no que ela indicar. Alé1n dessa funcionalidade - por si só bastante
útil - , a lista de tarefas pode conter várias outras espécies de tarefas. O Visual Studio adiciona
outras tarefas automatica1nente, co1no a referência a erros co1npilados e outros itens perceptíveis.
Mas você ta1nbém pode acrescentar dois tipos de tarefa a essa lista: atalhos de código e tarefas
definidas pelo usuário.
50 Dia 2
FIGURA 2.20
Cada co111entário -~l l!i!il·-
'f,I ;... ••
marcado con, unia frmf....vtt•
palavra-chave especial
é 111ostrado e111 11111a Q
lista de tarefas ben1 ...J ~
organizada. Prtvate Sub CopyC l ic~ (ByVal sender 1.5 Syste.m. ObJ eet; _ f
BVVal e As Sy!llt-etn. r:ventJ.rg:,) füUl(ll~ bt.l\'COP'S'. Cllc.~
'TODO: Conn,e:n~ tht~'
Os atalhos de código são se1nelhantes às tarefas co1n base e1n con1entários, 1nas são uma referên-
cia a alguma linha do código. Não precisan1 de nenhuma palavra-chave especial. Para adicionar
un1 atalho de código à lista de tarefas, dê u1n clique co1n o botão direito do 1nouse na.janela de
edição de códigos e selecione o item Add Task List Shortcut no .1nenu.
Uma nova tarefa será adicionada a sua Iista, com o padrão para a descrição sendo a linha de códi-
go selecionada (embora você possa, e provavehnente deva, alterar isso para outra descrição que
queira usar). En1 seguida, você poderá retornar rapidamente para essa linha apenas co1n u1n cli-
que duplo nessa tarefa. Quando um atalho é criado, uma seta
,
azul é posicionada na margem es-
querda da janela do código próxitna à linha apropriada. E possível remover o atalho dando um
clique com o botão direito do 1nouse na linha do código e selecionando Reinove Task List Short-
cut ou selecionando o ite1n novo da lista de tarefas e excluindo-o diretan1ente.
O outro tipo de tarefa que você pode criar é u1na tarefa do usuário, que não está associada a ne-
nhum trecho e,n pa1iicular do código, se1nelhante a urna tarefa-padrão do Outlook. U,na tarefa.
do usuário é adicionada com u1n clique na seção Click Here to Add a Nev.1Task da lista de tarefas
e preenchendo-se os detalhes. Observe que, diferente das outras tarefas, essa não possui campos
de arquivo/linha preenchidos e, portanto, só tê1n dois ca1npos disponíveis, a descrição e a priori-
dade (baixa, nonnal ou alta). Se quiser criar u,na observação sobre u1na área específica do códi-
go, você com certeza achará mais útil gerar um atalho de código e alterar a prioridade e a
descrição para. fornecer ,nais detalhes sobre a questão real.
Soluções e Projetos
Como discutimos na seção "Solution Explorer", existe1n vários níveis nos quais seus códigos
podem ser agrupados. O primeiro, a solução, representa o sistema completo que está sendo cria-
Trabalhando com o Visual Basic .NET 51
do, enquanto os componentes individuais dele são representados por projetos separados. Antes
que você possa desenvolver qualquer código no IDE do Visual Studio, precisa configurar a solu-
ção e pelo n1enos u1n projeto. Nesta seção, percorrere1nos os princípios básicos da organização
do código, criando novos projetos e trabalhando com projetos e arquivos existentes. A seguir
apresento um resumo desses tópicos, 1nas, na seção logo a seguir, passaren1os a praticar essas ha-
bilidades gerando un1 exe1nplo con1pleto de um aplicativo.
New Project E!
FIGURA 2.21
Proj,!(t Typi,s: Tetrc,hte~: ltt.§J
::::
O Visual Studio possui -ti .. •
urna caixa de diálogo D \llswl ( 6 P1ojccts
-O 'v1sual C++ Pro)'!cts ~
Yhldows
~
Oassl/Naty
~
Whdows
chan1ada Ne111 Prqject, -D Setup .n:I Dct=l0>ment Pro,ects Jlj)j>li<,tlOI\ Cet\tr'OI Ltlr'51'(
13..Q Othtr PtoJc<U
que per111ite que novos
~ ~ ~
Cl Od.<Dase Projocts
l'E-0 f MCfí,lÕSé T~ tc Pro)Cds
projetos seja,11 CJ ~ StudoAno!y: or PrO)OCtS ASP.t\El'Web ASP.,V Web Wt't>Corittd
~ ?t~.~ty..R~jeC~ •- ._, ~ A.pplk.aUcn !erv",:e Utv«y ~
acrescentados quando IAp-o~t f0t cre«lng 41"\ l(>Plc.ation "'th a ~ s·use, uu.i ~ i
você instala ,nodelos Narr~ ( WindowsApçkaticn9
ou linguagens Loeati:n: ~I0-,\1)-00,-,.....-.,- . n-d5'<
- l!no<
_ \P_""
_•_nm-a\r,ty
_ Oo<
_ u,,.
- n!-.,,~:::J Brcmse...
adicionais. (". Add to Sc:lw:in C: Oose-Sol!&n
,.,.SolJtlcn_, l w,ndow-..-«>tl"'9 í-7 er..,to d<octoiy f«SOUlon
Pro)l'?d: wn be aeat:ed at0:\ ...\\f1sool Stucfü Projects\WndowsApf::6t.aoon9\\li.'indowsAçpkation9.
Ok C.ncd
Para criar um aplicativo que seja executado locahnente en1 sua 1náquina e usar utna interface
com o usuário co1n base no Windows (coro caixas de diálogo e outros elementos UI do Win-
dows), selecione Windo,vs Application na lista de tipos de projetos. Para concluir o processo de
criação, digite um no1ne para seu novo aplicativo e, se quiser, altere o ca1ninho sugerido. Dê um
clique em OK, e o Visual Studio gerará seu novo projeto. E' u1na boa idéia dar a seus projetos no-
mes significativos, 1nesn10 quando você estiver apenas fazendo testes; caso contrário, logo have-
rá todo um grupo de projetos co1n os no,nes WindowsApplication 1 e Windo\vsApplication2,
dificultando a localização de algo etn que tenha estado trabalhando.
ser aberto no IDE. O Visual Studio fornece algumas 1naneiras fáceis de abrir projetos passados.
U1n 1nétodo é usar o menu através de File, Open e Projectou diretamente pela opção Recent Pro-
jects próxitna à parte inferior do n1enu File. Outro método é por meio da seção Get Started da pá-
gina inicial do Visual Studio, uma página HTML que lista os últÍ!nos projetos utilizados. Nesse
local, é possível dar um clique no projeto específico que se quer abrir ou até criar um novo atra-
vés de u1n link adicional. Abrir um projeto novo faz con1 que qualquer outro projeto que já esteja
sendo usado seja fechado, a menos que seja1n e1npregadas as opções File e Add Project do rnenu,
que adicionam un1 projeto novo ou existente à solução aberta recenten1ente.
Arquivos
As soluções e projetos existem quase apenas para fins de organização; o código efetivo reside
e1n u1n ou 1nais arquivos individuais. Quando você cria urn projeto novo, ern geral são gerados
certos arquivos, como u1n novo formu lário Windows (Forml. vb) ao ser criado um aplicativo
Windows e um novo 1nódulo (Modul el. vb) para um aplicativo do console. Esses arquivos são ge-
rados em disco e existen1 independentemente de seu projeto, pennitindo que um único arquivo
seja compartilhado por vários projetos se isso for desejado.
~ ~
Locôlf:"lo·o,ect Ui'M
a caixa de diálogo l\'e111 a u,
!-CJ Codo>
éEl
HUILPq Ft~t 2yle 51"-.eet
Project, a inteiface º lll!I
º"º
K:J
para adicionar itens
~ ~
D utll:y
expansível.
Salvando Tudo
Corn todos esses grupos diferentes (soluções, projetos e arquivos), é importante saber como sal-
var os trabalhos que fora1n executados, mesmo se estiverem localizados em mais de um arquivo.
No IDE do Visual Studio, isso é feito através de dois cornandos diferentes: Save e Save Ali.
Esses co1nandos, situados no tnenu file e na barra de ferramentas, pennitem que seja salvo ape-
nas o arquivo selecionado no 1no1nento (selecionado najanelaServer Explorer) co1n o uso do co-
mando Save ou, por meio do co1nando Save Ali, todos os arquivos abertos que tenham sido
alterados.
Se você tem 1nedo de perder seu trabalho, co1no eu, ficará especiahnente interessado etn uma das
opções do IDE. Na caixa de diálogo Options (acessada por 1neio dos itens Tools e Options do
menu), é possível expandir o grupo Environ1nent e selecionar o ite1n Projects and Solutions para
ver um conjunto de três botões de opção sob o cabeçalho On Build/Run (veja a Figura 2.23).
Essas opções controlam se o IDE salvará algurn arquivo alterado antes de cotneçar a executar um
projeto. Essa é tuna configuração importante porque, se o IDE falhar e,n algu1n 1no1nento, é be1n
mais provável que isso aconteça quando seu código estiver em execução. Essa opção fornece
tuna maneira fácil de assegurar que todas as suas alterações seja1n se1npre salvas antes da execu-
ção de seu código.
Crie o Projeto
Nos 1nenus, selecione os con1andos File, New e Project, apresentando assim a caixa de diálogo
New Project. Na categoria Visual Basic, selecione o ícone Windows Application e altere o nome
do projeto de Wi ndowsApp 1 i cat i on (x) - o nome-padrão numerado - para Adder (a menos que
você seja Ílnportunado por intro,netidos, situação na qual poderá no,near o projeto da ,naneira
que quiser). O novo projeto já terá um formulário, que é tudo de que você precisa para começar a
trabalhar no aplicativo. O Visual Studio criará auton1atican1ente u1na pasta Solution para anna-
zenar seu projeto novo, também dando o nome de Adder a ela. Dê u,n clique em OK depois que
tiver inserido os nomes corretos do projeto e da solução.
- lf X
FIGURA 2.24
Organize as três caixas
de texto e o único
botão e111 seu • • • i • •
jFJo
• • •
.. c;J t.oca1s •· · · r========. Oi©Ft311Ãi'ffl&·+%'m fJBiorí!,WllãlPtRfi 0 1.stt0st
...... !
Trabalhando com o Visual Basic .NET 55
Selecione a pri1neira caixa de texto (a mais próxi1na da parte superior do fonnulário) e exiba aja-
nela Properties (pressione F4 ou selecione View e Properties Window no menu, se a janela já
não estiver visível). Várias propriedades diferentes serão listadas, 1nas você só irá alterar duas
delas:
• Text (no grupo Appearance) Representa o conteúdo da caixa de texto. Exclua o conteú-
do desta propriedade para fazer con1 que a caixa de texto fique vazia quando o progra1na
for iniciado.
• (Na,ne) (no grupo Design) No código, você se referirá a essa caixa de texto usando o
nome desta propriedade, que tem co,no padrão u,n no1ne relativa,nente irrelevante, como
Text2 ou Textl. Neste exemplo, altere para txtFirstValue.
Continue com as outras duas caixas de texto, deixando sua propriedade Text e,n branco e alte-
rando seus nomes para txtSecondVa l ue e txtResul t , respectivamente.
Agora selecione o botão para exibir seus atributos na janela Properties. Você também alterará
son1ente dois valores desse objeto, (Name) para btnAdd e Text para Add.
Para concluir, só porque tem esse recurso, você alterará uma das propriedades do próprio formu-
lário. Selecione o for1nu lário (dê um clique em algu1n local dele que não seja outro objeto) e role
pela lista de propriedades para encontrar a propriedade Text no grupo Appearance. Para tnn for-
mulário, essa propriedade representa seu título (o texto exibido na barra de título), o qual podere-
tnos configurar como Simple Adder no exen1plo.
Executando o Projeto
Mesmo se você não tiver inserido um código, o projeto poderá ser executado da 1naneira coino se
encontra. O TDE do Visual Studio permite que o progra1na seja processado dentro dele, se1n a
existência de um progra1na executável (u1n arquivo .exe, por exemplo). É possível processar ra-
pida1nente o trecho de código necessário durante o desenvolvin1ento e, o que é mais importante,
executar várias tarefas de depuração enquanto o progra1na estiver sendo processado. Mais infor-
mações sobre os apl icativos de depuração serão fornecidas no Dia 6, 1nas, por enquanto, é essen-
cial observar que há uma diferença entre processar seu código no IDE e gerar um arquivo
executável real. A criação de um executável, ou outro tipo de arquivo de resultado de seu proje-
to, é cha1nada de construção e será abordada na próxi1na seção.
Para executar um projeto no JDE, selecione Start no menu Debug, pressione f5 ou use o botão da
barra de ferramentas que se parece con1 un1a seta para a direita (ou con1 o botão de reprodução de
um videocassete). Tente isso agora, co1n o projeto Adder que você já abriu, e verá o formu lário
sobre o IDE do Visual Studio. Mesmo se1n que tenha sido escrita uma única linha de código, o
fonn ulário parecerá bern funcional. Ele poderá ser arrastado pela tela e 1nini1nizado, tudo por causa
do .NET Fra,nework e do IDE subjacentes que perrnitem a criação visual de u1na interface coi.n o
usuário e produzem o código necessário para fazê-la func ionar.
156 Dia 2
E1nbora você nã.o tenha escrito nenhum código, uma coditicação extensa já foi gerada pelo IDE,
e é ela que é executada quando o projeto é processado.
Construindo o Projeto
Construir um projeto é a criação de u,n executável ou outros arquivos de resultado. Para un, apli-
cativo Windo'vvs co1no o do exemplo, isso significa a co,npilação de seu código em u1n arquivo
.exe que possa ser executado fora do IDE do Visual Studio. Essa é u,na etapa essencial se você
pretende que um projeto seja usado por outras pessoas que não sejatn desenvolvedores, embora
possa ser evitada durante o desenvolviinento pela execução dentro do JDE.
arquivo executável final (veja a Figura 2.25). Enquanto você estiver aprendendo o Visual Basic,
as infonnações inseridas nessa caixa de diálogo pode1n ser irrelevantes, 1nas, quando criar u1n
aplicativo que será distribuído para os usuários, é recomendável levar em consideração as infor-
mações dessa página con, muito cuidado. No mínirno, ce1tifique-se de que inseriu os nún1eros
corretos das versões na página porque eles fornece1n um n1étodo conclusivo para os usuários ve-
rificaren, que versão de um aplicativo possuen,.
Accesslbllity.dll Propc:rtles 6 EI
FIGURA 2.25
Quando você visualizar
I
Genc,ol Ve,,ion Soourly j S""'""'? j
arquivo executável ou
DLL, poderá exa,ninar
todas as informações Other vewsion irlonnalbn
especificadas antes ele
sua construção.
Í Item name:
COfl"fTICflts
Value:
..,,..---,-,::---.--~
Miero.sofl CClfporbtion
•
Internal Name
L""ll°*
LogolT1odcmOl1<,
Orígnal File""""'
ProdJct Name
Procb:.IVei,ion
E1n Co1nn1on Properties\Build, apesar do nome, encontramos apenas uma propriedade que é cla-
ra,nente relevante para o processo de construção. O valor de Application lcon determina a apa-
rência do arquivo final .exe no Windows e pennite que você selecione o arquivo de ícones (.ico)
que desejar.
En1bora não sejam as únicas configurações adicionais que afetan1 a construção, os últi1nos itens
que mencionarei estão em Configuration Properties\Build. Nesse local você encontrará várias
configurações relacionadas com a depuração, assim como a configuração de Output Directory,
que determina onde o arquivo executável ou outros que forem criados serão posicionados.
Com o Configuration Manager (veja a Figura 2.26), você poderá criar quantos grupos diferentes
de configuração ou até 1nes1no retnover u,na existente. Por enquanto, será preferível deixar as
configurações co1no estão, selecionando a versão Release do resultado quando estiver itnplan-
tando o projeto, e Debug no teste.
Conflguration Manager E3
FIGURA 2.26
Active Solution ConRguratlon:
O Configuration
Al/anager per111ite que jOebug 3
Project Cootexts (checkthe projed conligurations to búld or deploy):
você crie co,?figurações
Pro ect Conf ation Pl&tform Build
diferentes para
Adder
.finalidades distintas
(1es1e, depuração,
aceitação do usuário,
liberação e outras),
cada urna podendo ter
configurações
diferentes no ,nenu dose I Help
Build.
O uso do IDE faz com que esse processo seja 1nuito direto: dê un1 clique duplo no formulário do
Solution Explorer para assegurar que a visualização do projeto esteja ativada e, em seguida, dê
um clique duplo no botão Add. lsso o conduzirá para a visualização do código do formulário e a
uma sub-rotina que fo i ad icionada pelo IDE. U1n controle, como esse botão, caixas de texto ou
outros componentes do formu lário, pode ter eventos associados a ele. A maioria dos eventos de
un1 controle representa ações
,
executadas neles como serem clicados, clicados duas vezes, selecio-
nados e desmarcados. E possível criar procedünentos que serão executados quando uLn desses
eventos ocorrer e, por padrão, esses procedi1nentos são designados pelo seu nome (o no1ne do
controle, btnAdd, seguido do evento, Cl i ck). Poden1-se associar procedimentos a eventos, inde-
pendente1nente de seus nomes, mas neste caso, o procedimento bt nAdd _Cl i ck será executado se
o usuário der um clique no botão. É fácil testar essa funcionalidade usando utn recurso 1nuito útil
do .NET Fra1nework que fornece os fonnulários, botões, caixas de texto e outros elementos de
interface, e, po1tanto, está disponível para qualquer projeto no qual se esteja usando esses obje-
tos. A classe MessageBox permite que uma 1nensagem seja exibida em uma caixa de diálogo com
u1na única linha de código, como esta:
MessageBox . Show(''O bot ão fo i clicado'' )
Esse código exibe tuna caixa de diálogo como a mostrada na Figura 2.27. A si,nplicidade do uso
dessa classe a torna perfeita para ser e1npregada como u1na ferramenta de teste ou de depuração.
Adicione a li nha de código anterior à sub-rotina btnAdd_ Cl i ck e, e1n seguida, execute o projeto
pressionando FS. Depois que o formulário aparecer, tente dar um clique no botão. Cada clique
deve provocar o aparecimento da caixa de 1nensage1n, mostrando a você que o código de
btnAdd _Cl i ck é executado se1npre que o botão é pressionado.
FIGURA 2.27
A classe MessageBox
fornece urna 1naneira
fácil de exibir
! TestMessage !
long Process Ei
infor,nações na tela e é
8bd <tuff hoppened
e,n geral usada nas
fases de Abort ! Retoy lgna,e
depuração/ teste.
Agora que você já sabe como executar un1 código que responde ao clique em u,n botão, poderá
criar o código efetivo de seu projeto. Ele tem de sornar dois valores para produzir u.rn resultado, o
que soa 1nais fácil do que é na realidade. Os valores que quere1nos são os conteúdos de suas cai-
xas de texto, disponíveis por meio da propriedade Text desses controles, 1nas antes que possa-
mos usá-los em u1na equação n1ate1nática (so1nando-os ), ten1os de convertê-los de strings (texto)
160 Dia 2
Resumo
O objetivo do IDE é fornecer um ambiente no qual você possa escrever, editar, executar e depu-
rar seus progra,nas, e o do Visual Studio fornece todos esses recursos e mais. Esta lição abordou
os recursos básicos do IDE e a finalidade de cada u,na de suas janelas principais. Tambétn o con-
duziu pela criação de um aplicativo Windows simples. Daqui em diante, estare1nos usando o
IDE freqüentemente, apesar de nem se1npre trabalharmos co1n ele1nentos visuais (co1no formu-
lários e controles). Po11anto, aprendere1nos ,nais sobre ele e seus recursos o te,npo todo. .Etnbora
possa parecer um pouco confuso e cansativo agora, o IDE é a ferramenta que você usará pai·a fa-
zer sua progra1nação de 1nodo que, com o tempo, ela se tornará fa1niliar.
P&R
P Preciso usar o IDE ou posso apenas empregar um editor de texto e a linha de co-
mando?
R No Visual Basic .NET, é possível fazer qualquer coisa usando apenas a linha de co1nan-
do e u1n editor de texto, 1nas o IDE fornece u1na grande quantidade de recursos para tor-
nar o desenvolvimento u1n. processo 1nuito 1nais fácil. O lntelliSense, a estrutura das
instruções e a edição codificada e,n cores, tudo faz com que a criação de códigos seja
1nais agradável, além de ser difícil ficar se1n os recursos de depuração.
P Posso adicionar meus próprios recursos ao IDE do Visual Studio?
R Co,n certeza! O IDE dá supo1te à personalização por meio de vários métodos diferentes,
incluindo macros e complementos. Não abordarei a personalização do IDE neste livro,
,nas, por hora, exa1nine os óti1nos exemplos de 1nacros nas opções Tools, Macros e Ma-
cros lDE do 1nenu.
Trabalhando com o Visual Basic .NET 61
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e coineçar a pensar e1n como colocar seu conheci1nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Se você quisesse ver todos os arquivos que fazem parte de seu projeto, que janela do IDE
. ?
usaria.
2. Qual é o local-padrão dos novos projetos do Visual Studio?
3. Como você pode escolher un1 ícone para un1 aplicativo que esteja desenvolvendo no Vi-
sual Studio?
4. Se a janela Comn1and estiver no modo lmmediate, como posso passar para o modo Com-
1nand e depois voltar?
Exercícios
Exata1nente co1no você fez nesta lição, use a classe MessageBox para adicionar mensagens ao
procedimento de outros eventos e verifique quando forem chamados. Tente selecionar txtRe-
sul t na primeira lista suspensa da janela de edição de códigos e, etn seguida, TextChanged, na
segunda lista para trabalhar co1n esse evento.
SEMANA 1
DIA
Variáveis e Atribuição
Variáveis e atribuição são a base de toda Iinguagern de programação. As variáveis pertnitetn que
você annazene infonnações para uso posterior e a atribuição é a rnaneira de inserir informações
., .
nas vanave1s.
,
O Que E uma Variável?
U1na variável é um depósito. E' um local para guardar as informações até que sejam necessárias.
Você usará variáveis e1n toda a extensão de seus programas para reter valores temporários du-
rante os cálculos, annazenar entradas do usuário e preparar as infonnações que serão exibidas
posteriormente para eles.
Variáveis Simples
Como descrito anterionnente, os tipos simples de variáveis 'armazena,n ' valores como nún1eros
e palavras. Po11anto, você pode achar que só é necessário existir dois tipos de variáveis: de nú-
1neros e de palavras. Porém, na verdade, há vários tipos diferentes de variáveis simples - cada
um criado para annazenar ta1nanhos ou tipos distintos de nú,neros ou strings.
Tente usar o melhor tipo de variável para a situação. Etn algu,nas vezes, só será preciso ,nanter o
registro de um número pequeno - por exemplo, se estiver armazenando os 1neses do ano. Em ou-
tras, terá de trabalhar co,n nú1neros grandes - por exen1plo, se estiver escrevendo um programa
que execute cálculos científicos ou de engenharia.
As variáveis simples pode1n ser divididas em quatro subgrupos. O primeiro e maior é o dos intei-
ros, números que não possuern casas decimais. O segundo grupo é usado para n(uneros com ca-
sas deci1nais. As strings e os caracteres compõem o terceiro grupo, e o quarto seria melhor
descrito co1no 'diversos'. Exam inemos cada u,n desses grupos e veja,nos quando qual é apro-
priado usar e,n que situação.
Variáveis de Inteiros
Novo TERMO
As variáveis de inteiros (integer) armazena1n os conhecidos núrneros inteiros (isto é,
nún1eros sern casas decilnais). Essas variáveis são as que você usará com 1nais fre-
qüência nos progra,nas e as mais fáceis para os con1putadores tratar. Por causa dessa co,nodidade,
elas deve1n ser seu tipo preferido quando for preciso trabalhar com números. A Tabela 3.1 rnostra
diversas variáveis de inteiros diferentes, cada uma foi criada para annazenar núrneros de tama-
nhos distintos e para e,npregar quantidades diferentes de me,nória. A quantidade de me1nória uti-
Iizada é ,nedida en1 bytes. (Un, byte contém oito bits, o que é apenas u,na n1aneira técnica de dizer
que cada byte possui oito algarismos um ou zero, ou uma combinação de uns e zeros.) Embora
não haja problema em usar uma variável projetada para conter valores maiores do que o necessá-
rio, ela consu1nirá mais memória. Alé.m disso, pode fazer com que seu progran1a seja executado
1nais lentamente porque teria de manter registros de seções maiores da 1nemória, mesrno que es-
sas nunca fossem utilizadas.
1 66 Dia 3
Tipo Tamanho
Abrangência Comentários
de Dado (Bytes)
Byte 1 O a 255 Um pouco limitado e, diferente dos ou-
tros tipos de dados inteiros; o Byte não
dá suporte a números negativos. Isso
acontece porque ele representa o valor
que o con1putador realmente arn1azena
en1 cada byte da me1nória. Para armaze-
nar números negativos, o computador
usa utna parte de cada byte para guardar a
porção 'negativa' . Útil quando se man-
têm registros de nú1neros pequenos que
nunca são negativos, como os dias de u1n
1nês ou os 1neses de um ano.
Curto 2 -32.768 Uma variável de inteiros pequena e práti-
(Short) a ca. Você pode usar u1n tipo curto sempre
32.767 que não precisar de todo o intervalo de um
tipo inteiro, por exetnplo, se estivesse es-
crevendo uin programa para contar a quan-
tidade de empregados de uma empresa que
só tivesse alguns miU1ares de funcionários.
Inteiro 4 -2.147.483.648 A variável de inteiros-padrão. En1 geral, o
(Integer) a inteiro é o tipo 1nais veloz de variável para
2.147.483.647 se usar, já que ele requer menos traball10
do con1putador. Utn en1prego para esse
tipo de variável seria registrar a quantida-
de de ovelhas da Nova Zelândia (aproxi-
1nadan1ente 47.394.000 em 1997).
Longo 8 - 9.223 .3 72.036. O tipo de variável perfeito para esta épo-
(Long) 854.775.808 ca en1 que estamos trabalhando com nú-
a meros 1nuito, n1uito grandes (isso
9.223.372.036.8 sign ifica -9 quintilhões a +9 quintiU1ões
54.775.807 ou aproximadan1ente 9 x 10 18 para a n1a-
nutenção de registros). Um tipo longo se-
ria útil se você estivesse annazenando a
quantidade de estrelas no universo (esti-
mada em cerca de 1022).
lembre da notação científica que aprendeu na escola, o número sobrescrito acima do algaris1no
1Oé a quantidade de vezes que é preciso 1nultiplicar por 10 (se positivo) ou dividir por 1O(se ne-
gativo). Portanto, 106 é l O seis vezes ou 1.000.000, e l o·6 é igual a 0,000001.
Tipo Tamanho
Abrangência Comentários
de Dado (Bytes)
Simples 4 - 3 402823 x 1O'~a Não se preocupe muito co1n o ta-
' 5
(Single) - 1,401298 X 10"' manho desses nú1neros do interva-
para números negativos; lo. O tipo si1nples pode manter o
1,401298 x lO"'s a registro de números 1nuito grandes
3,402823 x l0 3i (ou muito pequenos). O importante
para nú1neros positivos para este tipo de dado é a precisão.
O nome 'sirnples' quer dizer que
este tipo de variável é para nú,neros
con1 ponto flutuante de prec;são
sin1ples. Esse é o significado do jar-
gão da infom1ática: "Ele só é real-
mente bom para am,azenar sete
dígitos in.1po1tantes". Examine cada
urn dos números do intervalo.
Observe que possuem um nún1ero
antes da casa deci1nal e seis a se-
guir, mais o expoente (o número
aci1na do algarismo IO). Portanto,
embora o tipo si1nples seja bom
para armazenar tanto números
grandes quanto pequenos, não é tão
preciso quanto os outros, e poderia
causar e1Tos de an·edonda1nento se
você fizesse n1uitos cálculos com
valores realmente altos ou muito
baixos. O tipo de variável simples
seria útil em u1n progra1na em que
menos exatidão fosse necessária.
Duplo 8 - 1,7976931348623 l X O tipo duplo é uma variável de
(Double) 10308 a-4,94065645841247 'ponto flutuante com precisão du-
x 10··12• para nútneros nega- pla', portanto, armazena duas ve-
tivos; 4,94065645841247 zes mais dígitos significativos que
12
X 10· •a) ,79769313486232 o tipo sin1ples ou 15 casas deci1na-
x 10308 para nú1neros is. Use um tipo duplo sempre que
positivos você fizer cálculos com números
grandes ou quando quiser evitar os
erros de arredonda1nento que podem
acontecer no tipo si1nples, como ao
efetuar cálculos em aplicativos cien-
tíficos ou de engenharia.
168 Dia 3
Strings e Caracteres
Os números são adequados se você precisa annazenar quantidades ou espaços de te1npo, mas
con1 freqüência também é necessário lidar com palavras na programação. O Visual Basic .NET
fornece variáveis para annazena1nento de strings: os tipos de dado Char e String. O tipo Char é
apropriado para o annazenan1ento de apenas u1n caractere (daí o norne), enquanto o tipo String
pode conter strings de co1nprimento 1naior. A Tabela 3.3 descreve os dois tipos de dados co1n
mais detalhes.
Tipo Tamanho
(Bytes) Abrangência Comentários
de Dado
Char 2 Um caractere Adequado para armazenar um único carac-
tere.
String 10 + 2 Até dois Use um tipo String para annazenar aquele
por bilhões de romance que sen,pre quis escrever. Se esti-
caractere caracteres ver calculando cinco caracteres em média
por palavra e 250 palavras por página, sai-
ba que uma única variável alfanumérica
pode conter 1,7 1nilhão de páginas de texto.
Por que cada tipo Cha r e cada caractere de um tipo String ocupa1n dois bytes? Afinal , há apenas
25 caracteres usados no idio1na português, alén1 dos n(nneros e símbolos-decerto, você não pre-
cisa de dois bytes (65.536 valores possíveis). Não precisaria, se todas as linguagens empregas-
se1n o mesmo conjunto de caracteres.
Novo TERMO O cenário é o que o conjunto de caracteresASC// (ou ANSI), popular no passado, de-
finiu. E111 ASCll, wn byte é igual a u1n caractere, e todos os con1putadores que usa-
van1 essa linguagem sen1pre dispunham os mesinos caracteres na mesma posição da lista.
Portanto, o valor 65 e1n ASCif era sempre a letra 'A', e o sín1bolo '@' possuía valor igual a 64. Se
você quisesse fazer o 1nesmo com todos os outros símbolos que as pessoas usam na escrita, no en-
tanto, precisaria de 1nais caracteres. Para resolver esse problema, um novo sistema fo i desenvolvi-
do, chamado Unicode.
No Unicode, cada caractere é representado por dois bytes. Isso pennite o armazena1nento de to-
dos os caracteres da lista ASCII, bem como os dos idio1nas russo, grego, japonês e tailandês, os
dos matemáticos e assim por diante. E1n Unicode, 65 ainda representa a letra ' A' , 1nas 8800 é o
caractere Imi . O caractere japonês Hiranaga "ID'>}• ('não') é representado por 12398. O Visual
Basic .NET usa os valores Unicode para todos os caracteres, po1tanto o tipo Cha r usa do.is bytes,
e cada caractere de u1n tipo String acrescenta dois bytes de espaço co1nple1nentar de annazena,.
mento.
Introdução à Programação com o Visua l Basic .NET 69
Tipo Tamanho
Abrangência Comentários
de Dado (Bytes)
Booleano 2 Verdadeiro Se está annazenando apenas verdadeiro ou
(Boolean) (True) ou falso falso, para que dois bytes? O Visual Basic
(Fa 1se) tem usado tradicionahnente Oe - 1 para falso
e verdadeiro. Definir esses dois valores re-
quer dois bytes.
Data 8 1° de janeiro Esta variável pode conter a maioria das datas
(Date) de 100 a 31 de com as quais você lidará (a menos que seja
deze,nbro de um hjstoriador ou geólogo). Ela tambén1 se-
9999 gue todas as regras do calendário (co1no adi-
cionar u1n dia em anos bissextos), po1tanto,
se acrescentannos 1 ao valor '28 de feverei-
ro de 2000' da variável de data, obteren1os
'29 de fevereiro de 2000', ,nas se fizennos o
1nes1n.o para '28 de fevereiro de 2001 ', ares-
posta será ' 1º de n1arço de 2001 ' . A única li-
1nitação efetiva da variável de data é seu
ta1nanho.
Você poderia usar outro tipo de dado para armazenar datas como strings ou in-
NOTA teiro representando o período em dias após alguma data específica.
Declarando Variáveis
Agora que você conhece os tipos de variáveis disponíveis, co1no criá-las em seus progra,nas? A
1naneira 1nais sitnples é com a palavra-chave Oi m (abreviatura de 'Dimensão'), seguida pelo
no1ne da variável, a palavra-chave As e, por fi1n, pelo tipo da variável. A aparência é a seguinte:
Dim iAl gumNumero As Integer
Isso criaria a nova variável i Al gumNumero, que possui quatro bytes e pode an11azenar u1n nú1nero
com um ta,nanho aproximado a 2 bilhões. Veja algumas declarações de variáveis possíveis:
70 Dia 3
Arrays
A capacidade de uma variável de annazenar qualquer coisa é prática e até rnesrno essencial em
progra1nação. No entanto, você pode precisar armazenar vários itens relacionados. Por exernplo,
se estivesse escrevendo urn prograrna de jogo de xadrez, os quadrados do tabuleiro precisariam
ser representados co1no um conjunto de itens relacionados. Use os arrays para criar variáveis
que annazene1n juntos todos os itens relacionados. No programa do jogo de xadrez, o tabuleiro
provavelmente seria armazenado como um array de posições, cada un1a contendo o tipo de peça
(ou nenl1uma) dessa posição. Se não fosse usada u1na variável de array, teriam de ser e1nprega-
das 64 variáveis separadas. Tambén1 pode ser preciso 1nanter o registro de urna lista de strings,
por exernplo, dos no1nes dos alunos de uma sala. Se1npre que for 11ecessário ar1nazenar uma lista
de itens, use um array.
Como na declaração das variáveis si1nples, a de urn array é feita con1 a palavra-chave Oi m. No
entanto, há algu1nas diferenças entre declarações de variáveis siinples e declarações de arrays
porque esses são conjuntos de variáveis. A Listagem 3.1 mostra três 1naneiras possíveis de de-
clarar arrays.
ANÁLISE No primeiro exemplo, i Va 1ues foi declarada como un1 array de três me,nbros. To-
dos os itens do array são inteiros (I nteger). Tudo faz sentido. A pa1te potencialmen-
te confusa está na 1naneira usada para fazer referência a cada 1ne1n bro do array. lsso é mostrado no
laço For ... Next que vai da linha 5 à 7 (abordare,nos o laço For ... Next no próxi1no capítulo).
Observe que os três membros do array estão numerados de Oa 2. Portanto, o segundo tnembro do
array está na posição l, e não 2.
NOTA
- Vale a pena ressaltar que os computadores, diferente das pessoas, sempre co-
meçam sua contagem com o zero. É melhor deixar a verdadeira razão disso
nos recônditos de suas minúsculas mentes de silicone, mas precisamos estar
conscientes desse detalhe, principalmente no que diz respeito a arrays.
O segundo array criado, co1n os 1neses do ano, foi declarado e inicializado. Exatamente cotno
você pode inicial izar variáveis si1nples quando as declara, é possível fazer o 1nesmo co,n arrays.
Nesse caso, no entanto, coloque cada ele1nento do array em uma lista delimitada por vírgulas,
envolvida e1n chaves, cotno 1nostrado na linha 16. Isso criará um array de 12 membros, com cada
ele1nento contendo u1na string. Le1nbre-se, contudo, de que se quiser se referir a cada um, eles
estarão nun1erados de O a 11 - portanto, sMonths(lO) seria "Nov" , e não "Out".
A últi1na declaração é de Lnn array dina1nica1nente di1nensionado. Esse array pode depois serre-
di1nensionado para o tamanho correto com a palavra-chave ReDim co1no 1nostrado na linha IO.
Co1no nos outros tipos, os itens do array dinâ1nico estão nun1erados de zero a I menos 1. Depois
que o array for dimensionado, você poderá usá-lo co1no qualquer outro. Esse tipo de declaração
é útil se o ta1nanho do array depender do valor de outra variável, portanto, isso não seria conheci-
do até o te1npo de execução.
72 Dia 3
Tenho repetido o fato de que todos os arrays começam com O no Visual Basic
ALERTA .NET porque, anteriormente, o Visual Basic podia não ser operado dessa ma-
neira. Em suas versões anteriores ao Visual Basic .NET, você poderia usar a de-
claração Opt i on Base 1 no início de um módulo para assegurar que todos os
arrays criados nele começassem em 1. De modo alternativo, ao declarar ar-
rays, seria possível definir os membros inicial e final do array, como será mos-
trado na declaração a seguir. Nenhuma dessas opções está disponível para os
arrays do Visual Basic .NET.
Portanto, a linha de código a seguir não é válida no Visual Basic .NET:
Oim sngValues(l5 To 5l)As Single
Atribuição
A atribuição foi simplificada no Visual Basic .NET. Versões mais antigas do Visual Basic (Vi-
sual Basic 4.0 a 6.0) possue1n duas 1naneiras diferentes de atribuir urn valor a urna variável -
uma para variáveis si1nples (incluindo estruturas e arrays) e outra para variáveis de objeto. Feliz-
rnente, os desenvolvedores do Visual Basic .NET decidirarn rernover o 1nétodo de atribuição
usado para as variáveis de objeto e ernpregar apenas o utilizado para variáveis simples. Você vai
atribuir valores às variáveis (simples ou de objeto) colocando-as à esquerda de um sinal de igual-
dade, como mostra o código a seguir:
iSomeVar =1234
oObjectVar =New Something()
Constantes
As constantes são outra classe de valores que você pode usar em seus programas do Visual Basic
.NET. Constantes são valores que não se alteram nunca ou durante a vida útil de seu progra1na.
Por exernplo, os meses de u,n ano, o valor de pi e o servidor de banco de dados a partir do qual
seu progran1a recupera dados, todos são valores constantes. E' possível definir u1n valor co1no
constante quando ele for declarado. Qualquer tentativa de alterar o valor de urna constante será
assinalada corno um erro enquanto você ainda estiver no IDE (lntegrated Developrnent Environ-
rnent) e antes de tentar executar o aplicativo. As constantes são declaradas usando-se as duas for-
mas mostradas no código a seguir:
Introdução à Programação com o Visua l Basic .NET 73
ANÂLISE Se o tipo da constante não for descrito e1n u1na declaração, o co1npilador terá de usar
o tipo de valor que meU1or se encaixar. No entanto, ele ne1n se1npre seleciona orne-
lhor tipo possível. E1n geral, quando constantes são declaradas, se o tipo do valor não é incluído, o
Visual Basic .NET cria os tipos de variáveis a seguir:
Defina o tipo que quiser quando declarar constantes, exatamente como faz
NOTA com as variáveis.
NOTA Por que essa confusão de um, dois e três caracteres? Tenho de admitir que al-
terei os prefixos que uso com o passar dos anos. Minha filosofia básica era ori-
ginalmente empregar só um caractere, para limitar a desordem que os
prefixos causam. No entanto, alguns deles só iriam provocar mais conf usão.
Por exemplo, qual seria o tipo de dado de sVa1ue? Poderia ser o curto (Short), sim-
ples (Si ngl e) ou String. Para tipos de dados que começam com a mesma letra, es-
tendi o prefixo em alguns caracteres. Devo admitir, contudo, que ainda tendo a
usar a letra s para strings porque tem sido empregada com f reqüência. (Você
tem de fazer alguns sacrifícios para evitar a síndrome do esforço repetitivo.)
Quando começar a usar esses prefixos, você pode achar que são um pouco
confusos. No entanto, eles logo se tornam familiares, e as informações que
fornecem são inestimáveis.
Cálculos Simples
Apenas
,
ter alguns valores definidos não produz um programa. Você precisa fazer algo com eles.
E necessário efetuar cálculos 1natemáticos com os valores ou gerar algo mais substancial. De
1naneira se1nelhante, para tornar seus programas mais compreensíveis, co1n freqüência será pre-
ciso usar ou criar procedimentos. O Visual Basic .NET fornecerá alguns deles; outros terão de
ser escritos. Esses proceditnentos vão de operadores, que executam muitos dos cálculos 1nate-
máticos comuns, a funções n1ais co1nplexas que poderiam afetar strings ou nú1neros.
Introdução à Programação com o Visua l Basic .NET 75
Usando Operadores
No Visual Basic .NET, os operadores executam cálculos simples e ' funções' se1nelhantes. A
maioria dos operadores deve ser fa,nifiar a você como símbolos algébricos comuns. No entanto,
alguns deles são exclusivos da progratnação. A Tabela 3.6 lista os operadores mais usados.
Funções Internas
Além das fornecidas pelo .N.ET Framework, o Visual Basic .N-ET possui 1nuitas funções inter-
nas. Essas funções gera,n vários recursos úteis, incluindo a conversão de um tipo de dado em ou-
tro, cálculos rnatemáticos, rnanipulação de strings e asshn por diante. Você deve conhecer
algu1nas delas para poder prosseguir com o estudo do Visual Basic .NET.
76 Dia 3
Funções de Conversão
Algumas das funções rnais irnportantes disponíveis no Visual Basic .NET são as de conversão.
Elas pennitem que u1n tipo de dado seja convertido em outro. As funções de conversão se torna-
ra1n ainda n1ais importantes nessa versão do Visual Basic porque ela é n1uito mais restrita com
relação aos tipos de dados, e não converte auton1aticarnente um tipo ern outro corno as anteriores
fazia,n.
ALERTA
- Se você quiser que o Visual Basic .NET converta de modo automático os tipos
de dados, poderá desativar a verificação restrita de tipos adicionando Option
Strict Off no início de seus arquivos. É bom saber, no entanto, que isso pode-
ria levar a resultados inesperados em seu código (ou seja, erros) se o Visual
Basic .NET converter uma variável quando essa operação não for esperada.
Todas as funções de conversão do Visual Basic .NET co1neça1n com a letra 'C' (como na palavra
conversão) e tennina1n corn urna fonna abreviada do novo tipo. Alé1n disso, há tuna função ge-
nérica, Ctype, que pode efetuar conversões para qualquer tipo. A Tabela 3.7 descreve as princi-
pais fu nções de conversão.
Função Descrição
CType Converte para qualquer tipo. E' un1a função poderosa que permite a conversão
de qualquer tipo de dado e1n outro. Po1tanto, a sintaxe dessa função é u1n pouco
diferente das outras.
Rtrim Ren1ove todos os espaços que suce- sVal ue = Rtrim{ " Olá Mundo ")
de,n unia string
'sValue é igual a " Olá Mundo"
Trim Remove todos os espaços que antece- sValue = Trim(" Olá Mundo ")
detn e sucedetn u1na string
'sVa 1ue é igual a "01 á Mundo"
,
Outras Funções Uteis
Finalizaremos com algu,nas funções geralmente úteis que não se enquadran, nas outras categorias.
Aqui encontrare1nos as que pennitem a detem,inação do tipo de u1na variável , assi1n como fun-
ções de manipulação de datas. A Tabela 3.9 descreve algumas dessas funções.
Função Descrição
IsArray Retorna True (verdadeiro) se o parâmetro for uni array.
IsDate Retorna True se o parâtnetro for reconhecido co,no uma data.
I sNumeri e Retorna True se o parâmetro for reconhecido como um número.
I sObj ect Retoma True se o parâmetro for alguni tipo de objeto.
TypeName Retoma o nome do tipo de dado do parâ1netro, por exe,nplo, TypeNa-
me(sName) retornaria "String ".
I ªº Dia 3
Função Descrição
Now Retorna a data e a hora atual.
Today Retorna a data atual, co1n a hora configurada co1no 0:00:00 a.m.
(n1eia-noite).
Sub-Rotinas
U1na sub-rotina é um bloco de código do Visual Basic .NET que executa algu1na tarefa - por exe1n-
plo, o 1nétodo Cansol e .Wri tel i ne que você vê e1n n1uitos dos exen1plos. Ele exibe informações na
tela, mas não retorna nenhum valor. Use as sub-rotinas para executar tarefas e1n seus prograinas.
Em geral é aconselhável inserir en1 uma sub-rotina um código que será executado mais de uma
vez. De maneira sen1elhante, se tiver de usar u1n código em vários aplicativos, é bom que trun-
bé1n o coloque em u1na sub-rotina. As sub-rotinas pennitem que um pequeno trecho de seu pro-
gra1na seja isolado, de 1nodo que, en1 vez de repetir todo o bloco de código, só seja preciso
referenciá-lo pelo nome. Isso não significa que a sub-rotina sempre executará exata1nente as
mesmas etapas, mas que realizará algu1na tarefa. Por exe1nplo, um receita pode instruir, "Adicione
u1na porção de vinagre a três de óleo". Em um 1nomento pode-se misturar uma xícara de vinagre
a três de óleo, enquanto em outro, podem ser so1nente três colheres de sopa de vinagre para nove
de óleo. De qualquer 1nodo, foi executada a sub-rotina CrieVinagrete. Siln, estou cozinhando o
jantar enquanto escrevo isso.
Para criar suas sub-rotinas, use a palavra-chave Sub:
Nessa sintaxe, cada parâ1netro define um valor que ten1 de ser passado para a rotina.
A Listagem 3.2 mostra a declaração e o uso de uma sub-rotina.
Introd ução à Program ação com o Visual Basic .NET 81
ANÁLISE Nossa sub-rotina começa corn a palavra-chave Sub, como vemos na linha 1. A
sub-rotina se chama ShowMessage e usa um parâmetro quando é chamada. Ela tern1i-
na com a palavra-chave End Sub (linha 3). No interior está o código real executado pela sub-rotina.
Nesse caso, ela apenas exibe o conteúdo do parârnetro na janela do console. A linha 4 mostra uma
maneira possível de chamar a sub-rotina, passando a string "01 á Mundo do Vi sual Basi e . NET" .
Funções
Criar suas funções pennitirá que você insira novos recursos em seus aplicativos. Gerar uma fun-
ção é semelhante a definir novas sub-rotinas, exceto por ter de ser definido o tipo de valor retor-
nado. Dentro do procedi1nento, identifique o valor a ser retomado, como mostrado abaixo:
SINTAXE Funct ion Nome Função (Parãmetrol As Type , ... ParametroN As Type) As TipoRe -
tornado
'I nsi ra o que quiser aqui
Return ValorRetornado
End Funct ion
Nessa sintaxe, cada parâmetro defme um valor que terá de ser passado para a rotina;
TipoRetornado é o tipo de dado que a função retorna, e ValorRetornado, o valor que
será retomado pela ft.1nção. A Listagem 3 .3 mostra a declaração e o uso de uma fun-
ção simples.
Escopo
Novo TERMO
Escopo é u1na dessas palavras adoráveis do jargão da informática que significa
"Quem mais pode me ver?". Formaln1ente, o escopo define a visibi lidade das variá-
82 Dia 3
veis de un1 progra1na, isto é, que rotinas poderiam usar uma certa variável. Você pode não querer
que todas as rotinas acessem todas as variáveis. Pennitir que todas as rotinas conheça,u todas as
variáveis poderia levar u1na rotina a 'acidentalmente' alterar o valor de uma variável, introduzin-
do u1n erro em seu progra1na.
Até agora, te1nos em geral declarado as variáveis por meio da palavra-chave Oim dentro dos pro-
cedimentos. No entanto, você ta1nbé1n pode declarar as variáveis externamente para torná-las
disponíveis a vários procedimentos. Se fizer isso, poderá usar duas outras palavras-chave, Pu-
bl ice Private:
• As variáveis Pub li e fica1n disponíveis e1n todo o aplicativo. Elas são variáveis globais,
que existe1n global,nente, ou, por todo o aplicativo. Deven1 ser usadas parci1noniosa1nen-
te, mas serão úteis quando você precisar de algu1n valor que será e1npregado en1 muitos
pontos de seu progra1na, co1no a conexão a um banco de dados, ou um arquivo.
• As variáveis Pri vate fica1n disponíveis no 1nódulo ou classe onde são declaradas. Elas
são usadas co1n freqüência em aplicativos quando se precisa de tuna única variável que
possa ser empregada e1n vários procedimentos. Criando-a con1 a palavra-chave Pri vate,
estaremos pennitindo que todos os procedin1entos de u1n módulo ou classe acesse1n ava-
riável. As variáveis Priva te são úteis para compa11ilhar infonnações con1uns necessárias
a uma tarefa, como um valor intermediário que possa ser utilizado por funções diferentes
para executar um cálculo.
D I CA
-- Quando for criar uma variável, é bom declará-la o mais próxim o possível de
onde ela for necessária. Se você só for usar uma variável em um procedimen-
to, declare-a dentro dele.
Use as variáveis Private e Publ ic no nível de módulos com moderação.
O Escopo e os Procedimentos
Exatarnente co,no as variáveis podem ter um escopo, os procedimentos (sub-rotinas e funções)
ta1nbén1 possuem u,n. O escopo para os proceditnentos significa o mes1no que para as variáveis:
Introdução à Programação com o Visua l Basic .NET 83
ele descreve em que outro local de seu programa você pode usar o procedimento (ou fora de seu
progra1na, como veremos quando começarmos a criar objetos).
O escopo do procedimento é definido com o uso das mesmas palavras-chave empregadas para o
das variáveis. E1n geral, ele também possui o 1nes1no significado.
• Pub 1i c O procedilnento pode ser chrunado de qualquer parte do aplicativo. Esse é o
padrão se você não adicionar nenhuma outra palavra-chave.
• Pri vate O procedimento só pode ser cha,nado a partir de outro que esteja situado
dentro do mes1no 1nódulo ou classe onde foram definidos. Isso será útil quando você esti-
ver escrevendo várias rotinas de suporte usadas no decorrer de um cálculo, n1as as outras
não precisariam usá-lo.
Do 1nes1no 1nodo que co1n as variáveis, as palavras-chave adicionais de escopo serão aplicadas
quando você estiver criando objetos no Visual Basic .NET. Exa1ninare1nos essas palavras-chave
posteriormente.
1 InvestCalc .exe
2 Saldo Inicial: 10000
3 Juros Anuais (por exemplo, para 5%, insira 5):5
4 Depósito Mensal: 200
5 Período do Investimento em Anos: 30
6
7 Se você começar com US$10.000,00
8 e investir US$200,00 por mês
9 durante 30 anos
10 a 5% de juros.
11 Seu saldo final será: $211.129,17
Aqui vernos o resultado de se começar com utn saldo de US$ l 0.000 adicionando US$200 por
mês durante 30 anos, con1 juros fixos de 5 o/o.
l ª4 Dia 3
O progra1na requer que o usuário insira os quatro valores (Sal do Inicial , Juros Anuais, Depôs i -
to Mensal e Período do Investimento em Anos). Por sua vez, ele calculará o saldo final. Essa
operação é conJ1ecida co1no cálculo do valor futuro (FV), e o Visual Basic .NET a inclui co1no
uma de suas funções internas. A fórrnula do Valor Futuro é
FV = OepositoMensal *((l + JurosMensais) A Meses - 1)
.,. /JurosMensais )+ Saldolnicial * ( 1 + JurosMensais) A Meses
As etapas a seguir descrevem esse procedirnento para que você possa compreender 1nelhor como
funciona:
1. Comece criando um novo projeto no Visual Basic .NET. Selecione u1n novo aplicativo
do console. O visual Basic .NET criará um projeto com um n1ódulo.
2. Feche a janela do arquivo e o reno1neie usando o Solution Explorer. Dê u1n clique com o
botão direito do 1nouse no non,e do arquivo, Modu l el. vb, no Solution Explorer e selecio-
ne Rena,ne. Altere o no1ne do arquivo para mod I nves t. vb.
3. Altere o nome de Sta1iup Object ta1nbé1n. Dê um clique co1n o botão direito do 1nouse no
projeto do Solution Explorer e selecione Properties. Na página General, altere o Startup
Object para Invest. Ele deve estar na lista suspensa.
4. Você está pronto para co1neçar a codificar. Precisa de ao menos quatro variáveis para ar-
1nazenar a entrada do usuário. Declare-as co1no n1ostra a Listagem 3.5. A maioria desses
valores é de números de ponto flutuante, co1n exceção de Peri odo. Essas declarações de-
vem ocorrer entre as linhas Module e Sub Ma i n ( ) porque as variáveis estarão no nível do
1nódulo.
5. Use a rotina Ma i n para cha1nar as rotinas de obtenção das entradas do usuário, execução
dos cálculos e exibição do resultado, como na Listagem 3.6.
7 i Periodo,_
8 decOepositoMensal,
9 decSaldolnicial)
10 ' exibicao do resultado
11 DisplayResults(decResultado)
12 End Sub
Na Listagem 3 .7, cada função principal do aplicativo é un1a sub-rotina ou função separa-
da. Isso pennitirá que você altere mais rapidarnente as técnicas para obter as entradas ou
exibir o resultado posteriormente.
6. Adicione o código da Listagen1 3.7 para pennitir ao usuário inserir informações. O pro-
cedi,nento não usa nenhum parâmetro, nem retorna urn valor. Já que esse é u,n aplicativo
do console, você e1npregará a rotina Console. Read para obter valores.
Observe que a sub-rotina GetinputVa l ues chama a função GetVa l ue. Esse é um exemplo da cria-
ção de rotinas de suporte. E1n vez de reescrever o código para sol icitar inforn1ações ao usuário
várias vezes, isole-o e crie um procedi1nento para executar a tarefa. Dessa 1naneira, o código re-
sultante para GetinputVa l ues será simplificado.
86 Dia 3
7. Escreva a rotina que exibirá a saída quando for calculada. No final , ela poderá ser exibida
em uma janela, rnas por enquanto, use o procedi1nento Console. Wri tel i ne, mostrado na
Listagem 3.8, para exibir as infonnações. Esse procedimento deve pegar o valor a ser
exibido e não retornar nada.
Essa é u1na rotina simples, co1nposta de várias chamadas a Console. Wri tel i ne para exi-
bir os valores inseridos e o resultado do cálculo.
8. Execute a cálculo do valor futuro. Essa rotina deve usar os quatros valores co1no parâ1ne-
tros e retornar o resultado do cálculo. Como possui um valor de retorno, esse procedi-
1nento é uma função. A Listagem 3.9 1nostra a função CalculateFV.
Exatamente co1no em Get I nputVa l ues, você poderia ter isolado o código que calculou o valor de
decTemp. No entanto, já que só precisamos desse cálculo nessa rotina e é bem provável que ele
não seja mais necessário, foi melhor não fazê-lo.
A Listagem 3. l O mostra o código completo para o exen1plo do aplicativo.
9. Execute o aplicativo. O resultado deve ser semelhante ao 1nostrado no início desta seção.
Você pode executar o aplicativo a partir do IDE dando um clique no botão Play da barra
de ferramentas. No entanto, é provável que a janela exibida desapareça 1nuito rapida-
1nente para que se possa ver a resposta. Em vez disso, execute o progra111a a partir do
pron1pt de co,nando processando o executável criado.
Você pode tentar fazer tuna experiência surpreendente co,n esse progra1na de cálculo. Insira os va-
lores dos depósitos que representa,n quanto você costuma gastar e1n un1 hábito n1ensal (almoço no
trabalho, cigarros, dispositivos eletrônicos). O valor futuro resultante etn geral é perturbador.
Resumo
A lição de hoje avançou bastante, exan1inando os diversos tipos de variáveis que você pode criar
no Visual Basic .NET e como empregá-las. Alé1n disso, explorou o conceito de fu nções e
sub-rotinas, tanto as que estão embutidas no Visual Basic .NET quanto as que podetn ser criadas.
Esses dois tópicos são fundamentais para sua co1npreensão do Visual Basic .NET e serão usados
ern todos os tipos de aplicativo.
Introdução à Programação com o Visua l Basic .NET 89
P&R
P Li que o Visual Basic .Net dá suporte à programação ' sem tipos'. O que é isso?
R Quando você declara o tipo de uma variável ou função, define ceitas regras: que espécie
de informações ela representa, onde pode ser usada e assim por diante. A prograrnação
sern tipos ocorre quando o tipo não é declarado. Todas as variáveis são, então, objetos
que podem conter qualquer tipo de infonnação. O Visual Basic .N-E T é o único men1bro
da fa,nília Visual Studio que dá suporte a esse tipo de progra1nação.
P Quando quiser criar um procedimento, ele deve ser uma sub-rotina ou uma função?
R Uma resposta breve seria, "Depende". Você deve criar o tipo de procedimento que forne-
ça a funcionalidade necessária. Alguns são óbvios. Se for preciso gerar u,n procedimento
que execute alguns cálculos ou ,nanipulações e retorne o resultado, é bom usar uma fun-
ção. Outras rotinas - aquelas que pode1n ou não ter de retornar u1n valor - efetiva1nente
leva,n a uma escolha. Além disso, não há escolha correta, apenas preferências. Se for
evidente a inexistência de um valor a ser retomado, selecionar qual tipo de procedimento
será criado é uma questão de opinião pessoal e/ou e,npresarial. Algun,as pessoas e em-
presas se1npre usa1n funções; outras cria1n sub-rotinas quando necessário.
P Como posso encontrar a lista de todas as funções internas?
R Há duas ,naneiras pelas quais você pode encontrar informações sobre as funções internas:
• Ajuda on-line A ajuda on-line conté,n descrições e exemplos de código de todas as fun-
ções internas. Você pode encontrá-los (on-line) procurando por Visual Basic Language
Reference.
• Object Browser Se tudo que você precisa é de uma descrição breve de uma função in-
terna, poderá encontrá-la no Object Browser. Abra-o selecionando View, Other Win-
dO\VS e Object Browser. As funções internas se encontra,n na seção Microsoft. VisualBa-
sic.dll.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e,n co,no colocar seu conheci,nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
90 Dia 3
Teste
1. Como devo decidir que tipo de variável usar quando estiver trabalhando com n(uneros?
2. Qual a maneira correta de chamar esta sub-rotina?
Function RaiseToPower(ByVal Number As Integer, ByVal Power As Integer)As
Long
A: Dim l Value = RaiseToPower(3,4)
B: RaiseToPower 3,4
C: Console.Writeline(RaiseToPower(3,4))
O: Dim lValue =RaiseToPower 3,4
3. Se u.ma variável for declarada com o uso da palavra-chave Priva te, onde poderá ser usa-
da e1n u1n progra1na?
Exercícios
1. Reescreva o exe1nplo do aplicativo para cálculo do valor futuro de modo que represente
o pagamento de um e1nprésti1no em vez de um investimento. Ele deve solicitar a quantia
do empréstimo, os juros anuais, o período e1n 1neses e calcular o valor de seus pagamen-
tos. A fór1nula para esse cálculo é
Pagamento= QuantiaEmprestimo * (JurosMensais * ((1 + JurosMensais) A
DIA
por causa do valor de algumas variáveis ou outra circunstância, permitindo q11e o programa aja
diferente,nente dependendo da situação. A necessidade desse tipo de comportamento é evidente
quando você percorre a maioria dos progra1nas que usa1n pseudocódigo.
Novo TERMO
Quando descrevemos um problema por meio de uina linguage,n que é algo entre
nossa maneira habitual de falar e códigos de co1nputador, cha1na1nos essa descrição
'quase em código' de pseudocódigo. Esta lição fornece vários exemplos do uso desse tipo de lin-
guage,n para descrever o que seus programas devem fazer. Muitas pessoas, incluindo os autores
deste livro, acham essa maneira útil para planejar o fluxo de seus programas de u,n ,nodo que lei-
gos tan1bém possa1n co1npreender. Pode ser 1nuito 1nais fácil descrever wn progra1na inteiro em
pseudocódigo antes de con1por o código real (isso se tornará excessivamente i1npo1tante quando
você lidar co1n programas mais co,nplicados).
Por exe1nplo, considere1nos um código que consistiria apenas em un1a pequena parcela de um
aplicativo, a saudação na hora da conexão. Usando a linguage,n co,num para descrever o que
esse código faz, você poderia dizer, "Dá as boas-vindas ao usuário que iniciou o progra1na, usan-
do a saudação apropriada dependendo da hora do dia". Para un1 trecho tão pequeno de código,
essa provavelmente seria a descrição integral fornecida, e a codificação poderia ser iniciada exa-
tamente nesse ponto. Co1n relação a essa tarefa específica, o pseudocódigo poderia ter a aparên-
. .
c1a a seguir:
Quando o programa for iniciado ...
A Instrução I f
A instrução de controle I fé a 1nais simples, e é a mais co1nu.1n em quase toda linguagem de pro-
grainação. Ela possui vários fonnatos diferentes, 1nas basica1nente tem a seguinte aparência:
If <condição >Then
Código a ser executado se a condição for verdadeira
End If
A <condição> é a parte essencial dessa instrução; ela determina se o bloco de código interno será
executado ou não. Essa condição toma a fonna de u1na expressão, que é uma combinação deva-
lores e operadores aval iada no tetnpo de execução para gerar utn único valor. Já que a instrução
Controlando o Fluxo dos Programas
I f dá suporte a apenas duas ações possíveis - o código é executado ou não-, a expressão só deve
ter dois valores. Isso significa que qualquer expressão usada como u1na condição te1n de apre-
sentar u1n resultado definitivo " si1n ou não" (Verdadeiro ou Falso), como estes exen1plos:
• Esta1nos e1n um horário antes do 1neio-dia.
• Estamos e1n utn horário depois do 1neio-dia, porém antes das 6 da tarde.
• A quantidade de alunos excede à de cadeiras.
Cada uma dessas expressões é verdadeira ou não. Não há meio tenno e, portanto, elas se enqua-
dra1n co1no a condição de u1na instrução I f. Se você tiver algu1na dúvida sobre a confonnidade
de uma expre,s são etn particular, apenas teste-a no pseudocódigo. Por exemplo, considere estas
expressões:
• 3+5
• John
• Quarta-feira
Agora, teste u1na dessas expressões en1 seu pseudocódigo: "Se 3 + 5, então, encerre o progra-
ma". O que isso significa? A expressão "3 + 5" não te1n u1n resultado que possa ser avaliado
con10 verdadeiro ou falso e, portanto, a instrução I f não faz nenhum sentido. Expressões que re-
tornam verdadeiro ou fa lso são conhecidas co1no booleanas; abordarei esse assunto co1n mais
detalhes ainda nesta lição.
A seguir, iren1os voltar ao exemplo original do pseudocódigo, exibindo tnna saudação no i11ício
de um progra1na.
Quando o programa for iniciado ...
Você pode fazer o dov,rnload de Greeti ng. vb na página deste livro na Web e testá-lo. Para compilar
esse progran1a, e a maioria dos exen1plos desta lição, faça o download desse arquivo ou crie um ar-
quivo de texto, insira o código da Listagem 4.1 nele e, en1 seguida, salve-o como Greet i ng. vb. Vá
para o console de co,nando (promptdo DOS), use o co1nando cd (change directory, alterar diretório)
para se assegurar de que está trabalhando no mesmo diretório do arquivo Greeti ng. vb e co,npi le
o programa digitando vbc r: Syst em. dll t: exe Greet i ng. vb. O compi lador criará, por pa-
drão, u1n progra,na executável cotn o n1es1no no1ne do arquivo-fonte, portanto, nesse caso,
Controlando o Fl uxo dos Programas
tenninaremos co1n u1n arquivo novo, no 1nesn10 diretório, chamado Greeting.exe. A execução
do programa executável recém-criado produzirá o resultado apropriado, dependendo da hora do
dia em que ele for processado.
Para compreender n1elhor co,no essas três condições I f funcionaram, percorreremos o código e
examinare,nos o que aconteceu. Você poderia fazer isso dentro do IDE do Visual Studio, mas
usare,nos o papel para deixar todo esse esforço da máquina para mais tarde.
ANÁLISE A priJneira linha executada foi a 9, que inicializa a variável de data cotn a hora e data
atuais; e,n seguida, a linha IOsalva a hora atual em outra variável, i Hour. A pri1neira
instrução If é executada na linha 12. Nesse ponto, a expressão (i Hour < 12) é avaliada. A variá-
vel i Hour é igual ao valor da hora atual, que é 13 (de acordo com o relógio do sistema, para os fins
deste exemplo, apenas suponha que a décirna terceira hora é I da tarde). Agora, a expressão, que
foi reduz.ida a 13 < 12, será reduzida ainda mais para urn sin1ples valor booleano Fa l se (13 não é
menor do que 12, ao n1enos não pelo que aprendi em matemática). Portanto, u,n valor falso infor-
ma à instrução I f para não executar seu bloco de código, e o processame.nto imediatamente passa
para a Iinha 14, End I f . Essa instrução na verdade é apenas um espaço reservado, portanto, nada
acontece até a linha 15, a próxilna instrução I f . Nesse caso, a instrução I f , (i Hour >= 12) And
(iHour < 18),primeiroéreduzidapara (13 >= 12) And (13 < 18) e,e,n seguida, para True And
True (Verdadeiro e Verdadeiro). Quando co1nbinamos (And) dois valores booleanos, só consegui-
mos um resultado verdadeiro se ambos o forem , o que parece ser o caso aqui. Assi,n, a instrução
If tern1ina com un1a condição verdadeira, o bloco de código é executado (linha 16), e a tão esti-
mulante mensagetn Boa Tarde! é exibida no console. Agora, nosso progra,na executou todo o seu
trabalho; exibi,nos a mensagem correta para essa hora do dia. O código não encerrou sua execução,
no entanto; não há nada que o infonne que não há motivos para continuar, portanto, a execução
prosseguirá e111 End I f e, depois, na últi111a instrução da linha 18. Essa instrução te1n a expressão
(iHour >= 18) como sua condição, que se torna (13 >= 18) e termina como falsa. Felizmente a
execução passa para a últi,na instrução End I f na Iinha 20 e, e1n seguida, encerra o progra,na.
Estendendo a Instrução I f
Embora a Listagem 4.1 seja be1n direta e dece1to não é o prograrna mais complicado do mundo,
efetivamente levanta un1a questão: por que se preocupar com a execução de u1n código depois
que você tiver obtido sua resposta? .Esse é u1n bom ponto . .M.esroo que as linbas 18 a 20 da Lista-
ge,n 4. 1 fosse,n apenas algu,nas linhas adicionais de execução, poderia haver 1nuitas outras so-
brando no final de u1n progratna no inundo real. Nesse programa, a intenção era realmente passar
para a próxilna instrução I f , só se a atual fosse falsa. Poderia ter sido mais claro en11neu pseudo-
código escrevendo-o da maneira a seguir:
Quando o progr ama for i nic iado ...
Mais simples? Não, nen1 tanto, mas a Listagern 4.2 é mais eficiente que a 4.1. Nessa nova versão
da solução, depois que a saudação correta foi exibida, o programa foi encerrado. Nenhum código
desnecessário foi executado.
Nesse progra,na específico, aninhei outra instrução I f dentro de cada cláusula El se, para testar
mais u,na condição caso a anterior fosse falsa. Não é só utn código desse tipo que pode ser inseri-
do ern uma cláusula El se, mas como essas instruções I f aninhadas são freqüentes, o Visual Ba-
sic acrescentou 1nais uma 1nelhoria, a instrução El se! f. Essa instrução cornbina a funcionalidade
de El se, com a possibilidade de outra instrução I f ser aninhada ou aparecer imediatamente a se-
guir. Sua sintaxe é uma condensação do que você teria de escrever se usasse I f e El se. A seguir,
ve,nos a sintaxe de u1na instrução I f ern que a cláusula El se contérn outra instrução I f aninhada,
seguida pela sintaxe que seria usada com a instrução Eles I f:
If <condição #1> Then
bloco de código #1
Else
If <condição #2> then
bloco de código #2
End lf
End If
passa a ser
If <condição #1> Then
bloco de código #1
198 Dia 4
Esse conceito da linha única pode ser ampliado com a introdução de uma cláusula El se:
If iHour > 11 Then DoSomething() Else DoSomethingElse()
Ele pode até ser usado co1n mais de uma instrução a ser executada em blocos de código verdadei-
ros ou falsos (ou em ambos) já que instruções n1últiplas pode1n ser separadas com o uso de dois-
pontos, co1n.o na linha a seguir:
If iHour > 11 Then DoSomething() : DoMore() Else DoSomethingElse()
Incluí essa instrução 1nais para fins de con1ple1nentaridade do que por algu,na necessidade real.
Não há nada que você possa fazer com a instrução If em apenas uma linha que não seja possível
fazer co,n a fom1a habitual e1n bloco. Colocar todo o código em uma linha não fará co,n que seja
executado ,nais rápido. Tudo que se consegue, na n1aioria das vezes, é produzir um código-fonte
que ocupa rnenos espaço em disco e é tnuito mais difícil de entender. Ocasionalmente, essa ver-
são de linha única pode dar a seu código uma aparência melhor, como 1nostramos na Listage,n
4.4. Nessa listage1n, várias instruções I f foram necessárias, todas executando um código sim-
ples se suas condições forem verdadeiras. Essas situações são 1nuito raras parajustificar o uso de
outra sinta'<e ern uma instrução tão sirnples. Recomendo a adoção da outra fonna dessa instrução
para que não provoque1nos dores de cabeça e,n nossos colegas progra1nadores.
LISTAGEM 4.4 Instruções If em uma Única Linha Podem Dar ao Código uma
Aparência Melhor
1 If X=5 Then strChar = ''A''
2 If X=23 Then strChar = ''B''
1100 Dia 4
LISTAGEM 4.4 I nstruções If em uma Única Linha Podem Dar ao Código uma
Aparência Melhor (continuação)
Operadores de Comparação
O tipo 1nais comum de expressão usado ern programas é urna co,nparação, duas expressões não
booleanas com u1n operador no meio. Os operadores de co1nparação a seguir estão disponíveis
para sere1n usados em expressões:
.
• >, n1a1or que
• < , menor que
• =, igual a
• <>, diferente de
• >=, 1naior ou igual a
• <=, 1nenor ou igual a
Todos esses operadores funciona1n tanto com strings quanto com valores numéricos. Um opera-
dor de co1nparação adicional, Li ke, ta1nbém está disponível para verificar a correspondência de
padrões nas strings. O operador Li ke pern1ite que você co1npare u1na variável de string co1n pa-
Controlando o Fluxo dos Programas 101 1
drões que empregue,n caracteres especiais e comuns. Entre os caracteres especiais que podem
ser usados corn Li ke estão:
• *, para indicar a quantidade de caracteres adicionais
• ? , para representar um caractere
• #, para representar um dígito (0-9)
• Intervalos ( [a-g] ), por exe,nplo) para especificar que qualquer caractere dentro dele deve
ser considerado urna correspondência
Desenvolveremos u,n pequeno progra1na para testarmos a instrução I f e o operador Li ke. Esse
progra,na (veja a Listage1n 4.5) aceitará um valor de teste e um padrão como entradas e, e1n se-
guida, verificará se o valor de teste coincide corn o padrão.
Depois de inseri-lo e1n u,n arquivo de texto (ou fazer seu dov,nload) e compilar (vbc /t :exe Pat-
ternMatcher. vb), tente executar esse programa co,n várias entradas. Por exe,nplo, você poderia
usar um padrão co1no C*T e tentar testar valores como CAT, coat, ct e assi1n por diante.
Operadores Lógicos
O outro tipo de expressão que pode ser usada como booleana é a que emprega operadores lógi-
cos. Esses operadores trabalha,n co,n expressões ou valores booleanos e produze,n u1n resultado
1102 Dia 4
booleano. Já que os valores booleanos são n1uito se1nelhantes aos bits (valores binários, 1 ou O),
os operadores lógicos são freqüentemente chamados de coniparações bit a bit. Os operadores
dessa categoria são ANO, OR e XOR, que con1para1n dois valores ou expressões, e NOT, que usa um
único valor ou expressão booleana.
Ao usar o operador ANO entre dois valores booleanos, você só obté1n um resultado igual a verda-
deiro se os dois o forem. Co1n OR, se u1n dos valores for verdadeiro, então o resultado ta1nbé1n
será. O operador XOR, tainbétn chamado de exclusive OR, gera um resultado verdadeiro, se u1n dos
valores for verdadeiro e o outro for falso. NOT é ape11as u1n operador de negação: retoma o oposto
de qualquer valor que for usado co1n ele. A Tabela 4.1 lista todas as combinações possíveis de
valores e o que os diversos operadores lógicos produziriam em cada caso. En1 todos os exem-
plos, seria possível substituir os valores True (verdadeiro) e Fa l se (falso) por expressões que pu-
dessem ser avaliadas até chegar a um valor booleano.
Expressão Resultado
TRUE ANO TRUE TRUE
FALSE ANO TRUE FALSE
TRUE ANO FALSE FALSE
FALSE ANO FALSE FALSE
TRUE OR TRUE TRUE
TRUE OR FALSE TRUE
FALSE OR TRUE TRUE
FALSE OR FALSE FALSE
TRUE XOR TRUE FALSE
TRUE XOR FALSE TRUE
FALSE XOR TRUE TRUE
FALSE XOR FALSE FALSE
NOT TRUE FALSE
NOT FALSE TRUE
A disponibilidade dos operadores lógicos permite que você combine outras expressões e valores
para produzir expressões booleanas mais complicadas, como : I f X > 3 ANO X < 8 Then, ou I f
(((X+3) * 5) > {Y*3)) ANO (SystemlsRunning() OR iHour < 5) Then. Usaren1ososdoistiposde
expressões, de comparação e lógica, posteriormente em alguns exercícios envolvendo instru-
ções I f.
Controlando o Fl uxo dos Prog ram as
Avaliação Abreviada
De maneira setn.elhante ao resultado de uma eleição, o de utna expressão booleana em geral é co-
nhecido antes que ela tenha sido integralmente avaliada. Considere esta expressão booleana: (X
> 1) ANO (X <10). Se X for igual a 1, então, assiln que você avaliar o lado esquerdo da expressão
(obtendo fàlso), saberá que o direito é irrelevante. Devido à natureza da instrução ANO, não há ne-
cessidade de avaliar o outro lado. A expressão inteira será falsa, independentemente de que valor
for retomado pela outra extre1nidade. Chegaríamos a essa conclusão sem precisar pensar muito
ao avaliannos as expressões booleanas, rnas nem setnpre está tão claro para o computador.
Novo TERMO O co1nportan1ento que esperamos, não avaliando partes desnecessárias de un1a ex-
pressão, é chamado abreviação (short-circuiting), 1nas o Visual Basic .NET, por pa-
drão, não trabalha desse modo. Para fazê-lo abreviar uma expressão booleana, você precisa usar
forn1as alternativas dos operadores ANO e OR, ANOALSO e ORELSE. No entanto, não é bom apenas
confiar que ele se comportará dessa 1naneira; um programa simples de teste (veja a Listage1n 4.6)
pode ser usado para que examu1emos exatamente o que acontecerá.
Se a função Test ( ) retornar falso, co1no fez na Listagetn 4.6, então, você saberá o resultado da
expressão inteira apenas avaliando o lado esquerdo. A execução do código da Listage1n 4.6 pro-
duzirá só tuna linha de resultado, nesse caso, "Esquerda" . Se Test ( ) retornar verdadeiro, os dois
lados precisarão ser executados, e o progra1na exibirá tanto "Esquerda" quanto "Oi rei ta" . Para
testar o co1npo1ta1nento-padrão dos operadores booleanos, tente alterar ANOALSO para somente
ANO, e veja que resultado obteve.
104 Dia 4
Quando você começar a testar mais do que algumas opções possíveis, todas as diversas cláusulas
I f se tornarão excessiva1nente co1nplexas. Para 1nanipular o teste co1n tnúltiplos valores ou vários
conjuntos de valores, o Visual Basic incluiu a instrução Se l ect Case, que tem a sintaxe a seguir:
Select Case <variável ou expressão sendo comparada>
Case <valor ou intervalo de valores>
bloco de código
Case <valor ou intervalo de valores>
bloco de código
Case Else
bl oco de código
End Select
Controlando o Fluxo dos Programas
O uso da instrução Se l ect Case no lugar das instruções I f da Listage1n 4.7 produzirá o código
alternativo 1nostrado na Listagem 4.8.
LISTAGEM 4.8 O Comando Select Case Pode Simplificar Muito Seu Código
1 Select Case lngQuantidadePessoas
2 Case 1
3 Call RetornalrnpostoPerCapta ()
4 Case 2
5 Call RetornalrnpostoDuasPessoas ()
6 Case 3,4
7 Call RetornalrnpostoDocrnicílioMédio()
8 Case 5 to 9
9 Call RetornalrnpostoDornicílioGrande ()
10 Case Else
11 Call RetornalrnpostoDornicílioMuitoGrande ()
12 End Select
A cláusula Case El se é usada exata1nente como a cláusula El se e1n tuna instrução I f, exceto por,
nesse exemplo, ser executada se nenhuma das condições for atendida. Observe que, na Listagem
4.8, apenas uma das condições poderia ser verdadeira a cada vez. Não há sobreposição entre as
diversas condições Case, o que faz muito sentido. Na verdade, as sobreposições não são evitadas
de ,nodo algum pelo Visual Basic; é possível ter condições sobrepostas nas quais ,nais de u,na
condição Case pode coincidir com u1n valor específico. Se esse for o caso, só a primeira condição
que tiver u1na correspondência será executada porque o prograrna sai da instrução Sel ect Case
depois que tuna correspondência foi encontrada e o bloco de código apropriado foi processado.
En1bora não cause u,n erro, a sobreposição de condições pode ser confusa para o programador, e
é 1nelhor evitá-la apenas por isso.
Faça
1
Aborde sempre toda condição possível incluin- Não use múltiplas condições em sua instrução
do uma cláusula Case El se. Isso capturará Se l ect Case se um único valor puder ter cor-
toda entrada inesperada para as quais você respondência com mais de uma delas. Esse
não usou outra instrução Case. Seu programa tipo de código não é um erro para o Visual Ba-
ficará mais consistente. sic, mas será difícil de entender o que não é
muito desejável.
Laços
Até agora, nesta lição, você aprer1deu a controlar que código será executado co1n o uso das ins-
truções If e Select, ,nas há outra necessidade muito comu1n -a de processar o mesrno código
1106 Dia 4
várias vezes. Esse requisito é 1nanipulado por meio de outra espécie de instrução de controle, o
laço (loop).
Vários tipos diferentes de laços estão disponíveis no Visual Basic, todos pode1n executar a maio-
ria das taretàs, ,nas cada um foi projetado para atender a uma finalidade específica. Começare-
1nos nosso estudo da repetição examinando o 1nais básico dos laços, For .. . Next.
A Variável do Contador
A variável do contador é incre,nentada a cada passagem pelo laço, do valor inicial ao final.
Quando esse valor final é atingido, o laço encerra sua execução, e o programa continua na linha i1ne-
diatamente após a instrução Next. Para visualizar esse conceito co1n alguns valores reais, criaremos
un1a versão no Visual Basic .NET do primeiro progra1na que escrevi (veja a Listage1n 4.9).
E' claro que em geral uso valores na casa dos milhares ... pois adoro ver 1neu nome rolando na tela!
A variável do contador é real e, exata1nente con10 na Listage1n 4.9, deve ser declarada antes de
você usá-la co1no parte de seu laço. Também é i1nportante se ce1tificar de e1npregar o tipo de
dado correto para essa variável. Na Listagem 4.9, a variável i Counter seria utilizada para ar1na-
zenar valores de 1 a 10, o que torna os tipos de dado inteiro (Integer) e byte os 1nais adequados.
En1 outras situações, podería1nos estar lidando com nún1eros muito maiores e, portanto, precisar
de u1n inteiro longo (Long I nteger). Para obter mais informações sobre os diversos tipos de da-
dos, incluindo que intervalo de valores cada un1 pode conter, recorra ao Dia 3. Como já meneio-
Controlando o Fluxo dos Programas
nado, a variável do contador é incrementada a cada passagem pelo laço, o que com freqüência é
útil porque ela pode ser usada e1n seu código.
Faça •
1
Use o tipo de dado mais apropriado para a si- Não altere o valor da variável do contador
tuação; não empregue o inteiro longo se o in- dentro do laço. A funcionalidade interna do
teiro puder atender bem. Sendo o intervalo laço For aumenta o valor da variável do conta-
fechado ou podendo crescer muito, certifi- dor sempre que o código do laço é executado,
que-se de usar o tipo de dado que melhor ma- mas você não tem impedimentos para alterar
nipule o maior intervalo possível para o por sua própria conta esse valor. Resista à ten-
contador. tação, ela só resultará em erros desconheci-
dos e em um código incompreensível.
A Listagen1 4.1 Omostra como você poderia usar a variável do contador como pa1ie de seu códi-
go. U1na pequena função cha1nada WeekDayName produz uma listagern dos dias úteis da semana.
23 Case 2
24 sWeekdayName = Monday
11 II
25 Case 3
26 sWeekdayName = 11 Tuesday 11
1 108 Dia 4
27 Case 4
28 sWeekdayName = "Wednesday"
29 Case 5
30 sWeekdayName = "Thursday"
31 Case 6
32 sWeekdayName = "Friday"
33 Case 7
34 sWeekdayName = "Saturday"
35
36 Case Else
37 sWeekdayName = ''Invalid Day Number''
38 End Sel ect
39 Return sWeekdayName
40 End Function
41 End Class
Observe que na Listage1n 4.1 O, Sunday é considerado o pri1neiro dia, pottanto, esse código pro-
duziria os resultados a seguir:
Monday
Tuesday
Wednesday
Thursday
Friday
Esse exemplo ainda não está pronto para produção porque gerará a lista de
NOT A nomes apenas em inglês, não levando em consideração as configurações da
máquina. Há outras maneiras, um pouco mais complicadas, de conseguir essa
funcionalidade integral com o suporte a toda as configurações regionais dos
usuários. Retornaremos a esse tópico no Dia 8, "Introdução ao .NET Frame-
work".
U,na característica interessante e útil de ter a opção Step no laço For é que ela pennite que você
percorra u,n intervalo de valores de maneira inve11ida. Tente os valores 10, O e 1 para as variá-
veis Fi rst, Last e Increment , respectivamente. Nada será exibido, porque Last já será menor
que Fi rst, ,nas se o valor de Increment for alterado de 1 para-1, algo interessante acontecerá
(não aceite simples,nente o que digo, tente!).
Ah, você conseguiu um laço que é executado o nú1nero exato de vezes que quiser, e agora os va-
lores são listados de trás para a frente. É difícil acreditar que possa ficar melhor do que está, mas
pode. Espere até chegannos ao laço Do!
End While
1 110 Dia 4
Qualquer expressão booleana válida pode ser usada, exatan1ente co1no e1n tuna instrução If e,
portanto, é possível dar suporte a condições co1nplexas. Por exemplo, um laço Whi l e pode forne-
cer com facilidade a mes1na funcionalidade do laço For, como den1onstra1nos na Listage1n 4.12.
'
E claro que reproduzir a funcionalidade do laço For não é u1na n1aneira útil de usar seu ten1po.
'
Não precisamos selecionar apenas um laço; te1nos de utilizar todos! E preferível empregar o laço
Whi lena execução de operações 1nais cornplicadas, como varrer urn array e1n busca de um tre-
cho específico de dados. Na Listage1n 4.13, você se preparará para essa pesquisa carregando un1
array com ai guinas strings. Em seguida, usando o laço Wh i l e, varrerá o array até ultrapassar a ex-
tensão dele ou encontrar a correspondência que procura.
14 arrlist(S) = "Paris"
15 arrl i st (6) = "l~i nni peg"
16 arrlist(7) - "Sydney"
17 arrlist(8) - "Calgary"
18 arrlist(9) = "Orlando"
19 While iCounter <= 9 AND iMatch = -1
20 If arrlist(iCounter)Like sMatch Then
21 iMatch = iCounter
22 Else
23 iCounter = iCounter + 1
24 End If
25 End ~Jhi 1e
26 If iMatch -1 Then
27 System.Console.Writeline("Matched" & iMatch)
28 End If
29 End Sub
31 End Class
O operador de co1nparação Li ke é usado na Listagem 4.13, o que permite que as correspondên-
cias sejam examinadas co1n o uso de curingas. Ao percorrern1os esse código, poderemos perce-
ber que o progra1na passa para outra etapa logo depois que cada urna das condições de saída é
avaliada corno verdadeira. O laço Whi 1e é 1nuito útil, mas ainda há outro tipo de laço disponível,
Do. Se você for como eu, provavehnente esquecerá tudo que viu sobre a instrução Whi 1e, depois
de ter usado o laço Do.
Laço Do
O laço Do, além de ser rnais simples, apresenta a estrutura de laço mais flexível disponível no Vi-
sual Basic. Sua sintaxe, na forma mais básica, é :
Do
Código a ser executado
Loop
A sintaxe, contudo, não especifica nenhuma condição de saída, portanto, o código interno conti-
nuará a ser executado de modo infinito. Esse proble1na é facilmente contornado porque a instru-
ção Do dá supo1te a duas 1naneiras de iniciar as condições de saída. As opções disponíveis são
Whi 1e <condição>, que faz co1n que o laço seja executado enquanto a condição for verdadeira e
Unt i 1 <condição>, que permite a continuação do processa1nento do laço enquanto a condição for
falsa.
Qual deve ser usada, \~hi 1e ou Unt i 1? Tecnicarnente, não tern nenhuma in1portância; você pode
tranqüilan1ente empregar qualquer das duas opções apenas utilizando uma negação en1 sua con-
1 112 Dia 4
<lição de saída quando apropriado. Esses dois exemplos de código se comportarão da mesma 1na-
.
ne1ra:
Do While iMatch = 3
Loop
Loop
Po1tanto, Whi l e ou Unt i l não são tão diferentes em seu efeito, ,nas o laço Do oferece outra opção
que fornece ainda ,nais flexibil idade. Você pode colocar a condição de saída (usando a cláusula
Unti l ou Whi le) no início (co,n Do) ou no final (com Loop) do laço. [sso significa que é possível
criar laços como o descrito a seguir:
Do
NOTA
- O laço Do Whi l e pode ser usado no lugar de ~lhi l e porque eles possuem exata-
mente o mesmo efeito. Não é raro ver os programadores deixarem o laço Whi 1e
de lado para empregar essa instrução.
Condições de Saída
Novo TERMO
A condição ele saída de qualquer laço é a expressão que será avaliada para detenni-
nar quando ele deve tern1inar. No caso de un1 laço Wh i l e ou Do, elas são claratnente
defmidas e aparecem no inicio ou no final dele. No laço For, a condição de saída é deduzida pela
configuração dos limites superior e inferior. Entretanto, para cada u1n desses tipos de laço há ou-
tra ,naneira de especificar quando sair deles com o uso da instrução Exi t. Há uma instrução Exi t
correspondente a cada laço (Exi t For, Exi t Do e Exi t Whi l e). Quando a instrução apropriada
for executada, ele será abandonado de imediato, e a execução do programa continuará na linha se-
guinte ao fi1n do laço.
E1nbora possam ser encontradas 1nuitas ocasiões e1n que essas instruções pareçam um n1eio per-
feito de fazer o programa se co,nportar correta1nente, elas são u,n dos 1n uitos exen1plos de práti-
ca imprópria de programação. Usando a instrução Exi t , você na verdade só terá especificado
uma parte complementar de sua condição de saída, mas de uma 1naneira mais do que óbvia. A
melhor forn1a de fazer isso seria adicionar essa segunda condição à condição principal de saída
de seu laço. Nos exemplos a seguir, veren1os algu,nas maneiras con1uns de e,npregar as instru-
ções Ex i t e o código correspondente que poderia ser usado como alternativa.
Mais un1a vez, a condição efetiva de saída é mais complicada do que esse laço a faz parecer.
U1na solução apropriada seria:
iCurrentGuess = O
iTarget = 5
Do Unti 1 (iCurrentGuess = iTarget) Or (iCurrentGuess = -1)
iCurrentGuess = GetNextGuess()
Loop
Se essas instruções Exi t não são adequadas, você deve estar querendo entender por que as abor-
do. Bem, embora saiba que poderá evitá-las em um código de sua autoria, a maioria dos progra-
1nadores en1 geral trabalha com códigos escritos por outra pessoa, e é importante co,npreender o
que pode ser e11contrado neles.
Laços Infinitos
Qualquer laço pode ter erros, mas u1n incômodo e1n pa1ticular é quando ele é executado conti-
nuamente, forçando você a interro1nper o programa para encerrá-lo. O fato de não ser preciso es-
pecificar nenhu1na condição em seu laço Do o torna um pouco mais propenso a esse tipo de erro.
Se o progra1na for executado e parecer não tenninar nunca, e, se ele for baseado e1n DOS, use a
combinação de teclas Ctrl+C para causar sua interrupção. Se estiver utilizando o IDE do Visual
Basic, use a co,nbinação de teclas Ctrl+Break para ence1Tá-lo.
Faça ]
Certifique-se de ter uma condição de saída em Não torne sua condição de saída muito com-
qualquer laço que criar. plexa; ela precisa ser avaliada a cada passa-
gem pelo laço.
Algumas causas comuns dos laços infinitos são o esquecimento de que a variável do contador pre-
cisa ser au1nentada progressivamente (em laços diferentes de For), a reinicialização de uma variá-
vel que deveria ser crescente e o uso de uma condição de saída que nunca possa ser atingida.
Controlando o Fluxo dos Programas
O no,ne do usuário é fornecido por meio de u1na pequena função que usa o .NET Fratne\vork
para obter suas infonnações atuais de segurança, n1as o ,nais impo1tante da Listagem 4.14 é que
ilustra erros co1nuns relacionados ao dese1npenho. A cha1nada à função UserName ocorre dentro
do laço, o que significa que ela será executada 1.000 vezes, cada uma provavelmente resultando
em alguma f onna de chamada do sistema operacional para obtenção do nome do usuário atual.
Já que não se espera que o usuário atual seja alterado nesse laço, é muito ,nais eficiente usar u,n
laço de sua autoria e,n vez disso, como mostra a Listagem 4. 15. O valor da função UserName não
é alterado e, portanto, não será incluído nessa segunda listagem.
7
8 For i = 1 to 1000
9 System.Console.Writeline(sName)
10 Next 1
11
12 End Sub
13
14 Shared Function UserName() As String
15 Dim sName As String
16 sName = System.Environment.UserName
17 UserName = sName
18
19 End Function
20
21 End Class
Leitura de um Arquivo
Ler um arquivo no disco é u1na necessjdade co.1nun1 de muitos programas, po1tanto é fornecida
pelo .NET Fra1nework. Nesta lição, você usará dois objetos diferentes que são parte da seção
System. IO do Framework, System. IO. File e System. IO.StreamReader. Eles representam, res-
pectiva1nente, o arquivo real no disco e sua leitura na 1nen1ória.
O objeto St reamReader é criado com o uso do 1nétodo OpenFi ledo objeto File, sendo necessário
especificar o caminJ10 e o no1ne do arquivo que se deseja abrir. Você pode usar o objeto Stream-
Reader, para ler cada linha do arquivo, tnna por vez, através de seu 1nétodo Readl i ne até que al-
cance o final do arquivo. Para verificar se esse foi atingido, compare o último valor lido com a
constante especial Nothi ng, que é diferente de uma linha vazia e permite distinguir entre u1na li-
n.ha em branco em um arquivo e o fitn real de todos os dados. Já que Nothi ng é un, tipo especial
de valor, utilize o operador is para co1nparar sua sh·ing co1n ele, em vez de un1 operador co1nu1n
de igualdade. Na Listagem 4.16, a primeira etapa é inicializar todos, os seus objetos, enquanto
aponta o objeto StreamReader para o arquivo que você deseja ler. E necessário u1n arquivo de
texto para fazer este exercício, mas qualquer de seus outros exetnplos de arquivos de progratna
. vb deve servir.
Depois de obter seu objeto StreamReader, que foi inicializado de 1nodo que apontasse para o ar-
quivo de teste, você poderá usar u1n laço Do Whi l e (veja a Listage1n 4.17) para ler o arquivo, uma
lin.ha por vez. Para que esse programa produza algu1na saída, a fim de tornar possível saber qual
sua função, ta1nbérn impri1niren1os cada uma das linhas ao sere1n lidas.
LISTAGEM 4.17 Etapa 2: Insira Este Código Acima da Instrução End Sub da
Listagem 4. 16
1 slnputline = ''algo''
2 Do Until sinputline is Nothing
1 118 Dia 4
L ISTA GEM 4.17 Etapa 2: Insira Este Código Acima da Instrução End Sub da
Listagem 4. 16 (continuação)
3 slnputline = srFileReader.Readline()
4 System.Console.Writeline(slnputline)
5 Loop
Antes de percorrer o laço pela primeira vez, é melhor certificar-se de que suas condições sejrun
atendidas, portanto, inicialize s Inputl i ne para assegurar que não seja Nothi ng. Na Listagem
4. 18, você tentará exibir s Inputl i ne mes1110 quando for Nothi ng, mas seria botn adicionar uma
instrução If para verificar essa possibilidade.
Alternativatnente (veja a Listagen14.19), você poderia usar um método de laço um pouco diferen-
te e assegurar que un1a saída não seja exibida depois que o final do arquivo tenha sido atingido.
Qualquer um dos métodos funcionará, mas o aplicativo fina] fornecido na Listagen1 4.19 produ-
ziu o código mais simples (e, portanto, melhor) dentro do laço. Se você quiser executar esse có-
digo, terá de criar u1n arquivo de texto co,n um conteúdo de teste no mes1no diretório que seu
progra,na executável co,npilado.
Um Jogo Simples
Outro uso comu,n para o laço é consultar repetida,nente o usuário solicitando tnna resposta, até
que se consiga a desejada. Isso pode soar incô1nodo (de algu1n modo, parecido co1n. as perguntas
de u1na criança), mas no tipo certo de progran1a, pode ser útil. Neste exemplo, você criará um
jogo si1nples de adivinhação de nú1neros. Esse jogo em pa1ticular foi a 1naneira que meu pai en-
controu para me manter ocupado enquanto esperávamos ser atendidos e1n restaurantes, etnbora
o jogássemos de un1a maneira menos tecnológica. Primeiro, ele escrevia utn litnite superior e utn
inferior nas extremidades de cima e de baixo de um guardanapo, l e 100, por exemplo, e, e1n se-
guida, selecionava utn nútnero aleatoriamente (a rnaneira aleatória de tneu pai, e não a dos co1n-
putadores) e o escrevia atrás do guardanapo. Eu cotneçava a dar palpites de números até que
encontrasse o correto, sendo infonnado a cada vez se meu palpite era muito alto ou muito baixo.
En1bora duvido que eu tenha sido rnetódico co1n relação a isso, essas infor1nações de certo facili-
tara1n bastante. Como parte da luta contínua para inforrnatizar tudo que não precisa ser infonna-
tizado, criaremos u1n progratna de cotnputador para jogar "Adivinhe o número!".
Os aspectos básicos deste progra,na fora,n esboçados acitna; poderíamos usar minha pequena
história co,no o pseudocódigo para o progran1a. Seria melhor refonnular rapidamente os deta-
lhes ern tnna definição mais clara do que o programa deve fazer:
1. Solicitar ao usuário um limite numérico superior e inferior.
2. Determinar utn número aleatório dentro desse intervalo; ele é o alvo.
NO T A
- Esse método de gerar números aleatórios retorna valores que são maiores ou
iguais ao limite inferior e menores que o superior (i LowerBound <= x < iUpper-
Bound). Você precisa especificar um valor superior que seja maior do que o mais
alto que deseja permitir. O código deste exemplo já faz isso.
Depois que o objeto Random tiver sido inicializado, você poderá chamar seu método Next se1npre
que desejar, e obterá um novo número aleatório a cada vez. Agora que sabe como obter um nú-
1nero aleatório, pode gravar o código 1nostrado na Listagein 4.20 para solicitar os limites ao
usuário e, em seguida, usar esses valores para obter seu alvo.
NaListage1n 4.20, você exibiu o número depois que o gerou. Isso é útil para testar seu progra1na,
rnas teria de ser rernovido ou isolado (marcado co1n um caractere de co1nentário no início ( ' )
para i_ndicar que não deve ser co1npilado) na versão final. E1n seguida, é preciso criar um laço
que solicitará repetida1nente u1n novo palpite até que o alvo seja adivinhado. Enquanto o progra-
ma estiver executando o laço, tan1bém precisaremos de outra variável para manter o registro da
quantidade de palpites que foram necessários para chegar ao alvo. Esse código ( v~ja a Listagem
4.21) teria de ser inserido antes da instrução End Sub para encerrar o progratna.
Controlando o Fluxo dos Programas 121
Combinadas, as duas listagens de código anteriores produze1n o jogo co1npleto que você poderá
compilar e tentar ganhar. E' bom remover o último comando 11ri tel i ne da Listage1n 4.21 antes
de jogar, ou pode ficar muito fácil. Há uma 1naneira bastante racional e, po11anto, chata de jogar,
que garante a obtenção da reposta correta com uma certa quantidade de palpites. Você pode ape-
nas fornecer a cada palpite u1n valor intermediário para o intervalo, por meio do critério alto/bai-
xo, para criar urn novo intervalo (com a metade da extensão) entre seu palpite e os lin1ites
inferior e superior. No jogo do exemplo, que usa de 1 a 100, esse 1nétodo assegura a descoberta
da solução em sete palpites (ou menos), com base em u1na fórmula 1nate1nática. Você sabe que
fór1nula informará a quantidade de palpites necessários para qualquer intervalo de valores? A
resposta estará na seção de exercícios desta lição.
2 * 1 = 3628800. (Observe que o resultado é be1n grande co1n relação ao valor de n.) Essa fónnu-
la pode ser expressa corn o uso de um laço For, corno vemos na Listagem 4.22.
No entanto, essa não é a única maneira de gerar urn fatorial já que essa fórmula também pode ser
expressa corno n * (n-1 )! , ou seja, n 1nultiplicado pelo fatorial de n-1. Essa expressão define a
fónnula recursiva1nente; a solução de um fatorial inclui outro fatorial. Po1tanto, essa é u1na defi-
nição 1nais clara que a da fór1nula n(n-1 )(n-2) ... (n-(n-1 ))(1) e, se você o escrever desse 1nodo
(veja a Listagem 4.23), produzirá utn código que ta1nbé1n será mais simples do que a rotina cor-
respondente da Listagem 4.22.
O código produzido pode não ser mais curto que o da Listagem 4.22, 1nas é 1nais siinples e, só
por isso, esse é um resultado válido. Observe que na função Facto ri a l ( ) , você procura n = 1.
Essa verificação assegura que as chan1adas recursivas finalmente seja1n encerradas, semelhante
ao que se consegue com a condição de saída em um laço. Sem ela, como no laço, o programa
nunca terá sua execução encerrada. A recursão pode ser usada para resolver muitos problemas, e
vere1nos códigos que a e1nprega1n em siste1nas de vários tipos (e espero que você escreva o seu).
Resumo
Nesta lição, examinamos as instruções de controle, a base de muitos dos progra1nas de computa-
dor que você criará no futuro. Com essas instruções, é possível co1neçar a converter processos
reais em progra1nas, priJneiro passando-os para pseudocódigo e, em seguida, usando esse recur-
so para gerar o código real necessário.
P&R
P Meu colega me disse que os laços hi l e são melhores que os laços Do e que nunca
devo usar o laço For! Que laço é o melhor?
R E1nbora seja possível usar apenas u1n laço e1n todos os seus progran1as, não se ganha
nada fazendo isso. No final, tudo que importa é que seu código seja o 1nais claro e sim-
ples que puder. Empregue o laço que 1nelhor resolver o problema. E1n geral, o laço For
124 Dia 4
funciona 1nelhor quando é preciso uma quantidade fixa de iterações; use un1 laço Do ou
Whi l e quando esse não for o caso.
P As instruções If de uma linha são mais rápidas que a forma If .. . End If?
R Não. O compilador do Visual Basic converte as duas fonnas no mes1no resultado, por-
tanto, não há diferença na velocidade de execução desses dois formatos. A diferença
principal está na facil idade de manutenção e leitw·a do código.
P Em versões anteriores do Visual Basice no Visual Basic for Application (VBA), usei
uma forma da instrução If chamada I nunediate If IIF . Ela existe no Visual Basic
.NET?
R Sim, existe. Mas só co1no eletnento de urn conjunto especial de objetos (Microsoft.Visu-
alBasic), projetado para fornecer acesso à instrução II F e muitas outras partes da últiina
versão do Visual Basic que não existem tnais no Visual Basic .NET. O fato de essas fun-
ções não estarem e1nbutidas na versão mais recente do Visual Basic pode significar que
elas reahnente não estarão disponíveis e1n fu turas versões. A variante II F é urna forma
1nuito útil da instrução If; como função, ela pode ser usada no 1neio de outra expressão,
por exemplo, quando u1na string é exibida. No entanto,já que as próxi1nas versões do Vi-
sual Basic poden1 não incluir a instrução II F, você deve evitar seu uso se possível.
Workshop
O Workshop foi planejado para aj udá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e1n co1no colocar seu conhecirnento en1 prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Qual dos três métodos de laço disponíveis é mais adequado para un1 intervalo fixo deva-
lores?
2. Qual dos três 1nétodos de laço é o 1nais flexíve l?
3. Por que você deve tentar fazer com que o bloco de código interno e1n u1n laço seja o mais
sitnples possível?
4. Suponha1nos que você tivesse a expressão booleana a seguir e1n seu progra1na: Calcula-
tedTota l Net\~orth ( i CustomerID) < 10000 ANO dtCurrentDate.Hour > 12. O que poderia
fazer ser feito para assegurar que ela seja o mais eficiente possível?
Controlando o Fl uxo dos Prog ramas
Exercícios
1. Escreva o inverso do programa Nu1nberGuesser criado nesta lição - u1n progra1na com
limites superior e inferior que tente detenninar que valor foi selecionado pelo usuário.
Para cada palpite que o programa de co1nputador gerar, você terá de pennitir ao usuário
responder co1n "A" para 1nuito alto, "B" para muito baixo ou = para correto. Se preferir
usar o 1nétodo rac.ional nos palpites de seu progra.1n.a, então, a quantidade máxima de ten-
tativas necessárias poderá ser encontrada na resolução dessa equação: (2N>= Limite Su-
perior - Limite Inferior) onde N é a quantidade máxima de tentativas. Por exemplo, ern
utn intervalo de l a 100, a equação resultaria e1n 7 porque 26 = 64 e 2; = 128.
SEMANA 1
DIA
O conceito de arquiteto, tanto o profissional quanto os aspectos do projeto pelo qual ele é respon-
sável, foi tomado e1nprestado pela indústria de desenvolvimento de soft\.vares. A semelhança su-
gerida entre as duas áreas não deve agradar aos verdadeiros arquitetos, e não os culpo por
ficare1n incomodados. Se os prédios fossern construídos da 1nesma 1naneira que a maioria dos
sistemas de software, então, passaria o resto de meus dias vivendo a céu aberto. Muito do que
está envolvido no desenvolvin1ento de softwares empresariais é feito se1n planeja1nento suficiente,
resultando em siste1nas que são instáveis, com tnanutenção dificil e quase sempre com um orça-
1nento 1nuito alto.
Você pode ser u1u iniciante no Visual Basic ou ta1nbén1 no desenvolvimento. Talvez não queira
assumir o papel do arquiteto de sistemas no futuro próxin10. Mas isso não altera a necessidade de
compreender o processo e as decisões sobre a arquitetura que serão to1nadas em qualquer projeto
com seu envolvilnento. No ciclo de evolução do desenvolvimento de sofuvares, a equipe inteira
deve estar envolvida no processo integral, poré1n o arquiteto éo principal condutor do planejamen-
to nas fases inicias da Definição/Escopo, Análise das Necessidades e Projeto (veja a Figura 5.1).
Arquitetura dos Aplicativos na Plataforma .NET 129
FIGURA 5.1
No ciclo de evolução
do desenvolvi,nento de
soft1vares, a
arquitetura está
envolvida
principalll1ente nas
prilneiras fases, e,11
que o sistema é
projetado.
Depois dessas fases iniciais, o foco passa para a equipe de in1ple1nentação (desenvolvedores de
soft,vare) e, en1 seguida, para os grupos de implantação. O ideal é que a pessoa que assu1nir a
função de arquiteto seja altamente experiente, corn bastante conhecitnento técnico para avaliar
todas as opções disponíveis e habilidade operacional suficiente para interpretar con1 correção os
requisitos do siste1na. Em geral, o papel de arquiteto é desernpenhado por me,nbros da categoria
sênior de u1n grupo de desenvolvimento.
do e na implementação. Por exemplo, parte da arquitetura do sistema pode ser uma discussão so-
bre segurança, e nesse nível a declaração a seguir poderia ser suficiente para abordar esse tópico:
"O aplicativo baseará suas permissões de segurança nos usuários e e1n grupos do Windo"vs 2000
já em uso na empresa". Essa declaração é o bastante co1no ponto de partida; o próximo nível se
tornaria mais detalhado e poderia incluir infonnações sobre que áreas do aplicativo serão prote-
gidas e a quen1 será concedido acesso para cada área específica.
Na fase de i1nplementação ou desenvolvirnento, o programador teria de detenninar exatarnente
corno encontrar o logon do grupo e do usuário do Windows, mas esses detalhes decerto não
fazem parte da arquitetura do sisterna. E1nbora ela aborde tudo em u1n nível superior, as áreas-chave
a seguir devem ser reconhecidas como parte de qualquer arquitetura de aplicativo:
• Distribuição física e lógica dos códigos (que código será executado onde?)
• Tecnologias usadas na interface com o usuário, bancos de dados e lógica. operacional
• Método de comunicação entre co1nponentes diferentes do siste1na e enh·e esse e os outros
siste1nas da ernpresa
• Segurança
• Acesso aos dados
• Escalabilidade e disponibilidade
Cada u1na dessas áreas é por si só importante, mas a arquitetura é a co1nbinação de todos esses
fatores e1n um projeto que funcione como um todo. A finalidade de cada área será abordada nas
- segumtes.
seçoes .
Tecnologias
Urna das áreas mais objetivas, esse elemento da arquitetura do siste1na traça u1n esboço 'geral'
das tecnologias que serão usadas. O segredo nessa área é disponibilizar infonnações suficientes
para ser útil, enquanto detalhes que possam não ter sido determinados ou sejam in·elevantes no
nivel da arquitetura deve1n.ser evitados. Considere esses dois trechos (não se preocupe em com-
preender os detalhes, só existem para atender à fi nalidade do exemplo):
Exemplo 1:
A equipe do projeto desenvolverá a interface co1n o usuário por 1neio do Visual Basic 6.0 (Servi-
ce Pack 5) e de um controle de grade ActiveX do Janus. Várias janelas serão criadas, todas com
1nenus, un1a grade principal e diversos botões funcionais. Esses fonnulários empregarão o
DCOM para se conectare1n com os servidores da camada intennediária, os quais executarão o
Windows 2000 Advanced Server (Service Pack 2). Os servidores da camada intennediária hos-
pedarão cinco componentes dentro do ambiente de serviços do co1nponente do COtvl+ do Win-
dows 2000. Esses componentes operacionais serão DLLs do COM, construídas con1 o uso do
Visual Basic 6.0 (Service Pack 5) e com suas propriedades configuradas como Public. Cada
componente será co1nposto de ...
Exemplo 2:
A interface con1 o usuário será baseada em fonnulários e usará o DCOM para se comunicar com
a camada intermediária. Dentro dessa camada, os objetos operacionais do COM terão sido insta-
lados no COM+ e man ipularão a comunicação co.m a ca1nada de dados. O ADO será en1pregado
para conectar a camada intennediária co1n os dados de back-end, e todas as infonnações serão
retornadas para a camada de apresentação depois de passarem pela comercial.
En1bora o Exemplo 1 tenha sido interro1npido, na verdade ele não estava ne1n perto de ser con-
cluído e ainda tinha de trans1nitir tantas infonnações úteis quanto o Exemplo 2. O segredo é se
lernbrar sempre do principal, que é conseguir descrever a arquitetura. Ainda falta,n o projeto de-
talhado e as fases da implementação para rnanipular a entrada nesse nível de particularidades.
Outra regra interessante é nunca passar muito tempo discutindo tecnologias específicas. Tente se
concentrar e só discutir a tecnologia em termos do que ela trará para esse projeto.
rede/fire\vall. A platafonna .NET fornece várias opções diferentes para esse tipo de comunicação
incluindo o SOAP.
Segurança
U,n título indefinido para Lima área vaga, a segurança é u1n tópico que deve ser considerado ape-
nas porque toda discussão acaba por abordá-lo e pennanece aí se ele já não tiver sido detalhado.
A arquitetura deve detalhar como a segurança será proporcionada (usando o Windows 2000
Active Directory, por exe,nplo) e conceitualmente co,no será in1ple1nentada ("as opções de in-
terface ficarão ocultas" ou "a segurança será verificada a cada página/forn1ulário"). E' necessário
detalhar exata,nente co,no os progra,nadores Ílnple,nentarão esses recursos.
Escalabilidade e disponibilidade
Esses são dois tópicos in1portantes e complexos e u1na das principais razões pela qual a arquite-
tura dos aplicativos recebe tanta atenção. Eles estão relacionados de muitas 1naneiras: as técnicas e
a arquitetura usada para fornecer u,n serviço em geral são utilizadas para disponibilizar o outro.
A escalabilidade descreve a capacidade de um siste,na de manipular cargas maiores, fornecendo
o ,nesmo nível de serviço (te1npos de resposta, quantidade de solicitações por segundo e assim
por diante) por ,neio de um incre,nento no hardv,rare. Lembre-se de que essa não é u,na n1edida
de dese1npenho; um siste1na pode ser escalonável e ter um péssi,no dese1npenho. Como assegu-
rar que u,n apl icativo possa ter u,na boa escalabilidade está além do escopo desta lição e deste li-
vro, mas un1 link para outros recursos será fornecido no final deste capítulo caso você esteja
interessado en1 uma abordage1n ,nais profunda desse tópico.
A disponibilidade é uma medida que aval ia com que freqüência o siste,na está e,n execução e
pode processar solicitações. Agora que os aplicativos da Web co1n interface pública estão sendo
desenvolvidos, a necessidade de siste1nas que estejam se1npre disponíveis está sendo difundida.
Em geral esse conceito é descrito como 'te,npo de funcionamento' e em tennos da quantidade de
'algarismos nove' existentes na medida de disponibilidade que u1n sistema tetn fornecido. O ter-
mo 'a!garis1nos nove' se refere ao te1.npo de funciona,nento de 99% (dois algarismos nove),
99,9% (três algaris,nos nove) ou maior que u1n sistema possui. Enquanto redigia esta seção, al-
guns sisternas de uso co,nercial foram registrados com um te,npo de funcionarnento igual a cin-
co algarismos nove (99,999%). Etn tern1os práticos, um site com utn te1npo de funcionamento de
cinco algaris1nos nove teria estado inativo por somente cinco 1ninutos em u1n ano inteiro (24 ho-
ras por dia, 7 dias por semana). Isso quase parece ridículo, e excede 1nuito meu tempo ativo no
Arquitetura dos Aplicativos na Plataforma .NET 133
trabalho, mas se você estiver executando um site con10 o Amazon.com, então, ficar inativo de al-
guma 1naneira pelo espaço de te1npo que for é inaceitável.
Criar um siste1na com esse nível de disponibilidade é uma combinação de projeto e processo. Do
ponto de vista do projeto, o sisten1a deve estar completa1nente a salvo de estouros de memória ou
outras falhas que impediriam o uso contínuo e deve poder ser executado e1n várias outras máqui-
nas,já que 1núltiplos grupos de hardware tê1n de ser usados para fornecer redundância. Do ponto
de vista do processo, no entanto, tudo é ainda mais complexo. Por exetnplo, atualizações de soft-
\.vare terão de ser feitas de maneira seqüencial para que o conjunto de servidores nunca fique in-
tegrahnente inativo. As discussões sobre o ten1po de funcionamento e1n geral se concentra1n no
sistema operacional ou na tecnologia específica do servidor de banco de dados /servidor de com-
ponentes/servidor Web em uso, sugerindo, digamos, que o Windov.1s 2000 fornece uma certa
quantidade de algarismos nove de tempo de funcionamento. Essa não é u1na discussão realista.
O siste1na operacional ou o servidor do banco de dados é só Lnna parte do siste1na, e tudo causa
impacto na sua capacidade de manter uma disponibilidade alta.
Quantas Camadas?
U,na das n1aneiras n,ais co1nuns pelas quais as arquiteturas de aplicativos tên1 sido descritas é
en, tennos da quantidade de ,náquinas diferentes que executa1n partes do sistema. A arquitetura
1nais simples é apresentada como u1n sistema de ca1nada única, e1n que o programa (apresenta-
ção, lógica operacional e dados) está todo em u1na n1áquina. Essa é a arquitetura e,npregada pela
maioria dos aplicativos cornerciais como o Microsoft Office e 1nuitos softwares empresariais
projetados para sere,n usados por alguns usuários ao mesmo tempo. Só as máquinas que execu-
tarem alguma forma de processa,nento são i1nportantes. U,n progra,na em que os arquivos de
dados esteja1n localizados en1 um servidor de arquivos também é considerado um aplicativo de
ca,nada única porque todo o trabalho efetivo é feito em u1na 1náquina, e o servidor de arquivos
apenas fornece u1n local na rede para arn1azenar dados.
Por outro lado, quando u,n servidor de banco de dados (con,o o SQL Server ou o Oracle) é usa-
do, então, ele é considerado uma segunda camada porque realmente executa u,n processamento.
Os sistemas que possuem um software cliente (e1n geral na máquina de mais de uma pessoa) que
se conecta de modo direto co,n u,n banco de dados de back-end são cha1nados de aplicativos de
duas camadas ou cliente/servidor. A arquitetura cliente/servidor é comum nos aplicativos em-
presariais. Ela pern1ite que 1nuitos usuários trabalhe1n co1n o 1nes1no conjunto de dados enquan-
to fornece um dese1npenho muito melhor do que um sisteina com base em arquivos, coino o
Microsoft Access.
Para concluir, a fonna ,nais recente de arquitetura de aplicativo é chamada de três ca1nadas ou
várias camadas e descreve sisten1as e1n que o código é executado e1n três ou n1ais seções distin-
tas. A divisão lógica de u1n sisterna desses tambétn é co1nposta de três ca1nadas, ,nas o layout ti-
sico pode exceder três grupos distintos. Em geral, isso significa que algum tipo de código
cliente, co1no u1n site interativo da Web ou talvez um aplicativo Windows, que cha1na um códi-
go executado ern outro servidor ou conjunto de servidores para manipular a lógica operacional, e
urn banco de dados de back-end estão sendo usados. Essa arquitetura está se tornando 1nais po-
pular porque fornece muita flexibilidade para a manipulação de diversos usuários e, portanto, é
bem adequada para aplicativos coin base na Internet. Há várias maneiras técnicas diferentes de
criar aplicativos de três camadas, ,nas o 1nétodo recomendado pela Microsoft antes da platafor-
ma .NET se tornar disponível era cha1nado de Windows DNA.
Windows DNA
O Windows Distributed Netv.1ork Architecture (ou Distributed interNet Architecture, dependen-
do de onde você encontrar sua definição), é o conjunto de tecnologias e diretrizes da Microsoft
anteriores à plataforma .NET para criação de sisteinas de três camadas. Coin base na idéia geral
de que todo apl icativo pode ser dividido e1n três ca1nadas, de Apresentação, Lógica Operacional
e Dados, o Windows DNA. esboçou a 'melhor' maneira de desenvolver sistemas distribuídos.
E1n um aplicativo Windo,~1s DNA, o código-cliente era executado como um aplicativo Windows
padrão ou co1no uma interface da Web criada co1n o Active Server Pages. O código-cliente con-
Arquitetura dos Aplicativos na Plataforma .NET 135
tinha apenas a lógica relacionada à interface e acessava toda a operacional chamando co1npo-
nentes do COM localizados localmente ou em outro servidor, co1nponentes que, então, se
encarregariatn de interagir com o banco de dados.
Utn princípio essencial do 1nodelo Windows DNA para desenvolvi1nento de aplicativos é que
tudo flui através de três camadas, de ,nodo que a ca,nada de apresentação se co1nunica apenas
com os objetos operacionais, e esses 1nanipula1n toda a co1nunicação co1n o banco de dados. A
cainada de apresentação nunca acessa diretamente o banco de dados e, po1tanto, as três ca1nadas
são abstratas, o que proporciona a possibilidade de alternar o banco de dados sem que seja preci-
so reescrever toda a interface con1 o usuário, ou criar u1na interface totaln1ente nova se1n ser ne-
cessário alterar a can1ada operacional ou o banco de dados. A flexibilidade obtida nesse modelo
1nais do que compensa qualquer trabalho adicional envolvido para assegurar que as três ca,nadas
sejam apropriadamente independentes.
Agora, embora o modelo Windows DNA seja be1n detalhado, a imple1nentação real pode ter
tuna entre várias configurações diferentes. E,n um caso, o aplicativo poderia executar tudo e,n
um servidor, con1 o Active Server Pages (interface da Web) se co,nunicando co,n os co1nponen-
tes (provavehnente escritos etn Visual Basic 6.0), que, por sua vez, funcionariam co,n tuna insta-
lação local do SQL Server. Apenas uma máquina é usada, mas as três ca1nadas ainda são
distintas, e o modelo Windovvs DNA é mantido. De modo alternativo, o 1nodelo também pode
ser expandido para quantas n1áquinas fore1n necessárias a fi,n de manipular a carga do siste1na.
U1n siste1na possível poderia e,npregar u1n grupo de 20 servidores Web, todos atendendo ao
Active Server Pages, que se conectaria a um agrupamento de máquinas com balancea1nento de
carga executando o 1nesn10 conjunto de con1ponentes do COM, que, por sua vez, acessariam um
par de servidores processando o SQL Server em u1na configuração de grupo. Apesar da imple-
mentação e1n escala 1nuito maior, o mes1no 1nodelo está sendo adotado, o que demonstra a flexi-
bilidade e escalabilidade do Windows DNA de três ca1nadas que o tornou tão popular.
COM nas ca1nadas de apresentação e operacional. No Windo,vs DNA convencional, você pode-
ria reescrever seus objetos operacionais se1n ter de alterar a camada de apresentação ou de dados,
1nas apenas se estivesse utilizando u1na linguagem compatível com o COM (em geral o Visual
Basic ou o VC++). A platafonna .NET introduz u1na nova 1naneira de comunicação que pode
permitir a abstração real entre as camadas, o SOAP (Si1nple Object Access Protocol).
A comunicação do SOAP é toda feita com o uso da XML, e1n vez de u1n formato binário, e é exe-
cutada antes do conhecido protocolo HTTP. Para o desenvolvimento de aplicativos distribuídos,
isso significa que qualquer linguagem/ferra1nenta poderia ser usada para criar as ca1nadas do sis-
te1na. Seria possível que os componentes já existentes e1n sua e1npresa estivessem escritos em
Java, que poderia fornecer a camada de apresentação do sisten1a, enquanto o front-end estaria na
plataforma .NET usando o ASP.NET ou um aplicativo Windov.is. A versão .NET do Windows
DNA é até 1neU1or do que antes quando ele ernpregava o conjunto antigo de tecnologia para de-
senvolvi1nento.
Continuando nessa 1nesma linha de raciocínio, a falta de requisitos de cliente significa que para
seu aplicativo ser executado, nada (além do requisito básico de um navegador da Web de algu1n
tipo) precisa ser instalado no computador do usuário. Quando você atualizar seu site, alterando
as páginas armazenadas e1n seu servidor, o próximo usuário a acessá-lo verá a nova versão, e ne-
nhu1n outro proble1na relacionado à atualização ou distribuição. Todos esses beneficias que re-
sultam da fa lta de requisitos de cliente ton1an1 a escolha de u,na interface da Web relativan1ente
fácil, exceto por doi.s pontos:
• A experiência que o usuário te1n co1u urn navegador da Web ainda não é tão boa quanto
com um aplicativo Windows. Considere alguns dos aplicativos Windows que você tem
utilizado, co1no o JVlicrosoft Office, o Visual Studio .NET, o Adobe Photoshop e outros, e
•
perceberá que quase nada na Web chega próxirno do nível da interface co1n o usuário. E
possível produzir u1na interface na Web que seja se,nelhante, ,nas o trabalho necessário
será 1nuito maior se co1nparar1nos com um aplicativo Windows.
• Um aplicativo ASP.NET e1n geral só funciona quando o usuário está conectado e seus re-
cursos são afetados pela velocidade dessa conexão.
Alguns ·itens apenas não funcionatn em urn sisterna com base na Web, coino uma experiência
off-line igualmente funcional e satisfatória. Por exe1nplo, o Outlook é capaz de funcionar on-line
ou off-line, ,nas sua contrapartida na Web, o Outlook Web Access, não possui nenhuma fun-
cionalidade off-line. Un1 progran1a projetado para trabalhar com arquivos ou outros aspectos 'lo-
cais' de seu sistema não terá um desen1penho tão bom se transferido para utua interface com o
usuário con1 base na Web.
Concluindo, é dificil encontrar razões contra o uso de u1na interface da Web, e há 1nuitas vanta-
gens en1 desenvolver u1n sistema dessa 111aneira.
• Atualizar seu aplicativo e,n geral significa lidar com todos os 1nicrocomputadores de al-
guma maneira (ferramentas automatizadas ou opções de download de rotinas ou drivers
específicos pode,n eli1ninar u,n pouco desse esforço).
A dependência da máquina-cliente possui Lun efeito colateral pernicioso quando se está lidando
co,n aplicativos públicos; o dese,npenho de seu aplicativo dependerá de uma 1náquina sobre a
qual você não tem nenhum controle.
Todos esses requisitos fazem parecer que a opção entre cliente do tipo 'thick' (n1ais robusto) e do
tipo 'thin' (1nais siinples) não é absolutan1ente u,na tomada de decisão. Na verdade, contudo,
ainda há várias vantagens interessantes nos aplicativos do Windows forros que valern a pena
1nencionar. A pri1neira grande vantagem é que o desenvolvedor que usar o Windo,vs Fonns po-
derá criar interfaces com o usuário co,npletas e funcionais e será possível fazê-lo muito mais rá-
pido do que com o ASP.NET. Apesar de todos os avanços na tecnologia da \\'eb, ainda é mais
dificil gerar tuna interface complexa nesse local do que no Windo,vs.
U1na segunda vantagem está no desen1penho da interface co1n o usuário, u1na interface do Win-
dows e1n geral responde 1nelhor (responde rnais rápido aos cliques e outras ações do usuário).
Para concluir, a última vantagem em usar o Windows Forms é que há aqueles itens (uso off-line,
processamento 1nais rápido de objetos locais, como por exe1nplo, arquivos) que simplesmente
não podern ser realizados na Web.
jeto pode estar fadado à falha. E' claro que os erros sempre poderão ser con·igidos, mas nesse
caso, 1nuito trabalho poderia ser eliminado se tuna nova arquitetura precisasse ser selecionada.
NOTA
-- Com base em minha experiência, e por ter observado a de outras pessoas que
não foi muito agradável, recomendo nunca desenvolver um sistema (ou proje-
tar estimativas ao desenvolver um) com base nos requisitos interpretados pe-
los outros. Por outros quero dizer alguém que não seja você ou um membro de
sua equipe em cujo trabalho confie. Requisit os incorretos em geral resultam
em um sistema inadequado e terminarão definitivamente em uma estimativa
inválida. Depois de ocorrido, culpar os requisitos fornecidos não irá ajudar,
portanto, certifique-se de que você ou um membro de sua equipe esteja envol-
vido na documentação deles. Se isso não for possível, então, estabeleça um
tempo maior a seu projeto para revisar a análise dos requisitos existentes e
para examinar qualquer parte obscura pesquisando diretamente a fonte (o
pessoal operacional por trás do projeto, os usuários ou mesmo um sistem a an-
terior que executasse as mesmas ações).
Plataforma Cliente
Como parte de seu planejamento, você precisa saber alguns detalhes sobre a platafonna en, que
seu sisten,a será executado:
• Que siste1nas operacionais estão instalados nos siste1nas de destino?
• Quais são as especificações de hardware das 1náquinas de destino (CPU/RAM/espaço em
disco)?
• Qual o nível de controle que a ernpresa te1n sobre as 1náquinas de destino? Ela controla a
configuração, a instalação do softv.,are e a proteção contra vírus? Soluções extrernas para
essas questões seriam um servidor só para ter1ninais burros em tuna extrem.idade e com-
putadores públicos de propriedade dos usuários na outra.
• Algum dos co1nputadores clientes é um laptop? O acesso off-li11e ou ren,oto é necessário?
Serão precisos serviços de discage1n ou eles já existe1n?
1140 Dia 5
Rede
Muitas opções relacionadas à arquitetura, con10 o tipo de cliente, a replicação de bancos de da-
dos e o protocolo usado dependem da rede em que o sistema será executado:
• Qual a velocidade de comunicação disponível entre os usuários e os servidores de
back-end (ou o que estará disponível, se os servidores de back-end ainda não existiren1)?
• Os serviços de acesso re1noto serão necessários e/ou fornecidos? VPN? Dial-up?
• Os computadores-cliente tê1n acesso à Internet?
• 1-Já algu1n soft"vare/hardware de firewall entre os usuários e os servidores de back-end?
• Que tipo (TCP/[P, TPX, NetBEUl e outros) de rede está em uso?
Segurança
Todo siste1na precisa ter pelo 1nenos algu1nas especificações de segurança; mesmo um aplicati-
vo não protegido deve possuir tuna declaração de que foi projetado dessa maneira. U1na infor-
mação essencial que precisa ser detenninada, ,nas que não é fácil de conve1ter ern uma si,nples
pergunta, é qual o nível de importância que será dado à segurança do apl icativo e seus dados?
Tanto u1n sistema financeiro quanto un1 que registre a pontuação em jogos de golfe consideram a
segurança, 1nas o grau de preocupação provavehnente será um pouco 1nais alto em u1n deles.
Além dessa parcela da informação, as perguntas a seguir serão pontos de partida úteis na deter-
tninação das necessidades de segurança do aplicativo:
• Como os usuários serão autenticados na rede existente?
• As máquinas clientes pertencem a um domínio do Windo"vs 2000/NT?
• Se público, o acesso será anônjmo ou os usuários terão de se identificar?
• Esse aplicativo será responsável por alterações na senJ1a ou pelo gerenciamento de outros
recursos de segurança?
• Os usuários terão diferentes níveis de acesso, possivehnente com restrições para os recur-
sos do aplicativo que poderão usar?
Outras Considerações
Outros fatores essenciais no desenvolvimento de u1na arquitetura serão listados aqui, porétn, é
nessas áreas que o nível de experiência do desenvolvedor te1n a maior importância. Cotn relação
a esses pontos, não há respostas definitivas. É n1ais u1na questão de conseguir informações sufi-
cientes a fi1n de incluí-las no planejamento da arquitetura.
• Velocidade das alterações na lógica operacional - Se a lógica operacional que conduz o
siste1na se alterar rapidamente, isso afetará a freqüência co1n que o cliente e1n u1n sistema
cliente/servidor teria de ser atualizado. Alterações maiores na lógica operacional decerto
precisaria1n até mesmo de uma atualização tambén1 do cliente.
• Conjunto de habilidades da equipe de desenvolvi1nento-Algu1nas fonnas de desenvolvi-
1nento são mais co1nplexas e, po1tanto, rnais difíceis do que outras. Na 1naioria dos casos,
Arquitetura dos Aplicativos na Plataforma .NET 141
u,n siste1na cliente/servidor é mais simples de escrever do que um completo com três ca-
1nadas. Quando escolher u,na arquitetura, você poderá tentar desenvolvê-la de acordo
com o nível de habilidade da equipe ou basear a aptidão necessária na arquitetura selecio-
nada.
• Requisitos/planos futuros - Ao desenvolver a arquitetura para um sistema, você terá de
enxergar além dos requisitos atuais e considerar os de amanhã. No n1ínimo, 1nes1no se não
tiver infonnações sobre quais serão os planos futuros, desenvolva u1n siste1na que possa
ser aprirnorado. Se já souber os detalhes específicos, docu1nente-os em seus requisitos e
projete de modo apropriado. Como exemplo desse tipo de info1u1ações, imagine u1n siste-
1na planejado para ser usado por duas pessoas, mas que será aberto para a comunidade da
Web em alguns rneses.
Exemplos de Cenários
As discussões anteriores sobre os fatores essenciais se concentrara1n no que você precisa apreen-
der durante a fase de análise dos requisitos, mas isso na verdade envolve examinar várias descri-
ções co1n estilo de narrativa e tentar decifrar as informações que elas contêm. Nesta seção,
mostrarei alguns exemplos breves de requisitos de sistema e as infonnações sobre a arquitetura
que podem ser obtidas por meio deles.
Discussão
Esse é u1n cenário be1n co1nu1n -1núltiplos locais ou filiais executando a entrada de dados, e um
escritório central que deseja ser atual izado regularn1ente cornos dados desses locais (veja a Fi-
gura 5.2). As máquinas no local cliente parecen, (de acordo com essa breve discussão) ser de utn
padrão con1um e bastante novas de modo que utn aplicativo do Windows Fonns é u,na possibili-
dade, e urn do ASP.NET sempre será uma opção. Nesse caso, o fator decisivo terminará sendo a
declaração que diz que a atual ização noturna dos dados atenderá. Co1n esse comentário e uma
conexão relativa1nente lenta retornando para o escritório central, eu consideraria utn sistetna etn
que os dados ficariam armazenados nesse escritório e serian1 replicados para cada local durante
períodos lentos ou à noite, depois que cada loja fechasse.
1142 Dia 5
Os sistemas para cada loja seriam aplicativos do Windows Forms, el i1ninando, assin1, a necessi-
dade de urn servidor Web. U1n banco de dados local de algurn tipo (MSDE ou Access) seria ins-
talado em cada loja, e uma carga programada desses dados seria enviada para o escritório central
toda noite. Se, ern vez disso, fosse usado urn banco de dados central, co1n todos os escritórios
executando o seu trabalho através de uma conexão dial-up, proporcionaríarnos a vantagem de ter
os dados de todas as lojas disponíveis e atualizados no escritório central, mas o desempenho de
uma conexão via mode1n provavelmente seria um problema. U,n front-end com base na Web
que desse supo1te a fu nções que urna videolocadora em geral precisa (seria necessário pesquisar-
rnos mais para detenn inar isso), corno a impressão de recibos e talvez cartões de associados, se-
ria difícil de criar.
FIGURA 5.2
A. videolocadora
possui 11n1a arquitetura
con1un1, con1 ,nuitas
.filiais se conectando a Escritório
11111 escritório central. Central
Dados
A decisão principal é Escritório
se o cliente deve se da Filial
conectar direta,nente
ao escritório central
ou usar alg111n tipo de
depósito de dados
local.
Dados
Escritório
da Filial - - -
Escritório Dados
da Filial
Acesso Público
Considere o que seria diferente se a linha a seguir fosse incluída nos requisitos da videolocadora:
"Por fin1, espera1nos criar um site da Web público para nossos clientes, no qual eles poderão pro-
curar filmes e verificar se um certo filme existe em estoque e1n uma loja específica."
Essa declaração provoca 1nais alterações do que você pode imaginar. Corno é um 'requisito futu-
ro', poderírunos apenas ignorá-lo e projetar o siste1na com base no resto da infonnação. Isso pro-
duziria um siste1na que teria de ser redefinido logo que a ernpresa passasse para a próxi1na etapa
de seus planos. Ern vez disso, é preferível tentar desenvolver uma arquitetura que aborde os pla-
nos atuais e possa rnanipular os requisitos futuros.
A rqu itetura dos Aplicativos na Plataforma .NET 143
Se1n entramos e1n muitos detalhes, porque você con1 certeza iria precisar coletar ,nais infonna-
ções sobre os planos futuros a fi,n de criar uma arquitetura adequada para o site público da Web,
considere as alterações básicas que seriam necessárias (veja a Figura 5.3). O comentário sobre
"alguns co,nandos e,n lote trans,n ite,n os dados para o escritório central toda noite" de certo já é
incorreto. Se o site da Web disponibilizasse informações sobre os filn1es, mas estivesse atrasado
en1 un1 dia, não seria tão útil! Não é necessário obter as infonnações e,n tempo real, n1as um atra-
so aceitável teria de ser determinado (talvez 15 minutos).
Se o te1npo de espera planejado não for tão curto, então, talvez o siste1na també1n possa ser pro-
jetado co,n u1n annazena1nento de dados local e atualizações e,n lote. Para um siste,na de com-
putador, 15 ,ninutos é muito te,npo, e seria preciso u,na largura de banda ,nuito 1nenor do que en1
tuna conexão contínua. Com esse novo requisito, u1n aplicativo da Web parece mais adequado
porque todos os dados seria1n armazenados no escritório central e alguns códigos poderia1n ser
compartilhados entre os dois siste1nas. Mas um site da Web não teria u1n nível de resposta tão
bo1n quanto um aplicativo do Windows Fonns com o arn1azenamento de dados no local da loja.
FIGURA 5.3
A decisão de ter um
site público da Web Dados
alterou a arquitetura
da videolocadora para Escritório
Central
assegurar que os
dados do escritório
Escritório
central Jiquenz da Filial
atualizados.
Escritório
da Filial Internet
~ -
t\.,~f} ,;. -
Escritório
da Filial ,(~
, ! jP
,:- Escrítório ;~ )
,(~ r\-.~# /
•
Escritório
da Filial
da Filial
Escritório
da Filial
"Uma grande e1npresa i1nobiliária, de abrangência nacional, deseja informatizar suas listagens
de imóveis. Os corretores adicionaria1n as listagens diretamente a um siste,na de computador, e
u,n site público da Web seria disponibilizado para os clientes pesquisare,n as que estivessem dis-
poníveis e enviarem mensagens para os corretores apropriados. Esses precisariam do serviço de
listagens, assin1 co,no de u,n recurso para inserir listagens novas, e acessaria,n os dois de seus
1144 Dia 5
laptops. Já que esses corretores e1n geral estão viajando durante todo o dia, eles usam seus lap-
tops re1notamente a 1naior pa11e do tempo."
Discussão:
Dada a descrição anterior, você poderá extrair alguns ele1nentos essenciais logo de i1nediato.
Haverá um site da Web, que já está definido, pelo n1enos com relação à interface co1n o público.
A questão é "co1no 1nanipular a interação con1 os corretores". Eles têm de poder acessar e ainda
adicionar, atualizar e excluir as listagens que inseriram no serviço, tudo enquanto viaja,n o dia
inteiro. Podería1nos sincronizá-los co1n o siste1na quando estivessem no escritório, fazer o
download, das Iistagens em suas máquinas e carregar qualquer listage1n nova que tivessem acres-
centado. E provável, no entanto, que eles só passen1 pelo escritório ocasionalmente e, portanto,
uma nova listagem não chegaria a eles ou suas listagens novas não serian1 carregadas por cerca
de um dia. Isso é aceitável? Talvez, precisa1nos de mais infonnações.
De 1nodo alternativo, os corretores poderiam usar modetns sem fio (co1n a tecnologia dos celula-
res, con10 o COMA), que poderiatn conectá-los ao escritório central ou à Internet de qualquer lo-
cal. Por meio dessa opção, você agora teria duas escolhas: continuar utilizando o aplicativo
off-line, porém executando sua sincron.ização através de u,na conexão sem fio (resultando em
atualizações mais freqüentes) ou desenvolver o recurso adicionar/editar/excluir em u1na parte
segura do site público da Web da agência in1obiliária, http://www. nomedos i te. com. br/ agentes,
que os agentes acessariam com un1 navegador comum pelo 1node1n celular. Devido à baixa velo-
cidade (atual) desses modems celulares, gostaria de considerar as duas opções e executar alguns
testes, mas o site público poderia ser iniciado sem espera.
Como você pode ver, a arquitetura do aplicativo não é um conceito definitivo, principaln1ente
quando se lida só com uma quantidade limitada de inforn1ações sobre a situação. E1n geral, é pre-
ciso solicitar todos os requisitos possíveis, analisá-los e, e1n seguida, voltar aos diversos entre-
vistados e pedir dados adicionais. Esse processo pode ser apenas para esclarecer as perguntas
originais, ou talvez novas perguntas su1jam das respostas fornec idas.
"Como projeto prático, você irá desenvolver u,na biblioteca pessoal co1n infonnações sobre
CDs que os usuários poderão instalar em suas máquinas para registrar suas coleções. Ela dará su-
porte à pesquisa por non1es de CDs e ao rastrean1ento de títulos na Internet. Todos os detalhes so-
bre a coleção de CDs do usuário serão ar1nazenados, e o sistema pennitirá a geração de alguns
relatórios siinples que usem esses dados."
Discussão:
Esse sistema é bem simples, e a arquitetura para desenvolvê-lo ta1nbém deve ser. O único item
realinente desconhecido nele é a pesquisa de detalhes sobre os CDs na Internet, 1nas essa não é
Arquitetura dos Aplicativos na Plataforma .NET 145
uma questão relacionada à arquitetura. U1n aplicativo do Windows Forms seria o 1nais adequa-
do, porém você deve escolher um banco de dados que não seja o SQL Server porque é preferível
fazer a distribuição se1n precisar de nenhu1n software adicional nas n1áquinas dos usuários. Um
arquivo do Access (. mdb) ou um banco de dados MSDE atenderia1n satisfatoriamente a esse pro-
jeto. Co1no alternativa, todas as informações poderia1n ser armazenadas apenas como XML em
un1 conjunto de dados (DataSet).
Resumo
O universo da plataforma .NET é novo e poderoso, 1nas tudo precisa de un1a base. O projeto e a
arquitetura de seus siste1nas são críticos para a obtenção de êxito. Apesar dos novos recursos e
alterações radicais na tecnologia subjacente, a arquitetura de um sisten1a .NET não é tão diferen-
te do que era para u1n sistema do Visual Basic 6.0; 1nuitas opções ainda são as mes1nas. Certifi-
que-se sempre de basear suas escolhas nos requisitos que obtiver e não esqueça de planejar para
o futuro!
Como foi mencionado, 1nuitos aspectos da arquitetura dos sistemas estão além do escopo desta
lição, n1as o MSDN dedicou uma seção de seu site da Web para a arquitetura dos aplicativos
.NET. Acesse http: //msdn. mi crosoft. com/1 i brary /def au 1t. asp?url =/1 i brary /en-us/dnbda/
html/daag.asp para encontrar muitos recursos úteis.
P&R
P Ouvi dizer que o Windows DNA foi abandonado e não é mais aplicado agora que a
plataforma .NET exis te. Você afirmou que ele ainda é empregado, mas, na verdade,
não é um recurso ultrapassado?
R O Windows DNA representa tanto alguns conceitos quanto tecnologias. Algu1nas das
tecnologias a ele incorporadas, co1no o Visual Studio 6.0, fora1n substituídas pelas equi-
valentes da plataforma .NET, ,nas o conceito do Windows DNA (co1nputação distribuí-
da e1n várias camadas, separando as de apresentação, operacional e de dados) ainda é
válido. Os sisten1as que já fora1n desenvolvidos co,n o 1nodelo do Windows DNA serão
fáceis de transferir para o universo da plataforma .NET.
P No universo da plataforma .NET, todos os meus componentes se comunicarão uns
com os outros por meio do SOAP (XML acima do HTTP), em vez de com o velho pa-
drão binário do DCOM?
R Você está correto co1n relação ao fato de que o DCOM não é mais o 1nétodo preferido,
1nas a plataforma .NET fornece mais do que apenas o SOAP co1no um meio para dois
aplicativos se comunicaretn. O SOAP é excelente para a comunicação com a platafonna
.NET ou siste,nas que não sejam .NET e é especiahnente bo1n quando se trabalha entre
146 Dia 5
duas redes porque ele passa co1n facilidade através de firewalls. O SOAP é uma opção,
,nas há várias outras fonnas de co1nunicação incluindo os formatos binários.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e co,neçar a pensar e,n co,no colocar seu conheci,nento e,n prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Nomeie u1na vantagem relevante em usar tuna interface com usuário con1 base na Web
e1n vez de u1n aplicativo Windows.
2. Se u,n apl icativo usar um arquivo do banco de dados Access localizado em um servidor,
ele será considerado um sistema cliente/servidor ou de utna única camada?
3. O que tem de ser instalado para que un1 co,nputador execute u,n aplicativo criado com a
plataforrna .N.ET (não é só procurar um site da Web criado com ela)?
SEMANA 1
DIA
O trata,nento de exceções estruturadas é tuna estratégia para lidar com erros de hard,vare ou
soft\.vare. Tratando os dois tipos de exceção da 1nes1na maneira, o código necessário para proces-
sá-las será 1nais fácil de escrever e mais consistente. Execute o tratamento de exceções estrutura-
das para 'proteger' as seções de código que estiverem propensas a seren1 alvos de exceções. Por
exemplo, quando estiver para efetuar uma divisão, poderá proteger o código que a calcula. Se -
por causa de un1 erro que você cometeu no programa ou u1n valor que o usuário inseriu - o pro-
gra1na tentar fazer a divisão por zero, o código protegido poderia lidar com a exceção resultante.
Outras vezes e1n que se deve usar o SEH são na leitura em bancos de dados, abertura, leitura ou
gravação e1n arquivos, ou qualquer outro 1nomento em que você ache que u1n erro possa ocorrer.
-;;----- ....... Sou daqueles que crê ser difícil usar em demasia o SEH. Os benefícios que
NOTA pode obter protegendo a si mesmo, seus programas e usuários de erros com-
pensam em muito uma pequena redução no desempenho que resulte da utili-
zação do SEH. Por outro lado, seja sensato. Se não houver nenhuma
possibilidade (e quero dizer, realmente não existir a possibilidade) de um erro
ocorrer, deixe de lado a digitação adicional.
Erros e Exceções
Be.1n, em que um erro difere de un1.a exceção? Se você estiver familiarizado corn outras versões
do Visual Basic ou 1nesn10 co,n a maioria das linguagens de programação, dece1to se deparou
com o conceito de erro, mas não de exceção. Qual é a diferença? Por que precisarnos de uma pa-
lavra nova e de algo que soa tão extravagante como o tratamento de exceções estruturadas?
O Que Fazer Quando Programas Bons Apresentam Problemas e .. . 149
Primeiro, uma exceção na verdade é um erro. Parte do proble1na, no entanto, é que u1n erro signi-
fica muito 1nais. Um exemplo de erro poderia ser u1na função que retornasse um resultado que
não fosse esperado ou se o progran1ador usasse o algorit1no errado. U1na exceção é mais formal.
A exceção ocorre, para repetir a definição anterior, quando algo acontece em seu código fora do
·fluxo normal de controle. O SEH define u1na maneira particular de lidar com exceções, assegu-
rando que tudo seja non11alizado depois do fato. Alé1n disso, um outro recurso adequado das ex-
ceções é que hoje elas são co1npartilhadas entre todas as linguagens que tenha1n suporte da
platafonna .NET. Isso significa que seria possível ter u1n código que causasse un1a exceção e,n
un1a linguagem, mas a tratasse en1 outra.
A 1naioria dos erros no Visual Basic te1n sido tradicionalmente tratados com o uso da instrução
On Error. Essa instrução não é estruturada e pode resultar em um código confuso que salte de
tun local para outro de um procedimento. As exceções são tratadas co.m a utilização de uma
abordage1n 1nais estruturada, ou organizada, co1no você verá.
O Bloco Try
Você deve proteger a seção dos códigos co1n o bloco Try ... End Try a fin1 de tratar as exceções sem-
pre que ocorrerem. Inicie o código que deseja proteger com Try e finalize a seção com End Try.
SINTAXE O código a seguü· mostra a sintaxe do bloco Try ... End Try:
Try
•
Catch Ex As Exception
•
End Try
onde Try é o início da seção do código a ser protegido e End Try finaliza o bloco de código. A li-
nha Catch n1arca a seção do bloco que realmente trata as exceções que possatn ocorrer.
A Seção Catch
Marcar apenas tuna seção de código com Try .. . End Try na verdade não produz nenhum resulta-
do. Se u1na exceção ocorrer no código protegido, ela deve ser 'capturada' e tratada. Capture a ex-
ceção com a palavra-chave Catch.
Cada bloco Try ... End Try pode ter u1na ou mais seções Catch. Cada seção Catch em geral se
destina a u1n ou 1nais tipos de exceção. Se decidir ter várias seções Catch en1 seus blocos Try,
cada seção deve capturar tipos diferentes de exceção. Você pode querer fazer isso para permitir
que cada tipo de exceção seja tratado de modo diferente. Se resolver inserir todas essas seções
Catch, também é recomendável ter u1n.a seção Catch genérica que capturará todas as exceções
1150 Dia 6
que possam passar pelas outras seções. Essa fonna do bloco Try ... End Try teria uma aparência
semelhante à mostrada na Listagem 6.1 .
1 Try
2 1
ANÁLISE Esse bloco Try fo i projetado com a finalidade de capturar erros en1 un1 procedin1ento
que processa arquivos. f-lá seções separadas para tratar exceções por arquivos não
encontrados (Fi l eNotFoundExecpt i ons) , de EIS (1 OExcept i ons) e outras. Se existisse apenas uma
seção Catch, você precisaria de algu1n código que detenninasse a exceção específica. Dessa ma-
neira, fica n1ais evidente que código é usado para cada tipo de exceção.
Criaremos uin prograina co1n uma exceção intencional, de modo que você possa ver co1no ela
funciona. Examinaremos seus resultados e o que ela faz ao programa. E1n seguida, adicionare-
1nos o tratamento da exceção, e saberemos co1no ele pode proteger o código.
l. Crie um novo aplicativo do console. Chame-o de Exceptions.
2. Altere o nome do módulo criado para modExceptional.
3. Acesse a caixa de diálogo Project Properties dando um clique com o botão direito do
1nouse no nome do projeto do Solution Explorer e selecionado Properties.
4. Configure o Sta1tup Object co1no modExceptional . As configurações finais devem ficar
como as que são tnostradas na Figura 6.1.
Para atender a finalidade deste exemplo, você usará uma exceção simples e surpreendentemente
co1nun1, Division By Zero, que ocorre quando há tuna divisão por zero. Esse erro pode ser
,
de-
monstrado com facilidade dividindo-se u1n nú1nero por tuna variável não inicializada. (E uma
das causas mais co1nuns dessa exceção).
A Listagen1 6.2 mostra que aparência o código final deverá ter:
O Que Fazer Quando Programas Bons Apresentam Problemas e .. . 151
FIGURA 6.1
A caixa de diálogo .:.1
6 Ccm:n:in Ptop:st.cs
Project Pro1;erties ~ Gerr.:,ol
f)J(d
W?2Nã
QutpA type: ~rtl4) cbject:
para 11111 progrc1111a tmp:11b
.:.J ~1...-..
-
co,n 11111a exceçao.
Reftter,:e Poth
Strongr,~
Oe:$ig ,er Otf<!lúl$
lco-"AQ~>:-.
Root ~espac~:
Exct(:ÔOl"IS
~ ..-,.-...,~ - - - - ~3
C) Cc:dl~oticn Propc1tic,
JrifCffl\)tiol'I --
OK
ANÁLISE As linhas 6, 7 e 8 declara1n suas variáveis. Você usou deci1nais aqui, 1nas tambén1 pode-
ria e1npregar outros tipos de variável nu1nérica. Os valores ta1nbém foran1 inicializados.
Antes da divisão na linha 11, o valor corn o qual o divisor foi inicializado, O, não foi alterado.
Portanto, quando o computador tentar efetuá-la, u1na exceção ocorrerá. Se você executar esse
prograrna no IDE, verá um erro como o mostrado na Figura 6.2.
Se você selecionar Break, o programa ainda será executado, 1nas no ,nodo Debug (depuração).
Examinaremos 1nelhor o 1nodo Debug ainda nesta lição, portanto selecione Continue neste 1no-
1nento. Isso farácon1 que o prograrna continue a ser executado. Neste caso, ele será finalizado.
152 Dia 6
Se você reproduzir o exen1plo e tentar executá-lo e1n un1ajanela do pro1npt de co1nando, o resul-
tado final será semelhante, poré,n sua correção será mais difícil. Pri,neiro, e,n un1 co,nputador
de desenvolvimento (que tenha o Visual Basic .NET instalado), deve aparecer a caixa de diálogo
Just-In-Time Debug. Selecione No; seu programa continuará, e este resultado aparecerá:
ANÁLISE Essa é urna n1ensagem-padrão que você verá quando uma exceção ocorrer. Várias
mensagens de erro relacionadas a exceções são muito 1nais longas, no entanto, todas
contêm infonnações semelhantes. A pri,neira linha sempre identifica o tipo de exceção que aca-
bou de ocorrer. Neste caso, descobriremos que foi uma do tipo Sys tem . Di vi deByZeroExcept i on.
O tipo de exceção em geral é un,a grande indicação da natureza do erro e pode até proporcionar
idéias de co1no corrigi-la. Aqui, o tipo de exceção System. Oi vi deByZeroExcept i on informa
principalmente dois detalhes:
• A exceção que acabou de ocorrer é urna das 'comuns', isto é, que faz parte do espaço de
no,ne Systetn (e não de outro espaço de nome, coino System. 10. Fi 1eNotFoundExcepti on).
• A exceção que acabou de ocorrer envolve tuna operação de divisão. Portanto, você deve
procurar tuna possível causa e,n seu código, onde estiver efetuando u1na divisão.
De maneira se,nelhante, o restante da exceção disponibiliza muitas infonnações. As outras li-
nhas sã.o uma lista invertida dos procedimentos que estavam efetivamente en, execução quando
a exceção ocon·eu. Na saída do exe1nplo, ven1os que na verdade ela surgiu no procedi1nento
System. Decimal .Divide. Esse procedirnento foi chamado por Exceptions.modExceptio-
nal .Main.
A principal função de todas essas infonnações é localizar candidatos ao erro. Ao encontrar uma
ex.ceção, você deve pri1neiro exan, inar o código de cada um desses procedimentos. Em geral
(mas nem sempre), o erro se encontrará e1n um deles. Comece co1n o pri,neiro ite,n da lista (nes-
se caso, modExcept i ona l . Ma i n) e percorra-a até o final. Mais adiante, nesta li.ção, exatninaremos
algu1nas ferramentas que tornarão esse trabalho ,nais fácil.
Algu,nas outras exceções co,nuns estão descritas na Tabela 6. 1.
O Que Fazer Quando Programas Bons Apresentam Problemas e .. . 153
Esta não é uma lista completa de todas as exceções possíveis. Há muitas ou-
N OTA tras; por favor consulte a ajuda do Visual Basic .NET para obter mais detalhes.
Além disso, você pode criar suas próprias exceções para adicionar a essa lista
se precisar, como veremos ainda nesta lição.
Agora que você já vi u a exceção e te,n (espero) ui.na idéia melhor do que seja, deve adicionar o
SEH a seu progra1na para fornecer ao usuário 1nais infor1nações quando u1n erro ocorrer.
11 54 Dia 6
Abra o projeto Exceptions no Visual Basic .NET. Você copiará o projeto anterior e fará altera-
ções para capturar a exceção, co1no 1nostram as etapas a seguir:
1. Altere o nome do projeto para Excepti ons2. Faça isso selecionando o projeto no Solution
Explorer e, em seguida, selecione File, Save Exception As no tnenu.
2. Altere o nome do arquivo que conté1n o código para Exceptions2. vb. Faça isso selecionan-
do o arquivo no SolutionExplorer e, em seguida, selecione File, Save Excepti on. vb As.
3. Adicione u1n bloco Try . .. End Try ao código que efetua o cálculo. Use uma instrução
Catch genérica para capturar a exceção Division By Zero.
4. Adicione u1n código para exibir u1na 1nensage1n n1ais amigável quando a exceção ocorrer.
O novo código deve ficar com u1na aparência sen1elhante ao da Listage1n 6.3.
1 Module modExceptional
2
3 Sub Main()
4 '***Este código contém uma exceção,
5 'e portanto não será executado até o final
6 Dim dDividend As Decimal = 5
7 Dim dDivisor As Decimal = O
8 Dim dResult As Decimal = O
9 'Esta linha é a que causará
10 'uma exceção DivisionByZero
11 Try
12 dResult = dDiv i dend / dDivisor
13 Catch Ex As Exception
14 System.Console.Writeline(''Ocorreu um erro de divisão por zero.'')
15 System.Console.Writeline(''Verifique o divisor.'')
16 End Try
17
18 System.Console.Readline()
19 End Sub
20
21 End Module
ANÁLISE A linha 11 inicia o bloco Try, portanto, o código desse local até o primeiro bloco
Catch da linha 13 está protegido. Nesse caso, a única linha executável é a que causa a
exceção da divisão por zero na linha 12. Quando essa exceção ocorrer, o programa será interrom-
pido e procurará algo para tratar dela. Já que a seção Catch da linha 13 é genérica, capturará qual-
quer tipo de exceção. A variável Ex será usada para armazenar a exceção criada, e você poderá
empregar as propriedades dessa variável para visualizar mais infonnações sobre a exceção. Em
O Que Fazer Qua ndo Programas Bons Apresentam Problemas e .. . 155
seguida, será exibida uma mensagem de e1To, e o código continuará até o final , começando na li-
nha posterior a instrução End Try.
ANÁLISE A Listagem 6.4 é u1n exemplo de gravação en1 um arquivo. Você exa1ninará esse as-
sunto com mais detalhes no Dia 8. Porém, há dois blocos Try ... End Try neste exem-
plo. Un1 dos blocos Try (o que começa na linha 1O) está todo contido dentro do outro bloco Try (o
que começa na linha4). Portanto, o bloco Try interno está aninhado no outro bloco. Se wna exce-
ção ocorrer na gravação que acontece na lin.ha 14, a instrução Catch da linha 15 a capturará, e o
usuárioverá "Não foi possível gravar no arquivo SomeFile.out".Alé1ndisso, seoarquivonão
puder ser aberto, o bloco Catch da linha 18 capturará a exceção, exibindo "Não foi possível
abrir o arquivo: SomeFile.Out '' .
1 156 Dia 6
Exatamente con10 co1n I f ... End I f e outros blocos, não há limite para a maneira de aninhá-los.
'
As vezes, aninhar blocos pennite que a escrita do código seja feita de uma maneira mais organi-
zada do que se eles não fosse1n aninJ1ados.
A Seção Final ly
Quando você escrever blocos Try, às vezes se deparará com situações nas quais, 1nesmo se uma
exceção ocorrer, terá de executar algo. Por e·xe1nplo, se você escrever u1n código que grava in-
formações e1n utn arquivo, deve fechá-lo, ocorrendo ou não um erro durante a gravação. Adicio-
ne essa funcionalidade cotn a seção Fina 11 y. Essa seção surge depois de todas as seções Ca tch, e
deve conter apenas o código que sen1pre terá de ser executado. Esse é u1n bo,n local para fechar
arquivos, configurar variáveis co1n Nothi ng ou excluí-las quando desejar. A Listagen1 6.5 mostra
a inserção de uma seção Fina 11y no código da Listagem 6.4.
ANÁLISE Aqui, tanto Stream~Jri ter quanto Fi 1e serão fechados, mesmo se e1Tos ocorrere1n.
Embora isso não seja necessário, é boa prática fazer tuna lilnpeza sempre que não
precisar mais de uma variável.
Lançando Exceções
Ocasionalmente, pode-se querer notificar um usuário de que algo de rnuito errado aconteceu.
Pode ser algo relacionado ao seu aplicativo ou uma exceção ' normal ' . Por exemplo, você pode
ter criado dois objetos nesse aplicativo, Emp1oyee (funcionário) e Customer (cliente). Talvez queira
gerar urna exceção se o programa tentar atribuir uma instância de Emp l oyee a urna variável criada
para conter objetos Customer. E1n vez de criar un1 novo tipo de exceção, é possível reutilizar
Inva l idCastExcepti on. Assin1, u1na nova exceção Invali dCastExcepti on poderá ser gerada e usa-
da como notificação do aplicativo através da instrução Thro1i. lsso é rnostrado na Listagem 6.6.
ANÁLISE A linha importante do exemplo é a oitava. Ali, você criou u,na nova instância do ob-
jeto Inval idCastException e a 'lançou'. Isso gerará uma exceção adicional que
deve ser capturada por un1a instrução Catch ou tratada pela rotina-padrão, causando o surgimento
do depurador (se houver urn a,nbiente de desenvolvi1nento instalado) ou de urna 1nensage1n de
erro.
O trata1nento de exceções fornece urna 1naneira estruturada e li1npa de proteger seus programas
de erros devido a problemas no hardware, entradas inválidas do usuário ou a seus próprios enga-
nos. Qualquer progra,na se tornará n1ais robusto se você adicionar o trata111ento de exceção a um
código que poderia gerá-la.
Depurando
Novo TERMO
Tão iJnportante quanto a tratar apropriada1nente os erros e exceções é a depuração -
o ato (e arte) de tentar encontrar e corrigir os erros do código. E' claro que isso leva
co111 freqüência à pergunta, "En1 prirneiro lugar, por que há erros no código? Os desenvolvedores
158 Dia 6
não têm de ser astutos?". Mesmo sendo verdade que todos os desenvolvedores são talentosos
(você está lendo este livro, não?), às vezes enganos acontece1n. A.ntes que você possa remover os
erros de seus programas, passe1nos mais algum te1upo examinando como eles podeLn surgir.
que olha por ci1na de nossos ombros e imediatamente percebe o erro, causando algutn em-
baraço. Depois de alguns mo1nentos de brincadeiras, os dois voltam ao trabalho.
• Um erro causado por entradas do usuário ou pelos dados. Esses são erros dificeis de corri-
gir depois que ocorrem. A melhor solução para a entrada ou dados incorretos é reduzir a
chance do usuário inserir informações inválidas. Você examinará alguns dos controles
que pode1n ser usados para isso posteriormente neste livro. Além disso, ser lun 'progra-
1nador defensivo' tan1bém ajudará. Pressuponha que os dados sejam inválidos - você
deve verificar os valores, para ter certeza de que são apropriados e proteger as seções de
código que possa1n gerar exceções usando o trata1nento de exceções estruturadas.
Faça ]
Use Opti on Exp li ci t em todos os módulos. Não esqueça t ambém de ativar Option Stri ct.
Isso ajudará o Visual Basic .NET a detectar Essa opção assegurará que você sempre este-
muitos erros que você possa por acidente adi- ja a par quando um valor for passado a uma
cionar a seu código digitando incorretamente variável de um tipo diferente. A conversão au-
nomes de variáv eis. tomática pode levar a erros traiçoeiros. Cons-
ciente de sua necessidade, você poderá
' executar a tarefa de modo mais apropriado.
Be1n, pode haver tnuitas fontes de erros em seus progra1nas. Algu1nas delas estarão sob controle,
enquanto outras não. De qualquer 1nodo, o Visual basic .NET fornece a você 1nuitas ferramentas
para aj udá-lo a corrigir, ou depurar, seus programas.
Anos 10 15 20 25 30
Juros
5.00 1060.66 790.79 659.96 584 . 59 536.82
5.25 1072.92 803.88 673.84 599.25 552.20
1 160 Dia 6
A Listagem 6.8 mostra a tentativa inicial de criar esse programa e seu resultado, confirmando
que você precisa executar u1na depuração.
1 Option Explicit On
2 Imports System
3 Imports Microsoft.VisualBasic.ControlChars
4
5 Modul e modMain
6
7 Sub Main()
8
9 Dim slnput As String
10 Dim dbl Return As Double
11
12 'Armazena a entrada do usuário
13 Dim dblPayment As Double
14 Console.Write(''Digite o valor do emprêstimo:'')
15 slnput = Console.Readline()
16 dbl Return = CDbl(slnput)
17
O Que Fazer Qua ndo Programas Bons Apresentam Problemas e .. . 16 1
18 'Crie a tabela
19 OutputMortgageTable{dblReturn)
20 Console.Write(''Pressione ENTER para continuar'')
21 Console . Readline()
22 End Sub
23
24 Private Sub OutputMortgageTable{ByVal Principal As Oouble)
25
26 Oim iYears As Integer
27 Oim iRate As Integer
28 Oim dblAnnualinterest As Oouble
29
30 Console.Writeline(Tab &''Years'' &Tab & ''10 '' &Tab & ''15'' &
31 Tab & 11 20 11 &Tab & 11 25 11 &Tab & 11 30 11 )
32 Console.Writeline(''Juros'')
33
34 For iRate = 500 To 1000 Step 25
35 dblAnnualinterest = iRate / 100
36
37 For i Years = 10 To 30 Step 5
38 Console.\~rite(Format(dbl Annual Interest , "0. #0")& Tab & Tab)
39 'iYears * 12 para obter o número de meses (pressupondo
-..pagamentos mensais)
40 Console.Write(Format(Payment(Principal, _
41 dblAnnual lnterest, iYears * 12), 11 0. 00 11 ) & Tab)
42 Next
43 Console.Writeline()
44 Next
45
46 End Sub
47
48 Public Function Payment(ByVal Principal As Oouble,
49 ByVal Annuallnterest As Double , _
50 ByVal Periods As Integer) As Double
51 Dim dbl Monthlylnterest As Oouble = Annuallnterest / 1200
52 Return Principal * dblMonthlylnterest * 1 +
53 dblMonthlylnterest A Periods /1 +
54 dblMonthlylnterest A Periods -1
55 End Function
56
57 End Module
Anos 10 15 20 25 30
Juros
5.00 415 . 67 5.00 415.67 5. 00 415.67 5.00
415.67 5.00 415.67
5.25 436.50 5.25 436.50 5.25 436.50 5.25
436.50 5.25 436.50
5.50 457.33 5.50 457.33 5.50 457.33 5. 50
457.33 5.50 457 . 33
5.75 478 . 17 5.75 478 .17 5. 75 478.17 5.75
478 .17 5.75 478.17
6.00 499 . 00 6.00 499.00 6.00 499.00 6.00
499 . 00 6.00 499.00
6.25 519.83 6.25 519.83 6.25 519.83 6.25
519.83 6.25 519.83
6.50 540.67 6.50 540.67 6.50 540.67 6.50
540.67 6.50 540.67
6.75 561 . 50 6.75 561.50 6. 75 561.50 6.75
561.50 6.75 561.50
7.00 582.33 7.00 582.33 7. 00 582.33 7.00
582.33 7.00 582.33
7.25 603 . 17 7.25 603.17 7. 25 603.17 7.25
603.17 7.25 603.17
7.50 624 . 00 7.50 624.00 7. 50 624 .00 7.50
624.00 7.50 624.00
7.75 644 . 83 7.75 644.83 7. 75 644.83 7.75
644.83 7.75 644.83
8.00 665 . 67 8.00 665.67 8.00 665.67 8.00
665.67 8.00 665 . 67
8.25 686.50 8.25 686.50 8.25 686.50 8.25
686.50 8.25 686.50
8.50 707 . 33 8. 50 707.33 8. 50 707.33 8.50
707.33 8.50 707.33
8.75 728.17 8.75 728.17 8. 75 728.17 8.75
728 .17 8.75 728 .17
9.00 749.00 9.00 749 . 00 9.00 749.00 9.00
749.00 9.00 749.00
9.25 769 . 83 9.25 769.83 9.25 769.83 9.25
769.83 9.25 769.83
9.50 790.67 9.50 790.67 9.50 790.67 9.50
790.67 9.50 790.67
9.75 811.50 9.75 811.50 9.75 811.50 9.75
811 . 50 9.75 811 . 50
10.00 832.33 10.00 832.33 10.00 832.33 10.00
832 . 33 10.00 832 . 33
será o 1nodo Design. Para confirmação sobre qual modo estáe1n uso, exa1nine a barra de título da
janela. Depois das palavras ' Microsoft Visual Basic', aparecerá [design]. De 1naneira se1ne-
lhante, quando u1n programa for executado no IDE, vere1nos [run], significando que esse é o
modo Run. O últi,no modo é Break, ou Debug. Esse 1nodo surgirá se o progran1a que estiver em
execução for interrompido de algu1na fonna. Essa inte1Tupção pode se dar devido à ocorrência
de un1a exceção, ou o n1odo Break pode ser introduzido no IDE. Veja a Figura 6.3 para ver um
exemplo do IDE no modo Break. Observe que a barra de título inclui o marcador [break].
li
'
• ::J
lei • ......
11 IM Q <:. e~
• ]gil
~J@~ 9.. .. ~
• Gj
i!tJ - ':. ,.. ~ ~
~ *~~
,nodo Break.
.-..,..vt,[Codoll <• X
l<~motv) .:] !(l)c<Lv-.S) CiJ @) ili i5
•· S~Ukll\~' (2p-o~ts)
Di.- :,Input. 1:1 St.-rino
Di• db1Rct.urn .l:, Doublc . e ª°"""-
~ Rcfeuinces
- !!) -....vb
'Get. user Input.
DUI dblPt\',ISl'ICnt. ,.. Doublo
coo.sol e . vr 1t.eL1n~ ("E11t.e:r t oan amount.: "J
~Input.• con:sole,Rea.d.L1nc()
Stop
dblReturn • CObl (slnput.J
tnd Sub •
•
• ' •
l.OC:iils o [1 rommand Wndow - lnwned1..ite ti> l'3
I~ VOU. T
d:lf>~ O Ooutle
<l*tetun O Dcuble:
SIIIC:Yt 'l '2'1X1X/' St,"'J
Use o ,nodo Break para auxiliar na depuração de seus programas. Nesse ,nodo, são disponibili-
zadas várias ferramentas por meio das quais você poderá visualizar o conteúdo de variáveis, 1no-
nitorar ou alterar o fluxo do programa, ou testar blocos de código. Essas ferra1nentas terão u,n
valor inesti1nável na revelação e correção de erros em seus programas. Se quiser introduzir o
modo Break, en1pregue a palavra-chave Stop, con10 mostra a Figura 6.3.
Co1no alternativa, você pode inserir utn ponto de interrupção na linha onde gostaria que o pro-
grruna fosse interro,npido. Ele será executado normalmente até que atinja a lin.ha e, em seguida,
passará para o ,nodo Break e retornará ao IDE. Seu programa ainda estará e1n processa1nento e1n
segundo plano, mas se encontrará em tuna pausa. Um ponto de inte1Tupção pode ser inserido em
seu código de utna entre três maneiras:
• Dê u1n clique na 1nargem colorida esquerda da janela do código, próxin10 à linha na qual
gostaria que estivesse o ponto de interrupção. U1n círculo vennelho deve aparecer na
1nargem.
• Dê um clique co,n o botão direito do mouse na linha do código e selecione Inse1tBeakpo-
int. Um círculo vermelho deve aparecer na 1nargem.
164 Dia 6
• Selecione Debug, New Breakpoint no n1enu. Isso abrirá a caixa de diálogo New Breakpo-
int (veja a Figura 6.4). Essa caixa é o meio mais flexível de criar um ponto de interrupção.
Ela não só pennite que você defina u1n ponto de interrupção para encerrar o programa
quando uma linha for atingida, como ta1nbém que os crie para situações em que uma va-
riável for alterada ou alcançar um valor específico, ou siinples,nente em que uma certa
condição for verdadeira.
New Breakpolnt
FIGURA 6.4
- ,... 1Md,.,,, 1o... 1
Caixa de cliálogo & e.okCIXCCI.ÓOn ~ tho Qr0!70m ,NCMs tNs loc:6\ioo J'I • hntion.
New Breakpoint.
E"""'°"'
ua,, I•
'""'''.." ~1,- -
'"""'°"··· 1(no""-·>
~"""'··· 1b!e,k-
OK I CN>Cfl H,lp
• • •
I
--dod
Q ,..... ii;;1 1.0<A1s!~wo<ch1 :mcdlSl.oci<l@&e-.. :;J c......-><1 ... El °"""'1 0 t"""" 1
i,, 16 Col9 Õ,9 [ím
FIGURA 6.6
E.,'(ibindo o cabeçalho.
6. Após interromper o programa, transfira a linha de código que exibe a taxa de juros en1
cada linha da tabela para que fique antes do início do segundo laço For. O resultado deve
ter a seguinte aparência:
Antes:
For iYears = 10 To 30 Step 5
Consol e.Write(Format(dblAnnuallnterest, "0.#0") & Tab &Tab)
Depois:
Conso l e.Write(Format(dblAnnuallnterest, "0.#0") & Tab & Tab)
For iYears = 10 To 30 Step 5
7. Pressione Step Into para continuar a execução do progra,na. Observe que a seta amarela
está nova1nente no início do procedimento Out putMortgageTab l e. O Visual Basic .NET
reco,npilou e recarregou o procedi,nento co1n as alterações.
8. Agora se você percorrer o código até a linha da etapa 4, deverá ver apenas cinco valores
exibidos nessa linha, con10 na Figura 6.7. Eles ainda serão valores incorretos, ,nas pelo
,nenos u,n dos erros foi corrigido.
FIGURA 6.7
Prilneira correção.
9. Execute o progra1na até o final usando antes Step Out para retornar a Sub Mai n. Exa1nine
a janela do console para ver os valores errados (eles são os 1nes1nos para todas as Iinhas).
Em seguida, retorne ao IDE e selecione Continue para finalizar o progra1na.
168 Dia 6
Examinando as Variáveis
Além de investigar o tluxo da lógica de seu aplicativo, o Visual Basic .NET fornece ferramentas
que pennite1n a visualização do conteúdo das variáveis. Isso pennite detenninar se seus conteú-
dos representarn o que você definiu e se o cálculo está correto.
Exatamente como quando percorreu o código, há várias ferramentas que você pode usar para
monitorar as variáveis. Algumas das n1ais úteis são rnostradas na Figura 6.8 e descritas a seguir:
• Pesquisa ern janela suspensa Se você rnantiver o cursor do mouse posicionado sobre
u1na variável do procedi1nento atual, tuna pequena janela aparecerá mostrando seu valor
no momento. E' possível ver isso na Figura 6.8, e1n que a variável dbl Return atualn1ente
annazena o valor 100000. Essa é uma ferra1nenta útil e prática se só quisennos fazer uma
verificação breve de u1n valor ocasionahnente. Outro beneficio dessa ferra1nenta é que se
pode selecionar a parcela de u1n cálculo para saber seu valor, se1n precisar que todo ele
seja executado.
• Janela Locais Esta janela e1n geral aparece na parte inferior da tela quando se está no
1nodo Break. Caso contrário, selecione-a na opção Windows do 1nenu Debug. A janela
Locais 1nostra todas as variáveis do procedi1nento atual, assiin co1no seu tipo e valor no
1nomento. Isso é prático quando se está percorrendo um código, porque os valores ficarão
com a cor ver1nelha quando forem alterados. A janela Locais será útil sempre que você
depurar um procedimento que altere os valores das variáveis.
• Janela Watch Esta janela e1n geral aparece na parte inferior da tela quando se está no
1nodo Break. Caso contrário, selecione-a na opção Windows do menu Debug. A janela
Watch mostrará as variáveis as quais você estiver interessado. Dê um clique co1n o botão
direito do mouse nas variáveis e selecione Add Watch para adicioná-las à janela. Se elas
estivere1n no escopo, o valor atual será exibido. Senão, ela o informará que, "O nome
[no,ne de sua variável] não foi declarado". Esta janela é útil para monitorar um grupo de
variá.veis. E1n vez de só exa1niná-las quando estiverem na janela Locais, será possível
rnonitorá-las durante toda a sessão de depuração.
FIGURA 6.8 elo tdt l)ow l)ojo<t ~ld C,,,.,,, lod' li!, _ U,b
•
CoMol c , vru.e LtrieO
t:cxt.
Pnf'C9,III 100000
cll~tnt.e1f'St 6.ZS
R«• 625
H~s $5
•
.....
lf
_..... · """"°"' ... El o..cw. lEl '""'""
Ln'41 COISI ChSI
1
- ft'iis
Mesmo começando com uma declaração, essa li nha é executáv el por causa da
atribuição.
3. Execute o progra1na até que alcance o ponto de interrupção. Insira 100000 para o valor do
emprésti1no.
4. Quando o programa entrar no modo Break, exan1ine ajanelaLocals. Observe que ela in-
clui todos os valores de Principal, Annuallnterest e Periods. Do 1nes1no ,nodo, se você
1nantiver o cursor do 1nouse sobre u1na variável (por exen1plo, Annua l Interes t) no 10.E,
deverá ver u1na janela suspensa 1nostrando o valor atual.
5. Avance u1na etapa para processar essa Iinha. Podemos notar que a variável
dbl Monthlylnterest se alterou e ficou vermelha na janela Windows.
6. Selecione o código
1 + dblMonthlylnterest A Periods
En1 seguida, ,nantenha o cursor do mouse sobre o texto selecionado. Umajanela suspensa apare-
cerá, informando que o valor é 1. U1n cálculo rápido em algum local confirmará que isso estará
correto se você executar prilneiro a operação exponencial e, e1n seguida, a adição. No entanto, o
valor certo deveria ser aproxilnada1nente 1.647 porque a adição deve ser efetuada antes, e só en-
tão elevaría1nos o resultado à quantidade referente aos períodos. Esse erro será repetido na se-
gunda metade da função. Acrescente parênteses ao cálculo de ,nodo que as adições sejam
executadas antes e, então, teste o valor novamente.
7. De maneira se1nelhante, o cálculo como u1n todo sofre de uma grande carência de parênte-
ses. Interrompa o programa e altere a linha de cálculo para que fique como a descrita a seguir:
170 Dia 6
DICA
Os parênteses não custam nada. Quando você estiver escrevendo uma função
matemática, não economize em seu uso - empregue quantos precisar para se
certificar de que as operações sejam efetuadas na ordem correta. Como alter-
nativa, é possível colocar cada etapa em uma linha, embora isso exija mais va-
riáveis temporárias no cálculo.
FIGURA 6.9
Tabela correta da
hipoteca.
Uma boa idéia é isolar seções de código que sejam específicas do sistema ope-
DICA racional ou da interface com o usuário nos procedimentos. Assim, quando
você precisar alterar a interface com o usuário, só terá de substituir o procedi-
mento, e não o código que o utiliza.
Depois que você tiver feito todas as alterações no programa do exemplo, ele deve ficar se1ne-
lhante ao 1nostrado na Listagem 6.9.
1 Option Explicit On
2 Imports System
3 Imports Microsoft.VisualBasic.ControlChars
4
5 Module modMain
6
7 Sub Main()
8
9 Oim slnput As String
10 Oim dblReturn As Oouble
11
12 'Solicite a entrada do usuári o
13 Oim dblPayment As Oouble
14 Conso l e .Write( ''Oigite a quantia do emprêstimo:'')
15 slnput = Console.Readline()
16 dblReturn = CObl(slnput)
17
18 'Crie a tabela
19 OutputMortgageTable(dblReturn)
20 Console.Write( ''Pressione ENTER para continuar'')
21 Conso l e.Readline()
22 End Sub
23
24 Private Sub OutputMortgageTable(ByVal Principal As Oouble)
25
26 Oim iYears As Integer
27 Oim iRate As Integer
28 Oim dblAnnualinterest As Oouble
29
30 Console.Writeline(Tab & ''Years'' & Tab & ''10 '' & Tab & ''15'' &
31 Tab & ''20'' & Tab & ''25'' & Tab & ''30'')
32 Conso l e .Writeline( ''Juros'' )
33
34 For iRate = 500 To 1000 Step 25
35 dblAnnuallnterest = iRate / 100
36
37 Console.Write(Format(dblAnnuallnterest,"0. #0") & Tab & Tab)
38 For iYears = 10 To 30 Step 5
39 'iYears * 12 para obter o número de meses (pressuponha pagamentos
• mensais)
40 Console.Write(Format(Payment(Principal,
41 dblAnnual Interest , i Years * 12), "0 . 00")& Tab)
42 Next
43 Console.Writeline()
172 Dia 6
44 Next
45
46 End Sub
47
48 Public Function Payment (ByVa l Princ ipal As Double,
49 ByVal Annuallnterest As Double, _
50 ByVal Periods As Integer)As Double
51 Dim dblMonthlylnterest As Double = Annuallnterest / 1200
52 Return Principal * (dblMonthlylnterest * _
53 ((1 +dblMonthlylnterest) A Periods) / _
54 (((1 +dblMonthlylnterest) A Periods) - 1))
55 End Function
56
57 End Module
• Disassembly Disponível no 1nenu Debug, quando se está no modo Break. Esta é uma
ferramenta avançada que 1nostra a linguage,n de máquina efetiva criada para o programa
e só será reahnente útil se você conhecer a 1nontage1n.
• Threads Disponível no menu Debug, quando se está no modo Break. Esta, é uma fer-
ramenta avançada que 1nostra as linhas de execução ativas em um programa. Util quando
se executa uma progra1nação co1n múltiplas linhas de execução no Visual Basic .NET.
O Visual Basic .NET fornece 1nuitas ferra1nentas que o ajudarão a disponibilizar programas sem
erros. A melhor 1naneira de conhecer as ferramentas e saber quais delas o auxiliarão mais, é tes-
tá-las. E1n vez de tentar eliminar os erros co1n a leitura do código, percorra-o 1ninuciosamente,
investigue os valores das variáveis utilizadas e isole as falhas empregando essas ferramentas.
Resumo
Todos os progra1nas tê1n erros. Algumas vezes, o erro está na pessoa que executa o progra1na.
Em outras, há realmente uma falha ou erro no código. Isso pode acontecer porque o autor do pro-
grruna não testou todas as possibilidades de entradas ou não protegeu o programa da fa lta de ar-
quivos ou bancos de dados. Em qualquer dos casos, é sua responsabil idade, co1no
desenvolvedor, tentar assegurar que nenhu1n desses erros faça o usuário perder infonnações.
Você deve se esforçar para tornar seus progra1nas tão livres de erros quanto possível. As ferra-
mentas de depuração do Visual Basic .NETo ajudarão nessa tarefa. Certifique-se de usá-las para
percorrer seu código e de que o fl uxo se encontre da fonna que foi planejado. Assegure que as
variáveis armazene1n os valores corretos e que os cálculos sejam exatos.
De 1naneira se1nelhante, você pode proteger o programa de erros adicionando o trata1nento de
exceções estruturadas às seções críticas de código. Pontos propensos à falhas - como onde o có-
digo abre arquivos, lê ou grava informações, ou faz cálculos - deve1n ser inseridos em blocos
Try ... Catch ... End Try. Esses blocos trata1n os erros de 1nodo sofisticado, pennitindo perfeita-
mente que o usuário continue a usar o programa.
Na próxi1na lição, você trabalhará co1n objetos. Co1no poderá ver, já esta1nos fazendo isso; no
entanto, estudaremos o assunto com 1nais detalhes no Dia 7, "Trabalhando com Objetos".
P&R
P O que acontecerá se eu tiver algum código antigo que use n Error Preciso reescre-
vê-lo para empregar o tratamento de exceções estruturadas?
R Não. Se incluir a referência Microsoft . Visual Bas i e, poderá continuar a usar On Error
Goto e On Error Resume Next. Alé1n disso, o objeto Err está disponível para você.
1 174 Dia 6
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e,n co,no colocar seu conheci,nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Dê o no,ne de três ferra1nentas que pode,n ser usadas para visualizar o conteúdo de utna
variável enquanto você estiver no n1odo Break.
Exercícios
J. Você acabou de herdar o bloco de código a seguir. Ele solicita ao usuário dois valores.
Em seguida, calcula e exibe u,na tabela com a multiplicação de todos os valores entre os
dois núrneros inseridos. Por exemplo, se o usuário inserir 5 e 9, o resultado deve ser se-
tnelhante a
Adicione o trata1nento de exceções e depure o código da Listagem 6.10 para assegurar que ele
gere o resultado desejado.
2. Conforn1e avançar no livro e tiver problemas co1n seu código, tente usar as ferra1nentas
de depuração para corrigir o progra1na. E1npregue pontos de interrupção para isolar se-
ções que você achar que possan1 conter erros, percorra o código e utilize as janelas Lo-
cais e Watch para 1nonitorar as variáveis.
176 Dia 6
DIA
O uso de objetos pen11itirá que seus programas sejam dedicados às entidades com as quais você
estiver trabalhando, cujo objetivo final será produzir siste,nas que sejam fáceis de compreender
e aprimorar. E1n vez de um programa e1n que todas as infor,nações e códigos relacionados a ape-
nas u111a entidade esteja111 espalhados por todo o aplicativo, uma abordagem co,n base no objeto
consolidará essas infom1ações trazendo-as para a definição do objeto.
Classes e Instâncias
Para co1npreender os objetos você terá de passar rapidamente para o conceito de classe. As clas-
ses, co1no nas classificações, descrevem um grupo ou tipo de entidade, e todos os objetos são
1ne1nbros de alguma classe. Elas são a descrição de um objeto, fornecendo detalhes que definem
seu con1portamento e relatando que tipos de inforn1ação estão disponíveis sobre ele. Podería-
tnos, por exemplo, ter u1na classe Car (carro). Ela nos relataria que as informações a seguir esta-
ria1n disponíveis sobre um carro: sua cor, velocidade, peso, 1narca, modelo e ano. Todos esses
itens são atributos do objeto, parcelas descritivas de infonnação às quais nos referi,nos co1no
propriedades. Além dessas propriedades, a classe ta1nbém descreve o que o objeto pode fazer e
co,no. Esses comportamentos e,n geral são cha,nados de métodos do objeto, e un1 objeto carro
poderia ter tnétodos como "VirarEsquerda", "Avançar", "DarRé" e assirn por diante. E' co1n o
uso dessa classe, que fornece i1úormações sobre as propriedades e n1étodos do objeto,junto a al-
guns outros detalhes, como u1n n1odelo, que os objetos são criados.
Retornando ao exernplo do carro, a classe seria a sua especificação, o projeto que descreve co.,no
ele funciona e se parece. Essa classe é então usada para criar muitos carros, cada um com uma
existência própria, mas todos eles baseados na .1nes1na especificação. Todos possuem as mesm.as
propriedades porque elas provêm da especificação, co,no a cor, n1as cada tnn pode ter u1n valor
diferente para essas propriedades (carro azul, carro vern1elho, carro a,narelo e assim por diante).
Todos os carros ta1nbé1n co,npartilharia,n os 1nes1nos con1portan1entos ou ações (os 1nétodos da
classe), como "Avançar'' e os que fosse,n construídos a partir da mesma especificação executariam
essa ação da 1nes1na maneira.
Criar u1n carro com base na especificação é equivalente a gerarmos u,n objeto com base em uma
classe. Portanto, enquanto o Ford Thunderbird seria u1na classe, o T-Bird azul de Bob seria um
objeto. Cada tnn desses objetos é, individualmente, un,a instância da classe e não há li,nite para
quantas podem ser criadas. Todas as instâncias compa1tilha1n o 1nodelo, ou descrição, fornecido
por sua classe. Isso significa que todas as instâncias da classe Car terão as 1nes1nas propriedades
e 1nétodos e se comportarão da mesma maneira. No entanto, cada instância terá valores próprios
para suas propriedades; todos os carros tên1 uma propriedade e1n con1un1 que é a cor, n1as cada
um deles possui uma cor diferente.
Referências
En1 programação, u,n conceito adicional é introduzido, o da referência a utn objeto. Utna variá-
vel de objeto, qualquer variável declarada co,no u,n. objeto de algun1 tipo (Di m myCar As Car),
Trabalhando com Objetos
não contém o objeto proprian1ente dito, n1as apenas un1a referência a ele. É diferente dos tipos
co1nuns de variáveis, co1no os inteiros ou strings, nos quais elas armazenrun diretamente o valor.
Isso significa que mais de uma variável de objeto pode se referir, ou apontar, ao mesmo objeto.
E1n geral, esse não é o caso. O objeto é criado e usado e1n uma variável, 1nas é importante com-
preender a diferença entre os objetos e outros tipos de variáveis a esse respeito.
=---
NOTA
A finalidade desta lição não é ensinar tudo a respeito de classes, e sim o sufi-
ciente sobre a construção de classes para que você compreenda as que já fo-
ram criadas. Esse conhecimento será útil para se aprofundar no .NET Frame-
work no Dia 8, "Introdução ao .NET Framework", e ele fornecerá uma visão
inicial para o desenvolvimento de seus próprios objetos no Dia 15, "Criando
Objetos no Visual Basic .NET".
Abra o Visual Studio .NET e crie tun novo projeto (E1npty Project) na pasta Visual Basic Pro-
jects (veja a Figura 7 .1 ).
Esse projeto não contém arquivo de nenhu1n tipo, portanto precisamos adicionar um a ele; sele-
cione Project, Add Class no menu. Isso adicionará u1na classe vazia ao projeto (chan1e-a
e l sCa r. vb ), um ótin10 ponto de partida para esse exercício. Agora, foi criado un1 shel I de uma
classe nesse arquivo, fornecendo o código a seguir:
Publ ic Class clsCar
End Class
Neste ponto, uma classe foi criada, mas está completa1nente vazia. Agora, dentro desse shell, pode-
01os co1neçar a descrever as propriedades e métodos dos objetos de nossa classe Car. Qualquer iten1
que inserirn1os nessa classe fará parte de todas as instâncias do objeto criadas a partir dele. Por en-
quanto, adicionaren1os as prop1iedades Make, Mode l e Co l or.
180 Dia 7
!'o:ew Pmject E3
FIGURA 7.1
Utn projeto vazio é ·8 VM Bosk ProiO(U
iniciado se,n conter D Vlsu.:I C# Pro!C(U
Cl \llsud e++ ~º""'
nenhurn arquivo. D Seb.!pa-.d D«:kr/meot Pror.t"ts conook \Vk'\cb~,;:
C!J Cl <w< Pro)O(t, ~O:atbn 5~
a
LC) V1M1 9.u:lkl SCMtcos
~
Em:(y Wtb t->,r1 Pro"« Jn
PrnV'. tt F',ci<iin, Fd~r
[An EffiPI.Y ~ o,e,it fe. (Jeat:íng
-
a lou:l ãppkêttiM li
r Add to 5oMbi
NEf;ISolJtlantme: 1Pw6jectl j P' Crel!it:edr&ttOryfc..SolJtlon
·~·
Pto)ed w,t be c,e.,t~ at O:\...\Dl.,nc4ftmo\f'tt Oocunenu\V&ud St:udo Pto,ed1\ProJe<t.1\Pto)ect r.
Hóp
Propriedades
As propriedades são atributos de um projeto que você pode recuperar e configurar, e que podetn
ser adicionados a urna classe de urna entre duas maneiras. O prin1eiro método, e ta1nbém o n1ais
si1nples, é declarar u1na variável como Pub li e. Con10 discuti1nos no Dia 3, "Introdução à Progra-
tnação con1 o Visual Basic .NET", Pub li e descreve o escopo da variável. No caso de uma classe,
qualquer ite1n que for declarado co,no Pub l i e estará disponível para todas as pessoas que usarem
essa classe. Em nossa classe, apenas incluir a linha Dim Year As Integer não criaria tnna proprie-
dade exposta porque Year só estaria disponível internamente. Se fôsse1nos declarar Year como Pu-
bl ic Year As Integer, então, de repente ela seria exposta e,n todas as instâncias desse objeto.
Instruções de Propriedade
Como alternativa, as propriedades podem ser declaradas co1n o uso de tuna sintaxe Property es-
pecial:
Dim myVar as <Tipo de dado da propriedade>
Publi c 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 definição da propriedade, Get e Set, representa1n a recuperação do valor dela e
a configuração desse valor. Em geral, o código de Get só retorna o valor de uma variável interna
(uma variável no nível da classe que representa a propriedade, normalmente com o prefixo mpara
indicar um valor membro), e o de Set insere um valor (que é fornecido por 1neio da pala-
vra-chave especial Va l ue) na1nesn1a variável interna. Para irnplementar a propriedade da cor em
cl sCar, podería1nos usar um código como o da Listage1n 7.1.
Trabalhando com Objetos 181
3 End Sub
4 End Module
Esse novo procedimento Mai n ( ) é o ponto de partida de nossa solução. Seu código será executa-
do quando processannos esse aplicativo, e é aí que escreveremos as instruções que trabalharão
com nossa nova classe. Para começar a usá-la, primeiro ternos de criar urna variável do tipo apro-
priado:
Dim objCar As clsCar 'ou Chapter7.clsCar, examinaremos melhor esse ponto
posteriormente
Essa linha parece estar declarando urna variável co,nurn, co1no urna string ou um inteiro, 1nas ela
é muito diferente. Aqui, ternos urna variável que poderia conter a referência a um objeto do tipo
cl sCar, 1nas que na verdade não armazena nada. Quando declaramos uma variável alfanun1éri-
ca, urna string é criada. Embora possa não ter nenhurn dado, ela realmente existe. Nesse caso,
não ternos nada em objCar. Portanto, a próxima etapa é criar u1na instância de nossa classe, o que
podemos fazer com a palavra-chave New:
objCar = New clsCar()
Agora sim criamos uma instância de cl sCar e atribuímos à variável objCar uma referência a esse
novo objeto. Já podemos, por meio de objCar, acessar as propriedades desse objeto:
1 objCar.Color = ''Red''
2 objCar.Make = ''Ford''
3 objCar.Model = ''Escort''
Essas propriedades podem ser recuperadas corn muita facil idade:
Dim sCarDesc As String
Trabalhando com Objetos
sCarDesc = objCar.Color & " " & objCar.Make & " " & objCar.Model
Já que os objetos funcionam por referência, podemos criar variáveis adicionais, todas apontando
para o 1nes1no local:
1 Dim objCar As clsCar
2 Dim objCar2 As clsCar
3 Dim sMake As String
4 objCar = New clsCar()
5 objCar2 = objCar
6 objCar.Make = "Ford"
7 objCar2.Make = ''Chevy''
8 ' objCar2 . Make é igual a objCar. Make
Compare isso co.1n u1na variável que não seja de objeto, co1n.o tuna string, em que o valor real é
transferido entre os locais:
1 Dim sFirstValue As String
2 Dim sSecondValue As String
3
4 sFirstVa l ue = ''Dog''
5 sSecondValue = sFirstValue
6 sSecondValue = ''Cat''
7 ' sFirstValue <> sSecondValue
Nonnahnente, quando lidamos co1n variáveis, logo que elas saem de escopo (veja o Dia 3 para
obter mais inforn1ações sobre as variáveis e o escopo), deixa1n de existir. Já que múltiplas variá-
veis pode1n apontar para u1n único objeto, as regras que controlam a eli1ninação dele são u,n
pouco diferentes. Quando todas as variáveis que fazem referência ao objeto não existirem 1nais,
ele se tornará inacessível e acabará sendo eliminado pelos serviços e1n segundo plano da plata-
forma .NET. Esse processo, que é chamado de coleta de lixo, permite que o progra1na crie e
libere livren1ente os objetos sabendo que o siste1na o aco1npanha, li1npando tudo que é desnecessá-
rio. Dessa 1naneira, a platafonna .NET faz a lin1peza para seu programa, fornecendo outro serviço
subjacente para que nenhum dos códigos precise se encarregar desse tipo de operação.
figurar a propriedade Co l or com qualquer valor alfanumérico, mesmo se ele nem fosse uma cor
(obj Ca r. Co l or = 11 John 11 ) . Para tornar nossa representação do objeto Car um pouco mais sofisti-
cada, poden1os adicionar um trecho de código que verifique qualquer valor infor1nado en1 u1na
lista de cores e rejeite o que não tiver uma correspondência. Isso envolve reescrever a rotina da
propriedade Color corno mostra a Listagem 7.3.
Agora, uma tentativa de configurar a propriedade com u1na cor inválida (inválida na lista interna
de nosso código, que considera a cor popular ' lilás', por exemplo, como inadequada) resultará
no lançamento de u1na exceção. Para obter 1nais informações sobre as exceções e o tratamento
de erros com base nelas, veja o Dia 6, "O Que Fazer quando Progra,nas Bons Apresentam Pro-
blemas e para Se Certificar de Que Isso Não Aconteça". Con10 descrito nessa lição, podemos tra-
tar corretan1ente essa exceção reescrevendo nosso código de teste (contido em Sub Ma i n ( ) ) para
que inclua u1na estrutura Try ... Catch. Esse código alterado é 111ostrado na Listagem 7.4.
Traba lhando com Objetos
Além da validação da propriedade, que por si só já é poderosa, uma classe pode conter uma fun-
ção ou sub-rotina que não faça parte de nenhu,n código de recuperação ou configuração da pro-
priedade, gerahnente cha,nada método. Os tnétodos são criados para fornecer uma
funcionalidade relacionada a um objeto e etn geral agetn co,n base nas infonnações da proprie-
dade (porque estão disponíveis). Para nossa classe cl sCar, wn rnétodo útil pode ser gerar o tem-
po de existência do carro co1nparando a data e a hora atuais co1n u,na propriedade desse que
represente sua data de produção. Criar a propriedade da data de produção é relativatnente sim-
ples. Será do ,nesmo modo como a propriedade anterior exceto que é uma data, e adicionar esse
1nétodo é mes1110 tão fácil quanto criar tuna função pública na definição de nossa classe.
Primeiro, a nova propriedade:
1 Dim m dtManufactured As Date
2
3 Public Property Manufactured() As Date
4 Get
5 Return m dtManufactured
6 End Get
7 Set(ByVal Value As Date)
8 m dtManufactured = value
9
-
End Set
10 End Property
186 Dia 7
Se criássemos essa função como privada, ela poderia ser utilizada a partirdes-
NOTA sa classe, mas não estaria disponível para nenhum outro código. Como alter-
nativa, também podemos declarar elementos de nossa classe (propriedades,
funções, sub-rotinas) como Fri end. Essa declaração assegura que códigos
dentro da mesma montagem possam acessar essas partes da classe como se
fossem públicas, mas que elas estejam ocultas (privadas) para qualquer códi-
go externo à montagem da classe. (As montagens serão abordadas com deta-
lhes como parte da implantação no Dia 19, "Implantando Seu Aplicativo"; por
enquanto considere-as como as várias partes de uma mesma solução.)
Depois que tivennos adicionado esse código a nossa classe, podere1nos cha1ná-lo por meio de
qualquer instância (obj Ca r. GetAge ( ) ), co1no na Listagem 7.6.
E1n algu1nas situações, o novo método seria mais adequado co1no tuna propriedade (que, então,
renomearíamos para Age, já que seria um atributo, e não tuna ação) porque na verdade não exe-
cuta nenhutna ação e só retorna u1n valor. Para nossa classe Car, um exemplo melhor de método
poderia ser algo relacionado à ação, como Sta rt Eng i ne, cuja i1nple1nentação é fornecida na Lis-
tagem 7.7.
Com esse código adicionado a cl sCar, teríamos disponível u,n 1nétodo mais orientado à ação.
Por meio de tuna co1nbinação de propriedades (algumas com código e outras sern) e rnétodos, é
possível criar objetos co1nplexos. Lembre-se de que todos os objetos que compõetn o .NET Fra-
mework (co1no System.Console e outros) fora1n construídos de acordo corn essas regras, e os
que você criar terão as n1esmas características deles. A única diferença existente entre os objetos
do .NET Framework e os seus é que esses não precisa,n ser escritos no Fra1nework!
Tópicos Avançados
Embora as propriedades e métodos permitam que você crie objetos complexos e poderosos, o
suporte ao objeto na plataforma .NET possui 1nuitos outros recursos além desses básicos. Os re-
cursos avançados facilitarão a representação de conceitos e entidades en1 nosso código, produ-
zindo u111 siste1na 1nais shnples e1n tennos de utilização, 1nanutenção e expansão. Apesar de esse
suporte ser a1nplo, forneceremos u1na visão geral das cinco áreas principais: sobreposição, he-
rança, construtores, espaços de nome e n1embros estáticos da classe.
Sobreposição
Esta seção aborda os aspectos básicos da sobreposição; detalhes adicionais serão discutidos no
Dia 15, quando criannos nossos próprios objetos. A sobreposição penn ite que u1na única função
ou sub-rotina com vários parâmetros diferentes seja chamada. Isso possibilita que um só méto-
do, por exe,nplo, aceite os parâmetros em combinações distintas ou usando tipos de dados diver-
sos. Portanto, voltando ao nosso exe1nplo de cl sCar, seria possível projetar o método GetAge de
modo que ele pudesse funcionar de uma entre várias maneiras. A implernentação existente não
usa parâmetros e retorna a diferença en1 dias entre a data atual e a de produção, mas talvez tam-
bém quiséssemos permitir que o usuário de nosso objeto solicitasse a diferença entre a data da
produção e qualquer outra aleatória e ainda especificasse a unidade de tempo a ser usada. Para
fazer isso sem esse conceito de sobreposição, tería,nos de criar u1na função diferente para cada
chamada possível, como na Listagern 7.8.
Todas essas funções na verdade são apenas variações de GetAge, 1nas cada lista de parâ1netros di-
ferente e seu código correspondente precisa de seu próprio nome de função. Com a sobreposi-
ção, elitnina1nos essa restrição e pode1nos criar todas essas funções usando o 1nesmo nome,
GetAge. Para usar esse recurso, tudo que precisamos fazer é adicionar a palavra-chave Overl oads
à fi·ente de cada (incluindo a original) declaração de função (antes de Pub 1i e) e alterar todos os
no,nes das funções para que usem apenas um:
Publi c Overloads Function GetAge() As Long
End Function
----- -
N OTA
Cada declaração de função deve ser diferente de alguma maneira - quantidade
de parâmetros, tipo de dados do parâmetro ou do valor de retorno-, ou não
poderá ser usada.
A sobreposição representa o conceito de que a 111esma ação ou solicitação pode ser usada de várias
maneiras e pennite que você use esse recurso na modelagem de seu objeto sen1 ter de recorrer à
criação de diversos 1nétodos diferentes (GetAge, GetAgeFromDate e outros). Essa técnica é usada
e1n todo o .NET Framework para pennitir a chamada de funções co,n vários conjuntos de parâ-
1netros diferentes. Considere, por exe1nplo, o método System. Conso 1e. Wri teL i ne, que pode ser
chamado usando qualquer u1na das 18 listas diferentes de parâ1netros. Como o Frarnework de-
monstra, essa é uma maneira útil de si1nplificar os objetos e fornecer 1nais opções aos progra,nas
que os usa,n.
FIGURA 7.2
ri'> tdt !llO>o &oloct ~ Q<wl IOOls - !!<lo
J'odas as versões 1$l· tri · ~ liloTi lill>e ,..,: ,.•. JJ. c.f ,·......,
disponíveis de 11111a ' . '
) - - - - .. . . ~-- •• ~ :i t> X
.função serão ,nostradas _:] 1.M...,
por meio do Syoec:m.Coru,olc , llciç.cL1ne ( "\lboop~ ... l
lntelliSense quando tn<:I Tcy
você usar o T/isual :,CO lo r • 9J?JS:6Ji ~S:9.19&
ObJCOt. Get.t.oe (
ln~ I"' 3 of 3 .,, Getf'9! h,Unit At StrlltQ) As ÍÕnç!
Z:nd Y.odule
I
Pul>lie Cla:,., e b ( o.r
• J Oi.JS m_dtftanuf.a.ecurt!:d l.:s Date
Q, IS
Herança
Para algumas pessoas, este é um dos recursos 1nais estimulantes do Visual Basic .NET - um re-
curso considerado fundamental para a criação de sistetnas co1n base e,n objetos e que faltava no
Visual .Basic até esta versão. Não vou questionar essa opinião, n1as de alguma forma consegui
desenvolver sisten1as por muitos anos, se1n a herança, antes que a platafonna .NET chegasse.
Independentemente disso, a inclusão da herança na linguagen1 do Visual Basic é un1 recurso im-
portante e vale uma pequena discussão.
Como já abordei nesta lição, os objetos são maneiras de você representar conceitos ou entidades
no código, e todos os recursos de objetos no Visual Basic foram projetados para ajudá-lo a tornar
a representação o mais útil possível. Em muitas situações, uma entidade ou conceito na verdade
1190 Dia 7
é o que chamaríamos de um subobjeto de uma entidade ou conceito n1ais básico. Vários exem-
plos disso são usados en1 livros de progra1nação e infelizmente não apresentarei nada tão revolu-
cionário. Considere nossa classe de objetos criada para representar carros, co1no um Ford
Mustang, u1n Toyota Celica ou urn Chevy Cavalier, A classe teria várias propriedades, como Do-
ors (quantidade de portas que o carro possui), MaxSpeed, Co l or e outras.
A classe Car geral, na verdade, contêm várias subclasses de objetos, corno Hatchbacks e Conver-
ti bl es. E' claro que essas classes teriain todas as propriedades de sua classe-pai, Ca r, como Do-
ors, MaxSpeed e Co l or, mas tambén1 poderiam ter propriedades exclusivainente suas. U1n carro
de dois ,nódulos poderia ter propriedades que descrevessern o tamanho e o co1nporta1nento de
sua porta traseira. Esse relacionan1ento, entre Car e suas subclasses, Hatchback e Convertible,
seria considerado u1n relacionamento pai-filho, e o método para representá-lo em nossos siste-
1nas é chamado herança. Diz-se da classe Hatchback que ela é herdeira de sua classe básica, Car.
Esse relacionatnento significa que, além de qualquer método e propriedade criados na clas-
se-filha, ela tan1bé1n possuirá todas as propriedades e n1étodos herdados do seu pai.
O exen1plo anterior foi iniciado co1n nossa classe Car e seguiu dai e1n diante. Use1nos o mes1no
ponto de partida, Car, e sigamos em direção a um exemplo 1nais detalhado de herança. Para co-
meçar, poderíamos ter uma classe básica Vehi cl e para representar qualquer tipo de veículo (bar-
co, carro, caminhão, avião) e que possuísse as propriedades MaxSpeed, NumberOfPasssengers,
Colore Descri pt i on. Essa classe seria faci11nente representada em tun código do Visual Basic,
como 1nostra a Listage1n 7.9.
O código que é usado em vários proceditnentos dessa classe não é relevante para nosso exen1plo,
portanto o deixaremos de fora por enquanto. Se passássemos para algum outro código, tentando
usar nosso objeto (que poderia ser o da sub-rotina Sub Ma i n ( ) de nosso projeto, co,no em exem-
plos anteriores), perceberíamos que é possível criar objetos do tipo Vehi e 1e e trabalhar com suas
propriedades, co,no na Listage,n 7 .1 O.
Agora, adicionando u1na classe co1nple1nentar a nosso projeto (veja a Listagern 7.11), podemos
criar urna classe (Car) que herde características de Vehi c1e, exatarnente corno a classe real de ob-
jetos Car é uma subclasse ou filha da classe Vehi cl e. Já que esta1nos gerando uma classe projeta-
da para tratar apenas de carros, podetnos adicionar duas propriedades (NumberOfDoors e
NumberOfTi res) específicas dessa subclasse de Vehi c1e.
A parte essencial desse código é a linha Inherits Vehicle, que informa ao Visual Basic que a
classe é filha de Vehi cl e e, portanto, deve herdar todas as propriedades e n1étodos dessa classe.
Novamente, não há nenhum código inserido na definição de qualquer dessas propriedades por-
que isso não é relevante no mo1nento. Depois que esse código estiver posicionado, sem nenhun1
esforço adicional, poderernos ver o efeito da instrução Inheri ts.
Voltando a nosso procedi1nento 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 urna classe herdada adiciona novos métodos ou propriedades, diz-se que a classe básica
está-se estendendo. Além da extensão, ta1nbé1n é possível que un1a classe-filha sobreponha al-
gu1na ou toda a funcionali dade da classe básica. Isso acontece quando a classe-filha implen1enta
um método ou propriedade que ta1nbé1n é definido na classe-pai ou básica. Nesse caso, o código
da classe-filha será executado e,n vez do código do pai, pennitindo que você crie versões espe-
cializadas da propriedade ou método básico.
Para tuna classe-filha sobrepor alguma parte ela classe básica, essa parcela deve ser 1narcada com
Overri dab 1e na definição da classe básica. Por exemplo, na versão de Vehi e1e listada anterior-
mente, nenl1u1ua de suas propriedades possuía a palavra-chave Overri dab 1e e, portanto, as
classes-filhas não poderiam fornecer suas próprias i1nple1nentações. Em lnna dernonstração
de como a sobreposição é configurada nas classes básica e filha, o código da Listage,n 7.12 n1ar-
cará a função Descri pt i on ( ) con10 podendo ser sobreposta e, e,n seguida, a sobreporá na clas-
se-filha Car. Observe que as pa,tes não relevantes das duas classes forarn re,novidas para dar
maior clareza.
Trabalhando com Objetos 193
1
·di'-•--·
ldi' c.b
, . Ge<lypo
d/WWW
rf/ lJ..t:ôetOfPas~s
or;., • "
:i..:,.,cnqcc:t .. 6
!!" ••
•
- .. Rc:d"'
-
,,;;rflc...•_.-.
__ ·Of_l•_.,_ __,.ed • 100
•
~·=====;::;::;--------------'--
· - ~~_..,- ~ - ~·_j
- iG O.W !0 1
o.e l 'M
Quando sobrepuser um método ou propriedade, con10 fizemos na Listage111 7 .12, você poderá se
referir nova1nente ao membro original da classe básica usando o objeto interno MyBase. Por
exemplo, para se referir ao método Descri pt i on ( ) existente na classe Vehi c1e, podería,nos cha-
mar MyBase. Descri pt i on ( ) de dentro do 1nétodo Descri pt i on ( ) de Car. Esse recurso pennite o
11 94 Dia 7
CôDIGO LISTAGEM 7.13 Uma Classe-Fi lha Agi ndo como uma Instância da
Cl ass e-Pai (continuação)
10
11 objVehicle.Color = "Red"
12 objVehicle.MaxSpeed = 100
13 End Sub
A instância de Car representada por objCar foi facilrnente i.nserida na variável obj Vehi c l e, e des-
se ponto em diante poderia ser tratada co1no u1n objeto Vehicle. Esse fato, de que um obje-
to-filho pode ser usado como se fosse tnna instância da classe-pai, pennite a criação de un1
código genérico que funcionará co1n u1na classe ou qualquer uma de suas subclasses. Essa é utna
das ,naneiras co1no a herança pode ser en1pregada para gerar soluções melhores, n1as há n1uitas
outras. Apresentei uma visão geral do assunto herança, e ele merece u,na discussão adicional
tanto do ponto de vista do projeto quanto da implernentação. Por essa razão, esse tópico e outras
abordagens relacionadas a objetos serão examinados com n1ais detalhes no restante do livro.
Construtores
Quando você deseja usar um objeto, tem de trabalhar com uma instância exjstente ou criar a sua.
A instância de um objeto é gerada co,n a palavra-chave New, que e1nprega a classe especificada e
estabelece uma área na rnemória para a instância dessa classe. Os construtores são uma maneira
de for11ecer infonnações para essa classe no momento etn que é gerada para permitir que ela
tnesma se inicialize ou execute outras tarefas de configuração nessa hora. Se uma classe for urn
construtor, e muitas classes do .NET Fran1ework são, então, em geral é possível fornecer parâ-
rnetros no 1no1nento da criação, como parie da charnada a New. O código a seguir tnostra esse tra-
balho na criação de u,n novo objeto de exceção (veja o Dia 6 para obter mais info1111ações sobre
as exceções e outros tópicos de tratatnento de erros), fornecendo utna tnensagem de erro como
parârnetro para seu construtor. Essa 1nensage1n de erro será usada de n1odo auto.mático pelo
novo objeto para preencher u1na das propriedades.
Dim exError As System. Exception
Dim sMess age As Stri ng
sMessage = "Essa será a mensagem de erro . "
exError = New System. Exception(sMessage)
A criação de um construtor para nossa classe Vehi el e é relativamente fácil. Pri n1eiro, você preci-
sa gerar u,n método chamado New que seja público e não tenha parâtnetros.
Publi c Sub New ()
End Sub
Após concluir a criação desse construtor (isso ainda não produz nenhum resultado), você verá
pouca diferença em seu código, e até que adicione,nos algurna funcionalidade a essa sub-rotina
New( ), nada diferente acontecerá. O construtor, mesrno sern parâmetros, pode ser usado como
1 196 Dia 7
um local para inicializar variáveis internas, como a data de produção de nossa classe Vehicle
(veja a Listage1n 7.14).
Exata1nente como co1n qualquer outro 1nétodo de u1n objeto, é possível sobrepor esse e fornecer
1nais de utna maneira de chatná-lo. Ao contrário dos outros métodos, n.o entanto, sobrepor o
construtor não requer o uso da palavra-chave Overl oads. Você pode apenas criar 1núltiplas ver-
sões do procedimento New, e cada u1na será tratada como urna versão disponível do construtor. E1n
nosso caso, podería1nos rapidamente gerar alguns construtores úteis (mostrados na Listagem 7.15)
considerando as diferentes maneiras nas quais algué1n pode querer inicializar nosso objeto.
No caso de uma classe-fi lha, aquela que herda características de outra classe, você pode querer
chamar o construtor da classe básica de seu procedimento New. Isso pode ser feito fac ihnente
con1 o uso do objeto especial MyBase, empregando um código como MyBase.New( ).
Trabalhando com Objetos
Espaços de Nome
O espaço de non1e é um conceito abstrato usado para agrupar vários ,nódulos ou classes, permi-
tindo que você categorize logican,ente todos esses objetos dentro de um único objeto de nível su-
perior. Pottanto, tendo Namespace Chapter7 no início de nossas classes e End Namespace no final,
cria1nos de 1nodo efetivo u1n agrupa1nento chamado Chapter7, que contén1 todas as nossas
classes dentro dele. Depois que esse espaço de nome existir, será usado con10 padrão para referên-
cias a objetos feitas em um código dentro do 1nesmo espaço de no1ne, mas tambén1 poderá ser
declarado explicita1nente (Dim objCar as Chapter7 . Car).
Há 1nuitas razões pelas quais você pode querer criar e usar espaços de nome, e não são poucas
delas a base do 'espaço de nome' identificador, co1no un1a 1naneira de gerar uma área privada
para assegurar que os no1nes de sua classe sejam exclusivos. Pela defi11ição de um espaço de
no1ne, nossa classe Car se torna Chapter7. Car, e, po1tanto, não entrará mais e1n confl ito co1n ne-
nhuma outra classe criada co1n o no1ne Ca r.
Outra razão mais sutil para usar os espaços de nome é porque produze1n u1n código em que a ma-
nutenção é mais fácil. O agrupa1nento de classes sob espaços de norne de nível superior resulta
em urn código que é definido claramente por algutn esquerna de categorização sendo, po1tanto,
1nais legível e sua 1nanutenção mais si1nples.
Etn nossos exen1plos no decorrer deste livro, podería1nos ter criado espaços de no1ne co1n base
no título da lição (por exe1nplo, o código integral desta lição seria inserido sob o espaço de nome
Dia7), podendo todos eles, en1 seguida, ser posicionados sob um espaço de nome 1nais abrangen-
te com relação ao livro chamado AprendaVB. Nossas classes poderiam ser criadas apenas coino
Di a7, n1as para assegurar que não houvesse ambigüidades, tambétn podería1nos nos referir a elas
com seu no1ne totahnente qualificado (AprendaVB. Dia7 .Car, por exemplo).
Esse método de agrupar classes é se1nelhante ao conceito de escopo que foi discutido no Dia 3;
urna classe só tem de ser exclusiva dentro de seu espaço de nome específico. Se por acaso você
criar u1na classe que compartilhe seu nome cotn outra que exista em um espaço de nome diferen-
te, então, precisará se certificar de especificar o no1ne completo da classe sempre que fizer refe-
rência a ela de fora de seu espaço de non1e.
Os espaços de nome são hierárquicos, o que pennite que você crie tun esque1na com vários níveis
para agrupar suas classes e objetos, exatamente como dentro do próprio .NET Fratnework. Há duas
maneiras de criar um espaço de nome de nível inferior. Defma-o usando o no1ne totaln1ente qualifi-
cado (veja a Listagen1 7. 16) ou anitlhe as definições dos espaços de nome (veja a Listagem 7.17).
CôDIGO LISTAGEM 7.17 Usando Espaços de Nome Aninhados para Criar Hie-
rarquias de Objetos
1 Imports System
2 Namespace MyApp
3 Namespace Console
4 Module Main
5 Sub Main()
6 Dim objHl•I As New MyApp.Console . Uti l ities()
7 obj HI~. Pri ntOut ()
8 End Sub
9 End Module
10
11 Public Class Utilities
12 'Run the application
13 Public Sub PrintOut()
14 Console.Writeline(Environment.MachineName)
15 Censo l e. ~/ri tel i ne (Envi ronment. SystemDi rectory)
16 Console.Writeline(Environment.GetlogicalDrives())
17 Console.WriteLine(Environment.Version.ToString())
18 End Sub
19 End Class
20 End Namespace
21 End Namespace
Trabalhando com Objetos
E1n seus aplicativos, você pode usar os espaços de nome como uma 1naneira de agrupar códigos
conceituahnente relacionados, mas alé,n de seu efeito no escopo das classes, eles não são real-
1nente necessários na construção de u1n sisten1a.
CÓDIGO LISTAGEM 7.18 Funções Internas do Visual Basic 6.0 Foram Substituí-
das pelos Métodos Compartilhados no Visual Basic .NET
1 Imports System
2 Module Main
3 Sub Main()
4 Dim dtToday As Date
5 dtToday = DateTime.Today()
6 End Sub
7 End Module
Esses ,nembros co,npartilhados pode1n ser criados em seu próprio código quando você quiser
que u1n método ou propriedade em particular esteja sempre acessível, se1n a sobrecarga de gerar
u1n objeto. Em geral, no entanto, evite usar esse recurso a menos que seja reahnente necessário
porque ter 1nuitos mernbros co1npartilhados é quase o 1nesmo que apenas criar um 1nódulo cheio
de procedi1nentos e reduz o significado de seus objetos. Le1nbre-se de que Modul es é u1n tipo es-
pecial de Class, todos os men1bros de 1un módulo são considerados co1npartilhados (Shared) por
padrão.
Resumo
O .NET Framev,iork é un1a biblioteca de classes que você pode usar en1 seus aplicativos, todas
elas construídas a partir dos princípios básicos da prograrnação orientada a objetos, comuns às
linguagens .NET. Esses princípios (o conceito de classes, instâncias, propriedades, n1étodos, he-
rança e assi1n por diante) ta1nbé1n serão a base da criação das classes de sua autoria dentro do Vi-
1200 Dia 7
suai Basic .NET. Para desenvolver qualquer aplicativo que vá além do exen1plo n1ais simples,
será necessário empregar o .NET Frame\.vork e, co1n freqüência, ta1nbé1n será preciso gerar suas
próprias classes, tornando a utilização de objetos unia habilidade essencial para todos os progra-
madores da platafonna .NET. Nesta Iição abordamos, por 1neio da criação de nossas classes como
exe1nplo, conceitos básicos orientados a objetos e mostra1nos como implen1entá-los em u1n código
de sua autoria. Na próxima lição, Dia 8, introduziremos as classes disponíveis no .NET Frame-
\.vork e ilustraremos corno e1n pregá-Jas para desenvolver poderosos aplicativos .NET.
P&R
P Nunca trabalhei com uma linguagem orientada a objetos antes; posso ficar apenas
nos procedimentos e módulos?
R Você não precisa criar objetos no Visual Basic .NET, mas achará difícil usar essa lingua-
gem se1n e1npregar pelo menos alguns deles, con10 o .NET Framework. Por essa razão, o
enfoque inicial para u1n desenvolvedor que não conheça objetos é se fan1iliarizar com
sua utilização antes de passar para sua criação.
P Li que, no Visual Basic .NET, não é possível dizer exatamente quando um objeto
será eliminado e que esse é um fator limitante por várias razões. O que significam
esses comentários, e eles são verdadeiros?
R Quando se trabal_ha co1n objetos, sua elin1inação nem sempre ocorre e.,n u1n ponto defini-
do do código, portanto, será difíci l fazer co1n que u1n certo n·echo desse s~ja executado
sempre que u1n objeto for destruído. Em algu1nas linguagens, incluindo as versões ante-
riores do Visual Basic, havia um 1necanis1no disponível para adicionar u1n código ao
procedi,nento de um 'evento de eliminação' . O código inserido em um procedi1nento
desse tipo teria sua execução garantida sempre que o objeto fosse e!i,n inado. No Visual
Basic .NET, o subsistema de coleta de lixo eliminará os objetos quando necessário, mas
não é possível criar um código que seja processado na hora da destruição. Em geral, essa
' limitação' não causa 1nuitos proble,nas, mas às vezes (principahnente quando se trans-
fere um código antigo do Visual Basic) há a expectativa da execução de u1n código no fi-
nal do ciclo de vida do objeto, e isso não é facihnente transferido para uma
i1uplementação do Visual Basic .NET.
Workshop
O Workshop foi planejado para aj udá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar eiu co1no colocar seu conhecimento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Trabalhando com Objetos 201
Teste
1. Se urna classe tiver um método n1arcado corn MustOverri de, o que mais acontecerá?
2. Qual a palavra-chave que você pode usar em um construtor para cha1nar o de u1na classe
básica?
3. O que está errado nos construtores sobrepostos desse código (veja a Listage1n 7.19)?
Exercícios
Por 1neio da herança, das classes, das propriedades e dos métodos, crie u1n exemplo de hierar-
quia de classes co,neçando e,n Ani1nal e descendo alguns níveis co1n algurnas classes ilustrativas.
202 Dia 7
SEMANA 1
Revisão
Agora que você tem1inou sua trajetória pela prin1eira se1nana de lições, já deve ter uma boa com-
preensão da progra1nação, do Visual Basic .NET e de co1no tudo se encaixa. (Dias 1 e 2). Ta1nbé1n
criou alguns exe1nplos de progra,uas na plataforrna .N.ET, usando tanto o lDE quanto a Jinha de co-
mando para compilá-los. Com essa experiência, já pode testar todos os exernplos deste livro e até
.
cnar os seus.
A lição sobre os tipos de dados e as técnicas básicas de programação usadas na criação de aplica-
tivos do Visual Basic .NET (Dia 3) forneceu-lhe urna boa introdução à programação sirnples. O
Dia 4 apresentou as instruções condicionais (inclusive as instruções r f) e laços, dois itens que
serão ernpregados e1n quase todos os progra1nas que vier a escrever. Pelo fato de o Visual Basic
.NET permitir a geração de tantos tipos diferentes de progra1nas, por rneio de uma grande varie-
dade de projetos e diversos arquivos-fonte, o Dia4 abordou as opções de arquitetura para desen-
volver todas as espécies distintas de sisternas que a platafortna .NET pode ser usada para criar.
Independentemente da sua habilidade em programação, erros sempre ocorrem em progran1as.
Não irnportando se eles poderia1n ser evitados, as técnicas de tratamento de erros abordadas no
Dia 6 permitem que você lide com o problema de maneira sofisticada. Para concluir,já que gran-
de parte do .NET Frrunework é baseadaen1 objetos, o enfoque da lição do Dia 7 foi sobre os ter-
mos e conceitos necessários para possibilitar o uso de objetos em seus próprios programas.
Todas essas informações, be1n como a prática da codificação que as aco1npanhou, devem tê-lo
preparado para encarar o pri1neiro projeto corno bonificação (The Ga,ne of Life - O Jogo da
Vida). Esse projeto, que você pode encontrar acessando a página Web deste livro no site
www.makron.com.br (veja a Introdução para maiores detalhes), alé1n de conduzi-lo na criação de
urn prograrna real completo, ilustra o uso de i.nstruções condicionais, arrays, laços, variáveis e até
técnicas de tratamento de erros mostradas no decorrer das lições que acaban1os de concluir. Leia o
material, desenvolva o projeto e faça testes co1n os resultados durante algurn ternpo. Quando esti-
ver pronto para seguir em frente, tente modificar o código para alterar co1no o progra1na funciona,
criando a sua própria variação dele.
SEMANA 2
Visão Geral
Durante esta se1nana, você se aprofundará realmente no esti1nulante mundo do
.N-ET Fra1nework. Ela co1neça co1n u1na lição no próprio Frame\.vork (Dia 8),
incluindo detalhes sobre o uso das classes Conso 1e. Ma th. Random e Envi ronment,
e infonnações sobre toda a excelente funcionalidade das listas e arrays forneci-
da pelo Fra1ne\.vork. Além de todas essas particularidades, essa lição ta1nbé1n
inclui u1na introdução a co1no encontrar o recurso necessário no .NET Fra,ne-
work por sua própria conta - infonnações valiosas quando você iniciar projetos
de sua autoria usando a platafonna .NET.
As próximas duas lições, Dias 9 e IO, enfoca1n a criação de uma interface co1n o
usuário en1 seus aplicativos, para Windows (usando os fonnulários Windovvs,
Dia 9) ou para a Web (usando a tecnologia dos forn1ulários da Web, aborda.da
no Dia l O). Poucos progrrunas são executados sem alguma interface con1 o
usuário, o que torna essas duas lições absoluta1nente essenciais.
Quase todo aplicativo ernpresarial existente usa algum tipo de banco de dados,
po1ianto, você passará duas lições exam inando esse tópico. O Dia 11 aborda os
conceitos subjacentes aos bancos de dados e o conduz pela criação de u111 deles
para u111 aplicativo de registro de CDs. O Dia J2 dá prosseguimento à Iição so-
bre dados 1nostrando con10 se conectar ao banco de dados de seu exemplo e de-
senvolver um aplicativo que permita adicionar, editar e excluir CDs de sua
coleção.
O trabalho co1n os bancos de dados introduzirá você no Server Explorer, ,nas o
Dia 13 mostrará corno usar seus vários recursos. Nessa lição, trabalhare1nos
co1n contadores de desempenho e registros de eventos, e aprenderemos u1na
rnaneira rnais fácil de configurar u1na conexão de banco de dados.
1 204 Semana 2
Para concluir, no Dia 14, você aprenderá alguns dos ,nais avançados recursos orientados a
objetos do Visual Basic .NET, incluindo a herança e a sobreposição. Essa lição realn,ente torna-
rá mais claro o poder dessa versão do Visual Basice mostrará como é possível usar esses recur-
sos para projetar sistemas que seja,n mais fáceis de estender e tenha,n uma 1nanutenção mais
si,nples.
No final da Se1nana 2, você terá aprendido tantos recursos do Visual basic .NET que estará pron-
to para criar aplicativos complexos. O projeto de bonificação número 2 (Parte 1 do Projeto de
Bônus 2) fornecerá a prática por 1neio de algu1nas dessas técnicas novas.
Semana 2
•
DIA e
nheci1nentos valiosos que o aj udarão no desenvolvi,nento de mais aplicativos corno Visual Ba-
sic .NET.
Hoje, você aprenderá:
• O que é o .NET Framework.
• Algu1nas classes importantes do .NET Framework.
• Co1n o encontrar o que precisa no .NET Fra,nework.
Alé1n disso, o .NET Frame~ ork possui o Common Language Runtime (CLR), que é responsável
1
por executar seu código. O CLR oferece várias inovações i1nportantes que afetam os desenvol-
vedores de aplicativos .NET no Visual Basic .NET ou e1n outras linguagens que tenham suporte.
A principal alteração é que agora todas essas linguagens são compiladas para a Microsoft lter-
mediate Language (MSIL). E1n seguida, ela é conve1tida pelo CLR e1n código nativo quando é
executada pela primeira vez. O resultado final é que você se beneficiará do desempenho de um
código totalmente compilado, e não de um que seja interpretado no ten1po de execução.
Ainda há 1nais, todas as linguagens que têm suporte do CLR usam o 1nes1no tipo de dados. Isso
significa que é 1nuito ruais fáci l para duas (ou 1nais) linguagens interoperare1n. Anteriormente,
se você precisasse passar inforn1ações de uma linguagem (co,no a C++) para outra (diga,nos o
Visual Basic), poderia ter de executar algumas conversões para interpretar de modo apropriado a
variável. Agora, já que as duas linguagens emprega rã.o o mes,no tipo de dados, isso é simples. O
CLR pennite que os desenvolvedores utilize1n a linguage1n co1n a qual se sentem 1nais confo1tá-
veis, podendo ainda se co1nunicarem com outras.
Embora o CLR seja importante, ele em geral funciona e1n segundo plano. A parte essencial e vi-
sível do .NET Framework que você deve exa1ninar são algumas das classes que o compõern.
Console
Você já viu algumas das classes Console quando desenvolveu aplicativos anteriormente. Os mé-
todos \~ri tel i ne e Readl i ne dessa classe têm sido usados com frequência para exibir resultados
e ler códigos de vários dos aplicativos do console, ou de linha de comandos, criados no livro até
agora. Essa é a utilização mais irnportante da classe Console. No entanto, há alguns recursos me-
nos en1pregados dela que vale a pena exarninar. Alguns dos métodos essenciais desta classe são
mostrados na Tabela 8. 1.
Introdução ao .NET Framework
Método Descrição
Lê informações da linha de comandos (ou outro código). Não precisa que
Read a linha termine com Enter.
Lê informações da linha de comandos. Lê todos os caracteres até o Enter,
Readline sem incluí-lo.
Altera o destino das mensagens de erro a serem exibidas enquanto seu
SetError programa estiver em execução. Pode ser usado na criação de um meca-
nismo simples de registro de erros em seu aplicativo.
Altera a origem da entrada de Read e Readl i ne. Pode ser usado na altera-
Setln ção de um aplicativo de linha de comandos para que leia um arquivo ou
local de rede. Veja a seção "Redirecionamento", mais à frente nesta li-
ção.
Altera o destino dos métodos Wri te e Wri tel i ne. Pode ser usado na alte-
SetOut ração do destino da saída para registro ou outra finalidade. Veja a seção
"Redirecionamento", mais adiante nesta lição.
Write Exibe informações na linha de comandos (ou outra saída). Não termina
com uma nova linha.
l~ri tel i ne Exibe informações na linha de comandos (ou outra saída). Termina a saí-
da com uma linha nova.
Novo TERMO Concatenação é ,uai.s uma palavra sofisticada que quer dizer ' combi11ação de
'
strings' . E1n vez de somar as strings co.m o símbolo+, como faze1nos co.111 os nún1e-
ros, é usado o símbolo &, como en1
Console.Writeline("Insira" & ITEM_COUNT &
Se você tiver uma string co1nplicada, pode ser difícil lidar co1n todas as aspas e E comerciais. Em
vez de construir uma string co1nplexa usando a concatenação, é possível utilizar esses espaços
reservados nos locais certos e incluir posterionnente as variáveis que serão empregadas em seu
preenchimento, como descrito a seguir:
Console.Writeline(''Insira {O} itens. Pressione ENTER entre os itens. '',
ITEM_COUNT)
O item {O} é um espaço reservado para a variável que você incluiu no final da string. Ela é ava-
riável ITEM COUNT das instruções anteriores. É possível inserir vários espaços reservados (ou até
1 208 Dia 8
mes1no usar o mesmo diversas vezes) na string. Assim, as variáveis que forem incluídas depois
da string serão inseridas nela e1n orde1n, começando co1n o item "Oº" (primeiro ite1n) e dando
continuidade, percorrendo as variáveis e espaços reservados em seqüência ({O}, { 1}, {2} e as-
si1n por diante). A Listage1n 8.1 de1nonstra esse recurso.
1
CÓDIGO LISTAGEM 8.1 Usando a Classe Conso 1e para Entradas e Resu 1ta dos
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( 1'Insira {O)itens.'' &_
8 Pressione ENTER entre os itens.",ITEM_COUNT)
9 For I = O To ITEM COUNT-1
10 sltems(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(sltems(I))
16 Next
17 End Sub
18 End Class
ANÁLISE O código da Listagem 8.1 é be1n simples e pretende den1onstrar apenas algumas das
'
maneiras co1no você tem usado a classe Conso 1e nessas sete lições.
,
A linha 1 Ílnporta o espaço de no,ne System. E nesse local que a classe Conso 1e é definida, assin1
cotno 1nuitas outras classes i1nportantes. Portanto, você deve se1npre iinportar esse espaço de
no1ne na 1naioria dos aplicativos. O lDE do Visual Basic .NET fará isso auto1naticamente para
aplicativos que forem criados quando ele estiver e1n uso.
Dentro da única classe definida e1n seu arquivo, você declara apenas uma constante, ITEM_COUNT
(linha 3), e uma sub-rotina Mai n (linha 4). A constante é usada para substituir a inserção do nú-
rnero 10 e1n todo o código, prevendo o caso de se querer alterar o valor posteriormente. É muito
mais fácil alterar só o valor da constante, e1n vez de ter de procurar todas as ocorrências desse va-
lor no aplicativo inteiro. O uso de u1na constante ta1nbé1n mostra que o desenvolvedor sabe que
os valores estão relacionados. Se tivéssemos repetido o nú1nero 10 etn todos os locais e exami-
násse,nos esse código seis meses depois, podería1nos não le,nbrar se todos indicaria,n o mes1no
valor ou se seria somente uma coincidência.
Introdução ao .NET Framework
O procedimento Shared Sub Ma i n é, cotno você já viu 1nuitas vezes, o pritneiro método executa-
do e,n u.tn aplicativo. Dentro do procedimento, você declara u1n array de strings (linha 6) e o pre-
enche co,n o método Console. Readl i ne.
A linha 7 é digna de nota. Dentro do item exibido con1 Conso 1e. Wri teli ne (ou Conso 1e. Wri te),
você pode inserir vários caracteres, como o item {O} no n1eio da string da linha 7. Posteriormen-
te, cada u1nadessas linhas será preenchida com variáveis. Essas são incluídas depois da string na
cha1nada de Conso 1e. Wri tel i ne, co1no fizemos co1n a constante ITEM_COUNT.
Cada linha da entrada é lida(linha I O) e exibida e,n utn dos elementos do array. Observe que es-
ses ele1nentos são numerados de O a 9 (linha 9).
Para concluir, os ele1nentos são exibidos na tela en1 orde1n inversa. Isso é feito co,n o uso da
cláusula Step da instrução For ... Next (linha 14). Eles são exibidos utn por vez na saída atual,
co1no ven1os na linha 15. A Listagem 8.2 demonstra esse tipo de saída.
9 Girafa
10 Hipopótamo
11 Iguana
12 Chacal
Redirecionamento
Redirecionamento significa apenas'enviar algo para um local diferente' . Quando lida1nos com a
classe Console, isso quer dizer que você pode alterar o local onde fará a leitura ou exibição. Por
exemplo, ela poderia ser usada para exibir o resultado de u1n aplicativo que recebesse entradas
de linhas de comandos ou de un1 arquivo. De 1naneira se1nelhante, você poderia e1npregar Con-
sole. Wri tel i ne quando depurasse o aplicativo em testes e, em seguida, o redirecionasse a urn
arquivo a fi1n de criar u1na ferramenta simples de registro para ele.
Você pode redirecionar a entrada, o resultado ou as informações de erro de seu programa. Essas
infonnações pode1n ser redirecionadas para qualquer destino onde houver TextReader (para en-
tradas) ou Textl~riter (para saídas e erros). Observe que não é possível criar nenl1uma dessas
duas classes diretarnente, já que são abstratas. E1n vez disso, é preciso gerar urna das classes que
imple1nentará ou herdará características de TextReader ou TextWri ter (veja o Dia 7, "Traba-
lhando co1n Objetos" e o Dia 14, "Introdução à Prograrnação Orientada a Objetos", para obter
mais detalhes sobre a abstração e a herança). Algumas das imple1nentações dessas duas classes
permite1n ler e gravar em arquivos, locais na rede e assi1n por diante. A Listagem 8.3 mostra
co1n.o se pode alterar o exemplo mostrado na Listagern 8.2 para que envie o resultado para um ar-
quivo em vez de para a janela das linhas de co1nando. Observe que os co1nandos de Conso-
1e. Wri tel i ne não fora1n alterados; somente o destino foi.
14 Console.Writeline()
15 Console.SetOut(oFile)
16 Console.Writeline("ltens em ordem inversa:")
17 For I = ITEM_COUNT - 1 To O Step -1
18 Console.Writeline(sltems(I))
19 Next
20 oFile.Close()
21 Console.SetOut(oOut)
22 Console.Writeline(''Concluído'')
23 Console.Readline()
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 Dugão
7 Équidna
8 Tentilhão
9 Girafa
10 Hipopótamo
11 Iguana
12 Chacal
1 212 Dia 8
13
14 Concluído
ANALISE A única alteração entre as Listage1n 8.1 e 8.2 foi o acréscimo das linhas 2, 8, 9, 15,
20, 21 e 22. Essas são as linhas que crian1 o arquivo, e provoca1n e encerram o redire-
ciona1nento da saída. A linha 2 importa o espaço de no1ne System. IO. Ele será necessário já que
contém a definição para as classes TextWri ter e Fi 1e que você usará depois. A linha 8 gera o ar-
quivo Output. txt en1pregando o método CreateText da classe Fi 1e. Observe que na verdade não
é preciso criar uma instância da classe Fi 1e, já que o n1étodo CreateText é co,npartilhado. Se já
houver um arquivo conJ esse nom.e, ele será excluído. Se em vez disso quisern1os continuar apre-
encher u1n arquivo existente, deve1nos utilizar AppendText no lugar de CreateText. A linha 9 é
usada para salvar o destino original da saída, portanto ele poderá ser configurado mais uma vez na
linha 21. A linha 15 provoca o redirecionamento para seu arquivo. Todas as saídas que empre-
gue1n Conso 1e .l~ri te e Conso 1e. Wri tel i ne após esse redireciona1nento serão enviadas para seu
arquivo e1n vez de para a janela das linhas de comandos. A últirna linha irnportante é a 20. Se não
conseguirmos fechar o arquivo, o conteúdo não poderá ser gravado e tern1inaren1os com um ar-
quivo sern bytes (vazio).
O código da Listagem 8.3 deve produzir um arquivo Output . txt co,n o conteúdo a seguir:
.
1
RESULTADO 1 Itens em ordem 1nversa:
2 Chacal
3 Iguana
4 Hipopótamo
5 Girafa
6 Tentilhão
7 Équidna
8 Ougão
9 Casuar
10 Rato gigante da Índia
11 Porco-da-terra
Membro Descrição
Propriedades
Commandline Representa a linha de comandos completa que iniciou o aplicati-
vo.
CurrentDirectory Retorna o caminho do diretório atual.
OSVersion Retorna informações sobre o sistema operacional atual, por exem-
plo, se é o Windows 9x, o NT ou o 2000.
SystemDirectory Retorna o caminho do diretório do sistema (\winnt\system32 no
Windows NT ou no 2000).
Version Retorna informações sobre a versão de uma montagem.
Métodos
Exit Encerra um aplicativo, opcionalmente retornando um código de
erro que pode ser usado pelo sistema operacional.
GetCommandlineArgs Retorna todos os itens listados na linha de comandos quando o
aplicativo foi iniciado. Esse retorno é feito na forma de um array de
strings. O próprio executável é o elemento zero (primeiro) do ar-
ray.
GetEnvironmentVariable Retorna o valor de uma variável de ambiente solicitada. Traz infor-
mações armazenadas no ambiente com o comando Set, como o
caminho de pesquisa (path), o diretório para arquivos temporários
(temp) ou outras configurações.
GetlogicalDrives Retorna a lista de unidades disponíveis. Esse retorno é feito na for-
ma de um array de strings. O primeiro (item O) elemento geral-
mente é A:\ .
A classe Env i ronment é útil quando você precisa de informações sobre o siste1na que está ao re-
dor da execução de seu progra1na, co1no quando tem de saber onde gravar seus arquivos tempo-
rários ou e1n que siste1na operacional está sendo executado.
Random
Random é u1na classe si,nples, destinada a criar nú1neros aleatórios, e,n geral u111 inteiro (Integer)
ou u,n duplo (Doub 1e). Os ,nétodos importantes dessa classe estão listados na Tabela 8.3.
Método Descrição
Next Retorna um inteiro entre Oe o valor máximo possível para um inteiro
(aproximadamente 2 bilhões).
Next(MaxValue) Retorna um interiro entre Oe o valor de MaxVa 1ue (algum inteiro).
1 214 Dia8
Método Descrição
Next(MinValue, Retorna um inteiro entre os valores mínimo e máximo. Essa é a varia-
MaxValue) ção mais usada quando se precisa de 1 como valor mínimo.
NextDouble Retorna um tipo duplo entre O e 1.
Por exeinplo, se você quisesse gerar utn inteiro aleatório entre l e 100 (inclusive), escreveria
Dim oRand As New Random
Dim iValue As Integer = oRand.Next(l,100)
Math
A classe Math contém n1uitas das constantes e funções 1nate1náticas irnportantes. A maioria delas
são métodos compartilhados e, portanto, poden1 ser usados sem a criação de u1na instância da
classe Math. Os métodos rnais relevantes são descritos na Tabela 8.4. Se você exa1ninar a classe
Math na ajuda (Help), verá que há muitos outros .tn.étodos disponíveis.
NOTA
- Para aqueles entre nós que dormiram durante as aulas de geometria, um ra-
diano é aproximadamente igual a 57 .296 graus. Por que um número tão redon-
do? Os radianos estão relacionados à circunferência de um círculo - a medida
exata é
#Radianos= (#graus* pi) / 180
Os radianos são usados em computação devido aos cálculos e, portanto, estão
além do escopo deste livro. Simplesmente lembre-se de converter seus ângu-
los de graus para radianos antes de empregar qualquer dos métodos de Math
relacionados aos ângulos.
Introdução ao .NET Framework
A classe Math em geral é útil para calcular valores. Mesmo se você não letnbrar (ou nunca tiver
aprendido) o que é uma tangente hiperbólica, é na classe Math que a encontrará.
Arraylist
ArrayL i st é o conjunto que n1ais se parece com un1 Array. A principal diferença é que foi proje-
tado para permitir u,n cresci,nento fácil conforme forem sendo adicionados mais elementos.
Co,no as outras classes do espaço de nome System. Co 11 ect i ons, ArrayL i st foi criado para arma-
zenar u,n conjunto de variáveis 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 1nuito dinâmico que
possa aumentar ou di,ninuir con1 o passar do te1npo e se não precisar dos recursos dos outros
conjuntos.
Você pode criar uma nova instância da classe ArrayL is t usando um dos construtores disponíveis.
U,na versão pennite a definição da capacidade inicial do conjunto, e outra configura o tamanho
inicial COlTIO l6:
Dim arrlist As New Arraylist
' cria um novo Arraylist,com 16 membros inicialmente
Dim arrlist2 As New Arraylist(20)
' cria um novo Arraylist,com 20 membros inicialmente
Dim arrlist3 As Arraylist
Set arrlist3 = New Arraylist(52)
' cria um novo Arraylist,com 52 membros inicialmente
As outras propriedades e métodos importantes da classe Arraylist são usados para adicionar,
recuperar ou excluir membros do conjunto. A Tabela 8.5 resume alguns dos principais mem-
bros.
1 216 Dia8
Membro Descrição
Propriedades
Capacity Otamanho atual da classe Arrayl i st. Configurado pela primeira vez
quando ela é criada (16 por padrão), podendo aumentar conforme
mais elementos forem adicionados.
Count A quantidade efetiva de itens na classe Arraylis t.
Item Retorna um elemento específico da classe Arrayl i st.
Métodos
Add Adiciona um novo item à ArrayL i st. Se isso fizer com que Count ul-
trapasse Capaci ty, essa propriedade será aumentada (com sua
quantidade inicial - 16 por padrão).
Clear Remove todos os itens de ArrayLi st. Count é configurada com O,
mas Capaei ty não é alterada.
IndexOf Retorna a posição de um certo objeto na classe Arrayl i st. Esse mé-
todo é útil quando usado depois de uma ordenação.
Insert Adiciona um novo elemento à Arrayli st em uma posição solicitada.
Remove Remove o objeto solicitado de Arrayli st.
RemoveAt Remove o elemento da posição solicitada.
Sort Ordena os membros de ArrayL i st.
ToArray Copia toda ou parte de uma classe Arraylist em um array.
TrimToSize Diminui Arrayl i st de modo que tanto Count quanto Capaci ty sejam
iguais à quantidade atual de elementos na classe.
O uso da classe Arrayl i st é 1nais adequado na substituição de arrays quando sabemos que o ta-
n1anl10 au1nentará, mas não tivermos noção de até onde o conjunto avançará. Seu crescimento
ili111itado pennite que os itens sejam adicionados quando necessário.
Queue e Stack
Os conjuntos Queue e Stack são sen1elhantes. São dois tipos 'clássicos' de co1~untos, sendo úteis
e,n 1nuitos esforços de progra1nação. As duas classes são conjuntos que permitirão que você adi-
cione co1T1 facilidade novos itens ..Em geral remove1n o ite1n quando é visualizado porque foram
projetadas para armazenar o conjunto te1nporaria1nente. Elas difere1n no modo co1no os itens são
adicionados em cada conjunto e, principalmente, em como são removidos dos conjuntos.
A classe Queue é um conjunto 'pri1neiro a entrar, pri1neiro a sair' (FJFO, first-in, first-out). Isso
significa que os itens são re1novidos da fila na 1nes1na orde1n que foran1 adicionados. Essa carac-
terística é se1nelhante à da 1naioria das fi las (ou formações em seqüência) que você possa ter vis-
to. E1n geral, e1n u1n ponto de ônibus, na fila do almoço ou na passage1n pela alfândega, as
pessoas que chegam pri1neiro são atendidas antes. As filas são freqüente1nente usadas em pro-
Introdução ao .NET Framework
grarnação quando esse co1npo1tamento é desejado. Por exe1nplo, quando dois programas (ou ob-
jetos) estão se comunicando, as 1nensagens são colocadas ern urna fila para o objeto receptor. Em
seguida, ele poderá processá-las na ordem que fora1n recebidas. A Tabela 8.6 descreve alguns
dos métodos e propriedades i1npo1tantes da classe Queue.
Por que os métodos são chamados de Dequeue e Enqueue? Por que não Add e Remo-
ve? É simplesmente uma questão de manter os nomes tradicionais. Os programa-
NOTA
dores sempre se referiram ao ato de adicionar um item a uma fila como enfileirar
o item, portanto, esse termo, assim como desenfileirar, foram adotados.
A e.lasse Stack é um conjunto 'primeiro a entrar, último a sair' (FILO, first-in, last-out). Isso sig-
nifica que os itens são rernovidos da pilha na ordern inversa à qual forarn adicionados. A orde111
FILO é análoga a uma pilha de pratos: o prato adicionado por últirno sempre é removido primei-
ro. As pilhas são a solução clássica para lidar com proble1nas que requerern a inversão de uma
ordem de operações. Muitos cálculos são processados internamente corn a ajuda das pilhas. A
Tabela 8.7 descreve alguns dos rnétodos e propriedades da classe Stack.
Membro Descrição
Push Insere um novo objeto na pilha.
Peek Permite que você examine o próximo item da pilha sem removê-lo. Queue e
Stack são conjuntos interessantes, em parte por uma perspectiva histórica,
mas também porque resolvem problemas específicos de programação. Quan-
do for necessário um conjunto com o comportamento desses dois objetos, é
recomendável lembrar deles.
SortedL;st
A classe Sortedl i st possui características tanto de Arrayl is t quanto de NameVa 1ueCo 11 ect i on,
assin1 co1no alguns recursos úteis adicionais específicos. Se1nelhante à ArrayL i st, a classe Sor-
tedL i st pode aumentar, e apresenta as mes1nas propriedades Count e Capaci ty daquele conjun-
to. Como e1n NameVa 1ueCo 11 ect i on, cada item é identificado por um no1ne. Alé1n disso, os
valores de SortedL i st são ordenados com base no no1ne fornecido a cada ite1n. Assi1n, ela será
útil sempre que você precisar de uma lista de itens organizados que possa ' crescer", como os par-
ticipantes de u1na conferência ou os resultados de u1na bateria de provas de u1na turma escolar. A
Tabela 8.8 descreve alguns dos métodos e propriedades significativos da classe Sortedl i st.
E1n geral quando você trabalhar co1n listas, precisará 1nantê-las e1n ordem porque terá de exi-
bi-las para o usuário em u1na seqüência organizada. Nessas situações, a classe Sortedl i st pode
ser útil.
As Regras da Busca
Na 1naioria das bibliotecas, os livros se encontra1n organizados. Elas pode1n usru· o sistema deci-
mal de De\vey, algum outro método de catalogação ou apenas a ordem alfabética (por título ou
sobreno1ne do autor). Se un,a biblioteca não fosse organizada, imagine tentar encontrar um livro
nela. Você teria de vagar de modo aleatório até acidentahnente se deparar co1n o livro desejado.
Muitas pessoas tentam encontrar classes no .NET Fra1ne-.vork de 1naneira se1nelhante.
O .NET Frame\.vork é organizado de maneira hierárquica. A denominação para cada espaço de
no1ne é co1nposta de uma série de trechos, separados por u1n ponto. Espaços de no1ne inferiores
(os que possuem mais trechos) não estão contidos dentro dos superiores, mas relacionados a
eles. Por exemplo, o espaço de no1ne Sys tem . Data. Sql Cl i ent está relacionado a System. Data,
mas não está contido nele porque se encontra em u,n nível hierárquico inferior a System. Data.
No .NET Fra1nework, há dois no1nes de nível 1nais elevado, System e Microsoft. Os espaços de
no1ne System são aqueles que fazem pa11e do .NET Framework e estão disponíveis para os usuá-
rios do Visual Basic .NET, assi1n co,no para os de outras linguagens que en1pregue1n o Fra1ne-
work. As classes Microsoft são e1n geral específicas para o Visual Studio e destinadas a urn ou
1 220 Dia 8
mais a1nbientes. Por exe1nplo, existe um espaço de nome Microsoft. Vi sua 1Bas i e que contém
muitos dos recursos que era1n encontrados no Visual Basic antes dessa versão.
Alén1 da capacidade de criar e converter cores, a estrutura Col or contém várias cores identificadas.
Elas constituem uma a1npla variedade de cores diferentes, 1nuitas co1n nomes representativos e
evocativos, coino PapayaWhi p, Gai nsboro e BurlyWood. Esses são atalhos úteis se você quiser colo-
rir algo, mas não estiver ce1to do valor nutnérico exato que deseja. Mais vantajoso ainda do que os
no1nes é que você não tern de criar u1na instância nova da estrutura Co 1orantes de usar essas cores.
Pottanto, poderá empregá-las em um programa utilizando u1n código semelhante a
frmMa in. BackColo r = Color.SeaShell
U1n problema na definição de suas próprias cores, con1os valores RGB (vennelho, verde e azul)
ou selecionando tuna cor identificada, é que sua percepção delas pode ser diferente da de seus
usuários. Tenho encontrado pessoas que configura,n seus microcomputadores com as cores
mais extravagantes, e outras que nunca altera,n os padrões. De maneira semelhante, estive co,n
programadores que tinharn criado aplicativos estranhos, ,nulticoloridos, e outros que embutiram
todas as cores em códigos de sombreados cinzas. Se você embutir as cores e1n códigos, seu pro-
grama deverá se impor nos 1nicroco1nputadores dos usuários, 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 controle). As cores do sistema estão disponíveis na classe System-
Colors, que possui várias propriedades representando os diferentes ele1nentos que aparecem no
Windows (corno o WindowsText, o Cont rol ou o Menu). Colorir as partes de seu aplicativo usando
essas cores significa que elas assumirão qualquer cor que o usuário selecionar para esse item.
Usar a classe SystemColor é se1nelhante a empregar a estrutura Color. Não é necessário criar
urna nova instância da classe antes de utilizar os valores. Portanto, você poderia colorir o plano
de fundo de um formulário co1n a cor já definida Desktop por meio do código a seguir:
frmMai n.BackColor = SystemColors .Desktop
As cores estão em todos os locais no Windows, portanto, saber a ,naneira de criá-las é in1portante.
fará no Dia 13, "Usando o Server Explorer". Ou pode querer registrar ou armazenar o nome do
cotnputador para acessar o banco de dados. Essa busca de u1na solução foi iniciada por mim por
uma necessidade desse tipo. Infeliz1nente, ta1nbé1n foi a 1nais demorada. Sorte sua que encontrei
muitas 1naneiras que pode1n ser usadas para detenninar o nome de seu computador. Dependendo
de que espaços de no1ne já tenha importado ou do tipo de aplicativo que estiver executando, pelo
rnenos tuna delas (e provavelinente todas) devern estar disponíveis para você.
Você já examinou a primeira das três 1naneiras fáceis de obter o nome de um co1nputador em que
um progratna está sendo executado: System. Envi ronment. No WindO'vVS 2000 e superiores, o
nome do computador é armazenado como uma variável de ambiente charnada COMPUTERNAME. Se
esse for o caso, o nome do cornputador local poderá ser recuperado co1n
Console.Wri teline(''Using Environment: {O}'',_
System.Environment.GetEnvironmentVariable("COMPUTERNAME"))
No entanto, depender de u1na variável de ambiente, 111esmo que configurada pelo sistema opera-
cional, 1ne parece confiar um pouco de1nais. Assitn, fui 1nais fundo.
A rede em geral precisa do no1ne do computador, portanto System. NET foi tninha próxima para-
da. Depois de algumas tentativas sem êxito, encontrei GetHostName na classe DNS. Isso basica-
mente faz sentido - o DNS (Domain Na1ning Service) é t11n serviço usado para registrar nomes
de co1nputadores na Internet (ou e1n redes locais). Você pode usar a classe DNS para recuperar o
no1ne de un1 computador incluindo o espaço de norne System.Net em seu projeto e acessando-o
co1n un1 código semelhante a
Console.Writeline(''Using Net .DNS: {O}'', DNS .GetHostName)
Essa solução pode não funcionar, no entanto, se você utilizá-la em utn computador que não tenha
o TCP/lP instalado (o que, co1n a popularidade da Jnternet, poderia significar cerca de dois co1n-
putadores). E assiin, sua pesquisa continuaria.
Be1n no â1nago,
de System. Windows. Forms se encontra u1na classe que é un1 tesouro: Systemln-
fonnati on. E n1uito estranho que Systemlnformation possua informações sobre o programa atu-
al e o siste111a operacional no qual ele está sendo executado. Se você exa1ninar essa classe, verá
que ela tem propriedades que representam todas as definições essenciais para os aplicativos,
principahnente aqueles co1n base em formulários Windo,vs: FrameBorderSi ze, Capt i onHeight,
MenuHei ght e MousePresent. O 1nais importante para a sua pesquisa é que a classe Sytemlnforma-
t i on possui tuna propriedade ComputerName, que pode ser usada para recuperar o no1ne do com-
putador se o espaço de 1101ne System. Windows. Forms for incluído etn seu aplicativo, co1no
descrevo a seguir:
Console.\~riteline("Using Systemlnformation : {O}",
Systemlnformation .ComputerName)
Nã.o deixe o fato de essa classe estar oculta dentro do espaço de nome System.~Ji ndows . Forms de-
sanitná-lo. Ela pode ser usada e1n qualquer tipo de aplicativo se o espaço de nome for carregado.
Introdução ao .NET Framew ork
Para que ter três maneiras de obter o nome do computador em que um progra1na está sendo exe-
cutado em vez de apenas u1na? Be1n, apesar de não ser tnna das pessoas que decide esse tipo de
coisa, sugeriria algumas razões:
• Grupos diferentes trabalhando em seções distintas criara,n maneiras diferentes de resol-
ver o mesmo proble,na.
• Cada solução só é apropriada em certas situações (como, por exe1nplo, se a variável de
an1biente for configurada, se você executar u1na rede TCP/IP, se usar fonnulários Win-
dows e assim por diante).
Na pesquisa através do .NET Frarnework, em geral encontramos ,núltiplas soluções. Use a que
atender n1elhor suas necessidades, até encontrar un1a ainda ,nais adequada.
Resumo
Ern geral é difícil compreender onde o .NET Fra,nework tennina e o Visual Basic .NET con1eça.
A 1naioria dos recursos do Visual Basic .NET na verdade vem do Framev.rork, incluindo os que
anteriormente faziam parte da API do Windows ,
ou que não estavam disponíveis para os progra-
rnadores do Visual Basic antes dessa versão. E inco,npleto descrever o .NET Fra1ne\vork con10
algo importante para os desenvolvedores do Visual Basic .NET. No Dia I 7, "Usando o .NET
Fra,nework", você passará ,nais tempo co,n o conjunto de classes do .NET Fra,nework. Alén1
disso, é possível obter ,nais informações sobre o .NET Fra1ne\vork na seção do MSDN (Micro-
soft Developer Network) sobre a plataforma .NET no endereço http://microsoft.com/net.
No Dia 9, "Desenvolvendo uma Interface com o Usuário com os Fonnulários Windo\vs", exa-
minare1nos outra família de classes do .NE'f Framev.rork, as que permite1n a construção de inter-
faces co1n o usuário do Windov.,s. Essas classes serão usadas com freqüência quando você criar
soluções que empreguem as sofisticadas interfaces co1n o usuário dos aplicativos-padrão.
1 224 Dia 8
P&R
P Devo usar o .NET Framework ou uma função antiga sobre a qual li que o Visual Ba-
sic dá suporte?
R Se você, no passado, programou no Visual Basic, ou ainda, se leu livros do tipo 'Con10
Fazer Isso' ou 111esn10 rutigos de revista que abordava1n versões anteriores dessa lingua-
ge1n, terá visto várias das 1naneiras ' antigas' de executar tarefas. Muitas dessas funções
ainda existem, dentro do espaço de nome Microsoft. Visual Bas i e. E' possível itnportar
esse espaço de no1ne para fazer uso de algu1nas das fu nções ou constantes 1nais antigas,
co.1no as funções matemáticas ou a constante vbCrL f (u1na constante que significa 'Adicio-
ne u1na nova linha aqui'). No entanto, se possível, seria melhor e1npregar os recursos
n1ais recentes do .NET Framework.
P Por que você não abordou o espaço de nome "Fill -in-My- Favorite"? Preciso muito
saber como usá-lo em meu programa.
R Con1 6 mil classes disponíveis dentro do .NET Frarnework, tnna lição co1no esta mal
consegue abordar 1nesmo unia pequena porção delas co1n os detalhes que precisamos.
Você se aprofundará 111ais no .NET Fra1ne-v. ork no Dia 17. Alé1n disso, ta1nbé1n ire1nos
1
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e co,neçar a pensar em como colocar seu conhecin1ento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Corno você poderia fazer uso da classe Conso 1e se escrever um aplicativo co1n base no
Windows ou na Web?
2. Por que seria 1nelhor escolher o conjunto Sortedli st em vez de Arrayli st se esse possui
u1n método de ordenação?
3. Qual seria o resultado da execução do código a seguir?
Dim oRand As New System.Random
Dim iValue As Integer = oRand.Next(l, 6) + oRand.Next(l, 6)
Console.Writeline(iValue)
Exercícios
l. Escreva um pequeno progra1na do console que aceite várias palavras na linha de coman-
dos e as exiba na tela em ordetn alfabética.
SEMANA 2
DIA
Além desses tópicos, serão abordados vários controles especiais visíveis e ocultos usados nos
form ulários Windov,rs.
os siste1nas operacionais Windows (veja a Figura 9. 1). Empregando esse conjunto de classes e
funções, você poderá adicionar esse estilo de interface com o usuário, incluindo janelas e caixas
de diálogo, em seus aplicativos.
FIGURA 9.1
A ,naioria dos
aplicativos 1'Vindo111s
co,nparti!ha o ,nesrno Ili
. ... til ~-d, lc,-., (j ~ ..
estilo de inte,:face .:1 ~...
porque o siste,na G2} CJ g ,ff:J
operacional ,nanipula o >V>FloN>Y l0<dM(C1) loc.lO""(t):)
( A1)
'""""°"'
([1)
desenho das janelas e ffi Calcul.alor SCiil E!
Antes que você se aprofunde na criação e configuração de u1n aplicativo Windows, fare1nos uma
recapitulação dos principais termos relacionados aos formulários Windows. O pri1neiro e mais
difíci l de definir é 'janela'. Uinajanela, na perspectiva dos co1nputadores, é uma área da tela
usada por u1n aplicativo para exibir inforn1ações. Um único aplicativo pode ter 1nais de urna ja-
nela, mas cada janela pertence a apenas utn aplicativo. Elas podem ser tnovidas e redimensiona-
das (incluindo a 1naxirnização e ininimização), mas essas opções podern ser desativadas pelo
aplicativo que possui a janela, permitindo que ela tenha um ta1nanho ou urna posição fixa. Os su-
belementos da janela, co,no os botões, caixas de texto, listas ou figuras (veja a Figura 9.2) com-
põem a interface de u1n aplicativo e são chan, ados de controles.
Esses controles produzem a interface do aplicativo porque poden, ser 1nanipulados (clicados, di-
gitados, ou o que mais for apropriado) para fornecer entradas ao programa. Eles também exibem
infonnações para o usuário. As janelas podem estar em utn entre dois estados - 1nodal ou
não-modal. As janelas do tipo modal devem ser manipuladas e fechadas antes que o usuário pos-
sa trabalhar con1 qualquer outro aspecto desse aplicativo -por exe1nplo, uma janela que pergun-
te se você deseja salvar as alterações de um docu1nento. As janelas do tipo não-1nodal pennite1n
que o usuário interaja de uma maneira menos estruturada, 1novendo-se entre todas elas em um
aplicativo quando quiser, se assemelhando mais a janela de um docu1nento do Microsoft Word
ou a Toolbox do Visual Studio .NET. A janela n1odal tan1bém é conhecida con10 caixa de diálo-
go e na plataforma .NET possui recursos específicos que a torna fácil de usar para obter algum
Desenvo lvendo uma Interface com o Usuário com os Formulários Windows 227
tipo de informação de un1 usuário. As caixas de diálogo serão abordadas com mais detalhes ain-
da nesta lição.
l"it1ro,ml R[i)EJ
FIGURA 9.2
Todos os ele111e11tos de
u,najane/a são
cha,nados de
controles.
a..tool !
Configurando o Projeto
A primeira etapa no desenvolvimento do projeto do Visual Basic .NET que usa os formulários
Windows é criar u1n projeto novo, selecionando o tipo de projeto aplicativo Windows (Windows
application). U1n projeto novo será gerado contendo u1n único objeto formulário, que estará
pronto para você começar a trabalhar. O novo fonn ulário será chan1ado de Forml por padrão,
1nas não pretendemos usar esse nome porque ele não possui u1n significado em seu aplicativo.
Já que você está desenvolvendo u1n programa que trabalhará co1n arquivos, reno1neie o fonnulá-
rio corno frmFi ler, o que deve ser feito em duas etapas:
1. Renomeie o arquivo dando um clique com o botão direito do rnouse em Forml . vb naja-
nela do Solution Explorer, selecionando Rename e, e1n seguida, digitando o novo valor
frmFi ler. vb.
2. .Dê u1n clique com o botão direito do mouse no novo fonnulário em branco da janela de
projeto que o estiver exibindo e selecione Properties. Isso deve exibir a janela Properties
Toolbox, por 1neio da qual você poderá encontrar e alterar a propriedade Name ,
(que pode
ser visualizada na seção Design das propriedades) de Forml para frmFi ler. E n1elhor fa-
228 Dia 9
zer isso antes que qualquer codificação seja iniciada, evitando situações em que já tenha
escrito um código que se refira a Forml .
Neste ponto, observe que o título do formulário ainda será Forml, e não frmFi 1er como você es-
perava. Isso acontece porque ele não está associado ao nome do fonnulário, rnas o IDE usa esse
título como padrão na criação. Acesse a janela de propriedades do fonnulário novamente e en-
contre a propriedade Text, que representa o título do formulário. Altere-o para o que desejar -
Fi 1er ficaria born -, e o verá ser exibido confonne o pretendido.
FIGURA 9 .3 ~ Toolbox -o X
;.; O&a "
A seção 1'Vindo11,s .
... ConJ)on~nts
For,ns de Toolbox s. Windows~ 1~
fornece uma grande r I i.; Polnter .. ·-
variedade de controles A Label
A t1n1<1.abe1
para seus for1111t!ários. - ~ Button
lãij TextBox
~ MalnMenu
R] Checl<Box
I[ q:,· RadióBi.Aton
f.'.'.Jj Group6ox
lclJ Plcture8ox
D Panei
IJJ OataGtld
l!líl LlstBox
l:IJ Check.edllstBox
~ Comooeox
t~• LlstVlew
f::-,.. Treelllew
'cr,pooa,d R"'9
I• .
Get'ieial
Nessa seção de Toolbox, você encontrará vários controles, mas por enquanto só precisaretnos dos
botões e caixas de texto. Adicione lLm controle ao fonnulário dando um clique duplo nele (o que
adiciona o controle ao canto superior esquerdo do formulário), dando un1 clique e arrastando-o
para o formulário, ou selecionando o controle (dê urn clique e solte) e, em seguida, dando u1n cli-
que e arrastando o mouse no formulário para den1arcar o local desejado. Qualquer desses 1nétodos
produzirá o mes1no resultado: o controle será inserido no fonnulário. E1npregando um dos rnéto-
dos que acabaran1 de ser descritos, adicione três botões, dois títulos e duas caixas de texto ao for-
rnulário. Organize os controles conforme o layout rnostrado na Figura 9.4, etnpregando a
propriedade Text dos botões e títulos para tornar a interface do forrnulário igual à da figura.
Desenvo lvendo uma Interface com o Usuário com os Formulários Windows 229
' ' · rUrr - Mluo110fi Vkua! O.,nkXT [dM-19nJ · fnnítlrr.vb {O-ion]• 1!0 EI
FIGURA 9.4 ~ ... l)ew e<>1'<t ~ u,i..q DA'• ..,... lool• 'ifivJ,>N ll'b
• • •
U111a rnaneira possível l!Jil -~ ·~ lil? I e. '": ·t· .. l · - •
1 .. 1 ~ - i . ,. ~ -li! . ll:
de organizar a ><), ••
de exe,np lo. i
[
...
º""• e ~ , ')(t_•
lbàCob o
lbdoCJl.niln»i>:0 (nrme)
= •oi
Wscw Ocld
fD fo(t Moosel{ Sar6 $!t
f',o,oCdQr • Cortrol'Tm
... - ~· Sl><blo
OJ,t<! oi.e/\ ...
Text f'ller
Manipulação de Eventos
Para progran1ar Luna interface co1n o usuário, você precisa entender o conceito de eventos e pro-
gra1nação dirigida a eventos. Se1npre que o usuário executa urna ação, co.mo dar um clique em
u1n botão ou digitar um valor na caixa de texto, ela é cha1nada de evento. Se quiser1nos ter u1n có-
digo que seja processado quando um evento ocorrer, precisaremos criar um manipulador de
eventos para aquele no qual estejamos interessados.
1230 Dia 9
Por 1neio do IDE do Visual Studio .NET, será fácil criar u1n manipulador de eventos para um de
seus controles. Um evento co1nun1 para o qual pretende1nos ter um código é, por exemplo, o cli-
que em um botão de seu forrnulário. Essa ação é chamada evento Cli e k de u1n botão, e pode-se
adicionar ou editar o cód igo associado a esse evento dando um clique duplo no botão. Você será
enviado para a janela de edição de códigos e a u1na nova sub-rotina cha1nada <nome do bo-
tão>_Cl i ck (v~ja a Listagen1 9.1). O non1e da rotina não é 1nuito i1npo1tante, mas é o fonna-
to-padrão que o IDE utiliza. Dê un1 clique duplo no botão Copy para passar para o código apro-
priado. Observe que se não tivesse reno1neado o botão, seu novo evento Cl i ck teria um nome
parecido com Buttonl_Cl ick, em vez de btnCopy_Cl ick.
Agora, qualquer código que você inserir nessa rotina será executado quando o usuário der um
clique no botão. Neste exe1nplo, adicionaremos um código a todos os botões (btnCopy, btnMove e
btnDel ete), 1nas tere1nos de começar co1n um, portanto, dê u1n clique duplo em btnCopy e acesse
o código associado a ele. Nesse manipulador de eventos, quere1nos adicionar um código que copie
o arquivo especificado e1n txtSource para o existente e1n txtDestination. Para tanto, teremos de
trabalhar co1n o espaço de oon1e System. IO. Esse espaço de nome já foi referenciado e1n seu proje-
to porque faz pa1te de System. DLL, 1nas pode1nos tornar seu código 1nuito 1nais simples de ler e di-
gitar se adicionarmos uma instrução Imports System. IO no início do código de seu formulário.
Depois que a instrução for inserida, você poderá referenciar os objetos desse espaço de nome
sen1 ter de incluir a referência con1pleta. Para obter uma cópia do arquivo, podemos usar o méto-
do estático Copy da classe System. IO. File, 1.nas antes precisa1nos dos nomes dos arquivos de ori-
ge1n e de destino. Para acessar o conteúdo de u1na caixa de texto, use sua propriedade Text,
referindo-se ao objeto específico através de seu nome.
LISTAGEM 9.2 Copiando Arquivos por Meio dos Métodos Estáticos do Objeto File
ANÁLISE Com os valores que você precisa annazenados em variáveis alfanu,néricas, a cópia
efetiva do arquivo pode ocorrer. Já que Copy é um 1nétodo estático da classe File,
não é necessário criar uma instância; basta chamar Fi le . Copy. No entanto, só essa linha (1 ioha 6
da Listagem 9.2) não representa todo o processo, porque un1 tratamento apropriado de erros deve
ser adicionado. No caso de uma cópia de arquivo, muitos erros diferentes poderiam oco,,-er, desde
'o arquivo de destino não existe' até 'não há espaço suficiente em disco'. Sempre que um erro
acontecer, podere,nos apenas co1nunicar ao usuário usando o método estático Show da classe Mes-
sageBox. Essa classe, que já foi empregada neste livro, faz pa,te do espaço de no,ne Sys tem. Wi n-
dows. Fonns e é uma maneira rápida e fácil de inserir uma caixa de diálogo. A Listage,n 9.3
fornece um exemplo da utilização do ,nétodo MessageBox. Show e,n reposta a tuna exceção.
,
Criando Vários Manipuladores de Eventos para um Unico
Evento
A parte i1nportante da rotina do ,nanipulador de eventos não é seu nome, btnCopy Cl i ck, mas
Handl es btnCopy Cl i ck que foi adicionada no final da declaração. Essa instrução infonna ao Vi-
sual Basic .NET que essa rotina é o n1anipulador desse evento. Diferente das versões anteriores
do Visual Basic, que usavam apenas o no,ne da rotina para associar o código a eventos específi-
cos, no Visual Basic .NET é possível ter un1 único procedi,nento ,nanipulando múltiplos eventos
ou só um evento co1n vários manipuladores. Copie toda a rotina btnCopy Cl i ck e a renomeie
con10 CopyCl i ck, deixando a 111esn1a lista de parâmetros e ainda usando Handl es btnCopy. Cl i ck.
A identidade do procedimento (que é composta de sua lista de parâmetros e do valor retornado,
se houver algun1) deve ser exata1nente a 1nesn1a vista no procedimento original para que atue
co,no um n1anipulador de eventos, mas o código pode ser qualquer outro. Agora, altere o código
desse segundo procedimento para que apenas exiba uma mensage,n em vez de realizar todo o
trabal.ho de cópia do arquivo (veja a Listage1n 9.4). Tente executar seu projeto e dê u,n clique no
1 232 Dia 9
botão Copy. Os dois manipuladores de eventos serão chamados, fazendo a cópia do arquivo e
exibindo a caixa de diálogo com a 1nensagem.
Remova a rotina CopyCl i ck selecionando e excluindo o texto, e passe para as rotinas dos eventos
dos dois outros botões.
LISTAGEM 9.5 Transferindo e Excluindo Arqu i vos por Meio dos Métodos Estáticos
do Objeto File
1 Private Sub btnMove_Click(ByVal sender As System.Object ,
2 ByVal e As System. EventArgs) Handles btnMove.Click
3 Dim sSource As String
4 Dim sDestination As String
5 sSource = txtSource.Text()
6 sOestination = txtDestination.Text()
7 File.Move(sSource, sDestination)
8 End Sub
9
10 Pri vate Sub btnDelete_Cl i ck(ByVal sender As Object ,_
11 ByVal e As System . EventArgs) Handl es btnDelete . Click
12 Dim sSource As St r i ng
13 sSource = txtSource.Text()
14 File.Delete(sSource)
15 End Sub
Desenvo lvendo uma Interface com o Usuário com os Formulários Windows 233
LISTAGEM 9.6 Usando a Palavra-Chave Handles para Vincu lar Vários Eventos a um
Único Procedi mento ou Vários Procedimentos a um Úni co Evento
1 Private Sub DoEverything(ByVal sender As Object,
2 ByVal e As System.EventArgs)_
3 Handles btnCopy.Click, btnMove.Click, btnDelete.Click
A única restrição à quantidade de eventos que você pode rnanipular com apenas urna rotina é que
todos tê1n de en1pregar o mesmo conjunto de parâmetros. O evento Cl i e k de um botão, por
exemplo, recebe dois parâ,netros (System. Object e Sys tem. EventArgs), enquanto o evento Chan-
geUICues do n1esmo botão recebe parâinetros diferentes (System.Object e System.Win-
dows. Forms. UICuesEventArgs). Portanto, os dois não poderia1n ser 1nanipulados por u1na única
rotina. A finalidade desses parâmetros é fornecer inforrnações sobre o evento a seu manipulador,
porém alguns eventos passa1n infor1nações de tipos diferentes das de outros.
• Ma i n Menu e Context Menu Embora não estejam juntos na Toolbox, esses dois controles
são usados na criação de sistemas con1 menus para sua janela. O Dia 16, "Forn1ulários Win-
dows Avançados" detalhará co1no construir 1nenus para seus siste1nas usando esses dois
controles.
• Check Box/Radio Button Estes dois controles são usados para exibir e inserir valores
simples sitn/não ou verdadeiro/falso. E1n geral são empregados para mostrar uma lista de
opções que deve1n ser ativadas ou desativadas, 1nas a diferença entre eles está e1n co1no
1nanipulam a seleção de outro controle do mes1no tipo dentro de seu grupo. E1n um grupo
de botões de opção, a intenção é que apenas um deles seja ativado por vez. Por outro lado,
várias caixas de seleção pode1n ser selecionadas, o que significa que você pode marcar
quantas desejar.
• Picture Box Disponibiliza um local para você exibir tuna figura interessante ou dese-
n.har figuras usando a biblioteca de ele1nentos gráficos.
1-Iá muitos outros, mas todos funcionrun em essência da 1nes1na maneira. Você os insere em seu
formulário, 1nanipulasuas propriedades por meio de código ou da janela Prope1ties e escreve um
código para manipular seus eventos. E1nbora não tenha a intenção de abordar cada controle indi-
vidualmente, detalharei o uso de dois deles a título de demonstração.
desses controles na caixa e posicione-os em um layout apropriado. Não é preciso fazer nada mais
co1n eles para que ajam como um grupo; isso é determinado pelo fato de que foram inseridos na
1nesma caixa de grupo.
Se você executasse seu projeto neste mon1ento, seu novo fonnulário não apareceria porque, ao
ser criado, o projeto é configurado para exibir o primeiro formulário. Para alterar isso a fim de
que seu novo fonnulário seja executado en1 vez do primeiro, dê tun clique con1 o botão direito do
rnouse no projeto, que se encontra na janela Solution Explorer (do mesmo ,nodo co1no quando
adicionou u1n arquivo anteriormente), e selecione Properties no menu de atalho. Isso abrirá um
caixa de diálogo grande contendo várias opções e configurações (veja a Figura 9.5). O valor que
precisa,nos alterar está na primeira página (Co1n1non Properties, General) e se chama Startup
Object. A configuração de Sta1tup Object determina qual dos formulários, ou outros códigos,
será executado quando o projeto for processado. No momento, ele deve ter o valor frmFi 1er (o
no1ne do pri1neiro forn1ulário deste projeto). Altere-o para RadioButtons ou para o no1ne que
deu ao formulário que adicionou por últin10.
FIGURA 9.5
Usando a caixa de
~ Connion Pro~O:s
diálogo das ~ ~ l"i'!ld
...... Alo<
Out~ twe:
propriedades do ltrporU
lw"°"'""'''""" .:.1 1=mj=.=
St.1!1rt"'1' object:
m- - - - - - -3~~·
fldetcnce P~h
projeto, você pode ~cn9N~
controlar várias
~igr,c:r OclbU\5
CJ Cort~rotlcn Pr0!>'1lle1 ~:,~espac@: ,.,
! ,..d:
.,.,
5..."'=
"' ==========-1- ~
configurações,
incluindo o Startup lnfet!Mlbn =============
Pro),!d fddet: O : ~ t s aidSettS!gs\f).n:OM'là\My Oocl.lnerU\VisU41Stuilo~
Object. Pro)t<t f'6: Flbr.vbcroJ
Out~ l"IMIC! fi1er .coce
Hol,
Agora, se você executar o projeto, seu novo fonnulário (corn seus quatro botões de opção) será
exibido (veja a Figura 9.6).
~RddloButton~ S~E!
FIGURA 9.6
G1ouo80,1
Uni grupo de botões r Rocfu8v:1.on1
de opção é 11111a
maneira excelente de r R,d.Sll.lon3
pernúlir que o usuário
escolha uma opção
' .
entre varias.
1236 Dia 9
Depois que estiverem ativos e funcionando, tente dar un1 clique nos botões de opção e observe
que apenas um pode ser selecionado. E' possível empregar a propriedade Checked para saber se
um botão de opção foi selecionado usando um código. Para tentar acessar esses controles por
meio de código, você pode adicionar um script de teste a seu novo fonnulário. Feche-o (utilizan-
do o botão X do canto superior direito) e volte ao seu n1odo estrutura. Adicione u1n botão qual-
quer da Toolbox, altere seu non1e para btnTest, o título para "Test" e, etn seguida, dê u1n clique
duplo nele para passar à visualização do código de seu evento-padrão (Cl i ck). O código da Lista-
gem 9.7 de1nonstra co1no poderíarnos verificar que conjunto de botões de opção foi selecionado
e exibir o valor apropriado usando MessageBox. Insira esse código no evento Cl i ck de btnTest e
execute seu projeto para testá-lo.
LISTAGEM 9.7 Usando Botões de Opção quando apenas uma Opção Puder Ser Sele-
ci onada
1 Private Sub btnTest_Click(ByVal sender As System.Object,
2 ByVal e As System.EventArgs) Handles btnTest.C li ck
3 Dim sSelected As String
4
5 If RadioButtonl.Checked Then
6 sSelected = ''Radi oButtonl''
7 El self RadioButton2 .Checked Then
8 sSelected = ''RadioButton2''
9 Elself RadioButton3.Checked Then
10 sSelected = '' RadioButton3''
11 Elself Radio8utton4.Checked Then
12 sSelected = '' RadioButton4''
13 End lf
14
15 MessageBox.Show(sSelected , ''Se lected Radio Button'')
16 End Sub
17 End Class
gu1n fosse encontrado, se1n exibir nenhuma mensagem de erro. Você pode adicionar u1na caixa
de seleção a esse forrnulário que dê suporte à ativação e desativação desse recurso de substitui-
ção automática
Para começar, acesse o prin1eiro formulário (Fi 1er) no modo estrutura e, em seguida, adicione
urn novo controle Check Box da caixa de ferrarnentas (Toolbox). Mude o título para ' Over,~1rite
Existing' alterando a propriedade Text na janela Properties. Neste ponto, você também pode
configurar o padrão ou o valor inicial da caixa de seleção definindo a propriedade Checked naja-
nela Properties. Mova o novo controle para a posição abaixo do campo para o destino e, então, dê
urn clique duplo no botão Copy para passar à edição do código. Será preciso fazer urna pequena
alteração tanto e1n btnCopy_Cl i ck quanto em btnMove_Cl i ck antes que a caixa de seleção possa
ter algum efeito real. No mornento, a chamada ao cornando Copy e a cha1nada ao comando Move
usarn apenas dois parâmetros (origern e destino), 1nas Copy dá suporte a uma opção adicional
(substituir) que determina se ele deve excluir urn arquivo existente caso seja encontrado. Confi-
gurando essa nova propriedade da mes1na 1naneira que a propriedade Checked da caixa de sele-
ção, podere1nos controlar como u1n arquivo existente será manipulado. A Listage1n 9.8 mostra a
alteração ern btn Cl ick, que 1nanipula a nova caixa de seleção.
Manipular essa 1nes1na situação no caso do cornando Move é urn pouco 1nais co1npl icado. En1 vez
de apenas alterar un1 parâtnetro, você terá de gerar urna resposta ao erro de arquivo existente e
abortar a tentativa de transferência ou excluir o arquivo inadequado. A Listage1n 9.9 mostra uma
maneira de manipular o evento btnMove_Click.
Validação de Entradas
Como o nome 'formulário' sugere, as janelas e caixas de diálogo são em geral usadas para per-
tnitir a entrada de dados em seu aplicativo. Cotn freqüência, quando as informações forem inse-
ridas no sisterna, é reco1n.endável que elas passem por algu1na forma de validação (verificação
de datas válidas, quantidade correta de dígitos nos números telefônicos e assiln por diante). O
.NET Framework fornece u1n modelo para codificação dessa val idação.
Dado um formulário co1n vários campos de entrada (caixas de seleção, por exemplo), é provável
que ta1nbétn haja um botão ou dois. Pelo 1nenos um desses botões indicará que o usuário já con-
siderou concluída a digitação de dados. Portanto, quando ele der tnn clique em OK, você deseja-
rá que o código de validação seja executado, verificando se está tudo correto nos campos.
Quando o usuário der um clique no botão Cancel, não haverá 1notivo para se preocupar com ava-
lidação dos dados porque ele desejará cancelar o formulário.
Verificar a validade dos dados apenas quando o usuário dá um cl ique em OK (ou Save, ou o que
for apropriado e1n seu aplicativo) evitará o surgimento de proble1nas e1n locais onde ele tiver de
inserir dados válidos antes que você pennita que encerre seu aplicativo. Trabalhei com muitos
aplicativos que rn.e forçavam a digitar um número telefônico adequado antes que 1ne deixassem
sair de uma caixa de diálogo indes~jável, 1nes1no quando esse número era descartado por eu ter
dado um clique no botão Cancel !
Vários aspectos das classes dos formulários Windows funcionam e1n conjunto para fornecer
essa validação: a propriedade CausesVal idation e os eventos Val idating/Val idated, que exis-
te1n e1n todos os controles. O processo geral para o uso dessas propriedades e eventos é configu-
Desenvolvendo uma Inte rface com o Usuário com os Formulá rios Windows 239
rar CausesVal idation como True (ativado) e1n todos os controles de entrada efetiva de dados
(caixas de texto, botões de opção, caixas de cotnbinação e outros) e também em qualquer botão
que faça com que os dados sejam usados ou salvos (OK, Save, Continue, Next e outros). E1n bo-
tões co1no Help, Cancel, Previous ou outros que, ao serem cl icados, você não precise saber se os
dados são válidos, configure a propriedade CausesValidat ion como False (desativada). A se-
guir, insira um código no evento Validating para verificar se um campo é válido. Quando o
usuário tentar alternar seu foco para u1n.co11trole e1n que CausesVa li dat i on = True, o evento Va-
1ida ti ng será lançado em todos os controles de edição que tiverem recebido o foco desde a últi-
1na vez em que u1n controle com CauseV ali da t i on igual a True foi acessado. Isso é u1n pouco
complexo, portanto, percorreremos as etapas do processo:
Você possui um form ulário para inserir/editar endereços (veja a Figura 9.7), com um botão OK e um
Cancel, e várias caixas de texto para entrada de dados. Você configurou a propriedade CausesVa li-
da ti onde todas as caixas de texto co1no True. Ta1nbé1n o fez no botão OK, mas não en1 CanceL
O foco no n1omento está na caixa de texto txtSt reet, e o usuário pressiona Taba fim de passar
para a caixa de texto txtCity. Neste ponto, por causa da propriedade CausesValidation de
txtCi ty, o evento Vali dati ng de txtStreet é acionado. Agora, o evento Vali dati ng deve verifi-
car o conteúdo de txtS t reet e se certificar de que seja válido. Ele pode cancelar a validação se os
dados não fore1n corretos.
Se os dados estivere1n corretos (e o evento não for cancelado), então, o evento Va 1ida ted de
txtStreet será chamado indicando que a validação foi bem-sucedida. Se os dados não estiverem
corretos e o evento for cancelado, a tentativa de mover o foco ta1nbém será anulada, deixando-o
na caixa de texto txtStreet.
Portanto, se1npre que o foco estiver e,n um controle em que CausesValidation = True, o evento
Valida ti ng será lançado em todos os controles que tenha1n sido visitados desde a última vez que
você acessou u,n controle em que a propriedade CausesVa 1i dat i on estivesse ativada. Isso não de-
pende da direção, assim, se o usuário tivesse pressionado Tab ou dado un1 clique nova1nente etn
txtStreet depois de passar para txtCi ty, o evento Va 1ida ti ng ainda seria chamado em txtCi ty.
Ainda está confuso? A Listagem 9.1 Oconté1n o código de vários eventos de validação para o for-
tnulário de endereços (Address Form), o que pode ajudar um pouco. O fonnulário completo ta1n-
bém pode ser descarregado do site deste livro na Web, para que você não perca te,npo
reescrevendo-o.
1 240 Dia 9
Quando combinados co1n o controle ErrorProvi der, que será discutido ai nda nesta lição, os re-
cursos de val idação da platafonna .NET torna1n fácil a criação de fonnulários para entrada de
dados.
entra em cena. Essa classe é usada para exibir textos e1n uma caixa de diálogo si1nples e 111n con-
junto de botões entre os quais o usuário poderá escolher sua resposta (veja a Figura 9.). Não é
possível criar u1na instância dessa classe, 1nas ela expõe apenas um n1étodo estático, Show, atra-
vés do qual pode-se configurar a caixa de diálogo da maneira desejada e exibi-la, tudo e1n uma só
chamada.
long Proce'\~ i3
FIGURA 9.8
A classe MessageBox
é 11n1aferrc11nenta útil
.......
que pode exibir tuna
1nensage111 junto a
várias co,nbinações de
botões.
Parâmetros
O método Show aceita sete parâmetros diferentes, mas você pode fornecer apenas os valores que
tiver. Esse método possui 12 tipos de sobreposições para dar suporte a várias cornbinações de
parâmetros. Todos os parâmetros que podem ser usados são listados a seguir, co1n u1na breve
descrição de sua final idade:
• Text Representando a 1nensage1n exibida por MessageBox, este parâ1netro não é opcio-
nal ; todas as sobreposições de Show o incluem.
• Caption Outra string, como Text, este parâmetro detennina a barra de título que será
1nostrada por MessageBox.
• Buttons Aceitando u1n dos valores possíveis enun1erados, este parâ1netro controla os
botões 1nostrados na caixa de 1nensagens.
MessageBoxButtons .AbortRetrylgnore fará a caixa de diálogo exibir os botões Abort,
Retry e Ignore; MessageBoxButtons. YesNo exibe os botões Yes e No e assim por diante.
• Icon Controla qual figura, se houver algurna, será exibida junto à mensagem. Pode ser
qualquer um dos nove valores, rnas as versões atuais dos sisternas operacionais só forne-
cem figuras para quatro deles e, portanto, todas as nove opções são conve1tidas em uma
das quatro figuras.
• Defaul tButton Quando você tiver n1ais de urn botão na caixa de diálogo, só u1n deles
poderá ser o padrão. Se o usuário pressionar Return ou Enter quando a caixa de mensa-
gem (MessageBox) for abe1ia, ela será tratada co1no se ele tivesse dado um clique no bo-
tão-padrão. Este parâmetro pode ser configurado con10 Buttonl, Button2 ou Button3, o
que conduzirá a um dos botões apropriados.
• Opt i ons Estas opções controlam a aparência da caixa de 1nensage1n e serão especial-
1ne.nte úteis quando seu aplicativo estiver localizado em outro país/região. As opções incluem
tornar o texto justificado à direita, legível da direita para a esquerda e certificar que a caixa
de 1nensage1n apareça apenas na área de trabalho principal do sistema operacional.
Desenv o lven do uma Inte rface com o Usuário com os Formulários W in dows 243
• Owner\~i ndow Este parâmetro especifica uma janela dentro de seu aplicativo na qual a
caixa de 1nensage1n (MessageBox) deve aparecer. Em geral, esta funcionalidade não é ne-
cessária, mas está disponível.
As Figuras 9.9 e 9.1 O1nostram alguns exe1nplos de chan1adas, a MessageBox. Show ( ) e as caixas
de diálogo resultantes.
Obtendo Resultados
Depois que você tiver escolhido os botões que quer exibir, desejará saber em qual o usuário deu
urn clique (pressupondo que você tenha exibido algo 1nais além de urn botão OK). Essa infonna-
ção é retornada pelo método Show como um valor Oi al ogResul t, que pode ser armazenado em
urna variável, ou a chamada do método pode ser utilizada direta1nente em uma expressão ou ins-
trução condicional. A Listage1n 9.11 inostra corno for1nular u1ua pergunta ao usuário e1upregan-
do a classe MessageBox e duas ,naneiras de rnanipular o resultado.
Como demonstração do uso de MessageBox em um siste,na real, você pode adicionar tuna funcio-
nalidade complementar ao fonnulário Fi ler original. Esse formulário, que permite copiar, trans-
ferir e excluir arquivos, não apresenta nenhuma mensagem de confirmação ('Está ce1i o de que
deseja excluir c: \ tes t. txt?'), n1esmo quando é solicitada a exclusão do arquivo con1pleto. A
fi,n de adicionar esse recurso ao for1nulário Fi ler, podería,nos usar uma caixa de mensagern
para exibir a confirmação e botões Yes/No, executando ou cancelando a ação confonne a res-
posta. A Listagem 9.12 mostra as rotinas dos três eventos, alteradas para incluir a etapa de con-
finnaçã.o.
17 MessageBoxicon.Question, _
18 MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
19
20 Try
21 File.Copy(sSource, sDestination, chkOverwrite.Checked)
22 Catch objException As Exception
23 MessageBox.Show(objException.Message)
24 End Try
25 End If
26 End If
27 End Sub
28
29 Private Sub btnMove_Click(ByVal sender As System.Object,
30 ByVal e As System.EventArgs) Handles btnMove.Click
31 Dim sSource As String
32 Dim sDestination As String
33 sSource = txtSource.Text()
34 sDestination = txtDestination.Text()
35 If File.Exists(sSource)Then
36 Dim sConfirm As String
37 sConfirm = String.Format(_
38 ''Esta certo de que deseja transferir {O} para {1}?'',
39 sSource, sDest i nation)
40
41 If MessageBox.Show(sConfirm, _
42 "Confirm Move", MessageBoxButtons.YesNo,
43 MessageBoxicon.Question,_
44 MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
45
46 If File.Exists(sDestination)Then
47 If chkOverwrite.Checked Then
48 Fi l e.Delete(sDestination)
49 Else
50 MessageBox.Show(''Transferéncia abortada, arquivo de destino jã
existe")
51 Return
52 End If
53 End If
54 Fil e .Move(sSource, sDestination)
55 End If
56 End If
57
58 End Sub
59
1 246 Dia 9
Controles Ocultos
Todos os controles usados nesta lição até agora estavam visíveis quando seu projeto foi executa-
do. Esse é o tipo padrão de controle com o qual você trabalhará. N·o entanto, a platafonna .N.ET
tatnbém apresenta controles que são iguais aos habituais e1n quase tudo, exceto por não possuí-
re1n tuna interface visível no tempo de execução. Esses controles ta1nbén1 têm propriedades, mé-
todos e eventos e foran1 projetados co1no tuna maneira modular fácil de adicionar recursos
específicos a u1n fonnulário.
Antes do Visual Basic .NET, os controles ocultos també1n podia1n ser inseridos nos formulários,
complicando a interface do tempo de projeto, 1nas ficando totalmente invisíveis no te1npo de
execução. No Visual Studio .NET e.ncontramos uma manei ra muito 1nelhor de rnanipular esse
tipo de controle, posicionando-os em uma área separada abaixo da do projeto do for1nulário
(veja a Figura 9. 11 ). Você ainda poderá arrastar, selecionar, clicar e excluí-los, poré111 se1n que
interfiram na visualização do projeto de seu formulário.
Desenvolvendo uma Interface com o Usuário com os Formulários Windows 247
........ .. . o
co111 ele111entos da
.... .... .....
.
'
.
.. .. ..
. . ...
' .. .. ..
inte,jàce visível.
.. ... ... ................... .......
.. .. .. .. .... .. .. .. .. . .. .. .. .. .. . . .. . . . . . .. . . . . . . . . . -
. . . .. . .. .. . -....
.
1
. ..
Há vários desses controles de tempo de projeto, mas abordarei nesta seção alguns dos mais usa-
dos: Ti mer , Not i fylcon , ErrorProvi der e os controles de caixas de diálogo.
Timer
O controle Timer foi projetado para permitir que os códigos sejam executados a certos intervalos
com base en, períodos de te1npo. Se o controle estiver ativado, ele acionaráauto1natica1nente seu
evento Ti ck a intervalos regulares. Pela inserção de um código no manipulador do evento Ti ck,
você poderá executar a tarefa que desejar de 1naneira programada.
O uso do controle Timer envolve apenas algumas etapas:
1. Depois que você adicionar esse controle a seu formulário, terá de configurar suas proprie-
dades; configure Enab l ed con10 True para indicar que o deseja ativo, e a propriedade
I nterva l con, o período de tempo (e,n 1nilissegundos- 1000 n1s são iguais a 1s) que quer
entre os eventos.
2. Adicione seu código ao evento Ti ck (dê um clique duplo no controle Timer para acessar
rapidamente o manipulador dele).
lsso é tudo o que se tem a fazer para que o código inserido no manipulador do evento Ti ck seja
executado u1na vez a cada valor de Interva l e,n 1nilissegundos.
Você pode testar esse controle e1n um projeto de sua autoria seguindo estas etapas:
1. Crie um novo projeto vazio - um aplicativo Windows. U1n formulário em branco será
adicionado ao projeto, Forml. Certifique-se de estar visualizando o ,nodo estrutura desse
forrnulário vazio.
248 Dia 9
2. Arraste u1n controle Timer de Toolbox (no Windo'vvs Fonns) para o formulário. Ele será
adicionado co1no um controle à área de controles ocultos (que agora aparecerão) com o
nome Timerl.
3. Dê u1n clique em Ti merl para selecioná-lo e, e1n seguida, visualize a janela de proprieda-
des, que deve mostrar a você os valores de Enabled e Interval que deterrnina1n o com-
portamento do período de te1npo.
4. Configure Enabled como True, e Interval igual a 1000 (1 segundo).
5. Dê u1n clique duplo no controle Timer para passar à visualização do código, e acesse aro-
tina de 1nanipulação do evento Ti ck.
Adicione o código mostrado na Listagetn 9.13 ao manipulador do evento Ti ck.
LISTAGEM9.13 Código Que Fará com Que o Título do Formulário Aja como um
Relógio
1 Private Sub Timerl_Tick(ByVal sender As System.Object,
2 ByVal e As System.EventArgs) Handles Timerl.T ick
3
4 Me .Text = DateTime.Now.TolongTimeStri ng()
5
6 End Sub
Notifylcon
Quando um progran1a precisa ser executado continuamente e é necessário algum tipo de notifi-
cação visual, u1n método comun1 é inserir u1n ícone na bandeja do sistema ou área da notificação
à extrema direita da barra de tarefas. Esse pode não ser o melhor local para posicionar algum
aplicativo, é uma área que já está 1nuito cheia, 1nas é útil para certos utilitários com ·finalidades
- -
espec1a1s.
Desenvo lvendo uma Interface com o Usuário com os Formulários Windows 249
Antes da existência da plataforma .NET, adicionar um ícone à bandeja do sisten1a envolvia o uso
de várias chamadas à API do Win 32 e uma técnica deno,ninada subclassificação que poderia
tornar instável seu aplicativo do Visual Basic. Na plataforma .NET, tudo que você precisa fazer
é adicionar u,n controle Noti fylcon a seu formu lário e configurar suas propriedades. Aproprie-
dade n1ais in1portante é I con, que pode ser configurada co1n qualquer arquivo de ícone para con-
trolar o que irá aparecer na área de notificação. Se quisennos que utn ,nenu surja quando o
usuário der um clique coiu o botão direito do mouse em seu ícone, pode1nos adicionar um
controle ContextMenu ao formulário e configurar a propriedade ContextMenu de Noti fylcon. Seja
cuidadoso para só usar esse controle quando for apropriado; há tantos aplicativos colocando íco-
nes nessa área que foi adicionado ao Windo"" s XP un1 recurso de ocultação automática!
1
ErrorProvider
Outro grande recurso para o projeto de for1nulários de entrada de dados, o controle ErrorProvi -
der pennite que você indique visualinente (veja a Figura 9. 12) que controles de u1n formulário
possuen1 en·os associados a eles.
Para usar este controle, apenas insira-o e,n seu fon11ulário e configure as propriedades. Na ver-
dade, você pode fazer isso com ainda menos trabalho porque os valores-padrão costumam ser
adequados para grande parte dos objetivos, a tnenos que queira empregar um ícone diferente.
Então, se,npre que quiser indicar que wn controle possui um erro associado a ele, cha1ne o 1néto-
do SetError do controle ErrorProvider:
errorProviderl.SetError(txtStreet, ''Endereço da rua invãlido'')
Quando o erro tiver sido corrigido, você poderá eliminá-lo de ErrorProvider configurando-o
co,n u1na string vazia:
errorProviderl.SetError(txtStreet, '' '')
~Address EJ
FIGURA 9.12
Co111 un, controle S•Ht
l11 ""'""
Oy. IR-.... s...""'..,. p..
ErrorProvider e,n seu ea,,,,, lus.. Z(>IPC; !t:.
forniu/ário, será fácil o~ 1 e"""' 1
mostrar aos usuários
os erros de entrada de
dados.
A caixa de diálogo do exemplo (de entrada/edição de endereços) abordado rapida,nente nesta li-
ção (e que pode ser descarregado do site da Web deste livro) usa esse controle oculto e,n seu có-
digo e é tuna boa de1nonstração a ser exa1ninada.
250 Dia 9
FIGURA 9.13
LookW.: l@oe,kkp
A caixa de diálogo
l l~ ~ -
para abertura de 6iMrDocum,ris System Fol::ler
12!MrCoffO.ffl Systom Foldtt
arquivos n1a11ipula ~My Netwo,kPl.:iccs Sy$tcm Folrler
toda a co1n1111icação @ My Rc41y lrrpJrtart Fne.txt I t:B Tcxt Oocumeot 9}1J/2001
co111 o sisten,a
operacional e o
siste1na de arquivos,
se111 que você tenha de
escrever nenhurn
código.
IM1AecAy lrr~Ml Fl&.lld
º""' 1
C.-1 1
ã
Corno com os outros controles ocultos, é possível arrastar qualquer caixa de diálogo para que
seja usada em seu formulário ou e1n uma área de controles ocultos. Depois que tiver uma instân-
cia do controle e1n seu fonnu lário, co1nece a trabalhar com as propriedades dele a fim de confi-
gurá-lo para seu aplicativo. Conduzirei você através do exetnplo de um programa que emprega
as caixas de diálogo para abrir e salvar arquivos, e també1n poderei utilizar as de fonte e cor, ape-
nas para ser conclusivo.
O próprio forn1ulário contém vários controles incluindo u1na caixa Rich Text, quatro botões e
un1 controle de painel, que é usado para ar1nazenar os botões. E1npregar u,n controle de painel
dessa 1naneira, e configurá-lo para que fique encaixado à direita e que a caixa .Rich Text ocupe
todo o for1nulário, fornecerá tnna interface que será alterada de modo correto quando o for1n ulá-
rio for redi,nensionado ou maxirnizado. Não abordarei os detalhes da configuração desses con-
troles, ,nas o for1nulário co1npleto pode ser descarregado a partir do site deste livro na Web.
Além dos controles visíveis, ta1nbé1n inseri os quatro controles das caixas de diálogo (Open,
Save, fonte Color) no forrnulário. Cada um dos quatro botões usa uma das caixas de diálogo
para abrir arquivos, salvar, alterar a fonte ou n1udar a cor dela, e seu código está listado nas se-
ções a seguir. Observe que configurei os controles das caixas de diálogo dentro do proceditnento
de dar u1n clique no botão, 1nuito e,nbora pudesse ter configurado muitas dessas propriedades
empregando a janela de propriedades do controle de caixa de diálogo. Só agi assirn porque esse é
um exen1plo; qualquer propriedade de controle que seja a n1esn1a durante toda a existência do
formulário deve ser configurada apenas u1na vez, que é o que ocorre quando se 1nanipula1n as
Desenvo lvendo uma Interface com o Usuário com os Formulários W indows 251
propriedades por meio da janela referente a elas. Agora percorrerei o código que representa cada
utn dos quatro botões e discutirei como o controle de caixa de diálogo foi utilizado e1n cada caso.
ne a extensão junto ao nome do arquivo, a fim de que seja verificado se o ca1ninho e o arquivo
existem e para que ele seja iniciado na n1esma pasta do últin1.o arquivo ca1Tegado. A propriedade
Mu 1ti Se 1ect tambén, está configurada co1no Fa 1se, indicando que você deseja que o usuário só
possa selecionar um arquivo por vez.
A linha 16 exibe a caixa de diálogo e verifica se o resultado está correto. Se estiver, as linhas 18 à
20 se certificam novamente da existência do arquivo e, em seguida, o carregam em uma única lei-
tura na caixa Rich Text. Deveria1n ser adicionados 1nais recursos de 1nanipulação de erros aqui
se esse fosse um sistema de produção, porque a abertura de arquivos é urna situação propensa a
falhas devido a privilégios de segurança e outras razões.
ANÁLISE O uso da caixa de diálogo Save é sen1elhante ao de Open. Depois que o usuário con-
firma se deseja salvar o arquivo (lin.ha 9), as propriedades da caixa de diálogo são
configuradas para criar a imagem adequada. O nome do arquivo é configurado con10 padrão com
o último utilizado. A caixa de diálogo é infonnada de que não é necessário ser um arquivo já exis-
tente (CheckFi 1eExi sts = Fa 1se), mas a pasta sim (CheckPathExi sts = True). Por padrão, o arqui-
vo será salvo com a extensão . txt (linha 16), mas a caixa de diálogo não irnpedirá o usuário de
salvá-lo como desejar. Duas opções interessantes, Overwri tePrompt e CreatePrompt, não são apli-
cadas à caixa de diálogo Open, 1nas são in1portantes ao salvar. Overwri tePrompt controla se a cai-
xa de diálogo avisará o usuário antes de permitir que ele salve utilizando o can1inho e o nome de
um arqu ivo existente. CreatePrompt detennina se o usuário deve ser avisado caso tente fazer exa-
tamente o contrário (usar u1n caminho e un1 non1e que ainda não exista1n).
Depois de pronta, a caixa de diálogo é exibida (linha 23), e se o usuário sair dela dando uin clique
e1n OK, então, o conteúdo da caixa Rich Text será gravado no arquivo (l inhas 24 à 28).
8 End Sub
ANÁLISE A caixa de diálogo Font é sirnples de usar: apenas carregue as configurações de fonte
atuais nela (1 inha 3) e, e,n seguida, exiba a caixa de diálogo (linha 5). Se o usuário der
um clique e1n OK, então, pegue as novas configurações de fonte e leve-as de volta ao destino (nes-
se caso a caixa Rich Text, linha 6). Isso é tudo; funciona perfeitamente.
ANÁLISE A caixa de diálogo Color funciona exata,nente da mes1na 1naneira que Font; siro-
plesrnente carregue os valores das cores atuais (linha 3), exiba a caixa de diálogo (li-
nha 5) e configure o destino que usará os valores selecionados nela- contanto que o usuário dê um
clique e,n OK (linha 6).
dows em u1na caixa de diálogo, dando a ele a aparência e o co1nportrunento de uma, e usá-la em
seu progra1na. Existem vários estágios diferentes, e os percorrerei enquanto 1nostro como cons-
truir u1na caixa de diálogo a ser e1npregada co1no a tela de login de u1n aplicativo. Para aco1npa-
nhar este exemplo ao avançar nesta seção, crie um novo projeto (do tipo aplicativo Windows).
,. L • '! Ul ; ~ <!.......-
EI
FIGURA 9.14 I.....
1~Looon
. ..-..,.....,.,...----,
1: u...io: : : 1"'1llmii
..;: ,
Este fornnt!ário foi ., 'Po.·WOJcl:
.. . .. '' ~
...- -
....- - - - - - - - '! :
!O
redimensionado para .. .. •. .. .. .. . . .. ... . . . . .. , . . . . .. ! '
. .. .
:: : : ::: :: :: : ::::1 o• 11w·~1w1:,
ter uma aparência 1!••
,....
•• ••
. .... .. ........ ... ... ....... , ... .
• • •• ••
•• •••
•• • •
• •• ••
• ••• ••
~
• Si , . "• ! , 1• . 11,.,(fftl.-.i:'i
Xi •_. ,• '
No1neie os controles usando as convenções de nomeação que viu no decorrer desta lição, geran-
do l bl Use ri d, l bl Password, txtUseri d, txtPassword, btnOK e btnCance l . Para concluir, co1no úl-
tüna parte da configuração,visualize as propriedades de txtPassword e configure PasswordChar
= * • Com PasswordChar configurada, qualquer texto que for inserido nesse ca1npo será n1os-
11 11
ANÁLISE A rotina Cl i ck não executa nenhuma validação con1plexa; apenas verifica se o usuá-
rio inseriu uma identificação e u1na senha (linhas 9 e 15) e configura o resultado da
caixa de diálogo como OK (linha 21) se isso tiver ocorrido. A configuração da propriedade Oi a-
1ogResul t do formulário na linha 21 fecha a caixa de diálogo para ocultar e retornar esse resultado
ao programa que o chamou. Observe que se btnOK. Di al ogResul t tivesse sido configurada como
OK (por 1neio da janela de propriedades), então, a caixa de diálogo seria fechada ao término de
seu evento Cl i ck independentemente de ter sido inserida a identificação/senha do usuário.
Configure a propriedade btnCancel. Oi a1ogResul t como Cancel (de 1nodo que sernpre execute o
cancela1nento, e nenhu1na manipulação de evento s~ja necessária) por 1neio da janela de proprie-
dades, e essa caixa de diálogo de logon estará pronta.
superior da janela de edição de códigos. Selecionar essa opção preencherá a lista suspensa à direita
co1n a relação de eventos aos quais seu fonnulário dá suporte. Selecione Load na lista suspensa,
e poderá editar o procedi1nento do evento Forml _ Load.
Nesse procedilnento, você precisará criar u1na instância de seu fonnulário LogonDi a l og, exibi-lo
co1no uma caixa de diálogo e, em seguida, verificar a identificação/senha que o usuário inseriu.
A Listage1n 9.19 fornece um exemplo de co1no esse procedimento de evento poderia ser escrito.
ANÁLISE Uma nova instância de LogonDi a l og é criada (linha 3), o que é necessário antes que
você possa exibir esse formulário. Duas variáveis são usadas (linhas 4 e 5) para re-
gistrar o sucesso/falha da tentativa de conexão. A linha 7 e1nprega o método ShowDi al og do for-
mulário para exibi-lo de maneira restrita. Devido a ShowDi a l og, a próxima linha de código desse
procedin1ento não será executada até que o formulário esteja oculto ou fechado, n1as usar apenas
Show teria exibido o formulário de maneira não restrita, e o processarnento do código teria conti-
nuado antes que o usuário concluísse o Jogou.
Desenv o lven do uma Inte rface com o Usuário co m os Formulários W in dows 259
O método ShowDi al og, exatamente como Show na classe MessageBox, retorna u1n valor de Oi al og-
Resu l t, como discutimos anteriormente enquanto você criava o fortnulário LogonDi a l og. A linha
7 verifica o valor retornado, porque se o usuário cancelar a caixa de diálogo, sua identificação e
senha não deven, ser processadas. Em seguida, os controles de caixa de texto de LogonDi a l og são
acessados e seus valores verificados e1n relação à identificação e senha do usuário embutidas no
código (linhas 9 e 10). Em seus programas reais, você provavehnente verificará esses valores
confrontando-os com algum tipo de banco de dados ou lista de segurança. Para concluir, se tudo
estiver correto, bLogonSuccessful será configurado co,no True (linha 11), ou a 1nensage1n de
en·o apropriada será utilizada por sFa i l ureMessage (linha 11à 19). Se a conexão não tiver êxito, a
1nensagen1 de erro será exibida e1n uma caixa de mensagens (linha 23), e Forml será fechado (li-
nha 25) para bloquear o acesso ao progra1na.
Resumo
Os fonnulários Windows são usados para o desenvolvitnento de aplicativos .NET co1n interfa-
ces do Windows, que é um dos dois tipos de aplicativo que você criará (o outro seria os sistemas
com base na Web). Contendo vários grandes avanços não existentes en, versões anteriores do
Visual Basice fornecendo utn sistema comum para o desenvolvitnento de formulários por toda a
platafonna .NET, o sisten1a Windows For1ns permitirá que você construa a interface que seu
aplicativo precisar. O Dia 16 dará continuidade a esse tópico e fornecerá 1nais infonnações sobre
o uso desses formulários em seus progra1nas.
P&R
P Posso ter ma is de um formulário Windo,vs em um proj eto/aplicativo?
R Sirn, você pode ter quantos desejar. No entanto, apenas tun fonnulário pode ser definido
para a inicialização, de n1odo que será preciso criar instâncias dos outros dentro de seu
código e, então, chatnar seu tnétodo Show quando quiser exibi-los.
P Quero usar uma caixa de mensagem (Message ox) em um aplicativo do console que
criei, mas não consigo fazê-lo funciona r. Ele pa rece não reconhecer o nome d a classe.
R A classe MessageBox faz parte do espaço de nome System. Windows. Forms, po11anto, você
deve tê-lo disponível antes de usá-la. Quando criar um aplicativo Windo\.VS empregando
o Visual Studio, ele auto1naticamente adicionará a referência necessária, mas não fará
isso para um aplicativo do console. Utilizando o Solution Explorer, dê un1 clique co1n o
botão direito do n1ouse na pasta References dentro de seu projeto e selecione Add Refe-
rence. Na caixa de diálogo que aparecerá, selecione System. Windows . Forms. dl l na lista.
Outra boa idéia é adicionar u1na linha Imports. System. Windows. Forms no início de seu
arquivo de classes ou módulo de modo que possa se referir à MessageBox sem ter de sem-
pre usar o prefixo System. Windows. Forms nessa classe.
1 260 Dia 9
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e,n como colocar seu conheci,nento em prática. As respostas do teste estão
no Apêndice A, " Respostas dos Testes/Exercícios".
Teste
1. Qual é a diferença entre um fonnulário modal e un1 não-modal?
2. Por que não podeinos configurar a propriedade CausesVal idation de um botão Cancel
con1 o valor True?
3. Que instrução é adicionada no final da declaração de um procedirnento para indicar que
ele é tnn manipulador de eventos?
Exercícios
l. Dado que um único procedimento pode manipular vários eventos (Sub myhandl er( )
Handl es btnOpen . Cl i ck, btnCl ose . Cl i ck, btnSave . Cl i ck), como você poderia reescrever
esses três procedimentos de eventos ern u,n único procedimento?
Dica: Você precisa converter (usando CType) o parâmetro sender em u1n controle de
System. Windows. Forms . Contro 1 ou System. Windows. Forms. Button antes de poder aces-
sar o conjunto con1un1 de propriedades de controle.
LISTAGEM 9.20 Usando a Palavra- Chave Handles para criar um único procedimento
chamado por vários eventos
1 Private Sub bt nCopy_Click(ByVal sender As System.Object,
2 ByVal e As System. EventArgs) Handles btnCopy.Click
3 Dim sSource As String
4 Dim sDestination As String
5 sSource = txtSource .Text()
6 sDestination = txtDestination . Text()
7 File . Copy(sSource, sDestination)
8 End Sub
9
10 Private Sub btnMove_Click(ByVal sender As System.Object,
11 ByVal e As System.EventArgs) Handles btnMove .Cl ick
12 Dim sSource As String
13 Dim sDestination As String
14 sSource = txtSource. Text()
15 sDestination = txtDestination.Text()
16 File.Move(sSource, sDestination)
17 End Sub
18
Desenvolvendo uma Interface com o Usuário com os Formulários Windows 261
DIA
1nais importantes, se não o 1nais popular, aspectos da Internet é a World Wide Web (WWW ou
apenas Web). No entanto, é freqüente a falta de ferramentas de programação realmente boas
para a criação de 'progra1nas' na Web, en1 vez de simples páginas da Web. Isso acontece em par-
te porque o desenvolvimento de aplicativos para a Web é diferente da geração dos de microcom-
putadores, co1n os quais temos mais controle. Além disso, os aplicativos da Web precisa1n lidar
com a rede com mais periodicidade.
,
Assirn, o que é o '111odelo de progra1nação na Web'? E apenas u1n tenno usado para descrever
como você pode projetar, ou desenvolver, um programa que e1npregue páginas da Web em u1n
navegador para pennitir que o usuário insira informações. Essas páginas da Web são projetadas
co1n a utiIização de HTML (HyperText Markup Language). Este Iivro não abordará HTML, 111as
há muitos outros no 1nercado que o fazem.
O ncn1egador é um aplicativo que sabe co1no ler HTML e exibi-la na tela. E1n geral (1nas nem
se1npre), grande parte do trabalho de u1n aplicativo é executado no servidor Web. O servidor
Web é outro programa processado em u1n con1putador que sabe como retornar HTML quando
solicitado. No Windows NT ou no 2000, esse progra1na é chan1ado de Internet Information Ser-
vice (IIS). As informações são transferidas entre o navegador e o servidor por meio de u1n proto-
colo, ou linguagen1, cha1nado HTTP (Hypertext Transfer Protocol).
NOTA O nome efetivo do IIS foi alterado com as diferentes versões. No Windows NT
4.0 Server, ele é chamado Internet lnformation Server. No Windows 2000, foi
denominado de Internet lnformation Services, enquanto no Windows NT 4.0
Professional, seu nome é Personal Web Server.
Nos ' primórdios' da World Wide Web, as páginas da Web era1n estáticas. Isto é, nunca n1uda-
vam reahnente. Tudo ficou mais interessante quando as pessoas começaram a criar páginas da
Web dinâ1nicas ou que podia1n ser alteradas. Essa foi a orige111 dos programas da Web. Co1n
eles, em vez de apenas retornar sen1pre o 1nesmo resultado HTML, o servidor Web pode execu-
tar algu1nas tarefas e retornar o resultado HTML apropriado. Por exemplo, o usuário pode solici-
tar infonnações sobre as vendas de u1n período em particular. Essas informações serão passadas
para o servidor. Por sua vez, o servidor poderá procurá-las e1n u1n banco de dados e, em seguida,
convertê-las e1n HTML exibindo-as para o usuário. O processo co1npleto é semelhante ao da Fi-
gura 10. 1.
Como alternativa, o servidor (ou o projetista da página da Web) pode adicionar informações de
progra1nação à própria página, criando uma que seja, ela 1nes1na, utn programa. Etn geral, cha-
1nan1os esse recurso de Dynan1ic HTML (ou DHTML). Por 1neio da DHTML, é incluído na pá-
gina algutn código JavaScript (uma linguagem de progratnação, como o Visual Basic .NET, que
é executada em páginas da Web) ou de outra Jinguagern. O código pode ser processado no nave-
gador sen1 precisar reto1nar nenhuina informação para o servidor. A Figura l 0.2 n1ostra esse mo-
delo e1n ação.
Const ru indo a Interface com o Usuário co m os Formulários da Web 265
'li'
FIGURA 10.1
AI/odeio de
progran,ação na JtVeb. - - -Solicitação - -. +Pesquisa
l'---'I
- - - Resposta - -
Banco de
Dados
Servidor
Navegador Web
FIGURA 10.2
O 1nodelo de
progra111ação da
Dynarnic liT,'vlL.
Banco de
Dados
Servidor
Navegador Atualização Web
Há várias técnicas que poden1 ser en1pregadas na criação de um progra1na da Web. Algu1nas das
1nais usadas no passado foram o ASP (Active Server Pages), a Perl (outra linguage1n de pro-
gramação) ou o JSP (Java Server Pages). A técnica utilizada pelos fonnulários da Web é um aper-
feiçoamento do ASP, o ASP.NET.
ASP.NET
ASP.NET é o no1ne que a Microsoft deu para sua versão apri111orada do ASP. E1nbora o ASP
fosse u1n rnétodo fácil de construir páginas dinâmicas na Web, apresentava alguns problen1as
que o ASP.NET resolveu:
• O ASP quase se1npre exigia muita codificação para que algo fosse executado. O
ASP.NET requer menos cód igo (em geral, 1nuito menos) para tarefas comuns de progra-
1nação.
• O ASP também padecia da quantidade li1n itada de controles que a HTML apresenta. O
ASP.NET adicionou o conceito dos ' controles no lado do servidor' que pode1n gerar ore-
sultado HTML apropriado para o navegador que o solicitar. E1nbora esses controles no
navegador seja1n apenas HTML, podem representar muito da HTML e da codificação
que você será poupado de ter de escrever.
• O ASP só aceitava programas em uma linguagem co1no o VBScript. O YBScript é inter-
pretado no te1npo de execução, não é co1npilado co1no o Visual Basic. O ASP.NET per-
1nite que você escreva páginas da Web e1n u1n código totalmente co1npilado do Visual
Basic .NET.
O ASP.NET também foi projetado para resolver outros problemas do ASP que não são inerentes
a essa discussão sobre a construção de inte1faces co1n o usuário, como melhorias no redimensio-
namento e na utilização da 1ne1nória.
1 266 Dia 10
Além das restrições em decorrência do navegador, os aplicativos cotn base na Web tarnbém tor-
nam necessário que o desenvolvedor considere o fato de que o cliente e o servidor estão separa-
dos, possivelmente por grandes distâncias através de uma rede. Isso significa que as operações
que poderian1 levar alguns segundos se o cliente e o servidor estivessem próximos (ou até na
1nes1na 1náquina) poderão den1orar 1nuito ten1po. Portanto, operações como as animações po-
dem ficar desfiguradas ou não seren1 exibidas de maneira alguma até que o download seja con-
cluído. E ainda há a velocidade da conexão. Se você estiver acessando a página da Web por meio
de utn 1node1n rnais lento, essa diferença se tornará ainda rnais relevante.
Com todas essas questões para lembrar, você deve estar pensando ''Por que me preocupar em
criar aplicativos da Web?". E1nbora haja desvantagens e1n desenvolver aplicativos da Web,
existern muitos benefícios:
• Instalação Para ton1ar seu aplicativo disponível , tudo que você precisa fazer é inserir
algun1 endereço no URL. O aplicativo ficará imediata1nente disponivel para uso do clien-
te. Isso evitará que você tenha de ir até cada uma das 1náquinas clientes ou fazer com que
todos os seus usuários instalem o aplicativo.
• Novas versões e/ou correção de erros Quando você quiser atualizar tuna parte de seu
aplicativo com un,a versão 1nais nova, só terá de instalar as atualizações no servidor, e
não em cada cliente.
• Dese1npenho Melhorar o desen1penho de aplicativos da Web é 1nuito n1ais fácil que
fazê-lo corn aplicativos comuns. Você pode aperfeiçoar seu desempenho adicionando
1nais servidores e distribuindo as solicitações por todos eles.
• Conheci1nento Se você já conl1ece urn pouco de 1-ITML, poderá ser 1nuito n1ais sin1-
ples criar aplicativos da Web do que do Windows. Eles também são ,nais fáceis de assin1i-
lar, se não houver conhecitnento de HTML ou de Windows.
Então, qua11do projetar um aplicativo, você deve criar um programa co1n base no Windows ou na
Web? A resposta 1nais fácil (porétn insatisfatória) é "Depende". Muitos se encaixam e1n qual-
quer tipo, mas as pessoas estão corneçando a criar 1nais aplicativos corn base na Web. A capaci-
dade de fazer atualizações facilmente e as correções disponíveis são atraentes, portanto, pode ser
preferível pelo menos considerar primeiro a criação de programas como aplicativos da Web.
No entanto, alguns progra1nas não são candidatos a aplicativos da \Veb. Qualquer prograrna que
precise de un1 vínculo contínuo entre o cliente e o servidor não é apropriado, nem os que reque-
rern rnuitas figuras (corno os jogos). Para concluir, se só tiver u1n cornputador envolvido (isto é,
não for um aplicativo cliente/servidor con10 um programa de banco de dados) ou se o aplicativo
só for usado por você, pode ser mais sensato criar um aplicativo co1n base no Windows.
268 Dia 10
FIGURA 10.3 ~ 1111t ~ t,o)l'C\ t,,N QtM ,,,,,._ r~ J11t.tn f(.-..e• I"'• )VIII•• a•
..i . llJ • ~ g QI ll, • . Ç. r.. • ...... . lt' ........... - - -. :.; e!' ~ ': • t) •
Controles-padrão para li!"' • CI Q • • I V ô. "' "
t' lff!IIG:• ~ D li( 8
os forn1ulários da fVeb. 1 - . i'
;; .... ,4'fflt
t . w 1:-~ -=-,- - -
. ...
,;SJ 11'!1•,:~
f
..............
it "'"'~ •..,..., 1 t..;z,,.,. §-1,,r.1ç •.li
~
!;J
:;:, .........
\.i,iot•
ro,,,o-u., .:J f
;:] °""""
li •.,•.-....
P c11,,~...
t-:. C11ed, a.:w,t
:; 11•1110~1\
r 1
1
ç • ..._
•
.-~,--...
~ tffi.11•
o .....
_.. •
.:J
... ...
TtJ$ IJft.•9 ....~ C•fO'W\J
,, ,
• • l.. • •
i'flo-(.1",,.~)
-~n ,.. ••
Controle Descrição
Label Use para inserir texto no formulário da Web. Como alternativa, você pode
apenas dar um clique no formulário e digitar. O controle Labe 1 fornece
uma administração melhor da formatação e permite a inserção do texto
onde for desejado. Para concluir, este controle também possibilita a alte-
ração dinâmica do conteúdo de seu aplicativo, o que não pode ser feito
com o texto adicionado ao formulário.
TextBox Use para fornecer ao usuário um campo onde inserir informações. Este
em geral é o controle mais comum adicionado a um aplicativo da Web.
Construindo a Interface com o Usuário com os Formulários da Web 269
Controle Descrição
Button Use para fornecer ao usuário algo para dar um clique a fim de executar al-
guma ação.
LinkButton Semelhante no resultado ao controle comum Button, LinkButton é um re-
curso no qual o usuário de seu aplicativo da Web pode dar um clique. Adi-
ferença é que Button se parece com um botão, enquanto LinkButton é um
hyperlink. (Ou seja, o usuário vê um bonito ponteiro azul, sublinhado em
algum local.)
ImageButton Semelhante no resultado ao controle comum Button, ImageButton é um re-
curso no qual seus usuários podem dar um clique a fi m de executar algu-
ma ação. A diferença é que I mageButton é uma figura.
Hyper1i nk Semelhante a Li nkButton, exceto por não possuir um evento Cl i ck. Isso sig-
nifica que você só pode escrever códigos que lidem com a ação de clicar
em LinkButton, ao passo que Hyperl i nk pode ser usado apenas para enviar
o usuário para outro local.
DropDownli st Os controles DropDownL i st são comuns nos formulários da Web. Trata-se
de uma lista que inicialmente só ocupa uma linha. Você pode dar um cli-
que na seta suspensa para abrir e ver a lista completa. Depois de um item
ser selecionado ela será fechada, e só uma linha será mostrada, contendo
sua opção. Esses controles poderão ser usados nas situações em que seu
usuário tiver de selecionar apenas um item em uma lista e quando se qui-
ser economizar espaço na tela - por exemplo, para selecionar o código de
um Estado ou país.
Li stBox Os controles Li stBox permitem que o usuário selecione um ou mais itens
em uma lista de opções. Eles diferem de DropD0111nli st pelo fato de a lista fi -
car sempre visível. Outra diferença é que é possível selecionar vários itens
em Li stBox. Use este controle quando você precisar do recurso de seleção
múltipla (porém, examine CheckBoxli st), quando quiser que o usuário pos-
sa ver todas as opções ou quando houver bastante espaço na tela.
CheckBox O controle CheckBox representa a resposta afirmativa ou negativa a uma
pergunta. É marcado ou desmarcado e, portanto, usado quando se quer
que o usuário selecione ou não uma opção. Ele difere de RadioButton, no
fato de que CheckBox não depende de outros controles iguais a ele, en-
quanto RadioButton em geral é uma opção entre muitas.
CheckBoxlist O controle CheckBoxlist é composto de vários controles CheckBox. Mesmo
sendo todos independentes, o controle CheckBoxL i st é uma maneira práti-
ca de adicionar vários controles CheckBox a uma página. Este controle é es-
pecialmente útil quando se tem um conjunto de itens (que podem ter sido
recuperados de um banco de dados) entre os quais o usuário deve selecio-
nar. CheckBoxlist também é um substituto adequado para ListBox quando
se pretende que o usuário selecione vários itens. No entanto, é recomen -
dável usar ListBox se houver mais de seis itens.
J 270 Dia 10
Controle Descrição
RadioButton O controle RadioButton é semelhante a CheckBox no fato de seu valor só po-
der ser True ou Fa 1se. A diferença entre os dois é que os controles Radi oBut-
ton tendem a 'viajar em pacotes'. Embora cada CheckBox de um formulário
possa ser configurado independentemente como True ou Fal se, apenas
um Radi oButton de um conjunto pode ser True. Portanto, você pode consi-
derar CheckBox como um controle que produz uma resposta afirmativa ou
negativa, enquanto RadioButton (ou melhor, um grupo de controles Radio-
Button) se assemelha mais a uma pergunta de múltipla escolha para a qual
só uma resposta é correta.
RadioButtonlist O controle RadioButtonlist nada mais é que um grupo de controles Radio-
Button. Ele facilita a criação desse grupo, se você já tiver uma lista prove-
niente de algum outro local (como um banco de dados).
Image O controle Image permite que você insira uma figura na página.
Panel O controle Panel é semelhante ao Label no f ato de ser apenas um espaço
reservado para texto. A diferença é que Panel pode conter outros contro-
les. Portanto, é um ótimo recurso a ser usado quando você precisa separar
ou realçar informações ou controles. Controles semelhantes ou relaciona-
dos podem ser agrupados em Panel para que se destaquem.
Exata1nente como deve ser feito co1n os controles Windows, para usar os da Web, dê u1n clique
duplo sobre eles na caixa de ferramentas ou arraste-os para seu formulário. Nesse caso, poré1n, o
fonnulário será tnna página da 'vVeb.
Iremos criar um aplicativo si1nples co1n um fonnulário da Web para ver co1no esses controles
nos ajudam a escrever programas na rede.
Inicie o ambiente de desenvolvi1nento se ele não estiver em execução e crie u1n aplicativo da
Web. Cha1ne-o de Madl i b. Ele será usado con10 exe1nplo do desenvolvimento de u1n aplicativo
simples da Web para que possamos ver 1nuitos dos controles-padrão em ação. Selecione File,
New e Project para abrir a caixa de diálogo New Project. Abra a pasta Visual Basic Projects e se-
lecione o modelo de projeto Web Application. Altere o no1ne do projeto para Madl i b e dê um cli-
que en1 OK para poder construí-lo.
Exatamente como nos aplicativos co1n base no Windows, sua primeira etapa será dispor os con-
troles que usará em seu aplicativo (veja a Figura l 0.4 para o resultado final). Comece adicionan-
do tuna figura a sua página.
Construindo a Interface com o Usuário com os Formulários da Web 271
O programa a seguir é conhecido co1no Mad.Lib. Na verdade, é um jogo no qual u1n participante
seleciona uma série de palavras (em geral pelo tipo de palavra ou uma descrição). Em seguida,
essas palavras são inseridas em locais específicos de uma história para gerar Lnn resultado diver-
tido e personalizado (é o que se espera).
FIGURA 10.4 [,!e fdit ,tjow 2roJtc:t Auifd '2ob1J9 12.rmot Tot,,te 1nstrt t.comoi Iools ~ ow titio
Formulário Mad li b. l;:,i1 • trJ • ~ !OI !, 1~ • lia •"> '. r• • J:l • C. j ,:o,buq • ~ IMl'-.n,mo • ~ '· I~ ~
IJ~J~ 1 li jJ!JJ ~ . 1
. .· Nonno1 .
.. . ..
• Time~ Now Rom,>n • 3 • 8
.l U ~ /,. i;: ....i; ~.
Storch A.H1.1lt1
A M.ad Li'b " a game where one player " lects • s<ries of words (u,ually by type of word, or • de,cnption). These
words are lhen plugged llllo • 11ory :u rpecilie spoi, to crente a (hopefillly) omu:ing, personlllized end re,ult
,-Rudy
~ Output Toi"I< un
An·aste un1 controle Image para o fonnulário. No inicio, ele deve ter a aparência de u1n quadrado
vazio (ou talvez de urna figura inco1npleta) porque você precisa configurar o caminho para a fi-
gura. Acesse a janela de propriedades e localize a propriedade ImageUrl. Quando der um clique
na janela Property para acessar a propriedade ImageUrl, verá um botão com três pontos. Exata-
rnente como nos aplicativos Windows, isso significa que u1na caixa de diálogo o ajudará a confi-
gurar essa propriedade. Dê u,n clique no botão e procure uma figura adequada. (Criei u1na que
exibe Madl i b no programa Paint que vem com o Windows 2000.) Dê un1 clique em OK, e a figu-
ra já deverá estar no fonnulário.
Fornecer un1a explicação de seu progra1na em geral é uma boa prática. Adicione un1 controle La-
bel e uma explicação simples na propriedade Text. O texto que inseri você encontra no primeiro
parágrafo após a image,n.
A seguir, você adicionará à página os controles para os vários itens que inserirá. A Tabela 10.2
descreve as configurações das propriedades e controles usados.
1 272 Dia 10
Além disso, você pode querer inserir un1a linha e1n certos pontos para organizar 1nelhor os con-
troles na página. Veja a Figural 0.5 para a visualização de um exemplo. Se estiver familiarizado
co1n a HTML, ta1nbém poderá adicionar os controles e1n u1na tabela para obter possibilidades de
formatação ainda mais adequadas.
274 Dia 10
• .!.I
Add ,&e move I
OK j 11 Cancel I! tjelp )
~
A maioria das propriedades usadas tem u.tn sentido próprio; no entanto, algumas precisam de
u1na explicação adicional. Muitos controles que trabalha1n com listas pode,n ser 'destinados' a
um conjunto de itens. E1n geral, isso significa que eles poderão ser associados às informações re-
cuperadas en1 bancos de dados, poré1n também podem fazer referência a outros conjuntos, co1no
os arrays. Os controles que possuern essa capacidade pode1n ser facihnente identificados, já que
possue1n un1 conjunto Items. Esse conjunto aparece na janela Property e permite que você adi-
cione itens sem vincular um controle a urn array ou a outro conjunto. Essa é a maneira 1nais fácil
de adicionar itens se eles não pudere1n ser alterados. Se apresentarern a possibilidade de altera-
ção, deverão ser armazenados em um banco de dados e ser recuperados no te1npo de execução
para, em seguida, ser vinculados ao controle. Exa1ninare1nos esse procedimento no Dia 12,
"Acessando Dados con1 a Platafor1na .NET".
O controle Radi oButtonL is t possui u1na propriedade relativa1nente rara: RepeatCo 1umns. Você
pode configurá-la para controlar a quantidade de colunas usadas na exibição da lista de itens.
Essa pode ser u1na óthna 1naneira de econornizar algum espaço na tela, mesmo enquanto todos
os itens são exibidos. lnterna1nente, o controle RadioButtonList gera um código HTML para
executar essa tarefa. Esse é um dos recursos que tornam esses controles mais fáceis de usar do
que escrever seu próprio código HTML.
Construindo a Interface com o Usuário com os Formulários da Web 275
A próxima etapa no desenvolvimento de seu aplicativo da Web é adicionar códigos. Você só in-
serirá o código dos dois botões. Começaremos com o botão Cl ear. Esse botão apagará as infor-
1nações de todos os controles TextBox e dos resultados de Labe l. Dê um clique duplo no botão
Cl ear e adicione o código mostrado na Listage1n 10.1.
9 txtOccupation .Text = li li
ANÂLISE O código para esse botão é simples. Tudo que ele faz é configurar a propriedade Text
de todos os controles TextBox e os resultados de Labe l com 11 11
• Isso esvaziará esses
controles.
O código da Listagetn 10.2 ta1nbé1n é si1nples. A idéia básica é que você crie uma string longa
contendo toda a história, e que será exibida nos resultados de Labe l.
ANÁLISE O processo começa na linha 7, onde você declara a string. Ern seguida, ela é construí-
da da linha 8 à 16, e o resultado é inserido na propriedade Text do controle lbl Re-
sul t da linha 18. Um shnbolo que provavelmente parecerá estranho é &= que se encontra nas
linhas 10 à 16. Sendo um novo recurso do Visual Basic .NET, esse atalho é utilizado para executar
inserções em urna string. O código das linhas l O à 11 , por exemplo,
é equivalente a:
10 sTemp = sTemp & ''Em'' &txtDate.Text &
11 '' Comecei a programar no Visual Basic . NET . ''
Você pode usar o operador&= para tornar seu código mais curto quando estiver adicionando
1nais informações ao final de uma string existente.
Depois que tiver adicionado o código, você já estará pronto para construir e testar seu progran, a.
Selecione Build no 1nenu Build e, em seguida, execute o programa. Isso deve iniciar um navega-
dor e carregar sua página. Insira alguns itens e dê urn clique no botão Write Story para ver sua
história. A Figura 10.6 mostra o formulário da Web em ação.
O formulário Madl i b O. · '-'< • <> • ~.JD t:! l !IlPer,.,.,o ª"' ~s..,d, ffi•••onto, ~ ~· €} g ffiJ UA Q &
-
e 111 açao.
AdcfreJJ lru htU,://r,ndom/Kedhb/t,ledlib~ pX .:]j j""~' ..
•
o
A Mad Lb is a game whete one player st1ecu a senes of words {usually by typt <>f word. or a descnpMn). Thue word-s att
lhm plugged ano a stOI)' ai spccific spots 10 crcatc a (bopefülly) attwfU!8. pcnooahzed cnd re<ult
An emotionaJ st.ate:
r Exc11ed r PillÍcky r Frial11ened
r Fruslra,ed r Etmti, r Happy
r lntrigucd r At1VJ r Shookcd
r Sacklcncd r Jealous r Blue
A ,•erb: An oc:tupation:
•
Local inttanet
Construindo a Interface com o Usuário com os Formulários da Web 277
Atualizemos o projeto Madl i b de n1odo que use un1 controle Ca 1endar etn vez de TextBox para a
data inserida. Você pode editar o formulário antigo ou copiá-lo se quiser visualizar os dois.
Exclua a caixa de texto Date e adicione u1n controle Ca 1endar. Neste ponto, você pode escoU1er
entre testar as propriedades que afetam a aparência de Cal endar ou faci litar as coisas e selecio-
nar o link AutoFonnat, que se encontra na patte inferior dajanelaProperties quando selecionar o
controle Cal endar. Optei por dar um clique no link e selecionei Co 1orful 2. (Por que co1nplicar e
criar algo estranho quando u1n profissional já trabalhou etn uma opção de aparência adequada -
seria essa un1a de minhas estratégias de progra,nação?) Configure a propriedade Ca 1endar' s
Name como ca 1Da te.
Você tambérn terá de alterar u1n pouco o código das Listagens l O. J e J0.2 por causa da mudança
no nome do controle. As Listagens 10.3 e 10.4 mostran1 o novo código alterado.
278 Dia 10
ANÁLISE Apenas uma linha de código foi alterada. Já que você não ten1 1nais a caixa de texto
txtDate, não pode configurá-la com" ". E1n vez disso, você pode reconfigurar Ca-
l endar para selecionar o dia atual (DateTime. Today), como fez na linha 6.
ANÁLISE Novamente, a única alteração na Listagem 10.4 foi na linba 10. Em vez de recuperar
a data em TextBox, o código recupera a data selecionada em Calendar com cal Da-
te. Sel ectedDate.
Construindo a Interface com o Usuário com os Formulários da Web 279
'
Não é verdade que as propriedades possuem um sentido intrínseco? E por isso que os criadores
não chamaram o sistema de Visual Complexo .NET.
cesso - por exe1nplo, se o valor tiver de ser u1na entre várias entradas que se encontre1n
em um banco de dados.
AJém desses cinco, també1n há o controle Va 1i dati onSummary, que exibe todas as 1nensagens de
erro de todos os controles Va 1ida tor na mesma página. E' úti I por fornecer u1n único local para
todas essas informações.
Os cinco controles de validação possuen1 várias propriedades i1nportantes en1 con1um. Elas es-
tão relacionadas co1n o controle que 1nonitoran1 e co1n a maneira de exibir o e1To. As 1nais impor-
tantes entre essas propriedades estão descritas na Tabela 10.4.
Propriedade Descrição
Você pode usar alguns desses controles para encerrar o aplicativo Mad l i b do exemplo. Pode en1-
pregar o controle Requi redFi e1dVa1ida tor para assegurar que o usuário tenha inserido as infor-
1nações nos campos certos, e RangeVa 1i dator para se certificar de que u1n nú1nero apropriado foi
digitado no ca1npo txtNumber. Para concluir, é possível abranger todos os erros en1 um resu1no
com o controle Val idationSummary.
Mais u1na vez, copie ou abra o projeto ou o forn1ulário anterior para editá-lo. Você adicionará os
controles Validator a ele.
Arraste u1n controle Requi redFi e1dVa 1i dator para peito de cada u1n dos controles TextBox re-
1nanescentes ( txtName, txtNumber, txtVerb e txtOccupat i on). Adicione um controle RangeVa 1i -
dator próximo ao controle Requi redFi e1dVa 1i dator que você posicionou perto do ca1npo
Construindo a Interface com o Usuário com os Formulários da Web 281
txtNumber. Por firn, adicione um controle Va1ida ti onSumma ry ern uma linha própria entre os bo-
tões e o controle l bl Resul t. Configure as propriedades de cada u1n desses controles co1no mos-
trado na Tabela 10.5.
Precisa,nos fazer u1na pausa para descrever as três propriedades de RangeVa li dator que você
não atribuiu antes. Embora seja evidente o sentido de MaximumVa l ue e Mi nimumVa l ue co1n relação
a algo chan1ado RangeVa li dator (validação de intervalo), a propriedade Type não é tão óbvia. Já
que RangeVa l idator pode ser usado para testar vários tipos diferentes de valores (corno inteiros,
282 Dia 10
valores financeiros ou datas), a propriedade Type identifica o tipo de infonnação que será com-
parada. .Ela pode ter um dos valores a seguir:
• String O padrão; faz con1 que o controle verifique se o valor está alfabetican1ente en-
tre as duas extre,nidades.
• Integer (inteiro) Con1para o valor con1 as duas extre,nidades para assegurar de que
faz parte do intervalo. Só os valores inteiros são usados.
• Double (duplo) O mesmo que o inteiro, porém incluindo a parte decitnal do valor e
das extremidades do intervalo.
• Currency (moeda) O mesmo que o inteiro, poré1n incluindo as quatro pri,neiras casas
deci,nais do valor.
• Date (data) Compara os valores co1no se fosse,n datas, portanto, um valor igual a 27
de agosto de 1964: seria aceito ein um intervalo entre 23 de nove1nbro de 1963 e l!! de
abril de 1986.
Agora verificare,nos por que os controles Va 1i dator são tão úteis. Para fazê-los func ionar, você
não precisa adicionar nenhum outro código. Construa e visualize a nova página da Web (veja a
Figura 10.7). Tente deixar alguns ca,npos e,n branco e exclua o algaris1no 500 que é o va-
lor-padrão para o campo do número. Você verá mensagens de erro vermelhas aparecere1n no
formulário. Se isso não acontecer, tente dar un1 clique no botão Write Story. Provavelmente sur-
girá algo semelhante ao fonnulário da Figura 10.8. Tente inserir um valor que esteja fora do in-
tervalo aceito para o ca1npo do nú,nero. Por fi1n, digite valores corretos e,n todos os ca,npos e
selecione o botão Write Story. Todas as 1nensagens de erro devem desaparecer e nossa história
será exibida.
O j'ornndário Madl i b !~ · tJ .
I~~ •
~"~li ~ '! ,-, '. ..... J!l· ~l
IOJ ~ . 1 . . ...
,:o,b~
. "'
, --"'-"'--'-
· lrs :• •
_..m,
·11·---'=-""".""'.~ -! -·] li
'
I u I /)
. ~ ~
1.. 1 .- .».
111os1rando os
controles de
validação.
~.
~
:
'
ffl
..
M~o~dli~b.~UP~•,!::::;:;::::========::::::;::::;:;:;::::::::;;::=:::;;;;;===============:::!
our lrt na.me: le.&Jc e' e1 n.unc ,1
•
!' i kind of!rui1:ÍM•n90 .:J i numberfrom 100 w 1000,ÍSOO
f.Jt,l!t rbt~ 11 nurnber btt'Nttn 100 an.! 1 ~o
i 'l _, emotional state:
f 'ur Exciled r Panicky r Fri&bltned
r F ruwiued r E<S1llllc r lloppy
r lntngued r Aft/!f'f r Shocked
r Saddened r Jealo.,. r Blue
:l. verb,F
q,, o o
.
'Je:ise tn1tr ilD oc~a.1,~
.. wn,. Slory I e,•., 1
0
Enw • r:nes$agt J
O
• EnameH"St:-
o o o
IQ D••Ôjl• J8 NTMl
- --
FIGURA 10.8 Lfite fdl\
-
~ew rt.von~ IoolJ: ttelp
O for,nulário Mad l i b j <;>e•ú< • ,;, • @ [} ~ [I'.Per,o. .10.r ~ S.• t<h (!)F,von1e, (3 (é• (.iÍ ~ (E l1à e _2
rnostrando os erros
•
encontrados na A Mad U," a gnm• w11tre ont pia,« selttts a stnes ofwords (usually by <;;>e of word. or • descnplion) Th•se words are
then plugged in10 a stoiy at spt<ific spou to create a (hopefully) amu,ing. penonalized end resulL
validação.
Yoorrm, nanie: leob A date: IM" 12. 200 1
A kind or froit: IM,ngo .:) A 11w11bor r,.,.,. 100 10 1000: f.iô
1ro ,nJ 1000
An emotional state:
r- Ex.ittd t" Ponicky t" Friglrtened
t*' Frustrat.cd l"' Ecstatit l"' Happy
t" lnlzia..ed t" Àn/!JY t" Shotked
t" Sa<l<lcntd t" Julou, t" Blve
Resumo
Os aplicativos da Web estão cada vez 1nais i1nportantes, e os fonnulários da Web tornam sua cria-
ção bastante fácil. Eles permitem que você use as 1nesmas técnicas que e,npregaria para desen-
volver aplicativos para microcomputadores na construção de un1 aplicativo da Web que funcio-
ne e,n qualquer navegador. Colocando o código novamente e1n un1 servidor (que você possa
controlar), é possível extrair o melhor que há nas duas alternativas para chegar ao objetivo pelo
qual os desenvolvedores se e1npenhara1n - u1na interface com o usuário sofisticada e recursos
compatíveis com vários navegadores.
E1nbora apenas sbnular uma experiência como a que se obtém no Windows já seja o suficiente
para a maioria das pessoas, os formulários da Web vão alé,n, ajudando-o a criar com 1naior faci-
lidade rotinas de validação e controles complexos.
Na próxima 1ição, você começará a examinar a progran,ação orientada a objetos. Aprenderá qual
a relação que a POO te,n co1n o Visual Basic .NET e co1n a progra1nação em geral. Perceberá
que até aqui já esteve investigando os objetos, na forma do .NET Fra1ne\.vork, assim co1no dos
formulários e controles que te1n usado.
P&R
P Preciso ter um servidor Web disponível para usar os formulários da Web?
284 Dia 10
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar em como colocar seu conheci,nento e1n prática. As respostas do teste estão
no Apênd ice A, "Respostas dos Testes/Exercícios".
Teste
1. Se você pode adicionar texto a un1a página da Web apenas por 1neio da digitação, por que
precisaria dos controles Labe 1?
2. Que controles o ajudarão a navegar entre as páginas de um aplicativo da Web?
3. Con10 posso exibir figuras e1n u1n fonnulário da Web?
Exercício
Crie uin aplicativo para execução de registros. Esse novo aplicativo da Web deve permitir que o
usuário digite:
• Seu nome. Esse carnpo é de preenchin1ento obrigatório.
• Um nome de usuário para usar e,n seu site. Esse campo é de preenchimento obrigatório e
não pode ter 1nais do que 1O caracteres.
• Un1a senha nova (lembre-se de que a senha deve ser 1nantida e1n segredo). O usuário deve
inserir sua senha duas vezes para garantir que tenha sido digitada de modo correto. Os
dois campos são de preenchimento obrigatório e devem ter a 1nes1na informação.
Depois que as informações tiveren1 sido inseridas, o usuário deve dar um clique em um botão.
Elas serão então 1nostradas para ele.
Semana 2
DIA
Porém, organizar os CDs en1 um único fichário não é tuna tarefa tão simples quanto pode pare-
cer, já que há muitas maneiras diferentes de ordená-los. Talvez por artista possa ser 1nelhor (cer-
tificando-se de que os Barenaked Ladies venha1n antes do Boney M.), ou por categoria,
separando os discos em grupos de pop, rock, 111úsicas natalinas e por aí afora. Há tantas decisões
a serem tomadas. Brian Ada1ns deve ser colocado na letra A (levando-se em consideração o so-
brenon1e) ou na B (considerando-se o prin1eiro no1ne)? E os CDs novos? Depois de colocar esse
1nesmo CD do Brian Adatns etu um dos poucos espaços iniciais de seu fichário, o que se deve fa-
zer se ele lançar 1nais u1n álbtnn? Será necessário 1nover todos os outros CDs para a frente a firn
de criar espaço, ou será interessante apenas colocá-lo no final e prejudicar seu ótirno sistema de
posicionamento alfabético? No fi11al, pode ser mais sin1ples decidir não co1nprar 1nais discos, o
que parece ter sido a escolha feita pelos pais do autor nos idos dos anos 70.
A necessidade de tom.ar uma decisão se tornou óbvia quando, durante a litnpeza de CDs, nosso
conhecido autor se deparou co1n dois (2!) CDs "Queen: Classic Hits, Volun1e l ". Pois bern - e
isso não é nada contra o Queen-, ninguém precisa de dois CDs iguais de 1nelhores sucessos, não
i1npo11aquanto ele goste de ouvir "Bohernian Rhapsody". Algo tinha de ser feito rapida1nente.
,
A Decisão E Tomada
Todas as opções acabara1n sendo 1nuito trabalhosas, e o autor chegou a uma conclusão surpreen-
dente: as inforrnações sobre o CD deveriarn ser inseridas e1n um programa de computador! Para
ser sincero, não é assim tão surpreendente- ele chegou a essa conclusão e1n n1uitas outras situa-
ções (talvez muitas, se você perguntar a sua esposa ou a um de seus poucos amigos que continua,.
ra1n a sê-lo). No entanto, a idéia de armazenar dados em u.m computador não é tão nova; na
verdade ela se1npre foi uma das finalidades 1nais comuns dos sisternas de co1nputador.
Você pode organizar os dados de 1nuitas maneiras, ,nas a vantagem de usar u1n co1nputador para
executar a orga11ização é que, depois que estiverem no siste1na, poderão ser visualizados de várias
rnaneiras. Isso el imina 1nuitos dos problernas enfrentados pelo pobre autor no cenário descrito
anteriortnente. Se um novo CD tiver de ser incluído, poderá ser adicionado ao final do arquivo de
dados, mas será exibido e1n sua localização apropriada co1n base na visualização selecionada. Se
você quiser visualizar os CDs por a1tista, apenas ordene os dados usando un1 ca1npo cha1nado
A1tista. Se preferir vê-los pelo título do CD, a reordenação pode ser facilmente executada.
Nesse caso, vatnos supor que todos os dados tenhatn sido inseridos em urn arquivo de texto no
computador, com cada linha desse arquivo representando un1 CD. Os campos e entradas possí-
veis teriatn a aparência a seguir:
ArtistName , ArtistFirstName , Artistlast Name, CDTitle , CDReleaseYear,
.,. MusicCategories
Sti ng , Sti ng, -, Brand New Day, 2000, Pop
Queen, Queen, -, Classic Hits Vo l ume 1, 1987, Roc k/ Pop/Best Of
Sting, Sting, -, Fields Of Gold, 1994, Pop/Best Of
Introdução aos Bancos de Dados 287
N OTA
- Em muitos bancos de dados, não são permitidos espaços nos nomes das tabe-
las ou dos campos, portanto o nome dos campos teve de ser alterado para evi-
tar problemas de compatibilidade.
A prirneira linha desse arquivo, chamada linha do cabeçalho, indica que pa1ies da inforn1ação
estão ar1nazenadas e,n cada linha. Un1a nova linha marca o início do registro de cada álbum. As
vírgulas são usadas para separar os ca,npos, tornando esse arquivo un1 arquivo separado por vír-
gulas (ou delimitado por virgulas). Tão sitnples quanto parece, esse arquivo é um banco de da-
dos e poderia ser utilizado por un1 progran1a de con1putador que registrasse os álbuns. Já que se
trata de utn banco de dados, você pode usá-lo para aprender alguns dos terrnos que e1npregará
daqui e1n diante para se referir às diferentes partes de um banco de dados:
Novo TERMO Cada CD listado nesse arquivo é um registro individual, às vezes chamado de linha
porque os registros etn geral são annazenados ou exibidos cotno linhas separadas
com as informações.
Novo TERMO
Dentro de cada registro, vários trechos da informação sobre cada CD são registrados,
e cada ite1n desses é charnado de campo (nesse caso, ArtistName, CDTitle, CDRele-
aseYear e outros). Co1no os registros, os campos ein geral são conhecidos por outro nome, colu-
nas, porque são co1n freqüência armazenados e exibidos como colunas individuais com
informações.
Novo TERMO
O grupo completo de registros (todos con1 o n1esmo conjunto de ca,npos) é cha1nado
de tabela, e um banco dedados pode conter muitas delas, embora o exemplo desta li-
ção, até o n1omento, só apresente u1na.
vertennos seus dados para o fonnato de um banco de dados co1no o Access ou o SQL Server.
Esses siste1nas gerenciadores de bancos de dados podetn manipular o artnazenamento de suas in-
fonnações e também responder solicitações de recuperação e alteração desses dados, gerenciando
todos os detalhes de layout de arquivo e annazenan1ento. Os sistemas de bancos de dados possu-
em muitos recursos, n1as o serviço cotnum que eles fornecem é manjpular os detalhes de arn1aze-
namento de dados e liberá-lo de qualquer interação física com as infon11ações.
Com o banco de dados de CDs corno exemplo, se você quisesse recuperar todos os títu-
los de CDs junto con1 os nomes de seus artistas, poderia executar esta instrução SQL:
Ela retomaria um conjunto de dados com dois campos, e uma linha para cada regis-
tro da tabela Disc. Como alternativa, se você quisesse obter todas as colunas de uma
tabela, poderia usar * em vez de un1a lista de campos, produzindo u1na instrução
como a da linha a seguir:
sELECT * FROM Oi se
Embora você provavelmente irá ver instruções SQL corno essa en1 muitos exen,plos
e até em aplicativos, não é uma prática recomendável recuperar todos os ca1npos de
u1na vez. O que se deseja setnpre é recuperar a menor quantidade possível de infor-
Introdução aos Bancos de Dados
mações, e em geral isso não significa todos os campos. Seja cuidadoso para não pre-
judicar a longo prazo o desempenho de seu código apenas para obter uma economia
no ten1po que leva a digitação e,n seu programa.
Faça
J
Especifique cada campo que quiser recuperar Não use* para indicar todos os campos, a me-
em uma instrução SQL. nos que esteja certo de que precisará de cada
campo que existe na tabela e de todos os ou-
Recupere a menor quantidade de dados ou de tros que possam ser adicionados posterior-
campos e registros possível para fornecer um mente.
desempenho melhor.
Ordenando os Resultados
A orden1 dos registros retornados não foi especificada nas duas consultas mostradas até agora,
mas você pode ad icionar u,na cláusula à instrução SQL para configurar a ordem da classifica-
ção. Essa cláusula, ORDER BY, usa uma lista de campos, permitindo que possa ser especificado
1nais de un1 na ordenação. A instrução SQL a seguir recupera os campos Art i s tName e CDTi t l e
de todos os registros da tabela Disc, ordenando-os primeiro pelo norne do artista (Arti stName) e,
e1n seguida, pelo título do CD (CDTi tl e) dentro de cada conjunto de registros de artistas:
SELECT ArtistName, CDTitle FROM Disc ORDER BY ArtistName, CDTitl e
Por padrão, u,n ca,npo especificado na cláusula ORDER BY será classificado e1n ordem crescente
(e1n relação ao valor ou à ordem alfabética, até atingir o último registro retornado), de A a Z se o
campo arn1azenar texto. Se você quiser que a ordem s~ja inversa, decrescendo de Z a A, então,
e-speci.fique uma palavra-chave DESC próxima ao trecho da cláusula ORDER BY que deseja que seja
classificada na orde1n inversa. O exe1nplo a seguir ordenará por artista e,n ordem alfabética in-
versa e, em seguida, por título de CD em ordem crescente.
SELECT ArtistName , CDTitle FROM Disc ORDER BY ArtistName Desc, CDTitle
A ordem-padrão, crescente, també1n pode ser especificada com o uso da palavra-chave ASC exa-
ta,nente co1no Desc é e1npregada. A instrução SQL a seguir possui o ,nesmo efeito que a anterior,
roas é 1nais explícita sobre o que está acontecendo.
SELECT ArtistName, CDTitle
FROM Disc
ORDER BY ArtistName Desc , CDTitle ASC
1
Especifique ASC mesmo se estiver usando Não ordene mais campos do que os necessá-
DESC; ajudará a evitar confusão. rios porque isso afetará o desempenho.
1290 Dia 11
Especificando um Critério
As instruções SELECT 1nostradas até agora recuperavam todos os registros da tabela Disc, rnas e
se você quiser recuperar só u1n determinado registro ou um conjunto de registros com base ern
um critério específico? Outra cláusula pode ser adicionada a uma instrução SELECT para se encar-
regar disso, a cláusuJa WHERE. Nessa cláusula, pode1n ser especificados quantos critérios se dese-
jar para restringir que linhas serão retornadas. Usando esse recurso, a instrução SELECT a seguir
só recuperará os CDs do Sting:
SELECT CDTitle, CDReleaseYear FROM Disc
WHERE ArtistName = 'Sting'
Observe que o campo usado para ,
restringir os resultados não foi um dos retornados; você pode
utilizar o ca1npo que quiser. E possível combinar vários critérios e1npregando os operadores
AND/OR e usar parênteses para detenninar como esses critérios serão aplicados. Para recuperar os
discos lançados depois de 1984 cujo no,ne do artista é Sting e os lançados antes de 1984 pelo
grupo The Police, a instrução SELECT a seguir poderia ser erupregada:
SELECT CDTitle, CDReleaseYear FROM Disc
WHERE (ArtistName = 'Sting' ANO COReleaseYear => 1984)
OR (ArtistName= 'The Police' ANO COReleaseYear < 1984)
Essa consulta levanta urna questão relativa aos bancos de dados que sernpre foi incô1noda: o dis-
co deve ser inserido como Po 1ice ou Po 1ice, The, representando o valor do campo Art i stName?
Detalharei esse e outros problen1as cornuns relacionados aos bancos de dados, alé1n das melho-
res ,naneiras que conheço para resolvê-los, ainda nesta lição em "Problernas Co1nuns dos Ban-
cos de Dados e Suas Soluções".
É possível saltar a lista dos no1nes dos ca,npos, contanto que a de valores esteja na orde1n corre-
ta. No entanto, esse é outro exe1nplo de como você pode econo1nizar tetnpo na criação do códi-
go, porém tornando sua 1nanutenção mais difícil e fazendo com ele esteja mais propenso a
apresentar algu1na falha no futuro.
Alterando Registros
A SQL fornece a instrução UPDATE para que n1odificações seja1n feitas e1n registros existentes,
permitindo que você altere de imediato um Olt mais campos de quantos registros quiser. Essa ins-
trução possui a sintaxe básica a seguir:
Con10 na instrução SELECT, a instrução UPDATE pode ter urna cláusula WHERE. Sem
essa cláusula, ela executará sua atualização em todos os registros da tabela. Portanto,
a instrução
configuraria todos os campos CDTi tl e como 'Novo Título ', que provavelmente não
é o resultado pretendido. Ernbora eLn geral seja atualizado apenas um registro, é útil
poder alterar vários deles corn u1na instrução UPDATE. Novos valores configurados
com o uso dessa instrução podem ser baseados no conteúdo existente no campo.
Corno exemplo, considere esta atualização ern uma tabela fictícia que fornece a cada
funcionário 10% de aurnento:
Na maioria dos casos, no entanto, será preferível especificar urna cláusula WHERE para
restringir os registros afetados a um grupo menor ou mesmo a urn único item. A ins-
trução SQL a seguir atualiza todos os registros dos Barenaked Ladies na tabela Disc
alterando seu valor en1 Mus i cCa tegori es para Pop:
UPDATE Disc SET MusicCategories = 'Pop ' \~HERE ArtistName = 'Barenaked Ladies '
Esse tipo de reavaliação de categorias e agrupa1nentos ern un1 banco de dados é algo
que você pode querer fazer de vez ern quando para evitar confusão.
Embora os exemplos desta lição tenha1n s.ido simples, a instrução UPDATE pode exe-
cutar ações mais complexas. Por exemplo, você pode atualizar vários ca1npos de
u1na só vez, separando cada atribuição co1n u1na virgula, e tornar urna cláusula WHERE
tão intrincada quanto quiser.
292 Dia 11
Nesse caso, como com UPDATE, a cláusula \~HERE é opcional, porém importante por-
que sem ela, você excluirá todos os registros da tabela especificada.
Na tabela Disc, você poderia usar essa instTução para re,nover u,u ce,to grupo de re-
gistros ou, o que é n1ais comum, excluir apenas un1. A instrução SQL 1nostrada aqui
removeria todos os discos de Gordon Lightfoot (exceto um):
OELETE Oi se
\./HERE ArtistFirstName = 'Gordon '
ANO ArtistlastName = 'Lightfoot'
ANO COTitle != 'Summertime Oream'
ro a 1n&11ei
l• Q t.on:11om
G1 Ô O«iet~el
(1) '2) l -
~ ""'·º""""
l!l E) ""'-~ -
•1
' .. .!.I
e:;]~!~ .:.J CI Gódo Me,5bpe, I
\_;' ~li:--J T~ttl "'°''"'°""pGINEIWICN,..(8.0) l,.,<s1) ~ [IO:OOtGO fií '..., ,,j:,, '. ""'1
! t
' ' I
Inconsistências de Atualização
Suponha que um usuário decida atualizar u1na linha da tabela Disc porque o valor de Arti s testá
incorreto. Talvez Sting tenha sido especificado quando o certo seria Bruce Willis. O usuário po-
deria executar essa instrução SQL:
UPDATE Disc SET ArtistName = 'Bruce Willis '
WHERE ArtistName = 'Sting' and CDTitle = 'The Return Of Bruno'
Essa é uma instrução SQL perfeitamente adequada, mas, se a linha original de dados fosse como
a descrita a seguir:
1294 Dia 11
Faça
Não confie no fato de que seus usuários, inclusi-
Estruture seu banco de dados para evitar a in-
ve seus próprios programas, irão trabalhar com
consistência.
os dados exatamente da maneira esperada.
Outra inconsistência comum que pode ocorrer quando se usa un1a estrutura de banco de dados
corno a da tabela Disc é que pode1n existir 1nuitas variações de dados que deveriarn ser idênticos.
Aqui estão três linhas da tabela Disc:
Barenaked Ladies , - , - , Maroon, 2000, Pop
The Barenaked Ladies, - , - , Gordon, 1993 , Pop
Barenaked Ladies, - , - , Stunt, 1999, Rock/Pop
U1na consulta SQL criada para encontrar todos os álbuns dos Barenaked Ladies poderia seres-
crita da seguinte maneira:
SELECT * FROM Disc WHERE ArtistName = ' Barenaked Ladies'
Esse código retornaria a pri1neira e a últi1na das três linhas listadas do código anterior, 1nas não
encontraria o CD chamado 'Gordon' . Isso resultaria e1n um erro exibido para o usuário ou algo
parecido. O usuário simplesmente não conseguiria a infonnação correta.
O terceiro problema com relação aos cainpos Art is t ocorrerá se um a1tista alterar seu non1e. (Essa
situação não é comu1n quando se trata de 1uúsica, mas se você estivesse lidando cotu depa1tamen-
tos de uma empresa ou no1nes de produtos e1n outros bancos de dados, seria um grande problema.)
Suponha que um a1tista, selecionemos de modo aleatório o Prince, altere seu nome da sin1ples pa-
lavra ' Prince' para u1n símbolo impronunciável (que, infelizn1ente, não tàz parte do código ASCII
e, portanto, você não poderá inseri-lo em seu banco, de dados). Seria necessário atualizar cada re-
gistro que no mo1nento tivesse o nome Prince nele. E claro que essa seria tuna instrução siJnples:
UPDATE Disc SET ArtistName = 'O artista anteriormente conhecido como Prince'
WHERE ArtistName = 'Prince'
Pressupondo que ningué1n tenha escrito Prince errado e1n algum local, essa instrução SQL atua-
lizaria todos os registros necessários. Novatnente, no entanto, você está confiando no fato de que
o usuário ou o softv,iare esteja ciente de que é preciso executar várias alterações. Pode ser que
Introdução aos Bancos de Dados
eles nã.o usem uma instrução UPOATE como a anterior. Eles podem alterar apenas uma entrada
para o novo valor, e1n vez de todos os discos de Prince, tornando o banco de dados 1nais uma vez
inconsistente. A situação fica ainda pior quando descobrilnos que precisa1nos alterar todos os re-
gistros retornando-os para ' Prince' no final!
Todas essas questões resulta1n de u1n proble1na na estrutura do banco de dados - as informações
sobre o artista são annazenadas co1n o registro de cada disco, e1nbora o nome do artista na verda-
de seja um conjunto independente de dados. Para evitar os problemas descritos, você deve sepa-
rar as informações sobre o artista para que fiquem e1n sua própria tabela e armazenar apenas um
valor com o disco para vincular as duas tabelas. Para esse valor, poderia ser usado o ca1npo
Arti stName, ,nas isso trará proble1nas se ele for alterado en1 algu1n 1non1ento.
E1n geral é 1nelhor escolher u1n valor que co1n ce1teza nã.o vá ser a.Iterado a. 1nenos que o registro
vinculado, na tabela Artist, seja excluído. Ao examina1mos o conjunto atual de informações so-
bre o artista.- os valores de Arti stName, Arti stFi rstName e Arti s tlastName - , não há nada. que
possan1os garantir que não será alterado. Portanto, você adicionará um campo exclusivo para.
esse fi1n . Co1n freqüência é isso que acontece, u1n campo adicional ten1 de ser criado apenas para
atuar como um identificador exclusivo de um registro, e o método mais comu1n é gerar um cam-
po contendo u1n nú1nero que seja automatican1ente incrementado. Inserindo esse campo a seu
conjunto de infonnações sobre o artista, obtere1nos a ta.bela Artista. seguir:
ArtistIO, ArtistName, ArtistFirstName, ArtistLastName
1,Sting , Gordon, Sumner
2, The Barenaked Ladies, - ,
3,Bon Jovi, - , -
4,Queen, - , -
5,The Police , - ,
•••
45, Janet Jackson, Janet, Jackson
Cada registro da tabela Disc ainda precisa ser associado a u1n artista, po1tanto, você adicionará
um campo a essa tabela que terá um valor de Arti stIO para cada registro.
A tabela Disc agora teria. a aparência a seguir:
ArtistID, COTitle, COReleaseYear, MusicCategories
l, Brand New Oay, 2000, Pop
4, Greatest Hits, 1988, Rock/Pop
•••
O campo Arti stIO é cha1nado de chave porque é usado para identificar tuna entidade individual.
Na tabela A1tist, em que Arti stID identifica apenas um artista específico, esse campo seria deno-
1n i.nado chave primária. Na tabela .Disc, ele pode ser chatnado de chave e.x:terna porque é emprega-
do co1no um vínculo de reto1110 a u1na tabela diferente (veja a Figura 11.2). Urna tabela em geral
contém várias chaves externas, vinculando-a a outras tabelas, poré1n possui só u1na chave prilnária
(embora mais de um campo possa ser usado ao n1es1n.o te1npo para fonnar tnna chave pri1nária).
296 Dia 11
FIGURA 11 .2 Artist
Disc
FK1 ArtistlD
CD Title
CDReleaseYear
MusicCategories
Novo TERMO A chave é um valor, em geral um campo, que identifica uma entidade, como o nome
de un1 estudante, de um autor ou un1 nún1ero de seguro social. Quando um campo
identifica exclusivan1ente cada registro de u1na tabela, é chamado de chave pri,nár;a da tabela. A
chave primária de uma tabela que é inserida em un1 ca,npo de outra tabela para vincular as duas
entidades é conhecida na últuna tabela como chave externa.
Novo TERMO
Quando duas tabelas estão vinculadas pelo uso de chaves primárias e externas,
diz-se que elas estão relacionadas.
Por causa da transferência dos dados do ca1npo Arti st para uma tabela separada, as instruções
necessárias para adicionar e recuperar informações terão de ser alteradas. Para adicionar dados,
será preciso executar duas instruções INSERT, uma na tabela Artist e outra na tabela Disc, mas a
de Artist ocorrerá apenas uma vez a cada artista, e não a cada disco. A criação de tabelas vincula-
das separadas eli1ninaos problemas discutidos anteriormente, mas gera u1na nova maneira de in-
troduzir dados inconsistentes - chaves externas inválidas. Se un1 usuário ou programa re1nover
um valor do catnpo Art is t, então, todos os discos que faze1n referência a essa identificação do
artista repentinamente se referirão a u1n registro da tabela Artist que não existe. Discutirei co1no
lidar co1n esse proble1na u1n pouco mais adiante nesta lição, na seção "Integridade Referencial".
A 1naneira de recuperar dados necessários no banco de dados tan1bém foi alterada,já que as in-
formações que você deseja agora estão contidas e1n duas tabelas. Os 111étodos que usare1nos para
obter esses dados tan1bém serão abordados ainda nesta lição, na seção "Associações: Consultan-
do Várias Tabelas de lllna Só Vez".
Introdução aos Bancos de Dados 297
Campos Multivalorados
Um dos ca1npos, Mus i cCategori es, pode conter mais de u1n 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á vários problemas co1n ele. O prin1eiro problema ocorrerá quando o usuário tentar recu-
perar dados co1n base nas infonnações contidas ali:
SELECT * FROM Disc Where MusicCategories = 'Rock'
Isso retornaria os discos em que o valor de Mus i cCategori es fosse igual a Roc k, n1as não os de
Rock/Pop,
,
Best of/Rock ou qualquer outra informação relativa a 1nais que apenas uma categoria.
E preciso ter algum conhecimento sobre o objetivo do banco de dados. Nesse caso, a finalidade
do campo Mus i cCategori es era agrupar os CDs de u1n ou mais tipos de música. Se o usuário qui-
sesse encontrar todos os seus discos de 1núsica pop ou que se enquadrassem tanto no conjunto
rock quanto em 'clássicos' (seria Rock/Best Of ou Best Of/Rock?), os problemas resultantes tor-
nariam essa categorização inúti 1. Atualizar os dados de u1n ca1npo m ultivalorado ta1nbé1n é qua-
se tão difícil quanto a situação comentada. Ter1ninaríamos tendo de adicionar o novo valor a urn
já existente, nos certificando de que ele já não estivesse lá! Tudo ficaria ainda mais complicado
se e1n algu1n momento decidíssen1os reno1near uma categoria, alterando-a de Pop para Popular
por exemplo, uma tarefa que seria extre1namente difícil de realizar co1n uma instrução UPDATE.
Para corrigir essa instrução multivalorada e evitar todos os problemas decorrentes dela, separa-
re1nos os dados em outra tabela. Diferente das informações sobre o artista, no entanto, só uma ta-
bela nova não pode manipular o relacionan1ento entre as categorias e os discos. Cada artista pode
ser associado a um nún1ero qualquer de discos (ou a absoluta1n.ente nenhum). Esse relaciona-
mento é chamado um-para-111.uitos ou, o que seria 1nais correto, nenhu,n-para-muitos. O relacio-
na1nento entre o disco e a categoria é 1nais co1nplexo; uma única categoria pode ser associada a
muitos discos e apenas un1 disco pode ser associado a muitas categorias. Isso produz um relacio-
na1nento muitos-para-muitos que você poderá 1nodelar usando duas tabelas novas. Uma arn1aze-
nará as próprias categorias, a outra vinculará os discos às categorias (veja a Figura 11.3).
298 Dia 11
FIGURA 11 .3 DiscCategory
As tabelas resultantes obedece,n um padrão que sernpre poderá ser usado para representar um re-
laciona,nento muitos-para-muitos. Detalharei como fazer consultas e1n relacionamentos do tipo
um-para-muitos e muitos-para-muitos na seção a seguir.
N OTA Quando você tiver mais de uma tabela envolvida em uma instrução SELECT, é
possível que um campo com o mesmo nome exista em várias delas. Nesse
caso, é preciso especificá-lo utilizando o formato tabe 1a. campo em sua instru-
ção SELECT para assegurar que o banco de dados compreenda qual o campo de-
sejado. No entanto, essa sintaxe pode ser usada em qualquer situação, mesmo
quando só houver uma tabela envolvida.
Essa instrução informa ao banco de dados que recupere todos os registros da tabela .Disc e, para
cada un1 deles, faça uma pesquisa(usando a identificação do artista-Arti stID - arrnazenada na
tabela Disc) na tabela Artist e,n busca do nome correspondente do artista (Art i stName). Jsso pa-
Introdução aos Bancos de Dados
rece trabalhoso, 1nas, felizmente, todo o trabalho é 1nanipulado pelo banco de dados, e ele o faz
de modo ,nuito rápido. Portanto, embora você tenha removido cuidadosamente ArtistName da
tabela Disc, ainda poderá produzir os 1nes1nos resultados associando as tabelas Disc e Artist.
Vincular duas tabelas e1n u1na consulta para recuperar dados relacionados cha,na-se
Novo TERMO
-
assoc1.açao.
A últi,na instrução SQL usava unia cláusula WH ERE para associar as duas tabelas, o que com certe-
za funcionará, ruas não é a rnelhor maneira de criar associações. Em vez disso, você aprenderá
uma sintaxe nova co1n a qual poderá especificar as infor1nações sobre a associação co1no parte
da cláusula FROM de sua instrução SQL. A reconstrução da instrução anterior con, a sintaxe correta
produzirá
SELECT Artist.ArtistName, Oisc.COTitle
FROM Disc INNER JOIN Artist ON (Artist.ArtistID = Oisc.ArtistIO)
Essa instrução gerará os 1nes1nos resultados que a do exen1plo anterior que usava a cláusula
WHERE, e pode ser chamada de associação interna. E' possível especificar Oi se JOIN Arti st, e a
palavra INNER 'omitida' será incorporada, porém o Access não aceita essa forma abreviada.
Por outro lado, se você usasse uma instrução OUTER JOIN como mostro a seguir, o campo Arti st-
Name seria retornado contendo Li mp Bi z kit. Já que nenhu1n registro correspondente seria encon-
trado na tabela Disc, CDTi t l e teria utn valor nulo para esse registro.
SELECT Artist.ArtistName, Disc .CDT it le
FROM Disc LEFT OUTER JOIN Artist ON (Artist.ArtistID = Disc.ArtistID)
Co1no você viu nos exen1plos, o resultado de u1na associação interna pode ser enganoso porque
inclui apenas os valores etn que uma correspondência foi encontrada entre as duas tabelas. Mes-
1no assim, esse tipo de associação é adequado para a maioria das consultas.
Relacionamentos Muitos-para-Muitos
Para modelar o relacionainento ,nuitos-para-muitos dos CDs com as categorias, você terminou
com três tabelas distintas: Disc, Category e urna terceira criada apenas para esse relacionamento,
chamada DiscCategory. Para fazer consultas nessas tabelas, será preciso usar duas associações -
luna entre Disc e DiscCategory e outra entre DiscCategory e Category. Por exemplo, a instrução
SQL para recuperar todos os CDs que fora1n atribuídos à categoria Pop é mostrada a seguir:
SELECT Disc.CDTitl e
FROM Category INNER JOIN
(Disc INNER JOIN DiscCategory ON Disc.DiscID = DiscCategory.DiscID)
ON Category.CategoryID = DiscCategory.CategoryID
WHERE Category.Category = "Pop"
Quando você tiver várias tabelas relacionadas, poderá usar instruções de associação aninhadas
como as 1nostradas no código anterior, no qual uma tabela está na verdade sendo associada ao re-
sultado da associação de duas outras.
Integridade Referencial
Nos casos em que existem várias tabelas, há n1ais probabilidade de sere1n encontradas inconsis-
tências. Con10 discuti1nos, se um artista for referenciado por sua identificação e1n um ou mais re-
gistros da tabela Disc, então você terá dados inconsistentes se ele for excluído. Para evitar isso,
faça com que o banco de dados tenha conhecitnento dos v.ínculos entre suas tabelas definindo as
chaves e o relaciona,nento (veja a Figura 11.4). Quando o banco de dados tiver informações dos
relacionamentos existentes e1n seu sistema, ele poderá garantir sua integridade impedindo a ex-
clusão de utn registro se esse tiver correspondências en1 outras tabelas. No sisten1a específico
que criamos, ter os relacionamentos no banco de dados impediria (o banco de dados retornaria
uin erro) que o usuário exclu.ísse un1 registro da tabela Artist se a tabela Disc possuísse algum re-
gistro com a identificação desse a11ista.
Introdução aos Bancos de Dados 301
FIGURA 11.4
Ern seu progran1a de
banco de dados, sendo
ele o Access ou o SQL
Server, você JJode
criar relaciona,nentos
para que esses possarn
ter sua integridade
garantida. .At-til.tl-J.:imc
NtistFirs~
N tiStLGSttJ.itr.e
'
Chaves Calculadas
Corno alternativa às chaves geradas por bancos de dados, você pode usar as instruções SQL para
determinar a próxima identificação na seqüência antes de fazer a inserção necessária. lsso envol-
ve o emprego de um tipo especial de operador SQL chamado operador de agregação, que recu-
pera un1 valor calculado com base em todos os campos encontrados por urna cláusula SELECT. Há
vários desses operadores de agregação, mas uti lizare1nos o chan,ado de MAX, que retorna para urn
campo o valor mais alto extraído entre todos os registros selecionados.
Para detenninar a próxi1na identificação, você poderia executar esta instrução (usando a tabela
Artist co1no exe1nplo):
SELECT MAX(ArtistID) FROM Artist
Essa instrução retornaria apenas o registro de um campo contendo o valor mais alto relativo às
identificações existentes atuahnente na tabela. Adicione um a esse valor, e você terá a próxirna
identificação, que então será usada e1n un1a inserção.
Essa abordage1n, embora válida em algumas circunstâncias, apresenta dois proble1nas principais.
O pri1neiro oco1Te porque ,nais de u1n programa poderia estar usando ao 1nesmo te1npo esse ban-
co de dados - dois ou mais usuários poderiam estar adicionando artistas no n1esmo ,nomento.
E,n uma situação dessas, seria possível que alguns usuários executassem sua primeira instrução
SELECT antes que o usuário anterior tivesse executado sua instrução INSERT, portanto eles teriam
obtido o mesmo valor para a identificação.
Esse proble,na pode ser evitado co,n o uso de transações, outro dos conceitos de bancos de dados
que não abordarei nesta lição.
O segundo problema não pode ser evitado com tanta facilidade. Ele ocorre quando u1n ou mais
registros do final da tabela (as identificações 1nais altas) são excluídos. Qualquer registro novo
pri1ueiro selecionará MAX (Arti stID) e obterá os valores de identificação anterior1nente atribuí-
dos aos registros excluídos. Etn u1u sistema en1 que se pretende que os valores das identificações
seja1n exclusivos, ter registros diferentes compartilhando a 1nes1na identificação e1n momentos
distintos não é 1. nuito aconselhável.
aleatório de 128 bits gerado pelo banco de dados ou pelo sistema operacional. O GUIO é aleató-
rio o bastante para que seja usado e1n um cenário de bancos de dados distribuídos.
Gerenciador de Chaves
O últüno esquema para a criação de identificações que discutirei é adequado para siste1nas que
não são distribuídos (veja a seção anterior sobre os GUIDs), mas para os quais você precisará
realmente obter a chave no rnomento exato da inserção do registro. (lsso torna problemática t11na
chave gerada pelo banco de dados.) Esse 1nétodo, charnado siste1na gerenciador de chaves, usa
uma tabela adicional em seu banco de dados para annazenar os valores atualmente n1ais altos das
identificações de todas as outras tabelas (veja a Figura 11 .5).
Para obter novas identificações usando esse método, você terá de procurar na tabela do gerencia-
dor de chaves o valor da identificação atual, acrescentar urna unidade a ele, inserir seu novo re-
gistro e atualizar essa tabela co1n o valor da identificação incre1nentado. As quatro ações
separadas significarn que esse método cornpartilha o 1nes1no problerna da existência de vários
usuários encontrado na chave calculada. O problema de reutilizar as chaves devido às exclusões
é evitado porque o valor da identifjcação annazenado no gerenciador de chaves nunca é decres-
cido, e as identificações ouoca são reuti Iizadas.
problen1a que pode encontrar será se tiver uma versão diferente daquela em que o exe,nplo foi
criado. Se esse for o caso, por padrão, só poderá visualizar e não editar as diversas tabelas e ou-
tros objetos de seu banco de dados por tneio do Access. Se quiser, utilize as ferramentas de con-
versão de banco de dados do Access a fim de atualizar o banco de dados para a 1nes1na versão
que você estiver executando.
LISTAGEM 11 .1 TextDB. vb
1 'Substitua a string de conexão pelo valor apropriado
2 'à sua configuração (explicado nesta lição)
3 'e, em seguida, compile com:
4 ' ''vbc /r:System.DLL /r:System.Data.DLL TestDB.vb''
5 Imports System
6 Imports System.Data
7 Module TestDB
8 Sub Main()
9 Dim sConnectionString, sSQL As String
10 sConnectionString = <consulte abaixo>
11
12 sSQL = ''SELECT CDTitle FROM Di sc ORDER BY ArtistID Ase''
13
14 Dim connCD As New OleDb.OleDbConnection(sConnectionString)
15 Dim cmdCD As New OleDb.OleDbCommand(sSQL, connCD)
16 Dim drCD As OleDb.OleDbDataReader
17 connCD .Open()
18 drCD = cmdCD.ExecuteReader()
19 Do While drCD.Read()
20 Console.Writeline(drCD.Item(''CDTitle'' ))
21 Loop
22
23 drCD.Close()
24 connCD.Close()
25 Console.Readline()
26 End Sub
27 End Module
Se você usar o banco de dados do Access (CD.mdb), sua string de conexão incluirá o catninho
completo para esse arquivo como descrito a seguir:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\chapterll\cd.mdb
Certifique-se de alterar essa string de conexão a fim de indicar o ca1ninho apropriado para
CD.mdb em sua 1náquina.
Se, por outro lado, você usar o SQL Server ou o MSDE, e já tiver executado AttachDB. vbs com
sucesso, então, a string a seguir deve funcionar em sua máquina:
Provider=SQLOLEDB .l;User ID=sa;Initial Catalog=CD;Data Source=(local)
Introdução aos Bancos de Dados
Esta string de conexão SQL (que é dividida em duas linhas neste livro, mas deve ter apenas uma
linha e1n seu código) pressupõe u1na senha em branco para a conta sa, podendo ser alterada para
que especifique uma senl1a se necessário:
Provider=SQLOLEDB.l;User ID=sa;Password=peanutbutter;
'- lnitial Catalog=CD;Data Source=(local)
Insira a string de conexão apropriada na Listagem 11.1. Observe que esse código está incluído,
con10 testdb. vb, na pasta Dayl I que você desca1Tegou anteriormente do site do livro na Web.
Agora con1pile o código como foi orientado nos co1nentários do início do arquivo, e você deverá
ver um arquivo . exe que poderá usar para testar sua conexão con1 o banco de dados. Se tudo der
certo, você deve obter o seguinte resultado:
Com esse resultado, você terá criado um aplicativo que estabelece com sucesso u1na conexão
co1n o banco de dados e estará pronto para passar para tópicos 1nais avançados sobre bancos de
dados.
Resumo
Esta lição apresentou un1a introdução aos bancos de dados e sua função no desenvolvi1nento de
aplicativos .NET. Ao dar continuidade na criação de sistemas no Visual Basic .NET, você ern
geral irá usar u1n banco de dados, independentemente do segmento empresarial para o qual de-
senvolver seus progra1nas. Com freqüência escreverá programas que empregarão um banco de
dados já existente.
1308 Dia 11
'
As vezes, seu trabalho exigirá que você mesmo projete e implemente esse banco de dados, uma
tarefa que pode ser betn complexa de realizar corretamente. Na lição seguinte, continuare1nos a
traball1ar co1n bancos de dados, passando da teoria diretamente para a prática escrevendo progra-
mas que usa1n as classes System.Data.
P&R
P Nesta lição, você mencionou três tipos diferentes de bancos de dados, mas os bancos
de dados da Microsoft são o único tipo com o qual posso me conectar?
R Absoluta1nente não. Qualquer banco de dados no qual você tenha um driver do OLE DB
(ou do ODBC) estará disponível para conexão com as classes System.Data.OleDB. Se
você não tiver um provedor do OLE DB, mas possuir u1n driver do ODBC, também po-
derá se conectar passando por u1na camada adicional e usando o provedor do OLE DB
para as conexões do ODBC.
Para obter mais informações sobre o OLE .D.B, acesse http://www.mi crosoft. com/data.
P No banco de dados dos CDs, você removeu as informações sobre o artista da tabela
Disc, mas, em seguida, teve de retorná-las em quase todas as saídas usando uma as-
sociação em sua instrução SQL. Não seria melhor apenas manter uma cópia das in-
formações sobre o artista em cada registro de Disc?
R O arn1azenamento de dados ern mais de um local significa que, para evitar inconsistências,
você terá de se certificar de atualizar todos os locais possíveis ao mesmo tetnpo. Os bene-
fícios conseguidos evitando a associação em suas consultas serão perdidos pelo trabalho
adicional necessário sempre que atualizar os registros na tabela Disc ou na Artist.
P A XML foi projetada para armazenar dados. Ela substitui os bancos de dados?
R A XML é urna ,naneira de armazenar dados e, embora seja ce1tamente tnna substituta
para alguns sistemas de bancos de dados não relacionais, ela não substitui sistemas de
bancos de dados relacionais co1no o SQL Server. A XlvlL será usada com 1nais freqüên-
cia como uma 1naneira de intercam biar dados entre siste,nas e representará a saída gerada
por seus siste1nas tradicionais de banco de dados.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e co1neçar a pensar em como colocar seu conheci1nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Introdução aos Bancos de Dados 309
Teste
1. Em uma tabela de banco de dados, u1n ou mais can1pos são usados para identificar de 1na-
neira exclusiva cada registro. Corno esses campos, ou carnpo, são chamados?
2. Dadas as duas tabelas 1nostradas na Figura 11.6, qual seria o resultado da instrução SQL
que vemos aqui?
SELECT Make.MakeName, Model.ModelName
FROM Make LEFT OUTER JOIN Model ON Make.MakeIO = Model.Make
3. Exa1ninando novamente as tabelas da Figura 11.6, qual seria a saída desta instrução
SQL?
SELECT Make.MakeName, Model.ModelName
FROM Make INNER JOIN Model ON Make .Ma keIO = Model .Make
Exercícios
1. Se você quisesse expandir sua biblioteca de registro de CDs para que ar1nazenasse a cole-
ção de CDs de mais de Lun usuário, como alteraria seu banco de dados? Considere que pre-
cisaria registrar informações sobre os próprios usuários e sobre a propriedade dos discos.
2. Dado o conjunto de informações contido em Orders. txt, como você projetaria u1n banco
de dados para annazenar as 1nesmas infor1nações?
SEMANA 2
DIA
de acesso a dados do Visual Basic evoluiu con1 o passar do tempo, passando por 1nuitas versões
diferentes antes que a plataforma .NET entrasse e1n cena.
O ADO e o OLEDB
Não obtería1nos grandes vantagens percorrendo a história completa que envolve o Visual Basic
e o acesso a dados, 1nas vale a pena fazer um exa1ne resumido da tecnologia mais recente de
acesso a dados (anterior à platafo1ma .NET). Antes da existência dessa platafonna era extensiva-
1nente usada pelos progra1nadores do Visual Basic 6.0 uma biblioteca de acesso a dados chama-
da ActiveX Data Objects (ADO), considerada o principal 1neio 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 biblioteca do COM que encapsulava a funcionalidade da tecnologia
real de acesso a dados, o OLE DB, e que tinha sido projetada para ser u1na maneira fácil de traba-
lhar con1 essa nova tecnologia.
Para evitar a necessidade de se criar u1n código para cada banco de dados co1n o qual você pudes-
se se deparar, o ADO/OLEDB usava tnna abordagem semelhante ao ODBC (http://1~ww.mi-
crosoft.com/data/odbc), fornecendo tuna única interface de programação independente do
banco de dados e, ern seguida, usando drivers específicos de banco de dados para trabalhar cotn
cada u1n deles. Esse mesino conceito já tinha se tornado popular e quase todo siste1na de banco
de dados possuía u1n driver de ODBC disponível. O ADO ta1nbén1 requer drivers para funcionar,
ernbora eles seja1n conhecidos como provedores de OLEDB, e muitos dos bancos de dados mais
conhecidos disponibiliza1n o(s) provedor(es) necessário(s). Mas já que o ADO é 1nais novo do
que o ODBC, não existe1n tantos drivers desse tipo. No entanto, possuir apenas o driver do
ODBC já é suficiente, já que o ADO vem co1n um provedor de OLEDB para os drivers de
ODBC. Por meio da co1nbinação dos provedores de OLEDB disponíveis con1 todos os drivers
de ODBC fornecidos, o ADO poderia ser usado para estabelecer uma conexão co1n quase todos
os bancos de dados existentes.
A arquitetura integral do ADO fo i estabelecida no fato de que o código que você escrevesse só
trabalharia corno ADO, e não co1n o sistema de banco de dados, porém, o A.DO usaria utn prove-
dor de OLEDB para converter e transferir suas solicitações para o sistetna de banco de dados
(veja a Figura 12.1). O ADO expunha vários objetos-chave que representavam a conexão com o
banco de dados, os comandos relacionados ao banco de dados e os resultados obtidos nas consul-
tas - todos projetados para ser fáceis de usar como pa1te de utn programa do Visual Basic.
ADO.NET
O ADO.NET é a tecnologia de acesso a dados que faz parte do .NET Framev.1ork. Ele será sua
1naneira de obter dados quando progra1nar no Visual Basic.NET e representa o estágio posterior
ao ADO/OLEDB. A tecnologia OLEDB subjacente ainda permanece e1n seu lugar, e os prove-
dores de OLE.DB ainda são o principal 1nétodo pelo qual o ADO.NET se comunica corn sistemas
específicos de banco de dados, mas acima dessa camada há n1uito pouca se1nelhança co1n os ob-
jetos anteriores do A.DO.
Acessando Dados com a Plataforma .NET 313
FIGURA 12.1
Aplicativos do Visual Basic
O ADO foi projetado
co,110 1111,a ca111ada ~ ~ ~
aci111a do OLEDB,
que usa tanto drivers
de OLEDB quanto de
ODBCparase ~
,, 7 ~,,7 '\.17
conec1ar co,n os
bancos de dados. ActiveX Data Objects (ADO)
0- I Oracle I I
Sybase I
- -
7 7 ~ 7
"' "'
Dados Dados Dados
~
Na plataforma .NET, o acesso a banco de dados é manipulado pelas classes existentes no espaço
de no,ne System . Data. Esse espaço de non1e é dividido e1n duas áreas distintas: o conjunto de
classes System.Data.OleDB e as classes System.Data.SQLCl ient. O primeiro conjunto,
System. Data .01 eDB, foi projetado para pennitir que você se conecte a qualquer banco de dados
para o qual possua u1n provedor de OLEDB ou (por 1neio do provedor de OLEDB para o ODBC)
um driver de ODBC e é tecnicamente o equivalente à ca1nada de acesso a dados do ADO origi-
nal. A segunda área, System . Data . SQLCl i ent, foi projetada para trabalhar apenas com o Micro-
soft SQL Server, n1as fornece u1n conjunto de recursos se1nelhante às classes OLEDB. A
arquitetura geral das classes de acesso da platafonna .NET é 1nostrada na. Figura 12.2, ilustrando
os dois sistemas principais.
Nos exe,nplos desta lição, você aprenderá a trabalhar tanto co1n bancos de dados OLEDB quan-
to com siste1nas do SQL Server ou do MSDE. Mes1no se só tiver o SQL Server, ainda poderá tes-
tar os dois n1étodos porque é possível se conectar co1n o SQL Server por meio de seu provedor de
OLEDB ou com as novas classes da plataforma .NET. Além das classes SQLCl i ent e OLEDB para
acessar os bancos de dados, System. Data també1n inclui várias outras classes projetadas para tra-
balhar com os dados independentetnente de sua fonte específica.. Tambétn exa1ninare1nos essas
outras classes, pdncipalmente DataSet, co.mo parte dos exe,nplos desta lição.
314 Dia 12
System.Data
FIGURA 12.2
(contém objetos para
OADO.NETé manipulação de
dividido e,n duas dados genéricos)
seções principais,
OLEDB e SQL. que
per111ite111 que você se
conecte a urna a,npla System.Data.SQLClient
varieclade de .fontes de (contém objetos específicos
dados. para conexões com o
Microsoft SQL Server)
System.Data.OLEDB
(contém objetos específicos
t para conexões por meio de
1
1 provedores de OLEDB)
1
1
1
1 System.Data.ODBC*
: (contém objetos específicos
----------· . .
para conexoes por meio
de drivers de OLEDB)
Apenas por ter o ADO instalado em seu computador- e ele está incluído con10 parte da instala-
ção do .NET Framework, po1tanto você o tem -, u1n tipo especial de arquivo, o Microsoft Data
Link, foi registrado. Os arquivos desse tipo foram projetados para conter informações sobre a
conexão co,n o banco de dados e se você criar u,n vazio, então, tuna interface gráfica com o
usuário adequada será fornecida para a geração e edição de todos os detalhes da conexão. Depois
de ter trabalhado co,n essa inte1face e selecionado as opções apropriadas para seu banco de
dados, o arquivo terá a string de conexão que poderá ser copiada e usada e1n seu aplicativo do Vi-
sual Basic .NET. Siga estas etapas para e1npregar esse a1tifício:
J. Crie um arquivo Microsoft Data Link vazio por 1neio de um novo arquivo de texto (dê
u,n clique co,n o botão direito do 1nouse na área de trabalho e selecione New, Text Docu-
1nent no 1nenu que aparecerá) e renomeie-o com um título que possua uma extensão . ud l
(New. udl seria perfeito). [sso será difícil de fazer se as extensões de arquivo não estive-
rem visíveis para que possam ser ativadas pelo painel de controle Folder Options. Você
deve ficar atento para o ícone de alteração do arquivo depois que tiver n1udado sua exten-
são, indicando seu novo tipo de arquivo.
2. Dê um clique duplo no arquivo novo, e uma caixa de diálogo aparecerá com um conjunto
de quatro guias para a criação e edição das informações sobre a conexão co1n seu banco
de dados.
3. Na caixa de diálogo que acabou de ser abe1ta (veja a Figura 12.3), comece com a pritnei-
ra guia, Provider, e configure as inforn1ações 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 OLEDB Provider for SQL Server.
FIGURA 12.3
A caixa de diálogo de
ou; o&~!l !•
propriedades do Data M~tlot$)8(U: Dt ~OI
M~~oi~ouoe~
link per111ile que você M'61iC41,abt~eb0$0U: 0 8 ~
MC101oltf$.t.M 1 l OU: 08 PIOY'dtt
Mc,ocolt l.t 3 51 OLE Ot Pio-ó:,
configure grajica111ente Miei«oltl« UIOll 081"1~
Meioioll-CU oe Pro.der roio.-.~s.r,cin
Mit11m:à;CU DEI Pr,:,,,dtir 10,0TS Pld.qt
os detalhes de sua Mc:,ocMCU oe PI~ lorf,,â......,$-~
1\.1.i~
MIC!ó10llCU DEI P I ~ IOl!rl~
conexão. Mc,oiotou: 06 PI~ IOtMien:ilc:flSem
M Ct040II (U 08 Pr,.,...1c,()0.9(:01h"f1t
Mc.o.o11a cu oe PI~ 10- aJ.P Set~1
M(~oll tt.E 08 1\0',m laiOao~ 80
GiilMP+•cM54M M
Mci,xoll (U 08 PIO'l"dcli IOI ~ Seod'I
Ml(J,xo!!aCt.C 08 Plowder 1or$OL ~ .:J
4. Na guia Connection, você verá opções diferentes dependendo de qual dos dois provedores
disponíveis selecionou na etapa anterior. Para o Access, só será preciso inserir o ca1n inho
para o arquivo CD . mdb ( veja a Figura J2.4).
316 Dia 12
inclue,11 o ca,ninho
para o arquivo do
banco de dados.
T"" Co,neci;on I
OK C.-1
Para o SQL, você precisa infonnar o nome do servidor ou (l ocal) se ele estiver no ,nesmo
computador, a identificação e a senha do usuário e conl que banco de dados específico (CD
neste caso) quer se conectar. A Figura 12.5 n1ostra a guia Connection configurada para uni
banco de dados de um servidor SQL local que usa 'sa' con10 sua identificação de usuário e
uma senha que foi inserida ,nas não pode ser lida.
FIGURA 12.5
1
Pio,~« COMool•n ~dv.,..,<d ( AI )
Para o SQL Server, $peciíy ft.e. lo1QIMr'9 to conned. lo SQLSerffl 0014'.'
os detalhes da 1, Scltd OI crtcr 4 $Cl'l"él ~
_J
OK
5. Embora haja 1nais duas guias, você concluiu a digitação de infonnações. Dê u,n clique
no botão Test Connection para ver se as infor1nações que inseriu estão corretas. Se o teste
for bem-sucedido, então, feche a caixa de diálogo dando u1n clique em OK. Agora, use o
Bloco de notas ou algum outro editor de textos para abrir o arquivo . udl de modo que
possa examinar seu conteúdo. O conteúdo exato dependerá das infonnações que foram
inseridas na caixa de diálogo, ,nas deve1nos ver tnn texto como o descrito a seguir:
Acessando Dados com a Plataforma .NET 317
[oledb]
; Everything after this line is an OLE DB in itstring
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\CD.mdb;
Persist Security Info=False
A últi.ma linha desse arquivo, que começa eo1 Provi der, é uma string de co.nexão do OLEDB, que é o
que você precisará usar en1 seu prograrna do Visual Basic .NET. Se estiver utilizando um banco de
dados do Access, então, a string anterior deverá ser a mesrna exceto pelo caminho. O conteúdo de um
arquivo . udl configurado para o SQL Server é mostrado no exe1nplo a seguir, 1nas pode ser preciso
alterar ao valores da identificação do usuário (use ri d), da senha (password) e da fonte de dados (Data
Source) para que esta string funcione em seu sisterna:
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.l;Password=password;
Persist Security Info=True;User ID=sa;
Initial Catalog=CD;Data Source=(local)
Observe que a última linha é na verdade uma longa linha de texto que foi dividida em várias ou-
tras para que a clareza fosse 1nantida.
Depois que você tiver sua string de conexão, e que souber que ela está correta porque o botão
Test Connection executou un1 teste be,n-sucedido com base nessas infor1nações, poderá co1ne-
çar a escrever algu,n código para seu banco de dados.
Para gerar uma conexão, você precisa criar u111a nova instância do objeto System.Data.OleDB
. OLEDBConnecti on ou de System. Data. Sql Cl i ent. SQLConnect i on. Se estiver se conectando com
o MSDE ou com o SQL Server, então, a string de conexão precisará ser urn pouco alterada antes
que possan1os usá-la com o objeto SQLConnect i on. A stri11g é utilizada com o OleDB e, portanto,
con1 qualquer tipo de banco de dados, o que significa que ela apresenta u1na seção Provider. A
especificação de u1n provedor não é necessária, e deve ser removida quando houver urna cone-
xão através das classes SQL.
A Listagem 12. l cria tuna nova instância de OLEDBConnect i on e fornece a string de conexão no
construtor, produzindo un1 objeto Connect i on que já está configurado con1 todas as informações
que você precisa para se con1unicar com seu banco de dados.
Nesse 1no1nento, você criou o objeto de conexão e o carregou com os detalhes de seu sistema,
mas nenhun1a comunicação real ocorreu co1n o servidor do banco de dados. Para estabelecer o
vínculo cotn o banco de dados, é preciso chamar o método Open do objeto 01 eDBConnecti on:
objConn . Open()
Essa linha e1n particular é a primeira que causará urna interação com seu banco de dados, e você
deve inseri-la ern u1na estrutura de tratamento de erros. A Listagern 12.2 mostra urn exe1nplo
completo do estabelecimento de u1na conexão con1 u1n tratamento simples de erros.
Para obter mais infonnações sobre o trata1nento de erros, veja o Dia 6, "O Que Fazer Quando
Programas Bons Apresentarn Proble1nas e para Se Certificar de Que Isso Não Aconteça". Se
você quiser testar o código por sua própria conta, apenas crie um novo aplicativo do console
usando o Visual Basic .NET e insira esse código em Modul el. vb. Lernbre-se de substituir o valor
de sConnect i on na Listagem 12.2 pela string que criou anteriormente nesta lição. Para ficar ain-
da 1nais divertido, tente alterar alguns valores da string de conexão, como a senha, para fazer
Acessando Dados com a Plataforma .NET 319
com que a tentativa de conexão falhe. Seu trata1nento de en·os deve produzir uma linha de saída
adequada 1nostrando o que houve de errado e1n seu progra1na.
Para essa tarefa específica, abri r uma conexão, as classes SQLCl i ent poderão ser usadas com ape-
nas algumas pequenas alterações. Prhneiro, reinova a seção Provider de sua string de conexão e,
ern seguida, altere sua declaração de obj Conn para que se refira ao objeto System. Data. SQLCl i -
ent. SQLConnect i on e1n vez da classe OLEDB. A Listagem 12.3 1nostra o código co1npleto, que
produz essencialmente o mesmo resultado.
LISTAGEM 12.3
- Essenc ial Quando Se Li da com Bancos de
O Tratamento de Erros E
Dados
1 Imports System
2 Module Modulel
3 Private Const sConnection As String
4 sConnection = ''Password=password;'' &_
5 11
Pers i st Securi ty Info=True; 11 &
6 ''User ID=sa;'' &
7 ''Initial Catalog=CD;'' &
8 ''Data Source=( l oca l )''
9 Sub Main()
10 Dim objConn As New Data.SqlClient.SqlConnection(sConnection)
11 Try
12 objConn.Open()
13 Catch myException As Exception
14 Conso 1e. \~ri tel i ne (myExcept i on. Mes sage)
15 End Try
16 Console.Readl i ne()
17 End Sub
18 End Module
Estabelecer un1a conexão será u1na etapa inicial co1nun1, ,nas sozinha ela não é particularn,ente
útil; você precisará de alguns outros objetos de banco de dados para começar a trabalhar cornos
dados.
e nossa conexão, então, tudo que precisamos é criar uma nova instância do tipo apropriado de
objeto de co,nando. Temos a opção de passar a instrução SQL e o objeto de conexão para o cons-
trutor quando criarn1os o objeto (veja a Listagem 12.4) ou configurá-los depois do fato (veja a
Listage1n 12.5).
Recuperando Dados
Se você quiser executar u1naconsulta SQL que retorne linhas de dados, co1no SELECT, então, terá
de usar o 1nétodo ExecuteReader. Esse 111étodo existe nas duas variações dos objetos leitores e re-
torna 01 eDBDa taReader ou SQLDataReader, o que for mais apropriado. Depois que o objeto leitor
tiver sido retornado, poderá ser etnpregado na execução de um laço pelos dados para recuperar
os valores de alguns ou todos os ca1npos e linhas no resultado de sua consulta. O objeto leitor
possui 1nuitos n1étodos e propriedades, mas os 1ne1nbros-chave são Read ( ) e os 1nétodos de re-
cuperação de conjuntos de dados GetS t ri ng, GetOoubl e, GetDa te Ti me além de outros, todos utili-
zando um nún1ero ordinal para indicar de que campo devem retornar seus dados.
O 1nétodo Read avança o leitor de dados para o próxi1no registro e retorna um valor booleano in-
dicando se algu1na outra linha está disponível. Depois que você estiver e,n u1n registro (depois
que tiver chamado Read ( )), poderá usar os vários 1nétodos Get<t ipo de dados> para recuperar
os valores de crunpos individuais. O código 1nostrado na Listage1n 12.6 foi expandido para in-
cluir a execução de uma nova consulta SELECT e de um laço para percorrer e exibir os resultados
da consulta no console.
Os leitores de dados são maneiras rápidas, apenas de leitura ordenada, de recuperar dados, mas
ta1nbém são conjuntos de dados totah11ente conectados. Isso significa que quando você criar um
leitor de dados e executar u.rn laço e1n suas Linhas, cada linha será recuperada di.reta,nente do
banco de dados. Na verdade, enquanto estiver trabalhando co1n um leitor de dados, sua conexão
con1 o banco de dados estará ocupada e não poderá ser usada para qualquer outro fi1n. Esse não é
um grande problema e faz parte da razão principal pela qual esses leitores são tão rápidos (nada é
annazenado na 1ne1nória do cliente), n1as às vezes é preciso obter dados que proporcione1n urn
Acessando Dados com a Plataforma .NET 323
pouco n1ais de controle. Con10 alternativa aos leitores de dados, um n1odelo desconectado de tra-
balhar com os dados ta1nbém está disponível por meio dos DataSets.
objeto de conexão, exatamente co1110 nos exemplos anteriores. Utna nova instância da classe apro-
priada do adaptador de dados (OLEDB ou SQL) deve ser gerada a seguir. Use a instrução SQL
que quiser, ou um objeto de comando que se refira à instrução SQL correta, e o objeto de cone-
xão no construtor do adaptador de dados, e tudo estará configurado.
Dim sSQL As String
sSQL = "SELECT Artist.ArtistID, "&_
''Artist.ArtistName,Disc.CDTitle & li
&
-
''FROM Artist INNER JOIN Disc ON li
''Artist.ArtistID = Disc.ArtistID;''
Dim objConn As New OleDb . OleDbConnection(sConnection)
Dim objDataAdapter As New OleDb.OleDbDataAdapter(sSQL, objConn)
Já que você quer preencher utn dataset com o resultado de sua consulta, utn objeto Da taSet tam-
bém deve ser criado. Esta Iinha de código gera t11na instân.c ia e fornece u1n nome para o Da taSet
cotno parte do construtor:
Dim objDS As New DataSet(''CDs'')
O 1nétodo Fi 11 de Da taAdapter pode ser usado para carregar os dados no Da taSet, ,nas para que
isso funcione, você deve conseguir abrir o objeto de conexão:
objConn.Open()
objDataAdapter.Fill(objDS, ''Disc'')
Depois que o código anterior for executado, tuna tabela terá sido criada dentro do DataSet cotn o
no1ne "Oi se" e preenchida co1n os resultados de sua consulta SQL. Após a criação dessa tabela,
você poderá trabalhar co1n seu conteúdo por 1neio do conjunto Tabl es de DataSet:
Console. Writeline(''{O} Rows '', objDS.Tables(''Disc '').Rows . Count)
Mais detalhes
,
sobre o acesso aos dados ar1nazenados em um DataSet serão fornecidos ainda nes-
ta lição. E interessante ressaltar que já que o DataSet é un1 objeto desconectado, você poderia ter
encerrado completa1nente a conexão con1 seu banco de dados antes de trabalhar cotn o conteúdo
de DataSet:
objDataAdapter.Fi l l(objDS, ''Disc'')
objConn .Close()
Console. Writeline(''{O} Rows'', objDS . Tables(''Di sc'').Rows.Count)
O código completo rnostrado na Listagem 12.7, corno tratamento de erros apropriado, usa um
01 eDBAdapter para carregar o resultado de uma consulta SELECT em um novo objeto DataSet.
Co1no e,n todos os exemplos de1nonstrados até agora nesta lição, você pode executar esse códi-
go por sua própria conta colocando-o em um ,nódulo de tun novo aplicativo do console.
326 Dia 12
For i = O To objTable.Rows.Count - 1
obj Row = objTable.Rows(i)
Console. Write l ine(objRow . ltem( ''CDTitle''))
Next
Qualquer u1n dos 1nétodos produz o 1nes1no resultado nesse caso. Cada registro da tabela é re-
presentado por u1n objeto DataRow. :Esse objeto concederá acesso a seus ca,npos por rneio da proprie-
dade Item (na qual você pode fornecer o índice ou o no1ne do campo que deseja recuperar), e
ta1nbérn fornece várias propriedades úteis, co1no RowState, que retorna o estado de edição atual
do registro.
O conj unto Col umns conté1n detalhes dos campos de DataTabl e, cada u1n representado como u,n
objeto Da taco 1umn. Por meio desse conjunto, e dos objetos contidos nele, você obterá todas as in-
fonnações sobre a estrutura de sua tabela. Con10 no conjunto Rows anterior, é possível executar
u1n laço através dos campos da tabela usando For Each ou For:
Dim obj Column As DataColumn
For Each objColumn ln objTable.Columns
Acessando Dados com a Plataforma .NET 327
Você pode testar esse procedi1nento alterando o exe,nplo para carregar un1 DataSet que inclua
uma chamada a esse novo procedi1nento, co,no 1nostro na Listagem 12.9.
O objeto DataRow é irnportante; alé1n de ser o 1neio pelo qual você acessa os valores do ca1npo
(como foi feito na Listagem 12.8), ele também é usado quando se edita, exclui e adiciona regis-
tros a um objeto OataTabl e. Na seção a seguir, aprendere1nos a alterar o conteúdo de seu OataSet
usando tanto o objeto OataTable quanto OataRow.
Acessando Dados com a Plataforma .NET 329
Adicionando Registros
Depois de criar uma conexão, urn adaptador de dados e carregar alguns dados ern seu Da taSet,
você poderá acessar diretamente um objeto DataTable:
objDataAdapter. Fill(objDS, ''Disc'')
Dim objTable As DataTable
objTable = objDS.Tables(''Disc'')
Depois que tiver esse objeto DataTab 1e, poderá acessar seu conteúdo por 1neio do conjunto Rows,
que retornará um objeto DataRowCollection:
Dim drRows As DataRowCollection
drRows = objTable.Rows
Esse objeto representa todos os registros da tabela co1no um conjunto de objetos DataRow. O pró-
prio conjunto fornece un1 método, Add, para criar novos registros. Esse método pode ser cha1na-
do de u1na entre duas 1naneiras: co1n u,n array de valores para o crunpo do novo registro ou co,n
urn único objeto DataRow representando as informações a adicionar. O segundo 1nétodo, que é
chamado com un1 DataRow, requer un1a maneira de obter um novo objeto de linha que possua o
mesmo esquema (os 1nes1nos campos, com os mes1nos tipos de dados e tamanhos) do resto das
linhas da tabela, e o próprio objeto Da ta Tab l e fornece esse recurso por meio do método NewRow.
Você verá u1n exemplo dos dois estilos nas Listagens 12.1Oe 12.11 . A Listagem 12.1Omostra o
uso de um array, que nos forçará a conhecer a orde1n dos ca1npos e resultados e1n u1n código que
é rnuito 1nenos claro que o segundo método. A Listagen1 12.11 rnostra o segundo rnétodo - e1n-
pregando um objeto DataRow.
1 330 Dia 12
LISTAGEM 12.11 Fornecendo um Objeto DataRow como Parâmetro para o Método Add
Nos dois casos, os dados fora1n adicionados à tabela, 1nas isso não significa que serão retornados
ao banco de dados. As alterações efetuadas no banco de dados do servidor depois do 1no1nento
em que os dados foram carregados nesse DataSet poderia1n impedir que os registros adicionados
fosse1n válidos (você poderia especificar um artista que tivesse sido excluído da tabela Artist,
por exemplo), 111as você não veria esse tipo de erro até o estágio da atualização. Já que está traba-
lhando em um estado desconectado, ou off-line, quando usa u1n DataSet, qualquer problema re-
lacionado ao servidor não será descoberto até que haja a tentativa de atualizá-lo.
Acessando Dados com a Plataforma .NET 331
Editando Registros
Editar registros é sen1elhante a adicionar; trabalha-se através dos objetos DataRow que represen-
ta1n os registros da tabela. No caso da edição, no entanto, queren1os trabalhar con1 um objeto Da-
taRow existente, em vez de criar um novo como fizemos na seção anterior, "Adicionando
Registros". Como nos exe1nplos anteriores, precisamos prilneiro criar uma conexão, u1n co1nan-
do, um adaptador de dados, e então carregar os dados ern urn objeto DataSet para criar um obje-
to DataTable. Depois que tivennos esse DataTabl e, teremos acesso a seu objeto
Da taRowCo 11 ect i on, e estarernos prontos para corneçar a editar os registros.
objDataAdapter.Fil l (objDS, ''Disc'')
Dim objTab le As DataTable
objTable = objDS.Tables(''Disc'')
Dim drRows As DataRowCollection
Dim objRow As DataRow
drRows = objTable.Rows
objRow = drRows(S)
Cada objeto DataRow possui vários métodos que afetam diretamente a edição: Begi nEdi t,
EndEdi te Cancel Edi t. Begi nEdi te EndEdi t colocam o objeto DataRow dentro ou torado modo de
edição, que é un1 estado especial no qual a linha contérn as inforrnações sobre a edição em pro-
gresso e, portanto, eventos de alteração não serão acionados para cada modificação de um cam-
po. Você aprenderá rnais sobre os eventos de alteração ainda nesta lição, na seção "Vinculação
de Dados". Begi nEdi t é opcional, mas indica sua intenção de maneira clara. E' possível acessar e
alterar os valores por n1eio da propriedade Item usando o no1ne ou a posição do campo:
objRow.BeginEdit()
objRow(''au_lname'') = ''Exciting''
objRow.EndEdit()
Quando EndEdi t for chatnado, se Begi nEdi t tiver sido usado, as alterações da linha serão confir-
madas dentro do objeto DataTab l e, momento en1 que qualquer erro que tenha ocorrido durante a
edição será lançado pelo ADO.N~ET. Sen1 a utilização de Begi nEdi t e EndEdi t, todos os erros
ocorrerão no instante ern que cada ca1npo for editado.
Você aprenderá a usar u,n DataSet contendo campos alterados, registros novos e até excluídos, e
atualizar o banco de dados de origem posteriormente nesta lição.
Excluindo Registros
A exclusão de utn registro em urna tabela de dados é efetuada pelo método De l ete do objeto Da-
taRow e1n questão. lsso é simples de faze r, ,nas há um proble1na com o qual se preocupar. O 1né-
todo De l ete marca a linha como excluída, mas, na verdade, não reinove o objeto DataRow de
Da taRowCo 11 ect i on. Isso é crítico porque permite que o objeto não seja excluído e fornece as in-
formações necessárias para atualizar o banco de dados de origem excluindo esse registro quando
ele estiver novamente na tabela original. Há outros métodos, Remove e RemoveAt, da classe Data-
1 332 Dia 12
RowCollection, que realmente removem o objeto DataRow específico do conjunto. Usar Remove
ou RemoveAt será adequado quando você e1npregar u1n objeto DataTab lesem u1n banco de dados
de back-end, 1nas se a intenção for usar todas as alterações feitas 110 objeto DataSet para atualizar
a(s) tabela(s) de origem, será preciso utilizar o método Oelete.
A Listagem 12. J 2 fornece o exe,nplo de un1 laço e,n tuna tabela, que localiza certas linhas espe-
cíficas e, en1 seguida, as exclui. Nenhuma dessas exclusões afetará os dados da fonte, o SQL Ser-
ver, por exemplo, até que você atualize o servidor.
LISTAGEM 12.12 O Método Delete Marca uma Linha como Excluída (continuação)
36 drRows = objTable. Rows
37
38 DisplayTable(objTable)
39
40 Console.Write("Se pretende excluir, pressione return para iniciar!")
41 Console.Readline()
42
43 For Each objCurrentRow ln drRows
44 If CType(objCurrentRow(''ArtistID'') , Integer) = 3 Then
45 objCurrentRow.Delete()
46 End If
47 Next
48
49 Console.Write("Após a exclusão, pressi one return para visual i zar")
50 Console.Readline()
51
52 DisplayTable(objTable)
53
54 Catch myException As System.Exception
55 Censo 1e. \1ri tel i ne (myExcept i on. Message)
56 End Try
57 Console.Readline()
58 End If
59
60 End Sub
61 Sub DisplayTable(ByRef objTable As DataTable)
62 Dim objRow As DataRow
63 Dim objCol As DataColumn
64 Dim i , j As Integer
65
66 For j = O To objTable.Columns.Count - 1
67 objCol = objTable.Columns{j)
68 Conso 1e. 11ri te (" {O} : {1} ",
69 objCol.ColumnName,_
70 objCol . DataType.Name)
71 Next
72 Console.Writeline()
73 For i = O To objTable.Rows.Count - 1
74 objRow = objTable.Rows(i)
75 Select Case objRow. RowState
76 Case DataRowState.Deleted
77 Console.Write(''[Deleted] li )
78 Case DataRowState.Modified
79 Console.Write( ''[Modified] li )
80 Case DataRowState.Added
1 334 Dia 12
LISTAGEM 12.12 O Método De l ete Marca uma Linha como Excluí da (continuação)
82 Case DataRowState.Unchanged
83 Console.Write(''[Unchanged] '')
84 End Select
85 For j = O To objTable.Columns.Count - 1
86 If objRow.RowState <> DataRowState.Del eted Then
87 Console.Write(''{O} '',
88 objRow. Item(j))
89 Else
90 Console.Write( ''{O} '',_
91 objRow.Item(j, DataRowVersion.Original))
92 End If
93
94 Next
95 Console.Writeline()
96 Next
97 End Sub
98 End Module
Observe que na linha 90, dentro da rotina DisplayTable, uma sintaxe diferente foi usada para
acessar o valor de u1n ca1npo. Pela inclusão do segundo parâmetro, DataRowVersi on.Ori gi na l ,
esse código especifica que o valor do campo após a atualização rnais recente, ou no mo1nento em
que for carregado, deve ser exibido en1 vez do valor do campo atual (o padrão). Nesse caso, isso
é pa1ticulannente importante porque uma linha excluída não possui valores válidos para o cam-
po atual, e um erro será gerado se você tentar acessá-los.
Novo TERMO Para que você mes1110 crie esses comandos, precisará usar um tipo de consulta que
não foi abordada até agora nesta lição, um cornanclo con1 parâmetros. Um comando
dessa espécie deixa espaços reservados especiais e1n sua instrução SQL- parâmetros - que são pre-
enchidos co1n valores específicos antes que o con1ando seja executado. Os pontos de interrogação
são usados na instrução SQL para representar os parâmetros, como mostrado na Listagem 12.13:
5
6 objDeleteCommand . Connection = objConn
7 objDeleteCommand.CommandText = sDeleteSQL
Os detalhes devem ser fornecidos para cada espaço reservado pela inclusão de um objeto de pa-
râ1netro (01 eDBParameter ou SQLParameter, dependendo do ambiente en1 que você trabalha) no
conjunto de parâ1netros do co1nando. Cada objeto de parâtnetro é vinculado a un1 ca1npo espe-
cificado do DataSet por ,neio da propriedade SourceCo l umn, e trunbé1n pode ser associado a uma ver-
são específica do campo por 1neio da propriedade SourceVers i on. A Listage,n 12.14 mostra o código
necessário para adicionar um parâmetro e configurar algu1nas das propriedades disponíveis.
Nesse exe1nplo, o único ponto de interrogação fornecido para a SQL foi associado a esse novo
objeto de parâ,netro. Os espaços reservados fora1n associados aos parâmetros co1n base na posi-
1336 Dia 12
ção: o primeiro espaço reservado foi vinculado ao pri1neiro parâmetro. Depois que o objeto de
parâmetro foi criado, o campo e sua versão correspondentes fora1n especificados nas linhas 5 e 6.
Já que estamos lidando com linhas excluídas aqui, exata1nente co1no na Listage1n 12.12 anterior,
é i1nportante especificar SourceVers i on. A versão-padrão é a do valor atual (DataRowVers i on. Cur-
rent), que não está disponível para uma linha excluída. A última etapa que você terá de executar
antes do comando ser usado pelo adaptador será atribuí-lo à propriedade Del eteCorrmand:
objDataAdapter. Oel eteComrnand = objOeleteCommand
A Listage1n 12. 15 mostra um exemplo co1npleto e muito extenso que cria uma conexão com o
banco de dados e um adaptador e, em seguida, configura os comandos individuais para Upda-
teCommand, De l eteCommand e InsertCommand. Por fim, para testar esses co1nandos, um dataset é cria-
do, carregado co1n dados e alterado e, depois, a fonte de dados é atualizada pelo 1nétodo Update
do adaptador.
LISTAGEM 12. 15 As Alterações Não Têm Efeito até Que o Método Update Seja
Chamado
1 Modul e Modulel
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 Sub Main()
12 Dim sSQL As String
13 sSQL = ''SELECT ArtistID, ArtistName From Artist''
14 Dim objConn _
15 As New OleOb.OleObConnection(sConnection)
16 Dim objDataAdapter _
17 As New OleOb.OleObOataAdapter(sSQL, objConn)
18 Dim objOS _
19 As New DataSet(''Artists'')
20 Dim objDeleteComrnand _
21 As New OleDb.OleObCommand()
22 Dim objUpdateComrnand _
23 As New OleDb.OleObCommand()
24 Dim objlnsertComrnand _
25 As New OleOb.OleObCommand()
26 Oim sOel eteSQL As String
27 Dim sUpdateSQL As String
28 Dim sinsertSQL As String
Acessando Dados com a Plataforma .NET 337
LISTAGEM 12.15 As Alterações Não Têm Efeito até Que o Método Update Seja
Chamado (continuação)
29
30 sDeleteSQL = ''DELETE FROM Artist WHERE ArtistID - ?11
31
32 objDeleteCommand.Connection = objConn
33 objDeleteCommand.CommandText = sDeleteSQL
34
35 Dim objParam As OleDb.OleDbParameter
36 objParam = objDeleteCommand.Parameters.Add(_
37 11
@ArtistID 1' . OleDb.OleDbType.Integer)
38 objParam.SourceColumn = '1Artist ID 11
39 objParam.SourceVersion = DataRowVersion.Original
40
41 objDataAdapter.DeleteCommand = objDeleteCommand
42
43 sUpdateSQL = '1 Update Artist SET ArtistName =? 11
&
44 "WHERE Arti stID = ?"
45
46 objUpdateCommand.Connection = objConn
47 objUpdateCommand.CommandText = sUpdateSQL
48
49 objParam = objUpdateCommand.Parameters.Add(_
50 1
'@ArtistName 11 • OleDb.OleDbType.Char)
51 objParam.SourceColumn = 11 Art istName 11
52 objParam.SourceVersion = DataRowVersion.Current
53
54 objParam =objUpdateCommand.Parameters.Add(_
55 11
@ArtistID 1' , OleDb.OleDbType.Integer)
56 objParam.SourceColumn = 11 ArtistID 11
57 objParam.SourceVersion = DataRowVersion.Original
58
59 objDataAdapter.UpdateCommand = objUpdateCommand
60
61 slnsertSQL = 11 INSERT INTO Artist 11 &
62 11
(ArtistID, ArtistName) 11 &
63 "VALUES (?. ?) "
64
65 objlnsertCommand.Connection = objConn
66 objlnsertCommand.CommandText = slnsertSQL
67
68 objParam =objinsertCommand.Parameters.Add(_
69 11
@ArtistID 11 , OleDb.OleDbType.Integer)
70 objParam.SourceColumn = 11 ArtistlD 11
71 objParam.SourceVersion = DataRowVersion.Current
1 338 Dia 12
LISTAGEM 12.15 As Alterações Não Têm Efeito até Que o Método Update Seja
Chamado (continuação)
72
73 objParam = objlnsertCorrunand.Parameters.Add(_
74 11
@ArtistName 11 , OleDb.OleDbType.Char)
75 objParam.SourceColumn = ''ArtistName''
76 objParam.SourceVersion = DataRowVersion .Current
77
78 objDataAdapter.InsertCommand = objlnsertCommand
79
80 Try
81 objConn.Open()
82 Catch myException As System.Exception
83 Console.Writeline(myException.Message)
84 End Try
85
86 Try
87 Dim sNewArtistSQL As String
88 sNewArtistSQL = 11 INSERT INTO Artist 11 &
89 11
(ArtistID, ArtistName, 11 &_
90 11
ArtistFirstName, Artist l astName) 11 &_
91 ''VALUES (11, 'Wei rd Al Yankovich', 11 &
92 11
'Al •, 1 Yankovich 1 ) 11
93
94 Dim objNewArtistCmd _
95 As New OleDb.OleDbCommand(sNewArtistSQL, objConn)
96 objNewArtistCmd . ExecuteNonQuery()
97 Catch e As Exception
98 'Pode causar um erro porque
99 'ArtistID #11 já existe
100 'Mas se ocorrer, será correto.
101 Console . Writeline(e.Message)
102 End Try
103
104 If objConn.State = ConnectionState.Open Then
105 Try
106 objDataAdapter.MissingSchemaAction
107 =MissingSchemaAction.AddWithKey
108 objDataAdapter. Fi 11 (objDS, 11 Artist 11 )
109 objConn.Close()
110 Dim objTable As DataTable
111 objTable = objDS.Tables( 11 Artist 11 )
112 Dim drRows As DataRowCollection
113 Dim objCurrentRow As DataRow
114 drRows = objTable.Rows
Acessando Dados com a Plat aforma .NET 339
LISTAGEM 12.15 As Alterações Não Têm Efei to até Que o Método Update Seja
Chamado (continuação)
115
116 DisplayTable(objTable)
117
118 Console.l•lrite("Se pretende excluir," &_
119 " pressione return para iniciar!")
120 Console.Readline()
121
122 'Exclua a linha com chave primária= 11
123 drRows . Find(ll).Del ete()
124
125 Console.Write(''Apõs a exclusão , '' &
126 '' pressione return para visualizar os resultados'')
127 Console. Readline()
128
129 OisplayTable(objTable)
130
131 Console.l~rite("Se pretende inserir," &
132 "pressione return para iniciar! ")
133 Console.Readline()
134
135 Dim drRow As Data . DataRow
136 drRow = objTable.NewRow
137 drRow(''ArtistID'') = 40
138 drRow(''ArtistName'') = ''Kent Sharkey''
139 objTable.Rows.Add(drRow)
140
141 Console.Write(''Depois de inserir , '' &
142 '' pressione return para visualizar!'')
143 Console.Read l ine()
144 Displ ayTable(objTable)
145
146
147 Console.Write(''Se pretende atualizar , '' &
148 '' pressione return para iniciar!'')
149 Console.Readline()
150
151 ' Acesse a linha com chave primária igual a 7 (Li sa Loeb)
152 drRow = drRows . Find(7)
153
154 drRow. BeginEdit()
155 drRow( ''ArtistName'') = ''John Doe ''
156 drRow.EndEdit()
157
1340 Dia 12
LISTAGEM 12.15 As Alterações Não Têm Efeito até Que o Método Update Seja
Chamado (continuação)
158 Console.Write( 11 Depois de atualizar, 11 &_
159 '' pressione return para visualizar os resultados'')
160 Console.Readline()
161 DisplayTable(objTable)
162
163 objConn.Open()
164 objDataAdapter.Update(objDS, ''Artist'')
165
166 Catch myException As System.Exception
167 Canso l e. l~ri tel i ne (myExcept i on. Message)
168 End Try
169 Console.Write(''Pressione Return para finalizar.'')
170 Console.Readline()
171 End If
172 End Sub
173 Sub DisplayTable(ByRef objTable As DataTable)
174 Dim objRow As DataRow
175 Dim objCol As DataColumn
176 Dim i, j As Integer
177
178 For j = O To objTable.Columns.Count - 1
179 objCol = objTable.Columns(j)
180 Console.Write(''{O}:{l} '',
181 objCol.ColumnName,_
182 objCol.DataType.Name)
183 Next
184 Console.Writeline()
185 For i = O To objTable.Rows.Count - 1
186 objRow = objTable.Rows(i}
187 Select Case objRow.RowState
188 Case DataRowState.Deleted
189 Console.Write(''[Deleted] '')
190 Case DataRowState.Modified
191 Console.Write(''[Modified] li )
LISTAGEM 12.15 As A1te rações Não Têm Efeito até Que o Método Update Seja
Chamado (continuação)
201 Else
202 Console.l~rite(" {O} ",_
203 objRow. Item(j, DataRowVersion.Original))
204 End If
205 Next
206 Console.Writeline()
207 Next
208 End Sub
209 End Module
ANÁLISE O código da Listagem 12.15 está disponível para download no site deste livro na
Web, portanto, não é necessário digitá-lo a menos que você queira mesrno fazê-lo. A
prirneiraseção do código está bem dentro do padrão utilizado em todos os outros escritos nesta li-
ção. A string de conexão foi criada, devendo ser substituída pelos valores apropriados para seu
sistema, e usada para instanciar um novo objeto 01 eDBConnect i on (l inha 14).Um objeto 01 eDB-
DataAdapter e un1 DataSet ta1nbém foram gerados e inicializados para tornar possível se conec-
tar com o banco de dados e retornar os resultados da instrução SELECT para seu progratna. Como
parte do código de inicialização, três novos objetos 01 eDBCommand tambérn foram criados e serão
empregados na representação dos comandos UPDATE, DELETE e INSERT para OleDBDataAdapter.
No entanto, esses objetos de co1nando não foram realmente gerados nesse ponto; essa etapa é rna-
nipulada conforme cada comando vai sendo configurado posteriorn1ente.
As linhas 30 a 41 criatn e configurarn o objeto de comando Del ete, adicionando o único objeto
de parâ1uetro para Art i stID (a chave primária). Observe como a linha 39 especifica que Source-
Versi on seja DataRowVersion.Original porque os dados atuais não são válidos para uma linha
excluída. As Iinhas 43 a 59 ,confi gurarn o comando Upda te e, em seguida, as Iinhas 61 a 78 rnani-
pulam o co1nando Insert. E bom ressaltar que para Update e Insert, 1nuitos parâmetros são ne-
cessários, devido ao fato de que todos os campos da tabela têrn de ser enviados nesses cornandos.
Voltando ao código que é co1num a todos os exemplos desta lição, as linhas 80 a 84 configuram a
conexão co,n o banco de dados. A seguir, uma única linha de dados é inserida no banco de dados
pelo método ExecuteNonQuery ( ) de urn objeto de cornando. Essa linha é adicionada de ,nodo
que possa ser excluída posteriormente, porque a tentativa de remover qualquer outro registro de
Artist falharia devido à existência de registros-filhos (CDs desse artista na tabela Disc). Ern vez
de usar o dataset e o adaptador de dados no 1nodo desconectado, essa inserção é feita de imediato
por uma operação direta.
A linha 106, que ocorre depois que a conexão é abe1ia e que o único registro novo tiver sido inse-
rido, infon11a ao adaptador de dados como manipular a configuração de u1na tabela quando não
existe nenhum esque,na (as informações sobre o tipo de dados e o layout referente aos dados).
Essa configuração específica, AddWi thKey, comunica ao adaptador para criar automatica1nente o
1342 Dia 12
esquema básico (informações sobre o can1po) e incluir também infonnações sobre a chave pri-
1nária. A seguir, na linha 108, o DataSet é carregado co1n os dados pelo 1nétodo Fi 11 e co,n u1n
parâmetro adicional para especificar o no1ne da tabela recé1n-criada, 'Artist'.
Apenas para se certificar de que está claro que esse é um processo desconectado, a linha 109 en-
cerra a conexão com o banco de dados antes que a verdadeira manipulação de dados ocorra. De-
pois desse ponto, o código exclui, altera e adiciona registros ao objeto DataTab l e para fornecer
u1n teste de todos os três tipos de edições que pode1n ocorrer em um Da ta Tab l e. Para encontrar a
linJ1a correta a excluir (linha 123) e editar (linha 152), o 1nétodo Fi nd do objeto Da taRowCo 11 ec-
t i on é usado. Esse 1nétodo retorna un1 objeto DataRow dado um valor de chave priinária válido
para pesquisa, uin processo que requer que o objeto DataTab l e tenha infonnações sobre a chave
primária (leia o parágrafo anterior para obter uma explicação de co1no a linha 106 fornece essa
informação).
Para concluir, depois de todas as edições, a linJ1a 164 usa o método Update de 01 eDBDataAdapter
para aplicar todas as alterações de dados ao Da taSet. Esse método usa un1 DataSet como parâ1ne-
tro, junto a uina string indicando que tabela dentro do DataSet deve ser utilizada para atualizar o
banco de dados. Se o nome da tabela não for fornecido, o adaptador tentará atualizar o banco de
dados com todas as tabelas disponíveis.
O resultado desse código deve ser uma seqüência de instruções SQL executadas e1n um banco de
dados, cada uma correspondendo a u1n dos comandos do adaptador. Se você estiver usando o
SQL Server e quiser ver o que acontece, poderá e1npregar o Profiler para observar todos os co-
mandos sendo processados no servidor enquanto esse código estiver em execução. Fornecer de-
talhes sobre co1no utilizar o Profiler está além do escopo deste livro, 1nas o resultado deve ser
semelhante ao 1nostrado a seguir:
INSERT INTO Artist (Arti stID, ArtistName , ArtistFirstName, ArtistlastName)
VALUES (11, 'Weird Al Yankovich', 'Al', 'Yankovich')
go
SELECT ArtistID, ArtistName From Artist
go
exec sp_executesql
N'Update Artist SET Arti stName = @Pl
WHERE ArtistID = @P2', N'@Pl char(8),@P2 int', 'John Doe ', 7
go
exec sp_executesql
N'DELETE FROM Artist WHERE ArtistID = @Pl', N'@Pl int', 11
go
exec sp_executesql
N'INSERT INTO Artist (Artist ID , ArtistName) VALUES (@Pl,@P2)',
N'@Pl int,@P2 char(12) ', 40, 'Kent Sharkey '
go
Nesse exe1nplo, só u1n registro foi inserido, alterado e excl.uído, mas o método Update simples-
mente chan1aria os co1nandos apropriados para cada registro alterado.
Acessando Dados com a Plataforma .NET 343
84 Case DataRowState.Modified
85 Consol e.Write( ''[Modified] li )
86 Case DataRowState.Added
1346 Dia 12
Como e1n todos os exernplos desta lição, esse código poderia ser rnod ificado para trabalhar com
as classes SQLCl i ent precisando apenas de algurnas alterações menores. A string de conexão te-
ria de ser alterada pela remoção da seção Provi der, e todos os objetos declarados corno classes
01 EDB precisaria1n ser substituídos por seus equivalentes SQLCl i ent.
Com os relacionrunentos definidos, é possível usar essas informações para permitir o acesso es-
truturado de uma Iinha de dados-pai a qualquer Iinha relacionada com ela na tabela-filha. O códi-
go da Listage1n 12.18, que pode ser adicionado no local exato que antecede o final do
1348 Dia 12
procedimento da Listagen1 12.17, executa u1n laço por n1eio dos registros da tabela Artist e exibe
os CDs associados a esse artista.
A patie essencial do código desse exe1nplo está na linha 9, em que o 1nétodo GetChi l dRows do
objeto OataRow é usado para retornar um array de OataRows da tabela-filha. Esse array inclui to-
das as linhas da tabela-filha em que os campos Art is tID da tabela-pai e da filha tê1n tuna corres-
pondência.
Visualizações
O ADO.NET inclui o conceito de visualizações de dados, a capacidade de especificar a orde1n de
classificação, u1n filtro sobre as linhas e um filtro com base no estado da linha (alterada, excluí-
da, inalterada ou nova). Essa visualização (Data Vi ew), quando criada, pode ser acessada pela
propriedade Oefaul tVi ew da própria tabela ou pelo conjunto Relati ons, que é uma propriedade
do próprio DataSet.
A Listage,n 12.19 apresenta o código-padrão para a abertura de u1n banco de dados, o preenchi-
mento de u1na tabela com dados e, em seguida, a criação de u1n objeto DataVi ew usando a tabela
com.o seu construtor. Depois que a visualização for gerada, ela poderá ser configurada com uma
combinação aleatória de três propriedades diferentes: RowStateFi l ter, Sorte/ou RowFi l ter. A
visualização propriainente dita pode ser vinculada a u,n controle dos formulários Windo'vvs (veja
a próxi1na seção para obter infonnações sobre a vinculação de dados), ou você pode acessar seu
conteúdo diretamente como um conjunto de objetos DataRowVi ew.
Acessando Dados com a Plataforma .NET 349
36
37 Dim objDRV As DataRowView
38 Console.Writeline(''No objeto DataView'')
39 For Each objDRV ln objDV
40 Console.Writeline("{O} {1}",
41 objDRV("ArtistID") ,_
42 objDRV("ArtistName"))
43 Next
44 Console.Readline()
1 350 Dia 12
45 End Sub
46 End Module
Até a linha 22 não ten1os nada tão diferente dos outros exemplos que vi1nos até aqui: un1a conexão
co1n o banco de dados foi aberta, e os dados fora1n carregados etn u1n DataSet. Depois do carrega-
mento de dados, um laço rápido (linhas 26 a 30) os exibiu se,n dar a impressão de que percorreu
u1n objeto Da ta Vi ew (na verdade percorreu a visualização de dados-padrão). Em seguida, u1n obje-
to DataView foi criado e configurado co1n u1na orde1n e un1 filtro sobre os valores das linhas (linhas
32 a 35). Para concluir, esse objeto Data Vi ew foi usado para acessar as linhas (linhas 39 a 43), dessa
vez exibindo-as aplicando sua ordem e filtro. O resultado desse código, presumindo que você ti-
vesse feito todos os exe,nplos até este ponto, deve se parecer co1n o apresentado a seguir:
Through Table
1 Natalie Imbruglia
2 The Tragical ly Hip
3 Sting
4 Queen
5 Boney M.
6 Barenaked ladies
7 Kent Sharkey
8 Janet Jackson
9 Matchbox Twenty
10 Madonna
40 Kent Sharkey
Through DataView
6 Barenaked Ladies
5 Boney M.
7 Kent Sharkey
1 Natalie Imbruglia
4 Queen
3 Sting
2 The Tragically Hip
Mesmo se sua saída não estiver exata,nente igual ao texto anterior, observe que na lista Through
Tab l e, 11 linhas fora1n exibidas por ordem de identificação do artista. Em Through Data Vi ew, as
linhas foran1 acessadas por 1neio da visualização recém-criada, e o resultado reflete tanto o filtro
quanto a ordem.
Vinculação de Dados
A vinculação de dados fornece tuna 1naneira de associar u1n ele1nento da interface co1n o usuá-
rio, co1no tuna grade, a u1na fonte de dados, como u1n objeto DataTab l e ou DataSet. Depois que
Acessando Dados com a Plataforma .NET 351
um elemento da interface é vinculado a uma fonte de dados, as alterações nessa fonte serão refle-
tidas na interface co1n o usuário, e as que afetarem os dados por meio da interface serão, por sua
vez, retornadas à fonte de dados. Para o desenvolvedor, a vinculação de dados resolve todos os
proble1nas co1nplexos de 1nanipular as interações do usuário com os dados e elirnina a necessida-
de de escrever um código extenso apenas para fornecer um 1neio de o usuário interagir com seus
dados. Un1 recurso interessante e poderoso da vinculação de dados da plataforma .NET é que ela
não é lilnitada a trabalhar com DataSets. Na verdade, tuna ampla variedade de objetos pode usar
a vinculação de dados, incluindo Arrays, Co 11 ect i ons, DataVi ews, DataSets, Data Tab 1e e outros.
E1n nossos exemplos, trabalharernos apenas con1 Da taSets, Da ta Vi ews e DataTab 1es, n1as existe
o potencial para vincular todo tipo de infonnações
No universo da plataforn1a .NET, dois tipos principais de interfaces com o usuário pode1n ser
criados: o cliente Windows sofisticado (Sys tem.Windows. Forms) e o cliente da Internet WebForms.
Os detalhes da vinculação serão abordados na próxi1na seção junto a um exen1plo passo a passo
ocorrendo entre um dataset e u1na grade. A vinculação de dados nos fonnulários da Web e o
acesso geral aos dados do ASP.NET não serão detalhados nesta lição.
Vinculação Simples
Os controles que dão suporte à vinculação simples expõe1n u1n conjunto DataBi ndi ngs que pode
ser usado para vincular as propriedades a ca1npos de dados. A Listage1n 12.20 fornece u1n exem-
plo desse tipo de vinculação de dados con10 parte de u1n aplicativo con1 formulários WindO\.VS.
Para você testar esse código, crie um novo aplicativo Windo\.vs no Visual Basice insira apenas
uma caixa de texto e u1n botão no fonnulário. Deixe os controles com seus no1nes-padrão ( text-
boxl e Buttonl) e inclua esse código no evento Cl i ck do botão.
1 352 Dia 12
LISTAGEM 12.20 A Vi ncu 1ação de Dados Pode Ser Cri ada Dinamicamente em Código
1 Private Sub buttonl_Click(ByVal sender As System.Object,
2 ByVal e As System.EventArgs)
3 Handles buttonl.Click
4 Dim sConnection As String=_
5 "Provider=SQLOLEDB . l;" &_
6 "Password=;"&_
7 ''Persist Security Info=True;'' &
8 ''User ID=sa;'' &
9 ''Initial Catalog=CD;'' &
10 ''Data Source=(local)''
11
12 Dim sSQL As String
13 sSQL = ''SELECT ArtistID , ArtistName From Artist''
14 Dim objConn _
15 As New OleDb.OleDbConnection(sConnection)
16 Dim objDataAdapter _
17 As New OleDb.OleDbDataAdapter(sSQL, objConn)
18 Dim objDS _
19 As New DataSet(''Artists'')
20 Dim objDV
21 As DataView
22
23 Try
24 objConn.Open()
25 Catch myException As System.Exception
26 Windows.Forms.MessageBox.Show(myException.Message)
27 End Try
28
29 If objConn.State = ConnectionState.Open Then
30 Try
31 objDataAdapter.Fill(objDS, ''Disc'')
32 objConn.Close()
33 Dim objTable As DataTable
34 objTable = objDS.Tables(''Disc'')
35 objDV = objTable.DefaultView
36 textBoxl.DataBindings . Add(''Text'',
37 objDV, -
38 "ArtistName ")
39 Catch myException As System.Exception
40 Windows . Forms.MessageBox.Show(myException.Message)
41 End Try
42 End If
43 End Sub
Acessando Dados com a Plataforma .NET 353
Além do trecho inteiro de código que você já conhece (linhas 1 a 34) abrindo a conexão com o
banco de dados e obtendo u1n DataSet, a linha no final do procedi1nento (linha 37) é que real-
1nente cria a vinculação de dados. O método Add do conjunto DataBi ndi ngs permite a especifica-
ção de tuna propriedade do controle e da fonte de dados (nesse caso a visualização de
dados-padrão da tabela). Depois que isso for feito, o valor do ca1npo Arti stName será exibido
(v~ja a Figura 12.6).
Isso não é tão útil assim, considerando que você está visualizando só o primeiro registro e não
tem como se 1nover para a frente ou para trás através dos dados. Para fornecer uma funcionalida-
de co1no essa quando você usar a vinculação simples de dados, será preciso acessar o conjunto
Bi ndi ngContext do forn1u lário-pai. Ao especificar a fonte de dados na qual está interessado,
você poderá obter um objeto Bi ndi ngContext para ela.
No exe,nplo a seguir, a fonte de dados original não é un1a variável no nível do fonnulário, por-
tanto, o código a acessa percorrendo o conjunto DataBi nd i ngs da caixa de texto. Só há uma vin-
culação de dados, assim, especificar um índice igual a zero retornará son1ente a fonte de dados
disponível. Con1 esse objeto de contexto, se te1n acesso a várias propriedades e 1nétodos para cria-
ção de u,na interface que trabalhe com os dados vinculados. Uina propriedade em particular, Po-
s i ti on, é útil porque permite que você se inova para a frente e para trás através dos dados
confonne desejar. Se adicionar u1n segundo botão ao formulário e inserir um código nele,você
terá a capacidade de se 1nover para adiante na lista de artistas. Observe que não há nenhu1n recur-
so avançado nesse código; ele será interro,npido se você tentar ultrapassar os dados disponíveis:
Private Sub button2_Cl ick(ByVal sender As System.Object,
ByVal e As System.EventArgs)
Handles button2.Click
Me.BindingContext(textBoxl .DataBindings(O).DataSource).Position += 1
End Sub
Esse objeto de contexto expõe outros recursos co1no AddNew e CancelCurrentEdit, tornando-o
um objeto com o qual você trabalhará freqüentemente.
354 Dia 12
Novo TERMO Vincular controles a un1a fonte de dados inteira, e1n vez de a um único can1po, é cha-
mado de vinculação con1plexa de dados. Esse tipo de vinculação de dados te1n su-
po1te de dois dos controles que vêm com o Visual Stusio .NET, DataGri d e ComboBox. Para
configurar a vinculação de dados com um desses controles, você definirá a propriedade Data-
Source do controle co,11 o objeto apropriado (Da ta Vi ew neste caso, 111as poderia ser Array, Co 1-
1ect i on, DataSet e outros). Se DataSource tiver mais de um objeto que puder ser vinculado
(co1no un1 DataSet com mais de uma tabela), então, especifique o item apropriado como um va-
lor alfanumérico na propriedade DataMember. Portanto, se vincular DataGri d a um DataSet, terá
de fornecer o nome da tabela co1110 a propriedade Da taMember. O código para fazer isso seria idên-
tico ao da Listage111 12.20, exceto pelo fato de ser preciso substituir as linhas 36 a 38 pelas descri-
tas a seguir:
dataGridl.DataSource = objOS
dataGridl.OataMember = ''Disc''
Para que você mes1110 teste a vinculação complexa, crie u111 novo apl icativo Windov.1s e insira
um botão e u1n controle Da taGri d no fon11ulário (os dois estão disponíveis na caixa de ferra1nen-
tas). Deixe tudo com os no1nes-padrão e insira o cód igo da Listagem 12.20, incluindo as altera-
ções descritas anteriormente no evento Cl i ck de seu botão. Co.mo resultado desse código, depois
que o botão for clicado, o controle DataGri d será vinculado a ele e, portanto, exibirá a tabela
Artists de seu DataSet. Seu formulário pode não ter exatamente a mesma aparência da Figura
12.7, n1as deve ficar sen1elhante.
FIGURA 12.7
U111 controle DataGrid M6:Ul.n'IO
cria 11111 a111biente de • 1 Hetdi,, lmbrt#.154
2 The T1.>!ie61~•fp
aparência profissional s,;,.,,,
' . ,3 Oueco
sen1 ser necessar,a 5 9onoyJ4.
8orcnlked L<lde;
,nuita codificação. 6
7 tisaloeb
8 J41'1Ct J.cktOl'I
9 Metc_~T~
10 t.ladc.-in~
Resumo
O acesso a dados foi totahnente redesenhado para a plataforn1a .NET, 111as ainda dá suporte a tec-
nologia subjacente do OLEDB. Usando os provedores de OLEDB (drivers), você poderá criar
códigos que serão executados e1n quase todos os bancos de dados necessários, sendo preciso
apenas aprender uma maneira de programar aplicável a todos eles. Empregando a natureza des-
conectada dos DataSets, é possível gerar sistemas co1npleta1nente interativos que não ocupern
Acessando Dados com a Plataforma .NET 355
conexões valiosas com os bancos de dados. Ao construir intertàces reais co1n o usuário, a vincu-
lação de dados lhe proporcionará uma 1naneira rápida e fácil de exibir seus dados etn utn fortnu-
lário Windows.
P&R
P Em todos os exemplos desta lição, minha string de conexão estava embutida em códi-
go. Já que ela inclui minha identificação de usuário e senha, isso não me parece muito
seguro.
R Excelente observação. Nos códigos desta lição, a string de conexão foi inserida direta-
1nente no arquivo . vb, que é be,n pouco seguro. Uma idéia ,nelhor, quando você não esti-
ver apenas desenvolvendo exe1n plos, seria inserir o valor da string de conexão no
Registro ou en1 um arquivo de configurações no disco. Isso é feito não só por razões de
segurança; não inserindo sua string de conexão no código, será possível alterar os parâ-
1netros da conexão com o banco de dados, assi1n como de outras conexões, sem recon1pi-
lar 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 atualizações em utn banco de dados, você deve estar atento aos proble-
1.nas de si1nultaneidade, e1n que duas ou mais pessoas alteram os mesm.os dados no 1nes-
1no 1no1nento. No caso dos DataSets,já que fora,n projetados para ser usados off-line, é
provável que o período entre o dov.,nload e a atualização seja relativan1ente longo. Du-
rante esse tetnpo, outro usuário poderia ter alterado esses mes1nos dados de algun1a 1na-
neira. Se usannos os co,nandos de atualização gerados de ,nodo auto,nático, eles
incluirão um. código que verifica esse problema antes de atualizar. Caso contrário, se
construirmos os comandos manuahnente, nós mes1nos teremos de confrontar os dados
originais com os atuais no banco de dados.
Workshop
O Workshop fo i planejado para aj udá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e co1neçar a pensar e1n co1no colocar seu conheci,nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Que propriedade você precisa configurar (e cotn que valor) para forçar o adaptador de
dados a criar informações sobre a chave primária quando carregar os dados em u1n Da ta-
Set?
356 Dia 12
2. Qual é a diferença entre o método Del ete de um objeto DataRow e o método Remove do ob-
jeto Da taRowCo 11 ec ti on?
3. Como você deve executar esta instrução SQL?
DELETE FROM Artist Where ArtistID=3?
Exercícios
1. Crie uLn aplicativo Windovvs que use as classes que você aprendeu nesta lição para forne-
cer uma interface con1 o usuário que visualize, altere, adicione e exclua itens de seu ban-
co de dados de CDs.
SEMANA 2
DIA
pesquisar pastas em um disco rígido ou site da Web, disponibiliza a pesquisa em vários servido-
res de sua rede e a visualização dos serviços que estão ern execução neles. Alérn disso, você pode
controlar ou escrever um código para usar alguns serviços, tudo a partir do Server Explorer. Ele
pode ser visto na Figura 13 .1. Se não estiver visível, pode ter sido fechado anterionnente. Abra-o
selecionando View e Server Explorer no n1enu.
....,.,
O Server Explorer apresenta u.ma lista hierárquica dos serviços disponíveis no cornputador se.le-
cionado. Por padrão, ele só exibe os serviços que se encontram no co1nputador de desenvolvi-
1nento, ,nas você poderá adicionar outros quando necessário. Esses podem ser divididos em duas
amplas categorias:
,
• Conexões de dados E semelhante ao an1biente de dados disponível no Visual Basic 6
(presumindo que você tenha usado essa versão). Permite a conexão e visualização dos
bancos de dados se1n ser necessário sair do ambiente do Visual Basic .NET. Este recurso
possui algumas fmalidades óbvias caso você tenha de desenvolver uma programação ex-
tensa para acessar e atualizar os bancos de dados, que é un1 dos principais usos no Visual
Basic .NET.
• Servidores Esta é a lista de servidores cornos quais você está conectado e os serviços
que estão em execução (ou disponíveis) em cada um deles. As informações desta seção
inclue1n a capacidade de acessar os registros de eventos e a monitoração do dese1npenho
nesses computadores, assim como outros serviços, por exernplo, filas de 1nensagens, o
SQL Server e assim por diante.
Usaretnos o Server Explorer nesta lição concentrando-nos em duas de suas principais funções:
visualização de informações e desenvolvimento de programas.
Usando o Server Explorer 359
O Que É um Serviço?
NovoTERMO
O serviço é um progra1na executado em segundo plano, que fornece algu1n recurso
para complen,entar o siste,na operacional. Esses recursos poden1 incluir progran,as
que tradicionalmente são considerados servidores, como servidores de bancos de dados (por
exe1nplo, o Microsoft SQL Server), servidores Web (co,no o Microsoft US) ou servidores de cor.reio
(con10 o Microsoft Exchange). Como alte1nativa, o serviço pode fornecer algum recurso adicional que
outros progra1nas podem utilizar, corno a monitoração do desempenho ou o registro de eventos. O
Windows 95, o 98 e o ME fon1ecem muito menos serviços do que o Windows NT ou o 2000.
E1n geral os serviços possuem u,n progra,na que é usado na visualização de infonnações sobre
ele. Por exemplo, o Event Viev,rer permite que você visualize os registros de eventos de um com-
putador, ou o SQL Server Enterprise Manager disponibiliza a visualização e ad1ninistração de
u1n SQL Server. O Server Explorer co1nple1nenta essas ferra,nentas pennitindo a utilização dos
serviços sem ser necessário sair do IDE.
Examinando os Serviços
Para visualizar o Server Explorer, selecione-o no 1nenu View. Por padrão, ele aparecerá no lado
esquerdo do IDE. Co,no acontece com outras telas, ele pode ser' 111antido aberto' ou configurado
para deslizar auto1natica1nente para fora do ca,npo visual quando não for mais necessário. Etn
um computador que estiver executando o Windows 2000 com o Microsoft SQL Server instala-
do, ele aparecerá co,no n1ostrado na Figura 13 .2. En1 outro co1nputador, com serviços diferentes
instalados, esses provavelmente aparecerão.
E;· é!,~~.c,y,~...- ~ h
2 (& QUAOJ(J<o,,,.,,,t,o
~-t,.........._
a ~s.,,..,,
s lll•"""
!:) c,y,... 5"'1«> Troff~ tor r od~y
Yml S/1/2001
llll """'' ...,,
e;, ,sÇ - ~- Wcbbrd 8/1/2001
(,~ (2) Pc,~c e~,
DyrwimkWir.dowsForm.sSlmol• '1/312001
'!!, s.,.....,
(ij SQI. ""'"' Open ProJC<t I Ncw Projcct
•
SJ' rffil.,..JEJ IEJ T...... ,
R~m
360 Dia 13
Re~QS.'!mpl~s 9/9/2001
Sc,ufflYTool 9/10/2001
jTCPfx.plore, 9/2/2001
~El
R6ady - 00
~..... ~~~~~~~~~,.-~~--,,--~~~~~~~~--i
E1n princípio, só u1n link, Add Connection, deve estar disponível na pasta Data Connections.
Dar u.1n clique duplo nessa opção trará a caixa de diálogo Data Li11k Properties (veja a Figura
13.4). Essa caixa de diálogo pennitirá que você configure u1na nova conexão de dados. As op-
ções que são selecionadas nessa caixa variam dependendo do tipo de dados co1n os quais se quer
conectar. As configurações estão divididas entre várias guias da caixa de diálogo.
A guia Provider é usada para selecionar o provedor que será etnpregado na conexão corn o banco
de dados. Dependendo de quais provedores você tiver instalado, pode haver ,nuitas opções. A
Figura 13.4 mostra os provedores disponíveis em ,ninha máquina.
li...» 1
OK Ko\>
Usando o Server Explorar 361
Alguns dos provedores mais usados para o acesso aos dados são:
• Microsoft Jet 4.0 OLE DB Provider Pennite o acesso aos bancos de dados do Micro-
soft Access (arquivos .1ndb).
• Microsoft OLE DB Provider for ODBC Databases Permite o acesso a qualquer ban-
co de dados que possua u1n driver de ODBC instalado. Muitos drivers de ODBC estão
disponíveis, portanto, esse provedor pode ser usado para acessar quase todos os bancos de
dados existentes. Poré1n, ele só deve ser empregado e1n último caso porque acessa as in-
forn1ações utilizando tanto o OLE DB quanto o ODBC. Já que há 1nais ca1nadas entre seu
programa e o banco de dados, esse em geral é o provedor mais lento.
• Microsoft OLE DB Provider for Oracle Pern1ite o acesso aos bancos de dados do
Oracle.
• Microsoft OLE DB Provider for SQL Server Permite o acesso aos bancos de dados
do Microsoft SQL Server.
Dependendo do provedor que você selecionar nessa etapa, diferentes opções
. .
estarão disponíveis
nas outras guias. A Tabela 13.1 resu1ne as opções disponíveis na guia Connection.
Depois de inserir todas as inforn1ações necessárias para acessar seu banco de dados, dê um cli-
que no botão Test Connection para confirmar. Se o resultado for u,na caixa de diálogo exibindo
' Test Connection Suceeded' , dê u1n clique em OK para fechá-la e continuar. Caso contrário, a
caixa de diálogo deve sugerir u1na ,nanei ra de corrigir o erro (e,n geral a causa é a falta de defini-
ção de u1na configuração em algu1n local). Corrija o erro e teste a conexão novamente.
Depois de se conectar a utn banco de dados, ele deve aparecer na seção Data Connections do Ser-
ver Explorer. Dependendo de seu tipo, a entrada possuirá várias seções. A Figura 13 .5 ,nostra os
itens existentes para alguns dos tipos de bancos de dados disponíveis.
A Tabela 13.2 descreve os tipos de itens que você deve ver para os diversos bancos de dados com
os quais normahnente pode se conectar.
Data Connections. 1$1 · t~. lã: li!"' 1 j! itl f!, .-, ...... Ç'. q • . ~ d>o
Objeto Descrição
Tables (tabelas) Contém uma lista de todas as tabelas armazenadas em um banco de da-
dos. Uma tabela é um agrupamento de informações. Por exemplo, ela
pode conter informações sobre os funcionários de uma empresa, os
produtos que ela vende ou itens semelhantes relacionados. Em geral,
esta é a seção disponível mais importante de Data Connections.
Views Contém uma lista das visualizações de dados do banco de dados. A vi-
(visualizações) sualização é uma maneira de examinar as informações - por exemplo,
ela pode não exibir todos os campos, ordenar as informações de um
modo diferente ou incluir dados de várias tabelas.
Stored procedures Contém uma lista dos programas armazenados no banco de dados. Aí
(procedimentos estão incluídas as consultas que podem retornar informações, assim
armazenados) como programas que podem excluir, atualizar ou inserir dados.
Usando o Server Explorar 363
Objeto Descrição
Functions Semelhante aos procedimentos armazenados, porém, as funções são
(funções) específicas para alguns bancos de dados. Em geral são usadas para re-
tornar pequenos trechos de informação e, por enquanto, são parecidas
com as funções que usamos no Visual Basic .NET.
Data base diagrams Em geral só são encontrados no SQL Server. São usados para docu-
(diagramas de mentar o banco de dados e para fornecer uma descrição visual de suas
bancos de dados) tabelas. (Veja a Figura 13.6 para um exemplo.)
FIGURA 13.6
Diagra,na ele banco de
dados.
f;it õdt \!lfW l)'O)Kt ~ !!<h-9 O i - °"'!>'a<Jl l °"'
JV · ên · ~ lil.:11 11'~ 6 •..•. '".q ' °"""
w ~ 1,9 J Q. o< !:l, II]aibITab!o >\<"• %, 'lê fil J IQ '!.g '18
't,.'t'«tN !lfl>
15%
. ---d
• «g C?J l!:l) •
p
_......
-=. .
~
OrdaDd&lh
-:,
Ê
--
, -. :,
- --
_
.....
............
~~
.......
- ~~
- ....
~
,_
Cet~ries
"'.......,,
,,
-"'-
- ..........,
....,.
SuppliicTs
--· -~
- ~ ~'
---~,
- Ott
.....
--
~
- :.:.~
--- .."""'
~,.;...,.
•
• • •
Basi e. NET%\Common7\ Tool s\Bi n\nwi nd .mdb. Dê um clique etn OK para aceitar esse ban-
co de dados.
4 Dê um clique no botão Test Connection. Uma caixa de diálogo deve aparecer infor1nan-
do que a conexão foi be1n-sucedida. Caso contrário, certifique-se de que haja utn banco
de dados no local selecionado. Dê u1n cl ique em OK para aceitar essa conexão de dados.
5. A conexão resllita11te possui várias tabeJas, visualizações e procedi1nentos armazenados.
Abra a pasta Tables e dê u1n clique duplo na pasta Employees. Uma novajanela deve
ser aberta, rnostrando a lista de funcionários da empresa North\.vind. Ta1nbé1n deve
ser possível dar un1 clique em outras tabelas para abri-las e visualizar os dados nelas ar-
1nazenados.
Faça
1
Não faça nenhuma alteração no banco de da-
dos agora. Se você alterar esse banco de da-
dos, outros exemplos ou aplicativos podem
não funcionar. Apenas examine as informa-
ções por enquanto. Se quiser tentar fazer alte-
rações em um banco de dados, crie um para
teste.
Visualizando os Serviços
Exatamente co1no as opções do Data Con11ections, os serviços do Server Explorer variam, de-
pendendo do que estiver instalado e e1n execução no co1nputador. Alguns dos itens do Server
Explorer estão descritos na Tabela 13.3. Esses são os que estão disponíveis enquanto escrevia
este texto; 1nuitos outros poderão ser disponibilizados posteriormente.
Serviço Descrição
Registro de eventos
Fornece acesso aos arquivos de registro dos aplicativos (Applica-
(Event Log)
tion), da segurança (Security) e do sistema (System) do Windows
NT ou do 2000. Esses arquivos de registro contêm erros e outras in-
formações sobre os aplicativos que estão em execução no computa-
dor. Isso proporciona a mesma funcionalidade do aplicativo Event
Viewer, sem que seja necessário sair do IDE do Visual Basic .NET.
Módulos carregados Fornece uma lista de todas as DLLs carregadas na memória e dos
(Loaded Modules) 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 específica está carregada na memó·
ria e, caso esteja, se está sendo usada por um aplicativo.
Dados de gerenciamento Permite ao servidor acessar o W indows Management lnformation
(Management Data) (WMI). O WMI é um meio de consul tar informações em um com·
putador. Essas informações variam de valores simples, como a
CPU ou o sistema operacional instalado, a programas em execu·
ção, e são precisas como as configurações das impressoras insta·
ladas. O WMI é uma ferramenta poderosa e melhor quando usada
para recuperar informações, e não para alterá-las.
Contadores de desempe- Concede acesso a dados sobre o desempenho do computador. O
nho (Performance Windows NT e o Windows 2000 registram constantemente infor-
Counters) mações quando você executa seus programas. Aí estão incluídas
informações sobre o tempo necessário para executar tarefas, a
memória utilizada e muito mais. Podem ser acessados para avaliar
a utilização da CPU, a memória e assim por diante.
Processos (Processes) Fornece uma lista de todos os aplicativos em execução. Você
pode se surpreender ao ver quantos programas são processados
em seu computador.
Serviços (Services) Mostra uma lista dos serviços em execução no computador.
Esses são os aplicativos processados em segundo plano. Um óti·
mo recurso é que você pode usar essa seção para iniciar ou encer·
rar os serviços (dependendo da segurança).
Bancos de dados do SQL Fornece mais uma maneira (a seção Data Connections é a outra)
Server (SQL Server de acessar os bancos de dados do SQL Server. Disponibiliza infor·
Databases) mações semelhantes à Data Connections (no entanto, só sobre os
bancos de dados do SQL Server).
Serviços da Web Fornece uma lista dos serviços da Web instalados no computador
(Web Services) (para obter mais detalhes, veja o Dia 2 1, "Criando Serviços da
Web com o Visual Basic .NET).
Filas de mensagens Fornece uma lista das fi las de mensagens disponíveis. Elas são
(Message Queues) usadas quando são criados aplicativos com base em mensagens
(porém não se aplicam a aplicativos de correio eletrônico).
1366 Dia 13
X
FIGURA 13.7
To<OMt<:t to o new if:f'Vtt, enkr lhe compute, rw.nt:, ot D>
adcl1ess b!bw:
Adicionando outro
servidor.
Você pode usar esse recurso para se conectar aos servidores com os quais trabalha. Por exen1plo,
muitos desenvolvedores precisam acessar um servidor de banco de dados, um de teste, e possi-
velmente um servidor Web quando desenvolvem urn progra1na. O Server Explorer permitiria a
conexão co1n todos os três quando fosse preciso 1nonitorar e/ou empregar os serviços.
necessário escrever (con10 você viu no Dia 11 , "Introdução aos Bancos de Dados'', e no Dia 12,
"Acessando Dados com a Plataforma .NET") o 1nesmo tipo de código para recuperar informa-
ções e exibi-las para o usuário. Por que perder tempo co1n isso, se seu computador pode fazê-lo
para você?
Criaremos um aplicativo si1nples para visualizar os dados de uma tabela ern urn banco de dados.
Usarei o banco de dados Northwind; você pode escolher qualquer banco de dados co1n o qual te-
nha uma conexão de sua máquina.
Depois que tiver uma conexão válida com um banco de dados no Server Explorer, crie um novo
projeto de aplicativo Windows. O 1neu se chan1a DataView; você pode usar esse norne (não está
patenteado ou algo se1nelhante) ou escolher outro. Depois de criar o projeto, exclua o formulário
original dando u1n clique corno botão direito do rnouse sobre ele no Solution Explorer e selecio-
nando Delete. Aceite o aviso. A seguir, dê um clique com o botão direito do n1ouse no projeto e
selecione Add e Add Windows Form. No1neie o fonnulário resultante como Customers. Dê um
clique com o botão direito do mouse no projeto pela últi1na vez e selecione Properties. Configure
o objeto de inicialização (Startup object) co,no Custo,ners e selecione OK.
Como sempre, a pri,neira etapa na construção de urn aplicativo do Visual Basic .NET é adicionar
os controles ao formulário. En1 nosso caso, terernos uma interface co,n o usuário sirnples - nada
a não ser u1na grade. Selecione o controle DataGri d na caixa de ferTamentas e adicione-o a seu
formulário. Configure as propriedades co,no rnostra a Tabela 13 .4.
Você tambétn pode querer usar o recurso AutoForrnat (ou configurar manualmente os valores)
para fazer co,n que a grade fique com u1na boa aparência.
A seguir, quere1nos adicionar o código para o acesso aos dados. E1n vez de fazê-lo rnanualmente,
no entanto, usaretnos o Server Explorer. Selecione uma tabela e1n seu banco de dados (escolhi a
tabela Custotners de North'vvind), arraste-a do Server Explorer e solte-a no forrnulário. Dois ob-
jetos novos aparecerão no formulário - 01 eDbConnecti onl e 01 eDbDataAdapterl (veja a Figura
13.8).
O objeto 01 eDbConnect i onl é, como você já deve ter adivinhado, a conexão com o banco de da-
dos. O objeto 01 eDbDataAdapterl é o componente que extrai (e salva) as infonnações do banco
de dados. Altere o nome dos controles confonne ,nostra a Tabela 13.5.
368 Dia 13
Agora vem a parte divertida. Dê u1n clique con1 o botão direito do mouse no adaptador de dados
cmdCustomers e selecione Generate DataSet; configure o no1ne co1no CustomerSet e marque a cai-
xa que adiciona uma instância ao projeto (veja a Figura 13.9). Você deve ouvir mais alguns ruí-
dos no disco rígido e um novo dataset CustomerSetl será adicionado à janela (veja a Figura
13.10). Altere o no,ne para dsCustomers.
FIGURA 13.8 fllt Cd• »tw ~•Jt<t ~ ~ Oi'> 'lrffl>' l°"' 11."dow titio
Objetos de conexão ;,i} • llJ • ~ li! Cjl I j IQ P., • C• .:- • i;. • Delx.ç
MWJbié·h'.Y4 - ~ -- -
FIGURA 13.9
Gcr-.cntc • Olmd ct.ti ~ IN: ~iod t.tt.b.
Adicionando o °'°"'* • dtt,;,m
r. - Jêu,"""'Sc:
Usando o Server Explorar
• (1 X
FIGURA 13.10 i;i. [dtl.'ie'A I>"" Q<!>uo
8'0l0<t °'" '"""' Ioc1$ ll.- ~
O DataSet f,il • ~•~ " C, 1, (ll, f'\ <") • e-, • ~ • q > o.buo • 1*) ~mTHt
'ft 1. ! .li - 10 fil <l< ~ :!': •• .~ ::-: ~: e: 9g ~ '!11, .
adicionado. --- <.
St.thge C~tomcrs.vb (DffiQnJ- 1 X
•
< Cu~omus
_,
~ <il] El'0 T"*IA<t
lj
• li X
FIGURA 13.11 f/.e fdt ~ f,0-)'Ct ~ ~ Olo~ F~ t ~ ~ ti*
Conectando o DataSet 1$1 • \l:t • ~ " " " 1 e. . . . . . . ç . r.. • °""'" . il!Jl 6...r..,
ao DataGri d. I fl!> -~ "'' -, <li = '.';! f.!· 9 ffi <>ll< ~ ~ ~ f *; ê) õ: ~ ~ l:S. '- •
':'.:i Stwti>'99! C1nton1tts..vti (DHtgnJ• I <. X
~ D O
Ir
D B
!
t
li
5
•I ' .!..I i
••
CôotGO Agora ve,n a parte trabalhosa - ainda precisaremos escrever um código. Localize o
procedimento Forrn- Load e atual ize-o para que preencha o DataSet como 1nostrado
.
na Listagem 13.1 .
370 Dia 13
ANÁLISE O procedimento Form_ Load será padrão para os aplicativos Windo"vs, com a adição
da linha 3. Ela chan1a o 1nétodo Fi 11 do adaptador de dados cmdCus tomers. O Data-
Set dsCustomers foi criado quando selecionamos Generate DataSet. Em outras palavras, em vez
de termos de digitar o que precisávamos nessa linha, foi tudo gerado para nós. Construa e execute
seu progra1na. Se tudo funcionar, ele deve ter a aparência da Figura 13.12.
FIGURA 13.12
Executando o
Obere Str. 57 Serlll Afreds Futterk !<tlrb A.nd,e:r~ Sales Repreze Gemany
aplicativo DataView. Avó>.debCoMêxt<,O.F, Atl>Trujl>E ANT~llo °"1le< Mexlco AAA'm
,_..u,d<,o, 23 l'hlcoO.F. WONO M:ten .Ar.tot1b Mortn o...ne, M!x:lc:o ANTON
120 H!U'l()'Vet len®n •rourd tJoc Ho Thonas Han!v sales R«>re<e UK AROUT (171) S5S
&:rvwsviocn Luki &:tçlmds $1\0 Ct..rism:J 6erç1 Order Adninls Swcdcn BERGS 09'21•12 1
~~tr. 57 ll'õ!W'lei'A ebue:r See Oel Ho.Ml M:,o,s Soles Reprt'~ G--J't'l'O,w BlAUS 0621-069
24, ~e ~b Strasb:u9 Eb'ê-tl pê:re e Frêdê~ue Ci: 1'1!fketi,g Vil France BLONP 88.60. 15.
C/ Ar>qul\ 67 M:ldril SôldoO)ri'Q V«:Í\SOmrc Ownc:t Sp.)I'\ eouo (91) sss !
12, ruêde.s&> 1-brsele &:.e, app' IAuranc.? Lebl Or,ne, France BONA? 91.24.4$.
23 Tsawau en Tsawassen
Cento 33J
Kãl~G"".r. 29 Be.m
60ttom-Dolar El:ab:th une AcCCM"ltt'IC Ma canada
S's eeve~....s Vct~ ~ Seles R.@r,e$e uc:
Boe.nos.Aus c..ctus Cotrid Potri:x> Sin1» Sales Age,,! AtV<nLino
cemro COl1'ICfC F~~ oCh3 M:irt.ctr9 11:i Mc:xi:o
ChG~ Chi Yang Warq Ô'M'let Sw.tzerlar.:i
-
BOTIM
CACIU
CEIITC
CHOPS
{60'!)
Covil
(5) SSS-7
(nul)
sss
(! ) 135-4
Av. ~ LLtSbd São Pa,.t, Corn,!rcio~ PedroAf~ SilesA.ssoctu er.un COJ,IM (r<11)
SM'.eloy G><d u,ndon C"""'6datod El:t>both Bro Se~, R....... UK co= {171) 555
wa~·.,eo 21 i:..ac.hen Droch<r.bu O Sv<nOttleb O<der Ad"""' Gem"4ny ORACO 02-11-059
67. rue desCi t-t-mtes C)J rrcnóc ent l4N'lC l,3bn.l, ~.nc, Fr~nce OUl'IJI< '40,67.89.
JS llilg Gc<><9 l<lndon E.,:;tcm Come AM Oevon 5-'b A~t U< EASTC (171) sss
~ asse 6 Graz Ernst H:lndel Roond Mendei Sales Manager Ausm3 ERNSH 7675·31i2
lw> O<é<, 92 ~ Po,Jo F•ml> Arqub Aro e"" M><i<etr.Q ....1 !lrci FAMlA Covil
C/ '""""'""' Madrkl
flSSA Fabrica DegoRo,I A<:<OU'IU1Q Ma Spah
= ~9!) Sif1
• 0 X
FIGURA 13.13
O PerfLite e,n ação.
~ 1
• 1
.....e
Crie u1.n novo aplicativo Windows. Chame o novo projeto de PerfLite porque ele será u1na ver-
são mais enxuta (ou 'Lite' na Iinguagem de marketing) do aplicativo Performance Monitor que
ven1 co1n o Windo~1s NT e o WindO\.VS2000. Quando o projeto estiver pronto, feche o forrnulá-
rio-padrão e reno1neie-o como f rmMai n. vb. A seguir, dê um clique co1n o botão direito do mouse
no arquivo e selecione Vie\.v Code. Altere todas as referências a Fonnl para frmMa i n. Usar oco-
1nando Replace ajudará (lembre-se de selecionar Search Hidden Text). Para concluir, dê un1 cli-
que corno botão direito do mouse sobre o projeto no Solution Explorer, selecione Prope1ties e
altere o Startup Object no formulário resultante para fnnMain (veja a Figura 13.14).
X
FIGURA 13.14
Propriedades de
9 e ~ FY«ierlles
l'e1:flite. ~ ..,...,., P«rutt
!Md
J;IJiput tvl><: ~IM~d,jtct:
tmports
Rêf~~?alh 1,,..,•.,_,..,. .:l '""(tm<--.-,,,-------3-,
.
S1ron;r~t &oo:nllrDC:~:
De!i~e' Def.sJ~
,::i ccn6;u'a!Son?r0$)1:'t't'e
tnfotmotion
A'*<t f-older: C:\,,içd:'OaylJ"f'crl\l.te\
Pl'o;«:1 &e: Per~.WP,OJ
CNtout~: Pe'ft.kt.tXt
OK
Propriedade Valor
Text PerfLite
Size 480 , 360
Exibiremos algumas infonnações sobre o desen1penJ10 desenhando-as e1n u1n painel. Além dis-
so, temos de controlar a velocidade da exibição. Adicione os controles da Tabela 13.7 e confi gu-
re suas propriedades coino rnostrado na tabela.
1. Abra o Server Explorer e selecione um servidor (pode ser seu próprio con1putador).
2. Abra a seção Perfonnance Counters.
3. Role para baixo até encontrar o item Processor e abra-o.
4. Abra o ite1n % Processor Time e selecione o item Total.
5. Arraste esse item sobre o formulário e solte-o sobre ele. U1n itetn chamado Performance-
Counterl deve ficar visível etn uma nova seção abaixo do formulário (veja a Figura
13. 15).
.. .. .. . .··········· . . . . .. .. . .
. .. .. .. .. . . .. .. . ..................... . ...............
. . .... .
····t
illill' ...
. . . . . . . .. . . . . . . . . . . . . . . . . .' ...... . qwrk
....... .. .. .. .. . . ..' ......... .. .... .................... ... ...... ... .. .. . ................... ..... .... .. ................ ...... ... . . ...
. . . . .
. ..
' f~Ô'4'\C.°">!Te
.
. .. .
'«.~ Trut
. ..
_
_____
.......... . ..................
~
__.1:::::::
.. . .... ::::::
. ......:::
'
:: :....
.... : a,u. ...
.
.,.__...........
.
... .. -.. -
.
:::::::::::::: ::: :::::::.
.............. ..... ... .
..
.
. .
.. .
'
. ...
..- -····-·- .
. .
'
,
.
.
........ ....
'
.
.. . ..
l
,
.- . . . ' : : : : • : : : : : : : . : : . PIOC n4 ; : : : : : . : : : : : : : : . . : . ; :
. . .. .. . . ·~· ~-- •
C.t~ryl\llmc
C.ttgOJy ~ d the PCffom-arc~
r"""'"""""-
.~~~~~10~1;-----------' .~- ,o°"'""'""' I
~{a,~íl l iR~i~~l~6=..._=
,....,)s.-...t
1-lá outra maneira de adicionar un1 itetn do Server Explorer a seu aplicativo. Localize o contador
de dese1npenho Syste1n\Processes. Observe que ele não possui nenhum itetn, co1no _Total e1n %
Processor Time. Dê u1n clique com o botão direito do 1nouse no contador Processes e selecione
Add to Designer. Etn seguida, você deve ver outro objeto Performance Counter adicionado pró-
. . .
xJJno ao pr11ne1ro.
Para concluir a inserção de nossos contadores de desen1penho, selecione e adicione o contador
de dese1npenho Memory\Co1n1nited Bytes.
Renomeie os três contadores de desempenho como prfCPU, prf Procs e prfMem.
Além dos contadores de dese1npenho, também podemos adicionar objetos que tornem o acesso
aos dados 1nuito 1nais fáci l do que já possa ter sido. Abra a seção Event Logs do Server Explorer
e selecione Application. Arraste o item Application para o formulário ou dê u.1n clique com o bo-
tão direito do mouse e selecione Add To Designer (o que preferir). U1n novo item deve aparecer
374 Dia 13
próxi1no aos três contadores de desempenho. Configure as propriedades desse novo objeto con-
for1ne descrito na Tabela 13.8. O fonn ulário final deve se parecer co1n o mostrado na Figura
13 .16.
Agora que a interface com o usuário está pronta, é hora de co1neçarmos a adicionar a codificação
para fazer nosso progra1na executar algo. Nesse aplicativo, adicionare1nos um código para três
dos controles e um procedimento para auxi liar. O resultado final 1nostrará uma linha deli1nitado-
ra se movendo pela extensão do painel, con1 três linhas coloridas aco1npanhando-a atrás (veja a
Figura 13 .17).
Para que a linha delimitadora seja exibida periodica1nente, usaremos o evento Timer do controle
de mes1no nome. O código está na Listagem 13.2.
Usando o Server Explorar
FIGURA 13.17
O exen1plo sendo
executado.
...................
ANÁLISE O código desse procedimento tem como sua preocupação básica duas finalidades:
converter os valores dos contadores de desempenho em variáveis con1 o tipo de dado
simples e atualizar os controles Label. As li_nbas 3 a 5 recupera,n os valores de cada contador de
desempenho. Observe que estan,os atribuindo os valores ãs variáveis enquanto as cria,nos. Em
seguida, passamos esses valores para a rotina DrawSweep (linha 7 - veja a Listagem 13.3) para a
exibição. Para concluir, cada valor é fonnatado e exibido em cada um dos controles Labe l (linhas
9 a 11). Dois itens que parece1n estranhos são as chamadas ToS t r i ng nas linhas 9 e 11. O método
ToStri ng permite que um formato opcional seja aplicado quando o número é convertido em urna
string. A linha 9 formata o valor como u1n percentual, enquanto a linha 11 o fonnata con10 un1 nú-
mero co1n tuna quantidade fixa de casas decimais, e essa quantidade igual a O.
ANALISE Con10 você já deve ter deduzido, essa rotina é o ponto central do aplicativo. Não se
assuste com a extensão ou as chamadas gráficas - é uma rotina ben1 simples.
Começamos recuperando o objeto Graphics do controle Panel (linha 16). Todas os elementos
gráficos do Visual Basic .NET são criados en1 u1n objeto Graphi cs. Qualquer controle que possa
ser desenhado (co,no os controles Image e Panel ou os fonn ulários) expõe esse objeto Graphi cs
Usando o Server Explorer
com tun método CreateGraphi cs. Por sua. vez, ele expõe outros objetos e 1nétodos (e ta1nbé1n o
controle do contêiner) para que se possa desenhar nele.
Antes de discutirmos o código propriamente dito, iremos determinar o que se pretende fazer. O
resultado final será u1na linha vertical que se move (horizontalmente) pela extensão do fonnulá-
rio. Enquanto se inove, ela é seguida por três linhas coloridas, cada u1na representando urn dos
três contadores de desernpenho. Quando a linha (delimitadora) vertical chegar ao limite do for-
rnulário, deverá ser iniciada 1nais uma vez no lado esquerdo dele, sendo esse Iimpo para a nova
exibição. No fim devere1nos ter algo parecido com o monitor das batidas de u1n coração (se1n o
ruído ' ping'). Portanto, precisa.reinos de u1n código para desenhar a linha vertical (e movê-la
pela extensão do fonnulário) e as três linhas de desempenho.
Para 1nover a linha delilnitadora, precisa1nos desenhar uma outra linJ1a (com a cor do plano de
fundo) para apagar a anterior, passar um pouco para cima e iniciar uma nova exibição. Na Lista-
gem 13 .3, a linha 23 do código apaga a JinJ1a que já havia sido exibida, e uma nova é iniciada e
movida das linhas 25 a 41. A razão pela qual isso se torna tão extenso é que tan1 bé1n precisamos
testar se estaremos movendo a linha em direção ao lado direito do formulário. Se isso estiver
ocorrendo (a instrução If na linha42), li1nparemos o formulário e voltare1nos ao lado esquerdo
para co1neçar u1na nova exibição.
As linhas do contador de desen1penho també1n são desenhadas nessa rotina. A diferença existen-
te nessas chamadas é que ta1nbén1 precisa1nos detenninar onde desenhar a linha e lembrar do va-
lor anterior para que possamos conectar a linha nova ajá exibida. Usando o prirneiro contador de
desempenho cotno exemplo (linhas 25 a 28), isso se resutne a três etapas:
1. Decida qual deve ser o novo valor de Y (a altura) para a nova linha. A linha 25 faz isso
para. o contador da CPU determinando que percentual da altura total será ocupado pelo
valor referente à CPU (Je1nbre-se, o contador da CPU é u1n. percentual).
2. Desenhe a linha, conectando a anterior à recém-criada. As linJ1as 26 e 27 fazem isso de-
senhando u1na linha cotn a cor definida para a CPU co1n base nos valores anteriores de X
e Y para iniciar os novos. O novo valor de X é detern1inado pelo incremento (15 unida-
des) do valor anterior, enquanto o novo valor de Y foi calculado na etapa 1.
3. Armazene o valor recétn-calculado de Y para que seja empregado no próxi1no laço (linha
28). Ele será usado na criação de u1na nova linha.
As rotinas para o desenho das linhas dos outros dois contadores de desen1penho (linhas 29 a 35 e
36 a 39) são setnelhantes - diferindo apenas na maneira como o novo valor de Y é calculado.
ANÁLISE A finalidade dessa rotina é permitir que o usuário inicie e interrompa a exibição. Por-
tanto, ela é relativarnente simples. Com base no texto do botão, alternaremos entre
ele e nosso tin1er. Isto é, se o titner estiver ativado, o interromperemos. Se não estiver, o ativare-
mos. Poderíamos usar outra variável para registrar esse status, tnas, em vez disso, e1npregare1nos
o texto do botão. Se a propriedade Text dele for igual a &Start (o valor inicial), iniciaremos o ti-
mer e alteraremos Text para &Stop (observe que os dois valores possuem a mesma chave de aces-
so, a letra S). Con10 alternativa, interro1npere1nos o tin1er e configurare,nos o texto de volta con1
&Start.
A seguir, precisamos permitir que o usuário altere a velocidade da linha deli1nitadora. fsso é feito
na Listage1n 13.5.
ANALISE O código para configurar a velocidade é betn básico. As linhas 64 e 65 apenas se cer-
tificam de que o valor que usamos (a configuração an,al para a velocidade) tenha
sido um inteiro. Ern seguida, utiliza,nos a velocidade para ajustar o intervalo definido para o tirner
(linha 67). Intervalos 1nenores significa1n que a linha delimitadora será exib.ida ,nais rapida1nente.
Para concluir, há algumas variáveis de que precisareinos em todo o aplicativo . .Elas artnazenarão
as coordenadas atuais X e Y, usadas quando desenhar1nos, e as canetas e1npregadas na criação
das linhas. Adicione o código da Listagem 13.6 ao formulário, exatamente abaixo da região mar-
cada como código gerado pelo Windows Fonn Designer e antes de qualquer outro trecho de seu
código.
Usando o Server Explorar 379
ANÁLISE As variáveis das linhas 69 a 74 são usadas para armazenar as posições atuais da cane-
ta quando não estiveren1 desenhando as linhas. U1na variável annazena a posição
atual de X, e as outras as posições atuais de Y para cada contador de dese,npenho. As canetas são
empregadas no desenho de cada linha de desempenho e da linha delin1itadora. Por fim, a constan-
te da linha 82 é utilizada para registrar o espaço definido para o avanço da lin11a delin1itadora en-
quanto ela se move pelo formulário.
Depois que o código estiver estruturado, co1npile o programa e execute-o. Dê um clique no botão
Start, e observe por alguns segundos. Você co,neçará a ver a ba1Ta deiin1itadora se mover da es-
querda para a direita no formulário, sendo seguida por três linhas - u,na para a CPU (percentual
de util ização), outra para os processos (progra,nas e,n execução) e ,nais tnna para a 1ne1nória (e,n
uso). O texto no botão deve alterar-se para Stop. Altere a barra de registro (configure-a co,no
maior ou menor) para observar co1no ela afeta a exibição; tente dar un1 clique no botão Stop para
ver se ele se altera nova1nente para Start. Você pode tentar adicionar alguns outros contadores à
exibição con10 u1n exercício.
Resumo
Os sisternas operacionais mais modernos como o Windo\vs possuen1 vários serviços. Esses ser-
viços fornecem recursos que se estendem ao sistema operacional, adicionando funcionalidades,
co1no bancos de dados ou registros, que enriquece,n as capacidades centrais. O Server Explorer
per1nite que você visualize ou altere o estado desses serviços em seu próprio co1nputador de de-
senvolvirnento ou ern outros sem ter de sair cio IDE do Visual Basic .NET. Além disso, ele si1n-
plifi ca o desenvolvimento de códigos que usern muitos dos serviços disponíveis.
1380 Dia 13
Na próxima lição, co1neçare1nos nossa saga na descoberta da verdadeira natureza orientada a ob-
jetos do Visual Basic .NET aprendendo o que significa ser ' realmente' orientado a objetos.
P&R
P Tenho alguns itens em meu Server Explorer que não foram mencionados (ou não
tenho alguns que foram mencionados). O que são eles?
R E' possível que outras empresas criem co1nponentes para 'associar' ao Server Explorer.
Isso permitiria ao desenvolvedor trabalhar com esses serviços diretatnente, tal como se
pode fazer co1n os serviços co1nuns. Por outro lado, se o servidor com o qual você seco-
nectar não fornecer u1n detenninado serviço, ele poderá não aparecer na lista.
P Se os dados do Server Explorer forem alterados, isso alterará o banco de dados?
R Sim, por favor, tenha cuidado.
Workshop
O Workshop foi planejado para aj udá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e1n co1no colocar seu conhecitnento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Cite duas seções do Server Explorer que inforn1aria1n a você que progratnas estão en1
execução em seu computador.
2. O que é um serviço?
3. O que seria exibido se o código a seguir fosse adicionado a llln programa e executado?
Dim prfCPU As New PerformanceCounter("processor",_
''%Processar Time'', ''_total'')
Console.Writeline(prfCPU.NextValue())
Exercícios
1. Use o Data Connections para se conectar a um banco de dados disponível e pesquisar as
tabelas e outros itens cujo acesso for concedido (lembre-se de não fazer nenh u1na altera-
ção, a menos que você realmente precise).
2. Pesql1ise o Server Explorer para descobrir o que está disponível en1 seu co1nputador, as-
sim con10 os servidores que você costuma usar para desenvolvimento.
SEMANA 2
DIA
Introdução à Programação
Orientada a Objetos
Na versão .NET, o Visual Basic foi reescrito a partir do zero. Uma das principais razões disso foi
para adicionar recursos orientados a objetos profu11da1nente integrados. Esta lição abordará:
• U1na visão geral da programação orientada a objetos (POO).
• Conceitos impo1tantes da POO.
• Co1no incorporar a POO nos siste1nas de sua autoria.
Além desses tópicos, no final da lição, você aprenderá técnicas da POO para ajudá-lo a construir
aplicativos.
Na essência da POO está o conceito de objeto, um bloco da programação que combina infonna-
ções específicas e u1n conjunto de co1npo1ta1nentos relacionados. Na POO, os cenários são con-
siderados en1 ter1nos desses objetos en1 vez da abordagem linear passo a passo que era (e ainda é)
usada na 1naioria dos prograrnas de co1nputador. Os objetos e1n geral são empregados para des-
crever entidades, que podem ser reais (um veículo) ou abstratas (um vôo reservado em un1a com-
panhia aérea nacional). Essas entidades possue1n atributos, como a cor do veículo ou a data de
saída do vôo, que descreve1n. o objeto. Esses objetos tarnbém apresentatn certas ações que po-
dem ser executadas neles, co1no ' Vender' para o carro e 'Cancelar' para o vôo. Na POO, as enti-
dades se torna1n objetos, os atributos são conhecidos como propriedades (que você pode
configurar ou recuperar) e as ações são chamadas de 1nétodos.
Novo TERMO Um objeto é u1na representação de uma entidade real ou abstrata junto às proprieda-
des dessa entidade e as ações relacionadas a ela que podem ser executadas.
E1n código, as duas abordagens ta1nbé1n são diferentes. Considere os dois blocos de código 1nos-
trados nas Listagens 14.1 e 14.2, que poderiam ser executados em um formulário Windov.1s ou
da Web para calcular os pagamentos da hipoteca.
A Listage1n 14.2 cria tnna instância do objeto Mortgage (hipoteca) para fazer seus cálculos, 1nas
as operações matemáticas subjacentes são as mesrnas. É bo,n ressaltar que já que o objeto Mort-
gage ainda não foi definido, você não poderá executar o código da Listagem 14.2. Embora um
resultado final semelhante pudesse ser obtido se escrevêsse1nos un1a função com o código pro-
cedural, coino Cal cul ateMortgagePayment ( ), isso ainda não seria tuna POO. Só com o uso do
objeto Mortgage, que cornbina as informações sobre a hipoteca com o código para processá-las,
estaremos realmente usando a POO.
Esse esti lo de progra,nação não é novo para você, se esteve aco1npanhando a prin1eira metade
deste livro; quase tudo no Visual Basic .NET é construído dessa maneira. Considere o código
usado para trabalhar co1n controles em u1n forinulário Windows: txtPayment. Text = l bl Re-
sul t. Text. Os dois controles são objetos, com uma propriedade Text, exatamente como o objeto
Mortgage do exemplo anterior. E1npregar os objetos fornecidos pelo Visual Basic .NET e pelo
.NET Fra1ne\.vork não fará co1n que seu código seja orientado a objetos, e,nbora 1nuitas pessoas
possan1 lhe dizer que sitn. É possível utilizar os objetos e ainda prograinar com u,n estilo proce-
dural passo a passo.
A instrução Pub li e Cl ass myFi rs tCl ass (linha 8) define uma classe nova; tun projeto para os ob-
jetos. A linha 3 cria tuna variável do tipo myFi rs tCl ass, que pode conter uma instância de
myFi rstCl ass. A linha4 gera uma nova instância demyFi rstCl ass (criando um objeto) e a atribui
a variável x. Agora x se refere a tuna instância da classe myFi rstCl ass. Outro exemplo do uso de
objetos é 1nostrado na Listagem 14.4.
Na Listage,n 14.4, duas variáveis do tipo myFi rs tCl ass são declaradas (nas linhas 3 e 4) e, e1n se-
guida, duas novas instâncias de myFi rstCl ass são criadas (linJ1as 5 e 6). Cada instância é referen-
ciada por u1na variável. A variável x contétn uma referência a um objeto diferente de y, mas os
dois objetos são instâncias de myFi rs tCl ass . Esse conceito, instâncias co,nparadas a variáveis,
será exa,ninado mais u,na vez e1n outro exemplo na Listagem 14.5.
A Listage1n 14.5 torna tudo um pouco mais confuso. Agora duas variáveis forarn declaradas,
ambas podendo se referir a uma instância da classe myFi rstCl ass. Em seguida, uma nova instân-
cia dessa classe é criada (por 1neio da palavra-chave New) e u,na referência ao novo objeto é inse-
rida etn x. A seguir, y é atribuída a x, e o resultado é que y agora contém tnna referência à mesma
instância de myFi rs tCl ass que x referencia. Só há um objeto e, portanto, uma área da memória,
,nas duas variáveis que se referen, (ou apontam) a ele. fsso será demonstrado na próxin,a seção
quando você aprender as propriedades.
Introdução à Programação Orientada a Objetos 387
Propriedades
As classes poden1 definir as propriedades que cada instância delas deve ter. A propriedade é u,n valor
que existe como pa1te de um objeto, e você pode recuperar ou configurá-la por meio desse objeto.
A Listagem 14.6 adiciona uma propriedade à definição de myFi rstCl ass por uma variável pública.
Essa não é a única maneira de adicionar uma propriedade, mas abordaremos os outros métodos no
Dia 15.
Como antes, duas variáveis são declaradas, x e y, duas novas instcmcias de myFi rs tCl ass são criadas,
e são inseridas referências nas duas variáveis. A seguir, nas lin.has 7 e 8, um valor é inserido na
propriedade Name de cada instância de myFi rs tCl ass, e essa propriedade é acessada por ,neio das
variáveis que fazem referência ao objeto. As instruções Conso 1e. Wri tel i ne (linhas 9 e 1O) pro-
duze1n a saída a seguir:
x.Name = Fred
y.Name = Joe
Cada instância de luna classe possui sua própria parte na me1nória associada a ela e, portanto, os
valores da propriedade são ar,nazenados il1dependenten1ente co1n cada instância. Retornando à
analogia da casa, todas as instâncias de uma casa são criadas do mes1no projeto, mas cada uma
pode ser pintada de uma cor diferente. A cor da casa é u1na propriedade, e seu valor não é deter-
minado pelo projeto; é um atributo de cada instância. A Listage1n 14.7 deve ajudar a ilustrar
como as propriedades estão associadas a uma instância individual de u1na classe.
1 388 Dia 14
A única diferença entre as Listagens 14.7 e 14.6 está na linha 6, em que é atribuída à variável y
uma referência à x e1n vez de a uma nova instância demyFi rstCl ass. Essa diferença significa que
nas I inJ1as 7 e 8, o código trabalha com a propriedade Name da mesma instância, e a saída dessa ro-
tina será
x.Name = Joe
y.Name = Joe
As duas instruções 11ri tel i ne produzem o 1nes1no valor para a propriedade porque tanto x quan-
to y se referem à 1nes1na instância do objeto. Esse conceito específico, e1n que 111últiplas variá-
veis se referem ao 1nesn10 objeto, é outro tópico itnportante, porém confuso. Verifique a seção
6.1 do Visual Basic Language Specification (parte da docu1nentação da platafor1na .NET; pes-
quise em "Tipos de Valores e Tipos de Referência" para encontrá-la) para obter mais detalhes.
Na platafonna .NET, as propriedades podetn ser apenas de leitura, apenas de gravação ou de lei-
tura/gravação, permitindo a existência de um controle sobre como esses valores são acessados.
Você aprenderá a controlar o acesso às propriedades de suas próprias classes no Dia 15.
Métodos
Além das propriedades, as classes ta1nbém podem ter comportamentos ou ações associados a
elas. Conhecidas co1no ,nétodos, essas ações permite1n que u1na classe possua algu,na lógica in-
corporada além das infonnações que são armazenadas por suas propriedades. Uma casa não é o
melhor exe1nplo quando se quer falar sobre 1nétodos, mas u1na classe casa criada para ser usada
por u1n apl icativo de u1na imobiliária pode possuir métodos que listem a casa na Web (myHou-
se. Li s t ( )), venda1n a casa (myHouse. Se 11 ( ) ) ou até exibam un1a propaganda (myHouse. Pri nt-
Brochure ("Printerl")). Esses tnétodos são exatamente como qualquer outro proceditnento;
eles podem aceitar parâtnetros quando você os chama e retornar valores tan1bé1n.
Introdução à Programação Orientada a Objetos 389
Na Listagem 14.8, u,n 1nétodo (DoSomethi ng) foi adicionado a myFi rstCl ass por meio de um
procedimento Pub li c (Sub) na definição da classe.
Em seguida, esse método poderia ser cha1nado de qualquer instância da classe. Exatamente
como com as propriedades, no entanto, o n1étodo é definido na classe, poré1n chamado na instân-
cia. Isso significa que se o método usar alguma das propriedades (privadas ou públicas) da clas-
se, então, estará. utilizando as informações annazenadas na instância en1 questão.
Herança
Um conceito essencial na POO, n1as que não era fácil de imple,nentar no Visual Basic antes da
versão .NET, é a herança.
Novo TERMO Herança é o conceito pelo qual você pode basear un1a classe em outra, em geral para
alterar ou adicionar algo nos recursos disponíveis da classe original.
Acabei de almoçar, po1tanto acho que deixarei de lado a analogia da casa e tentarei confundi-lo
com uma baseada em sanduíches. Considere o hambúrguer básico: dois pães co1n um pedaço de
carne colocado entre eles.
Quando o restaurante decide começar a vender cheeseburgers, ele não é criado do nada. O cozi-
nl1eiro é informado para 'fazer u1n ha1nbúrguer, poré1n adicionando u1na fatia.de queijo'. Assim,
uma nova classe de sanduíche é criada, o cheeseburger, que herda características da classe ham-
búrguer. Para estender essa analogia até que fiq uen1os saturados de sanduíches, o restaurante po-
deria agora decidir oferecer um hambúrguer de luxo, que herdasse características do
cheeseburger e incluísse alface e to1nate. E1n cada caso, a classe básica é usada como origern.
1 390 Dia 14
Novo TERMO Sobreposição é um tenno usado para indicar que luna classe-filha fornece sua pró-
pria i1nple1nentação de um recurso da classe básica, quando co,nparado à si1nples
adição de novos recursos.
No Dia 15, você aprenderá a criar seus próprios objetos no Visual Basic .NET usando a sobrepo-
sição, a herança e outros recursos, 1nas, por enquanto, fornecerei um exemplo silnples do en1pre-
go da herança na Listagem 14.9.
Como você pode ver, CodeSni ppet, que é derivada de Sni ppet, adiciona duas novas proprieda-
des. Quando for criada un1a nova instância da classe CodeSni ppet (li nha 5), ela terá as proprieda-
des das duas classes disponíveis.
Introdução à Program ação Orientada a Objetos 391
E1n geral, a classe nova precisa sobrepor algum recurso da classe básica, apenas porque a funcio-
nalidade básica não leva em consideração as alterações posteriores fe itas na classe. Considere
um método, chamado GetSni ppet ( ) que existe na classe Sni ppet e foi criado para retornar a
classe Snippet completa co1no un1a String, co1no mostrado naListage1n 14.10.
Essa função exibe apenas as duas propriedades da classe básica, portanto se você não as sobre-
puser à nova classe, suas duas novas propriedades não serão 1nanipuladas. A classe CodeSni ppet
da Listagem 14. 1 l 1nanipula isso sobrepondo a função GetSni ppet da classe básica.
L1STAGEM14.11 Sobreponha uma Função para Persona l izá-la a Fim de Que Manipu-
le os Novos Recursos de Sua Classe
1 Modul e AllAboutObjects
2 Public Sub Main()
3
4 Dim mySnippet As CodeSnippet
5 mySnippet = New CodeSnippet()
6
7 With mySnippet
8 . Cont ents - "txtEntry.Text - lbllnfo . Text"
9 .Author = "Joe"
10 . Language = "VB. NET"
11 . Purpose = ''Inserir o texto do titulo na ca1xa de texto''
12 End With
13 End Sub
14 End Module
15
16 Pub l ic Class Snippet
17 Public Contents As String
18 Pub li e Author As String
19 Public Overridable Function GetSnippet() As Stri ng
1 392 Dia 14
LISTAGEM 14.11 Sobreponha uma Função para Personal izá- la a Fim de Que Manipu-
le os Novos Recursos de Sua Classe (continuação)
20 Dim sTmp As String
21 sTmp = 11 Author: 11 &Author _
22 & System.Environment.Newline
23 & Contents
24 Return sTmp
25 End Function
26 End Class
27
28 Publi c Class CodeSnippet
29 lnherits 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. Env i ronment. Newl i ne &
37 11
Language: 11 & Language &_
38 System. Envi ronment.Newline &
39 "Purpose: 11 & Purpose
40 Return sTmp
41 End Function
42 End Class
Para que essa função seja sobreposta, ela deve ser 1narcada co,n Overri dab 1e na classe básica
(linha 19) e, em seguida, você precisa fornecer un1a nova imple1nentação na classe derivada
(1narcada cotn Overri des, linha 33). Para obter o resultado da função da classe básica co1no parte
da iJnplernentação dessa classe, a palavra-chave especial MyBase pode ser usada (linha 35) para
acessar as propriedades e métodos da classe básica. Outra palavra-chave especial, que não foi
ernpregada nesse exemplo, é Me. Ela se refere ao objeto atual, po1tanto Me. Name que foi utilizada
no procediinento GetSni ppet referia-se à propriedade Name da instância atual dessa classe.
U1n recurso útil da herança é que as classes que são derivadas de u1na classe básica específica
podem ser usadas como se fossem essa classe básica. As instâncias da nova classe podetn ser in-
seridas e1n variáveis que utilizem o tipo de dado da classe anterior e passadas como parâmetros
para os procedi1nentos que esperem o tipo de dado anterior, co1no 1nostra a Listagem 14.12.
LISTAGEM 14.12 Use uma Classe Herdada em Qualquer local Que Der Suporte a Sua
Classe Básica
1 Option Strict On
2 Option Explicit On
Introdução à Programação Orientada a Objetos 393
LISTAGEM 14.12 Use uma Classe Herdada em Qualquer Local Que Der Suporte a Sua
Classe Básica (continuação)
3
4 Module AllAboutObjects
5 Public Sub Main()
6
7 Dim mySnippet As CodeSnippet
8 mySnippet = New CodeSnippet()
9 With mySnippet
10 .Contents = "txtEntry.Text - lbl!nfo.Text"
11 .Author = ''Joe''
12 . Language = "VB.NET"
13 .Purpose = ''Inserir titulo do texto na caixa de texto''
14 End Wi th
15 PrintSnippet(mySnippet)
16 Console.Readline()
17 End Sub
18
19 Public Sub PrintSnippet(ByVal objSnippet As Snippet)
20 Console.Writeline(objSnippet.GetSnippet())
21 End Sub
22 End Module
Quando um objeto é passado co,no seu tipo básico, como na Iinl1a 15 da Listagem 14.12, as pro-
priedades e métodos adicionados pela classe herdada não ficam disponíveis. Portanto, objSni p-
pet. Language não seria cornpilada se você a inserisse na linha 20 já que ela não é uma
propriedade válida para a classe Sni ppet. Os 1nétodos sobrepostos fi ca,n disponíveis porque
existe,n na definição da classe básica, mas a implen1entação da classe derivada será chamada en1
vez da básica. A Listage,n 14.12 produziria o seguinte resultado:
Author: Joe
txtEntry .Text = lbllnfo.Text
Language: VB.NET
Purpose: Inserir texto do titulo na caixa de texto
Você aprenderá mais sobre a herança e a capacidade de tratar um objeto derivado como se fosse
sua classe básica, durante a próxi1na lição (Dia 15).
Construtores
Outro recurso novo orientado a objetos nesta versão do Visual Basic é a inclusão de construtores
para os objetos.
394 Dia 14
O construtor é un1a rotina chamada quando a instância de uma classe é gerada, e essa
Novo TERMO
pode especificar que parâ1netros fornecer na hora da criação. Esse conceito proporcio-
na uma maneira de inicializar seu objeto na hora da criação.
No Visual Basic .NET, o construtor é representado por u1n procedi1nento New na definição da
classe, e (exata,nente co1no qualquer procedin1ento) você pode ter a quantidade de versões so-
brepostas que quiser dele, fornecendo várias 1naneiras pelas quais o objeto pode ser criado. Na
Listage1n 14. 13, diversos construtores são adicionados às classes Sni ppet e CodeSni ppet, permi-
tindo que esses objetos seja1n inicializados de 1nuitas 1naneiras.
1 Option Strict On
2 Option Expli cit On
3
4 Module AllAboutObjects
5 Public Sub Main()
6 Dim mySnippet As CodeSnippet
7 mySnippet =_
8 New CodeSnippet("txtEntry.Text = lbllnfo . Text",_
9 ''Joe'' , ''VB.NET'', ''Inserir texto do titulo na caixa de texto'')
10 PrintSnippet(mySnippet)
11 Console.Readline()
12 End Sub
13 Public Sub PrintSnippet(ByVal objSnippet As Snippet)
14 Console.Writeli ne(objSnippet.GetSnippet())
15 End Sub
16 End Module
17
18 Public Class Snippet
19 Publ ic Contents As String
20 Publ ic Author As String
21
22 Public Sub New()
23
24 End Sub
25
26 Public Sub New(ByVal Contents As String)
27 Me.Contents = Contents
28 End Sub
29
30 Public Sub New(ByVal Contents As String,_
31 ByVal Author As String)
32 Me.Contents = Contents
33 Me.Author = Author
34 End Sub
Introdução à Programação Orientada a Objetos 395
35
36 Public Overridable Function GetSnippet() As String
37 Dim sTmp As String
38 sTmp = ''Author: '' &Author _
39 &System.Environment.Newline
40 &Contents
41 Return sTmp
42 End Function
43 End Class
44
45 Public Class CodeSnippet
46 Inherits Snippet
47 Public Language As String
48 Public Purpose As String
49
50 Public Sub New()
51 MyBase.New()
52 End Sub
53
54 Public Sub New(ByVal Contents As String)
55 MyBase.New(Contents)
56 End Sub
57
58 Public Sub New(ByVal Contents As String,_
59 ByVal Author As String)
60 Me.New(Contents)
61 Me.Author = Author
62 End Sub
63
64 Public Sub New(ByVal Contents As String,
65 ByVal Author As String,_
66 ByVal Language As String)
67 Me.New(Contents,Author)
68 Me.Language = Language
69 End Sub
70
71 Public Sub New(ByVal Contents As String,
72 ByVal Author As String,_
73 ByVal Language As String,
74 ByVal Purpose As String)
75 Me.New(Contents, Author, Language)
76 Me.Purpose = Purpose
77 End Sub
78
79 Public Overrides Function GetSnippet()As String
1396 Dia 14
84 System.Environment.Newline &
85 Purpose: & Purpose
11 11
86 Return sTmp
87 End Function
88 End Class
As linhas 22 a 34 são os construtores para a classe Sni ppet, e ilustram a 1naneira-padrão de inicia-
lizar u1n objeto. As linhas 50 a 77 são os construtores para a classe CodeSni ppet, e contê1n alguns
artif1cios em co,no a inicializam. Pri,neiro, você pode chan1ar o construtor da classe básica por
meio da palavra-chave MyBase (linhas 51 e 55), o que assegura que os códigos sejain executados
na rotina da classe básica e, em seguida, ta,nbém sejam processados para sua classe derivada. O
segundo artifício, en1pregado em todos os outros construtores, é chan1ar seus construtores n1ais
siinples dentre os mais co,nplexos. Utilizar esse estilo de codificação evita a repetição de códi-
gos; a inicialização genérica é inserida no primeiro construtor, e qualquer código adicional, re-
querido para a manipulação de cada parâmetro novo, pode ser incluído apenas no pri,neiro
construtor no qual todos os parân1etros novos aparece1n.
Cada etapa será abordada individualmente à medida que você perco1Ter o processo de descrição
de um jogo de vinte-e-urn usando objetos. Seria útil que você compreendesse esse jogo de cartas,
antes que lesse estas seções. Se não souber nada sobre ele, consulte as regras procurando "Black-
Jack" na Encarta (http://encarta.msn .com).
Identificando os Objetos
A primeira tarefa é descrever os requisitos de seu siste,na, que é rnuito 1nais trabalhoso do que
pode parecer. Nesse estágio, você precisa esboçar o siste1na, aplicativo ou componente proposto
com detalhes suficientes para deter1ninar toda as entidades principais. Un1 artifício que gosto de
usar para iniciar esse processo é en1pregar todos os substantivos que aparecem nas descrições de
meu sistema. Utilizando o vinte-e-un1 co1no exemplo, dê un1a olhada nessa breve e provavel-
rnente incompleta descrição do jogo (recorra ao site da Encarta para obter informações mais
completas).
O vinte-e-u1n é um jogo de cartas com dois ou mais participantes, u1n deles dando as cartas. O
objetivo do jogo é fazer co1n que o valor de suas cartas chegue o mais próxin10 possível de 21
sem ultrapassar essa n1arca, e ele é jogado entre os participantes incluindo também o jogador
que distribui as cartas. Ern caso de empate (quando o jogador que dá as ca1tas e os outros ob-
têm o n1esmo valor próximo a21), quem ganha é aquele que distribui as cartas. Antes de cada
rodada, os jogadores apostam uma quantia em dinheiro em sua probabilidade de ter uma 1não
melhor que a do jogador que dá as cartas. U1n ou mais baralhos são e1nbaralhados e, etn se-
guida, o jogador que dá as cartas distribui uma para cada participante e para ele rnes1no.
Nesse ponto, os participantes fazem suas apostas depois de conhecer somente urna carta. Ern
seguida, o jogador que dá as cartas distribui mais uma para cada participante e para ele 1nes-
mo. A rodada tennina se alguém chegar a urn total igual a 21 com apenas duas ca1tas. Se nin-
gué1n conseguir esse resultado, chamado de ' natural' , então, o jogador que dá as cartas as
distribui ern orde1n para cada participante, uma de cada vez, até que o jogador decida parar ao
atingir 21 ou quando chegar perto. Se ele exceder 21 com as novas cartas que recebeu, perde-
rá i1nediata1uente essa rodada. Todos os participantes passa1n por esse processo, pedindo
mais cartas até que decidam parar ou que excedan1 o valor.
Depois que todos os jogadores decidire1n parar de receber cartas ou tivere1n sido eli1ninados
da rodada, o jogador que dá as cartas continua a recebê-las, decidindo se pára ou permanece,
segundo as regras fixadas. Depois que ele e os outros jogadores já tiverem recebido todas as
ca1tas, ele terá de pagar a todos os jogadores corn resultados 1nais altos que os dele, e os que
tiverem resultados mais baixos terão de pagar a ele. Portanto, já que o jogador que dá as car-
tas sempre ganha en1 un, e1npate, se ele tenninar com 21, os outros pagarão a ele.
,
E claro que essa é urna descrição breve, não abordando quando as apostas são dobradas, dividi-
das e outras características do jogo, mas está detalhada o bastante para atender a essa discussão.
Considerando esse exe,nplo como a parte de urna declaração necessária a seu trabalho, você
pode co1neçar a procurar as entidades que poderia1n ser transfor,nadas em objetos. Lembre-se de
1398 Dia 14
meu conselho sobre os substantivos e tente por sua própria conta criar unia lista de objetos antes
de examinar a que consegui.
Percorrer o exemplo apenas procurando os substantivos produzirá mais entidades do que quere-
mos, nias posso fazer u1na seleção nessa lista e obter as sugestões a seguir para os objetos:
• Participante
• Jogador que dá as cartas (seria incluído co1no uni participante?)
• Rodada (tuna jogada)
• Jogo (o jogo cornpleto)
• Baralho
• Mão (cartas do participante ou do jogador que dá as cartas)
• Carta (unia única carta do jogo)
• Aposta (representando tuna aposta do pa,ticipante)
Dada essa lista, passaríamos para a determinação das propriedades e tnétodos desses objetos,
que em geral ajuda1n a definir quais deles, se houver algun1, estão relacionados.
uma propriedade Total no objeto Carta, para indicar o valor total das cartas, ,nas a regra 'o ás
pode valer I ou I l ' tornaria essa propriedade dificil de itnplementar e seria necessário utn traba-
lho 1naior no projeto. Os 1nétodos do objeto Baralho incluiriam Adicionar/Re1nover para o con-
junto de cartas e um tnétodo E,nbaralhar para 1nisturar esse 1nesmo conjunto. O método
Adicionar/Ren1over seria aplicado ao objeto Mão, mas Embaralhar não seria tão útil.
Os objetos Baralho e Mão não são apenas semelhantes, eles são quase idênticos. Etn vez de pen-
sar na herança, uma opção seria transfonnar os dois na mesma classe, porém contendo quanti-
dades diferentes de cartas. Con10 alte1nativa, você poderia criar Mão e Baralho como classes deri-
vadas de tnna classe ConjuntoCartas mais genérica. A classe Ca1ta é bem fácil de definir: naipe
(Copas, Espadas, Ouros e Paus) e valor (2-1 O, K, Q, J, A), e não u,na necessidade real de que seja
herdada de qualquer outro objeto.
A 111odelage111 UML ID·~ lil B !Í]S~~ it) 8 • .., · • : ~ · '@ ,(!J.r -:A • CI • / • é : ''°" · (]) .
(Universal 1\lfodeling • 12'<, • B I
~~~;.;;;;;;;;;;;;;;,;;;.-;;~l:tjtiiwJ.:D~ ~~··~
li l •'i•
1'11 Â • .!,. • ~ • ;;;;; • ;;;; • E! • .
~ ~ ~ l~Ojj;j;IBON~~ UOijj;jJ]~~
· ~•
Language) atende a 11111a !!] ..... ....,•• •
Ir) 1.N.Col,l,o,-
.finalidade relacionada
ao pr()jero, fornecendo a C.dColcc.tion •
.. .~ Oud
aplicativo, e representa .. {~---- •Vel.le
s... :si,no
a docu,nentação do .. •
. Shefl
funciona,nento interno ••
de seu siste,na. ••
•
•
PQJ}l
O diagrama ,nostrado na Figura 14.1 foi criado con1 o uso de um estilo de 1nodelage1n cha,nado
UML ou Universal Modeling Language. Esse tipo de diagra,na pode ser gerado e,npregando-se
qualquer u,na das diversas ferra,nentas existentes, incluindo o Yisio e o Rational R.ose. A vaota-
ge,n de modelar seu aplicativo é fornecer u1n diagrama de seu projeto inicial dos objetos e utili-
1400 Dia 14
zá-lo quando fizer alterações com o passar do tempo. Em u1n an1biente que envolva u1na equipe
grande, os recursos de geração de códigos da tnaioria das ferramentas de modelagem també1n
podem ser úteis, pern1itindo que você crie o código da estrutura de qualquer conjunto de objetos
de seus diagrarnas. Ainda co,n relação à geração do código, o Visio e o Rational Rose (e provavel-
mente outros) dão supo1te à engenharia reversa de códigos existentes, e poden1 usar essa tecnolo-
gia para produzir u1n diagrama de objetos a partir desses códigos. A engenharia reversa é uma
ótima rnaneira de docutnentar u1n siste1na quando não se emprega a modelagem desde o inicio.
Resumo
Os objetos são u1nadas principais partes do Visual Basic .NET, 1nas uma abordagem orientada a
objetos é diferente de un1a procedural com.um. Deve-se enfocar pri1neiro o projeto, na tentativa
de visualizar os conceitos e entidades de u1n sistema corno objetos, antes de se preocupar corn os
detalhes da implernentação do conceito desses objetos. No Dia 15, você aprenderá mais sobre a
criação de objetos usando os diversos recursos da POO discutidos e1n toda esta lição.
P&R
P Ouvi falar que a C# e a C++ fornecem melhores recursos de programação orienta-
da a objetos do que o Visual Basic .NET. Isso é verdade?
R Antes da platafonna .NET, isso era verdade cotn relação a C++; ela fornece recursos de
POO (como a herança) que o Visual Basic não possuía. Agora, todas as linguagens .NET
apresentam a mestna funcionalidade de POO porque ela está sendo fornecida pela Co1n-
1non Language Specification (coma qual todas as linguagens .NET devern estar em con-
formidade) en1 vez de ser específica de cada linguagem. Isso significa que na plataforma
.NET, o VisualBasic .NE1' é apenas uma linguagem tão boa para aPOOquanto aC++ ou
a C#.
P A POO é melhor ou mais rápida do que o estilo de programação 'linear' ou comum?
R Não necessariarnente. A POO não produz resultados diferentes em um apl icativo; é sim-
plesn1ente outra abordage1n para projetar e construir esse aplicativo. Em geral, acredi-
ta-se que a POO gera sistemas que possuem uma manutenção mais simples e são mais
fáceis de expandir, mas isso decerto estará 1nais relacionado cotn o código criado por
voce.~
Workshop
O Workshop foi planejado para aj udá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar ern corno colocar seu conheci1nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Introdução à Programação Orientada a Objetos 401
Teste
1. Que palavra-chave permite que você se refira à classe básica quando escreve urn código
dentro de un1a classe derivada?
2. Que norne é dado quando são criadas várias versões do mesmo rnétodo corn conjuntos di-
ferentes de parâmetros?
3. Qual seria o resultado deste código?
1 Module AllAboutObjects
2 Sub Main()
3 Dim 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. \~ri tel i ne ( "x. Name - {O}" , x.Name)
10 Console.Writeline( ''y.Name = {O}", y.Name)
11 Console.Readline()
12 End Sub
13 End Module
14
15 Public Class myFirstClass
16 Public Name As String
17 End Class
Exercícios
Descreva o que poderia ser um projeto com objetos que registrassetn os eventos de un1 grande
estádio. Leve ern consideração vários tipos diferentes de eventos e produza u1na pequena lista
dos objetos que você poderia projetar para essa finalidade.
SEMANA 2
Revisão
Na Sen1ana 2, abrangemos uma grande área, indo da introdução a uma boa 1nostra das classes do
.NET Framev,,ork aos detalhes sobre os recursos avançados orientados a objetos do Visual Basic
.NET. No geral, você aprendeu o bastante para criar u,n aplicativo completo de produção com
u,na interface co1n o usuário, conexões co1n bancos de dados e até algu1nas conexões com as
funções do servidor como o registro de eventos.
O Dia 8 apresentou várias das partes mais úteis do .NET Fra1nework e também o conduziu pelo
processo de exploração do Framework por sua própria conta. Esse conhecirnento pennitirá que
você encontre qualquer recurso de que precisar no Fran1ework; uma aptidão inesti,nável quando
tiver de fazer algo que este livro não teve te,npo de abordar.
En1bora os aplicativos da Web sejam a tendência atual, os aplicativos Windows ainda são co-
muns, e o Dia 9 1nostrou-lhe como construí-los no Visual Basic .NET. Essa abordage,n dos for-
mulários Windows introduziu a razão original pela qual a palavra 'Visual ' foi adicionada ao
Visual Basic - a criação de interfaces com o usuário co1n operações de a1Tastar e soltar. Usando
os controles, propriedades e algu1na codificação, já é possível criar seu aplicativo Windows .
•
E claro que você ta1nbé1n tinha de aprender a construir ur.n.a interface com o usuário co,n base na
Web, e o Dia 1O foi exata1nente a lição de que precisava. Sua introdução aos fonnulários da Web
mostrou co1no criar um aplicativo da Web que pudesse ser programado com o mesmo modelo
dirigido a eventos que os aplicativos Windows usaran1 durante anos.
Nos Dias 11 e 12, você estudou os bancos de dados - alguma teoria, poré1n n1uito mais prática.
Essas lições rnostraram como as classes Sys tem. Da ta do Fra1nework pode1n ser usadas para esta-
belecer uma conexão co,n u1n banco de dados, recuperar as infor1nações necessárias e, em segui-
da, 1nanipular esses dados quando preciso. No decorrer do caminho, consegui1nos saber mais do
que talvez quiséssemos sobre o gosto 1nusical de pelo 1nenos um dos autores (e não disse qual).
No Dia 13, aborda,nos outro dos principais recursos novos do IDE do Visual Studio, o Server
Explorer, e como você pode usá-lo no Visual Basic .NET para se conectar aos servidores, visua-
lizar e criar contadores de desempenho, e trabalhar co1n o Event Logs do Windows
XP/2000/NT. Agora os aplicativos que você criar poderão agir como programas no nível en1pre-
sarial, fornecendo informações sobre desempenho, erros e de auditoria por meio das ferramentas
co1n as quais os ad1ninistradores de sistemas já estão familiarizados.
1404 Dia 14
Na últi1na lição da Semana 2, o Dia 14, você retomou ao assunto dos objetos no Visual Basic
.NET, que co1neça1nos lá atrás no Dia 7. Nessa lição avançada, abordamos a estrutura e os recur-
sos dos objetos e co1no usá-los para construir aplicativos. Mais informações sobre os objetos
ainda estão por vir. Leia o Dia 15 para obter detalhes sobre co,no é possível desenvolver seus
objetos e sistemas com base em objetos no Visual Basi.c .NET.
No final da Se,nana 2, você já te,n u1na co1npreensão substancial do Visual Basic .NET, o que
permite a criação de sistemas que vão alé1n de simples exe1nplos na área dos aplicativos reais. O
projeto de bônus da Semana 2, uma biblioteca de registros de CDs/DVDs on-line, colocará à
prova seu conheci,nento aperfeiçoado na construção de um aplicativo co,n uma estrutura interna
mais co,nplicada e uma interface com o usuário tanto no Windo\:vs quanto na Web. Verifique to-
dos os três projetos de bônus na Web em http: //1-1Ww. samspub 1 i shi ng. com/deta-
i l sams. cfm?item=0672320665.
-
SEMANA 3
Visão Geral
Durante esta última semana, você examinará vários tópicos avançados para
complementar seu conheci,nento sobre o Visual Basic e o .NET Framework.
Primeiro, você aprenderá a criar suas classes de biblioteca e co1nponentes no
Dia 15. O Dia 16 irá mostrar-lhe os detalhes da geração de interfaces com o
usuário tnais complexas para aplicativos Windo\VS por tneio das classes dos for-
mulários Windows. Essa lição inclui uma discussão sobre 1nenus, aplicativos
co,n interfaces de docu,nentos múltiplos (MDI -1nultiple document interface)
e vários dos controles mais con1plicados ·fornecidos pelas classes dos forn1ulários
Windows.
Como você viu no decorrer dos primeiros 14 capítulos, o .NET Fra1ne\vork é
amplo e complexo, mas essa estrutura fornece todos os recursos que serão ne-
cessários em seus aplicativos. Por essa razão, o Dia 17 explora 1nais áreas do
Fratnework, incluindo o trabalho coin a funcionalidade de manipulação de ar-
quivos e figuras da platafonna .NET.
Os Dias 18 e 19 fo111ece1n as infonnações sobre finalização de que você precisa
para concluir seu aplicativo e instalá-lo na 1náquina que será o destino final, s~ja
ele un1 servidor Web ou os tnicrocomputadores de vários usuários. U1na discus-
são sobre a redistribuição do .NET Framework e sobre os requisitos básicos do
cliente também está incluída nesses capítulos.
O Dia 20 é uma introdução à XML, a linguagen1 comum para os dados que flue1n
por toda a plataforma .NET. Esse capítulo aborda tanto a própria XML quanto
as partes da plataforn1a .NET (Systems. Xml) que facilitam ao seu código a leitu-
ra, gravação e 1nanipulação de infor1nações XML.
O últi1no capítulo deste livro, o Dia 21, aborda os serviços da Web, códigos que
podem ser cha1nados pela Web por 1neio de tecnologias-padrão da indústria
co,no o SOAP, a XML e o HTTP.
O lugar que os serviços da Web ocupa,n e1n seus sistemas foi discutido no Dia 5,
mas o 1naterial do Dia 21 1nostrará a você como criar e testar u1n serviço da Web
simples usando o Visual Basic .NET.
1406 Semana 3
Para concluir, há o terceiro e último projeto de bônus do livro, Hangman, um programa comple-
xo que usa os conceitos da XML do Dia 20, requer algum trabalho co1n arquivos e figuras (Dia 7)
e envolve a criação de uma interface com o usuário avançada (Dia 16). Esse progra1na também
deve ser dive1tido. Você escreverá um jogo que poderá 1nostrar para sua família, a1nigos e cole-
gas, e conseguir que eles se divirtan1 co1n un1 progra1na que você criou!
S EMANA 3
DIA
Criando Objetos
Os objetos não são criados diretamente no Visual Basic .NET~ em vez disso você construirá clas-
ses que se tornarão a definição do objeto. Em seguida, os objetos serão gerados a partir da classe,
transfor1nando-se e1n Lnna instância dela. Po11anto, as etapas para definir seus próprios objetos
começa1n co1n a criação de uma nova classe do Visual Basic .NET.
408 Dia 15
Escopo
Digitar Publi c Cl ass Test cria u1na classe vazia co1n escopo público (Pub li c), o que significa
que qualquer pessoa corn urna referência a esse projeto pode gerar urna instância de Tes t apenas
executando myTest = New Test ( ) . Isso en1 geral é o que se quer, portanto você provavelmente
criará classes de escopo público, mas essa não é a sua única opção. Ta1nbé1n é possível criar clas-
ses privadas, usando a palavra-chave Pri vate para produzir utna classe que só possa ser utilizada
por outro código ern un1 escopo no 1nes1no nível da declaração, o que quase se1npre significa
dentro do 1nesmo arquivo. Se tivésse1nos declarado sua classe dentro da declaração de outra
(aninhando classes), então, qualquer código da classe externa poderia acessar o novo objeto. A
palavra-chave Pri vate é empregada quando não quere1nos que uma classe seja criada fora de
nosso bloco de código atual. Para concluir, a outra opção de escopo que n1encionarei é Fri end.
As classes, as variáveis e os procedimentos declarados com o escopo Fri end podetn ser acessa-
dos por qualquer código dentro do rnesmo progra1na (1nontagem, serviço da Web, aplicativo
Windows e assim por diante), 1nas de 1naneira nenhuma por algum outro código.
Herança
Corno parte da declaração da classe, você pode especificar apenas u1na classe básica para a nova
herdar características dela, se a classe for derivada de alguma outra. A Listage1n 15.1 1nostra um
exemplo disso.
Além disso, por meio da palavra-chave Not Inheri tab l e, adicionada depois do trecho do escopo
na declaração da classe,você tatnbém pode especificar que sua classe não permite que caracterís-
ticas possatn ser herdadas. Se especificar essa palavra-chave, então, ninguém poderá criar uma
nova classe derivada dessa. Isso é equivalente ao tenno ' Sealed', que é usado na C# para indicar
que essa nova classe não permite que características seja1n herdadas dela e é empregado na defi-
nição de 1nuitos objetos da plataforn1a .NET con10 System.Stri ng.
O contrário da criação de classes lacradas é a geração das abstratas, que devem ser usadas como
classes básicas e não podem ser criadas diretamente. Se você definir os objetos básicos que não
quer que sejam empregados sozinhos, apenas corno parte de sua hierarquia de objetos, então, a
palavra-chave Mu st I nheri t será perfeita. U1na utilização comun1 dessa palavra-chave é quando
a classe básica não é funcional isoladamente, e um ou rnais tnétodos-chave precisatn i1nple1nen-
tar classes derivadas antes de surgir algo útil.
A Listagen1 15.2 ilustra o uso da palavra-chave Mustlnheri t. Ela será útil para de1nonstrar que
você pode e1npregar a palavra-chave Mus tOverri de co1no parte da declaração de 1nétodos, a fim
de forçar a inclusão deles em todas as versões herdadas dessa classe. Se utilizar MustOverri de,
não terá de fornecer nenhuma itnpletnentação desse tnétodo ou propriedade.
LISTAGEM 15.2 Mustlnheri t e MustOverri de Permitem Que Você Especifique Que uma
Classe Não Pode Ser Usada Diretamente
1 Public Mustlnherit Class BaseShape
2 Public MustOverride ReadOnly Property NumSides() As Integer
3 Public MustOverride Sub Draw()
4 End Class
5
6 Public Class Square
7 Inherits BaseShape
8 Public Overrides Sub Draw()
9 'desenhe um quadrado
10 End Sub
11 Public Overrides ReadOnly Property NumSides() As Integer
12 Get
13 Return 4
14 End Get
15 End Property
16 End Class
ANÁLISE A classe Shape é inútil sozin.ba; está apenas defmindo o modelo geral de todos os ob-
jetos que a co1npaiiilha1n corno classe básica. Ela é un,a classe básica útil porque
pennite a codificação de várias rotinas a partir de urna única classe e automaticamente dá suporte
a todas as classes derivadas. Definindo essa classe co1no Mustlnheri t , você assegurará que os
programadores não possam contrariar suas intenções e criar uma instância de Shape diretan1ente.
410 Dia 15
É provável que ninguém tente gerar uma instância de Shape - e se alguém o fizesse, não haveria
muitos proble1nas-, 1nas suas intenções se tomaran1 claras evitando a utilização incorreta. Marcar
o método Draw como MustOverri de indica que, quando essa classe for herdada desse 1nétodo, ele
terá de estar presente na nova classe derivada. Mais tnna vez, essa é urna ,naneira de indicar sua
intenção empregando os recursos do Visual Basic .N-ET en1 vez de confiar que os outros progra-
rnadores sempre ajarn da 1naneira correta.
Adicionando Propriedades
l-lá duas maneiras principais de adicionar propriedades a tnna cl.asse: criando variáveis públicas
(que se tornam propriedades diretamente) ou rotinas completas de propriedades. Criar proprie-
dades por n1eio das variáveis públicas funcionará, mas você não terá nenhum controle sobre es-
sas variáveis expostas e não haverá 1naneira de executar os códigos quando seus valores forem
alterados. A Listage1n 15.3 apresenta esse rnétodo de definição de propriedades, que é adequado
quando se está apenas testando as classes no Visual Basic .NET.
Criar propriedades por meio de u1na rotina própria é um método mais complexo que proporcio-
nará urn controle total sobre a propriedade. Prirneiro, determine o nome e o tipo de dado da pro-
priedade que você quer adicionar e, em seguida, digite esta linha dentro dos limites de u.ma
classe (fazendo as substituições apropriadas para o no,ne e o tipo de dado da propriedade):
Public Property Name() As String
Quando você pressionar Enter ao tern1inar essa linha, o Visual Basic .NET criará a estrutura
completa de um procedi1nento de propriedade:
Publ ic Property Name() As String
Get
End Get
Set(ByVal Value As String)
End Set
End Property
As duas partes desse procedi1nento, Get e Set, 1nanipulam a atribuição de u1n valor de proprieda-
de e o recebimento de urn valor (obj Tes t. Name = "Fred"), respectiva,nente. Já que você não usa-
Criando Objetos no Visua l Basic .NET 4 11
rá uma variável pública quando e1npregar esse tipo de rotina de propriedade, provaveln1ente
precisará de u1na variável privada declarada para conter o valor da propriedade. Adicioná-la,
como rn_sNarne, à classe de seu exemplo per1nitirá a criação do código que será inserido na rotina
Get/Set de sua propriedade. A variável da classe privada usa o prefixo rn_ (que representa variá-
vel ,nembro) para indicar que ela é uma representação interna de u1na propriedade exposta. Nes-
sa fonna mais simples, o código inserido na rotina da propriedade (veja a Listagem 15.4) será
usado apenas para transferir valores para fora e para dentro da variável interna.
A rotina de propriedade da Listagem 15.4 é pública (Publ i e), o que provavehnente será preferi-
do, mas você trunbé1n pode defini-la corno privada (Pri vate), restringindo, dessa maneira, seu
uso fora da própria classe.
As verdadeiras vantagens das rotinas de propriedade sobre si1nplesmente usar uma variável pú-
blica estão no fato de que você pode criar propriedades de leitura ou de gravação e executar ava-
lidação dos dados e,n cada tentativa de gravação em u1na propriedade.
As propriedades apenas de gravação são u1n pouco 1nais confusas; pessoahnente não vejo muitas
razões para a existência de u1na propriedade que o usuário pode configurar, mas não visualizar.
Se ele pode configurá-la, então, já deve saber o valor e, portanto, por que você iria querer ilnpe-
di-lo de visualizá-la? A única situação que posso i1naginar na qual uma propriedade apenas de
gravação poderia ser útil é quando lidamos co1n senhas. Considere un1a classe que vai ser usada
para estabelecer un1a conexão con1 un1 banco de dados de back-end e uma de suas propriedades é
a senJ1a do banco de dados. Em algu1nas situações, pode-se querer passar uma instância desse
objeto à outra rotina, co1n suas propriedades já preenchidas, sern expor nenhu1na informação de
segurança.
67 End If
68 End Function
69
70 Private Function ValidCreditCard(ByVal sNumber As String)
71 As Boolean
72 Dim sTemp As String
73 Dim iTemp As Integer
74 Dim sCreditCard As String
75 Dim iCardlength As Integer
76 Dim Checksum As Integer
77 Dim i As Integer
78
79 sTemp = sNumber
80 sCreditCard = 11 11
81 Checksum = O
82
83 For i = 1 To Len(sTemp)
84 If InStr(Numbers, Mid(sTemp, i, 1)) O Then
85 sCreditCard = sCreditCard & Mid(sTemp, i, 1)
86 End If
87 Next
88
89 mCardType = CTPrefix(sCreditCard)
90 sCardNumber = sCreditCard
91 iCardlength = Len(sCreditCard)
92
93 Select Case mCardType
94 Case CardTypes.ccvAMEX
95 If iCardlength 15 Then
96 ValidCreditCard = False
97 sErrorMsg = slengthError
98 End If
99
100 Case CardTypes.ccvVisa
101 If (iCardlength 13) AndAlso (iCardlength <> 16) Then
102 ValidCreditCard = False
103 sErrorMsg = slengthError
104 End If
105 Case CardTypes.ccvMasterCard, CardTypes.ccvDiscover
106 If iCardLength <> 16 Then
107 ValidCreditCard = False
108 sErrorMsg = slengthError
109 End If
110 End Select
1416 Dia 15
111
112 sCreditCard = Right("OOOOOOOOOOOOOOOO " & sCreditCard, 16)
113
114 For i = 1 To Len(sCreditCard) - 1
115 iTemp = Cint(Mid(sCreditCard, 16 - 1, 1))
116 iTemp = iTemp * (1 + (i Mod 2))
117 If iTemp >= 10 Then
118 iTemp = iTemp - 9
119 End If
120 Checksum = Checksum + i Temp
121 Next i
122 Checksum = (10 - (Checksum Mod 10)) Mod 10
123 If Chec ksum = Clnt(Right(sCreditCard, 1)) Then
124 ValidCreditCard = True
125 sErrorMsg = " "
126 El se
127 ValidCreditCard = False
128 sErrorMsg = sinvalidCheckSumError
129 End If
130 End Function
131
132 Public Function CardTypeName(ByVal sCardNumber As String) As String
133 Oim sTmp As String
134
135 If ValidCreditCard(sCardNumber) Then
136 Select Case mCardType
137 Case CardTypes.ccvAMEX
138 sTmp = ''American Express''
139 Case CardTypes.ccvVisa
140 sTmp = "Visa"
141 Case CardTypes.ccvMasterCard
142 sTmp = "MasterCard"
143 Case CardTypes.ccvDinersClub
144 sTmp = "Oiners Club"
145 Case CardTypes.ccvDiscover
146 sTmp = "Oiscover Card"
147 Case CardTypes.ccvEnRoute
148 sTmp = ''enRoute''
149 Case CardTypes.ccvUndefined
150 sTmp = "Unknown"
151 End Select
152 El se
153 Throw New ArgumentException(sErrorMsg, "Card Number")
Criando Objetos no Visua l Basic .NET 4 17
ANÁLISE Esse código apenas verifica se o níLmero é válido, e não se é mesmo de um cartão de
crédito. Esse número também pode se referir a wna conta de cartão de crédito cancela-
da, expirada ou ainda inválida. O trecho Set dessa rotina de propriedade aceita u1na string e, en1 se-
guida, usa u,na soma de verificação para detenninar se ela é u,n número válido de cartão de crédito,
somando os dígitos de uma maneira específica para verificar o total no últiJno dígito. Se a string for-
necida for inválida, então, uma exceção será lançada. Essa exceção deve ser capturada pelo progra-
1na con1 a cont1guração da propriedade CardNumber exata,nente con10 aparece nesse exemplo.
E1n geral, não se devem usar variáveis públicas co1no propriedades; funcionará, mas você termi-
nará se1n u1n controle e se1n opções. O 1nelhor a fazer é e1npregar sempre as rotinas de proprieda-
de e utilizar copiar/colar para manipular a digitação adicional.
Criando Métodos
Para adicionar métodos a sua classe, você criará procedimentos Sub e Funct i on; o tipo exato de-
pendendo de sua situação específica. Exatamente como co1n as classes (veja a seção "Escopo"
apresentada no início desta lição), é possível criar 1nétodos que possua1n u1n escopo Pub li e, Pri -
vate ou Fri end. Os métodos declarados co,n escopo Pub li e pode1n ser acessados por qualquer
pessoa por meio de um objeto desse tipo. Os métodos Pri vate ficam disponíveis apenas dentro
da própria classe, e os 1nétodos Fri end só podetn ser usados por outro código que esteja dentro da
mesma 1nontage1n ou progra1na executável. A Listage1n 15.7 mostra a mes1na classe de exem-
plos anteriores (co1n alguns trechos de código não pertinentes ren1ovidos, co1no as roti nas Pro-
perty) com um 1nétodo Pub 1i e adicionado para estabelecer uma conexão com o Outlook e tentar
encontrar u1n endereço de correio eletrônico para a pessoa e1n questão.
418 Dia 15
Para usar esse código, você precisa incluir uma referência ao Outlook em seu
projeto (e precisa do Outlook 2000 ou do XP instalado e funcionando). Para adi-
cionar essa referência a seu projeto, siga estas etapas:
1. Dê um clique com o botão direito do mouse 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 Outlook na lista.
3. Dê um clique no botão Select e, em seguida, feche a caixa de diálogo dando
um clique em OK. Provavelmente você será questionado se quer criar uma
montagem de interoperabilidade, e deve dar um clique em Yes para res-
ponder a essa pergunta.
20 End Try
21 End Function
22 End Class
23 Module AllAboutObjects
24 Public Sub Main()
25
26 Di m objSample As New Person()
27 objSample.FirstName = ''Joel''
28 objSample.LastName = ''Semen i uk''
29 Console.Writeline(objSample.DisplayName)
30 Console.Writeline(objSample.LookUplnOutlook())
Criando Objetos no Visua l Basic .NET 4 19
31
32 Console.Readline()
33 End Sub
34 End Module
ANÁLISE Quando você executar esse código, o Outlook poderá exibir um aviso (veja a Figura
15. l) de que um progra1na está tentando acessar endereços de correio eletrônico, o
que é verdade porque isso é exatamente o que essa sub-rotina faz.
"IJcrosoft: OUtlook Ei
FIGURA 15.1
~ Apr'ogam 1, tr'rfno to .accHs e,mt,I adlttsses Yo1J h.we,
Os novos recursos de ll). storedhOullodt. Doyouwat"tto~this?
l{ thlS ts: unol!;leiaed, t. m.))' bo .o vir\$ #'d you shouJd
segurança do Out!ook o choose ,~~.
acesso progra,nático a
seu endereço de correio
eletrônico e
infor,nações de contato.
Se você estiver certo de que esse código é a causa do aviso, então, poderá dar u,n clique e,n OK se
quiser que ele obtenha com sucesso um endereço de correio eletrônico. E' preciso fornecer um nome
que exista em sua pasta Contatos ou em uma de suas listas de endereços, caso contrário esse código
não conseguirá encontrar ninguém, e o endereço não será determinado. A linha 4 cria uma instância
nova do Outlook; em seguida, a linha 9 obtén1 a sessão MAPI atual. A linha 1Ocaptura um objeto Na-
mespace que é essencial no modelo de objetos do Outlook e expõe tudo que é necessário para o aces-
so. Usar o tnétodo CreateRecip i ent (linha 11) é o equivalente a digitar o valor do nome na caixa
Para de un1a mensage1n de correio eletrônico permitindo que o Outlook detenn i.ne esse nome. Se
CreateReci pi ent falhar (o usuário pode não ser determinado), então, o bloco Try/Catch que inclui a
obtenção do endereço deverá ünpedir que algun1a n1ensagem de erro seja exibida.
Se você quiser permitir que as classes derivadas sobreponhan1 um 1nétodo definido e1n sua classe bá-
sica, então, o método básico precisará ser marcado com a palavra-chave Overri dab l e, e o da classe
derivada terá de especificar a palavra-chave Overri des. Na Listage1n 15.8, a classe Mortgage é defi-
nida para manipular os cálculos da hipoteca (essa classe tarnbém foi usada no Dia 14, " Introdução à
Progra1nação Orientada a Objetos") e, em seguida, na Listage1n 15.9, u,na nova classe, Acce 1Mort-
gage, é derivada de Mortgage. Nessas listagens, as palavras-chave Over r i dab l e e Overri des são usa-
das para que a nova classe possa acomodar uma agenda de pagamentos que não seja mensal.
1 420 Dia 15
46 ((1 - (1 + dblFractionallnterestRate))_
47 /(1 - ((1 + dblFractionallnterestRate) A iPayments))
48 + dblFractionallnterestRate)
49
50 Return curPayment
51 End Function
52 End Class
ANÁLISE Os detalhes da Listagem 15.8 não são muito relevantes, exceto pela maneira como
essa classe teve de ser escrita para pennitir que você baseasse nela u1na nova classe
de antecipação da hipoteca. Na linha 36, a função PaymentAmount é declarada por meio da pala-
vra-chave Overri dab1 e. Sem essa palavra-chave, Acce l Mortgage (veja a Listage1n 15.9) não pode-
ria fornecer sua própria versão da função PaymentAmount.
ANÁLISE A Listagetn 15.9 ilustra a sobreposição de um tnétodo de uma classe derivada, e a li-
nha 14 faz exatamente isso declarando urn rnétodo que ex iste na classe básica e espe-
cificando a palavra-chave Overrides. A própria função PaymentAmount foi reescrita para dar
suporte a paga1nentos que não sejan1 mensais. Nessa versão revista da função, as propriedades ne-
cessárias da classe são acessadas por meio da palavra-chave Me (linhas 19, 20 e 22), em vez de se
usar as variáveis internas diretamente, porque urna classe derivada não tem acesso às variáveis
privadas da classe básica. A Listagem 15.1 O é urn programa cliente simples que usa essas duas
classes, projetado para comparar urna hipoteca comutn (com pagamentos mensais) corn a mesma
hipoteca quitada com paga1nentos antecipados bimestrais.
1 Module Main
2 Sub Main()
3 Dim objMortgage As New Mortgage()
4 With objMortgage
5 .AnnuallnterestRate = 0.07
6 .NumberOfYears = 25
7 .Principal = 140000
8 Conso 1e. Wri tel i ne ( 11 {O: C} 11 , • PaymentAmount ())
9 End With
10
11 Dim objNewMortgage As New AccelMortgage()
12 With objNewMortgage
13 .AnnuallnterestRate = 0.07
14 .NumberOfYears = 25
15 .PaymentslnYear = 26
16 .Principal = 140000
17 Console.Writeline(''{O:C}'', .PaymentAmount())
18 End With
19 Console.Readline()
20 End Sub
21 End Module
Criando Objetos no Visual Basic .NET 423
Decidir qual a função de u,na propriedade e a de u,n método nem se,npre é fácil e muitos desen-
volvedores faze,n a escolha errada. Não há ' regra' que informe o que fazer, mas posso ofere-
cer-lhe a diretriz que utilizo e a lógica existente nela. E1nprego u1n teste si,nples quando projeto
meus objetos: "as propriedades deve,n fazer co,n que algo aconteça". Gosto de escrever classes
de ,naneira que configurar u,na propriedade três vezes apresente o 1nes1no resultado final que
configurá-la un1a vez.
Essa diretriz única evita situações em que a ordem da configuração das propriedades de um obje-
to pode afetar o resultado. Na classe Mortgage, por exe1nplo, o código poderia ser escrito de
modo que a configuração da propriedade Pri nci pa l fizesse com que o valor do paga,nento tives-
se de ser recalculado. Se esse fosse o caso, então, você poderia querer se certificar de ter confi-
gurado as outras propriedades (Annua l Interes tRate, NumberOfYea rs) antes de Pri nci pa l. Evito
inserir qualquer código em tnna rotina de propriedade que altere outras partes internas de minha
classe, que não sejam sua variável interna correspondente. A funçã.o PaymentAmount da classe
Mortgage poderia certamente ser u,na propriedade ou un1 método porque não altera nada na clas-
se quando efetua seu cálculo. Criei-a co,no u,n ,nétodo nesta lição, poré,n co,no uma proprieda-
de no Dia t 4; e1n geral há situações em que qualquer uma das opções é adequada.
Adicionando Eventos
Os eventos são uma parte i1nportante dos objetos na platafonna .NET, principalmente e1n inter-
faces gráficas co,n o usuário, ,nas no restante do Fra1nework também . Eles pern1ite1n que u,n ob-
jeto infor,ne a todos os interessados que algo aconteceu, o que é u,na interação muito n1ais ativa
entre u,n objeto e o código que o utiliza do que a alternativa em que as propriedades do objeto
são chamadas repetida,nente. Os eventos não são adequados para todas as situações, por exe1n-
plo, as classes Mortgage e Acce l Mortgage não apresenta1n uma necessidade real de possuíren,
eventos; seu código é e,nbutido, e só executado se requisitado. Quando você precisar de que seu
objeto informe algo a seus usuários, os eventos serão um ótin10 mecanismo para fazê-lo.
Considere uma classe projetada para se comunicar com um programa de correio e alertar você
quando chegar u1na correspondência que atenda a u1n critério específico. Uma propriedade po-
deria ser configurada co1no un, tlag para quando essa nova 111ensage1n chegar, porém, seu pro-
gra,na teria de continuar verificando esse valor. Em vez disso, é possível criar u,n evento que sua
classe possa lançar com alguns trechos de dados para descrever o que ocorreu. Seu programa
principal não fará nenhu1na chamada do objeto; apenas escreva o código em u1n ma1úpulador de
eventos para esse evento de seu objeto. Para criar u,n evento, adicione uma declaração a sua clas-
se, como no exemplo da Listagen1 15.11 .
Quando esse evento for lançado, você poderá fornecer valores para cada um dos parân1etros, e
esses valores serão enviados para qualquer rotina que venha a manipulá-lo. Para lançar o evento,
o que será feito e1n sua classe, use a instrução Rai seEvent, cotn.o mostra a Listagem 15.12 (a
classe Out l ookMes sage~la tcher co1npleta).
Imports System
1
2 Imports System. Windows.Forms
3
4 Public Class OutlookMessageWatcher
5 Private WithEvents objlnboxltems As Outlook . Items
6 Private objOutlook As Outlook.Application
7 Public Event EmailArrived(ByVa l From As String,
8 ByVal Subject As String, _
9 ByVal Message As Outlook.Mailltem)
10
11 Public Sub New()
12 objOutlook = New Outlook.Appl ication()
13 objOutlook.Session . Logon(NewSession :=Fa l se)
14 objl nboxltems = objOutl ook.Sess i on .GetDefaultFolder
15 (Outlook.OlDefaultFolders . olFolderlnbox).Items
16 End Sub
17
18 Private Sub objlnboxltems_ItemAdd(ByVal Item As Object)
19 Handles objlnboxltems . ItemAdd
20 Dim objNewMail As Outlook . Mailltem
21 Try
22 objNewMail = CType(Item, Outl ook.Mailltem)
23 Ra i seEvent Email Arri ved (objNewMa i l . SenderName,
24 objNewMail .Subject,
25 objNewMai 1)
26 Catch objException As Exception
27 MessageBox.Show(objException.Message)
28 End Try
29 End Sub
30 End Class
Criando Objetos no Visual Basic .NET 425
Depois de criar um evento en1 sua classe, você poderá escrever u1n código para manipular esses
eventos em outras classes declarando seu objeto co1n a palavra-chave Wi thEvents e, em seguida,
gerar uma rotina de evento por meio de Handl es. Por exemplo, a Listage1n 15.13 1nostra co.1no
essa classe nova poderia ser e1npregada como parte de um forn1ulário Windows.
Os dois requisitos para o uso do(s) evento(s) de seu objeto são declarar o objeto por 1neio de
Wi thEvents e criar u1n 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 auto1na-
ticamente se o objeto for declarado co1n o uso de Wi thEvents. Selecione o objeto na lista suspen-
sa da direita e, e1n seguida, seu evento na lista suspensa da esquerda.
da, outras classes podem implementar utna ou n1ais dessas interfaces, pennitindo que seja,n
tratadas como se fossem tun desses objetos.
As interfaces são usadas em todo o .NET Pramework, permitindo que uma quantidade indefini-
da de classes declare o fornecitnento de un1 conjunto específico de recursos. Utna das interfaces
definidas no .NET Framework é IComparab l e (os nomes das interfaces e,n geral possue,n u,n I
maiúsculo corno prefixo), que fornece apenas urn 1nétodo (Compare To) empregado para co1npa-
rar o objeto atual co1n outra instância da rnestna classe. Qualquer classe que implemente a inter-
face I Compa rab l e estará essenciahnente declarando que duas instâncias dessa classe pode1n ser
co1nparadas, e u,n relaciona1nento rnaior que, ,nenor que ou igual a pode ser determinado.
Para itnplen1entar tuna interface, uma classe quase seinpre precisa fornecer sua própria versão de
t11n ou 1nais métodos. As classes que i1nple1nentare1n I Comparab l e terão de apresentar sua versão
do método CompareTo. A Listagen1 15.14 1nostra tuna classe que implementa IComparable e a
versão personalizada de CompareTo que a forneceu.
LISTAGEM 15.14 IComparable Permite Que Sua Classe Func i one (continuação)
29 End Set
30 End Property
31
32 Public Function CompareTo(ByVal obj As Object) As Integer
33 Implements System.IComparable.CompareTo
34 'Compare esta instância com obj, retorne um número
35 'menor que zero para indicar obj < me, O para indicar
36 'obj = me, e maior que zero para indicar obj > me
37 Dim objOtherPerson As Person
38 objOtherPerson = CType(obj, Person)
39
40 If objOtherPerson.LastName < Me.LastName Then
41 Return -1
42 Elself objOtherPerson . LastName > Me.LastName Then
43 Return 1
44 El se
45 If objOtherPerson.FirstName < Me.FirstName Then
46 Return -1
47 Elself objOtherPerson.FirstName > Me.FirstName Then
48 Return 1
49 Else
50 Return O
51 End If
52 End If
53 End Function
54 End Class
Implementar I Campa rab 1e faz co1n que a classe Person possa ser passada para funções con10 se
fosse u1n objeto do tipo I Campa rab 1e e usada co,n outros objetos que precisa,n dessa interface
para ser implementados. Um exe1nplo de co1no isso poderia ser útil é encontrado na classe Sor-
tedL i st do .NET Framework. Essa classe pennite que seja criada uma lista de objetos, cada uma
com u1na chave associada, e 1nantém a lista ordenada pelos valores das chaves. O segredo é que
os objetos fornecidos como chaves devem dar supo1te à IComparabl e porque SortedL i st depen-
de do método Compare To exposto por essa interface para executar sua ordenação. Esse requisito
não será um proble,na se sua chave for un1 tipo de dado si,nples, como un1a string, um inteiro ou
uma data, já que todos eles dão suporte à interface ICampa rab 1e, mas se você quiser e1npregar
uma classe de sua autoria con10 chave, ela não funcionará a menos que implemente ICampa rab 1e.
A Listage,n 15. 15 ,nostra co,no poderíamos criar u1na lista ordenada utilizando instâncias da
classe Person como valores das chaves.
1428 Dia 15
LISTAGEM 15.15 Implememtar IComparable Permite Que uma Classe Func ione em uma
Lista Ordenada
1 Option Strict On
2 Option Explicit On
3
4 Module AllAboutObjects
5 Public Sub Main()
6 Dim objPersonl As New Person()
7 Dim objPerson2 As New Person()
8 Dim objPerson3 As New Person()
9 Dim Vall. Va12, Va13 As Integer
10
11 Vall = 234
12 Va12 = 13
13 Va13 = 500
14
15 objPersonl.FirstName = ''John''
16 objPersonl.LastName = ''Adams''
17 objPerson2.FirstName = ''Quincy''
18 objPerson2.LastName = ''Wallace''
19 objPerson3.FirstName = ''Arlene''
20 objPerson3.LastName = ''Ratuski''
21
22 Dim slPeople As New Sortedlist()
23
24 slPeople.Add(objPersonl, Vall)
25 s1People.Add(objPerson2. Va12)
26 s1People.Add(objPerson3, Va13)
27
28 Dim objDE As DictionaryEntry
29
30 For Each objDE ln slPeople
31 Console.Writeline("{O} {l}",_
32 CType(objDE.Key.Person).DisplayName,
33 CType(objDE. Val ue, Integer))
34 Next
35 Console.Readline()
36 End Sub
37 End Module
As interfaces devem ser usadas no lugar da herança quando sua intenção for indicar que uma
classe fornece alguma forma de funcionalidade co1num (co,no a capacidade de ser co,nparada).
A classe Person dos exe,nplos anteriores tem Lnna finalidade co1npleta1nente desvinculada de
Criando Objetos no Visual Basic .NET 429
seu suporte a ser comparada, de tnodo que esse suporte é detnonstrado melhor por tneio de uma
interface.
O .NET Framework fornece uma ampla variedade de interfaces, 1nas você tambérn pode criar as
suas de 1naneira sen1elhante ao processo de definição de u1naclasse nova. A definição de u1na in-
terface co1neça com Pub l i c Interface <nome da interface>, tern1ina co,n End Interface e con-
té1n declarações de 1nétodos, propriedades e eventos entre o início e o fim. Nenhun1 código entra
e1n uma interface independentemente do que você esteja fazendo, po1tanto as declarações de
método e propriedade são co1npostas apenas da primeira linha de uma declaração co1nu1n. A
Listagem 15.16 define tuna interface si1nples, IDebuginfo, para fornecer algumas informações
gerais sobre a classe que tem co,no finalidade a depuração.
As interfaces são se1nelhantes às classes e1n alguns aspectos, mas co1no você pode ver na Lista-
gem 15.1 6, bem diferentes em outros. Dentro da declaração Interface (linhas 4 a 9), os mem-
bros são definidos apenas co1n sua declaração, e nenhu1n código de i1nple1nentação é fornec ido.
O escopo també1n não é incluído co1no parte dessas declarações, mas Pub li c será o padrão quan-
do essa interface for imple1nentadaem Lnna de suas classes. Independentemente do escopo esco-
lhido em sua classe, esses rnembros estarão disponíveis por meio da interface IDebuginfo. No
caso dessa interface, as propriedades serão as 1nesmas para todas as instâncias de u1na única
classe e estarão destinadas a descrever essa classe específica. A natureza dessas propriedades
pennite valores apenas de leitura, 1nas as interfaces pode1n apresentar o tipo de propriedade que
for necessário. Um exe1nplo contendo uma rotina de registros, rnostrado na Listagem 15. 17, ar-
mazena infor1nações de rastrean1ento sobre qualquer classe que dê suporte à IDebuglnfo.
LISTAGEM 15.17 Um Procedimento de Regist ros Aceita Qualquer Classe Que Imple -
mente IDebugln fo
1 Option Explicit On
2 Option Strict On
3
4 Imports System
5 Imports System. IO
1430 Dia 15
ANÁLISE Essa classe de registros mostra como o uso de u1na interface con1um para vários ob-
jetos pode ser parte do projeto de um aplicativo. O procedimento compartilhado
LogMsgToFi l e (linha 9) aceita vários parâmetros incluindo um objeto do tipo IOebuginfo, permi-
tindo, portanto, que qualquer instância de uma classe que i1nple1nente essa interface seja passada
para essa rotina. A rotina em si não está fazendo nada excepcional, n1as algun1as partes dela po-
den1 ser interessantes. As classes Path, File e Oi rectory são todas do espaço de nome
System. IO, e cada uma expõe várias funções compartilhadas ou estáticas, portanto, você pode
usar esses objetos sen1 precisar criar um.a instância deles. O código da Listagem 15 .18 1nostra o
exe1nplo de uma classe que implementa IDebuginfo.
Criando Objetos no Visual Basic .NET 431
46 Get
47 Return m slastName
48 End Get
-
49 Set{ByVal Value As String)
50 m sLastName = Value
51 End Set
52 End Property
53
54 Public Function CompareTo(ByVal obj As Object) As Integer
55 Implements System.IComparable.CompareTo
56 'Compare essa instância com obj, retorne um número
57 'menor que zero para indicar que obj < me, igual a O para indicar que
58 'obj = me e maior que zero para indicar que obj > me
59 Dim objOtherPerson As Person
60 objOtherPerson = CType(obj,Person)
61
62 If objOtherPerson.LastName < Me.LastName Then
63 Return -1
64 Elself objOtherPerson.LastName > Me.LastName Then
65 Return 1
66 El se
67 If objOtherPerson.FirstName < Me.FirstName Then
68 Return -1
69 Elself objOtherPerson.FirstName > Me.FirstName Then
70 Return 1
71 Else
72 Return O
73 End If
74 End If
75 End Function
76
77 Public ReadOnly Property Author() As String
78 Implements IDebuglnfo.Author
79 Get
80 Return ''Duncan Mackenzie''
81 End Get
82 End Property
83
84 Public ReadOnly Property ClassName() As String
85 Implements IDebuglnfo.ClassName
86 Get
87 Return "Person"
88 End Get
89 End Property
90
Criando Objetos no Visual Basic .NET 433
ANÁLISE Para usar esse programa, reúna a inte1face IDe bug Info (Listagern 15 . J6), a rotina de
registros (Listagem 15.17) e esse código (Listagem 15.18) ern um projeto, porén1 en1
arquivos separados. Vá até as propriedades do projeto e certifique-se de que a rotina Mai n da Lis-
tage1n 15.18 esteja selecionada como objeto inicial (Startup object), e tudo deve funcionar bem.
Lembre-se de que esse código pode ser descarregado da página do livro, portanto, se quiser, você
poderá evitar a digitação.
A Listagem 15.18 apresenta dois itens: o exen1plo de u1na classe (Person) que implementa IDe-
bug I nfo (1 inhas 13 a 105) e de u1n trecho de código (linhas 4 a 11 ) que cria uma instância da clas-
se Person e, em seguida, chan1a o método Di sp l ayName. Corno descrito, se você incluir todo esse
código em um projeto - três arquivos . vb separados serão adequados - e definir Sub Mai n como
seu objeto inicial, então, o código deverá ser executado sen1 problen1as e produzir um arquivo
(e:\ tes t. txt) contendo suas informações de rastreamento.
Tanto as interfaces quanto a herança fornecem a capacidade de se ter rnuitos objetos diferentes
con1partilhando atributos em con1um, 1nas duas diferenças essenciais as tornarn adequadas para
funções distintas. As interfaces não incluem qualquer implementação junto a esses atributos; a
definição Interface não contém código, e as classes que imple1nentarn essa interface devern
fornecer elas mesrnas toda a funcionalidade. Essa com certeza é uma vantage1n da herança, o
cornpartilhamento da funcionalidade implementada na classe básica com as derivadas, porém,
as interfaces compensatn essa diferença com uma flexibilidade 1nuito n1aior, perinitindo que
urna única classe ilnple1nente quantas inte1faces quisermos.
No final, as duas tecnologias têm alguma semelhança, poré1n alguns procedirnentos diferentes.
Use interfaces quando quiser indicar que uma classe tem detenninados (nor1nalmente mais do
que um) recursos, sernelhantes a un1 relacionarnento como "m inha classe suporta a interface
1 434 Dia 15
I debug I nfo". 1nheri tance, por outro lado, indica "é u1n" relacionamento. Frases como "Clien-
te é tuna pessoa" e "Funcionário é uma pessoa" poderia1n descrever o relacionamento entre
duas classes derivadas e suas classes-base.
Espaços de Nome
Uma n1aneira úti l de criar un1a organização para suas classes é usar espaços de nome. A defi-
nição de espaços de nome já é um 1necanis1no para a estruturação do código, ,nas quando você criar
bibliotecas de classes, a organização será ainda tnais itnportante. O .NET Framework emprega
muito os espaços de no1ne, produzindo classes organizadas de tnaneira clara pelos espaços de
no1ne que as contê1n (System, System. Data, System. 10 e assim por diante), e podemos fazer o
mesmo apenas envolvendo seu código con1 as definições dos espaços de nome. Eles serão decla-
rados e1n seu código por meio de Namespace <nome do espaço de nome> e End Namespace. Pode-
rão ser aninl1ados (o que permitiria a criação de uma estrutura na forma
Espaçodenomel.Espaçodenome2. Espaçodenome3) pela especificação do no,ne co1npleto (Espaço-
denomel . Espaçodenome2), já que não é possível aninhar declarações Namespace. Quando defini-
dos envolvendo uma classe (veja a Listagem 15.19) ou várias, elas serão consideradas parte
desse espaço de notne e poderão ser referenciadas co.mo Espçaodenomel. Classel em seu código.
Criando Objetos no Visua l Basic .NET 435
Nr.w Projrct EJ
FIGURA 15.2
A caixa de diálogo Ne111 f~ e s: Jii_§j
•
" "" " Ty~:
oc -,ec-,f.,.-,,-..-,.,.- ""
~IA-o ~,.,-..,-.,.-rn-.,~he,-.,,,-,-c.atkiõs
..---
N.n!.: 1Cbss:UbtêlyJ
Lccdócn: ~,
o""'
:\Do_""""'
__ •r<l
..,.5",-.-
thQs
..,.\ClUn< ,,,....,.,Ooc
,--•-. ..,..,.. ,--.,,.-_,..,.,
..,......3 tll'owS<.••
("'Adjto~
Você ta1nbém pode usar o mes1no no1ne para u1n espaço de nome e1n vários arquivos de código e
até e1n diversas bibliotecas de códigos, e o Visual Studio .NET considerará cada definição desse
espaço de nome co1no parte do todo. As Listagens 15.20 e 15.21 ilustra1n isso, representando
dois arquivos distintos.
LISTAG EM 15.20 O Mesmo Espaço de Nome Pode Ser Usado em Vários Arquivos
1 Option Explicit On
2 Option Strict On
3 Namespace libPerson
4 Public Class Classl
5
1436 Dia 15
LISTAGEM 15.20 O Mesmo Espaço de Nome Pode Ser Usado em Vári os Arquivos
(conti nuação)
6 End Cl ass
7 End Namespace
LISTAGEM 15.21 Para o Programador Que Usar Seu Código , Tudo Parecerá Parte de
um Único Espaço de Nome
1 Option Explicit On
2 Option Strict On
3 Namespace l ibPerson
4 Public Class Class2
5
6 End Class
7 End Namespace
8
9 Module modl
10 Sub Main()
11 Dim objClass2 As libPerson.Class2
12 Dim objClassl As libPerson.Classl
13 End Sub
14 End Module
N'o final da Listagem l 5.21 , podemos ver o código declarando e usando as duas classes (linhas
11 e 12). Quando você quiser construir uma biblioteca de códigos e co1npilá-lae1n uma DLL, po-
derá envolver todo o seu cód igo em declarações Namespace para facilitar ao usuário a localiza-
ção de suas classes. Como exa1ninaremos uin pouco inais adiante, suas classes já parecerão estar
agrupadas depois que forem inseridas em uma biblioteca e fizerem referência a ela em outro pro-
jeto.
3. Selecione Add Reference no menu que aparecerá, e você verá a caixa de diálogo Add Re-
ference (veja a Figura 15.3).
4. Dê u1n clique no botão Bro\.vse e encontre o arquivo libPerson.dll que foi criado.
Add Rrf('tM'ICC" EJ
FIGURA 15.3
·"'' lcoM 1"''""" 1
A caixa de diálogo Add
rt 1-kna Verslon P«h •
I r,.,.,..... 1
Reference pode ser A«es$it.lty.(I 1,0:211 LO c,\wn,..rv,,ao,ott.NET\F,-a ... Sdo<t j
edodb 2.,.0.0 C:lprC9~m Fi~ \Mklo~l.14,,,
usada para que seja,n CR\'sP. Y ~
Cr~ ti'De~
l .o.o.o
.C!Y$ta'Rc-po... 9 .1 .0.0
D:V,.07am FJ.?.s\t,t kr~ft \'/,.,
O:\Ftcigom Fi~\Mlc10$<0Íl i'i ...
adicionadas referências C, ystobocl:$b'l~.Repc,tsou1co
c,r,;t-:it>ctbi:ns.Sh.l•cd
9. 1.0.0
9.1 .0.0
O:lprqom fim\MK,o~ ít w...
0:111~-:im Fili:,:\J,tt,owft W•. ,
O:lpt~am fiks\MJcro~ fl w.. .
a co111ponentes e C,yStabeeisi:ru.Web 9 . 1.0.0
C,yst,:i'l)ecin,:os,WJ\cbws,fo... ?, 1,0,0 O:lprcq.:im f;5es\t,h:1os.clt w.. .
Cr)"$1.61!1'Uro,1$tlb 1.0.0.0 0:lptogtim "5tf\MbO'foCÍl W•••
referências que C,yst.:.UnfoSt« eLO 1.0.0.0 O:\f') 07.:im f tb\t>b:ro~ft W...
c,~ 01<cyCoó:tib 1.0.0.0 0 :\p.c:qom Fi~\Mii:rosoft W... .:J
conduzan1 clireta111en1e a r ,wtA'P~IN'N 'lllh 1.n.n ,,n n:l Pifn'AM Rk<1Mh nw) \'j,., •
outros projelos.
s......
C""d
1 Option Explicit On
2 Option Strict On
3
4 Module Modul el
5 Sub Main()
6 Dim objClass As libPerson.libPerson.Classl
7 End Sub
8 End Module
Observe que o uso do espaço de nome li bPerson resultou e1n u1n agrupainento secundário que
provavelmente é desnecessário. Empregue espaços de nome em suas bibliotecas para criar agru-
pan1entos mais granulares do que a biblioteca e.m sua total idade.
438 Dia 15
Resumo
fazer a POO trabalhar para você, em seus aplicativos, não é uma questão técn.ica, e sirn de proje-
to. Quando for criar o projeto conceituai de seu aplicativo, precisará pensar em tennos de obje-
tos. Se conseguir fazer isso, então, desenvolver o siste1na usando objetos não será u,na ,nudança
completa de paradigma, mas apenas uma passagem do conceituai para a implementação.
P&R
P Ouvi o termo ' polimorfismo' relacionado à programação orientada a objetos. Isso
significa que preciso ter mais de uma esposa para trabalhar com o Visual Basic
.NET ?
R Não tema, isso nada tem a ver com suas relações fa1niliares. O polilnorfisrno descreve a
capacidade de tratar muitos objetos diferentes como se fossem do 1nes1no tipo, permitin-
do que você tenha classes diferentes, como Círculo, Quadrado e Triângulo, porétn tratan-
do todas como o tipo Forma. Esse conceito é útil e fornecido pelas tecnologias de herança
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 Fratnework, foi desenvolvido
em torno dos objetos, e se,npre que você usar qualquer das classes do .NEl' Frarnework
estará trabalhando corn eles. Os progra1nas de sua autoria, no entanto, podem empregar
rnuito ou pouco os objetos, conforrne desejar. Todos os códigos criados ficarão armaze-
nados em classes (ou módulos, que são apenas un1a forma um pouco estranha de classes)
e, portanto, não se pode evitar completan1ente os objetos, 1nas a opção de construir todo o
seu sisten1a corn entidades representadas co.1n.o objetos é sua.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e1n co1no colocar seu conhecirnento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Se você tiver entidades em sua empresa que sirvatn para várias finalidades (Pedi dos,
Cl i ent es, I tensDos Pedi dos, Eventos), rnas todas cornpattilharem alguns recursos ou ca-
pacidades, qual conceito da POO deve ser usado ern sua criação?
Criando Objetos no Visua l Basic .NET 439
2. Quando você tiver um relacionamento de herança, con10 Funcioná ri o e Cliente, os dois de-
rivados de Pessoa, como assegurará de que certos n1étodos ou propriedades da classe básica
sejan1 itnplen1entados nas classes derivadas?
3. Nova1nente, e1n um relacionamento de herança, co1no você cria u1na classe básica que
não possa ser gerada, forçando os usuários de seu código a criar apenas classes que te-
nha1n sido derivadas da básica?
4. Como você indica que nenhu1na das características de uma classe pode ser herdada?
Corno isso ta1nbém é conhecido?
Exercícios
Crie un1 objeto, ou uma hierarquia de objetos, destinado a representar u,n cliente. Tente cons-
truí-lo usando uma ou n1ais classes com u1n enfoque na reutilização de seu código por outras par-
tes de seu aplicativo.
SEMANA 3
DIA
Menus
Se você usou alguma versão do Windows, deve estar familiarizado com os menus. Eles apare-
ce1n ern quase todo aplicativo e concedem acesso a 1naioriados recursos do progra1na. Você vai
querer adicionar menus a muitos de seus programas.
aparecerá em u1na nova seção do IDE (veja a Figura 16.1). A segunda diferença entre adicionar
u1n controle Ma i nMenu e a maioria dos outros controles é que e,n geral só é inserido u1n único
controle Ma i nMenu e,n cada formulário.
Me.Menu= mnuSecond
Você desejará fazer isso nos casos em que seja usado apenas um formulário
para realizar múltiplas tarefas - por exemplo, se você carregar diferentes tipos
de arquivos em um controle, no formulário. Você poderá alterar os menus para
refletir as operações que poderão ser executadas no arquivo. Entretanto, uma
solução prática para esse problema poderia ser ocultar e exibir os itens de
menu de acordo com sua necessidade.
FIGURA 16.1 filo tdl l'.low !:toio<t ~ l),wo ....... !oob !l;ndow ll<l>
O forrnulário depois l:'51 • ~ • ~ lil !' 1 J !ti aj.. ., ; "" • ~· l';.j ,:-... • ~:F«m
l
que o controle 1 1 $ "1 n <Ir <!! 1-~ t:l' JTI ~ ino- :':' ~: ~ : ~: ~; ê : diJ t19 I \\ 'i .
Ma i nMenu foi
f .. .. Menuf0tm.Yb[Oes1Qn]•
• !!
o
f
adicionado.
f . . . . . .. . . . .
• • • + • '
. . ..... ...
.. .. .. ................... 1
...... .............. ... .....
... .. . . .. ..... .. .. .. ..
i
..
2
. .. .. .... .. .... . . .... .. .. .. .. ....
....... ... ......... ..... .. ... .... . .......................... .... ....
. . .
'
'
.. .....
..... .... . ... . . ................. ..
........
. '
.....
.
. . .. .. . ....
. . .. ....
.. .... . ... . . . . . . . ...····
.
. .
. . .····
... ..
'
'
. '
. .
.' ..........
. . . . . . . .. . . . .. .. . .. . . . . . . . . . . . . . . . . .. . .
.
. . .......... .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ' ....
• • • • • t • • • • • • • • • • • • • • • • •
.
• •
~
• • • • • • • •
'
• • •
..:J
En1bora o controle Ma i nMenu não apareça no for1nulário, ele realmente o altera. Depois de adicio-
nar un1 controle Ma i nMenu, você deve ver tuna nova faixa no fonnu lário, logo abaixo da barra de
título, como mostra a Figura 16.1.
Você adiciona itens ao menu construindo-o visuahnente. Quando o controle MainMenu for selecio-
nado no IDE, você deverá ver u1na área de texto com as palavras ' Type He re ' no canto superior
esquerdo do for1nulário que estiver projetando, onde o 1nenu File normaltnente se encontra. Dê
um clique nesse espaço e digite o texto que deseja ver no 1nenu. Ao fazê- lo, ,nais duas áreas de
Formulários Windows Avançados 443
texto surgirão: uma ao lado do item que acabou de ser criado e outra a.baixo (veja a Figura 16.2).
Os itens que forem adicionados à faixa do 1nenu serão os menus de nível 1nais alto de seu aplica-
tivo, enquanto os que fore1n inseridos abaixo deles serão as opções do 1nenu. Por exemplo, digite
File (Arquivo) na caixa inicial. Abaixo, adicione os itens New (Novo) e Exit (Sair) . Dê um clique
no espaço próxi1no ao menu File e digite View (Visual i ar) para criar um novo 1nenu. Abaixo de
View, insira os itens Red (Vermelho) , Green(Verde) e Blue(A ul ). Enquanto estiver trabalhan-
do e.1n um 1n.enu, os outros 1nenus de .níveJ tnais alto serão fechados. No entanto, poderão ser
abertos novamente se precisarmos adicionar novos itens.
Edição de menus 1~ . ~ . ~ " ? 1y. e.} ..., : .. &:) • i.1 ,:-., . ,c.!11:"""'
preparada. !!ti !!', ~ ... ~ <O ~ ~ ,a [ô, ~ ~ 1~ ~:~:e: 3)]@;) ~ lf;, .
ll()o '~
f ·• ·• MmuForm..t> [Dalgo)• 1 .
•
o
a
:s
1
q lfle li TlP: t+te f
t
;QiíiHKe:::Jj: ::
J
0
• ·, • •
' . .. ..:::.:::
....... . . . . ...... .. .... ..........
. . . ..•. :: . ...
ã'.lf : :: :: :.
. . .. :: .•. · ..
Exata1nente co1no nos outros controles, você deve estabelecer tnna convenção para nomeação
dos itens de seu 1nenu. Sugiro utilizar a desta lição:
• Os itens do menu de nível superior devem ser no1neados usando-se o prefixo de três letras
mnu, seguido do texto para o menu - por exe1nplo, mnuArquivo, mnuEditar, mnuAjuda.
• Itens de menus-filhos deve1n ser nomeados co1n base no 1nenu de nível superior e1n que
estão contidos, mais o texto do novo item. Você pode querer abreviar ou escolher apenas
tuna parte do texto, esperando que ainda assim o nome resultante seja exclusivo. Por
exe1nplo, mnuArqui voAbri r , mnuAj udaSobre, mnuJane1aHori zonta 1. Os itens repetidos do
1nenu, como os separadores (as linhas horizontais usadas para agrupar seções de u1n
1nenu), deve1n ser no1neados com o acréscitno de um número no final, a 1n.enos que possa-
1nos dar a eles un1 no1ne exclusivo.
444 Dia 16
Os Teclados e os Menus
E1nbora os 1nenus proporcionem acesso aos recursos, na verdade, poden1 lin1itá-lo para alguns
usuários. Os menus são 1nesmo úteis, ,nas pode1n bloquear os usuários que não tenha1n experiên-
cia ou aptidão de usar o 1n.ouse. Por outro lado, os usuários avançados pode1n não querer alternar
constanten1ente entre o teclado e o n1ouse. Ao projetar 1nenus para seus aplicativos, le1nbre-se
desses dois grupos.
O suporte ao teclado pode ser adicionado aos 1nenus de duas maneiras. Pritneiro, deve1n ser adi-
cionadas teclas de acesso a todos os itens do menu. As teclas de acesso são os itens sublinhados
do 1nenu, por exemplo, o A do menu Arquivo. Elas pennitirão que as pessoas que não saibarn
usar un1 1nouse ou não tenham um, utilizem seus 1nenus. E1n geral, a primeira letra de u1n n1enu
ou de u1n ite1n de .1nenu é u.ma tecJa de acesso. No entanto, para evitar ter vári.os itens com a mes-
ma tecla de acesso, você pode ter de usar outra letra da palavra. Por exen1plo, e1n 1n uitos produ-
tos da Microsoft, a tecla de acesso do 1nenu Arquivo é a letra A, enquanto o 1nenu Ferratnentas
utiliza a tecla M.
Dê um clique no menu File criado anteriorrnente. Altere a propriedade Text para Fi 1e. U1n tra-
vessão aparecerá en1baixo do F. Você tarnbém pode adicionar esse subJinl1ado dando um clique
em um ite1n do 1nenu para selecioná-lo, aguardando u,n pouco e, em seguida, dando u1n clique
novamente para poder editar o texto. Adicione um E con1ercial (&) antes da letra que quiser que
seja a tecla de acesso desse item do menu. Associe teclas de acesso aos menus já criados confor-
me o descrito na Tabela 16. 1.
View V
Red R
Green G
Blue B
A segunda 1naneira de adici.onar o supo1te do teclado aos m.enus é por 1neio de teclas de atalho
ou, co1no sã.o às vezes conhecidas, aceleradores. As teclas de atalho em geral são associadas às
Formulários Windows Avançados 445
teclas de função (co1no Fl para ajuda) e são pressionadas junto com a tecla Ctrl - por exen1plo,
Ctrl+C costuma ser a combinação de teclas que cria o atalho para o co1nando Copy (Copiar).
Elas fornecem aos usuários u1na 1naneira rápida de acessar comandos freqüente1nente usados.
Não são obrigatórias, ,nas proporcionam atalhos para ajudar os usuários, principahnente os
acostu1nados a lidar exclusivamente com teclados ou os usuários experientes. E1nbora não te-
nha1nos sen1pre uma tecla de atalho associada a cada ite1n de n1enu, você deve en1pregá-las nos
1uais usados. Além disso, é botn adicioná-las aos itens do Lnenu en1 que costu1namos vê-las,
como nos co1nandos Cut (Recortar), Copy (Copiar) e Paste (Colar).
As teclas de atalho são adicionadas aos itens de menu por 1neio da propriedade Shortcut. Sele-
cione Shortcut na lista suspensa. Crie as teclas de atalho co1no descrito na Tabela 16.2.
As teclas selecionadas não aparece1n no itetn de menu no te1npo de projeto (veja a Figura 16.3);
no entanto, surgirão quando o aplicativo for executado (veja a Figura 16.4).
Adicionando Código
Tanto os menus de nível superior quru1to os itens de menu dão suporte a vários eventos. Entre-
tanto, e1n geral só o evento Cl i ck é usado. Ele ocorre quando o usuário seleciona o ite1n de
menu. Adicione um código ao 1nanipulador desse evento para que ele execute algu1na ação que
seja necessária. Dê u1n clique duplo nos itens de menu para abrir a janela de códigos e adicione
um ao evento Cl i ck. Adicione o código da Listagem 16.1 ao formulário.
446 Dia 16
"' •
~ Jf: 11-; o;
,
{Pr~tm ~ X Q
f •. • Menufonn.vb[o..lgn)
• ( mnu- """"·"""'°"'-"'""'.1.:J ~
•. ê] ti I[!] l::I f
, ~ w:111 j Ttz:Her~ f . .
. .. fiffn
-;;,
st.
r .::··:
::.
••
B.ed
•
:· ....... . ..... ..
..•................ .
• ._9_
ec-•
OMietDt-aw
(OnflQIUJ.MluM
Fdso
4f
. .--~'-'---~···::::·:::·:::·· . . . .
:: a o....,.. i
. . ~:::.: ... . ,,'
·-·
~
.::. ..1.' TJM,.,....,. . ..] .::!'.
(fld!IC)
. . . . .
' . .
nw.,Vte'W
•
. . . .. ... ..
'
~
Pttit<e
. . ...
.
'
. . . . . . . .. ...........
'
. . .. . .. .
'
. . ....
,,
'
'
... .. .. . .. .. ..
....
.
ª """
Cho<Md
"'1"*-
.....
..... f
.. . .. . .... . .. . . . .. .. .. ..................
... .. .. . .. .. ...... .. l
.. .. . .... . . ... .. .... . . . .. ...
. . .
'
. . .
.
..
...
.
..
..
.
. . .
.....,..
Cnotl<d
.....
'""
o
V
_,
. . . . . . . . . . . . . . .. . .. . . .. . . . .. . .. . . .
.
. .
"1et~dcr
. .. . . .. .. .. .. . . ... . .. .. .. .. .. .. . .. .. .. .. . .. .. .. . .. . .. . ....
' . ' .. . Mer09T)1)e!
,....
MI
.. .. ....
'
'
... .
.. . . . . .. .. . .. .. ..
SholtM
... """'
.
------ .:.1 Toxt '""'
&Vicw 1
~
.._\\_""'-
'""
'""'
Tho<«>tion~bvViet- .
ANALISE O manipulador de eventos mnuFi 1eNew_Cl i ck está relacionado aos itens f ile e New
do menu. O código para esse evento (linhas 1 a 5) cria u1na nova instância do fonnu-
lário atual e a exibe. Isso perinite que
.
você veja várias cópias do fonnulário simultaneamente. Por
.
outro lado, o código do evento mnuFi 1eExi t _Cl i ck (itens File e Exit das linhas 6 a 9) fecha o for-
mulário at.ivo. O aplicat.ivo é encerrado quando o último fonnulário é fechado. Os três 1nanipula-
dores de eventos finais estão relacionados aos itens Red, Green e Blue do 1nenu. Eles apenas
alteram a cor do plano de fundo do fo1mulário ativo para a cor que foi selecionada.
Compile e execute o aplicativo. Use os itens File e New (ou pressione Ctrl+N) para abrir várias
telas do menu. Tente alterar a cor dos form ulários usando os itens Red, Green e Blue do menu
(le1nbre-se de que tambén1 existe1n teclas de atalho para esses itens). A Figura 16.5 mostra o
aplicativo em execução. Para concluir, feche todos os formulários usando o item Exit do 111enu
para encerrar o aplicativo.
X
FIGURA 16.5 ~ [d< l!low - .
' · ~ - .
!oals - tl•b . .. .
Executando o n1enu de l,JJ · hl · ~ lil~l ~~e."': "·· .!;! · ~1 .. .-... · a»."""' - ~Q' ~ >:
exen1plo. 1• li • " • • • •- Lno • T
1..... Qll •• 1iti 'tf !b A• T·J: • - .... ,. ~ ~ r. .
q X
•
q X
•
448 Dia 16
Algumas Sugestões
Como você viu, os 1nenus fornece1n u1na n1aneira comun1 de acesso aos recursos de seu progra-
1na. Contudo, se torna1n mais úteis quando as pessoas encontra1n os con1andos no 1nesmo local
em todos os progra,nas. Portanto, será uma boa prática configurar seus menus de 1naneira seme-
Jhante à de outros aplicativos. Isso ajudará seus usuários a conheceren1 seu aplicativo porque
eles encontrarão os comandos 1nais rapidan1ente se esses estivere1n onde se espera encontrá-los.
Isso significa que você deve ter algu11s menus co1nuns e que eles deve1n estar localizados no
mesmo I ugar e1n que são colocados en1 outros progrrunas. A Figura 16.6 mostra alguns dos pri n-
cipais menus comuns de programas co1no o Word, o Excel, o PoweíPoint, a Calculadora (todos
en1 inglês) e o Visual Basic .NET. Tente reproduzir aplicativos con10 esses, se isso for apropria-
do para o seu aplicativo.
A1enus comuns. . .. ~ ~J
r ~ NewRcm.in .. 12 .. B I II l"==E
p;;;: -
li= := fie . ,-e... •...
~ · - · - .....--- ~
11ntfi·l - elwlxlf
Ed< - llO>
,
E claro que se seu aplicativo não usar arquivos ou tiver telas alternativas, você poderá não achar
apropriados alguns desses menus. Por exe1npJo, o aplicativo Calculadora que vem no Windows
não ten1 u1n tnenu File (Arquivo). Da 1nes1na maneira, muitos aplicativos não precisam de outros
menus co1n.uns, co,n.o Edit (Editar), Tools (Ferramentas) ou Help (Ajuda). Não será necessário
incluir esses menus se não precisarmos deles; no entanto, se eles realmente existiretn, devem fi-
car nos locais esperados.
Exatamente como há menus comuns de nível superior, você também deve construir menus para
seus aplicativos de n1odo que sejam semelhantes ao de outros aplicativos utilizados pelos seus
usuários. Por exe1nplo, o menu Arquivo e1n geral deve conter os itens Novo, Abri r, Salvar e Sair.
Da mesma 1naneira, o n1enu Editar deve apresentar os itens Reco11ar, Copiar e Colar.
Formulários Windows Avançados 449
Faça •
1
Examine outros aplicativos para obter suges- NÃO encare isso como uma regra absoluta.
tões de estruturas de menus comuns quando Se um menu não for apropriado, não hesite
definir os seus. Use essas estruturas de me- em deixá-lo de fora. Por exemplo, se seu apli-
nus para ajudar seus usuários a encontrar co- cativo não usar arquivos, você pode evitar a
mandos de que precisem. utilização do menu Arquivo. No entanto, ainda
seria possível incluir o item Sair como o últi-
mo item do primeiro menu.
docun1ento abe1to é exibido em sua própria janela. Portanto, um formulário contém apenas um
documento. Em um aplicativo MDI, pressupõe-se que um formulário possa conter vários docu-
1nentos. Basica1nente, isso é verdade. No entanto, tuna definição melhor seria que un1a janela
contén1 vários outros fon11ulários, cada u1n co1n apenas um docu,nento. As versões mais antigas
do Microsoft Word usavam essa estratégia. De maneira semelhante, o próprioVisual Basic .NET
é un1 aplicativo MDI. Você pode ter vários docu1nentos abertos ao n1es1no tempo. Cada um deles
é exibido e1n sua própria janela dentro da janela-pai do Visual Basic .NET.
Adicionando o Formulário-pai
A única diferença entre criar um aplicativo Windo,\1s comu1n e u1n aplicativo MDI é o contêiner
da MDI. O contêiner ou formulário-pai é o fonnulário de seu aplicativo que contén1 seus filhos.
Nenhum formulário interno pode ser retirado do pai MDL Te1nos duas razões para isso:
• Ele diminui as chances de u,n ou mais fonnulários serem perdidos por usuários iniciantes.
Os usuários 1nenos fa1niliarizados co.m a navegação no Windows às vezes perde1n um
fonnulário selecionando outro e en1 geral não conseguem localizar o anterior usando a
barra de tarefas.
• Reforça a idéia de que os fonnulários-filhos estão relacionados entre si e associados ao
formulário-pai . Se os forn1ulários não pudere1n ser transferidos de modo independente,
serão considerados con10 dependentes uns dos outros.
E1n geral, todos os outros fonn ulários do aplicativo são filhos desse formulário-pai. No entanto,
você pode não querer que alguns deles sejam um filho. Isso seria desejável se o fonnulário não
estivesse contido logica1nente no fonnulário-pai. Por exe1nplo, no Visual Basic .NET, u,najane-
la de código está logicamente contida dentro dele e, po11anto, deve ser um fonn ulário-filho.
Como caixa de diálogo para abrir arquivos, por outro lado, não está logican1ente contida no apli-
cativo e, portanto, não é u1na janela-filha.
Você pode criar um novo formulário-pai MDl configurando a propriedade IsMdiContainer
como True. Fazer isso adicionará um novo controle ao fortnulário, un1 controle Mdi Cl i ent. Esse
controle ocupa todo o formulário e é o contêiner dos forinulários-filhos.
Depois que você tiver um formulário-pai MDI, poderá tornar outros formulários-filhos dele
configurando sua propriedade Mdi Parent antes de exibi-los. Configure essa propriedade para
apontar para o formulário-pai. A Listage1n 16.2 mostra un1 exe1nplo disso.
ANÁLISE Para exibir outro formulário, a primeira etapa é criar uma nova instância do fonnulá-
rio desejado (li.nha 6). A seguir, a propriedade Mi dParent é configurada co111.o forLnu-
lário-pai. Esse fonnulário deve ter sua propriedade I sMi dConta i ner configurada co1no True. Para
concluir, o fonnu lário é exibido (linha 8). Ele não pode ser removido dos limites do fonnulá-
. .
r10-pa1.
Embora os aplicativos MDI forneçam muitos benefícios, você pode não querer
NOTA usá-los na maioria de seus aplicativos. A Microsoft reduziu bastante o uso que
faz de aplicativos MDI, declarando que muitos usuários iniciantes ficam confu-
sos por causa deles. Por exemplo, tanto o Microsoft Word quanto o Excel eram
aplicativos MDI. No entanto, agora são aplicativos SDI e geram uma janela por
documento.
Portanto, como qualquer tecnologia, use a MDI onde apropriado e quando
seus usuários a compreenderem.
A MDI e os Menus
Como é de se esperar, quando apenas uma janela puder conter várias janelas-ti lhas diferentes, os
aplicativos MDI possuirão configurações especiais de 1nenu. Elas permitirão que você organize
as janelas-filhas 1uais facilmente. Em geral, os aplicativos MDI possuem u1n menu Windov.r (Ja-
nela) que dá acesso a esses con1andos.
O n1enu Windo,v padrão ten1 quatro comandos:
• Tile Horizontally (Lado a lado horizontahnente) Organiza as janelas-filhas de n1odo que
cada uma seja uma faixa horizontal ocupando a tela (veja a Figura 16.8). Isso será útil
quando você tiver de comparar informações que precise1n ser exibidas e1n u1na linha intei-
ra, co1no dois documentos para o processa1nento de textos.
• Tile Ve1tically (Lado a lado ve1ticahnente) Organiza as janelas-filhas de 1nodo que cada
u1na seja uma faixa vertical do lado da outra ao ocupar a tela (veja a Figura 16.9). lsso será
útil ao se comparar pequenas áreas de dois ou mais documentos ou quando você executar
u1na va1Tedura rápida e1n dois docu1nentos para encontrar alterações.
452 Dia 16
FIGURA 16.8
O co,nando Ti/e ~Plclure Vl~w R ~ EI
f-forizonta/ly aplicado
aos .for1nulários-fil hos.
FIGURA 16.9
O co111ando Ti/e
Vertically aplicado aos
for,nulários-jilhos.
• • I
, ,', /
,{ /
,;. ,;.
•
,
/
,,
.
/
~ ,/
,.
• Cascade (Em cascata) Organiza as janelas-filhas de ,nodo que tenhan1 todas o rnesino
tamanho. Cada janela é posicionada un1 pouco abaixo e à direita das que estão atrás dela,
resultando em un1a disposição na qual você pode visualizar as barras de título de cada ja-
nela-filha (veja a Figura 16.10). lsso é útil para demonstrar que docu1nentos estão abe1tos
no n1omento.
Formulários Windows Avançados 453
FIGURA 16.10
Fornnilários-jifhos ern
cascata.
~l!Plcture Vlew l!!!lrn E)
• Arrange lcons (Organizar ícones) Organiza todas as janelas 1ninimizadas de modo que. .
fiquem dispostas ern linha ao longo da parte inferior da janela-pai (veja a Figura 16. 11 ). E
útil para organizar janelas-filhas que não estejam em uso no 1no1nento.
FIGURA 16.11
O comando Arrange
lcons aplicado aos
for111ufários:fifhos.
Além dos itens co1nuns, o 1nenu Windo\.V nonnaltnente também apresenta un1a lista de todas as
janelas-filhas (veja a Figura 16.1 2). En1 geral esse recurso é cha1nado de lista de janelas. Ele lista
todas as janelas-filhas abertas e 1nanté1n tnna marca de seleção próxima à que estiver ativa. Em
vez de você mes1no desenvolver e fazer a 1nanuteoção do código que produzirá esse resultado, o
1454 Dia 16
Visual Basic .NET facilita a inclusão dessa lista. Apenas configure a propriedade Mi dLi st como
True para o menu de nível superior onde quiser adicionar a lista de janelas.
janelas.
.; -·-
il'l<l\Jre'llew
i~ Plrture 'llew
Para saber como se cria um aplicativo MDI, você desenvolverá u1n visualizador si1nples de figu-
ras. Crie un1 novo aplicativo Windows e chan1e-o de Multi Pi e Vi e1~. Altere o no1ne do formu lário
no Solution Explorer para Mdi Parent. Abra a tela de códigos do fonnulário e altere o non1e da
classe de Forml para Md i Pa rent. Para concluir, abra as propriedades do projeto e configure Startup
Object como MdiParent. Configure as propriedades do fonnulário como mostra a Tabela 16.3.
Propriedade Valor
Size 480, 360
Text Picture View
IsMdiContainer True
O usuário poderá acessar tnn 1nenu que lhe permitirá abrir novos arquivos a fi,n de visualizá-los.
Adicione os controles MainMenu e OpenFi l eOi a l og ao formu lário MDI-pai. ·Reno,neie o objeto
Ma i nMenu como mnuMa i n e construa o n1enu como mostra a Tabela 16.4. Configure as proprieda-
des de OpenFi l eOi a l og como descrito na Tabela 16.5.
O 1nenu File será usado para abrir novos arquivos de figuras e para encerrar o aplicativo. Adicio-
ne o código da Listage,n 16.3 ao for,nu lário para os itens do menu.
ANALISE O código deve ser semelhante ao que já vimos. O manipulador do evento File, Open
exibe OpenFi l eDi a l og (linha6). Se o usuário selecionar um arquivo, o código criará
un1 novo fom1ulário frmVi ew, que geraremos logo após, e configurará sua propriedade Mdi Parent
com o formulário atual (linha 8). .Em seguida, ele configura sua propriedade Pi cture com o ar-
quivo das figuras e exibe o novo formulário (linha 10). A figura é carregada na Jin_ha 9 por .meio do
rnétodo FromFi l e da classe Image que recupera uma figura armazenada em um arquivo.
O 1nanipulador do evento File, Exit é ainda 1nais sitnples, fechando o for1nulário atual. Isso faz
com que todas as janelas-filhas abertas també1n sejam fechadas, encerrando o aplicativo.
Além de escrever o código do menu File, você também deve criar o código dos comandos do
menu Windo\.v. A Listagem 16.4 1nostra esse código.
ANÁLISE Cada un1 dos quatro menus Window apenas executa o n1étodo LayoutMdi do formu-
lário MDl-pai, configurando a disposição desejada para os fonnulários-filhos.
Agora você está pronto para criar o formu lário que será usado para exibir as figuras. Adicione
tun segundo for1n ulário ao projeto selecionando os itens Project e Add Windows Form no rnenu.
Quando o no1ne for solicitado, no1neie o novo formulário co,no Pi ctureVi ew. Altere sua proprie-
dade Text para Pi cture Vi ew. Adicione u1n controle Pi ctureBox ao forn1ulário e configure as
propriedades desse controle como mostra a Tabela 16.6.
Acesse a tela do código e adicione uma propriedade públ ica ao formu lário cha1nada Pi cture que
representa a propriedade Image de Pi ctureBox. Deve1nos terminar com algo sen1elhante ao códi-
go da Lístagern 16.5.
7 End Set
8 End Property
ANALISE Do 1nesmo modo que você pode ter propriedades que representen1 valores privados
annazenados dentro da classe Form, também é possível ter propriedades que repre-
sente,n os controles no fonnulário ou propriedades exclusivan1ente relacionadas aos controles.
Nesse caso, a propriedade Pi cture foi usada para acessar a propriedade Image do controle pi cV i-
e1~. E1nbora isso pudesse ter si.do resolvido se tornásse1nos público o controle, seria proporciona-
do um nível 1nuito amplo de acesso a ele. lsso pennite que o código leia ou altere co1n facilidade a
figura, sem deixar que o código de um fotmulário diferente modifique outras infonnações sobre
Pi ctureBox.
Execute o aplicativo. Provavehnente você poderá abrir vários arquivos de figuras, co,no ve1nos
na Figura 16.13.
FIGURA 16.13
Multi Pi eVi ew e,11 açcio. t!Pl<lurr.Vlrw l!ICiJEi
situações. Existem muitos controles disponíveis no Visual Basic .NET que não foram abordados
neste livro e vários outros pode1n ser comprados. Seria difícil, se não impossível, abordar todos
os controles disponíveis em um único livro, ou como parte desta Jição. Portanto, 1nostrarei al-
guns dos mais i1nportantes e como usá-los.
TreeView
O controle TreeVi ew deve ser familiar para qualquer pessoa que tenha usado o Windows durante
•
algum te1npo. E o que aparece no lado esquerdo da janela do Explorer, ass.im como ern qualquer
outro lugar e1n que um n1odelo hierárquico é exibido. Ele pennite que você n1ostre ao usuário
uma lista de itens e seus relaciona1nentos. As figuras exibidas para cada item da lista poden1 ser
alteradas ou não exibidas de maneira algu1na. De maneira semelhante, as linhas que conecta1n os
itens pode1n ser personalizadas ou removidas. O controle TreeVi ew deve ser considerado se1npre
que for preciso exibir muitos itens relacionados e mostrar esses relacionainentos para os usuários -
por exe1nplo, para permitir que o usuário pesquise os diretórios, as pastas de correio eletrônico
ou crie a estrutura de um documento. A Figura 16. 14 1nostra o controle TreeVi ew e1n uso, exibin-
do uma lista de pastas de u1n disco rígido.
O controle TreeVi ew possui n1uitas propriedades, 1nétodos e eventos. A Tabela 16.7 descreve
aqueles usados com mais freqüência:
1460 Dia 16
Membro Descrição
Propriedades
Checkboxes Adiciona caixas de texto a cada item do controle TreeVi ew. Isso fac ilita a
criação de uma seleção múltipla.
Ful lRowSel ect Se esta propriedade for igual a True, a linha inteira será selecionada quan-
do um item for marcado. Como alternativa, apenas o texto de cada item
marcado será selecionado.
Nodes Esta é a propriedade mais importante do controle TreeVi ew. Ela contém a
lista de todos os itens de nível superior desse controle.
PathSeparator Usada quando um caminho é recuperado em um nó do controle TreeVi ew.
Esse caractere é empregado entre cada um dos nós. O padrão utilizado é
a barra invertida (\).
SelectedNode O nó selecionado atualmente no controle TreeVi ew.
Showlines Determina se serão traçadas linhas entre os nós do controle TreeVi ew.
Co1no descrito na Tabela 16.7, Nodes é a propriedade 1nais in1portante do controle TreeVi ew.
Cada item desse conjunto é u1n objeto TreeNode, e esse objeto é o ponto central de grande parte
do que é executado com o controle TreeVi e1~. A Tabela 16.8 descreve as propriedades e 1nétodos
i1npo1tantes da classe TreeNode.
Formulários Windows Avançados 461
Membro Descrição
Propriedades
Checked Usada junto com a propriedade Checkboxes do controle TreeVi ew. Esta pro-
priedade será igual a True se o objeto TreeNode for selecionado.
Fu 11 Path Retorna uma string que contém cada um dos nós abaixo do que foi selecio-
nado, todos separados pela propriedade PathSeparator do controle Tree-
Vi ew. Em geral, isso cria uma string semelhante a um caminho.
Nodes O conjunto de TreeNodes desse TreeNode.
Text O texto desse TreeNode.
Métodos
Collapse Recolhe a árvore começando com o nó atual.
Expand Expande a árvore começando com o nó selecionado.
Altera a árvore começando com o nó selecionado para minimizado ou ex-
Toggle
pandido; o estado em que não estiver no momento .
.Não são só os objetos TreeNode e todo o controle TreeVi ew que deve1n ser considerados irnpor-
tantes, u,n objeto adicional trunbé1n o é quando lidamos com esse controle. Ele é o conjunto re-
presentado pelas propriedades Nodes - os objetos TreeNodeCo 11 ect i on. U 1n desses conjuntos se
encontra no nível 1náximo da árvore e é refletido na propriedade Nodes de TreeVi ew. Além disso,
cada TreeNode desse conjunto possui seu próprio conjunto Nodes, representando todos os
nós-filhos desse TreeNode. A Tabela 16.9 descreve algu1nas das propriedades e n1étodos desse
i1npo1tante conjunto.
Membro Descrição
Propriedades
Count Determina quantos itens existem no conjunto.
Item Retorna um dos TreeNodes do conjunto. Esta propriedade pode ser aninhada -
por exemplo, tvwFo1ders. Nades. 1tem(3) . Nades. 1tem( 1) seria o segundo nó abaixo
do quarto nó de TreeVi ew. (Lembre-se de que os conjuntos começam em O.)
Métodos
Add Adiciona um novo nó ao final do conjunto atual. Pode ser um objeto TreeNode
ou apenas o texto a ser exibido para o novo nó.
Clear Remove todos os nós do conjunto selecionado.
IndexOf Retorna o número referente à posição do nó selecionado no conjunto.
Insert Adiciona um novo TreeNode à lista de nós em uma posição definida.
Remove Remove do conjunto um nó solicitado.
RemoveAt Remove um nó pelo índice no conjunto.
462 Dia 16
ListVie
O controle Li stVi ew também deve ser familiar para a maioria dos usuários do Windows co1no o
lado esquerdo dajanela Explorer, assi,n como e,n ,nuitos outros locais. Ele é se,nelhante a Li st-
Box, no fato de poder conter vários itens. No entanto, fornece mais recursos,já que pennite a exi-
bição dos itens de diversas maneiras. Os itens pode1n ser exibidos co1no utna lista, associados a
ícones grandes ou pequenos. Também é possível disponibilizar u,na lista co1.n detalhes adicionais
de cada ite,n. Para concluir, pode1nos usar Li stVi ew no lugar de um controle de grade porque ele
também pode exibir linhas de grade. A Tabela 16. l O mostra algumas das propriedades, métodos
e eventos n1ais importantes do controle Li stVi ew.
Membro Descrição
Propriedades
Checkboxes Determina se as caixas de seleção serão exibidas próximas a cada
item da lista. Essa é uma maneira excelente de criar uma lista com
seleção múltipla.
Checklndices Retorna o valor do índice de cada item selecionado em Li stVi ew. Isso
permite que você saiba que itens foram selecionados quando usar
Li stVi ew para criar listas com seleção múltipla.
Columns Quando ListView estiver no modo de exibição 'Detalhe', as colunas
poderão aparecer para que a lista fique o rganizada.
Ful l RowSe l ect Determina se a linha inteira ou apenas o text o do item será marcado
quando um item for selecionado.
Gridl ines Determina s e as linhas de grade s erão exibidas quando Li s tVi ew es-
tiver no modo de exibição ' Detalhe'. Isso permitirá que você faça
Li stVi ew se parecer com um simples co ntrole Gri d.
Items Representa o conjunto de todos os itens de ListView.
View Determina como Li stVi ew será exibido. As opções possíveis são Lar-
ge lcons, Smal I lcons, List ou Detail.
M étodos
Clear Remove todos os itens de Li stVi ew.
Eventos
ColumnClick
Ocorre quando o usuário dá um clique no cabeçalho de uma coluna.
Pode ser usado para alterar a ordem das colunas. Exatamente como o conjunto Nodes do controle
TreeView, a propriedade 1nais itnportante de Li s t Vi ew é o conjunto Items. Cada iten1 do conjunto
Items é um objeto Li stVi ewltem. Esse objeto, por sua vez, possui 1nétodos e propriedades que re-
presentam o que é possível fazer corn cada iten1 de Li stVi ew. A Tabela 16.11 descreve as mais
impottantes entre essas propriedades.
Form ulá rios W indows Avançados 463
Membro Descrição
Propriedades
Checked Usada junto com a propriedade Checkboxes de Li stVi ew, esta propriedade
será igual a True se um item for selecionado.
Index Retorna a posição do item em ListView.
Sel ected Determina se Li stVi ewltem foi selecionado.
Subi tems Usada junto com o modo de exibição 'Detalhes' e a propriedade Col umns.
Esta propriedade contém as informações que serão exibidas nas colunas
adicionais.
Enquanto TreeVi ew possui objetos TreeNodeCo 11 ect i on refletindo os conjuntos de objetos Tre-
eNode, Li stVi ew apresenta objetos Li stVi ewI temCo 11 ect i on. Entretanto, esse conjunto é n1enos
iinpo1tante do que a propriedade que corresponde a ele em TreeView, já que Li stVi ew não apre--
senta a n1esma hierarquia de nós. Em vez disso, há basica1nente apenas un1 objeto Li stVi ewitem-
Co 11 ect i on. A Tabela 16.2 descreve algumas das propriedades e 1nétodos irnportantes desse
conjunto.
Membro Descrição
Propriedades
Count A quantidade de itens em ListViewCollection.
Item Retorna o objeto ListVie~1Item da posição solicitada.
M étodos
Add Adiciona um novo objeto ListViewltem ao fi nal do conjunto. O novo item
pode ser um objeto Li stVi ewltem ou o texto a ser exibido para o item.
Clear Remove todos os itens do conjunto.
IndexOf Retorna o índice, ou posição, do objeto Li stVi ewl tem solicitado.
Insert Adiciona um novo objeto Li s tVi ewl tem ao conjunto em uma posição solici-
tada.
Remove Remove um objeto ListViewltem do conjunto.
RemoveAt Remove um item do conjunto pela posição.
an·astar esse separador de u1n lado para outro, alterando o ta1nanho relativo dos dois controles
(veja a Figura 16. 15). Esse é o controle Spl itter. Ele é um
,
controle simples, cuja única finalida-
de é permitir esse tipo de reditnensiona,nento dinâtnico. E usado junto cotn dois controles encai-
xados. Un1 fica ancorado a um dos lados do formu lário-pai, enquanto o outro ten1 sua
propriedade Dock configurada co1n Fi 11 .
,
E raro ter de usar qualquer das propriedades do controle Sp li tter. No entanto, há algumas pro-
priedades que você pode querer configurar para personalizar o comportamento do controle. Elas
são descritas na Tabela 16. l 3.
Membro Descrição
BackCol or Como nos outros controles,, esta propriedade define a cor de plano de fun-
do do controle Spl itter. E útil para ajudar o usuário a perceber a existên-
cia desse controle.
Doe k Configura a direção do controle Sp1i t ter. Se configurado para um lado,
será usado na alteração da altura dos dois controles. Se for encaixado na
parte superior ou inferior do formu lário, será empregado para alterar a lar-
gura dos dois controles.
mi nSi ze Define um tamanho mínimo para o controle que não fo r configurado como
Fi 11 . Será útil se você não quiser que as informações de um lado do con-
trole Sp 1i tter fiquem ocultas.
Para ver con10 esses três controles podem ser usados no desenvolvimento rápido de un1 aplicati-
vo, criaremos um clone do Explorer, pennitindo que o usuário navegue pelas unidades, exami-
nando os arquivos ar1nazenados nelas.
Crie um novo aplicativo Windows. Cha1nei o 1neu de Pioneer, mas você pode dar o non1e que
quiser ao seu. Altere o no,ne do arquivo do formulário gerado para Pi oneerForm, e a classe criada
para fnnPi oneer. Confi gure o Startup Object do projeto co,no fnnPi oneer usando a caixa de diá-
logo Project Propetties. Cotnpile o aplicativo uma vez para se ce1tificar de que não haja erros.
A inte1face corn o usuário será simples - co,nposta dos controles TreeVi ew, Li stVi ew e Sp li t ter
(veja a Figura 16.16).
Redimensione o for1nulário para torná-lo 1naior que o padrão. Configure essa e outras proprieda-
des confor1ne o descrito na Tabela 16.14.
f~ptvlcw SyJtem.V.~.f(lrffi$,5p..:] ;
~
~ U . El llli t
1
i
,..,..,.,.
""""' .
is
lati~ 1
,~ l't\.11:1
e conr,.,...a<1ons
m(Ovnomcf,op,orti
1 °""'
B (o.t.,..s..,)
m
i - TOQ
B .,....,.
locktd
~s
°"
"
....,..
fabo
Private
~Vãcbtlon rrue
8
1 l(l)'OUI
Dock l,/l
' e LouàM
1L
::::-=i.
iz1,~o
...._......,,odelO
kSMl.fy ~ cb,ec,.
l •
Propriedade Valor
Name FrmPioneer
Text Pioneer
Size 480, 330
Adicione u,n controle TreeVi ew ao fonnulário. Configure as propriedades como as que vemos na
Tabela 16.15.
1 466 Dia 16
Adicione o controle Sp 1i t ter ao formulário e altere seu nome para sp 1Vi ew. Suas outras proprie-
dades já apresentatn padrões adequados. Agora adicione um controle Li stVi ew ao fonnulário.
Configure as propriedades como o descrito na Tabela l 6.16.
Quando o pritneiro formulário for carregado, o controle TreeVi ew deve exibir as unidades disponí-
veis (veja a Listagetn 16.6). Cotno cada unidade selecionada, seus diretórios serão exibidos em Tre-
eVi ew, e os arquivos de cada diretório etn Li stVi ew. Em princípio, no entanto, apenas TreeView será
preenchido co1n as tmidades disponíveis. Já que o objeto Oi rectory é usado nesse código, você tam-
bém deve it1cluir Imports System. IO no mício dele. Isso permitirá que você empregue o objeto
Oi rectory sem ter de qualificá-lo totalmente (isto é, setn ter de escrever Sys tem. IO. Oi rectory).
ANÁLISE O método Getlogi ca 1Drives da classe Di rectory é compartilhado e retorna u1n ar-
ray contendo os no1nes de todas as unidades disponíveis no computador. Aí estão in-
cluídas unidades de disquete, de CD-ROM, de rede n1apeada e outros dispositivos que se pareça1n
con1 urna unidade de disco rígido. A linha 6 preenche esse array e o bloco For Each ... Next execu-
ta um laço nele. Adicionamos isso ao controle TreeVi ew con10 un1 objeto TreeNode (linha 11) e in-
serimos na linha 13 un1 nó-filho com o texto dunmy. Esse nó-filho serve a dois propósitos: n1arca
os nós que ainda não abri1nos e assegura que haja um caractere próximo a todos os nós. Se não
houver nenhum nó-filho e1n u1na árvore, o controle não adicionará um sí1nbolo de adição e não
ficará evidente a possível existência de filhos . .Adicionar u1n nó fictício que será removido posterior-
1nente é uma estratégia co1num para fazer com que todos os nós pareçam ter filhos.
O controle TreeView apresenta duas funções. Quando um diretório é selecionado, seus arquivos
são adicionados a Li stVi ew. E quando un1 nó é expandido e1n TreeVi ew, os diretórios-filhos do
diretório selecionado são adicionados ao controle TreeVi ew. A Listagem 16.7 1nostra esses dois
tnanipuladores de eventos.
ANÁLISE Um dos recursos do controle TreeVi ew é que para cada operação que afete os nós da
árvore há um evento Before e Lun After. Os eventos Before, como o manipulador de
eventos BeforeExpand (linhas 17 a 30 da listagem do código), fornecem tuna chance para cancelar
o evento ou fazer alterações antes que seus efeitos sejam exibidos. No caso do evento BeforeEx-
pand, você pode alterar o conteúdo dos fi lhos do nó antes que a lista seja expandida. Len1bre-se de
que anterionnente adiciona111os um nó fictício para garantir que cada nó tivesse u1n sinal de adi-
Formulários Windows Avançados 469
ção próximo a ele, implicando que poderia ser expandido. O manipulador de eventos BeforeEx-
pand é o melhor local para ren1over esse nó fictício e adicionar os reais. Depois, se não houver nós
fictícios, não teren1os de fazer nenJ1uma alteração porque TreeVi ew conhecerá os nós adicionados.
A rotina corneça pela atribuição do nó afetado a uma variável te1nporária. [sso não é totahnente
necessário porque o código poderia ter sido escrito com o uso de e. Node e,n vez de oNode. No en-
tanto, usar u,na variável ternporária como essa ou o bloco Wi th ... End Wi th é um born hábito, já
que é urn pouco rnais eficiente. A seguir, o código tenta encontrar o nó fictício (linha 24). Se ele
existir, será removido, e os filhos reais serão adicionados por meio da sub-rotina GetChi l dren
(descrita mais à frente). Se o nó fictíc io não existir, nada será feito porque já preenchernos Tree-
Vi ew con1 os nós-filhos apropriados.
O manipulador de eventos tvwFo 1ders AfterSel ect é onde Li stVi ew é preenchido com os arqui-
vos do TreeNode selecionado. No início ele recupera os nomes de todos os arquivos usando o 1né-
todo compa,tilhado GetFi 1es da classe Di rectory (linhas 21 e 22). Esse método retorna o
can1inho completo para todos os arquivos en1 u,n diretório solicitado. O segundo parâ,netro para
o rnanipulador de eventos AfterSe 1ect, e, possui duas propriedades de interesse:
• Act i on Por que o nó foi selecionado? Isto é, isso aconteceu durante uma operação de
expansão, de recolhimento ou apenas quando o usuário selecionou o nó?
• Node O nó que foi selecionado. Essa é u1nan1aneira1nais fáci l de recuperar o nó selecio-
nado do que a alternativa tvwFolders.Selectedltem.
Qualquer nó de um controle TreeVi ew pode recuperar seu caminho nesse local. O caminho é
composto de todos os ca,ninhos-pais, co,neçando co,n o nó-raiz, separados pelo caractere Path-
Separator do controle TreeVi ew. Já que ele tem co,no padrão o caractere de barra inve1tida, essa
é urna rnaneira fácil de recuperar um caminho semelhante ao da unidade. Por exe1nplo, se o nó
System32 for filho do nó Winnt, que é filho de C:\, a propriedade FullPath do nó System32 seria
e: \l~i nnt \Sys tem32. Esse caminho é passado para o método GetFi 1es, que é um método compar-
tilhado da classe Di rectory e retorna u1n array de strings co,n todos os arquivos do diretório. Um
laço For Each ... Next (linhas 27 a 29) é usado para preencher Li stVi ew cotn todos os nomes de
arquivo, porém, prin1eiro o conteúdo completo de Li stVi ew é apagado (linha 25). Observe que o
conteúdo de cada diretório é recuperado sernpre que TreeNode é selecionado; nenhuma tentativa
de armazenar essa lista é feita.
O procediinento GetChi 1dren é usado para preencher um TreeNode com seus nós-filhos (linhas
58 a 68). O n.ó que será adicionado é passado para a rotina a fim de ajudar a determinar os subdi-
retórios e identificar o TreeNode que será preenchido. Observe que o ca1ninho existente do nó se-
lecionado não é passado porque isso pode ser detenninado por meio do método Ful 1Path do nó
(linha 59) como fizen1os anteriormente no manipulador de eventos AfterSe 1ect. O método com-
partilhado Di rectory. GetDi rectori es é usado para recuperar u,n array de strings que conté,n os
subdiretórios do diretório selecionado. O código restante é sernelhante ao usado quando as uni-
dades foram adicionadas a TreeVi ew. O cruninho é removido do norne do diretório selecionado
(linha 64), e um nó fictício é adicionado para assegurar que o nó tenha a aparência de que pode
ser expandido (linha 66).
1470 Dia 16
A função Stri pPath é usada por outros procedimentos para remover o ca1ninho de um non1e de
arquivo, deixando apenas o nome. Essa rotina (linhas 70 a 78) usa o 1nétodo LastindexOf do ob-
jeto de string para e11contrar a última posição de um caractere selecionado, nesse caso a ba1Ta in-
vertida, "\". Tudo que estiver antes dessa última barra invertida deve ser o ca1ninho, enquanto o
que houver depois dela pode ser o nome real do arquivo. Para concluir, a linha 76 extrai e retorna
o texto co1neçando pelo caractere após a últin1a barra invertida.
Compi le e execute o aplicativo. Você deve ver algo se1nelhante à Figura 16.17, dependendo de
seu conjunto de unidades e diretórios. Você também pode navegar pelos diretórios, e os arquivos
de cada um deles será exibido. Agora temos u1n ponto de partida para criar seu próprio explora-
dor de arquivos. Talvez queira estender Pioneer para adicionar outros recursos, con10 a capaci-
dade de inserir diretórios, alterar a visualização dos arquivos, adicionar fi guras e assi1n por
diante.
i !PIOllt!ff
--- - l!!I~ f:i
FIGURA 16.17 f€. A,\
- --
Ai~n/o'fb
-
e e-, i'looe«rln
O f>ioneer en, ação. l Piotiocf.wo
P'iorieff.vb1m~
Pionca vb11•01utef
&) cmdccnt
Pionedf'anu.u:
Corb;)t.l;I Pione,ed'«"'-vt,
3- d.,:ti>Clo:d
Ooameit, ~ Setrf'I~
!\. d,
~ 1- Olrw'Cfa
lnooJ:,n
lft:~'11
Pfog«nFk:
REC'l'CLER
-
SOAPSD~
Sr.tem Voll.m: l.rtoim..,tion
l od:
~ Wirdow. CE ioob
t-i wuun
S-Woik
:;;.o~~
S Oo,,16
• M"""
Zi) M~ ê w
e li!Z:I
l!l bn
1D oq
í.tl Oàyl7
Ooy21
E!i D:\
E.\
Resumo
,
E claro que há 1nuitos outros tópicos a aprender relacionados aos fonnulários Windows. Além
disso, vários outros controles que estão disponíveis na caixa de ferramentas não foram descritos.
Teste-os para ver co1no podem ajudá-lo e1n seus aplicativos. Se você encontrar e1n outro aplica-
tivo utn recurso que goste, tente encontrar o controle, ou possivelmente a configuração da pro-
priedade, que pennitirá reproduzi-lo e1n seus próprios aplicativos.
Formulários Windows Avançados 471
Você deve ter percebido que, na verdade, te.mos usado objetos e1n todos os nossos aplicativos.
No entanto, você deve aprender a criar seus próprios objetos. No próximo capítulo (Dia), conti-
nuaren1os nosso aprendizado sobre o .NET Frainev, ork e algu1nas classes itnportantes que serão
1
P&R
P Como você associaria Ctrl+B a um item de menu de modo que pressionando essa
combinação de teclas um código fosse executaclo para esse item?
R Adicione uma tecla de atalho a um item de menu por meio da propriedade ShortcutKey.
Selecione o ite1n Ctrl B na lista suspensa dessa propriedade.
P O que acontece se a propriedade Mdi Parent de um formulário não for configurada
antes de sua exibição?
R Se você não definirMdi Parent para u1n fonnulário co,n a propriedade IsMdi Contai ner con-
figurada corno True, o novo fonnulário não ficará armazenado dentro de Mdi Parente pode-
rá ser transferido para fora dos limites do formulário-pai.
P Qual seria o resultado da execução deste código se tv Folders fosse um controle Tree-
Vie de um formulário?
Dim oltem as TreeNode
oltem = tvwFolders.Nodes.Add(''One'')
With oltem.Nodes.Add(''Two'')
.Nodes .Add(''Three'')
.Nodes.Add( ''Four'')
End With
R Quatro itens seria,n adicionados a TreeVi ew. O nó-raiz teria o texto One e um nó-filho, Two,
que possuiria dois nós-filhos, Three e Four. O bloco Wi th ... End ... Wi th é uma alternativa a
armazenar um nó en1 uma variável TreeNode quando nós-filhos fore1n adicionados.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar em co1no colocar seu conheci1nento em prática. As respostas do teste estã.o
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
I. Qual a melhor 1naneira de organizar as janelas-filhas de urn aplicativo MDI para visuali-
zar as barras de título de todos os filhos?
472 Dia 16
Exercícios
1. Encontre exen1plos de aplicativos MDI e SDI que você nonnalinente use. Fica mais fácil
ou mais difícil 1nanter o registro de vários docu1nentos quando se trabalha co1n eles?
2. Atualize o aplicativo Pioneer que você desenvolveu durante esta lição para que exiba os
arquivos por meio do 1nodo de exibição 'Detalhe' do controle Li stVi ew. Adicione colu-
nas para apresentar os atributos ReadOn ly, Hi dden e System de cada arquivo. Alé1n disso,
mostre em outra coluna a últitna vez que o arquivo foi alterado.
SEMANA 3
DIA
Fluxos e Arquivos
Muitos aplicativos do Visual Basic .NET que você escrever terão de lidar co111 arquivos de al-
gum tipo. Pode ser preciso criar arquivos, ler arquivos de configuração ou encontrar arquivos
nas unidades do usuário. Portanto, aprender a trabalhar con1 arquivos é uma habilidade iinpor-
tante, necessária ao desenvolvedor do Visual Basic .NET.
Quando você co111eçar a trabalhar com as classes do .NET Framevvork, principalmente ao escre-
ver aplicativos para lidar co1n arquivos, se deparará co1n freq üência co111 itens que usam a pala-
vra 'Stream', por exe1nplo: Fi l eStream, TextStream, StreamWri ter e NetworkStream. Como deve
ter percebido, eles estão relacionados. Os projetistas do Visual Basic .NET e do .NET Frrune-
,.vork tentaram facilitar o uso do Framework definindo tudo da maneira mais consistente possí-
vel. Uma maneira pela qual fizeram isso foi empregando os 1nesn1os tipos de objetos e1n muitos
locais. Um grupo desses objetos é o objeto Stream, seus filhos e as classes utilizadas para traba-
lhar co111 Strea1ns. Essas outras classes incluem várias classes Readere Wri ter, Encoders e 1nui-
1 474 Dia 17
tas outras. Enfocaremos as essenciais, mas à n1edida que avançarmos mais, será perceptível a
fa1niliaridade de outras classes dessa fa1nília.
O Que É um Stream?
O tenno 'strea,ns', co1no 1nuitos usados em co,nputação, é uma tentativa de no1near algo que
le1nbre u1na equivalência do inundo real. Um strea1n. no mundo real é uma pequena quantidade
de água, flu indo. U1n fluxo de co1nputador é se1nelhante- é um fluxo de infonnações que pas-
sam de maneira seqüencial. No entanto, a menos que você tenha um arquivo sobre os rios do
mundo, tenho certeza de que provavelmente não pensará e1n água quando exa1ninar os arquivos
da unidade de seu disco rígido. Porém, iinagine-se co1no parte de sua unidade de disco rígido que
lê arquivos. Tudo o que ela vê é tuna série de informações, fluindo seqüencialmente- u1n 'fluxo.
Depois de Ílnaginar os arquivos como tnn fluxo, será mais fácil trabalhar com eles. Então, seja o
arquivo binário ou algum que contenha texto, será possível lidar com ele da 1nesma 1naneira. Isto
é, abra o arquivo, manipule-o e grave nele utilizando os mes1nos tnétodos porque são todos flu-
xos. Além disso, essas habilidades tatnbém se aplica1n a outros itens que se parece.1n com fluxos.
Não os abordare,nos neste livro, mas aí se incluem as comunicações de rede, a 1nemória de seu
cotnputador, dados criptografados e muitos outros recursos. Aprendendo a ler e gravar arquivos
simples de texto, já saberemos como trabalhar com qualquer um desses fluxos.
Arquivos e Diretórios
Antes de co.1neçarmos a criar fluxos, no entanto, passaremos algu1n tempo examinando co1no
encontrar, gerar e excluir diretórios e arquivos. Isso pennitirá que você localize arquivos e crie
diretórios para armazenar seus aplicativos.
Como vimos no Dia 8, o .NET Fratnework é dividido e,n u1na série de espaços de nomes. Cada
utn contém várias classes que estão relacionadas de algum modo. Lembre-se de que no Dia 8,
trabalhamos co,n conj untos (como Arrayl i st e Queue), e eles fora1n reunidos no espaço de nome
System. Co 11 ect i ons. De maneira sen1elhante, todas as classes de arquivos e de diretórios (e flu-
xos) estão agrupadas no espaço de nome System. 10. Esse espaço de non1e não está, como se
pode pensar, relacionado à lua altamente vulcânica de Júpiter, tnas, em vez disso, à entrada e à
saída. O espaço de nome System. 10 é u1n dos mais usados no .NET Framework por essa razão.
Embora un1 espaço de nome relacionado co1n a lua de Júpiter pudesse ser útil, não seria tão utili-
zado. Sempre que quiser abrir, ler, gravar ou apenas 1nanipular u1n arquivo ou fl uxo, você preci-
sará desse espaço de nome. Felizmente, o Visual Basic .NET se1npre o inclui quando cria um
novo aplicativo Windows, po1tanto ele en1 geral está disponível.
Se você pesquisar o espaço de noine System. 10 na ajuda on-line, verá duas classes que não irão
surpreendê-lo - Fi 1e e Oi rectory. Essas duas classes são convertidas en1 arquivos e diretórios.
Elas possuem propriedades e 1nétodos que representam o que se espera de arquivos e diretórios.
Por exe1nplo, a classe Oi rectory possui métodos para recuperar subdiretórios, acessar a lista de
arquivos do diretório e assim por diante. De 1naneira setnelhante, a classe Fi 1e tetn 1nétodos que
Usando o .NET Framework
são usados para abrir o arquivo, copiá-lo e recuperar informações sobre ele. A Tabela 17 .1 lista
os métodos impo11antes do objeto Di rectory, enquanto a Tabela 17.2 1nostra os n1étodos impor-
tantes da classe Fi 1e.
Método Descrição
CreateDirectory Cria um ou mais diretórios. Uma das funções mais poderosas des-
ta classe é gerar uma árvore inteira de diretórios.
Delete Remove um diretório.
Exists Retorna True se o diretório existir.
GetCurrentDirectory Retorna o caminho completo do diretório atual.
GetDi rectori es Retorna um array contendo os diretórios-filhos do diretório dese-
jado.
GetFiles Retorna um array contendo os arquivos do diretório solicitado.
Método Descrição
Copy Copia um arquivo.
Create Cria um novo arquivo.
CreateText Uma versão especial de Create que cria um arquivo de texto.
Del ete Exclui um arquivo.
Exists Retorna True se o arquivo existir.
Open Abre um arquivo para leitura, gravação ou ambos.
OpenRead Versão especializada de Open que sempre abre o arquivo para leitura.
OpenText Versão especializada de Open que abre arquivos de texto apenas para lei-
tura. Esse seria um atalho prático caso você estivesse escrevendo um
aplicativo que precisasse ler informações sobre configuração ou um ar-
quivo de registros.
OpenWrite Versão especializada de Open que sempre abre o arquivo para gravação.
Criando Arquivos
Como você pode ver nas Tabelas J7.1 e 17.2, vários métodos das classes Fi 1e e Di rectory po-
den1 ser usados na pesquisa e criação de arquivos e diretórios. Esse é un1 ótimo exemplo da orien-
tação a objetos em ação- classes que representa1n objetos do inundo real agindo como esse obje-
to. Por exe1nplo, u1n diretório deve ter conhecimento de que diretórios-filhos possui. De maneira
se1nelhante, deve-se poder solicitar a um arquivo que abra a si mes1no.
476 Dia 17
Muitos dos métodos das classes File e Oi rectory são compartilhados (sha-
NOTA red). Isso significa que você não precisa criar um objeto para usá-los; apenas
empregue a classe para acessá-los. Por exemplo, o método Exi sts da classe
File é compartilhado. Para saber se um arquivo existe, não é necessário decla-
rar uma instância da classe File; utilize a própria classe. Portanto, em vez de
escrever:
Dim oFile As New Fi le()
bExists = oFile.Exists(''algumarquivo.txt'')
determine se um arquivo existe com o código a seguir:
bExists = File.Exists(''algumarquivo.txt'')
Nome Descrição
CanRead (Propriedade) Igual a True se o arquivo puder ser lido. Esta é uma propriedade
adequada em testes para evitar uma exceção que poderá ocorrer
se o arquivo estiver bloqueado ou for aberto apenas para grava-
ção.
CanSeek (Propriedade) Igual a True se você puder pesquisar (isto é, mover-se para a frente
e para trás) no arquivo. É uma boa propriedade em testes para evi-
tar que uma exceção ocorra quando um arquivo no qual não for
possível mover-se para trás for lido. Isso é raro nos arquivos, mas
freqüente em alguns outros tipos de fluxos.
CanWri te (Propriedade) Igual a True se você puder gravar no arquivo. Essa é uma boa
propriedade em testes para evitar uma exceção que poderá
ocorrer se o arquivo estiver bloqueado ou for aberto apenas
para leitura.
Length (Propriedade) Quantidade de bytes do arquivo.
Posi ti on (Propriedade) A posição atual do arquivo.
Cl ose (Método) Final iza Fi l eStream. Sempre encerra a classe Fi l eSteam (ou qual-
quer classe Stream) quando você termina de usá-la.
Usando o .NET Framework 477
Nome Descrição
Read (Método) Lê vários bytes de Fi 1eStream. Eles são retornados para você em
um array.
Seek (Método) Provoca a movimentação para a frente e para trás em um arquivo.
Wri te (Método) Grava vários bytes em FileStream.
O proble1na dos 1nétodos Read da classe Fi 1eSt ream é que tende1n a não ser muito convenientes
porque todos lidam com bytes. E1n vez de usá-los, você pode aplicar StreamReader à Fi 1eStream
para ler as infonnações do arquivo de uma maneira mais natural. A Tabela 17.4 mostra os méto-
dos itnportantes de StreamReader.
Nome Descrição
Close Finaliza StreamReader. Sempre encerra suas classes StreamReader quando
você termina de usá-las.
Read Lê o próximo caractere de Stream. Será adequado se você estiver lendo
um caractere das informações de cada vez.
ReadBlock Lê um bloco de caracteres de Stream. Pode ser uma maneira rápida de ler
as informações de uma classe Stream.
ReadLine Lê a próxima linha de Stream. É uma maneira adequada de manipular ar-
quivos que fornecem informações organizadas por linhas.
ReadToEnd Lê todos os caracteres de Stream de uma só vez. É o meio mais rápido de
extrair todas as informações de Stream e inserir em uma variável.
A Listagem 17. 1 mostra uma 1naneira co1num de abrir um arquivo de texto e ler o conteúdo em
u1na variável string.
A Listage,n 17.2 mostra um exen1plo típico de un1a gravação e1n u1n arquivo de texto.
Os 1nétodos de StreamWri ter deve,n ser fruniliares; são os mesmos que usa,nos na classe Conso-
1e. Essa també1n é uma classe StreamWri ter - projetada para gravar no console.
Agora reúna leitura e gravação e crie u1n aplicativo simples que use as três classes principais que
discutimos: Fi l eSt ream, StreamReader e Stream\~ri ter. Como exemplo, gerare,nos u,n substitu-
Usando o .NET Framework
to simples para o Bloco de notas que permitirá a leitura e gravação de arquivos de texto. Poste-
riormente ele poderá ser estendido para permitir a criação de outros tipos de infortnações.
Crie urn novo aplicativo Windows e charne-o de Note. Afinal, é um programa seu. Como sem-
pre, a primeira etapa após a criação do projeto é se certificar de que o formulário principal não
seja charnado de Forml. Abra o formulário na tela do código, localize e substitua Forml por
frmMain. Da mesrna 1naneira, reno1neie o arquivo como frmMain. vb. Para concluir, abra a caixa
de diálogo das propriedades do projeto e configure Startup Object como frmMa i n. Execute uma
compilação para assegurar que não haja erros.
Adicione u1n controle TextBox ao fon11ulário e configure suas propriedades confonne o descrito
na Tabela 17.6.
Propriedade Valor
(Name) TxtText
Multiline True
Text (deixe em branco)
Scrollbars Vertical
Dock Fi 11
Para fazer com que seu bloco de notas fique igual ao do Windows, você precisará de u1n menu.
Dê um clique duplo no itern Mai nMenu da caixa de ferran1entas para adicionar um . Corno sen1pre,
altere o nome para mnuMain. Adicione os itens 1nostrados na Tabela 17.7.
.!.l
Usando o .NET Framework 481
Agora que a interface com o usuário está coo.figurada, precisamos adi.cionar o código.
Primeiro, adicionare1nos o espaço de nome System . IO ao projeto e ao formulário. Abra a pasta
References no Solution Explorer.Você deve ver u1n espaço de nome System incluído na lista-
gem, ,nas não Sys tem. I O, o que é bom. Os itens da caixa de diálogo References representan1 as
bibliotecas (DLLs) que serão reahnente usadas para localizar o código quando seu aplicativo es-
tiver etn compilação. Cada uma dessas DLLs pode conter vários espaços de nome. U1n deJes é
System. IO. Para tornar tudo 1nais fácil no 1no1nento da codificação, no entanto, també1n pode-
mos querer i1nportar os espaços de no1ne que empregare1nos. lsso permitirá a utilização de ata-
lhos quando fizermos referência às classes. Para obter ,nais detalhes, veja a nota a seguir.
Importe o espaço de nome System . IO para economizar na digitação. Adicione a Imports
System. IO a primeira linha, antes de Publ ic Class frmMain.
/-----
NOTA
Muitas pessoas que começam a usar o Visual Basic .NET confundem-se com
as referências e quando empregá-las no lugar da instrução Imports. As referên-
cias são adicionadas por meio do Solution Explorer ou do menu Project. Elas
representam os outros componentes que seu aplicativo usará. Se você for em-
pregar um código que exista em outra DLL - qualquer dos espaços de nome
que vêm com o .NET Framework que não sejam automaticamente adicionados
ou um código que foi escrito por outro desenvolvedor ou empresa-, será pre-
ciso adicioná-la às referências de seu projeto. A instrução Imports pode ser
considerada como uma ferramenta para encurtar seu código. Utilizando essa
instrução, é possível evitar a necessidade de escrever nomes longos de clas-
ses. Por exemplo, quando o controle TextBox for adicionado a um formulário,
o Visual Basic .NET usará a linha de código a seguir:
Private WithEvents txtText As System.Windows.Forms.TextBox
Portanto, o nome completo da classe é System. Windows . Forms. TextBox. No en-
tanto, se você adicionar Imports System. Windows. Forms ao início do arquivo,
poderá encurtar isso para:
Private WithEvents txtText As TextBox
Quando o Visual Basic .NET ler TextBox, usará o espaço de nome adicionado
com a instrução Imports para procurar a classe TextBox.
Assim, se você usar um espaço de nome, ele deverá ser incluído na seção Re-
ferences. Se quiser encurtar seu código, utilize a instrução Imports.
1482 Dia 17
.A seguir, adicione duas propriedades novas ao fonnulário. Adicione uma propriedade para con-
trolar o no,ne do arquivo (co,n o caminho) e se algo foi alterado. Acrescente o código da Lista-
gem 17.3 ao progran1a logo após a linha Inherits System.l~indows.Forms.Form.
A seguir, adicione a caixa About (Sobre). Afinal, ela é a parte mais importante de 111uitos aplica-
tivos: permite que as pessoas saibam quem é o responsável por eles. Para simplificar, use Messa-
geBox para 1nostrar a infonnação.
Dê um clique duplo no item Help, do n1enu About, para acessar o editor de códigos. Adicione o
código 1nostrado na Listage,n 17.4.
ANALISE A caixa About do aplicativo Note é apenas uma caixa de mensagens. No código,
crian1os e preenchemos uma variável string (linhas 3 a 6). Observe que estamos adi-
cionando novas linhas à mensagem inserindo Centro l Chars. CrL f no meio da string. Esse símbolo
representa u1na combinação de retorno de carro (Carriage-retum) e alimentação de linha (li-
oe-feed) incluída na string, o que cria uo1a linha nova. Para concluir, exibiinos MessageBox (linha
7), incluindo o botão OK e o ícone lnfor,nation.
Qual a intenção de se usar 'Carriage-return, line feed'? Por que não empregar
NOTA apenas newline ou algo mais simples? Como sempre, as razões estão basea-
das nos dias longínquos e obscuros da computação (talvez 30 anos atrás).
Antigamente, quando as pessoas usavam computadores, não trabalhavam
com monitores e mouses. Utilizavam máquinas de teletipo, que funcionavam
de maneira muito parecida com as máquinas de escrever com as quais se as-
semelhavam. Como qualquer pessoa que já tenha trabalhado com uma má-
quina 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 operações, nos leva de volta ao início da linha e para a linha seguinte.
Retorno de carro= mover o carro (o objeto que contém o papel e o cilindro) de
volta à posição de retorno (ou início da linha). Alimentação de linha = passar
para a próxima linha. Portanto, retorno de carro, alimentação de linha significa
"passe para o início da próxima linha". Carriage-return, line-feed é uma gran-
de quantidade de palavras até para os profissionais de computação de modo
que costumava ser abreviada para CRLF. No Visual Basic .NET, esse recurso
está disponível como Contro 1Chars. CrL f.
1484 Dia 17
.Agora é hora de fon1ecer algu,na funcionalidade ao programa. Comece com o menu File, como
na Listagern 17.5.
ANÁLISE Esse código pode parecer ,nuito extenso, ,nas analisare,nos algun1as etapas isolada-
mente para ver o que ele faz, co1neçando com o co1nando New do menu File das li-
nhas l a 15. Adicionamos a propriedade Oi rty para que nos permita determinar se o texto foi
alterado de algu1na 1naneira. Se tiver sido, precisamos nos certificar de que o usuário não tenha
acidentalmente eliminado essas alterações. Po11anto, se ele solicitar um novo arquivo depois de
fazer as alterações, devemos avisá-lo. Esse nada mais é do que o compo11amento adequado - pro-
teger o usuário de pressionar u,na tecla por acidente. Se o arquivo estiver sujo (alterado), pergun-
taremos se não há problemas em perder as alterações (linhas 3 a 9) e criar um arquivo novo. Se
não houver problema (linha IO da listagem) ou se não houver alterações (linha 13 da listagem),
criaremos NewFi l e. O procedimento NewFi l e será gerado posteriorn1ente. Já que há vários locais
onde podemos criar um arquivo novo, é uina boa idéia inserir esse código en1 um procedimento
próprio.
A seguir, ve1nos o ite1n Open do 1nenu File (linhas 16 a 40). Aqui co1neça1nos a usar as classes
para trabalhar co,n os arquivos. E1npregare1nos ta1nbé1n un1 objeto Fi l eSt ream (linha 19) e um
StreamReader (linha 20). Len1bre-se de que Fi l eStream na verdade é apenas um tipo especial de
objeto Stream. Depois de declarar essas duas variáveis, pennitimos que o usuário selecione um
arquivo a ser aberto (linha 21) utilizando o controle Fi l eOpenDi a1og adicionado ao formulário.
Se ele tiver selecionado u1n arquivo, poderemos abri-lo. Observe que estamos tentando abrir
esse arquivo dentro de u,n bloco Try ... End Try (linhas 23 a 38). Abrir arquivos pode ser propen-
so a exceções - o arquivo pode não existir, não estar disponível, ter sido bloqueado por outro
usuário e assi,n por diante. Qualquer dessas ocorrências poderia levar a u,na exceção. Portanto,
sen1pre que você quiser abrir un1 arquivo, deve usar uin bloco Try ... End Try.
Faça
1
USE um bloco Try ... End Try para capturar ex-
ceções ao lidar com arquivos - quando for
abrir, excluir ou salvá-los. Empregue sempre
a seção Final ly do bloco para fechar o arqui-
vo e outras classes de fluxo, leitura ou grava-
ção que tenha utilizado para acessá-lo.
Usando o .NET Framework
Dentro do bloco Try ... End Try, primeiro recuperamos o no1ne do arquivo (inclusive o caminho)
para que seja aberto na caixa de diálogo (linha 24). Esse no1ne será exibido na barra de título da
janela de Note. A seguir (linha 25), usamos o método compartilhado OpenRead para abrir o arqui-
vo. Le1nbre-se de que os 1nétodos compa1tilhados não precisa1n de uma instância do arquivo,
mas dele próprio. Essa é uma área que poderia levar a u1na exceção, portanto é bom que esteja no
bloco Try . .. End Try. A variável oFi l eda linha 25 é do tipo Fi l eStream de 1nodo que representa
uma série de bytes do arquivo (isto é, u1n.fluxo) ..Para ler esse fluxo, passa1nos esse objeto Fi l eS-
t reampara o construtor de u1n StreamReader (linha 26). Essa variável StreamReader (oReader)
pode ser empregada para ler todo o conteúdo de Fi l eStream (linha 27) e passá-lo para o principal
TextBox utilizado no fonnulário.
Se uma exceção ocorrer na abertura ou leitura do arquivo (mais provável que seja na abertura), a
capturaremos na li nha 28 e apenas a exibiremos para o usuário nas linhas 30 a 33. Uma rotina de
tratamento de exceções ideal provavehnente tentaria ajudar o usuário a corrigir o erro. Por
exemplo, se o usuário estivesse proibido de abrir o arquivo devido a razões de segurança (uma
Securi tyExcept i on seria lançada), você poderia informá-lo de que seria preciso solicitar pennis-
são ao proprietário do docutnento antes de tentar abrir o arquivo. Para concluir, nas linhas 36 a
37, encerran1os os objetos StreamReader e Fi 1eStream. Feche se1npre esses objetos para assegu-
rar que não permaneça1n abe1tos, podendo impedir outros progra1nas de visualizar ou alterar o
.
arquivo.
No final do ite1n Open do 1nenu File, jádeve1nos ter selecionado u1n arquivo para editar, e o con-
teúdo provavehnente estará e1n TextBox. A seguir, precisamos lidar com duas maneiras relacio-
nadas de salvar o arquivo - elas são os itens Save e Save As do menu File.
Dos dois itens do n1enu File relacionados a salvar o arquivo, Save é o 1nais co1nplicado. Na ver-
dade, como você verá, o item Save As não precisa de nada alé1n dele para executar sua ação. O
código do item Save do menu File é n1ostrado nas linhas 41 a 72. Pri1neiro tente saber se o usuá-
rio já nomeou o arquivo (linha 45). Se ele não tiver feito isso, chamaremos a rotina mnuFi l eSa-
veAs Cl i ck (isto é, o item Save As do menu File) para obter um nome (linha 70). Supondo que o
arquivo tenha t11n nome, ele será aberto para edição na linha 50. Depois de abe1to, criare1nos u1n
objeto StreamWri ter para tornar possível a edição do arquivo (linha 52) e a gravação do conteú-
do de TextBox no arquivo recém-criado (linha 54). Já que o arquivo não possui mais nenhuma al-
teração, configuramos o flag Oi rty co1no Fa l se.
Se uma exceção ocorrer quando da gravação no arquivo, a capturaren1os na linha 57. Exata1nen-
te como fizemos co1n qualquer exceção que pudesse ocorrer na leitura do arquivo, apenas exibi-
re1nos o erro (linha 58 a 62). Mais uma vez, como o aplicado à leitura, é essencial fechar os
objetos St reamWri ter e Fi 1eStream (linhas 65 e 66). Isso é ainda 1nais impo1tante na gravação do
que na leitura porque as alterações feitas podem não ser gravadas até que os objetos de fluxo e o
arquivo estejan1 fechados .
.No final do item Save do 1nenu File, o conteúdo de TextBox deve estar gravado no arquivo soli-
citado. Você pode confirn1ar isso abrindo o arquivo no Bloco de notas ou e1n algun1 outro editor.
1488 Dia 17
O código do ite1n Save As do menu File é 1nuito mais si1nples do que o usado para salvar o arqui-
vo porque ele utiliza o trabalho executado em outra rotina. Esse código é e1npregado apenas para
gerar um novo nome para o arquivo. Usrunos Fi 1eSaveDi a1og, que adicionan1os ao for1nulário
na linha 76, para pennitir que o usuário selecione u1n local e um nome para o arquivo. Se ele der
um clique en, OK para fechar a caixa de diálogo, daren1os prosseguhnento configurando a pro-
priedade Fi 1eName com o novo non1e (linha 78) e, en1 seguida, chamando a rotina mnuFi 1eSa-
ve Cl i ck para realmente salvar o arquivo (linha 80). Coino alternativa, poderíamos ter col.ocado
o conteúdo con1pleto do código salvo aqui, 1nas isso teria gerado u1n nível alto de duplicação.
Para concluir (o menu File), ocorre o código do comando Exit do 1nenu File. Nesse 1nornento,
apenas fechamos o forn1ulário, encerrando o aplicativo (linl1a 86).
Grande parte do código relacionado a Stream está no menu File (onde se i1naginava), permitindo
que você abra e salve arquivos. Na Listagem 17 .6, exa1ninaremos o código do menu Edit que
pennite recortar, copiar e colar da 1nes1na maneira que em uin aplicativo como o Bloco de notas
ou o Word.
5 End Sub
6
7 Private Sub mnuEditCopy_Click(ByVal sender As System.Object,
8 ByVal e As System.EventArgs) Handles mnuEditCopy.Click
9 Clipboard.SetOataObject(Me.txtText.SelectedText)
10 End Sub
11
12 Private Sub mnuEditPaste_Click(ByVal sender As System.Object,
13 ByVal e As System.EventArgs)Handles mnuEditPaste.Click
14 Me .txtText.SelectedText =
15 CType(Clipboard.GetDataObject.GetData(DataFormats.Text), String)
16 End Sub
ANÁLISE Felizinente, o código dos co1nandos Edit é ben1 menor do que o de File. Além disso,
pode1nos ver outro objeto poderoso do .NET Fra1nework - o objeto Cl i pboard.
Começando com o código Cut do 1nenu Edit, pegaLnos o texto selecionado e1n TextBox e o copiamos
para a área de transferência (linha 3). A classe Cl i pboard é uma abstração da área de transferên-
cia do Windows compartilhada por todos os aplicativos. Ela possui métodos que permitirão a
você atribuir progra1naticamente texto, figuras ou outras infor,nações à área de transferência e
recuperar os dados desse local. A Tabela 17.9 descreve esses dois métodos. Depois de copiar as
Usando o .NET Framework 489
inforn1ações para a área de transferência, excluhnos o texto selecionado em TextBox (linha 4).
Isso cria o compo1ta1nento esperado de recorte do texto - adicioná-lo à área de transferência e re-
1novê-lo do fonnulário.
Método Descrição
SetDataObject Atribui informações à área de transferência. Esse método usa um obje;
to e, portanto, você pode gravar o que quiser na área de transferência. E
bom ressaltar que na verdade há duas versões desse método. Ou seja,
ele é um método sobreposto. A segunda versão inclui um valor boolea-
no que determina se o conteúdo deve permanecer depois que o aplica-
tivo for encerrado. O comportamento normal é manter as informações
na área de transferência depois que o programa for interrompido.
GetDataObject Usado para recuperar as informações da área de transferência ou sobre
o seu conteúdo. Na verdade, esse método retorna uma interface- IDa-
taObject, que é empregada na execução efetiva da recuperação. A Ta-
bela 17 .10 descreve os métodos importantes da interface IDataObject.
Método Descrição
GetData Recupera as informações armazenadas na área de transferência. For-
mulários intermediários permitem que você as converta em um forma-
to específico.
GetFormats Usado para determinar que formatos estão armazenados na área de
transferência. Por exemplo, se uma figura tiver sido copiada para a
área de transferência, este método retornará todos os formatos com os
quais ela pode ser colada.
GetDataPresent Determina se algum dado de um formato específico está armazenado
na área de transferência. Este método poderia ser usado para você de-
finir se permitirá que o usuário cole informações em seu aplicativo. Por
exemplo, se houver informações gráficas armazenadas na área de
transferência, não deixaremos que o usuário as cole em nosso aplicati-
vo Note.
O código Copy do 1nenu Edit é se1nelhante ao do comando Cut do 1nenu Edit (linha 9), exceto
por não excluirn1os o texto selecionado. Os dois comandos, no entanto, resultam na cópia das in-
formações para a área de transferência.
O código do co1nando Paste do menu Edit parece complexo, mas se torna simples quando dividi-
1nos as linJ1as 14 e 15 e1n uma série de etapas. A prilneira etapa para a recuperação de infonna-
ções da área de transferência é obter, por 1neio de GetOataObject, a interface IOataObject
annazenada nesse local. A seguir, usamos o método GetOata de IOataObject para recuperar as
informações, solicitando-as no formato de texto siinples. Embora tenhamos definido esse for-
mato, se trata de un1 objeto. Po1tanto, para atribu í-lo a TextBox, deve1nos conve1tê-lo em uma
string. Podería1nos ter usado a função CStr ou CType, n1as optan1os pela últin1a. Para concluir-
1490 Dia 17
ANÁLISE En1bora não fosse necessário nesse exemplo, adiciona1nos o comando About do
menu Help para que ele ficasse completo. E' uma rotina simples q11e cria u,na string
(linhas 4 a 8) e a exibe para o usuário (linhas 9 a 12). Em u1n apLicativo ,nais avançado, você teria
um forn1ulário só para executar a exibição para o usuário.
Para concluir, a Listagem 17.8 ,nostra três rotinas que você pode adicionar ao aplicativo para
co1nple1nentar a funcionalidade.
10 End Sub
11
12 Private Sub frmNote_Closing(ByVal sender As System.Object, _
13 ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
14 If Me.Dirty = True Then
15 If MessageBox.Show(_
16 "Você fez alterações no arquivo que serão perdidas. Deseja continuar?",
17 "New Fi l e",
18 MessageBoxButtons.YesNo,
19 MessageBoxlcon.Question,_
20 MessageBoxDefaultButton.Button2)= DialogResult().No Then
21 e.Cancel = True
22 End If
23 End If
24 End Sub
ANÁLISE Como você deve se len1brar, o proceditnento NewFi 1e é chatnado por mnuFi 1e-
New_Cl i ck quando um novo arquivo é criado. Esse procedin1ento atribui os padrões
ao arquivo novo: apaga as informações de TextBox (linha 2), configura a propriedade Fi 1eName
con10 'Untitled' (linha 3) e a propriedade Di rty como Fa l se (linha 4).
Quere,nos que o aplicativo e o usuário tenham conheci,nento quando o documento for alterado.
Essa é a finalidade da propriedade Oi rty. Podemos nos beneficiar do evento TextChanged para
alterar o valor dessa propriedade. Se algu,na alteração ocorrer, por causa de u1na edição, cópia
de informações da área de transferência ou digitação do usuário, esse evento será acionado, con-
figurando o tlag Oi rty como True.
Para concluirmos, 1nais uma vez quere,nos nos certificar de proteger o usuário de ,
pressionar te-
elas aleatorian1ente. O evento Cl os i ng ocorre quando o formulário é fechado. E um ótimo 1no-
mento para determinar se o usuário quer salvar as informações. Só devemos solicitar a ele que
salve as alterações se houver algu1na, portanto, nossa primeira etapa (linha 14) é descobrir se fo-
rrun feitas alterações desde a últi,na vez que as inforrnações fora1n salvas. Se não houver, não
precisa1nos fazer nada, e o fonnulário poderá ser fechado. No entanto, se houver alterações, tere-
1nos de perguntar ao usuário se deseja salvá-las antes de sair. As linhas 15 a 20 criam e exibetn
u1na caixa de mensagens co1n os botões Yes e No. Se o usuário selecionar o botão No, significa
que não deseja fechar o arquivo. Po1tanto, pode1nos cancelar esse evento (e o conseqüente fecha-
mento do formulário) configurando a propriedade Cancel do objeto EventArgs (passada para to-
dos os eventos) con10 True, como na linha 21.
Aí está-cerca de 100 linhas de código, e você tern u1n editor de texto funcionando que pode ser usa~
do como base para tuna imple1nentação 1nais completa Essa versão pem1ite abrir e salvar arquivos, e
usar unia área de transferência. Utilizan1os os objetos Fi 1eStream, StreamReader e StreamWri ter
1492 Dia 17
para manipular os arquivos de texto co1n os quais ela trabalha. Criar um aplicativo se1nelhante para
abrir e salvar arquivos binários, co1no os gerados pelas classes de figuras, é quase idêntico.
:E C(b
X -:. Cdo,C~, ~
7' º: C.dorrr-*or
• 11' CUutt.M)M'«c
• q,i: ~
x4>;Fcnc~
• ~ Fc:rtCCft"O'te,,fcr.WYl'leCCl'Mllrter
,; ~ 1 1 ~.~ ~
..!.. º:~Jniy
" i(í-
::itd.P F~
~
t) (',40Nc:JDt...~ t
G'aohics.(ll!IMl'~al'f@A'OC:
-r,-iP G t ~
(t. "':: kon
•
"---""''l!~·· ~ -·--- -
~ s;.t"'1.or,rww,g
~ d :intcmJ>.rJl"o:l
Usando o .NET Framework 493
Você usará 1nuito as classes da Tabela 17.11. Por exemplo, se desenhar um quadrado na tela, ele
será criado em u1n objeto Graphi cs, com u,na classe Pen específica, con1 u1na estrutura Co l or
atribuída, dentro deu.ma estrutura Rectangl e. Essa última, por sua vez, seria co1nposta de uma
estrutura Poi nt e u1na Si ze. Para concluir, seria possível preencher o quadrado co1n a classe
Brush que fosse selecionada.
Para demonstrannos o uso das classes de figuras, criaremos um programa simples de desenho. A
Figura 17 .3 mostra esse aplicativo em execução. Você pode estendê-lo posteriormente para criar
desenhos 1nais complexos.
FIGURA 17.3
O programa Scribble Scnbólel
em ação.
... VB.net
Scnbblel
Rocksf
ü,b·
1
1494 Dia 17
Comece criando um novo projeto de aplicativo Windo\vs. Dê o nome de Scribble a ele. Como
você pode ver na Figura 17.3, o usuário te1n três ferramentas de desenho disponíveis: uma cane-
ta, fonnas e texto. Todas elas possuen1 seu próprio conjunto de opções que afetarão o 1nodo de
desenhar. Alérn disso, cada u1na pode ser usada co1n urna cor selecionada. A ampla área branca
de desenho é um controle Pi ctureBox.
Altere se,npre o non1e do fonnulário. Feche o gerador de fonnulários. Altere o no1ne do fonnulá-
rio no Solution Explorer para frmScri bb l e. Passe para o modo de visualização do código e altere
todas as referências a Forml para frmScri bb l e. Dê u1n clique com o botão direito do mouse sobre
o projeto no Solution Explorer e selecione Properties. Na guia General Properties, altere o Star-
tup Object para frmScri bbl e. Co1npile e execute o aplicativo para assegurar que todas as altera-
ções tenham sido processadas.
Agora podemos con1eçar a adicionar controles ao formulário. Abra-o no n1odo estrutura e insira
os controles como descrito na Tabela 17 .12. Use a Figura 17 .3 para ajudá-lo, 1nas não se preocu-
pe se eles não ficarem no lugar exato.
- - ---
NOTA
Quando adicionar os controles Radi oButton ao painel de ferramentas, lem-
bre-se de dar um clique sobre o controle na caixa de ferramentas e, em segui-
da, arrastá-lo até o painel. Isso assegurará que ele fique situado nesse local.
Você também deve fazer isso com os controles do painel de opções.
Outro ponto a ressaltar é que os três painéis de opções (pn l PenOpti ons, pn l Sha-
peOptions e pnlTextOptions) são todos do mesmo tamanho e ficam no mesmo
local. No tempo de execução, só um ficará visível a cada vez. No entanto, isso
pode ser difícil de conseguir na hora da criação. A maneira mais fácil de resol-
ver esse problema é trabalhar com eles individualmente. Quando um dos pai-
néis estiver concluído, configure a propriedade Location de modo que o painel
fique fora da tela. Configurar a propriedade Left com -10000 é um modo sim-
ples de fazer isso. Quando todos os três painéis estiverem concluídos, configu-
re Loca ti on novamente com o valor original deles.
• Cl i pRectangl e O retângulo que deve ser redesenhado. Isto permite que você otimize o
seu código de desenho para só atualizar a área alterada, en1 vez de redesenhar se1npre a fi-
gura co1npleta. Não usare1nos este parâ1netro en1 nossos aplicativos.
,
• Graphi cs A superficie e1n que a figura será desenhada. E usada para o desenho das for-
- , .
1nas que serao necessar1as.
Como alternativa, você pode usar o método CreateGraphi cs de u1n controle para criar seus pró-
prios objetos Graphic de desenho.
Dim oGraphics As System.Drawing.Graphics
oGraphics = picDraw.CreateGraphics()
Qualquer método que você usar para criar um objeto Graphi e poderá ser e1npregado para dese-
nhar várias for1nas.
Annazenare,nos o objeto Graphi cs no aplicativo Scribble para que seja usado por várias ferra-
mentas de desenho. Além disso, precisamos registrar as ferramentas ativas e disponíveis. Adi-
cione o código da Listagem 17 .9 ao projeto Scribble.
ANÁLISE Pritueiro declaramos uma nova enu1neração (linhas I a 5). Essa enurneração será
usada para registrar as ferra1nentas disponíveis e assegurar que a propriedade Cur-
rentToo l (declarada posteriorn1ente) só possa ser configurada com u1n dos valores válidos. Se de-
pois você quiser adicionar outras ferramentas de desenho, deverá fazê-lo nessa enumeração.
As linhas 7 a 9 são as variáveis membro das três propriedades expostas pelo formulário. Essas
propriedades (linhas 16 a 23, 25 a 32 e 34 a 45) são basicamente simples, con1 uma exceçã.o. No
trecho Set da propriedade CurrentToo 1, as linhas 41 a 43 se destacarn. As ferramentas de dese-
nho co1no canetas, pincéis e fontes se encontrain e1n uin local especial no Windo\vs. Só u1na
quantidade limitada desses co1nponentes fica disponível. Po1tanto, você deve sempre se lernbrar
de cha1nar o método Oi spose desses co1nponentes para assegurar que eles sejam liberados para o
próxitno usuário. E1n geral, é possível cha1nar Oi spose diretatnente nesses objetos. O código da
linha 42 é necessário porque oToo 1 foi declarada como u1n objeto na linha 12. Esse é um exernplo
dos sacrificios feitos quando se escreve u1n código genérico; às vezes isso significa mais traba-
lho adiante.
O evento Form Load (linhas 47 a 61) é o local onde configuran1os o formulário, carregando as lis-
tas suspensas e preparando os elementos gráficos do desenho. A linha 51 charna a rotina Fi 11-
Lis ts que escreveremos posterionnente. A seguir, nas linhas 53 a 55, criamos u1n novo Bi tmap e
o atribuhnos a Pi ctureBox. Esse é o Bi tmap no qual desenharen1os. Os parân1etros usados defi-
nen1 o tamanho da nova figura e o tipo de Bi tmap que será criado. Aqui gera1nos uma figura de 24
bits. Isso significa que podernos empregar qualquer u1na das 16777216 cores quando selecionar-
.mos u1na.
A linha 56 extrai o objeto Graphi cs de Bi tmap e o atribui ao fonnulário. Usaremos esse objeto
mais tarde quando for1nos desenhar. Para criar uma superficie adequada e limpa para o desenho,
aplicaremos Cl ear ao objeto Graphi cs configurado-o como White, e para assegurar que tenha-
tnos u1na ferramenta definida, selecionarnos Pen.
Todas as três rotinas a seguir executa1n a 1nesma tarefa. São usadas quando o usuário seleciona
uma nova ferramenta. Essas rotinas configuratn CurrentToo1 coino a ferramenta desejada e as-
segura,n que o conjunto correto de opções da ferra,nenta atual fique visível e os outros não.
Usando o .NET Framework
Desenhando Formas
Depois que você tiver un1 objeto Graphi cs, precisará saber como usá-lo. O objeto Graphi cs pos-
sui vários 1nétodos que são e1npregados para incluir diversas linhas, for1nas e texto e1n uma su-
perfície. Esses tnétodos se encontrarn em duas categorias a1uplas:
• Métodos Draw Estes 1nétodos são utilizados para o desenho co1n o uso da ferramenta
Pen (caneta). Em geral, só criam u1na forma vazia.
• Métodos Fi 11 Estes 1nétodos são utilizados para o desenho con1 o uso da ferra1nenta
Brush (pincel). Criam uma forma que é preenchida com urna cor ou textura.
A Tabela 17.13 descreve alguns dos 1nétodos mais usados da classe Graphi cs.
Agora esta1nos prontos para adicionar o código do aplicativo Scribble que fará reabuente o dese-
nho. Quando estivennos no 1nodo Shape ou Text, desenharernos u1n retângulo ou urna elipse, ou
adicionare1nos u1n texto onde o usuário der u1n clique. No entanto, o desenho de linhas é um
pouco diferente. Na verdade não pode1nos desenhar tuna linha quando o usuário der un1 clique
no botão do mouse; deve1nos aguardar que ele .inova o mouse. E1n vez disso, quando o mo use es-
tiver co1n o botão pressionado, apenas o definire1nos con10 inativo. Depois, quando o usuário
mover o mo use, se seu botão estiver pressionado, começaremos a desenhar. A Listage1n 17. l O
1nostra o código dos manipuladores de evento de Pi ctureBox.
504 Dia 17
45 Me.updShapeWidth.Value,_
46 Me.updShapeHeight.Value)
47 Case Else
48 End Sel ect
49 'force um redesenho
50 Me.picDraw.Refresh()
51 Case DrawingTools.Text
52 'crie uma fonte
53 oTool = Ne1~ System.Drawing.Font(_
54 Me.cboTextFont.Text, Me.updFontSize.Value)
55 'escreva o texto no local em que o mouse está agora
56 oGraphics.DrawString(Me.txtText.Text,
57 oTool,_
58 New Sol i dBrush(_
59 Color.FromName(Me.cboColors.Text)),
60 e.X,e.Y)
61 'force um redesenho
62 Me.picDraw.Refresh()
63 Case DrawingTools.Pen
64 'crie a caneta (para desenhar quando o mouse se mover)
65 oTool = New System.Drawing.Pen(_
66 Color.FromName(Me.cboColors.Text),
67 Me.updPenWidth.Value)
68 sngX = e.X
69 sngY = e.Y
70 Me.Drawing = True
71 End Select
72 End Sub
No modo de desenho, a primeira etapa é desenhar uma linha usando a caneta atual (linha 6). As
variáveis sngX e sngY são variáveis privadas no nível do formulário usadas para registrar a últitna
posição do 1nouse. Sempre que desenhannos u1na lin.ha, o farernos a partir dessa posição anna-
zenada até a posição atual do 111ouse. A posição atual do 1nouse é fornecida como propriedade da
classe MouseEventArgs passada para o manipulador de eventos. Copiamos a posição atual no lo-
cal de armazenan1ento te1nporário nas linhas 7 e 8 para a próxima vez que o evento for chamado.
Para concluinnos, na linha I O, forçamos tnna atualização de Pi ctureBox. Isso garante que qual-
quer alteração que tenhamos feito seja exibida para o usuário.
1506 Dia 17
O manipulador do evento MouseUp (linhas 14 a 19) é simples. Só será usado para encerrar o 1nodo
de desenho se estivermos nele. Posteriormente, os eventos MouseMove sem Drawi ng configurado
como True não possibilitarão desenho algu1n.
Se a ferramenta atual for Shape, precisaren1os detenninar o tipo de forma a selecionar. O código
do desenho é se1nelhante. Usamos o método Fi 11 para desenhar um retângulo ou l11na elipse na
posição atual do ,nouse co1n os ta1nanhos selecionados nos controles Numeri cUpDown. A posição
atual do mouse é fornecida pelo parâmetro MouseEventArgs do manipulador do evento MouseDown.
Se a fen·amenta atual for Text, a primeira coisa a fazer será criar u1na fonte nova (linhas 53 a 54).
Essa fonte será usada quando escrevennos o texto em Pi ctureBox (linhas 56 a 60). Ele será es-
crito na fonte gerada, co1n u1n pincel recé1n-criado.
Para concluir, se estivermos desenhando linhas co1n a ferra1nenta Pen, teremos de criar o novo
objeto Pen (linhas 65 a 67). Ele terá a cor selecionada e a largura da caneta. A seguir, annazena-
retnos a posição atual do .tnouse para uso posterior no 1nanipulador do evento MouseMove (l inhas
68 a 69) e ativaremos o tnodo de desenho (linha 70).
Salvando Figuras
Depois de criar u1na figura, use o tnétodo Save do objeto Bi tmap para annazená-la con10 um ar-
quivo. Esse método permite que a figura seja salva co1n um ta1nanho e fonnato específicos.
Vários for1natos diferentes tê1n suporte do objeto Bi tmap. Entre eles estão:
• Bit1nap U1n formato co1nu1n de figuras usado no Windows, sendo norn1almente bern
amplo. Pode dar supo,te a u,na quantidade ilimitada de cores, e a extensão utilizada é
BMP.
• Glf Abreviatura de Graphics Jnterchange Format; este é u1n formato co1nu1n de figu-
ras usado na Internet. Norn1ahnente, os desenhos GIF são pequenos porque são compac-
tados; no entanto, só podetn e1npregar 256 cores por figura. A extensão utilizada para
esses arquivos é GJF.
• JPEG Abreviatura de Joint Photographic Experts Group; este é outro fonnato co-
1nu1n de figura usado na Internet. O fonnato JPEG nonnahnente é e1npregado para anna-
zenar fotografias ou outras figuras que precise1n de ,nuitas cores para ser exibidas. Ele
pode ser bastante co,npactado; no entanto, arquivos alta,nente co,npactados pode,n per-
der infonnações ou qualidade. A extensão para estes arquivos é JPG.
• PNG Abreviatura de Portable Network Graphics; este é u1n fonnato de arquivo rela-
tivamente incomun1. Foi criado para substituir os arquivos GIF e TJFF. São arquivos bas-
tante pequenos, en1bora etn geral não tanto quanto nos fonnatos GIF ou JPEG. O suporte
é raro, mesmo co1n o 1nternet Explorer e outros progra1nas podendo exibi-los. A extensão
para estes arquivos é ·PNG.
• TI FF Abreviatura de Tagged Image File Fonnat; este é utn formato raratnente encon-
trado que costun1ava ser comum. Os arquivos TIFF poden1 ser grandes ou pequenos, de-
Usando o .NET Framework
pendendo de qual das 1nuitas variantes desse forn1ato seja empregada para armazená-los.
A extensão TIF é a usada nestes arquivos.
Agora pode1nos ternJinar nosso aplicativo adicionando o código aos comandos do 1nenu Fi le
como vemos na Listagem 17.11 .
ANALISE As linhas l a 6 1nostra1n o código do comando New, do menu File. Ele é sirnples;
tudo o que faz é apagar o conteúdo existente no objeto oGraphi cs, na linha 3, substi-
tuindo-o por um novo e adequado plano de fundo branco. Como antes, força1nos a atualização de
Pi ctureBox (linha 5) para que exiba a figura alterada.
Abrir o arquivo é quase tão fácil quanto apagar a figura. Na linha9 do código exibin1os a caixa de
diálogo File Open. Se o usuário selecionar um arquivo, o carregarernos no objeto Image de Pi c-
tureBox. Esse controle detenninará o tipo do arquivo e o exibirá adequada1nente.
O código necessário para salvar a figura é u1n pouco 1nais longo, ,nas continua simples. Con1eça-
rnos (linha 20) exibindo a caixa de diálogo-padrão File Save. Depois que o usuário tiver selecio-
nado o local e o tipo do arquivo a ser salvo, podere1nos continuar. Para resu1nirn1os as últi1nas
linhas, salvamos o nome do arquivo selecionado em luna variável. Nossa caixa de diálogo solici-
ta ao usuário para selecionar entre dois forn1atos diferentes de figura-Bitmap ou PNG. Usamos
essa opção na configuração de outra variável para o fortnato que empregaremos ao salvar a figu-
ra. Por fi111, esta1nos prontos para salvá-la. Para o caso de uma exceção, co.1no falta de espaço em
Usando o .NET Framework
disco, inseriremos a figura em un1 bloco Try . .. End Try. A linha 32 representa a operação efetiva
de salvar, se beneficiando da capacidade de que todos os objetos possuem de salvar a si mes1nos.
Finalmente, o comando Exjt do 1nenu file fecha o fonnulário, encerrando o aplicativo.
Salvar figuras annazenadas em u1n objeto Image é fácil, co1n o é carregar uma nova figura. Na
verdade, esse é um dos 1nelhores exernplos dos benefícios de usar objetos porque trabalha~se
com o que seria tuna tarefa co1nplexa e o código necessário é encapsulado em objetos Graphi cs,
Image e Bi tmap.
Resumo
Aprender todas as classes, estruturas, propriedades, métodos e eventos que compõetn o .NET
Fra1nework leva algum ternpo. No entanto, conhecer algumas classes fundamentais o ajudará
sempre, já que os conceitos representados por elas se repetem em todo o Framework. Depois que
você tiver conhecido u1n fluxo, toda vez que se deparar com u1n, saberá o que fazer. De maneira se-
melhante, após aprender a desenhar com as classes Graphi cs, poderá fazê-lo e.m qualquer local.
No próximo capítulo, você aprenderá a adicionar os ' retoques finais ' a nossos aplicativos.
P&R
P O Que E' Unicode?
R Urn problema mundial é que nun.ca houve u1na linguagem co,n a qual todos pudesse1n re-
conhecer. Muitas delas usa1n o 1nesmo conjunto de caracteres ou u1n se1nelhante ao e1n-
pregado na América do Norte e Europa Ocidental. Esses caracteres foram definidos
como o conjunto ASCII (Arnerican Standard Code for Infonnation lnterchange). Ele uti-
liza 255 caracteres (de um byte) para representar os que são usados nessas linguagens.
Por exe1nplo, a letra 'A' é representada pelo algaris,no 65 e,n todos os conjuntos de ca-
racteres que usam a codificação ASCJI.
No entanto, outros idio1nas, como o tâmil ou o japonês, precisam de uma quantidade muito
1naior de caracteres. Conseqüentemente, o conjunto de caracteres Unicode foi definido
pela International Standards Organization (JSO). O Unicode usa dois bytes para codifi-
car cada sín1bolo de qualquer dos idiomas terrestres (e alguns extraterrestres - há uma
conversão de Klingon para Unicode e1n http: //anubi s. dkuug. dk/jtcl/ sc2/wg2/
docs/n1643/nl643. htm). Por exemplo, o caractere Unicode 20AC sempre representará o
euro. Os primeiros 256 caracteres da codificação Unicode são os mes1nos da ASCII por
. .
~
conven1enc1a.
Po1tanto, uma resposta direta seria que é u1n valor de dois bytes capaz de identificar u,n
sünbolo usado en1 qualquer conjunto de caracteres. Por que se preocupar? E1n algutn
1no1nento, você verá um grupo de caracteres que se parecerão com ?????, e já saberá o
1notivo. Provavel1nente serão Vnicode, 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 dese-
nhar formas como octógonos também?
R Vários métodos do objeto Graphi cs podem ser usados para criar forrnas mais co1nplexas.
Entre eles estão incluídos DrawArc, DrawCurve, Drawl i nes, DrawPath e DrawPolygon. Para
desenhar u1n octógono, você deve e1npregar o ,nétodo DrawPo l ygon, passando a caneta
que util izará no desenho, e um array de pontos (Poi nts). Esse array descreverá cada ân-
gulo do octógono.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e,n como colocar seu conheci,nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
l . Qual dos trechos de código a seguir você usaria para saber se u,n arquivo existe?
A. Dim oFile As New File
Oim bExists As Boolean = oFile.Exists("algum arquivo")
B. Oim bExists As Boolean = Oirectory.Exists("algum arquivo")
C. Oim bExists As Boolean = File.Exists("algum arquivo")
D. Oi m oOi r As New Oi rectory
Oi m bExists As Boo l ean = oOir.Exists("a l gum arquivo")
2. Qual é o relacionamento entre as classes Stream, StreamReader e StreamWriter?
3. Que fonnatos de figuras você pode criar (ou exibir e1n u1n controle Image)?
4. Qual é a diferença entre Point, Si ze e Rectangl e?
Exercícios
1. U1n dos problemas do progra1na Note que escrevemos é que ele pern1ite o uso dos co-
1nandos Cut (Recortar), Copy (Copiar) e Paste (Colar) se1n haver nenhu1n texto selecio-
nado ou na área de transferência. Veja se consegue descobrir u1na 1naneira fáci l de ativar
e desativar esses itens de 1nenu antes que o menu seja exibido para o usuário. (Dica: adi-
cione um evento ao ite1n de 1nenu mnu Edit.)
2. Altere o forn1ato usado para salvar figuras e compare os tamanhos dos arquivos resultan-
tes. Qual é o 1nenor formato para desenhos si1nples em preto-e-branco? E para fotos?
SEMANA 3
•e
DIA
Retoques Finais
Este livro é dedicado a ensiná-lo a programar com a platafonna .NET, mas há muitos aspectos a
considerar no desenvolvitnento de um aplicativo cotnpleto. Esta lição abordará alguns detalhes
que é preciso compreender para a criação de um sisten1a real, principalmente se for grande e
complexo, incluindo:
• A docurnentação de seu aplicativo.
• O uso do controle do código-fonte.
Esses dois tópicos são opcionais; você não precisa executá-los para produzir u1n siste1na que
funcione, mas faze1n pa1te de quase todo grande projeto de desenvolvirnento.
as pessoas que tê1n acesso ao código e varia a1npla1nente na quantidade de detalhes porque não
há um 1nétodo exclusivo de documentá-lo. U,n caminho para se chegar a u1na docu,nentação
adequada é considerar pritneiro o 1notivo pelo qual essas infor1nações são fornecidas. A docu-
mentação existe para assegurar que todo o conhecimento sobre u1n sistema fique registrado - se-
ja1n os requisitos da en1presa ou a lógica por trás das decisões técnicas - para simplificar a
1nanutençã.o por meio de n1ais informações disponíveis sobre seu código. A docun1entação pode
ser dividida em algutnas diretrizes essenciais (não necessariamente por ordem de Ílnpo1tância), e
a pri1neira não está de rnaneira algu1na ligada à docurnentação:
• Crie a solução mais sirnples que puder para resolver o proble1na.
• Documente seu sisterna co1n o 1nenor nível de especulação possível.
• Use seu tempo de maneira sensata. Não co1nente o óbvio; em vez disso, e1npenhe-se em
esclarecer as partes complexas de seu sistema.
• Explicações detalhadas de seu código serão irrelevantes se não houver uma compreensão
da finalidade geral do siste1na. Documente o siste1na, cada tnn de seus co,nponentes e o
código propriamente dito.
LISTAGEM 18.1 O Código Pode Ser Mais Complexo do Que É Necessário (continuação)
12 Dim Filel As New StreamReader(Pathl)
13 Dim File2 As New Stream\1riter(Path2)
14 Dim x As String
15 x = Filel.Readline()
16 Do Until x Is Nothing
17 File2.Writeline(x)
18 x = Filel.Readline()
19 Loop
20 File2.Close()
21 Filel.Close()
22 End Sub
23
24 End Module
LISTAGEM 18.2 Torn ando Seu Código Mais Fácil de Compreender, Você Poderá Ter
uma Documentação Menor
1 Option Expl icit On
2 Option Strict On
3
4 Imports System
5 Imports System.IO
6
7 Module WorkWithFiles
8
9 Sub CopyFiles()
10 Dim sinputFilePath As String = ''C:\test.txt''
11 Dim sOutputFi lePath As String= ''C:\output . txt''
12 Dim fileinput As New StreamReader(sinputFilePath)
13 Dim fileOutput As Ne1~ StreamWriter(sOutputFilePath)
14 Dim sline As String
15
16 sline = filelnput . Readline()
17 Do Until sline Is Nothing
18 fileOutput.Writeline(sline)
19 sline = fileinput.Readli ne()
20 Loop
21
22 fileOutput . Close()
23 fileinput.Close()
24
25 End Sub
26
27 Sub Main()
1514 Dia 18
LISTAGEM 18.2 Tornando Seu Código Mais Fácil de Compreender, Você Poderá Ter
uma Documentação Menor (continuação)
28 CopyFiles()
29 End Sub
30
31 End Module
ANALISE As Listagens 18.1 e 18.2 lêem u1n arquivo e o gravam en1 outro, poré1n a segunda é
n1uito mais clara do que o mesmo código na Listagem 18. 1. A primeira razão é o pró-
prio no1ne do 1nódulo e da sub-rotina; os valores-padrão não fornecen1 nenhu1na inforn1ação, en-
quanto o nome CopyFi 1es para o procedi1nento é u1na indicação be.m direta da finalidade da
rotina. A próxima diferença é o espaçamento. Na Listagem 18.2, as linhas en1 branco são usadas
para reunir trechos relacionados no código, agrupando o código de inicialização (linhas IOa 14),
o de leitura de arquivo (linhas 16 a 20) e o de li1npeza (linhas 22 e 23). Essas linhas em branco não
terão absolutamente nenhu1n efeito sobre o resu ltado final desse siste1na - os dois exe1nplos serão
executados com a mes1na velocidade obtendo resultados iguais - , ,nas agrupar o código o torna
mais legível.
A diferença essencial restante entre os dois exe1nplos de código está na nomeação da variável,
urn tópico sobre o qual discorri breve1nente e.m lições anteriores. As variáveis pode1n ser nomea-
das de qualquer fonna, contanto que você não use u1na palavra-chave ou outro valor reservado à
platafonna .NET. Poden1os considerar o nome da variável co1no um mecanis1no interno de do-
cumentação. A Listagen1 18.1 é u1n exemplo extremado; grande parte dos códigos que ve1nos
não é tão ruiln no que diz respeito à nomeação de variáveis. Mas essa é uma tentativa de ilustrar o
efeito de variáveis 1nal nomeadas. Referir-se aos dois arquivos como file Input e f i l eOutput
(comparados co1n Fi l el e Fi le2) documenta a finalidade das variáveis sem a necessidade de
qualquer co1nentário adicional. Opções se,nelhantes fora1n feitas para os no1nes das outras variá-
veis, e quando elas fore1n usadas juntas (como na linha 12 da Listagem .18.2), a :finalidade do có-
digo estará quase co1npletan1ente explicada apenas pelos nomes e1npregados.
U,na prática comu,n e útil na codificação ta1nbé1n é usada na escolha dos nomes das variáveis; a
cada no1ne é dado un1 prefixo con1 um ou ,nais caracteres para indicar o tipo de dado da variável.
Na Listagem 18.2, as strings têm o prefixo s , e os objetos StreamReader/StreamWri ter e1npre-
gam file para indicar sua :finalidade de ler e gravar arquivos. Esse 1nétodo de nomeação deva-
riáveis é baseado na notação húngara, ein que os caracteres iniciais são empregados para
descrever o tipo de dado e o escopo (global versus local, público versus privado) das variáveis.
Digo que é baseado nesse tipo de notação, em vez de dizer que 'é' a Notação Húngara porque em
geral aplico utn padrão de no1neação muito menos rígido do que o conjunto original de regras
descrito co1no notação húngara por seu criador (Charles Simonyi da Microsoft). Abordarei a no-
meação de variáveis ainda nesta lição, na seção "Melhores Práticas e Padrões de Codificação".
Retoques Finais
Uma questão final sobre a criação de um código silnples, que não é de1nonstrada no exe1nplo an-
terior, é co,no a estrutura de seu código pode facilitar a sua co1npreensão. Gosto de gerar meus
sistemas usando muitos procedimentos, mesmo e,n códigos que não serão necessarian1ente reu-
tilizados de algum 1nodo. O resultado de estruturar seu siste,na dessa 1naneiraé que procedi,nen-
tos de nível ,nais alto pode,n ser lidos e compreendidos, ao n1esmo ten1po em que também
evitan1 os detalhes 1nais complexos (e 1nais confusos). A Listagen1 18.3 fornece um exe1nplo.
A Listage1n 18.3 não executa nada sozinha; a essência real desse siste,na está contida nos proce-
di,nentos à que ele faz referência. Apenas ler essa rotina daráa você u1na boa idéia do que o siste-
1na realiza, e é possível examinar as rotinas individuais se necessário. Se seu código for
estruturado de modo correto, rotinas de nível superior poderão agir como u1na visão da Reader 's
Digest de todas as rotinas de nível inferior que elas chama1n. Vale a pena observar que, e1nbora
possamos ler o código da Listage,n 18.3 e compreender o que está ocorrendo, apenas corn uma
documentação apropriada terían1os certeza de sua finalidade!
Evitando Conjecturas
Ao co1neçar a docu1nentar seu código, é provável que tenha em 1nente (de rnaneira consciente ou
inconsciente) urn público para esses co,nentários. Poderá escrever corno se fosse o único a leres-
ses con1entários, ou talvez você possa imaginar que outros desenvolvedores de sua equipe atual
sejam as pessoas que precisarão compreender seu código para efetuar manutenções. O problema
1516 Dia 18
A definição de cada um desses tipos de documentação varia bastante para metodologias de de-
senvolvimento e pessoas diferentes, 1nas a intenção básica do doctunento é minha única preocu-
pação aqui. Os detalhes sobre o objetivo geral dessa documentação são fornecidos nas seções a
seguir, poré1n a pergunta que você provavelmente se fará quando os exa1ninar será: "Tenho de
escrever tudo isso? Pensei que tivesse terminado! ". Essa é uma boa pergunta. Se não existir ne-
nhu1na docu1nentação e seu siste1na estiver concluído, não há chance de que ela seja criada. Mas
não é assim que deve funcionar. A idéia é que essa docun1entação seja gerada antes que o sisteina
seja desenvolvido, a sua 1naioria antes que qualquer código efetivo s~ja escrito a não ser um pro-
tótipo e alguma parte dela durante a própria fase de codificação. No Dia 1, "Ben1-Vindo ao Visu-
al Basic .NET", abordei o ciclo de vida do desenvolvimento dos soft,,vares, mas veja novan1ente
como fonte de referência (veja a Figura 18.1 ).
FIGU RA 18.1
O ciclo de vida no Versão Requisitos
Concluída Escopo e Projeto
desenvolvin1ento de
sofl111ares é 11111 processo
que não ten1.fim, em
geral representado
co,no u111 círculo que se
conec1a novan1ente a ele
Implantação Desenvolvimento
próprio para indicar u,n e Manutenção
ciclo contínuo. Abrangência
Abordagem/Escopo
A documentação sobre a abordage1n/escopo descreve o objetivo definido para o siste1na e deve
ser determinada no início do desenvolvimento. Co1no referência para fins de manutenção, é bon1
começar a compreender qual a finalidade do sisten1a desde o início. U1n exen1plo de abordagen1
e escopo em seu nível 1nais simples poderia ser:
"O sistema de Registro das Habilidades do Funcionário armazenará uma listagem dos fun-
cionários e registrará seu nível de especiaUzação e1n várias aptidões relacionadas ao cargo
co1n a finalidade de desenvolver equipes e planejar projetos."
Observe que essa declaração não explica todos os detalhes: que habilidades? Quen1 usará o siste-
ma? Onde será obtida a lista de funcionários? Essas e outras perguntas não fazem parte da abor-
dagem. Elas precisam ser respondidas, mas serão encontradas etn outra documentação.
Projeto Detalhado
Muitos docurnentos se enquadra,n nessa categoria - qualquer iten1 que forneça 1nais detalhes do
que a documentação sobre os requisitos. A intenção dos docu1nentos dessa categoria é detalhar
como o sistema funciona: que etapas segue internamente para executar os requisitos do usuário
descritos no documento anterior. Espere ver :fluxogramas, diagrrunas de estado e listas de com-
ponentes, procedimentos e outros elen1entos de código co1no parte desse material.
Histórico de Alterações
Se os aplicativos atendessen1 exatamente suas especificações quando fosse1n implantados, seria
u1n milagre. Se há uma constante no desenvolvimento de aplicativos, é que se1npre são feitas al-
terações. Grande pa,te do trabalho de desenvolvimento de um sistema é registrar e controlar essa
alteração, i1npedindo-a de desviar totahnente o projeto do que foi planejado. Esse rastreamento é
em geral conhecido como controle de alterações e envolve o registro de cada alteração solicita-
da, obedecendo algum processo de aprovação para determinar quais delas pudera1n ser incorpo-
radas ao siste1na e, e1n seguida, a documentação dessas decisões e o efeito que cada alteração
produz no planejamento do projeto. Se as que ocorrere,n e1n seu sistema forern docu,nentadas,
esse material será u1n recurso inestimável para os desenvolvedores que estivere,n trabalhando
em novos recursos e na n1anutenção dos existentes, e para os projetistas e gerentes que planeja-
re1n novas versões de seu software.
Tipos de Dados
Em geral uso o 1uenor número de caracteres possível em ,ninha notação dos tipos de dados e,
po,tanto, ne1n 1nesmo tento empregar a1nes1na quantidade para todos eles (diferente,nente da re-
ferência anterior ao artigo da Microsoft). Len1bre-se de que forneço ,ninha notação na Tabela
18.1, mas incluo alternativas co1nuns entre parênteses, onde apropriado. Não seria prático abor-
dar todos os tipos de dados da platafonna .NET, inclusive todas as classes do .NET Framework,
de 1nodo que tentarei mostrar exemplos suficientes para lhe dar wna idéia de como nomeio mi-
nhas variáveis.
1520 Dia 18
String S [str]
Integer (Inteiro), Int32 I [i nt]
Double (Duplo) Dbl
Single (Simples) sng [f (para flutuante, um tipo da C++)]
Long (Longo), Int64 L [l ng]
Para algo que seja betn incomu1n, que eu use fi·eqüentemente, costumo empregar apenas um
no1ne descritivo com o prefixo obj , como em objWebRequest.
Controles
Os exe1nplos da Tabela l 8.2 se aplicam igualmente aos controles usados nos fonnu lários da
Web e aos controles Hindows.Forms.
Grade de dados dg
Itens de menu mnu
Retoques Finais 521
Blocos de Comentário
No início de cada procedimento e classe, você pode incluir um comentário a1nplo de várias U-
nhas descrevendo esse trecho do código. Esses blocos de co1nentário são 1nuito usados co1no o
local onde se fornece qualquer tipo de informação aplicável ao trecho co1npleto do código em
vez de a uma única linha ou estrutura. Em geral utilizo as informações a seguir nos cabeçalhos de
comentário da classe (i ncluindo o módulo):
• Nome (da classe)
• Dependências (referências requeridas por essa classe, outras classes, requisitos do siste-
1na como o SQL Server)
• Finalidade
• Autor (e1n geral o autor original)
• Quem editou pela últi_ma vez
• Data da últin1a edição
• Con1entários (observações sobre proble1nas, erros encontrados e corrigidos, qualquer
item que não seja específico de u1na linha dentro da classe e que valha a pena ressaltar)
A Listage1n 18.4 mostra um exe1nplo de um bloco de comentário de tuna classe.
No bloco de comentário de u1n procedimento, incluo u1n conjunto um pouco diferente de infor-
mações:
522 Dia 18
Extraindo o Código
Depois de ativar o controle do código-fonte no Visual Studio .NET instalando a pa1te relativa ao
cliente do VSS, você terá disponíveis algumas novas opções de n1enu. No 1nenu File, un1 sub1ne-
nu cha1nado Source Control fornecerá várias opções, dependendo de um projeto estar aberto no
mo1nento. Caso contrário, haverá a opção de abrir um diretamente do siste1na de controle do có-
digo-fonte, poré1n, na priineira vez e1n que se usa o VSS, é mais sensato acessar un, projeto e adi-
cioná-lo a esse siste1na. Qual projeto será abe1to não é reahnente importante no 1no1ne11to, 1nas
Retoques Finais
também podemos apenas criar u1n novo aplicativo do console para usá-lo neste exemplo. Cha-
1ne-o de SCC Sam pie e insira o código rnostrado na Listage1n 18.5 e,n seu módulo, permitindo
que eu aproveite e introduza u1na pequena demonstração de acesso a conteúdo da Web enquanto
examinarnos o controle do fonte.
22 &System.Environment.Newline() &eWEB.Message
23 Catch e As Exception
24 sOutput = e.ToString
25 Final ly
26 Console.Write(sOutput)
27 End Try
28 Console.Readline()
29 End Sub
30 End Module
Agora, salve todos os seus arquivos selecionando File, Save Ali no menu. Co1n o projeto inicia-
do e contendo alguns dados, a próxima etapa é inseri-lo e1n seu sistema de controle do códi-
go-fonte. Selecione a opção Microsoft Visual SourceSafe no menu File e, en1 seguida, escolha
Source Contrai e finaln1ente dê u1n clique e1n Add Solution to Source Contrai.
524 Dia 18
Isso abrirá u1na caixa de diálogo que lhe permitirá escoU1er um crun inho dentro do sistema de có-
digo-fonte para armazenar sua solução e os projetos dela (veja a Figura 18.2).
o..i.
H<i!>
código-fonte.
Sua caixa de diálogo provavelmente não exibirá nada além da raiz da árvore, de controle do códi-
go-foote, $/,mas já existem alguns projetos e,n meu sistema de controle. E possível criar subdi-
retórios digitando o 1101ne desejado e dando um clique em Create. Certifique-se de que a raiz
esteja selecionada na caixa de diálogo e em seguida, digite Teach ourself Vi sual as i c
. NET (Ensinamos a você o Visual Basic .NET) e dê wn clique e,n Create. Agora, o novo diretório
estará selecionado, que é o que queríamos, portanto, digite Day 18 e dê u,n clique em Create.
Para concluir, digite o no1ne que deseja para sua solução (SCC Sample é u1na boa escolha; veja a
Figura 18.3) e dê u1n clique em OK. Você será questionado se o projeto já não existe e se quer
criá-lo auto,naticamente, que é o desejado, então, dê tun clique e.m Yes.
Agora, o Visual Studio .NET adicionará esse projeto ao controle do código-fonte e o annazenará
ao 1nes1no te1npo, o que significa que você terá de extraí-lo antes de poder alterá-lo. Observe que
Retoques Finais
seus arquivos a partir desse 1nomento serão apenas de leitura, como indicado na barra de título
do Visual Studio .NET e do Solution Explorer (veja a Figura 18.4).
,,., SCC 5.lms,J~ · ~Kros.on Vtsu,,1 D.lil<.l\l T (dt-i.ton] · SC(S.)n1s,lr.vb f Redd Only) '-lr=J EI
FIGURA 18.4
U,na das intenções do
controle do
código:fonte é per,nitir
que o desenvolvedor só
e,lite uni código de
cada vez. Portanto,
apenas o cód;go que for
El
extraido poderá ser
alterado. f
•
Col l Ch i
Nesse 1no1nento, você poderá extrair seu código, porque por fim o inseriu completamente pela
primeira vez. Selecione o módulo no Solution Explorer, que nomeei como SCCSamp l e . vb em
meu projeto, e dê u1n clique nele co1n o botão direito do 1nouse. No 1nenu suspenso que surgirá,
haverá u1na nova opção, Check Out Now (veja a Figura 18.5), que permitirá que só esse arquivo
seja extraído e editado. Até que um arquivo seja extraído, ele será apenas de leitura e quando for
acessado, poderá ser editado somente na m.áquina onde for recuperado.
Outra opção, que pode ser mais útil, é Check Out Now (Recursive), mostrada na Figura 18.6, que
extrai a solução ou projeto e todos os arquivos dele, e estará disponível se você der u1n clique
com o botão direito do mouse no projeto ou solução. Essa opção aparecerá, para que seja tudo
extraído de uma só vez, apenas se Display Silent Check-Out Co1nmand in Menus for seleciona-
do. Esse recurso encontra-se na pasta Source Control da caixa de diálogo de opções, que pode ser
acessada selecionando-se os itens de menu Tools e Options.
Depois que tnn arquivo for extraído, ele apresentará esse status por meio de u1n novo ícone pró-
ximo a seu nome no Sol ution Explorer, co1no 1nostrado na Figura 18.7, e pelo fato de que não
será 111ais apenas de leitura. Agora você pode fazer quantas alterações quiser nesses arquivos,
mas elas não serão refletidas no sisten1a Source Safe até que eles sejan1 introduzidos novan1ente
nesse local.
526 Dia 18
·•. SCC 5-0mple - Mkl'o1on vrw.m 8,a,stc."'iU (destgnJ · SCCSilmple.vb {Re<ld OnJy) l!IC Ei
FIGURA 18.5
•
Você pode extrair •°"""'
inclividualn1ente
qualquer arquivo co,n o
qual deseje trabalhar.
..... ,,.
l!<bu, Iools - tl(lp
P t~o
•
-.....,~ -,..- 1 0 ,.......
Armazenando o Código
Quando un1 código for extraído, outros progran1adores que usare1n o sisten1a do código-fonte só
terão acesso a uma cópia de leitura dele; você terá acesso exclusivo à cópia que extraiu. Não é
nossa intenção manter os arquivos fora do sistema se não os estivennos usando, a rnenos que
consciente1uente não pretenda1nos que eles sejarn alterados por mais ninguém, portanto artnaze-
ne seu código 1nais u1na vez depois que tiver feito (e, e1n geral, testado) suas alterações.
Retoq ues Finais 527
No código de seu exemplo, que, em confor1nidade com o desenrolar desta explicação, no mo-
mento não foi extraído, faça algu1nas alterações no 1nódulo, como re1nover Console. Read Li ne
da linha28 e alterar o trecho do URL na linha 8 para http ://www .mi crosoft . com. Agora, salve
seus arquivos e, e.m seguida, você poderá armazená-los novamente em Source Safe. Há várias
maneiras de annazenar arquivos, mas a n1ais simples é dar um clique com o botão direito do
mouse na solução ou projeto (o ,nesmo nível do qual foram retirados) e selecionar Check ln. Isso
abrirá u1na caixa de diálogo (veja a Figura 18.8) que permitirá a especificação de que arquivos da
solução devem ser incluídos junta1nente co1n um comentário explicando o que fo i alterado e qual
o motivo.
íht"dt ln EJ
FIGURA 18.8 5t'lett tfllftl.to che«W'i: , , ,
Quando você
arn1azenar novan1ente
os arquivos, poderá
- "ª -"'
.
:!il • f I ti l@J@
•
13 l:T Q Jtcmsbdow,oi.t,on'SCCS,y,plo
13
i, G! scc s..,.,...,_"" Ccrurt 8/10/,?001 9~11:'Jl .
adicionar co111entários 13 l:T (iJi foles bcl>w scc s-lo
P fll A,kmblyllllo.vh Core~ e/10/20018t5ít:!'45,
para documentar as ~ eJ SCC Smnple.vbproJ Corterl: 8/10/2001 9:tt:31.
.!.I
.:.1
;!
r----"'- ~ 1
,@
528 Dia 18
Selecione a primeira versão, que representa o arquivo original introduzido e1n Source Safe e, em
seguida, dê un1 clique no botão Diff. Isso abrirá tuna caixa de diálogo na qual será possível se
certificar de que a opção Visual está selecionada para que, e1n seguida, você possa dar u1n clique
e1n OK. Agora, será exibida u1najanela (veja a Figura 18.1 O) que detalha o estado atual do arqui-
vo e como ele era na versão selecionada e descreve as diferenças. Esse fonnato visual torna claro
o que foi alterado, 1nas ocupa1nuito espaço para mostrar as alterações de u1n arquivo-fonte gran-
de. Os outros dois formatos (Unix e Source Safe) fornecem um breve resu.1no das alterações en-
tre as duas versões, o que pode ser 111ais de seu gosto.
Voltando à janela History, você pode retornar tuna versão anterior de um arquivo, se quiserdes-
fazer muitas alterações e não se preocupar em perder tudo o que foi alterado de uma versão para
a outra. Retornar a versão, comparado a visualizar as diferenças e desfazer 1nanualn1ente u1na
quantidade selecionada de alterações, é un1a operação radical, mas às vezes é a única maneira de
voltar a um estado conhecido que funcione. Selecione a primeira versã.o desse arquivo na Iista do
histórico e, em seguida, dê un1 clique no botão Rollback. Será exibido um aviso de que essa ação
não pode ser desfeita, mas vá em frente e execute-a de qualquer modo. Agora, só haverá uma
versão. Suas cópias locais serão atualizadas para essa versão, e se você ou outra pessoa acessasse
esse arquivo e1n Source Safe, essa é a versão que receberia1n. Todas as alterações feitas após a
versão selecionada foram totahnente re1novidas.
Retoques Finais 529
b Hev S t.reaa..Reader(ob,Re-.spons-
12
13
l<
15
Dia ob)Response _
A.s U:ebRes~n se • ob j UevRequesi
D1a ob)Strc.,a _
b tlev Strean.Reader(objRe-.spon~
-
em unta versao
16
17
18
$0ulpul • objSt.rco.a . ReadToEnd{)
C4tch e UFE As Ur1Foraa.tExoept ! on
tOut pul • ·Error in URL For~ot : ( .
l6
1,
18
aOut.pul • cbJSt.re.,A RoadTo&nd()
Catch eUfE A!: UnForna.tExoept i On
~tPUl • •Er!'Ol' in URL Foraol : (.
especifica. u Sy$tc.i , Eovirona.cn~ . t:cvLinc() &i 19 $y$lc• . Envu-~t . Ucvline()
20 Catch eUEB 1.s VebExc:eption 20 Catc.h eQEB As V"bExc ept 1on
21 a.Ou tput • "Error Vi th Veb R~\IC!St ; 21 sOutput • ·Errar Ui~h We b Requ!tS't ~
22 4 S ~n . l:l'lv1roni..ont ~ovino() 22 4. Syotoa . tnvuOAAOnt . Hovlu,io()
23 C.,.tch e M pt.1on 23 C-,t.c;h e 4 Exc;ept ion
2, .sOutput • e . ToString 2, ~ t put • e ToString
25 Fic.ally 25 Finally
26 Con$olo .Wr1to(cOutput.} 26 Ccn.solo Vr1to(g0u t.put}
2,
28
2,
30
End Sub
End Try
• - 2,
28
29
30
1 End
End Sub
Tn
.
-
,
•-1.J '
- - • .!.I ( ( '
- -' •
. ,.... 11- \lll8,Cd l
'
Resumo
A docu,nentação é considerada por rnuitas pessoas como u1n 1nal necessário na programação.
E,n geral é feita no final de un1 projeto, de maneira apressada, fornecendo u1na quantidade n1íni-
1nade co1nentários para que você possa dizer que está tudo concluído. A chave para tornar a do-
cumentação útil e rouito menos difícil de ser terminada é trabalhar .nela durante o
desenvolvi,nento. Seguir as diretrizes desta lição fará co1n que seu código fique tão fácil de co1n-
preender quanto for possível e os co1nentários preencherão qualquer falha no entendi,nento que
• •
possa ex1st1r.
530 Dia 18
P&R
P O comentário não é apenas uma maneira de compensar um código confuso? Se seu
código for bem escrito, não deverá precisar de nenhum comentário.
R Tenho ouvido essa declaração algumas vezes e ela é parcialtnente verdadeira. Quanto
1nais claro for seu código, 1nenos comentários serão necessários. Coloque e1n prática
esse pensamento, e você concluirá que um código realmente claro não precisa de con1en-
tários. Concordo, mas creio que qualquer progra1ua composto de mais de 1Olinhas de có-
digo nunca conseguirá ser tão claro porque o público em potencial que irá lê-lo é n1uito
variado. Faça co1n que seu código fique tão claro quanto possível, dirninuindo assi1n os
comentários, 1nas comentar um pouco sempre será necessário.
P Achei que a plataforma .NET incluísse comentários com base em XML, mas você
não a abordou nesta lição.
R Infelizmente, o co1nentário com base em XML é um recurso da C#, e não do Visual Basic
.NET (ou de qualquer outra linguagem .NET). Se você estiver interessado, exarnine os
materiais de referência da C# que vêm com o .NET Framework para obter 1uais detalhes
sobre os comentários em XML.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e1n como colocar seu conheciinento e1n prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Com base nos padrões de nomeação abordados nesta lição, o que você pode dizer de u1na
variável cha1nada sConnectioninfo?
2. O Visual Source Safe fornece serviços de controle do código-fonte ao Visual Studio
.NET. Cite no míniino duas razões pelas quais você gostaria de usar u1n sistema de con-
trole do código-fonte.
3. Qual o no1ne dado quando se usa o sistema de cód igo-fonte para que a versão anterior de
u1n código volte a ser usada?
SEMANA 3
DIA
Introdução à Implantação
Implantar u1n aplicativo é, falando de maneira bem simples, disponibilizá-lo para as pessoas que
irão usá-lo. A i1nplantação terá significados distintos para tipos diferentes de aplicativos. Para
um aplicativo da Web, ela pode significar colocar seu código e páginas en, um servidor Web, en-
quanto para u1n aplicativo Windows, pode ser disponibilizar seu arquivo .exe para todos os usuá-
rios. Etn geral, lida1nos com vários arquivos diferentes, e cada u1n apresenta seus próprios
requisitos, complicando todo o processo. Uma dependência acontece quando um arquivo, que
poderia ser seu executável, precisa de outro, como uma biblioteca (.dll), para ser executado cor-
1532 Dia 19
retamente. Portanto, seu aplicativo pode depender de um ou mais arquivos, mas esses, por sua
vez, ta1nbém pode1n ter dependências e assim por diante. Implantar seu arquivo .exe de ,nodo
que ele funcione de maneira correta pode requerer a instalação de vários outros arquivos!
A dependência 1nais co1num que encontrare1nos, porque ela será necessária a todos os aplicati-
vos .NET que foren, criados, é o .NET Fra,nework. Co,no você deve se le,nbrar, o .NET Fra,ne-
"vork foi introduzido co,no parte da instalação do Visual Studio .NET e é co1nposto de muitos
arquivos que contê1n todas as bibliotecas de classes, o Co1nmo1n Language Runtime (CLR) e
outros componentes itnportantes. Para evitar que seja preciso incluir todos esses arquivos dife-
rentes e suas dependências individuahnente, u1n ,nódulo de intercalação foi fornecido.
Novo TERMO
O ,nódulo de intercalaçcio é um arquivo único que representa essencialn1ente todo
u,n programa de instalação, podendo ser incluído como pa1te de sua i1nplantação. Os
módulos de intercalação (que são annazenados como arquivos .ms1n e1n disco) são uma maneira
excelente de e1npacotar todas as configurações, dependências e arquivos necessários para u1na biblio-
teca ou aplicativo. Você pode criar seus próprios módulos de intercalação, se já tiver uma bi-
blioteca ou outro projeto que gerahnente é incluído e1n outras instalações, ,nas o Visual Studio
.NET possui 1nuitos desses arquivos MSM prontos para sere1n usados. ·Esses ,nódulos de interca-
lação, annazenados em \Program Fi 1es \Commom Fi 1es \Merge Modu les\, incluem as partes do
.NET Frame"vork necessárias para implantar seu aplicativo en1 outra tnáquina.
pregar essa tecnologia, seus programas de instalação poderão se beneficiar de muitos recursos
excelentes, todos fazendo parte da plataforma SDK.
As páginas MSDN que fazem parte da pJatafonna SDK apresentam uma tendência incômoda de
ter seus URLs alterados com o te1npo, portanto o conduzirei na descida pela árvore da biblioteca
ern vez de fornecer um link direto. Acesse http://msdn.microsoft.com/l ibrary e, en1 seguida,
localize o nó da árvore (no lado esquerdo da página) cha1nado Setup and Syste1n Ad1ninistration.
Abra esse nó e, então, prossiga na descida através de Setup, Windows Tnstaller e SDK Docu1nen-
tation. No final, você estará no Windows lnstaller (ele aparece duas vezes no caininho; não se in-
co,node com isso). O bom é que há infonnações disponíveis sobre o Windows Installer, mas
talvez a rnelhor maneira de aprender seja testá-lo por sua própria conta.
clique no botão More se ele já não tiver sido expandido. Dê um nome apropriado ao projeto,
co1no AuthorList e, em seguida, assegure-se de que a opção Create Directory For Solution esteja
seJecionad~ pennitindo que um nome seja fornecido para sua solução. Crie um no1ne para ela,
corno Pubs De1no, indicando que algo 1nais do que apenas esse projeto pode existir nesse local.
Para concluir, dê un1 clique em OK a fim de gerar a solução e o projeto. Crie um diretório para
qualquer solução que tenha 1nais de u,n projeto de 1nodo que pron1ova un1a organização auto1ná-
tica em seus arquivos, situando todas as propriedades que fazern parte da tnes1na solução juntas
e1n u1n diretório. U1n projeto e urna solução serão criados co1n os no1nes que você escolheu.
Adicione o Código
A finalidade deste aplicativo é exibir u1na lista de autores, po11anto, o código te1n de estabelecer
a conexão com o banco de dados, acessar essa lista e exibi-la no controle da caixa de lista. Todas
essas etapas fora1n abordadas como parte do Dia 12, de 1nodo que só 1nostrarei para você o códi-
go concluído (veja a Listagem 19.1), que é chamado no construtor do formulário. Adicione o có-
digo da linha 8 à sub-rotina New de seu forn1ulário e, e1n seguida, insira a rotina LoadAuthors en1
qualquer local dele, exceto dentro de outro procedimento.
Preciso desviar um pouco do tópico e discutir algo co.mum quando chegamos aos estágios finais
de u1n aplicativo. Há u1n item no código 1nostrado na Listage1n 19.1 que causará problemas
quando esse for implantado. Ele usa (local) para especificar o no1ne do SQL Server (Data
Source na string de conexão da Listagem 19.1 ). Isso infor1na à plataforma .NET que você quer
se conectar com o SQL Server na 1náqui.na local, o que provaveiJnente é correto quando estamos
desenvolvendo, 1nas quando esse código estiver em execução en, u1n grupo de máquinas clientes
diferentes, pode ser 1nelhor que todas acessem o mesmo SQL Server central. Há duas 1naneiras
de corrigir isso: a rápida que e1nbutirá no código o nome do SQL Server desejado, ou a un, pouco
mais complicada
,
que permitirá que o notne do servidor seja alterado sem a recompilação do có-
digo. E claro que quero 1nostrar as duas, portanto, começarei co1n o método n1ais fácil, en1 que
apenas alterare1nos a string da conexão para que inclua o no1ne real do co1nputador de seu SQL
Server:
sConnectionString = ''Data Source=Olivaw;'' &
''Initial Catalog=Pubs;'' &_
''User ID=sa;password=daneel''
Nada 1nais precisa ser alterado, e agora, independentemente de e1n que 1náquina esse código seja
executado, ele tentará localizar o servidor con, base no nome "01 i vaw".
,
E possível que o no1ne desse servidor seja alterado ou você pode preferir usar um servidor dife-
rente para este aplicativo. Em geral, o servidor que é empregado no desenvolvimento e o utiliza-
1 536 Dia 19
do na produção são duas n1áquinas diferentes. Seria benéfico poder alterar o servidor com o qual
esse aplicativo se conecta sem que fosse preciso recompilar o código. Antes da plataforma
.NET, esse tipo de funcio11alidade era obtida co1n o uso do Registro. Essa opção ainda está dispo-
nível, ,nas u1n dos principais conceitos novos do VS .NET é que seu apl icativo deve poder ser
instalado apenas por meio da cópia de seu diretório em uma 1náquina (que tenha o .NET Fra1ne-
vvork). Possuir infonnações que precisam estar disponíveis no Registro pode i1npedir que esse
tipo de instalação funcione corretarnente.
Perseguindo o objetivo de fon1ecer instalações e reinstalações fáceis para os aplicativos, a plata-
fonna .NET introduziu um novo sisterna para armazenarnento das configurações de seu aplicati-
vo, que é 1nais parecido co1n a tecnologia antigados arquivos .ini do que com a do Registro. Esse
novo sistema funciona com o uso de arquivos de configuração, documentos XML que pode,n ser
associados a toda urna 1náquina ou a aplicativos individuais. Depois que você concluir essa ins-
talação sirnples, abordarei a utilização dos arquivos de configuração na próxirna seção.
Teste o Projeto
Agora voltemos ao objetivo original de criar un1 arquivo de instalação. Edite a string de conexão
da maneira certa parace1iificar- se de que ela poderá estabelecer correta1nente u1na conexão com
tun SQL Server e encontrar o banco de dados Pubs do exemplo. Concluída essa etapa, execute o
projeto para ter certeza de que está funcionando e de que você possa ver uma lista de nomes de
autores no controle de caixa de lista. Se tudo der certo e você tiver fornecido algo diferente de
( 1oca 1) co1no nome do servidor em sua string de conexão, então, teremos um aplicativo con-
cluído para o qual poderemos desenvolver urn progra,na de instalação.
lador para distribuir nosso código-fonte, arquivos de depuração ou outro conteúdo. Para este
exemplo, selecione Pri1nary Output from AuthorList.
os arquivos de que I
C,e.,!.to li wrô,w~ [l'dt.tllet proj!!d wth ~ ~ Õf li vd:.ard. 1
precisa. "'"'°' J
loc.,tbn: 1C:\Oocurn«'t..s.andS~s\0•..nunm..i.RftCl~ IO\MY Oo:umen(s.\\ a El-<w!se... 1
P,oi«t "'1 tio ao,t,d .. C:\...V,,, Oowm"11>\Y1Suol St,ri!o Proj,:rtj\-1<0006\Setwl.
Sclup Wi,ord ( t of S)
FIGURA 19.2
Welcome to the Setup Project
O Setup l,Jlizard o Wizard
conduzirá pela criação Tli: w~ d ,,.a lo.ad you 1t11ou;h 1he ~cep: oi c1e~9
a iotuo t1'o ~ol.
de 11111 projeto si111ples A eetl.C) cxoject eiliNU! iil\ino.tal,;;1 for )'Cu õpçf:c:aiot\
de insta/açc1o para sua T~ pr~ that i: aNtedc~ be U!~ i:nmer:l.at, V 01
htlhet cuttOfri:?..d to riJ e,.JJõfe.alut et t'IOl covo:ted
solução. ~ lhii ~lê:a1d..
Cldt tl!>d lO c:,e.u ~ n~ s:ttu,:, llfCieel Cf C ~ 10
eicl lhe v!'Caid
-----
Srlup WiL<.ird (J of S)
FIGURA 19.4 Choose proiect outputs to indude
Os resultados de un·, You Cbll irdJde O'J.DUI..:: trcmol.he1 ~t.:: in }~ .oltÀl(lr\
projeto são
conseqüência de seu IJ
O Locif:&d ,t:CM«: hom Aud'tOtl.i!J
desenvolvimento, seja D Oct,,,,; S,,..bob h..,. Aothooti.t
D Coriâ"II Ffes ftMAulhcd.ttl
u1r1 arquivo .exe ou .dll. IJ Sot.rce Res ftomAtAoot.nl
Além dos resultados de u1n ou 1nais de nossos projetos (se houvesse mais de u1n projeto na solu-
ção, que não fosse o de instalação, então, todos eles teriam sido incluídos na lista de saídas), você
tarnbém pode selecionar qualquer arquivo adicional que queira incluir (veja a Figura 19.5). Em
meu exe1nplo, incluí um arquivo read1ne, n1as esse poderia ser seu método de distribuir quase to-
dos os tipos de arquivos inclusive algum conteúdo XML ou até um banco de dados do Access
(arquivo .1ndb).
5cl.uv wnotd (4 or s)
FIGURA 19.5 Choose files: to indude
Adicionar arquivos You CM odd li!,:: =~h ~ RoadMo f.lei0t H1"1l ()~OS totho ;cl\ll).
Para concluir, u1n resumo (veja a Figura 19.6) é exibido, e o assistente será fechado quando você
der um clique en1 Finish. Nesse ponto, o projeto de instalação terá de se esforçar u,n pouco para
detern1inar as dependências das saídas selecionadas, exa,ninando os arquivos do projeto corres-
pondente. Quando essa operação estiver concluída, será possível ver o projeto de instalação ern
seu Solution Explorer, e dentro da subpasta Dependencies, as dependências que encontrou. Na
janela de propriedades do próprio projeto e de seus vários arquivos, pode-se alterar co,no o pro-
gra1na de instalação será criado, ,nas por enquanto, deixarei tudo co1no está.
Implanta nd o Seu Aplicativo 539
Seluµ Wi.tord (5 of S)
FIGURA 19.6 Creote Project
lhe WC.1:11d wll r,o,, cteo~ a pojeet b.a:edcn ~ ehoicrt
A janela do resurno
fornecerá alg111nas
infor,nações básicas ·ecttwec Cre.ate a tet143 fCf .a'N.u:lows a;,p(catiorl
Compilando a Instalação
Exata1nente co1no e1n qualquer outro projeto, para gerar a saída deste projeto de instalação, você
precisa co1npilá-lo. Pressione Ctrl+Shift+B ou selecione Buid e Build Solution no ,nenu para
con1pilar todos os projetos da solução, inclusive o novo projeto de instalação. Essa compilação
leva algun1 tempo devido basican1ente ao projeto de instalação, que co1npacta todos os arquivos
.NET redistribuí.veis necessários e1n uin único arquivo .msi. Vários outros arquivos serão com-
pilados e incluídos no diretório da saída de seu projeto de instalação ,nas, na verdade, eles são
apenas arquivos de suporte para a tecnologia do Windows Installer.
O Visual Studio .NET usa a versão 2.0 do Windows lnstaller, que pode ser a instalada no mo-
mento em sua tnáquina de destino. Se ela já não estiver na 1náquina, esses arquivos de suporte
perinitirão que o usuário a instale. Se você puder se ce11ificar de que todos os usuários possuetn a
versão correta do Windows Installer, devido a sua versão do siste1na operacional, por exetnplo,
ou porque têm outro progra,na .NET instalado, então poderá optar por incluir apenas o arquivo
.msi em sua ilnplantação. As configurações que controla1n a inclusão dessas instalações podem
ser encontradas quando você verificar se seu projeto de instalação está selecionado e, em segui-
da, selecionar Properties no menu Project (veja a Figura 19.7).
NOTA
O termo máquina de destino em geral se refere à máquina que executará o
aplicativo e que precisará de seus arquivos instalados nela. O alvo fica bem
claro quando falamos em aplicativos W indows - as máquinas de todos os
usuários-, mas lembre-se de que para os aplicativos da Web (formulários da
Web, por exemplo), a máquina de destino é o servidor Web, e não a do usuário
final.
540 Dia 19
FIGURA 19.7
Se você não estiver ==.:1. . ,_ ~·--"'-···· 1
certo de que versão (se .....,. ... 1
houver algun1a) do
Windo111s f nstaller
estará disponível na a
máquina de destino,
certifique-se d.e incluir
os arquivos necessários
para atualizar ou
instalar a versão
apropriada.
OK
Na pasta de dependências de seu projeto de instalação, você verá vários arquivos, todos eles ne-
cessários para que seu aplicativo seja executado. Agora, será possível saber que não é preciso
instalar um certo arquivo ou arquivos, mas o progra1na de instalação os incluirá independente-
mente disso. Se quiser forçar a exclusão de um arquivo, dê u,n clique nele cotn o botão direito do
mouse e selecione Exclude no menu que aparecerá. Ta111bé1n poden1os visualizar as proprieda-
des de um arquivo e alterar a propriedade Exc l ude para True se quisermos: as duas operações te-
rão o 1nesmo efeito. Uma razão comum para a exclusão de arquivos é que sabemos que o .NET
Fra1nework já está instalado e quere,nos tentar reduzir o ta,nanho da instalação para que fique
adequada.
Isso conclui a criação de um programa de instalação simples, ,nas o teste real é pegar aquele ar-
quivo .msi (que, no momento em que escrevi este texto, estava co,npactado em cerca de 25 MB)
e implantá-lo etn uma máquina de destino. Apenas copie o arquivo (que estará no diretório de
depuração da pasta do projeto de instalação) para o destino ou insira-o ern um CD. Em seguida,
na 1náquina de destino, dê u,n clique com o botão direito do mouse no arquivo .msi e selecione
Instai!. Nesse 1nomento, você receberá tuna mensagem de erro se não tiver a versão mais recente
do Wi_ndows Instai ler na 1náquina de destino, caso contrário, a instalação deve prosseguir e i_nse-
rir o .NET Fran1e"vork e seu arquivo .exe nessa n1áquina.
Você pode ter alguns problernas para encontrar o que foi instalado, mas os arquivos serão inseri-
dos en1 \Program Files\<Autor do projeto de instal ação>\<Título da instalação> na 1ná-
quina de destino, que por padrão será \Program Files \Mi crosoft\Setupl. Antes de compilar tun
progrruna de instalação que atenda a seus propósitos, certifique-se de alterar as propriedades
Author e Setup Ti tl e, que estão disponíveis na janela de propriedades do projeto de instalação.
Arquivos de Configuração
Os arquivos de configuração são docu,nentos XML associados ao seu aplicativo .NET com base
no nome e local. Eles usam o formato simples de nomeação com o nome completo dos aplicati-
vos (AuthorList.exe, por exen1plo) seguido de .config (produzindo AuthorList.exe.config) e fi-
Implantando Seu Aplicativo 541 1
LISTAGEM 19.2 Usando um Arquivo de Configuração para Tornar Seu Código Mais
Flexível
1 Private Sub LoadAuthors()
2 Dim sConnectionString As String
3 sConnectionString = ''Data Source='' &GetServerName() & • & li • li
L ISTAGEM 19.2 Usando um Arquivo de Configuração para Tornar Seu Código Mais
Flexfvel (continuaçôo)
15
16 lbAuthors.OataSource = dsAuthors.Tables(O).OefaultView
17 lbAuthors.OisplayMember = ''Name ''
18 End Sub
19
20 Private Function GetServerName()As String
21 Dim sServerName As String
22 sServerName =-
23 Configuration.ConfigurationSettings . AppSettings.Get(''Server'')
24 Return sServerName
25 End Function
ANALISE A linha 22 executa todo o trabalho que usa o arquivo de configuração, trabalho esse
que ficou ,nuito mais si,nples porque ,neu arquivo de configuração só utiI izou seções
já existentes. Se eu quisesse incluir minhas próprias seções, teria de descrever a nova seção con10
uma Linha dentro do bloco confi gSect i ons dos arquivos de configuração do aplicativo ou máqui-
na e, em seguida, adicionar as configurações individuais coino lin.bas dentro dessa nova seção.
Nesse caso, a linha 22 retorna como u1na string qualquer que seja o valor do atributo na linha do
arquivo de configuração, de modo que posso e1npregar essa string na criação de minha conexão
(linha 3).
LISTAGEM 19.3 Usando uma Classe Separada para Isolar Seu Código 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 Public Function Authorlist(ByVal sServerName As String) As DataSet
11 Dim sConnectionString As String
12 sConnectionString = ''Data Source='' & sServerName & '';'' &
13 "Initial Catalog=Pubs;" &
14 ''User ID=sa;password=daneel''
15 Dim connPubs As New SqlConnection(sConnectionString)
16 Dim cmdAuthors As New SqlCommand(_
17 "Select au fname + ' ' + au lname as Name from Authors",
18 connPubs)
19 Dim daAuthors As New SqlDataAdapter(cmdAuthors)
20 Dim dsAuthors As New DataSet(''Authors'')
21
22 connPubs.Open()
23 daAuthors.Fill(dsAuthors, ''Authors'')
24
25 Return dsAuthors
26
27 End Function
28 End Class
ANÁLISE Observe que o único método dessa classe, Authorl i st (linha I O), usa o nome de um
servidor co1no parân1etro, permitindo que passemos essa inforn1ação do aplicativo
principal. Agora o aplicativo original precisa ser reescrito para usar a biblioteca nova, o que tam-
bé1n requer que adicionernos tuna referência ao projeto. Para adicionar a referência, dê um clique
con1 o botão direito do mouse na pasta References (do projeto original) e selecione Add Referen-
ce. Isso abrirá a caixa de diálogo Add Reference, e nesse 1nomento você poderá encontrar o novo
projeto de biblioteca de classes na guia Projects (veja a Figura 19.8). Certifique-se de que o proje-
to PubsDataAccess est~ja realçado e, em seguida, dê un1 clique en1 OK para adicionar uma referên-
cia ao projeto principal.
Com essa referência adicionada, você poderá reescrever o código de seu fonnulário para que use
a biblioteca, criando o código descrito na Listage1n 19.4.
1 544 Dia 19
Add Rde-,rnce E3
FIGURA 19.8
A guia Projects perrnite .NET l<OM 1,,,,,<U !,= = = = = = = = = =, r = =,
8'owsc... 1
• Ndno Pro DW~
que você referencie -1
direta111en1e outros
projetos de sua solução,
011 de outro local,
,nesrno se seus
resultados não tivere,11
sido con,pilados.
T
- 1
Para que possa1nos adicionar outro projeto de instalação, dê u1n clique no existente e selecione
Reinove para retirá-lo da solução atual. Dê um clique com o botão direito do 1uouse na solução,
selecione Add e New Project no menu suspenso que aparecerá e abra a caixa de diálogo Nev. 1
Project. Selecione o Setup Wizard para obter u1n tipo de projeto, insira um non1e diferente dopa-
drão 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, 1nas uma das etapas, Choose Project
Outputs to lnclude, exibirá algumas informações diferentes das da última vez que esse assistente
Implanta nd o Seu Aplicativo
foi executado. Dessa vez, os arquivos de resultado tanto do aplicativo principal quanto da nova
biblioteca serão exibidos (veja a Figura 19.9).
Apesar das diferenças e de todas as opções que ficaram visíveis na etapa Choose Project Out-
puts, você só deve selecionar o resultado básico do aplicativo principal. Nesse caso, ele é Aut-
horl i st , o projeto que conté1n apenas un1 fo11nulário Windows, po11anto é preciso selecionar
apenas as saídas principais desse projeto. Depois que as saídas desejadas foren1 selecionadas, fe-
che o assistente. Em seguida, o Setup Wizard detenninará as dependências da(s) saída(s) sele-
cionada(s) e, em nosso exemplo, encontrará un1a dependência adicional que é a DLL PubsDa-
taAccess. Por causa dessa dependência, a DLL necessária será instalada, 1nes1no não tendo sido
selecionada co1no u1na das saídas desejadas. Se fosse necessário selecionar as duas saídas, isso
não faria cotn que a instalação falhasse, mas um aviso seria exibido durante a compilação de seu
arquivo de instalação: "Aviso : Dois ou mais objetos possuem o mesmo local de destino
(' [targetdir]\pubsdataaccess.dl l ')".
A instalação desse projeto não parecerá diferente para o usuário final, n1es1no sendo instalada
tuna bibl ioteca adicional, e tudo irá para a mesma máquina de destino.
Resumo
Implantar siste,nas é uma das etapas finais da criação de um aplicativo e é em geral muito mais
complicado do que os desenvolvedores esperan1. A plataforma .NET tornou a implantação mui-
to 111ais si1nples, ,nas só desenvolvendo seu aplicativo, sua instalação e, e1n seguida, testando a
irnplantação en1 quantas 1náquinas for possível você terá alguma certeza de que seu estágio real
de .implantação foi bem-sucedido.
P&R
P A tecnologia Windo,vs Jnstaller parece ter muito mais opções do que é possível en-
contrar nos projetos Setup e Deployment. Como posso desenvolver uma instalação
com recursos como os que vejo nas instalações comerciais?
546 Dia 19
R Os recursos de instalação fornecidos pelo VS .NET são excelentes, n1as eles abrangem
apenas as necessidades básicas de um programa de instalação. E1nbora haja mais recur-
sos nos projetos de instalação do YS .NET do que 1nostrei nesta lição, para conseguir to-
dos os recursos disponíveis na tecnologia Windows Installer, será preferível que você
trabalhe com um programa de instalação de outros fornecedores como o Jnstall Shield
(http: \ \www .installshield . com) ou o Wise Installer(http://www.wisesolution.com).
P Achei que não iria ter de escrever programas de instalação com a plataforma .NET.
Achei que pudesse apenas usar um comando XCOPY.
R Isso é verdade, você não te1n de criar un1 progra,na de instalação para seu aplicativo, ape-
nas copiar seu diretório deve fornecer a funcional idade de que precisa. Mas a instalação
do .NET Fra,nework é uni pouco 1nais complexa e será necessária e,n muitas 1náquinas
antes que seu aplicativo possa ser executado. Além disso, un1 arquivo .bat executando
tnn co1nando XCOPY deve funcionar, mas un1a instalação gráfica com caixas de diálogo
e outras opções é uma escolha muito n1ais profissional para 1nostrar a seus usuários.
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e1n co1no colocar seu conhecilnento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Se você não estiver ce,10 de que o .NET Framework estará disponível em todas as suas
1náquinas de destino, terá de desenvolver duas instalações (uma co1n ele e outra sem)?
2. Se você criar um aplicativo co,nposto de apenas u1n projeto principal e vários projetos de
biblioteca que ele use, terá de gerar 1núltiplas instalações?
3. Como contigurar u1na única instalação para que tenha vários tipos, como, por exemplo, a
norn1al, a co,npleta e a mínima?
4. Co,no você incluiria u,n arquivo de configuração (.config) ou outros arquivos adicionais
junto a sua instalação?
Exercícios
1. Desenvolva u1n aplicativo com formulários Windows que use um arquivo de configura-
ção para determinar que nome (propriedade Text do formulário) inserir na barra de título
do Windows e, e,n seguida, crie un1 arquivo .config para ele e tnn progra,na de instala-
ção. Implante o projeto e, então, tente alterar o conteúdo do arquivo .config e executar
nova1nente o aplicativo.
SEMANA 3
DIA
Introdução à XML
A 1nenos que você tenha evitado, durante os últimos anos, qualquer pessoa no 1nes1no prédio que
tenha olhado, tocado ou estado com utn computador, pode ter ouvido falar do acrônimo de três
letras XML. A XML (eXtensible Markup Language) está ern todos os lugares atuahnente - apa-
recendo até e1n revistas de variedades do grande mercado. Nesta lição tentarei des1n istificar um
pouco do sensacionalis1no e exa1ninar e1n que a XML pode auxiliar seus programas. Em particu-
lar, esta lição enfocará:
• OqueéXML?
• A XML na prática.
O Que É XML?
A Extensible Markup Language (XML - se analisarmos deveria ser EML, mas essa abreviatura
não chegaria n.etn perto do nome 1noderno que é dado atualmente) é uma maneira de adicionar
informações ao texto. XML é o tenno popular usado nos softwares - linhas de produtos e empre-
sas inteiras foram criadas ou rnodificadas apenas para adicionar XML ao seu rnaterial de propa-
ganda - , e há 1nuitos mitos e mal-entendidos relacionados ao que ela pode fazer e qual sua
finalidade.
No entanto, antes de tratarmos dos mal-entendidos, exam inaremos primeiro o que ela faz. A
XML é uma maneira de adicionar informações ao texto. Que tipo de informações? Informações
sobre o texto. Pode soar como um círculo vicioso, n1as estou falando sério, e isso na verdade ten1
urn nome - rnetadado. O 1netadado é a inforn1ação sobre infonnações. A definição fonnal é
548 Dia 20
Dados sobre dados. O metadado descreve como, quando e por quem un1 conjunto especítico
de dados foi coletado e como eles estão fonnatados. O metadado é essencial para a co1npre-
ensão das informações armazenadas e1n depósitos de dados (definição encontrada na Webo-
pedia do Internet.co,n).
Para apreenderrnos o conceito do ,netadado, exa,ninaremos o livro que você está lendo neste
mo,nento. E' claro que há uma pru1e essencial no livro-as informações que ele contén1. Elas são
os dados. Além delas, ainda há as informações sobre o livro - a quantidade de lições, a existência
dos cabeçalhos nas seções e assitn por diante. Até a fo1111atação fornece informações sobre o li-
vro. Se apliquei negrito a alguma parte do texto, você perceberá que ela é 1nais itnportante do
que o restante. Essas são as inforn1ações sobre o texto cio Iivro - o metadado. O metaclado é uma
idéia poderosa; fornece às infonnações uma estrutura e finalidade.
Você pode adicionar 1netadados de ,nuitas n1aneiras. Por exemplo, em um banco de dados, o me-
tadado se encontra na forma de no1nes e ditnensões referentes às colunas das tabelas. Ele infor-
ma que tipo de dados deve existir nesse local, qual seu ta,nanho e às vezes u,n nome que induz ao
conteúdo. A HTML também fornece 1netadados de acordo co,n a importância relativa de alguns
textos. Isto é, eles ficam em uma tag de cabeçalho e, nesse caso, indicam o nível. No entanto, a
HTML não é um exemplo adequado porque foi projetada para ser usada na fo1111atação, e não na
identificação de informações.
Algo que a HTML realmente nos ,nostra, entretanto, é a relevância de usar simples tags para adi-
cionar a forrnatação, ou seja, 1netadados, ao texto. As tags são os itens que possuem colchetes an-
gulares (dessa <forma>) que ve,nos quando nos deparamos co1n a HTML. Se nunca tiver visto
um código HTML ou só quiser ter tuna idéia de sua aparência, dê uma olhada no código-fonte de
qualquer página da Web. E' possível fazer isso selecionando Exibir e Código fonte no Internet
Explorer. Você deve ver várias tags. A H.TML usa essas tags para identificar qual texto deve fi-
car em negrito ou ern itálico, onde uma tabela ou figura deve ser inserida e assi1n por diante. Ela
também de1nonstra o final de cada u1na dessas seções. Portanto, se examinássemos o códi-
go-fonte da página da Web 1nostrada na Figura 20. l , veríamos
<html><body><strong>April 22 , 1970</strong><body><html>
A tag <strong> 1nru·ca tudo que estiver entre ela e a tag de fecha1nento </strong> como algo im-
portante, e a maioria dos navegadores exibiria esse trecho e1n negrito. Essa tag adicionou infor-
mações ao texto, portanto é 1netadado.
A XML é se1nelhante a HTML; na verdade, elas estão relacionadas. Há ,nuitos anos, um pou-
co depois da idade das trevas (nos anos 60), vários pesquisadores, preocupados com a quan-
tidade de 1naneiras pelas quais um ponto i1nportante poderia ser identificado, criaram algo
chamado Standard Generalized Markup Language (SGML). A SGML introduziu 1nuitas
idéias inovadoras:
Introdução à XM L
Urna data a ser J +- Gocl< • .. • ~ ]) ~ 1~-"' ru•- o-.., l re· § l!l · lRI <\) 8 !"""
JAddtess l@JG:\lnetpb\ww..«d\SWf'Cllo,ttm .:]
le111brada. •
April 12, 1970
e)Õono
;ias,.., J ríl:J 3I !;4 !)ii l!J
(como a SGML tàzia). Ela usa os 1nes1nos conceitos básicos da SGML; en1prega tags para mar-
car o co,neço e o final de utna seção de informações. Essas tags são palavras entre colchetes an-
gulares que devem fornecer infor1nações sobre os dados que contêm. Etn outras palavras, a
XML te1n a mes1na aparência dos trechos anteriores de HTML e SGML.
Por que os autores da XM-L criara1n algo tão parecido co1n os dois padrões já existentes? Eles fi-
zeram isso porque a SGML é co,nplexa, e a HTML, na verdade, só te,n a fi nal idade de adicionar
a u,n docu,nento infor,nações sobre a for,natação. A XML foi projetada para ser urna SGML
simplificada que poderia ser usada na criação de várias linguagens ou conjuntos de tags específi-
cas de u,n segmento da indústria ou de u1na tecnologia. Muitas dessas linguagens estão disponí-
veis, inclusive as que descreve1n equações 1natemáticas (MathML), receitas e até uma versão da
HTML que foi definida com o uso da XML (XHTML). Cada uma delas define os metadados que
podern ser apJ icados às informações; no entanto, todas fazern isso conforrne as regras da XML.
Então, quais são as regras da XML? Elas forrun oficialmente definidas da seguinte ,naneira:
• A XML deve ser simples de usar na Internet.
• Deve dar suporte a uma ampla variedade de aplicativos.
• Deve ser con1patível com a SGML.
• Deve facilitar a criação de prograrnas que processern docurnentos XML.
• A quantidade de recursos opcionais da XMºL deve ser mantida em um 1níni1no rigoroso,
cujo ideal seria nenhu1n.
• Os docu,nentos XML devem ser suficientemente claros e de fácil leitura pelas pessoas.
• O projeto XML deve ficar pronto rapidamente.
• O projeto que usar XML deve ser formal e conciso.
• Os docun1entos XML devern ser fáceis de criar.
• A abreviação na 1narcação XML tem u,na importância 1nínin1a.
Portanto, isso é o que é a XML. E aqueles rnal-entendidos 111encionados anteriorrnente? Parece
haver muitos deles. Vários surgira,n pela maneira corn que diversos departamentos de marketing
pro1noveram o uso que sua en1presa fazia da XML; outros fora,n causados pelos escritores que
passararn para as pessoas idéias estranhas sobre ela, n1as é claro que não sou u,n deles.
Os principais m.al-entendidos que vejo co1n freqüência são
• Você tem de escolher entre o Visual Basic .NET e a XML. Embora a Xl\!lL seja uma lin-
guagem, não é u,na linguagern de progra,nação como o Visual Basic .NET. As pessoas
parece,n ficar confusas com essa pa,te da 'linguagem' e começam a fazer perguntas
corno, "Devo aprender Visual Basic .NET ou XML?". A XML não é uma linguage1n de
programação, só uma maneira de descrever infor1nações.
• A XML é con1plicada e difícil de ler. Por que adicionar toda essa 'confusão', ao docu1nen-
to quando X (algu1na outra técnica) faria o 1nesn10? A resposta é simples. E uma ,naneira
fácil de identificar as pa,tes de um docurnento. Por exe,nplo, muitas pessoas sugere,n que
algo charnado de Valores separados por virgula (CSV -Com,na-separated values) é rne-
Introdução à XML 551 1
lhor do que a XML por ser mais simples, fácil de produzir e os arquivos serem menores
(veja o próxitno ite1n). No entanto, qual dessas duas listagens descreve mais detalhes so-
bre as informações exibidas:
<funcionários>
<identificação funcionário=''l''>
<primeironome>John</primeironome>
<sobrenome>Bull</sobrenome>
</funcionário>
<identificação funcionário="2">
<pri meironome>Mary</primeironome>
<sobrenome>Tell</sobrenome>
</funcionário>
</funcionários>
1, John. Bu 11
2. Mary, Te 11
Na rninha opinião, a primeira (a XML) é muito rnais con1preensível.
• A XML torna o trabalho lento (ou 1nuito extenso). Essa afirmação em geral é proferida
por aqueles veteranos que acham que se estivennos usando wn caractere a n1ais, estare-
1nos desperdiçando velocidade/esforço da rnemória/processador. Ernbora às vezes isso
rne preocupe, a XML não é tuna das áreas onde ocorre. O argumento que você pode ouvir
é algo co1no, "Todas essas tags de abertura e fechamento ocupa1n n1uito espaço e seu uso
conso1ne tempo. Devemos usar X (colocam algo aqui de que eles gostarn 1nais) e111 vez
disso". A rnaioria das pessoas que estiver lendo este texto provavelmente se le1nbrará do
resultado de um pensamento desse tipo: ele foi charnado de bug Y2K. Reahnente há o que
se chama (em 1ninha opinião) de código superotitnizado. En1 algumas situações, usar tuna
técnica 1nenos eficiente que torne 1nais fácil compreender a intenção produz uma resposta
bem superior (mais uma vez, é apenas minha opinião). A XML é u1na dessas técnicas me-
nos eficientes, porém mais inteligíveis.
• A resposta é XML. Qual é a pergunta? A XML não vai resolver o proble1na da forne rnun-
dial, impedir a guerra ou 1nes1no fazer café para você de manhã. Tudo que pretende é ge-
rar informações sobre um bloco de texto. Muitas pessoas tentam tornar a XML a solução
para tudo ou aplicá-la onde não pode, ou deve, ser usada. Se parece que ela irá causar mais
problemas do que se deseja resolver ou se não estiver ne1n mesmo resolvendo problema
algu1n, não a utilize. Encontre u1na solução 1nelhor.
Elementos
Vários itens podem ser usados na criação de urn docu1nento XML; no entanto, você encontrará
duas partes irnportantes etn quase todo docurnento XML - elementos e atributos.
1552 Dia 20
Atribut os
En1bora grande parte de qualquer arquivo XML seja de ele1nentos, tatnbém podetn existir atri-
butos nele. Os atributos são usados para fornecer informações adicionais sobre wn elemento.
Se você usou HTML no passado, provavehnente saberá o que é u1n atributo. Por exen1plo, no
fragmento HTML
<a href="http://msdn.microsoft.com/vbasic">Home Page do Visual Basic</a>
o termo href é u1n atributo que define uin local para o ele,nento a (ou âncora). Ele estabelece
para onde o ele1nento âncora deve direcionar seu navegador quando você der un1 clique nele.
Para os que não conhecem HTML, a linha anterior de código adiciona u1n hiperlink (um daque-
les links sublinhados) para uma página da Web.
De maneira semelhante, outros atributos fornecem informações para elementos diferentes. Isso
leva a uma das 1naiores diferenças entre os atributos e ele1nentos: os atributos não são indepen-
dentes e precisa1n ser aplicados aos elementos. U,n atributo se,npre aparece dentro da tag de
abertura de um elemento. Além disso, ele se111pre apresenta a forma a seguir:
nome="valor"
Ou seja, u,n atributo é composto de duas pa1tes: um nome e um valor. O no1ne deve ser exclusivo
dentro de cada elemento, embora dois eletnentos possam ter o mesmo atributo. Além disso, um
elemento pode ter n1uitos atributos.
Introdução à XML 553
Esquemas
E1nbora os esquemas na verdade não faça1n pa1te da XML, desempenham um papel importante
e1n sua utilização, e isso se tornará mais relevante quando eles se tornarem utn padrão oficial. No
1no1nento e1n que escrevo este texto, os esquen1as XML acabara1n de ser definidos como un1 pa-
drão reco1nendado. Os esque1nas XML são, en, pri1neiro lugar, u1n aplicativo em XML. Exata-
tnente como qualquer outro código XML, eles são infonnações sobre infonnações (lnetadados -
já ficou cansado de ouvir este tenno?). Os esquemas XML definem uma maneira apropriada de
estruturar um arquivo XML. lsso inclui os tipos de dados para cada elemento e atributo, o que
pode ser u1n ele1nento-filho de qualquer outro ele1nento, e até quais são os elementos vál idos
para u1n arquivo específico.
Alguns de vocês podem se perguntar por que os esque1nas são necessários. Eu não disse que
você poderia criar u1n arquivo XML contendo qualquer co1nbinação de ele1nentos e atributos?
Betn, na verdade, sim. No entanto, há uma diferença entre criar un1 arquivo XML para conter ai-
1554 Dia 20
guns dados e un1 código XML que defina u1n tipo específico de dado. Por exemplo, se trabalhás-
se1nos com um arquivo que tivesse dados de funcionários, poderíamos esperar ver certos itens -
no1ne, identificação do funcionário, algu1nas infor1nações de contato e assim por diante. Entre-
tanto, não te1nos idéia do local em que se encontrarn essas infonnações no arquivo, nem que tags
poden1 ser chamadas. Se1n u1n esquen1a, tería1nos de examinar o arquivo e escrever un1 código
específico para ler cada u1n deles. Con1 um esque1na, conheceren1os a estrutura dos dados anteci-
padamente. Ne1n todos os campos serão necessários ou que eles esteja1n exatamente no rnesino
local en1 todos os arquivos, 1nas saberemos co1n certeza quais desses ca1npos serão cha1nados e
teremos informações sufici entes para recuperá-los por meio do DOM ou usando u1n objeto
XMLTextReader. Examinare1nos esses objetos e1n breve. A Figura 20.2 1nostra u1n esquema X.ML
simples.
Se você leu algo antes ou se decidir fazer uma leitura adicional sobre XML, se
NOTA deparará com o conceito chamado Document Type Definition (DTD). Os DTDs
foram uma tentativa anterior de definir uma estru tura apropriada para arqui-
vos XML. Na verdade, os DTDs datam da época da SGML. Eles parecem execu-
tar a mesma tarefa que os esquemas XML; no entanto, há algumas diferenças
importantes:
• Os esquemas XML são escritos com o uso da XML; os DTDs não. Eles em-
pregam um formato semelhante, mas que não é a XML, para a definição
da estrutura adequada de um arquivo XML. Isso é importante porque sig-
nifica que você precisa de um conjunto de ferramentas para trabalhar com
os DTDs, e outro para manipu lar a XML resultante. Já que os esquemas
XML são XML, é possível trabalhar com eles usando as mesmas ferramen-
tas.
• Os DTDs não definem os tipos de informações. Eles descrevem a estrutura
delas (isto é, que elementos podem estar contidos em outro), mas não se
um dado elemento deve ser um inteiro, string ou outro tipo de dado. Os
esquemas XML fornecem a capacidade de adicionar essa informação.
Corno já foi descrito rnuitas vezes neste livro, um dos principais objetivos do Visual Basic .NET
é tornar mais fácil o trabalho com tecnologias co1nplexas. Portanto, não deve surpreender o fato
de ele possuir u,n editor que permita a visualização e edição de esque,nas XML. A criação de es-
quemas tan1bé1n produz u1n efeito agradável que é tornar mais si1nples o trabalho com os docu-
mentos XML. A Figura 20.2 ,nostra um esque1na XML básico. Ele se encontra ern u1n editor
gráfico que perrnite a geração de vários dos tipos e estruturas que con1põem os esquemas XML.
Depois de criar um esque1na, você poderá associá-lo a u,n arquivo XML, e o Visual Basic .NET
fornecerá os recursos de Intellisense para os eletnentos e atributos definidos nesse esquema (veja
a Figura 20.3).
Introdução à XML 555
·- O-·..•••
..
d
'. \,
·-
E ,,tt
.'. .
• ... tr•v.r
...,., '"" .......
.
•
A P ' ~ -1 N. .. ·, E""""''°"' "'"'
•. E'"'
•.
.•.
..-,,. ..,....
e "' ..,
"""
a.;;;
1 1 .. : ; <·
''"' bct)
·,
notr'P'!
A
ira,nbõr)
WN) . ..
•• .
A P l ~..I N.
1
.
•
•
Js..._
jc S<t,,rno
lEl °""" ·~1 .., ColS 0,$
FIGURA 20.3 !Jo t,2 ~ tl'Olect l"'d Q<huo ~ T"'(e Iook l i . - t!eb
1~ • ~ • ~ liil ~ J1 ~ li!!. •., '. ... • .ID • t. i • .°'°""
• e '
O lntellisense e a XA1l.
t lil 13 •·• I Cil "ll. ~ '" Q! ~ ~ t. 13\ . !lt ,,. •
f <fotlá>2SO a,q.cap~ulc</tonn>
<di~pen~e.>10</d ! ~pen~e>
<do~ooo>l cop(o) vo<ldo~ooc>
<t~truet.lo n~>3 ti~s dsi l y uati l oonc</ trustruet torus>
<ret1l l>O</rct1ll>
(ll)-
•rm-..
«(
f<ll f0!1I
81)~
cm..-
Wl<cH
~ C!W#·l
•
..
l
--~--- llnT
556 Dia 20
.A idéia existente por trás do DOM consiste em que qualquer arquivo XML pode ser descrito em
tennos de tuna árvore co1n nós. A Figura20.41nostra co1no isso poderia ser representado concei-
tuahnente, dado o exemplo XML a seguir:
<?xml version=''l.O''?>
<identificação cliente=''12345''>
<data ordem="Ol/04/01">
<itens>
<item>
<identificaçãoitem>foo</identi ficação i tem>
<quantidade>lOO</quantidade>
</item>
<item>
<identificaçãoitem>bar</identi ficaçãoitem>
<quantidade>l</quantidade>
</item>
</itens>
</ordem>
</cl iente>
Há duas 1nanei_ras de examinar qualquer tun dos nós de u1n DOM. De certo modo, todos são nós.
No entanto, tan1bétn são tipos específicos de nós. Por exe,nplo, o nó ordem representa um nó de
elemento, enquanto o nó data é u1n nó de atributo. Cada tipo de nó dá suporte a todos os recursos
de u,n nó genérico, assim como a n1étodos e propriedades específicos de seu tipo. A Tabela 20.1
descreve os tipos de nó ,nais usados.
1558 Dia 20
Tipo de Nó Descrição
Um beneficio de ter vários tipos de nós herdados de urn ún_ico nó é que todos con1parti lham urn
conjunto de propriedades e rnétodos. Isso permitirá que você aprenda rnais facihnente co,no traba-
lhar co.rn o DOM. A Tabela 20.2 resume as propriedades e métodos usados corn mais freqüência.
Membro Descrição
Propriedades
ChildNodes Conjunto de todos os nós-filhos desse nó. Essa é uma das maneiras
principais de navegar pelo DOM, percorrendo os filhos com um laço
For ... Next.
FirstChild Retorna o primeiro nó-filho do nó atual. Essa é outra das principais
maneiras de navegar pelo DOM, encontrando o primeiro nó-filho e,
em seguida, executando um laço enquanto NextSi b1i ng (discutido
posteriormente nesta tabela) retorna um valor.
InnerText O texto contido dentro de cada nó. Aí se inclui qualquer nó-filho que
ele possua.
Métodos
,
AppendChild Adiciona um novo filho ao nó atual. E assim que é possível estender
um conjunto de nós existente.
Introdução à XML
Usar Xml Document para trabalhar con1 a XML é se1nelhante ao que vemos na árvore de nós da
figura 20.4. No topo da hierarquia se encontra utn único nó-raiz, de nome e1i ente. Ele e todos
os outros nós do DOM possuem u1n conjunto de nós-filhos. Por sua vez, todos esses nós também
tê1n nós-filhos e assi1n por diante. Os objetos possue1n 1nétodos que o ajudarão a navegar nessa
hierarquia. A Tabela 20.3 descreve alguns desses métodos e propriedades. Alé1n disso, Xml Docu-
ment dá suporte às 1nesmas propriedades e tnétodos da classe Xml Node.
Membro Descrição
Propriedades
Métodos
CreateNode Usado para criar novos nós que serão adicionados ao documen-
to. Este método genérico permitirá que você gere qualquer tipo
de XmlNode.
Ao usar XmlDocument e o DOM para ler XML, você e1n geral e1npregará ChildNodes ou
Fi rs tCh i l d/NextS i bl i ng para percorrê-la e encontrar os nós nos quais estiver interessado. Utili-
zar o DOM pode dar um pouco de trabalho porque só o nó Xm1Document é capaz de criar os vários
elementos, atributos e assim por diante. Depois que o nó específico for criado, será possível adi-
cioná-lo ao conjunto desejado con1 o método AppendCh i 1d.
O DOM éu1nan1aneira-padrão de ler e criar arquivos XML. E1n geral, ele é útil quando se traba-
lha com arquivos que são relativamente pequenos.
Esse processo també1n conso1ne 1nuito tempo, principahnente se tudo o que você precisar for de
utn ou dois itens do documento.
O Visual Basic .NET possui outra estratégia para trabalhar com a XML - objetos de leitura e de
gravação. Para ser ,nais específico, Xml TextReader e Xml TextWri ter. O objeto Xml TextReader
concede acesso veloz só de avanço a blocos XML, enquanto Xml TextWri ter fornece u,na ,naneira
rápida e resumida de criar XML. E1nbora em algu1nas situações eles não sejam tão intuitivos
quanto usar o DOM, na verdade são tnais aperfeiçoados que ele e1n duas áreas principais:
• Não é preciso carregar todo o arquivo antes que o documento comece a ser processado -
ele não precisa nem mesmo estar disponível. lsso poderá acontecer quando for executado
o download de un1 arquivo XML da Internet. Por não precisar de todo o arquivo na 1ne-
1nória, Xml TextReader e Xml TextWri ter pode1n reduzir enormemente os requisitos gerais
de me1nória de seu aplicativo.
• Os objetos Xml TextReader e Xml TextWri ter são rápidos. Muito rápidos. Isso é devido ao
fato de não precisaretn construir todas as estruturas de rnernória, corno as listas de nós,
que o DOM usa.
No entanto há u1na desvantagem em se trabalhar com Xml TextReader e Xml Textl1ri ter. Já que
eles não arn1azenam o docun1ento integral na memória, às vezes pode se tornar difici I relacionar
urna parte dele com a outra. Se você precisar tnanter o registro de várias partes do documento e
ainda usar Xml TextReader e Xml TextWri ter, terá de escrever u,n código para fazer isso.
Por meio de Xml TextReader, você pode ler o arquivo executando u1n laço co1n o ,nétodo Read, pa-
rando e1n cada nó do docu,nento XML. A seguir, decida se está interessado no nó atual e, caso
esteja, aplique a ele as outras propriedades e métodos. A Tabela 20.4 1nostra alguns dos 1nétodos
e propriedades de Xml TextReader mais usados.
Membro Descrição
Propriedades
M ét odos
O objeto Xml TextWri ter é usado na construção do documento XML, acrescentando as tags indi-
viduais de abertura e fechamento dos ele,nentos. Ele pode ser uma n1aneira natural de cri.ar um
Introdução à XML 561 1
docun1ento cha1nando métodos para gerar cada parte. A Tabela 20.5 descreve as propriedades e
1nétodos de Xrnl TextWri ter que são gerahnente usados.
Membro Descrição
Propriedades
Métodos
Lendo XML
E1nbora você pudesse usar os 1nétodos IndexOf e SubStri ng da classe String para ler XML eco-
nhecer seu conteúdo, essa não é a 1naneira 1nais eficiente de fazer isso. Co1no alternativa, é reco-
mendável usar o DOM ou os objetos XrnlTextReader para ler XML. Essas duas famílias de
objetos podem interpretar co1n 1naior facilidade arquivos XML.
O DOM será mais apropriado se você tiver de ler um arquivo XM.L que esteja todo na 1ne1nória e
trabalhar com ele. Como descrevi, o DOM nos pennite percorrer o arquivo avançando ou retor-
nando, relacionar un1a seção co1n outra e alterar o arquivo no momento e1n que estivennos len-
do. Por outro lado, Xrnl TextReader é mais apropriado quando precisa1nos apenas ler o arquivo
percorrendo-o uma única vez.
Para saber como os dois conjuntos de objetos funcionam, seria bo1n vê-Los em ação em urn
exemplo. Muitos aplicativos precisan1 ser personalizados pelos usuários, co1no pode ser feito
por meio das configurações de Tools na caixa de diálogo Options. Essas infon11ações pode1n ser
facilmente annazenadas em um arquivo XML, pennitindo que você ou seus usuários leiam ou
1 562 Dia 20
[j.,;;;;; r r ~..,~
:j!St•t l ~ a ~ 1~ .....- ,.....e... '::lbl'> l~o\tcmo\somi)r..\ , __ !lül
14 End Sub
15
16 Public Property FileName() As String
17 Get
18 Return m sFileName
19 End Get
20 Set(ByVal Value As String)
21 m sFileName = Value
22 LoadOOM()
23 End Set
24 End Property
25
26 Public Property Items() As Hashtable
27 Get
28 Return m oltems
29 End Get
30 Set(ByVal Value As Hashtable)
31 m oltems = Value
32 End Set
33 End Property
34
35 End Class
ANÁLISE A classe possuj dois construtores (linhas 7 a 10 e 12 a 14). Isso foi feito para adicio-
nar flexibilidade. O progra1nador pode criaru1na instância dessa classe usando oSet-
ti ngs = New Settings( ), caso em que o arquivo empregado é o padrão, co1nposto do no1ne do
aplicativo, seguido pela extensão . cfg. Co.mo alternativa, ele pode gerar o objeto Sett i ngs no-
rneando o arquivo que contém as infonnações sobre a configuração, corno e1n oSettings = New
Sett i ngs ("Al gumArqui vo .xml ") . De qualquer uma das duas maneiras, a propriedade Fi l eName é
configurada. Depois que isso é feito (linhas 20 a 23), a variável internam_s Fi l eName é configura-
da, e o tnétodo LoadDOM (que será criado e1n breve) é chamado. Esse método carrega no conjunto
HashTab l e interno as configurações que forarn estabelecidas no arquivo desejado. HashTab l e é um
dos conjuntos definidos em System. Co 11 ecti ons. Ele arn1azena vários itens por nome, como a
propriedade Tables do objeto DataSet. Isso pennitirá que você recupere itens da propriedade
Items usando u1n código parecido com oSettings . Items("AlgumaConfiguração").
'
E claro que antes de poder usar essa classe, você deve adicionar a funcionalidade que carregará
as configurações. A Listage1n 20.2 mostra como fazer isso co,n Xml TextReader, enquanto a Lis-
tagem 20.3 descreve o rnes1no, porérn ernpregando o DOM.
1 564 Dia 20
ANÁLISE Prin1eiro o n1étodo LoadReader inicializa HashTab l e (linha 39) e declara o objeto
Xml TextReader alén1 de uma variável string que será usada durante o processa1nento.
Já que esse processamento é executado e1n un1 arquivo que pode ou não existir, sua abe1tura e lei-
tura são protegidas pela inserção em utn bloco Try ... End Try (linhas 43 a 61 ). Como antes, a
cláusula Fina 11 y desse bloco (que começa na linha 58) garante que o objeto de leitura seja fecha-
do e eli1ninado, n1esmo se um erro ocorrer.
Grande parte desse 1nétodo é representada pelo laço Wh i l e ... End Whi 1e das linhas 45 a 56. Ele lê
cada nó do arquivo. Quando um nó é lido, prirneiro o código deter1nina seu tipo (linha 46). Nesse
código, só nos preocuparnos corn nós de elemento e de texto porque eles são os únicos tipos de
nós que existem no arquivo. Se o nó atual for um ele1nento e não for o nó appSettings (o
nó-raiz), o código adicionará um novo ite1n a HashTab 1e (linha 49) e salvará o non1e desse itern
recém-adicionado na variável string. O próximo método Read deve retornar o nó de texto asso-
Introdução à XML
ciado ao elemento, e isso servirá para adicionar o valor ao últi1no itetn inserido em HashTab l e.
No final da rotina, HashTab l e deve conter todas as configurações armazenadas no arquivo.
Agora você pode adicionar essa classe a outros projetos, ou a uma biblioteca de classes de sua
autoria e convertê-la em u1na DLL. Quando ter1ninar, será possível usar a classe co1no 1nostra a
Listagem 20.4 para configurar seu apl icativo.
1 566 Dia 20
ANÁLISE Para ler as configurações e atribuí-las ao aplicativo atual, primeiro inicialize o objeto
Sett i ngs (linha 5). Letn bre-se de que ele carrega as configurações nesse 1no1nento.
Etn seguida, leia cada configuração e atribua-as à propriedade desejada do formulário, a utn con-
trole dele ou use-as quando necessário (linhas 6 a 12).
Gravando XML
Exatamente con10 quando le1nos a XML, é possível criá-la apenas usando strings. Tsto é, você
pode gerar um código XML adicionado as tags apropriadas de abertura e fechatnento do ele1nen-
to a un1a variável string. No entanto, será muito mais provável que você crie um arquivo XML
corretarnente se empregar o DOM ou as classes Xml TextWri ter.
A Listagern 20.5 .mostra o código necessário para salvar as informações de configuração no objeto
Setti ngs usando Xml TextWri ter, enquanto aListagern 20.6 descreve o rnesrno código para objetos
Xml Document. Esses códigos devern ser adicionados ao objeto Setti ngs criado anterionnente.
LISTAGEM 20.5 Cri ando Definições de Configuração com Xml TextWri ter
82 Public Sub SaveWriter()
83 Dim oWriter As XmlTextWriter
84 Dim oltem As DictionaryEntry
85
86 oWriter = New XmlTextWriter(m_sFileName, Nothing)
87 oWriter . Formatting = Formatting. Indented
88 oWriter.WriteStartElement(''appSettings '')
89
90 For Each oltem ln m oltems
91 oWriter.WriteElementString(oitem.Key, o!tem . Value)
92 Next
Introdução à XML
LISTAGEM 20.5 Cri ando Definições de Configuração com Xml Text~Jri ter
(continuação)
93 oWriter.WriteEndElement()
94
95 oWriter.Flush()
96 oWriter.Close()
97
98 End Sub
ANALISE O método SaveWri ter corneça instanciando as variáveis necessárias. Uma variável
que pode parecer estranha é o objeto oItem declarado na linha 84. Os itens de HashTa-
bl e são os declarados como DictionaryEntry; po1tanto, para permitir o uso de u1n laço For
Each ... Next no processamento da tabela, precisa1nos de um desses objetos.
O código da gravação co1neça abrindo o arquivo (linha 86) e atribuindo que a fo1matação deve
ser recuada. Le1nbre-se de que isso é para beneficiar a pessoa que for ler, e não é necessário para
nenhun1 código. A seguir, o elemento inicial do nó-rai z é criado (linha 88), e todos os itens são
gravados no arquivo XML durante o laço For Each .. . Next (linhas 90 a 92). O rnétodo \~riteE-
1ementStri ng cria tanto a tag de abertura quanto a de fechamento co.1n base no notne do ite1n de
HashTabl e, assim co1no o texto contido nas tags baseado no valor desse ite1n. Para concluir, a tag
de fechamento do nó-raiz é criada (linha 93), e o código é encerrado, gravando as informações
no arquivo real.
ANÁLISE O código para edição com o DOM começa criando o nó-raiz e inserindo-o no docu-
mento. Todos os outros nós serão acrescentados ao nó appSetti ngs. Isso é feito em
um laço For Each . . . Next con10 aconteceu no método SaveWri ter. Os nós são criados (linha 109);
o texto é atribuído (110) e adicionado ao nó appSettings.
Agora que o código para salvar as configurações foi adicionado, você pode alterar o programa
que o usará para que as salve na próxima vez que o aplicativo for executado. En, geral isso é feito
no evento Cl osi ng de um formulário, como vemos na Listage1n 20.7.
ANALISE Antes que você possa salvar as configurações no arquivo, elas deve1n ser copiadas
com os valores reais. Nonnalmente, isso seria feito quando a caixa de diálogo Opti-
ons da opção Tools fosse fechada ou o aplicativo fosse encerrado. Quando todas as definições de
configurações forem copiadas, poderemos usar o 1nétodo Save\~ri ter ou SaveDOM para salvar as
configurações no arquivo. Depois de adicionar esse código, tente executar o projeto (veja a Figura
20.6). Altere o ta1nanho do formulário e mova-o para outra posição na tela. Feche o formulário,
encerrando o aplicativo, e execute-o 1nais u1na vez. O formu lário deve aparecer na 1nesma posi-
ção da tela, com o tamanho para o qual foi alterado. Fazer com que seu aplicativo saiba as posi-
ções do fonnulário dessa maneira, em geral é apreciado pelos usuários.
~Somrihlno l"llr.J E!
FIGURA 20.6
1estando a classe
Settings.
Introdução à XML 569
Resumo
.A XML é uma dessas tecnologias que podem ser examinadas e.m 1nuitos níveis. E' simples, ainda
que tenha efeitos profundos. Você pode criá-la corn um progran1a ou em um simples editor de
texto. De maneira semelhante, é possível escrever um progratna para processá-la e ao mesmo
tempo ela ainda poderá ser lida pelas pessoas. No entanto, criando ou processando-a, a XML for-
nece uma ,naneira poderosa de fortnatar informações. À parte todo o exagero, acho que ela é
uma das 1nais ilnportantes inovações e1n co1nputação, ficando atrás apenas do ASCII. Dessa 1na-
neira, é sua responsabilidade aprender pelo rnenos utn pouco do que ela pode fazer para ajudá-lo
e a seus aplicativos.
No próximo capítulo, concluiremos nosso estudo do Visual Basic .NET examinando uma nova
tnaneira de desenvolver aplicativos - os serviços Web. O aprendizado da XML será útil porque
os serviços Web a utiliza1n bastante.
P&R
P Li sobre outra maneira de processar XML. O que é SAX?
R O SAX (Sim pie API for XML) é ainda outra maneira de ler XML que se tornou popular
graças aos desenvolvedores de Java e às versões posteriores do MSXML (analisador
XML para o COM da Microsoft). Ele foi desenvolvido por David Megginson e a lista de
distribuição XML-DEV é uma maneira sitnples de ler XML. E' sernelhante a Xml Text-
Reader por não carregar o documento inteiro na memória. No entanto, quando usado, é
ern 1nuitos aspectos o oposto de Xml TextReader. Enquanto esse objeto é u1n modelo de
' recuperação', extraindo trechos da XML, o SAX é urn modelo de ' eventos' . Quando urn
processador SAX lê u1n arquivo XML, ele aciona eventos, como Begi nEl ement, EndEl e-
ment, Begi nDocument e assim por diante. Você deve criar os 1nanipuladores de eventos
nos quais estiver interessado para processar a XML.
P Ouvi falar de vários outros acrônimos relacionados à XML, como XSLT, XPath,
SOAP e outros. Onde posso encontrar mais informações sobre eles?
R l-Iá 1nuitos padrões estabelecidos e propostos para tratamento da XML - un1a quantidade
1nuito grande para que abordemos aqui. Se você estiver interessado em aprender 1nais sobre
como usar esses outros padrões, deve procurar um bom livro sobre XML (existem muitos
deles) ou encontrar um site interessante de algu1na cotnunidade na Web que forneça essas in-
forn1ações (o e11dereço http://msdn.microsoft.com/xml seria um bom ponto de partida).
P Disseram-me que algumas linguagens, como a Java e a C#, permitem que sejam
adicionados documentos a um arquivo-fonte quando ele estiver sendo escrito por
meio da conversão dos comentários em documentação. Posso fazer isso com o Visu-
al Basic .NET?
570 Dia 20
R Infelizn1ente, o Visual Basic .NET por enquanto não dá suporte a esse recurso. No entan-
to, tuna versão sÍinples de como adicioná-lo a seu aplicativo está on-line. Esse aplicativo
permite que você adicione tags <summary> a cada propriedade e classe dos métodos de
seu progra1na inserindo-as em um docun1ento XML que poderá ser utilizado co1no a base
da docu1nentação de suas classes (veja as Figuras 20.7 e 20.8).
Docu,nentação X1\1L. ç,6'd( • < • O @I ~ 1 a:-a.. <a-"' (l]._.... ~ [p· ê 111 ~ l!l % &.
•
<?xrnl vers1on•• 1.o• enc:od1n9a•utf·r ?>
- <doe->
- <.Hsêmbly>
<.name>AppSottlngs</name>
<l•,.ombty>
- <rnêmbers>
<member namo:"T:Sottlngs" />
- <member name="M:Newº>
<S.ummary>dafault constnictor</surrwn.ary>
</membeD
<momber namo::."M:Now..,.
<summal'y>comaructor that ais o set s filonomo</s.ummary>
</momber>
<member name=-'P:r-lloNomo">
<summary>Represents lhe file storing the contigtm,tion settings.</su mmarv>
</member>
- <member name=-ºP:ttoms">
csummary>Represents the coUection of settings</summary>
<1mamb<>t>
- <membor name.•"M:LoodRoador">
<summarv>Loads the contents of the scttlngs file into the HashTable using an
XnllToxtRoador</Summary>
</member.,
... <member namo=·M:Loadoor,.r>
<summary>Loods tho contonts of the settings filo into the HnshToblo using
OOM(/SUrNnarv>
I New() method
consttuctor that also sets fifename
I FileNamc property
Represonts lhe f~o stonng tho configutation setttngs.
I Itcms property
RGpresonts the colloc t.on of sottings
I LoadReacler() n1ethocl
LOads the conte.nts of the seuings fire into the Has:hTable us1n9 an XmlTexUteader
I LoadDOM() method
Loads the contents o( the sett1n9s fite tnto the HashTable u14ng DOM
I SaveWriter() method
~,'\l,IA<i, lhA rt1ntP.tH ir. ní thA ),,t,'c;,hT;ihl~ ln IM "-"ltinn~ f1IA IKtnn .-n XmlT PJCIWnfRf •
ltl""" ~ , , ·"Lbcal.........
;:,isi...., Jr:íl ~ ejJ . . !SI 0 JtJ\\a)!-... ~''""""···· l@lAo•"'"- ~-·... IOLil!ll •.,. ...
Introdução à XML 571
Workshop
O Workshop foi planejado para ajudá-lo a antecipar possíveis dúvidas, revisar o que já aprendeu
e coineçar a pensar e1n como colocar seu conheci1nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Co1no posso adicionar rapidamente um novo eletnento, incluindo as tags de abertura e de
fecl1amento e algum texto, a u1n arquivo X.M.L usando Xml TextWri ter?
2. Em que situação você optaria por usar o DOM para ler um arquivo XML em vez de em-
pregar a classe XmlTextReader?
3. O que é n1etadado?
Exercícios
O código mostrado nesta lição, que testa a classe Setti ngs, no momento define o uso do método
LoadOOM para carregar as configurações e do método SaveWri ter para salvá-las. Escreva outro
formulário de teste que salve várias configurações e permita que o usuário selecione qual dos
dois métodos empregar para salvar e recuperar.
SEMANA 3
DIA
-.. ..._
À guisa de esclarecimento, me referirei aos serviços comuns na Web em letras
NOTA minúsculas e aos Serviços Web criados no Visual Basic .NET com uma combi-
nação de maiúsculas e minúsculas.
Interagi1nos co,n u,n serviço 'nor,nal' na Web navegando em alguma página na Internet, ,
preen-
chendo um forn1ulário e enviando essas informações a qualquer outra página da Web. E fácil , e
essa simplicidade no uso contribuiu definitivamente para o cresci,nento e a popularidade da
Internet. No entanto, não há u1na maneira fácil de pegar as infonnações que você obtém e,n u1n
serviço na Web e usá-la em u1n programa. Por exe1nplo, é possível utilizar un1 serviço na Web
que procure o valor atual de urna ação na qual pode,nos estar interessados. Em geral, digitamos o
símbolo da ação, da,nos um clique em um botão e acessamos un1a página da Web que apresenta
o preço atual dela. Não raro, também obte1nos outras inforrnações, corno os preços de abertura e
fechamento, as alterações desde o últi1.n o fecha1nento e às vezes uin demonstrativo co1n as alte-
rações recentes da ação. Tudo isso é muito prático quando navegamos na Web, 1nas, se o deseja-
do fosse apenas obter o preço atual da ação e usá-lo e1n outro programa, seríamos forçados a
to1nar u1na entre duas 1nedidas:
• Fazer co,n que o usuário procure a infor,nação, preencha o fonnulário, aguarde o resulta-
do e, em seguida, digite-o e1n seu progra1na. O proble1na aqui é be1n óbvio-a maioria dos
usuários não fará isso co,n freqüência. lrnagine tentar executar essas operações co1n al-
gum valor, como o preço de ações, em que as alterações são constantes. Ou tentar persua-
dir alguém a inserir infonnações en1 u1na página da Web, dar um clique en1 u1n botão e
digitar u1n valor e1n seu progra1na co1n urna freqüência ,naior do que urna ou duas vezes
por hora.
• Fazer com que seu progratna pesquise a página da Web (em segundo plano), a analise
(leia) e extraia as informações que você quer. Isso em geral é conhecido co1no varrer uma
página da Web. O problema encontrado aqui ocorrerá se os autores da página alterarem o
layout, forçando-o a alterar seu programa para que analise o novo layout. Além disso, se
resolver alterar o site da Web que estiver usando para suas informações provavelmente
ta1nbé1n terá de reescrever o código que analisa a página da Web.
Certo, e os Serviços Web? Esses são progra,nas que fornece1n algu1n serviço na Internet, mas
são projetados para pennitir que outros progra,nas se co,nuniq uem co1n eles, e,n vez de precisar
que pessoas faça1n isso. Portanto, agora, algué1n poderia criar um Serviço Web que per,nitisse a
outros programas recuperar preços de ações, executar pesquisas e assim por diante. Um recurso
adequado dos Serviços Web é que pode1n ser escritos en1 qualquer siste,na operacional e lingua-
gen1 de programação. Eles usa1n u1n formato de mensage1n que pode ser lido e criado facilmente.
O Visual Basic .NET torna a criação desses Serviços Web tão fácil quanto gerar qualquer outro
tipo de aplicativo. Os detalhes da criação e leitura da mensagem têm sua visualização bloqueada
pelo próprio Visual Basic .NET. De rnaneirasen1elhante, o Visual Basic .NET faz com que o uso
dos Serviços Web seja tão si,nples quanto cha1nar algu,n outro objeto, porém ele poderia estar na
Criando Serviços Web com o Visua l Basic .NET 575
Internet e até ter sido escrito em outra linguage1n de progran1ação ou executado e1n u1n sistema
operacional diferente.
Os Serviços Web não só pennitem que dois programas se comuniquem pela Internet, 1nas tam-
bém que u1n programa reúna informações de vários Serviços Web e,n um único aplicativo, au-
tnentando potencialn1ente o valor dos dados. Por exe1nplo, u1n aplicativo que 1nanipulasse ações
poderia não só exibir o valor atual de várias ações diferentes (possivehnente recuperadas de di-
versos Serviços Web que lidassetn com ações), como também incluir as reco1nendações atuais
de analistas com base nas ações exibidas, e1npresas semelhantes, notícias sobre a empresa e as-
sin1 por diante, tudo recuperado de vários Serviços Web diferentes.
Os Serviços Web se co1nunicam uns co1n. os outros e co1n os clientes por n1eio dos protoco-
los-padrão da Internet. Eles podern e1npregar o protocolo co1nt11n HTTP, o rnes1no que os nave-
gadores utiliza1n. Nesse caso, eles usam os comandos GET e POST que os navegadores da Web
empregam. Como alternativa, um Serviço Web pode utilizar o SOAP para se comunicar com um
cliente ou outro serviço. Usar o SOAP pennite que a co1nunicação seja n1ais sofisticada porque
ele deixa que objetos sejam transferidos entre dois aplicativos, e o 1-ITTP não.
O Protocolo
Embora os detalhes reais do protocolo SOAP estejam ocultos no .NET Framework, você pode
ficar curioso para descobrir o que acontece e1n segundo plano. Portanto, exa1ninemos qual a apa-
rência de u1na rnensage1n SOAP e co1no ela pode ser usada para enviar un1 objeto pela rede.
1576 Dia 21
A mensagen, SOAP nada 1nais é do que tuna mensagem XML que usa um formato específico, ou
esquenta. O esquen1a define a estrutura geral da mensagetn (veja Dia 20, "Introdução à XML",
para obter 111ais detalhes sobre os esquen1as). Esse fo11nato pern1ite a inserção de uma grande
quantidade de infor,nações na 1nensage1n, incluindo objetos e dados adicionais sobre co1no cada
lado da comunicação deve interpretá-la. Por exemplo, a mensage1n pode conter informações so-
bre segurança, por n1eio da identificação do usuário que fez a solicitação. A Listagem 21.1 n1os-
tra uma solicitação SOAP sitnples.
6 soap: ody
7 Add xmlns ''http: tempuri.org II
8 X int
9 int
10 Add
11 soap: ody
12 soap:Envelope
ANÁLISE Nessa mensagem há três seções principais. A primeira (nas linhas 2 a 5) é a tag Enve-
1ope. Esse é o elemento-raiz da 1nensagem SOAP. Os espaços de nome incluídos de-
fine.m a estrutura da 1nensage1n, o tipo de codificação e a utilização de esquemas XML.
A segunda seção ocorre na linha 6, co1n a declaração do corpo (Body) da mensagen1, que contén1
a solicitação real. Essa solicitação, que é a terceira seção, é definida nas linhas 7 a 10. Nesse
caso, é uma solicitação Add, com dois valores, x e y .
A WSDL depende de outro padrão, os esquemas XML, que, con10 você aprendeu no Dia 20, de-
fine,n a estrutura das mensagens XML. Ela usa os esque1nas para definir as duas 1nensagens que
compõem a con1unicação típica do Serviço Web, a solicitação e a resposta. Os esquemas para a
sol icitação e a resposta são uma parte do arquivo WSDL. Outra parte desse arquivo descreve o
fato de duas estruturas estarem relacionadas. Para concluir, o arquivo WSDL identifica o destino
ao qual o cliente deve enviar a mensage1n SOAP a fim de que ela possa ser processada. A Lista-
ge1n 2 1.2 1nostra u1n exemplo de contrato WSDL.
38: </message>
39: <message name="Add2IntsSoapOut">
40: <part name='1 parameters 1' element=''sO:Add2IntsResponse'' />
41: </message>
42: <message name="Add2IntsHttpGetln">
43: <part name="X" type="s:stri ng" />
44: <part name='1 Y11 type= 1's:string'1 />
45: </message>
46: <portType name=" Servi celSoap">
47: <operation name= 1'Add2Ints'1>
48: <input message=''s0:Add2IntsSoapln 1' />
49: <output message= 'sO:Add2 IntsSoap0ut'' />
1
50: </operation>
51: </portType>
52: <binding name='1ServicelSoap 11 type= 11 sO:ServicelSoap 11 >
53: <soap:binding transport=''http://schemas.xmlsoap.org/soap/http' 1
63: </output>
64: </operation>
65: </binding>
66: <service name=1'Servicel''>
67: <port name= 11 ServicelSoap 11 binding=''sO:ServicelSoap 11 >
68: <soap:address
69: l ocation=''http://local host/Add2Ints/Servicel.asmx 1' />
70: </port>
71: </service>
72: </definitions>
Criando Serviços Web com o Visua l Basic .NET 579
Discovery
Depois de definir u1na mensage1n e tuna maneira de descrevê-la, o próxi1no recurso que as pes-
soas esperarão obter é podere1n encontrar o Serviço Web. De certo 1nodo, isso é se1nelhante a ter
um número de telefone ou fax em um cartão de visitas. Pela inclusão dos números no cartão, es-
ta1nos anunciando essencialmente o fato de que há u1n Serviço Web com o qual se comunicar
usando essas ferramentas. Para o SOAP e os Serviços Web, esse cartão de visitas é o Discovery,
ou DISCO na abreviatura. O DISCO, além de ser un1 esti lo de música dos anos 70, é un1 fonnato
XML (poderia ser algo mais?) que descreve os serviços que têm suporte de u1n servidor. Outros
computadores poden1 empregar esse arquivo DISCO para descobrir os recursos de tnna máquina
específica. O arquivo DISCO é en1 geral colocado no diretório-raiz de u1n site da Web, penn itin-
do que os clientes o encontrem co1n facilidade.
O Visual Basic .NET dá suporte a dois tipos de arquivos DISCO. O pri1neiro é editado 1nanu-
ahnente, co1no o da Listagem 21.3. Esse arquivo lista cada serviço que tem supo11e. Você pode criar
com facilidade u1n desses arquivos adicionando um novo arquivo Disco a um projeto e inserindo
manuahnente os serviços desejados co1no ven1os na listage1n.
ANÁLISE Cada arqu ivo DISCO é co1nposto de vários contratos. Cada contrato (ou contract-
Rej) identifica um arquivo WSDL que descreve tm1 Serviço Web. Para cada serviço
Web listado, há três atributos i1nportantes:
renciá-lo do arquivo DISCO 1nanual, ele apresenta a extensão vsdisco. Esse arquivo pesquisa to-
dos os diretórios do servidor Web, e localiza todos os Serviços Web expostos. E1n seguida,
retorna essa lista (e1n for1nato DISCO sitnples) para o cliente. Esse tipo de arquivo DISCO é
conveniente porque torna desnecessária qualquer alteração para que se adicione un, novo Servi-
ço Web. Ele será encontrado de modo automático pelo arquivo DISCO dinfunico. Você pode
preferir não usar esse tipo de arquivo DISCO se quiser controlar mais rigida1nente os serviços
que disponibilizar. A Listage1n 21 .4 1nostra o exe1nplo de um arquivo D.LSCO dinâmico.
1 xml version 11 1. 0 11
2 dynami cDiscovery xmlns 11 urn :schemas- dynamicdiscovery: DI SC .2000-03-17 11
3 exclude path 11 vti cnf 11
4 exclude path 11 vti pvt 11
5 exclude path 11 vti 109 11
6 exclude path II vti scr i pt 11
7 exclude path 11 vt i t xt 11
8 exclude path II eb References 11
9 dynami cDiscovery
ANÁLISE A manutenção dessa fonna de arquivo DISCO é muito 1nais fácil do que a do arquivo
de busca simples. Em vez de identificar todos os Serviços Web (ou os arquivos
WSDL) que têm supoite, ele lista os locais onde não se deve procurar arquivos WSDL. Cada linha
<exc l ude path=11
/> listada identifica um diretório que não deve ser pesquisado. Esse tipo de arqui-
11
vo DISCO é um pouco mais lento que o 01anual porque precisa que o mecanis1no de busca pesquise
todos os subdiretórios, em vez de apenas verificar os listados na instrução <excl ude path= /> .
11 11
Agora que você tem tudo preparado (ou pelo n1enos conhece os protocolos que usará), pode uti-
lizar o Visual Basic .NET para criar tun Serviço Web.
--:
New Proled E3
FIGURA 21 .1
ftlrdotet: [if.§!
Criando um Projeto de
""'""""--
-
..:.
Serviço l,f/eb. ~ VISUMCI Pl'O,OCU
aQs_and _ _,
sa
VISwil e++ Pto,eru,
"'ºJo<U
O<!,;,
a """"- -
--~
~-lcn
~
~ ~
da.ss l.ba,y
ti?
CortrC,,U;raoy
~
-
jAo-OJe<t fo,~Wtb~touse frOMothc, ~ioroS
"""'' 1- ....,l
Ar.o~cotlcn
-
A.9 ).flfT Wff> ASPJ,ETWeb WtbCotttd
lbo,y
..:.J
Para saber o que está envolvido e1n sua criação e utilização, você gerará u1u Serviço Web bem
básico-um serviço '1nate1nático'. Esse é um exemplo sin1ples de um Serviço Web. Embora seja
utn serviço básico, ele detnonstra bem como é seu funcionatnento. Qualquer funcionalidade
mais complexa não será muito diferente. A lógica existente na criação de um Serviço Web é
sen1pre a 1nes1na.
Criando o Projeto
Quando estiver no a1nbiente de desenvolvi1nento, selecione Ne~1 Project e ASP.NET Web Ser-
vice. Chame o novo Serviço Web de MathService.
Após sua criação, o projeto apresentará vários arquivos.
• Web. Confi g Este é o arquivo usado pelo processador ASP.NET para sua configuração.
Ele pode ser empregado na alteração das configurações do diretório virtual utilizado para
esse Serviço Web. Por exe1nplo, você poderia ativar Traci ng, o que permitiria u1na 1ne-
lhor monitoração da utilização. O exemplo não alteraria este arquivo.
• Gl obal . asax Este é o arquivo usado pelo processador ASP.NET para o a1mazenamento
de manipuladores de eventos. Você pode empregar este arquivo na criação de códigos
que serão executados quando eventos i1npo1tantes ocorrerem durante a existência do apli-
cativo Web. O exe1nplo não alteraria este arquivo.
• MathService . vsdisco Este é o arquivo de busca do Serviço Web. Ele pern1ite que o
cliente encontre os serviços Web expostos nesse diretório virtual. O arquivo DI SCO cria-
do no projeto é de busca dinân1 ica, portanto, você não precisa fazer nenhu1na alteração
. .
para expor mais serviços.
• Servi cel . asmx Este é o arquivo que você editará para criar a funcionalidade do Serviço
Web.
A Listage1n 21.5 mostra o código do arquivo Serv i cel . asmx.
582 Dia 21
1 Imports System.Web.Services
2
3 Public Class Servicel
4 Inherits System.Web.Services.WebService
5
6 #Region II
Web Services Designer Generated Code II
7
8 Public Sub New()
9 MyBase.New()
10
11 ' Esta chamada é necessária para o gerador de Serviços Web.
12 InitializeComponent()
13
14 'Adicione seu próprio código de inicialização depois da chamada
'InitializeComponent()
15
16 End Sub
17
18 'Necessária para o gerador de Serviços Web
19 Private components As System.ComponentModel .Container
20
21 ' OBSERVAÇÃO:O procedimento a seguir é necessário para o gerador de Serviços \~eb
22 'Ele pode ser alterado com o uso do gerador de Serviços Web.
23 'Não o altere usando o editor de códigos.
24 <System.Oiagnostics.OebuggerStepThrough()>Private Sub InitializeComponent()
25 components = New System.ComponentModel.Container()
26 End Sub
27
28 Protected Overl oads Overrides Sub Oispose(ByVa l disposing As Boolean)
29 'COOEGEN: Este procedimento é necessário para o gerador de Serviços Web
30 'Não o altere usando o editor de códigos.
31 End Sub
32
33 #End Region
34
35 ' EXEMPLO OE SERVIÇO WEB
36 ' O serviço HelloWorl d() do exemplo retorna a string Hel lo World.
37 ' Para compilá-lo, elimine os caracteres de comentário das li nhas a seguir,
' salve e compile o projeto.
38 ' Para testar este serviço da Web, certifique-se de que o arquivo .asmx é a
' página inicial
39 ' e pressione F5.
40
41 '<WebMethod()>Publ ic Function HelloWorl d() As String
Criando Serviços Web com o Visua l Basic .NET 583
ANÁLISE O módulo do Serviço Web começa con10 a ,naioria dos arquivos do Visual Basic
.NET, com os espaços de norne incluídos. O espaço de no1ne mais i111portante exis-
tente nesse caso é System. Web. Services. Ele contém as rotinas essenciais que adicionan1 a funcio-
nalidade do Serviço Web.
Observe na linha 4 que a classe herda características de Sys tem . 11eb. Services. Web Service. Isso
fornece várias propriedades a seu Serviço Web, con10 pode ser visto na Tabela 21 . l . A rnaioria
penn ite que ele acesse o interior do ASP.NET. Entre essas estão as propriedades Request, Res-
ponse, Session e Application.
Propriedade Descrição
O código das linhas 6 a 33 da Listage,n 21.5 foi inserido em urna área #Regi on. Esse código na
verdade é n1inimizado no ambiente de desenvolvimento (veja a Figura 21 .2). Essa é uma técnica
útil, nova no Visual Basic .NET, que lhe pennite tornar seu código 111enos co1nplexo ocultando
os detalhes que possam não ser relevantes. Nesse caso, ela oculta o código usado pelo próprio
IDE. Esse é o código que pennite arrastar e soltar itens na superfície visível. E1n geral, ele não
deve ser alterado ,nanualmente, portanto faz sentido ocultá-lo no editor.
584 Dia 21
FIGURA 21.2 filo tdt l/)ew !l'Oje(t ~ l!<bu, I.oolJ llO'ld>w ti,11)
•
O Serviço 11'eb no !~ · '\l:l ·~ lil§ l t ~ e. ,, : ,.. · ~· C.I • Oobuo
-- 1 •
~•
t
~~~~~~~Ser,
!!' ·~·::::~:!=======:::-::======================~~~
k:::.:·~........
l j• ;tSttVkel (MathSeMCe)
llliport• Sya teD. Ut~ -Se~v1c ea
.:] jll\(Deda,-....)
[nd Cl uo
•
•
• •
1 "''
O código das linhas 41 a 43 é um exemplo de como você adicionaria um novo 1nétodo a esse Ser-
viço Web. Observe que ele fica desativado por padrão. Se quiser expor esse 1nétodo, apenas re-
inova os caracteres de co,nentário.
Adicionando o Código
Agora que você possui u1n Serviço Web básico, precisa adicionar o código que executará as tare-
fas dele. Isso é feito em um Serviço Web pela inserção de métodos públicos em sua classe. Tam-
bém podería1nos adicionar propriedades públicas, poré1n teria um significado 1nenos relevante
(co1no vere1nos posteriormente). Os 1nétodos públicos de um Serviço Web são os mesmos de
qualquer outra classe, com 1nais llln item, o atributo <WebMethod ( )> .
A inclusão e1n u1n método co1num é indicada por <WebMethod ( ) > na declaração normal. Esse é o
exemplo de um atributo, um elernento .NET que adiciona u1n novo co1nporta1nento a u1na elas-
Criando Serviços Web com o Visual Basic .NET 585
se, método ou propriedade. Na sintaxe do exemplo, o atributo adiciona o Serviço Web para que
estabeleça a co,nunicação com um ,nétodo específico por meio do SOAP. Qualquer método
1narcado com esse atributo será exposto publicamente como parte do Serviço Web.
No exe,nplo a seguir, adicionei apenas um 1nétodo sin1ples ao Serviço Web, incluindo o código
da Listage,n 21 .6 no projeto do Serviço Web, depois do 1nétodo do exemplo. Co,no alternativa,
você pode excluir o comentário e substituí-lo por esse 1nétodo.
Esse método apenas soma dois nún1eros, retornando o total. E1nbora você possa desconsiderá-lo
por ser muito básico, ele possui tudo que em geral é comu1n em todos os Serviços Web:
• Contém o atributo <WebMethod> na declaração
• Retorna um valor
Você poderia adicionar n1ais 1nétodos, ou n1étodos mais complexos, neste mon1ento. No entan-
to, isso não é necessário. Escreveremos um Serviço Web 1nais realista ainda nesta lição.
FIGURA 21 .3
Página de teste do . r!.!>,·........... _-_-_:.:·_ ..
Serviço r,Veb. t ~ JS. .
• • , Orowsc: • Sc:rvtcel Web Scmcc: o
a
Service!
lhe lollow1n.9 opcrotions ore supportcd. for o formbl dcfin~on, plusc rovicw thc ~rrvlcr 011'-.rripllon,
• li.!!,!
• ...,
Se você selecionar u,n dos métodos, como o método Add recém-criado, deve ver outra página de
teste que possui um fonnulário que pennite que sejatn inseridos valores de teste no Serviço Web
(veja a Figura 21.4). Alé1n disso, ela exibe um exe1nplo das mensagens SOAP de sol icitação e
resposta desse n1étodo.
·~. MathService - Miuoson VIS-Uai B.aslc.NET [dniQn) - Bro-e - Servlcel Wd, SerYi[e 1!110 Ei
FIGURA 21.4 tio td.t ~ ~wo IodS - t!<II>
Inserindo valores na L:5:1 • m· lá' lil
í.;, .. o -ij)
yp,, -
o I i ""@[·, : ,., · '1> · a 1 : -.. !.!>
~ ~.
»
página de teste.
Gl •'Ili Gl làl ...., , ~... - , s ............ . , ..
--~""""":~~-:-:~-,-~ ..... ~~~~~~~~
Add
Te.st
To t.Hl, diek lhe ' Invoke' button.
Poramete.r Volue
X:
J
Y:
i
lnvokc I "
S OAll
lhe follo.wino is a sa.rnol~ SOAP reciuest and resoonse. The placeholders shown need to b* re.placed wrth a ttual
values.
Essa página de teste será gerada automaticamente quando você visualizar um arquivo ASMX.
Ela fornecerá inforn1ações sobre os rnétodos que o Serviço Web disponibiliza. Além disso, cria
um formulário de teste para cada 1nétodo, permitindo que alguns valores sejam inseridos e a fun-
ção executada. Digite alguns valores nos campos de texto da seção do método Add e dê um clique
no botão lnvoke. Outra janela do navegador deve ser aberta 1nostrando o total, con10 na Figura
21 .5.
•
co,11 o Serviço /Veb.
1
1.. .. 0 @:) G:\ ' ~ l
(B làJ l(tp:/ ~M.O,s.,,.tce/5',vlt;I ,... • l +t l'
t .J J/, •
Í5 1 1!!!I li! ! !I! htip:/ /lo<olt.'..JAddPX: 12"Y: .. j
fi <?xmt vetsion=• 1.o• l!ncoding=•utf-8" ?>
<int xm ...•http:/ /tompuri.orgr>;l6</tnt>
;
.
f
f
Novo TERMO
Sob u1n ponto de vista genérico, o proxy é um substituto ou representante autorizado.
É um intermediário. Para os Serviços Web, um proxy é um pequeno co1nponente no
lado do cliente que se parece co1n o Serviço Web para o progra,na cliente. Quando o programa
cliente faz un1a chamada no proxy, ele gera a solicitação SOAP apropriada para o Serviço Web e a
trans1nite. Quando o Serviço Web reage co1n uma reposta SOAP, ele a converte nova1nente para o
valor de retorno esperado pela função e envia isso para o cliente. A Figura 21.6 n1ostra esse pro-
cesso.
588 Dia 21
Cliente Servidor
FIGURA 21 .6
Fluxo de inf'orrnações
entre o cliente, o JJroxy
e o Serviço Hleb. • Test Math Service l!~E3
1123 1
1456 c""'::à."'"ii<J....
, 1
... J
::_.....
579
1. O cliente
5. O proxy converte I
chama
a resposta SOAP
o método
para o cliente
no proxy '
1
3. O Serviço Web
2. O proxy gera executa a solicitação
a solicitção SOAP
Criando o Projeto
E1nbora você pudesse gerar u1n cliente usando u1n formulário Windows ou Web (até mesmo ou-
tra biblioteca ou Serviço Web), nesta seção, exa1ninare1nos a criação de u,n Serviço Web cliente
por meio de um fonnu lário Windows. Esse será o exemplo de um dos usos possíveis para os Ser-
viços Web, em que ele representará u,n meio de estender os clientes já existentes (ou futuros) de
um 1nicrocomputador, co1no o Microsoft Office. Criar u1n cliente usando os formulários Web é
sen1elhante.
Crie o projeto de t11n novo aplicativo Windows e chame-o de MathCl ient. Você pode optar por
criá-lo na n1esn1a solução de MathService para manter os dois juntos, en1bora isso não seja ne-
cessário. Selecione File, New e Project. Na caixa de diálogo New Project, selecione Windows
Application e digite MathCl i ent no ca,npo do nome. Ce,tifique-se de que Add to Solution esteja
selecionado e, etn seguida, dê u1n clique em OK. O Visual Basic .NET deve criar un1 projeto
com apenas u1n for1nulário. Antes de prosseguir, feche o gerador de formulários e reno1neie o ar-
quivo Forml. vb como frmTest . vb. A seguir, abra o formulário no 1nodo de exibição do código e
altere todas as referências de Forml para frmTest . Depois, dê un1 clique com o botão direito do
mouse no projeto MathClient e selecione Prope1ties. Na página General, altere o Startup Object
para frmTest e selecione OK. Para concluir, dê LUn clique novamente com o botão direito do
mouse no projeto MathClient e selecione Setas Startup Project. lsso assegurará que esse projeto
seja o primeiro a ser executado quando a solução for iniciada.
Criando Serviços Web com o Visua l Basic .NET 589
Adicionando o Código
Quando chamatnos outro objeto no Visual Basic .NET, e.m geral temos de carregar uma referên-
cia a ele. Isso pennite que o TDE conheça as várias propriedades e métodos do objeto. No entan-
to, você não pode fazer isso com um Serviço Web, porque ele não possui todas as informações
expostas de tnn objeto local. Em vez disso, é preciso carregar uma referência da Web, que é um
ponteiro para u,n arquivo WSDL. Le1n bre-se de que esse arquivo descreve todos os métodos de
um Serviço Web e seus parâ1netros.
Adicionar u1na referência da Web é fácil: dê u,n clique com o botão direito do 1nouse no projeto
MathClient e selecione Add Web Reference. Você deve ver a caixa de diálogo da Figura 21.7.
FIGURA 21.7
Adicionando tuna
1:1< Add Wr-b Rt"ÍN"NlCt"
1$ .. -+ O lfl &!<>...,
c=:============n- EJ
X
lii! - - - - - - - - - - - - ~ - -
referência da TYeb. "'" j
""r·
lht!MdWCO~rl,.,(n(•t;.c ,..l!r~'lt~to1ocdo"'*- wtt»~
~ut.ether:lnyoir~- n~Web~~4.~,,;)(ll~
... Ai.W.rc,fcrtfQJ!
o.,m.,, Web~ arelsted ntt'<e,.'T'~Pet'Et&N:es ~ Toft-dWeb
~,:e-,, 'fOII c.w, trowsoto o Web S,,,W, dr,,Ol'O,n PIJ'1' (,.,-.m:
"' li
Q.
e, .wsdl, • ~,.;ov,,y"' ( Gs<o u ,v\.lheo) oi 10 &.. Htvk" d,,r,:10,
r#p,J k,tcd t:ic.;,w.
2
wdi Scrv1Cc: Olrcctortu:
.~ 11
.- lffij~jl(_
Mav~lCOI ~ ectc,cy
-...
~y lhe t.C<>I ~ ,l'le'S$ Rec;t:st,y lO fi'ld ~ i o , $ llnd pOO.ldb'\ Web
:.:J
Item(s) Sêwed
A caixa de diálogo solicita o URL para um arquivo DISCO ou para o local da WSDL do Serviço
Web. Normalmente, eles seriam fornecidos pelo autor do serviço. No caso de MathService, o
URL deve ser: http: //1 oca 1host/MathServi ce/MathServi ce. vsdi sco. Digite esse URL e dê um
clique na seta de busca. Se funcionar da maneira ideal, depois de u1na pausa, ele deve encontrar o
Serviço Web, como mostra a Figura 21.8.
Depois de encontrada a referência da Web, dê tun clique no botão Add Web Reference. Isso adi-
cionará u1na nova seção ao projeto (Web References), que deve ter três arquivos na seção Loca-
lhost: Servicel.wsdl, MathService . vsdisco e Reference.Map. O co,npilador usará esses
arquivos no tempo de co1npilação para adicionar u1n proxy ao programa cl iente, que saiba co1no
se comunicar com o Serviço Web.
590 Dia 21
Agora que seu programa cliente sabe como se comunicar co1n o Serviço Web, você pode adicio-
nar o código para chamar o serviço. Para tanto, adicione duas caixas de texto, um título e um bo-
tão ao for1nulário. Configure as propriedades como na Tabela 21.2.
- tl X
FIGURA 21.8
Localizando a
referência da fVeb.
<?xml vers,on;:•1.0• ancod1ng::•utf·e· ?>
• <d1scovery WebServk:e-1
xinln,,='http://~cl1cmas.)(nllsoap.org/ dlscor> SI t<lp,/1_...h"""""""'•,.....-
<contr11ctRef
rof••http://locc,lhost/ Moth8orv1co/Sorvlco 1.0~
wsdl•
docRef="http://localhos-t/MathSorvlce/Servlco
,i-(1'1 n a'hllp://o;chomoo;.,unl1oon1>.0r{l/tJlsco/o;cJ
~ (c:tit,ec,.
Yl(!W DOCU'Dd'tllt#'I
1
</dtscovery>
Por fim , você está pronto para adicionar o código da Listagem 21.7, que chamará o Se1viço Web.
Dê um clique com o botão direito do 1nouse no botão Add para adicionar este código.
ANÁLISE Algo que deve ficar im.ediatamente óbvio é que o código é muito semelhante ao usa-
do para o acesso a objetos comuns. A ún ica diferença entre o código das linhas 5 e 6 e
o ,nesmo código que acessa u1n objeto local é que o nome co,npleto do objeto te,n co1no base o
servidor que fornece o Serviço Web, nesse caso, local host . Service1. Um ite1n importante a ob-
servar é que o no1ne do Serviço Web será alterado co1n base no host do serviço.
O programa resultante deve poder encontrar e cha,nar o Serviço Web, estando ele na mesma1ná-
quina, como mostrei aqui, ou procurar pela l nter11et. A Figura 21.9 1nostra o resultado.
• 0 X
FIGURA 21.9
Usando o cliente para
cha,nar o Serviço lf'eb. Add
E1nbora esse serviço que foi adicionado pareça simples (e é), como declarei anterior,nente, ele
apresenta toda a lógica de criação e uso de u1n Serviço Web:
592 Dia 21
• Cria um projeto para o Serviço Web (ou adiciona o Serviço Web em u,n projeto Web
existente)
• Adiciona um ou 1nais 1nétodos públicos com o atributo <WebMethod ( )>
• Adiciona uma referência Web a um aplicativo cliente, que aponte para o WSDL do Servi-
ço Web
• Cria uma nova variável que aponte para o Serviço Web e executa u,n ou mais de seus 1né-
todos.
Criando o Serviço
Como no serviço sitnples, você começará criando o Serviço Web. No Visual Basic .NET crie um
projeto de Serviços Web. Esse poderá ser cha1nado de Northwind. A Figura 21 .1O1nostraacaixa
de diálogo New Project.
New Projecl E!
FIGURA 21 .10
Criando o Serviço Tffeb
Northl11ind. ti---
ºQ v•wlC•e++
Setcl><nd--
Yisual
"ojo<U
Project.$
o---
-o
Cll o 00... "'°""'
A!P.l•,Et Wfob ASPJEtWMI WtbConttd
kolicatlon Serw:e ltifary ..:J
ÇJPfo;cd for ae.,thg Wtb ~ C ' j tOUJC h«l'I otho, ~
Feche o gerador e altere o no1ne do arquivo Servi cel . asmx para Products .asmx. Abra o arquivo
Products. asmx no modo de exibição do código e altere a linha
Public Class Servicel
para
Public Class ProductManager
A seguir, você adicionará os três métodos. O primeiro retornará utn an·ay contendo todas as cate-
gorias. O segundo retornará utn DataSet contendo todas as infonnações sobre os produtos de
urna categoria específica e o terceiro inserirá novos dados na tabela Categories. A Listagem 21 .8
mostra esses três métodos. Para obter n1ais infonnações sobre o código de acesso a dados desses
métodos, veja o Dia 12, "Acessando Dados com a Plataforma .NET". Adicione esse código após
a região marcada co1no ' Web Services Designer Generated Code' , porétn antes da linha End
CJass. AJé1n disso, será preciso adicionar duas instruções Imports, tun.a para in1portar o espaço
de non1e Sys tem. Data e a outra para importar Sys tem. Data. Sq l Cl i ent. Insira essas duas instru-
ções logo após a linha Imports System.l~eb.Services .
36 Return ods
37 End Function
38
39 ebMethod
40 Public Function InsertCategory
41 yVal categoryName As String
42 yVal description As String As oolean
43 Dim oCon As Ne SqlConnection DSN
44 Dim sSQL As String
45 sSQL ''INSERI INT Categories''
46 CategoryName Description
II II
47 11
VAL ES categoryName
II II li
ANÁLISE O primeiro dos três métodos, GetCa tegori es, retorna u,n array de strings contendo
os no1nes de cada categoria de produtos. Ele poderia ter retornado um Da taSet com a
mesma facilidade (na verdade, teria sido ,nais fác il), no entanto, fizemos assim para tnostrar que
arrays também pode,n ser retornados.
A string de conexão que será usada para o acesso ao banco de dados foi criada co1no luna cons-
tante nas linhas 1 e 2. Isso terá de ser alterado se seu banco de dados estiver arn1azenado e1n outro
local ou se fore1n necessárias credenciais específicas para a conexão co,n ele. Os objetos apro-
priados para o acesso aos dados foratn criados nas linhas 5a 11. Aqui empregamos os métodos
de acesso ao banco de dados SQL. Portanto, será necessário incluir o espaço de nome
Cria ndo Serv iços Web com o Visua l Basic .NET 595
System. Data . Sql Cl i ent nesse arquivo. Alé1n disso, se você for acessar un1 banco de dados que
não seja SQL, deve utilizar os objetos de conexão do ADO, que estão ar1nazenados no espaço de
no1ne System. Data. 01 eDb. Observe que recuperamo os apenas u1na coluna da tabela Categori es
(linha 7).
A linha 13 recupera os dados e preenche o DataSet. As linhas 14 a 17 extrae1n as infonnações do
DataSet para usá-las no preenchi1nento do array. Por fi1n, o array é retornado para a função da
chamada na linha 18.
O segundo 1nétodo, GetProducts, é mais simples do que o primeiro. Nele, é retornado um Data-
Set preenchido com todos os produtos ainda válidos da categoria solicitada. A parte n1ais co1n-
plexa do método é o código das linhas 26 a 31, e1n que a instrução SQL é criada para recuperar a
lista. O ideal seria que isso fosse 1nantido como u1na visualização ou um procedi1nento annaze-
nado no banco de dados. A string final teria a aparência descrita a seguir:
SELECT ProductID, ProductName, UnitPrice, -.
QuantityPerUnit, Discontinued, CategoryName i..
FROM Categories INNER JOIN Products -.
ON Categories . CategoryID = Products . Catego ryID -.
WHERE (Discont inued = O)AND (CategoryName LI KE 'Bev%'
A instrução SQL resultante retornaria todos os catnpos solicitados em que o produto ainda fosse
válido e o nome da categoria co1neçasse com Bev.
O último n1étodo, InsertCategory, de1nonstra que você ta1nbén1 pode solicitar que o Serviço
Web faça algo diferente de u1na recuperação. Nesse caso, será inserida u1na nova categoria no
banco de dados.
Co1neçainos de 1naneira se1nelhante aos dois 1nétodos anteriores, pela criação de tnna conexão
com o banco de dados e escrevendo a instrução SQL. Nesse caso, a instrução final criada nas li-
nhas 45 a 48 se parecerá co1n a demonstrada a seguir:
INSERT INTO Categories(CategoryName, Descript i on) -.
VALUES (' Algum produto ' , 'Outro produto que estamos vendendo ' )
U1na diferença nesse método é que e1n vez de criar u1n adaptador Sql DataAdapter, você gera u1n
con1ando Sq l Command. Os con1andos Sq l Commad, como aprendemos no Dia 12, são n1ais adequa-
dos para inserir, excluir e alterar dados, do que para recuperá-los. Outro ponto que vale a pena
ressaltar é o bloco Try . . . Catch das linhas 50 a 56. Nesse caso, tenta1nos executar a instrução
SQL. Se ela for be1n-sucedida, o 1nétodo retornará True. Se uma exceção ocorrer, por alguma ra-
zão, ele retornará Fa l se. Nonnahnente, não ocorreria uma exceção nesse método, a menos que o
banco de dados não estivesse em execução ou se não houvesse espaço em disco.
596 Dia 21
"
l!i- t!<t> •
iool,
•
. , • ' ••• q • """"
G) !ii:i ;,,p,1-....i,,o,-cd,ru,"""" • ' .. t
•
· l!:!'.'"º' •.
Serviço '1Veb
1\lorthl-vind.
The folowmg operetaons d te su;,ported. for e formal d.efinrtion , ple~ue rev)ew the Sery1çr Oe;uricti90·
• to,rctCPSUOO'
• GdCotcaonu
• Gçtfcodu<:U õ
FIGURA 21.12
Testando
GetCa tegori es.
I S.vcr"élc, Condimer,, Conf«•on, Da,,y Producu <lr=1ICcr,>1s Mc.:!Pollitry Prodlu:c Scaf'ood SN!!'StuB'
-•
-"•
Criando Serviços Web com o Visual Basic .NET 597
Criando o Cliente
Corno no caso anterior, agora você está pronto para criar seu Serviço Web. Dessa vez, no entanto,
criará u1n cliente co1n base nos fonnulários Web. Ele poderia ser u1n site usando urn Serviço Web
para que esse Lhe fornecesse conteúdo, porém empregando seu próprio layout. Corno alternativa,
poderíatnos representar esse cliente que usa fonnulários Web como um aplicativo de intranet.
·•. hort hwind - Mic ro,oll Yl'\LMI RMl.c~~T [ dM.ign) - hlt p:/ Jloc,tlho, t / Northww1d/Product11.<t•muc/ r.-,.1Produc1 .. ,, otr-gnry~lf' - bl!"V l!!lliJ EJ
FIGURA 21.13
Testando GetProducts.
fie r.dt l""' - ~ l!<l>uo Iods -
1$1 - ~ - ~ g i:i, i i. e.J,, : c-·- ~ · C+J ; -..,
ti<I>
rJ,'•""'' ..
º
1.. .. @) ~ : :Ili mIQI "'"''"";;,,...,,'" ' - - :- • , .. --~~~~--~-:-~~~~~~~-,,
htlp;/)localh...egoryNtme=bev
t , r~ .
<7)1:ml version="t.o• encod,ng= "utf-8'' 7>
<DataSet mtn-s•"hnp://tompvrl.or"1)r>
<xsd: sc;hema ld="Nowoot0Sc1 • targetHamospace=º m1n~ . ..:-
1<mlns: i,:sd = • htt p : / / www. w3 .o r g /20 O 1/ x:-lLS eh emn" xmin-s : msdat.c:.= •um: schem as~
m1crosort-com:><ml-m)doto">
~ <KSd:elemont namo:"NowOotoSut• msdota:11.ChnaSel:s•truoª>
</xs.d:sc.hema>
- <diffgf;diffgf am xmtns: ms.dat.1;;:•urrl:schemas-mlcrosofl • eom:xrnl-msdata•
xm!M :d1f f9 re•un1~<chomos-mkrosoft · c:am:>crttl ·dift9rom v l "> o
- <NeWOataSet mlns~·">
<p<oducts dlffgnid=..product:s 1• msdata;rowOtder:"o •>
<Produe tlO>l </PtOductIO>
<PtoduetHame>Chtsi</PfoductNarne>
i
e
:
<QuantttyPe1Uni1 > lO<IQu11n11tyPefVnit>
<01s-conhnvtd>folso<./OtScontlnutd>
<Catego:ryName:.Beverages</CategoryUame>
</products>
- <ptoducts d.frgt:1d="products2 • msdata :,oWOrd•r=:"J *>
<PrOducU0>2</Pf'OductIO>
<ProducU·Jame>Chang</PtoductName>
<Quant1tyP@f\Jn1t >19</QuanhtyPt'!f\Jnit>
<O,sconhnu•d>folso</[hscontlnuecl>
<CategoryName>Beverogos </CategoryPlime>
</p,oauets>
- <i:iroducts d1ff1:1r1d:''produds3" msdata·rowOrder:''2 ~> .:.J
Íli'JJEI "'- l
lf
FIGURA 21.14 ~
Testando
!'.lo td<
!~ · m· ~ Q
'i)llw -
oli 'll> e. 1,.., : "'· "'· ~
- lodo - tl<i>
1 ; -.., - r18·"""'' .
»
.:.J
1 1
1598 Dia 21
Inicie a criação do cliente adicionando un1 novo projeto de aplicativo Web. Esse você chan1ará
de NWCl i ent (que prové1n de cliente Northwind). Dê u1n clique com o botão direito do 1nouse no
no1ne do projeto e selecione Setas Startup Project. Feche o gerador e renomeie o arquivo Web-
Fonnl. aspx con10 Products. aspx. Para concluir, abra mais u1na vez o gerador e gere uma interfa~
ce be1n sin1ples. Fare1nos assi1n principahnente porque tenho poucas habilidades gráficas, mas
ta1nbém para limitar a quantidade de código adicional que pode co1nplicar o exemplo.
As propriedades dos controles da página estão descritas na Tabela 21.3.
Text Categories
DropDownList (ID) cboCategory
Height 22px
Width 202px
AutoPostBack True
DataGrid (ID) dbgProducts
Height 265px
Width 438px
ANÁLISE Você adicionará ao fonnu lário os controles ComboBox (DropDownL i st) e DataGri d.
Eles serão usados para exibir o resultado das cha,nadas a GetCategor i es e Get Pro-
ducts. Alén1 disso, haverá um painel contendo duas caixas de texto, um botão e un1 título. Esses
serão utilizados pelo método InsertCategory.
U1na propriedade de DropDownL i st que vale a pena ressaltar é AutoPostBack. Co1no você apren-
deu no Dia 1O, "Construindo a Interface co1n o Usuário co1n os Formulários da Web", AutoPost-
Back faz co1n que o formulário seja retornado ao servidor imediatamente, em vez de aguardar
que urn botão Submi t seja pressionado. Em nosso exemplo, o formulário será enviado se1npre
que o usuário alterar o conteúdo de DropDownl i st.
Depois de DropDownl is t, definimos o controle DataGri d. Você ta1nbé1n pode usar o recurso Au-
toFormat do gerador do DataGri d para tornar sua aparência mais adequada do que a usada no
padrão.
A Figura 21. 15 mostra qual deve ser a aparência da interface com o usuário no Visual Basic
.NET.
600 Dia 21
.. .....······························
··· .. .......... ............ .................
• • ' • • • • • + • • • • • • • • • • • • • • • ••
..-. .
:: I
::l abc
::L
abc l~c .. .. .. ... ... ... ... ..................... ..-.................
.. ... ......·,-........ .......................................................... .... .... ............................... ............. ..... ....' .....
.. ...
.. .. .
..
'. . § ;~ Ca:egor; , ' .•
. .. . . . . . . ... . . . . . . . .... . . . . . .. . . . . .. . . . ..... ....
... ............................'' ... ... ............ ...... ... ... ... ...... . .. .... ...... .................... .. ... .
=: i!i....,r
... ......... . . ... .. . ... .. .. .......
. .......·································
.......
- ~~~~~~~-,
: :: :·:::::: :::::::::: :: : : : :::::::::: :::: ..=.J
IQ Ocsl>• j e '"'"'-
@l E) °"""' .---
Adicionando o Código
Estamos quase 1.á. Tudo que precisamos fazer é conectar algulnas rotinas. Queremos que a caixa
de co1nbinação Categories seja preenchida quando o usuário exa1ninar a página pela priJneira
vez, e que a grade apresente os resultados da categoria. Alé1n disso, quere1nos que a grade seja
atualizada sempre que o usuário selecionar un1a nova categoria. Para concluir, é nossa intenção
adicionar u1na nova categoria quando o usuário der u1n clique no botão Add.
Antes que você possa adicionar o código, deve acrescentar tuna referência da Web ao Serviço
Web. Dê u1n clique co1n o botão direito do n1ouse no projeto NWClient e selecione Add Web
Reference. O arquivo DISCO criado para o Serviço Web é http: //1oca 1hos t/
northwi nd/northwi nd . vsdi sco. A Figura 2 1.16 tnostrao resultado da consulta a esse arquivo.
Etn vez de começar preenchendo a caixa de cotnbinação, inicie com a grade. Você já deci-
diu que quer atualizar a grade sempre que o conteúdo da caixa de combinação for alterado.
O evento apropriado ao qual o código deve ser adicionado é Se 1ectedlndexChanged. Dê utn
clique duplo na caixa de con1binação e atualize o n1anipulador de evento con10 vemos na Lista-
gem 21.9.
Criando Serviços Web com o Visual Basic .NET 601
- <dtScovery WebSenke:s
><m'1'ls="htlp:/ / schomas .xmlsoap .OrtJ/ disco/"> .iJ http:l/bc4hostfn« ttmiid/Products,Offflx?wsd
ccontrac;Reí
Vi!!WCort.r«t
ref=' http:/ /localhost/northwind/Products.asm ~l'f OOC\lflêntõti:n
1-·,sdl'
docllêf:' htt p:/ /locolhost/ northwlnd/Products ..
>:mlns=•http :/ / sche mn:; .><mlso~p.or g/ disco/ scl
</discovery>
•
Add 8.efefence
Quando a grade estiver sendo atualizada automaticamente, será a hora de nos preocupar1nos co1n
a caixa de combinação. Ela deve ser preenchida co1n a lista de categorias quando o usuário carre-
gar a página pela pritneira vez. O evento apropriado para fazer com que isso aconteça é Web-
Forml _ Load. A Listagein 21.10 n1ostra esse método.
602 Dia 21
ANALISE Con10 você aprendeu no Dia 10, a propriedade IsPostBack é usada para detenninar
se essa é a prin1eira vez que uma página da Web é visualizada ou se ela está retoman-
do. E1n geral, só queremos executar tarefas como preencher controles uma vez, portanto adiciona-
mos o código à seção If Not IsPostBack. No evento que carrega a página, in icialmente cria,nos
uma nova instância do Serviço Web (lin.ha 15). A seguir, cha1nan1os o método GetCat egori es (li-
nha 17), que retorna u1n array de strings.
Uma prática interessante é usada nas linhas 18 e 19 no evento que can·ega a página. Os controles
não só podetn ser conectados a DataSet s co,no tan1bé1n a Arrays (e a conjuntos). Portanto, você
pode conectar u1n array de categorias diretainente a un1a caixa de combinação.
O código da linha 20 merece algu1na explicação. Quando a caixa de co1nbinação é preenchida, o
índice selecionado não é considerado como alterado. Portanto, chamamos expl icita1nente o ma-
nipulador de evento para a caixa de co,nbinação a fim de assegurar que a grade seja preenchida
quando o usuário visitar a página pela prirneira vez.
A Figura 21 .17 mostra o resultado que obteretnos ao carregar a página da Web, enquanto afigu-
ra 21. 18 ilustra o que será exibido se 1nudarmos a categoria.
Criando Serviços Web com o Visua l Basic .NET 603
FIGURA 21.17
Visualizando o cliente
North1vind.
Namo:
.:.1
Dcs.cription· I .:J Addl
o
Labcl
.... NWCI~ - Micrmort Vku.al 61HicNT (dei.l~) - BrCl'ff«' - htlp:/ /IOC<'ll'IOU/NW(lirnt fProducl~A~K 80 E!
FIGURA 21.18
Alterando a categoria ".
selecionada.
New Ca1egoiy
Nome:
Des.cription.' 1
o
Labcl
,.
12 5
Tcl:tlo
32 .
Mas<a..,.pone
32 Fahe D,:iy Produc:u ..:J
-......
10 } GI ""'""'
Para concluir, você adicionará o código que fará o botão Add acrescentar utna nova categoria ao
banco de dados. Dê um clique duplo no botão Add para abrir a janela do código. Adicione o códi-
go da Listagem 21.11 ao procedin1ento.
604 Dia 21
A NÁLISE Felizmente, não há nada muito complexo aqui. Você criou uma nova instância do
Serviço Web e chamou o 1nétodo InsertCategory, passando o conteúdo dos dois
can1pos. Quando ele retomar ( True ou Fa 1se), o conteúdo de Labe 1 será alterado com uma mensa-
gen1 de que a operação fo i bem-sucedida ou falhou. A Figura 21 . l 9 mostra o resultado da execu-
ção desse n1étodo.
Nc:w Catcgory
Resumo
Os Serviços Web são u1na nova 1naneira de acessar programas e componentes por 1neio de Lnna
rede ou da I.nternet. Eles são útejs tanto na Web quanto em aplicativos tradicionais de 1nicrocom-
Criando Serviços Web com o Visual Basic .NET 605
P&R
P Posso proteger um Serviço Web para controlar quem tem permissão para aces-
sá-lo?
R Sim, os Serviços Web dão suporte integral ao uso do flTTPS (e do SSL) para o controle
de acesso.
P Os Serviços Web só são adequados para soluções que usem os produtos da Microsoft?
R Não, os Serviços Web podem ser usados para a co,nunicação com qualquer sistema ope-
racional. Contanto que o cliente seja capaz de interpretar a solicitação SOAP (e criar u,na
resposta SOAP), ele poderá ser utilizado na interoperação co1n un1 cliente ou servidores-
crito co,n o Visual Basic .NET.
P O que aconteceria se eu tentasse acessar um Serviço Web, e ele estivesse inativo?
R Infelizmente, há pouco que se possa fazer nessas situações. Em geral, é preciso adicionar
llln código ao cliente para que ele reaja de 1nodo apropriado a esse problema. O cliente
pode falhar ou armazenar em cache e reutilizar a última reposta quando adequado.
Workshop
O Workshop foi planejado para ajudá-lo a antecipai· possíveis dúvidas, revisar o que já aprendeu
e começar a pensar e,n como colocar seu conheci1nento em prática. As respostas do teste estão
no Apêndice A, "Respostas dos Testes/Exercícios".
Teste
1. Qual a finalidade do arquivo DISCO?
2. Qual o objetivo de um proxy?
3. Por que o SOAP é in1portante para os Serviços Web?
Exercícios
Tente adicionar outros rnétodos aos dois Serviços Web que criamos. Por exen1plo, acrescente os
rnétodos Subt ract, Multi p1y e Oi vi de a MathServi ce. Atualize seu cliente para que trabalhe corn
os novos métodos.
SEMANA 3
Resumo
A Se,nana 3 abordou um conjunto pesado de tópicos, mencionando vários recursos co,n os quais
será preciso gastar ainda mais ten1po no futuro. Para começar, você aprendeu co1no criar seus
próprios objetos na platafonna .NET, construindo blocos de código que podem se tornar autôno-
mos e ser reutilizados por outros projetos quando necessário. O Dia 16 o conduziu por algumas
das ,nais avançadas técnicas e tecnologias para a criação de aplicativos co,n base no Windows
por 1neio da plataforma .NET, co1no os ,nenus e os controles de divisão.
O Dia 17 forneceu u,na abordagen1 de duas áreas do .NET Fra,nework freqüentemente necessá-
rias: a biblioteca de figuras, e1n que mostramos como ,nanipular imagens e a aparência de seus
aplicativos, e os recursos de manipulação de arquivos da plataforma .NET, con1 detalhes de
co,no criar, abrir e alterar esses arquivos. No Dia 18, você aprendeu a tornar a n1anutenção e o
supo11e de seu aplicativo tão fáceis quanto possível, incluindo a docu,nentação de seu código e o
uso do controle do código-fonte para proteger seu precioso trabalho. O Dia 19 deu prossegui-
1nento ao tópico distribuição, incluindo várias considerações sobre a redistribuição dos arquivos
.NET necessários para que seu progra,na funcione corretamente. Criar progra,nas de instalação,
aprender as opções de instalação re,nota e fornecer a documentação do usuário, todos esses itens
fizera,n patte do Dia 19.
Os Dias 20 e 21 abordara1n duas tecnologias que são a base do conceito .NET: a XML e os Servi-
ços Web. Você aprendeu como a platafonna .NET fornece classes para leitura, criação, alteração
e compilação de docu,nentos XML, e que a XML pode ser usada em seus aplicativos. O Dia 21
mostrou os Serviços Web, un1 dos principais recursos da plataforma .NET, e aprende1nos co1no
eles penn ite1n a exposição da funcionalidade de seu sistema na Web por n1eio dos padrões HTTP
e XML. O desenvolvimento de Serviços Web e o uso deles em seu próprio aplicativo ta,nbém fo-
ram discutidos, embora a abordagetn completa desse tópico esteja além do escopo deste livro.
Para concluir, o projeto de bônus da Se,nana 3, que está disponível na Web (veja a Introdução),
1nostrou-lbe como os conceitos abordados nos capitulos anteriores, como a utilização de arqui-
vos, as figuras, a XML e até algumas tarefas avançadas co,n os formulários Windows, poden1 ser
usados na criação de um programa co,npleto. Nesse caso, criamos um jogo, 1nas essa foi apenas
uma maneira mais agradável de aprender as técnicas que podem ser aplicadas a quase todo tipo
de siste1na que for preciso gerar.
Resumo
Com a conclusão deste livro, você tam bén1 chegou ao fim dos 21 dias de Visual Basic .NET e já
obteve uma co1npreensão geral da linguagem, da estrutura subjacente e de como pode usar as
duas para co1neçar a criar seus próprios sistemas. No desenvolvilnento, o aprendizado é um pro-
cesso contínuo que nunca tennina reahnente, n1as passa1nos por uma introdução be1n profunda a
uma linguagem fantástica. E' recomendável sair do nível introdutório de estudo por algu1n te1npo
e se concentrar em desenvolver vários aplicativos (de exemplo ou reais, dependendo de seu tra-
balho atual) para fixar todas as informações que abordamos nestas três se1u.anas. Certifique-se de
estar codificando na plataforn1a .NET o 1náximo que puder; não há maneira 1nelhor de ganhar
confiança e uma compreensão adicional em u1na linguagem e uma tecnologia novas.
APÊNDICE
Respostas dos
Testes/Exercícios
Respostas do Dia 1
Teste
1. Primeiro a Microsoft produziu u1n compilador para a linguage1n BASIC
original, chan,ando esse produto de Microsoft BASIC. A versão seguin-
te desse compilador, que antecedeu o Visual BASIC, foi o Quick
BASIC, ou QBASIC.
2. Todas as linguagens .NET comparti lham
,
esses recursos porque o Corn-
1non Language Runtin1e os fornece. E por n1eio dessa funcionalidade de
te1npo de execução que todas essas linguagens trabalha1n com a plata-
fonna .NET.
3. Esse processo é cha1nado de compilação.
4. Se você não declarar explicitamente u.m arquivo de sa.ída, usando
/out : <nomedoarquivo>, o co1npilador e1npregará o nome do arqui-
vo-fonte no lugar do executável. Nesse caso, a saída seria MySourceCo-
de. exe.
610 Apêndice A
Exercícios
1. Para gerar un1 arquivo executável específico, você só precisa de /out: <nomedoarqui vo>
no compilador da linha de comando. A fi1n de executar essa taretà, acesse o console
(pro1npt de comando). Navegue (usando o comando cd) até a pasta que contém seus ar-
quivos de trabalho relacionados aos exemplos anteriores, especifican1ente step3 . vb.
Agora, execute o co1npilador digitando vbc step3. vb t: exe out: hat S. exe e pres-
sionando Enter. lsso compilarás tep3, mas salvará o resultado compilado e1n u1n arquivo
chan1ado WhatOS.exe.
2. Há ,nuitas propriedades diferentes disponíveis na parte Environn1ent do .NET Fra,ne-
\.Vork, portanto existem várias maneiras pelas quais você poderia ter respondido a essa
pergunta. No final, entretanto, todas as respostas se pareceriam com a solução a seguir,
que exibe a versão do .NET Frame,.vork:
Public Class FrameworkVersion
Shared Sub Main()
System.Console.Writeline(System.Environment.Version.ToString())
End Sub
End Class
Esse código produz o resultado a seguir (esse resultado é gerado quando a versão Beta 2
da plataforma .NET é usada; você obterá resultados diferentes se e1npregar a versão ofi-
cial):
Co,no alternativa, você pode querer exibir o ca1ninho para o diretório System ou u1n dos
1nuitos outros valores, todos seguindo o 1nesmo padrão básico. U,n exemplo do uso do
valor SystemOi rectory é n1ostrado a seguir:
Public Class SysOir
Shared Sub Main()
Sys tem. Canso l e. l~ri tel i ne (System. Envi ronment. Sys temOi rectory)
End Sub
End Class
C: \ T V \ Cl SysDir
C: \~IINNT\System32
Respostas do Dia 2
Teste
1. Você usaria o Solution Explorer, que 1nostra todos os projetos abertos e os arquivos que
existem neles. Podernos tornar essa janela visível pressionando a co,nbinação de teclas
CTRl~+R.
2. Por padrão, os projetos são colocados sob a opção My Documents fo 1der\ Vi sua 1 Studi o
Projects do usuário atual e em u1na nova pasta co1n o nome do projeto. Quando você criar
u1n projeto novo, esse catninho será exibido na caixa de diálogo New Project, podendo
ser alterado quando for conveniente.
3. Escolha um ícone na caixa de diálogo Project Properties, que você pode acessar dando
u1n clique co1n o botão direito do n1ouse sobre o projeto no Solution Explorer e selecio-
nando Properties no 1nenu suspenso. Também é possível escolher u1n arquivo .ico (de
ícone) en1 Co1n1non Properties\Build.
4. Na janela Com1nand, digitar >cmd e pressionar Return o colocará no 1nodo Comn1and.
Digitar immed e pressionar Return o conduzirá novamente para o modo In1mediate.
Exercício
Com a introdução de u1na chamada MessageBox. Show no evento TextChanged de uma caixa de
texto, uma mensage1n será exibida sempre que o conteúdo dessa caixa for alterado. Embora esse
seja un1 local útil para códigos que val iden1 a entrada de texto do usuário, exibir tuna mensagem
dentro desse evento logo se tornaria incômodo!
Respostas do Dia 3
Teste
1. Você deve usar o tarnanho e o tipo de variável mais apropriados entre os tipos disponíveis.
2. A e Cestão corretas. Quando tuna função é chamada, os parâ,netros tê,n de ser colocados
entre parênteses. Alétn disso, a função retornará utn valor, portanto em geral é preciso
que se faça algo com o resultado. Atribua-o a outra variável ou exiba-o.
3. Se urna variável for declarada corn a palavra-chave Pri vate, estará disponível para todo
o módulo ou classe onde fo i especificada.
1 612 Apêndice A
Exercícios
U,na solução possível para o exercício do programa de cálculo de pagan,entos seria
1 Module Payment
2
3 Private dblAnnuallnterest As Double = O
4 Private iYears As Integer = O
5 Private dblLoanAmount As Double = O
6 Private dblMonthlyDeposit As Double = O
7
8 Sub Main()
9 Dim dblResult As Double
10
11 ' armazena os valores informados
12 GetlnputValues()
13
14 'calcula
15 dblResult = CalculatePayment(dblLoanAmount,
16 dblAnnuallnterest,
17 iYears)
18 'proceda a exibição do resultado
19 DisplayResults(dblResult)
20
21 End Sub
22
23 Private Function CalculatePayment(Byval LoanAmount As Double,
24 ByVal Annua l lnterest As Double,_
25 ByVal Years As Integer) As Double
26 ' divida por 1200 para torná-lo um percentual mensal
27 Dim dblMonthlylnterest As Double = CDec(Annuallnterest / 1200)
28 Dim iMonths As Integer = Years * 12
29 Dim dblTemp As Double
30 Dim dblReturn As Double
31
32
33 ' precisaremos desse valor em alguns l ocais
34 dblTemp = CDec(((l + dblMonthlylnterest) A iMonths))
35 dblReturn = LoanAmount *
36 (dblMonthlyinterest * dblTemp /(dblTemp - 1))
37 Return dblReturn
38
39 End Function
40
41 Private Sub GetlnputValues()
42 Conso l e .Writeline()
43 dblloanAmount = CDec(GetValue("Loan Amount: "))
Respostas dos Testes/Exercícios 613
44 dblAnnuallnterest =
45 CDbl (GetValue("Annual Interest (e.g. for 5%, enter 5): "))
46 iYears = Cint(GetValue(''Years of loan: ''))
47 Console. Writeline()
48 End Sub
49
50 Private Function GetValue(ByVal Prompt As String) As String
51
52 Console.Write(Prompt)
53 Return Console. Readline
54
55 End Function
56
57 Private Sub DisplayResults(ByVal Result As Double)
58 Console . Writeline()
59
60 Console. \~riteline("If you borrow {O:c}, ", dbl LoanAmount)
61 Console .Writeline(''at {0}% interest.'', dblAnnuallnterest)
62 Console.Writeline(''for {O}years '', iYears)
63
64 Console. Writeline()
65 Console.Writeline(''Your monthly payment would be: {O:c}'', Result)
66
67 End Sub
68
69 End Module
Respostas do Dia 4
Teste
1. O laço For é n1ais adequado para esse tipo de solução, en1boraqualquer dos laços pudes-
se ser usado.
2. E1nbora os laços possa,n ser usados parasi,nular uns aos outros, o laço Do é mais flexíve l
devido a seu suporte às cláusulas Whi l e e Unt i l e às posições de entrada e saída onde po-
derá ser inserida a expressão condicional.
3. O bloco interno é o código que será executado etn cada iteração do laço, portanto, o de-
setnpenho obtido ou a quantidade de iterações do laço apresentará urn resultado melhor
dentro do laço.
4. Considerando-se Cal cul atedTota l NetWorth ( ) u1n pouco ,nais co1nplexa do que o códi-
go executado em dtCurrentDate. Hour ( ) , seria melhor que você invertesse os dois lados
614 Apêndice A
daexpressão. lsso assegurará que, se a primeira expressão, dtCurrentDate. Hour( ) > 12,
for falsa, a rotina maior e 1nais de1norada não seja nem 1nes1no executada.
Exercício
l. Há 1nuitas maneiras diferentes pelas quais você poderia escrever o programa Nun1ber-
Guesser, 1nas o resultado geral seria semelhante ao descrito a seguir:
Public Cl ass GamePlayer
slnput = System.Console.Readline()
ilowerBound = Clnt(slnput)
System.Console.Readline()
iCurrentGuess = O
sGuessStatus = 11 ''
Case "H"
iUpperBound = iCurrentGuess - 1
Case L11 11
ilowerBound = iCurrentGuess + 1
End Select
Respostas dos Testes/Exercícios 615
Loop
End Sub
Shared Function GetMyGuess(iUpper As Integer, ilower As Integer)
• As Integer
If iUpper = ilower Then
GetMyGuess - ilower
Else
GetMyGuess = ilower + ((iUpper - ilower - 1)\2)
End If
End Funct i on
End Cl ass
Respostas do Dia 5
Teste
1. Há várias vantagens, porém a 1nais importante é que não é necessário distribuir nada an-
tes que o aplicativo possa ser usado ou para atualizá-lo. Outro beneficio essencial está re-
lacionado aos aplicativos com uma interface Web poderen1 ser acessados em
platafonnas que não sejarn Windows.
2. Ainda assirn será um sisten1a de uma camada. Os níveis diferentes dos aplicativos são ba-
seados nos locais onde o código e/ou o processa1nento são executados. Nesse exe1nplo,
nenhum tipo de processarnento é manipulado pelo servidor; ele apenas contém o arquivo
que será usado pelo aplicativo cliente. Toda a parte ligada à lógica, ao processamento e
ao código é tratada somente no sistema cliente.
3. O requisito básico é o .NET Framev.,ork, que deve ser instalado en1 qualquer sistema que
venha a executar u1n código .NET, inclusive urn servidor que processe u1n site ASP.NET
na Web.
Respostas do Dia 6
Teste
1. As janelas Local, Watch, Immediate e Quick\.vatch e a janela suspensa Watch.
Exercícios
J. A Listagem 6.11 mostra u1na solução possível.
616 Apêndice A
1 Imports System
2 Imports Microsoft.VisualBasic . ControlChars
3
4 Module modTable
5
6 Sub Main()
7 Dim ilow,iHigh As Integer
8 Dim slnput As String
9
10 'Permita múltiplas execuções na geração da tabela
11 Do
12 'solicite valores
13 Console.Write(''Low value (maximum of 20, O to end): ")
14 slnput = Console.Readline()
15 ilow = Cint(slnput)
16
17 If ilow O Then
18 Console.Write(''High value (maximum of 20): '')
19 slnput = Console.Readline()
20 iHigh = Clnt(slnput)
21
22 OutputTable(ilow, iHigh)
23 End If
24 Loop Unti l i Low = O
25 Console.Write(''Press ENTER to continue'')
26 Console.Readline()
27 End Sub
28
29 Private Sub OutputTable(ByVal MinValue As Integer,
30 ByVal MaxValue As Integer)
31 Dim iCount, iCount2 As Integer
32
33 Console.Writeline()
34 Console.Writeline(''Multiplication Table ({O}to {l})'',
35 MinValue, MaxValue)
36
37 'escreva o cabeçalho
38 For iCount = MinValue To MaxValue
39 Console.Write(Tab & CStr(iCount))
40 Next
41 Console.Writeline()
42
43 'Crie cada l inha da tabela
44 For iCount = MinValue To MaxValue
Respostas dos Testes/Exercícios 617
Respostas do Dia 7
Teste
1. Se um método inserido en1 u1na classe for 111arcado com Mus tOverri de, então, a classe
deve ser ,narcada con1 Mus t I nheri t. Isso acontece porque o primeiro requisito, que todas
as classes clientes deve1n implementar seu próprio código para esse método, força a in-
clusão da palavra-chave Mustlnheri t já que a classe básica não sobrepõe o método.
2. A palavra-chave MyBase permite que sejam chamados os membros da classe-pai ou da
classe básica. Você pode usar MyBase.New( ) para cha1nar o construtor-padrão de sua
classe básica.
3. Dois dos construtores sobrepostos são efetivarnente os 1nesmos para o compilador do Vi-
sual Basic e, portanto, não são pennitidos.
Public Sub New(ByVal sColor As String)
m_dtManufactured = System.DateTime.Now()
m sColor = sColor
End Sub
Exercícios
l-Iá várias maneiras que você poderia usar para criar esse exemplo, mas é apresentada a seguir
tuna in1ple1nentação possível (v~ja a Figura 7.4):
1 618 Apêndice A
Namespace Biology
Public Class Animal
Public Overridable Property Name() As String
Get
End Get
Set(ByVal Value As String)
End Set
End Property
Public Overridable Property NumberOflimbs() As lnteger
Get
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overridable Property Cor()As String
Get
End Get
Set(ByVal Value As String)
End Set
End Property
Public Overridable Property Weight() As Singl e
Get
End Get
Set(ByVal Value As Single)
End Set
End Property
Public Overridable Property AirBreather() As Boolean
Get
End Get
Set(ByVal Value As Boolean)
End Set
End Property
End Class
End Property
End Class
Não se preocupe se seu código não ficar tão parecido con1 esse exemplo, contanto que funcione e
você possa usar alguns dos recursos dos objetos descritos na lição do Dia 7.
Respostas do Dia 8
Teste
1. Você poderia redirecionar os fluxos de resultados ou erro para un1 arquivo com a finali-
dade de registrá-los.
620 Apêndice A
2. O conjunto Sortedl i st ordenará de 1nodo automático os itens em u1na lista à medida que
fore1n adicionados, portanto, você não tem de se lembrar de chan1ar repetida1nente o 1né-
todo Sort. O conjunto Arrayl i st não possui essa função.
3. U1n número entre 2 e 12 seria exibido no console.
Exercícios
Para criar o programa do console descrito, você usaria o método GetCommandArgs da classe Envi -
ronment e o 1nétodo Sort da classe Arrayl i st. Dessa maneira, seria,n necessários os espaços de
nome Sys tem e Sys tem . Co 11 ect i ons. Siga estas etapas:
1. Crie um aplicativo do console. O meu se chama SortedArgs.
2. Altere o nome do módulo de Module! para modMain. Salve o arquivo resultante como
Main . vb.
3. Dê um clique com o botão direito do mouse sobre o nome do projeto no Solution Explo-
rer e selecione Properties. Altere o Startup Obj ect para modMai n. Selecione OK para fe-
char a caixa de diálogo.
4. O método GetCommandArgs da classe Envi ronment retorna um array de strings de cada ar-
gumento listado na linha de co1nando (incluindo o no1ne do aplicativo). Você pode usar
isso na criação de um conjunto Arrayl i st e empregar a funcionalidade de ordenação in-
terna para organizar sua lista.
5. Já que o nome do aplicativo está e,n seu conjunto Arrayl is t , você deve rernovê-lo antes
de ordenar a lista.
6. Depois de ordená-la, você poderá usar o método Console. Wri tel i ne para exibir a Iista re-
sultante. Empregue u1n laço For .. . Next para visualizar todos os itens dela.
O código-fonte completo para o exe1nplo está na Listagem 8.4.
1 Module modMain
2 Sub Main()
3 Dim oArgs As New Arraylist(Environment.GetCommand l ineArgs())
4 Dim I As Integer
5 Wi th oArgs
6 . RemoveAt(O)
7 .Sort()
8 For I = O To . Count - 1
9 Console.Writeline(.Item(I))
10 Next
11 End With
12 End Sub
13 End Module
Respostas dos Testes/Exercícios 621
ANÁLISE A Listagem 8.4 é pequena, mas de1nonstra várias técnicas para a n1anipulação de
conjuntos, assim como a recuperação de argu,nentos da linha de comando.
A linha 3 cria u,n novo conjunto Arrayl i st, copiando o array de strings retornado pelo método
GetConmandL i neArgs. Essa técnica está disponível para muitos dos conjuntos definidos ern
Sys tem . Co 11 ect i ons. Ela pennite que você pegue u,n array existente, insira-o em u1n conjunto
(Arrayl i st, Queue ou Stack) e defina seu co1nporta1nento adicional. Nesse caso, ela executa are-
1noção do item indesejado (1 inha 6) e ordena os restantes (linha 7). Para concluir, o código que
vai da linha 8 a l Oexibe o array resultante. A execução do aplicativo deve produzir o resultado a
.
seguir:
Respostas do Dia 9
Teste
l . Modal versus não-modal: quando uma janela é exibida de maneira modal, o usuário não
pode interagir co1n nenhu1na parte do aplicativo até que a janela seja fechada. Códigos
que exibem for1nulários ,nodais tê,n sua execução interro1npida até o 1no1nento e1n que
esse formulário fique oculto ou seja fechado. Quando um fonnulário nã.o-1nodal é exibi-
do, o usuário não é impedido de trabalhar co1n qualquer outra parte do aplicativo, e o có-
digo que o exibiu continuará a ser executado se1n ter de esperar que o formulário seja
fechad.o.
2. A propriedade CausesVa li dat i on é configurada co1no True para indicar que deseja,nos
assegurar a existência de dados válidos nos campos de entrada de dados quando o usuá-
rio usar esse controle. Se você configurar essa propriedade em u1n botão Cancel, então, o
usuário terá de inserir informações válidas mes1no quando quiser apenas cancelar o pro-
cesso!
622 Apêndice A
3. A instrução Handl es, seguida de um ou mais non1es de eventos específicos, é usada para
indicar que o procedi1nento é u1n manipulador de eventos. Ter Handl es btnOpen. Cl i ck no
final de u1n procedimento significa que ele será chatnado se1npre que o evento Cl i ck de
btnOpen ocorrer (quando o usuário der u1n clique en1 btnOpen).
Exercícios
1. A estratégia para 1nanipular os três eventos co1n apenas uma rotina é determinar que
evento específico ocorreu quando ela foi chamada. Pela conversão do parâmetro sender
e1n u1n objeto System. Windows.Forms.Control, você poderá acessar sua propriedade
Name, que fornecerá o no,ne do controle que é a orige,n do evento. O novo procedimento
de eventos, que substituiria os outros três, é mostrado na Listagem 9.21.
Respostas do Dia 1O
Teste
1. Os controles Labe l fornecerão a você o recurso de alterar posterionnente o texto de 1na-
neira dinâmica.
2. Os controles Li nkButton e Hyperl i nk.
3. Use os controles Image ou ImageButton (se a figura tiver co,no fin alidade ser cl icada), ou
apenas selecione Jnse1i e f 1nage no .menu.
Exercícios
Por causa das condições do fonnulário, deve,n ser usados os controles Vali dator. Adicione-os a
todos os outros controles. A 1naior parte será de controles Requi redFi e l dVa li dators, 1nas tam-
bérn será necessário um CompareVa li dator para assegurar que as duas senhas coincidarn. Além
disso, você verá como se cria u,n ca,npo de senha.
Crie um projeto (ou adicione um novo fo,mulário a urn projeto existente). Adicione tuna tabela
nova (Table, lnsert, Table) ao formulário, com três colunas e seis linhas. Veja afigura 10.9 para
obter detalhes.
Adicione três títulos ao novo fonnulário, u,n para cada uma das três prin1eiras linhas da priineira
coluna. De 1naneira se1nelhante, adicione quatro controles TextBox às pri1neiras quatro linhas da
segunda coluna. O resultado final deve ficar parecido con1 a Figura 10.1 O.
- 6 X
FIGURA 10.9 ftlt (dl\ ~·•• e.t"óJoct l}t,1ld Q:obuo r,0:rmot Tbbl• lnstrt rromos Iool,s W)ndow Jjolp
_ • I ~ ••,_.,m,
~ ~ 13
- 11
Table. Se4tdt ~esufb
• Tobl~
. ........
···--····· -· ··
. .. ' ... ............ ::.J .::J C•l tpocln9 : I• ~ ..········. .. .. .. ..--..··.....
. . . . . ..
....... .. .............
..
... ~dor color:
. ........
.' .....
..... . .. ............. ... ... Highli.ght oolo,r: ~---3~. .d e"' 11 -"-' ..,] .....
' . . ....
.....
. . . ..... ......
. . . .... .. ,,.
... .. .. .. .. ..... ........ .. Shadow eofor:
'
t
'
. .. . . .
' '
'
.
.
............. .............
..... ... CtlloW\Mos - - - - - - - - - - - - - ~ .. ... .. .. .. .. ..
.......
'
'
.. . .......... . . .
.... .. S..:ekçtound colon
. . . . .
............. ....................
'
' ..
... .. &Qrder color: ---~
.:J_;:J • 6onment: 1
3~ lv' "''".ll tut
..:]
.:. . . . . . . . . . .
. ... .. ......: 1.v...
:.. ".. .:::::
i·
...... ...
...... ........... .... ..... ~ - - - - - - - - - - - - - - - ~ ......... ... ...... ....
... ..
~
OI( ...
IQ Oestpn 18 HTML
Output iosk un
R..nd;
624 A pêndice A
O formulário f,fleb 1;iil • O · lá: liil ai i !!ti la ..., : <'• • J;' • r;.J •'o,bvo • I'ai, OVtJ>ame
sendo criado.
l!il"1> 1• lwJ ~ . 1 · : ·-~-~- ~· ·....,__ __·~ ---Jl-~·I, n' 1 li •.
t.11
} o...
fl_90l>ox
_:d .. . .
-· 1:::.:::::::::::::::::.::::::::: .. . . .. . . . . . . . . . . . .. . . . ... .1,
~
;:_ Web f Ol'fl"tS
Para concluir a segunda coluna, adicione u1n controle Button e outro Label . Por fi1n, na terceira
coluna, adicione (de cima para baixo) três controles Requi redFi el dVa li dators e un1 CornpareVa-
1i dator. Contigure as propriedades de todos os controles como descrito na Tabela 10.6.
Por firn, você está pronto para ad icionar o código. Corno antes, não é necessário inserir um que
1nanipule a validação porque os controles gerenciarn isso. Portanto, não há um código extenso a
ser adicionado a página. Só é preciso criar aquele que será executado quando o usuário der um
clique no botão de registro (Register). Ele será processado apenas se todos os erros forem corri-
gidos e só exibirá tuna mensagern no campo do resultado (summary). Dê urn clique duas vezes
no botão Register e adicione o código da Listagern 10.5.
Compile e execute o projeto. Quando o navegador estiver disponível, tente usar valores diferen-
tes nos ca,npos. Exclua qualquer entrada que tiver inserido nos ca1npos Na,ne e Alias. Você deve
ver as 1nensagens de erro desses controles. Digite duas senhas diferentes para ver o controle Com-
pa reVa 1i dator em ação (veja a Figura 10.1 l). Para concluir, insira valores nos ca1npos Na1ne e
Alias, e senhas iguais para ver a n1ensage1n final. Veja a Figura 10.12.
Forn1ulário de registro J C> a, • ~ • O @) Gl [IlP, ,..onol Oo, ~ S•• "" (i)F••= • 13 !B· ª ~ (g ~ Q 2
.:IJILlnl<, »
co111 erros. •
FIIM• 1
Alw Ah,, " • <cqu,red 6dd
r anword: Ir
Ri!iister I
•
a oone rrr ,. t.ocal ir.uanet
FIGURA 10.12
Fornnilário de registro
IAJ:lfflss (4!J http://rondom/Moi:i!tb/Wcibform).ospx .:111"""'
preenchido »
correta111ente.
~-. IM•
Alia,· 11~m
t"'-·1 1
1
R9glster I
r~komc. h:m
Respostas do Dia 11
Teste
1. O campo (ou campos) usado para identificar de 1naneira exclusiva o regish·o de um ban-
co de dados é chamado de chave primária.
2. Esse código SQL executou uma instrução LEFT OUTER JOIN entre essas duas tabelas, es-
pecificando que todos os registros de Marca e Modelo que atendam à condição da asso-
ciação sejam inclu.ídos no resultado. Os resultados a seguir serão gerados:
Marca Modelo
Ford Mustang
Ford Explorer
Audi <Nulo>
BMW <Nulo>
Pontiac Grand Am
Pontiac Aztek
Toyota Rav 4
Toyota Camry
3. Essa instrução SQL especifica uma associação interna, que é o tipo 1nais co1n un1 de
união. Ela produzirá resultados apenas co1n os registros das duas tabelas e1n que a condi-
ção da associação for atendida, con10 vetnos a seguir:
Marca Modelo
Ford Mustang
Ford Explorer
Pontiac Grand Am
Pontiac Aztek
Toyota Rav 4
Toyota Camry
Observe que Audi e BMW, que não têm registros na tabela Modelo, não foram incluídos
no resultado da segunda insh·ução SQL.
628 Apêndice A
Exercícios
1. Jlá 1nuitas n1aneiras pelas quais você poderia estender seu banco de dados de CDs para
abranger os usuários; veja a seguir a 1nais simples:
Primeiro, adicione urna tabela de usuários (User) que terá o catnpo da identificação do
usuário (UserlD) como chave prin1ária. Que outros catnpos serão incluídos nessa tabela
é irrelevante, rnas provaveltnente ela terá informações corno o no1ne e endereço eletrôni-
co do usuário, e talvez utna senha, de 1nodo que você possa garantir a segurança e itnpe-
dir que os usuários altere1n a coleção de CDs de outras pessoas.
A seguir, você trabalhará com base no fato de que se dois usuários tivere1n o álbun1 "Fi-
elds of Gold" do Sting, deve haver apenas uma entrada relacionada a Sting na tabela
Artist, e apenas urna em Disc referente a esse CD específico. Corn isso definido, no final
tere1nos u1n relacionamento 1nuitos-para-muitos entre User e Disc, que pode ser expres-
so co1no uma tabela de relacionamentos UserDisc. O banco de dados alterado é 1nostrado
na Figura 11.7.
2. Mes1no com as inforn1ações de Orders. txt sendo apresentadas de maneira inadequada,
não é raro receber dados nesse formato, principalmente quando são originários de uma
planilha. Para colocá-los e1n u1n banco de dados eficiente, você te1n de separar as infor-
1nações sobre o cliente das referentes ao pedido e ainda inserir os itens de cada pedido (e
se um cliente quisesse pedir quatro itens no mes1no pedido?) em sua própria tabela. Du-
rante o processo, também poderiam ser removidos alguns can1pos que produzem resulta-
dos calculados (total do pedido, custo total do item X) que em vez disso seriam obtidos
con10 parte de tuna consulta. O layout desse banco de dados é mostrado na Figura l l .8.
Category
PK ~í!1!!9Q!:)l1Q DiscCategory
CategoryName
PK DisclD
CategorylD
Respostas dos Testes/Exercícios 629
FIGURA 11 .8 Customer
''
OrdemItem
PK O..r.d.er!D
OrderltemlD
Item SKU
Item Cost
Item Ouantity
Se quisesse, você poderia ir adiante co1n esse banco de dados, criando u1na tabela de itens para
annazenar um registro de cada SKU composto do preço e da descrição do item e remover esses
ca1npos da tabela Orderltem. Observe que em um banco de dados de entrada de pedidos às vezes
é necessário existir algu1na duplicação- annazenar o custo dos itens com os itens do pedido, por
exemplo - para pennitir que os preços dos itens sejam alterados com o tempo sem que isso afete
as infonnações de pedidos anteriores.
Respostas do Dia 12
Teste
1. A propriedade e1n questão é Mi ss i ngSchemaAct i on, e a configuração de AddWi thKey é que
assegurará que as infonnações da chave primári.a sejam criadas.
2. O método De1ete marca a linha como excluída, mas não a reinove da tabela; ela per1na-
nece para que a rotina Update saiba que te1n de excluir essa linha do banco de dados. O
1nétodo Remove extrai i1n.ediatamente o objeto DataRow do conjunto Rows, porém ele não é
removido do banco de dados quando Update é chamado.
3. Esse é u,n comando que não retorna registros, portanto, você deve chamá-lo usando o
,nétodo ExecuteNoQuery do objeto C0Jm1and. Seu código pode ficar co1n a aparência a se-
.
gu1r:
Sub Main()
Dim sSQL As String
sSQL = ''DELETE FROM Artist Where ArtistID=3 ''
Dim objConn As New _
System. Data.OleDb.OleDbConnection(sConnection)
Dim objCmd As New _
System. Data.OleDb. OleDbCommand(sSQL, objConn)
630 Apêndice A
Exercícios
Você poderia criar u1na interface para seu banco de dados de registro de CDs de rnuítas 1nanei-
ras, 1nas as partes essenciais serão as mes1nas em todos os casos.
Respostas do Dia 13
Teste
1. Loaded Modules e Processes (e você também pode obter essa informação no Manage-
1nent Tnformation ).
2. O serviço é u1n progra1na executado e,n segundo plano no seu computador, que fornece
algum recurso. Por exemplo, o SQL Server disponibiliza recursos de bancos de dados.
3. O valor atual do percentual de CPU em uso(% Processor Time) seria exibido no console.
Respostas do Dia 14
Teste
l. A palavra-chave MyBase fornece a funci onalidade desejada e pode ser usada para se refe-
rir a propriedades ou 1nétodos da classe básica.
2. Criar múltiplas versões do rnes,no procedimento, porém com diferentes conjuntos de pa-
râmetros, é chamado de sobreposição.
3. O resultado será
x.Name = Fred
y.Name = Fred
Tanto x quanto y se referem à mesma instância de myFi rstCl ass, ex. Name = y. Name não altera
nada porque é equivalente a x.Name = x.Name.
Exercícios
U1n ca1ninho possível para o projeto seria n1anipular os diversos tipos de evento usando uma hie-
rarquia de objetos, em vez de empregar apenas uma propriedade de tipo ou categoria em u1na
única classe Event. Você poderia criar uma classe básica Event, co,n algurnas propriedades co-
1nuns como o no1ne do evento e talvez as informações de contato referentes a esse evento. Deri-
Respostas dos Testes/Exercícios 631
vadas dessa classe, outras poderiam ser criadas con10 Sporti ngEvent (herda de Event),
ConcertEvent, ComedyEvent, Pub li cSpeaki ngEvent e assim por diante. A hierarquia poderia ser
levada ainda mais para baixo, conduzindo a classes coino Baseba 11 Game (herda de Sporting-
Event). Pol i ti cal Event (herda de Pub li cSpea ki ng Event) e outras. As propriedades individuais
das diversas classes derivadas podem ser descritas no nível de detalhe desejado, mas deven1 evi-
tar a repetição. Se duas classes tivere1n propriedades semelhantes, considere passar as proprie-
dades e1n com.um para uLna classe básica.
Respostas do Dia 15
Teste
l. As interfaces fornecein esse tipo de funcionalidade, pennitindo a de1nonstração de que
1nuitas classes diferentes compa1tilha1n alguns recursos. Elas são bastante adequadas a
essa tarefa porque urna única classe pode implementar várias interfaces distintas.
2. A palavra-chave Mus tOverri de pode ser usada para indicar que u1na propriedade ou mé-
todo específico deve ser sobreposto e1n utna classe derivada.
3. A palavra-chave Mustlnheri t transforma u1na classe básica em 'abstrata', que não pode
ser instanciada, 1nas, em vez disso, deve ter classes derivadas dela.
4. As classes 1narcadas co1no Notinheri tab l e ta1nbé1n são conhecidas como 'lacradas' , e
não pode1n ser usadas co1no u1na classe básica (outras classes não pode1n herdar caracte-
rísticas dela).
Exercícios
Há 1nuitas 1naneiras pelas quais você poderia criar uma hierarquia de objetos que incluísse o
cliente, mas a Figura 15.4 ilustra urn exe1nplo. Nesse caso, a classe Cliente foi derivada de uma
classe Pessoa 1nais genérica, e os aspectos das infonnações de contato foram gerados direta1nen-
te nessa classe básica de origem.
632 Apêndice A
Agência Governamental
Identificação do Pedido
do Governo
U1n projeto alternativo, na Figura 15.5, ilustra co1no tnna versão 1nais si1nples co1n as mes1nas
informações pode ser estruturada.
Respostas dos Testes/Exercícios 633
Agência Governamental
ldenficação do Pedido
do Governo
Respostas do Dia 16
Teste
1. Use o método LayoutMdi do formulário MDI-pai para configurar o layout corno Mdi La-
yout. Cascade. Isso organizará as janelas-filhas de modo que todas as suas barras de título
fiquem visíveis.
Exercícios
1. Na verdade, é uma preferência pessoal. Em geral, pretiro o modelo SDI porque posso ver
as janelas individualn1ente na barra de tarefas. No entanto, em alguns aplicativos que po-
dem abrir múltiplos arquivos, con10 u,n que use figuras, prefiro o MDT, para annazenar
todas elas no mestno local.
2. Os métodos GetAttri butes e GetlastWri te Time da classe File são úteis quando essas in-
for,nações são recuperadas em um arquivo. Os dois são métodos co1npartilhados da clas-
se File, portanto você não precisa criar a instância de urn arquivo antes de usá-los. Para
634 Apêndice A
adicionar essa funcionalidade, você pode alterar o aplicativo Pioneer original ou copiar
todos os arquivos do diretório dele em um novo diretório e alterá-los.
Altere a propriedade Vi ew de Li stVi ew para Detai l, Jsso ativará o recurso com o qual você po-
derá adicionar várias colunas à li stVi ew. Adicione três colunas à li stVi ew usando o editor da
propriedade Co l urnns. A Tabela 16.17 descreve as propriedades dessas colunas.
O único código necessário é o que adiciona as infortnações às colunas Attri butes e Last Modi -
fied. Altere o 1uanipulador de eventos tvwFolders AfterSelect para criar essas colunas (veja a
Listagem 16.8).
Para concluir, você deve criar uma rotina com a finalidade de exibir os atributos definidos para o
arquivo. Adicione o código da Listagem 16.9 a fi1n de executar essa operação.
42 Else
43 sReturn += li
- li
44 End If
45
46 Return sReturn
47
48 End Function