Você está na página 1de 85

Nova pagina 1

- Introdução e Conceitos

VB.Net Aquecendo as turbinas


Sente-se e não esqueça o cinto de segurança ... Vamos dar a partida para mais uma emocionante aventura : explorar , e aprender a
utilizar o novo ambiente de desenvolvimento da Microsoft, a plataforma .NET , com foco no VB.NET.

O VB.Net não é apenas uma nova versão do Visual Basic que traz algumas melhorias em relação a versão anterior. Na verdade a mudança
é tamanha que , sem exageros , podemos dizer que vamos aprender uma nova linguagem de programação.

A partir de agora estaremos procurando tratar de explicar como usar e utilizar o Visual Basic.NET e não somente isto mas também a conhecer o
.NET Framework e ASP.NET e por que não C#.

Existem alguns artigos em português que você pode consultar para uma visão geral sobre a plataforma .NET :

1. http://www.microsoft.com/brasil/msdn/tecnologias/visualbasic_bday.asp
2. http://www.microsoft.com/brasil/msdn/tecnologias/visualbasic_virada1.asp
3. http://www.microsoft.com/brasil/msdn/tecnologias/visualbasic_webform.asp

A plataforma .NET

Mas o que é afinal a plataforma .NET ? De forma resumida podemos dizer que a plataforma .NET é um ambiente de desenvolvimento
integrado com gerenciamento de dados e estrutura de servidores para Web. Em sua estrutura a arquitetura .NET é composta pelos
seguintes softwares e pacotes :

Softwares Pacotes
a. Sistema operacional; a. SQL Server 2000;
b. Enviroments; b. Host Integration Server 2000;
c. Services Framework; c. Commerce Server 2000;
d. Common Language Runtimes (CLR); d. Visual Studio.Net;
e. Aplicações (Assemblies). e. Exchange 2000.

Além disto a plataforma .NET é oferece os seguintes serviços:

file:///d|/geo_hp/livro_mac1.htm (1 of 85) [01/11/03 18:03:18]


Nova pagina 1
1-) .Net Framework - Ambiente em tempo de execução onde você pode construir , instalar e executar serviços Web e outras aplicações.

2-) ASP.Net - A versão atualizada do Active Server Pages composta pelo .NET Web Forms.

3-) Web Service .Net - Um serviço para permitir a comunicação com outros aplicativos , independente da plataforma usada .

4-) .Net Windows Form - Permite a criação de aplicativos dedicados para clientes Windows que usam o .Net Framework.

5-) ADO.Net - Fornece o suporte para tarefas que envolvam acesso a base de dados.

O .NET FrameWork

A MSDN (pelas próprias palavras da Microsoft) diz :

"O .NET FrameWork é um ambiente multi-linguagem para construção, distribuição e execução de aplicações e serviços Webs."

"O .NET FrameWork é uma nova plataforma desenhada para simplificar o desenvolvimento de aplicações voltadas para a
Internet."

"O .NET FrameWork é composta por dois componentes principais: o Common Language Runtime ( CRL ) e a livraria de classes NET
Framework."

Alguma dúvida ? Já deu para perceber que o .NET Framework é o coração do .NET e que as CRL fazem o papel das DLLs das API´s do Windows e dos
arquivos run-times do VB. Assim , ao gerar o seu executável com a VB.NET as livrarias CRL serão usadas em tempo de execução para ele possa funcionar e
assim não dependa das livrarias externas como ocorre hoje com o VB6 e anteriores.

O VB.NET

O Visual Basic.NET é uma hierarquia de classes que estão incluidas no .NET Framework sendo que a partir de agora o Visual Basic ( VB.NET ) é uma
linguagem orientada a objetos com herança , polimorfismo , encapsulamento , etc...

A versão atual do Visual Basic .NET é a versão que você encontra no Visual Studio.NET beta 2 e para poder usar você vai precisar ter os
seguintes requisitos :

Processador Pentium II ou compatível com 500 Mhz


Memória RAM 128 Mb (256 Mb é recomendável)
Espaço em disco No mínimo 2 Giga sobrando. Assim 1 Giga ficam por conta da instalação e o resto para o sistema.
Sistema operacional Windows 2000/Windows XP
Unidade de CD-ROM Unidade de CD-ROM/DVD
Acesso à internet Para instalar as correções (services packs) solicitados.

.NET Framework : introdução e classes importantes


file:///d|/geo_hp/livro_mac1.htm (2 of 85) [01/11/03 18:03:18]
Nova pagina 1

O que é o .NET Framework ? Começamos este artigo com uma pergunta. Uma pergunta que não é fácil responder. Vamos tentar neste artigo responder a
pergunta e ir um pouco mais além , dando uma pequena introdução as principais classes do .NET Framework.

"O .NET Framework é uma nova plataforma que simplifica o desenvolvimento de aplicações para o ambiente altamente distribuído da Web". Seus objetivos
principais são :

1. Fornecer um consistente ambiente de programação orientada a objetos.


2. Fornecer um ambiente de execução de código que minimize os conflitos de versionamento e empacotamento/disrtribuição.
3. Prover um ambiente de execução de código que garanta a execução segura do código , incluindo código criado por terceiros.
4. Prover um ambiente de execução de código que elimine os problemas de desempenho de ambientes interpretados ou de scripts.

Os dois principais componentes do .NET Framework são o CLR e a livraria de classes(Class library). O CLR gerencia a memória, as threads , a verificação da
segurança, a compilação e o código em tempo de execução e a livraria de classes é uma coleção de classes orientadas a objeto de tipos reutilizáveis
integradas com a CLR . O .NET Framework pode ser usado para criar os seguintes tipos de aplicações e serviços:

1. Aplicações do tipo Console


2. Baseadas em scripts
3. Windows Forms
4. ASP.NET
5. Windows Services
6. XML Web Services

O .NET Framework é então um poderoso ambiente de desenvolvimento que consiste de vários componentes e serviços combinados. É constituído de
milhares de classes (umas 6 mil) que provêm toda funcionalidade que antes você encontrava quer no Windows quer no Visual Basic.

Nota: Já deu para perceber que com tantas classes encontrar aquele classe que você precisa pode se tornar um martírio. Para facilitar a sua vida o .NET
Framework é organizado de forma hierárquica existem os espaços de nomes (Namespaces) que compõe e indicam uma determinada ramificação na
hierarquia. Nos namespaces a denominação para cada espaço de nome é composta de uma série de trechos separados por um ponto. Ex: O namespace
System.Data.SqlClient esta relacionado a System.Data mas não esta contido nele pois esta num nivel hierárquico superior.

No .NET Framework há dois nomes de nível mais elevado: System e Microsoft. Os espaço de nomes System estão disponíveis para usuários do VB .NET. O
espaço de nome Microsoft é especifico do Visual Studio .

O .NET Framework contém o CLR - Common Languague Runtime ; ele é responsável pela execução do código que você gerou no ambiente ; quer usando VB
.NET , ASP.NET ou outra linguagem .NET. Todas as linguagens são compiladas para a MSIL - Microsoft Intermediate Languague que em seguida é
convertido em código nativo durante sua primeira execução.(uma JVM - Java Virtual Machine da vida...).

Todas as linguagens com o suporte do CLR possuem o mesmo tipo de dados , com isto fica mais fácil a passagem de parâmetros entre as linguagens , você
não precisa fazer mais conversões nem malabarismos.

Podemos dizer então que o CLR é o coração do .NET Framework , e , apesar disto , ele trabalhar em oculto , sendo que a parte que aparece do .NET
Framework são as classes que usamos na nossa aplicação. Vejamos algumas das classes úteis do ambiente que você com certeza irá usar mais cedo ou mais
tarde.

Algumas classes importantes do .NET Framework

file:///d|/geo_hp/livro_mac1.htm (3 of 85) [01/11/03 18:03:18]


Nova pagina 1
1. Console - permite exibir e ler a partir da linha de comando usando uma janela DOS
2. Math - inclui diversos cálculos matemáticos.
3. Random - realiza a geração de números aleatórios
4. Environment - efetua a leitura e gravação nas variáveis de ambiente do sistema
5. Collections : ArrayList e SortedList - permite o tratamento de conjunto de itens

Nota: Para rodar o .NET Framework existem alguns pré-requisitos de hardware . Abaixo um resumo das plataforma que suportam o .NET Framework
tanto para o cliente como para o servidor:
Cenário Sistema Operacional
Cliente Microsoft® Windows® 98
Microsoft® Windows® 98 Second Edition
Microsoft® Windows® Millennium Edition
Microsoft® Windows NT® 4.0 Workstation com Service Pack 6.0a ou superior
Microsoft® Windows NT® 4.0 Server com Service Pack 6.0a ou superior
Microsoft® Windows® 2000 Professional
Microsoft® Windows® 2000 Server
Microsoft® Windows® 2000 Advanced Server
Microsoft® Windows® XP Home Edition
Microsoft® Windows® XP Professional

Nota: Em todos estes sistemas é requerido o Microsoft® Internet Explorer 5.01 ou


superior e Windows® Installer 2.0 ou superior

Servidor Microsoft® Windows® 2000 Professional com Service Pack 2.0


Microsoft® Windows® 2000 Server com Service Pack 2.0
Microsoft® Windows® 2000 Advanced Server com Service Pack 2.0
Microsoft® Windows® XP Professional

Para usar características adicionais como ASP.NET, COM+ services, e SQL Server .NET Data Provider, você vai precisar dos seguintes softwares:

cenário característica Software Necessário


Cliente SQL Server .NET Data Provider Microsoft Data Access Components (MDAC) 2.6
Acesso ao system management information Windows Management Instrumentation (WMI) (instalado com o SO no Windows 2000,
Windows Millennium Edition, e Windows XP)
COM+ services Windows 2000 Service Pack 2.0
Servidor SQL Server .NET Data Provider Microsoft Data Access Components (MDAC) 2.7
ASP.NET Microsoft Internet Information Services (IIS) 5.0

A classe Math
A classe Math fornece constantes e métodos estáticos ou compartilhados ( um método estático/compartilhado pode ser usado sem instanciar a classe Math)
para funções matemáticas relacionadas a trigonometria , logarítimos , etc.. Abaixo vou mostrar os mais importantes:

file:///d|/geo_hp/livro_mac1.htm (4 of 85) [01/11/03 18:03:18]


Nova pagina 1
Abs Retorna o valor absoluto do número (se for negativo retorna o valor positivo do número)
Cos Retorna o valor do coseno de um ângulo.
Exp Retorna o valor de e elevado a uma potência específica.
Log Retorna o logarítimo de um número.
Log10 Retorna o logarítimo na base 10 de um número.
Max Retorna o maior número entre dois números.
Min Retorna o menor número entre dois números.
Pow Retorna um número elevado a potência indicada.
Round Retorna o número mais próximo de um número.
Sign Retorna um valor que indica o sinal do número.
Sin Retorna o valor do seno de um ângulo.
Sqrt Retorna a raiz quadrada de um número.
Tan Retorna o valor da tangente de um ângulo.

Para ver como usar os métodos leia o artigo: Usando alguns métodos do namespace System.Math

A classe Console
Já usamos a classe console em artigos anteriores. Para inteirar-se leia os artigos:

1. Minha primeira aplicação VB.NET


2. VB .NET - Formatando a sainda do Console

Abaixo listamos alguns dos métodos básicos da classe console :

Método Descrição
Read Lê informações a partir da linha de comando.(Lê o próximo caractere)
Readline Lê informações a partir da linha de comando. Lê a próxima linha (todos os caracteres até encontrar o Enter) ( não o incluí)
Setin Altera a origem de entrada para Read e ReadLine.
SetError Altera o destino das mensagens de erro durante a execução do seu programa
SetOut Altera o destino dos métodos Write e Writeline.
Write Exibe informações na linha de comando.
Writline Exibe informações na linha de comando.(Termina com uma nova linha)

Abaixo temos um exemplo usando alguns dos métodos acima. Vamos explicar como ele funciona:

Podemos redirecionar a entrada , a saída ou as informações de erro do nosso programa para qualquer destino onde houver um TextReader ou TextWriter.No
exemplo abaixo iremos direcionar o resultado para um arquivo:

Nota : A classe TextReader representa um leitor que pode ler uma série sequêncial de caracteres. Como é uma classe abstrata não pode ser instânciada
diretamente; devemos criar uma classe derivada que herde as características e implemente os métodos da classe TextReader.

file:///d|/geo_hp/livro_mac1.htm (5 of 85) [01/11/03 18:03:18]


Nova pagina 1
Imports System
Imports System.IO

Module Module1

Private Const CONTADOR As Integer = 6

Public Sub Main()


Dim x As Integer
Dim Itens(CONTADOR) As String
Dim Arquivo As TextWriter = File.CreateText("Saida_Console.txt")
Dim Saida As TextWriter = Console.Out
Console.WriteLine("Insira {0} itens. Tecle ENTER entre cada item informado.", CONTADOR - 1)

For x = 0 To CONTADOR - 1
Itens(x) = Console.ReadLine
Next

Console.WriteLine()
Console.SetOut(Arquivo)
Console.WriteLine("Itens incluídos")

For x = 0 To CONTADOR - 1
Console.WriteLine(Itens(x))
Next

Arquivo.Close()
Console.SetOut(Saida)
Console.ReadLine()

End Sub

End Module

O código acima irá gerar o arquivo Saida_Console.txt com os dados inseridos via console pelo usuário.

A classe Environment
A classe Environment permite que você obtenha informações a respeito do ambiente onde os seus programas são executados ( sistema operacional
,variáveis de ambiente , configurações , etc..). Alguns de seus métodos e propriedades são descritos a seguir:

Membro Descrição
OSVersion Retorna informações a respeito do sistema operacional atual
Version Obtêm informações sobre a versão da aplicação
CurrentDirectory Retorna o caminho atual do diretório
CommandLine Retorna a linha de comandos completa que iniciou a aplicação
SystemDirectory Retorna o caminho do diretório do sistema.(Ex: \windows\system32 )

file:///d|/geo_hp/livro_mac1.htm (6 of 85) [01/11/03 18:03:18]


Nova pagina 1
GetlogicalDrivers Retorna uma lista das unidades disponíveis em um array.
GetEnvironmentVariable Retorna o valor de uma variável de ambiente específica.(Ex: comando Set , caminho :path , diretório temporário:temp)
GetCommandLineArgs Retorna os itens listados na linha de comando quando a aplicação foi iniciada.
Exit Encerra uma aplicação , retornando um código de erro(opcional)

A classe Random
A classe Random é usada para gerar números aleatórios (inteiros(Integer) , duplos(double), etc.) Seus métodos são :

Membro Descrição
Next Retorna um número entre 0 e o valor máximo possível para um inteiro ( algo em torno de 2 bilhões)
Next(ValorMaximo) Retorna um número entre 0 e o valor definido por ValorMaximo
Next(ValorMinimo, ValorMaximo) Retorna um inteiro entre os valores mínimo e máximo
NextDouble Retorna um tipo double entre 0 e 1

Para gerar números aleatórios entre 0 e 100 fazemos:

Dim oAleatorio As New Random

Dim valor As Integer = oAleatorio.Next(1,10)

As classes de conjuntos : ArrayList


O .NET Framework possui classes que estendem a classe array. Estas classes permitem o gerenciamento de uma lista de informações (como nos arrays) mas
possuem mais recursos que facilitam tarefas como ordenação , incluir e recuperar itens da lista. Estas classes geralmente se encontram no namespace
System.Collections. Vamos ver a classe ArrayList:

ArrayList é um conjunto parecido com um array , tem a seu favor uma maior facilidade no tratamento dos elementos e a permissão de armazenar qualquer
tipo de dados (até objetos). Geralmente você usa esta classe quando precisa tratar uma lista de itens dinâmica e não tem uma noção de até onde o conjunto
vai crescer.

Para criar um instância da classe ArrayList podemos fazer assim :

Dim arrLista as New ArrayList(20) - cria um arraylist

Instalando o Visual Studio.NET


Insira o CD 1 do Visual Studio.NET no seu drive de CD-ROM . Na tela a seguir clique em Windows Component Update para atualizar o seu sistema.

file:///d|/geo_hp/livro_mac1.htm (7 of 85) [01/11/03 18:03:18]


Nova pagina 1

Depois é só selecionar os passos 2 e 3 para instalar o Visual Studio .NET (incluindo o Visual Basic.NET) no seu sistema. Acabada a instalação você terá
o Visual Basic .NET instalado da versão Beta 2 do Visual Studio .NET. Veja bem a versão final ainda não saiu , está prevista para janeiro ou fevereiro de 2002
e , por isso mesmo , pode haver , a esta altura, pequenas alterações.

Por falar em alterações , antes de pôr a mão na massa , você precisa saber que :

- No Visual Basic .NET só existe um único tipo de arquivo de código que tem a extensão .vb . Neste arquivo coexistem todos os outros tipos de arquivos :
módulos de classe, formulários , módulo de código , controles , etc.

- O Visual Basic .NET pode criar dois tipos de arquivos executáveis:

● Arquivos de Console , ao estilo do MS DOS , não gráficos


● Arquivos Gráficos , ao estilo Windows

- O Visual Basic .NET pode criar outros tipos de aplicações tais como : ASP .NET , Web Services , serviços Windows , Console Application , etc..

- Programas gerados pela compilação no VB.NET podem gerar um pacote de instalação de 40 a 50 MB , devido aos arquivos de run-time necessários.
file:///d|/geo_hp/livro_mac1.htm (8 of 85) [01/11/03 18:03:18]
Nova pagina 1

- Programas compilados com o VB.NET pode ser decompilados para se obter o código fonte.

Representando graficamente, abaixo temos o conteúdo dos serviços que você pode gerar com o Visual Studio .NET :

VB.NET - Instalação e características


Afinal como conseguir e instalar o Visual Basic .NET ?

Você pode obter instalar o VB.NET de duas formas:

● Como parte do Visual Studio .NET - uma suíte de ferramentas e linguagens que além do VB.NET também incluí a linguagem C# ( C-sharp) e Visual
C++ .NET ( por enquanto)
● Na edição padrão - Standard Edition - a qual inclui um conjunto mais limitado de ferramentas.

Em ambos os casos você poderá criar suas próprias aplicações para a plataforma Windows. A instalação não é muito complexa , você só vai ter que por e
tirar os CD´s e seguir as orientações dos assistentes de instalação.

A seguir vou dar um resumo ( sem exibir as telas ) dos passos da instalação do Visual Basic .NET via instalação do Visual Studio .NET(daqui pra frente
apenas VS NET):

1. Após inserir o CD #1 no seu CD-ROM após alguns instantes a tela de Setup do VS .NET irá surgir. Se isto não ocorrer você vai ter que executar o
arquivo setupe.exe manualmente a partir da raiz do CD.
2. A tela de Setup do VS .NET irá apresentar as três etapas que será seguida nesta fase de instalação.
1. Windows Component Update
2. Visual Studio .NET
3. Service Releases
file:///d|/geo_hp/livro_mac1.htm (9 of 85) [01/11/03 18:03:18]
Nova pagina 1

