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

Processador

Pentium II-, 450 MHz Recomendado: Pentium III 600MHz RAM Windows 2000 Professional 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 GB drive de instalao Sistema Windows 2000, Windows Mesmo Operacional XP, ou Windows NT 4.0 CD-ROM ou Recomendado Recomendado DVD-ROM Video 800 x 600, 256 cores Mesmo Recomendado: High Color 16bit Mouse Qualquer Mesmo

Developer Mesmo

Mesmo

Mesmo

Mesmo

mesmo

Mesmo Mesmo Recomendado Mesmo

mesmo mesmo Recomendado 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. 2. 3. 4. 5. Identificar os objetos e servios do negcio Definir a interface Identificar as dependncias do objeto Validar o desenho lgico 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

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.

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

Arquivo JScript .js Arquivo VBScript .vbs Windows Script Host .wsf

Arquivo contendo cdigo JScript Arquivo contendo cdigo VBScript Arquivo que contm Script que executado como um aplicativo Windows.

Arquivos de um projeto WEB Arquivos Janela Web Extenso Descrio 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.BackColor = Vermelho Text1.Text = "Ol" : Vermelho = 255 :

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

MeuPas = "BRASIL" Verso = "8.0.0012" 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 use : Livro.Ttulo funes dessa classe. Como por Exemplo : Livro.LivroTtulo 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 3D Panel ADO Data Animated button Check box Combo box, drop-down list box Command button Common dialog Communications Controles Data Prefixo pnl ado ani chk cbo cmd dlg com ctr dat Exemplo pnlGroup adoBiblio aniMailBox chkReadOnly cboEnglish cmdExit dlgFileOpen comFax ctrCurrent datBiblio 15

Data-bound combo box Data-bound grid Data-bound list box Data combo Data grid Data list Data repeater Date picker Directory list box Drive list box File list box Flat scroll bar Form Frame Gauge Graph Grid Hierarchical flexgrid Horizontal scroll bar Image Image combo ImageList Label Lightweight check box Lightweight combo box Lightweight command button Lightweight frame Lightweight horizontal scroll bar Lightweight list box Lightweight option button Lightweight text box

dbcbo dbgrd dblst dbc dgd dbl drp dtp dir drv fil fsb frm fra gau gra grd flex hsb img imgcbo ils lbl lwchk lwcbo lwcmd lwfra lwhsb lwlst lwopt lwtxt

dbcboLanguage dbgrdQueryResult dblstJobType dbcAuthor dgdTitles dblPublisher drpLocation dtpPublished dirSource drvTarget filSource fsbMove frmEntry fraLanguage gauStatus graRevenue grdPrices flexOrders hsbVolume imgIcon imgcboProduct ilsAllIcons lblHelpMessage lwchkArchive lwcboGerman lwcmdRemove lwfraSaveOptions lwhsbVolume lwlstCostCenters lwoptIncomeLevel lwoptStreet 16

Lightweight vertical scroll bar Line List box ListView MAPI message MAPI session MCI Menu Month view MS Chart MS Flex grid MS Tab OLE container Option button Picture box Picture clip ProgressBar Remote Data RichTextBox Shape Slider Spin StatusBar SysInfo TabStrip Text box Timer Toolbar TreeView UpDown Vertical scroll bar

lwvsb lin lst lvw mpm mps mci mnu mvw ch msg mst ole opt pic clp prg rd rtf shp sld spn sta sys tab txt tmr tlb tre upd vsb

lwvsbYear linVertical lstPolicyCodes lvwHeadings mpmSentMessage mpsSession mciVideo mnuFileOpen mvwPeriod chSalesbyRegion msgClients mstFirst oleWorksheet optGender picVGA clpToolbar prgLoadFile rdTitles rtfReport shpCircle sldScale spnPages staDateTime sysMonitor tabOptions txtLastName tmrAlarm tlbActions treOrganization updDirection vsbRate 17

Lista de nomes de Menus onde a regra criar um prefino Mnu + Nome do Menu utilizado : Menu File Open File Send Email File Send Fax Format Character Help Contents Nome do Menu mnuFileOpen mnuFileSendEmail mnuFileSendFax mnuFormatCharacter 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 Global Module-level Local to procedure Prefixo g m Nenhum Exemplo gstrUserName mblnCalcInProgress 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 Boolean Byte Prefixo bln byt Exemplo blnFound bytRasterData

18

Collection object Decimal Date (Time) Double Error Integer Long Object Single String Compound-defined type

col dec dtm dbl err int lng obj sng str cdt

