VB .NET - Curso Prático ADO .NET - Desenvolvendo uma aplicação : Definindo o código da Interface - XII (Final do módulo cliente)


Nesta última aula do curso prático ADO .NET usando VB .NET irei tratar do formulário de registro - frmRegistros - que é usado para cadastrar um cliente na tabela Clientes base de dados a empresa CiaFilmes.

O formulário de registros - frmRegistros - permite registrar as informações do cliente que serão usadas para fazer e finalizar um pedido. Assim seus dados pessoais e os dados do cartão de crédito deverão ser informados bem como o login e a senha para que o cliente possa finalizar um pedido feito. Sem fazer o registro o cliente pode simular um pedido mas não poderá finalizá-lo.

Abaixo vemos o leiaute do formulário de registro - frmRegistros:

Este formulário utiliza as seguintes declarações imports que permite o acesso as classes ADO .NET e ao provedor para o SQL Server:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions

No evento Load do formulário definimos o valor zero para a propriedade SelectedIndex da combobox de forma a exibir o primeiro item:

Private Sub frmRegistros_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboEstados.SelectedIndex = 0
    End Sub

Associado ao botão de comando Submeter do formulário temos o código que irá realizar a validação dos dados informados e a gravação das informações na tabela Clientes. Abaixo temos o código:

