' module de base. Utiliser le démo pour l'utiliser.
Option Explicit
' Module de conversion et calcul d'espace
' vbfrance, dpouliot
' inspiré d'un code de < vbfrance, vbtom > merci
Public Type t_OKMG ' structure des valeurs par catégorie
val(8) As Double ' nombre octet, kilo, etc...
nom(8) As String ' nom de la valeur
top_ref As Integer ' si 3 = nombre en Giga illimité
' si 4 = nombre en tera illmité, etc...
End Type
' **********************************************************
' initialisation et mise à zéro d'une structure
Sub fnc_init_OKMG(okmg As t_OKMG)
Dim cc As Integer
While cc < 8
okmg.val(cc) = 0
cc = cc + 1
Wend
okmg.top_ref = 4 ' 4 = le plus haut résultat en Tera
' cette valeur pourra être plus grande que 1024
' nom des carégories
okmg.nom(0) = "octet(s)" ' Octet
okmg.nom(1) = "Ko" ' Kilo Octets
okmg.nom(2) = "Mo" ' méga Octets
okmg.nom(3) = "Go" ' Giga Octets
okmg.nom(4) = "To" ' tera Octets
okmg.nom(5) = "Po" ' penta Octets
okmg.nom(6) = "Eo" ' exa Octets
okmg.nom(7) = "Zo" ' zetta Octets
okmg.nom(8) = "Yo" ' yotta Octets
End Sub
' **********************************************************
' cette fonction prend toute les valeurs de ces catégories
' et les ramenent en multiple de 1024 par catégorie
Function fnc_okmg_cnv(okmg As t_OKMG) As t_OKMG
Dim p_grand As Double
Dim cc As Integer
Screen.MousePointer = 11
p_grand = 1073741824 ' 1Go, valeur max utiliser pour éviter dépassement de capacité mémoire
While cc < okmg.top_ref
While okmg.val(cc) >= p_grand
okmg.val(cc) = okmg.val(cc) - p_grand
okmg.val(cc + 1) = okmg.val(cc + 1) + (p_grand / 1024)
Wend
okmg.val(cc + 1) = okmg.val(cc + 1) + (okmg.val(cc) \ 1024) ' entier de la division
okmg.val(cc) = okmg.val(cc) Mod 1024 ' le mod donne erreur
cc = cc + 1
Wend
fnc_okmg_cnv = okmg
Screen.MousePointer = 0
End Function
' **********************************************************
Function fnc_okmg_add(okmg_1 As t_OKMG, okmg_2 As t_OKMG) As t_OKMG
Dim cc As Integer
Dim okmg_3 As t_OKMG
fnc_init_OKMG okmg_3
While cc <= okmg_3.top_ref
okmg_3.val(cc) = okmg_1.val(cc) + okmg_2.val(cc)
cc = cc + 1
Wend
okmg_3 = fnc_okmg_cnv(okmg_3)
fnc_okmg_add = okmg_3
End Function
' **********************************************************
' ATT. : ne pas faire de soustraction négative, pas traité
Function fnc_okmg_sous(okmg_1 As t_OKMG, okmg_2 As t_OKMG) As t_OKMG
Dim cc As Integer
Dim okmg_3 As t_OKMG
fnc_init_OKMG okmg_3
cc = 0
While cc < okmg_3.top_ref
If okmg_1.val(cc) < okmg_2.val(cc) Then
okmg_1.val(cc) = okmg_1.val(cc) + 1024
okmg_1.val(cc + 1) = okmg_1.val(cc + 1) - 1
End If
cc = cc + 1
Wend
cc = 0
While cc < okmg_3.top_ref
okmg_3.val(cc) = okmg_1.val(cc) - okmg_2.val(cc)
cc = cc + 1
Wend
okmg_3 = fnc_okmg_cnv(okmg_3)
fnc_okmg_sous = okmg_3
End Function
' **********************************************************