Gerenciando dados sem usar banco de dados - III


Em continuação ao meu artigo VB .NET - Gerenciando dados sem usar um banco de dados vamos criar a classe para serializar e deserializar os dados da coleção carros e o formulário principal.

Nota: Este artigo mostra como persistir, recuperar e localizar  informações usando a serialização.

Abaixo vemos a figura do formulário principal exibindo o menu com as opções do sistema.

Neste momento vamos dar uma olhada no projeto para ver o que foi criado:

Temos as Regions :

Criamos também dois novos formulários :

O código do formulário frmLista.vb é dado a seguir e apenas exibe os carros cadastrados:
 

Public Sub New(ByVal bd As List(Of Carros))


InitializeComponent()

' define a fonte de dados de carros


DataGridView1.DataSource = bd

' oculta a primeira coluna


DataGridView1.Columns(0).Visible =
False


End
Sub

O código da Region CRUD é dado a seguir, e nele já vemos comentados os códigos relacionados com os botões incluir, excluir

''' <summary>

''' Inclui um novo carro a lista de carros

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub tsbIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbIncluir.Click

SalvaCarroAtual()

carroAtual = New Carros()

LimpaFormulario()

carros.Add(carroAtual)

flagForm = True

End Sub

''' <summary>

''' Remove o carro atual dos dados

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub tsbExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbExcluir.Click

carros.RemoveAt(posicaoAtual)

If posicaoAtual = 0 Then

    posicaoAtual += 1

Else

   posicaoAtual -= 1

   carroAtual = carros(posicaoAtual)

   carregaCarroAtual()

   flagForm = True

End If

End Sub

''' <summary>

''' Localiza um carro especifico

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub tsbProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbProcurar.Click

Dim f As New frmProcura(carros)

AddHandler f.CarroNomeUpdated, AddressOf procuraCarro

f.Show()

End Sub

 

''' <summary>

''' Codigo para localizar carros

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub ProcuraCarro(ByVal sender As Object, ByVal e As CarroNomeUpdateEventArgs)

Dim i As Integer

For i = 0 To carros.Count - 1

If carros(i).NomeCarro = e.CarroNome Then

   carroAtual = carros(i)

   carregaCarroAtual()

   posicaoAtual = i

End If

Next

End Sub
 

Private Sub ListaDeCarrosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListaDeCarrosToolStripMenuItem.Click

  Dim f As New frmLista(carros)

  f.Show()

End Sub

 

Deste código quero destacar o código referente ao botão localizar. Neste código estamos instanciando o formulário frmProcurar(carros) passando como parâmetro o objeto Carros.

Vejamos a seguir o código do formulário frmProcurar.vb:

Imports System

Imports System.Collections.Generic

Imports System.ComponentModel

Imports System.Data

Imports System.Drawing

Imports System.Linq

Imports System.Text

Imports System.Windows.Forms

 

''' <summary>

''' Este formulario exibe uma lista de nomes de carros

''' uma vez selecionado um evento sera disparado com o nome

''' do carro selecionado e passado como um argumento.

''' O formulario principal ir  'escutar' para processar este evento

''' para atualizar a exibi‡Æo do carro atual de forma que ele coincida com o

''' nome procurado.

''' </summary>

 

Public Class frmProcura

' inclui um delegate

Public Delegate Sub CarroNomeUpdateHandler(ByVal sender As Object, ByVal e As CarroNomeUpdateEventArgs)

' e associa um evento para modificar os escutadores

' quando o nome do carro ‚ selecionado da lista dos

' nomes de carros

Public Event CarroNomeUpdated As CarroNomeUpdateHandler

''' <summary>

''' Passa a lista de dados do carro atual para

''' o construtor de forma que o formulario pode

''' gerar uma lista de nomes de carros para o usuario escolher

''' no formulario

''' </summary>

''' <param name="bd"></param>

''' <remarks></remarks>

Public Sub New(ByVal bd As List(Of Carros))

 

InitializeComponent()

' percorre os dados dos carros para incluir

' cada nome de carro a lista de nomes do controle listbox

For Each carro As Carros In bd

   ListBox1.Items.Add(carro.NomeCarro)

Next

End Sub

 

''' <summary>

''' Quando o usu rio clicar no botÆo procurar

''' dispara um evento de forma que o formulario ira exibir

''' o carro apropriado

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurar.Click

' preenche a lista de argumentos com o nome do carro

