![]() |
||||||||
|
||||||||
|
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) Public Property Let Nota(ByVal vData As Integer) mvarNota = vData
Public Property Get Nota() As Integer Nota = mvarNota
Public Property Let Turma(ByVal vData As Integer) |
mvarTurma = vData Turma = mvarTurma Public Property Let Nome(ByVal vData As String) mvarNome = vData
Public Property Get Nome() As String Nome = mvarNome |
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