colWidgets decRevenue dtmStart dblTolerance errOrderNum intQuantity lngDistance objCurrent sngAverage strFName 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 podese 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 Boolean Byte Char Date Decimal Common language runtime System.Boolean System.Byte System.Char System.DateTime System.Decimal Tamanho em Bytes 2 bytes 1 byte 2 bytes 8 bytes 16 bytes Faixa True ou False 0 255 (no sinalizado). 0 65535 (no sinalizado). 0:00:00 de 1 Janeiro, 0001 11:59:59 da noite de 31 Dezembro, 9999. 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

Double (double-ponto flutuante) Integer Long (long integer) Object Short Single (single-ponto flutuante) String User-Defined Type (estrutura)

System.Double

8 bytes

System.Int32 System.Int64 System.Object (classe) System.Int16 System.Single

4 bytes 8 bytes 4 bytes 2 bytes 4 bytes

+/-0.0000000000000000000000000001 (+/-1E-28). -1.79769313486231570E+308 -4.94065645841246544E-324 negativos; e 4.94065645841246544E-324 1.79769313486231570E+308 positivos. -2,147,483,648 2,147,483,647. -9,223,372,036,854,775,808 9,223,372,036,854,775,807. Qualquer tipo de dados.. -32,768 32,767. -3.4028235E+38 -1.401298E-45 negativos; e 1.401298E-45 3.4028235E+38 positivos. 0 at 2 bilhes de caracteres Unicode. Determinado pela faixa de cada tipo de dados usado na estrutura

System.String (class) (herda de System.ValueType)

Depende do sistema Depende do sistema

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 String

Static X# Private V$ = "Secret" Exemplo I = 347S J = 347I K = 347L H = 347D Y = 347F Z = 347R Q = "."C

Caracter de tipo Tipo de Dado S Short I Integer L Long D Decimal F Single R Double C Char

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 Msgbox VarivelDate Funo Now que retorna a data e hora atual do sistema

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, usase 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 9 15 16 20 255 Octal &O11 &O17 &O20 &O24 &O377 Hexadecimal &H9 &HF &H10 &H14 &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 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 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 temse :

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 Dim teu ( ) as variant Dim nosso ( ) as integer Dim vosso ( ) as object Redim meu (1,1) Redim teu (1,1) Redim nosso (1,1) Redim vosso (1,1) meu (1,1) = teu (1,1) = Empty nosso (1,1) = 0 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 MinhaVarivel (2) = 3457 Exemplo 2 :

Atribui um nmero ao primeiro slot Atribui outro nmero ao segundo slot

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 Nossa (0,0) = Nossa (0,1) = Nossa (1.0) = Nossa (1,1) = 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 (5) (6) (7) (8) Declarao de matriz Multidimensional

Atribui os valores

Dim Tua () () As Byte = {New Byte() {5, 6}, New Byte() {7, 8}} Msgbox (Tua ( 0 ) ( 0 ) ) Msgbox ( Tua (0) ( 1) ) Msgbox ( Tua ( 1) ( 0) ) Msgbox ( Tua ( 1) (1 )) exibe o nmero 5 exibe o nmero 6 exibe o nmero 7 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)) Msgbox (TudoJunto(0)(1)) Msgbox (TudoJunto(1)(0)) Msgbox (TudoJunto(1)(1)) exibe 1 exibe 2 exibe A 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 utilizlos. 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 = Minha = Nothing i = Minha.Length string vazia string vazia 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 Boto OK somente (default). OKOnly vbOKOnly Botes OK e Cancelar. OKCancel vbOKCancel Botes Anular, Repetir, and Ignorar AbortRetryIgnore vbAbortRetryIgnore Botes Sim, No, e Cancelar. YesNoCancel vbYesNoCancel Botes Sim e No. YesNo vbYesNo Botes Repetir and Cancelar. RetryCancel vbRetryCancel cone de mensagem crtica. Critical vbCritical cone de pergunta Question vbQuestion cone de exclamao Exclamation vbExclamation cone de informao Information vbInformation O primeiro boto o default (default). DefaultButton1 vbDefaultButton1 O segundo boto o default DefaultButton2 vbDefaultButton2 O terceiro boto o default DefaultButton3 vbDefaultButton3 A janela de mensagem modal (default). ApplicationModal vbApplicationModal A janela de mensagem System modal. SystemModal vbSystemModal MsgBoxSetForeground vbMsgBoxSetForeground Janela de mensagem de fundo Alinhamento de texto a direita MsgBoxRight vbMsgBoxRight Alinhamento da direita para a esquerda MsgBoxRtlReading vbMsgBoxRtlReading (Sistema Hebreu and Arbico). Ajuda MsgBoxHelp vbMsgBoxHelp 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 X=4+3 retorna 7 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 Diferena (<>) : 23 <> 23 Maior que (>) : 23 > 2 Menor que (< ) : 23 < 2 Menor ou igual (<=) 23 <= 23 Maior ou igual (>=) 23 >= 23 Soma : Subtrao :

