Gerenciando dados sem usar banco de dados - II


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.

Vamos aproveitar o formulário form1.vb criado por padrão quando da criação da solução para criar a interface com o usuário.

A partir da caixa de ferramentas inclua os componentes MenuStrip e ToolStrip no formulário alterando a propriedade name para mnuCarros e tsbCarros respectivamente;

O componente MenuStrip , mnuCarros, iremos criar o menu conforme a figura abaixo contendo as seguintes opções:

No componente ToolStrip vamos incluir os ícones referente as principais opções; para isso clique com o botão direito sobre o item e selecione Set Image;

A Seguir na janela Select Resource selecione Local Resource e clique no botão Import selecionando o ícone correspondente;

Com isso já temos parte da interface criada falta definir o código referente a cada opção, as variáveis que iremos usar no projeto e outros detalhes a nível de código. Vamos completar o leiaute do formulário incluindo 3 controles TextBox, 1 combobox , 1 datetimepicker , um Picturebox e um Button conforme a figura abaixo:

Para facilitar o entendimento e a manutenção vamos agrupar o código em regiões usando o recurso Region. Para isso digite #Region seguido do nome da região entre Aspas: #Region "Membros" e tecle Enter. Desta forma , para iniciar vamos criar 3 regiões definidas como :

Abaixo temos uma visão do código contendo as regiões criadas;

Na região Construtor iremos usar o evento Load do formulário para iniciar uma lista de carros, definir a data do registro como a data de hoje , posição atual como zero e o estado como False;

Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

' cria uma nova lista de carros

' pronta para escrever dados

carros = New List(Of Carros)()

carroAtual = New Carros()

carros.Add(carroAtual)
 

' define a dsta de registro

dtpRegistro.Value = DateTime.Now


' inicia a posi‡Æo atual

posicaoAtual = 0


' marca o form como False

flagForm = False

End Sub

Na Region ManutencaoCarros iremos definir as diversas rotinas referente as opções do menu : Novo, Abrir, Salvar, Salvar Como e Sair.

Veja abaixo a figura para o código definido na Region "ManutencaoCarros", perceba como temos um código organizado, com uma breve descrição facilitando assim a sua manutenção:

Eu não vou exibir aqui o código para cada uma das rotinas vejamos então a rotina para definir a imagem do carro que é executada quando o usuário clica no botão - Define Imagem:

''' <summary>

''' Carrega imagem para o picture box

''' </summary>

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

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

''' <remarks></remarks>

Private Sub btnDefineImagem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDefineImagem.Click
 

flagForm = True

Dim imageFilePath As String = String.Empty

Dim OpenFileDialog1 As New OpenFileDialog()


OpenFileDialog1.Title =
"Abrir Arquivo Imagens"

OpenFileDialog1.Filter = "JPEG Documents (*.jpg)|*.jpg|Gif Files|*.gif"

 

'se o usuário cancelar a operação retorna
If
OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.Cancel
Then

   Return

End If

 

'obtem o nome do arquivo selecionado

imageFilePath = OpenFileDialog1.FileName


'se o caminho for inválido retorna

If String.IsNullOrEmpty(imageFilePath) Then

    Return

End If


'se o arquivo não existir retorna

If File.Exists(imageFilePath) = False Then

   Return

End If

 

Try

   ' converte Imagem para um byte array e salva

    Dim fsImage As FileStream = Nothing

   fsImage = File.Open(imageFilePath, FileMode.Open, FileAccess.Read)


   
Dim bArrImage(fsImage.Length) As Byte

   fsImage.Read(bArrImage, 0, Convert.ToInt32(fsImage.Length))

   fsImage.Close()


   '' carroAtual representa um carro definido na classe Carros

    '' Imagem e NomeImagem são membros de Carros

    carroAtual.Imagem = bArrImage

    carroAtual.NomeImagem = imageFilePath

     Dim ms As New MemoryStream(bArrImage)

    picFoto.Image = Image.FromStream(ms)

    ms.Dispose()

Catch ex As Exception

    MessageBox.Show(ex.Message, "Erro ao armazenar imagem")

End Try

