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
posicaoAtual = 0
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.Filter = "JPEG Documents (*.jpg)|*.jpg|Gif Files|*.gif"
'se o usuário cancelar a operação retorna Return End If
'obtem o nome do arquivo selecionado imageFilePath = OpenFileDialog1.FileName
If String.IsNullOrEmpty(imageFilePath) Then Return End If
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)
fsImage.Read(bArrImage, 0, Convert.ToInt32(fsImage.Length)) fsImage.Close()
'' 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"
Return End If Catch Return End
Try caminhoArquivoAtual = SaveFileDialog1.FileName
MessageBox.Show("O caminho nÆo esta definido.", "Erro") Return End
If Serializador.Serialize(caminhoArquivoAtual,
carros) MessageBox.Show("Arquivo " + caminhoArquivoAtual + " salvo.", "Salvo") flagForm = False
|
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 Shared Sub Serialize(ByVal strPath As String, ByVal mArquivo As List(Of Carros))
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