Академический Документы
Профессиональный Документы
Культура Документы
Vou criar uma pequena aplicao para cadastrar alunos usando o banco de dados Microsoft Access. O banco de dados Alunos.mdb ir conter uma tabela chamada Alunos que tem a seguinte estrutura:
Obs: Eu escolhi criar uma estrutura bem simples para no complicar o tutorial. Alm disso , nesta primeira etapa eu no vou utilizar camadas pois tutorial para iniciantes.
Criar banco de dados via Cdigo - Access , SQL Server Criando banco de dados e tabelas com o Access Tabelas: Trabalhando com tabelas
Nota: No VB5/VB6 tambm podamos criar banco de dados Access usando o VISDATA como Add-In no IDE do VB. Lembra ? Para lembrar leia o artigo :
y y SQL revisitado- Conceitos bsicos sobre SQL com exemplos prticos no Visdata. Criando um Banco de dados com o VisData,
Para saber como criar banco de dados usando o Microsoft Access ou o SQL Server 2000 leia os artigos: y y y Criando banco de dados no SQL Server 2000 Criando banco de dados e tabelas com o Access Criando Banco de Dados e Tabelas.
Para criar via cdigo leia o artigo: Criando seus arquivos - Veja como criar seu banco de dados e suas tabelas no Visual Basic usando o DAO.
Com o banco de dados e a tabela criada j podemos definir a interface com o usurio. Nossa aplicao ter apenas um nico formulrio chamado Alunos.vb que usar o seguinte leiaute:
Os controles usados neste formulrio so: - Label - Usadas para identificao; - TextBox - Exibe os campos : nome, endereo e nascimento; - RadioButton - Usados como opes para Sexo e Ano; - Button - botes de comando; - PictureBox - Exibir a imagem do aluno;
Agora uma viso mostrando a utilizao do recurso de imprimir um relatrio no modo de visualizao:
Para obter os valores armazenados basta usar o recurso My.Settings da seguinte forma: - Dim localfotos As String = My.Settings.Fotos - Dim escola as String = My.Settings.Escola.ToString E a string de conexo com o banco de dados como ser definida. Tudo depende de onde o banco de dados estar localizado. Neste exemplo o banco de dados estar na pasta da aplicao em C:\vbn\Cadastro\ , ento podemos definir a string de conexo da seguinte forma:
Nota: Para saber mais leia meu artigo : VB 2005 - Objeto Application
PropertyManager - Usado para fazer a vinculao de controles simples no sendo possvel usar com controles ListBox, ComboBox ou DataGridView; CurrencyManager - Usado para fazer a vinculao de controles simples e complexos que suportam a interface IList como : DataView, Array, ArrayList e objetos Collection.
Voc pode conhecer mais sobre cada um dos itens citados lendo os meus artigos:
y y y y y y y
Esta rotina atribui valores aos controles RadioButton usados para definir o Sexo e Ano/Grau que o aluno esta cursando. Note que o cdigo usa dois controles Label: lblSexo e lblGrau, que no so visveis em tempo de execuo, para verificar qual o valor obtido da tabela e exibir a informao no RadioButton equivalente.
Private Sub ExibirFoto() If lblFoto.Text <> "" Then Try picItem.Image = Image.FromFile(localfotos & lblFoto.Text) Catch ex As Exception picItem.Image = Nothing MessageBox.Show(ex.Message, "Erro ao carregar Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Else picItem.Image = Nothing End If End Sub
O cdigo verifica se a Label: lblFoto esta vazia ( Poderamos ter usado tambm: If lblFoto.Text IsNot String.Empty Then ) Se for verdadeiro carregamos a imagem no controle picItem, cujo caminho foi definido na varivel localfotos, usando o nome da imagem carregado em lblFoto.text, caso contrrio atribumos um Nothing ao controle. Lembre que ainda estamos executando o cdigo no evento Load e a ltima rotina chamada : definirEstado():
Private Sub definirEstado(ByVal AppEstado As String) mEstado = AppEstado Select Case AppEstado Case "Ver" btnPrimeiro.Enabled = True btnAnterior.Enabled = True btnProximo.Enabled = True btnUltimo.Enabled = True
btnEdita.Enabled = True btnSalva.Enabled = False btnCancela.Enabled = False btnInclui.Enabled = True btnDeletar.Enabled = True btnImprimir.Enabled = True btnSair.Enabled = True txtNome.ReadOnly = True txEndereco.ReadOnly = True dtpNascimento.Enabled = False btnCarregaFoto.Enabled = False grpSexo.Enabled = False grpGrau.Enabled = False Case "Editar", "Incluir" btnPrimeiro.Enabled = False btnAnterior.Enabled = False btnProximo.Enabled = False btnUltimo.Enabled = False btnEdita.Enabled = False btnSalva.Enabled = True btnCancela.Enabled = True btnInclui.Enabled = False btnDeletar.Enabled = False btnImprimir.Enabled = False btnSair.Enabled = False txtNome.ReadOnly = False txEndereco.ReadOnly = False dtpNascimento.Enabled = True btnCarregaFoto.Enabled = True grpSexo.Enabled = True grpGrau.Enabled = True End Select txtNome.Focus() End Sub
Neste cdigo verificamos se o estado igual a Ver , para visualizar os dados apenas, ou Editar/Incluir usados para edio e incluso de dados. Conforme o caso as propriedades Enabled e ReadOnly dos controles so alteradas e o foco colocado no controle txtNome. Ao terminar a execuo do cdigo ser apresentado o seguinte formulrio:
End Sub Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click AlunosCManager.Position = AlunosCManager.Count - 1 Call ExibirDados() End Sub
Em cada um dos botes , quando o usurio clicar, o objeto CurrencyManager - AlunosCManager - ir permitir a navegao pelos registros chamado a rotina ExibirDados para que os controles sejam preenchidos com os dados atualizados. Diferente do objeto Recordset da ADO , a interface IList no mantm o controle sobre o registro atual , no possuindo assim os mtodos MoveFirst, MoveNext , MovePrevious e MoveLast da ADO. Ao invs disso o CurrencyManager usa a propriedade Position para manter o controle sobre os registros; incrementando e decrementando esta propriedade permite a navegao pelos registros da tabela.
Note que os botes de comando para navegao , edio , incluso(Novo) , impresso, deleo e Sair foram desabilitados. Os botes Salvar, Cancelar e Carregar Foto foram habilitados; O acesso para alterar o Sexo e o Ano foram tambm habilitados; Isso permite a alterao dos dados do formulrio com opo para Salvar o Cancelar a operao.
O cdigo apenas chama a rotina definirEstado() passando o parmetro "Editar" para indicar que estamos no estado de edio dos dados. Abaixo temos um exemplo de tela mostrando a edio sendo realizada com alterao da data de nascimento atravs do controle DateTimePicker - dtpNascimento, e da caixa de dilogo OpenFileDialog - dlgAbrir - exibindo uma relao de imagens:
O cdigo para Salvar os dados associado ao evento Click do boto - Salvar - dado a seguir:
Private Sub btnSalva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalva.Click 'verifica o item Endereo If txEndereco.Text.Trim = "" Then MessageBox.Show("Informe o endereo.", "Erro Entrada", MessageBoxButtons.OK, MessageBoxIcon.Information) txEndereco.Focus() Exit Sub End If Dim itemSalvo As String = txEndereco.Text Dim linhaSalva As Integer 'encerra edio do CurrencyManager AlunosCManager.EndCurrentEdit() 'define o modo de exibio ordenado por Nome AlunosTabela.DefaultView.Sort = "Nome" 'obtem o id da linha Salva
linhaSalva = AlunosTabela.DefaultView.Find(itemSalvo) 'atribui a posio da linha em edio ao CurrencyManager AlunosCManager.Position = linhaSalva Call ExibirDados() Call definirEstado("Ver") End Sub
O cdigo verifica se foi informado um valor para o endereo do aluno para prosseguir; em seguida armazena o valor na varivel itemSalvo e encerra a edio do CurrencyManager salvando os dados. Aps definir a ordenao pelo nome procura-se o item salvo atribuindo o seu valor a propriedade Position do CurrencyManager para em seguida exibir os dados e definir o estado como visualizao. O boto Cancelar possui o cdigo abaixo:
Private Sub btnCancela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancela.Click AlunosCManager.CancelCurrentEdit() If mEstado = "Incluir" Then AlunosCManager.Position = mMarcador End If Call ExibirDados() Call definirEstado("Ver") End Sub
O cdigo usa o mtodo CancelCurrentEdit() para cancelar a edio desfazendo qualquer alterao e verifica se o estado igual a "Incluir" para atribuir o valor da varivel mMarcador a propriedade Position. Esta varivel a iniciada quando o processo de incluso comea , desta forma podemos voltar a exibir os registros na posio anterior ao incio da operao de incluso. O boto Novo usado para incluir um registro da tabela e tem o seguinte cdigo:
Private Sub btnInclui_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInclui.Click 'define a posicao atual do currencyManager mMarcador = AlunosCManager.Position
'define o estado no modo incluso Call definirEstado("Incluir") 'inclui um novo registro no currenymanager AlunosCManager.AddNew() 'define as propriedades rdoMasculino.Checked = True : lblSexo.Text = "M" rdoPrimeiro.Checked = True : lblGrau.Text = "1" picItem.Image = Nothing lblFoto.Text = "" End Sub
Ao iniciar a incluso obtemos a posio atual do CurrencyManager e atribumos a varivel mMarcador. Fazemos isso para poder retornar a posio atual dos registros se a incluso for cancelada. Em seguida definimos o modo como 'Incluir' e inclumos um novo registro no CurrencyManager definindo em seguidas as propriedades padro para Sexo e Ano e Foto. Na ltima parte deste artigo vou mostrar o cdigo dos botes : Imprimir, Deletar, Sair e Carregar Foto.
Definindo a impresso
A seguir eu vou mostrar o cdigo usado para imprimir os dados , inclusive a foto do cadastro de alunos. Em meu artigo Impresso e Visualizao. O que h de novo ? eu apresento o namespace System.Drawing.Printing e a classe PrintDocument e o componente PrintPreviewDialog. Eles so os pilares da impresso no VB .NET.
No artigo Criando um editor de textos no VB .NET eu mostro como voc pode criar um editor de textos com recursos de impresso usando as classes e em meu artigo Imprimindo no VB 2005 a eu volto ao assunto descrevendo o processo usado para imprimir no VB. Ento repetindo o que eu j disse: Para imprimir no VB.NET temos a seqncia que deve ser seguida: 1- Primeiro, voc deve instanciar um objeto PrintDocument 2- A seguir voc tem que criar uma instncia de um objeto PrintDialog e definir a referncia para o objeto PrintDocument:
Dim doc As PrintDocument = New PrintDocument Dim printer As PrintDialog = New PrintDialog printer.Document = doc
3- Em seguida voc deve mostrar a caixa de dilogo onde o usurio pode selecionar a impressora e suas propriedades: printer.ShowDialog() 4- Agora voc precisa subscrever o evento PrintDocument.PringPage o qual ser disparado para cada nova pgina: AddHandler doc.PrintPage, AddressOf PrintPageHandler 5- Chamar o mtodo Print; 6- Implementar o tratamento de evento para o evento PrintDocument.PrintPage onde nos desejamos imprimir o texto. Ento inclua no formulrio o componente PrintPreviewDialog alterando o seu nome para dlgVisualiza. Agora no evento Click do boto Imprimir inclua o cdigo:
Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click 'Declara o printdocument Dim AlunosDocument As Drawing.Printing.PrintDocument 'Cria o documento e da nome ao mesmo AlunosDocument = New Drawing.Printing.PrintDocument() AlunosDocument.DocumentName = "Alunos" 'incluir o manipulador de eventos
Agora temos que codificar a rotina ImprimirAlunos que ir realizar o trabalho de impresso. O cdigo o seguinte:
Private Sub ImprimirAlunos(ByVal sender As Object, ByVal e As Drawing.Printing.PrintPageEventArgs) 'desenha a bordar Dim MyPen As Pen = New Pen(Color.Black, 3) e.Graphics.DrawRectangle(MyPen, e.MarginBounds.X, e.MarginBounds.Y, 450, 480) Dim MyFont As Font = New Font("Arial", 12, FontStyle.Bold) Dim S As String = My.Settings.Escola.ToString Dim SSize As SizeF = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (250 - SSize.Width)), e.MarginBounds.Y + 15) 'posiciona a imagem e.Graphics.DrawImage(picItem.Image, e.MarginBounds.X + 25, e.MarginBounds.Y + 50, 400, 300) e.HasMorePages = False 'define os campos a serem impressos MyFont = New Font("Arial", 14) Dim Y As Integer = e.MarginBounds.Y + 400 S = txtNome.Text + " " + txEndereco.Text SSize = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) Y += CInt(MyFont.GetHeight(e.Graphics)) 'S = txtLastName.Text 'SSize = e.Graphics.MeasureString(S, MyFont)
' e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) 'Y += CInt(MyFont.GetHeight(e.Graphics)) S = lblGrau.Text + "o Grau " SSize = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) End Sub
Excluindo dados
O cdigo do boto Deletar exibido a seguir. Aps confirmao usamos o mtodo RemoveAt do CurrencyManager e em seguida chamamos a rotina ExibirDados().
Private Sub btnDeletar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeletar.Click If MessageBox.Show("Confirma e excluso deste registro ? ", "Deletar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then AlunosCManager.RemoveAt(AlunosCManager.Position) Call ExibirDados()
Carregando a foto
Quando clica no boto Carregar Foto aberto uma janela de dilogo Abrir para que um arquivo de foto seja selecionado. Aps selecionar uma imagem clique no boto Salvar. O cdigo que faz tudo isso dado abaixo:
Private Sub btnCarregaFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregaFoto.Click Dim nomeImagem As String dlgAbrir.InitialDirectory = localfotos Try If dlgAbrir.ShowDialog = Windows.Forms.DialogResult.OK Then 'obtem o caminho e nome da imagem nomeImagem = dlgAbrir.FileName 'obtem a posio da / na string Dim posicaoBarra As Integer = nomeImagem.LastIndexOf("\") 'extrai somente o nome do arquivo da string e atribui a lblFoto lblFoto.Text = nomeImagem.Substring(posicaoBarra + 1) 'chama a rotina para exibir a foto Call ExibirFoto() End If Catch ex As Exception MessageBox.Show(ex.Message, "Erro ao abrir Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
Para encerrar o programa temos o cdigo abaixo associado ao evento Click do boto Sair:
Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click If (MessageBox.Show("Deseja sair ?", "Sair", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes) Then Me.Close() End If
End Sub
Com isso terminei a apresentao da aplicao Cadastro de Alunos usando todos os recursos de manuteno de dados e navegao pelos registros. Tudo isso com exibio de imagens e impresso tambm. Para encerrar com chave de ouro o ltimo captulo da srie ir mostrar como gerar o pacote para instalao.