Private Sub btnSubmeter_Click(sender As Object, e As EventArgs) Handles btnSubmeter.Click
        Dim strConsulta As String
        Dim sqlCon As New SqlConnection(strConexaoSQLServer)
        Dim sqlAda As New SqlDataAdapter()

        'valida os dados informados
        'verifica se foi informado o nome do cliente
        If (txtNome.Text.Trim = "") Then
            'exibe mensagem ao cliente para informar o nome
            MessageBox.Show("Informe o primeiro nome.", "Nome", MessageBoxButtons.OK)
            'poe o foco no TextBox txtNome
            txtNome.Focus()
            Return
        End If
        If (txtSobrenome.Text.Trim = "") Then
            MessageBox.Show("Informe o sobrenome.", "Sobrenome", MessageBoxButtons.OK)
            txtSobrenome.Focus()
            Return
        End If
        If String.IsNullOrEmpty(txtEndereco.Text) Then
            MessageBox.Show("Informe o endereço.", "Endereço", MessageBoxButtons.OK)
            txtEndereco.Focus()
            Return
        End If
        If Not IsEmail(txtEmail.Text) Then
            MessageBox.Show("Email inválido.", "Email", MessageBoxButtons.OK)
            txtEmail.Focus()
            Return
        End If
        If (txtCartaoCredito.Text.Trim = "") Then
            MessageBox.Show("Informe o número do cartão de crédito.", "Cartão de Crédito ", MessageBoxButtons.OK)
            txtCartaoCredito.Focus()
            Return
        ElseIf (txtCartaoCredito.Text.Trim.Length <> 16) Then
            MessageBox.Show("Número de cartão de crédito inválido. Informe o número novamente.", "Cartão de Crédito", MessageBoxButtons.OK)
            txtCartaoCredito.Focus()
            Return
        End If
        If String.IsNullOrEmpty(txtValidadeCartao.Text) Then
            MessageBox.Show("Dados inválidos", "Validade do Cartão de Crédito", MessageBoxButtons.OK)
            txtValidadeCartao.Focus()
            Return
        End If
        If String.IsNullOrEmpty(txtCodSeguranca.Text) Then
            MessageBox.Show("Dados inválidos", "Código de segurança do Cartão de Crédito", MessageBoxButtons.OK)
            txtCodSeguranca.Focus()
            Return
        End If

        'Define a consulta para incluir detalheas informados na tabela -
        'Note que as variávels usadas como parâmetros (variáveis que possuem o simbolo @) 
        'são usadas para atribuir valores os campos da tabela
        strConsulta = "INSERT INTO Clientes (Nome, Sobrenome, Endereco, Cidade,Estado, Cep, Telefone, Email, Nascimento, 
                             NumeroCartaoCredito, ValidadeCartao,CodigoSegurancaCartao,Login,Senha) " _
                            & " VALUES(@Nome,@Sobrenome,@Endereco,@Cidade,@Estado,@Cep,@Telefone,@Email,@Nascimento,
                            @NumeroCartaoCredito,@ValidadeCartao,@CodigoSegurancaCartao,@Login,@senha)"

        'Declar um objeto CmdString para o objeto Command
        Dim CmdString As New SqlCommand(strConsulta, sqlCon)
     
        'Especifica a consulta armazeanda na variavel CmdString como a consulta a ser executada
        sqlAda.InsertCommand = CmdString
        'Define os parâmetros, seus tipos, tamanhos e valores 
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Nome", System.Data.SqlDbType.VarChar, 50, "Nome"))
        sqlAda.InsertCommand.Parameters(0).Value = txtNome.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Sobrenome", System.Data.SqlDbType.VarChar, 50, "Sobrenome"))
        sqlAda.InsertCommand.Parameters(1).Value = txtSobrenome.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Endereco", System.Data.SqlDbType.VarChar, 50, "Endereco"))
        sqlAda.InsertCommand.Parameters(2).Value = txtEndereco.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Cidade", System.Data.SqlDbType.VarChar, 50, "Cidade"))
        sqlAda.InsertCommand.Parameters(3).Value = txtCidade.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Estado", System.Data.SqlDbType.VarChar, 2, "Estado"))
        sqlAda.InsertCommand.Parameters(4).Value = cboEstados.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Cep", System.Data.SqlDbType.VarChar, 8, "Cep"))
        sqlAda.InsertCommand.Parameters(5).Value = txtCep.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Telefone", System.Data.SqlDbType.VarChar, 50, "Telefone"))
        sqlAda.InsertCommand.Parameters(6).Value = txtTelefone.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Email", System.Data.SqlDbType.VarChar, 100, "Email"))
        sqlAda.InsertCommand.Parameters(7).Value = txtEmail.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Nascimento", System.Data.SqlDbType.DateTime, 8, "Nascimento"))
        sqlAda.InsertCommand.Parameters(8).Value = Convert.ToDateTime(dtpNascimento.Text)
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@NumeroCartaoCredito", System.Data.SqlDbType.VarChar, 16, "NumeroCartaoCredito"))
        sqlAda.InsertCommand.Parameters(9).Value = txtCartaoCredito.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@ValidadeCartao", System.Data.SqlDbType.VarChar, 10, "ValidadeCartao"))
        sqlAda.InsertCommand.Parameters(10).Value = txtValidadeCartao.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@CodigoSegurancaCartao", System.Data.SqlDbType.VarChar, 10, "CodigoSegurancaCartao"))
        sqlAda.InsertCommand.Parameters(11).Value = txtCodSeguranca.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Login", System.Data.SqlDbType.VarChar, 50, "Login"))
        sqlAda.InsertCommand.Parameters(12).Value = txtLogin.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Senha", System.Data.SqlDbType.VarChar, 50, "Senha"))
        sqlAda.InsertCommand.Parameters(13).Value = CifraDecifraSenha(txtSenha.Text)
        Try
            'estabelece uma conexão
            sqlCon.Open()
            'Executa a consulta
            sqlAda.InsertCommand.ExecuteNonQuery()
        Catch MyException As SqlException
            'tratamento de erros
            MessageBox.Show(("Source: " & MyException.Source & ControlChars.Cr & "Number: " & MyException.Number.ToString() & ControlChars.Cr & "State: " 
& MyException.State.ToString() &
            ControlChars.Cr & "Class: " & MyException.Class.ToString() & ControlChars.Cr & "Server: " & MyException.Server & ControlChars.Cr & "Message: " 
& MyException.Message & ControlChars.Cr & "Procedure: " & MyException.Procedure & ControlChars.Cr & "Line: " & MyException.LineNumber.ToString()))
            CmdString.Dispose()
            Return
        Finally
            'libera os recursos usados
            CmdString.Dispose()
            sqlCon.Dispose()
            sqlAda.Dispose()
            sqlCon.Close()
            Me.Close()
        End Try
        'atribui o login 
        Geral.clienteLogin = txtLogin.Text
        'exibe mensagem
        MessageBox.Show("O registro foi incluído com sucesso.", "Cliente Registrado", MessageBoxButtons.OK, MessageBoxIcon.Information)
        'fecha o formulario
        Me.Close()
    End Sub

No código estamos verificando se as informações que o usuário digita nos controles de formulário TextBox são validas. Podemos realizar diversos níveis de verificação como não aceitar valores vazios, ou aceitar somente valores numéricos ou strings ou ainda permitir valores com um determinado tamanho de caracteres, etc.

No código verificamos se os controles TextBox não estão vazios, a seguir montamos a string SQL usando o comando INSERT INTO e passamos os valores aos parâmetros da consulta SQL que será executado com a instrução ExecuteNonQuery.

Podemos realizar a validação de diversas formas e uma delas é usar o controle ErrorProvider.  Ele pode ser usado para realizar a validação dos dados em um formulário Windows. Basicamente  o controle  exibe um pequeno ícone vermelho ao lado do controle que apresenta um erro de validação e quando o usuário passa o mouse sobre o ícone uma mensagem é exibida com informação sobre o dado inválido. Opcionalmente você pode fazer o ícone piscar.

