No artigo de hoje vou mostrar como criar um programa bem simples que realiza o cadastro de usuários e que obtém a foto a partir de uma webcam e armazena em um banco de dados MS Access. |
O programa utiliza a linguagem VB .NET e armazena os dados em um banco de dados MS Access.
Seu objetivo e gravar os dados dos usuários em uma tabela Usuarios do banco de dados Cadastro.accdb cuja estrutura é vista abaixo:
Embora seja um programa para quem esta iniciando na linguagem VB .NET ele utiliza conceitos importantes como:
O projeto possui 4 formulários :
1- Formulário de apresentação com as opções de acesso aos demais formulários
2- Formulário para registrar o usuário
3- Formulário para ativar a WebCam e capturar a imagem
4 - Formulário para visualizar os dados e deletar registros
Além dos formulários temos os seguintes recursos no projeto:
A classe iCam que contém os métodos para acessar, ativar, desativar a WebCam
O módulo modConexao que contém os métodos para registrar, exibir e deletar registros dos usuários
Arquivo Resources contendo a imagem semimagem.jpg usada como imagem padrão
Recursos usados:
Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.
Criando a solução no VS 2015
Abra o VS 2015 Community e clique em New Project;
Selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome : Cadastro_WebCam;
Em todos os formulários usados no projeto adotei as seguintes configurações:
1 - Formulário - frmMenu - opções para acessar os demais formulários
Public Class frmMenu
Private Sub btnRegistrar_Click(sender As Object, e As EventArgs) Handles btnRegistrar.Click
My.Forms.Form1.Show()
End Sub
Private Sub btnVisualizar_Click(sender As Object, e As EventArgs) Handles btnVisualizar.Click
My.Forms.Form3.Show()
End Sub
Private Sub btnEncerrar_Click(sender As Object, e As EventArgs) Handles btnEncerrar.Click
If MessageBox.Show("Deseja encerrar o programa ?", "Encerrar", MessageBoxButtons.YesNo) = DialogResult.Yes Then
Me.Close()
End If
End Sub
Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
btnEncerrar.PerformClick()
End Sub
End Class
|
2 - Formulário - Form1 - Registra o usuário com foto capturada da WebCam
Namespaces usados no formulário:
Imports
System.TextA seguir os principais eventos e métodos usados neste formulário:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'obtem a imagem de resources
picFoto.Image = My.Resources.semimagem
End Sub
Private Sub btnRemoverFoto_Click(sender As Object, e As EventArgs) Handles btnRemoverFoto.Click
'obtem a imagem de resources
picFoto.Image = My.Resources.semimagem
End Sub
Private Sub Salvar()
Try
'cifra os dados e armazena
Dim senha As String = CifrarDados(txtSenha.Text)
'cria um stream na memória
Dim ms As New MemoryStream()
'cria um objeto imagem
Dim bmpImage As New Bitmap(picFoto.Image)
If (SalvaDados(ms, bmpImage, txtNome.Text, txtEmail.Text, senha)) Then
MessageBox.Show("Usuário salvo com sucesso", "Salvo", MessageBoxButtons.OK, MessageBoxIcon.Information)
LimpaControles(Me)
txtNome.Focus()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
If con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Sub
Public Shared Function IsValidEmail(ByVal email As String) As Boolean
Dim padraoRegex As String = "^[-a-zA-Z0-9][-.a-zA-Z0-9]*@[-.a-zA-Z0-9]+(\.[-.a-zA-Z0-9]+)*\." &
"(com|edu|info|gov|int|mil|net|org|biz|name|museum|coop|aero|pro|tv|[a-zA-Z]{2})$"
Dim verifica As New RegularExpressions.Regex(padraoRegex, RegexOptions.IgnorePatternWhitespace)
Dim valida As Boolean = False
'verifica se foi informado um email
If String.IsNullOrEmpty(email) Then
valida = False
Else
'usa IsMatch para validar o email
valida = verifica.IsMatch(email)
End If
'retorna o valor
Return valida
End Function
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
If e.KeyChar = Convert.ToChar(13) Then
e.Handled = True
SendKeys.Send("{TAB}")
End If
End Sub
Private Sub LimpaControles(ByVal controlP As Control)
Dim ctl As Control
For Each ctl In controlP.Controls
If TypeOf ctl Is TextBox Then
DirectCast(ctl, TextBox).Text = String.Empty
ElseIf ctl.Controls.Count > 0 Then
LimpaControles(ctl)
End If
Next
End Sub
Public Function CifrarDados(ByVal textoplano As String) As String
' Converte o texto plano para um array de bytes
Dim textoplanoBytes() As Byte = Encoding.Unicode.GetBytes(textoplano)
' Cria o stream
Dim ms As New MemoryStream
' Cria o codificador para escrever no stream
Dim encStream As New CryptoStream(ms, TripleDes.CreateEncryptor(), CryptoStreamMode.Write)
' Use o stream criptografado para escrever o array de bytes no stream
encStream.Write(textoplanoBytes, 0, textoplanoBytes.Length)
encStream.FlushFinalBlock()
' Converte o stream cifrado para uma string
Return Convert.ToBase64String(ms.ToArray)
End Function
End Class
|
3- Formulário - Form2 - Gerencia a WebCam , ativando, desativando e capturando a imagem
Abaixo temos a rotina Inserido que é usada quando um novo evento é iniciado.
Public Class Form2
'aloca uma variável do tipo iCam
Private minhaWebCam As iCam
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'cria uma instância da classe iCam
minhaWebCam = New iCam
'inicializa a câmera
minhaWebCam.initCam(Me.picImagem.Handle.ToInt32)
btnCapturaImagem.Focus()
End Sub
Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
'encerra e fecha
minhaWebCam.closeCam()
Application.DoEvents()
minhaWebCam = Nothing
Me.Close()
End Sub
Private Sub btnCapturaImagem_Click(sender As Object, e As EventArgs) Handles btnCapturaImagem.Click
'verifica se a webcam esta ativa e obtem a imagem capturada
If minhaWebCam.iRunning Then
Form1.picFoto.Image = minhaWebCam.copyFrame(Me.picImagem, New RectangleF(0, 0,
Me.picImagem.Width, Me.picImagem.Height))
Form1.Show()
Else
MessageBox.Show("A Camara não esta ativa !")
End If
End Sub
Private Sub btnCancelaCaptura_Click(sender As Object, e As EventArgs) Handles btnCancelaCaptura.Click
'desativa a webcam
minhaWebCam.closeCam()
Me.Close()
End Sub
End Class
|
4 - Formulário - Form3 - Visualizar os dados dos usuário e permite e deletar registros
Imports System.IO
Public Class Form3
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
ExibeDados()
Catch ex As Exception
MessageBox.Show("Erro : " + ex.Message)
End Try
End Sub
Private Sub ExibeDados()
Try
Dim ds As DataSet = GetDados()
dgvUsuarios.DataSource = ds.Tables(0).DefaultView
picImagem.Image = My.Resources.semimagem
Catch ex As Exception
Throw
End Try
End Sub
Private Sub dgvUsuarios_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvUsuarios.RowHeaderMouseClick
Try
Dim dr As DataGridViewRow = dgvUsuarios.SelectedRows(0)
Dim data As Byte() = DirectCast(dr.Cells(4).Value, Byte())
Dim ms As New MemoryStream(data)
Me.picImagem.Image = Image.FromStream(ms)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub btnFechar_Click(sender As Object, e As EventArgs) Handles btnFechar.Click
Try
If MessageBox.Show("Deseja realmente deletar este registro ?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
Deletar()
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub Deletar()
Dim resultado As Integer
Try
Dim rowindex As Integer = dgvUsuarios.CurrentCell.RowIndex
Dim columnindex As Integer = dgvUsuarios.CurrentCell.ColumnIndex
Dim codigo As Integer = dgvUsuarios.Rows(rowindex).Cells(columnindex).Value
resultado = DeletarRegistro(codigo)
If resultado > 0 Then
MessageBox.Show("Registro deletado com sucesso", "Deletado", MessageBoxButtons.OK, MessageBoxIcon.Information)
ExibeDados()
Else
MessageBox.Show("Registro não encontrado", "Não Encontrado", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Exception
Throw
End Try
End Sub
Private Sub picClose_Click(sender As Object, e As EventArgs) Handles picClose.Click
Me.Close()
End Sub
End Class
|
5- Módulo ModeConexao - Contém os métodos para exibir, incluir e excluir registros do banco de dados
A string de conexão do banco de dados esta definida da seguinte forma:
Public Const cnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Cadastro.accdb;Persist Security Info=False;"
Imports System.Data.OleDb
Imports System.IO
Module ModConexao
Public con As OleDbConnection = Nothing
Public ds As DataSet
Public cmd As OleDbCommand = Nothing
Public Const cnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Cadastro.accdb;Persist Security Info=False;"
Public Function GetDados(ByVal sSQL As String) As OleDbDataReader
Dim sqlCmd As OleDbCommand = New OleDbCommand(sSQL)
Dim dr As OleDbDataReader
con = New OleDbConnection(cnString)
Try
con.Open()
sqlCmd.Connection = con
dr = sqlCmd.ExecuteReader
Return dr
Catch ex As Exception
Throw
Finally
If con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Function
Public Function GetDados() As DataSet
Try
'abre a cpmexão
con = New OleDbConnection(cnString)
con.Open()
'define o comando sql e dataadapter o dataset
cmd = New OleDbCommand("SELECT UsuarioId, Nome, Email, Senha, Foto From Usuarios ", con)
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim ds As DataSet = New DataSet()
da.Fill(ds, "Usuarios")
'retorna o dataset
Return ds
Catch ex As Exception
Throw
Finally
If con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Function
Public Function SalvaDados(ms As MemoryStream, bmpImage As Bitmap, nome As String, email As String, senha As String) As Boolean
Try
'abre uma conexão
con = New OleDbConnection(cnString)
con.Open()
'define o comando SQL para incluir no banco de dados
Dim cb As String = "insert into Usuarios(Nome, Email, Senha, Foto) VALUES (@nome,@email,@senha,@foto)"
cmd = New OleDbCommand(cb)
'passa os parâmetros
cmd.Parameters.AddWithValue("@nome", nome)
cmd.Parameters.AddWithValue("@email", email)
cmd.Parameters.AddWithValue("@senha", senha)
cmd.Connection = con
'salva a imagem no stream
bmpImage.Save(ms, Imaging.ImageFormat.Jpeg)
Dim data As Byte() = ms.GetBuffer()
'passa o parametro para imagem
Dim p As New OleDbParameter("@foto", OleDbType.VarBinary)
p.Value = data
cmd.Parameters.Add(p)
'executa o comando para incluir na tabela
cmd.ExecuteNonQuery()
Return True
Catch ex As Exception
Throw
End Try
End Function
Public Function DeletarRegistro(codigo As Integer) As Integer
Try
Dim LinhasAfetadas As Integer = 0
con = New OleDbConnection(cnString)
con.Open()
Dim sql As String = "delete from Usuarios where UsuarioId=" & codigo
cmd = New OleDbCommand(sql)
cmd.Connection = con
LinhasAfetadas = cmd.ExecuteNonQuery()
Return LinhasAfetadas
Catch ex As Exception
Throw
Finally
If con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Function
End Module
|
O projeto pode ser incrementado com outras funcionalidades e com aplicação de boas práticas para otimizar o código, mas foi feito para tornar o entendimento o mais simples possível.
Pegue o projeto completo aqui : Cadastro_WebCam.zip
"Porque pela graça sois salvos, por meio
da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;"
Efésios 2:8,9
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: