Você está na página 1de 151

Visual Studio.

Net

Autor:
Paulo Cesar Macedo
Apostila de VISUAL STUDIO .NET
1 - Introduo ao Visual Basic .NET .....................................................................................................3
1.1 Hardware necessrio para instalao ........................................................................................3
1.2 Conceitos para o desenvolvimento de aplicativos Microsoft ...................................................4
2 - Estudo da Linguagem Visual Basic .NET ........................................................................................8
2.0 Arquivos gerados pelo Visual Basic .NET ...............................................................................8
2.1 - Nova Estrutura do programa escrito em VB .Net....................................................................10
2.2 Atribuir nomes aos elementos do seu programa .....................................................................11
2.3 Utilizando quebra de linha e combinao de cdigo ..............................................................11
2.4 Caracteres especiais no VB .Net .............................................................................................12
2.5 Criar comentrios no Cdigo ..................................................................................................12
2.6 Limitaes do Visual Basic .NET...........................................................................................13
2.7 - Compilao Condicional .........................................................................................................13
2.7.1 Criando Constantes de declarao Condicional...............................................................14
2.7.2 Ocultando ou expandindo o cdigo .................................................................................14
2.8 Tcnicas de codificao e programao .................................................................................14
2.9 Declarando Elementos ............................................................................................................20
2.10 Tipos de Dados .....................................................................................................................27
2.10.1 Estruturas de dados ........................................................................................................37
2.10.2 Matrizes (Arrays) ...........................................................................................................38
2.11 Objetos ..................................................................................................................................44
2.12 Strings ...................................................................................................................................46
2.13 - Constantes e Enumeraes ....................................................................................................49
2.14 Operadores ............................................................................................................................52
2.15 Procedures (Procedimentos) .................................................................................................62
2.16 - Collection (Colees) ............................................................................................................73
2.17 - Estruturas de Controle de Fluxo ............................................................................................76
2.18 - Visual Basic .NET e a programao orientada a objeto ........................................................84
2.18.1 Early bound e Late bound ..............................................................................................85
2.18.2 Palavra chave New e liberando recursos do Sistema.....................................................86
2.18.3 Trabalhando com Grupos de Objetos ............................................................................87
2.18.4 - Obtendo informaes de uma classe ..............................................................................88
2.18.5 - Classes ............................................................................................................................89
2.18.6 Propriedades, Campos e Mtodos de uma Classe..........................................................98
2.18.7 Eventos e Delegar ........................................................................................................103
2.18.8 Interfaces no VB .NET ................................................................................................110
2.18.9 Herana (Inherits) ........................................................................................................112
2.18.10 Construtores e Destrutores na hierarquia de classes ..................................................118
2.18.11 Polimorfismo..............................................................................................................120
2.18.12 Criando um hierarquia de heranas............................................................................122
2.19 Operaes com Componentes COM...................................................................................123
2.20 Multithreading.....................................................................................................................125
2.21 Drivers, Pastas e Arquivos ..................................................................................................129
2.21.1 - A classe System.IO.......................................................................................................129
2.21.2 Acessando arquivos com as funes internas do VB...................................................130
2.21.3 Acessando arquivos com FileSystemObject................................................................138
2.22 Manipulando excees (Exception) ....................................................................................141
2.22.1 Manipulador estruturado de excees..........................................................................141
2.22.2 Manipulador de excees no estruturado ...................................................................143
3 Viso Geral da Tecnologia .NET Framework .............................................................................146
3.1 Infraestrutura NET ................................................................................................................146

2
1 - Introduo ao Visual Basic .NET
A Microsoft lanou as verses mais significativas do Visual Basic, conforme abaixo :

Visual Basic 1 Facilitou a criao de aplicativos DESKTOP para Windows.


Visual Basic 4 Incluiu a nova tecnologia COM2 que permitia a criao de controles OCX,
arquivos DLL e servidores EXE para Windows.
Visual Basic .NET Incorpora uma nova Tecnologia denominada .NET Framework,
especialmente criada para Internet, Aplicativos Servidores, Componentes e XML.

O pacote Visual Studio .NET substitui e aposenta o Visual Studio 6.0 e anteriores, assim como o
Visual Basic .NET substitui e aposenta o VB 6.0, 5.0 e 4.0. O VB .NET faz parte do pacote Visual
Studio .NET.

Agora, o Visual Basic 7.0 ou Visual Basic .NET (pronuncia-se DOT NET) pode ser usado para criar
qualquer aplicativo Windows Cliente, Servidor, Internet, no precisando usar nenhuma outra
ferramenta.

O Visual Basic s trabalha com a Tecnologia .NET e de agora em diante qualquer aplicativo criado
com o Visual Basic .NET GERENCIADA e no mais interpretada ou nativa (VB 6.0), alm disso,
utiliza novos recursos de desenvolvimento procedentes do C++.

O Visual Basic uma ferramenta denominada pela Microsoft de RAD Rapid Application
Development que possibilita a criao de aplicativos rapidamente sem preocupar-se com os detalhes
da programao Windows, portanto uma ferramenta de alta produtividade.

O Visual Basic a combinao de trs componentes :

Visual o componente que usado para criar a Interface Grfica de Usurio (GUI), assim voc
usa os objetos pr-construdos para criar a sua tela. Se no fosse por intermdio desse componente,
voc seria obrigado a digitar linhas e mais linhas de cdigo para desenhar uma simples janela,
alm de utilizar as centenas de funes API do Windows. O ambiente visual conhecido como IDE
(integrated Development Enviroment) que possui um kit de ferramentas para o desenvolvimento.
Basic a linguagem Basic criada em 1964, adicionado de Mtodos, Funes, Comandos,
Propriedades e Eventos. Tudo isso foi herdado do Ambiente grfico do Windows.
Plataforma .NET um conjunto de centenas de classes e objetos pr-construdos pela Microsoft
para serem utilizados na codificao do aplicativo, alm disso possui vrios arquivos distribudos a
serem compilados junto com o aplicativo.

O VS vem originalmente em 4 verses Academic, Professional, Enterprise Developer e Enterprise


Architect, sendo que a ltima a verso mais completa.

1.1 Hardware necessrio para instalao

O Visual Studio .Net no pode ser instalado em sistemas operacionais Windows 95, 98, Me. Alm
disso para instalar as ferramentas de desenvolvimento Web necessrio o Windows 2000 Server ou
NT com o IIS (Internet Information Service) instalado na mquina.
Hardware necessrio para cada verso do VS .NET :

Hardware Enterprise Architect Enterprise Professional Academic

3
Developer
Processador Pentium II-, 450 MHz Mesmo Mesmo Mesmo
Recomendado: Pentium III -
600MHz
RAM Windows 2000 Professional Mesmo Mesmo mesmo
96 MB; Windows 2000 Server
192 MB; Windows NT4.0
Workstation 64 MB;
Windows NT 4.0 Server 160
MB; Windows XP Professional
160 MB
Recomendado: 128 MB - 2000
Professional, 256 MB - 2000
Server, 96 MB - Workstation,
and 192 MB - NT 4.0 Server,
192 MB - XP Professional
Espao em Disco 500 MB no drive do sistema, 3 Mesmo Mesmo mesmo
GB drive de instalao
Sistema Windows 2000, Windows Mesmo Mesmo mesmo
Operacional XP, ou Windows NT 4.0
CD-ROM ou Recomendado Recomendado Recomendado Recomendado
DVD-ROM
Video 800 x 600, 256 cores Mesmo Mesmo mesmo
Recomendado: High Color 16-
bit
Mouse Qualquer Mesmo Mesmo mesmo

Para melhor o desempenho do VS .NET desligue o antivrus na instalao; desfragmente o disco


rgido; faa um upgrade da memria.

Para melhorar a velocidade na inicializao do VS .Net feche a janela de propriedades da IDE; feche
a janela Start Up da IDE; feche a janela Dynamic Help. Observao desmarque a opo de abrir estas
janelas automaticamente.

1.2 Conceitos para o desenvolvimento de aplicativos Microsoft

Este captulo foi includo para explicar o significado de alguns termos que a Microsoft utiliza na
documentao oficial, e no treinamento para a certificao.

Para desenvolver aplicativos Windows, a Microsoft utiliza a Modelagem de Aplicativos Enterprise


(EAM - Entreprise Application Model) que envolve seis etapas :

O Modelo de Desenvolvimento Processo de desenvolvimento do software.


O Modelo de Negcios Define o objetivo do software.
O Modelo do Usurio Refere-se a interface, documentao, treinamento, suporte e
configurao ao usurio.
O Modelo Lgico Define a estrutura lgica e a modelagem dos objetos e servios do
software.
O Modelo Tecnolgico Define a reutilizao dos componentes do software, do sistema, do
gerenciamento dos recursos.

4
O Modelo Fsico o produto final que engloba os componentes, a distribuio e a
interconeco.

Para o programador VB a fase mais importante das descritas acima o Modelo de Deesenvolvimento
(Model Development) que o intermedirio entre o Modelo de Negcios e os Modelos do Usurio,
Lgico e Tecnolgico.

1 - O Modelo de desenvolvimento

O modelo de desenvolvimento envolve trs etapas :

Desenho Conceitual (Conceptual Design) Trata o sistema do ponto de vista do usurio.


Desenho Lgico (Logical Design) Identifica os objetos e servios do negcio.
Desenho Fsico (Physical Design) Implementa o desenho lgico incluindo as solues
especficas de hardware e software.

O Desenho Conceitual ir considerar o perfil do usurio, isto quem o usurio e como ele ir
trabalhar com o sistema, alm disso o perfil do usurio engloba sua funo ou cargo.

O desenho conceitual tambm deve considerar o cenrio atual em uso, isto quantos usurios
utilizam o sistema atual e as situaes de uso.

E finalmente o desenho conceitual deve considerar o cenrio proposto para o uso, isto quantos
usurios devero utilizar o novo sistema e as situaes de uso.

2 O Desenho Lgico

Para criar o desenho lgico preciso seguir os passos abaixo :

1. Identificar os objetos e servios do negcio


2. Definir a interface
3. Identificar as dependncias do objeto
4. Validar o desenho lgico
5. Revisar e refinar o desenho lgico

Uma entidade que representa os modelos lgicos ou fsicos chamado de business object (Objeto
de Negcio, ou Objeto comercial), isto representar as situaes ou funes de uma empresa em
um objeto no sistema. Um business object pode retratar :

Contas
Clientes
Vendas
Faturas

O desenvolvimento do software ir implementar esses objetos para criar seus membros tais como
propriedades e mtodos para interagirem com outros objetos. Para identificar um business object
necessrio determinar os nomes dos cenrios em uso e os verbos dos cenrios em uso.

Os nomes dos cenrios podem ser determinados pelos diversos departamentos ou sees que iro
utilizar o aplicativo, e serve como base para identificar os verbos para compor o objeto.

Os verbos podem ser indicados pelos termos Possui ou Tem; Usa; Contm ou Guarda ou Consiste;
um exemplo de ou um.
5
3 O Desenho Fsico

Para criar o desenho Fsico a partir do Desenho Lgico preciso seguir estes passos :

Definir o tipo de servio aos componentes Cria os componentes a partir dos objetos lgicos
j definidos e determina se cada objeto um usurio, um negcio ou um objeto de servios de
dados.
Distribuir o componente na rede Definir o local do componente na rede.
Refinar a distribuio dos componentes Agrupar os componentes de acordo com as
necessidades do sistema.
Definir os membros do componente Define o relacionamento entre os componentes.
Validar o desenho fsico Certificar que cada componente corresponde ao servio no objeto
lgico.

Um desenho lgico bem efetuado vai ter um impacto positivo na criao do desenho Fsico. A forma
de medir o impacto do desenho lgico no desenho fsico observar se as consideraes abaixo
podem ser alcanadas.

Performance (Desempenho)
Maintainability (Manutenciabilidade)
Extensibility (Extensibilidade)
Scalability (Escalabilidade)
Availability (Disponibilidade)
Security (Segurana)

Performance

A performance (desempenho) a velocidade e a eficincia que o sistema executa as tarefas. O


desempenho tem que ser considerado pelo ponto de vista dos recursos do sistema, isto o total de
recursos que o sistema utiliza para executar a tarefa. E do ponto de vista do usurio, isto o tempo
gasto que o sistema utiliza para executar a tarefa.

Entretanto necessrio ter um ponto de equilbrio entre o desempenho e outras consideraes em


relao ao software, pois o cdigo que incrementa a performance pode afetar outros aspectos do
sistema.

Maintainability

O sistema que permite uma boa manuteno, isto reviso do cdigo fonte pelos programadores,
aquele que evita um longo trabalho de reviso e a participao de usurios no processo.

O sistema pode centralizar todos os componentes em um nico lugar de forma a substituir o


componente debilitado pelo componente corrigido. Outro caso seria dividir os componentes em
pequenos pedaos de forma a isolar o problema em reas especficas

O ideal dividir os componentes em pequenos pedaos de cdigo e centraliz-los em um nico


lugar, assim um sistema cliente servidor pode centralizar os pedaos dos componentes no servidor e
permitir que a manuteno seja feita no prprio servidor sem a participao do usurio no processo.

Extensibility

6
Extensibilidade a capacidade de integrar outros aplicativos ao sistema. Para alcanar a
extensibilidade pode-se utilizar as regras abaixo :

Dividir os servios do sistema em pequenos componentes que possuem membros e executem


tarefas especficas que possam ser reutilizveis por outros sistemas.
Criar componentes COM ou .NET que podem ser sempre utilizados em outras plataformas.
Se o sistema for WEB utilize os servios do IIS Internet Information Service para enviar
informaes ao Browser dos usurios.

Scalability

A escalabilidade a capacidade que um sistema possui de mudar de um ambiente de pouca utilizao


para um ambiente de intensa utilizao do sistema sem afetar suas funcionalidades. O ambiente de
intensa utilizao pode envolver :

Aumento do nmero de usurios


Aumento do trfico do sistema na rede
Servios que utilizem os dados do aplicativo

Assim a escalabilidade tambm est ligada a performance do sistema, entretanto a escalabilidade


mais especializada que a performance pois trata de tcnicas que ajudam na melhoria do desempenho
de redes, distribuio de dados, servidores de dados, camadas de dados e etc.

Availability

Um sistema deve estar disponvel na maior parte do tempo possvel e na maioria dos lugares em que
for acessado. Para que um sistema esteja sempre disponvel necessrio observar a natureza do
sistema e outros fatores tais como :

rea local
Rede
Internet
INtranet

Security

A segurana de um aplicativo est voltado a formas de evitar acessos externos e total controle da
administrao do sistema. Para melhor segurana o sistema deve estar centralizado em um nico
lugar para melhor administrao e evitar acessos externos.

7
2 - Estudo da Linguagem Visual Basic .NET

2.0 Arquivos gerados pelo Visual Basic .NET

Quando iniciado um projeto em VB, o sistema cria os arquivos com extenso .vb, alm de outros que
podem ser includos no projeto tais como arquivos ASP que tem a extenso .aspx; arquivos XML
com extenso .xml; arquivos HTML com extenso .html e outros. Assim no h distino de
arquivos de classes, janelas, controles e etc, pois todos tero a partir de agora a extenso .vb.

Item do projeto Extenso Descrio


Janela .vb Janela para aplicativos Desktop.
Classe .vb Arquivo de cdigo para classes
Modulo (Visual Basic) .vb Arquivo que agrupa funes
Component Class .vb Uma classe de componentes.
User Control .vb Controle para aplicativos
Data Form Wizard .vb (.aspx para Uma janela de dados
projetos WEB.)
DataSet .xsd Arquivo DataSet para criar esquemas XML
Arquivo XML .xml Arquivo XML
Esquema XML .xsd Arquivo para criar Esquemas de documentos XML.
Code File .vb Arquivo de cdigo
Custom Control .vb Classe para criar controles para aplicativos Windows.
Pgina HTML .htm Pgina HTML que inclui cdigo.
Inherited Form .vb Janela baseada em outra janela existente.
Web Custom Control .vb Classe para criar um controle servidor ASP.NET.
Inherited User Control .vb Novo controle baseado em um controle existente.
Windows Service .vb Classe para criar Servios Windows.
COM Class .vb Classe baseada em componente COM
Transactional .vb Classe para usar componentes transacionais.
Component
Arquivo texto .txt Arquivo de texto
Frameset .htm Arquivo HTML que possui vrias pginas HTML.
Arquivo XSLT .xslt Arquivo usado para transformar documentos XML
StyleSheet .css Arquivo estilo planilha para definies HTML
Installer Class .vb Classe para ser chamada em processos de instalao.
Crystal Report .rpt Um relatrio Crystal Report
Arquivo Bitmap .bmp Arquivo bitmap.
Arquivo de Cursor .cur Cursor padro
Icone .ico cone padro
Arquivo Assembly .resx Arquivo usado para armazenar recursos para o aplicativo
Resource
Arquivo Assembly .vb Arquivo que contm informaes do Assembly.
Information
Arquivo Application .config Arquivo usado para configuraes do aplicativo.
Configuration

8
Arquivo JScript .js Arquivo contendo cdigo JScript
Arquivo VBScript .vbs Arquivo contendo cdigo VBScript
Windows Script Host .wsf Arquivo que contm Script que executado como um
aplicativo Windows.

Arquivos de um projeto WEB

Arquivos Extenso Descrio


Janela Web 2 arquivos: .aspx Uma janela WEB.
.vb
Web Service 2 arquivos: .asmx Componente que troca mensagens usando os protocolos
.vb padres HTTP, XML, XSD, SOAP e WSDL.
Class .vb Arquivo de classe.
Modulo (Visual Basic) .vb Arquivo que agrupa funes
Component Class .vb Classe de componentes
Data Form Wizard .aspx (.vb para Uma janela de dados para aplicativos WEB.
projetos locais)
DataSet .xsd Arquivo para esquemas XML usando DAtaSet
Web User Control .ascx Controle servidor ASP.NET
Pgina HTML .htm Pgina HTML que inclui cdigo
Frameset .htm Um pagina HTMP que inclui vrias pginas HTML.
Style Sheet .css Arquivo estilo planilha usado para definies HTML
Arquivo XML .xml Arquivo XML .
Esquema XML .xsd Arquivo esquema para documentos XML.
Arquivo XSLT .xslt Arquivo usado para transformar documetnos XML
Web Custom Control .vb Controle ASP.NET server.
Arquivo de cdigo .vb Arquivo de cdigo
Dynamic Discovery .vsdisco Arquivo baseado em XML usado para descobrir o caminho
Document do servidor WEB.
Static Discovery .disco Arquivo de mecanismo de procura para servidores XML
WEB.
Global Application .asax Arquivo para manipular eventos ASP.NET
Class
Web Configuration .config Arquivo de configurao para aplicativos WEB
Texto .txt Arquivo de texto
Installer Class .vb Classe chamada em processos de instalao..
Crystal Report .rpt Arquivo Crystal Report
Bitmap .bmp Imagem Bitmap
Cursor .cur Cursor Padro
Icon File .ico cone padro
Assembly Resource .resx Arquivo de recursos utilizado pelo aplicativo
File
Assembly Information .vb Informaes gerais do assembly
File
JScript File .js Cdigo JScript
VBScript File .vbs Cdigo VBScript
Windows Script Host .wsf Arquivo para Windows scripting..
9
Em verses anteriores do VB, as janelas tinham extenses .frm, os controles tinham extenses .ctr, as
classes tinham a extenso .cls.

Ainda hoje, os arquivos do Vb podem ser abertos por qualquer programa de texto e podem ser
alterados diretamente sem usar o Ambiente de Desenvolvimento do Visual Studio.

2.1 - Nova Estrutura do programa escrito em VB .Net

A nova estrutura do programa deve seguir essas etapas:


1. Utilize os comandos Option para verificar os erros de lgica e de sintaxe.
2. Utilize o comando Imports para acessar os recursos da tecnologia .NET Framework.
3. O procedimento Main ( ) ser o ponto inicial do programa, ou seja o cdigo que ser
executado em primeiro lugar.
4. Utilize os comandos Class, Module ou NameSpace se for criar objetos para o programa.
5. Utilize comandos de compilao condicional #if .. #else... se necessrio.
Exemplo 1 :

' Programa escrito em Visual Basic .


Option Explicit
Module Ol
Sub Main( )
MsgBox("Ol Mundo!") ' Exibe a Mensagem na tela.
End Sub
End Module

A primeira linha funciona como comentrio. O Comando Option obriga declarar todas as variveis
antes de utiliz-las no programa.

No exemplo acima, no mdulo Ol est o procedimento Sub Main ( ) que vai controlar a execuo
do processo e exibir a mensagem Ol Mundo na tela do computador.

Quando criamos um programa em VB escolhendo Windows Application na janela de opes, o


Visual Studio .NET cria um projeto contendo referncias e uma classe chamada sempre de form1.vb.
Exemplo 2 :

Public Class Form1


Inherits System.Windows.Forms.Form
O cdigo abaixo foi criado automaticamente pelo Visual Basic
#Region " Windows Forms Designer generated code "
Public Sub New()
MyBase.New()

' This call is required by the Windows Forms Designer.


InitializeComponent()

' Add any initialization after the InitializeComponent() call.


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

10
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

No exemplo acima, O VS .net criou o prottipo central para ser modificado, contendo uma janela
Form1 que possui o cdigo inicial da janela Sub New que o construtor da janela onde colocado o
cdigo de inicializao da janela que substitui o antigo evento Initialize do VB 6.0.

Resumindo, quando a janela carregada na tela, o primeiro procedimento a ser executado ser o
cdigo dentro de Sub New, tambm conhecido como Construtor (proveniente da linguagem C++).

InitializeComponent( ) criado automaticamente pelo VStudio e substitui o antigo arquivo .frm que
era criado pelo VB 6, onde continha todo as propriedades e cdigos fonte da janela em formato de
Texto.
Resumindo, InitializeComponent( ) grava todas os controles, textos, figuras e outras coisas que
forem feitas na janela.

O comando inherits na primeira linha do exemplo acima herda todas as caractersticas de uma janela
normal. Assim pode-se alterar suas propriedades na janela de propriedades do VB.

Resumindo, para criar uma janela preciso acionar a classe Windows Form da tecnologia .NET
Framework.

2.2 Atribuir nomes aos elementos do seu programa

Quando for nomear (dar nome as variveis, objetos ou classes) os elementos do seu programa a
Microsoft recomenda usar as seguintes tcnicas.
Comear cada Nome com letra maiscula , Exemplo : ConvertaPrimeiraLetra.
Quando nomear uma funo ou mtodo inicie com a ao que ela executa. Exemplo :
CarregarFiltro; IniciarProcura; FecharJanela.
Quando nomear uma Classe ou uma propriedade da classe inicie com o nome a que se refere
a classe . Exemplo : CarroAcessrios; EmpregadosSalrio; ArquivosNome.
Quando nomear uma Interface (Interface) no seu programa, inicie com a letra I maiscula
seguida da ao ou comportamento dessa interface. Exemplo : IPersistente; IAleatrio.
Quando nomear eventos para sua classe, inicie com a palavra Event ou Evento. Exemplo:
EventoFechar; EventoAbrir.
Se for usar um evento que foi disparado no momento da ao ou depois da ao, utilize os
verbos no presente ou passado. Exemplo : EventoFechar; EventoFechou; EventoAbrir;
EventoAbriu.
Para nomes muito grandes utilize abreviaes. Exemplo : HTML (abreviao de Hyper Text
Marquet Language).
No use nomes idnticos no mesmo mdulo ou procedimento, o ideal utilizar nomes
completamente diferentes em todo o programa.

2.3 Utilizando quebra de linha e combinao de cdigo

11
No momento da codificao os comandos estiverem extensos demais, pode-se quebrar a linha em
diversas partes sem gerar erros de execuo. Utilize o Caracter de continuao de Linha ( _ ) aps
um espao simples, em seguida continuar a escrever o cdigo em outra linha.. Exemplo :

Data1.RecordSource = _
"SELECT * FROM Titles, Publishers" _
& "WHERE Publishers.PubId = Titles.PubID" _
& "AND Publishers.State = 'CA'"

Assim, a linha de cdigo fica mais fcil de ler na tela do seu computador, entretanto existe uma
limitao para o nmero de linhas.

Para combinar muitas linhas de cdigo em uma nica linha utilize dois pontos ( : ). Exemplo :

Text1.Text = "Ol" : Vermelho = 255 : Text1.BackColor = Vermelho

2.4 Caracteres especiais no VB .Net

Alguns caracteres possuem significados diferentes na linguagem, veja a seguir :

1. Parnteses : Use parnteses para criar um procedimento ou funo. Exemplo : Sub Main ( ).
2. Separadores ( : ) : Os dois pontos ( : ) so usados para separar blocos de
cdigo na mesma linha. Exemplo : Text1.Text = "Ol" : Vermelho = 255 :
Text1.BackColor = Vermelho
3. Concatenao : Para combinar duas variveis Strings, utilize o operador de concatenao &.
Exemplo :

Var1 = "10.01"
Var2 = 11
Result = Var1 + Var2 ' Result = 21.01
Result = Var1 & Var2 ' Result = 10.0111

No use o operador + para concatenar duas string, pois pode gerar erros. Observe os
resultados do exemplo acima.
4. Operador de acesso ( . ) : O ponto utilizado para acessar funes, mtodos ou propriedades
de uma classe ou objeto. Exemplo : MyForm.Text = "This is my form"
5. Operador de acesso ( ! ) : A exclamao tambm utilizada para acessar mtodos ou
propriedades somente de algumas classes ou estruturas. Exemplo :
RS.Fields!CustomerID.Value = txtCustomerID.Text
6. Caracter de declarao de tipos de dados ( ! ) : O ponto de exclamao tambm pode ser
utilizado para declarar variveis do tipo Single. Exemplo : Var = 1234578!

2.5 Criar comentrios no Cdigo

Para cada linha de cdigo, pode-se criar um comentrio explicando o significado do procedimento,
este tipo de linha ignorado pelo compilador. Utilize o smbolo de comentrio ( ) para ativar o
comentrio. Exemplo :

' Este um comentrio no incio do cdigo


Text1.Text = "Hi!" ' Este um comentrio na mesma linha do cdigo

12
A Microsoft recomenda criar comentrios para cada seo de cdigo dessa forma :

1. Propsito : Inclua esse tpico no comentrio, para identificar qual a descrio ou tarefa do
cdigo em questo.
2. Requisitos : Inclua esse tpico no comentrio, para identificar quais variveis, objetos,
classes e outros elementos utilizados no cdigo em questo.
3. Efeito : Inclua esse tpico para identificar quais variveis, objetos, classes e outros elementos
que sero afetados pelo cdigo em questo.
4. Argumentos : Inc.ua esse tpico para explicar os argumentos exigidos pelo cdigo em
questo.
5. Retorno : Inclua esse tpico para identificar o valor de retorno desse cdigo em questo.

No se pode quebrar linhas em comentrio, utilizando o caracter ( _ ). Pode-se utilizar o comando


REM para ativar comentrios, entretanto esse procedimento requer mais espao em memria que o
smbolo ( ), portanto utilize o smbolo somente.

2.6 Limitaes do Visual Basic .NET

As verses anteriores do VB tinham vrias limitaes no cdigo, veja abaixo :

Nmero de variveis usadas no mesmo cdigo.


Nmero de funes usadas no mesmo cdigo.
Nmero de arquivos abertos no mesmo cdigo.
Nmero de janelas abertas no mesmo cdigo.
Dentre outras...

No VB .NET existem limitaes fsicas, segundo a Microsoft, mas so to altas que no h chances
de serem atingidas pelo desenvolvedor, a ponto de no serem nem documentadas oficialmente.

2.7 - Compilao Condicional

Quando se executa um programa, o compilador inicia a leitura do cdigo fonte indistintamente at o


final. Entretanto esse comportamento pode ser alterado utilizando a Compilao Condicional.

A compilao condicional faz com que o compilador execute certos blocos de cdigo enquanto
outros so ignorados. til quando se deseja usar comandos para certos tipos de Sistemas
operacionais em uso, ou utilizar dicionrios para uma lngua de um pas, etc..

Para aplicar esse recurso use o comando de diretiva # if ... #Then ... # Else . Alm disso pode-se criar
uma constante a nvel de compilao usando o comando de diretiva #Const . Exemplo :

Cria uma compilao para a verso de um programa de lngua Francesa ou Alem, note
que FrenchVersion e GermanVersion so constantes predefinidas pelo VB.
#If FrenchVersion Then
' <cdigo para a lingua francesa>.
#ElseIf GermanVersion Then
' <cdigo para a lingua alem>.
#Else
' <cdigo para outras verses>.
#End If

13
2.7.1 Criando Constantes de declarao Condicional

Constantes so variveis que no podem ser alteradas. As constantes de declarao condicional so


variveis que no podem ser alteradas e tambm no podem ser acessadas pelo cdigo geral.

Pode-se criar constantes com caixa de dilogos de propriedades, por linha de comando ou por
comandos em cdigo. Para criar constantes condicionais por comandos em cdigo, utilize #Const.
Exemplo :

#Const MeuPas = "BRASIL"


#Const Verso = "8.0.0012"
#Const NmeroPadro = 36

2.7.2 Ocultando ou expandindo o cdigo

No VB .NET h um recurso que permite ocultar ou expandir o cdigo escrito no Editor de Cdigos,
semelhante ao Windows Explorer ao visualizar os diretrios e subdiretrios do sistema. Quando um
diretrio possui subdiretrios, o sistema exibe um sinal de mais ( + ) ao lado do nome do diretrio
corrente, informando que h outros elementos nele. Basta clicar sobre o ( + ) para visualizar os outros
elementos.

Assim funciona esse recurso, que pode ser aplicado usando a diretiva #Region. Exemplo :

#Region "O cdigo dentro de Region ocultado clicando sobre #Region"


Private components As System.ComponentModel.Container
Dim WithEvents Form1 As System.Windows.Forms.Form

Private Sub InitializeComponent()


components = New System.ComponentModel.Container
Me.Text = "Form1"
End Sub
#End Region

Esse recurso torna fcil ler e administrar o cdigo fonte do desenvolvedor. Note que no possvel
usar esse recurso quando criar Funes, e qualquer cdigo ocultado ou expandido lido
normalmente pelo compilador.

2.8 Tcnicas de codificao e programao

necessrio utilizar tcnicas para aumentar a produtividade do programador Visual Basic .NET,
alm de solucionar grande parte dos bugs dos programas. Alm disso utilizando essas tcnicas
consolidadas de programao, permite criar cdigos de alta qualidade e permite seguir as regras de
criao de software das grandes companhias.

Quando for nomear elementos, utilize as seguintes tcnicas :

Rotinas ou Procedimentos
Quando criar rotinas ou procedimentos, evite usar nomes confusos que no contribuem para
explicar o significado do procedimento. Como por exemplo : Sub AnalizeIsto ( ).
Quando criar classes, evite citar nomes redundantes para as propriedades, mtodos ou
funes dessa classe. Como por Exemplo : Livro.LivroTtulo use : Livro.Ttulo

14
Quando Nomear um mtodo ou Funo, d o nome da ao respectiva. Exemplo :
CalculeRazQuadrada( ) . Com todas as iniciais em maisculas.

Variveis
Quando nomear variveis que armazenaro dados calculados, finalize o nome com a
identificao do clculo utilizado. Como por exemplo : intSoma, intDiferena, intMax,
intMin, pode-se utilizar at o nome de funes do VB para criar os nomes. intSum,
intAvg, intIndex, etc...
Use nomes complementares quando forem necessrios na mesma operao, tais como Incio
/ Fim, Mn / Max, Aberto / Fechado. Exemplo : intIncio, intFim, intMn, intMax.
Para nomear variveis utilize o primeira palavra em minsculas e as restantes em
maisculas. Exemplo : documentoFormatoIndexado., ou utilize a notao hngara *.
Para variveis do tipo Boolean pode utilizar a palavra , Esta ( Is) para designar se a varivel
est na condio True ou False. Exemplo : ArquivoEstAberto, ou FileIsOpen
Muitos programadores utilizam a palavra Flag para nomear suas variveis, entretanto
prefervel substituir a palavra Flag por outro nome que descreva melhor a varivel. Exemplo:
ao invs de documentoFlag , use documentoFormatoIndexado.
Para variveis utilizadas em loops, d nomes simples como i, j, x, etc...
Utilize sempre constantes nomeadas para efetuar loops e outras condies de teste. Como
por exemplo : ao invs de For i = 1 to 7 utilize For i = 1 to intContadorIndexado,
onde intContadorIndexado uma constante nomeada de valor 7.

* Uma notao especialmente popular a notao hngara. Ela costuma ser usada na programao
em Windows e no OS/2. No caso da notao hngara, pode-se antecer uma varivel String com str,
uma varivel Integer com int , um ponteiro como p, funes com fn, handles com h e assim
por diante. A regra compor o nome da varivel utilizando a abreviao das primeiras letras do
controle, tipo de dados ou uma combinao de suas primeiras letras com um nome de identificao
individual.

A notao hngara foi desenvolvida por um programador da Microsoft chamado Charles Simonyi.
Nos velhos tempos da Microsoft, Charles ficou famoso por dar rasantes de helicpteros nos
piqueniques da empresa.

Tipo do Controle Prefixo Exemplo


3D Panel pnl pnlGroup
ADO Data ado adoBiblio
Animated button ani aniMailBox
Check box chk chkReadOnly
Combo box, drop-down list box cbo cboEnglish
Command button cmd cmdExit
Common dialog dlg dlgFileOpen
Communications com comFax
Controles ctr ctrCurrent
Data dat datBiblio

15
Data-bound combo box dbcbo dbcboLanguage
Data-bound grid dbgrd dbgrdQueryResult
Data-bound list box dblst dblstJobType
Data combo dbc dbcAuthor
Data grid dgd dgdTitles
Data list dbl dblPublisher
Data repeater drp drpLocation
Date picker dtp dtpPublished
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Flat scroll bar fsb fsbMove
Form frm frmEntry
Frame fra fraLanguage
Gauge gau gauStatus
Graph gra graRevenue
Grid grd grdPrices
Hierarchical flexgrid flex flexOrders
Horizontal scroll bar hsb hsbVolume
Image img imgIcon
Image combo imgcbo imgcboProduct
ImageList ils ilsAllIcons
Label lbl lblHelpMessage
Lightweight check box lwchk lwchkArchive
Lightweight combo box lwcbo lwcboGerman
Lightweight command button lwcmd lwcmdRemove
Lightweight frame lwfra lwfraSaveOptions
Lightweight horizontal scroll bar lwhsb lwhsbVolume
Lightweight list box lwlst lwlstCostCenters
Lightweight option button lwopt lwoptIncomeLevel
Lightweight text box lwtxt lwoptStreet

16
Lightweight vertical scroll bar lwvsb lwvsbYear
Line lin linVertical
List box lst lstPolicyCodes
ListView lvw lvwHeadings
MAPI message mpm mpmSentMessage
MAPI session mps mpsSession
MCI mci mciVideo
Menu mnu mnuFileOpen
Month view mvw mvwPeriod
MS Chart ch chSalesbyRegion
MS Flex grid msg msgClients
MS Tab mst mstFirst
OLE container ole oleWorksheet
Option button opt optGender
Picture box pic picVGA
Picture clip clp clpToolbar
ProgressBar prg prgLoadFile
Remote Data rd rdTitles
RichTextBox rtf rtfReport
Shape shp shpCircle
Slider sld sldScale
Spin spn spnPages
StatusBar sta staDateTime
SysInfo sys sysMonitor
TabStrip tab tabOptions
Text box txt txtLastName
Timer tmr tmrAlarm
Toolbar tlb tlbActions
TreeView tre treOrganization
UpDown upd updDirection
Vertical scroll bar vsb vsbRate

17
Lista de nomes de Menus onde a regra criar um prefino Mnu + Nome do Menu utilizado :

Menu Nome do Menu


File Open mnuFileOpen
File Send Email mnuFileSendEmail
File Send Fax mnuFileSendFax
Format Character mnuFormatCharacter
Help Contents mnuHelpContents

A Microsoft recomenda utilizar uma codificao modular, isto significa que se deve utilizar
variveis, constantes, controles agrupados dentro de um procedimento que execute uma tarefa nica
em um formulrio simples. Por exemplo, para acionar uma caixa de dilogo Abrir, devemos colocar
todas as variveis, controles e flags necessrios agrupados em um nico boto ou menu Abrir que
execute a tarefa de acionar essa Caixa de dilogo, uma vez terminado a execuo da tarefa todas as
variveis e controles so finalizados.

Lista de sugesto de escopo de variveis (esses prefixos eram muito utilizados em verses anteriores
do Visual Basic, entretanto com a nova formulao da linguagem, essa terminologia quase no se usa
mais) :

Escopo Prefixo Exemplo

Global g gstrUserName

Module-level m mblnCalcInProgress

Local to procedure Nenhum dblVelocity

Para se formar um nome de constante adequadamente, a regra utilizar o prefixo do escopo acima +
o prefixo do tipo de dados + as letras iniciais maisculas do significado/propsito da constante,
exemplo:

gintIdadeDoAluno Varivel global , do tipo de dados inteiro , Idade do aluno


(g + int + Idade Do Aluno)

mstrNomeDoAluno Varivel a nvel de mdulo, do tipo string, Nome do Aluno


(m + str + Nome Do Aluno)

Use os seguintes prefixos para indicar o tipo de dados da varivel (esses prefixos eram muito
utilizados em verses anteriores do Visual Basic, entretanto com a nova formulao da linguagem,
essa terminologia quase no se usa mais):

Tipo de Dado Prefixo Exemplo


Boolean bln blnFound
Byte byt bytRasterData

18
Collection object col colWidgets
Decimal dec decRevenue
Date (Time) dtm dtmStart
Double dbl dblTolerance
Error err errOrderNum
Integer int intQuantity
Long lng lngDistance
Object obj objCurrent
Single sng sngAverage
String str strFName
Compound-defined type cdt cdtEmployee

Os nomes de variveis de tipos definidos pelo usurio (tipos de dados compostos) podem ser
definidos com o prefixo cdt , assim cdt + nome da varivel / combinao das tres primeiras letras ,
exemplo :

cdtCliUma varivel do tipo de dados composto , Cliente


( cdt + Cli)

Tabelas
Quando nomear tabelas use nomes sempre no singular. Exemplo : ao invs de tabela Alunos
use tabela Aluno.
Quando nomear campos em tabelas, evite repetir o nome da tabela no Campo. Exemplo : ao
invs do nome do Campo AlunoEndereo utilize o nome Endereo.
No utilize o Tipo de Dados do campo para compor o seu nome.

Microsoft SQL Server


Evite o nome com abreviaes, somente use abreviaes quando tiver um significado
consistente.
Quando nomear funes no SQL Server utilize a descrio do valor retornado. Exemplo :
RetorneNomeJanelaAtual( ) .
Os nomes de arquivos, pastas, procedimentos armazenados devem descrever o seu propsito.
Evite reutilizar nomes de funes para variveis ou vice-versa. Exemplo : Funo com nome
ProcessarArquivo( ) Varivel com nome IProcessarArquivo.
Evite utilizar homnimos ou palavras com mesmo fonema . Exemplo Rigth e Write.
Certifique-se que no h erros quando soletrar palavras. Pois algumas palavras possuem
significados diferentes em certas regies do Globo. Exemplo Check e Cheque no tem o
mesmo significado, Color e Colour no tem o mesmo significado.
Evite usar marcaes especiais quando nomear elementos , tais como $ , %. (utilizadas para
string e inteiros repectivamente).

Comentrios
Quando modificar o cdigo fonte, coloque sempre a data da ltima modificao.
No incio de cada rotina, coloque os comentrios no formato Propsito, Descrio,
Parmetros, etc.. .( Ver item 3.5).

19
Evite criar comentrios no final de linha, pois fica mais difcil de ler. Se for imperativo,
coloque com uma tabulao padro para todos os comentrios desse tipo.
Evite asteriscos e outros caracteres para criar o comentrio, utilize somente espaos.
Apague qualquer comentrio improdutivo no cdigo.
Utilize palavras completas no Comentrio, evite portanto abreviaes e smbolos outros.
Crie comentrio para todo o cdigo no bvio.
Explique o que consiste o loop e outros blocos de cdigo.

Formato
Utilize sempre o mesmo tipo de formatao para o cdigo escrito. Isso inclui o tamanho da
letra, o tipo da letra, o espaamento da letra, a cor da letra, etc..
Utilize sempre parnteses , chaves e outros, para agrupar conjuntos de cdigos para a mesma
finalidade. Exempo if (x >5 and x<10) then ...
Crie uma tabulao padro que torne consistente o cdigo para cada bloco dentro de
procedimentos, loops, funes e etc...
Evite combinar muitas linhas de cdigo em uma linha nica , utilizando o separador ( : ).
Exemplo : x = 350 : intContador = 4 : ArquivoEstAberto = true
Quando escrever comandos em SQL, utilize letras maisculas para palavras chaves SQL e
somente iniciais maisculas para Tabelas, colunas e Vises.
Divida um cdigo complexo em pedaos menores, podendo ser em mdulos ou arquivos
separados
Coloque a Clusula SQL separados das linhas de comando para facilitar a leitura e edio do
cdigo. Exemplo :
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'

2.9 Declarando Elementos

A linguagem utiliza alguns tipos de instrues tais como :

Palavras-Chaves (KeyWords) So palavras reservadas da linguagem para construir uma estrutura


de comandos, e no podem ser usadas individualmente.

Comandos (Statements) So instrues completas que fazem sentido ao compilador e podem


conter palavras chaves, operadores, constantes, expresses. Os comandos so divididos em duas
categorias :

1. Comandos de declarao Usados para nomear variveis, constantes, matrizes, definir


procedimentos e objetos.
2. Comandos de execuo Usados para executar uma ao, e englobam todos os comandos
de loop, comandos de deciso e todos os comandos que utilizam operadores matemtico ou
condicionais.

Expresses So sries de elementos que representam valores, separados por operadores que
resultam em outro valor. Utilizam de operadores de comparao para comparar dois valores; utilizam
operadores matemticos para efetuar operaes entre dois ou mais valores; utilizam de elementos
Booleanos para fazer comparaes e parnteses para alterar a ordem de clculos.

A Microsoft no reconheceu os Comandos de atribuio como uma terceira categoria, mas incluiu
na documentao como todos aqueles que utilizam operadores de atribuio.

20
Para declarar elementos para uso no cdigo utiliza-se Comandos de declarao ou Palavras-Chaves.
O elemento declarado fica retido na memria do computador sendo gerenciado diretamente pela
tecnologia .NET Framework.

Os elementos declarados no cdigo podem ser constantes, variveis, objetos, classes, enumeraes,
estruturas, propriedades, mtodos, funes, eventos, interfaces, delegates (delegar).

O VB ignora letras maisculas e minsculas quando se referir a elementos declarados, portanto pode-
se usar MinhaVarivel quanto minhavarivel.

Quando se declara elementos, o processo envolve as seguintes consideraes :

1. Variveis o espao reservado dentro da memria do computador, para ser usado no


programa.
2. Comandos de Declarao So comandos do VB que declaram elementos na memria.
3. Tipo de Dados o tipo de dados fundamental que o elemento dever pertencer.
4. Vida til (LifeTime) o perodo de execuo que o elemento est disponvel para ser
usado.
5. Escopo a extenso que o elemento deve atingir, sem ser declarado novamente.
6. Acessibilidade a forma que o cdigo deve fazer uso do elemento.
7. Nomes Ambguos Quando dois elementos tm o mesmo nome, e como o VB resolve este
problema.

1 Variveis
Uma varivel um espao reservado dentro da memria para armazenar valores desconhecidos.
Diferentemente de um ponteiro que representa o local onde ela est endereada.

Para usar variveis necessrio aplicar os Comandos de Declarao, utilizando as tcnicas de


codificao e programao j explicadas acima. Observe que quando se declara uma varivel , o
compilador reserva um espao na memria para o valor, mas no a cria explicitamente. Para criar
explicitamente uma varivel, preciso declarar a varivel e atribuir um valor.

O comando Option Explicit obriga que todas as variveis sejam declaradas antes do uso.

2 Comandos de Declarao
Os comandos de declarao so Dim e Const. As palavras chaves (Keywords) so Private, Public,
Shared, Protected, Friend e Static. Exemplo :

Private I As Integer
Dim Amount As Double
Static YourName As String
Public BillsPaid As Decimal
Const Modulus As Single = 4.17825 Esse valor no pode ser alterado.
Public I, J, K As Integer ' Declara trs variveis inteiras.
Dim FirstName, MiddleName, LastName As String ' Declara trs variveis string.
Private S, SArray() As Short ' Uma varivel Shor e uma varivel de matriz.
Friend B1, B2 As Byte, C1, C2 As Char ' Duas variveis Byte e duas variveis Char.

O comando Dim semelhante as palavras chaves Private e Public. E pode ser usado em
procedimentos, mdulos, classes , blocos e estruturas, mas s podem ser acessadas no cdigo que
foram declaradas. A diferena entre Private, Public e Dim que as duas primeiras permitem ou no

21
que essa varivel fique disponvel a outros blocos de cdigo, portanto so tambm chamados de
Modificadores de Acesso.

Alguns autores at recomendam no usar o Comando Dim por se tratar de um declarador pouco
expressivo.

A palavra chave Private um modificador de acesso e declara variveis em todos os blocos de


cdigo, e assim como o comando Dim, s podem ser acessadas no cdigo que foram declaradas. E
no podem ser acessadas por outros blocos de cdigo.

A palavra chave Public um modificador de acesso e declara variveis em todos os blocos de


cdigo, e diferentemente de Dim e Private, permitem que outros cdigos exteriores utilizem a
varivel.

A palavra chave Shared um modificador de acesso que declara variveis em classes, e permitem
que outros cdigos acessem essa varivel sem fazer uma referncia a classe.

A palavra chave Static um modificador de acesso e declara variveis em todos os blocos de cdigo
, exceto Classes e Mdulos. Variveis declaradas com Static retm o ltimo valor na memria
mesmo quando o procedimento em que foi declarado encerrado.

O Comando Const declara variveis que no podem ser alteradas, e so utilizadas em todos os blocos
de cdigo, entretanto a varivel constante fica disponvel somente ao cdigo em que foi declarada.

A palavra chave Protected declara variveis somente dentro de Classes. Variveis declaradas com
protected s podem ser acessadas dentro da classe que a declarou ou de classes derivadas.

A palavra chave Friend declara variveis em todos os blocos de cdigo, exceto procedimentos.
Variveis declaradas com Friend podem ser acessadas por todo o programa.

3 Tipos de Dados
Para organizar como as variveis gravam informaes na memria, foram criados tipos de dados
elementares, que podem ser numricos ou caracteres.

Os tipos de dados numricos podem ser integrais (nmeros inteiros) e no integrais (nmeros
decimais fracionrios). Os nmeros inteiros so mais rpidos em processamento que os no
integrais.

Para cada tipo de Dados h uma faixa mxima de informaes que podem ser gravados, alm disso
certos tipos de dados podem ser sinalizados ou no sinalizados, isto significa que a faixa de
informaes podem variar de nmeros negativos at nmeros positivos.

Tipo de Dados Common language Tamanho em Faixa


runtime Bytes
Boolean System.Boolean 2 bytes True ou False
Byte System.Byte 1 byte 0 255 (no sinalizado).
Char System.Char 2 bytes 0 65535 (no sinalizado).
Date System.DateTime 8 bytes 0:00:00 de 1 Janeiro, 0001 11:59:59 da noite de 31
Dezembro, 9999.
Decimal System.Decimal 16 bytes 0 +/-79,228,162,514,264,337,593,543,950,335 sem
virgula;
0 +/-7.9228162514264337593543950335 com 28
dgitos depois da vrgula; o nmero mais prximo do
zero

22
+/-0.0000000000000000000000000001 (+/-1E-28).
Double System.Double 8 bytes -1.79769313486231570E+308
(double-ponto -4.94065645841246544E-324 negativos; e
flutuante) 4.94065645841246544E-324
1.79769313486231570E+308 positivos.
Integer System.Int32 4 bytes -2,147,483,648 2,147,483,647.
Long System.Int64 8 bytes -9,223,372,036,854,775,808
(long integer) 9,223,372,036,854,775,807.
Object System.Object (classe) 4 bytes Qualquer tipo de dados..
Short System.Int16 2 bytes -32,768 32,767.
Single System.Single 4 bytes -3.4028235E+38 -1.401298E-45 negativos; e
(single-ponto 1.401298E-45 3.4028235E+38 positivos.
flutuante)
String System.String (class) Depende do 0 at 2 bilhes de caracteres Unicode.
sistema
User-Defined (herda de Depende do Determinado pela faixa de cada tipo de dados usado na
Type System.ValueType) sistema estrutura
(estrutura)

O VB .NET manipula os tipos de dados elementares de duas formas :

Tipo Valor Quando a varivel grava os dados dentro da memria. Assim enquadram-se
todos os tipos de dados numricos, Boolean, Char, Date, Estruturas e Enumeraes.
Tipo Referncia Quando o sistema aponta para um endereo de memria onde est os
dados. Assim enquadram-se os tipos de dados String, Matrizes, Classes e Forms (Janelas).

A partir do VB .NET cada tipo de dado listado acima, implementado como uma estrutura e Classe
da tecnologia .NET Framework. Isto significa que cada tipo de dado tem suas prprias funes e
mtodos internos.

Basta verificar na coluna Common language runtime (CLR) qual classe pertence o tipo de dado
elementar.

Exemplo :

Dim strTeste as string


Dim intTeste2 as System.Int32

strTeste.Trim ( )
intTeste2.ToString ( )

No Exemplo acima, foi declarado uma varivel do tipo String, e foi invocada a funo Trim que
remove os espaos em seu contedo. Em seguida a varivel intTeste2 foi declarada como um tipo de
dados Inteiro da classe .NET Framework, invocando a funo ToString que converte os dados para
string.

Outra forma de declarar variveis, forar a varivel para tornar-se de um tipo utilizando os
caracteres de tipo. Veja a tabela abaixo:

Caracter de tipo Tipo de Dado Exemplo


% Integer Dim L%
& Long Public M&
@ Decimal Const W@ = 37.5
! Single Dim Q!
23
# Double Static X#
$ String Private V$ = "Secret"

Caracter de tipo Tipo de Dado Exemplo


S Short I = 347S
I Integer J = 347I
L Long K = 347L
D Decimal H = 347D
F Single Y = 347F
R Double Z = 347R
C Char Q = "."C

4 Vida til (LifeTime)


Vida til o perodo em que a varivel mantm o valor na memria. Dependendo como foi declarada
a varivel, sua vida til igual ao perodo de tempo que o aplicativo estiver em execuo.

Por outro lado, uma varivel declarada dentro de um bloco de cdigo, sua vida til igual ao tempo
que o procedimento estiver em execuo. Assim quando o procedimento termina, a varivel finda
sua vida til e a memria limpa e fica disponvel novamente ao Sistema Operacional.

Quando uma varivel declarada com a palavra chave Shared, sua vida til extendida at quando
o aplicativo estiver em uso.

Quando uma varivel declarada com a palavra chave Static, sua vida til extendida entre
procedimentos que estiver em uso.

5 Escopo
O Escopo de uma varivel a seo de um aplicativo que pode ver e manipular uma varivel. Deste
modo, uma varivel declarada em um procedimento, s pode ser manipulada nesse procedimento, as
outras sees ou blocos de cdigo no podem ver nem manipular essa varivel.

O Escopo tem esses nveis :

Escopo de Bloco A varivel fica disponvel somente no bloco de cdigo em que foi declarada.
Escopo de Procedimento A varivel fica disponvel somente no procedimento que foi declarada.
Escopo de Mdulo A varivel fica disponvel para todo o cdigo do mdulo, classe ou estrutura
que foi declarada.
Escopo de EspaoNomeado (NameSpace) A varivel fica disponvel para todo o cdigo desse
Espao Nomeado.

6 Acessibilidade
Acessibilidade a permisso que uma varivel poder ser acessada ou manipulada. Para definir sua
acessibilidade usa-se as palavras chaves : Public, Private, Friend, Protected, Protected Friend.

Pode-se criar uma varivel com escopo de Mdulo, mas declarada com private, e nenhum outro
bloco de cdigo poder ver e manipular essa varivel.

7 Nomes Ambguos
Quando se declara elementos, o Compilador do VB procura a referncia a este nome na declarao.
Se houver mais de um elemento com o mesmo nome, o Compilador utiliza o elemento que estiver no
mesmo Escopo. Exemplo :

24
Module Mod1
Public Sub Perform() ' A palavra Chave Public permite acesso de outros procedimentos.
' ...
End Module

Module Mod2
Public Sub Perform() ' Pode ser diferente do clculo executado em Perform( ) do Mod1.
' ...
Perform() ' Chama somente Perform( ) do Mod2 que o modulo ativo (mesmo escopo).
Mod1.Perform() ' Chama Perfomr( ) do Mod1.
End Module

Module Mod3
' ...
Mod1.Perform() ' Chama Perform( ) do Mod1.
Perform() ' Chama Perform( ) que um nome ambguo e portanto gera um erro.

End Module

O Exemplo acima usa 3 Mdulos, Mod1, Mod2 e Mod3. O mdulo Mod1 possui um procedimento
declarado como Pblico chamado Perform( ) e portanto est disponvel para acesso por outros
procedimentos. O mdulo Mod2 possui outro procedimento declarado como Pblico tambm
chamado Perform( ), tambm disponvel para acesso por todos os outros procedimentos. E
finalmente o mdulo Mod3 que no possui nenhum procedimento declarado.

Note que tanto Mod1 quanto Mod2 tm um mesmo nome de procedimento Perform( ) (Nome
ambguo). Quando Mod2 chama esse procedimento, o compilador procura o elemento declarado no
mesmo Escopo, isto Perform( ) declarado no mdulo ativo Mod2. Em seguida, quando Mod2
utiliza Perform( ) declarado em Mod1, utiliza uma descrio mais completa do lugar, informando ao
compilador onde dever procurar a referncia do elemento. Neste caso houve uma qualificao do
nome, e portanto no gera erros de execuo.

Quando Mod3 utiliza Perform( ) declarado em Mod1, utiliza uma descrio mais completa do lugar
onde o compilador dever procurar a referncia do elemento.
Quando Mod3 utiliza Perform( ) sem qualificar seu nome, o compilador encontra o procedimento em
Mod1 e Mod2 portanto no sabe qual utilizar, gerando erro de execuo.

Ao utilizar procedimentos ou funes de Classes ou Estruturas, obrigatrio qualificar o nome alm


de fazer referncia classe ou estrutura. Exemplo :

Dim DemoClass As Class1 = New Class1()


DemoClass.SomeSub( )

No Exemplo acima, foi criado uma varivel de referncia a classe Class1, em seguida invocou-se o
mtodo SomeSub( ). No permitido usar Class1.SomeSub( ) diretamente, pois nesse caso gera
erros de execuo.

25
No VB .NET h formas de tratar elementos ambguos, utilizando a tcnica de ocultar elementos,
tambm conhecido como Shadow. Com Shadow um elemento fica ocultado de outro elemento com
mesmo nome alm de no ficar disponvel.

H duas formas de usar a tcnica de ocultar elementos.

1. Shadowing atravs do Escopo No penltimo exemplo, o procedimento Perform( ) de


Mod2, ocultou o procedimento Perform( ) de Mod1, pois o compilador obedeceu a regra de
Escopo.
Outro Exemplo :

Module Mod3
Public Num As Integer ' Varivel a nvel de mdulo.
Sub Show()
Dim Num As Integer ' Varivel Local
Num = 2 'Varivel Local agora tem o valor 2.
MsgBox(CStr(Mod3.Num)) ' Exibe o nmero 0.
End Sub
Sub UseModuleLevelNum()
Num = 1 ' Atribui 1 Mod3.Num
' ...
Show() ' Chama Show, que exibe o valor da Varivel de mdulo Num, que agora 1
End Sub
End Module

No exemplo acima, Mod3 tem uma varivel a nvel de mdulo Num, e dois procedimentos
Show( ) e UseModuleLevelNum( ). No procedimento Show( ) foi declarada uma varivel
local ambgua a Num.

Quando o procedimento Show( ) acionado, o compilador usa a varivel local declarada


dentro deste procedimento, ou seja no mesmo escopo do procedimento ativo, portanto a
varivel local oculta (shadows) a varivel de mdulo. Portanto, no exemplo acima, para fazer
referncia a varivel em shadow preciso qualificar o seu nome, como Mod3.Num em
MsgBox(CStr(Mod3.Num)).

Quando o procedimento UseModuleLevelNum( ) acionado, o compilador usa a varivel a


nvel de mdulo, pois no h nomes ambguos dentro desse procedimento.

2. Shadowing atravs de Herana Quando uma classe derivada de outra, pode-se ocultar
(Shadow) o elemento ambguo existente na classe bsica, utilizando a palavra chave
Shadow. No se deve confundir Shadow (Ocultar) com Override (Substituir), que ser
discutido mais tarde.
Exemplo :

Public Class BaseCls


Public Z As Integer = 100 ' Elemento a ser ocultado (Shadowed).
End Class
Public Class DervCls
Inherits BaseCls
Public Shadows Z As String = "*" ' O Elemento para ocultar o anterior
End Class
Public Class UseClasses
Dim BObj As BaseCls = New DervCls() ' DervCls deriva de BaseCls.

26
Dim DObj As DervCls = New DervCls() ' Acessa atravs da classe derivada.
Public Sub ShowZ()
MsgBox("Classe bsica: " & BObj.Z) ' exibe o nmero 100.
MsgBox("Classe derivada: " & DObj.Z) ' exibe a string "*".
End Sub
End Class

No exemplo acima, h trs classes : BaseCLS que classe bsica e DervCLS que a classe
derivada, e finalmente a Classe UseClasses que utiliza as duas primeiras. A classe bsica
possui uma varivel numrica pblica Z que pode ser acessada por todos os cdigos que
utilizam essa classe. A Classe Derivada possui outra varivel Z string mas configurada com a
palavra chave Shadows que oculta a varivel numrica da classe bsica.

UseClasses faz referncia as duas classes bsica e derivada que muda o valor de cada
varivel. Note que a referncia de BObj BaseCls por isso a varivel numrica utilizada
pelo compilador, enquanto que DObj, a varivel string utilizada pelo compilador.

No caso de DObj, o elemento String ocultou (Shadowed) o elemento numrico.

2.10 Tipos de Dados

Esta seo tem por objetivo estudar os tipos de dados fundamentais e apresentar um novo tipo de
dado composto, alm de outros recursos de programao aplicados aos tipos de dados.

O VB .NET, por default, obriga a declarao de todos os elementos antes de us-los no cdigo.
Exemplo :

Dim MinhaVarivel as string

Se no for declarado o elemento no cdigo, o compilador acusa o problema e gera erro. Este tipo de
recurso chama-se Declarao Explcita. Para desligar esse recurso utiliza-se o comando Option
Explicit Off.

Toda vez que o compilador encontrar a declarao Option Explicit Off, qualquer varivel no
declarada em cdigo ir ser considerada do tipo Object, entretanto esse tipo de comportamento do
compilador gera potenciais erros de execuo alm de gerar um aplicativo de desempenho ruim.

recomendvel utilizar em todos os cdigos fontes o comando Option Explicit On para obrigar o
compilador varrer todas as variveis no declaradas.

Quando todas as variveis so declaradas com o tipo de dados em Option Explicit On, diz-se que os
elementos so Altamente tipificados (Strong Typing), que alm de aumentar a velocidade do
aplicativo, se beneficia dos recursos do editor de cdigos do Visual Studio, como por exemplo :

IntteliSense um recurso que exibe as propriedades e mtodos de um classe,


simultaneamente enquanto se digita no editor.
Verificao de sintaxe O compilador verifica a sintaxe do cdigo escrito simultaneamente
enquanto se digita no editor.

1 Usando tipos de dados Short

27
As variveis do tipo Short podem guardar valores de 16 bits (2 bytes). o menor tipo de dados
numrico disponvel.

As normas aplicadas ao tipo de dados Integer logo abaixo, se aplicam ao tipo de dados Short.
Exemplo :

Dim MeuNmero as short


Dim NossoNmero as int16

MeuNmero = 32767
NossoNmero = 32768 O VB exibe uma mensagem NaM No um nmero

No exemplo acima h duas variveis declaradas do tipo Short (int16 a mesma coisa que Short), a
primeira varivel recebeu o valor mximo de armazenamento, enquanto que a segunda recebeu um
valor superior a capacidade de armazenamento. O VB acusa o erro exibindo uma mensagem de erro
na compilao Existem erros, deseja continuar?.

2 Usando tipos de dados Integer

Qualquer tipo de dados numrico exige maior processamento do sistema , assim necessrio definir
o tipo adequadamente antes de usar. O tipo Integer armazena dados em 16-bit (2 byte) dentro da
faixa especificada acima, podendo ser utilizada para criar um enumerador (veja posteriormente).

A atribuio de um valor a varivel simples, utilizando apenas o operador de atribuio ( = ) e


nunca utilize separadores de milhares. Qualquer caractere diferente de nmero no ser aceito pelo
VB, gerando erro de Type Mismatch.

VarivelInteger = 1234

Qualquer valor digitado entre aspas ( ) uma string por definio, entretanto o VB ativa uma
interpretao correta para o tipo de dados da varivel. Veja abaixo :

VarivelInteger = 1234

O VB no se incomoda com aspas, j que a varivel do tipo numrica, podendo at efetuar


operaes matemticas corretamente, entretanto se houvesse um caractere diferente de nmero, o
sistema geraria um erro de Type Mismatch. Como no exemplo :

VarivelInteger = 1234A Tipo Integer no suporta caracteres diferentes de nmero

Pode-se utilizar um separador de precedncia ( ) para atribuir o valor numrico a uma varivel
integer sem alterar a interpretao do VB. Exemplo :

VarivelInteger = (1234)

Embora o parnteses no seja um caractere numrico, ele possui um significado de ativar a


precedncia de primeiro plano em clculos do compilador, pois desta forma no interfere na
interpretao do compilador VB. Entretanto quando se combina aspas + parnteses na atribuio de
um valor numrico, o resultado ligeiramente diferente :

VarivelInteger = (1234)
Msgbox VarivelInteger

28
No exemplo acima, a VarivelInteger ter um valo negativo 1234 exibido na caixa de mensagem
Msgbox. A combinao de aspas e parnteses ( ) troca o sinal de um valor numrico positivo,
transformando-o em negativo. Essa funcionalidade foi inserida neste contexto como simples
curiosidade.

Conclui-se que um parnteses e aspas podem criar uma interpretao diferente no compilador do VB
quando atribuirmos valores a variveis Integer, portanto devemos nos ater sempre as formas mais
simples e corretas de programao, no devemos portanto inventar coisas novas para o sistema
descobrir e que poder levar a resultados imprevisveis.

Uma varivel do tipo Integer, quando no devidamente inicializada com um valor atribudo, tem
como Default o valor zero (0) , assim por exemplo, se um desenvolvedor esquecesse de atribuir um
valor a uma varivel Integer, esse valor seria Zero (0) devido a natureza do tipo de dados Integer,
assim completamente diferente de uma varivel String vazia .
Exemplo :

Dim MeuInteiro as int32 Mesma coisa que Integer


Dim NossoInteiro as integer

MeuInteiro = 1234
NossoInteiro = 1234

3 Usando tipos de dados Long

Os tipos de dados Long so armazenados em 32bits (4 byte), que irremediavelmente necessitam de


mais memria do sistema. Todas as observaes referentes ao tipo de dados integer, se aplicam ao
tipo de dados Long, com uma ressalva na capacidade de faixa de dados que este suporta.
Exemplo :

Dim MeuLong As Int64

MeuLong = 10

MsgBox(MeuLong.MaxValue)
MsgBox(MeuLong)

No exemplo acima, foi declarado uma varivel do tipo Long (ou Int64) atribuindo o valor 10. Em
seguida foi utilizada uma funo interna dessa classe que retorna o valor mximo de armazenamento
desse tipo de dados.

Observe que todos os tipos de dados possuem funes especficas, pois fazem parte de classes da
tecnologia .NET Framework.

4 Usando tipos de dados Double e Single

Os tipos de dados Double armazenam informaes em 64-bits (8 byte) e so especialmente utilizados


para clculos precisos com nmeros decimais. Os tipo de dados Single armazenam informaes em
32-bits (4-bite). Todas as observaes referentes ao tipo de dados integer se aplicam aos dados
Double e Single

VarivelDouble = 12.123456789 O grande benefcio deste tipo de dados so as casas decimais e

29
sua preciso nos clculos.

Note porm que o VB somente aceita o separador decimal ponto ( . ) ao invs da vrgula, veja
explicaes no tipo de dados Decimal logo mais adiante.

5 Usando tipos de dados Byte

O tipo de dados Byte armazenam informaes em 8-bit (1-byte), e so utilizados para conter dados
binrios. Pode-se observar que o tipo de dados Byte tambm referenciado em banco de dados, onde
semelhante ao tipo de dados SmallInt em SGBD SQL Server.
Como um exemplo de utilizao de dados binrios copiar o contedo de um campo de dados no
formato de imagem binria (*.bmp, *.jpg, etc) para outro campo de dados :

Dim MinhaFoto as Byte


MinhaFoto = recordset.Fields(Foto).value

No fragmento de cdigo acima, a varivel MinhaFoto foi declarada explicitamente como Byte, e foi
atribuda a ela, o campo Foto de um objeto de banco de dados Recordset. Assim o contedo
binrio dessa foto foi armazenada no tipo de dados Byte, que pode ser transferida para outro campo
do banco de dados.

O tipo de dados Byte quando no devidamente inicializado pelo desenvolvedor, ter sempre como
valor Default o zero (0).

6 Usando o tipo de dados Boolean

Um tipo de dados Boolean armazena dois valores possveis : Verdadeiro (-1) ou Falso (0) em
nmeros de 16-bit (2-byte). O tipo de dados Booleano contm informaes do tipo yes/no, on/off,
true/false. O valor padro de uma varivel do tipo de dados Boolean sempre false (falso).

Os valores True e False so constantes pr-definidas no VB, que por outro lado poderiam ser
referenciadas como 1 e 0 respectivamente. O uso do tipo Boolean tipico para operaes de
comparao ou como retorno de funes especficas :

VarivelBoolean = ( 1 = 2)

A VarivelBoolean no exemplo acima, ter como resultado o valor 0 (False), decorrente de uma
comparao 1 = 2. Se a expresso de comparao fosse 2 = 2 , o valor de VarivelBoolean seria 1
(True).

Um outro exemplo de comparao entre strings para uso em tipos de dados boolean, confirma a
hiptese de que strings devem ser idnticas na sua construo, onde os caracteres mausculos e
minsculos fazem a diferena, neste caso especfico de comparao :

VarivelBoolean = ( Campo = CAmpo)

Os dois elementos so strings semelhantes, entretanto no so idnticas, pois CA maisculo faz a


distino com Ca , assim o resultado de VarivelBoolean ser False.

As propriedades dos objetos, onde informado true ou false (como por exemplo Enabled) so do tipo
Boolean. Como j foi dito , uma varivel Boolean no inicializada com a atribuio , ter como
Padro o valor False.

30
7 Usando o tipo de dados Date

Os tipos de dados Date armazenam valores em nmeros 64-bit (8-byte). Quando outros tipos de
dados so transformados para o tipo de dados Date, os nmeros representados a esquerda do valor
decimal a data, e os nmeros representados a direita do valor decimal o horrio.

H duas regras para atribuio de datas :

O sinal # ativa o reconhecimento de datas no VB.

Sempre digite datas no formato mm/dd/aa para certificar-se que o sistema interpretar corretamente
os dados, em qualquer regio.
Exemplo :

VarivelDate = #12/30/2002# data no formato mm/dd/aa

Portanto necessrio incluir o sinal # de forma a evitar uma interpretao indevida pelo compilador,
no caso de uma data em string 12/30/2001 o compilador no seria capaz de executar operaes
com datas. Exemplo :

VarivelDate1= 12/30/2001
VarivelDate2 =11/30/2001
MsgBox VarivelDate1 VarivelDate2

O compilador do VB no gera mensagens de erro no caso do exemplo acima, mesmo que as


expresses no estejam devidamente configuradas com o sinal #, entretanto no momento de efetuar
operaes com datas, o erro iminente (Type mismatch).

O exemplo acima seria corretamente configurado quando transformssemos as expresses em datas,


e o resultado final seria 1 mese de diferena entre as datas. Agora o compilador interpreta exatamente
as expresses como datas, permitindo a execuo de operaes.

VarivelDate1= #12/30/2001#
VarivelDate2 =#11/30/2001#
MsgBox VarivelDate1 VarivelDate2

O tipo de dados Date tambm pode receber uma funo intrnseca de data do VB, de forma a retornar
como resultado a data e o horrio do sistema :

VarivelDate = Now Funo Now que retorna a data e hora atual do sistema
Msgbox VarivelDate

O resultado obtido na caixa de Mensagem ser : 23/11/2001 18:46:13 como exemplo da construo
acima.

Para um clculo envolvendo dias, bastaria acrescentar ou subtrair da expresso data um inteiro
simples, como mostrado abaixo :

VarivelDate = #12/01/2001#
Msgbox (VarivelDate 1 )

31
A mensagem final seria 01/11/2001, pois foi subtrado 1 dia da data originalmente atribuda a
VarivelDate. Deve-se observar, entretanto que para efetuar operaes com datas mais eficiente, usa-
se as funes intrnsecas de datas do VB.

Note sempre que o formato atribudo mm/dd/aa, caso essa regra no for obedecida, o VB trata de
corrigir o erro, invertendo a ordem das datas automaticamente. Entretanto, no se pode esperar um
bom resultado como por exemplo o dia 01/02/2001, o resultado final seria 02/01/2001 ao invs de
01/02/2001.

O VB foi concebido em lngua Inglesa/U.S. , que considera as datas no formato mm/dd/aa,


descartando qualquer possibilidade de formatao diferente, portanto trate sempre de usar essas
regras daqui para frente, de modo a evitar confuses em clculos e atribuies.
O tipo de dados Date quando no devidamente inicializado pelo desenvolvedor, isto no for
atribudo um valor de data, ter como valor Default 00:00:00.

8 Usando o tipo de dados Decimal

Os tipos de dados Decimal so armazenados em nmeros de 128-bit (12-byte) inteiros a potncia de


10, que representa o nmero de casas decimais. Esse tipo de dados, trabalha com nmeros de grande
preciso.
Exemplo :

Dim a As Decimal = 328.558


Dim b As Decimal = 12.4051
Dim c As Decimal
c=a*b
MsgBox(c)

9 Usando o tipo de dados Object

O tipo de dados Object armazena endereos de 32-bit (4-byte) dos objetos em referncia. Esse tipo
de dados suficientemente flexvel para fazer referncia a qualquer tipo de objeto reconhecido pelo
sistema. Essa definio de armazenar endereos assemelha-se a um conceito de ponteiros em C++,
guardando suas propores. Exemplo :

Dim objDb As Object


Set objDb = OpenDatabase("c:\Vb5\Biblio.mdb")

A varivel objDb foi declarada explicitamente como um objeto de banco de dados. Note, que a
declarao foi explicitamente genrica com object, de forma a piorar o desempenho do sistema,
como regra geral tente sempre declarar objetos como Classes a que pertencem ( discusso em
captulos posteriores), uma forma de pesquisar a classe a que pertence o objeto o Object Browser.

As variveis do tipo Object podem ser tratadas do Tipo Valor ou do Tipo Referncia j estudadas
anteriormente.

O Valor Nothing usado para desassociar um objeto a varivel. recomendado desassociar (limpar
da memria) todas as variveis Object que no forem mais utilizadas no programa. Exemplo :

Dim brush As System.Drawing.Brush


brush = New System.Drawing.Brush(bmap)
......
brush = Nothing

32
No exemplo acima, foi utilizado uma varivel de objeto que faz referncia a um classe da tecnologia
.NET Framework para criar um instrumento de desenho, em seguida aps o uso, foi desassociado a
varivel do objeto, liberando a memria ao sistema.

10 Usando o tipo de dados Char

O tipo de dados Char aceita somente caracteres Unicode 2 bytes (16 bit). Pode usar mtodos como
IsDigit e IsPunctuation em variveis desse tipo para determinar sua classificao.

Se o comando de verificao Option Strict estiver ligado, preciso anexar o caracter Literal para que
o compilador identifique o tipo de varivel corretamente. Exemplo

Option Strict On
' ...
Dim CharVar As Char
CharVar = "@" ' No pode converter String em Char com Option Strict On.
CharVar = "@"C 'Assim pode

11 Usando tipos de dados String

O tipo de dados String armazenam caracteres alfanumricos e smbolos padres de cdigo ASCII ( 0
at 255) que representam todos os caracteres existentes, entretanto h de se mencionar que nem todos
os caracteres dentro dessa faixa so suportados pelo Windows. H somente um tipo de strings :

Os strings de tamanho varivel (variable-length) que diminui ou cresce a medida que os


dados so adicionados a varivel.

Para atribuirmos valores em strings, basta colocarmos esse valor entre aspas , para ativar a
interpretao do VB para tipos de dados string. Assim :

VarivelString = Carro

No caso de uma absteno no uso de aspas, o VB no interpreta a expresso como string, desde que
ela no ultrapasse uma palavra simples :

VarivelString = Carro O VB no interpreta essa expresso como string


VarivelString = Carro Azul O VB no interpreta como string, mas como uma linha de comando

No exemplo acima, a primeira atribuio no ocorre porque o VB no interpreta a expresso como


uma string vlida, assim a VarivelString ter string vazio . No ltimo exemplo, o VB interpretou a
expresso como uma linha de comando de cdigo ao compilador, e no como uma expresso String,
neste caso o VB gera uma mensagem de erro em execuo ( Esperado final do comando !) , pois a
expresso no uma palavra simples.

O VB tem uma sensibilidade especial para caracteres numricos, de forma que no h necessidade de
utilizar-se de aspas para sua atribuio , conforme o exemplo :

VarivelString = 1234
Ou
Varivel String = 1234

Logicamente, no haver maneira de efetuar qualquer operao matemtica, o que pode ser feito
uma concatenao de variveis, com resultado de 12341234 (use sempre o operador & , veja em
33
captulo posterior). Por outro lado, se fosse atribudo uma expresso 1234B sem aspas, o caractere
no numrico geraria um erro de execuo.

De qualquer forma , sempre necessrio utilizar aspas para atribuirmos strings a variveis string,
como uma forma correta de programao, mesmo que seja expresses com nmeros.

Se uma varivel String no for inicializada, isto , se o desenvolvedor no atribuir nenhuma


expresso a ela, o seu valor ser vazio .

12 Infinity (Infinito) e outros tipos de dados

No VB .NET h dois tipos de dados no numricos mas que so produzidos por clculos numricos.

Infinity Qualquer clculo que gera nmeros infinitos. Por exemplo dividir um inteiro por
zero.
NaN Not a Number (No um Nmero). qualquer resultado que no corresponde a
valores numricos.

Exemplo1 :

Dim dblVar As Double = 999

Dim infVar as Double


infVar = dblVar / 0

msgbox (InfVar)

No exemplo acima, no h formas de dividir nmeros inteiros por zero, portanto o resultado da tela
em msgbox +Infinito. Observe que no h um tipo especfico de dados que represente Infinity,
portanto um recurso da linguagem do que propriamente um tipo de dados.
Exemplo2 :

Dim var1, var2 As Double


Dim result As Double
var1 = 0
var2 = 0
result = var1 / var2
MsgBox(result)

No exemplo2, o resultado da diviso de 0 / 0 no um nmero, portanto o resultado exibido em


msgbox NaN (No um Nmero). Assim como Infinity, NaN no representado por nenhum
tipo de dados especfico, mas como um recurso da linguagem.

Pode-se usar as funes IsInfinity e IsNaN para testar o resultado de clculos matemticos.
Exemplo:

Dim var1, var2 As Double


Dim result As Double
var1 = 0
var2 = 0
result = var1 / var2
If result.IsInfinity(result) Then
If result.IsPositiveInfinity(result) Then

34
MsgBox(Encontrei um nmero muito grande. No posso continuar)
Else
MsgBox(Encontrei um nmero muito pequeno. No posso continuar)
End If
Else
If result.IsNaN(result) Then
MsgBox(Erro no clculo)
Else
MsgBox(O resultado & result.ToString)
End If
End If

13 Converses entre tipos de dados

Converso um processo que muda um tipo de valor de uma varivel para outro tipo de valor. O
comportamento do compilador VB pode mudar quando a opo Option Strict estive ligada ou
desligada, por isso justifica-se estudar esse assunto.

H dois tipos de converso no VB :


Converso Widening - Converso com alargamento significa converter um valor de um tipo
de dados de pequena faixa para um tipo de dados de grande faixa de atuao. Assim pode-se
mudar de um tipo de dados integer para um tipo de dados long.
Converso Narrowing Converso com estreitamento significa converter um valor de um
tipo de dados de grande faixa para um tipo de dados de pequena faixa de atuao. S pode
converter um tipo de dados long para integer, se o valor mximo da varivel long for
suportado pelo tipo de integer, caso contrrio gera erro de overflow.

Exemplo 1 de uma converso do tipo Widening :

Dim meuLongo As Long


Dim meuInteiro As Short

meuInteiro = 32767

meuLongo = meuInteiro

MsgBox(meuLongo) retorna 32767

Exemplo 2 de converso Narrowing :

Dim meuLongo As Long


Dim meuInteiro As Short

meuLongo = 32767

meuInteiro = meuLongo

MsgBox(meuInteiro) retorna 32767

No exemplo 1 ocorreu uma converso que alargou um valor de uma varivel inteira para um valor
long. Enquanto que no exemplo 2 ocorreu um estreitamento de um valor de uma varivel long para
um valor inteiro.

35
No exemplo 1 o compilador efetuou um converso implcita, alargando um tipo de dados inteiro
para long sem qualquer interferncia do desenvolvedor. No exemplo 2 o compilador tambm efetuou
uma converso implcita estreitando um tipo de dados long para integer, pois a opo Option Strict
estava desligada (Option Strict Off).

O compilador efetua uma converso explcita, quando o desenvolvedor usa comandos de Converso
de modo a forar uma converso de um tipo de dados para outro, esse tipo de converso tambm
conhecida como Casting. Exemplo

Dim meuInteiro as short


Dim MeuLongo as long

meuInteiro = CInt(MeuLongo)

Uma converso do tipo Narrowing explcita, isto converter um valor maior para menor com uma
funo de converso do VB, pode gerar perdas nos dados. Uma converso do tipo Widening
explcita, isto converter um valor menor para maior com uma funo de converso do VB, pode
gerar perdas no arredondamento decimal de valores no caso de converter um dados do tipo Long
para um Decimal. Pois o tipo Decimal aceita grande quantidade de nmeros aps a vrgula enquanto
que Long no aceita nmeros decimais.

A converso de qualquer tipo de dados string para um tipo de dados numricos sempre do tipo
Narrowing. O operador de concatenao ( & ) tambm funciona como conversor implcito. Exemplo:

Dim meu as integer = 1


Dim nosso as string

Nosso = Nmero & meu alm de concatenar duas variveis


o operador & tambm funciona como conversor implcito

A funo Val do VB .NET pode ser utilizado para converso de strings. A funo varre toda a string
at encontrar um dgito diferente quando termina o processo convertendo somente os nmeros
encontrados. Exemplo :

Dim m As Integer

m = Val ("142 kilmetros")

MsgBox(m) exibe a mensagem 142

Resumindo : O compilador do VB .NET tem duas regras default:


1. Toda varivel deve ser declarada antes do uso.
2. Toda converso do tipo Narrowing deve ser efetuada com funes de converso
apropriada.

Esse comportamento pode ser alterado desligando o controle de verificao Option Strict Off. Deste
modo todas as variveis podem ser usadas sem declarao anterior e o tipo de converso (Narrowing)
pode ser feito implicitamente, isto sem funes de converso.

A Microsoft recomenda sempre utilizar converses explcitas usando as funes de converso,


para criar um aplicativo de melhor desempenho. Alm disso recomenda sempre utilizar o
comando Option Strict On.

36
O compilador do VB considera alguns valores como default, como por exemplo qualquer valor
numrico desde que no seja muito alto considerado Integer; qualquer valor com dgitos
decimais considerado como Double; qualquer valor muito extenso considerado Long, e
finalmente qualquer valor com True ou False considerado Boolean. Assim quando houver erro
em atribuio de valores a constantes ou variveis, basta forar o valor da varivel utilizando os
comandos de tipo de dados. Exemplo :

Dim myDecimal as Decimal


myDecimal = 100000000000000000000 ' Erro de compilao.

No exemplo acima e conforme as definies acima, o valor 100000000000000000000 considerado


Double (default) pelo compilador, e a varivel myDecimal do tipo Decimal. Mesmo que o tipo
Decimal suporte o valor acima descrito, ele no pode aceitar o tipo de dados Double (que muito
maior), portanto o compilador gera um erro. A forma correta de utilizao :

Dim myDecimal as Decimal


myDecimal = 100000000000000000000D ' Ok.

14 Sistema numrico no VB .NET

Muitos nmeros usados em VB so decimais (base 10). Mas pode ocorrer o uso de nmeros
hexadecimais (base 16) ou nmeros octal (base 8). O Visual Basic representa nrs. Decimais com o
prefixo &H e octal com &O.

Decimal Octal Hexadecimal


9 &O11 &H9
15 &O17 &HF
16 &O20 &H10
20 &O24 &H14
255 &O377 &HFF

O computador pode trabalhar com qualquer nmero utilizado pelo sistema, entretanto o nmero
hexadecimal utilizado em certas tarefas, como o sistema de cores, tela e principalmente as APIs do
Windows.

2.10.1 Estruturas de dados

As estruturas de dados uma forma de combinar diferentes tipos de dados para criar uma nica
estrutura. Essa tcnica chamada de Tipo de Dados Compostos, pois permite criar tipos de dados
personalizados que eram conhecidos como User Defined Type UDT nas verses do VB 6.0.

Entretanto, como as estruturas permitem criar alm de tipos de dados fundamentais, tambm
propriedades, mtodos e eventos, as UDT foram aposentadas, e daqui por diante existir somente as
Estruturas de Dados.

Para criar uma estrutura, inicie com o Comando Structure e finalize com End Structure. Dentro
desse bloco de cdigo declare as variveis normalmente. Exemplo :

37
Structure Empregado
Public Nome As String ' Nome do empregado.
Public NomeFamlia As String ' Sobrenome da Famlia.
Public Telefone As Long ' Telefone do empregado.
Private Salrio As Decimal ' Salrio do empregado.
End Structure

No Exemplo acima, a estrutura foi criada com o nome de Empregado e possui variveis pblicas
(Acesso a todos os blocos de cdigo) e privadas (Acesso no permitido a outros blocos de cdigo).
Como opo, pode-se declarar uma estrutura como Public ou Private antes do comando Structure.

Depois de criar uma estrutura, deve-se criar uma varivel e declar-la com o nome dessa estrutura,
em seguida utilize as propriedades e mtodos dessa estrutura. Exemplo

Dim MinhaVarivel as Empregado


...
MinhaVarivel.Nome = Antonio

2.10.2 Matrizes (Arrays)

As Matrizes (Arrays) so sries de variveis, objetos, elementos ou controles que possuem o mesmo
nome e so diferenciados somente por um ndice que os torna nicos para identificao. As variveis
de mesmo nome so identificadas pelo seu ndice nico, que vo desde o ndice mais baixo tambm
conhecido como LBound (lower bond) at o ndice mais alto UBound (upper bond) , essas faixas
permitem que o VB evite criar matrizes maiores que o necessrio. Todos os elementos de uma
matriz , devem ser de um nico tipo de dados, entretanto se o tipo de dados for Object, claro que os
dados armazenados nesta matriz podem ser string, nmeros, datas, objetos e etc.

Para se criar uma matriz pblica, use o comando Public na seo de declarao.
Para se criar uma matriz a nvel de mdulo (module-level) , use o comando Private na seo
de declarao.
Para se criar uma matriz local (procedure-level), use o comando Dim, Static dentro de um
procedimento para declarar uma matriz.
Pode-se utilizar matrizes dentro de classes utilizando os comandos Protected, Friend, Public,
Private e Dim.

As matrizes podem ser declaradas fixando os seus limites mximos com base na faixa do tipo de
dados Long ( -2,147,483,648 at 2,147,483,647). Exemplos :

Dim MeuArray (14) as integer Matriz de 15 elementos


Dim MeuArray (2147483646) Mximo permitido

No exemplo acima, a matriz MeuArray foi declarada com no mximo 14 elementos, entretanto o
limite inferior inclue o Zero (0), que utilizado para efeito de contagem , portanto existe 15 slots
para a matriz. A segunda declarao comporta o mximo de slots possvel.
As matrizes podem ser alocadas automaticamente pelo VB, de modo que o desenvolvedor no
precise determinar o limite mximo :

Dim MeuArray ( ) as integer Informa ao VB alocar automaticamente os limites.

O Exemplo acima no especifica os limites da matriz , apenas sujeita o VB aloc-lo automaticamente


com parnteses ( ), essa matriz conhecida como Matriz Dinmica e o VB vai criar os limites at a
38
faixa mxima do tipo de dados Long. Esse procedimento utilizado, quando o desenvolvedor no
sabe de antemo quais os limites da matriz.
Por outro lado , nos exemplos anteriores, a matriz foi alocada nos limites mximos, de forma que a
matriz resultante conhecida como Matriz Esttica , e s pode ser utilizado quando o desenvolvedor
tiver completa certeza dos limites da matriz a ser utilizada.

As matrizes so classificadas tambm pela quantidade de dimenses a saber :

Matrizes Unidimensionais Que possuem apenas uma dimenso de valores mnimo e mximo .
Como por exemplo :

Dim MeuArray (2) as string Matriz unidimensional

Matrizes Multidimensionais que possuem duas ou mais dimenses de valores mnimos ou


mximos. Como por exemplo

Dim MeuArray (2,3,4) as string Matriz tridimensional


Dim MeuArray ( , , ) as string tambm pode ser escrito dessa forma

A quantidade de combinao de elementos de um matriz (Array) multidimiensional, o resultado do


produto dessas dimenses, assim no exemplo acima : 2 X 3 X 4 = 24 combinaes de slots ou
elementos. Assim o desenvolvedor pode fazer 60 combinaes de elementos possveis na matriz
MeuArray. O VB aceita uma matriz com at 32 dimenses.

Para uma matriz multidimensional, a combinao de slots complexo, a caracterstica da


combinao da matriz MeuArray (2,3,4) seria a seguinte :

10 30 50 70 90 110 130 150 170 190 210 230


20 40 60 80 100 120 140 160 180 200 220 240

O valor de MeuArray (1,1,1) = 10 ; o valor de MeuArray (2,3,4) = 240 de forma muito simples.
Entretanto o valor de MeuArray (2,3,1) = 60, o valor de MeuArray (1,2,2) = 90. De forma geral tem-
se :

Para se popular uma matriz, usa-se os ndices apropriados juntamente com o tipo de dados
corretamente, a forma recomendada pela Microsoft utilizar um Loop para manipular e popular as
matrizes.

Dim MeuArray (10, 10) as string


For i = 0 to 10
For j = 0 to 10
MeuArray ( i , j ) = Ol & (i + j)
Next j
Next I
39
O Resultado final do loop ser :

MeuArray ( 1, 1) = Ol 2
MeuArray ( 1, 2) = Ol 3
MeuArray (1, 3) = Ol 4
-
-
Etc...

Importante, as matrizes necessitam de muita memria para armazenar seus valores, e a medida que
os valores limites aumentam , mais recursos do sistema necessrio. Alm do mais, as matrizes
multidimensionais construdas com base no tipo de dados Object, so vorazes consumidores de
memria. As matrizes dinmicas podem afetar o desempenho da execuo do sistema.

O Vb oferece o comando ReDim para amenizar os custos de processamento e de memria de uma


matriz dinmica, de forma que quando usado, o VB muda os limites da matriz automaticamente com
base em valores j encontrados, entretanto o comando ReDim s pode ser usado dentro de
procedimentos (procedure-level) , sem especificar o tipo de dados. Portanto, quando se cria uma
matriz com um nmero fixo, pode-se alterar mais tarde esse nmero, utilizando o comando ReDim.

Assim, quando declara-se uma matriz dinmica na seo de mdulo de um formulrio, esta matriz
pode ser redimensionada de dentro de uma procedure. A lgica de programao do desenvolvedor
pode identificar os limites e dimenses da matriz, e em seguida redimensionar a matriz :

Dim Matrix1() As Integer


procedimento abaixo, deveria calcular os limites da matriz
e em seguida dimensionar Matrix1 com ReDim:
Sub CalcValuesNow ()
.
.
.
ReDim Matrix1(19, 29)
End Sub

No exemplo acima, a matriz Matrix1 foi declarada explicitamente de forma dinmica com o tipo de
dados numrica, e o procedimento CalcValueNow ir redimensionar os valores da matriz, para
economizar recursos de memria e do sistema, utilizando o comando ReDim para alocar 20 e 30
slots multidimensionais. O trabalho do procedimento CalcValueNow identificar os limites da
matriz e redimensiona-los automaticamente.

Cada vez que Redim acionado, os valores da matriz so limpos, assim os valores de tipos de dados
variants so convertidos para vazios, os valores so zerados para os tipos de dados integers , os
valores so limpos (strings de tamanho zero) para os tipos de dados string e os valores so
convertidos para Nothing (nenhum objeto) para os arrays de objetos. A representao abaixo mostra
como fica cada matriz aps o uso de Redim:

Dim meu ( ) as string  Redim meu (1,1)  meu (1,1) =


Dim teu ( ) as variant  Redim teu (1,1)  teu (1,1) = Empty
Dim nosso ( ) as integer  Redim nosso (1,1)  nosso (1,1) = 0
Dim vosso ( ) as object  Redim vosso (1,1)  set vosso (1,1)= nothing

40
A nica forma de reter esses valores , aproveitando os valores antigos j criados, e aumentando
somente os slots para novos dados, utiliza-se o comando Preserve .

Redim Preserve Matrix1 (19 , 29)

De forma geral , esse comando til quando se deseja preparar a matriz para novos dados, mesmo
que este esteja populado com valores anteriormente armazenados por procedimentos anteriores.
Entretanto pode-se mudar apenas o ltimo limite mximo (UBound) da ltima dimenso de uma
matriz multidimensional, se tentarmos mudar um limite inferior (Lbound) ou de outra dimenso, um
erro de run time vai ocorrer.

ReDim Preserve Matrix(19, UBound(Matrix, 2) + 1)

O cdigo acima, pode ser usado, pois acrescenta a ltima dimenso da matriz Matrix um (1) slot a
mais. Note que foi usado a funo UBound para identificar o limite mximo da ltima dimenso (2).

ReDim Preserve Matrix(UBound(Matrix, 1) + 1, 10)

Entretanto o cdigo acima, no pode ser utilizado, pois a tentativa de acrescentar mais um slot para a
primeira dimenso, gera um erro de runtime.

Assim de forma resumida temos :

Pode-se atribuir um contedo de uma matriz para outra, de duas formas : A primeira copia-se slot por
slot de cada matriz e atribui para outra matriz slot por slot, mas mais eficiente utilizar a atribuio (
= ) para copiar uma matriz para outra :

Matriz A = Matriz B Considerando que Matriz B j tenha dados

Obviamente, deve-se obedecer regras para efetuar cpias de variveis, caso contrrio podem gerar
erros de compilao e de run-time :

As matrizes devem ter o mesmo tipo de dados, ou a varivel que receber a cpia seja Object.
As matrizes devem ter o mesmo nmero de dimenses.
Os tipos de elementos de cada matriz devem ser compatveis.

As matrizes s podem ser definidas com Base zero (0), isto inicia-se no zero (0), assim um matriz
do tipo MinhaMatriz(5) possui 6 slots vazios , pois o limite inferior zero.

1 Utilizando Matrizes

Pode-se declarar uma matriz e em seguida atribuir o valor, ou declarar e atribuir (inicializar) o valor
simultaneamente.
Exemplo 1 :

Dim MinhaVarivel ( ) as single Declara uma varivel dinmica com unidimensional

41
MinhaVarivel (1) = 3456 Atribui um nmero ao primeiro slot
MinhaVarivel (2) = 3457 Atribui outro nmero ao segundo slot

Exemplo 2 :

Dim MinhaVarivel ( ) as single = New single ( ) {3456 , 3457 } Declara e inicializa os valores

No exemplo 1, foi criado a matriz MinhaVarivel e atribudo os nmeros separadamente, enquanto


que no exemplo 2 foi criado a matriz MinhaVarivel e atribudo os nmeros simultaneamente.

Observe que no exemplo 2, a matriz inicializada como parte da sua declarao, e portanto deve
seguir as seguintes regras :

Use sempre o sinal de igual ( = ) seguido pela palavra chave New com o tipo de dados da
matriz.
Finalize sempre com chaves { } a atribuio de valores.

Exemplo 3 :

Dim Meu ( ) as Byte = New Byte ( ) Declarao errada pois falta chaves { }
Dim Minha ( ) as Byte = New Byte ( ) { } Declarao correta

No exemplo acima as duas declaraes foram feitas sem valores iniciais, mas somente a segunda
declarao Minha vlida.

Exemplo 4:

Dim Nossa (1,1) as Short Declarao de matriz Multidimensional

Nossa (0,0) = (5) Atribui os valores


Nossa (0,1) = (6)
Nossa (1.0) = (7)
Nossa (1,1) = (8)

Exemplo 5 :

Dim Nossa ( , ) as Short = New Short ( , ) {{5,6},{7,8}} Declara e inicializa uma _


matriz multidimensional

msgbox (Nossa (0,0)) exibe o valor 5


msgbox (Nossa (0,1)) exibe o valor 6
msgbox (Nossa (1,0)) exibe o valor 7 .........

No Exemplo 4 e 5, a matriz Nossa tem duas dimenses de zero at hum, com declaraes e
atribuies vlidas, observe que no exemplo 5 a sintaxe diferente.

Aps a palavra chave New Short, obrigatrio incluir o nmero de vrgulas correspondentes a
declarada na varivel Nossa ( , ). Para atribuir os valores obrigatrio incluir chaves adicionais alm
de vrgulas { {5,6} , {8,8}}.

Exemplo 6 :

42
Dim Tua () () As Byte = {New Byte() {5, 6}, New Byte() {7, 8}}

Msgbox (Tua ( 0 ) ( 0 ) ) exibe o nmero 5


Msgbox ( Tua (0) ( 1) ) exibe o nmero 6
Msgbox ( Tua ( 1) ( 0) ) exibe o nmero 7
Msgbox ( Tua ( 1) (1 )) exibe o nmero 8

No exemplo 6, foi criado uma matriz contendo outra matriz. Este tipo de tcnica chamado de
matriz no retangular ou recortada (jagged) e est disponvel somente no VB .Net.

A matriz no retangular (matriz de matriz) tem sintaxe diferente de uma matriz multidimensional. No
exemplo 6, a primeira matriz Tua foi inicializada com os valores 5 e 6 , enquanto que a segunda
matriz foi inicializada com 7 e 8.

Assim para utilizar o primeiro elemento da primeira matriz usa-se ( 0 ) e ( 0 ), para utilizar o segundo
elemento da primeira matriz usa-se (0) e (1). Para acessar o ltimo elemento da ltima matriz do
exemplo, usa-se (1) e (1).

Usa-se uma matriz de matriz quando o desenvolvedor deseja combinar matrizes mas no se deseja
criar uma matriz bidimensional.

Exemplo 7

Dim Nmero(1) as integer


Dim Letra(1) as char

Nmero(0) =1 : Nmero(1) = 2
Letra(0) = A : Letra(1) = B

Dim TudoJunto(1) as Object

TudoJunto(0) = Nmero
TudoJunto(1) = Letra

Msgbox (TudoJunto(0)(0)) exibe 1


Msgbox (TudoJunto(0)(1)) exibe 2
Msgbox (TudoJunto(1)(0)) exibe A
Msgbox (TudoJunto(1)(1)) exibe B

No exemplo 7, criou-se uma matriz TudoJunto do tipo Objeto que aceita qualquer tipo de dados do
sistema, alm de duas matrizes de tipos de dados diferentes entre si.

Observe que no foi atribudo valores para TudoJunto, mas sim recebeu como atribuio as outras
matrizes Nmero e Letra. Observe ainda, que este tipo de atribuio diminui o desempenho do
aplicativo.

2 Matriz um elemento da classe System.Array

Como j foi visto nos tpicos anteriores, todo o tipo de dados fundamental uma cpia de classes da
tecnologia .Net Framework. Desta forma, as matrizes tambm herdam os recursos da classe
System.Array, oferecendo seus prprios mtodos.

Exemplo 8 :

43
Dim Meu(1) as integer = New Integer ( ) {4,5}

Msgbox (Meu.Rank) exibe o nmero 1 que equivale ao nmero de dimenses da matriz.


Msgbox (Meu.Length) exibe o nmero 2 que equivale ao nmero de slots da matriz
Meu.Clear(Meu,0,1) Limpa o slot 0 que contm o nmero 4

Msgbox (Meu(0)) exibe o nmero 0 como conseqncia da mtodo Clear

No exemplo 8, foi declarado e inicializado a matriz Meu, em seguida foi invocado as Propriedades
da classe .Net que est embutida na matriz Meu.

A Propriedade Rank retorna o nmero de dimenses da Matriz, enquanto que a Propriedade Length
retorna o nmero de slots declarados na matriz. O Mtodo Clear limpa o valor atribudo a um slot.
Observe que para utilizar as funes-membros da classe necessrio fazer a referncia completa
varivel alm do ponto . Meu.Rank.

2.11 Objetos

O VB .Net foi projetado inteiramente para programao orientada a objeto (OOP), e todo o
desenvolvedor ir trabalhar com objetos. Objeto uma pequena parte de cdigo que engloba
funes, propriedades e mtodos num nico lugar, e no pode ser executado sozinho sem um
aplicativo principal. O processo que engloba funes, propriedades e mtodos num nico objeto
chamado de Encapsulamento.

Classes e Objetos

Geralmente os objetos so escritos em forma de arquivos dll, e podem ser utilizados declarando
variveis como referncia a eles. Outro conceito importante a diferena entre Classes e Objetos.

Classes o prottipo de criao dos objetos, isto o cdigo fonte que contm
procedimentos, funes para a criao do Objeto. Cada objeto no VB .Net uma classe,
basta fazer uma referncia no programa para utilizar seus recursos.
Objeto uma cpia, tambm conhecida de instncia, de uma classe. Pode-se utilizar
quantos objetos desejar, uma vez criado a classe . Assim a Toolbox (Barra de ferramentas) do
VB .Net uma coleo de classes, uma vez escolhido um controle e desenhado na janela, esta
classe se transforma em Objeto. As Janelas do VB .Net so classes e quando o aplicativo est
em execuo (Run Time) o compilador cria uma cpia da classe e se transforma em Objeto.

Resumindo : Classe um cdigo VB .Net esttico, e Objeto um cdigo VB .Net em execuo.


Todos os Objetos so uma cpia exata da Classe que o implementa, e cada cpia de classe no
interfere no processamento de outras cpias, isto cada objeto tem seu prprio processamento.

Membros

Todo objeto possui Membros que so formados por :


Propriedades So informaes armazenadas na classe.
Mtodos So procedimentos ou aes que a classe executa.
Eventos So notificaes que uma classe emite quando determinada ao executada.

No VB .Net e no C++, as propriedades, Mtodos e Eventos tambm so chamados de Membros. No


antingo VB 6 as propriedades, mtodos e Eventos eram chamados de Interface. Para acessar um
44
Membro de um objeto, obrigatrio nomear o Objeto, usar um ponto e nomear o nome do Membro
desejado.
Exemplo:

NomeDoObjeto . NomeDoMembro
Text1.Caption = Ol

Para utilizar um Objeto, preciso criar uma instncia (Cpia) da Classe, em seguida basta utilizar os
Membros.
Exemplo:

Dim MeuObjeto as New Class1 ( )

MeuObjeto.Cantar

No Exemplo acima, foi criada uma cpia de uma classe chamada Class1 utilizando a palavra chave
as e New, em seguida utilizou-se do membro Cantar que executa um pseudo procedimento. Observe
que se omitir o comando New , a varivel fica declarada e pronta para receber a cpia de uma classe,
mas efetivamente a varivel no criada e no recebe a atribuio.

Com o comando New, o compilador cria a varivel e atribui a ela a cpia da classe.

Fontes de objetos

Os objetos no VB .Net esto divididos em duas fontes diferentes :


Objetos Internos Objetos internos, tambm conhecidos como intrnsecos ou (Built In), so
os objetos nativos do VB, isto os que acompanham o ambiente de desenvolvimento VB
.Net. So objetos internos os tipos de dados elementares, tais como Integer, Long, String, etc..
No necessrio criar referncias a objetos internos antes de serem usados no aplicativo, mas
para algumas classes necessrio criar instncias (cpias) das classes para utiliz-las.
Objetos Externos So todos os objetos que no acompanham o ambiente de
desenvolvimento. obrigatrio criar uma referncia a estes objetos externos antes de utiliz-
los. As classes da tecnologia .NET Framework devem ser importadas usando o comando
Imports antes de serem usadas no cdigo.

Com o VB .NET pode-se utilizar Objetos Externos tais como as ferramentas de edio de texto do
Microsoft Word, as frmulas do Microsoft Excel, e tantos outros recursos do Office, Corel, AutoCad
e etc. Para isso basta criar uma referncia a fonte Externa no menu do Visual Studio .NET.

Os objetos Externos e Internos permitem mltiplas aes simultaneamente. Exemplo :

Private Sub UpdateForm()


Button1.Text = "OK"
Button1.Visible = True
Button1.Top = 24
Button1.Left = 100
Button1.Enabled = True
Button1.Refresh()
End Sub

No exemplo acima, o evento UpdateForm( ) utiliza vrias propriedades e mtodos de um boto


simultaneamente. Entretanto a Microsoft recomenda utilizar os comandos With ... End With para
alcanar esse mesmo resultado . Exemplo :

Private Sub UpdateForm2()


45
With Button1
.Text = "OK"
.Visible = True
.Top = 24
.Left = 100
.Enabled = True
.Refresh()
End With
End Sub

Neste ultimo exemplo, o comando With End With melhora o desempenho do cdigo e torna mais
fcil a leitura do cdigo para outro desenvolvedores.

Janelas (Forms)

As Janelas, tambm conhecidas como Forms, Window, etc, so objetos grficos que fazem a
interface do usurio. No VB .NET as classes definem como as janelas sero exibidas e o que elas
faro. Quando um aplicativo est em execuo e uma janela exibida na tela, o VB .NET cria uma
instncia (cpia) da Classe denominada Form.

Pode-se alterar o comportamento das janelas, ou criar novos procedimentos e mtodos. Por exemplo,
para criar um procedimento (mtodo) para a janela basta escrever o procedimento e declar-lo como
pblico . Exemplo

Public Sub Som( )


Beep
End sub

O Exemplo acima cria um procedimento pblico Som, que pode ser acessado por outras partes do
cdigo. Exemplo :

Dim NovaJanela as Form1

Form1.Som ( )

No exemplo acima, foi criado uma instncia da Janela para acessar o mtodo Som ( ).

2.12 Strings

Strings um tipo de dados elementar que representa uma matriz de caracteres ( tipo de dados Char),
que aceita qualquer expresso desde que estejam entre aspas. Exemplo :

Dim minhaVarivel as String = No sei como

Para usar aspas na criao da string, necessrio criar uma dupla marcao de aspas. Exemplo

Dim minhaVarivel as String = Eu quero usar aspas

Toda string imutvel , isto significa que o seu valor no pode ser alterado uma vez que foi criado.
O que acontece que, qualquer varivel do tipo de dados String um tipo Referncia e portanto
aponta para a memria onde o valor est armazenado, uma vez que o valor alterado por outra
string, essa varivel destruda e criada em seguida com a nova string. Exemplo :

Dim minhaVarivel as String = Eu quero usar aspas


46
minhaVarivel = Agora no quero mais

No Exemplo acima a primeira linha do cdigo cria uma instncia (Cpia) da string e atribui um
valor. Na prxima linha, essa varivel destruda e uma nova cpia criada e atribuda o novo valor
Agora no quero mais.

Mtodos para manipular String

Todo tipo de dados uma classe da tecnologia .Net Framework que oferece mtodos da prpria
classe. Alm disso o VB .NET tambm oferece funes herdadas da prpria linguagem, isto significa
que no preciso fazer referncia ou cpia da classe para poder us-las. Exemplo :

Dim aString As String = "Fale Agora"


Dim bString As String
bString = Mid(aString, 2, 3) retorna a palavra ale

No exemplo acima, a sintaxe a mesma do antigo VB 6.0 onde a funo utilizada sem qualquer
referncia a classe.

Alm disso, no VB .NET pode-se utilizar mtodos da prpria classe String de duas formas
Mtodos Shared (Mtodos Compartilhados) Outra forma de usar um mtodo sem fazer
referncia ou cpia de classes. Basta colocar o nome da prpria classe. Exemplo

Dim aString as String = Fale Agora

aString = String.Copy(Fale Agora ou Cale-se) exibe o texto Fale Agora ou Cale-se

Mtodos Instance (Mtodos em Instncia) Usa os mtodos da classe fazendo a


qualificao da cpia da classe, isto o nome da varivel. Exemplo :

Dim aString as String = Fale Agora

aString.ToUpper retorna FALE AGORA

O compilador trata o tipo de dados especial Nothing igual a string vazia , entretanto o compilador
no pode fazer operaes com este string. Exemplo :

Dim Minha as string


Dim i as integer

Minha = string vazia


Minha = Nothing string vazia

i = Minha.Length Ocorre um erro de execuo, pois a varivel Minha recebeu Nothing

Pode-se comparar strings utilizado o mtodo Compare da classe String, ou a funo StrComp do
VB. Exemplo :

Dim m as string
Dim n as string
Dim resultado as integer

47
m = Nosso
n = Meu

resultado = String.Compare (m,n ) resultado tem o valor de 1

Esse mtodo retorna um nmero que indica o resultado da comparao, se o nmero for positivo
ento a primeira string (m) maior que a segunda string (n). Se o resultado for negativo, ento a
segunda string (n) maior que a primeira string (m), ao passo que se o resultado for zero, ento as
duas strings so iguais.

possvel procurar Strings dentro da string, utilizando o ndice da matriz ou procurando pela letra na
matriz. Pode-se tambm utilizar as funes InStr do VB. Exemplo :

Dim myString As String = "ABCDE"


Dim myChar As Char
myChar = myString.Chars(3) ' myChar = "D"

Observe que Strings so matrizes de caracteres (Char) e portanto possui ndices, a propriedade Char
usada para retornar a letra da matriz informando o seu ndice. No exemplo acima o ndice 3
corresponde ao caracter D.

Dim myString As String = "ABCDE"


Dim myInteger As Integer
myInteger = myString.IndexOf("D") ' myInteger = 3

No exemplo acima, a propriedade IndexOf utilizada para retornar o nmero do ndice (posio do
caracter no string) com base no caractere informado. O caractere D est na posio 3 (ndice).

possvel concatenar (combinar) duas ou mais strings, utilizando o mtodo Concat ou os operadores
& , + do VB. Exemplo :

Dim aString As String = "A"


Dim bString As String = "B"
Dim cString As String = "C"
Dim dString As String = "D"
Dim myString As String
' myString = "ABCD"
myString = String.Concat(aString, bString, cString, dString)

Uma das funes mais importantes para strings Trim, que remove os espaos no texto. Usa-se a
funo Trim do VB ou o mtodo Trim da classe String para remover os espaos na string. Exemplo :

Dim spaceString As String = _


" Este texto possui espaos "
Dim oneString As String
Dim twoString As String
' Remove todos os espaos usando o mtodo da classe String
oneString = spaceString.Trim
' Remove todos os espaos usando a funo do VB
twoString = Trim(spaceString)

48
No exemplo acima, foram utilizados tanto as funes do VB quanto o mtodo da classe String para
remover os espaos. Note que possvel eliminar somente os espaos iniciais com LTrim quanto os
espaos finais com RTrim. Exemplo:

Dim m As String
Dim a As String

m = "&&&&Caco&&&&&"
a = m.Trim("&")

MsgBox(a) mostra a string Caco

Acima, o exemplo demonstra o uso de Trim para remover caracteres especficos na string.

Conclui-se que a tecnologia .NET Framework encapsulou todas as funes do VB em classes,


substituindo algumas e aprimorando outras, de forma a facilitar o trabalho do desenvolvedor.
Entretanto necessrio estudar as classes bsicas para saber como us-las no cdigo, veja as
explicaes no captulo sobre o assunto.

2.13 - Constantes e Enumeraes

Constantes so valores que nunca mudam, um recurso da linguagem que utiliza nomes ao invs de
valores facilitando a leitura do cdigo por outros desenvolvedores.

Constantes

Para criar uma constante declare uma varivel com o comando Const, obedecendo as regras de
codificao e programao j estudadas anteriormente. Observe que se a opo Option Strict estiver
ligada (Option Strict On) ento obrigatrio declarar explicitamente o tipo de dados da Constante.
Exemplo:

Option Strict Off


Public Const IdadeDoBrasil = 500
Private Const IdadeDoMatusalm = 1500

O exemplo acima declara a constante IdadeDoBrasil em 500 anos com escopo Pblico, isto pode
ser acessada por outros blocos de cdigo, e as constante IdadeDoMatusalm em 1500 anos tem
escopo local e no pode ser acessado por outros blocos de cdigo. Observe que a opo Strict est
desligada por default, portanto no precisa especificar o tipo de dados da constante.

Option Strict On

Public Const IdadeDoBrasil as integer = 500, IdadeDoMatusalm as integer = 1500

No cdigo acima, a opo requer declarar o tipo de dados das constantes. Observe, porm que todas
as constantes agora so Pblicas e foram declaradas na mesma linha de cdigo.

H dois tipos de constantes no VB, as constantes definidas pelo usurio (User-Defined Constants)
e as constantes intrnsecas ou pr-definidas, isto as constantes do prprio VB .NET.

49
User-Defined Constants As constantes definidas pelo usurio so todas as constantes
nomeadas criadas pelo programa do desenvolvedor, nos exemplos anteriores as constantes
foram criadas e definidas pelo usurio.
Constantes intrnsecas ou pr-definidas - As constantes do VB so todas as constantes
embutidas na linguagem. Podem ser utilizadas em todas as partes do cdigo e no precisam
ser declaradas.

As constantes definidas pela linguagem VB, podem ser examinadas no Object Browser do ambiente
de desenvolvimento Visual Studio .NET, veja no captulo referente ao Ambiente de
Desenvolvimento Integrado do Visual Studio.

Exemplo de criao de constantes definidas pelo usurio utilizando constantes pr-definida pelo VB.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs)


Handles Button1.Click

Const Sim = vbYes


Const No = vbNo

MsgBox(Sim & " e " & No) exibe 6 e 7

End Sub

No exemplo acima as duas constantes so Sim e No e foram atribudas os valores de vbYes e vbNo,
respectivamente 6 e 7. Observe que as constantes foram criadas dentro de procedimento local
(Evento clique de um boto), portanto no permitido incluir comandos de declarao como por
exemplo Dim, Public, Private, etc..

Assim como as variveis, as constantes devem ser coagidas a receber alguns tipos de dados de
valores muito altos, dependendo do estado da opo Option Strict, veja a explicao no captulo
Elementos de Dados. Exemplo :

Option Strict Off Opo ligada ento e preciso coagir as constantes a receber os valores
Public Const DefaultInteger = 100 ' Default Integer.
Public Const DefaultDouble = 54.3345612 ' Default Double.
Public Const MyCharacter = "a"C ' Fora a constante a ser do tipo Char.
Public Const MyDate = #01/15/01# ' constant do tipo Date.
Public Const MyTime = #1:15:59 AM# idem acima
Public Const MyLong = 45L ' Fora o tipo de dados Long.
Public Const MySingle = 45.55! ' Fora o tipo de dados Single.

O compilador do VB considera alguns valores como default, como por exemplo qualquer valor
numrico desde que no seja muito alto considerado Integer; qualquer valor com dgitos
decimais considerado como Double; qualquer valor muito extenso considerado Long, e
finalmente qualquer valor com True ou False considerado Boolean. Assim quando houver erro
em atribuio de valores a constantes ou variveis, basta forar o valor da varivel utilizando os
comandos de tipo de dados. No exemplo acima, todas as constantes esto declaradas corretamente,
portanto o compilador no gera erros em execuo.
Exemplo :

Dim myDecimal as Decimal


myDecimal = 100000000000000000000 ' Ocorre um erro de execuo.

50
No exemplo acima e conforme as definies acima, o valor 100000000000000000000 considerado
Double (default) pelo compilador, e a varivel myDecimal do tipo Decimal. Mesmo que o tipo
Decimal suporte o valor acima descrito, ele no pode aceitar o tipo de dados Double (que muito
maior), portanto o compilador gera um erro. A forma correta de utilizao :

Dim myDecimal as Decimal


myDecimal = 100000000000000000000D ' Atribuio Correta.

Enumeradores

Os Enumeradores uma forma conveniente de agrupar conjuntos de constantes relacionadas e


tambm associar valores com nomes. Um exemplo prtico de enumeradores , quando se declara
uma varivel no Editor de Cdigo da IDE e no final da palavra chave AS , o VB exibe a lista de
opes de tipos de objetos disponveis.

Para usar enumeradores use o seguinte :

Private Enum MyEnum


Public Enum MyEnum
Protected Enum MyEnum
Friend Enum MyEnum
Protected Friend Enum MyEnum

Exemplo :

Public Enum Dias


Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
End Enum

Como Default, o valor da primeira constante do Enumerador Dias zero (0), e os valores
subseqentes so incrementados automaticamente com um (1), assim Segunda teria o valor 0, Tera
o valor 1, Quarta o valor 2 e etc. Pode-se ainda, atribuir explicitamente valores as constantes, usando
a operador de atribuio igual ( = ), mas certifique-se em no criar enumeradores com valores do
tipo ponto flutuante.
51
Para um correto uso de enumeradores, utiliza-se a estrutura hierrquica para acessar as constantes,
desta forma evita-se conflitos de referncias, quando h enumeradores com constantes iguais :

Dias . Saturday

Assim como as constantes, os enumeradores podem ser tanto intrnsecos ao VB, isto enumeradores
definidos pelo sistema VB, quanto enumeradores definidos pelo usurio. Por exemplo a funo
MsgBox do VB possui as seguintes enumeraes e constantes definidas pelo sistema :

Enumeraes Constantes Descrio


OKOnly vbOKOnly Boto OK somente (default).
OKCancel vbOKCancel Botes OK e Cancelar.
AbortRetryIgnore vbAbortRetryIgnore Botes Anular, Repetir, and Ignorar
YesNoCancel vbYesNoCancel Botes Sim, No, e Cancelar.
YesNo vbYesNo Botes Sim e No.
RetryCancel vbRetryCancel Botes Repetir and Cancelar.
Critical vbCritical cone de mensagem crtica.
Question vbQuestion cone de pergunta
Exclamation vbExclamation cone de exclamao
Information vbInformation cone de informao
DefaultButton1 vbDefaultButton1 O primeiro boto o default (default).
DefaultButton2 vbDefaultButton2 O segundo boto o default
DefaultButton3 vbDefaultButton3 O terceiro boto o default
ApplicationModal vbApplicationModal A janela de mensagem modal (default).
SystemModal vbSystemModal A janela de mensagem System modal.
MsgBoxSetForeground vbMsgBoxSetForeground Janela de mensagem de fundo
MsgBoxRight vbMsgBoxRight Alinhamento de texto a direita
MsgBoxRtlReading vbMsgBoxRtlReading Alinhamento da direita para a esquerda
(Sistema Hebreu and Arbico).
MsgBoxHelp vbMsgBoxHelp Ajuda

Exemplo :

MsgBox ("ol", MsgBoxStyle.Critical + MsgBoxStyle.OKOnly + MsgBoxStyle.SystemModal)

No exemplo acima, foi necessrio nomear a classe MsgBoxStyle a que pertence as enumeraes,
alm disso foi possvel combinar vrias enumeraes para criar a mensagem Ol.

2.14 Operadores

52
Operadores so unidades de cdigo que executam uma operao e retornam elementos como
resultado. Podem ocorrer operaes aritmticas; operaes de concatenao; operaes de
comparao; operaes lgicas.

Os operaes de atribuio e os operadores gerais, entretanto podem no retornar elementos como


resultado, apenas executam operaes gerais.

1. Operadores aritmticos

Considere as variveis abaixo :

Dim X as integer
Dim Y as integer
Dim Z as double

Soma : X=4+3 retorna 7


Subtrao : X=43 retorna 1
Y=X ainda utilizando o exemplo acima X retorna -1 (Muda o sinal)
Multiplicao : Y = 5 * 5.55 retorna 28 porque Y Integer e arredonda nmeros decimais
Diviso : Y =4/3 retorna 1 porque Y Integer e arredonda nmeros decimais
Exponenciao : Y=4^2 retorna 16
Diviso Inteira : Y = 23 \ 5 retorna 4
A diviso inteira retorna o nmero de vezes que um nmero pode ser divido por outro, no
exemplo acima 23 pode ser dividido por 5 apenas 4 vezes. Em outras palavras, diviso inteira
retorna apenas a parte inteira da diviso.
Mdulo Aritmtico : Y = 5 Mod 2 retorna 1
O mdulo aritmtico retorna apenas o resto da diviso entre dois inteiros.
Z = 100.3 Mod 4.13 retorna 1.18
O mdulo aritmtico retorna apenas o resta da diviso em ponto flutuante se os dois divisores
forem ponto flutuante.
Diviso por Zero :
Pode retornar NaN se for zero.
Pode retornar +Infinito (>0)
Pode retornar Infinito (<0)

2. Operadores de Comparao

Esses operadores comparam duas expresses e retornam um valor Boolean como resultado.

Comparao entre nmeros :


Igualdade ( = ) : 23 = 23 retorna True
Diferena (<>) : 23 <> 23 retorna False
Maior que (>) : 23 > 2 retorna True
Menor que (< ) : 23 < 2 retorna False
Menor ou igual (<=) 23 <= 23 retorna True
Maior ou igual (>=) 23 >= 23 retorna True

Comparao entre strings :


O compilador usa o operador Like interno para executar as comparaes entre strings usando um
padro, se o padro for igual retorna True seno retorna False, funcionando da mesma forma que os
nmeros. Exemplo :

73 > 9 retorna True


53
73 = 73 retorna True
aaa > aa retorna True

No primeiro exemplo o compilador usou um padro de ordem de classificao para comparar duas
strings, o padro especifica que 73 est em ltimo lugar na ordem de classificao ento a
comparao > True. No segundo exemplo, as duas strings tm a mesma ordem de classificao e a
comparao = , portanto o resultado True. No terceiro exemplo, a string aaa tem um prefixo a
mais que aae toda a string maior classificado primeiro que a string menor, logo o resultado
True.

O padro de comparao alterado pelo comando de comparao Option Compare.

Option Compare
O comando Option Compare indica ao compilador o padro para comparar strings. O comando
possui esta sintaxe :

Option Compare Text


Option Compare Binary

Option Compare Binary (Default) O compilador reconhece o ordem de classificao dos caracteres
da seguinte forma :

A < B < E < Z < a < b < e < z < < < < < <

Assim, os caracteres em maisculos, acentuados, e outros possuem uma ordem de classificao


binria interna no VB, segundo a ordem acima.

Option Compare Text O compilador reconhece a ordem de classificao dos caracteres de forma
insensitiva, isto no importa se os caracteres esto em maisculos ou minsculos. Assim :

(A=a) < (=) < (B=b) < (E=e) < (=) < (=) < (Z=z)

Exemplo :

' Muda o comportamento das comparaes para Binrio.


Option Compare Binary ' "AAA" menor que "aaa".
' Muda o comportamento das comparaes para Texto.
Option Compare Text ' "AAA" igual "aaa".

Comparao entre Objetos


Para comparar objetos obrigatrio usar o operador Is. O compilador compara os 2 objetos testando
se eles se referem a mesma cpia (instncia) de um objeto.Exemplo :

Dim x As MyClass
Dim y As New MyClass()
x=y
If x Is y Then
msgbox (So iguais)
end if

No exemplo acima foram criadas duas variveis que so instncias (cpias) da classe MyClass ( ),
em seguida foi atribuda a varivel inicializada y para outra no inicializada x, neste caso a mesma

54
cpia do objeto. O ltimo comando executa um teste comparando o valor de uma com o valor de
outra, em caso afirmativo vai exibir uma mensagem So Iguais.

Dim x As New MyClass()


Dim y As New MyClass()
If x Is y Then
msgbox (So iguais)
end if

No exemplo acima, foram tambm criadas duas variveis que so cpias da classe MyClass ( ),
observe porm que as cpias so do mesmo objeto, isto MyClass, mas as instncias (cpias) so
diferentes. A varivel X criou uma cpia separada do objeto, pois utilizou o comando New, enquanto
que a varivel Y criou outra cpia separada do mesmo objeto, pois tambm utilizou o comando New.

possvel descobrir o tipo do objeto criado utilizando o operador TypeOf...Is. Exemplo :

Dim x As Button
x = New Button()
If TypeOf x Is Control Then
' Continuao do programa.

No exemplo acima, o operador chamado para verificar se a varivel X uma instncia de uma
classe, neste caso o resultado True.

3. Operadores de Concatenao

Os operadores de concatenao juntam duas strings em uma nica string. Dois so os operadores de
concatenao : & , + .

O operador & foi especialmente criado para junes de variveis do tipo string :

Dim X as string = Meu fusca

X = X & Amarelo atribui a string Meu fusca Amarelo

O operador + alm de ser um operador aritmtico, tambm pode ser usado para concatenar strings. O
compilador do VB tem comportamentos diferentes quando a opo Option Strict est ligada (on) ou
desligada (off).:
Strict On o compilador utiliza tanto & quanto + para concatenar variveis strings da mesma
forma.
Strict Off o compilador utiliza + para fazer converses implcitas entre diversos tipos,
enquanto que & no pode executar essas converses.

Exemplo :

Dim myNumber As Integer


Dim var1 As String
Dim var2 As Integer
myNumber = 2 + 2 ' Retorna 4.
myNumber = 4257.04 + 98112 ' Retorna 102369.04.

Option Strict On
' inicializa as variveis de diferentes tipos.
55
var1 = "34"
var2 = 6
myNumber = var1 + var2 ' Gera um erro de compilao.

Option Strict Off


Var1 = "34"
Var2 = 6
myNumber = var1 + var2
' Retorna o nmero 40 como resultado da soma aps a
string Var1 ser convertida para nmero. O uso de
Option Strict Off no recomendada.

No ltimo exemplo acima, o operador + faz uma converso implcita de Var1 para integer, e o
resultado final a soma de duas variveis do tipo integer.

4. Operadores Lgicos

Os operadores lgicos comparam duas expresses do tipo verdadeiro ou false e retornam um valor
do tipo Boolean, alm disso, os operadores lgicos tambm podem processar comparaes em
Bitwise que comparam dois valores em formato binrio (base 2).

Os operadores lgicos so : And, Or, AndAlso, OrElse, Xor, Not.

Operaes com Expresses

Dentre os operadores acima, todos trabalham com dois operadores, mas somente Not trabalha com
um operador (unrio). Exemplos

Dim x As Boolean
x = Not 23 > 12 ' x False.
x = Not 23 > 67 ' x True.

No exemplo acima, o operador Not executa uma operao de negao, e simplesmente muda a
forma de avaliao proposta. Assim X no avalia 23 > 2, portanto falso, em seguida X no avalia
23 > 67 ento verdadeiro.

Dim x As Boolean
x = 23 > 12 And 12 > 4 ' x = True
x = 12 > 23 And 12 > 4 ' x = False

Acima, o operador And executa uma operao de juno entre duas expresses, e retorna
verdadeiro se todas as expresses forem verdadeiras. Se todas as expresses forem falsas, o resultado
falso. Se uma delas for verdadeira e outra false, ainda assim o resultado falso.

Dim x As Boolean
x = 23 > 12 Or 4 > 12` ' x = True
x = 23 > 45 Or 4 > 12 ' x = False

O operador Or acima, executa uma operao de disjuno entre duas expresses, Se ambas as
expresses forem verdadeiras o resultado True. Se ambas as expresses forem false, o resultado
false. Mas se uma das expresses forem verdadeiras, ento o resultado True.

Dim x As Boolean

56
x = 23 > 45 Xor 12 > 4 ' x = True
x = 23 > 12 Xor 12 > 4 ' x = False
x = 12 > 23 Xor 4 > 12 ' x = False

No exemplo acima, o operador Xor executa uma operao de excluso entre duas expresses. Se
ambas as expresses forem verdadeiras, o resultado False. Se ambas as expresses so falsas, o
resultado ainda False. Mas se uma das expresses for verdadeira e outra falsa, o resultado final
verdadeiro.

Dim x As Boolean
x = 23 > 12 And msgbox(Ol) ' exibe a mensagem Ol
x = 12 > 23 And msgbox (Ol) ' No exibe a mensagem Ol

No exemplo acima, o operador AndAlso executa uma operao de juno, semelhante ao operador
And, a nica diferena que se a primeira expresso for falsa o operador AndAlso no avalia a
segunda expresso, e o resultado ser false. Ao passo que o operador And, avalia as duas expresses
obrigatoriamente e tambm retorna false.

Dim x As Boolean
x = 23 > 12 OrElse msgbox (Ol) ' no exibe a mensagem Ol
x = 23 > 45 OrElse Msgbox ( Ol) Exibe a mensagem Ol

Acima, o operador OrElse executa uma operao de disjuno entre duas expresses, semelhante ao
operador Or, a nica diferena que se a primeira expresso for verdadeira o operador Or no avalia
a segunda expresso e o resultado ser false. Ao passo que o operador Or, avalia as duas expresses
obrigatoriamente e tambm retorna false.

Portanto os operadores AndAlso e OrElse economizam tempo e recursos de processamento e


tambm so conhecidos como operadores Short-Circuiting.

Operadores Bitwise

As operaes Bitwise avaliam valores em formato binrio, e comparam os bits em suas posies
correspondentes, em seguida retornam o resultado da comparao. Exemplo :

Dim x As Integer
x = 3 And 5 ' x = 1

No exemplo acima, no h comparao entre expresses, mas entre nmeros inteiros com o operador
And. Portanto o compilador transforma os nmeros em formato binrio e executa a comparao em
bitwise.

Primeiro o valor convertido para formato binrio :


3 em binrio = 011
5 em binrio = 101
Em seguida os binrios so comparados uma posio por vez. Se ambas as posies forem 1,
ento 1 ser o resultado da comparao dessa posio . Se uma delas for zero, ento zero ser
o resultado da comparao dessa posio :
011 3 em decimal
101 5 em decimal
001 O resultado em formato binrio
Convertendo para o formato decimal, 001 o formato binrio do nmero 1, ento x = 1.

57
Dim x As Integer
x = 3 or 5 ' x = 7

No exemplo acima, o compilador transforma os nmeros em binrio e executa uma comparao em


bitwise com o operador Or a seguir :

011 3 em decimal
101 5 em decimal
111 O resultado em formato binrio.
Convertendo para o formato decimal, 111 o formato binrio do nmero 7, ento x = 7

Dim x As Integer
x = 3 Xor 5 ' x = 6

No exemplo acima, o compilador transforma os nmeros em binrio e executa uma comparao em


bitwise com o operador XOr a seguir :

011 3 em decimal
101 5 em decimal
110 O resultado em formato binrio.
Convertendo para o formato decimal, 110 o formato binrio do nmero 6, ento x = 6

Dim x As Integer
x = Not 5 ' x = -6

No exemplo acima, o compilador transforma os nmero em binrio e executa uma comparao em


bitwise com o operador Not, que inverte a ordem dos bits incluindo o sinal, por isso o resultado -6.

Resumindo : As operaes em Bitwise s podem ser efetuadas com tipos de dados Integer. Os outros
tipos de dados devem ser convertidos obrigatoriamente para Integer.

5. Operadores de atribuio

Os operadores de atribuio executam a tarefa de pegar um valor a direita do operador e atribu-lo a


varivel a esquerda do operador. Os valores de atribuio podem ser outras variveis, expresses,
funes, entretanto todas devem obedecer as formas de converso j estudadas.

Operador =
Usado para atribuir um valor a uma varivel ou propriedade. Exemplo :

myInt = 42

Operador ^=
Usado para elevar o valor da varivel potncia definida a direita do operador, e atribui o resultado a
varivel. Exemplo :

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 ^= var2 ' O valor de var1 agora 1000.

Observe que o operador substitui a expresso var1 = 10 ^ 3. Essa a forma mais eficiente para
efetuar clculos.

58
Operador *=
Usado para multiplicar o valor da varivel pelo valor definido a direita do operador, e atribui o
resultado a varivel. Exemplo :

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 *= var2 ' O valor de var1 agora 30.

Observe que o operador substitui a expresso var1 = 10 * 3. Essa a forma mais eficiente para
efetuar clculos.

Operador /=
Divide o valor da varivel pelo valor definido a direita do operador, e atribui o resultado a varivel.
Exemplo :

Dim var1 As Integer = 12


Dim var2 As Integer = 3
var1 /= var2 ' O valor de var1 4.

O operador substitui a expresso var1 = 12 / 3. a forma mais eficiente para efetuar esse clculo.

Operador \=
Usado para dividir os inteiros da varivel pelo valor definido a direita do operador, e atribui o
resultado a varivel. Exemplo :

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 \= var2 ' O valor agora de var1 3.

O operador substitui a expresso var1 = 10 \ 3. a forma mais eficiente para efetuar esse clculo.

Operador +=
Adiciona o valor definido a direita do operador a varivel. Alm disso concatena a string definida a
direita do operador a varivel string. Todos os resultados obtidos so atribudos a varivel. Exemplo :

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 += var2 ' O valor agora da var1 13.

' Este exemplo usa variveis string.


Dim var1 As String = "10"
Dim var2 As String = "3"
var1 += var2 ' O string agora da varivel var1 "103".

O operador substitui as expresses var1 = 10 + 3, e var1 = 10 & 3. So as formas mais eficientes


para executar essas operaes. As converses devem obedecer o comportamento de acordo com a
opo Option Strict.

Operador -=
Usado para subtrair o valor definido a direita do operador da varivel, e atribui o resultado a varivel.
Exemplo :

Dim var1 As Integer = 10

59
Dim var2 As Integer = 3
var1 -= var2 ' O valor de var1 agora 7.

O operador acima substitui a expresso var1 = 10 3. a forma mais eficiente para executar essa
operao.

Operador &=
Usado para concatenar a string definida a direita do operador com a string da varivel, e atribui o
resultado a varivel. Exemplo :

Dim var1 As String = "Hello "


Dim var2 As String = "World!"
var1 &= var2 ' A string de var1 agora "Hello World!"

O operador substitui a expresso var1 = Hello & World. a forma mais eficiente para
concatenar essas strings.

Todos os operadores descritos acima aceitam expresses, funes, constantes aps os operadores.
Como por exemplo :

esse exemplo utiliza operador com uma expresso


Dim Var1 as integer = 2
Var1 += (1+2) ^ 2 o valor retornado 11

6. Operadores Gerais

Os operadores gerais so todos os operadores que no se enquadram nas divises acima. So dois os
operadores gerais.

Operador AddressOf
Usado para criar uma referncia que aponta para um procedimento ou funo definidos aps esse
operador, isto significa que o operador vai sempre executar o nome da funo a direita do operador.

Esse tipo de operador usado com o recurso Delegate do VB .Net, que ser estudado mais tarde,
para manter um ponteiro para uma funo ou procedimento mesmo que esta j tenha sido descartada
na memria.

Em verses anteriores do VB, esse operador era usado para passar o endereo de memria de um
procedimento para uma Funo API do Windows.

De forma clara, o operador AddressOf muda o curso de um procedimento qualquer para o


procedimento que foi informado a direita do operador. Exemplo :

Public Sub ButtonClickHandler(ByVal sender As Object, e As System.EventArgs)


Msgbox (Outro evento para o boto.) Exibe a mensagem Outro evento para o boto
End Sub

Public Sub New()


AddHandler Button1.Click, AddressOf ButtonClickHandler
End Sub

No exemplo acima, foi criado um procedimento ButtonClickHandler que exibe a mensagem Outro
evento para o boto. Em seguida, no evento New de uma janela do VB, foi criado um mtodo para

60
mudar o curso do evento Clique de um boto para o novo procedimento ButtonClickHandler
utilizando o operador AddressOf.

Observe que o no existe cdigo algum no evento Click do boto de comando.

Operador GetType
Usado para informar o tipo de objeto que uma varivel pertence, alm disso pode retornar
propriedades, mtodos e eventos do respectivo tipo. Exemplo :

Dim t As Type() = {GetType(Integer),GetType(System.Int32),GetType(String),GetType(Double())}


Dim i As Integer
For i = 0 To t.Length - 1
Console.WriteLine(t(i).Name)
Next i

O resultado do teste :

Int32
Int32
String
Double()

O exemplo acima, cria uma varivel como uma matriz de tipos Type( ) e inicializa seus valores com
o operador GetType. Em seguida, escreve os resultados na janela Output do Visual Studio.

7. Precedncia de operadores

O VB dentro de uma expresso, executa os clculos de operadores nessa ordem :

Operadores Aritmticos e Concatenao


1. Exponenciao (^)
2. Negao ()
3. Multiplicao e Diviso (*, /)
4. Diviso Inteira (\)
5. Mdulo aritmtico (Mod)
6. Adio e Subtrao (+, ), Concatenao de strings (+)
7. Concatenao de strings (&)

Operadores de Comparao
1. Igualdade (=)
2. Diferenciao (<>)
3. Menor que, Maior que (<,>)
4. Maior ou igual (>=)
5. Menor ou igual (<=)
6. Like
7. Is
8. TypeOf...Is

Operadores Lgicos e Bitwise


1. Negao (Not)
2. Juno (And, AndAlso)
3. Disjuno (Or, OrElse, Xor)

61
possvel alterar a ordem de precedncia dentro de uma expresso, utilizando parnteses entre os
membros da expresso. Exemplo :

x = ((4 +2) ^2) (5 * 3) x retorna 21


x = 4 + (2 ^ 2) - (5 * 3) x retorna -7

2.15 Procedures (Procedimentos)

Todo procedimento (procedure) um bloco de cdigo estruturado dentro de um comando de


declarao inicial e finalizado com um comando End. Todo o cdigo VB escrito em procedures
completamente estruturado.

Um procedimento pode ser invocado em qualquer lugar do cdigo. Assim, quando o procedimento
termina sua execuo, o controle do processo retorna ao cdigo que o chamou. O cdigo que invoca
o procedimento conhecido como cdigo de Chamada (calling code).

O VB utiliza os seguintes tipos de Procedures :

Procedimentos Sub que executam uma ao mas no retorna valor algum.


Procedimentos Manipulao de Eventos que so invocados em resposta a uma ao
exercida pelo usurio ou por uma ocorrncia do programa.
Procedimentos em Funes que executam aes e retornam valores.
Procedimentos Property (propriedades) que tanto podem retornar valores ou receber valores
para um objeto ou mdulo.

Os procedimentos podem oferecer os seguintes benefcios :

Permite ao desenvolvedor dividir os programa em pequenas partes lgicas, alm disso


permite que se faa testes separados para cada unidade muito mais facilmente do que testar o
programa inteiro.
Pode-se utilizar procedures escritos por outras linguagens de programao, com ou sem
modificao.

Todos os procedimentos Sub so iniciados com o comando Sub e finalizados com End Sub. Alm
disso podem ser precedidos por qualquer comando de declarao Public, Private, Protected, Friend e
Protected Friend. Observe que qualquer procedimento Sub declarado como Public por Default,
quando no h comandos de declarao explcitos. Exemplo:

Sub ChamarOPerador ( ) procedimento Pblico por default


Dim dataChamada As Date ' Stamp is local to TellOperator.
dataChamada = TimeOfDay() ' funo que retorna o dia hora atual.
' Usa a classe MessageBox do espao nomeado System.Windows.Forms
MessageBox.Show("Iniciando a chamada s " & CStr(dataChamada))
End Sub

No exemplo acima o procedimento Sub ChamarOperador exibe uma mensagem do horrio atual da
chamada, e apesar de exibir a mensagem Iniciando a chamada s XX:XX:XX no retorna nenhum
valor.

Para utilizar o procedimento ChamarOperador de um cdigo qualquer, basta fazer referncia ao


nome do procedimento finalizando com parnteses ( ). Como alternativa pode-se usar a palavra
chave Call. Exemplo :
62
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click

ChamarOPerador() a mesma coisa que Call ChamarOperador ( )

End Sub

No exemplo acima o procedimento sub chamado no evento clicar de um boto de comando.

Os procedimentos de Manipulao de Eventos ou simplesmente Eventos so cdigos dentro de


manipuladores de eventos que executam aes em resposta a eventos invocados pelo usurio ou pelo
prprio sistema, como por exemplo o evento clicar sobre um boto de comando como no cdigo
acima. Os procedimentos de Eventos sero estudados no captulo Visual Basic e a programao
orientada a objeto.

Todos os procedimentos em Funo so iniciados com o comando Function e finalizados com End
Function. Alm disso podem ser precedidos por qualquer comando de declarao Public, Private,
Protected, Friend e Protected Friend e devem obrigatoriamente retornar um tipo de dados ou objeto.
Todas as funes so Public por default, quando no h comandos de declarao explcitos.

Alm disso o cdigo da funo executada automaticamente at encontrar os comandos Exit


Function, Return ou End Function. Exemplo:

Exit Function Finaliza uma funo sem antes ter atingido o final das instrues.
Return Palavra chave que retorna um valor para o cdigo de chamada (Calling Code).
End Function Comando para finalizar a funo normalmente.

Function Somar2e2() As Integer

Dim a As Integer = 2
Dim b As Integer = 2

Return (a + b) pode-se retornar valores utilizando Somar2e2 = (a + b)

End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _


Handles Button1.Click

Dim Nmero as integer

Nmero = Somar2e2 ( )

Msgbox (Nmero)

End Sub

No exemplo acima, a funo Somar2e2 demonstra uma funo, muito simples e totalmente sem
propsito, como retornar valores integer para o cdigo de chamada.

63
Conforme o fragmento acima, a regra principal para utilizar uma funo igualar os tipos de dados,
se a varivel do caso acima for Integer e a funo TotalArquivosTexto retornar um valor numrico
integer, o objetivo foi alcanado.

H duas formas de se retornar valores para o cdigo de chamada :


NomeDaFuno = ValorRetornado Faz com que o controle do processamento no saia da
funo at encontrar os comandos Exit Function ou End Function. Isto significa que quando o
valor da funo retornada com esse esquema, o controle no repassado para o cdigo
chamador at que a funo encontre o comando Exit Function ou End Function.
No exemplo anterior, se o desenvolvedor utilizasse Soma2e2 = (a + b) para a funo, o
controle do sistema atribuiria 4 para o evento a varivel Nmero do evento Click, mas
voltaria a funo at encontrar os comandos Exit Function ou End Function, e em seguida
retornaria ao evento Click quando exibiria a mensagem.
No exemplo abaixo demonstrado o esquema geral para usar funes, com esse tipo de valor
retornado.

Return Faz com que o controle do processamento retorne imediatamente ao cdigo


chamador. No exemplo anterior, o comando Return finaliza a funo e retorna o controle
definitivamente ao evento Click. Abaixo um esquema demonstrando a forma geral de uma
funo com Return.

Abaixo um exemplo de como o comando Return finaliza a execuo da funo instantaneamente :

Public Function Tudoum() As Integer()


Dim x(2) As Integer
x(0) = 1
x(1) = 1
x(2) = 1
Tudoum = x
64
MsgBox("Ainda passa por aqui")
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim m() As Integer
m = Tudoum()
End Sub

No cdigo acima, a funo Tudoum( ) retorna uma matriz de inteiros e exibe uma mensagem Ainda
passa por aqui. O evento Click de um boto chama a funo e aps o comando m = Tudoum( ) a
funo ainda continua a execuo exibindo a mensagem.

Ao passo que substituindo o comando Tudoum = x por Return x, a mensagem no seria exibida.
Porm, observe que a forma do exemplo acima, permite que o desenvolvedor execute testes
adicionais para comprovar o clculo ou atribua novos valores ao procedimento, mas Return no
permite.

H duas fontes de funes no VB :

Funes Intrnsecas So as funes includas no VB, assim com : Sqr, Cos, Chr, e esto
includas no espao nomeado Microsoft.VisualBasic.
Funes Extrnsecas So as funes personalizadas criadas pelo desenvolvedor.

Observe que se a funo retornar valores em matrizes, no permitido acessar os elementos


individuais da matriz dentro da funo porque o compilador pode interpretar uma nova chamada a
funo. Exemplo :

Function TudoUm( ) As Integer()


For I = 0 To 2 ' loop simples.
TudoUm(I) = 1 ' Erro do compilador.
Next I
Return TudoUm()
End Function

No exemplo acima, no possvel acessar os elementos da funo TudoUm ( ) , ao invs disso crie
variveis matriz para acessar cada elemento individualmente. Exemplo :

Public Function TudoUm ( ) As integer()


Dim x(2) As integer
x(0) = 1
x(1) = 1
x(2) = 1
Return x
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim m() As integer
m = TudoUm( )
End Sub

65
Se dois ou mais mdulos possurem funes ou procedimentos com o mesmo nome, necessrio
excepcionalmente nestes casos, utilizar a estrutura hierrquica (nomear o mdulo) onde esto
localizadas. Exemplo :

Module2.TocarArquivosSom

Os procedimentos Property so comandos que manipulam propriedades de classes, mdulos ou


objetos. Para definir procedimentos Property utiliza-se os comandos Property e End Property
combinado com as palavras chaves Get e Set para determinar se as propriedades so somente leitura
ou leitura-gravao.

Class MinhaClasse
' Varivel local para armazenar o valor de uma propriedade.
Private ValorDaPropriedade As String
' Cria e define a propriedade.
Public Property Propriedade1() As String
Get
' Get chamado quando a propriedade retorna
' Isto quando algum cdigo de chamada tenta ler o valor dessa propriedade
Return ValorDaPropriedade
End Get
Set (ByVal Valor As String)
' Set chamado quando o valor da propriedade modificada
' O valor a ser atribudo passado no argumento Valor
ValorDaPropriedade = Valor
End Set
End Property
End Class

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

Dim m As New MinhaClasse()


m.Propriedade1 = "caco"
MsgBox(m.Propriedade1)

End Sub

O exemplo acima, resume todas as tarefas necessrias para criar propriedades em uma classe
chamada MinhaClasse. Observe que a regra geral sempre criar variveis locais para guardar os
valores das propriedades e utilizar as palavras chaves Get e Set para tornar as propriedades Leitura-
Gravao. Em seguida o evento clique de um boto de comando criar uma instncia (uma cpia) da
classe MinhaClasse e manipula a propriedade do objeto criado. Os procedimentos Procedures sero
estudados no captulo VB e a programao orientada a objeto.

1. Argumentos em procedimentos

Algumas funes e procedimentos podem necessitar de informaes adicionais para executarem suas
tarefas, essas informaes so enviadas pelo cdigo de chamada e podem ser variveis; constantes;
expresses e objetos. Cada valor passado para o procedimento chamado de argumento. Exemplo :

66
No exemplo acima, a funo Somar possui dois argumentos Nmero1 e Nmero2 que so utilizados
no clculo da soma dos valores. Cada argumento deve ser explicitamente declarado com um tipo de
dados, alm disso podem haver vrios argumentos em conjunto. A forma correta para a funo acima
seria :

Private Function Somar (ByVal Nmero1 as integer, ByVal Nmero2 as Integer) as Integer

Return (Nmero1 + Nmero2)

End Function

H duas formas de passar argumentos para funes ou procedimentos :

Argumentos passados por valor (ByVal) Os argumentos ByVal so apenas cpias do


valor dessas variveis, e portanto qualquer alterao dessas variveis decorrentes do cdigo
da funo ou procedimento, no afetar o valor original da varivel. O tipo ByVal o Default
nas funes em Visual Basic.
Argumentos passados por Referncia (ByRef) Os argumento por referncia, o valor
original do argumento utilizado e qualquer mudana neste valor decorrente do cdigo da
funo ou procedimento afetar o valor original da varivel.

Os argumento ByVal, so ponteiros de dados, e no valores de dados , isto implica dizer que no h
como mudar um valor se o VB no tem acesso ao contedo da memria, somente o endereo. Ao
passo que, argumento por referncia, o VB tem acesso ao contedo da memria no endereo
especfico, assim qualquer alterao do valor dessa varivel, afetar o contedo da memria e
conseqentemente a varivel original ser alterada permanentemente.

O compilador do VB no trata os tipos de dados dos parmetros da mesma forma entre ByVal e
ByRef. Veja o quadro abaixo :

Elementos variveis (ByRef) Elementos no variveis (ByVal)


Variveis gerais, incluindo variveis de objeto Constantes
Campos ou propriedades (de classes) Literais
Matrizes Enumeradores
Estruturas Expresses

Assim os argumentos por Valor so considerados elementos no variveis, pois no podem ser
alterados pela funo ou procedimento, portanto o compilador trata os tipos de variveis como
constantes, literais, enumeradores e expresses.

67
Observe que ByVal no permite alterar os prprios valores, entretanto possvel alterar os membros
do objeto que ele aponta. Por exemplo, possvel alterar, mas no atribuir uma nova matriz para um
argumento matriz. Exemplo:

Public Sub Increase (ByVal A() As Long)


Dim J As Integer
For J = 0 To UBound(A)
A(J) = A(J) + 1
Next J
End Sub
' ...
Public Sub Replace(ByVal A() As Long)
Dim J As Integer
Dim K() As Long = {100, 200, 300}
A=K
For J = 0 To UBound(A)
A(J) = A(J) + 1
Next J
End Sub
' ...
Dim N() As Long = {10, 20, 30, 40}
Increase(N)
' N agora 11, 21, 31, and 41. Porque N no foi substitudo por novos valore apenas alterado
Replace(N)
' N() ainda 11, 21, 31, and 41. Pois N foi passado por Valor
' O procedimento Replace no pode modificar a varivel criando uma nova matriz a varivel
'Quando Replace cria uma matriz K e atribui valores para ela, a referncia a N( ) perdida.
'Assim quando ocorrem mudanas em A ( ) somente K ( ) afetado.

No exemplo acima, o procedimento Increase alterou os elementos da matriz (membros), enquanto


que Replace tenta alterar a prpria matriz, substituindo por outra.

Quando um argumento varivel do tipo objeto passado por Referncia, pode-se atribuir um novo
objeto a esse argumento e a alterao tambm se refletir no cdigo chamador. Assim no exemplo
acima, se Replace utilizasse argumentos por Referncia, e K ( ) fosse atribuda a N ( ), os valores
teriam sido os seguintes:

' N() agora seria 101, 201, and 301. Porque N foi passado por ByRef
' Replace tambm modificaria N e tambm atribuiria uma nova matriz para ele.

A tabela a seguir resume toda a explicao acima :

Tipo do elemento ByVal ByRef


Tipo Valor (Contm O procedimento no pode mudar O procedimento pode mudar o valor e
somente um valor) o valor nem seus membros. seus membros.
Tipo Referncia (contm O procedimento no pode mudar O procedimento pode mudar tanto a
um ponteiro para a classe a varivel mas pode mudar os varivel como os membros da instncia
ou estrutura) membros da instncia (cpia) que ele aponta)
que ele aponta)

O compilador VB pode forar o uso de argumentos ByRef em ByVal atravs do cdigo Chamador,
incluindo os argumentos entre parnteses. Exemplo :

68
Sub AlgumaCoisa(ByRef MinhaVarivel As String)
' Cdigo que faz alguma coisa.
End Sub
' ...
Call AlgumaCoisa((Str)) ' Envia Str como ByVal mesmo que o procedimento seja ByRef.
' O parnteses Str protege a varivel contra alteraes.

O exemplo acima utiliza um procedimento AlgumaCoisa que possui argumentos por Referncia,
entretanto o cdigo Chamador envia o argumento Str como Valor (ByVal).

Sempre que o VB encontrar funes ou procedimentos sem as palavras chaves ByVal ou ByRef, o
mecanismo padro de passagem de argumentos por Valor ByVal. Entretanto a Microsoft
recomenda sempre utilizar as palavras chaves para declarar explicitamente como os argumentos
devem ser passados pelo cdigo chamador.

O mecanismo de passagem de parmetros influencia no desempenho do aplicativo. A Microsoft


recomenda passar argumentos por Referncia quando os valores so estruturas muito extensas, pois o
argumento ByVal precisa copiar completamente os dados para a memria. Alm disso, recomenda
passar valores strings ou objetos por ByVal que no influencia no desempenho.

2. Argumentos por posio ou por nome

possvel passar argumentos pela posio, isto pela ordem em que eles foram declarados na
funo ou procedimento. Exemplo :

Sub StudentInfo(ByVal Name As String, Optional ByVal Age As Short = 0, Optional ByVal Birth
As Date = #1/1/2000#)
Debug.WriteLine(Name, Age, Birth)
End Sub

StudentInfo("Mary", 19, #21-Sep-1981#) pode preencher todos os argumentos

StudentInfo("Mary", , #21-Sep-1981#) omitir um dos argumentos

No exemplo acima foi criado um procedimento chamado StudentInfo com 3 argumentos. Para o
cdigo chamador, basta preencher os argumentos e separ-los com vrgula para cada posio.
Observe porm que em um dos cdigos foi omitido o parmetro Age pois foi definido no
procedimento original como Opcional (Optional). O parmetro omitido deve ser seguido por vrgula
normalmente.

Para passar argumentos por nome, basta nomear os argumentos seguidos por dois pontos e igual ( :=
) e atribuir os valores. Exemplo :

StudentInfo(Age:=19, Birth:=#21 Sep 1981#, Name:="Mary")

Observe que no preciso obedecer as posies dos argumentos quando se passar argumentos por
nome. Alm disso pode-se combinar argumentos por nome e por posio como no exemplo abaixo :

StudentInfo("Mary", Birth:=#21 Sep 1981#)

Note ainda que no preciso incluir vrgulas no argumento omitido, pois os argumentos por nome j
indicam ao compilador que um dos argumentos opcionais devem ser omitidos. Outra observao

69
importante que, uma vez um argumento fornecido por nome, todos os argumentos posteriores
devem ser fornecidos por nome.

Resumidamente, as regras para forneceder parmetros so :

Para fornecer parmetros por posio inclua vrgulas entre os parmetros obedecendo sempre
a ordem dos parmetros.
Para fornecer parmetros por Nome inclua vrgulas entre os parmetros, nomeie os
parmetros e digite : = (dois pontos e vrgula). No preciso obedecer a ordem dos
parmetros.
S possvel omitir os parmetros quando o procedimento original definir o parmetro como
Optional. Alm disso, os parmetros omitidos devem ser seguidos de vrgula, exceto quando
fornecer parmetros por Nome.
possvel fornecer tanto parmetros por Nome e por posio no mesmo procedimento,
entretanto uma vez fornecido um parmetro por Nome, todos os outros parmetros devem ser
informados por nome.
No possvel fornecer parmetros Matriz por Nome.

3. Argumentos Opcionais (Optional)

Um procedimento pode definir um parmetro como opcional (Optional), desta forma o cdigo
chamador pode omit-lo no momento de invocar o procedimento. Para isso basta utilizar a palavra
chave Optional. Exemplo :

Sub subname(ByVal arg1 As type1, Optional ByVal arg2 As type2 = default)

Para chamar um procedimento opcional, basta omitir o valor e incluir vrgulas na posio do
argumento. Exemplo :

Call subname(arg1, , , arg4)

Dentro de um procedimento que possui um argumento opcional, preciso identificar se o argumento


foi omitido ou explicitamente informado pelo cdigo chamador. Para alcanar esse objeto basta
informar um valor default para esse parmetro. Exemplo :

Sub Notify(ByVal Company As String, Optional ByVal Office As String = "QJZ")


If Office = "QJZ" Then
Debug.WriteLine("Office no informado, notifique o usurio")
Office = "Usurio"
End If
' cdigo qualquer para informar o usurio.
End Sub

No exemplo acima o procedimento Notify utilizar um argumento Optional Office com um valor
padro QJZ, para inspecionar se o argumento foi explicitamente informado pelo cdigo chamador,
basta comparar com o valor padro QJZ, se o valor for diferente ento significa que o cdigo
chamador forneceu outro valor.

4. Parmetros em Matriz (Array)

70
Quando um procedimento construdo para receber 3 argumentos, o VB exige no mximo a
passagem de 3 argumentos. No entanto, pode-se criar procedimentos que aceitam receber um nmero
arbitrrio de argumentos, para isso utiliza-se a Palavra-chave ParamArray. Exemplo :

Sub NotasEstudantes(ByVal Nome As String, ByVal ParamArray Notas() As String)


Dim I As Integer
Msgbox ("Scores for " & Nome & ":")
' Use a funo UBound o maior elemento da matriz.
For I = 0 To UBound(Notas)
Debug.WriteLine("Nota " & I & ": " & Notas(I))
Next I
End Sub

NotasEstudantes("Anne", "10", "26", "32", "15", "22", "24", "16")


NotasEstudantes("Mary", "Alto", "Baixo", "Mdia", "Alto")
Dim NotasJohn() As String = {"35", "Ausente", "21", "30"}
NotasEstudantes("John", NotasJohn)

No exemplo acima foi criado um procedimento NotasEstudantes com um parmetro Nome e outro
Parmetro em matriz Notas que exibem uma mensagem na tela para nome de aluno. Em seguida um
cdigo de chamada invoca o argumento fornecendo um nome de estudante e vrias notas.

Para usar a palavra chave ParamArray, necessrio seguir as regras abaixo :

Um procedimento s pode ter uma matriz de parmetros, e deve ser sempre o ltimo
argumento de um conjunto de argumentos.
Toda matriz de parmetros sempre passado por valor. Use sempre a palavra chave ByVal.
O cdigo dentro do procedimento deve trabalhar a matriz de parmetros como uma matriz
unidimensional.
Todos as matrizes de parmetros so automaticamente opcionais por default.
Todos os argumentos antes da matriz de argumentos no podem ser opcionais (Optional). A
matriz de parmetros deve ser o nico argumento opcional.
O cdigo de chamada pode omitir um argumento do tipo matriz de argumentos, alm disso
possvel enviar a palavra chave Nothing como argumento que tem o mesmo efeito.
Pode-se enviar no cdigo chamador uma lista indefinida de elementos para a matriz.
Pode-se enviar no cdigo chamador uma matriz diretamente como argumento desde que seja
do mesmo tipo.

A palavra-chave ParamArray deve utilizar mais recursos do sistema em comparao a uma funo
construda com nmero definido de argumentos, pois tratando-se de colees ou matrizes, o VB tem
um trabalho maior em manipular essas estruturas.

5. Procedimentos recursivos

Um procedimento chamado de recursivo quando ele chama a si prprio. Recurso uma tcnica
caracterstica de linguagens avanadas que permite que um cdigo dentro de um procedimento
chame o prprio procedimento. Exemplo :

Function Factorial(ByVal N As Integer) As Integer


If N <= 1 Then .
Return 1
Else
Return Factorial(N - 1) * N
71
End If
End Function

O exemplo acima cria uma funo que calcula o fatorial de um nmero, a simplicidade do cdigo
est na linha Return Factorial (N 1) * N que chama o prprio procedimento.

Para utilizar recurso preciso colocar o nome do procedimento em seguida incluir parnteses,
mesmo que o procedimento no utilize argumentos, caso contrrio o compilador entende que a
funo termina neste ponto e retorna um valor qualquer.

preciso certificar-se que os procedimentos recursivos no iro causar erro de falta de espao em
memria, por utilizar indefinidamente a recurso. Alm disso possvel substituir normalmente
loops por recurso.

6. Sobrecarregando procedimentos (Overloading)

Sobrecarregar um procedimento ou Overloading significa utilizar um nico procedimento com


vrios tipos diferentes de argumentos ou verses. J foi visto anteriormente que um procedimento
pode ser definido com vrios argumentos, entretanto com a sobrecarga possvel utilizar esse mesmo
procedimento utilizando uma lista de argumentos diferentes, sem precisar criar novos procedimentos
para argumento novo.

Overloads Sub Z(ByVal X As Byte, ByVal Y As Double) ' Overload 1.


Overloads Sub Z(ByVal X As Short, ByVal Y As Single, ByVal Z as Double) ' Overload 2.
Overloads Sub Z(ByVal X As Integer, ByVal Y As Single, Byval Z as Decimal) ' Overload 3.

No exemplo acima, h um nico procedimento Z implementado com verses contendo uma lista de
argumentos diferentes. Para criar um overloading necessrio seguir as regras abaixo :

Cada verso deve ter o mesmo nome do procedimento original.


Para cada verso pelo menos um elemento dos argumentos devem ser diferentes, isto ou o
nmero de argumentos devem ser diferentes, ou a ordem dos argumentos devem ser
diferentes ou os tipos de dados dos argumentos devem ser diferentes.
S possvel diferenciar as verses de um mesmo procedimento atravs da lista de
argumentos, em outras palavras no permitido criar overloading diferenciando os
procedimentos pelo nome do argumento, ou pelo tipo de dados do valor retornado, ou pelo
tipo de acesso Public, Private, Static ou tampouco pelo modificador de argumento ByVal,
ByRef.
possvel sobrecarregar uma funo ou mtodo quando construir uma classe da mesma
forma que sobrecarrega-se um procedimento simples.

Exemplo :

Overloads Sub Z(ByVal X As Byte, Optional ByVal Y As Double) ' Overload 1.


Overloads Sub Z(ByVal X As Short, ByVal Y As Single) ' Overload 2.

No exemplo acima, Overloading no permitido pois somente o modificador de argumento


(Optional) diferente entre as duas verses e conforme as regras acima, somente permitido
Overloading quando os argumentos forem diferentes pelo tipo de dados ou pela ordem.

Utilizando a palavra chave Overloads e o nome de um procedimento, define-se vrias verses desse
procedimento.

72
Exemplo :
Sub P (ByVal D As Date, ByVal ParamArray C() As Char)

' O procedimento anterior equivalente as seguintes verses sobrecarregadas:


' Overloads Sub P (ByVal D As Date, ByVal C() As Char)
' Overloads Sub P (ByVal D As Date)
' Overloads Sub P (ByVal D As Date, ByVal C As Char)
' Overloads Sub P (ByVal D As Date, ByVal C1 As Char, ByVal C2 As Char)
' Pode-se prosseguir adicionando um argumento Char para cada verso sobrecarregada.

No exemplo acima, h um procedimento P definido com parmetros D e uma matriz de Parmetros


C. Para simplificar o procedimento, foi feito uma sobrecarga em 4 ou mais verses deste
procedimento, isto possvel porque um parmetro do tipo matriz de dados e outro parmetro foi
criado sem matriz.

2.16 - Collection (Colees)

Collection (Colees) uma maneira de agrupar tipos de objetos enquanto que matrizes mais
eficiente em agrupar variveis. Pode-se usar colees quando trabalharmos com um pequeno
conjunto de itens ou membros que possuam as mesmas caractersticas, podendo variar de janelas
abertas at endereos URL de internet.

As colees so trilhas de objetos comuns e no podem ser redimensionados quando se adiciona


novos membros a coleo. H colees de formulrio, colees de controles, colees de
impressoras, e alm disso o VB oferece colees genricas, que permite criar nossas prprias
colees personalizadas.

Uma coleo armazena cada item como um tipo de dados Objeto, assim tudo aquilo que voc utiliza
para ser armazenado em uma varivel objeto pode ser adicionado a coleo, exceto os tipos de dados
compostos que no so suportados.

Os tipos de dados compostos devem ser utilizados somente em matrizes, entretanto um Collection
muito mais veloz do que matrizes, j que utiliza apenas 16 bytes em memria no importanto o que
se armazena nele.

Os membros da interface de uma coleo so :

Propriedade ou mtodo Descrio


Mtodo Add Adiciona itens a coleo.
Propriedade Count Retorna o nmero de itens da coleo. Somente-leitura.
Mtodo Item Retorna um item pelo ndice ou pela chave (identificao nica)
Mtodo Remove Apaga um item da coleo pelo ndice ou pela chave.

Essas propriedades e mtodos da interface de um objeto Collection, permitem utilizar todos os seus
servios.

Uma chave (Key) um valor em String, que um nome de identificao para o elemento.
Um ndice (Index) um nmero Long que vai de 1 (hum) at o nmero de elementos do
Collection.

A Microsoft recomenda utilizar uma estrutura For eachNext, para interagir com uma collection,
(ver estruturas de controle e deciso).
73
Para criar uma coleo utilize o comando Collection. Exemplo :

Public NomedaVarivel As New Collection

A palavra chave New, instrui o VB a inicializar uma coleo imediatamente e depois criar a coleo
aps a varivel ser referenciada em cdigo.

Para adicionar itens a uma collection utilize o mtodo Add. Exemplo :

nomedaVarivel.Add novoItem, novoItem.ID

Note que foi adicionado um objeto novoItem, poderia ser qualquer formulrio, ou outro objeto
qualquer que contenha uma propriedade prpria ID que seria uma identificao em string do objeto.
Essa propriedade funciona apenas como uma identificao imaginria, apenas para demonstrar que
neste ponto onde ser criada uma identificao para o objeto na coleo. importante observar que
as colees podem ser iniciadas a partir de ndice zero (0) ou ndice hum (1).

colWorkOrders.Add novoItem, novoItem.ID, after:=2

No outro exemplo acima, utilizou-se um argmento nomeado after, que usado para posicionar esse
item na posio nmero 3. Poderia, entretanto, usar o argumento nomeado before, para posicionar o
item antes do item nmero 2, sendo assim ele seria o segundo item da lista, e todo o restante seria
reposicionado adequadamente.

Caso before : = 1, o item seria o primeiro da lista, e todos os subsequentes seriam adicionado com 1
em suas posies. A sintaxe dos argumentos nomeados sempre seguido de dois pontos ( : ) e igual
(=) :

Before : = valor
After : = valor

Note ainda que, a instruo novoItem.ID precisa ser do tipo String, caso contrrio dever ser
convertido para o tipo de dados String com a funo CStr.

Para apagar itens de uma coleo utilize o mtodo Remove. Exemplo :

nomedaVarivel.Remove 3
OU
nomedaVarivel.Remove "W017493"

No exemplo acima, o argumento index (ndice) pode ser tanto a posio do item na coleo quanto a
sua identificao (Key).

Para retornar itens de uma coleo utilize o mtodo Item. Exemplo :

Set woCurrent = colWorkOrders.Item(3)


ou
Set woCurrent = colWorkOrders.Item("W017493")

Como se pode observar no exemplo acima, necessrio declarar uma varivel onde ser atribuido o
valor retornado da coleo . Utilizou-se a palavra chave Set para atribuirmos o valor de um objeto a
varivel.

74
A regra principal a ser seguida :

Um ndice sempre deve ser do tipo de dados LONG


Uma Key ou identificao deve ser sempre do tipo de dados STRING.

Collection tambm se beneficia de um mtodo Default em sua interface, pois Collection realmente
um objeto. O mtodo Default do objeto Collection Item, assim para retornar o valor de um item,
usa-se :

Set woCurrent = colWorkOrders(3)


ou
Set woCurrent = colWorkOrders("W017493")

necessrio ter em mente que quando apagamos ou adicionamos novos membros a coleo, o VB
automaticamente ajusta os ndices de cada membro, alterando-o. A Microsoft recomenda utilizar o
Key (identificao) para retornar valores de uma collection, para evitar confuso entre ndices
alterados.

Como Collection um conjunto de objetos relacionados e todos possuem sua interface, possvel
manipular suas propriedades e mtodos atravs do mtodo Item do objeto Collection. No exemplo
abaixo, utilizou-se a uma propriedade chamada Prioridade do item W017493 da coleo
colWorkOrders :

colWorkOrders.Item("W017493").Prioridade = 3
colWorkOrders("W017493").Prioridade = 3

Observa-se que os dois fragmentos de cdigo utilizam o mtodo Item da coleo para alterar a
propriedade Prioridade, sem que fosse declarado uma varivel com Set, conforme foi visto na sintaxe
no incio do tpico. Isso foi possvel, pois apenas uma propriedade do objeto em questo foi alterado,
no havendo a obrigao de criar uma varivel somente para essa tarefa.

Entretanto, mais vivel por questes de velocidade a utilizao de uma varivel altamente tipificada
para receber a cpia de uma coleo, e em seguida manipularmos as propriedades e mtodos do
membro da coleo :

Dim Meu as colWorkOrders


Meu(W017493).Prioridade = 3

A varivel Meu foi declarada implicitamente como um objeto colWorkOrders, e o VB interpreta uma
varivel de objeto mais rapidamente que Collection, pois este ltimo armazena os seus itens como
Object (Veja explicao acima) tornando-os muito lentos para acesso e manipulao.

A varivel Meu apenas uma cpia de colWorkOrders j totalmente carregada na memria,


permitindo ao VB acessar os elementos dessa coleo de forma mais simples possvel. Enquanto que
se acessarmos a Coleo colWorkOrders diretamente , sem intermediao da varivel Meu, o VB
seria obrigado a acessar os itens dessa coleo ativando o mecanismo de leitura de tipos de dados
Object que exige muito mais processamento e memria.

O VB possui colees pr-construdas no ambiente para uso do desenvolvedor. As colees so


cpias da classe System.Collections da plataforma .Net Framework.

75
As colees pr-construdas do Vb no permitem que o desenvolvedor adicione ou remova seus itens
atravs do cdigo, como por exemplo a coleo CheckedListBox.CheckedItems no possui os
mtodos Add ou Remove.

2.17 - Estruturas de Controle de Fluxo

As estruturas de controle atuam sobre o fluxo do programa e so organizadas atravs de estruturas de


deciso e estruturas de Loop. So comuns a todas as linguagens de programao.

As estruturas de deciso so instrues de condies de teste e conforme o resultado executa a ao.

If...Then End if
If...Then.Elseif .Else
Select Case .... End Select
Try...Catch...Finally

Exemplo :

Private Sub mnuCut_Click (Index As Integer)


If Index = 0 Then
executa um cdigo
ElseIf Index = 1 Then
executa outro cdigo
ElseIf Index = 2 Then
executa outro tipo de cdigo
Else Finaliza a estrutura de teste
executa o ltimo cdigo
End If
End Sub

Private Sub mnuCut_Click (Index As Integer)


Select Case Index
Case 0
executa um cdigo
Case 1
executa outro cdigo
Case 2
executa outro tipo de cdigo
Case 3
executa outro tipo de cdigo
Case Else Usa-se Else excepcionalmente para selecionar um valor inesperado
executa o cdigo final
End Select
End Sub

A estrutura Select Case avalia uma expresso somente uma vez no incio da estrutura, enquanto que
a estrutura If ... Then... Else avalia a mesma expresso para cada ElseIf. A estrutura Select Case
mais eficiente do que If ... ElseIf se , e somente se o comando If e ElseIf avaliar a mesma expresso.

Os comandos Try... Catch... Finally so usados para interceptar excees (erros) em um bloco de
cdigo particular. Quando um cdigo potencialmente pode gerar erros de compilao, basta colocar o

76
cdigo na estrutura Try... Catch... Finally que o compilador intercepta o erro e permite que o
desenvolvedor crie um procedimento capaz de resolver o problema.

Qualquer cdigo dentro dessa estrutura inicia a execuo em Try, se no houver nenhuma incidncia
de excees (erros ) o VB vai diretamente para o comando Finally at o final do procedimento. Ao
passo que quando h excees o VB vai diretamente para o comando Catch (se houver) e ento
prossegue at o comando Finally ( se houver ) at o final, isto End Try. Portanto o bloco de
cdigo em Finally ser sempre o ltimo a ser executado.

O procedimento escrito dentro do bloco Catch dever ser criado para interceptar e corrigir o erro
gerado por um cdigo em particular, alm disso o bloco Catch permite especificar o tipo de exceo
(erro) que a estrutura dever interceptar e corrigir.

Se o tipo de erro em Catch no for especificado, esse bloco de cdigo ir interceptar todo e qualquer
tipo de erro gerado pelo cdigo em questo, neste caso quando o cdigo em Catch no foi projetado
para interceptar e corrigir esse tipo de erro, o Visual Studio exibe uma mensagem de erro
normalmente.

Public Sub Teste()


Dim x As Integer = 5
Dim y As Integer = 0
Try ' Estrutura para interceptar o erro.
x /= y ' Erro de "Diviso por zero".
Catch ex As Exception When y = 0 ' Intercepta o tipo de erro y = 0.
MsgBox(ex.toString) ' Mostra uma mensagem de erro amigvel ao usurio.
Finally
Beep() ' Beep aps o processamento completo.
End Try
End Sub

O exemplo acima demonstra o uso da estrutura Try, Catch, Finally que intercepta somente o erro de
diviso por zero. O cdigo que gerou o erro est em Try x /= y pois y = 0 , em seguida o comando
Catch intercepta o erro quando y = 0, observe que ex uma varivel qualquer que recebe o tipo de
erro retornado pelas classe de exceo do .Net Framework.

Dim DataQualquer As Object ' Varivel que recebe informaes de data/hora.


Dim PrximoSculo As Date
Try
PrximoSculo = DateAdd("yyyy", 100, DataQualquer)
Catch DeuPau As System.ArgumentException
Msgbox (Pelo menos um argumento tem um valor invlido)
Catch DeuPau As ArgumentOutOfRangeException
Msgbox (O resultado maior que 32 de Dezembro de 9999)
Catch DeuPau As InvalidCastException
Msgbox (A varivel DataQualquer no possui dados do tipo Data/Hora )
Catch
Msgbox (Ocorreu uma exceo desconhecida)
Finally
Msgbox (O erro foi avisado com sucesso)
End Try

O exemplo acima um fragmento de cdigo que aps receber uma data e horrio em DataQualquer
testa a adio de 100 anos para o valor original. Se o valor resultante ultrapassar o limite de data do

77
VB ( maior de Dezembro de 9999) o bloco Em System.ArgumentOutOfRangeException entra em
ao e exibe a mensagem O Resultado maior que 32 de Dezembro de 9999. Da mesma forma se
ocorrer um erro no previsto o cdigo em Catch exibe a mensagem Ocorreu uma exceo
desconhecida.

Observe ainda que possvel criar quantos comandos Catch desejar para interceptar uma quantidade
grande de excees.

As estruturas de Loop executam um bloco de cdigo repetitivamente:

While...End While
Do...Loop (ramificaes abaixo)
Do Until . Loop
Do. Loop Until
For...Next
For Each...Next

O comando While ... End While usado para executar um bloco de cdigo em um nmero
indefinido de vezes dependendo do valor de uma condio testada. Exemplo :

Dim Nmero as integer = 0


While Nmero > 6
Nmero = Nmero - 1
End While

O comando While sempre executa o teste antes de iniciar o loop. Para encerrar um loop infinito basta
pressionar a tecla ESC ou CTRL + BREAK em RunTime. (cdigo em Execuo).

A estrutura DoLoop tem duas formas de construo, com uma nica diferena, a primeira forma
Do Until pode no executar um looping, enquanto que a ltima forma Do..., executa
obrigatoriamente pelo menos um looping.

Loop zero ou mais vezes Loop pelo menos uma vez

Do Until condio Do
comandos comandos
Loop Loop Until condio

Exemplos :

Do While InStr(position, longstring, target)


position = InStr(position, longstring, target)_
+1
count = count + 1
Loop

For i = 0 To Screen.FontCount
Print Screen.Fonts(i)
Next

For Each MyTableDef In objDb.TableDefs()


List1.AddItem MyTableDef.Name
Next MyTableDef
78
A estrutura For ... Next, usa um contador com incrementos variados, utilizando a palavra chave Step.

For i =1 to 14 Step 2

Next I

No antepenltimo exemplo, a estrutura For Next usa um objeto global Screen.FontCount como
contador (propriedade FontCount), enquanto que no penltimo exemplo a estrutra For Each... In...,
ligeiramente diferente, pois usado para colees de objetos, e tem a seguinte estrutura :

For Each elemento In grupo


comandos
Next element

Elemento pode ser um controle qualquer que faz parte de uma coleo e muito til quando o
desenvolvedor no sabe o nmero exato de elementos de uma coleo ou matriz. Entretanto
necessrio seguir algumas regras no uso dessa estrutura especfica :

Dentro de colees, o elemento no pode ser uma varivel objeto, ou uma varivel de objeto
genrica ou um objeto listado no Object Browser.
Para as matrizes, o elemento no pode ser uma varivel Objeto.
No se pode utilizar essa estrutura com uma matriz do tipo composta definidos pelo usurio
pois um Objeto no pode conter um tipo definido pelo usurio.

O comando Exit usado para finalizar um loop, um comando de deciso, um procedimento ou uma
funo bruscamente. A nica preocupao combinar o comando Exit com a estrutura utilizada.

For contador = incio To final [Step incremenot]


[comandos]
[Exit For]
[comando]
Next [contador[, contador] [,...]]

Do [{While | Until} condio]


[comandos]
[Exit Do]
[comandos]
Loop

Private Function Somar ( )


[Comandos]
Exit Function
[Comandos]
End Function

Private Sub Form1_Load ( )


[Comandos]
Exit Sub
[Comandos]
End Sub

79
As estruturas acima listadas podem trabalhar dentro de outras, essa caracterstica especial chamada
de estruturas aninhadas (A Microsoft utiliza o termo Nested), formando um conjunto de loops e
decises coexistentes, obedecendo nveis segundo a construo do bloco de cdigo. A indentao de
cdigo (tabulao das linhas) necessrio para tornar o cdigo mais legvel e de fcil identificao
dos nveis.

O fragmento de cdigo abaixo , apresenta uma estrutura aninhada , com indentao de linhas, cujo
primeiro nvel uma estrutura de loop, o segundo nvel uma estrutura de deciso e o terceiro e
ltimo nvel (mais profundo) tambm uma estrutura de deciso :

For i = 0 To frmVCR.Controls.Count - 1
If TypeOf frmVCR.Controls(i) Is Shape Then
If frmVCR.Controls(i).Name = MyControl Then
frmVCR.Controls(i).Visible = True
Else
frmVCR.Controls(i).Visible = False
End If
End If
Next

No VB, ainda h a estrutura WithEnd With que permite executar referncias repetidas a um
nico objeto, em outras palavras ao invs de repetir o mesmo nome do objeto ao usar sua interface
basta apenas colocar os cdigos do objeto dentro da estrutura With....End With precedidos com
ponto ( .) .

MeuLabel.Height = 2000
MeuLabel.Width = 2000
MeuLabel.Text = Este o meu Label

With MeuLabel
.Height = 2000
.Width = 2000
.Text = "Este o meu Label"
End With

Observe no cdigo acima que o controle Label MeuLabel foi invocado trs vezes para atribuir
valores para as propriedades Height, Width e Text respectivamente, enquanto que no cdigo seguinte
o mesmo controle foi invocado apenas uma vez na estrutura With...End With.

Alm de economizar tempo de digitao a Microsoft recomenda utilizar sempre esta estrutura para
criar um cdigo de alto desempenho e eficincia.

O Comando Exit usado em qualquer estrutura de controle, loop ou procedimento e permite


encerrar o cdigo imediatamente aps Exit.

Exit Select
Exit Try
Exit Do
Exit While
Exit For

Exit Sub
Exit Function
Exit Property
80
Exemplo :

Do Until y = -1
If x < 0 Then Exit Do
x = Sqrt(x)
If y > 0 Then Exit Do
y=y+3
If z = 0 Then Exit Do
z=x/z
Loop

O cdigo acima demonstra um loop com uma estrutura aninhada* que encerrada quando os
valores de x, y e z so zero. Observe que Exit completamente diferente de End, pois Exit transfere
o controle do sistema diretamente ao procedimento chamador (quando houver), ao passo que End
finaliza completamente a execuo do programa.

*Estrutura aninhada uma tcnica que consiste em criar comandos de deciso ou de desvios
dentro de outros comandos de deciso ou desvios, utilizando indentao de linhas.

Sub DemonstraoDoExit()
Dim I, MyNum As Integer
Do ' loop infinito
For I = 1 To 1000 ' Loop de 1000 vezes
MyNum = Int(Rnd * 1000) ' Cria um nmero aleatrio.
Select Case MyNum ' Avalia o nmero.
Case 7: Exit For ' se 7, exit For...Next.
Case 29: Exit Do ' se 29, exit Do...Loop.
Case 54: Exit Sub ' se 54, exit Sub procedure.
End Select
Next I
Loop
End Sub

No exemplo acima, o cdigo em DemonstraoDoExit utiliza Exit em diversas estruturas aninhadas,


observe a sintaxe de Exit para cada situao.

Alm das estruturas acima, h comandos e palavras chaves que tambm executam desvios de fluxo
do programa:

Comando GoTo : Desvia o fluxo do programa para uma linha nomeada dentro do procedimento.
Exemplo :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

GoTo LInhaDois
MsgBox("Nunca vai passar aqui")
LinhaDois:
MsgBox("entou na linha dois e fecha o procedimento")
End Sub

End Class

81
No exemplo acima o evento clique de um boto utiliza o comando GoTo para desviar o fluxo do
procedimento para uma linha nomeada LinhaDois e exibir a mensagem entrou na linha dois e
fecha o procedimento. Observe que a sintaxe do comando sempre GoTo NomeDaLinha, em
seguida preciso criar uma linha nomeada com dois pontos ( : ), no possvel utilizar indentao
em linhas nomeadas.

O comando GoTo cria cdigos difceis de ler e de serem revisados, portanto no utilize esse tipo de
comando no aplicativo.

Comando On Error : Permite desviar o fluxo do programa para uma linha nomeada que trata erros
de execuo do cdigo. O comando On Error especialmente til para interceptar e tratar erros de
execuo, quando um procedimento aciona um erro o programa desviado automaticamente para o
procedimento que trata o tipo de erro especfico.

Public Sub IniciarMatriz(Var1, Var2, Var3, Var4)


On Error GoTo ErrorHandler
' Cdigo qualquer que gera um erro
Exit Sub
ErrorHandler:
' Cdigo qualquer que intercepta o erro
Resume Next
End Sub

O exemplo acima IniciarMatriz disponibiliza uma manipulao de erro atravs do comando Goto
ErrorHandler, note que ErrorHandler o nome de uma linha nomeada no cdigo. Dentro da linha
nomeada deve ser escrito o cdigo que trata do erro especfico. Observe que sempre ao utilizar uma
linha nomeada preciso incluir o comando Exit Sub ou Exit Function antes da linha nomeada, para
evitar que o fluxo do programa processe os comandos da linha nomeada.

H dois momentos em um procedimento que manipula erros :


1. Disponibilizado (Enabled) Todo procedimento possui um manipulador de erro
disponibilizado quando o desenvolvedor coloca o comando de desvio Goto NomeDaLinha.
Significa que o manipulador de evento est ligado.
2. Ativo (Active) Quando ocorre um erro e o procedimento que trata do erro j est
processando os comandos. Portanto j ocorreu o desvio do fluxo do aplicativo e o sistema j
est processando o cdigo que trata o erro.

Alm disso o comando On Error pode ser combinado com os comandos :


Resume Next Faz com que a execuo do cdigo continue com o comando
imediatamente posterior ao comando que gerou o erro ( prefervel do que GoTo).
GoTo Desvia o fluxo do programa para uma linha nomeada que contm o cdigo
que trata o erro.
GoTo 0 Desliga o manipulador de erro para esse procedimento.
Goto 1 - Desliga as excees para esse procedimento.

On Error Goto ErrorHandler ' Disponibiliza a rotina de erro do procedimento


On Error Goto 0 ' Desliga a interceptao de erro.
On Error Resume Next ' Continua com os comandos aps o erro.

Comando End : Finaliza imediatamente a execuo do aplicativo.

Sub Form_Load()
82
Dim Password, Pword As String
PassWord = "Swordfish"
Pword = InputBox("Digite a Senha")
If Pword <> PassWord Then
MsgBox ("Desculpe, senha incorreta")
End
End If
End Sub

No exemplo acima o evento Load de uma janela exibe uma mensagem para digitar Senha, se o
usurio digitar qualquer coisa diferente de Swordfish no s o procedimento encerrado mas todo
o aplicativo finalizado instantaneamente.

Comando Stop : Suspende a execuo do aplicativo, o mesmo efeito do boto pause do ambiente
Visual Studio .NET.

Dim I As Integer
For I = 1 To 10 .
Debug.WriteLine (I) ' Imprime I na janela Output
Stop ' Pra a execuao do loop at que o usurio escolha continuar.
Next I

Funo Choose : Seleciona e retorna o valor de uma lista de argumentos. A sintaxe da funo :

Public Function Choose (ByVal Index As Double, ByVal ParamArray Choice() As Object) As
Object

Index o nmero que varia de 1 at o total de elementos do segumento parmetro.


Choice uma matriz de parmetros separados por vrgula ou uma varivel de matriz
unidimensional.

Function Escolha(Ind As Integer) As String


Escolha = CStr(Choose(Ind, "Speedy", "AJato", "Virtua"))
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

MsgBox(Escolha(2)) exibe a mensagem Ajato

End Sub

No cdigo acima a funo Escolha retorna um tipo de string para o nmero informado Ind. No
procedimento de evento Clique de um boto foi invocado a funo Escolha com o ndice 2, neste
caso corresponde ao string Ajato.

Funo Switch : Avalia uma lista de expresses e retorna um valor associado com a primeira
expresso encontrada na lista. A sintaxe da funo :

VarivelObjeto = Switch ( <expr-1, value-1[, expr-2, value-2 [, expr-n,value-n]]> )

Expr-1 Expresso que se deseja avaliar


Value-1 Valor ou expresso a ser retornada se a expresso correspondente for igual.

83
Dim A as integer = 2
Dim B as integer = 2
Dim C as integer = 2
Msgbox (Microsoft.VisualBasic.Switch(A<2,Letra A < 2, B=2, Letra B = 2, C<3, Letra C<3))
Valor Impresso : Letra B = 2

A lista de argumentos da funo Switch consiste de pares de expresses e valores. As expresses so


avaliadas medida que aparecem na lista da esquerda para a direita e retornado o valor associado
primeira expresso para avaliar True. No exemplo acima as expresses so comparaes entre A,
B,C e os valores retornados so os string do tipo Letra A < 2.

Mtodo Call : Transfere o controle do aplicativo para um procedimento, Funo ou DLL definido
aps o mtodo Call.
Call ExibirJanela( )
Call Shell("C:\Windows\calc.exe", AppWinStyle.NormalFocus)

Comandos Property, Function, Sub : Comandos usados para declarar blocos de cdigo como
propriedades, funes e procedimentos Sub respectivamente. O controle do fluxo do programa
desviado para o cdigo entre a estrutura Property... End Property, Function .... End Function,
Sub ... End Sub.

2.18 - Visual Basic .NET e a programao orientada a objeto

Tudo o que feito em VB est associado a objetos, ou melhor ainda programao orientada a
objeto ou object orientation program (oop).

Toda a programao orientada a objeto est ligada a criao de classes e objetos. Uma classe, como
j foi estudado anteriormente, o prottipo de um objeto em fase de implementao (construo).
Um objeto uma classe j implementada e em uso por algum outro bloco de cdigo ou
desenvolvedor.

Todo cdigo VB til pode-se tornar uma classe, podendo ser reutilizado por outros cdigos ou por
outros desenvolvedores. Ao invs de copiar e colar o cdigo pronto, basta fazer uma referncia a
classe e utiliz-a no aplicativo em construo.

Toda classe possui campos (Fields), propriedades, mtodos e eventos. Os campos ou propriedades
so valores ou informaes sobre um objeto. Os campos so variveis puras dentro de classes que
retornam informaes e recebem valores diretamente. As propriedades so similares as variveis,
entretanto so implementadas com maior controle sobre o contedo que elas recebem. Os Mtodos
so procedimentos que o objeto pode executar. Os Eventos so notificaes que o objeto dispara em
resposta a uma ao desenvolvida pelo usurio ou pelo sistema.

Uma classe deve possuir trs qualidades :

1. Encapsulamento (Encapsulation) Provm de cpsulas e significa que uma classe deve


reunir um conjunto de campos, propriedades, mtodos e eventos em uma nica entidade.
2. Herana (Inheritance) Herana a habilidade de poder utilizar uma classe qualquer para
poder construir outras classes baseadas nessa classe. A classe derivada herda todos os
campos, propriedades, mtodos e eventos da classe bsica, permitindo que seja implementada
outros tipos de funcionalidades na classe derivada.

84
3. Polimorfismo (Polymorphism) - a habilidade que uma classe deve possuir para permitir
que um mesmo nome de propriedade no importa que tipo de dados seja, execute diferentes
tarefas. Portanto no preciso criar vrios mtodos ou propriedades diferentes para criar
tarefas diferentes, basta utilizar a habilidade polimrfica para usar um nico nome de mtodo
ou propriedade com implementaes diferentes.

O polimorfismo utiliza trs tcnicas para criar membros com o mesmo nome :

Sobrecarga de Membros (Overloaded) a tcnica que permite utilizar um mtodo ou


propriedade com o mesmo nome mas com parmetros diferentes (nmero de parmetros
diferentes ou parmetros com tipos de dados diferentes).
Substituio de membros (Overridden) - a tcnica que permite substituir uma
propriedade ou mtodo herdado de um classe bsica por outra propriedade ou mtodo em um
classe derivada.
Ocultao de membros (Shadowed) a tcnica que permite substituir (ocultar)
localmente um membro por outro que esteja em um mesmo escopo. Por exemplo pode-se
declara uma propriedade que oculte um mtodo de uma classe herdada de mesmo nome.

2.18.1 Early bound e Late bound

O compilador do VB executa um processo chamado de ligao (Binding) quando um objeto


atribudo a uma varivel. Esse processo de ligao pode ser demorado e dispendioso para o sistema
ou pode ser rpido e econmico para o sistema dependendo de como for criado e atribudo o objeto
varivel.

H dois tipos de binding no VB :

1. Early Bound Os objetos early bound permitem que o compilador aloque memria
suficiente para o objeto e execute otimizaes antes que o aplicativo seja executado. Quando
uma varivel declarada com um tipo de dados especfico recebe um objeto do mesmo tipo
ento considerado um objeto Early Bound.
2. Late Bound Os objetos late bound permitem que o compilador faa uma referncia ao
objeto na memria entretanto perde quase toda as otimizaes de um objeto early bound.
Quando uma varivel declarada com um tipo de dados Object (Universal) recebe um objeto
qualquer, ento considerado um objeto Late Bound.

De forma resumida os objetos Early Bound o processo mais eficiente para o compilador, e,
portanto deve ser sempre utilizado ao invs dos objetos Late Bound.

Exemplo de um processo early bound :

Imports System.IO
'...
' Cria uma varivel do tipo FileStream.
Dim FS As FileStream
' Atribui um novo objeto a essa varivel.
FS = New FileStream("C:\tmp.txt", FileMode.Open)

Observe que o cdigo acima utiliza uma varivel explicitamente declarada com o tipo de objeto
FileStream da classe System.IO. Em seguida o objeto a ser atribudo um arquivo de texto tabular
que exatamente do mesmo tipo que a varivel foi declarada.

85
A varivel FS foi declarada para receber um objeto do tipo texto, alm disso uma cpia da classe
FileStream da plataforma .NET Framework.

A tcnica para criar um objeto Early Bound declarar um objeto de um tipo especfico tambm
conhecido como criar um objeto Totalmente qualificado. Um objeto totalmente qualificado deve ter
a sintaxe : EspaoNomeado.NomeDaClasse.NomeDoObjeto, que semelhante ao caminho de
arquivo de Texto (C:/Meus Documentos/MeuTexto.txt).

Exemplo de um processo late bound :

DIM XLAPP AS OBJECT


DIM XLBOOK AS OBJECT
DIM XLSHEET AS OBJECT
XLAPP = CREATEOBJECT("EXCEL.APPLICATION")
'UMA CPIA LATE BIND DE UMA ARQUIVO DO EXCEL
XLBOOK = XLAPP.WORKBOOKS.ADD
UAM CPIA 'LATE BIND DE UMA PLANILHA DO EXCEL.
XLSHEET = XLBOOK.WORKSHEETS(1)
XLSHEET.ACTIVATE()
XLSHEET.APPLICATION.VISIBLE = TRUE ' MOSTRA O APLICATIVO
' COLOCA ALGUM TEXTO NA SEGUNDA LINHA DA PLANILHA
XLSHEET.CELLS(2, 2) = "ESTA A COLUNA B LINHA 2"

No exemplo acima, foram criadas 3 variveis do tipo Object que aceitam qualquer tipo de dados do
sistema. Em seguida foram atribudos instncias de uma automao do Excel, arquivo, planilha e etc.
Observe que as variveis no foram declaradas de um tipo especfico de dados ou classes, mas com
um tipo de dados genrico como o tipo Object.

O compilador precisa descobrir qual o tipo de dados do objeto e fazer uma referncia na memria
para esse objeto recm criado.

2.18.2 Palavra chave New e liberando recursos do Sistema

Para criar uma cpia de uma classe obrigatrio utilizar a palavra chave New que explicitamente
cria um objeto antes de ser usado. Com New o sistema preparado para alocar memria para um
objeto. Exemplo :

Dim Button1 As System.Windows.Forms.Button()

Dim Button2 As New System.Windows.Forms.Button()

O primeiro exemplo simplesmente declarou uma varivel como cpia de um boto de comando.
Entretanto a varivel Button1 ainda contm o valor Nothing at que o desenvolvedor atribua um
objeto a varivel como no exemplo abaixo :

Button1 = New system.Windows.Forms.Button( )

Ainda no segundo exemplo, o cdigo declara uma varivel e atribui uma cpia de um boto de
comando. A varivel Button2 realmente contm o objeto Boto de comando pois utilizou-se da
palavra chave New.

86
Todos os objetos consomem memria e recursos do sistema especialmente quando so criados
atravs da palavra chave New. Entretanto a tecnologia .NET Framework se responsabiliza em
desalocar automaticamente da memria todos os objetos que no esto em uso sem nenhuma
intercesso do desenvolvedor.

A plataforma .NET Framework utiliza um arquivo de runtime comum a todas as linguagens de


programao (CLR Common Language RunTime) que por sua vez usa um sistema chamado de
Garbage Collection (coletor de lixos) que administra toda a memria de um aplicativo criado com a
tecnologia .NET.

A palavra chave Nothing usada para indicar que uma varivel de objeto no contm referncia a
nenhum objeto. Alm disso possvel atribuir Nothing a objetos explicitamente para torn-los
disassociados, isto sem referncia alguma a outro objeto. Isto no implica dizer que a memria
ficar livre desse objeto imediatamente, pois como j foi dito o Garbage Collection se encarregar
dessa tarefa em seu tempo. Exemplo :

Dim Button1 As System.Windows.Forms.Button()


Button1 = Nothing

Por outro lado h alguns objetos que possuem os mtodos Dispose e Finalize que liberam recursos
muito dispendiosos para o sistema imediatamente. Exemplo :

MeuObjeto.Dispose

2.18.3 Trabalhando com Grupos de Objetos

Para trabalhar com grupos de objetos, simplesmente crie uma matriz com o tipo do objeto desejado.
Exemplo :

Dim x(10) As MeuObjeto contm 11 elementos de x(0) at x(10)


Dim q As Integer
For q = 0 to 10
x(q) = New MeuObjeto( )
Next

No exemplo acima foi criado uma varivel matriz de 11 elementos de um tipo de dados MeuObjeto.
Em seguida dentro de um loop, foi referenciado o objeto para cada ndice da matriz, pois a varivel
foi declarado sem a palavra chave New.

A tcnica de melhor desempenho para trabalhar com grupos de objetos o objeto Collection
(Colees). Exemplo :

Public colMeu As New Collection


' Cria um novo objeto e adiciona a coleo.
Private Sub CrieOObjeto()
Dim tempObjeto As New MeuObjeto()
colMeu.Add(tempObjeto)
End Sub

No cdigo acima, foi inicializada uma varivel de objeto Coleo para receber um nico objeto
processado no procedimento CrieOObjeto.

87
Todas as propriedades e mtodos de matrizes e colees so utilizados normalmente conforme
explicado em captulos anteriores.

2.18.4 - Obtendo informaes de uma classe

possvel determinar o tipo de objeto que uma varivel genrica pertence atravs de trs formas :

1. Funo TypeName Retorna uma string que indica o nome da classe que uma varivel de
objeto pertence.
2. Operador TypeOf...Is Testa um tipo de objeto efetuando uma comparao entre eles,
retornando True se for de um tipo especfico. Esse operador muito mais rpido que a funo
TypeName.
3. Funo CallByName - Permite usar uma string para executar um determinado mtodo ou
propriedade de um objeto em fase de execuo (Run Time).

Exemplo de TypeName e TypeOf...Is :

MsgBox(TypeName(Ctrl)) Exibe uma mensagem com o nome de classe de um varivel Objeto

If TypeOf Ctrl Is Button Then Testa se uma varivel Objeto do tipo Boto de Comando
MsgBox("Esse controle um boto.")
End If

Observe com ateno que o operador TypeOf...Is sempre retorna True quando um objeto do tipo
especfico ou de uma classe derivada de um tipo especfico. Por isso quando se testa uma varivel do
tipo Integer ou String por exemplo, isto implica dizer que ambas os tipos de dados so herdados de
uma classe chamada System.Object, o operador TypeOf...Is sempre retorna True.

Sub CheckType(ByVal InParam)


' Ambos If sero verdadeiros quando um
' Integer passado como parmetro.
If TypeOf InParam Is Object Then
MsgBox("InParam um objeto")
End If
If TypeOf InParam Is Integer Then
MsgBox("InParam um inteiro")
End If
End Sub

A funo CallByName freqentemente utilizada para acessar objetos do tipo COM e objetos do
tipo .NET. Esta funo permite que o desenvolvedor possa descobrir as propriedades e mtodos de
um objeto em fase de criao (Design Time) simplesmente enviando strings para o objeto e
esperando que seja executado a operao sem a preocupao em saber se os dados enviados so do
tipo esperado pelo mtodo ou propriedade do objeto.

A sintaxe da funo CallByName :

Resultado = CallByName(Objeto, NomeProcedimento, TipoChamada, Argumentos())

Onde :

Objeto Nome do objeto que deseja executar as aes.


88
NomeProcedimento String que representa o nome da propriedade ou mtodo do objeto.
TipChamada Tipo do procedimento a ser invocado e pode ser um das constantes abaixo :
(Microsoft.VisualBasic.CallType.Method) mtodo
(Microsoft.VisualBasic.CallType.Get) ler uma propriedade
(Microsoft.VisualBasic.CallType.Set) atribuir uma propriedade

Exemplo da funo CallByName :

Class Matemtica
Function SquareRoot(ByVal X As Double) As Double
Return Math.Sqrt(X)
End Function
Function InverseSine(ByVal X As Double) As Double
Return Math.Atan(X / Math.Sqrt(-X * X + 1))
End Function
Function Acos(ByVal X As Double) As Double
Return Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
End Function
End Class

Private Sub CallMatemtica()


Dim Math As New Matemtica()
Me.TextBox1.Text = CStr(CallByName(Matemtica, Me.TextBox2.Text, _
Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub

se digitar 64 na caixa de Texto TextBox1 e digitar SquareRoot na caixa de Texto TextBox2 e


acionar o procedimento CallMatemtica, o cdigo acionar a funo SquareRoot da classe
Matemtica e retornar o resultado 8.

NO exemplo acima, foi criado uma classe chamada Matemtica com 3 membros de dados que
realizam clculos matemticos. Em seguida foi criado um procedimento que chama a classe
matemtica atravs da funo CallByName avaliando os dados digitados nas caixas de texto 1 e 2.

A funo CallByName tem desempenho muito pior do que qualquer outro procedimento Late Bound
visto anteriormente, alm disso pode afetar drasticamente o desempenho do aplicativo final.

2.18.5 - Classes

O cdigo por trs dos objetos chamado de classes e definem as propriedades, mtodos, campos e
eventos desses objetos. De fato, classes so as estruturas dos objetos enquanto que os objetos so as
instncias das classes.

Para criar uma classe utilize a estrutura Class ... End Class com o nome da classe desejada.
Exemplo:

Public / Private Class MinhaClasse

End Class

89
possvel criar classes internas para as janelas quanto projetos exclusivamente para construir classes
gerais. Para isso basta usar o menu do Visual Studio .NET para criar novos projetos ou adicionar
novos itens de classe para o projeto.

Sempre que necessrio utilize o comando Imports para acessar as classes .NET, digitando-o sempre
no incio do cdigo fonte da classe. Por exemplo :

Imports Microsoft.Win32

Public / Private Class MinhaClasse

End Class

Para criar campos simples na classe declare variveis com os modificadores de acesso. Exemplo :

Imports Microsoft.Win32

Public Class MinhaClasse

Private localNome as string


Private localEndereo as string

End Class

Os campos acima foram declarados com Private, portanto s podem ser acessados de dentro da
classe, conforme as regras de escopo. Os campos so teis para trabalharem em conjunto com as
propriedades, essa tcnica recomendada para todos os procedimentos com classes.

As propriedades so ligeiramente diferentes dos campos conforme explicado em captulos anteriores.


Portanto para criar novas propriedades utilize a estrutra Property ... End Property declarados com
os modificadores de acesso e especificando um nome para a propriedade. Exemplo :

Imports Microsoft.Win32

Public Class MinhaClasse

Private localNome as string


Private localEndereo as string

Public Property Nome() As String


Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property

End Class

No exemplo acima foi criada uma propriedade chamada Nome que recebe um argumento Valor e
atribui diretamente para a varivel-campo localNome declarada anteriormente, alm disso pode
retornar esse valor simplesmente chamando novamente a varivel localNome. Observe que a palavra

90
chave Get permite somente ler um valor de propriedade enquanto que Set permite atribuir um valor
para uma propriedade.

Conclui-se que necessrio criar variveis locais para armazenar os valores de propriedades e
permitir a execuo de clculos mais abrangentes.

Para definir mtodos (aes que a classe executa) utilize a estrutura de procedimentos simples Sub ...
End Sub declarados com os modificadores de acesso para controlar o escopo, alm disso, informe
sempre o nome do mtodo. Exemplo :

Imports Microsoft.Win32

Public Class MinhaClasse

Private localNome as string


Private localEndereo as string

Public Property Nome() As String


Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property

Public Sub ContarPalavras( ) as integer


Dim intTotal as Integer
If localNome = then
Msgbox(No h nome algum informado)
Else
intTotal = Len(localNome)
Msgbox( intTotal )
End if
End Sub

End Class

Como visto em captulos anteriores, um procedimento que no retorna valores dentro de classes
chamado de mtodo, enquanto que funes sempre retornam valores.

Quando uma classe invocada pela primeira vez e o objeto baseado nessa classe criado, h um
cdigo especial que executado automaticamente dentro de todas as classes denominado
Construtor. O construtor permite a execuo de qualquer cdigo que se faa necessrio para
inicializar variveis, limpar estruturas, criar outros tipos de controles e tantos outros procedimentos,
assim o construtor o primeiro procedimento a ser executado pela classe.

O Construtor pode ou no receber parmetros assim como qualquer procedimento simples, para
codificar um construtor utilize a estrutura Sub New ( ) ... End Sub. Exemplo :

Imports Microsoft.Win32

Public Class MinhaClasse

91
Private localNome as string
Private localEndereo as string

Private Sub New ( )


localNome =
localEndereo =
Msgbox (Classe iniciada)
End Sub

Public Property Nome() As String


Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property

Public Sub ContarPalavras( ) as integer


Dim intTotal as Integer
If localNome = then
Msgbox(No h nome algum informado)
Else
intTotal = Len(localNome)
Msgbox( intTotal )
End if
End Sub

End Class

Como mostrado no exemplo acima, o construtor Sub New ( ) no tem nada de especial apenas limpa
os campos internos e exibe uma mensagem inicial. Observe que o construtor similar aos eventos
Initialize do VB 6.0.

Alm disso toda classe deve possuir um Destrutor que como o prprio nome indica usado para
criar um cdigo de limpeza geral. Diferentemente do Construtor, o Destrutor o ltimo cdigo a ser
executado na classe, geralmente no momento que a classe for destruda na memria.

Para criar um destrutor personalizado utilize a estrutura Protected Overrride Sub Finalize ( ) ...
End Sub informando sempre o nome do destrutor a ser criado. Exemplo :

Imports Microsoft.Win32

Public Class MinhaClasse

Private localNome as string


Private localEndereo as string

Private Sub New ( )


localNome =
localEndereo =
Msgbox (Classe iniciada)

92
End Sub

Public Property Nome() As String


Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property

Public Sub ContarPalavras( ) as integer


Dim intTotal as Integer
If localNome = then
Msgbox(No h nome algum informado)
Else
intTotal = Len(localNome)
Msgbox( intTotal )
End if
End Sub

Protected Overrides Sub FinalizarMinhaClasse()


Msgbox (Finalizando MinhaClasse)
MyBase.Finalize() ' padro criado pelo sistema.
End Sub

End Class

Observe ainda que a sintaxe para criar um destrutor deve obrigatoriamente incluir o comando
MyBase.Finalize( ) que atribudo automaticamente pelo sistema.

Tanto classes como mdulos Standard no VB .NET so referenciadas na memria e encapsulam


itens em sua implementao, mas so diferentes quanto a forma que so acessados. As classes so
instanciadas no cdigo e uma vez criadas cada cpia tem sua execuo prpria independente se
existe outra cpia em execuo. Enquanto que Mdulos Standard no so instanciados e dependem
unicamente da cpia em execuo.

Isto significa que se uma varivel de um Mdulo Standard alterado via cdigo na cpia em uso,
todos os outros cdigos que esto utilizando o mesmo Mdulo devero ter essa alterao em leituras
subseqentes. Ao passo que se um item de uma classe alterada para uma cpia, qualquer outra
cpia da classe no sofrer nenhum tipo de influncia, pois cada uma ter sua prpria execuo.

2.18.5.1 Vida til de um Objeto

A vida til de um Objeto comea quando o objeto criado com a palavra chave New. Alguns objetos
possuem tarefas de execuo inicial que so controlados pelo VB .NET atravs de um procedimento
chamado Construtor.

A vida til de um Objeto encerrando quando o objeto finalizado pelo cdigo de chamada e
liberado da memria pelo Common RunTime Language (CLR). O VB .NET controla a liberao dos
recursos do sistema atravs do procedimento chamado Destrutor.

93
Os procedimentos Sub New e Sub Finalize inicializam e finalizam os objetos substituindo os antigos
eventos Class_Initialize e Class_Finalize do VB 6.0. Toda vez que um objeto criado, o
procedimento dentro de Sub New invocado automaticamente pelo sistema antes de qualquer outro.
Alm disso se o desenvolvedor no cria o procedimento Sub New, o VB .NET por sua vez cria
automaticamente esse procedimento.

Antes de liberar um objeto da memria o CLR do VB .NET chama o mtodo Finalize (Destrutor)
automaticamente para os objetos que possuem este procedimento que pode, por exemplo salvar e
fechar arquivos necessrios.

H classes que utilizam recursos do Windows que no podem ser gerenciados pelo CLR do VB
.NET, como por exemplo os handles da API do Windows e conexes Banco de dados. Nessas
situaes a classe precisa implementar seu prprio Garbage Collection (Coletor de Lixo) utilizando
uma classe do VB .NET chamada interface IDisposable.

A interface IDisposable tem somente um mtodo chamado Dispose que pode liberar recursos do
sistema e fechar conexes a Banco de dados, entretanto o mtodo Dispose no invocado
automaticamente, necessrio que o Cliente (o desenvolvedor que estiver utilizando a classe) chame
o mtodo explicitamente quando finalizar a utilizao do objeto.

A plataform NET utiliza um sistema chamado de reference-tracing garbage collection (Coletor de


lixo por trilha e referncia) que periodicamente faz uma busca e liberao de recursos no mais
utilizados pelos objetos. Periodicamente o CLR (Common Language Run time) varre todo o sistema
e destri os objetos que no esto mais sendo utilizados, os recursos do sistema so liberados mais
rapidamente quando o computador tem recursos limitados.

H um atraso entre quando o objeto finalizado pelo cliente e quando o CLR libera-o da memria,
pois no h como saber quando este ltimo procedimento ser executado, portanto nesta situao um
objeto chamado de non-deterministic lifetime (tempo de vida indeterminado), assim o Destrutor
Finalize pode no ser executado imediatamente quando o objeto perde o escopo ( finalizado).

Outro aspecto interessante que o Garbage Collection do CLR no uitliza mais a palavra chave
Nothing para liberar recursos da memria, ao passo que outras verses do VB precisavam de
Nothing para liberar recursos imediatamente da memria. A palavra chave Nothing deve ser usado
no VB .NET somente quando os objetos tiverem uma vida til longa demais afetando o tempo que o
CLR ir liberar o objeto da memria.

2.18.5.2 Construtor e Destrutor

Construtores e Destrutores controlam a criao e a destruio de objetos.

possvel criar um construtor com um ou vrios parmetros da mesma forma que se cria parmetros
para procedimentos simples. Exemplo :

Sub New(ByVal sString As String)

Os construtores so frequentemente Overloaded (Sobrecarregados) conforme abaixo :

Sub New(Byval sString as String, iInt as Integer)

Quando se cria uma classe derivada de uma classe bsica necessrio incluir na primeira linha do
construtor da classe derivada uma chamada ao construtor da classe bsica se, e somente se o
construtor da classe bsica tiver parmetros. Por outro lado se o construtor da classe bsica no tiver

94
parmetros o Run Time do VB .NET chama-o automaticamente sem a interveno do
desenvolvedor-Cliente. Exemplo :

MyBase.New(sString) Precisa ser chamado pela classe derivada


MyBase.New No precisa ser chamado pela classe derivada

Observe que a palavra chave MyBase usada para fazer referncia a classe bsica.

Se um construtor possuir parmetros o cdigo de chamada deve passar os argumentos quando o


objeto for criado. Exemplo :

Dim objVarivel as new MinhaClasse(Rato, 4)

O exemplo abaixo mostra o uso de Disposal e Finalize :

Class ClasseBsica
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
' Cdigo qualquer para limpeza.
End Sub
End Class

Class ClasseDerivada
Inherits ClasseBsica
Implements IDisposable

Private handle As IntPtr ' Uma varivel de estrutura que faz referncia a um recurso qualquer
Private otherRes As OtherResource ' Outro recurso qualquer.
Private disposed As Boolean = False

Public Sub New()


handle = ' Recurso alocado por uma API do Windows.
otherRes = New OtherResource() ' Objeto que aloca outro Recurso.
End Sub

' Libera os recursos manualmente.


Private Sub LiberarRecursos()
If Not disposed Then
CloseHandle(handle)
disposed = True
End If
End Sub

' Libera os recursos manualmente, chamando Dispose e liberando a fila de finalizao.


Public Overrides Sub Dispose() Implements IDisposable.Dispose
LiberarRecursos()
otherRes.Dispose()
MyBase.Dispose() ' Se a classe bsica implementa Dispose, ento chama este mtodo.
A chamada ao mtodo SuppressFinalize da classe Garbage Collection (GC) necessrio
' para otimizao porque isto assegura que os recursos sero devidamente liberados
GC.SuppressFinalize(Me)
End Sub

95
Libera alguns recursos (exceto aqueles que ainda no foram liberados) e d
a chance da classe bsica finaliz-lo
Overloads Overrides Sub Finalize()
LiberarRecursos()
MyBase.Finalize()
End Sub

Sempre que utilizar Dispose necessrio verificar o estado de disposed para interceptar
uma exceo
Public Sub VerificaDispose()
If disposed Then
Throw ObjectDisposedException("ResWrapper")
End If
End Sub
End Class

No cdigo acima foi criada uma classe bsica que possui um mtodo Dispose que conforme
explicado anteriormente libera explicitamente os recursos do sistema que no so gerenciados pelo
CLR, como por exemplo APIs do Windows.

Em seguida foi implementada uma classe derivada da classe bsica que possui um construtor Sub
New que inicializa alguns objetos baseados em APIs (handles e etc). Quando a classe inicializada o
VB .NET chama o construtor Sub New da classe bsica automaticamente, mesmo que no tenha sido
implementado em cdigo.

Quando a classe derivada encerrada, o mtodo Dispose chama um procedimento qualquer


CloseHandle para liberar a varivel handle em seguida finaliza a varivel OtherRes. Observe que o
mtodo Dispose da classe bsica tambm chamado no caso de existir algum cdigo neste mtodo.

A classe Garbage Collection possui um mtodo chamado SupressFinalize que solicita ao sistema
no invocar o mtodo Finalize da classe derivada para permitir que a classe bsica possa finalizar a
operao.

Abaixo o exemplo mostra uma forma comum de usar o destrutor Dispose :

Dim con As Connection, rs As RecordSet


Try
con = New Connection("string de conexo qualquer")
rs = New RecordSet(con, "MinhaTabela")
' Cdigo para usar a conexo.
Finally
' Chame o mtodo Dispose quando finalizar o uso do objeto criado.
If Not con Is Nothing Then
con.Dispose()
End If
If Not rs Is Nothing Then
rs.Dispose()
End If
End Try

O fragmento de cdigo acima demonstra a abertura e fechamento de uma conexo de banco de dados
em ADO.

96
O exemplo abaixo demonstra o uso de um construtor e um destrutor :

Public Class ClasseBsica


Sub New()
MsgBox("Inicializando Sub New.")
End Sub

Protected Overrides Sub Finalize()


MsgBox("Destruindo classe com Sub Finalize.")
' Cdigo de limpeza geral.
MyBase.Finalize()
End Sub
End Class

Public Class ClasseDerivada


Inherits ClasseBsica
Implements IDisposable ' Implementa o mtodo Dispose da Interface IDisposable.
Private m_PropertyValue As Integer

Sub New(ByVal QualquerValor As Integer)


MyBase.New() ' Chama MyBase.New.
MsgBox("Sub New est inicializando a ClasseDerivada.")
' Qualquer Cdigo de inicializao.
m_PropertyValue = QualquerValor
End Sub

Property ThisProperty() As Integer


Get
ThisProperty = m_PropertyValue
End Get
Set(ByVal Value As Integer)
m_PropertyValue = Value
End Set
End Property

Sub FaaAlgumaCoisa()
' Cdigo que faz alguma coisa.
End Sub

Protected Overrides Sub Finalize()


MsgBox("Finalizando e destruindo ClasseDerivada.")
' Cdigo de limpeza aqui.
MyBase.Finalize()
End Sub

Overridable Sub Dispose() Implements IDisposable.Dispose


MsgBox("A ClasseDerivada est executando o mtodo Dispose")
End Sub
End Class

Sub TesteConstrutoresEDestrutores()
Dim X As Integer = 6
Dim AnObject As New ClasseDerivada(X)

97
' Cdigo qualquer que usa o objeto
AnObject.FaaAlgumaCoisa()
' Testa o construtor parametrizado.
MsgBox("O valor de ThisProperty aps ser inicializado" & _
" pelo construtor " & AnObject.ThisProperty)
' Executa o mtodo Dispose quando o objeto no for mais utilizado
AnObject.Dispose()
End Sub

2.18.6 Propriedades, Campos e Mtodos de uma Classe

As propriedades e Campos armazenam informaes do objeto em execuo. Os Campos so


variveis pblicas que a classe expes enquanto que as propriedades possuem cdigos que controlam
como os dados sero atribudos ou retornados ao cliente.

Para criar um campo na classe simplesmente declare uma varivel com o modificador de acesso
Public, exemplo :

Class ThisClass
Public ThisField As String
End Class

Observe porm que os Campos no oferecem o nvel de segurana e controle das propriedades.

1 - Regras para criar propriedades

Para criar uma propriedade na classe necessrio obedecer as regras abaixo :

1. Use sempre variveis locais para armazenar os valores das propriedades, pois as propriedades
em si no conseguem alocar os valores por si prprio. Alm disso as variveis locais
protegem os valores das propriedades de qualquer modificao direta. Declare as variveis
locais sempre com Private.
2. Utilize os modificadores Public ou Shared junto com a palavra chave Property para iniciar
o bloco de propriedades.
3. Dentro do bloco, utilize a palavra chave Get para retornar o valor da propriedade e a palavra
chave Set para atribui um novo valor a propriedade. Set sempre recebe um parmetro
normalmente chamado de Value.
4. Sempre finalize as propriedades com End Get e End Set.
5. Termine o bloco com End Property.

Class MinhaClasse
Private m_PropVal As String
Public Property Um() As String
Get
Return m_PropVal ' Retorna o valor da varivel local.
' pode-se usar tambm a sintaxe Um = PropVal para retornar o valor a propriedade
End Get
Set(ByVal Value As String)
m_PropVal = Value ' Armazena o valor em uma varivel local.
End Set
End Property
End Class
98
A tcnica geral sempre fazer uma instncia da classe e atribuir um valor propriedade, no caso
acima Um, em seguida a classe recebe o valor no argumento e atribui esse valor a varivel local que
armazenar o valor at que a classse seja finalizada.

2 Propriedades somente-leitura

Para criar propriedades somente-leitura no utilize a palavra chave Set. Para criar propriedades
somente-gravao no utilize a palavra chave Get. Exemplo :

Class MinhaClasse
Private m_PropVal As String
ReadOnly Public Property Um() As String
Get
Return m_PropVal ' Retorna o valor da varivel local.
' pode-se usar tambm a sintaxe Um = PropVal para retornar o valor a propriedade
End Get
End Property
End Class

No exemplo acima a classe bsica possui uma propriedade chamada UM que somente leitura pois
no existe a palavra chave Set, alm disso preciso criar um cdigo que inicialize o valor da
propriedade Um antes de retorn-la.

Os mtodos de uma classe so todos os procedimentos Sub ou Function declarados dentro dessa
classe. Como j foi visto Funes retornam valores mesmo dentro de classes enquanto que
procedimento Sub no retornam valores.

Utilize explicitamente os modificadores de restrio ReadOnly e WriteOnly na implementao


das propriedades. O comando ReadOnly no permite que seja utilizado o comando Set na criao da
propriedade e aumenta a velocidade do processamento dos comandos. WriteOnly no permite que o
comando Get seja utilizado na criao da propriedade.

3 Protegendo os mtodos de uma classe

Os mtodos da classe devem ser construdos utilizando os modificadores de acesso assim como se
faz com um procedimento normal. Exemplo :

Class MinhaClasse
Public Sub MensagemDeBomDia ( )
Dim Mensagem as string
Mensagem = Ol, Tenha um bom dia
Msgbox (Mensagem)
End Sub

Public Function Adicionar1 (byVal intNmero as integer) as Integer


Dim intResultado as Integer
intResultado = intNmero + 1
Return intResultado
End Class

No exemplo acima o mtodo MensagemDeBomDia exibe apenas uma caixa de mensagem. E a


funo Adicionar1 retorna o nmero do parmetro adicionado 1. Observe ainda que se os mtodos

99
(Sub e Function) fossem declarados como o modificador de acesso Private, ento o cdigo s estaria
disponvel para a chamada interna da classe, isto somente o cdigo da prpria classe poderia
utilizar os procedimentos.

Essa tcnica faz parte do encapsulamento e protege a implementao da classe de acessos externos.
Assim somente o criador da classe saber que essas funes ou Sub existem e sero utilizadas
somente dentro da prpria classe.

4 Membros Shared

Os membros Shared (ocultados) podem ser invocados sem criar uma instncia da classe. Exemplo :

Class MinhaClasse
Shared Sub MensagemDeBomDia ( )
Dim Mensagem as string
Mensagem = Ol, Tenha um bom dia
Msgbox (Mensagem)
End Sub
End Class

Sub Teste( )
Dim MinhaVarivel as MinhaClasse No precisa utilizar a palavra chave New
MinhaVarivel.MensagemDeBomDia( )
End Sub

No exemplo acima a classe MinhaClasse possui um procedimento Shared que pode ser invocado sem
utilizar a palavra chave New que cria uma instncia da classe.

Os membros Shared so teis quando o desenvolvedor deseja que um mtodo (Sub ou Funo) no
esteja associada com uma instncia da classe, isto o mtodo esteja disponvel mesmo sem o uso de
New.

5 Diferenas entre propriedades e mtodos

As propriedades e mtodos so similares na sua construo porque podem receber parmetros.


Entretanto as propriedades podem receber parmetros e atribuies com o sinal de atribuio,
enquanto que os mtodos no podem receber novos valores com o sinal de atribuio, somente
atravs do argumento do parmetro:

MinhaClasse.Propriedade1(ndice) = 4 Recebe o novo valor 4 com o sinal de atribuio =


MinhaClasse.Mtodo1(NovoNmero) Somente recebe um novo valor no argumento NovoNmero

No exemplo acima no possvel atribuir um novo valor para o Mtodo1 sem que seja atravs do
argumento NovoNmero.

6 Propriedades Default (Padro)

As propriedades padres oferecem um meio de compactar o cdigo omitindo o nome de uma


propriedade na criao do cdigo. O VB .NET utiliza um valor default quando o desenvolvedor no
especifica uma valor para a propriedade. Exemplo :

TextBox = A propriedade Default de uma caixa de texto Text

100
No exemplo acima, foi utilizada a propriedade Default Text de uma caixa de texto simples, assim o
desenvolvedor no precisa nomear a propriedade como por exemplo TextBox.Text = Ol.

Regras para criar propriedades Default :

Para criar uma propriedade Default utilize a palavra chave Default antes de definir a
propriedade.
Toda classe s pode ter uma propriedade padro
Uma propriedade Default (Padro) no pode ser Shared ou Private.
Se uma propriedade Default overloaded, todas as propriedades resultantes com o mesmo
nome sero Default
As propriedades Default devem aceitar pelo menos um argumento.

Exemplo :

Class Class2
' Define a varivel local para armazenar o valor da propriedade
Private PropertyValues As String()
' Define a propriedade padro.
Default Public Property Propriedade1(ByVal Index As Integer) As String
Get
Return PropertyValues(Index)
End Get
Set(ByVal Value As String)
If PropertyValues Is Nothing Then
' A matriz contm Nothing que acessada pela primeira vez.
ReDim PropertyValues(0)
Else
' Redimensiona a matriz para armazenar os novos valores
ReDim Preserve PropertyValues(UBound(PropertyValues) + 1)
End If
' Value uma varivel implcita declarada pelo VB .Net que contm o valor
da atribuio
PropertyValues(Index) = Value
End Set
End Property
End Class

O exemplo acima cria uma classe que possui uma propriedade Default que uma matriz de
elementos strings, a cada atribuio a matriz redimensionada automaticamente.

Para acessar uma propriedade padro basta abreviar o cdigo escrito. Exemplo :

Dim C As New Class2()


' As duas linhas abaixo acessar a propriedade da classe da forma convencional.
C.Prop1(0) = "Valor um" Atribuio da propriedade.
MessageBox.Show(C.Prop1(0)) ' Retorno da propriedade.

' As duas linhas abaixo acessam uma propriedade Default.


C(1) = "Valor dois" ' Atribuio da propriedade.
MessageBox.Show(C(1)) ' Retorno da propriedade.

7 Propriedade e mtodos Overloaded (Sobrecarregados)


101
A Sobrecarga (Overloaded) uma tcnica que permite criar mais de um procedimento, mtodo ou
construtor com o mesmo nome mas com argumentos diferentes. Exemplo :

Overloads Sub Display(ByVal theChar As Char)


' Cdigo que exibe dados Char
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Cdigo que exibe dados Integer
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Cdigo que exibe dados Double
End Sub

Observe que sem Overloaded seria preciso criar nomes diferentes para cada procedimento que faa a
mesma coisa.

Regras para Overloading (Sobrecarga) :

No possvel utilizar Overloaded modificando somente os modificadores ByVal ou ByRef.


No possvel utilizar Overloaded mudando somente o nome dos parmetros.
No possvel utilizar Overloaded mudando somente o tipo de dados de retorno do mtodo.

A palavra chave Overloaded opcional, entretanto uma vez usada todos os outros membros tambm
devero usar explicitamente Overloaded.

Quando uma classe derivada utiliza overloaded de um membro herdado de uma classe bsica, isto
sobrecarrega um mtodo ou propriedade de uma classe bsica, esse mtodo ou propriedade criado
ser usado ao invs do mtodo da classe bsica. Esse processo conhecido como Shadowing por
nome e Assinatura (ocultao).

Observe com ateno que quando a palavra chave Overloaded usado em processo Shadowing por
Nome e Assinatura o membro overloaded implementado na classe derivada substitui o membro
implementado na classe bsica, entretanto os outros membros overloaded na classe bsica estaro
disponveis para a instncia da classe derivada.

Ao passo que se a palavra chave Overloade for omitida em um processo Shadowing ento o membro
overloaded implementado na classe derivada ainda substitui o membro implementado na classe
bsica, s que os outros membros overloaded da classe bsica no estaro disponveis para a
instncia da classe derivada.

8 Propriedades e mtodos Overriding (substituio)

As classes derivadas herdam todos os mtodos e propriedades de uma classe bsica, entretanto h
casos em que os membros de uma classe bsica precisam ser modificados completamente para o uso
de uma classe derivada.

O overriding (substituio) permite criar uma nova implementao de mtodos e propriedades para
serem usados na classe derivada.

Regras para criao de Overriding :

Utilize a palavra chave Overrides para definir uma nova implementao.


102
Somente possvel criar Overrides (substituio) para membros que j estejam marcados
com a palavra chave Overridable na classe bsica.
Os membros overridden (substitudos) devem ter os mesmos parmetros da classe bsica.
O membro overriden (substitudo) pode chamar a implementao original da classe bsica
utilizando a palavra chave Mybase antes do nome do mtodo.

Exemplo :

Const Bonus As Decimal = 1.45


Const Taxa As Decimal = 14.75

Class Pagamento
Overridable Function PagarEmpregados(ByVal HorasTrabalhadas As Decimal, _
ByVal Taxa As Decimal) As Decimal
PagarEmpregados = HorasTrabalhadas * Taxa
End Function
End Class

Class BonusPagamento
Inherits Pagamento
Overrides Function PagarEmpregados(ByVal HorasTrabalhadas As Decimal, _
ByVal Taxa As Decimal) As Decimal
' A linha seguinte chama o mtodo original da classe bsica e modifica o valor retornado
PagarEmpregados = MyBase.PagarEmpregados(HorasTrabalhadas, Taxa) * Bonus
End Function
End Class

Sub ExecutarPagamento()
Dim PagamentoItem As Pagamento = New Pagamento()
Dim BonusPagamentoItem As New BonusPagamento()
Dim HorasTrabalhadas As Decimal = 40

MessageBox.Show("Pagamento normal : " & _


PagamentoItem.PagarEmpregados(HorasTrabalhadas, Taxa))
MessageBox.Show("Pagamento com bnus : " & _
BonusPagamentoItem.PagarEmpregados(HorasTrabalhadas, Taxa))
End Sub

O exemplo acima define uma classe bsica Pagamento e uma classe derivada BonusPagamento que
substitui um mtodo da classe bsica PagarEmpregados. Em seguida foi criado um procedimento que
testa as duas classes fazendo uma referncias classe bsica e a classe derivada.

Concluindo, overrides substitui os membros de uma classe bsica alterando a forma com que o
procedimento executa uma tarefa. Ao passo que overloaded sobrecarrega os membros de uma
classe bsica modificando os parmetros do membro.

2.18.7 Eventos e Delegar

Os eventos so sinais que um aplicativo enviam quando algo importante acontece. Para declarar
eventos dentro de classes, propriedades, mdulos e interfaces utilize a palavra chave Event.
Exemplo:

103
Event AnEvent(ByVal EventNumber As Integer)

Um evento envia uma mensagem para o sistema, o ato de enviar uma mensagem chamado de
raising (disparando) eventos. Utilize o comando RaiseEvent para disparar um evento :

RaiseEvent AnEvent(EventNumber)

Os eventos devem ser disparados no escopo onde foram declarados, isto dentro de um
procedimento; dentro de uma funo; dentro de uma propriedade, etc, e nunca podero ser
disparados em outro lugar diferente.

Qualquer objeto capaz de disparar um evento chamado de Event Sender (Emissor de eventos) ou
Event Source (Fonte de eventos), as janelas, controles e objetos criados pelo usurio so exemplos
de Emissores de Eventos.

Os Event Handler (Manipuladores de Eventos) so procedimentos que so chamados quando um


evento correspondente ocorre, normalmente a sintaxe de um manipulador de evento
NomeDoControle + Underscoree + NomeManipuladorEvento. No possvel utilizar uma funo
como manipulador de evento, pois um manipulador de evento no pode retornar um valor. Por
exemplo:

Button1_Click Forma correta de criar um manipulador de evento

Para que um manipulador de evento se torne til preciso associar esse manipulador com o prprio
evento utilizando os comandos Handles ou AddHandler. As palavras chaves WithEvents e
Handles so as formas tradicionais para criar eventos em classes.

1 Adicionando eventos a uma classe

Para adicionar eventos a uma classe utilize o comando Event seguido pelo nome do evento e seus
parmetros. Exemplo:

Public Event PorcentagemAlcanada(ByVal Porcentagem As Single, ByRef Cancelar As Boolean)

Os eventos no podem retornar valores; no podem possuir parmetros opcionais e no podem


possuir argumentos ParamArray.

No momento em que se cria um evento para a classe, o objeto dessa classe, agora pode disparar um
evento especfico. Para que um evento possa realmente ocorrer preciso utilizar o comando
RaiseEvent, alm disso as palavras chaves Handles e AddHandler associam este evento a um
manipulador de eventos. Uma classe derivada no pode disparar eventos de uma classe bsica.

2 Criando manipuladores de eventos (Event Handlers)

Quando se cria um evento em uma classe necessrio associ-lo a um manipulador de evento. A


forma tradicional de criar um manipulador de eventos utilizar os comandos Handles e
WithEvents.

A palavra chave WithEvents permite criar variveis da classe ou de objetos de mdulo que podem
ser usados com a clsula Handles para manipular Eventos, seguindo estes passos :

1. Criar uma varivel a nvel de mdulo de um formulrio :

104
2. Escolher o nome dessa varivel na lista de objetos na janela Editor de cdigos do Visual
Studio .NET.
3. Escolher o evento da lista de eventos criados na janela do Editor de cdigos do Visual Studio
.NET.
4. Adicionar um cdigo para esse manipulador de evento.

cria uma classe fora do mdulo do formulrio


Public Class Classe1
Public Event Iniciar(ByVal Nmero As Integer)
Public Sub Somar()
RaiseEvent Iniciar(1)
End Sub
End Class

cdigo dentro do formulrio


Public Class Form1
Inherits System.Windows.Forms.Form

cdigo gerado automaticamente pelo Vb .NET


#Region " Windows Form Designer generated code "

Declara a varivel com WithEvents que vai ser o objeto com o manipulador de eventos
Public WithEvents var As Classe1

Um evento Clique de um boto qualquer que utiliza a nova classe


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click

var = New Classe1()

var.Somar()
End Sub

Manipulador de evento com um cdigo de exemplo


Private Sub var_Iniciar(ByVal Nmero As Integer) Handles var.Iniciar
MsgBox("Evento disparado com o nr : " & Nmero)
End Sub
End Class

No exemplo acima, observe que o VB .NET cria automaticamente o manipulador de evento para a
varivel var, alm disso adiciona automaticamente Handles que vai associar o evento Iniciar com a
varivel var.

Portanto WithEvents permite criar uma varivel da classe que atuar como o objeto que possui os
eventos, isto a fonte de dados.

O comando AddHandler permite criar dinamicamente eventos que se conectam a manipuladores de


eventos em tempo de execuo (Run time). Portanto no preciso criar variveis com WithEvents.

Para criar eventos dinamicamente conectados a manipuladores de eventos basta seguir os passos
seguintes :

1. Criar uma varivel do tipo da classe desejada, podendo ser uma varivel local.

105
2. Usar o comando AddHandler para informar o nome do emissor do evento (event sender)
junto com o operador AddressOf que informa o nome do manipulador de evento desejado.
Qualquer procedimento pode ser um manipulador de evento, desde que tenha os parmetros
necessrios.
3. Adicionar o cdigo para o manipulador de evento.

Public Class Classe1


Public Event Iniciar(ByVal Nmero As Integer)
Public Sub Somar()
RaiseEvent Iniciar(1)
End Sub
End Class

Public Class Form1


Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim var As Classe1
var = New Classe1()
AddHandler var.Iniciar, AddressOf varIniciar_Evento
var.Somar()
End Sub

Private Sub varIniciar_Evento(ByVal Nmero As Integer)


MsgBox("Evento disparado com o nr : " & Nmero)
End Sub
End Class

O exemplo acima reutiliza a classe do exemplo anterior mas cria uma varivel local que vai atuar
como o objeto emissor de eventos. Alm disso utiliza um ponteiro para um manipulador de eventos
personalizado varIniciar_Evento que no foi criado automaticamente pelo VB .NET.

O comando RemoveHandler desconecta dinamicamente um evento de um manipulador de evento


em tempo de execuo (Run Time), para isso necessrio seguir os passos abaixo :

1. Utilizar o comando RemoveHandler junto com o nome do emissor de eventos alm do


operador AddressOf informando o nome do manipulador de eventos a ser desconectado.
Observe que a sintaxe aps RemoveHandler deve ser completamente igual a AddHandler.

RemoveHandler var.Iniciar, AddressOf varIniciar_Evento

No exemplo acima reutiliza os exemplos anteriores e desconecta a varivel emissor de eventos var
do manipulador de eventos varIniciar_Evento.

As classes derivadas podem manipular eventos disparados pela classe bsica utilizando os comandos
Handles MyBase. Siga os passos a seguir para completar essa operao :

1. Declarar um manipulador de eventos na classe derivada utilizando os comandos Handles


MyBase <Nome do evento> na mesma linha do manipulador de evento a ser criado.

106
Public Class Classe1
Public Event SE(ByVal i As Integer)
' colocar mtodos e propriedade aqui.
End Class

Public Class Classe2


Inherits Class1
Sub EventHandler(ByVal x As Integer) Handles MyBase.SE
' Cdigo que manipula os eventos da Classe Bsica.
End Sub
End Class

3 Os comandos WithEvents e Handles

Os dois comandos acima so usados em pares para declarar um evento e especificar um manipulador
de eventos. As variveis declaradas com WithEvents disparam eventos que podem ser manipulados
por qualquer procedimento informado na clusula Handles. Assim possvel criar um manipulador
nico para diversos eventos. Exemplo :

Dim WithEvents EClass As New EventClass() ' Declara uma varivel com WithEvents
Sub TestEvents()
EClass.DisparaEventos()
End Sub
' Declara um manipulador de eventos que manipula diversos eventos ao mesmo tempo.
Sub EClass_EventHandler() Handles Eclass.XEvent, Eclass.YEvent
MsgBox("Evento recebido.")
End Sub

Class EventClass
Public Event XEvent()
Public Event YEvent()
Sub DisparaEventos() 'Dispara dois eventos manipulados por EClass_EventHandler.
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class

O exemplo acima cria uma classe EventClass que possui dois eventos XEvent e YEvent, alm de um
mtodo DisparaEventos que dispara os dois eventos simultaneamente. Em seguida foi criado um
cdigo para o manipulador de evento para os dois eventos simultneos.

Os comandos WithEvents e Handles a melhor opo para declarar eventos. Entretanto possui
algumas limitaes :

No se pode declarar variveis genricas com WithEvents, obrigatrio especificar o nome


da classe que possui eventos.
No se pode criar matrizes de variveis com WithEvents.
No possvel associar mltiplos eventos para um simples evento

4 Os comandos AddHandler e RemoveHandler

Os comandos AddHandler e RemoveHandler so mais flexveis que os comandos WithEvents e


Handler pois permitem criar, adicionar, remover dinamicamente manipuladores de eventos com os
107
prprios eventos. Alm disso AddHandler permite associar mltiplos eventos para um simples
evento.

O comando AddHandler possui dois parmetros : o primeiro informa o nome do evento junto com o
emissor do evento e o segundo o operador AddressOf que delega o controle para um procedimento
especfico.

AddHandler conecta o evento de um emissor de eventos para um procedimento personalizado,


enquanto que RemoveHandler desconecta o evento de um emissor de eventos desse procedimento
personalizado. Exemplo :

AddHandler MeuObjeto.Evento1, AddressOf Me.MeuManipuladorEventos


RemoveHandler MeuObjeto.Evento1, AddressOf Me.MeuManipuladorEventos

5 Delegar (Delegates) e o operador AddressOf

Delegar um recurso que permite que objetos possam ser usados para chamar os mtodos de outros
objetos. O mtodo delegar tambm conhecido como Ponteiro de funes de segurana (type-safe
function pointers) que so similares aos ponteiros de funes de linguagens como C++.

O VB .NET utiliza delegate ao invs de ponteiros de funes que so tipos referncia da Classe
System.Delegates, que podem fazer referncias tanto a mtodos Shared ( que no precisam de
instncias de classes) quanto a mtodos padres ( que precisam de intncias de classes ).

Delegar til principalmente em eventos, pois um objeto que dispara eventos pode chamar diversos
manipuladores para cada situao diferente. O comando AddHandler cria um processo Delegar que
chama o manipulador de evento apropriado e O VB .NET cuida de todos os detalhes deste processo.

Outro comando que executa um processo delegar o comando Event que implicitamente cria um
processo delegate, alm disso o operador AddressOf cria uma instncia (cpia) de um processo
Delegate.

possvel criar os prprios processos Delegate personalizados. Para declarar eventos que utilizam
um tipo de Delegates existente basta utilizar a sintaxe abaixo :

Event EventoQualquer As TipoDelegate

Para criar delegates com outras tarefas especficas, declare procedimentos com o Comando Delegate.
Toda classe que foi delegada possui o mtodo Invoke que utilizado para acionar o mtodo
delegado.

Delegate Sub MeuProcedimento(ByVal ArgumentoQualquer as integer)

De forma resumida, Delegates significa transferir o controle de um procedimento para outros


procedimentos desde que tenham os argumentos necessrios. Assim tanto AddHandler, AddressOf e
Event transferem o controle de um procedimento, no caso o evento, para outro procedimento, no
caso um manipulador de evento. Exemplo :

Delegate Sub Contar(ByVal AtQuanto As Integer)


Public Class Classe1
Public Sub Contar1(ByVal QuantasVezes As Integer)
MsgBox("Este mtodo sabe contar at " & QuantasVezes)
End Sub

108
End Class

Public Class classe2


Public Sub Contar2(ByVal NmeroMximo As Integer)
MsgBox("Esta classe possui um mtodo que conta no mximo at " & NmeroMximo)
End Sub
End Class

Public Class Classe3


Public Sub Contar3(ByVal intMximo As Integer)
MsgBox("O mtodo da classe3 conta at " & intMximo)
End Sub
End Class

Public Class Form1


Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim meuDelegate As Contar
Dim c1 As New Classe1()
Dim c2 As New classe2()
Dim c3 As New Classe3()
'primeiro teste
meuDelegate = AddressOf c1.Contar1
meuDelegate.Invoke(4)
'segundo teste
meuDelegate = AddressOf c2.Contar2
meuDelegate.Invoke(4)
'terceiro teste
meuDelegate = AddressOf c3.Contar3
meuDelegate.Invoke(4)
End Sub

End Class

O exemplo acima ilustra demonstra o uso de Delegate e AddressOf. De acordo com as definies
acima Delegate utiliza um objeto simples para acessar os mtodos e membros de outros objetos,
assim o objeto Contar foi utilizado como base para acessar os mtodos das classes 1, 2 e 3.

Ainda de acordo com as definies anteriores, o operador AddressOf transfere o controle de um


procedimento para outro, desta forma o objeto meuDelegate uma instncia do objeto Contar,
em seguida foi atribudo a referncia de vrios outros procedimentos definidos pelo operador
AddressOf.

O cdigo acima testa a melhor forma de exibir uma informao para o usurio, primeiro foi testado o
mtodo Contar1 que exibe um tipo de informao. Em seguida foi testado o mtodo Contar2 que
exibe a mesma informao, mas com um texto diferenciado, e por ltimo Contar3 exibe a ltima
informao mais diferenciada ainda.

109
Resumindo, Delegate permitiu no caso acima, escolher a melhor forma de exibio de texto para o
usurio, mas claro que o cdigo acima foi utilizado somente para ilustrao.

2.18.8 Interfaces no VB .NET

Interfaces um novo recurso do VB .NET que permite definir propriedades, mtodos e eventos sem
implementao, isto sem criar os cdigos de cada membro. As interfaces definem somente o tipo
de membro que uma classe ir implementar por exemplo, Sub, Event, Function e Property.

Depois de definida uma interface, uma classe deve implementar livremente cada aspecto dessa
interface exatamente como ela foi definida. possvel adicionar novos recursos a qualquer momento
criando novas interfaces e novas implementaes para essas classes.

No VB .NET as interfaces so criadas diretamente com o comando Interface e so implementadas


com o comando Implements. A Interface definida usando os comandos Interface ... End
Interface, alm disso possvel utilizar o comando Inherits que lista interfaces herdadas.

As interfaces no podem possuir nenhum comando ou cdigo de implementao dentro da sua


definio, tais como Sub ... End Sub, Function ...End Function, Property.... End Property. Todas as
interfaces so Pblicas (Public) por default, mas podem ser declaradas explicitamente com Protected,
Public, Private, Friend.

Para definir uma interface, basta utilizar a estrutura de comandos Interface ... End Interface
declarando um nome para essa interface, em seguida defina as propriedades, mtodos e eventos
concernentes a essa interface. Exemplo :

Public Interface MinhaInterface


Property MinhaPropriedade(ByVal MinhaString As String)
Function MinhaFuno(ByVal MeuInteiro As Integer) As Integer
End Interface

No exemplo acima o cdigo define uma interface chamada MinhaInterface em seguida define uma
propriedade chamada MinhaPropriedade que dever ser implementada somente com os comandos
Property ... End Property. E finalmente a interface define uma funo chamada MinhaFuno
que dever ser implementada com os comandos Function ... End Function.

A palavra chave Implements usada para implementar um membro de uma interface especfica. O
comando necessita de uma lista de membros da interface separadas por ponto, para localizar o
membro especfico da interface. Exemplo :

Function MinhaFuno (ByVal MeuInteiro as Integer ) as Integer Implements


MinhaInterface.MinhaFuno

possvel criar implementaes de interfaces utilizando os modificadores de acesso Public, Private,


Protected, Friend, Protected Friend, Overrides, Overloads, Overridable, MustOverride, Default e
Static. O comando Shared no permitido neste contexto.

Alm disso o comando Implements pode ser usado para criar uma implementao para mltiplos
mtodos de uma interface, bastando separar as interfaces com vrgura. Exemplo :

Sub Sub1 Implements Interface1. Sub1, Interface1.Sub2, Interface2.Sub3, Interface2.Sub4

110
Exemplo de criao e implementao de interfaces :

Interface Interface1
Sub sub1(ByVal i As Integer)
End Interface

Interface Interface2
Inherits Interface1 'Herda a definio da interface1.
Sub M1(ByVal y As Integer)
ReadOnly Property Num() As Integer
End Interface

Public Class ClasseImplementao1


Implements Interface1
Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
MsgBox("O procedimento Sub1 da interface1 foi implementado na classe1")
End Sub
End Class

Public Class ClasseImplementao2


Implements Interface2
Dim INum As Integer = 0
Sub sub1(ByVal i As Integer) Implements Interface2.sub1
MsgBox("O procedimento Sub1 da interface2 foi implementado na classe2")
End Sub
Sub M1(ByVal x As Integer) Implements Interface2.M1
INum = x
End Sub

ReadOnly Property Num() As Integer Implements Interface2.Num


Get
Num = INum
End Get
End Property
End Class

Public Class Form1


Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim m As New ClasseImplementao1()
Dim n As New ClasseImplementao2()
m.Sub1(1)
n.sub1(1)
n.M1(4)
MsgBox(n.Num)
End Sub
End Class

111
No exemplo acima foram criadas duas interfaces 1 e 2 com mtodos Sub1 e M1 alm de uma
propriedade somente leitura Num. A implementao das interfaces foram feitas nas classes
ClasseImplementao1 e ClasseImplementao2, cada qual com uma mensagem diferente ao
usurio.

Observe que a Interface2 herda a definio da Interface1, mas a implementao da Interface1 e


Interface2 so independentes.

1 Quando usar Interfaces ?

Interfaces uma poderosa ferramenta de programao que permite separar a definio de um objeto
da implementao desse objeto. Assim esse recurso permite que a implementao seja feita
livremente por outras classes independentes entre si.

Interfaces so mais flexveis do que herdar classes diretamente. A herana de classes possui um
problema, pois se a classe bsica possui erros na implementao, as classes derivadas tambm a
tero.

Assim quando a correo do erro feito na classe bsica as outras classes derivadas podem no
funcionar corretamente, pois os mtodos sobrecarregados (overloads) e substitudos (Overrides)
podem no ser compilados adequadamente.

A inteface resolve grande parte desses problemas publicando novas interfaces atualizadas. Alm
disso as interfaces so mais flexveis que herdar classes porque permitem criar cdigos livres para
cada interface.

Use interfaces quando :

Quando o aplicativo a ser construdo no possua relacionamento entre objetos, mas que
possuam algumas funcionalidades semelhantes.
Quando houver necessidade de meios mais flexveis de programao do que os encontrados
entre classes bsica e classes derivadas, isto herana entre classes.
Quando no necessrio herdar implementaes de classes bsicas, isto herana entre
classes.
Quando utilizar estruturas que no podem ser herdadas mas podem possuir interface.

2.18.9 Herana (Inherits)

Herana um recurso do VB .NET que permite criar classes baseadas em outras classes j existentes.
A classe que serve de base chamada de classe bsica e a classe resultante denominada classe
derivada.

A classe derivada herda todas as propriedades, mtodos e eventos no privativos da classe bsica,
podendo inclusive extender suas implementaes. Alm disso as classes derivadas podem substituir,
e sobrecarregar qualquer membro da classe bsica.

Todas as classes do VB .NET so herdveis por default. Para criar um classe derivada de outra classe
deve-se seguir as regras abaixo :

Todas as classes so herdveis exceto aquelas marcadas pela palavra chave NotInheritable.

112
As classes derivadas podem ser criadas herdando somente uma classe bsica por vez. Assim
no possvel fazer uma herana de mltiplas classes, entretanto mltiplas classes que
implementam interfaces podem facilmente suprir essa limitao.
Os modificadores de acesso dos itens da classe derivada devem ser igual ou mais restritivas
que os modificadores de acesso dos itens da classe bsica. Isto significa que se uma classe
bsica for declarada como Friend, a classe derivada no pode expor a classe bsica mesmo
que a classe derivada for declarada como Public. Assim a classe derivada deveria ser
declarada como Friend ou outro modificador de acesso mais restritivo.
Para criar uma herana sempre inclua o comando Inherits.

Os modificadores de herana utilizados pelo VB .NET so :

1. Comando Inherits Especifica a classe bsica.


2. Modificador NotInheritable No permite que os programadores criem classes derivadas
dessa classe.
3. Modificador MustInherit - Especifica que a classe somente dever ser usado como classe
bsica. No possvel criar instncias desse tipo de classe diretamente.

Uma classe derivada pode modificar o comportamento dos mtodos da classe bsica substituindo a
implementao dos seus membros utilizando Overridden.Os modificadores abaixo controlam a
tcnica do Overridden :

Overridable Permite que um mtodo ou propriedade de uma classe bsica possa ser
substituda (overridden) pela classe derivada.
Overrides Substitui um mtodo ou propriedade Overridable de uma classe bsica.
NotOverridable Evita que mtodos e propriedades sejam substitudas (overriden) na classe
derivada. Todos os mtodos e propriedades pblicas so NotOverridable por default.
MustOverride Obriga que a classe derivada substitua (overrides) os mtodos e
propriedades da classe bsica. O modificador MustOverride deve ser usado em todas as
classes declaradas com MustInherit.

possvel chamar os mtodos de uma classe bsica mesmo que esteja sendo substitudo na classe
derivada utilizando o comando MyBase. Exemplo :

Class ClasseDerivada
Inherits ClasseBsica
Public Overrides Function Calcular(ByVal Distncia As Double, ByVal Tempo As Double) As
Double
' Chama o mtodo da classe bsica e modifica o valor retornado.
Return MyBase.Calcular (Distncia, Tempo) * 2
End Function
End Class

O comando MyBase tem as seguintes limitaes :

MyBase refere-se somente a classe bsica, no possvel acessar membros privates da classe.
MyBase um comando e no um objeto, portanto no pode ser atribudo a variveis nem ser
utilizado em comparaes.
MyBase pode se referir a classes bsicas imediatas ou classes herdadas indiretamente.
MyBase no pode invocar mtodos MustOverride de classes bsicas.
MyBase no pode ser usado como auto-qualificador. Por exemplo
MyBase.MyBase.BtnOK_Click() ' Erro.

113
MyBase no pode ser usado em mdulos e no pode acessar membros Friend de classes
bsicas de outros Assemblies.

O comando MyClass permite chamar um mtodo Overridable implementado na classe ao invs do


mtodo susbstitudo na classe derivada. Esse comando similar ao comando Me que faz referncia a
um objeto corrente.

MyClass um comando e no um objeto.


MyClass faz referncia a classe e seus membros herdados.
MyClass pode ser usado com membros Shared.
MyClass no pode ser usado em mdulos.
MyClass pode qualificar um mtodo da classe bsica que ainda no foi implementado na
classe corrente.

MyClass chama um mtodo original da classe corrente mesmo que tenha sido susbstitudo por outra
implementao, como se os mtodos fossem declarados como NotOverridable. Exemplo :

Class ClasseBsica
Public Overridable Sub MeuMtodo()
MsgBox("Classe Bsica")
End Sub
Public Sub UseMe()
Me.MeuMtodo() 'Usa a verso da classe chamada mesmo se for substituda (override)
End Sub
Public Sub UseMyClass()
MyClass.MeuMtodo() ' Usa esta verso do mtodo e no a substituda (override)
End Sub
End Class
Class ClasseDerivada : Inherits ClasseBsica
Public Overrides Sub MeuMtodo()
MsgBox("Classe Derivada")
End Sub
End Class
Class TestarClasses
Sub Iniciar()
Dim TestObj As ClasseDerivada = New ClasseDerivada()
TestObj.UseMe() ' Exibe "Classe Derivada".
TestObj.UseMyClass() ' Exibe "Classe Bsica".
End Sub
End Class

O exemplo acima demonstra a diferena de comportamento entre os comandos Me e MyClass.


Primeiro foi criada uma classe bsica ClasseBsica que possui trs mtodos MeuMtodo,
UseMe e UseMyClass sendo que somente o primeiro mtodo substituvel, os outros mtodos
utilizam o comando Me e MyClass para ser referir ao mtodo corrente em uso.

Em seguida a classe derivada ClasseDerivada substitui (Overrides) o mtodo MeuMtodo com


uma nova implementao. Quando o objeto testado, o comando Me faz referncia ao mtodo
atualmente em uso, enquanto que MyClass faz referncia ao mtodo original em uso que anula os
efeitos da verso substituda da classe derivada e permite que o compilador resolva qual a verso
invocar.

Observe tambm como o comando Inherits foi utilizado na implementao da classe Derivada.
114
Para utilizar a tcnica da herana adicione o comando Inherits com o nome da classe bsica. Esse
comando deve ser sempre a primeira linha de implementao da classe derivada. Exemplo :

Class Classe1
Sub Metodo1()
MessageBox.Show("Este um mtodo da classe bsica.")
End Sub
Overridable Sub Metodo2()
MessageBox.Show("Este um outro mtodo da classe bsica.")
End Sub
End Class

Class Classe2
Inherits Classe1 Inherits deve ser sempre a primeira linha no comentada da implementao
Public Field2 as Integer
Overrides Sub Metodo2()
Messagebox.Show("Este um mtodo da classe derivada.")
End Sub
End Class

Protected Sub Testar()


Dim C1 As New class1()
Dim C2 As New class2()
C1.Metodo1() ' Chama o mtodo da classe bsica.
C1.Metodo2() ' Chama outro mtodo da classe bsica.
C2.Metodo1() ' Chama o mtodo herdado da classe bsica.
C2.Metodo2() ' Chama o mtodo da classe derivada.
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Testar()
End Sub

Quando o procedimento Testar executado, as mensagens abaixo so exibidas :

"Este um mtodo da classe bsica."


"Este um outro mtodo da classe bsica."
"Este um mtodo da classe bsica."
"Este um mtodo da classe derivada."

1 Quando usar heranas

A herana deve ser usado nos seguintes casos abaixo :

Quando a hierarquia de uma herana um relacionamento mas no aquela hierarquia


que Tem um relacionamento.
Quando necessrio reutilizar um cdigo de uma classe bsica.
Quando for necessrio aplicar a mesma classe e mtodos para diferentes tipos de dados.
Quando a hierarquia de uma classe pequena e os programadores no gostariam de
adicionar outros nveis
Quando as mudanas de cdigos da classe bsica afetem outros classes derivadas.
115
Resumidamente :

1. Use herana quando se deseja criar funcionalidades bsicas que possam ser melhoradas nas
classes derivadas
2. Use Inteface em situaes onde as funcionalidades sejam similares mas as implemetaes
sejam completamente diferentes.

1.2 Tipos de Hierarquias ( um Relacionamento e Tem um Relacionamento)

H duas formas de criar um relacionamento entre classes, um e Tem um relacionamento.


um Relacionamento uma classe derivada totalmente de uma classe bsica, isto a
classe derivada do mesmo tipo da classe bsica, possuindo os mesmos campos, mtodos e
propriedades.
Tem um Relacionamento A classe derivada no herda a classe bsica, isto alguns
membros da classe bsica no devem ser herdados pela classe derivada. Assim no ocorre a
herana num tipo Tem um Relacionamento.

Exemplo :

No exemplo acima uma Classe denominada Cliente possui uma classe derivada Cliente
Preferencial que foi completamente herdada da classe bsica. A classe Cliente Preferencial pode
possuir todos os membros de dados da classe Cliente pois um cliente j cadastrado e em
atividade, portanto a hierarquia conhecida como um Relacionamento.

A classe denominada Cliente Encaminhado um potencial cliente ainda no cadastrado e que no


comprou produto algum da loja, portanto no pode herdar os membros Preferncias e ltimo
Pedido da classe bsica. Assim essa hierarquia conhecida como Tem um Relacionamento.

Para classes Tem um Relacionamento o melhor recurso implementar Interfaces para alcanar o
objetivo proposto.

1.3 Reutilizao de cdigo

116
Todo cdigo reutilizvel altamente recomendado pelo simples fato de no ter o trabalho de
codificar e testar todos os procedimentos novamente. Uma vez criado o cdigo bsico todos as outras
classes podem reutilizar o cdigo incrementando outros procedimentos necessrios.

Um exemplo tpico criar uma classe que implementa uma coleo de dados lidos de um banco de
dados, por exemplo uma tabela clientes, e permite o acesso a todas as informaes na memria. Em
seguida uma classe derivada poderia manter a mesma coleo para a tabela clientes mas adiciona
uma outra coleo que l os dados da tabela Pedidos e mantm na memria para posterior consulta.

Entretanto toda a reutilizao de cdigo pode possuir erros graves que s podem ser evitados em
sistemas bem desenhados.

1.4 Classes derivadas e os tipos de dados

Qualquer classe bsica pode deixar a responsabilidade da implementao dos membros para cada
classe derivada. Assim todo o mtodo poder acomodar qualquer tipo de dados.

Essa tcnica evita erros quando por exemplo um cdigo da classe derivada deseja calcular uma taxa
de aumento para um produto em 2,5%, entretanto o mtodo da classe bsica s aceita nmeros
inteiros. Assim para resolver o problema a classe bsica definiria um mtodo somente herdado para
ser implementado na classe derivada. Exemplo:

MustInherit Class Produtos


Public ValorTotalArredondado As Integer
Public ValorTotalArredondadoAMenor As Integer
MustOverride Sub CalcularAumento()
End Class

No exemplo acima, o desenvolvedor alm de criar uma classe somente herdvel, os itens
ValorTotalArredondado e ValorTotalArredondadoAMenor so definidos na classe bsica Produtos
que podero ser reutilizados nos clculos das classes bsicas descendentes.

Este tipo de soluo combina os recursos de polimorfismo baseado em herana (Inherit-based


polymorphism) e permite que os desenvolvedores que no tenham acesso ao cdigo fonte da classe,
possam aprimorar a classe bsica atravs da implementao de novos recursos classe derivada.

1.5 - Hierarquia de classes

Quando se cria uma classe bsica possvel criar vrias classes derivadas que herdam os recursos da
classe bsica, assim a hierarquia de classes formada pela criao de classes herdadas. Entretanto
classes que possuem hierarquias muito grandes e complexas dificultam a programao, portanto
como regra geral necessrio limitar os nveis de hierarquia at no mximo 6 (seis) nveis.

1.6 Mudanas nas classes bsicas que afetam as classes derivadas

Um dos benefcios da herana que as mudanas nas classes bsicas podem afetar as classes
derivadas, entretanto nem todas as modificaes podem ser feitas quando h dezenas de classes
derivadas da classe bsica.

Quando o criador da classe bsica altera o cdigo de um de seus membros, os desenvolvedores que
criaram classes derivadas podem no conseguir recompilar a classe herdada com as novas
modificaes.

117
Por exemplo, um classe bsica foi criada com um campo para armazenar o cdigo postal de ruas e as
classes derivadas herdaram esse campo de informao. Mais tarde foram feitas alteraes na classe
bsica para comportar mais 4 dgitos expandindo o nmero atual para 9 dgitos, entretanto as classes
bsicas ainda permanecem com 5 dgitos.

Para que os desenvolvedores no precisem alterar o cdigo das classes derivadas, possvel criar um
campo adicional na classe bsica que armazene os 4 dgitos adicionais. Assim os aplicativos
poderiam ser atualizados sem alterar o cdigo das classes derivadas, esse o meio mais seguro e
eficaz de resolver tais problemas.

2.18.10 Construtores e Destrutores na hierarquia de classes

Todos os programas codificados com o Visual Studio .NET podem utilizar todas as classes da
plataforma .NET. Por exemplo classes que definem atributos podem herdar os recursos da classe net
System.Atributte, classes que definem componentes podem herdar recursos da classe net
System.ComponentModel.Component e assim por diante.

A tecnologia .NET alm de possuir classes bsicas prontas, permite que todo o software criado por
outras linguagens de programao sejam totalmente compatveis entre si. Assim uma classe bsica
criada com o Visual C# pode ser utilizada para criar classes derivadas em VB, que conseqentemente
pode ser utilizado pelo C++ .NET.

Quase tudo criado pelo VB .NET involve objeto, alm de strings, integers etc, que tambm podem
ser considerados objetos. Todos os objetos so herdados de uma classe bsica da plataforma .NET
System.Object que possui cdigo padro para todos os objetos da plataforma. Todas as novas
classes herdam implicitamente (automaticamente) os recursos da classe System.Object,
portanto nunca ser necessrio herdar explicitamente a classe System.Object com o comando
Inherits.

Como j foi visto anteriormente, quando uma classe criada o CLR Common Language RunTime
(Runtime de linguagem comum) executa em primeiro lugar o cdigo do mtodo Sub New, tambm
conhecido como Construtor. Esse cdigo pode desempenhar qualquer tarefa desejada tais como Abrir
Arquivos, abrir conexes de banco de dados, inicializar variveis e outros mais.

Quando um classe derivada criada, o construtor da classe bsica executada sempre em primeiro
lugar seguido pelo construtor da classe derivada. Isto acontece porque o construtor da classe derivada
possui a sintaxe MyBase.New ( ) que chama o construtor da classe imediatamente acima da
hierarquia.

Todas as classes derivadas iro invocar os construtores das classes imediatamente anteriores na
hierarquia, at chegar no construtor na classe de ltima hierarquia. Exemplo :

118
Quando o objeto no estiver mais em uso, o CLR chama o mtodo Finalize (Destrutor) antes de
retir-lo da memria. O cdigo dentro de Finalize executa tarefas de limpeza, tais como salvar
informaes, fechar arquivos, fechar conexes de banco de dados e outros mais.

O cdigo em Finalize ser executado sempre primeiro na classe derivada de ltima hierarquia at
chegar no cdigo Finalize da classe bsica. Isto porque a sintaxe MyBase.Finalize ( ) deve estar
sempre na ltima linha do cdigo Finalize.

De fato, quando uma classe derivada encerrada, o cdigo de limpeza geral deve ser efetuada para
esta classe, pois poder fechar arquivos, conexes e salvar configuraes abertas por esta classe
somente. Em seguida ser invocado o cdigo de limpeza da classe de hirarquia anterior que tambm
efetuar limpeza geral para as tarefas executadas por essa classe. Exemplo :

119
2.18.11 Polimorfismo

O polimorfismo a habilidade de criar classes que possuam nomes, mtodos e propriedades idnticas
mas funcionalidades diferentes.

O Visual Basic .NET implementa o polimorfismo atravs da Herana (Inherits) e atravs de


Interfaces (Interfaces), ao contrrio de verses anteriores que somente implementavam o
polimorfismo atravs de Interfaces.

1 O polimorfismo baseado em Herana

O polimorfismo baseado em herana quando os mtodos e propriedades de uma classe bsica so


overriden (substitudos) por outra implementao (outro cdigo) na classe derivada.

O polimorfismo a habilidade de chamar um mtodo de um objeto sem conhecer a classe em que foi
derivado.

Exemplo de polimorfismo baseado em herana :

Const StateRate As Double = 0.053 ' 5.3 %


Const CityRate As Double = 0.028 ' 2.8 %

Public Class BaseTax


Overridable Function CalculateTax(ByVal Amount As Double) As Double
Return Amount * StateRate.
End Function
End Class

Public Class CityTax


' Este mtodo chama o mtodo da classe bsica
' e modifica o valor retornado.
Inherits BaseTax
Private BaseAmount As Double
Overrides Function CalculateTax(ByVal Amount As Double) As Double
BaseAmount = MyBase.CalculateTax(Amount)
Return CityRate * (BaseAmount + Amount) + BaseAmount
End Function
End Class

Sub TestPoly()
Dim Item1 As New BaseTax()
Dim Item2 As New CityTax()
ShowTax(Item1, 22.74)
ShowTax(Item2, 22.74)
End Sub

Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double)


' O argumento Item do tipo BaseTax, mas pode-se tambm
' inform-lo como do tipo CityTax
Dim TaxAmount As Double
TaxAmount = Item.CalculateTax(SaleAmount)
MsgBox("A taxa : " & Format(TaxAmount, "C"))
End Sub
120
O exemplo acima cria uma classe bsica que permite que um mtodo seja substitudo. Em seguida h
uma classe derivada que substitui a implementao original da classe bsica alterando o valor
retornado.

2 Porlimorfismo baseado em Interface

A interface, j vista anteriormente, outra forma que o VB .NET implementa o polimorfismo. A


inteface define mtodos e propriedades assim como classes, mas no implementa (cria) o cdigo de
cada procedimento, ao invs disso ele permite que a classe crie sua prpria implementao.

O polimorfismo baseado em Interface quando os mtodos e propriedades definidas pela interface


so implementadas de formas diferentes em diversas classes. A grande diferena entre o
polimorfismo baseado em Interface e o polimorfismo baseado em herana que o primeiro no
precisa utilizar uma classe bsica para herdar (Comando Implements) enquanto que o ltimo exige
uma classe bsica (Comando Inherits).

Exemplo de polimorfismo baseado em Interface

Public Interface Figura


Function Calcularrea(ByVal X As Double, ByVal Y As Double) As Double
End Interface

Public Class Tringulo


Implements Figura
Function Calcularrea(ByVal X As Double, ByVal Y As Double) As _
Double Implements Figura.Calcularrea
' Calcula a rea do tringulo.
Return 0.5 * (X * Y)
End Function
End Class

Public Class Retngulo


Implements Figura
Function Calcularrea(ByVal X As Double, _
ByVal Y As Double) As Double Implements Figura.Calcularrea
' Calcula a rea do retngulo.
Return X * Y
End Function
End Class

Sub ProcessarFigura(ByVal Figura2 As Figura, ByVal X As Double, ByVal Y As Double)


MessageBox.Show("A rea do objeto " & Figura2.Calcularrea(X, Y))
End Sub

Sub TestarInterface()
Dim Retngulo2 As New Retngulo( )
Dim Tringulo2 As New Tringulo( )
ProcessarFigura(Tringulo2, 3, 14)
ProcessarFigura(Retngulo2, 3, 5)
End Sub

121
O exemplo acima cria uma interface que implementada em duas classes diferentes. No
procedimento TestarInterface cada objeto utiliza seu mtodo Calcularrea especfico

2.18.12 Criando um hierarquia de heranas

Hierarquia de classes a habilidade de criar classes derivadas que reutilizam cdigo e adicionam
novas funcionalidades aos mtodos j existentes da classe bsica, com um mximo desejvel de 6
(seis) nveis.

Para criar uma hierarquia de classes bem desenhadas preciso seguir os seguintes conselhos :

Crie uma hierarquia de classes comeando com classes bsicas mais gerais possveis e
derivando classes cada vez mais especficas. Por exemplo quando se deseja criar uma
hierarquia de classes que modelam o hardware do computador, pode-se criar classes
derivadas com o nome de cada dispositivo como Monitor, teclado, mouse. Em seguida pode-
se criar classes derivadas nas prximas hierarquias com o nome de tipos de Monitores, tais
como MonitoresColoridos, MonitoresDigitais, etc.
Prefira variveis que possuam grande capacidade de armazenamento para facilitar quaisquer
mudanas de armazenamento no futuro. Por exemplo, quando uma classe requer usar uma
varivel apenas do tipo Integer, ento escolha o tipo Long mais abrangente.
Somente exponha os itens que a classe derivada necessite, isto utilize o declarador Public
com cautela, ao invs disso utilize Private para proteger os itens da classe bsica que no
interessam a classe derivada.
Os itens que sero necessrio para a classe derivada devem ser marcados com o declarador
Protected, reduzindo o nmero de classes que sero dependentes desse item.

Como regra geral imprescindvel definir como os membros (propriedades, campos e mtodos) da
classe devero ser acessados, declarando-os com os modificadores de acesso, desta forma possvel
controlar como os membros sero usados. Conforme abaixo :

122
Todos os membros internos da classe devero ser declarados como Private, assim somente o
cdigo dentro da classe em que foi definido, poder acessar este membro.
Todos os membros que devero ser usados somente dentro da classe ou por classes derivadas
devem devem ser declarados com Protected. Assim esse membro s ser acessvel dentro do
cdigo da classe que o definiu e dentro do cdigo das classes derivadas dessa classe bsica.
Todos os membros que devero ser acessados por mdulos externos a classe, devem ser
declarados como Friends. Assim o membro poder ser acessado somente por mdulos que
fazem parte do projeto da classe.
Todos os membros que devero ser acessados por toda a hierarquia de classes devero ser
declarados com Public.

Toda hierarquia de classes pode sofrer um problema chamado de Classes de base frgil (Fragile
base Classes) que significa que mudanas feitas na classe bsica afetam todas as classes derivadas
obrigando a recompilao e redistribuo dos componentes.

A hierarquia de classes pode sofrer mudanas desde a alterao das necessidades do software at a
ausncia de algum elemento no codificado por esquecimento.

A melhor forma de evitar o problema Fragile base Classes modificar somente a classe derivada,
mas quase sempre isso no possvel. De forma geral o problema no pode ser eliminado, mas
pode ser reduzido utilizando os seguintes recursos :

As classes MustInherit e mtodos MustOverride reduzem o risco de Classes de base frgil,


pois os detalhes da implementao ficam sob a responsabilidade da classe derivada.
Os membros Shadow contribuem eliminando os conflitos de nomes entre os membros de
classes.
Para criar novas funcionalidade a classe, crie novos mtodos ao invs de Overloads
(Sobrecarga).

2.19 Operaes com Componentes COM

A tecnologia COM (Component Object Model) foi utilizada para criar componentes para o Sistema
Operacional Windows durante muitos anos, esses componentes variavam desde controles, arquivos
executveis e at aplicativos para Windows 95, 98, Me, NT, XP e etc. A tecnologia COM permitia
que esses objetos pudessem expor suas propriedades, mtodos e funes (chamados de interface)
para outros componentes e aplicativos.

Com a criao da plataforma NET, os aplicativos criados com a tecnologia .NET devero substituir a
tecnologia COM, entretanto ainda hoje a maioria dos programas so escritos com COM, assim foi
criada a Interoperabilidade COM (Interop COM) no Visual Studio .NET para que os
programadores pudessem trabalhar normalmente com os componentes COM.

Todo o cdigo criado pela plataforma NET Cdigo Gerenciado (Managed Code) que produz
MetaDados (MetaData) que so utilizados pelo CLR (Common language Runtime). Os dados
utilizados pelo aplicativo criado com a tecnologia NET so chamados de Dados gerenciados
(Managed Data) pois o arquivo Run Time da plataforma NET gerencia as tarefas relacionadas a
estes dados tais como gerenciamento de memria, verificao dos tipos de dados e etc.

Os componentes COM so cdigos e dados no gerenciados que precisam ser acessados com a
Interoperabilidade da plataforma NET, atravs dos Assemblies.

123
Os Assemblies so componentes da plataforma Net que funcionam como colees de verso,
construo, distribuio de um aplicativo simples. Na antiga verso do VB 6.0 existia a Type
Lybraries ou biblioteca de tipos que exibia as propriedades, mtodos de um objeto COM, hoje em dia
os Assemblies possuem essa mesma funo.

O VB .NET possui programas chamado Tlbimp.exe e Tlbexp.exe que importam e exportam objetos
COM respectivamente.

Os Interop Assemblies so um tipo de assemblie que agem como um intermedirio entre os objetos
COM (no gerenciados) e os aplicativos .NET (gerenciados). Os Interop Assemblies utilizam um
processo chamado de Interoperalility marshalling (ordenao de interoperaes) que analisa
automaticamente os parmetros e tipos retornados de um objeto COM e transforma esses itens para
tipo de dados equivalente em um aplicativo .NET ou vice versa.

Para usar um objeto COM no aplicativo basta Adicionar uma referncia ao objeto COM na janela
Project > Add Reference da IDE, em seguida crie um Interop Assemblie utilizando o comando
Imports na primeira linha de cdigo do aplicativo.

possvel criar um Interop Assemblie utilizando a linha de comando, similar ao DOS, utilizando o
programa Tlbimp.exe com o caminho do objeto COM (dll, ou outros), alm do projeto a ser usado e
o nome do Interop Assemblie a ser criado. Exemplo :

Tlbimp test3.dll /out:NameSpace1 /out:Interop1.dll

Um controle ACTIVEX um componente COM que pode ser utilizado por pginas WEB ou por
aplicativos Desktop (aplicativos Cliente), que tambm pode ser utilizado pelo VB .NET basta
adicionar o controle na caixa de ferramentas do Visual Studio .NET IDE selecionando o menu Tools
> Customize Toolbox e escolher a aba COM components.

Para criar um projeto utilizando a tecnologia COM, basta escolher um novo projeto no VB .NET do
tipo CLASS Library e adicionar um item COM Class, em seguida adicione mtodos, propriedades e
eventos e compile o programa.

possvel criar um projeto COM sem usar o item COM Class, esse tipo de projeto requer a criao
manual de uma classe COM. Basta escolher um novo projeto do tipo Class Library selecionar a
Pgina de propriedades do projeto (Clicando com o boto direito do mouse sobre a janela Solution
Explorer no nome do projeto) e escolhendo o item Build e finalmente marcando a caixa Register for
Com Interop.

Em seguida necessrio criar os atributos da classe ComClass, tais como a identificao da classe; a
identificao da Interface, a identifao dos eventos. Exemplo :

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _


Public Class ComClass1

Para criar cada nmero de identificao, selecione o menu Tool > Create Guid > Registry Format em
seguida selecione o boto Copy para adicionar os nmero recm criados para a rea de transferncia,
e no esquecendo de remover as chaves entre os nmeros.

Em seguida cole os nmeros em cada sesso de identificao. Exemplo :

Public Const ClassId As String = "832F34A5-5CF5-403f-B4A8-428C8351FD02"


Public Const InterfaceId As String = "3D8B5BA4-FB8C-5ff8-8468-11BF6BD5CF91"

124
Public Const EventsId As String = "2B691787-6ED7-401e-90A4-B3B9C0360E31"

Toda classe COM deve possuir um construtor no parametrizado, caso contrrio a classe no ser
registrada no Windows, para isso basta fazer isso :

Public Sub New()


MyBase.New()
End Sub

Finalmente implemente as propriedades, mtodos e eventos e compile o projeto. O VB .NET criar


um Interop Assemblie e registrar o objeto no sistema operacional.

Observe que no possvel utilizar um projeto COM gerado pelo VB .NET em outro aplicativo
VB .NET.

2.20 Multithreading

Os aplicativos codificados com a tecnologia .NET podem executar vrias tarefas simultaneamente
usando um processo chamado Multithreading (threading livres) que separa as tarefas em pedaos
separados em fila para execuo no sistema operacional. Esse tipo de processamento melhora o
desempenho do aplicativo pois de um lado o aplicativo centraliza os procedimentos de validao de
entradas do usurio enquanto o sistema operacional executa outras tarefas de threads separados.

De forma mais resumida, um aplicativo Multithreading poderia validar as digitaes feitas por um
usurio em um primeiro thread, e concomitantemente o aplicativo executaria complexos clculos
matemticos em um segundo thread junto com uma atualizao do banco de dados em um terceiro
thread. Ao passo que um aplicativo de um simples thread, deveria aguardar a validao de dados em
seguida efetuaria complexos clculos e somente aps o trminos dos processamentos anteriores
atualizaria o banco de dados.

Para criar um Thread, crie uma varivel de classe Thread e utilize o operador AddressOf com o
endereo de um procedimento :

Dim MyThread As New System.Threading.Thread(AddressOf MySub)

MyThread.Start() inicia um Thread

MyThread.Abort() finaliza um Thread

MyThread.Sleep () Causa uma pausa no Thread


MyThread.Suspend () suspende um Thread

Cada Thread tem sua prioridade, isto o tempo que o sistema operacional trata o processo como alta
prioridade enquanto os outros so tratados como de baixa prioridade. A propriedade Priority ajusta o
valor para essa prioridade. As enumeraes possveis para esse propriedade so (Do maior para o
menor) :

Enumerao
Highest
AboveNormal
Normal

125
BelowNormal
Lowest

Um thread pode ser divido em primeiro plano e segundo plano, os de primeiro plano so executados
indefinidamente enquanto que os de segundo plano ficam em fila. possvel mudar o estado de
segundo plano utilizando a propriedade IsBackground.

Uma vez um thread em execuo, como no exemplo MyThread.Start( ), possvel mudar o seu
estado de execuo utilizando a propriedade ThreadState que usa um ou mais itens da enumerao
System.Threading.ThreadState. Assim por exemplo possvel colocar um processo Thread em
modo de espera Thread.Sleep( tempo) onde tempo um valor em milissegundos determinados ou
um Thread.Sleep (System.Threading.Timeout.Infinite) que s pode ser religado ou interrompido
por Thread.Interrupt.

Os threads do mesmo aplicativo trabalham sob o mesmo espao de memria, e para evitar que um
thread utilize um mesmo dado de outro thread, necessrio utilizar sincronizao. Um thread
independente pode ser sincronizado com outro thread diferente, assim quando um processo acaba o
outro inicia automaticamente e sincronizadamente. Por exemplo um thread executa um procedimento
que classifica um nome por ordem alfabtica e um outro thread aguarda esta classificao para
depois utilizar os dados.

Os eventos so as formas mais comuns de sincronizar threads. Um thread dispara um evento e


sinaliza ao programa principal ou outro thread o estado do processamento.

O comando SyncLock permite sincronizar threads, evitando que mltiplos threads acessem o mesmo
dado compartilhado ao mesmo tempo. O cdigo escrito entre o bloco SyncLock ... End SyncLock
fica bloqueado, assim o compilador executa de modo exclusivo todo o cdigo dentro do bloco
SyncLock .. EndLock. Exemplo :

Class Cache
Private Shared Sub Add(ByVal x As Object)
SyncLock GetType(Cache)
End SyncLock
End Sub

Private Shared Sub Remove(ByVal x As Object)


SyncLock GetType(Cache)
End SyncLock
End Sub
End Class

Note que toda a expresso dentro do bloco SyncLock deve ser do Tipo Referncia (veja
explicaes nos captulos anteriores), como por exemplo Classe, Delegate, Interface, Mdulo ou
Matriz.

No exemplo anterior uma classe possui um thread exclusivo para o mtodo Add e outro para
Remove, isto evita que um item seja removido enquanto ele ainda est sendo adicionado pela classe.

Outro recurso para sincronizao o mtodo Thread.Join que determina se um thread terminou uma
tarefa antes que outro thread inicie outra tarefa. O mtodo Join aguarda um tempo at que um thread
finalize a execuo da tarefa, se a tarefa for completada o mtodo Join retorna True, seno retorna
False.

126
O exemplo abaixo demonstra o uso de threading.

Option Compare Text ' Compara texto insensitivo (sem maisuculo ou minsuclo).
' Use Option Compare Binary para procura sensitiva.

Public Class Palavras


Private strloc As Integer
Private RemainingString As String
Private SourceString As String
Public SourceFile As String
Public CompareString As String
Public WordCount As Integer
Private LinesCounted As Integer = 0
Public Event Status(ByVal LinesCounted As Integer, ByVal WordsMatched As Integer)
Public Event FinishedCounting(ByVal NumberOfMatches As Integer)

Sub ContarPalavras()
Dim f As System.IO.File
Dim mystream As System.IO.StreamReader
Dim mystr As String = " " ' No permite Empty por isso foi colocado um espao adicional

If SourceFile = System.String.Empty Or CompareString = System.String.Empty Then


MsgBox("Informe o arquivo de origem e o texto de procura.")
Exit Sub
End If

If f.Exists(SourceFile) = False Then


MsgBox("Erro ao abrir o arquivo.")
Exit Sub
End If

Try
mystream = f.OpenText(SourceFile) ' Abre um novo Stream.
' Faa at que stream retorne Nothing no final do arquivo
Do Until IsNothing(mystr)
mystr = mystream.ReadLine
WordCount += CountInString(1, mystr, CompareString)
LinesCounted += 1 ' Adiciona 1 ao contador de linhas.
' Dispara um evento que monitor ao progresso da pesquisa..
RaiseEvent Status(LinesCounted, WordCount)
Loop
Catch eof As IO.EndOfStreamException
' Nenhuma ao pois j chegou o final do arquivo.
Catch IOExcep As IO.IOException
' Algum tipo de erro ocorreu.
MsgBox(IOExcep.Message)
Dim mynumber As Integer
Finally
mystream.Close() ' Fecha o arquivo.
End Try
RaiseEvent FinishedCounting(WordCount)
End Sub

127
Private Function CountInString(ByVal StartingPoint As Integer, ByVal SourceString As String, _
ByVal CompareString As String) As Integer
' Funo que conta o nr de vezes que uma palavra foi encontrada na frase.
' Se a palavra for encontrada a funo processa recursivamente os strings restantes..
strloc = Strings.InStr(StartingPoint, SourceString, CompareString)
If strloc <> 0 Then
CountInString += 1
CountInString += CountInString(strloc + Strings.Len(CompareString), _
SourceString, CompareString)
End If
End Function
End Class

Sub FinishedCountingEventHandler(ByVal WordCount As Integer)


' Evento disparado pelo thread que avisa que o arquivo j foi analisado..
Me.WordsCounted.Text = CStr(WordCount)
MsgBox("Fim da contagem de palavras.")
End Sub

Sub LineCountEventHandler(ByVal LinesCounted As Integer, ByVal WordsMatched As Integer)


' Evento disparado pelo thread que indica a leitura de cada linha do arquivo de texto.
Me.LinesCounted.Text = CStr(LinesCounted)
Me.WordsCounted.Text = CStr(WordsMatched)
End Sub

Dim Thread As System.Threading.Thread cdigo adicionado ao mdulo de um formulrio

Sub IniciarThread()
Dim WC As New Palavras()
Me.WordsCounted.Text = "0"
' Configura os valores pois no possvel passar um procedimento que possui parmetros..
WC.CompareString = Me.CompareString.Text ' A palavra a ser procurada.
WC.SourceFile = Me.SourceFile.Text ' O arquivo a ser procurado.
' Associa o manipulador de evento ao evento disparado pelo thread.
AddHandler WC.FinishedCounting, AddressOf FinishedCountingEventHandler
' Associa o manipulador de evento ao outro evento disparado pelo thread
AddHandler WC.Status, AddressOf LineCountEventHandler
' Cria efetivamente o Thread.
Thread = New System.Threading.Thread(AddressOf WC.ContarPalavras)
' Inicia o thread.
Thread.Start()
End Sub

Private Sub Start_Click(ByVal sender As System.Object, _


ByVal e As System.EventArgs) Handles Start.Click
IniciarThread()
End Sub

Protected Sub PararThread(Thread as System.Threading.Thread)


' Finaliza a execuo do Thread
Thread.Abort()
End Sub

128
Private Sub Cancel_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Cancel.Click
PararThread(Thread)
End Sub

O exemplo acima cria uma classe Palavras que ir fazer busca de palavras em um arquivo de
Texto. A classe possui um mtodo ContarPalavras e CountInString que disparam eventos na
medida que encontram a palavra no texto.

Os manipuladores de evento atualizam caixas de texto de uma janela do aplicativo e avisam quando
o processo terminou. Observe que o procedimento ContarPalavras executado em segundo plano
enquanto que outro procedimento poderia ser executado livremente, tal fato comprovado bastando
clicar em um boto cancelar (veja Cancel_Click no exemplo acima).

2.21 Drivers, Pastas e Arquivos

O VB .NET permite manipular drivers, pastas e arquivos de 3 formas diferentes, atravs da classe
System.IO da plataforma .NET; das funes internas do compilador do VB ou atravs do objeto
FileSystemObject.

2.21.1 - A classe System.IO

System.IO uma espao nomeado da plataforma .NET que possui vrias classes que permitem
manipular arquivos e pastas. Um espao nomeado um local de trabalho (tipo diretrio) da
plataforma .NET que agrupa classes que executam um tipo especfico de tarefa. Para utilizar
determinada classe ou servio preciso se posicionar no respectivo espao nomeado.

Algumas classes e enumeraes importantes :

FileStream classe que acessa arquivos e exibe erros dos dispositivos.


File Classe que possui mtodos para criar, apagar, mover, abrir, copiar arquivos.
Path Classe que manipula pastas e caminhos de arquivos.
FileAccess, FileMode, FileShare, FileEnumerator, FileAttributes Enumeraes que so
utilizadas pela classe FileStream que modificam a forma como os arquivos so abertos e
manipulados.
BinaryReader Classe que l dados binrios de um arquivo.
BinaryWriter Classe que grava dados binrios em um arquivo.

Exemplo :

Dim fs As FileStream = New FileStream("c:\dados.txt", FileMode.CreateNew)


Dim w As BinaryWriter = New BinaryWriter(fs)
Dim r As BinaryReader = New BinaryReader(fs)
Dim i As Integer

' Aloca uma srie de nmeros e armazena no Buffer


For i = 0 To 11
w.Write(CStr(i))
Next

129
' Move o ponteiro para o incio do arquivo.
w.Seek(0, SeekOrigin.Begin)

' Grava o contedo do Buffer no console (janela do Vstudio .NET IDE).


For i = 0 To 11
Console.WriteLine(CStr(i))
Next

No exemplo acima foi demonstrado a sintaxe bsica de algumas classses, o objeto fs uma cpia da
classe FileStream que configura o ambiente para criar um arquivo chamado dados.txt. em seguida os
objetos w e r so buffers (arquivos temporrios) que permitem gravar os dados no disco. Observe que
os dados sero gravados em formato Binrio.

StreamReader, StreamWriter Classes que manipulam arquivos no binrios, utilizando uma


codificao para converter caracteres para bytes ou vice versa.

A codificao das classes acima do tipo UTF-8 que converte os caracteres corretamente e certifica
que o sistema operacional tem suporte a eles. possvel definir uma codificao diferente no
parmetro da classe.

Exemplo :

Dim sr As StreamReader
' Abre o arquivo a ser lido.
Sr = File.OpenText("c:\MeuArquivo.txt")
' L cada linha do arquivo.
' Quando chegar o final do arquivo retornado o valor "-1".
Dim x As String
While sr.Peek <> -1
x = sr.ReadLine()
Console.WriteLine(x)
End While
' Informa ao usurio que a operao terminou e fecha o arquivo.
Console.WriteLine("Final de arquivo.")
sr.Close()

Directory Classe que permite manipular Pastas e Drives (dispositivos).

2.21.2 Acessando arquivos com as funes internas do VB

O VB .NET inclue funes de verses anteriores como parte de suas bibliotecas. Essas funes so
utilizadas para acessar os dados dos arquivos, dependendo do tipo de dados necessrio usar um tipo
de acesso conforme abaixo :

Acesso Seqencial Grava e l dados do tipo texto em um bloco contnuo. Qualquer arquivo
de texto um arquivo seqencial.
Acesso Randmico Grava e l dados do tipo texto e binrio em estruturas de registros. Para
criar arquivos Randmicos so utilizados tipos de dados compostos para gerar registros com
diversos tipos de dados diferentes que so gravados como campos.
Acesso Binrio Grava e l dados com estruturas e formatos diversos.

130
Os arquivos de texto so geralmente abertos pelo modo seqencial com a funo FileOpen, alis a
Microsoft recomenda utilizar a classe System.IO para tal finalidade. Antes porm deve ser
especificado o modo como os caracteres devem ser manipulados. Exemplo :

FileOpen(1, "TESTE", OpenMode.Input)


' Fecha o arquivo antes de abr-lo em outro modo.
FileClose(1)

OpenMode.Input deve ser usado se o arquivo j existe, caso contrrio gera um erro.
OpenMode.Output deve ser usado se o arquivo no existe, pois este mtodo cria um novo
arquivo.
OpenMode.Append deve ser usado se o arquivo no existe, pois este mtodo cria um novo
arquivo.

Alm disso obrigatrio informar um nmero (canal) livre para que o sistema operacional possa
manipular o arquivo, geralmente a forma correta sempre utilizar a funo FreeFile que seleciona o
canal livre automaticamente. Finalmente aps utilizar o arquivo necessrio fech-lo com a funo
FileClose (NrCanal).

Para editar um arquivo j aberto preciso ler o arquivo e atribuir seu contedo a variveis, em
seguida alterar o seu contedo e retornar o valor dessas variveis ao arquivo original. H 3 funes
que copiam o contedo de um arquivo de texto para variveis :

LineInput Essa funo l uma linha inteira de um arquivo e reconhece o final da linha
automaticamente quando encontra a seqncia de Carriage Return (chr(13) - Tecla Enter) ou (chr(13)
+ chr(10)). Essa funo no inclui essas seqncias no contedo para a varivel.
InputString Essa funo permite que seja determinado um nmero de caracteres a serem lidos e
atribudos a varivel. Essa funo deve ser usado somente nos modos Input ou Binary.
Input Essa funo l os dados strings e nmeros de um arquivo at encontrar caracteres
delimitadores tais como vrgula, espao e etc. Tais caracteres delimitadores finalizam a execuo da
funo.

Dim LinhaDoTexto As String


Dim CanalVazio as integer

CanalVazio = FreeFile( )
FileOpen(CanalVazio, "ArquivoTeste", OpenMode.Input) ' Abre o arquivo
While Not EOF(1) ' Loop at o final do arquivo.
LinhaDoTexto = LineInput(CanalVazio) ' L a linha e joga para a varivel.
Debug.WriteLine(LinhaDoTexto) ' Exibe o contedo na janela Output do IDE.
End While
FileClose(CanalVazio) ' Fecha o arquivo.

A funo LineInput l um caracter por vez at encontrar a seqncia de Return do final de linha. Essa
seqncia no includa no contedo da varivel. No exemplo acima o nmero de arquivo
disponvel foi determinado pela funo FreeFile, em seguida a linha de texto encontrada foi
atribuda a varivel LinhaDoTexto.

Se for necessrio incluir a seqncia de Return varivel, ser necessrio adicionar o cdigo :

LinhaDoTexto = LinhaDoTexto & Chr(13) & Chr(10)

A funo InputString deve ser usado da seguinte forma :

131
Dim umCaracter As Char
Dim CanalVazio as integer

CanalVazio = FreeFile ( )
FileOpen(CanalVazio, "MEUARQUIVO.TXT", OpenMode.Input) ' Abre o arquivo.
While Not EOF(1) Loop at o final do arquivo.
umCaracter = (InputString(CanalVazio, 1)) ' L apenas 1 caracter.
System.Console.Out.WriteLine(umCaracter) ' Imprime na janela Output do IDE.
End While
FileClose(CanalVazio)

O exemplo acima abre um arquivo no modo Input e utiliza a funo InputString para ler apenas um
caracter da linha do texto, note que essa funo inclui qualquer caracter da linha, tais como Return,
espaos, linhas em branco e etc.

FileOpen(1, "C:/meu.txt", OpenMode.Output)


Write(1, "Ol")
Write(1, 14)
FileClose(1)

Dim s As String
Dim i As Integer
FileOpen(1, "c:/meu.txt", OpenMode.Input)
Input(1, s)
Debug.WriteLine(s)
Input(1, i)
Debug.WriteLine(i)
FileClose(1)

O exemplo acima cria um arquivo de texto qualquer e cria duas colunas contendo os dados Ol e
14. Observe que os dados so separadas por vrgula includo pela funo Write, que um delimitador
de coluna especficos para a funo Input.

Para adicionar dados para um arquivo existente ser necessrio utilizar essas funes :

Print Permite gravar dados formatados para um arquivo seqencial; permite incluir um nmero
especfico de espaos entre os caracteres o argumento SPC (n) (n nmero de espaos) e incluir um
nmero especfico de tabulao utilizando o argumento TAB (n) (n nmero de tabulaes).
Entretanto no inclui o caracter de incio de linha (linefeed).
PrintLine Semelhante a funo Print mas inclui automaticamente o caracter LineFeed no final de
cada linha.
Write Permite gravar dados formatados para um arquivo seqencial separando os itens com
vrgula e incluindo aspas entre os caracteres automaticamente.
WriteLine Semelhante a funo Write mas inclui automaticamente o caracter LineFeed no final de
cada linha.

Exemplo de gravao de dados para um arquivo seqencial :

FileOpen(1, "c:\lixo.txt", OpenMode.Output) ' Abre um arquivo output.


Print(1, "Texto qualquer.") ' Grava um texto.
PrintLine(1) ' Grava uma linha em branco.
PrintLine(1, "Zona 1", TAB(), "Zona 2") ' Grava duas colunas de texto separados por Tabulao.

132
PrintLine(1, "Ol", " ", "Mundo") ' Separa duas strings por espao.
PrintLine(1, SPC(5), "5 medidas de espaamento ") ' Grava string com 5 medidas de espao aps o
incio do texto
PrintLine(1, TAB(10), "Ol") ' Grava uma palavra na coluna 10.

' Assign Boolean, Date, and Error values.


Dim aBool As Boolean
Dim aDate As DateTime
aBool = False
aDate = DateTime.Parse("February 12, 1969")

' Datas e valores booleanos so traduzidos automaticamente usando as configuraes locais do


computador
PrintLine(1, aBool, " Valor Booleano")
PrintLine(1, aDate, " Data")
FileClose(1) ' Fecha o arquivo.

O arquivo lixo.txt ter o seguinte contedo quando aberto por qualquer editor de texto simples, como
por exemplo o bloco de notas :

Texto qualquer.
Zona 1 Zona 2
Ol Mundo
5 medidas de espaamento
Ol
False Valor Booleano
12/2/1969 Data

o exemplo a seguir demonstra as funes Write e WriteLine :

FileOpen(1, "c:\Lixo2.txt", OpenMode.Output) ' Abre um arquivo output.


Write(1, "Texto qualquer.") ' Grava um texto.
WriteLine(1) ' Grava uma linha em branco.
WriteLine(1, "Zona 1", TAB(), "Zona 2") ' Grava duas colunas de texto separados por Tabulao.
WriteLine(1, "Ol", " ", "Mundo") ' Separa duas strings por espao.
WriteLine(1, SPC(5), "5 medidas de espaamento ") ' Grava string com 5 medidas de espao aps o
incio do texto
WriteLine(1, TAB(10), "Ol") ' Grava uma palavra na coluna 10.

' Assign Boolean, Date, and Error values.


Dim aBool As Boolean
Dim aDate As DateTime
aBool = False
aDate = DateTime.Parse("February 12, 1969")

' Datas e valores booleanos so traduzidos automaticamente usando as configuraes locais do


computador
WriteLine(1, aBool, " Valor Booleano")
WriteLine(1, aDate, " Data")
FileClose(1) ' Fecha o arquivo.

O arquivo Lixo2.txt ter o seguinte contedo quando aberto por um editor de texto simples :

133
"Texto qualquer.",
"Zona 1",,"Zona 2"
"Ol"," ","Mundo"
"5 medidas de espaamento "
,"Ol"
#FALSE#," Valor Booleano"
#1969-02-12#," Data"

Observe que as funes Write e WriteLine gravam dados booleanos e datas com os caracteres #;
todos os strings so gravados com aspas e alm disso as datas so sempre gravadas no formato
universal Ano/Dia/Ms. Os nmeros decimais devem ser informados utilizando o separador decimal
ponto (.).

Um arquivo randmico (aleatrio) possui registros de tamanhos pr-definidos e cada registro


composto por um ou mais campos. Para abrir arquivos do tipo randmico necessrio criar todas as
variveis ou estruturas de variveis que correspondam aos dados originais do arquivo antes de abrir e
acessar os dados desse arquivo.

Os dados strings de arquivos aleatrios podem possuir tamanhos pr-definidos que podem ser
estruturados utilizando o atributo VBFixedString da plataforma .NET. Se o tamanho dos dados
originais forem menores que os dados compostos recm criados, ento o VB preenche os vazios com
espaos caso contrrio os registros sero truncados.

Exemplo de criao de tipos de dados compostos :

Structure DadosPessoais
Public ID As Integer
Public Salrio As Decimal
Public ltimaReviso As Long
<VBFixedString(15)> Public PrimeiroNome As String
<VBFixedString(15)> Public ltimoNome As String
<VBFixedString(15)> Public Cargo As String
<VBFixedString(150)> Public Observaes As String
End Structure

Declara uma varivel do tipo composto.


Public Empregado As DadosPessoais
' Cria uma trilha para o registro atual
Public Posio As Long
' Pega o nmero do ltimo registro do arquivo.
Public ltimoRegistro As Long

A estrutura de um arquivo aleatrio semelhante a figura abaixo, onde os dados so gravados de


acordo com a estrutura especificada, assim no exemplo abaixo o campo1 Nome possui o tipo de
dados string com 6 posies enquanto que o campo2 Sobrenome do tipo string com 7 posies.
A largura total do registro igual ao Campo1 + Campo2 ou seja 13 posies.

134
Para abrir um arquivo do tipo randmico, necessrio utilizar a funo FileOPen com um
argumento que indica a largura de cada registro do arquivo. O tamanho de registro mximo
32.767 bytes. Exemplo :

Structure Pessoa
<VBFixedString(30)> Dim Nome As String
Dim ID As Integer
End Structure

' Conta 30 dgitos para o string mais 4 dgitos do tipo Integer.


FileOpen(1, "TESTE", OpenMode.Random, , , 34)
' Fecha o arquivo antes de abrir em outro modo.
FileClose(1)

A forma mais correta de determinar o tamanho de uma estrutura utilizar a funo Len que retorna o
total de caracteres de uma estrutura. Exemplo :

Dim Meu as Pessoa


' A funo determina o tamanho da estrutura
FileOpen(1, "TESTE", OpenMode.Random, , , Len(Meu))
' Fecha o arquivo antes de abrir em outro modo.
FileClose(1)

Para editar um arquivo aleatrio preciso ler os registro para uma varivel em seguida altere os
valores dessas variveis e finalmente grave os novos dados no arquivo. O mtodo FileGetObject
deve ser usado para ler os registros do arquivo para uma estrutura de variveis, h vrias funes
para esta finalidade porm a Microsoft recomenda utilizar FileGetObject para evitar erros de
compilao quando eventualmente salvar algum registro do tipo Object para o arquivo. Exemplo :

Dim c As String
FileSystem.FileOpen(1, "teste.txt", OpenMode.Random)
FileSystem.FilePutObject(1, "ABCDEF")
FileSystem.Seek(1, 1)
FileSystem.FileGetObject(1, c)
System.Console.WriteLine(c)
FileSystem.FileClose(1)

O exemplo acima cria um arquivo aleatrio com a extenso (*.txt), observe que os dados string no
podem ser acessveis a leitura humana, assim se o arquivo for aberto pelo Bloco de Notas os dados
sero os seguintes :



Ao passo que o mtodo FilePutObject converte os dados lidos no arquivo para um formato
condizente para leitura. Alm disso o mtodo FileGetObject pode utilizar vrias sintaxes como por
exemplo :

FileGetObject (NmeroArquivo, varivelQualquer, NrRegistro)

NmeroArquivo o nmero do arquivo aberto com a funo FileOpen.


varivelQualquer Uma varivel qualquer que recebe os dados lidos do arquivo.
NrRegistro O primeiro registro de um arquivo aleatrio 1, o segundo registro de um arquivo
aleatrio 2, o terceiro registro 3 e assim por diante.

135
A funo Seek retorna a posio atual de um cursor (leitura ou gravao) em um arquivo aleatrio ou
define a posio de um cursor (leitura ou gravao) em um arquivo aleatrio.

Structure Registro
Dim Nome As String
Dim ID As Integer
End Structure

Public Sub Procurar(ByVal ndice As Integer)


Try
FileOpen(1, "c:\pessoas.txt", OpenMode.Random)
Dim umaPessoa As Registro
Seek(1, ndice)
FileGet(1, umaPessoa)
FileClose(1)
Console.WriteLine(umaPessoa.Nome & " " & umaPessoa.ID)
Catch
manipula qualquer erro de execuo aqui
End Try
End Sub
Para adicionar registro basta utilizar a funo FilePut informando a posio do registro sempre
posterior ao ltimo registro do arquivo, assim ltimaPosio + 1. Para substituir um registro use a
funo FilePut informando a posio do registro a ser alterado.

Para apagar registro em arquivo aleatrio deve-se seguir os passos abaixo :

1. Crie um arquivo temporrio.


2. Copie os dados vlidos do arquivo original para o arquivo temporrio.
3. Feche o arquivo original e apague-o do disco usando a funo intrnseca Kill.
4. Renomeie o arquivo secundrio a funo Rename.

Exemplo de criao de arquivos aleatrios, incluso e alterao de dados :

Structure Registro
<VBFixedString(30)> Dim Nome As String
Dim ID As Integer
End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

Dim Pessoa As Registro, NrArquivo As Integer, TamanhoRegistro As Integer

NrArquivo = FreeFile()
TamanhoRegistro = Len(Pessoa)
FileOpen(NrArquivo, "C:/Pessoa.txt", OpenMode.Random, OpenAccess.ReadWrite, ,
TamanhoRegistro)
Pessoa.ID = 1
Pessoa.Nome = "Luiz"
FilePut(NrArquivo, Pessoa, 1)
Pessoa.ID = 2
Pessoa.Nome = "Antonio Carlos"

136
FilePut(NrArquivo, Pessoa, 2)

Seek(NrArquivo, 2)
FileGet(NrArquivo, Pessoa, 2)
MsgBox(Pessoa.ID & " " & Pessoa.Nome)

FileClose(NrArquivo)

End Sub

A mensagem ser : 2 Antonio Carlos

Conforme mostrado no exemplo acima, possvel utilizar funes como FilePut e FileGet da mesma
forma que FilePutObject e FileGetObject.

Os arquivos de acesso Binrio so normalmente arquivos de pequeno tamanho pois no necessitam


de variveis com tamanhos pr-fixados, alm disso esse tipo de arquivo no pode ser lido
aleatoriamente pois no h como saber a posio especfica do incio ou fim de registros.

Para abrir um arquivo de acesso binrio utilize a funo FileOPen com o parmetro
OpenMode.Binary, alm disso no informe o nmero (largura) dos registros.

Exemplo :
Structure Registro
Dim Nome As String
Dim ID As Integer
End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

Dim Pessoa As Registro, NrArquivo As Integer, TamanhoRegistro As Integer

NrArquivo = FreeFile()
TamanhoRegistro = Len(Pessoa)
FileOpen(NrArquivo, "C:/Pessoa.txt", OpenMode.Binary)
Pessoa.ID = 1
Pessoa.Nome = "Luiz"
FilePut(NrArquivo, Pessoa)
Pessoa.ID = 2
Pessoa.Nome = "Antonio Carlos"
FilePut(NrArquivo, Pessoa)

Seek(NrArquivo, 2)
FileGet(NrArquivo, Pessoa,2)
MsgBox(Pessoa.ID & " " & Pessoa.Nome)

FileClose(NrArquivo)

End Sub

A mensagem ainda ser : 2 Antonio Carlos

137
O exemplo acima utiliza o mesmo cdigo do exemplo anterior, observe que na estrutura Registro foi
eliminado o parmetro <vbFixedString> pois no mais necessrio, alm disso as funo FilePut
no utilize o parmetro PosioRegistro. A vantagem que o arquivo final gravado no disco possui
um tamanho menor em comparao ao mesmo arquivo com acesso aleatrio do exemplo anterior.

Outro exemplo :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click

Dim pixel As Byte, NrArquivo As Integer, i As Integer


Dim pixels As String

NrArquivo = FreeFile()

FileOpen(NrArquivo, "C:/Imagempreto.bmp", OpenMode.Binary)

For i = 1 To 10
FileGet(NrArquivo, pixel, i)
pixels = pixels & pixel
Next i

FileClose(NrArquivo)
MsgBox(pixels)

End Sub

O exemplo acima abre um arquivo de imagem e retorna os bytes recolhidos pela funo FileGet e
exibe um aviso na tela.

Concluso

As funes de acesso seqencial (Input, Output e Append) devem ser utilizados para ler e
gravar arquivos de texto; logs de erros ou relatrios.
AS funes de acesso aleatrio (Random) devem ser usados para ler e gravar dados para um
arquivo sem fech-lo, alm de buscar informaes rapidamente.
As funes de acesso binrio (Binary) devem ser usados para ler e gravar bytes em qualquer
posio de um arquivo, como por exemplo salvar ou exibir arquivos bitmap.

Tipo de acesso Gravao de dados Leitura de dadps


Sequential Funes Print, Funo InputString
(seqencial) PrintLine
Random (aleatrio) Funo FilePut Funo FileGet
Binary (Binrio) Funo FilePut Funo FileGet

2.21.3 Acessando arquivos com FileSystemObject

O VB .NET mantm a biblioteca de Script (arquivo Scrrun.dll) de verses antigas do VB que


manipula drivers, diretrios e arquivos do sistema. Esse recurso mais uma ferramenta baseada em
objeto conhecida como File System Object (FSO), que possui mtodos; propriedades e eventos que
permite criar, excluir, alterar, mover, copiar, obter outras informaes sobre arquivos e pastas e etc.
138
A nica limitao que o objeto FSO no permite criar arquivos binrios, para isso necessrio usar
as tcnicas descritas no captulo anterior. Abaixo uma tabela que descreve os objetos disponveis do
FSO :

Objeto Descrio
FileSystemObject Permite criar, apagar, obter informaes e manipular drivers, pastas,
arquivos.
Drive Permite obter informaes sobre um drive do sistema, tal como um disco
rgido, um CD-Rom, um disco RAM ou um drive de rede LAN.
Folder Permite criar, apagar, mover pastas como outras informaes importantes.
File Permite criar, apagar ou mover arquivos assim como outras informaes
importantes.
TextStream Permite ler e gravar arquivos de texto.

Para utilizar os servios do FSO basta fazer uma referncia a biblioteca de Scripting no projeto VB
.NET conforme os passos abaixo :

1. Clique no menu do IDE : Project > Add Reference e escolha a aba COM.
2. Selecione da lista de componentes a opo Microsoft Scripting Runtime.
3. Crie o objeto FSO : Dim meu as New Scripting.FileSystemObject
4. Ou crie o objeto FSO : meu = CreateObject (Scripting.FileSystemObject)

O item 3 s pode ser utilizado em projetos VB e o item 4 pode ser utilizado em projetos VB e
VBScript. A janela Object Browser do IDE exibe o nome da biblioteca, alm de suas propriedades,
mtodos e colees. NO exemplo acima Scripting refere-se ao nome da biblioteca e
FileSystemObject refere-se a um objeto dessa biblioteca.

Abaixo segue uma tabela de alguns mtodos do objeto FileSystemObject :

Tarefa C omando
Cria um novo objeto CreateFolder ou CreateTextFile
Apagar um arquivo ou pasta DeleteFile ou File.Delete; DeleteFolder ou
Folder.Delete
Copiar um objeto CopyFile ou File.Copy; CopyFolder ou
Folder.Copy
Mover um objeto MoveFile ou File.Move; MoveFolder ou
Folder.Move
Acessar um drive, pasta ou arquivo GetDrive, GetFolder, ou GetFile

H alguns comandos com a mesma finalidade, como por exemplo para copiar um arquivo utilize o
mtodo CopyFile do objeto FileSystemObject ou utilize o mtodo Copy do objeto File. Segundo a
Microsoft, a razo de ter includo esses comandos para a mesma tarefa, de oferecer maior
flexibilidade de programao.

O objeto Drive obtm informaes sobre vrios drives do sistema, atravs das seguintes propriedades
:

Propriedade Descrio
TotalSize Tamanho do Drive em bytes.

139
AvailableSpace, FreeSpace Espao disponvel no drive em bytes.
DriveLetter Letra atribuda ao drive.
DriveType Tipo (removvel, Fixo,Rece, CD-ROM, ou disco
RAM )
SerialNumber Nmero serial do Drive
FileSystem Tipo do sistema de arquivos (FAT, FAT32, ou
NTFS)
IsReady Verifica se o drive est disponvel para uso.
ShareName, VolumeName Nome do compartilhamento e/ou volume
Path, RootFolder Caminho, ou pasta raz do drive

As propriedades Path (App.Path), ChDrive e ChDir statements, e funo CurDir podem retornar um
valor conhecido como Universal Naming Convention (UNC) (Conveno de nome Universal)
(semelhante \\Server\Share) ao invs do caminho padro (tal como e:\Folder), dependendo de
como se executa o aplicativo ou projeto :

Quando o projeto executado em uma rede compartilhada.


Quando o arquivo compilado executado em uma rede compartilhada

Para manipular pastas basta utilizar os mtodos abaixo :

Mtodo Tarefa
FileSystemObject.CreateFolder Cria uma pasta
Folder.Delete ou Apaga uma pasta
FileSystemObject.DeleteFolder
Folder.Move ou Move uma pasta
FileSystemObject.MoveFolder
Folder.Copy ou Copia uma pasta
FileSystemObject.CopyFolder
Folder.Name Retorna o nome de uma pasta
FileSystemObject.FolderExists Verifica se uma pasta existe no drive.
FileSystemObject.GetFolder Manipula uma cpia de um objeto Folder
existente..
FileSystemObject.GetParentFolderName procura o nome de subpastas..
FileSystemObject.GetSpecialFolder Procuta o caminho de uma pasta do sistema..

O objeto FileSystemObject permite manipular arquivos de texto seqenciais, tambm conhecidos


como Arquivos de Stream, conforme abaixo :

Mtodo Tarefa
CreateTextFile, OpenTextFile, ou Cria um arquivo de texto sequncial
OpenAsTextStream
Write ou WriteLine Adiciona dados ao texto
Read, ReadLine, ou ReadAll L dados de um arquivo de texto
File.Move ou MoveFile Move um arquivo
File.Copy ou CopyFile Copia um arquivo
File.Delete ou DeleteFile Apaga um arquivo

140
Exemplo :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Dim fso As New Scripting.FileSystemObject(), fldr As Scripting.Folder
fldr = fso.CreateFolder("C:\MeuTeste")
MsgBox("Pasta Criada: " & fldr.Name)
End Sub

2.22 Manipulando excees (Exception)

Todo aplicativo que possui manipulador de erros pode detectar e corrigir automaticamente eventuais
erros que ocorrerem na execuo do programa. Assim quando um erro detectado o compilador
executa um bloco de cdigo especializado para corrigir o problema enquanto o aplicativo est em
execuo.

Um manipulador de excees deve ser utilizado quando um mtodo invoca um objeto ou operador
que potencialmente pode gerar uma exceo (erro). Quando uma exceo provocada por um
mtodo ou objeto que no possui um manipulador de erros apropriado, essa exceo propagada
para o mtodo chamador, isto o mtodo anterior, se esta rotina tambm no possui um manipulador
apropriado, a exceo continua sua procura de um manipulador de erros apropriado at chegar na
Memria (Pilha) quando emite uma mensagem de erro e o programa finalizado.

Os erros esto agrupados em 3 categorias :

1. Erros de sintaxe Ocorre quando se digita algo errado no editor de cdigos, e o VB


imediatamente verifica a sintaxe e alerta o programador sobre o erro.
2. Erros de execuo (run time) Ocorre quando o programa est compilado e em execuo
mas o sistema operacional no consegue executar a tarefa, mesmo que a sintaxe esteja
correta. necessrio corrigir o problema reescrevendo outras maneiras de executar o
procedimento; recompilando e reexecutando o aplicativo.
3. Erros de lgica Ocorre quando o aplicativo em execuo exibe um resultado inesperado
em resposta a ao do usurio, normalmente quando o desenvolvedor no coloca um
procedimento que trata do assunto. o tipo de erro mais difcil de se corrigir.

O VB .NET oferece duas formas de tratar erros (excees) de execuo no programa :

Manipulao de erros estruturados, tambm conhecidos como Exceptions (excees) o


mtodo recomendado pela Microsoft para criar rotinas de tratamento de erros utilizando a
estrutura avanada de controle Try ... Catch ... Finally descendentes da linguagem C++.
Manipulao de erros no estruturados Mtodo padro de verses antigas do VB que
utiliza o comando On Error para interceptar erros de execuo, entretanto esse mtodo
influencia negativamente no desempenho do aplicativo.

2.22.1 Manipulador estruturado de excees

Para criar um manipulador de erros estruturado utilize a estrutura Try ... Catch ... Finally conforme
abaixo :

Try
141
' Inicia um manipulador estruturado de excees.
' Dentro desse bloco deve estar o cdigo que
' potencialmente pode gerar uma exceo.
Catch [Filtros opcionais]
' O cdigo dentro desse bloco executado automaticamente se os comandos
' provocarem algum tipo de exceo e o filtro for avaliado como True.
[Blocos Catch adicionais]
Finally
' O cdigo dentro desse bloco sempre ser executado imediatamente
' antes do trmino do bloco Try Catch Finally.
End Try

O cdigo dentro do bloco Try dever monitorar qualquer erro causado por objetos, mtodos e etc.
Quando ocorre um erro dentro desse bloco, o compilador do VB procura o comando Catch dentro da
estrutura e executa o cdigo para manipular o erro.

Se o comando Catch no for implementado dentro desse bloco, o compilador procura o comando
Catch imediatamente fora desse bloco onde ocorreu o erro. Esse processo continua at que toda a
pilha (memria) seja examinada a procura do comando Catch, at que uma mensagem de erro seja
exibida e o aplicativo encerrado.

O cdigo dentro da seo Finally sempre executado em ltimo lugar antes do controle do fluxo sair
da estrutura Try ... Catch ... Finally, mesmo que o cdigo de Catch tenha sido executado. Assim
necessrio incluir rotinas de limpeza nessa seo, tais como fechar arquivos, liberar objetos da
memria e etc.

O bloco Catch permite 3 opes de filtros de erros.

1. O erro filtrado com base na exceo causada pela classe:

Try
' cdigo que pode ocasionar o erro.
Catch e as Classe
' cdigo que resolve o problema.
Finally
' cdigo que faz a limpeza geral
End Try

Se ocorrer o erro da classe especfica ento o cdigo dentro de Catch executado at que o controle
passado para o bloco Finally.

2. O erro filtrado com base em qualquer condio, como por exemplo testar um nmero
de erro especfico :

Try
' cdigo que pode ocasionar o erro.
Catch When ErrNum = 5 'Type mismatch.
' cdigo que resolve o problema.
Finally
' cdigo que faz a limpeza geral
End Try

142
Se ocorrer o nmero do erro especificado no filtro ento o cdigo dentro de Catch executado at
que o controle seja passa para o bloco Finally.

3. O erro filtrado com base na combinao dos filtros 1 e 2 listados acima :

Exemplo de criao de uma estrutura de tratamento de excees :

Function LerStringsDoArquivo(ByVal NomeArquivo As String) As Collection


Dim Strings As New Collection
Dim Stream As System.IO.StreamReader = System.IO.File.OpenText(FileName) Abre o arquivo.
Try
While True ' O loop encerrado no erro da classe EndOfStreamException
' de final de arquivo.
Strings.Add(Stream.ReadLine())
End While
Catch eos As System.IO.EndOfStreamException
' Nenhuma ao necessria pois j foi alcanado o final do arquivo..
Catch IOExcep As System.IO.IOException
' Qualquer outro erro ocorreu. Exibe uma mensagem e limpa a coleo.
MsgBox(IOExcep.Message)
Strings = Nothing
Finally
Stream.Close() ' Fecha o arquivo.
End Try

Return Strings
End Function

O exemplo acima utiliza a classe IO.StreamReader da plataforma .NET para abrir um arquivo de
texto e colocar seu contedo em uma coleo. Quando uma exceo de final de arquivo encontrado
o controle do sistema automaticamente reposicionado para o primeiro bloco Catch. Se qualquer
outro erro da classe for acionado, ento o controle do sistema reposicionado para o segundo bloco
Catch.

Observe que no importa a ao tomada pelo bloco Catch, o bloco Finally ser executado
normalmente. Alm disso se a exceo for diferente das classes IOException e
EndOfStreamException, o controle do sistema vai propagar o erro para o cdigo chamador, que
possivelmente no tem um manipulador de erro disponvel.

Todo o cdigo dentro de um manipulador estruturado de excees deve utilizar uma cpia da classe
Exception, diferentemente de um manipulador no estruturado de excees que no a utiliza. Toda
vez que uma exceo provocada, o objeto Err preenchido e uma cpia da classe Exception
criado automaticamente pelo VB .NET.

A classe Exception possui propriedades que informam a localizao, o tipo e a causa do erro, tais
como : a propriedade StackTrace lista os mtodos que causaram o erro; a propriedade Message
uma mensagem de texto que descreve o erro; a propriedade HelpLink configura um link a um
arquivo de ajuda disponvel; a propriedade Source contm o nome do objeto que causou o erro.

2.22.2 Manipulador de excees no estruturado

143
Um manipulador no estruturado de excees utiliza o comando On Erro no incio de um bloco de
cdigo que trata qualquer tipo de erro que ocorrer neste bloco. Quando uma exceo causada
dentro desse bloco, o VB desvia o fluxo do programa para uma regio identificada por um nmero de
linha ou por um identificador com dois pontos onde dever haver um cdigo que trata do erro em
questo.

Esse tipo de manipulador de evento diminui o desempenho do aplicativo alm de criar um cdigo de
difcil manuteno.

Exemplo :

Sub TestarSub
On Error GoTo TratarErro
' cdigo que potencialmente pode gerar um erro.
Exit Sub

TratarErro:
' cdigo que manipula erros.
Resume
End Sub

No exemplo acima o cdigo utiliza a sintaxe do comando On Error direcionando para um alinha
denominada TratarErro. A sintaxe completa On Error Goto Linha onde linha um argumento
que identifica a localizao do manipulador de excees.

Alm disso imprescindvel utilizar o comando Exit Sub antes do bloco manipulador de erros para
interromper o fluxo do sistema, caso contrrio o compilador executa todo o cdigo do manipulador
de excees mesmo que no haja excees.

O comando On Error Resume Next desvia o fluxo do programa para o comando imediatamente
posterior ao comando que causou o erro, ao invs de desviar o fluxo do programa para outra
localidade no procedimento.

O comando Resume tambm utilizado para desviar o fluxo do programa, entretanto o controle vai
diretamente para a linha que causou o erro. Use Resume aps o cdigo de tratamento corrigir o erro.
O comando Resume Line uma variao de Resume que transfere o fluxo do programa para o local
definido em Line, observe porm que Resume Line deve ser utilizado somente dentro do
manipulador de erros.

O comando Resume Next tambm desvia o fluxo do programa para o comando imediatamente
posterior ao comando que causou o erro, porm deve ser usado somente quando o erro em questo
no interrompe a execuo do aplicativo.

O comando On Error GoTo 0 desliga qualquer manipulador de erro no procedimento. Observe que
(zero) no um identificador de linha, portanto o fluxo do sistema no desviado para a linha zero
do cdigo.

O comando On Error Goto -1 desliga qualquer manipulador de excees no procedimento.Assim


como no comando acima, -1 no um identificador de linha portanto o fluxo do sistema no
desviado para a linha zero do cdigo.

Exemplos de um manipulador de erros no estruturado :

144
Sub TesteErro ()
' Declarao de variveis
Dim x As Integer, y As Integer, z As Integer
' O manipulador de excees chamado de DivisoPorZero.
On Error GoTo DivisoPorZero
' Parte do cdigo que pode causar um erro..
x=2
y=0
z=x\y

' Esta linha desliga o manipulador de excees.


On Error GoTo 0
Console.WriteLine(x & "/" & y & " = " & z)

' Sai da rotina antes do incio do manipulador de erros.


' Seno pode causar resultados inesperados.
Exit Sub

' Este o manipulador de erros que trata do erro especfico.


DivisoPorZero :
' Exibe uma mensagem amigvel ao usurio para que este conhea o que est acontecendo.
Console.WriteLine("Voc tentou dividir um nmero qualquer por zero!")

' Oferece uma soluo para o erro.


y=2

' O comando Resume retorna ao ponto que ocorreu o erro


' para que o aplicativo continue com a execuo.
Resume

End Sub

No exemplo acima, o manipulador de erros foi desenhado somente para interceptar qualquer diviso
por zero, assim o manipulador de erros desligado quando o compilador executa a diviso x por y e
no ocorre excees. Qualquer outra exceo exibe a mensagem de erro e finaliza a execuo do
programa.

145
3 Viso Geral da Tecnologia .NET Framework
A infraestrutura .NET um enorme ambiente de programao que possui milhares de classes
divididas em EspaosNomeados (NameSpaces), alm de novo arquivo run-time conhecido como
Common Language RunTime (CLR) que o mecanismo que controla o sistema inteiro. O CLR
cuida dos detalhes de baixo nvel de programao tais como gerenciamento de memria, processos
de comunicao e deixa o desenvolvedor basicamente com as tarefas especficas do seu aplicativo.

O CLR tambm permite trabalhar com diversas linguagens de programao (VB, VC++, VC#,
COBOL, etc) alm de resolver o problema de compatibilidade entre DLLS, coisa que era difcil de
realizar com a antiga tecnologia COM.

Alm disso a infraestrutura possui novos servios de acesso a dados tais como ADO.net; ASP.net e
XML; conta tambm com nova tecnologia de criao de janelas para aplicativos conhecido como
Windows Forms e Web Forms.

A tecnologia .NET introduz o conceito de Assemblies que so arquivos do tipo DLL, mas com outras
funcionalidades extras. Agora os arquivos do tipo DLL possuem recursos extras, essas classes NET
so assemblies que podem ser inseridos no projeto com o comando Imports, portanto um assemblie
um catlogo dos recursos existentes no aplicativo. Esse catlogo conhecido como Manifest ou
Metadados que guardam informaes crticas de um aplicativo tais como visibilidade, tipos, verses
e segurana.

3.1 Infraestrutura NET

O corao da infraestrutura .NET est no novo mecanismo para carregar e executar programas e
gerenciar os recursos. Este mecanismo baseado em uma nova regra para criar componentes
chamada de Common Language Infraestructure (CLI) criado pela Microsoft e que agora est sob
a responsabilidade e controle da organizao mundial de padres ECMA.

De agora em diante essa regra CLI especifica como o ambiente de execuo de um software deve se
comportar :

Os softwares devem trocar dados entre si sem importar com a linguagem de programao que
foram criados.
O software deve ser executado em diferentes sistemas operacionais e em diferentes tipos de
mquinas sem a necessidade de recompilar o cdigo fonte (a compilao em baixo-nvel
ainda ocorrer na plataforma onde for instalado o aplicativo.)

O CLI mais uma especificao (regra geral) para criar componentes e especifica como o cdigo
executvel de um programa deve ser carregado, executado e gerenciado. Essa especificao melhora
o antigo modelo Component Object Model (COM) criado em 1992 pela Microsoft que era utilizado
para criar softwares para o Windows de verses antigas.

Esse antigo mecanismo COM permitia que os desenvolvedores Visual Basic criassem arquivos do
tipo DLL e EXE que rodassem no Windows. Esses componentes DLL e EXE tinham interfaces
(mtodos, funes, propriedades e eventos) que eram utilizados por outros programas e
desenvolvedores de outras linguagens de programao. O problema era que ao passar um tipo de
dados de um aplicativo criado em uma linguagem para outro, os dados deveriam ser traduzidos para
o formato original do componente, caso contrrio haveria um erro de execuo.

146
Com a nova especificao CLI, esse problema resolvido com a criao de um novo modo de passar
dados chamado de Common Type System (CTS) que determina como os tipos so declarados e
usados, entretanto a CLI ainda no foi criada para outros sistemas operacionais diferentes do
Windows, mas tanto a Microsoft como outros fabricantes anunciaram a inteno de cri-lo para
outros sistemas. O CTS oferece alguns recursos :

Os tipos de dados primitivos (Integer, string, etc) so definidos em modo de execuo e


portanto podem ser passados tranquilamente de um componente para outro, pois todos so
formatados da mesma maneira.
Os tipos complexos (estruturas, classes, enumeraes, etc) so construdos em modo de
execuo e portanto podem ser passados de um componente para outro, pois todos so
construdos de tipos primitivos.
Todos os tipos possuem informaes extras dentro de cada um deles, assim um componente
manipulado por um objeto pode ser encontrado fora da definio desse objeto.

A Microsoft criou uma segunda especificao derivada da CLI denominada Common Language
Runtime (CLR) especialmente para a plataforma .NET Windows que no est sob o controle do
ECMA. A parte do CLR que controla o carregamento, execuo e gerenciamento de aplicativos
.NET chamado de Virtual Execution System (VES). O cdigo executado pelo VES chamado de
cdigo gerenciado (managed code), assim todo o aplicativo criado pela tecnologia .NET managed
code.

A CLI define um conjunto de bibliotecas (libraries - dll) que contm classes que desempenham
tarefas especficas, alm disso a CLI determina que seja criada perfis (conjunto de bibliotecas) para
cada plataforma. As bibliotecas da CLI so:

Runtime Infrastructure Library - Essa biblioteca fornece os servios essenciais necessrios para
compilar e executar um aplicativo baseado na especificao CLI.
Base Class Library Esta biblioteca fornece os servios de runtime que so necessrio para as
linguagens de programao, tais como o VB. Alm disso os tipos de dados primitivos so definidos
nessa biblioteca.
Network Libray Esta biblioteca oferece servios de rede.
Reflection Library Esta biblioteca oferece servios tanto para examinar os tipos de dados quanto
para invocar os membros desse objeto todos em modo de execuo, mesmo que estejam em modo de
compilao.
XML Library Oferece servios de XML.
Floating Point Library Oferece suporte a operaes e tipos de ponto flutuante.
Extended Array Library Oferece suporte a matrizes multidimensionais.

Os perfis detalhados anteriormente so os seguintes :

Kernel Profile Define as funcionalidades mnimas do sistema operacional utilizado, alm disso
deve incluir as bibliotecas Base Class e Runtime Infrastructure.
Compact Profile Inclue as funcionalidade do Kernel Profile + Network + Reflection + XML,
todos de forma compacta.

Note que a CLI no inclui algumas bibliotecas especficas da Microsoft tais como Windows Forms,
ASP.NET e ADO.NET pois todos foram criados especialmente para as plataformas Windows. Estas
classes foram criadas somente para essas implementaes. Por exemplo o Windows 2000 aceita
todas as bibliotecas CLI alm de bibliotecas adicionais no definidas pela CLI.

1 NameSpaces

147
NameSpaces (EspaoNomeado) so similares a pastas que agrupam vrias classes com mtodos,
funes e propriedades diferentes. Dentro de um NameSpace no permitido incluir dois mtodos
com o mesmo nome, ou duas classes com o mesmo nome, dessa forma no h nomes ambguos no
mesmo espao.

Os NameSpaces so utilizados somente para declarar uma varivel objeto com um Tipo
Completamente Qualificado. Exemplo :

Dim varivelQualquer as new System.IO O NameSpace desse exemplo System

Nos tempos ureos do C++, os fabricantes de software criavam vrias classes especficas e
colocavam venda no mercado. Entretanto quando o consumidor instalava vrias classes diferentes
no seu computador, o compilador no conseguia executar as aes pois haviam vrias classes e
membros com o mesmo nome.

Ento para colocar ordem nessa baguna os comits internacionais decidiram criar uma forma de
distribuir as vrias classes em lugares nomeados, assim criou-se os NameSpaces.

2 Mdulos e Assemblies

Um mdulo um arquivo .dll ou .exe. Um Assembly um conjunto de um ou mais mdulos que


foram utilizados na criao do aplicativo. Se um aplicativo est contido em um nico executvel
.exe, ento h apenas um mdulo assembly. Se o executvel .exe est distribudo em dois arquivos
.dll mas que no podem ser executados separadamente, ento os trs arquivos juntos formam um
Assembly. Se o produto uma bliblioteca de classe contida em um nico arquivo .dll, ento esse
arquivo um Assembly.

Quando um assembly criado e distribudo aos consumidores, um de seus mdulos contm o


Assembly Manifest, que contm informaes gerais sobre todo o assembly tais como a lista de
mdulos existentes neste assembly, a verso do assembly, idioma, etc.

Quando um cdigo fonte compilado, o compilador precisa resolver os nomes dos tipos utilizados
nesse cdigo fonte para as definies dos tipos, se o compilador encontrar a referncia no mesmo
projeto ento ele cria as definies. Mas quando as referncias esto fora do cdigo fonte o
compilador precisa saber o lugar exato dessas referncias para criar as definies de tipo, para isso
utiliza-se a referncia aos assemblies que contm essas informaes. Por exemplo pode-se compilar
na linha de comando um projeto que faz referncia a uma classe (Assembly) com um tipo de dados
especfico.

Vbc MeuCdigo.vb /reference : System.Drawing.dll

Na documentao original do VB, diz-se que o argumento aps o comando /reference : um


assemblie, entretanto isto no est muito correto, pois este argumento o nome de apenas um
mdulo do Assembly que contm o Assembly Manifest.

Quando um projeto VB .NET criado, o sistema automaticamente faz referncia a dois assemblies
(Assembly Manifest) :

1. mscorlib.dll Contm todos os tipos do espao Nomeado System.


2. Microsoft.VisualBasic.dll Contm todos os tipos encontrados na linguagem Visual Basic,
isto o espao nomeado Microsoft.VisualBasic.

3 Global Assembly Cache (GAC)

148
Por default, os assemblies no so compartilhados por outros aplicativos. Assim os assemblies
podem ser instalados em um diretrio simples junto com o aplicativo original, desta forma torna-se
fcil instalar e remover um aplicativo. Para instalar o aplicativo, basta criar um diretrio e copiar
todos os arquivos para dentro dele. Para apagar um aplicativo basta apagar o seu diretrio. O registro
do Windows no usado para esses casos.

Agora quando um aplicativo for compartilhado por mais de um programa, ele deve ser copiado para
um diretrio especial chamado de Global Assembly Cach (GAC), que uma rea do disco
normalmente em um subdiretrio do Windows que agrupa todos os assemblies compartilhados por
outros programas.

O GAC deve ser evitado o mximo possvel pois somente o Windows Installer ou o programa
gacutil.exe podem manipular o GAC. No possvel copiar e remover arquivos desse diretrio.

Todos os assemblies da infraestrutura .NET esto localizados no GAC.

4 Common Language Specification (CLS)

A CLI define mais um runtime que capaz de suportar a maioria dos recursos das linguagens
modernas de programao chamada de Common Language Specification (CLS) que um
subconjunto dos recursos que so considerados chaves das linguagens.

Esse subconjunto foi criado porque nem todas as linguagens suportam todos os recursos do CLR,
ento foi preciso considerar apenas aquilo que fosse compatvel para cada linguagem. Assim um
componente escrito por uma linguagem de programao completamente compatvel com outras
linguagens devido ao cdigo gerado em CLS.

O VB .NET gera cdigo compatvel com CLS, desta forma qualquer classe ou membros da classe
pode ser, por exemplo sobrecarregado por outra linguagem de programao.

5- Intermediate Language (IL) e compilao Just-In-Time (JIT)

Todos os compiladores (linguagens de programao) que utilizam o CLR devem copilar o cdigo
fonte para uma linguagem intermediria (IL) tambm chamada de Common Intermediate Language
(CLI). A IL uma linguagem de mquina criada pela Microsoft seguindo as determinaes da CLI
que determina que todas os CLR devem compilar ou interpretar a IL na mquina que o CLR est
sendo executado. Se o IL compilado/interpretado ento a compilao deve acontecer de duas
formas :

Antes de um mtodo ser executado.


Na instalao do aplicativo

NO primeiro caso cada mtodo compilado somente quando for necessrio, assim quando o mtodo
compilado, o sistema chama faz vrias chamadas ao mecanismo de compilao e acessa
diretamente o cdigo compilado. O cdigo compilado no gravado no disco, assim quando o
procedimento finalizado ou reiniciado, toda a compilao reexecutada novamente. Este processo
chamado de compilao Just-In-Time (JIT).

No segundo caso, o aplicativo compilado completamente no momento da instalao.

Note que no Sistema Operacional Windows todo o cdigo compilado para linaguagem nativa
e no interpretado.

149
6 Metadata

Os Metadados so informaes declarativas de um Assembly. Todo cdigo fonte possui algumas


construes chamadas de procedurais e outras declarativas.

Exemplo de uma contruo procedural :

ObjetoQualquer.MembroQualquer = 5

O exemplo acima procedural porque ele compilado junto ao cdigo executvel que desempenha
uma ao em modo de execuo, pois foi atribudo o valor 5 ao MembroQualquer do objeto
ObjetoQualquer.

Um exemplo de construo declarativa :

Dim ObjetoQualquer as ClasseQualquer

O exemplo acima declarativo porque ele no executa uma ao, apenas indica que o smbolo
(varivel) ObjetoQualquer guarda uma referncia ao objeto do tipo Classe Qualquer.

No passado, os comandos de declarao (j estudados em captulos anteriores) eram usados


simplesmente pelo compilador e no eram compilados diretamente ao executvel. Entretanto, o CLR
atual utiliza essas informaes para certificar-se que a memria estar sempre utilizando a referncia
de modo seguro. O compilador JIT utiliza essas informaes para chamar os mtodos em modo de
compilao.

Os compiladores que utilizam CLR podem trabalhar tanto com informaes Procedurais como
Declarativas criando arquivos .exe ou .dll.

Todas as informaes procedurais so armazenas como Linguagem Intermediria (IL) e as


informaes declarativas so armazenadas como Metadados.

NO VB .NET possvel incluir vrios Metadados em arquivos j compilados, esse mecanismo


conhecido como Custom Attributes (Atributos Padro).

7 Gerenciamento de Memria e o Garbage Collection

Toda a linguagem de programao orientada a objeto precisa iniciar e destruir objetos, pois estes
ocupam muita memria. Quando um objeto no est sendo usado, a memria que ele ocupa
necessria para uso de outros objetos. O processo de reconhecimento que identifica quando o objeto
no est mais sendo utilizado chamado de lifetime management (gerenciamento de vida til).

Na antiga tecnologia COM, quando um aplicativo utilizava um objeto, este notificava ao objeto em
questo sempre que um novo aplicativo fazia outra cpia dele. Da mesma forma, quando um cliente
que utilizava um objeto finalizava sua execuo, o cliente notificava o objeto desse fato. O objeto
original mantinha sempre uma trilha de todos os aplicativos que utilizavam sua cpia, quando a
contagem de cpias era igual a zero, o objeto estava pronto para ser apagado da memria, esse
mtodo de gerenciamento de memria era conhecido como Reference Counting (Contagem de
referncias). O VB executava automaticamente esse procedimento chamando cdigos de baixo
nvel, e os programadores nem precisavam se preocupar com essa tarefa, entretanto esse mecanismo
causava alguns problemas

150
O atual CLR no utiliza mais o mecanismo de Reference counting, ao invs disso mantm um
ponteiro para o endereo em que a memria livre (memria Heap) comea, e a cada solicitao do
programa ele incrementa o ponteiro com o objeto necessrio e posiciona no prximo endereo de
memria disponvel, esse mecanismo de alocao de memria muito rpida, este processo se repete
enquanto durar a capacidade de memria do computador e nenhuma ao executada at que o
objeto no esteja mais sendo utilizado pelo aplicativo.

Quando no h mais recursos na memria Heap, ento o gerenciador de memria inspeciona todas as
posies de memria alocadas anteriormente que podem ser liberadas examinando as variveis do
aplicativo que faz referncia aos objetos. Quando esses objetos em que as variveis apontam
(referenciam) esto em uso, o gerenciador consegue visualiz-las atravs das variveis do programa,
pois o runtime tem acesso total a todas as informaes dos tipos declarados no aplicativo. Assim o
gerenciador de memria pode encontrar todas as posies da heap que esto em uso.

Durante este processo, o runtime certifica que todos os blocos de memria esto preenchidos de
forma contnua desde o incio do heap, liberando os espaos remanescente para satisfazer as novas
necessidades da memria em uso quando o runtime no encontrar mais as variveis que referenciam
o objeto alocado na memria.

Este processo de liberar memria conhecido como Garbage Collection (GC), esse termo se aplica
a todos os mtodos de gerenciamento de vida til (lifetime management). A parte que o Garbage
Collection gerencia a memria chamado de Garbage Collector.

8 Execuo do cdigo gerenciado

Todo o aplicativo criado com a tecnologia .NET processado atravs de cdigo gerenciado. Para
criar um cdigo gerenciado siga os passos a seguir :

1. Escrever um programa utilizando um compilador .NET (VB, VC#, VC++). Todo o


componente escrito por um desses compiladores pode ser utilizado por outra linguagem desde
que faa parte da especificao (CLS).
2. Compilar o cdigo. O compilador traduz o cdigo fonte para a Linguagem intermediria (IL)
ou Microsoft Intermediate Language (MIL) que gera os metadados para o aplicativo.
3. Executar o cdigo. Quando o cdigo executado, o MSIL (IL) compilado para o cdigo
nativo (cdigo especfico da CPU ) atravs do compilador Just in Time (JIT). Se for
necessrio o JIT verifica o cdigo para segurana de tipos.

Para um programador VB .NET um assembly similar aos tradicionais arquivos. DLL ou EXE,
exceto que eles contm informaes adicionais, assim como os antigos componentes COM tinham
arquivos OLB ou TLB separados chamados de Type Library (biblioteca de tipos). Quando um
aplicativo compilado, o compilador cria automaticamente um assembly para o arquivo .EXE ou
.DLL.

O CLR l os dados do Assembly para gerenciar memria, carregar classes, gerenciar objetos, invocar
mtodos, acessar as verses e recursos dos componentes, reforar segurana, gerar cdigo nativo.

151

Você também pode gostar