Para funcionar de forma correta o VS .NET precisa que diversos componentes e atualizações estejam instalados em sua máquina. Por isto você deverá
clicar no item 1 - Windows Component Update. A seguir será solicitado que você insira o CD - Component Update
3. O programa de instalação irá então examinar seu sistema para ver exatamente quais componentes terão que ser instalados. Dependendo do estado
atual da sua máquina , a lista pode incluir os seguintes itens:
● Windows NT 4.0 Service Pack 6.0a
● Windows 2000 Service Pack 2
● Windows Installer 2.0
● Windows Management Infrastructure
● FrontPage 2000 Web Extensions
● FrontPage 2000 Server Extensions
● Setup RunTime Files
● Internet Explorer 6.0 and Internet Tools
● Microsoft Data Access Components 2.7
● .NET Framework
4. Click em - Install Now - e você deverá dar vários boots na sua máquina para a instalação e atualização de cada componente. Após a instalação cada
componente aparecerá com um checkbox marcado indicando que o componente já foi instalado.
5. Após instalar todos os componentes necessários e atualizar o seu sistema você retornará a janela de Setup do VS .NET . Clique então no item 2 -
Visual Studio .NET para iniciar a instalação do VS .NET.
6. A seguir será apresentada a você uma lista com opções de componentes que você deseja instalar.
7. O VS .NET possui toda a documentação que você pode instalar ou consultar a partir do CD. O padrão é deixar a documentação no CD .Se Você deseja
instalar toda a documentação vai precisar de muito espaço livre no seu HD. Abaixo uma relação dos arquivos e o espaço ocupado:

Espaço em disco necessário


Documentação presente nos CD
Para Consultar Documentos no CD Para Documentos instalados no HD
Documentação do Visual Basic 0,02 MB 5,93 MB
Documentação do Visual C # 0,01 MB 1,48 MB
Documentação do Visual C ++ 0,04 MB 22,84 MB
Documentação do .NET Framework 0,02 MB 39,70 MB
Documentação da plataforma SDK 0,31 MB 137,21 MB
Documentação adicional MSDN 0,17 MB 467,99 MB
Documentação das Ferramentas do VS 0,05 MB 11,22 MB
Documentação do Visual Studio 0,03 MB 9,90 MB
Artigos da Knowledge Base 0,014 MB 114,30 MB

8. Após terminar a instalação a janela com a mensagem - Setup is complete - irá surgir , e , nela você poderá verificar os erros que ocorreram durante a
instalação. Poderá também consultar o arquivo de log da instalação.
9. Para encerrar você retornar a tela inicial com o terceiro item habilitado - 3 - Service Release - nele você poderá proceder a atualização de algum
componente instalado pelo seu CD de instalação.

Os componentes , linguagens presentes e características após a instalação são :

Linguagens : Visual Basic .NET , Visual C# .NET e Visual C++ .NET

Componentes : Microsoft Development Environment , Microsoft SQL Server Desktop Engine - MSDE

Plataformas nas quais você pode rodar o VS .NET : Windows 2000 , XP , NT


file:///d|/geo_hp/livro_mac1.htm (10 of 85) [01/11/03 18:03:18]
Nova pagina 1

Plataformas que podem rodar aplicações feitas no VS .NET : Windows 98 e versões superiores do Windows.

O .NET framework define o ambiente que você irá usar para executar as aplicações feitas no Visual Basic .NET. Abaixo uma visão geral do .NET Framework
através de um esquema:

- AS aplicações .NET não acessam diretamente o Sistema operacional ou o hardware do computador.


Para isto ele usa os serviços da .NET Framework

- A .NET Framework consiste de dois componentes principais : .NET Framework Class Library e
Common Language Runtime

- .NET Framework Class Library fornece codigo pré-escrito na forma de classes que estão
disponíveis para todas as linguagens .NET

- A Common Language Runtime , ou CLR , é a base do .NET Framework. Ela gerencia a execução
dos programas .NET coordenando funções como gerenciamento de memória , execução do código ,
segurança e outros serviços.

- A Common Type System é um componente da CLR que verifica se todos as aplicações .NET usam o
mesmo tipo de dados sem considerar a linguagem na qual foi desenvolvida.

Apertem os cintos , o Visual Basic Sumiu !!!


Não estou querendo assustar ninguém , apenas ser realista ; Se você pretende utilizar o novo Visual Basic.NET, prepare-se para rever os seus conceitos e
para estudar e estudar , e codificar e codificar , pois neste caso a curva de aprendizagem não será nada suave. E isto será tão mais real quanto mais
procedural for a sua utilização e o seu entendimento da linguagem conhecida até então como Visual Basic 6.0.

Pensa que eu estou brincando ??? Então senta que la vem chumbo grosso ...

a. - Embora possua um assistente de migração , estima-se que apenas 40% dos projetos feitos na versão 6.0 do VB consigam uma migração parcial.
Quer migrar projetos grandes e complexos ?? Ou você quer perder o emprego ou ficou louco !!! é melhor reescrever tudo na nova plataforma.
b. - Sua aplicação utiliza muitos controles OLE ?? Então , dançou , o VB.NET não suporta mais OLE.
c. - Voce usa e abusa dos métodos DDE ?? Lamento , no VB.NET o método de comunicação é totalmente diferente.
d. - Seu sistema usa controles do - Windows Common Controls - ou usa o Data Bound Grid do VB 5 ??? Infelizmente nada disso existe no VB.NET.
e. - Gosta de usar controles vinculados DAO ou RDO ? Chiii... O VB.NET não dá suporte para conexão a base de dados via DAO ou RDO no modo
vinculado.
f. - Aplicações DHTM ou aplicações Web ??? Nem pensar ! não há equivalentes no VB.NET.
g. - Programas Gráficos ??? O VB.NET não oferece suporte aos métodos gráficos dos forms nem aos controles Line e Shape...
h. - Usando muitas API´s ??? O VB.NET exige uma revisão geral das suas chamadas API´s para evitar supresas desagradáveis...
i. Agora uma 'PEQUENA' relação do que NÃO É MAIS SUPORTADO PELO VB.NET

file:///d|/geo_hp/livro_mac1.htm (11 of 85) [01/11/03 18:03:18]


Nova pagina 1
● Variants , Currency , Empty , Null , Let , Time , TooTipText
● Vartype, Option Base , Lset , Rset , MsgBox , DoEvents , Date
● Sqr , Sgn , Atn , Circle , Cls , Line , Pset , Point , Scale , PrintForm
● IsEmpty , IsNull , IsObject , Image , Shape , DDE , Erl , On/Gosub , On/Goto
● Longs agora são 64 bits e não mais 32 bits
● Listbox não possui mais a propriedade ItemData nem NewIndex

Prepare-se para aprender : (Estarei aqui com muitos artigos sobre o assunto... )

● - Programação orientada a objetos - POO -


● - Herança - é a capacidade de definir classes que servem como base para construção de outras classes . Uma classe pode ser construida com base em
outra classe herando suas propriedades e métodos podendo ainda extender suas funcionalidades.
● - Overloading - (Sobrecarga) - Usando Overloading podemos definir propriedades , métodos ou procedimentos com um mesmo nome , mas usando
tipos de dados diferentes.
● - Overriding - (Sobreposição) - Faz com que um objeto derivado sobreponha as características que ele herdou do objeto a partir do qual foi derivado.
● - Interfaces - Contém as declarações de propriedades e métodos das classes sem apresentar o código de implementação.
● - Delegates - São objetos que podem chamar os métodos de outros objetos em seu nome
● - Assemblies - São as DLLs gerenciadas que possuem toda a funcionalidade da plataforma .NET. è o arquivo físico onde estão contidas os namespaces.
● - Namespaces - São nomes de espaços dentro de uma assembly.
● - Free Threading - Permite executar múltiplos processos paralelos independentemente em threads separadas.
● - Web forms e Web Services - Com a ASP.NET podemos desenvolver aplicativos para internet de modo rápido e intuitivo.
● - O novo ambiente , novas regras , novos comportamentos , nova metodologia , novos conceitos...

Quer um exemplo prático com código palpável ??? Então lá vai...

O VB.NET apresenta como novidade a nível de escopo de variáveis o conceito de escopo de bloco.
O que quer dizer isto ???
Bem , isto quer dizer que se você declarar uma variável dentro de um bloco ela estará disponível somente dentro daquele bloco. Entendeu ???
Veja abaixo o exemplo:

Do
Dim nSoma As long
nSoma = nSoma + 1
Loop until nSoma < 100
Msgbox (nSoma) <<== vai ocorrer um erro nesta linha pois nSoma não é visivel fora do bloco Do/Loop
...

Aqui nSoma foi declarada dentro do bloco Do/Loop e é somente visível dentro deste bloco ; se você referenciara variável fora do bloco vai ocorrer um erro.

No VB6 não existe este conceito , ao declarar uma variável dentro de um bloco não afeta o seu escopo.
Voce pode acessar a variável fora do bloco se problemas:

Do
Dim nSoma As long
nSoma = nSoma + 1
Loop until nSoma < 100
Msgbox (nSoma)
...
file:///d|/geo_hp/livro_mac1.htm (12 of 85) [01/11/03 18:03:18]
Nova pagina 1

O código acima , feito no VB6 , vai ser executado sem problemas.

Para você não ter este problema declare as variáveis fora dos laços : Loops Do, For , While e das instruções Select, If , e desenvolva outro bloco.

Dez dicas para começar bem com o VB .NET


Se você esta querendo aprender VB .NET mas não sabe por onde começar ou tem receio do que pode encontrar pela frente neste artigo eu vou procurar dar
algumas orientações básicas para que você possa se orientar na sua jornada inicial pela plataforma .NET , mais especificamente : VB .NET.

Como cada caso é um caso peculiar e cada pessoa tem sua própria curva de aprendizado vou procurar apontar recomendações genéricas que sirvam tanto
para quem já tem experiência na linguagem Visual Basic como para quem esta começando agora.

1- Se você já tem alguma experiência com Visual Basic e pretende aprender VB .NET foque seu objetivo nisto: Aprender só VB .NET.

Como você já possui algum conhecimento de Visual Basic já começa com vantagem o processo de aprendizagem. Nada de querer aprender C# junto com o
VB .NET , você poderá se sentir frustrado e confuso com o aprendizado do C#. Depois que você tiver uma boa base de VB .NET aprender C# será mais fácil.

2- Não tente aprender Windows Forms e Web Forms ao mesmo tempo.

Se você não tem experiência comece com o mais simples : Windows Forms. Se já tiver experiência faça sua escolha de acordo com sua necessidade de
utilização mais imediata. Mas atenção : um de cada vez.

3- Não tente criar aplicações logo de cara. Vá com calma.

Primeiro familiarize-se com os conceitos da plataforma .NET , com os conceitos da linguagem VB .NET. Não gaste seu tempo tentando criar aplicações sem
ter uma base de conhecimento da plataforma ou uma visão geral do funcionamento da linguagem VB .NET.

4- Faça uma auto-crítica : Se você não têm uma boa base de conhecimento em programação orientada a objetos. Começa agora.

A plataforma .NET é baseada em objetos e classes. Na verdade a plataforma .NET possui quase 2000 classes que irão funcionar como blocos lógicos que
servirão para construir sua aplicação. Você vai precisar de um bom conhecimento de orientação a objeto para compreender as classes e de como utilizá-las.

5- Tenha uma compreensão exata do que é e do que constitui a tecnologia .NET.

Você deve estudar bem a CLR - Common Language Runtime e as livrarias de classes .NET . O seu conhecimento sobre estes tópicos irão afetar diretamente
o modo como você vai construir sua aplicações quer em tempo de desenvolvimento , em segurança , em bugs e em memória usada por elas.

6- Procure consultar a Ajuda da plataforma .NET. Familiarize-se com os conceitos e sempre consulta a ajuda para qualquer dúvida.

7- Se você pretende criar aplicações com acesso a dados estude bem a ADO .NET.

Estude as classes ADO .NET ; perceba as diferenças entre ADO e ADO.NET. Perceba as novas características da ADO .NET. Não tente programar o acesso a
dados com ADO .NET baseado apenas na sua experiência com ADO : você vai se dar mal.

file:///d|/geo_hp/livro_mac1.htm (13 of 85) [01/11/03 18:03:18]


Nova pagina 1

8- Comece com aplicações simples : Modele , desenvolva , teste e distribua pequenas aplicações primeiro.

9- Migre primeiro projetos simples feitos em VB6 para VB .NET. Não confie no assistente de conversão ele não faz uma conversão 100%.

Se você tem uma aplicação complexa feita em VB6 e esta considerando migrar para VB.NET eu não aconselho você a fazer isto logo de cara. Se você quer
perder o emprego o problema é seu mas seja sensato e veja como se comporta a conversão de uma pequena aplicação e a partir dai tire suas conclusões.

10- Procure ter uma boa base de XML.

A XML é intensamente usada em toda a plataforma .NET. Se você não sabe nem o que quer disser XML é um mau sinal. Procure se atualizar sobre a
tecnologia XML.

Migrando minha primeira aplicação VB6 para o VB.NET


Se até agora você esta contente com o Visual Basic 6.0 , e , como quem esta confortavelmente instalado , observa toda a movimentação com a chegada da
plataforma VB.NET como quem não quer nada com o 'peixe' ; ou , se você está com pensamentos do tipo : 'vou deixar a poeira assentar para começar a me
mexer...' , acho melhor você por as 'barbas de molho' ...

Não que eu esteja te 'cutucando' para que você abandone o VB6 e passe usar o VB.NET como sua plataforma de desenvolvimento a partir de hoje , nada
disto !! , mas é bom você sair um pouco desta letargia e , como alguém que não quer nada , procurar se atualizar e conhecer tudo sobre a plataforma .NET
(principalmente o VB.NET)

Você sabia que o Visual Studio .NET possui um assistente de migração para o VB.NET que ajuda a migrar aplicações desenvolvidas em versões anteriores do
Visual Basic ( melhor dizer a partir da versão 6.0) para o VB.NET ? Estou falando do : Visual Basic Upgrade Wizard.

Neste artigo eu vou mostrar como podemos usar este assistente para nos ajudar a migrar uma aplicação feita no Visual Basic 6.0 para o VB.NET. Primeiro eu
vou criar uma aplicação simples no VB 6.0 e depois vamos ver como podemos fazer a migração usando o assistente e todas as implicações que isto vai nos
trazer...

Criando uma aplicação simples no Visual Basic 6.0

Vamos criar uma aplicação simples no VB 6.0 . Ela terá apenas dois formulários ; em um formulário vamos exibir os dados do banco de dados
Northwind.mdb , tabela produtos , em um controle - Microsoft Hierarchical Flexgrid e no outro vamos usar o Clipboard (área de transferência) do
windows.

1- Inicie no Visual Basic 6.0 um projeto do tipo Standard.EXE e altere o nome do formulário padrão para frmVB6_ADO

2- No menu Project opção Components... inclua uma referência a - Microsoft Hierarchical FlexGrid Control 6.0 e na opção References... inclua a
referência a - Microsoft Activex Data Object 2.X .

3- A seguir insira o controle MSHFlexGrid - MSHFlexgrid1 - no formulário e insira também um botão de comando - command1 - com a propriedade Caption
definida como - &OK . Veja abaixo :

file:///d|/geo_hp/livro_mac1.htm (14 of 85) [01/11/03 18:03:18]


Nova pagina 1

Private Sub Form_Load()


Dim cn As Connection
Dim rs As Recordset

Set cn = New ADODB.Connection


cn.ConnectionString = "Provider = _ & Microsoft.Jet.OLEDB.4.0;Data _ &
Source=C:\teste\Nwind_2.mdb"
cn.Open

Set rs = New ADODB.Recordset


rs.CursorLocation = adUseClient
rs.Open "Select * from produtos", cn

Set MSHFlexGrid1.DataSource = rs

End Sub

O código ao lado da figura usa uma conexão ADO para abrir o banco de dados Nwind_2.mdb , e exibir todos os campos da tabela Produtos. Fazemos isto
atribuindo á propriedade DataSource do controle MSHFlexgrid a instrução SQL.

Ao executar a aplicação iremos ter a janela ao lado exibindo todos os


registros da tabela Produtos.

Não nos preocupamos em configurar a exibição dos dados pois nosso foco
será a migração para o VB.NET

Vamos agora incluir no novo formulário ao nosso projeto ; selecione a opção Project -> Add Form - Form; altere a seguir o nome do formulário para
frmClipboard .

Insira uma caixa de texto no formulário e na propriedade Text informe - Minha primeira aplicação migrada para VB.NET.

Agora insira dois botões de comando e altere a propriedade Caption para de command1 para &Copiar e de command2 - para &Colar.. Veja o layout
abaixo:

file:///d|/geo_hp/livro_mac1.htm (15 of 85) [01/11/03 18:03:18]


Nova pagina 1

Private Sub Command1_Click()


Clipboard.SetText Text1.SelText
End Sub

Private Sub Command2_Click()


Text1.SelText = Clipboard.GetText
End Sub

O código ao lado da figura representa a ação de cada evento Click dos botões de comando. No botão command1 copiamos o texto da caixa de texto -
text1.text para o ClipBoard ; no botão de command2 - Colamos o valor copiado para a caixa de texto - text1.text.

Migrando sua aplicação para o VB.NET

Já temos nossa aplicação pronta no VB 6.0 . Vamos migrar a dita cuja para o VB.NET ? Bem , vamos tentar...

Luzes , camara , ação .... :

1. Inicie o Microsoft Visual Studio .NET


2. Clique na opção - Open Project - e selecione o projeto anterior criado no VB 6.0
3. O VB.NET percebe que o projeto pertence a uma versão anterior e inicia assistente de migração - Upgrade Wizard - Nesta tela o assistente apenas
dá informações sobre a tarefa que irá realizar:
I. Criar um novo projeto a partir da sua versão anterior do VB.
II. Copiar os formulários e classes para o novo projeto
III. Criar um relatório de atualização que irá compor o novo projeto

file:///d|/geo_hp/livro_mac1.htm (16 of 85) [01/11/03 18:03:18]


Nova pagina 1

4. Clique no botão Next . A tela abaixo irá surgir ; nela você deverá escolher um tipo de aplicação a ser convertida : EXE ou DLL , e , definir algumas
opções (geralmente o Wizard faz isto para você)

file:///d|/geo_hp/livro_mac1.htm (17 of 85) [01/11/03 18:03:18]


Nova pagina 1

6. Clique no botão - Next . Na tela a seguir você deve informar o local onde deseja criar o seu novo projeto. Por padrão o Assistente usa o diretório com
o nome do seu projeto e a extensão .NET.(perceba que o Wizard sugere o nome do projeto que será migrado)

file:///d|/geo_hp/livro_mac1.htm (18 of 85) [01/11/03 18:03:18]