End Sub

A rotina para salvar os dados informados no formulário, acionada quando o usuário clica na opção Salvar, usando o método Serialize da classe Serializador, para um arquivo texto definido com a extensão .car pode ser visto a seguir:

Private Sub SalvarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalvarToolStripMenuItem.Click

 

SalvaCarroAtual()

 

If String.IsNullOrEmpty(caminhoArquivoAtual) Then

     Dim SaveFileDialog1 As New SaveFileDialog()

Try

    SaveFileDialog1.Title = "Salva documento CAR"

    SaveFileDialog1.Filter = "CAR Documentos (*.car)|*.car"


    
If SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.Cancel Then

          Return

      End If

Catch

      Return

End Try
 

caminhoArquivoAtual = SaveFileDialog1.FileName


End
If


If
String.IsNullOrEmpty(caminhoArquivoAtual)
Then

        MessageBox.Show("O caminho nÆo esta definido.", "Erro")

           Return

End If
 

Serializador.Serialize(caminhoArquivoAtual, carros)
 

MessageBox.Show("Arquivo " + caminhoArquivoAtual + " salvo.", "Salvo")

flagForm = False


End
Sub

A rotina SalvaCarroAtual() apenas verifica se o nome do carro foi informado e obtém os dados do formulário para o array:

Private Sub SalvaCarroAtual()
 

If Not String.IsNullOrEmpty(txtNome.Text) Then

Try

    carroAtual.NomeCarro = txtNome.Text

    carroAtual.Marca = cboMarca.Text

    carroAtual.Modelo = txtModelo.Text

    carroAtual.Detalhes = txtDetalhes.Text

    carroAtual.dataRegistro = dtpRegistro.Value

    ' o byte array da imagem do carro ‚ definida

     ' via botÆo de comando

Catch ex As Exception

    MessageBox.Show(ex.Message, "Erro")

End Try

End If

End Sub

Vamos agora criar a classe que irá ser usada para serializar e deserializar os dados na aplicação.

A primeira coisa a fazer é clicar com o botão direito do mouse sobre o nome do projeto e selecionar as opções Add -> Class ;

A seguir informe Serializador.vb como nome da classe e clique em Add;

A seguir vamos definir dois métodos estáticos :

Imports System

Imports System.Collections.Generic

Imports System.Text

Imports System.IO

Imports System.Collections

Imports System.Runtime.Serialization.Formatters.Binary

Imports System.Runtime.Serialization


Public
Class Serializador
 

Public Shared Sub Serialize(ByVal strPath As String, ByVal mArquivo As List(Of Carros))


Dim
fs As FileStream = New
FileStream(strPath, FileMode.OpenOrCreate)

Dim formatador As BinaryFormatter = New BinaryFormatter()

Try

   formatador .Serialize(fs, mArquivo)

   fs.Close()

Catch ex As SerializationException

   MessageBox.Show(ex.Message + ": " + ex.StackTrace, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub

'-----------------------------------------------------------------------------------------------------------------

Public Shared Function Deserialize(ByVal strPath As String) As List(Of Carros)

Dim fs As FileStream = New FileStream(strPath, FileMode.Open)

Dim mArquivo As New List(Of Carros)()

 

Try

   Dim Formatter As New BinaryFormatter()

   mArquivo = Formatter.Deserialize(fs)

   fs.Close()

   Return mArquivo

Catch ex As SerializationException

    MessageBox.Show(ex.StackTrace, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error)

     Return mArquivo

End Try

End Function
 

End Class

Já temos as rotinas para salvar as informações e abrir o arquivo de dados , com isso , já podemos testar nossa aplicação informando alguns dados e salvando-os em um arquivo .car;

Abaixo temos a figura onde os dados informados foram salvos em um arquivo chamado carros.car. Para ter acesso as informações basta selecionar no menu a opção Arquivo->Abrir;

Na última parte deste arquivo irei criar as rotinas para incluir, excluir e navegar pelos registros do arquivo salvo.

Veja a continuação do artigo em : Gerenciando dados sem usar banco de dados - III

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

referências:


José Carlos Macoratti