Skip Navigation Links





Microsoft Visual Basic
Este curso fornece conceitos avançados de programação com Visual Basic, tal como manipulação e criação de componentes e servidores COM e programação para a internet. Preparatório para prova da Microsoft.
Valor : R$ 246,00 ou 5 X de R$ 52,00


Quer saber mais?
Torne-se um MCP em Visual Basic
Faça um treinamento na Búfalo Informática

Gravação de Classes

Vou responder a uma pergunta que muitos já me fizeram : Eu consigo gravar uma classe em disco ? A resposta é sim, você pode guardar classes em disco. Em geral, dentro de um projeto, o que ocorre é que a classe vai ao banco de dados e faz a gravação dos dados. Algumas classes, neste caso, não estarão modeladas de acordo com a orientação a objeto (regras de análise) mas servirão de ponte entre o modelo orientado a objeto e o modelo relacional.

Mas e se você quiser gravar a classe em disco e recupera-la depois, é possível ? Sim, é possível.

Esse recurso que irei demonstrar normalmente não é usado para tarefas primárias dentro de sistemas, apenas tarefas secundárias, mas pode vir a ser útil.

Vamos começar com um projeto Standart e um ActiveX DLL. A partir do Standart utilize File->Add Project para adicionar um novo projeto (ActiveX DLL).

Criaremos uma classe dentro deste projeto chamada CL_STUDENT. Vocês podem utilizar o Class Builder para fazer isso. Essa classe irá conter 3 propriedades :

Nome String
Nota Inteiro
Turma Inteiro

Veja como fica o código gerado pelo Class Builder :

 

'local variable(s) to hold property value(s)
Private mvarNome As String 'local copy
Private mvarTurma As Integer 'local copy
Private mvarNota As Integer 'local copy

Public Property Let Nota(ByVal vData As Integer)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.Nota = 5

mvarNota = vData
End Property

 

Public Property Get Nota() As Integer
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.Nota

Nota = mvarNota
End Property

 

Public Property Let Turma(ByVal vData As Integer)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.Turma = 5

mvarTurma = vData
End Property

Public Property Get Turma() As Integer
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.Turma

Turma = mvarTurma
End Property

Public Property Let Nome(ByVal vData As String)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.Nome = 5

mvarNome = vData
End Property

 

Public Property Get Nome() As String
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.Nome

Nome = mvarNome
End Property

 

Para que seja possível gravar esta classe em disco será necessário alterar a propriedade Persistable da classe. Com o módulo de classe selecionado na janela Project Explorer altere o valor da propriedade Persistable para "Persistable " ( o default é "Not Persistable"). Essa alteração faz com que seja possível gravar a classe em disco sem perder o valor de suas propriedades.

Aparentemente nada mudou. Mas se na janela de código você selecionar, na combo box da esquerda, a classe ("class") e abrir a combo box da direita, você verá que 2 novos eventos surgiram : ReadProperties e WriteProperties. Vocês certamente já utilizaram esses 2 eventos para a criação de componentes ActiveX, para manter os valores das propriedades entre design-time e run-time. O uso dentro da classe será exatamente o mesmo.

O código ficará da seguinte forma :

 

Feito isso a classe já possui tudo de que necessita para ser gravada em disco. Falta apenas a montagem do código de gravação. Este código ficará no form, que no caso é quem fará uso da classe.

Assim sendo, criaremos no form os seguintes objetos : 3 labels, 3 textbox

Nomes :
txtnome
txtturma
txtnota

Private Sub Class_ReadProperties(PropBag As PropertyBag)

mvarNome = PropBag.ReadProperty("nome", "")
mvarTurma = PropBag.ReadProperty("turma", 0)
mvarNota = PropBag.ReadProperty("nota", 0)

End Sub Private

Sub Class_WriteProperties(PropBag As PropertyBag)

PropBag.WriteProperty "nome", mvarNome, ""
PropBag.WriteProperty "Turma", mvarTurma, 0
PropBag.WriteProperty "Nota", mvarNota, 0

End Sub

3 botões
Nomes :
cmdOk
cmdSalvar
cmdler