Nova pagina 1

7. A próxima tela informa que tudo esta pronto para começar a migração. Clique em - Next

8. O Assistente de migração começa a realizar a migração informando o tempo estimado.(Deve demorar de 30 a 60 segundos dependendo do tamanho
do projeto)

8. Ao terminar , o Assistente de migração deverá ter concluído as seguintes tarefas:

● Criar um novo projeto para a versão .NET a partir da versão do VB 6


● Copiar os arquivos de formulário e de classes para o novo projeto
file:///d|/geo_hp/livro_mac1.htm (19 of 85) [01/11/03 18:03:18]
Nova pagina 1
● Gerar um relatório que indica os componentes do projeto que foram migrados com sucesso e os componentes que não conseguiram ser
migrados

Vamos dar uma olhada no novo projeto ? Curioso hein ??? No Solution Explorer veremos os
arquivos gerados pelo Assistente : os formulários e um arquivo htm chamado :
_UpgradeReport.htm.

Clique duas vezes sobre o arquivo : _UpgradeReport.htm

Como resultado teremos a tela exibida abaixo ; nela temos oresultado da nossa migração , uma lista detalhada de todos os problemas encontrados na
migração. Perceba que o houve problemas na migração do formulário frmclipboard . O relatório apresenta um resumo da atualização de todos os artigos do
projeto . As colunas exibidas são :

● New Filename : O novo nome que foi dado ao arquivo após a conversão.
● Original Filename : O nome original do arquivo antes da conversão.
● File Type : O tipo do arquivo : ( formulário , Módulo de classe , Módulo...)
● Status : Indica o status do arquivo durante a migração . Se houve erros ou não.
● Errors : O número de erros gerados durante a atualização do arquivo para a nova versão.
● Warnings : O número de avisos gerados durante a migração do arquivo.
● Total Issues : Total dos problemas encontrados durante a conversão.

file:///d|/geo_hp/livro_mac1.htm (20 of 85) [01/11/03 18:03:18]


Nova pagina 1

Vamos expandir o item - frmclipboard - (Clique no sinal de + ). Veja o comentário indicando que os comandos Clipboard.SetText e Clipboard.GetText não
foram migrados.

O relatório acima indica os arquivos que apresentaram problemas durante a migração. Vejamos o significado de cada coluna :

I. # : indica o número do problema


II. Severity : indica a gravidade do problema ocorrido.
III. Location : O local onde se encontra o problema ( evento , função , procedure, ..)
file:///d|/geo_hp/livro_mac1.htm (21 of 85) [01/11/03 18:03:18]
Nova pagina 1
IV. Object Type : O tipo do objeto onde o problema ocorreu.
V. Object Name : O nome do objeto que contém o projeto.
VI. Property : Propriedade do objeto que apresenta o problema.
VII. Description : A descrição do problema , com um link para a MSDN detalhando o ocorrido.

Percebeu que todos os formulário mantiveram o mesmo nome que usaram na versão anterior ; somente a extensão foi alterada de .frm para .vb

Voltando a janela Solution Explorer expanda o item - References.

Perceba que todos os componentes necessários para a migração ,tanto Visual


Basic como ADO , foram incluídos automaticamente.

Vamos clicar duas vezes sobre o formulário frmvb6_ado.vb e clique em


View Code. A seguir expanda a região - Upgrade Support.
file:///d|/geo_hp/livro_mac1.htm (22 of 85) [01/11/03 18:03:18]
Nova pagina 1

Esta região mostra como o Visual Studio.NET configura várias propriedades e


variáveis para suportar o código migrado.

Se fizermos o mesmo para o formulário frmclipboard.vb veremos que assistente inclui um comentário no código que não conseguir migrar.

Vejamos a seguir o código completo para o formulário frmvb6_ado.vbp:

file:///d|/geo_hp/livro_mac1.htm (23 of 85) [01/11/03 18:03:18]