retorna True retorna False retorna True retorna False retorna True 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 aaa > aa

retorna True 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() 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. a mesma coisa que Call ChamarOperador ( )

Function Somar2e2() As Integer Dim a As Integer = 2 Dim b As Integer = 2 Return (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. pode-se retornar valores utilizando Somar2e2 = (a + b)

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 LeituraGravao. 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) Variveis gerais, incluindo variveis de objeto Campos ou propriedades (de classes) Matrizes Estruturas Elementos no variveis (ByVal) Constantes Literais Enumeradores 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 Tipo Valor (Contm somente um valor) Tipo Referncia (contm um ponteiro para a classe ou estrutura) ByVal O procedimento no pode mudar o valor nem seus membros. O procedimento no pode mudar a varivel mas pode mudar os membros da instncia (cpia) que ele aponta) ByRef O procedimento pode mudar o valor e seus membros. O procedimento pode mudar tanto a varivel como os membros da instncia 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 Mtodo Add Propriedade Count Mtodo Item Mtodo Remove Descrio Adiciona itens a coleo. Retorna o nmero de itens da coleo. Somente-leitura. Retorna um item pelo ndice ou pela chave (identificao nica) 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 comandos Loop 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 Do comandos Loop Until condio

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 MinhaInterface.MinhaFuno MeuInteiro as Integer ) as Integer Implements

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 podese 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. 2. 3. 4. Crie um arquivo temporrio. Copie os dados vlidos do arquivo original para o arquivo temporrio. Feche o arquivo original e apague-o do disco usando a funo intrnseca Kill. 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", TamanhoRegistro) Pessoa.ID = 1 Pessoa.Nome = "Luiz" FilePut(NrArquivo, Pessoa, 1) Pessoa.ID = 2 Pessoa.Nome = "Antonio Carlos"

OpenMode.Random,

OpenAccess.ReadWrite,

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. Gravao de dados Leitura de dadps Funes Print, Funo InputString PrintLine Funo FilePut Funo FileGet Funo FilePut Funo FileGet

Tipo de acesso Sequential (seqencial) Random (aleatrio) Binary (Binrio)

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 FileSystemObject Drive Folder File TextStream Descrio Permite criar, apagar, obter informaes e manipular drivers, pastas, arquivos. 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. Permite criar, apagar, mover pastas como outras informaes importantes. Permite criar, apagar ou mover arquivos assim como outras informaes importantes. 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. 2. 3. 4. Clique no menu do IDE : Project > Add Reference e escolha a aba COM. Selecione da lista de componentes a opo Microsoft Scripting Runtime. Crie o objeto FSO : Dim meu as New Scripting.FileSystemObject 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 Cria um novo objeto Apagar um arquivo ou pasta Copiar um objeto Mover um objeto Acessar um drive, pasta ou arquivo C omando CreateFolder ou CreateTextFile DeleteFile ou File.Delete; DeleteFolder ou Folder.Delete CopyFile ou File.Copy; CopyFolder ou Folder.Copy MoveFile ou File.Move; MoveFolder ou Folder.Move 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 TotalSize Descrio Tamanho do Drive em bytes. 139

AvailableSpace, FreeSpace DriveLetter DriveType SerialNumber FileSystem IsReady ShareName, VolumeName Path, RootFolder

Espao disponvel no drive em bytes. Letra atribuda ao drive. Tipo (removvel, Fixo,Rece, CD-ROM, ou disco RAM ) Nmero serial do Drive Tipo do sistema de arquivos (FAT, FAT32, ou NTFS) Verifica se o drive est disponvel para uso. Nome do compartilhamento e/ou volume 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 FileSystemObject.CreateFolder Folder.Delete ou FileSystemObject.DeleteFolder Folder.Move ou FileSystemObject.MoveFolder Folder.Copy ou FileSystemObject.CopyFolder Folder.Name FileSystemObject.FolderExists FileSystemObject.GetFolder FileSystemObject.GetParentFolderName FileSystemObject.GetSpecialFolder Tarefa Cria uma pasta Apaga uma pasta Move uma pasta Copia uma pasta Retorna o nome de uma pasta Verifica se uma pasta existe no drive. Manipula uma cpia de um objeto Folder existente.. procura o nome de subpastas.. 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 CreateTextFile, OpenTextFile, ou OpenAsTextStream Write ou WriteLine Read, ReadLine, ou ReadAll File.Move ou MoveFile File.Copy ou CopyFile File.Delete ou DeleteFile Tarefa Cria um arquivo de texto sequncial Adiciona dados ao texto L dados de um arquivo de texto Move um arquivo Copia um arquivo 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