Como se trata apenas de um projeto de teste, não me preocuparei com alguns detalhes, tal como validação dos dados. Além disso não irei me preocupar com local de gravação. Vamos gravar de forma fixa utilizando apenas o arquivo c:\classe.dat

O objetivo do botão OK será gravar os dados das caixas na classe. Assim sendo o código ficará da seguinte forma :

Observem que a variável ST foi criada no General do form, para poder ser vista por todas as subs.

Não esqueçam de setar a referencia no projeto Standart para o projeto ActiveX DLL (project->references). Lembram das questões de Early Binding, né ?

Dim st As New CL_STUDENT

Private Sub cmdok_Click()
st.Nome = txtnome.Text
st.Nota = txtnota.Text
st.Turma = txtturma.Text
End Sub

O botão salvar precisará checar se o arquivo classe.dat já existe e, se existir, precisará deleta-lo. Para isso iremos utilizar o FileSystemObject, portanto, marque referência para a biblioteca "Microsoft Scripting Runtime".

O inicio do código do botão salvar ficará como abaixo :

Ou seja : o botão instancia o objeto FileSystemObject, verifica se o arquivo classe.dat existe e, se existir, deleta o arquivo.

Para completarmos esse código o conceito que precisaremos utilizar é muito simples : Podemos nos aproveitar do objeto PropertyBag para transformarmos a nossa classe em um array de bytes e grava-la em um arquivo texto.

Assim sendo, o código completo do botão salvar fica como abaixo :

Private Sub cmdsalvar_Click()
Dim fs As New FileSystemObject

If fs.FileExists("C:\classe.dat") Then
fs.DeleteFile ("c:\classe.dat")
End If

End Sub

Observe :

- É criada e instanciada uma variável como sendo um PropertyBag
- Um arquivo texto é aberto
- É utilizado o WriteProperty do PropertyBag para jogar a variável st (a classe cl_student, lembra?) para o PropertyBag
- A partir disso a propriedade Contents contém um array de bytes com todo o conteúdo do propertybag.
- A propriedade Contents é então transferida para a variável vartemp, que é um array de bytes
- A variável vartemp é gravada no arquivo sequencial
- O arquivo é fechado após o encerramento da gravação.

Observe que você poderia ainda gravar diversas classes em um mesmo arquivo, bastando usar várias vezes o WriteProperty com nomes de propriedades diferentes.

Agora fica faltando a leitura da classe do disco. O botão ler irá fazer esse trabalho.

Observe :

- Instancia um propertybag
- Define uma variável como array de bytes e outra como variant
- Abre o arquivo e le os dados para a variavel Variant
- Transfere a variavel Variant para o Array de Bytes
- Atribui o array de bytes à propriedade Contents do propertybag
- Atribui à variável ST que foi definida no General a classe que se encontra guardada no PropertyBag
- Exibe os dados nas caixas de texto Com um pouquinho de criatividade você pode criar seus próprios modelos de objeto com recurso de gravação e recuperação de dados na forma de classes

Private Sub cmdsalvar_Click()
Dim fs As New FileSystemObject
Dim prop As New PropertyBag
Dim vartemp() as byte

If fs.FileExists("C:\classe.dat") Then
fs.DeleteFile ("c:\classe.dat")
End If

Open "C:\classe.dat" For Binary As #1
prop.WriteProperty "Objeto", st
vartemp = prop.Contents
Put #1, , vartemp

Close #1
MsgBox "Gravado!"

End Sub

Private Sub cmdler_Click()
Dim prop As New PropertyBag
Dim ab() As Byte Dim vartemp As Variant

Open "C:\classe.dat" For Binary As #1
Get #1, , vartemp
Close #1

ab = vartemp
prop.Contents = ab
Set st = prop.ReadProperty("Objeto")

txtnome.Text = st.Nome
txtnota.Text = st.Nota
txtturma.Text = st.Turma

End Sub

Dennes Torres

Dennes Torres é MCSD,MCSE e MCDBA. Atualmente atua como diretor e instrutor da Búfalo Informática