Dim args As New CarroNomeUpdateEventArgs(ListBox1.SelectedItem.ToString())

' dispara o evento para passar o nome do carro de volta

' ao formulario principal para processamento

RaiseEvent CarroNomeUpdated(Me, args)

End Sub

End Class

 

''' <summary>

''' Container para os argumentos de atualização do nome do carro

''' só ha um argumento neste caso.

''' O nome do carro selecionado da lista de carros

''' </summary>

Public Class CarroNomeUpdateEventArgs

        Inherits System.EventArgs

 

Private mCarroNome As String

' constructor

Public Sub New(ByVal sCarroNome As String)

   Me.mCarroNome = sCarroNome

End Sub

 

' Properties - Acessivel pelo listener

Public Property CarroNome() As String

Get

   Return mCarroNome

End Get

Set(ByVal value As String)

   mCarroNome = value

End Set

End Property

 

End Class

Observe que estamos um delegate e definindo no formulário um construtor e a propriedade mCarroNome que será retornada  para o formulário Menu.vb de forma a exibir os dados do carro quando o usuário clica no botão Procurar do formulário frmProcura.vb:

Finalmente temos o código da Region Navegacao:

''' <summary>

''' Navega para o registro anterior se possivel

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

'''

Private Sub tsbAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbAnterior.Click

SalvaCarroAtual()

If posicaoAtual <> 0 Then

   posicaoAtual -= 1

   carroAtual = carros(posicaoAtual)

   carregaCarroAtual()

End If

End Sub

 

''' <summary>

''' Navega para o pr¢ximo registro

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub tsbProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbProximo.Click


SalvaCarroAtual()


If
posicaoAtual < (carros.Count - 1)
Then

   posicaoAtual += 1

   carroAtual = carros(posicaoAtual)

   carregaCarroAtual()

End If

End Sub

 

End Sub

Vamos criar ainda uma ultima Region chamada MudaEstado onde iremos colocar o código relativo a mudança da variável FlagForm para True;

''' <summary>

''' Muda o estado para de FlagFrom sempre que o usu rio

''' digitar algo no textbox nome do carro

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub txtNome_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _

Handles txtNome.KeyPress

 

flagForm = True
 

'converte para caixa alta

If Char.IsLower(e.KeyChar) Then

'Converte o texto para caixa alta

txtNome.SelectedText = Char.ToUpper(e.KeyChar)

e.Handled = True

End If

 

End Sub

 

 

''' <summary>

''' Muda o estado para de FlagFrom sempre que o usu rio

''' clicar na combo Marca

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub cboMarca_MouseClick(ByVal sender As System.Object,  ByVal e As System.Windows.Forms.MouseEventArgs) _

Handles cboMarca.MouseClick

flagForm = True

End Sub

 

 

''' <summary>

''' Muda o estado para de FlagFrom sempre que o usu rio

''' digitar no textbox modelo

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub txtModelo_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _

Handles txtModelo.KeyPress

flagForm = True

End Sub

 

 

''' <summary>

''' Muda o estado para de FlagFrom sempre que o usu rio

''' digitar algo no campo Detalhes

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub txtDetalhes_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _

Handles txtDetalhes.KeyPress

flagForm = True

End Sub

 

 

''' <summary>

''' Muda o estado para de FlagFrom sempre que o usu rio

''' sempre que o usu rio abrir o datetimePicker

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub dtpRegistro_CloseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles dtpRegistro.CloseUp

flagForm = True

End Sub

 

 

''' <summary>

''' Dirty the form if the user

''' opens the dtp control

''' </summary>

''' <param name="sender"></param>

''' <param name="e"></param>

''' <remarks></remarks>

Private Sub dtpTime_CloseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles dtpTime.CloseUp

flagForm = True

End Sub

 

E com isso concluímos o nosso pequeno sistema para gerenciar uma coleção de carros sem usar um banco de dados, note que estamos persistindo texto e também a imagem do carro usando a serialização e os recursos da plataforma .NET. Com isso temos um sistema bem leve e apropriado para gerenciar informações de pequeno volume e sem muita complexidade.

Você pode incrementar o sistema usando o seu talento e eu espero que os conceitos abordados sejam úteis.

Pegue o projeto completo aqui : colecaoCarros.zip

Eu sei , é apenas VB .NET , mas eu gosto..

referências:


José Carlos Macoratti