Nova pagina 1
Option Strict Off
Option Explicit On
Friend Class Form1
Inherits System.Windows.Forms.Form
#Region "Windows Form Designer generated code "
Public Sub New()
MyBase.New()
If m_vb6FormDefInstance Is Nothing Then
If m_InitializingDefInstance Then
m_vb6FormDefInstance = Me
Else
Try
'For the start-up form, the first instance created is the default instance.
If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint.DeclaringType Is Me.GetType Then
m_vb6FormDefInstance = Me
End If
Catch
End Try
End If
End If
'This call is required by the Windows Form Designer.
InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean)
If Disposing Then
If Not components Is Nothing Then
components.Dispose()
End If
End If
MyBase.Dispose(Disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.Container
Public ToolTip1 As System.Windows.Forms.ToolTip
Public WithEvents Command2 As System.Windows.Forms.Button
Public WithEvents Command1 As System.Windows.Forms.Button
Public WithEvents MSHFlexGrid1 As AxMSHierarchicalFlexGridLib.AxMSHFlexGrid
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
Me.components = New System.ComponentModel.Container()
Me.ToolTip1 = New System.Windows.Forms.ToolTip(components)
Me.ToolTip1.Active = True
Me.Command2 = New System.Windows.Forms.Button
Me.Command1 = New System.Windows.Forms.Button
Me.MSHFlexGrid1 = New AxMSHierarchicalFlexGridLib.AxMSHFlexGrid
CType(Me.MSHFlexGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.Text = "VB6 ADO "
file:///d|/geo_hp/livro_mac1.htm (24 of 85) [01/11/03 18:03:18]
Nova pagina 1
Me.ClientSize = New System.Drawing.Size(414, 250)
Me.Location = New System.Drawing.Point(4, 30)
Me.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation
Me.Font = New System.Drawing.Font("Arial", 8!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackColor = System.Drawing.SystemColors.Control
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable
Me.ControlBox = True
Me.Enabled = True
Me.KeyPreview = False
Me.MaximizeBox = True
Me.MinimizeBox = True
Me.Cursor = System.Windows.Forms.Cursors.Default
Me.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.ShowInTaskbar = True
Me.HelpButton = False
Me.WindowState = System.Windows.Forms.FormWindowState.Normal
Me.Name = "Form1"
Me.Command2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Command2.Text = "&Copiar/Colar"
Me.Command2.Size = New System.Drawing.Size(73, 17)
Me.Command2.Location = New System.Drawing.Point(8, 232)
Me.Command2.TabIndex = 2
Me.Command2.BackColor = System.Drawing.SystemColors.Control
Me.Command2.CausesValidation = True
Me.Command2.Enabled = True
Me.Command2.Cursor = System.Windows.Forms.Cursors.Default
Me.Command2.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Command2.TabStop = True
Me.Command2.Name = "Command2"
Me.Command1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Command1.Text = "&OK"
Me.Command1.Size = New System.Drawing.Size(65, 17)
Me.Command1.Location = New System.Drawing.Point(344, 232)
Me.Command1.TabIndex = 1
Me.Command1.BackColor = System.Drawing.SystemColors.Control
Me.Command1.CausesValidation = True
Me.Command1.Enabled = True
Me.Command1.Cursor = System.Windows.Forms.Cursors.Default
Me.Command1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Command1.TabStop = True
Me.Command1.Name = "Command1"
MSHFlexGrid1.OcxState = CType(resources.GetObject("MSHFlexGrid1.OcxState"), System.Windows.Forms.AxHost.State)
Me.MSHFlexGrid1.Size = New System.Drawing.Size(401, 217)
Me.MSHFlexGrid1.Location = New System.Drawing.Point(8, 8)
Me.MSHFlexGrid1.TabIndex = 0
Me.MSHFlexGrid1.Name = "MSHFlexGrid1"
Me.Controls.Add(Command2)
Me.Controls.Add(Command1)
Me.Controls.Add(MSHFlexGrid1)
CType(Me.MSHFlexGrid1, System.ComponentModel.ISupportInitialize).EndInit()

file:///d|/geo_hp/livro_mac1.htm (25 of 85) [01/11/03 18:03:18]


Nova pagina 1
End Sub
#End Region
#Region "Upgrade Support "
Private Shared m_vb6FormDefInstance As Form1
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As Form1
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
m_InitializingDefInstance = True
m_vb6FormDefInstance = New Form1()
m_InitializingDefInstance = False
End If
DefInstance = m_vb6FormDefInstance
End Get
Set
m_vb6FormDefInstance = Value
End Set
End Property
#End Region
Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
Me.Close()
End Sub

Private Sub Command2_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command2.Click
Form2.DefInstance.ShowDialog()
End Sub

Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

cn = New ADODB.Connection
cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=C:\teste\Nwind_2.mdb"
cn.Open()

rs = New ADODB.Recordset
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
rs.Open("Select * from produtos", cn)

MSHFlexGrid1.DataSource = rs

End Sub
End Class

Agora o código para o formulário frmclipboard.vb :

file:///d|/geo_hp/livro_mac1.htm (26 of 85) [01/11/03 18:03:18]


Nova pagina 1
Option Strict Off
Option Explicit On
Friend Class Form2
Inherits System.Windows.Forms.Form
#Region "Windows Form Designer generated code "
Public Sub New()
MyBase.New()
If m_vb6FormDefInstance Is Nothing Then
If m_InitializingDefInstance Then
m_vb6FormDefInstance = Me
Else
Try
'For the start-up form, the first instance created is the default instance.
If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint.DeclaringType Is Me.GetType Then
m_vb6FormDefInstance = Me
End If
Catch
End Try
End If
End If
'This call is required by the Windows Form Designer.
InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean)
If Disposing Then
If Not components Is Nothing Then
components.Dispose()
End If
End If
MyBase.Dispose(Disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.Container
Public ToolTip1 As System.Windows.Forms.ToolTip
Public WithEvents Command2 As System.Windows.Forms.Button
Public WithEvents Command1 As System.Windows.Forms.Button
Public WithEvents Text1 As System.Windows.Forms.TextBox
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.ToolTip1 = New System.Windows.Forms.ToolTip(components)
Me.ToolTip1.Active = True
Me.Command2 = New System.Windows.Forms.Button
Me.Command1 = New System.Windows.Forms.Button
Me.Text1 = New System.Windows.Forms.TextBox
Me.Text = "VB6 - ClipBoard"
Me.ClientSize = New System.Drawing.Size(312, 120)
Me.Location = New System.Drawing.Point(4, 30)
file:///d|/geo_hp/livro_mac1.htm (27 of 85) [01/11/03 18:03:18]
Nova pagina 1
Me.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackColor = System.Drawing.SystemColors.Control
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable
Me.ControlBox = True
Me.Enabled = True
Me.KeyPreview = False
Me.MaximizeBox = True
Me.MinimizeBox = True
Me.Cursor = System.Windows.Forms.Cursors.Default
Me.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.ShowInTaskbar = True
Me.HelpButton = False
Me.WindowState = System.Windows.Forms.FormWindowState.Normal
Me.Name = "Form2"
Me.Command2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Command2.Text = "&Colar"
Me.Command2.Size = New System.Drawing.Size(89, 25)
Me.Command2.Location = New System.Drawing.Point(168, 64)
Me.Command2.TabIndex = 2
Me.Command2.BackColor = System.Drawing.SystemColors.Control
Me.Command2.CausesValidation = True
Me.Command2.Enabled = True
Me.Command2.Cursor = System.Windows.Forms.Cursors.Default
Me.Command2.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Command2.TabStop = True
Me.Command2.Name = "Command2"
Me.Command1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Command1.Text = "&Copiar"
Me.Command1.Size = New System.Drawing.Size(97, 25)
Me.Command1.Location = New System.Drawing.Point(48, 64)
Me.Command1.TabIndex = 1
Me.Command1.BackColor = System.Drawing.SystemColors.Control
Me.Command1.CausesValidation = True
Me.Command1.Enabled = True
Me.Command1.Cursor = System.Windows.Forms.Cursors.Default
Me.Command1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Command1.TabStop = True
Me.Command1.Name = "Command1"
Me.Text1.AutoSize = False
Me.Text1.Size = New System.Drawing.Size(233, 25)
Me.Text1.Location = New System.Drawing.Point(40, 32)
Me.Text1.TabIndex = 0
Me.Text1.Text = "Minha primeira aplicação migrada para VB.NET"
Me.Text1.AcceptsReturn = True
Me.Text1.TextAlign = System.Windows.Forms.HorizontalAlignment.Left
Me.Text1.BackColor = System.Drawing.SystemColors.Window
Me.Text1.CausesValidation = True
Me.Text1.Enabled = True
Me.Text1.ForeColor = System.Drawing.SystemColors.WindowText
Me.Text1.HideSelection = True

file:///d|/geo_hp/livro_mac1.htm (28 of 85) [01/11/03 18:03:18]


Nova pagina 1
Me.Text1.ReadOnly = False
Me.Text1.Maxlength = 0
Me.Text1.Cursor = System.Windows.Forms.Cursors.IBeam
Me.Text1.MultiLine = False
Me.Text1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Text1.ScrollBars = System.Windows.Forms.ScrollBars.None
Me.Text1.TabStop = True
Me.Text1.Visible = True
Me.Text1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.Text1.Name = "Text1"
Me.Controls.Add(Command2)
Me.Controls.Add(Command1)
Me.Controls.Add(Text1)
End Sub
#End Region
#Region "Upgrade Support "
Private Shared m_vb6FormDefInstance As Form2
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As Form2
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
m_InitializingDefInstance = True
m_vb6FormDefInstance = New Form2()
m_InitializingDefInstance = False
End If
DefInstance = m_vb6FormDefInstance
End Get
Set
m_vb6FormDefInstance = Value
End Set
End Property
#End Region
Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles
Command1.Click
'UPGRADE_ISSUE: Clipboard method Clipboard.SetText was not upgraded. Click for more: ms-
help://MS.MSDNVS/vbcon/html/vbup2069.htm
Clipboard.SetText(Text1.SelectedText)
End Sub
Private Sub Command2_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles
Command2.Click
'UPGRADE_ISSUE: Clipboard method Clipboard.GetText was not upgraded. Click for more: ms-
help://MS.MSDNVS/vbcon/html/vbup2069.htm
Text1.SelectedText = Clipboard.GetText
End Sub
End Class

O código que está em azul é o código que efetivamente você vai ver no projeto.

Concluimos que embora o Upgrade Wizard ajude muito no processo de migração , com as mudanças ocorridas na linguagem VB.NET , muitas
incompatibilidades deverão ocorrer. Se você quer uma migração menos traumática o ideal é ajustar a sua antiga aplicação preparando para a migração.

file:///d|/geo_hp/livro_mac1.htm (29 of 85) [01/11/03 18:03:18]


Nova pagina 1
Iremos abordar como fazer isto num próximo artigo.

Dando os primeiros passos - Escrevendo Código VB.NET - I


Desde o lançamento do Visual Studio .NET eu procurei dar uma visão geral do ambiente de desenvolvimento do VB.NET e dos novos conceitos que a nova
plataforma trouxe. Para se atualizar veja os artigos :

● Visual Basic .NET - aquecendo as turbinas


● Minha primeira aplicação no Visual Basic .NET
● VB.NET - Windows Forms
● Minha primeira aplicação Windows no Visual Basic .NET
● Meu primeiro acesso a dados com o VB.NET

Acho que você já percebeu que o VB.NET trás um conjunto de ferramentas , métodos , propriedades e conceitos antes não existentes nas versões anteriores
, e, isto com certeza irá facilitar muito o trabalho do desenvolvedor que usa o Visual Basic como ferramenta. Neste artigo eu vou fazer uma abordagem bem
básica sobre os principais conceitos necessários para escrever código VB.NET : variáveis , constantes , operadores , cálculos , rotinas , funções ,
fundamentos para escrever código robusto , etc...

Se você já domina estes assuntos pode parar a leitura aqui mesmo , o objetivo e fornecer uma base sólida para quem esta começando a programar usando
o Visual Basic e está com medo de enfrentar a nova plataforma .NET , para quem começou ,parou e quer voltar , para quem já começou ...

Variáveis

O conceito de variável é fundamental em qualquer linguagem de programação , portanto , não poderia ser diferente com o VB.NET.

O que é uma variável ? ( bem ai vareia !!! ) . Podemos dizer que variável é um lugar que usamos para armazenar uma informação que pode sofrer
alteração durante a execução de um programa.

As variáveis são usadas para guardar valores que serão usados durante o decorrer do programa , para guardar informações fornecidas pelo usuário e que
será exibida mais tarde. Cada variável que usamos é identificada por um nome e por um tipo.

Você pode guardar informação de diversos tipos em uma variável : números pequenos , números médios , números grandes , letras , palavras , frases ,
páginas de texto , etc...; Então dizemos que uma variável tem um nome que a identifica e um tipo de dado que esta armazenando. Quando você guarda
uma informação em uma variável esta usando a memória do computador para isto , e , quanto maior a informação que você guardar mais memória você vai
gastar dependendo do tipo de variável que decidir usar.

Se você precisar realizar cálculos que envolvam somente valores inteiros deverá procurar usar uma variável do tipo Integer , você pode usar uma variável do
tipo Long , Single e Double mas com isto irá gastar mais memória.

Podemos criar três tipos básicos de variáveis no VB.NET :

1. Variáveis simples - usadas para guardar valores simples como números e strings(alfanuméricas)
2. Variáveis complexas - usadas para guardar valores mais complexos , vetores , e tipos definidos pelo usuário
3. Variáveis objeto - usadas para guardar variáveis objeto

Variáveis Simples

file:///d|/geo_hp/livro_mac1.htm (30 of 85) [01/11/03 18:03:18]


Nova pagina 1

As variáveis simples guardam números e strings ; neste caso podemos ter números pequenos e números maiores , com o intuíto de economizar memória
podemos dividir estas variáveis nos seguintes grupos de tipos :

1. Inteiros
2. Decimais
3. Strings e caracteres
4. Outras (data , Boolean)

Inteiros

Os inteiros são valores numéricos que não possuem casas decimais e são muito usadas em qualquer programa VB.NET . Não gastam muita memória do
computador e tornam o processamento e os cálculos mais rápidos. Por isto se você pode escolher um tipo de variável escolha Inteiro (se isto se adequar ao
seu caso é claro... ). Na tabela abaixo as variáveis do tipo Inteiro:

Tipo de Dado Tamanho em Bytes Intervalo Comentário


O tipo de menor tamanho. Não
Byte 1 0 até 255
suporta valores negativos.
Usado para contadores e faixas de
Short 2 -32768 até 32767
valores de pequeno intervalo.
Integer 4 -2.147.483.648 até 2.147.483.647 O tipo mais rápido dos inteiros.
Long 8 -9,223,372,036,854,775,808 até 9,223,372,036,854,775,807. Indicada tratar valores no intervalo.

Números com casas decimais

Tamanho
Tipo de Dado Intervalo Comentário
em Bytes
-3.402823x 10^38 ate 1.401298 x 10^-45 (negativos) e
Para cálculos que exijam certa
Single 4
precisão.
1.401298x10^-45 até 3.402823x10^38 (positivos)
-1.79769313486231570E+308 até -4.94065645841246544E-324 (negativos) Trata valores com dupla precisão até
15 casas decimais ; usado para
Double 8
cálculos com números muito grandes
4.94065645841246544E-324 até 1.79769313486231570E+308 (positivos) que exijam muita precisão.

String e Caracteres

Para tratar caracteres , palavras , texto usamos as variáveis do tipo :

Tipo de Dado Tamanho em Bytes Intervalo Comentário


Char 2 0 through 65535 (sem sinal). Usada para tratar um caractere.
Depende da Pode tratar até 1,7 milhoes de páginas
String até 2 bilhões de caracteres
plataforma de texto

Note que cada caractere precisa de 2 bytes para ser representado , pois o sistema usado aqui é o UNICODE. No sistema ASCII cada caractere é
representado por um byte(com isto podemos representar apensa 256 caracteres) ;Para acomodar caracteres especiais usados em outras línguas ( Russo ,
file:///d|/geo_hp/livro_mac1.htm (31 of 85) [01/11/03 18:03:18]
Nova pagina 1
Grego , Japonês) e incluir também outros sínbolos o sistema UNICODE usa dois bytes para representar cada caractere. O VB.NET usa o UNICODE para todos
os caracteres.

Outros tipos de variáveis

Tipo de Dado Tamanho em Bytes Intervalo Comentário


Boolean 2 True ou False Usada tratar valores que podem assumir Falso ou verdadeiro.
Date 8 01/01/100 até 31/12/9999 Usado no tratamento de datas.

Nota: Você pode armazenar datas em outro tipo de variável como String ou Integer , mas para evitar dores de cabeça procure usar o tipo Date.

Declarando variáveis

Agora que já falamos sobre variáveis e seus tipos vamos ver como usar variáveis em um programa VB.NET. A maneira mais simples de usar uma variável é
usar a palavra chave Dim (dimension) seguida pelo nome da variável , a palavra chave AS e o tipo da variável. Exemplo:

Aqui estamos criando uma nova variável chamada valor que irá ocupar 4 bytes e que poderá tratar valores numéricos
Dim valor As Integer
na entre : -2.147.483.648 até 2.147.483.647

O VB.NET trouxe como novidade a possibilidade de atribuir o valor para a variável durante a sua criação usando a linha da declaração. Assim :

Dim valor As Integer = 100 ou Dim dtNascimento As Date = #15/03/1978# ou Dim nome As String = "Macoratti"

Para maiores detalhes sobre este tópico leia o artigo : VB.NET - Declaração de variáveis o que mudou ?

Vetores ( Arrays)

Os vetores são usados para armazenar e referenciar uma série de variáveis pelo mesmo nome (uma coleção de valores relacionados). Assim podemos usar
um vetor para armazenar todos os nomes dos alunos de uma escola , todas as datas de aniversário dos seus amigos, todos os valores da sua conta corrente
, etc.... Cada item armazenado no vetor é identificado por um índice.

A dimensão de um array é o número que identifica quando índices iremos usar para identificar uma item do array .Um array pode ter de uma até 32
dimensões. Cada dimensão de um array possui um comprimento diferente de zero. Os elementos de um array são contíguos e iniciam no índice igual a zero
até o valor de maior valor. Quanto maior a dimensão do array você usar mais memória vai precisar ser alocada. Exemplos:

Vetores de uma dimensão


Dim ValoresDiarios(365) as Decimal - aloca espaço para itens de (0) até (365)
Dim Meses(11) As String - aloca espaço para elementos com indice de 0 a 11 - teremos 12 elementos
Dim Matriz(49) AS integer - aloca espaço para elementos com índice de 0 a 49 - (50 elementos)

Vetores de duas dimensões


Dim retangulo(4,9) As Single - aloca espaço para elementos de 0 a 4 e para elementos de 0 a 9

Acima declaramos um array de duas dimensões que possuirá 5 linhas ( 0 a 4) e 10 colunas ( 0 a 9) perfazendo um total de 50 elementos.

Podemos também definir array usando a seguinte sintaxe:


file:///d|/geo_hp/livro_mac1.htm (32 of 85) [01/11/03 18:03:18]
Nova pagina 1

Dim semana() As String = {"Segunda" , "Terca", "Quarta" , "Quinta" , "Sexta" , "Sabado" , "Domingo"}
Neste caso já definimos quais os elementos do vetor semana. Assim para obter o elemento segunda fazemos : dia = semana(0)

Além disto podemos atribuir diretamente a cada elemento o seu valor :

Dim Datas(3) As Date


Datas(0)="12/05/2002"
Datas(1)="25/08/1965"
Datas(2)="30/03/1978"

Como os arrays não possuem um tamanho fixo no VB.NET podemos alterar o tamanho de um array criado previamente usando a declaração ReDim.

Ex: ReDim Matriz(59) - redimensiona o array criado usando a instrução - Dim Matriz(49) AS integer

Obs: No VB.NET não podemos iniciar um array usando a declaração : Dim valor(2 to 10) As Single quando fazíamos isto no VB6 , as matrizes ficavam
com o tamanho fixo e não podiam ser redimensionadas com a declaração Redim.

No VB.NET todas as matrizes podem ser redimensionáveis através da declaração Redim , você só não pode mudar o número de dimensões da matriz. Além
disto o VB.NET trouxe inovações na sintaxe da declaração de matrizes. Podemos ter :

Dim Salas(15) As Integer = é identico a = Dim Salas() As Integer = New Integer(12) {}

Dim Salas As Integer = { 1, 2, 3 , 4, 5, 6, 7, 8, 9, 10, 11, 12} - inicializa a matriz com valores

Nota: Se você não definir um valor inicial para uma variável o VB.NET irá atribuir valores padrões conforme a tabela abaixo:

Tipo Valor
Boolean False
Date 12:00:00AM
Tipos Numéricos 0
Objeto Nothing

Constantes

Constantes sãos valores que não sofrem alterações durante a execução do programa. (Exemplos : As constantes físicas e matemáticas : PI , o valor de
e(logaritimo neperiano) , a velocidade da luz , do som , etc... Declaramos um valor como sendo uma constante na sua declaração. As duas formas de
declarar uma constante são :

file:///d|/geo_hp/livro_mac1.htm (33 of 85) [01/11/03 18:03:18]


Nova pagina 1
Se você não declarar o tipo da constante o compilador vai procurar ajustar ao valor que mais se aproxima
seguindo as seguinte regras :
Const PI = 3,141516
Const ano As integer = 365 ● Long - para valores numéricos não declarados
Const nome As String = "Macoratti" ● Double - Para valores numéricos com decimais não declarados.
● String - Para qualquer valor caractere.

Obs: As constantes da linguagem VB sofrem alterações no VB.NET . Abaixo mostramos algumas mudanças para constantes de código de teclas :
(Para ver a tabela completa clique aqui - tabela de constantes para teclas )

Visual Basic 6.0 Equivalente- Visual Basic .NET


vbKeyLButton (1) System.Windows.Forms.Keys.LButton
vbKeyRButton (2) System.Windows.Forms.Keys.RButton
vbKeyCancel (3) System.Windows.Forms.Keys.Cancel
vbKeyMButton (4) System.Windows.Forms.Keys.MButton
vbKeyBack (8) System.Windows.Forms.Keys.Back
vbKeyTab (9) System.Windows.Forms.Keys.Tab
vbKeyClear (12) System.Windows.Forms.Keys.Clear
vbKeyReturn (13) System.Windows.Forms.Keys.Return
vbKeyShift (16) System.Windows.Forms.Keys.ShiftKey
vbKeyControl (17) System.Windows.Forms.Keys.ControlKey

Dando os primeiros passos - Escrevendo Código VB.NET - II

Operadores e funções básicas

Já falamos sobre variáveis e constantes no artigo anterior e vimos como são importantes , mas , de que adianta criar variáveis e constantes se eu não posso
fazer nada com elas ? Por isso o VB.NET oferece um conjunto de funções que podemos usar para fazer algo de útil . O VB.NET possui também operadores
matemáticos que podemos usar para realizar cálculos outras operações : junte tudo isto e já podemos ver o VB.NET funcionando a todo vapor. Vou mostrar
a seguir os operadores mais comumente usados no Visual Basic.Net

Operador Utilização Exemplo


= Atribui um valor a uma variável ou constantes y = 10 ou Sobrenome = "Macoratti"
+ Soma dois valores x = y + 5 ( o valor de x será igual a 15)
- Subtrai um valor de outro x = y - 2 ( o valor de x será igual a 5)
* Multiplica dois valores x = y * 2 ( o valor de x será igual a 20)
/ Divide um valor por outro x = y / 2 ( o valor de x será igual a 5)
Divide um valor por outro e retorna somente a parte inteira do
\ x = y \ 3 ( o valor de x será igual a 3)
resultado

file:///d|/geo_hp/livro_mac1.htm (34 of 85) [01/11/03 18:03:18]


Nova pagina 1
Mod Divide um valor por outro e retorna o resto da operação x = y mod 3 ( o valor de x será igual a 1)
cliente = "Jose Carlos " & Sobrenome ( cliente será igual
& Combina , concatena duas strings
a Jose Carlos Macoratti)
+= soma o valor e atribui o resultado y += 3 ( y será igual a 13)
-= subtrai o valor e atribui o resultado y -= 6 ( y será igual a 7)
*= multiplica o valor e atribui o resultado y *= 2 ( y será igual a 14)
/= divide o valor e atribuiu o resultado y /= 2 ( y será igual a 7)
Sobrenome &= ", Jose Carlos" ( Sobrenome será igual a
&= concatena a string e atribui o resultado
"Macoratti , Jose Carlos"
^ Eleva um valor a um determinado expoente 3 ^ 3 ( 3 elevado a 3 ; resultado = 27 )
Sqrt Extrai a raiz quadrada de um valor (Namespace System classe Math) x = Math.Sqrt(81) ( O valor de x será igual a 9)

Obs: A classe Math do namespace System possui diversos métodos que oferecem um suporte matemático. (Ex: Atan , Exp , Sign , Sqrt , Pow , Min , Round ,
Abs , Cos , Sin , Tan , etc...)

Além destas funções oferecidas pelo .NET Framework o Visual Basic .NET possui muitas funções intrínsecas que permite realizar além de conversões entre
tipos de variáveis , cálculos matemáticos , manipulação de strings , etc. Vejamos primeiro as funções para conversão de variáveis:

Todas as funções de conversão no VB.NET iniciam com a letra C ( de conversão ) e terminam com uma forma abreviada do novo tipo . Existem também a
função de conversão genérica - Ctype - que pode converter para qualquer tipo. Vejamos as principais:

Função Descrição Exemplo


Dim A, B, C As Integer
Dim Check As Boolean
A=5
B=5
Converte para um Booleano ( False ou True). False ou 0 será Check = CBool(A = B) ' Check será True.
Cbool
definido como False. Retorna um Boolean ' ...
C=0
Check = CBool(C) ' Check será False.

Dim MyDouble As Double


Dim MyByte As Byte
Converte para um Byte . Qualquer valor maior que 255 ou valor MyDouble = 125.5678
Cbyte
fracionário será perdido. Retorna um Byte. MyByte = CByte(MyDouble) ' MyByte será igual a

Dim MyString As String


Converte para um Caracter . Qualquer valor maior que 65,535 Dim MyChar As Char
CChar será perdido e , se você tentar converter uma string somente o MyString = "BCD" 'converte só o primeiro caractere
primeiro caractere será convertido. MyChar = CChar(MyString) ' MyChar será igual a "B".

file:///d|/geo_hp/livro_mac1.htm (35 of 85) [01/11/03 18:03:18]


Nova pagina 1
Dim MyDateString, MyTimeString As String
Dim MyDate, MyTime As Date
MyDateString = "February 12, 1969"
Converte para um Date. Aceita qualquer representação de data
CDate MyTimeString = "4:35:47 PM"
e tempo.
' ...
MyDate = CDate(MyDateString) ' Converte p/ o tipo Date.
MyTime = CDate(MyTimeString) ' Converte p/ o tipo Date.
Dim MyDec As Decimal
Dim MyDouble As Double
CDbl Converte para um Double.
MyDec = 234.456784D .
MyDouble = CDbl(MyDec * 8.2D * 0.01D) ' Converte para Double
Dim MyDouble As Double
Dim MyDecimal As Decimal
CDec Converte para um Decimal.
MyDouble = 10000000.0587
MyDecimal = CDec(MyDouble) ' Converte para Decimal.
Dim MyDouble As Double
Dim MyInt As Integer
Converte para um inteiro. Valores de -2,147,483,648 até MyDouble = 2345.5678
CInt
2,147,483,647 . Frações são arredondadas. MyInt = CInt(MyDouble) ' MyInt será igual a 2346.

Dim MyDbl1, MyDbl2 As Double


Dim MyLong1, MyLong2 As Long
Converte para um Longo. Valores -9,223,372,036,854,775,808 MyDbl1 = 25427.45
CLng
até 9,223,372,036,854,775,807. Frações são arredondadas. MyDbl2 = 25427.55
MyLong1 = CLng(MyDbl1) ' MyLong1 conterá 25427.
MyLong2 = CLng(MyDbl2) ' MyLong2 conterá 25428.
Dim MyByte as Byte
Converte para um Short. Valores de 32,768 a 32,767. Frações Dim MyShort as Short
CSht
são arredondadas. MyByte = 100
MyShort = CShort(MyByte) ' Converte para Short.
Dim MyDouble As Double
Dim MyString As String
converte para um String. Se for uma Data o retorno será no MyDouble = 437.324
CStr
formato - Short Date. MyString = CStr(MyDouble) ' MyString será igual a "437.324".

Dim MyDouble1, MyDouble2 As Double


Dim MySingle1, MySingle2 As Single
MyDouble1 = 75.3421105
Converte para um Single . -3.402823E+38 até -1.401298E-45 MyDouble2 = 75.3421567
CSng
// 1.401298E-45 até 3.402823E+38 MySingle1 = CSng(MyDouble1) ' MySingle1 será igual a 75.34211.
MySingle2 = CSng(MyDouble2) ' MySingle2 será igual a 75.34216.

file:///d|/geo_hp/livro_mac1.htm (36 of 85) [01/11/03 18:03:18]


Nova pagina 1
Dim MyDouble As Double
Dim MyObject As Object
CObj Converte para um objeto. MyDouble = 2.7182818284
MyObject = CObj(MyDouble) ' MyDouble estará apontada para MyObject.

Dim MyNumber As Long


Dim MyNewType As Single
Converte para qualquer tipo de dados. Sintaxe: Variavel =
Ctype MyNumber = 1000
Ctype( TipoVelho , NovoTipo)
MyNewType = CType(MyNumber,Single) ' MyNewType é igual a
p/1000.0

Nota:

1. Se a expressão submetida a função estiver fora do intervalo do tipo de dados para o qual você quer converter ocorrerá um erro
2. Usamos estas funções para forçar que o resultado de uma operação seja de um tipo particular diferente do resultado padrão. Assim usamos CDec
para forçar para decimal em casos no qual a precisão simples, dupla ou um valor inteiro normalmente iria ocorrer.
3. Se o valor fracionário submetido for exatamente 0,5 , CInt e CLng irão arredondar para o número par mais próximo. Assim 0,5 será arredondado
para 0 e 1,5 será arredondado para 2.
4. CDate reconhece o formato de datas de acordo com a configuração local do sistema. Você deve informar o dia , mês e ano na ordem correta de
acordo com a configuração local.

Funções para tratar Strings

Vejamos agora as principais funções para manipular Strings : (Para maiores detalhes leia o artigo: Strings um novo enfoque )

Função Descrição Exemplo


Len Retorna o comprimento(tamanho) de uma string. a = len("Macoratti") => a = 9
Chr Retorna o caractere correspondente ao valor ASCII ou UNICODE a = Chr(56) => a = A
Asc Retorna o valor ASCII ou UNICODE do caractere correspondente a = ASC("A") => a = 56
Left Retorna um número definido de caracteres mais a esquerda de uma string a= Left("Macoratti",4) => a= "Maco"
Right Retorna um número definido de caracteres mais a direita de uma string a= Rigth("Macoratti",5) => a= "oratti"
Retorna uma string contendo um número definido de caracteres. Sintaxe:
Mid a= Mid("Macoratti", 4,3) => a= "ora"
Mid(String , inicio, tamanho)
Retorna um inteiro informando a posição inicial da primeira ocorrência de uma
Instr a= Instr( 1, "Macoratti", "t") => a= 7
string em outra. Sintaxe: Instr( inicio , String1 , String2 , Compare)
Lcase Converte os caracteres de uma string para caracteres minúsculos. a= Lcase("Macoratti") => a="macoratti"
Ucase Converte os caracteres de uma string para caracteres maiúsculos. a= Ucase("Macoratti") => a="MACORATTI"
Trim Remove todos os espaços contidos em uma string. a= Trim(" Macoratti ") => a="Macoratti"

Para encerrar com as funções intrínsecas abaixo temos algumas funções úteis:

Função Descrição Exemplo

file:///d|/geo_hp/livro_mac1.htm (37 of 85) [01/11/03 18:03:18]


Nova pagina 1
IsArray Retorna True se o parâmetro for um array.
IsDate Retorna True se o parâmetro for uma Data.
IsNumeric Retorna True se o parâmetro for um número.
IsObject Retorna True se o parâmetro for um objeto.
TypeName Retorna o nome do tipo de dados do parâmetro.
Now Retorna a data e hora atual.
Today Retorna a data atual no formato: 0:00:00 a.m.
Dim MyVar As Object
Dim MyCheck As Boolean
MyCheck = IsDBNull(MyVar) ' Retorna False.
MyVar = ""
IsDBnull Retorna True se a variável ainda não foi iniciada com um valor. MyCheck = IsDBNull(MyVar) ' Retorna False.
MyVar = System.DBNull.Value
MyCheck = IsDBNull(MyVar) ' Retorna True.

Bem , você já tem a disposição um verdadeiro arsenal de funções que já lhe dão um idéia do poder de fogo do VB.NET e , tenha certeza , isto é apenas o
começo. Na continuação deste artigo vou mostrar como criar suas próprias funções e do escopo das variáveis.

Dando os primeiros passos - Escrevendo Código VB.NET - III

Escrevendo suas próprias funções

No artigo anterior você foi apresentado ás funções que o VB.NET oferece para facilitar sua vida. Mas sempre vai ficar faltando alguma coisa ; embora o
VB.NET possua milhares de funções prontas para você usar , com certeza no dia a dia você vai ter que criar sua própria função. Sem problema algum ! ; o
VB.NET permite que você crie suas próprias rotinas e funções. É isto que vamos mostrar agora.

Existem dois tipos de rotinas usadas no VB.NET :

1. Sub-rotinas - Sub - Sâo rotinas que realizam tarefas e que não retornam valor algum.
2. Funções - Function - São rotinas que realizam tarefas e que retornam valores.

Sub-rotinas

As sub-rotinas são um bloco de código VB.NET que realiza um serviço e não retorna nenhum valor. Quando você usa o código : Console.Writeline esta
usando uma sub-rotina que apenas imprime uma informação na tela e não retorna valor algum.

Você cria uma sub-rotina quando deseja realizar uma tarefa que vai ser repetida muitas vezes ou se a mesma tarefa precisa ser usada em muitos
programas. Com isto você esta agrupando o seu código e tornando-o mais fácil de localizar e manter pois basta você invocar a sua sub-rotina para fazer o
serviço ao invés de ter que escrever todo o código novamente.

Para criar uma sub-rotina você usa a palavra-chave - Sub - seguido do nome da sub-rotina e dos parâmetros que você esta passando para ela. Os
parâmetros são valores que você passa para sub-rotina usar na realização da tarefa que lhe foi atribuída. A sub-rotina termina com a palavra-chave : End
Sub. Vejamos como fica a sintaxe:
file:///d|/geo_hp/livro_mac1.htm (38 of 85) [01/11/03 18:03:18]
Nova pagina 1

Sub NomedaSubRotina (parametro1 As TipodoParametro1, Parametro2 As TipodoParametro1, ...)


' O código da função
...
End Sub

Abaixo temos um exemplo de uma sub-rotina que multiplica dois números inteiros x e y e escreve o resultado no console:

Sub Multiplica ( x As integer, y As Integer)


Console.WriteLine( x & " x " & y & " = " & x*y )
End Sub

Para chamar a sub-rotina e passar os parâmetros usamos a forma : NomeSubRotina(parametro1 , parametro2)

No exemplo acima podemos fazer assim :

Module Module1
Sub Main()
Console.WriteLine("Vou chamar a Sub-rotina : Multiplica com os parametros: 521 e 123.")
Console.WriteLine("Pressione algo para ver o resultado...")
Console.Read()
Multiplica(521, 123)
End Sub

Sub Multiplica(ByVal x As Integer, ByVal y As Integer)


Console.WriteLine(x & " x " & y & " = " & x * y)
Console.Read()
End Sub
End Module

● O nome da sub-rotina é Multiplica


● x e y são os parâmetros do tipo inteiro que são fornecidos para a sub-rotina realizar a multiplicação
● A sub-rotina realiza a mutiplicação usando o operador * : x*y e escreve o resultado na tela.

Funções

As funções são idênticas ás sub-rotinas a única mudança é que elas retorna um valor. No caso das funções usamos a palavra-chave : Function seguida do
nome da função e da relação dos parâmetros e terminamos com a palavra-chave : End Function. No código da função usamos também a palavra-chave :
Return que irá retornar o valor da função. Assim temos:

file:///d|/geo_hp/livro_mac1.htm (39 of 85) [01/11/03 18:03:18]


Nova pagina 1
Sub NomedaFunçõa (parametro1 As TipodoParametro1, Parametro2 As TipodoParametro1, ...)
' O código da função
...
Return ValordeRetorno
End Sub

Usando o mesmo exemplo podemos criar uma função para multiplicar dois números inteiros e retornar o resultado. Assim:

Sub Multiplica ( x As integer, y As Integer)


Return x*y
End Sub

Para chamar a função e passar os parâmetros usamos a forma : NomeFunção(parametro1 , parametro2)

Um exemplo prático pode ser o seguinte :

Module Module1
Sub Main()
Console.WriteLine("Vou chamar a Função : Multiplica c/parametros: 521 e 123.")
Console.WriteLine("Pressione algo para ver o resultado...")
Console.Read()
Console.Write("521 x 123 = " & Multiplica(521, 123))
Console.Read()
End Sub

Function Multiplica(ByVal x As Integer, ByVal y As Integer)


Return x * y
End Function
End Module

Como exemplos de funções do VB.NET podemos dar como exemplo aqueles que retornam um valor para uma operação. Exemplo as funções Sqrt que
calcula a raiz quadrada de um numero e a função Cos que calcula o coseno de um ângulo. Estas funções pertencem a classe Math.

file:///d|/geo_hp/livro_mac1.htm (40 of 85) [01/11/03 18:03:18]


Nova pagina 1

Module Module1
Sub Main()
Dim raiz, angulo As Double

raiz = Math.Sqrt(100)
angulo = Math.Cos(1.12)

Console.WriteLine(" Raiz = " & raiz)


Console.WriteLine("Angulo = " & angulo)
Console.Read()
End Sub
End Module

O uso dos parâmetros não é obrigatório nas sub-rotinas nem nas funções , assim , você pode definir uma função sem parâmetros, mas deve definir o tipo
de valor que será retornado:

Function CalculaPreco() Dim Preco as A função CalculaPreco não usa parâmetros mas deve informar o tipo do valor que irá retornar.
As Double Double No caso a função retorna um valor do tipo Double.
'código da função
......
return valor Preco = Para usar a função temos que declarar uma variável compatível com o valor de retorna e chamar a
End Function CalculaPreco() função.

Nota: as variáveis que você declara em uma sub-rotina ou função são locais e apenas visíveis pelo código da função ou sub-rotina.

Alterando o valor do parâmetro : ByVal ou ByRef ?

Na função multiplica usamos a palavra-chave ByVal , o que significa ByVal ? ByVal significa que estamos passando o argumento(parâmetro) por valor ;
desta forma a função ou sub-rotina não pode modificar o valor do argumento. Quando você usa ByVal o VB.NET faz uma cópia do valor do parâmetro e
então o Vb.NET passa uma cópia do valor para a rotina. Desta forma a rotina não pode alterar o valor do parâmetro.

Se quisermos permitir que o argumento seja alterado pela função ou sub-rotina devemos usar a chave ByRef. Quando você usa ByRef a rotina pode alterar
o valor do parâmetro pois recebe uma referência ao parâmetro , e, a alteração do parâmetro na rotina se reflete no parâmetro passado.Vejamos o exemplo
abaixo:

file:///d|/geo_hp/livro_mac1.htm (41 of 85) [01/11/03 18:03:18]


Nova pagina 1

Module Module1
Sub Main()
Dim Numero As Integer = 100
Console.WriteLine("Valor de 'Numero' ANTES de chamar a sub-rotina: " & Numero)
Console.Read()

MudaValorParametro(Numero)

Console.WriteLine("Valor de 'Numero' DEPOIS de chamar a sub-rotina: " & Numero)


Console.Read()

End Sub

Sub MudaValorParametro(ByRef valor As Integer)


valor = 1000
End Sub
End Module

Escopo das variáveis em rotinas e funções

Para terminar vamos falar um pouco sobre o escopo. O escopo refere-se a visibilidade das variáveis rotinas e funções dentro de um programa. Talvez você
tenha bons motivos para que uma rotina ou variável não acesse todas as variáveis do seu programa . Permitir que todas as variáveis do seu programa seja
acessadas por todas a rotinas do programa pode lhe trazer algumas dores de cabeça , pois , dependendo da complexidade do programa você pode perder o
controle sobre quem esta alterando e acessando quem.

Até agora usamos a palavra-chave Dim para declarar uma variável . Porém podemos declarar variáveis fora das rotinas e funções e assim torná-las
acessíveis a outras rotinas. Para fazer isto podemos usar as palavras-chave Public e Private:

1. Public - As variáveis são visíveis por toda a aplicação.


2. Private - As variáveis são visíveis dentro do módulo ou classe onde foram declaradas.

Podemos usar as palavras-chave acima também para definir o escopo de funções e rotinas. Da mesma forma temos para funções e sub-rotinas:

1. Public - A rotina pode ser chamada de qualquer parte de sua aplicação. É o padrão quando não se informa nada.
2. Private - A rotina pode ser chamada somente por outra rotina dentro do mesmo módulo ou classe onde esta definida.

file:///d|/geo_hp/livro_mac1.htm (42 of 85) [01/11/03 18:03:18]


Nova pagina 1

Module Module1 Module Module1


Sub main() Sub main()
contador1() contador1()
contador2() contador2()
End Sub End Sub

Sub contador1() Dim contador As Integer


Dim contador As Integer
For contador = 10 To 100 Sub contador1()
Console.WriteLine(contador) For contador = 10 To 100
Next Console.WriteLine(contador)
Console.ReadLine() Next
End Sub Console.ReadLine()
End Sub
Sub contador2()
Dim contador As Integer Sub contador2()
For contador = 100 To 1000 For contador = 100 To 1000
Console.WriteLine(contador) Console.WriteLine(contador)
Next Next
End Sub End Sub
End Module End Module
variável contador tem escopo local : as variáveis são visíveis somente em variável contador tem escopo global:é visível por ambas as sub-rotinas. É
cada sub-rotina . É declara dentro de cada rotina. declarada fora das rotinas.

Os conceitos apresentados não esgotam o assunto , mesmo por que , abordei somente os conceitos mais usados . Em um próximo artigo vou mostrar como
aplicar todos estes conceitos em uma aplicação VB.NET. Até lá...

Dando os primeiros passos - Escrevendo Código VB.NET - IV


Dando sequência aos artigos da série - Dando os primeiros passos - Escrevendo Código VB.NET neste artigo vou mostrar uma aplicação prática de toda
a teoria vista até agora . Vamos criar uma aplicação no VB.NET usando alguns dos conceitos expostos e mostrar como podemos juntar as partes para criar
algo de útil. Para que você se situe a série de artigos é :

1. Dando os primeiros passos - Escrevendo Código VB.NET - I - variáveis e constantes


2. Dando os primeiros passos - Escrevendo Código VB.NET - II - operadores e funções básicas
3. Dando os primeiros passos - Escrevendo Código VB.NET - III - sub-rotinas e funções

Nossa aplicação irá realizar um cálculo matemático envolvendo valores monetários. Vamos criar um programa para calcular o Valor Futuro de uma
determinada aplicação financeira em um determinado período a uma taxa de juros definida.

O problema é básico , temos que criar uma função que receba como informação :

● o valor inicial
● os valores dos depósitos mensais
● a taxa de juros
● e o período da aplicação

file:///d|/geo_hp/livro_mac1.htm (43 of 85) [01/11/03 18:03:18]


Nova pagina 1
O resultado deve ser o Valor Futuro da aplicação para as condições definidas.

Se você nem sabe por onde começar eu vou lhe dar uma dica : felizmente o VB.NET já tem uma função para calcular o Valor Futuro : FV .

A sintaxe da função FV é a seguinte :

Function FV( _ Onde:


ByVal Rate As Double, _
ByVal NPer As Double, _ ● - Rate - a taxa do período - Double
ByVal Pmt As Double, _ ● - Nper - O total de pagamentos no período - Double
Optional ByVal PV As Double = 0, _ ● - Pmt - O pagamento feito em cada período - Double
Optional ByVal Due As DueDate = DueDate.EndOfPeriod _ ● - PV - O valor atual de uma série de pagamentos futuros - Double
) As Double ● - Due - Define quando os pagamentos são devidos

Para ter uma visão da funcionalidade do aplicativo vamos escrever como deverá ser o fluxo de dados do aplicativo usando alguns dados como exemplo :

1. Valor inicial - (R$) - 10000 Se começarmos o investimento com R$ 10.000,00


2. Taxa anual - (%) - 5 e investirmos R$ 200,00 por mês
3. Valor dos Depósitos mensais - (R$) 200 por 10 anos
4. Período de investimento - (anos) - (tempo) 10 a uma taxa de 5% ao ano
Iremos ter um valor futuro de : ?????

A fórmula usada por FV é a seguinte :

FV = DepositoMensal * ((( 1 + TaxaMensal) ^ Periodo -1 ) / TaxaMensal ) + ValorInicial * ( 1+ TaxaMensal) ^ Periodo

Perceba que a fórmula usa quatro variáveis que vamos ter que definir em nossa aplicação . Primeiro vamos criar uma aplicação do tipo Console por ser mais
simples , depois iremos criar a mesma aplicação usando os Windows Forms. Vamos ao trabalho:

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

1. Project Types : Visual Basic Projects


2. Templates : Console Application
3. Name : ValorFuturo1
4. Location : c:\vbnet\ValorFuturo1

file:///d|/geo_hp/livro_mac1.htm (44 of 85) [01/11/03 18:03:18]


Nova pagina 1

2 - Altere o nome do modulo para ModVF.vb.(Clique com o botão direito do


mouse sobre o nome e selecione Renomear)

Veja ao lado a janela - Solution Explorer - e o módulo preparado para receber


o código da nossa aplicação - ValorFuturo1

Como já mostramos acima temos que definir quatro variáveis para armazenar os dados que vamos informar para a aplicação calcular o valor futuro usando a
forma já descrita.

Declaramos as quatro variáveis como privadas (Private) desta forma elas serão visíveis somente dentro do
módulo.

- No início de cada nome de cada uma das variáveis usei um prefixo para identificar qual o tipo da variável
Private dbTaxaAnual As Double =0 (esta é uma boa prática de programação), assim :
Private iAnos As Integer =0
Private decValorInicial As Double =0 ● db - Double
Private decDepositoMensal AS Double = 0 ● i - Integer
● dec - Decimal

Com exceção da variável iAnos que foi definida como sendo do tipo inteiro as demais foram definidas como
sendo do tipo Double. Todas as variáveis foram iniciadas com valor igual a 0.

Eu poderia colocar todo o código da aplicação na rotina Main , mas isto não seria muito aconselhável pois iríamos gerar um código difícil de ler e manter.
Vamos criar sub-rotinas para cada uma das funcionalidades que vamos precisar na nossa aplicação . Qual seriam elas ????

Você pode ter uma idéia melhor que a minha , mas eu dividi a aplicação em 3 partes , abaixo cada uma delas e a seguir uma sugestão de nome para a rotina
associada:

1. Entrada de dados - AlimentaVF


2. Calculo do Valor Futuro - CalculaVF
3. Exibição do resultado - MostraVF

Nosso código inicial teria então a seguinte estrutura :

file:///d|/geo_hp/livro_mac1.htm (45 of 85) [01/11/03 18:03:18]


Nova pagina 1

Explicando o código acima:

1. Estamos usando uma variável do tipo Double - decResultado - que irá armazenar o resultado
2. Criamos duas sub-rotinas : AlimentaVF() que irá receber os valores e MostraVF() que irá exibir o resultado
3. Criamos a função CalculaVF(dbTaxaAnual, iAnos, decDepositoMensal, decValorInicial) que irá calcular o Valor Futuro. Perceba que a função usa quatro
parâmetros que serão usados no calculo da operação.

2- A próxima etapa será criar o código para cada uma das sub-rotinas e da função usada na aplicação. Vamos começar com a sub-rotina AlimentaVF() :

- Vamos definir a rotina AlimetaVF() como sendo private ; como ela é uma sub-rotina nenhum valor será retornado. Abaixo temos uma sugestão para o
código desta sub-rotina:

file:///d|/geo_hp/livro_mac1.htm (46 of 85) [01/11/03 18:03:18]


Nova pagina 1
Private Sub AlimentaVF()
'escreve uma linha no console
Console.WriteLine()

'recebe os valores e armazena em cada variável


decValorInicial = CDec(ObtemDados("Valor Inicial = "))
dbTaxaAnual = CDbl(ObtemDados("Taxa Anual = "))
decDepositoMensal = CDec(ObtemDados("Deposito Mensal = "))
iAnos = CInt(ObtemDados("Periodo do Investimento = "))

End Sub

Explicação do código:
- Criamos a função - ObtemDados(msg) - que irá receber o valor informado pelo usuário. O valor retornado será armazenado em cada variável já definida
no início do módulo. O parâmetro passado para a função é a mensagem que irá aparecer para usuário ao digitar o valor. A seguir o código da função
ObtemDados(msg) :

Private Function ObtemDados(ByVal msg As String) As String


Console.WriteLine(msg)
Return Console.ReadLine
End Function

A função ObtemDados recebe o parâmetro - msg - e exibe a mensagem usando a método - Console.Writeline . Após informar o valor e teclar ENTER o
valor é retornado via método Console.Readline. Observe que definimos o tipo de retorno da função ObtemDados como String.

3- Vamos agora ao código da função - CalculaVF() -. Esta função usa 4 parâmetros e devolve o resultado do Valor Futuro. Abaixo o código:

Private Function CalculaVF(ByVal TaxaAnual As Double, ByVal Anos As Integer, ByVal DepositoMensal As Double, ByVal ValorInicial As Double) As Double

'Vamos pegar a taxa anual e dividir por 1200 para obtermos o percentual mensal
Dim decTaxaMensal As Double = CDec(TaxaAnual / 1200)

'Vamos calcular o numero de meses


Dim iMeses As Integer = (Anos * 12)

'A seguir vamos declarar uma variável temporária e a variável que vai armazenar o valor de retorno
Dim decTemp As Double
Dim decRetorno As Double

'vamos usar a variável temporaria e a variavel de retorno


decTemp = CDec((1 + decTaxaMensal) ^ iMeses)
decRetorno = CDec(DepositoMensal * ((decTemp - 1) / decTaxaMensal) + (ValorInicial * decTemp))
Return decRetorno

End Function

Na função CalculaVF() usamos os parâmetros recebidos para efetuar os cálculos e retorna o valor futuro. O retorno da função é do tipo Double. A seguir
vamos exibir o valor do resultado usando a função : MostraVF(decResultado) :

file:///d|/geo_hp/livro_mac1.htm (47 of 85) [01/11/03 18:03:18]


Nova pagina 1

Private Sub MostraVF(ByVal resultado As Double)


Console.WriteLine()
Console.WriteLine(" Com um valor incial de {0:c} ", decValorInicial)
Console.WriteLine(" e depositos mensais de {0:c} ", decDepositoMensal)
Console.WriteLine(" por um periodo de {0} anos ", iAnos)
Console.WriteLine(" a uma taxa de {0}% no período ", dbTaxaAnual)
Console.WriteLine()
Console.WriteLine(" Você terá como um valor futuro de : {0:c}", resultado)
Console.ReadLine()
End Sub

A função recebe o resultado e usando o método Console.Writeline , exibe o resultado no console . Perceba que formatamos a saída usando os parâmetros
de formatação para o console. (Leia o artigo : VB.NET - Formatando a saída do console. ). O valor das variáveis irá substituir os parâmetros {0:c} e {0}
em cada posição. ( {0:c} significa : formato de moeda local)

Vamos executar a aplicação para ver o resultado final :

Minha primeira aplicação VB.NET


"A primeira vez a gente nunca esqueçe... " . Então para você será inesquecível , afinal , você vai construir sua primeira aplicação na plataforma .NET , e ,
como não poderia deixar de ser: vamos usar o VB.NET.

Eu estarei usando a versão beta 1 do Visual Studio .NET , pois , por um problema técnico a minha versão beta 2 se recusa a instalar corretamente.
Embora tenham ocorrido mudanças da versão beta 1 para a beta 2 , como estamos no princípio , os conceitos básicos não foram alterados , e , se for
necessário , estarei indicando as mudanças ocorridas no código para a versão beta 2 . Como creio que em breve minha versão beta 2 , ou quem sabe , a
versão final e oficial já esteja instalada e funcionando espero não ter que usar este recurso. Detalhes a parte vamos ao projeto...

file:///d|/geo_hp/livro_mac1.htm (48 of 85) [01/11/03 18:03:18]


Nova pagina 1
Minha primeira aplicação .NET

Inicie o Visual Studio .NET , você verá a tela a seguir . ( A tela de abertura da versão beta 2 é um pouco diferente mas as opções indicadas são as mesmas)

Como vamos criar um novo projeto , selecione a opção - Create New Project - ( você pode selecionar também o Menu File opção - New - Project...)
Surgirá a seguinte janela:

file:///d|/geo_hp/livro_mac1.htm (49 of 85) [01/11/03 18:03:18]


Nova pagina 1

Agora vamos selecionar o tipo de aplicação que vamos desenvolver: Estaremos criando uma aplicação tipo Console ou Console Application. Em Name
informamos o nome do projeto - MinhaPrimeiraAplicaao ; em Location informamos o local onde vamos salvar o projeto. Note que o projeto é do tipo Visual
Basic Projects. Agora vamos clicar em OK. A próxima tela será :

file:///d|/geo_hp/livro_mac1.htm (50 of 85) [01/11/03 18:03:18]


Nova pagina 1

Será criado um arquivo chamado - Module1.vb - com uma estrutura de código pronta para que possamos incluir nosso código e iniciar o nosso projeto.
Observe que foi criada a definição Module Module1 / End Module e internamente o procedimento Sub Main/ End Sub. Como no VB.NET temos todos os
tipos de elementos juntos em um mesmo arquivo com extensão .vb agora é necessário indicar onde começa Module1 e onde termina.

Iremos incluir um código no procedimento Sub Main. Com o cursor posicionado escreva a palavra Console. e você verá a janela a seguir:

file:///d|/geo_hp/livro_mac1.htm (51 of 85) [01/11/03 18:03:18]


Nova pagina 1

Ao digitar o ponto você verá as funções pertinentes de Console.(Este recurso já existia no VB5/6). Selecione a função Write e complete o código como
abaixo:

Aonde eu estou querendo chegar. Você deve estar pensando... Vou explicar !

Nossa primeira aplicação irá exibir uma mensagem na tela. A mensagem será exibida em uma janela do DOS , ou seja em um console. Para isto estou
usando a classe Console e a função Write que escreve a mensagem na janela DOS. A linha a seguir - Console.read() - usa a função read() do Console
para permitir que você veja a mensagem exibida (ela funciona como uma pausa ou espera) caso contrário a janela iria se abrir e fechar tão rápido que você
iria pensar que a coisa não funcionou.

file:///d|/geo_hp/livro_mac1.htm (52 of 85) [01/11/03 18:03:18]


Nova pagina 1

Para executar sua aplicação pressine F5 ou clique no botão

você deve obter uma janela DOS com sua mensagem exibida como a seguir:

Não fique frustrado !!! Como estamos começando achei melhor criar uma aplicação que não usasse o ambiente gráfico para não complicar as coisas. Tudo
bem que sua aplicação não sirva para nada , mas pelo menos você conseguiu fazê-la funcionar...

O VB.NET usa uma série de livrarias ( classes ) que possuem as funções que precisamos para executar uma determinada tarefa ( Write, Read , etc...). Para
exibir o texto em uma janela DOS temos que usar a livraria que contém a classe Console e suas funções. A livraria ( library ) na qual está a classe Console é
a library System a qual na verdade é um Namespace , ou seja , um Espaço de Nomes.

Veja como a Microsoft define um Namespace:

"Um Namespace é um esquema lógico de nomes para tipos no qual um nome de tipo simples, como MeuTipo, aparece precedido por um nome hierarquico
separado por ponto"

Entendeu ?? Se entendeu , então me explica que eu até agora estou boiando...

Namespace e Assembly : Conceitos básicos

Antes de poder falar sobre estes conceitos quero deixar claro que a intenção não é se aprofundar no assunto mas dar uma idéia do que são e como
funcionam. Antes de começar a falar sobre Namespace ( Espacos de Nomes - Argh! vou usar Namespace mesmo !!!) vamos tentar entender o que é um
Assembly.

Veja o que a Microsoft diz:

"Um assembly é um bloco construtivo primário de uma aplicação .NET. Sendo uma recompilação de funcionalidade que se constrói, versiona e instala como
uma única unidade de implementação. ". Muito bonito , não !!!!

Um assembly é unidade primária de construção da plataforma .NET , ou seja , é o tijolo da plataforma sobre o qual tudo o mais se apoia. Um assembly
pode ser reutilizado e é auto-descritivo de maneira a permitir que um runtime .NET possa gerenciar plenamente a aplicação. Um assembly é composto por
duas partes:

● Um conjunto de tipos e recursos que forma a funcionalidade de um Assembly ( NameSpaces )


● O Manifest , um metadata que tem a informação sobre como todos os elementos de um assembly se relacionam , e quais as suas dependências

file:///d|/geo_hp/livro_mac1.htm (53 of 85) [01/11/03 18:03:18]


Nova pagina 1

Um manifest contém :

● Identidade : Inclue o nome , número da versão , e algumas informações opcionais.


● Conteúdo : Uma lista de nomes de todos os tipos e recursos que é visível externamente ao assembly e onde eles podem ser encontrados
● Dependencias : lista de dependências , incluindo versões das dependências.
● Permissões requisitadas : Quando um assembly é criado o desenvolvedor pode gravar um conjunto de permissões que o assembly irá requerer
quando for executado.

Então simplificando, podemos dizer que um assembly é uma livraria dinâmica ( DLL ) que contém diversos e distintos espaços de nomes - NameSpaces .

Voltando agora ao Namespace , podemos dizer que os Namespaces organizam os objetos em um assembly ; assim , um assembly podem conter um ou
mais namespaces , e estes namespaces pode conter um ou mais namespaces. Desta forma os Namespaces evitam a ambiguitdade e organizam referências
quando são usados grande grupos de objetos como as librarys de classes.

O namespace raiz , ou seja, aquele que esta no topo da 'hierarquia' é o System ; dentro do namespace raiz System temos algo em torno de 100 classes
que representam todo os tipos de dados.

A classe system contém outras classes que realizam outros serviços. Dentro do NameSpace System temos , mais ou menos 24 sub-niveis de
namespaces. Veja abaixo:

Data: ● System.Data
● System.XML

Component Model: ● System.CodeDOM


● System.ComponentModel
● System.Core

Configuration: ● System.Configuration

Frameworks Services: ● System.Diagnostics


● System.DirectoryServices
● System.Timers
● System.Messaging
● System.ServiceProcess

Globalization: ● System.Globalization
● System.Resources

Net: ● System.Net

Programming Basics: ● System.Collection


● System.IO
● System.Text
● System.Threading

file:///d|/geo_hp/livro_mac1.htm (54 of 85) [01/11/03 18:03:18]


Nova pagina 1
Reflection: ● System.Reflection

Rich Client-Side GUI: ● System.Drawing


● System.Winforms

Runtime Infrastructure Services: ● System.Runtime

Security: ● System.Security

Web Services: ● System.Web

Vejamos alguns exemplos de Namespaces e o que eles contém:

■ System.Data - Objetos e tipos de dados para ADO


■ System.Data.ADO - Objetos para armazenar dados OLEDB (Houve alteração na versão beta 2)
■ System.Data.SQL - Especificações para SQL Server dos objetos ADO (Houve alteração na versão beta 2)
■ System.Data.XML - Objetos XML
■ System.Data.SQLTypes - Tipos para dados SQL

Dependendo do tipo de aplicação que você vai criar , você vai precisar usar o Namespace que contém os objetos relacionados. Por exemplo para usar as
declarações do ADO.NET você vai precisar incluir a seguinte linha no seu código :

imports System.Data.ADO ou <%import NameSpace="System.Data.ADO" %> em uma página


ASP

Para saber quais os membros de um Namespace basta digitar o seu nome e a seguir o ponto. Uma lista será exibida na tela. ( Isto no código VB.NET )

Resumo do resumo: Um NameSpace é usado para declarar uma esfera de ação de maneira a permitir que você organize o seu código e crie seus tipos
globais.

Formatando a saída do console


Uma aplicação do tipo console - Console Application - foi o tema de um dos meus primeiros artigos sobre VB.NET , é claro que a grande parte de nossas
aplicações será do tipo Windows Application , mas não podemos desprezar totalmente o console , um dia você pode precisar dele.

Neste artigo vou mostrar como podemos formatar a saida do console quando escrevemos na tela usando Console.Writeline/Console.Write.

Ao usar Console.Writeline/Console.Write para escrever no console (Tela) podemos usar os modificadores {0} ,{1} ,{2} ,..etc. para exibir valores na tela ,
onde estes modificadores irão receber parâmetros que irão substituí-los durante a execução.

Assim quando escrevemos o código :

file:///d|/geo_hp/livro_mac1.htm (55 of 85) [01/11/03 18:03:18]


Nova pagina 1
Sub Main()
Será exibido no console o valor 10 , que a soma de 3+7. O resultado substitui o modificador
Console.WriteLine("O numero é {0}", 3 + 7)
{0}.
End Sub

Vejamos outro exemplo :

Será exibido no console : 3 + 7 = 10 . Onde:

Sub Main()
● {0} é substituído por 3
Console.WriteLine("O numero é {0} + {1} = {2} ", 3, 7, 3 + 7)
● {1} é substituído por 7
End Sub
● {2} é substituído pelo resultado de 3+7

Quando você usar os modificadores deve estar certo de passar o mesmo número de parâmetros ou um erro de execução irá ocorrer e seu programa será
encerrado.

VB.NET - Declaração de variáveis o que mudou ?


Muitos programadores não se preocupam com noções teóricas ou aspectos técnicos sobre a linguagem que utilizam. O Visual Basic por ser uma ferramenta
RAD , estimula muito o que chamamos programação por tentativa e erro. O que importa é ver o sistema funcionando . Em nome desta funcionalidade
verdadeiras barbaridades são cometidas em Visual Basic.

Vou abordar o que mudou com relação a declaração de variáveis no VB.NET . Posso adiantar que as mudanças foram para melhor em todos os aspectos.
Sem contar que o VB.NET agora é uma linguagem mais bem 'tipada' e isto vai evitar muitas 'loucuras' dantes cometidas ; se você não entender o que está
acontecendo não vai conseguir fazer rodar programas muito simples feitos na versão .NET.

1- Múltiplas declarações em uma única linha de código

Nas versões anteriores do Visual Basic , quando tinhamos múltiplas declarações aparecendo na mesma linha , para definir o tipo correto de dados de cada
variável deveríamos usar a cláusula AS explicitamente na frente de cada variável , ou seja , se você fizer uma declaração assim : Dim a , b c as String . O
que teria ? Vejamos:

Declaração Resultado no Visual Basic 6.0 Resultado no Visual Basic .NET


Dim a , b c as String a e b será do tipo Variant e c será do tipo String a, b e c serão do tipo String

Para obter o mesmo efeito no VB 6.0 teríamos que fazer a declaração assim :

Dim a AS String , b AS String , c AS String

NO VB.NET podemos fazer assim :

Dim a , b , c AS String
file:///d|/geo_hp/livro_mac1.htm (56 of 85) [01/11/03 18:03:18]
Nova pagina 1

2- O tipo de dados padrão

No VB 6.0 se você declarar uma variável sem definir explicitamente seu tipo (sem usar a cláusula AS) o tipo padrão assumido é o tipo Variant. Assim na
declaração :

Dim a A variável a será do tipo Variant => Dim a AS Variant

no VB.NET a mesma declaração tornará a variável a do tipo Object . Object é o valor padrão para variáveis no VB.NET.

Dim a A variável a será do tipo Object => Dim a As Object

3- O escopo das variáveis

O Visual Basic .NET trouxe um novo escopo para as variáveis: o escopo a nível de blocos. Assim no VB.NET quando você declara uma variável dentro de um
bloco de código : FOR...NEXT , DO WHILE , IF..THEN , SELECT...CASE , TRY ... CATCH, etc... ela deixa de existir fora do bloco de código onde foi declarada.

Assim no VB.NET o código abaixo :

For i = 0 to 10 A variável nome será visível somente dentro do bloco de código definido por FOR/NEXT
Dim nome as String
nome = "Carlos" Se você tentar usar a variável nome fora do bloco vai obter a seguinte mensagem de erro:
Next i
nome="" Name 'nome' is not declared.

No VB 6.0 usando a mesma declaração , a variável nome poderia ser usada dentro da função sem problemas.

No VB.NET

4- Declaração de variáveis e conversão entre tipos.

No VB 6.0 quando a fazer a declaração abaixo , você terá :

Dim a , b as Long a será do tipo Variant e b do tipo Long

Se você fizer a seguinte atribuição : a = "Copa 2002" não vai obter nenhuma mensagem de erro.

No VB.NET a mesma declaração irá resultar em

file:///d|/geo_hp/livro_mac1.htm (57 of 85) [01/11/03 18:03:18]


Nova pagina 1

Dim a , b as Integer a será do tipo Integer e b do tipo Integer

Se você fizer a seguinte atribuição : a = "Copa 2002" vai obter uma mensagem de erro.

Se a opção Option Strict estiver definida como ON a mensagem será :

Option Strict disallows implicit conversions from String to Integer.

Se a opção Option Strict estiver definida como OFF a mensagem será :

An unhandled exception of type 'System.InvalidCastException' occurred in microsoft.visualbasic.dll.


Additional information: Cast from String ("Hello world") to Integer is not valid.

Sabe porquê ? Porque a variável a é do tipo de dados Integer e o valor literal "Copa 2002" é considerado do tipo String e isto resultará em tipos
incompatíveis de dados ,ou seja , você não poderá converter String para Integer.

Por outro lado se Option Strict estiver OFF você pode converter entre tipos de dados implicitamente. Veja :

Dim a , b
Quando você não declara as variáveis explicitamente ( não usa a cláusula AS)
a = " Copa "
Se Option Strict for OFF os tipos dados podem ser convertidos
b = 100
a = 2002 na atribuição das variáveis.

5- Inicializando variáveis

No VB.NET podemos inicializar uma variável da seguinte forma :

Dim N as Integer = 7 ou ainda :

Dim X as integer = 1 , Y AS String = "COPA" , Z AS Integer = 2002


Todas estas formas são válidas e não são suportadas pelo Visual Basic 6.

Mas você não pode inicializar mais de uma variável , assim : Dim X, Y as Integer = 10
file:///d|/geo_hp/livro_mac1.htm (58 of 85) [01/11/03 18:03:18]
Nova pagina 1

Resumindo : para inicializar uma variável temos que declará-la usando o tipo e a cláusula AS.

Escopo de variáveis
Quando usamos variáveis de memória , constantes e procedimentos dentro do seu aplicativo VB .NET podemos definir o escopo ou visibilidade deles na sua
aplicação.

No VB . NET podemos ter quatro tipo de visibilidade :

● Block-level - visível apenas no bloco de código no qual a variável foi declarada.


● Procedure-level - visível somente dentro da procedure na qual foi declarada.
● Module-level - visível para todas as procedures no módulo na qual foi declarada.
● Project-level - a variável é visivel a todas as procedures dentro do projeto e da aplicação.

Escopo a nível de bloco de código

Ao declarar uma variável dentro de um bloco de código ( for/next , if/then/else ,Select/case , Do/While) a variável será visível somente dentro do bloco de
código na qual foi declarada. Abaixo temos um exemplo de código que mostra isto.

Escopo a nível de Procedure

Uma variável declarada dentro de um procedimento somente é visível dentro do procedimento. Somente o procedimento que contém a variável declarada
pode usá-la. Estas variáveis são conhecidas como locais ou estáticas. Você pode declará-las usando a declaração Dim com ou sem a palavra chave Static.

Todos os elementos locais , mesmo se eles forem variáveis estáticas , são privados ao procedimento no qual eles foram declarados . Não podemos declarar
um elemento usando a palavra chave Public dentro de um procedimento.

file:///d|/geo_hp/livro_mac1.htm (59 of 85) [01/11/03 18:03:18]


Nova pagina 1
A variável varTeste criada no procedimento rotina1() é local e somente será visível dentro de
rotina1().

Sub rotina1()
- Ao executar o projeto o procedimento rotina1() será executado e o valor 200 será atribuído a
Dim varTeste As Integer
variável varTeste (varTeste=200)
varTeste = 200
rotina2()
MsgBox("Valor de VarTeste = " & varTeste) - A rotina2() será chamada e nela uma variável com o mesmo nome é declarada e o valor 2000 é
End Sub atribuído a ela.

Sub rotina2() - O valor da varTeste será exibido em uma caixa de mensagem com o valor igual a 20000
Dim varTeste As Integer
varTeste = 20000
- Ao retornar a execução para o procedimento rotina1() o valor da variável varTeste é exibido com o
MsgBox("Valor de VarTeste = " & varTeste)
valor 200
End Sub

Isto mostra que a variável varTeste tem o seu valor visível somente em cada rotina que na qual foi
declarada , ou seja , ela é uma variável local.

Escopo a nível de Módulo

Ao declarar variáveis e constantes a nível de módulo elas serão visíveis por todos os procedimentos dentro do seu código. Para fazer isto você deve declarar
a variável fora de qualquer procedimento que exista no projeto. Geralmente isto é feito depois da linha - Windows Form Designer generated code:

Nota : por conveniência , o termo nível de módulo se aplica a módulos, classes e estrutura . Podemos declarar elementos neste nível colocando a declaração
fora de qualquer procedimento ou bloco dentro do módulo , classe ou estrutura.

Visibilidade a nível de projeto (Namespace escopo)

Se você declarar uma variável a nível de módulo usando a palavra-chave Friend ou Public ela torna-se disponível para todos os procedimentos do seu
Namespace. Abaixo a variável strTeste pode ser usada por qualquer procedimento do Namespace. Ex: Public strTeste As String

VB.NET - Conversão entre tipos de variáveis (Casting)


Quando você define o tipo de uma variável esta especificando um intervalo de valores que a variável pode armazenar e um conjunto de operações que uma
file:///d|/geo_hp/livro_mac1.htm (60 of 85) [01/11/03 18:03:18]
Nova pagina 1
aplicação pode realizar com esta variável. Pode ocorrer a necessidade de atribuir um valor de um tipo de variável a uma variável de tipo diferente , ou seja ,
você pode precisar atribuir um valor do tipo inteiro para uma variável definida como do tipo Double ou vice-versa , e, neste caso estamos realizando uma
conversão entre tipos de variáveis diferentes.(Geralmente conhecida como 'Casting')

Quando atribuímos um valor de um tipo 'menor' para um tipo 'maior' , como por exemplo , um valor do tipo Short para um tipo Integer o VB .NET realiza a
operação de forma implícita pois o valor do tipo Short pode ser suportado sem problemas pelo tipo Integer. Nestes casos temos uma conversão implícita
('implicit Cast')

Quando ocorre o inverso , ou seja , quando atribuímos um valor de tipo 'maior' para outra de tipo 'menor' , como por exemplo , um valor do tipo Integer
para um do tipo Short o VB.NET vai truncar que não puder ser suportado pela variável de tipo 'menor'. No caso de Integer (representada no VB.NET por 32
bits) para Short (representada por 16 bits) serão descartados os valores acima de 16 bits. Para evitar isto devemos forçar o VB .NET a realizar uma
conversão entre os tipos , uma conversão explícita , também chamada de coersão (cast).

Para realizar uma conversão explícita ou coersão (cast) no VB .NET podemos usar uma das seguintes funções :

Funcão Propósito
ToBoolean Converte um valor para Boolean (True ou False)
ToByte Converte um valor para um Byte (8-bit) no intervalo de 0 a 255
ToChar Converte um valor para um caracter Unicode (2-byte)
ToDateTime Converte um valor para um objeto DateTime
ToDecimal Converte um valor para um Decimal ( 12-byte )
ToDouble Converte um valor para um Double ( 8 byte )
ToInt16 Converte um valor para um Short (2-byte)
ToInt32 Converte um valor para um Integer (4-byte)
ToInt64 Converte um valor para um Integer (8-byte)
ToSByte Converte um valor para Valor com sinal (8-bit) no intervalo -128 a 127
ToSingle Converte um valor para para um Single (4-byte)
ToString Converte um valor para um String
ToUInt16 Converte um valor para um Short sem sinal (2-byte) no intervalo 0 a 65.535
ToUInt32 Converte um valor para um Integer sem sinal (2-byte) no intervalo 0 a 4.294.967.295
ToUInt64 Converte um valor para um long Integer sem sinal (8-byte) no intervalo 0 a 65.535

Para reduzir possíveis erros que podem ocorrer durante uma conversão entre um tipo de menor para um tipo maior , você pode fazer com que o compilador
VB .NET não permita tais atribuições . Para fazer isto basta utilizar a seguinte declaração no seu código VB .NET : Option Strict on

file:///d|/geo_hp/livro_mac1.htm (61 of 85) [01/11/03 18:03:18]


Nova pagina 1

Ao lado temos um exemplo onde a utilização da


declaração - Option Strict On - não vai permitir
as conversões as conversões implicitas.

No código :

Console.WriteLine(" O valor será truncado : " +


FloatMenor1)

não é permitida a utilização do sinal + para


concatenar o valor com a string.

Também podemos realizar a coerção (cast) usando duas palavras chave para coerção : Ctype e DirectCast que realização a operação para qualquer tipo de
dados.(DirectCast é usada de forma especial nas conversões do tipo Object para qualquer outro tipo.)

No código acima podemos realizar a coerção usando CType da seguinte forma :

file:///d|/geo_hp/livro_mac1.htm (62 of 85) [01/11/03 18:03:18]


Nova pagina 1
Module Module1
Sub Main()
Dim InteiroMaior As Integer = 10000
Dim InteiroMenor As Short
Dim FloatMaior As Double = 0.123456789
Dim FloatMenor1 As Single
Dim FloatMenor2 As Single

InteiroMenor = CType(InteiroMaior, Short)


FloatMenor1 = CType(FloatMaior, Single)
FloatMenor2 = CType(FloatMaior, Single)
Console.WriteLine(InteiroMenor)
Console.WriteLine(" O valor será truncado : " & FloatMenor1)
End Sub
End Module

Podemos também usar as funções de conversão :

CBool | CByte | CChar | CDate | CDec | CDbl | CInt | CLng | CObj | CShort | CSng | CStr

A seguir temos dois exemplos de uso destas funções :

CDbl CInt

A função CDbl converte uma expressão para o tipo Double. A função CInt converte uma valor para Integer.

Dim MyDec As Decimal Dim MyDouble As Double


Dim MyDouble As Double Dim MyInt As Integer
MyDec = 234.456784D MyDouble = 2345.5678
MyInt = CInt(MyDouble) ' MyInt recebe o valor 2346.
'Converte o resultado para Double
MyDouble = CDbl(MyDec * 8.2D * 0.01D)

Conhecendo as estruturas de controle de fluxo


Para construir um programa de computador que seja interativo e que responda de forma diferente dependendo das informações fornecidas pelo usuário
vamos precisar usar um tipo de instrução chamada de instrução de controle. Neste artigo irei abordar as duas categorias de instruções de controle :
instruções condicionais e instruções de laço.

O VB.NET suporta as seguintes estruturas ou instruções de controle :

If ... Then ... Else Select / Case For ... Next


Do ... While While ... End While Do ... Loop
Do .. Until

file:///d|/geo_hp/livro_mac1.htm (63 of 85) [01/11/03 18:03:19]


Nova pagina 1
If... Then ... Else

É utilizada para avaliar uma determinada expressão e definir se um bloco de código deve ou não ser executado. A sintaxe de sua estrutura completa é a
seguinte:

if <condição #1 > Then - Na estrutura básica If Then Else ao lado temos:


[ código #2 ]
ElseIf <condição #2> Then - condição - É a condição a ser avaliada ; pode usar os operadores de comparação ( = , < , > , <> , >= , <=). Se
[ código #2 ] uma condição satisfazer a avaliação o bloco de código associado ao if ou ao ElseIf será executado e sairemos da
ElseIf <condição #3> Then estrutura.
[ código #3 ]
...... - Else - O bloco de código associado a esta instrução somente será executado se nenhuma das condições em If ou
Else ElseIf for satisfeita.
[ código #n ]
End If - End If - Indica o fim da estrutura de controle.

Podemos ter as seguintes variações:

a estrutura na forma mais simples Avaliando uma condição com duas Aninhando duas instruções - If ... Then... Else
possibilidades de execução.
if <condição #1> then
If <condição #1> then [ código #1]
if <condição #1> then [ codigo #1 ] else
[ codigo #1] Else if <condição #2> then
End If [ codigo #2] [ código #2]
End If End If
End If

Além da forma de bloco acima exibida podemos também expressar uma instrução If em uma única linha. Assim :

Instruções If em sequência na mesma linha


a- If < condição #1 > then [ código #1 ] Ex: If x=0 then Valor = 100

b- if < condição #1 > then [ código #2 ] Else [ código #3 ] Ex: If hora > 12 then msg="Boa Tarde" Else msg="Bom dia"

c- if < condição #1 > then [ código #2 ] : [ codigo #3 ] Else [ código #4 ]


Ex: Ex: If hora > 12 then msg="Boa Tarde" : msg2=" >12" Else msg="Bom dia"

Nota: Embora as instruções em uma única linha as vezes possam dar ao código uma melhor aparência (caso a) você dever considerar se a leitura do código
não vai ficar mais difícil.

Existe ainda a instrução IIF que pode ser aplicada em situações em que existam apenas duas ações , uma verdadeira e outra falsa. Sua sintaxe é :

iif ( <condição #1> , < código executado se a instrução for verdadeira> , <código se a instrução for falsa>)

Ex:

file:///d|/geo_hp/livro_mac1.htm (64 of 85) [01/11/03 18:03:19]


Nova pagina 1

Function Verifica (ByVal Teste As Integer) As String


Verifica = IIf(Teste > 1000, "Grande", "Pequeno")
End Function

Operadores de comparação

Geralmente nas condições usamos expressões de comparação onde duas expressões não booleanas utilizam um operador para realizar uma comparação. Os
operadores disponíveis são :

> maior que


< menor que
= igual a
<> diferente de
>= maior ou igual a
<= menor ou igual a
Like verifica correspondência de padrões entre strings

Estes operadores são usados com strings e com valores numéricos.

No caso do operador especial Like podemos comparar uma variável de string com padrões que usam caracteres especiais e comuns. Estes caracteres podem
ser:

* indica a quantidade de caracteres adicionais


? repesenta um único caractere
# representa um dígito {0-9}
intervalos [a-z] , [j-k] , etc. especifica que qualquer caractere dentro do intervalo dever ser considerado uma correspondência

Ex: if "Macoratti" Like "M*tti" then [código]

Operadores Lógicos

Os operadores lógicos trabalham com expressões ou valores booleanos e retornam um resultado booleano ( Verdadeiro / Falso , Sim / Não ). Nesta categoria
temos os seguintes operadores :

AND Usando este operador entre dois valores/expressões só obtemos um resultado igual a verdadeiro SE os dois forem verdadeiros.
OR Com este operador se um dos valores/expressões for verdadeiro o resultado será verdadeiro
XOR Gera um resultado verdadeiro se um dos valores/expressão for verdadeiro e o outro for Falso.
NOT Operador de negação e retorna o oposto a qualquer valor que for usado com ele.

A seguir temos um tabela com algumas combinações possíveis entre os operadores lógicos.

TRUE AND TRUE TRUE

file:///d|/geo_hp/livro_mac1.htm (65 of 85) [01/11/03 18:03:19]


Nova pagina 1
FALSE AND TRUE FALSE
TRUE AND FALSE FALSE
FALSE AND FALSE FALSE
TRUE OR TRUE TRUE
TRUE XOR FALSE TRUE
NOT TRUE FALSE
NOT FALSE TRUE

A estrutura Select Case : múltiplas possibilidades

A estrutura Select Case é usada quando temos que verificar muitas condições , neste caso , embora você ainda possa usar a estrutura If.. Then ... Else ela
poderia se tornar muito complexa e difícil de tratar. Sua sintaxe é a seguinte:

Select Case < expressão >


Case < condicao #1>
[ codigo #1] - <expressão> é a variável ou expressão que esta sendo comparada
Case < condicao #2>
[ codigo #2] - <condicao> é a condição lógica a ser avaliada
.....
Case Else - Case Else - executa o bloco de código associado se nenhuma condição anterior for verdadeira.
[ código #3]
End Select

A utilização da instrução Select Case pode simplificar muito o código, abaixo as possibilidades :

Select Case quantidade


Case 1
call rotina1()
Case 2,4 - podemos trabalhar com mais de uma opção para a condição : Case x,y
call rotina2()
Case 5 to 9 - podemos definir uma faixa de valores : Case x to y
call rotina3()
Case else
call rotina4()
End Select

Laços

Quando você precisar executar um bloco de código mais de uma vez deverá usar o tipo de instrução laço (loop). Vejamos os principais:

For ... Next

Repete o mesmo bloco de código um determinado número de vezes independente de qualquer condição lógica: Sua sintaxe é :

For <contador = valorinicial > To - contador : variável númerica que controla o número de vezes que o código será executado.
<valorfinal> [step] - ValorInicial - Valor inicial atribuído ao contador

file:///d|/geo_hp/livro_mac1.htm (66 of 85) [01/11/03 18:03:19]


Nova pagina 1
[ código #1] - Valorfinal - valor final que o contador irá assumir antes de encerrar a execução do laço.
exit for - Step - especifica o valor de incremento do contador.O valor padrão é de uma unidade.
Next [contador] - Exit For - interrompe a execução do laço

Abaixo um exemplo de utilização de For / Next:

For x=1 to 100 step 2


x = x+10
if x > 68 then
exit for
endif
Next

Você usa o laço for/next quando sabe exatamente quantas vezes o bloco de código deverá ser executado.

Para percorrer vetores ou objetos com um número determinado de elementos podemos usar o laço For Each/Next:

O laço For Each...Next é idêntico ao laço For...Next mas executa o bloco de código para cada elemento em uma coleção , ou invés de executar um
determinado número de vezes. Sua sintaxe é :

For Each elemento In coleção


'[código a ser executado para cada valor do elemento]
Next [ elemento ]

Os elementos da coleção podem ser qualquer tipo de dados. Para cada interação no laço o VB.NET define a variável elemento para um dos elementos na
coleção e executa o código.

While ... End While

Este laço é mais flexível que o laço for/next . Ele executa o bloco de código enquanto uma expressão booleana for verdadeira.

While < expressão booleana >

- Você pode usar qualquer expressão booleana


[ código #1]

Nota: No visual basic 6 havia a instrução While/Wend , no VB.NET a instrução Wend foi substituida por End
End While
While.

Ex:

While contador < 10 And valor = 5


contador = contador + 1
End While

file:///d|/geo_hp/livro_mac1.htm (67 of 85) [01/11/03 18:03:19]


Nova pagina 1

Do ... Loop

Este laço além de ser simples é um dos mais flexíveis , ele executa o bloco de código enquanto uma condição for verdadeira. A sintaxe é a seguinte :

Do [ {While | Until} <expressão >

[bloco de código] - <expressão> - qualquer expressão numérica ou de string avaliada pelo laço

[Exit Do] - Exit Do - interrompe a execução do laço.

Loop

Temos então as seguintes estruturas possíveis:

Do While <condição > Do Until <condição >

[ código ] [ código ]

Loop Loop
Faça enquanto a expressão for verdadeira Faça até que a expressão torne-se verdadeira

A diferença entre Do While e Do Until é o modo como a estrutura avalia a expressão lógica. Para o Until o bloco será executado enquanto o valor da
expressão for Falsa.

Ao escolher entre um laço While e Until use o laço que não precisar de uma negação na expressão condicional.

Tenha cuidado a posicionar a sua instrução condicional. Se você colocar a condição no início do laço , o código no interior do laço nunca será executado se a
condição não for atendida.

Você pode colocar a condição de saída no final do laço , assim :

Do

[Código #1}

Loop Until <condição #1>

Nota: se a expressão da condição for Null o VB.NET tratará a condição como False.

Você deve tomar cuidado com o seu código dentro dos laços pois isto pode afeta o desempenho de sua aplicação. Abaixo algumas dicas para ajudar a você
ter um código rápido:

● Evite fazer chamadas a funções dentro de laços


● Tenha sempre uma condição de saída de um laço
file:///d|/geo_hp/livro_mac1.htm (68 of 85) [01/11/03 18:03:19]
Nova pagina 1
● Não torne a condição de saída de um laço muito complexa pois ele precisa ser avaliada a cada passo
● Ao utilizar expressões booleanas coloque a parte mais simples da expressão do lado esquerdo

Laço Infinito - Um laço infinito é um laço que executa o código no seu interior e não tem condição de saída , ou seja, o código será executado infinita
vezes...

Dica: Se por um erro de lógica seu código entrar em um laço infinito use as teclas CTRL+Break para encerrá-lo. Abaixo um exemplo de um laço infinito:

Dim i as integer = 0

While i < 100


Adivinhe por que o laço ao lado é infinito ????
Console.Writeline(i)

End While

Para evitar um laço infinito procure adotar os seguintes procedimentos:

● Inicialize a variável de controle


● Teste o valor da variável de controle
● Execute o bloco de código e verifique se ele esta correto
● Verifique se o valor da variável de controle esta sendo alterado

Recursão

É claro que os laços nem sempre são a melhor solução para todos os problemas. Em alguns casos você pode usar a recursão como uma alternativa aos
laços. A recursão ocorre quando um programa ou rotina chama a ele próprio. Um exemplo clássico para mostrar como a recursão funciona é o cálculo do
um fatorial.

A fórmula para calcular um fatorial de um valor n é = n! onde fazemos n ! = (n -1)(n-2)...(n-(n-1))(1). Assim para o fatorial para o número 5 seria : 5! =
5x4x3x2x1 = 120 . A fórmula geral para calcular o fatorial pode ser então expressa como : n * (n-1) ! ( n multiplicado pelo fatorial de n menos 1).

A seguir temos o código que usa a recursão ao invés de laços para calcular o fatorial de um número inteiro.

file:///d|/geo_hp/livro_mac1.htm (69 of 85) [01/11/03 18:03:19]


Nova pagina 1
Public Class Fatorial

Shared Sub Main()

Dim entrada As String


Dim numero As Integer
Dim contador As Integer

Console.Write(" >>> Calculo do Fatorial <<< ")


Console.WriteLine("")
Console.WriteLine("Informe o número para calcular o fatorial ")

entrada = Console.ReadLine()
numero = CInt(entrada)
Console.Write("")
Console.Write(" O valor do fatorial para " & numero & " é : ")
Console.WriteLine(Fatorial(numero))
Console.ReadLine()

End Sub
Shared Function Fatorial(ByVal n As Integer) As Integer

If n = 1 Then
Return 1
Else
Return n * Fatorial(n - 1)
End If
End Function

End Class

Embora sejam conceitos básicos é de suma importância que você compreenda bem as estruturas de controle de fluxo para criar um código robusto e legível.

Funções Matemáticas - VB6 e VB.NET


A seguir vamos comparar as principais funções matemáticas presentes no VB6 e VB.NET. Quando a função não existir irei mostrar uma função que se
aproxima do resultado da função implícita.

Para o VB.NET teremos que importar o namespace - System.Math usando a declaração imports ou acessar os métodos a partir da classe Math.

1-)

Funções Gerais

Valor Absoluto - Absolute valor - Abs -

file:///d|/geo_hp/livro_mac1.htm (70 of 85) [01/11/03 18:03:19]


Nova pagina 1
Dado um número , a função valor absoluto retorna o valor positivo para este número. Ex: abs(-15) = 15

VB 6 VB .NET

abs(valor) imports System.Math ou se não desejar usar a declaração: imports System.Math


Abs(valor) Math.Abs(numero)

Ceiling -

Retorna o menor número inteiro maior que ou igual ao número especificado.

VB 6 VB .NET

VB 6 não possui esta função. Podemos usar o código a seguir: métdo Ceiling shared

public function Ceil(valor as double) imports System.Math

Ceil = CDbl(CLng(valor + 0.5))


Ceiling(valor)
end function
Esta função retorna um double.
Clng arredonda para o decimal mais próximo para forçar somamos
0.5. Só funcionará para valores entre -2,147,483,648 e According to the MSDN documentation, "the behavior of this method follows IEEE
2,147,483,647. Standard 754, section 4."

Exp - e elevado a potência de um número indicado

VB 6 VB .NET

Função exp - Retorna um double. métdo Exp shared - Retorna um double.

exp(valor as number) imports System.Math

Exp(valor)

Exponenciação - Pow ( VB6 operador ^)

VB 6 VB .NET

file:///d|/geo_hp/livro_mac1.htm (71 of 85) [01/11/03 18:03:19]


Nova pagina 1

Operador : ^ = base ^ power métdo Pow shared - Retorna um double.

x^y imports System.Math

Retorna um double . Pow(base, power) ou Math.Pow(base, power)

Floor -

Retorna o maior número inteiro menor que ou igual ao número especificado.

VB 6 VB .NET

VB 6 não possui esta função. Podemos uar o código abaixo:d métdo Floor shared

public function Floor(valor as double) imports System.Math

Floor = CDbl(CLng(valor - 0.5))


Floor(valor) ou Math.Floor(Valor)
end function
Retorna um double.
Só funciona na faixa de valores -2,147,483,648 e 2,147,483,647 .

Logarítimo

VB 6 função log - Retorna um double.

Log(valor as number)

VB .NET método Log shared , base e - Retorna um double.

imports System.Math

Log(valor)

ou

método Log10 shared - Retorna um double.

imports System.Math

Log10(valor)

ou

file:///d|/geo_hp/livro_mac1.htm (72 of 85) [01/11/03 18:03:19]


Nova pagina 1

método Log shared , qualquer base - Retorna um double.

imports System.Math

Log(valor, base)

Max -

retorna o maior valor entre dois valores

VB 6 O VB 6 não possui esta função . Podemos usar o código abaixo:

Function Max(valor1 as Double, valor2 as Double) as Double

if (valor1 > valor2 2) then


Max = valor1

else
Max = valor2

end if

End Function

VB .NET método Max shared

imports System.Math

Max(valor1, valor2)

valor1 and valor2 precisam ser do mesmo tipo.

Min -

retorna o menor valor entre dois valores.

VB .NET método Min shared

imports System.Math

Min(valor1, valor2)

valor1 and valor2 precisam ser do mesmo tipo.

file:///d|/geo_hp/livro_mac1.htm (73 of 85) [01/11/03 18:03:19]


Nova pagina 1

VB VB 6 não possui esta função . Podemos usar o código abaixo:

Function Min(valor1 as Double, valor2 as Double) as Double

if (valor1 < valor2 2) then


Min = valor1

else
Min = valor2

end if

End Function

Gerar números aleatórios

VB Função Rnd

Rnd([numero])

Função Randomize

Randomize([semente])

Retorna um valor double contendo um número aleatório entre 0 e 1 com até 7 casas decimais.

● No VB, Rnd pode tomar um argumento opcional que determina o tipo de números aleatórios retornados:
● Se numero < 0: o mesmo número usando o numero como semente
● Se numero > 0: o próximo número aleatório na sequência.
● Se numero = 0: o número mais recente gerado.
● nenhum valor fornecido: o próximo número aleatório na sequência.

O VB possui a declaração Randomize que realimenta o gerador de números usando a semente para alimentar o gerador.

file:///d|/geo_hp/livro_mac1.htm (74 of 85) [01/11/03 18:03:19]


Nova pagina 1

VB .NET classe Random

A plataforma .NET fornece a classe Random para gerar números aleatórios:

A classe Random fornece dois construtores:

● Random(), cria uma instância da classe usando o valor da semente baseada na hora atual.
● Random(semente), cria uma instância da classe usando um semente do tipo integer como valor da semente.

Um gerador de números randômicos usa o valor da semente para gerar uma sequência de números pseudo-randômicos. Quando você quer
um novo número randômico , o gerador fornece o próximo número naquela sequência. É por isto que todos os métodos da classe Random
começam com Next.

Método Next

O método Next retorna um inteiro randômico. Há três variações:

● myRandom.Next(), retorna um inteiro positivo no intervalo de 0 a 2,147,483,646


● myRandom.Next(valor), retorna um inteiro positivo no intervalo de 0 até (valor - 1). valor precisa ser um interiro maior ou igual a
zero.
● myRandom.Next(MenorValor, MaiorValor), retorna um inteiro positivo no intervalo de MenorValor até (MaiorValor - 1). MenorValor e
MaiorValor . Precisa ser inteiros e MaiorValor deve ser maior ou igual a MenorValor.

Método NextDouble

myRandom.NextDouble()

Este método retorna um randômico do tipo double entre 0.0 e 1.0.

método NextBytes

myRandom.NextBytes(myByteArray)

Este métdo preenche um dado array de bytes com valores randômicos.

Arredondar - Rounding - arredonda para o inteiro mais próximo

VB 6 CInt(valor as number or String)

CLng(valor as number or String)

As funções CInt e CLng realizam um arredondamento mas também retorna valores inteiros ou longos.

file:///d|/geo_hp/livro_mac1.htm (75 of 85) [01/11/03 18:03:19]


Nova pagina 1

VB .NET método Round shared

imports System.Math

Round(valor)

valor precisa ser um Decimal ou um double.

Round shared method, round with specified precision

imports System.Math

Round(valor, numerodeDecimais)

valor precisa ser um Decimal ou um double. numeroDeDecimais precisar ser do tipo int.

Sinal de um número

VB 6 função Sgn

Sgn(valor)

Retorna um númreo indicando o sinal de valor.

Se valor for Sgn retorna


maior que zero 1
zero 0
menor que zero -1

VB .NET método Sign shared

imports System.Math

Sign(valor)

Retorna um valor do mesmo tipo de valor.

Raiz quadrada

file:///d|/geo_hp/livro_mac1.htm (76 of 85) [01/11/03 18:03:19]


Nova pagina 1

VB 6 função Sqr

Sqr(valor as number)

Retorna um double.

VB .NET método Sqrt shared

imports System.Math

Sqrt(valor)

Retorna um double.

Usando alguns métodos do namespace System.Math


O VB.NET trouxe uma verdadeiro arsenal de propriedades , métodos e funções que facilitam a vida do programador Visual Basic. Neste artigo vou mostrar
alguns métodos presentes no namespace System.Math que realiza operações matemáticas . Vou apresentá-los :

1- Método System.Math.Ceiling

Public Shared Function Ceiling( ByVal numero As Double ) As Double

Recebe como parâmetro o número e faz o arredondamento para o menor número entre o número e sua parte inteira. Assim Floor(1.1) irá retornar 1. Faz
um arredondamento para 'baixo'.

Ex:
Resultado

System.Console.Writeline(" Resultado " & System.Math.Floor(1.1) ) 1


System.Console.Writeline(" Resultado " & System.Math.Floor(1.5) ) 1
System.Console.Writeline(" Resultado " & System.Math.Floor(1.8) ) 1

2- Método System.Math.Floor

Public Shared Function Floor( ByVal numero As Double ) As Double

Recebe como parâmetro um número do tipo Double e retorna o valor arredondado para o maior número entre parte inteira do número e o número. Assim
Ceiling(1.1) irá retornar 2 . Faz um arredondamento para 'cima'.

Ex:
Resultado

file:///d|/geo_hp/livro_mac1.htm (77 of 85) [01/11/03 18:03:19]


Nova pagina 1
System.Console.Writeline(" Resultado " & System.Math.Ceiling(1.2) ) 2
System.Console.Writeline(" Resultado " & System.Math.Ceiling(1.6) ) 2
System.Console.Writeline(" Resultado " & System.Math.Ceiling(1.8) ) 2

3- Método System.Math.Power

Public Shared Function Pow(ByVal x As Double, ByVal y As Double ) As Double

Retorna o resultado de um número elevado a outro número.

Ex:
Resultado

System.Console.WriteLine(" 2 elevado a 3 = " & System.Math.Pow(2, 3)) 8


System.Console.WriteLine(" 3 elevado a 4 = " & System.Math.Pow(3, 4)) 81
System.Console.WriteLine(" 5 elevado a 3 = " & System.Math.Pow(5, 3)) 125

4- Método System.Math.Round

Recebe um número do tipo Double ou Decimal (dependendo de qual método e qual parâmetro você usar) e retorna o valor arredondado mais próximo do
número informado. Assim round(1.49) irá ser arredondado para 1.5 . Se você desejar arredondar usando dois dígitos : round(1.456,2) irá obter 1.46 .
Perceba que o arredondamento leva em conta a casa decimal . Assim round(1.444 , 2) irá resultar em 1.44 enquanto que round(1.446,2) resultará em 1.45.

Temos as seguintes possibilidades :

Overloads Public Shared Function Round( ByVal value As Double, ByVal digits As Integer ) As Double
Overloads Public Shared Function Round( ByVal a As Double ) As Double
Overloads Public Shared Function Round( ByVal d As Decimal, ByVal decimals As Integer ) As Decimal

Ex:
Resultado

System.Console.WriteLine(" 1.49 = " & System.Math.Round(1.49, 1)) 1,5


System.Console.WriteLine(" 1.50 = " & System.Math.Round(1.5, 1)) 1,5
System.Console.WriteLine(" 1.51 = " & System.Math.Round(1.51, 1)) 1,5
System.Console.WriteLine(" 2.449 = " & System.Math.Round(2.449, 2)) 2,45
System.Console.WriteLine(" 2.509 = " & System.Math.Round(2.509, 2)) 2,51
System.Console.WriteLine(" 3.474 = " & System.Math.Round(3.47, 2)) 3,47
System.Console.WriteLine(" 3.559 = " & System.Math.Round(3.5, 2)) 3,5

Obs: se você importar o namespace no seu código : Imports System.Math não precisará informar todo caminho usado pelos métodos.

Nota : Para arredondar usando o VB 6 você lembra como fazer ? Não ?? veja a função abaixo:

file:///d|/geo_hp/livro_mac1.htm (78 of 85) [01/11/03 18:03:19]


Nova pagina 1
Public Function ArredondaNumero(NumeroInformado As Variant, CasasDecimais As Integer) As Variant

Dim Temp As Double, Decimais As Long

Temp = CDbl(NumeroInformado)
Decimais = 10 ^ CasasDecimais
ArredondaNumero = (Fix((Temp + 0.5 / Decimais) * Decimais)) / Decimais

End Function

Usando Option Explicit , Option Strict e Option


Compare
A opção Option Explicit (Opção Explicita) já deve ser uma velha conhecida dos tempos do VB6 ( pelo menos deveria ser ). A opção Option Explicit impede
que você use uma variável sem criá-la , evitando com isto muitos erros que podem acontecer quando uma variável nova e vazia é automaticamente criada
se você errar o nome de uma variável que já existe.

A opção Option Strict é nova , e foi implementada no VB.NET ; usando a opção Option Strict evitamos os erros em tempo de execução que se originam de
conversões automáticas de variáveis. Assim , na conversão de uma variável do tipo Int32 para o tipo Int16 ocorre um estreitamento que pode ou não dar
certo pois podem existir valores que ao serem convertidos para int16 percam a precisão. Se você trabalhar com a opção Option Strict desativada , o VB
vai deixar você tentar , se der certo muito bem se não der ....

Vamos a um exemplo :

O código abaixo trabalha com a opção Option Strict desativada :

Option Strict Off

Private Sub Calculo(NumeroMaior as Int32 , NumeroMenor as Int16)

Dim troca as int32

troca = NumeroMaior

NumeroMenor = troca

End Sub

O VB não vai reclamar e não indicará erro neste código seu projeto vai rodar bem até que você tente fazer a conversão de um número maior que 32.767 , ai
sim vai ocorrer um erro na sua aplicação...

Se ativarmos a opção Option Strict o código fica assim :

file:///d|/geo_hp/livro_mac1.htm (79 of 85) [01/11/03 18:03:19]


Nova pagina 1
Option Strict On

Private Sub Calculo(NumeroMaior as Int32 , NumeroMenor as Int16)

Dim troca as int32

troca = NumeroMaior
NumeroMenor = troca
if NumeroMaior > NumeroMenor.Value then
MessageBox " Atenção ! Este número não suporta a conversão "
else
NumeroMenor = Ctype(troca, Int16)
endif
End Sub

End Sub

Com a opção Option Strict ativada , a coisa muda de figura. Durante a fase de projeto o VB.NET irá sublinhar o código e será gerado um erro em tempo de
compilação. O VB.NET não permite a você usar o código sem fazer a modificação explícita ( manual ) . Você é avisado em tempo e pode ajustar o seu
código.

Conselho : Use Option Explicit e Option Strict sempre ativas !

Para ativar estas opções faça o seguinte:

1. Clique com o botão direito do mouse no seu projeto na janela Solution Explorer
2. Selecione Properties
3. Na opção Common Properties selecione a opção Build (veja figura abaixo)

4. - Agora Ative as opções conforme figura


file:///d|/geo_hp/livro_mac1.htm (80 of 85) [01/11/03 18:03:19]
Nova pagina 1
ao lado

Pronto ! seu projeto já esta imune a erros de conversão forçada e a variáveis que surgem do nada....

Agora vamos falar da opção - Option Compare - ela é usada a nível de arquivo para declarar o método de comparação padrão que será usado quando da
comparação de dados string. A sintaxe é :

Option Compare { Binary | Text } onde:

Binary
Resulta em uma comparação de strings baseada na ordem derivada da representação binária interna dos caracteres.
Text
Resulta em uma comparação de strings baseada na ordenação case-sensitive determinada pela configuração local do sistema.

Para usar Option Compare devemos fazer a declaração antes de qualquer outra instrução. O método de comparação de strings é definido para uma classe ,
módulo ou estrutura . O valor padrão para a comparação de textos é o valor Binary.

Lembre-se que no Windows a ordem da ordenação é determinada pela página de código. A seguir vemos um exemplo que usa Option Compare Binary , o
que produz uma ordenação binária.

A<B<E<Z<a<b<e<z<À<Ê<Ø<à<ê < ø

Quando os mesmos caracteres são ordenados usando - Option Compare Text , a seguinte ordem é produzida:

(A=a) < ( À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)

Para encerrar vejamos um exemplo que usa Option Compare para definir o método padrão de comparação de strings.

file:///d|/geo_hp/livro_mac1.htm (81 of 85) [01/11/03 18:03:19]


Nova pagina 1

' Define o método de comparação de strings para Binary.


Option Compare Binary ' "AAA" é menor que "aaa".
' Define o método de comparação de strings para Text
Option Compare Text ' "AAA" é igual a to "aaa".

A Passagem de parâmetros
Você lembra como era a passagem de parâmetros para funções/ procedimentos no VB 6.0 ??? Esqueceu ???

Vou refrescar sua memória .... !!!

No VB 6.0 quando passamos um parâmetro , se não for definido se o parâmetro é passado por valor - ByVal - ou por referência - ByRef - o VB assume como
padrão que o parâmetro vai ser passado por referência (ByRef).

Você se lembra que quando passamos um parâmetro por referência o parâmero pode ter o seu valor alterado dentro da função/procedimento chamada. ?
Deve lembrar também que isto pode trazer muitas dores de cabeça para você ...

Quer ver o porque ??? Então estudo o código abaixo e responda a seguinte pergunta :

" Qual vai ser o valor da variável X ??? "

Private Sub Form_Load()


Dim x As Integer
Dim y As Integer

x = 10
y = Passa_Parametro_Por_Referencia(x)

MsgBox " y é igual a " & y & vbCrLf & " x é igual a " & x, vbCritical, "Passagem de parametros
ByRef"

End Sub

Function Passa_Parametro_Por_Referencia(valor As Integer) As Integer

valor = valor + 10
Passa_Parametro_Por_Referencia = valor

End Function

Execute o projeto e você verá o seguinte resultado :

file:///d|/geo_hp/livro_mac1.htm (82 of 85) [01/11/03 18:03:19]


Nova pagina 1

Percebeu que o valor da variável X foi alterado na função - Passa_Parametro_Por_Referencia

Isto acontece por que quando passamos a variável A como parâmetro para a função o VB 6.0 passou o parâmetro por
referência , visto que não informamos nada a respeito.

No VB.NET não temos este problema por que o padrão da passagem de parâmetros no VB.NET é sempre Por Valor (ByVal)

O mesmo código acima executado no VB.NET irá retornar para a variável X o valor igual a 10. Ou seja o valor original da variável X é mantido após a
chamada da função...

Então lembre-se o padrão da passagem de parâmetros no VB é sempre por valor.

As novas extensões dos arquivos gerados no VB.NET


Você já deve estar cansado de saber o significado das extensões dos arquivos gerados pelo seu velho Visual Basic quando da criação de um projeto. É claro
que dependendo do tipo de aplicação você terá certas extensões e não terá outras. Vamos relembrar as principais extensões :

1. Os arquivo de projetos possuem a extensão .vbp


2. Os arquivos que guardam a posição de cada janela quando da ultima vez que foi carregada possuem a extensão .vbw
3. Os formulários a extensão .frm ( se houver imagens no formulário será gerado um arquivo .frx )
4. Os módulos possuem a extensão .bas
5. Os arquivos com módulos de classe possuem a extensão .cls

Se você criar um novo projeto VB.NET e procurar as extensões acimas citadas não vai encontrar... Mudou tudo... Vamos ver quais as novas extensões de
arquivos criados no VB.NET :

.vbproj , .vbproj.user - arquivos de projeto do Visual Basic .NET ( corresponde ao arquivo vbp)
.vb - arquivos de código Visual Basic .NET. Pode conter forms ,módulos , classes, etc.
.sln - arquivos de solução ; pode conter um ou mais projetos.
.suo - arquivo relacionados a solução ; guarda opções personalizadas da sua solução. (Solution User option)
.obj , .o - arquivos objeto compilados e não linkeditados usados na depuração
.pdb - arquivo de banco de dados de depuração e da situação do projeto (criado com a opção /debug)
.resx - arquivo de recursos em formato XML
- gerado e atualizado automaticamente pelo Windows Forms Designer toda vez que um controle licenciado é colocado no
.licx formulário.
- Manifesto da Assembly. Arquivo associado por padrão a todo projeto VB.NET que contém metadados com informações sobre
AssemblyInfo.vb
a assemblies do projeto.

file:///d|/geo_hp/livro_mac1.htm (83 of 85) [01/11/03 18:03:19]


Nova pagina 1

Os arquivos de módulo (.bas ) , de classes (.cls) e forms recebem agora a mesma extensão : .vb pois possuem todos o mesmo formato geral com a nova
orientação a objetos do VB.NET.

Assustado com as novas extensões ??? Calma , em geral um projeto simples no VB.NET será composto apenas por arquivos .vbproj e arquivos .vb.

Usando número de linhas no seu código


Você deve estar achando muito estranho o título desta dica !!! Mas é isto mesmo , no VB.NET podemos ativar a numeração de linha no código.

Lembra do velho BASIC que usava número de linhas para onde podíamos desviar uma instrução ? Pois é , o VB.NET também permite usar número de
linhas no seu código. Vamos mostrar como fazer isto :

1. Abra o seu arquivo de soluções no VB.NET e selecione a opção Tools do menu


2. A seguir clique na opção - Options
3. Na janela Options selecione a guia - Text Editor
4. Agora selecione a guia - Basic
5. Selecione a opção - General
6. Marque a caixa de verificação onde esta opção -Display - Line Numbers. (Veja abaixo)

Veja como fica o seu projeto :


file:///d|/geo_hp/livro_mac1.htm (84 of 85) [01/11/03 18:03:19]
Nova pagina 1

Embora possamos ativar a numeração de linhas no código , não podemos incluir diretamente novos números nem alterar os existentes.

Quer um motivo para usar número de linhas ? Que tal personalizar uma mensagem de erro que retorne o número da linha onde o mesmo ocorreu ?

Jose Carlos Macoratti - www.macoratti.net

file:///d|/geo_hp/livro_mac1.htm (85 of 85) [01/11/03 18:03:19]