Escolar Documentos
Profissional Documentos
Cultura Documentos
NET
O que o .NET Framework ? Comeamos este artigo com uma pergunta. Uma
pergunta que no fcil responder. Vamos tentar neste artigo responder a pergunta
e ir um pouco mais alm , dando uma pequena introduo as principais classes do
.NET Framework.
"O .NET Framework uma nova plataforma que simplifica o desenvolvimento de
aplicaes para o ambiente altamente distribudo da Web". Seus objetivos principais
so :
1. Fornecer um consistente ambiente de programao orientada a objetos.
2. Fornecer um ambiente de execuo de cdigo que minimize os conflitos de
versionamento e empacotamento/disrtribuio.
3. Prover um ambiente de execuo de cdigo que garanta a execuo segura do
cdigo , incluindo cdigo criado por terceiros.
4. Prover um ambiente de execuo de cdigo que elimine os problemas de
desempenho de ambientes interpretados ou de scripts.
Os dois principais componentes do .NET Framework so o CLR e a livraria de
classes(Class library). O CLR gerencia a memria, as threads , a verificao da
segurana, a compilao e o cdigo em tempo de execuo e a livraria de classes
uma coleo de classes orientadas a objeto de tipos reutilizveis integradas com a
CLR . O .NET Framework pode ser usado para criar os seguintes tipos de aplicaes e
servios:
1. Aplicaes do tipo Console
2. Baseadas em scripts
3. Windows Forms
4. ASP.NET
5. Windows Services
6. XML Web Services
O .NET Framework ento um poderoso ambiente de desenvolvimento que consiste
de vrios componentes e servios combinados. constitudo de milhares de classes
(umas 6 mil) que provm toda funcionalidade que antes voc encontrava quer no
Windows quer no Visual Basic.
Nota: J deu para perceber que com tantas classes encontrar aquele classe que
voc precisa pode se tornar um martrio. Para facilitar a sua vida o .NET Framework
organizado de forma hierrquica existem os espaos de nomes (Namespaces) que
compe e indicam uma determinada ramificao na hierarquia. Nos namespaces a
denominao para cada espao de nome composta de uma srie de trechos
separados por um ponto. Ex: O namespace System.Data.SqlClient esta relacionado a
System.Data mas no esta contido nele pois esta num nivel hierrquico superior.
A classe Math
A classe Math fornece constantes e mtodos estticos ou compartilhados ( um
mtodo esttico/compartilhado pode ser usado sem instanciar a classe Math) para
funes matemticas relacionadas a trigonometria , logartimos , etc.. Abaixo vou
mostrar os mais importantes:
Abs Retorna o valor absoluto do nmero (se for negativo retorna o valor
positivo do nmero)
Cos Retorna o valor do coseno de um ngulo.
Exp Retorna o valor de e elevado a uma potncia especfica.
Log Retorna o logartimo de um nmero.
Log10 Retorna o logartimo na base 10 de um nmero.
Max Retorna o maior nmero entre dois nmeros.
Min Retorna o menor nmero entre dois nmeros.
Pow Retorna um nmero elevado a potncia indicada.
Round Retorna o nmero mais prximo de um nmero.
Sign Retorna um valor que indica o sinal do nmero.
Sin Retorna o valor do seno de um ngulo.
Sqrt Retorna a raiz quadrada de um nmero.
Tan Retorna o valor da tangente de um ngulo.
A classe Console
Abaixo listamos alguns dos mtodos bsicos da classe console :
Mtodo Descrio
Read L informaes a partir da linha de comando.(L o prximo caractere)
L informaes a partir da linha de comando. L a prxima linha (todos
Readline os caracteres at encontrar o Enter) ( no o inclu)
Setin Altera a origem de entrada para Read e ReadLine.
Altera o destino das mensagens de erro durante a execuo do seu
SetError programa
SetOut Altera o destino dos mtodos Write e Writeline.
Write Exibe informaes na linha de comando.
Writline Exibe informaes na linha de comando.(Termina com uma nova linha)
Abaixo temos um exemplo usando alguns dos mtodos acima. Vamos explicar como
ele funciona:
Podemos redirecionar a entrada , a sada ou as informaes de erro do nosso
programa para qualquer destino onde houver um TextReader ou TextWriter.No
exemplo abaixo iremos direcionar o resultado para um arquivo:
Nota : A classe TextReader representa um leitor que pode ler uma srie sequncial
de caracteres. Como uma classe abstrata no pode ser instnciada diretamente;
devemos criar uma classe derivada que herde as caractersticas e implemente os
mtodos da classe TextReader.
Imports System
Imports System.IO
Module Module1
For x = 0 To CONTADOR - 1
Itens(x) = Console.ReadLine
Next
Console.WriteLine()
Console.SetOut(Arquivo)
Console.WriteLine("Itens includos")
For x = 0 To CONTADOR - 1
Console.WriteLine(Itens(x))
Next
Arquivo.Close()
Console.SetOut(Saida)
Console.ReadLine()
End Sub
End Module
O cdigo acima ir gerar o arquivo Saida_Console.txt com os dados inseridos via
console pelo usurio.
A classe Environment
A classe Environment permite que voc obtenha informaes a respeito do ambiente
onde os seus programas so executados ( sistema operacional ,variveis de
ambiente , configuraes , etc..). Alguns de seus mtodos e propriedades so
descritos a seguir:
Membro Descrio
OSVersion Retorna informaes a respeito do sistema operacional atual
Version Obtm informaes sobre a verso da aplicao
CurrentDirectory Retorna o caminho atual do diretrio
CommandLine Retorna a linha de comandos completa que iniciou a aplicao
Retorna o caminho do diretrio do sistema.(Ex:
SystemDirectory
\windows\system32 )
GetlogicalDrivers Retorna uma lista das unidades disponveis em um array.
Retorna o valor de uma varivel de ambiente especfica.(Ex:
GetEnvironmentVariable
comando Set , caminho :path , diretrio temporrio:temp)
Retorna os itens listados na linha de comando quando a
GetCommandLineArgs
aplicao foi iniciada.
Encerra uma aplicao , retornando um cdigo de
Exit
erro(opcional)
A classe Random
A classe Random usada para gerar nmeros aleatrios (inteiros(Integer) ,
duplos(double), etc.) Seus mtodos so :
Membro Descrio
Retorna um nmero entre 0 e o valor mximo possvel para
Next
um inteiro ( algo em torno de 2 bilhes)
Retorna um nmero entre 0 e o valor definido por
Next(ValorMaximo)
ValorMaximo
Next(ValorMinimo,
Retorna um inteiro entre os valores mnimo e mximo
ValorMaximo)
NextDouble Retorna um tipo double entre 0 e 1
Para gerar nmeros aleatrios entre 0 e 100 fazemos:
Conceitos OOP
Desde o lanamento do Visual Studio .NET eu procurei dar uma viso geral do
ambiente de desenvolvimento do VB.NET e dos novos conceitos que a nova
plataforma trouxe.
Acho que voc j percebeu que o VB.NET trs um conjunto de ferramentas , mtodos
, propriedades e conceitos antes no existentes nas verses anteriores , e, isto com
certeza ir facilitar muito o trabalho do desenvolvedor que usa o Visual Basic como
ferramenta. Neste artigo eu vou fazer uma abordagem bem bsica sobre os
principais conceitos necessrios para escrever cdigo VB.NET : variveis , constantes
, operadores , clculos , rotinas , funes , fundamentos para escrever cdigo
robusto , etc...
Se voc j domina estes assuntos pode parar a leitura aqui mesmo , o objetivo e
fornecer uma base slida para quem esta comeando a programar usando o Visual
Basic e est com medo de enfrentar a nova plataforma .NET , para quem comeou
,parou e quer voltar , para quem j comeou ...
Variveis
As variveis so usadas para guardar valores que sero usados durante o decorrer
do programa , para guardar informaes fornecidas pelo usurio e que ser exibida
mais tarde. Cada varivel que usamos identificada por um nome e por um tipo.
Se voc precisar realizar clculos que envolvam somente valores inteiros dever
procurar usar uma varivel do tipo Integer , voc pode usar uma varivel do tipo
Long , Single e Double mas com isto ir gastar mais memria.
As variveis simples guardam nmeros e strings ; neste caso podemos ter nmeros
pequenos e nmeros maiores , com o intuto de economizar memria podemos
dividir estas variveis nos seguintes grupos de tipos :
1. Inteiros
2. Decimais
3. Strings e caracteres
4. Outras (data , Boolean)
Inteiros
Tamanho em
Tipo de Dado Intervalo Comentrio
Bytes
O tipo de menor
tamanho. No
Byte 1 0 at 255
suporta valores
negativos.
Usado para
contadores e faixas
Short 2 -32768 at 32767
de valores de
pequeno intervalo.
O tipo mais rpido
Integer 4 -2.147.483.648 at 2.147.483.647
dos inteiros.
-9,223,372,036,854,775,808 at Indicada tratar
Long 8
9,223,372,036,854,775,807. valores no intervalo.
Nmeros com casas decimais
Tipo de Tamanho
Intervalo Comentrio
Dado em Bytes
-3.402823x 10^38 ate 1.401298 x 10^-45
(negativos) e
Para clculos que
Single 4 exijam certa
1.401298x10^-45 at 3.402823x10^38
preciso.
(positivos)
String e Caracteres
Tipo de Tamanho
Intervalo Comentrio
Dado em Bytes
Usada para tratar
Char 2 0 through 65535 (sem sinal).
um caractere.
Pode tratar at 1,7
Depende da
String at 2 bilhes de caracteres milhoes de pginas
plataforma
de texto
Note que cada caractere precisa de 2 bytes para ser representado , pois o sistema
usado aqui o UNICODE. No sistema ASCII cada caractere representado por um
byte(com isto podemos representar apensa 256 caracteres) ;Para acomodar
caracteres especiais usados em outras lnguas ( Russo , Grego , Japons) e incluir
tambm outros snbolos o sistema UNICODE usa dois bytes para representar cada
caractere. O VB.NET usa o UNICODE para todos os caracteres.
Tipo de Tamanho
Intervalo Comentrio
Dado em Bytes
Usada tratar valores que podem
Boolean 2 True ou False
assumir Falso ou verdadeiro.
Date 8 01/01/100 at 31/12/9999 Usado no tratamento de datas.
Nota: Voc pode armazenar datas em outro tipo de varivel como String ou Integer ,
mas para evitar dores de cabea procure usar o tipo Date.
Declarando variveis
Agora que j falamos sobre variveis e seus tipos vamos ver como usar variveis em
um programa VB.NET. A maneira mais simples de usar uma varivel usar a palavra
chave Dim (dimension) seguida pelo nome da varivel , a palavra chave AS e o tipo
da varivel. Exemplo:
Aqui estamos criando uma nova varivel chamada valor que ir ocupar 4
Dim valor As
bytes e que poder tratar valores numricos na entre : -2.147.483.648
Integer
at 2.147.483.647
Para maiores detalhes sobre este tpico leia o artigo : VB.NET - Declarao de
variveis o que mudou ?
Vetores ( Arrays)
A dimenso de um array o nmero que identifica quando ndices iremos usar para
identificar uma item do array .Um array pode ter de uma at 32 dimenses. Cada
dimenso de um array possui um comprimento diferente de zero. Os elementos de
um array so contguos e iniciam no ndice igual a zero at o valor de maior valor.
Quanto maior a dimenso do array voc usar mais memria vai precisar ser alocada.
Exemplos:
Nota: Se voc no definir um valor inicial para uma varivel o VB.NET ir atribuir
valores padres conforme a tabela abaixo:
Tipo Valor
Boolean False
Date 12:00:00AM
Tipos Numricos 0
Objeto Nothing
Constantes
Obs: A classe Math do namespace System possui diversos mtodos que oferecem um
suporte matemtico. (Ex: Atan , Exp , Sign , Sqrt , Pow , Min , Round , Abs , Cos , Sin ,
Tan , etc...)
Alm destas funes oferecidas pelo .NET Framework o Visual Basic .NET possui
muitas funes intrnsecas que permite realizar alm de converses entre tipos de
variveis , clculos matemticos , manipulao de strings , etc. Vejamos primeiro as
funes para converso de variveis:
Fun
Descrio Exemplo
o
Dim A, B, C As Integer
Dim Check As Boolean
Converte para um A=5
Booleano ( False ou B=5
True). False ou 0 Check = CBool(A = B) ' Check ser True.
Cbool
ser definido como ' ...
False. Retorna um C=0
Boolean Check = CBool(C) ' Check ser False.
Converte para
qualquer tipo de Dim MyNumber As Long
dados. Sintaxe: Dim MyNewType As Single
Ctype MyNumber = 1000
Variavel = Ctype(
MyNewType = CType(MyNumber,Single) ' MyNewType
TipoVelho , igual a p/1000.0
NovoTipo)
Nota:
1. Se a expresso submetida a funo estiver fora do intervalo do tipo de dados
para o qual voc quer converter ocorrer um erro
2. Usamos estas funes para forar que o resultado de uma operao seja de um
tipo particular diferente do resultado padro. Assim usamos CDec para forar
para decimal em casos no qual a preciso simples, dupla ou um valor inteiro
normalmente iria ocorrer.
3. Se o valor fracionrio submetido for exatamente 0,5 , CInt e CLng iro
arredondar para o nmero par mais prximo. Assim 0,5 ser arredondado para
0 e 1,5 ser arredondado para 2.
4. CDate reconhece o formato de datas de acordo com a configurao local do
sistema. Voc deve informar o dia , ms e ano na ordem correta de acordo com
a configurao local.
Funes para tratar Strings
Vejamos agora as principais funes para manipular Strings : (Para maiores detalhes
leia o artigo: Strings um novo enfoque )
Para encerrar com as funes intrnsecas abaixo temos algumas funes teis:
No artigo anterior voc foi apresentado s funes que o VB.NET oferece para
facilitar sua vida. Mas sempre vai ficar faltando alguma coisa ; embora o VB.NET
possua milhares de funes prontas para voc usar , com certeza no dia a dia voc
vai ter que criar sua prpria funo. Sem problema algum ! ; o VB.NET permite que
voc crie suas prprias rotinas e funes. isto que vamos mostrar agora.
Voc cria uma sub-rotina quando deseja realizar uma tarefa que vai ser repetida
muitas vezes ou se a mesma tarefa precisa ser usada em muitos programas. Com
isto voc esta agrupando o seu cdigo e tornando-o mais fcil de localizar e manter
pois basta voc invocar a sua sub-rotina para fazer o servio ao invs de ter que
escrever todo o cdigo novamente.
Para criar uma sub-rotina voc usa a palavra-chave - Sub - seguido do nome da sub-
rotina e dos parmetros que voc esta passando para ela. Os parmetros so
valores que voc passa para sub-rotina usar na realizao da tarefa que lhe foi
atribuda. A sub-rotina termina com a palavra-chave : End Sub. Vejamos como fica a
sintaxe:
Abaixo temos um exemplo de uma sub-rotina que multiplica dois nmeros inteiros x
e y e escreve o resultado no console:
Module Module1
Sub Main()
Console.WriteLine("Vou chamar a Sub-rotina : Multiplica com os parametros:
521 e 123.")
Console.WriteLine("Pressione algo para ver o resultado...")
Console.Read()
Multiplica(521, 123)
End Sub
Usando o mesmo exemplo podemos criar uma funo para multiplicar dois nmeros
inteiros e retornar o resultado. Assim:
Module Module1
Sub Main()
Console.WriteLine("Vou chamar a Funo : Multiplica c/parametros: 521 e 123.")
Console.WriteLine("Pressione algo para ver o resultado...")
Console.Read()
Console.Write("521 x 123 = " & Multiplica(521, 123))
Console.Read()
End Sub
Module Module1
Sub Main()
Dim raiz, angulo As Double
raiz = Math.Sqrt(100)
angulo = Math.Cos(1.12)
O uso dos parmetros no obrigatrio nas sub-rotinas nem nas funes , assim ,
voc pode definir uma funo sem parmetros, mas deve definir o tipo de valor que
ser retornado:
Module Module1
Sub Main()
Dim Numero As Integer = 100
Console.WriteLine("Valor de 'Numero' ANTES de chamar a sub-rotina: " & Numero)
Console.Read()
MudaValorParametro(Numero)
End Sub
At agora usamos a palavra-chave Dim para declarar uma varivel . Porm podemos
declarar variveis fora das rotinas e funes e assim torn-las acessveis a outras
rotinas. Para fazer isto podemos usar as palavras-chave Public e Private:
1. Public - As variveis so visveis por toda a aplicao.
2. Private - As variveis so visveis dentro do mdulo ou classe onde foram
declaradas.
Podemos usar as palavras-chave acima tambm para definir o escopo de funes e
rotinas. Da mesma forma temos para funes e sub-rotinas:
1. Public - A rotina pode ser chamada de qualquer parte de sua aplicao. o
padro quando no se informa nada.
2. Private - A rotina pode ser chamada somente por outra rotina dentro do
mesmo mdulo ou classe onde esta definida.
Module Module1 Module Module1
Sub main() Sub main()
contador1() contador1()
contador2() contador2()
End Sub End Sub
Sub contador2()
Dim contador As Integer Sub contador2()
For contador = 100 To 1000 For contador = 100 To 1000
Console.WriteLine(contador) Console.WriteLine(contador)
Next Next
End Sub End Sub
End Module End Module
varivel contador tem escopo local : as
varivel contador tem escopo global:
variveis so visveis somente em cada
visvel por ambas as sub-rotinas.
sub-rotina . declara dentro de cada
declarada fora das rotinas.
rotina.
Classes
As classes so o foco principal da OOP , em uma classe temos um tipo de dados que
oferece alguma funcionalidade. No VB.NET uma classe declarada usando a palavra-
chave : Class .
Class Aluno
As sub-rotinas e funes so
chamados de mtodos. As regras
Public FaaAlgumaCoisa()
usadas para dar nome aos mtodos
MsgBox " Ol Pessoal ", so as mesmas que explanamos em
End Sub Nota1.
End Class
Outro tipo de membro de uma classe so os campos. Damos nomes aos campos
usando a seguinte regra: somente o primeiro caractere do nome da classe deve ficar
em caixa baixa , os demais primeiros caracteres das palavras concatenadas para
formar o nome do campo devem ficar me caixa alta. Ex: nomeAluno , salarioIntegral
, etc. Vamos criar dois campos para classe Aluno :
Instanciando um objeto
Uma classe um modelo de uma entidade que a classe representa. Para usar um
campo , mtodo ou qualquer outro membro de uma classe voc vai precisar tornar a
classe em um objeto . Na linguagem OOP um objeto uma instncia de uma classe ;
assim para criar um objeto temos que instanciar o objeto a partir de uma classe.
Vamos mostrar como fazer isto com a classe aluno:
Nota: poderamos ter usado uma sintaxe diferente para instanciar o objeto , fazendo
isto em duas etapas :
Imports System
Membros Estticos
Na OOP existe um tipo especial de membro chamado membro esttico - static - no
VB.NET tambm usamos o termo Shared . Um membro esttico aquele que pode ser
acessado sem ser necessrio fazer a instncia do objeto , isto , eles esto sempre
disponveis , basta pegar e usar. Vamos mostrar como aplicar este conceito na nossa
classe Aluno:
System.Console.WriteLine(NotaFinal.N
ota2)
End Sub
End Class
Nota: A plataforma .NET possui muitos membros estticos. Voc usou um sem
perceber . Quer ver s ? Quando criamos a classe a aluno , usamos o mtodo
WriteLine da classe console para exibir as notas , pois bem , acessamos Writeline
sem ter que instanciar o objeto System.Console.
Classes - Construtor
O que um Construtor ? Um construtor , um mtodo especial que deve estar
presente em uma classe para que a classe possa ser instanciada. Um construtor
tambm usado para inicializar as variveis membros da classe.
No VB.NET este mtodo usado com o nome de New. Ora , ns no criamos a nossa
classe Aluno com membros e mtodos e ela no esta funcionando ??? Eu no me
lembro de ter criado nenhum construtor para a nossa classe Aluno , no entanto ela
esta funcionando normalmente. Sabe porque ? Por que quando no definimos um
mtodo construtor o VB.NET cria um construtor padro automaticamente para ns.
Quando voc instancia um objeto usando a palavra-chave New o construtor da
classe chamado automaticamente e se voc definir um construtor para sua classe
ele que ser chamado.
Ento um construtor um mtodo que controla a inicializao de um objeto e voc
pode us-lo para realizar as operaes necessrias incializao de um objeto.
O VB.NET permite que voc crie uma rotina Sub New() dentro da sua classe para
criar um construtor. O construtor executado apenas uma vez quando voc criar a
instncia do objeto. Veja no exemplo abaixo a criao de um construtor para nossa
classe Aluno.
System.Console.WriteLine(notaExa
me)
End Sub
End Class
Herana
Agora o VB.NET possui herana . Mas o que herana ? No !!! no uma fortuna que
voc recebe de um parente distante !!! Herana uma caracterstica que permite que
voc extenda uma classe ,ou seja, voc pode criar novas classes e fazer com essas
classes herdem as caractersticas da classe origem. Ento voc pode acrescentar
novas propriedades e mtodos a estas classes.
Uma classe que herda as caracteristicas de outra chamada de classe-filha ou
subclasse . A classe que foi herdada chamada de classe-Pai ou classe base ou
superclasse. No VB.NET usamos a declarao inherits para implementar a herena. O
VB.NET no suporta herana mltipla , assim uma classe derivada pode ter uma
nica classe base.
Algumas consideraes sobre herana:
Todas as classes declaradas podem ser herdadas. Se voc no quer permitir
que uma classe seja herdvel inclua na declarao da classe a palavra-chave :
NotInheritable. A sintaxe a seguinte :
Class Teste
Class Teste: Inherits Aluno
Inherits Aluno
End Class
End Class
Sobrecarga
Um mtodo pode ser uma rotina ou funo , a diferena que a funo ir retornar
um valor e a rotina no , mas tanto as rotinas como as funes aceitam argumentos
que voc passa para o mtodo realizar uma operao. Geralmente voc d um nome
caracterstico a uma funo ou rotina de forma a poder identific-la. Ex: calculaSoma
, calculaProduto , ...
Existem situaes no entanto onde os mtodos que precisamos usar fazem
operaes idnticas mas aceitam argumentos diferentes. Por exemplo : voc pode
precisar de um mtodo que imprima uma string e precisar que o mesmo mtodo
imprima um valor numrico inteiro.
Voc poderia criar dois mtodos com nomes diferentes : ImprimeString e
ImprimeNmero . Mas na verdade os mtodos esto fazendo a mesma coisa : usando
o mtodo Print para imprimir o argumento.
O VB.NET, como toda boa linguagem orientada a objetos que se preze, permite que
tenhamos mltiplos mtodos com o mesmo nome mas com uma lista de argumentos
diferentes. A isto chamamos : Sobrecarga ou Overloading.
Para indicar isto no VB.NET incluimos a palavra-chave Overloads na primeira parte
da assinatura do mtodo. (A assinatura o nome do mtodo).
Nota: O uso da palavra-chave Overloads opcional e voc pode ter mtodos com o
mesmo nome sem usar Overloads. Veja abaixo um exemplo de sobrecarga.
Module Module1
Imports System
Public Sub Main()
Class Calculadora
Dim contador As Calculadora
contador = New Calculator()
Overloads Public Function Soma(a As Integer, b
'passando dois argumentos :
As Integer) As Integer
inteiros
Soma = a + b
Console.WriteLine(contador.So
End Function
ma(1, 5))
'passando dois argumentos :
Overloads Public Function Soma(a As Double, b As
double
Double) As Double
Console.WriteLine(contador.So
Soma = a + b
ma(1.3, 5.9))
End Function
End Sub
End Class
End Module
Usando os mtodos
A classe calculadora com dois mtodos mostrando o
sobrecarregados
conceito da sobrecarga
End Class
Sobreposio
J falamos sobre herana no VB.NET e para entender sobrecarga voc precisa ter os
conceitos sobre herana. Relembre em VB.NET - Primeiros passos - Conceitos - V ) .
Quando uma classe herda mtodos de outra classe pode ser que seja preciso
sobrepor alguns dos mtodos herdados , ento , se voc quiser implementar um
mtodo que foi herdado(da classe pai) de maneira diferente na que herdou(classe
filha) vai estar usando sobreposio ou overriding.
No VB.NET indicamos que um mtodo passvel de sobreposio usando a palavra-
chave Overridable na classe pai (classe base) e a seguir na classe filha declaramos
novamente o mtodo com a palavra-chave Overrides. Assim temos que :
Overridable - declara que o mtodo pode ser sobreposto nas classes que
herdarem da classe base
Overrides - indica que o mtodo da classe filha ir sobrepor o mtodo da
classe pai.
Vamos a um exemplo :
End Class
End Class
Para que um mtodo da classe pai no possa ser sobreposto usamos o modificador -
NotOverridable.
J, para definir que um mtodo seja obrigatoriamente sobreposto em uma classe
filha usamos a palavra-chave - MustOverride.
Classes Abstratas
Pode acontecer que ao escrever um mtodo para uma classe voc no saiba como ele
vai ser implementado. Neste caso, a implementao ser feita pela classe que herdar
o mtodo (a classe filha).
Pode acontecer tambm que voc saiba que um determinado mtodo ser
sobreposto com certeza na classe filha; ento por que definir sua implementao se
ela no ser usada ?.
Nestes casos voc apenas define a assinatura do mtodo e deixa a definio por
conta da classe ir herdar a classe pai.
Estas classes so ento chamadas classes Abstratas e o mtodo que voc no
implementou chamado de mtodo abstrato.
Um mtodo abstrato identificado pelo modificador - MustOverride - , e, a classe que
possui este modificadoor no pode ser instanciada atravs da palavra chave New.
Vamos a um exemplo:
Imports System
Public x As Integer = 9
Public y As Integer = 0
End Class
Vamos agora criar uma classe que dever extender a classe abstrata ao fazer isto
deveremos fornecer a implementao para todos os mtodos que precisam ser
sobrepostos.
Class Circulos: Inherits Formas Class Linhas: Inherits Formas
Tanto a classe Circulos como a classe Linhas herdam da classe Formas e por isto
precisam implementar a classe desenho.
Interfaces
Uma interface parecida com uma classe abstrata; a diferena que uma classe
abstrata pode possuir mtodos que no estejam implementados e pode possuir
mtodos que estejam implementados.
Uma interface somente possui mtodos que no possuem implementao.
Uma interface possui somente mtodos que no esto implementados e que devem
ser implementados pela classe que usar a interface.
Como o VB.NET no suporta herana mltipla as interfaces permitem que uma classe
extenda mltiplas interfaces contornando o problema (se que isto um problema ).
Para implementar uma interface o VB.NET usamos o modificador - Implements .
As interfaces so declaradas usando a palavra-chave - Interface. Geralmente o nome
dado a uma interface comea com a letra I. Podemos ter duas sintaxes para o uso
com interfaces:
- Uma interface no VB.NET no pode conter campos , somente pode ter mtodos ,
propriedades e eventos. Todos os membros de uma interface so pblicos e no
podem usar um modificador de acesso.
- Na classe que implementa a interface , cada implementao do mtodo precisa
especificar o mtodo da interface que ele implementa usando a palavra Implements
seguido pelo nome da interface o nome do mtodo.
- O nome da interface e o nome do mtodo so separados por dois pontos.(:)
Imports System
Interface IForma
Sub Desenho()
End Interface
Class Linha
Implements IForma
End Class
A classe Linha pode ser instanciada sem problemas ; j a interface , assim como as
classes abstratas no podem ser instanciadas.(Usando o operador New)
Frmulrios : Conceitos Bsicos
No VB.NET
basta alterar a
propriedade
IsMDIContainer
do formulrio
para True , e
pronto ! , temos
um formulrio
MDI.
Para indicar que um formulrio FILHO de um formulrio MDI Pai basta de definir
sua propriedade MdiParent = Me , indicando que ele pertence ao formulrio MDI Pai
atual.
No evento Click do boto de comando - Criar Formulrios Filhos - insira o cdigo
abaixo :
End Sub
End Sub
Executando o projeto e clicando em cada um dos botes de comando , vamos ver a
figura como abaixo exibindo os formulrios FILHOS exibidos:
b- if < condio #1 > then [ cdigo #2 ] Else [ cdigo #3 ] Ex: If hora > 12 then
msg="Boa Tarde" Else msg="Bom dia"
Operadores de comparao
Geralmente nas condies usamos expresses de comparao onde duas expresses
no booleanas utilizam um operador para realizar uma comparao. Os operadores
disponveis so :
Operadores Lgicos
Os operadores lgicos trabalham com expresses ou valores booleanos e retornam
um resultado booleano ( Verdadeiro / Falso , Sim / No ). Nesta categoria temos os
seguintes operadores :
O lao For Each...Next idntico ao lao For...Next mas executa o bloco de cdigo
para cada elemento em uma coleo , ou invs de executar um determinado nmero
de vezes. Sua sintaxe :
Ex:
Do [ {While | Until}
<expresso >
- <expresso> - qualquer expresso numrica ou de
[bloco de cdigo] string avaliada pelo lao
Loop
[ cdigo ] [ cdigo ]
Loop Loop
Do
[Cdigo #1}
Nota: se a expresso da condio for Null o VB.NET tratar a condio como False.
Voc deve tomar cuidado com o seu cdigo dentro dos laos pois isto pode afeta o
desempenho de sua aplicao. Abaixo algumas dicas para ajudar a voc ter um
cdigo rpido:
Evite fazer chamadas a funes dentro de laos
Tenha sempre uma condio de sada de um lao
No torne a condio de sada de um lao muito complexa pois ele precisa ser
avaliada a cada passo
Ao utilizar expresses booleanas coloque a parte mais simples da expresso
do lado esquerdo
Lao Infinito - Um lao infinito um lao que executa o cdigo no seu interior e no tem
condio de sada , ou seja, o cdigo ser executado infinita vezes...
Dica: Se por um erro de lgica seu cdigo entrar em um lao infinito use as teclas
CTRL+Break para encerr-lo. Abaixo um exemplo de um lao infinito:
Dim i as integer = 0
End While
Try-Catch-Finally
Try
'Cdigo que pode gerar(levantar) um erro.
Catch
'Cdigo para tratamento de erros.
Finally
'Cdigo de execuo obrigatria.
End Try
Obs: O VB.NET ainda mantm , por questes de compatibilidade , a sintaxe : "On
Error Goto" e voc ainda pode us-la mas prefira usar a estrutura try-catch.
A estrutura try-catch-finally mais poderosa que a sintaxe anterior pois alm de
permitir a voc fazer um aninhamento de vrios tratamentos de erros na mesma
estrutura , torna o cdigo mais fcil de ler e manter.
Vamos mostrar na prtica o que acabamos de afirmar:
1- Crie uma nova aplicao do tipo Console no Visual Basic.NET
2- No procedimento Sub Main() insira o cdigo abaixo. Este cdigo declara e
inicializa trs variveis ; a inicializao da varivel k ir causar um erro pois estamos
efetuando uma diviso por zero.
Sub Main()
'Este cdigo gera um erro/exceo
Console.WriteLine("Vamos dividir 10 por 0 para ver o que acontece...")
Console.WriteLine()
Dim i As Integer = 10
Dim j As Integer = 0
Dim k As Integer
Vamos agora usar try-catch para tratar o erro. Primeiro vamos inserir o cdigo
suspeito de gerar o erro no bloco try e se ocorrer um erro vamos trat-lo no bloco
catch. Veja como fica uma possvel utilizao para o caso:
Sub Main()
'Este cdigo gera um erro/exceo
try
Console.WriteLine("Vamos dividir 10 por 0 para ver o que
acontece...")
Console.WriteLine()
Dim i As Integer = 10
Dim j As Integer = 0
Dim k As Integer
catch
End Try
End Sub
Observe que no usamos o bloco finally , e que encerramos o bloco com a clusula -
End Try.
Se voc quiser , pode usar o bloco finally para executar um cdigo obrigatrio. Neste
exemplo vamos incluir o bloco finally sempre executando o cdigo :
Console.ReadLine()
Dim i As Integer = 10
Dim j As Integer = 0
Dim k As Integer
Try
k=i\j
Catch exc As Exception
Console.WriteLine("Ocorreu um erro !")
Finally
Console.ReadLine()
End Try
Try
i+ = 1
k=i/j
Catch exc As DivideByZeroException
Console.WriteLine("Erro: Diviso por zero")
Catch exc As OverflowException
Console.WriteLine("Erro: Overflow")
Catch exc As Exception
Console.WriteLine("Error: " & exc.Message)
Finally
Console.ReadLine()
End Try
Ento esquea o velho - On error go to - e passe a usar o bloco try-catch-finally ; a
melhor maneira de tratar excees em seu cdigo.
MessageBOX
A classe Messagebox exibe textos em uma caixa de dilogo e um conjunto de
botes. Ela possui somente um mtodo esttico ; o mtodo Show. Este mtodo
aceita 6 parmetros principais diferentes e usar todos no obrigatrio. Podemos
ter at 12 tipos de sobreposies para as vrias combinaes de parmetros. A
seguir a lista de parmetros:
Parmetro Descrio
Text Representa a mensagem que voc vai exibir. obrigatrio.
Caption Determina a barra de ttulo que ser exibida.
Controla os botes exibidos na caixa de mensagem. Seus valores
podem ser:
Buttons Exemplo de uso:
MessageBoxButtons.AbortRetryIgnore - exibe os
botes : Anular , Repetir e Ignorar
Controla qual figura ser exibida junto a mensagem. O valores
possveis so :
Options
ADO.NET
O ADO.NET atual pode acessar dados de trs maneiras : OLE DB , SQL e ODBC
(implementado mais recentemente). Cada objeto possui uma verso para cada uma
das maneiras aqui mencionadas ; assim temos o objeto OleDataAdapter e
SqlDataAdapter . Abaixo uma figura ilustrando isto:
Como voc j deve ter desconfiado , o objeto Connection tm a funo de gerar uma
conexo com uma fonte de dados sendo portanto o objeto fundamental no acesso a
dados.
Para estabelecer uma conexo com uma fonte de dados o objeto Connection usa a
propriedade ConnectionString que a string de conexo que dever ser informada
para que a conexo seja efetivamente aberta.
Aps realizada a conexo com a fonte de dados podemos usar objetos para receber e
enviar dados para a fonte de dados , dentre estes objetos podemos citar : Command
e DataAdapter.
Agora vamos incluir o cdigo que ir incluir o registro no banco de dados no evento
Click do boto de comando conforme abaixo:
conn.ConnectionString =
Cria a string de conexo usando OLE
"Provider=Microsoft.Jet.OLEDB.4.0;Data
DB
Source=" & TextBox1.Text
cmd.CommandText = "Insert into Clientes Inclui um registro na base de dados
Values (11,'Teste De Incluso','Rua Teste no usando uma instruo SQL - Insert
10','061-123456','10/11/1965')" Into Values
Dim SQLString as String = "Select * from Clientes Where Codigo > 100"
Dim SQLString as String = "Select * from Clientes Where Codigo > 100"
Dim cmd As new SqlCommand
cmd.CommandText = SQLString
cmd.Connection = conexao
Para receber e manipular os dados retornados pelos mtodos acima precisamos usar
os objetos DataReader : OledbDataReader e SqlDataReader.
Objetos DataReader
Os objetos DataReader uma das maneiras mais fceis para ler os dados retornados
pelos objetos Command . Eles permitem acessar e percorrer os registros no modo de
somente leitura e somente para frente - forward-only . No oferecem acesso
desconectado e no permitem alterar ou atualizar a fonte de dados original sendo
usado para obter rapidamente dados de apenas leitura. Apresenta poucos recursos
mas seu desempenho muito melhor do que o oferecido pelos DataSet.
End Sub
For i = 0 To leitor.FieldCount - 1
ListView1.Columns.Add(leitor.GetName(i).ToString, 110, HorizontalAlignment.Left)
Next
ListView1.View = View.Details
Do While leitor.Read()
Dim novoitem As New ListViewItem()
novoitem.Text = leitor(0)
For i = 1 To leitor.FieldCount - 1
If leitor(i) Is DBNull.Value Then
novoitem.SubItems.Add(" ")
Else
novoitem.SubItems.Add(leitor.Item(i).ToString)
End If
Next
ListView1.Items.Add(novoitem)
Loop
End Sub
Objetos DataTable
Se voc conhece um pouco de ADO j sabe que ela uma tecnologia de acesso a
dados ideal para ambientes de redes locais , mas quando pensamos em aplicaes
distribudas na Internet enfrentamos os seguintes problemas :
1. A conexo no estvel
2. A transmisso de dados lenta
3. O acesso concorrente pode chegar a milhares de usurios.
A ADO.NET j foi criada para trabalhar com o acesso desconectado aos dados e faz a
conexo com a fonte de dados atravs de um objeto DataAdapter ( SqlDataAdapter e
OleDbDataAdapter) e no atravs de um provedor OLE DB como a ADO , com isto o
desempenho otimizado.
A ADO tenta resolver estes problemas fornecendo um modelo onde podemos at usar
o objeto Recordset para acesso a dados desconectado, onde os dados so
gerenciados em memria . Quando se trata de acesso a dados o objeto Recordset a
principal ferramenta que a ADO oferece , , o problema que o objeto Recordset
representa uma nica tabela de dados , e se voc precisar trabalhar com dados de
mais de uma tabela vai ter que recorrer a SQL.
No quesito de dados basta dizer que enquanto a ADO se baseia na COM a ADO.NET
se baseia em XML. Dados no formato XML so mais fceis de trafegar pela rede
mundial , visto ser apenas texto , e no precisa de converso alguma.
O objeto DataTable
3- No evento Click do boto - Button - vamos inserir o cdigo que cria o objeto
DataTable:
'campo codigo
'Criamos uma coluna(Datacolumn)para o campo cdigo definindo o tipo
(DataType)
'e nome da coluna (ColumnName)
dcColuna = New DataColumn()
dcColuna.DataType = System.Type.GetType("System.Int32")
dcColuna.ColumnName = "Codigo"
dcColuna.ReadOnly = True
dcColuna.Unique = True
dtTesteTabela.Columns.Add(dcColuna)
'campo nome
'Criamos uma coluna(Datacolumn)para o campo nome definindo o tipo
(DataType)
'e nome da coluna (ColumnName)
dcColuna = New DataColumn()
dcColuna.DataType = System.Type.GetType("System.String")
dcColuna.ColumnName = "Nome"
dcColuna.ReadOnly = False
dcColuna.Unique = False
dtTesteTabela.Columns.Add(dcColuna)
'campo endereco
'Criamos uma coluna(Datacolumn)para o campo nome definindo o tipo
(DataType)
'e nome da coluna (ColumnName)
dcColuna = New DataColumn()
dcColuna.DataType = System.Type.GetType("System.String")
dcColuna.ColumnName = "Endereco"
dcColuna.ReadOnly = False
dcColuna.Unique = False
dtTesteTabela.Columns.Add(dcColuna)
Objetos DataView
Usamos o DataView para mostrar uma viso dos dados contidos em um DataTable ,
com isto voc pode ter vrios DataViews ligados a um mesmo DataTable , sendo que
cada um exibe um viso diferente dos dados. O objeto DataTable possui um
DataView padro que acessado atravs da propriedade DefaultView.
Criando um DataView
Existem duas maneiras de voc criar um DataView :
1. Usando o construtor DataView.
2. Criar uma referncia para a propriedade DefaultView de um objeto DataTable .
(Se voc usar o construtor DataView sem argumentos voc no poder usar o
DataView at que tenha definido a propriedade Table.)
1- Abaixo temos um trecho de cdigo que mostra como criar um DataView usando o
construtor .
Dim custDV As DataView = New DataView(custDS.Tables("Customers"), "Country =
'USA'", "ContactName", DataViewRowState.CurrentRows)
2- A seguir um exemplo que demonstrar como obter uma referncia para o DataView
padro do DataTable usando a propriedade DefaultView.
Dim custDV As DataView = custDS.Tables("Customers").DefaultView
Nota:
Embora um DataView seja por padro uma viso de somente leitura dos dados , voc
pode usar um DataView para incluir, excluir ou modificar linhas de dados na tabela
relacionada. Para fazer permitir isto basta definir como True as propriedades :
AllowNew , AllowEdit e AllowDelete.
Se AllowNew for definido como True voc pode usar o mtodo AddNew do DataView
para criar uma nova DataRowView , quando o mtodo EndEdit do DataRowView for
chamado a nova linha ser incluida na tabela relacionada. Se o mtodo CancelEdit
for invocado a nova linha ser descartada. Quando o mtodo EndEdit for invocado as
alteraes so aplicadas a tabela relacionada e podem ser mais tarde confirmadas
ou rejeitada pelos mtodos : AccepChanges ou RejectChanges.
Agora vamos mostrar um exemplo usando DataView para filtrar e ordenar os dados
de um tabela exibidos em um controle DataGrid.
O cdigo que cria uma conexo com as tabelas Authors e Titles do banco de dados ,
cria o DataSet e exibe os dados no DataGrid o seguinte:
DataGrid1.CaptionText = "Autores"
da1.Fill(ds, "Autores")
DataGrid1.DataSource = ds
DataGrid1.DataMember = "Autores"
End Sub
DataGrid2.CaptionText = "Titulos"
da2.Fill(ds, "Titulos")
DataGrid2.DataSource = ds
DataGrid2.DataMember = "Titulos"
End Sub
da1.Fill(ds, "Autores1")
Dim dv As New DataView(ds.Tables("Autores"))
Este cdigo ir filtrar os dados e exibir somente os autores cuja coluna Au_ID for
menor que 15 ( dv.RowFilter = "Au_ID <= 15" ). Criamos o DataView e associamos o
mesmo ao DataGrid1.
da2.Fill(ds, "Titulos1")
Dim dv As New DataView(ds.Tables("titulos"))
dv.Sort = "Title"
DataGrid2.DataSource = dv
End Sub
Objetos DataSet
Vamos falar agora sobre DataSet. Se voc j se aventurou a criar algum programa
para banco de dados usando o Visual Basic j ouviu pelo menos falar no objeto
Recordset . Afinal era ele que permitia o acesso , exibio e a manipulao dos dados
. O objeto DataSet veio para substituir com vantagens o objeto recordset e guarda
poucas similaridades com o objeto recordset. Enquanto o objeto recordset
representa uma coleo de tabelas de dados O objeto DataSet representa uma cpia
do banco de dados em memria.
Vou mostrar exemplo onde iremos criar vrios objetos em tempo de execuo
usando um DataSet e um DataGrid acessando as tabelas Fornecedores e Produtos no
banco de dados Northwind.mdb. O relacionamento entre as tabelas Fornecedores e
Produtos mostrada abaixo:
Private ds As DataSet
Private dg As DataGrid
3- Vamos usar o evento Load do formulrio form1.vb para iniciar os objetos
DataGrid e fazer a conexo com a base de dados. Para isto vamos criar uma sub-
rotina que ser disparada assim que o evento ocorrer:
Try
Dim strconexao As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:\teste\Northwind.mdb"
Dim conn As New OleDbConnection(strconexao)
Dim dafornecedores As OleDbDataAdapter = New
OleDbDataAdapter()
dafornecedores.TableMappings.Add("Table", "Fornecedores")
conn.Open()
Dim cmfornecedores As New OleDbCommand("Select * from
fornecedores", conn)
cmfornecedores.CommandType = CommandType.Text
dafornecedores.SelectCommand = cmfornecedores
ds = New DataSet("Fornecedores")
dafornecedores.Fill(ds)
Dim daprodutos As OleDbDataAdapter = New OleDbDataAdapter()
daprodutos.TableMappings.Add("Table", "Produtos")
Dim cmdprodutos As OleDbCommand = New
OleDbCommand("Select * from Produtos", conn)
daprodutos.SelectCommand = cmdprodutos
daprodutos.Fill(ds)
conn.Close()
Dim dr As DataRelation
Dim dc1 As DataColumn
Dim dc2 As DataColumn
dc1 = ds.Tables("Fornecedores").Columns("CdigoDoFornecedor")
dc2 = ds.Tables("Produtos").Columns("CdigoDoFornecedor")
dr = New System.Data.DataRelation("Produtos do Fornecedor", dc1,
dc2)
ds.Relations.Add(dr)
Catch erro As Exception
MsgBox("Erro")
End Try
End Sub
Quando voc executar o projeto ir obter uma tela parecida com a da figura abaixo:
conexao.Open()
'preenche o dataset
adaptador.Fill(dsbiblio,
"Authors")
conexao.Close()
custConn.Open()
orderConn.Open()
custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")
custConn.Close()
orderConn.Close()
Um objeto DataSet composto por uma coleo de objetos DataTable , cada um dos
objetos mapeia uma estrutura de uma tabela com campos e registros. Cada registro
de um objeto DataTable representado por um objeto DataRow , e , uma coleo de
objetos DataRow compe a coleo RowsCollection que formada pela propriedade
Rows.
Como o objeto DataSet no tem conexo com um banco de dados podemos usar suas
propriedades para preencher um DataSet via cdigo. Sim isto mesmo , podemos
criar objetos de banco de dados como qualquer outro objeto . Vamos mostrar isto no
cdigo abaixo :
O cdigo acima mostra como podemos criar um DataSet e preench-lo com dados de
duas tabelas , tudo isto via cdigo. Abaixo temos o resultado da apresentao da
tabela Alunos e da tabela Notas. Basicamente fizemos o seguinte:
criamos um objeto DataSet
a seguir criamos um objeto DataTable e o inclumos na coleo Tables do
DataSet usando o mtodo Add
O objeto DataTable expe uma coleo de objetos DataColumn na coleo
Columns . As colunas so includas na tabela usando o mtodo Add
Depois que criamos a estrutura das tabelas inclumos os dados em cada uma
delas
No caso da tabela Notas criamos um objeto DataRow , a seguir inclumos uma
nova linha usando o mtodo NewRow que em seguida e adicionada na tabela
via mtodo Add
Ento cada elemento includo na tabela atravs da coleo Item
Abaixo o resultado do processamento do cdigo acima , expondo as tabelas e os
dados em um componente DataGrid.
Dim dt As DataTable
Dim dc As DataColumn
Dim pk As DataColumn
Dim dr As DataRow
For Each dt In myDataSet.Tables
ListBox1.Items.Add(" O DataSet possui : " &
myDataSet.Tables.Count & " tabela ")
ListBox1.Items.Add(" A tabela " & dt.TableName & " tem " &
dt.Rows.Count & " linhas ")
ListBox1.Items.Add(" Sua estrutura a seguinte : ")
onde os parmetros so :
foundRows = customerTable.Select()
Dim r As DataRow
Dim c As DataColumn
Os objetos DataSet e DataTable podem ser ligados a objetos DataGrid para fornecer
uma forma simples de visualizar dados. Isto feito atravs da chamada do mtodo
SetDataBinding do objeto DataGrid passando o objeto que ser vinculado ao grid. A
sintaxe do mtodo SetDataBinding :
Public Sub SetDataBinding( _
ByVal dataSource As Object, _
ByVal dataMember As String )
Os parmetros so :
dataSource
A fonte de dados a ser exibida no grid. Pode ser um objeto DataSet ou
DataTable.
dataMember
Se o objeto passado no parmetro dataSource tiver mltiplas tabelas (Ex:
DataSet) , o parmetro dataMember identifica a tabela a ser exibida no
Datagrid. Se o objeto for um DataTable no parmetro dataSource parameter, o
parmetro dataMember ir conter ou uma string vazio ou Nothing.
Nota: Criamos um novo projeto do tipo Windows Application . Voc deve inserir um
componente DataGrid no formulrio padro e no esquecer de importar o namespace
System.Data.OleDb , pois estamos acessando um banco de dados Access
( Northwind.mdb )
If Not IsPostback Then 'verdade a primeira vez que o Browse carrega a pagina
' vincula o grid aos dados
grdClientes.DataSource = GetDataSource( )
grdClientes.DataBind( )
End If
End Sub
'fecha a conexao
cn.Close( )
Return dv
End Function
</script>
<html>
<body>
</body>
</html>
Vou usar como exemplo o acesso a uma base de dados Access Northwind.mdb
presente no diretrio c:\teste. Vamos acessar a tabela Produtos.
nota: O banco de dados Northwind.mdb que eu estou usando foi alterado para este
exemplo:A tabela Produtos tem a seguinte estrutura:
a - Inicie um novo projeto no Visual Studio.NET com as seguintes caractersticas
(sinta-se a vontade para alterar a seu gosto.)
1. Project Types : Visual Basic Projects
2. Templates : Windows Application
3. Name : DataSet_Acesso
4. Location : c:\vbnet \dataset_Acesso
b- Na caixa de ferramentas selecione a aba - Data - e inclua o componente -
OleDbDataAdapter - no formulrio padro - form1.vb.
Nota: Voce pode clicar no boto - Query Builder - para criar a instruo SQL.
Observe que esto visveis no formulrio os componentes
1. OleDbConnection1: responsvel pela conexo ao banco de dados;
2. OleDbDataAdapter1: responsvel pela comunicao DataSet e a base de
dados;
O projeto agora possui uma classe DataSet e uma instncia dela no formulrio
conforme a figura mostrada abaixo:
Agora que j temos um DataSet no projeto vamos criar um formulrio com alguns
botes que implementam as seguintes funcionalidades :
Preencher o DataGrid -
Excluir Dados -
Pesquisar Dados -
Atualizar dados -
Atualizar preo dos produtos -
No formulrio vamos incluir um componente DataGrid , alguns botes de comando ,
um GroupBox e algumas Labels , conforme figura abaixo:
No componente DataGrid devemos definir as propriedades DataSource e
DataMembers assim :
1. DataSource = Produtos1
2. DataMember = Produtos
- Preenchendo o DataGrid
No evento Click do boto - Preenche DataGrid - vamos inserir o cdigo que preenche
o DataGrid com os dados. ( eu poderia fazer isto de forma automtica colocando o
cdigo no evento Load do formulrio.)
Private Sub
Button1_Click(B
yVal sender As
System.Object,
ByVal e As
System.EventAr
gs) Handles
Button1.Click
' Preenche o
DataSet
Produtos1.Clear(
)
OleDbDataAdapt
er1.Fill(Produtos
1)
End Sub
- Excluindo um registro
- Incluindo registros
Nota : Para incluir uma nova linha na tabela poderamos ter usado o cdigo abaixo.
Estamos fazendo isto no 'queixo duro' por questo de simplicidade. claro que
devemos respeitando a estrutura da tabela produtos , caso contrrio ocorrer um
erro.
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
- Atualizando a base de dados
' Insere um novo registro
Produtos1.Produtos.AddProdutosRow("Teste ", 10, 1, "1 caixa de teste",
3.33D, 200, 400, 250, False)
End Sub
O cdigo abaixo mostra como atualizar a base de dados com as alteraes feitas . No
evento Click do boto - Atualizar - insira o cdigo abaixo:
Nota : uma outra forma de fazer a atualizao seria usar somente o seguinte cdigo :
OleDbDataAdapter1.Update(Produtos1)
- Pesquisando Dados
Podemos alterar todos os registros da tabela usando um lao para percorrer cada
registro da mesma e alterar um campo desejado. No exemplo eu estou realizando um
reajuste no preo . O usurio informa o ndice e cada campo PreoUnitrio
reajustado segundo a formula :
Else
MsgBox("O valor do indice de reajuste invlido ! ", MsgBoxStyle.Exclamation, "indice de
reajuste")
End If
Voc esta percebendo como fcil trabalhar com DataSets desta forma. Graas aos
DataSets tipados isto possvel . Sim DataSets tipados. !!
Vejamos a seguir a comparao entre dois cdigos que acessam dados . Um usa
DataSets tipados e outro no tipado:
Alm de ser mais fcil de usar um DataSet tipado permite que voc use o recurso da
intellisense no seu cdigo ao usar o editor do Visual Studio. claro que haver
ocasies que voc vai ter que usar um DataSet no tipado .
Data Binding
- DataBinding
Complexa
- DataBinding Simples
DataSet
DataView
DataTable
DataColumn
Arrays
Nota:
a. A interface IList somente permite a vinculao em tempo de execuo . Para
poder usar a vinculao em tempo de desenvolvimento da aplicao voc ter
que implementar a interface IComponent.
b. Voc no pode fazer a vinculao a DataReaders nos formulrios Windows
(somente em formulrios Webs).
A plataforma .NET framework suporta a vinculao de dados Simples e a Complexa.
A vinculao de dados simples suportada por controles como TextBox ,
Label, etc. Nela somente um valor pode ser exibido pelo controle por vez.
(Interface IComponent)
Na vinculao de dados complexa , que suportada por controles como
DataGrid , ListView , ListBox , etc, mais de um valor pode ser exibido de uma
vez.(Interface IList)
Para tornar mais claro o conceito temos a seguir o fluxo bsico durante a vinculao
de dados:
- Temos aqui a
camada de
controles com
suas
propriedades
para vincular
dados
- A seguir temos
a coleo
DataBinding
composto pelos
objetos Binding
- Depois temos
o objeto
BindingContext
e o objeto
CurrencyManag
er ou o objeto
PropertyManage
r
No VB.NET os controles podem ter muitas propriedades que podem ser vinculadas a
uma fonte de dados. Cada propriedade databound possui um -0 objeto Binding
associado. Desde que um controle pode ter muitas objetos Binding, o controle possui
uma coleo (uma instncia da classe ControlBindingsCollection) de todos os objetos
Bindings. (Diferentes propriedades de um mesmo controle podem estar ligadas a
diferentes datasources.)
Nota: Para ver a lista de propriedades que um controle suporta para vinculao ,
clique no controle , a seguir na caixa de propriedades do controle localize
DataBindings e clique em Advanced. Voc ver uma janela com a lista de
propriedades como na figura a seguir:
Cada objeto Binding se comunica com um CurrencyManager ou PropertyManager. As
classes CurrencyManager e PropertyManager so derivadas da classe base
BindingManagerBase. O objetivo da classe BindingManagerBase manter a
concorrncia entre a fonte de dados e o controle. Das duas classes a classe
CurrencyManager usada quando a fonte de dados implementa a interface IList (
DataView, DataSet, ArrayList,etc.) A classe CurrencyManager pode ser usada para
vinculao simples ou complexa , porm a classe PropertyManager usada quando o
datasource uma instncia de uma classe definida pelo usurio. A propriedade dos
controles esta vinculada a propriedade exposta por este objeto e ela somente pode
ser usada para vinculao simples.
Geralmente voc pode usar a seguinte regra: Usar o CurrencyManager quando sua
classe um Container de dados e usar o PropertyManager quando quiser vincular um
controle a propriedades expostas pela sua prpria classe.
Como podemos ter um formulrio com muitos controles cada um vinculado a uma
fonte de dados diferente, precisamos de uma classe para gerenciar os objetos
CurrencyManager e PropertyManager. A classe BindingContext faz isto , e , cada
formulrio possui por padro um objeto BindingContext associado a ele. (Voc pode
criar outros objetos BindingContext no formulrio).
Resumindo:
Fluxo de dados padro Fluxo de dados usando Eventos A CurrencyManager expe trs
eventos :
1. CurrentChanged -
disparado quando o valor
vinculado sofre alterao.
2. PositionChanged -
disparado quando a
propriedade position foi
alterada.
3. Itemchanged -
disparado quando o item
atual foi alterado.
A seguir eu vou dar um exemplo prtico de como voc pode usar eventos para
controlar o fluxo de dados.
ADO.NET - Criando uma Cadastro de Clientes
Antes de iniciar este projeto voc vai precisar criar um local onde voc vai salvar seu
projeto. Rode o Visual Studio .NET ou o Visual Basic .NET e no menu File selecione a
opo New... ; a seguir selecione a opo Blank Solution :
A janela New Project ir surgir . Nela voc pode digitar o seu nome (ou
qualquer nome que queira informar) na caixa de texto Name e deixar todas
as demais configuraes com seus valores padres.
A seguir click no boto OK. Ao terminar uma pasta chamada Macoratti (ou
seu nome) ser criada no interior da pasta D:\vbnet.
Agora que voc terminou de criar uma soluo em branco (Blank Solution) , no menu
File , selecione a opo Add Project e a seguir New Project ..
Na janela Add New Project selecione em Project Types : Visual Basic Projects e em
Templates : Windows Application. A seguir informe o nome do projeto na caixa de
texto Name. (chamei o projeto de VisualizaDados). Com isto voc estar criando uma
nova pasta dentro de d:\vbnet\macoratti com o nome do projeto informado.
Vamos alterar o nome do formulrio padro - form1.vb - criado na Soluo. Selecione
o formulrio form1.vb e na janela Properties procure a propriedade File Name .
Informe a seguir o novo nome do formulrio - frmDados.vb. (no esquea de
informar a extenso .vb)
Na prxima janela clique no boto - New Connection ; Isto vai abrir a janela - Data
Link Properties ; Clique na aba - Provider - e selecione : Microsoft Jet 4.0 OLE DB
Provider. Isto vai permitir a conexo com um banco de dados Microsoft Access.
Existem uma lista de provedores com o qual podemos realizar conexes com
diferentes tipos de banco de dados ; SQL Server , Oracle , etc... Agora clique no boto
- Next >> para irmos para a janela propriedades da vinculao de dados:
- Na aba Connection onde
definimos um banco de dados .
Clique no botao ... e selecione o
banco de dados. Vou selecionar o
banco de dados Biblio.mdb
a prxima janela de dilogo permite a voc escolher uma consulta. Selecione Use
SQL statements e clique no boto Next>
Simple Query Language ou SQL. Na prxima janela precisamos definir o comando
SQL que dever conter o nome da tabela e os campos da tabela que desejamos
acessar e exibir em nosso programa. O formato da instruo SQL para seleo de
dados :
SELECT <campos> FROM <nome Tabela>
A janela - Add Table - exibe uma lista com todas as tabelas que nosso banco de
dados - Biblio.mdb contm. Selecione a tabela Clientes e clique no boto - Add ; a
seguir clique no boto - Close - . A janela do Query Builder ir tter a seguinte
aparncia conforme a janela abaixo:
-
Marcamos
os campos
que
desejamos
exibir na
consulta -
Endereco,
ID,
Nasciment
o , Nome ,
Telefone e
UF
- Clicando
no boto
OK
teremos a
consulta
montada e
exibida na
janela -
Query
Builder -:
Com isto completamos a incluso dos componentes necessrios para acessar o banco
de dados Access. Relembrando:
Data Adapter
Permite definir uma instruo Select para selecionar a tabela do banco de
dados e os campos que estaro disponveis. O objeto Data Adapter so usados
para trocar dados entre a fonte de dados e um dataset.
Data Connection
Permite definir um Data Provider (Database Engine) e nome do banco de
dados a ser acessado. Fornece as propriedades para estabelecer e modificar o
cdigo do usurio , a senha e configuraes da conexo. Um objeto Data
Connection includo automaticamente no seu projeto quando voc inclui um
Data Adapter.
Dataset
Armazena os registros da tabela em um banco de dados desconectado (cache
local). O DataSet nos d acesso aos registros em uma tabela na qual o
DataAdapter esta ligado. Iremos vincular caixas de textos e outros controles
aos campos expostos pelo DataSet de maneira a poder visualizar os registros
da tabela.
Podemos dar uma olhada nos dados da tabela Clientes. Para isto clique com o boto
direito do mouse sobre o objeto odaClientes e selecione a opo - Preview Data.... A
janela - Data Adapter Preview - ser exibida , e se voc clicar em - Fill DataSet - os
dados da tabela clientes sero exibidos conforme abaixo:(Voc no pode editar
registros nesta janela)
Criando o formulrio para exibir os dados
Vamos agora incluir no formulrio padro - frmDados.vb - os controles para poder
exibir os dados e efetuar a movimentao pelos registros. Vamos usar controles
Labels , TextBox , e Buttons. Na figura abaixo temos o layout do formulrio j pronto.
-Para os controles
Labels vamos usar o
nome padro e alterar
somente a propriedade
Text para exibir o
nome da etiqueta. (no
VB.NET o controle label
no possui mais a
propriedade Caption).
-Para os controles
TextBox vamos alterar
a propriedade Name de
cada um conforme
O formulrio tem sua propriedade Text definida para : abaixo:
Cadastro de Clientes e sua propriedade Icon definida para o
cone exibido.
- TxtID , TxtNome,
TxtEndereco,
TxtTelefone , TxtUF e
TxtNascimento
- Os controles buttons
tambm tero a
propriedade Name
alterada conforme
abaixo:
- Os botes de
movimentao:
btnInicio, btnAnterior,
btnProximo e btnFim
- Os botes de
operao : btneditar,
btnsalvar , btncancela,
btnincluir e btnexcluir
- Marque o campo ID
Se voc rodar o projeto agora ter os dados exibidos no formulrio. Antes de fazer
isto vamos incluir os botes de navegao para permitir que possamos nos
movimentar pelos registros.
Em cada boto alteramos a propriedade Name e a propriedade Image na qual
vinculamos imagens de seta para cada funcionalidade de movimentao. Clicando
duas vezes no boto - btnProximo - teremos ativado o evento Click ,nele inserimos o
seguinte cdigo:
'Incrementa a propriedade Position do BindingContext para se mover para o prximo
registro,
' No primeiro registro o valor de Position igual a zero.
Me.BindingContext(dsClientes, "Clientes").Position += 1
Agora vamos a um pouco de teoria para explicar como isto funciona. Afinal para que
serve esse tal de BindingContext.
Qualquer fonte de dados que voc vincula a um formulrio ou controle container
(picture box,group box, etc.) ser associado ao objeto CurrencyManager.
O objeto CurrencyManager gerencia a posio e tambm supervisiona as vinculaes
a fonte de dados. Existe um objeto CurrencyManager no formulrio para cada fonte
de dados que voc vincula a ele. Se todos os controles do formulrio estiverem
vinculados a uma nica fonte (Ex: Varios TextBox vinculados a mesma tabela como
no nosso projeto) ento eles iro compartilhar o mesmo objeto CurrencyManager.
H momentos , porm, quando os controles no formulrio estaro vinculados a fonte
de dados distintas. Neste caso haver mltiplos objetos CurrencyManager no
formulrio, cada um gerenciando o registro ou dado que esta sendo usado pelo
controle. Isto pode se tornar um pouco confuso. ai que entra o objeto
BindingContext. Cada formulrio Windows possui um objeto BindingContext.
O objeto BindingContext gerencia todos os objetos CurrencyManager no formulrio e
ajuda nos a navegar , incluir , excluir e editar registros em uma tabela. Ento
estamos usando o objeto BindingContext para fazer as seguintes tarefas:
navegar atravs dos registros (linhas) - incrementando e decrementando a
propriedade Position
Determinar o nmero total de registros na tabela - atravs de sua propriedade
Count ( que sempre igual ao nmero de registros na tabela)
Incluir e excluir registros da tabela usando os mtodos : AddNew e RemoveAt
Modificar o contedo dos registros usando os mtodos : EndCurrentEdit e
CancelCurrentEdit
Com isto em mente vamos mostrar o cdigo usado para os demais botes de
movimentao de registros: (Todos os cdigos esto inseridos no evento Click da
cada boto:)
1- ) Boto que vai para o registro Anterior: btnProximo
'Incrementa a propriedade Position property do objeto BindingContext para mover um
registro para frente.
Me.BindingContext(dsClientes, "Clientes").Position += 1
2-) Boto que vai para o registro anterior: btnAnterior
'Decrementa a propriedade Position property do objeto BindingContext para mover um
registro para trs.
Me.BindingContext(dsClientes, "Clientes").Position -= 1
3-) Boto que vai para o primeiro registro: btnInicio
'Define a propriedade Position do objeto BindingContext para 0 (vai par o primeiro registro)
Me.BindingContext(dsClientes, "Clientes").Position = 0
4-) Boto que vai para o ltimo registro: btnFim
'A propriedade Count property do objeto BindingContext igual o nmero de registros na
tabela.
' Definindo a propriedade Position do BindingContext para Count - 1 vamos para o ltimo
registro
Me.BindingContext(dsClientes, "Clientes").Position =
Me.BindingContext(dsClientes, "Clientes").Count - 1
Podemos executar a aplicao para ter uma viso do seu aspecto. Abaixo temos o
formulrio exibindo os dados e os botes de navegao.(as demais funcionalidades
iremos abordar adiante...)
Habilitando e desabilitando os botes de navegao
Para tornar nossa aplicao mais interativa precisamos incluir as seguintes
funcionalidades:
1. Quando o usurio estiver no ltimo registro os botes - btnProximo e btnFim-
devero ser desabilitados
2. Quando o usurio estiver no primeiro registro , os botes - btnAnterior e
btnInicio - devero ser desabilitados
3. Quando o usurio no estiver nem no ltimo nem no primeiro registro os
botes devem estar todos habilitados
Para incluir tais funcionalidades vamos usar o seguinte cdigo:
'Quando a propriedade Position igual a propriedade Count menos 1 (-1)
alcanamos o ltimo registro
' Vamos desabilitar os botes btnProximo e btnFim.
If Me.BindingContext(dsClientes, "Clientes").Position =
Me.BindingContext(dsClientes, "Clientes").Count - 1 Then
btnProximo.Enabled = False
btnFim.Enabled = False
Else 'Seno habilita os botes btnProximo e btnFim.
btnProximo.Enabled = True
btnFim.Enabled = True
End If
End Sub
Agora para tornar a rotina SetButtons uma rotina Delegate (que ser executada
sempre que a propriedade Position de Me.BindingContext mudar - vamos usar a
declarao - AddHandler. Assim :
AddHandler <event> AddressOf <delegate procedure>
Onde:
1. <event> o nome de um procedimento event existente.Quanto ele for
disparado a rotina <delegate procedure> chamada automaticamente.
2. <delegate procedure> o nome da rotina personalizada que chamada de
forma automtica quando <event> for disparado..
Agora ns precisamos encontrar um procedimento de evento que seja disparado
sempre que a propriedade Position mudar. Vamos usar o procedimento de evento
PositionChanged da classe BindingManagerBase.
Nota: A classe BindingManagerBase permite a sincronizao de todos os controles
vinculados em um formulrio Windows vinculados a uma mesma fonte de dados.
uma classe abstrata e intrnseca a todo o projeto que voc cria. por isto que
estamos usando uma rotina delegada. No temos acesso pois os procedimentos de
uma classe abstrata no esto acessveis.
Como a classe BindingManagerbase abstrata nos precisamos criar uma instncia
dela para acessar o seu procedimento de evento PositionChanged para fornecer ao
parmetro <event> da nossa declarao AddHandler. Para isto inclua o seguinte
linha de cdigo no evento Load do formulrio frmDados:
Dim bmClientes As BindingManagerBase =
Me.BindingContext(dsClientes, "Clientes")
Agora podemos fornecer o parmetro <event> a declarao AddHandler. Fazemos
isto assim:
AddHandler bmClientes.PositionChanged, AddressOf SetButtons
Isto torna nossa rotina SetButtons uma rotina delegada que ir ser chamada
automaticamente sempre que o evento PositionChanged da classe
BindingManagerBase for disparado .
Antes de testar a aplicao e os botes de navegao dos registros precisamos fazer
um ajuste para que quando o programa seja iniciado. Quando o programa for
executado pela primeira vez a propriedade Position do objeto BingindContext no
estar sofrendo alteraes a rotina SetButtons no ser invocada. Para forar isto
devemos colocar o seguinte cdigo no evento Load do formulrio:
'Quando o programa inicia a propriedade Position no alterada.
' Para forar isto precisamos fazer uma chamada manual a rotina
SetButtons(sender, e)
End Sub
Cdigo para Editar um registro
Private Sub btneditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btneditar.Click
'desabilita o boto de navegao para forcar o usuario a completar o processo de edicao
btninicio.Enabled = False
btnanterior.Enabled = False
btnproximo.Enabled = False
btnfim.Enabled = False
'define as propriedades ReadOnly dos textboxes para False para nao permitir edicao
txtNome.ReadOnly = False
txtEndereco.ReadOnly = False
txtUF.ReadOnly = False
txtNascimento.ReadOnly = False
txtTelefone.ReadOnly = False
'poe o foco no textobx nome
txtNome.Focus()
End Sub
Me.BindingContext(dsClientes, "Clientes").RemoveAt(Me.BindingContext(dsClientes,
"Clientes").Position)
End If
End Sub
Me.BindingContext(dsClientes, "Clientes").CancelCurrentEdit()
txtNome.ReadOnly = True
txtEndereco.ReadOnly = True
txtUF.ReadOnly = True
txtNascimento.ReadOnly = True
txtTelefone.ReadOnly = True
SetButtons(sender, e)
End Sub
'Usei o mtodo HasChanges do Dataset para estar certo de que o registro foi modificado antes
' de gastar recursos efetuando um Update na fonte de dados. HasChanges retorna True se
' alguma modificao foi feita.
If dsClientes.HasChanges() = True Then
'Para escrever as alteraes de um registro para o banco de dados voc deve chamar o
mtodo Update do DataAdapter
odaClientes.Update(dsClientes)
'Aps editar um registro voc precisa preencher o Data Adapter novamenmte. Antes de fazer
isto sempre limpe o Data Adapter
dsClientes.Clear()
'O mtodo Fill do Data Adapter preenche todos os datasets vinculados a ele
odaClientes.Fill(dsClientes, "Clientes")
End If
txtNome.ReadOnly = True
txtEndereco.ReadOnly = True
txtUF.ReadOnly = True
txtNascimento.ReadOnly = True
txtTelefone.ReadOnly = True
SetButtons(sender, e)
End Sub
Pronto !! terminamos o projeto. Agora s testar. Se voc testar vai perceber que
existem alguns problemas que eu no resolvi neste projeto:
Os botes Cancelar e Salvar no poderiam estar habilitados at que os botes
Editar ou Incluir fossem selecionados.
O boto Excluir no poderia estar habilitado enquanto o processo de edio ou
adio de um registro estivesse em andamento.