Para usar o controle temos que, a partir da ToolBox, selecionar o controle ErrorProvider e arrastá-lo para o formulário , ou clicar duas vezes sobre ele. Como o controle não é visível em tempo de execução ele fica na barra abaixo do formulário com o nome padrão de ErrorProvider1.

Para usar efetivamente o controle basta você definir no evento Validating de cada TextBox o código para efetuar a validação do conteúdo e opcionalmente exibir o ícone de erro.(Para validações complexas você pode até usar as expressões regulares).

O método SetError do controle atribui um erro ao controle . Para uma validação onde a entrada for considerada inválida você deve definir o método assim : errorProvider1.SetError(meuControle, "Texto com indicação de erro"); Para limpar o erro simplesmente passe uma string vazia como argumento.

Abaixo vemos o código associado ao evento Validating para os controles: TextCep, txtTelefone e txEmail onde realizamos a validação usando o ErrorProvider definido com o nome errPvd1:

Private Sub txtCep_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles txtCep.Validating
        If String.IsNullOrWhiteSpace(txtCep.Text) Then
            errPvd1.SetError(txtCep, "Informe o CEP")
        Else
            errPvd1.SetError(txtCep, "")
        End If
    End Sub

    Private Sub txtTelefone_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles txtTelefone.Validating
        If String.IsNullOrWhiteSpace(txtCep.Text) Then
            errPvd1.SetError(txtTelefone, "Informe o Telefone do cliente.")
        Else
            errPvd1.SetError(txtTelefone, "")
        End If
    End Sub

    Private Sub txtEmail_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles txtEmail.Validating
        If String.IsNullOrWhiteSpace(txtCep.Text) Then
            errPvd1.SetError(txtEmail, "Informe o Email do Cliente.")
        Else
            errPvd1.SetError(txtEmail, "")
        End If
    End Sub  

A seguir temos o código associado ao evento KeyPress do formulário onde interceptamos a tecla ENTER e enviamos um TAB para navegar entre os campos:

Nota: A propriedade KeyPreview do formulário deverá ser definida como True para que

  Private Sub frmRegistros_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
        If Asc(e.KeyChar) = 13 Then
            SendKeys.Send("{TAB}")
        End If
    End Sub  
  

Ainda usando o evento KeyPress estamos permitindo somente valores numéricas para os controles txtCartaoCredito e txtCodSeguranca:

    Private Sub txtCartaoCredito_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtCartaoCredito.KeyPress
        If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = vbBack Then
            e.Handled = True
        End If
    End Sub

    Private Sub txtCodSeguranca_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtCodSeguranca.KeyPress
        If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = vbBack Then
            e.Handled = True
        End If
    End Sub

A função IsEmail abaixo verifica se o email informado no controle txtEmail possui um formato válido e retorna true ou false:

 Function IsEmail(ByVal email As String) As Boolean
        Static emailExpression As New Regex("
^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$")
        Return emailExpression.IsMatch(email)
    End Function

A chamada da rotina LimpaControles é feita no evento Click do botão btnLimpar:

Private Sub btnLimpar_Click(sender As Object, e As EventArgs) Handles btnLimpar.Click
      LimpaControles()
End Sub

Para limpar todos os controles TextBox do formulário usamos a rotina LimpaControles() a seguir:

    Private Sub LimpaControles()
        For Each txt As Control In Me.Controls
            If TypeOf txt Is TextBox Then
                txt.Text = ""
            End If
        Next
    End Sub

No evento Click do botão Cancelar fechamos o formulário:

 Private Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles btnCancelar.Click
        Me.Close()
    End Sub

Dessa forma concluímos o formulário de registro da aplicação.

Definindo a tela de apresentação

Para encerrar vamos incluir uma tela de apresentação no nosso projeto. Inclua um novo formulário via menu PROJECT->Add Windows Forms com o nome frmSplash.vb e defina as seguinte propriedades para este formulário:

Inclua um controle Label e atribua na sua propriedade Text o texto CiaFilmes com fonte Segoe Script; 36pt;

Inclua no formulário um controle PictureBox com as seguinte propriedades:

Veja abaixo o leiaute e aparência do formulário:

Após isso clique com o botão direito do mouse sobre o nome do projeto e acione a opção Properties:

Na janela Properties em Application informe o nome do formulário frmSplash na opção Splash Screen:

Pronto ao executar sua aplicação a tela de apresentação será apresentada por alguns segundos antes do formulário principal ser exibido.

O projeto completo você encontra no Super DVD .NET.

Veja os Destaques e novidades do SUPER DVD VB 2013 (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# 2013 com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Na próxima aula do curso iremos iniciar a criação do projeto referente ao módulo de administração onde somente os funcionários e o administrador terá acesso para realizar as tarefas de manutenção da aplicação como cadastros, relatórios e acompanhamento dos pedidos.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti