OVH Cloud OVH Cloud

tableau associatif?

2 réponses
Avatar
Zeg
Bonjour,
Je souhaiterai utilisé des tableaux associatifs:
Tab(label) = value
Quelle structure de données peut me permettre cette utilisation?
Merci d'avance

2 réponses

Avatar
Antoine Dinimant
les collections

Zeg a écrit:
Bonjour,
Je souhaiterai utilisé des tableaux associatifs:
Tab(label) = value
Quelle structure de données peut me permettre cette utilisation?
Merci d'avance




Avatar
ng
Salut,

On pourrait aussi utiliser une classe :

'// Code sur Form1 :

Private Sub Form_Load()
Dim cTest As cATbl, i As Integer
Set cTest = New cATbl
'//Ajout
Call cTest.Add("fr", "salut")
Call cTest.Add("en", "hi")
Call cTest.Add("de", "hallo")

'//Listage standart
For i = 1 To cTest.Count
MsgBox "Liste : " & cTest.Item(i)
Next

'//Appel par nom
MsgBox "Par nom : " & cTest.Item("de")
MsgBox "Par nom : " & cTest.Item("fr")
MsgBox "Par nom : " & cTest.Item("en")

'//Suppresion
Call cTest.Remove(2) '//Enlève en

For i = 1 To cTest.Count
MsgBox "Liste : " & cTest.Item(i)
Next

Call cTest.Remove("de")

For i = 1 To cTest.Count
MsgBox "Liste 2 : " & cTest.Item(i)
Next

Set cTest = Nothing
End Sub


'//Classe cATbl :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(vID As Variant)
Select Case VarType(vID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(vID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(vID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property


Public Property Get Item(vID As Variant) As Variant
Select Case VarType(vID)
Case vbInteger, vbLong
Item = m_tblData(CInt(vID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(vID))).vData
End Select
End Property

Public Property Let Item(vID As Variant, ByVal vNewValue As Variant)
Select Case VarType(vID)
Case vbInteger, vbLong
m_tblData(CInt(vID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(vID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function



--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Zeg a écrit :

Bonjour,
Je souhaiterai utilisé des tableaux associatifs:
Tab(label) = value
Quelle structure de données peut me permettre cette utilisation?
Merci d'avance