Ščitenje resursov v VBA končni primer

Za konec tega kratkega sprehoda skozi ščitenje resursov v okolju VBA (prvi del, drugi del in tretji del), si poglejmo še zaključni primer, torej ščitenje dostopa do datoteke.

Prikazal bom preprost razred, ki hrani številko (VBA do datotek prihaja preko številk, ki jih dodeli posamezni datoteki) in v kolikor je številka postavljena, kar pomeni, da je bila datoteka odprta, jo ob uničenju objekta zapre in uniči številko.

Z uporabo takšnega razreda oz. spremenljivke tega razreda lahko zanesemo na dejstvo, da bo vsaka datoteka, ki smo jo odprli tudi zaprta.

Razred za zaščito dostopa datotek

Option Explicit

' tu hranimo ID datoteke
Private idDatoteke

Private Sub Class_Initialize()
  ' na začetku ID-ja datoteke ne poznamo,
  ' saj datoteke še nismo odprli
  idDatoteke = -1
End Sub

Private Sub Class_Terminate()
  ' v kolikor smo datoteko odprli
  ' jo tudi zapremo
  If (idDatoteke > 0) Then
    Close #idDatoteke
  End If
End Sub

' s to funkcijo datoteko odpremo in tudi izvemo ali
' nam je odpiranje uspelo ali ne
Public Function Odpri(imeDatoteke As String, _
                      vhod As Boolean) As Boolean
  ' predpostavimo, da nam odpiranje ne bo usplo
  Odpri = False

  ' pridobimo novo število
  idDatoteke = FreeFile

  ' v primeru napake odregiramo
  On Error GoTo napaka

  ' ali želimo datoteko pisati ali brati
  If (vhod) Then
    Open imeDatoteke For Input As idDatoteke
  Else
    Open imeDatoteke For Output As idDatoteke
  End If

  ' če smo prišli do sem, je odpiranje uspelo
  Odpri = True

  ' končamo
  Exit Function

napaka:
  ' če smo tu, pomeni, da odpiranje ni uspelo
  idDatoteke = -1
End Function

' samo okrajšava gornje funkcije
Public Function OdpriZaBranje(imeDatoteke As String) _
                              As Boolean
  OdpriZaBranje = Me.Odpri(imeDatoteke, True)
End Function

' samo okrajšava gornje funkcije
Public Function OdpriZaPisanje(imeDatoteke As String) _
                              As Boolean
  OdpriZaPisanje = Me.Odpri(imeDatoteke, False)
End Function

' lastnost, ki nam vrne identifikacijsko
' številko datoteke, preko katere se bomo
' nanjo sklicevali
Public Property Get id()
  id = idDatoteke
End Property

Primer uporabe

Option Explicit

Sub beriDatoteko(ime As String)
  ' ustvarimo spremenljivko
  Dim dat As New clsDatoteka

  ' v kolikor datoteke ne moremo odpreti končamo
  If (Not dat.OdpriZaBranje(ime)) Then Exit Sub

  ' spremenljivka, kamor bomo prebrali vsebino
  Dim vrstica

  ' vrtimo se dokler ne pridemo na konec datoteke
  Do While Not EOF(dat.id)
    Line Input #1, vrstica ' preveremo vsebino
    MsgBox vrstica ' in jo izpišemo
  Loop

  ' datoteka se bo zaprla sama
End Sub

Sub pisiDatoteko(ime As String)
  ' ustvarimo spremenljivko
  Dim dat As New clsDatoteka

  ' v kolikor datoteke ne moremo odpreti končamo
  If (Not dat.OdpriZaPisanje(ime)) Then Exit Sub

  ' pišemo
  Print #dat.id, "Prva vrstica v datoteki"
  Print #dat.id, "Druga vrstica v datoteki"
  Print #dat.id, "Tretja vrstica v datoteki"
End Sub

Sub Test()
  Dim ime As String

  ime = "d:\test.out"

  ' to ne bo uspelo
  beriDatoteko ime

  ' če ste ustrezno ureili ime bo to uspelo
  pisiDatoteko ime

  ' če je uspelo pisanje, bo tudi branje
  beriDatoteko ime
End Sub

Komentirajte prispevek

This site uses Akismet to reduce spam. Learn how your comment data is processed.