'Primer 15a: Klasni modul (definicija klase) Vreme
Option Explicit
'Klasni modul Vreme

'Svojstva objekta. Public znaci da su sva dostupna drugim objektima
Public m_iSat As Integer
Public m_iMinut As Integer
Public m_iSekund As Integer
Public m_iMilisekund As Integer

'Konstruktor - dodeljuje vrednosti svojstvima objekta (inicijalizuje ih)
Public Sub init(sVreme As String)
    iseckajVreme2 sVreme
End Sub

'Konstruktor2 - dodeljuje vrednosti svojstvima objekta (inicijalizuje ih)
Public Sub init2(sSat As String, sMinut As String, sSekund As String, sMilisekund As String)
   m_iSat = CInt(sSat)
   m_iMinut = CInt(sMinut)
   m_iSekund = CInt(sSekund)
   m_iMilisekund = CInt(sMilisekund)
End Sub

'Na osnovu niske u formatu "hh:mm:ss,ms" popunjavaju se vrednosti svojstava za sate, minute, sekunde i milisekunde
Private Sub iseckajVreme2(ByVal sVreme As String)
    iseckajVreme sVreme, m_iSat, m_iMinut, m_iSekund, m_iMilisekund
End Sub

'Na osnovu niske u formatu "hh:mm:ss,ms" popunjavaju se vrednosti argumenata za sate, minute, sekunde i milisekunde
Private Sub iseckajVreme(ByVal sVreme As String, ByRef iSat As Integer, ByRef iMinut As Integer, ByRef iSekund As Integer, ByRef iMilisekund As Integer)
    Dim niz() As String
    Dim sekunde() As String
    niz = Split(sVreme, ":")
    iSat = CInt(niz(0))
    iMinut = CInt(niz(1))
    sekunde = Split(niz(2), ",")
    iSekund = CInt(sekunde(0))
    iMilisekund = CInt(sekunde(1))
End Sub

'Zbir dva vremenska zapisa. Rezultat je opet regularan vremenski zapis
'Sabirak moze sadrzati negativne vrednosti za sate, minute, sekunde i milisekunde
Public Function zbir(ByVal vreme1 As Vreme, ByVal vreme2 As Vreme) As Vreme
    Dim rezultat As New Vreme
    rezultat.m_iMilisekund = vreme1.m_iMilisekund + vreme2.m_iMilisekund
    rezultat.m_iSekund = vreme1.m_iSekund + vreme2.m_iSekund
    rezultat.m_iMinut = vreme1.m_iMinut + vreme2.m_iMinut
    rezultat.m_iSat = vreme1.m_iSat + vreme2.m_iSat
    'Korekcije kako bi milisekunde bili u opsegu [0, 999]
    If rezultat.m_iMilisekund >= 1000 Then
        rezultat.m_iMilisekund = rezultat.m_iMilisekund - 1000
        rezultat.m_iSekund = rezultat.m_iSekund + 1
    ElseIf rezultat.m_iMilisekund < 0 Then
        rezultat.m_iMilisekund = rezultat.m_iMilisekund + 1000
        rezultat.m_iSekund = rezultat.m_iSekund - 1
    End If
    'Korekcije kako bi sekunde bili u opsegu [0, 59]
    If rezultat.m_iSekund >= 60 Then
        rezultat.m_iSekund = rezultat.m_iSekund - 60
        rezultat.m_iMinut = rezultat.m_iMinut + 1
    ElseIf rezultat.m_iSekund < 0 Then
        rezultat.m_iSekund = rezultat.m_iSekund + 60
        rezultat.m_iMinut = rezultat.m_iMinut - 1
    End If
    'Korekcije kako bi minuti bili u opsegu [0, 59]
    If rezultat.m_iMinut >= 60 Then
        rezultat.m_iMinut = rezultat.m_iMinut - 60
        rezultat.m_iSat = rezultat.m_iSat + 1
    ElseIf rezultat.m_iMinut < 0 Then
        rezultat.m_iMinut = rezultat.m_iMinut + 60
        rezultat.m_iSat = rezultat.m_iSat - 1
    End If
    'Vrednost funkcije
    Set zbir = rezultat
End Function
'koristi se pri oduzimanju dva vremenska zapisa
Public Function promenaZnaka() As Vreme
    Set promenaZnaka = New Vreme
    promenaZnaka.m_iSat = -m_iSat
    promenaZnaka.m_iMinut = -m_iMinut
    promenaZnaka.m_iSekund = -m_iSekund
    promenaZnaka.m_iMilisekund = -m_iMilisekund
End Function

'Na osnovu vrednosti za sate, minute i sekunde, formira se niska u formatu "hh:mm:ss"
Public Function formatiraj() As String
    'primer rezultata je 00:03:06
    formatiraj = Format(m_iSat, "00") & ":" & Format(m_iMinut, "00") & ":" & Format(m_iSekund, "00") & "," & Format(m_iMilisekund, "000")
End Function