Naar de inhoud

MS Access VBA VB.Net

Ontwerpen van Database en VB.net voor Dummies
seniorennet.beseniorennet.be

Categorie: VB.net

Van VBA naar VB.net

VB.net

Waarom VB.net

Wie VBA onder de knie heeft ondervindt in eerste instantie niet te veel problemen om naar VB.net over te stappen. Na enige initiatie en gewenning stelt men echter vast dat de mogelijkheden extreem ruimer zijn.
Bovendien stelt Microsoft gratis een 'Expression' - versie van Visual studio ter beschikking.
Het betreft hier werkelijk een bijzondere krachtige ontwikkelings omgeving, in het Engels IDE of Integrated Development Environment.
Deze Blog heeft niet de pretentie om deze toepassing, ik werk met zowel de versie 2010 als 2012 , volledig uit de doeken te doen. Wel kan ik iedereen die graag programma's maakt, al zij het in de hobbysfeer zoals bij mezelf, deze ontwikkelingsomgeving warm aanbevelen.

Waar te bekomen ?

Via volgende link kan men gratis Visual Studio Express 2012 for Windows Desktop downloaden.
Volg de instructies en na het dowloaden en de installatie rest u nog enkel de applicatie gratis te registreren op de website van Microsoft.

Hoe onder de knie krijgen ?

Ik zelf heb mijn toevlucht gezocht bij enkele boeken over VB.net, aanraders zijn :

Deze Blog.

Op deze blog wil ik graag ervaringen delen. Van practische problemen waarop ik gezocht heb geef ik hier graag mijn oplossing.
De laatste tijd leg ik mij toe op het ontwikkelen van eenvoudige spelletjes zoals, 'Pietjesbak', 'Vier op een rij', 'Zeeslag'. Eens deze volledig op punt staan zal ik deze op deze blog ter beschikking stellen.

Hoe vind je dit bericht? 4 stemmen
Geschreven door Toon om 00:00 Reageer op dit bericht

Over willekeurige getalen.

Willekeurige getallen genereren, is een getal even of oneven

In veel programma's moeten op een bepaald ogenblik willekeurige getallen gegeneerd worden. In VB.net brengt men de code daartoe best onder in een 'class'. Hier worden een aantal class'es besproken, waar gewoon een willekeurig getal tussen twee grenzen gegeneerd wordt, maar ook waar tussen twee grenzen één zelfde waarde slechts éénmaal mag voorkomen. Ook code waarmee men kan bepalen indien het getal even of oneven is.

clsWilGet1:Willekeurig getal van Byte-datatype (0 tot 255) tussen twee limieten mag maar éénmaal voorkomen.

'System.Security.Cryptography moet in de class geImporteerd worden.
Imports System.Security.Cryptography
Public Class clsWilGet1
    Dim _set As BitArray
    Dim _min As Byte
    Dim _max As Byte
    Dim _tel As Integer


    Public Sub New(ByVal min As Byte, ByVal max As Byte)
        _min = min
        If (min > max) Then
            _max = min
        Else
            _max = max
        End If
        _set = New BitArray(_max - _min + 1)
        _tel = max - min
    End Sub


    Public Function GeefVolgendGetal() As Integer
        Dim randomGetal(0) As Byte
        Dim testGetal As Integer
        Dim rng As New RNGCryptoServiceProvider()

        Do While _tel >= 0
            rng.GetBytes(randomGetal)
            testGetal = CInt(randomGetal(0))
            testGetal = (CInt(testGetal) Mod (_max - _min + 1)) + _min
            If Not _set.Item(testGetal - _min) Then
                _set.Set(testGetal - _min, True)
                _tel -= 1
                Return testGetal
            End If
        Loop

        Return -1
    End Function


    Public Sub Reset()
        _tel = _max - _min
        _set.SetAll(False)
    End Sub
End Class

clsWilGet2:Willekeurig getal van Integer-datatype tussen twee limieten mag maar éénmaal voorkomen.

Public Class clsWilGet2
    Private _min, _max As Integer
    Private _set() As Integer 'Array of integers
    Private _index As Integer
    


    Public Sub New(ByVal min As Integer, ByVal max As Integer)
        _min = min
        If (min > max) Then
            _max = min
        Else
            _max = max
        End If

        'vorm de reeks
        _set = InitReeks()

    End Sub


    Private Function InitReeks() As Integer()

        Dim random As New Random()
        Dim getallen(_max - _min) As Integer
        Dim waarde As Integer = _min
        Dim tmp As Integer
        Dim index1 As Integer
        Dim index2 As Integer

        'vul de rees met de getallen

        For x As Integer = 0 To getallen.Length - 1
            getallen(x) = waarde
            waarde += 1
        Next

        'haal door elkaar 1000 iteraties moeten voldoende zijn

        For x As Integer = 0 To 1000
            'neem twee willekeurige indexen
            index1 = random.Next(0, getallen.Length)
            index2 = random.Next(0, getallen.Length)

            'haal door elkaar
            tmp = getallen(index1)
            getallen(index1) = getallen(index2)
            getallen(index2) = tmp

        Next
       

        Return getallen

    End Function


    Public Function GetNext() As Integer

        Dim result As Integer

        If (_index < _set.Length) Then
            result = _set(_index)
            _index += 1
        Else
            result = -1
        End If

        Return result

    End Function
End Class

clsWilGet3:Willekeurig getal van Integer-datatype tussen twee limieten mag maar éénmaal voorkomen.

Public Class clsWilGet3
    Private rand As Random
    Private pool As List(Of Integer)

    Sub New(ByVal min As Integer, ByVal max As Integer)
        rand = New Random
        pool = New List(Of Integer)(max - min)
        For i As Integer = min To max
            pool.Add(i)
        Next
    End Sub

    Public Function GeefItem() As Integer
        If pool.Count = 0 Then Return -1
        ' geef willekeurige index van de pool List.
        Dim index As Integer = rand.Next(0, pool.Count)
         ' geef weer.
        Dim draw As Integer = pool(index)
         ' verwijder van de pool List.
        pool.RemoveAt(index)
        Return draw
    End Function
End Class

clsWilGetal1, clsWilGetal2, clsWilGetal3 weergeven in een console-toepassing.

Sub Main()
        

        Dim raad1 As New clsWilGet1(1, 100)
        Dim raad2 As New clsWilGet2(1, 100)
        Dim raad3 As New clsWilGet3(1, 100)
        For intTel As Integer = 0 To 20
            Console.Write(raad1.GeefVolgendGetal & " - " & raad2.GetNext & " - " & raad3.GeefItem & vbCrLf)
        Next
        Console.ReadLine()
    End Sub

Willekeurig getal tussen twee limieten


''' Generen van een willekeurig getal tussen 0 en 7, men kan de limieten wijzigen


Public Class clsWilGetal
    Private Shared _intWilGetal As Integer



    Public Shared ReadOnly Property Genereer() As Integer
        Get
            Dim intBoven As Integer = 6
            Randomize()
            _intWilGetal = CInt(Int((intBoven * Rnd()) + 1))

            Return _intWilGetal
        End Get

    End Property

End Class

Is een getal Even of Oneven?

Sub OnOfEven()
        Dim intTeller As Integer = 1
        Dim strEven As String = "even"
        Dim strOneven As String = "oneven"
        Dim strResul As String = ""
        Do While intTeller < 100 'hier tot 100 maar kan meer zijn
            If intTeller Mod 2 = 0 Then 'getal is even
                strResul = strEven
            Else
                strResul = strOneven
            End If
            Console.WriteLine(intTeller & "is " & strResul)
            intTeller = intTeller + 1
        Loop
    End Sub

Priemgetallen weergeven tot opgegeven bovengrens

Public Function Priem(ByVal intMaxGrens As Integer) As String
        Dim i As Integer
        Dim j As Integer
        Dim bflag As Boolean
        Dim strResul As String = ""
        For i = 1 To intMaxGrens
            bflag = True
            For j = 2 To i / 2
                If i Mod j = 0 Then
                    bflag = False
                End If
            Next
            If bflag Then

                strResul += i.ToString & " "
            End If
        Next
        Return Trim(strResul)
    End Function
Hoe vind je dit bericht? 1 stem
Geschreven door Toon om 00:00 Reageer op dit bericht

String

Datatype String

Het String datatype vertegenwoordigt reeksen van letters en cijfers, waar men met cijfers in principe geen wiskundige bewerkingen beoogt.
VB.net laat diverse stringmanipulaties toe, waarvan enkele handige hieronder besproken worden.

 Public Sub StringMan()
        Dim mijnEersteString As String = ""
        Dim mijnTweedeString As String = ""
        Dim mijnDerdeString As String = ""
        Dim mijnVierdeString As String = ""
        Dim mijnVijfdeString As String = ""
        Dim mijnZesdeString As String = ""
        Dim mijnZevendeString As String = ""
        Dim mijnAchtsteString As String = ""
        Dim mijnNegendeString As String = ""
        
De Format-methode: mijnEersteString = String.Format("{0}!", "Een allebeste goede morgen") Debug.Print("Mijn eerste string:" & mijnEersteString) 'Retourneert : Mijn eerste string:Een allebeste goede morgen! 'Gebruikmakend van de Format methode en de accoladetekens kan men zogenaamde substitutie verwezenlijken 'Meedere substituties zijn mogelijk, zoals bijvoorbeeld mijnTweedeString = String.Format("Mijn TV van merk {0} Type {1} Bouwjaar {2}", "Sony", "Bravia", 2012) Debug.Print("Mijn tweede string:" & mijnTweedeString) 'Retourneert : Mijn tweede string:Mijn TV van merk Sony Type Bravia Bouwjaar 2012 'De format methode kan met C duiding ook gebruikt worden voor munt aanduiding overeenstemmend met de plaatselijke instelling in Windows mijnDerdeString = String.Format("{0:C}", 100.75) Debug.Print("Mijn derde string:" & mijnDerdeString) 'Retourneert : Mijn derde string:€ 100,75 'De format methode met N duiding geeft correcte punctuatie van een getal mijnVierdeString = String.Format("{0:N}", 1234567890) Debug.Print("Mijn vierde string:" & mijnVierdeString) 'Retourneert = Mijn vierde string:1.234.567.890,00 'De format methode met P duiding geeft een getal in procenten terug mijnVijfdeString = String.Format("{0:P}", 0.25) Debug.Print("Mijn vijfde string:" & mijnVijfdeString) 'Retourneert : Mijn vijfde string:25,00% 'Met de format methode kan men bijvoorbeeld ook een telefoon of GSM nummer in een correctie vorm weergeven 'Nemen wij bijvoorbeeld een GSM nummer door de gebruiker ingegeven als 0475 23 34 89 Dim strGSM = "0475 23 34 89 " 'Met de Trim functie verwijderen wij alle eerste en laatste spaties strGSM = Trim(strGSM) 'Vervolgens verwijderen spaties binnen het nummer strGSM = strGSM.Replace(" ", "") 'controleren indien 10 cijfers opgegeven werden, dan de eerste nul verwijderen en dan getal laten vooraf gaan door 32 If strGSM.Length = 10 AndAlso Left(strGSM, 1) = "0" Then strGSM = "32" & Right(strGSM, 9) Dim lng As Long = CLng(strGSM) mijnZesdeString = String.Format("GSM-nr = +{0: ##### ## ## ##}", lng) Debug.Print("Mijn zesde string:" & mijnZesdeString) 'Retourneert : Mijn zesde string:GSM-nr = + 32475 23 34 89 End If 'Het gebeurt dat men een string wijzigt in een lus For intTel As Integer = 0 To 100 mijnZevendeString += "--" & intTel.ToString Next Debug.Print("Mijn zevende string:" & mijnZevendeString) 'Retourneert : Mijn zevende string:--0--1--2--3--4--5--6--7--8--9--10--11 enz 'Bovenstaande werkt maar is onefficient iedere lus moet de variabele in het geheugen opgehaald en vervangen worden 'Beter is om in dergelijke gevallen gebruik te maken van het StringBuilder-object Dim mijnBuilder As New System.Text.StringBuilder For intTel As Integer = 0 To 100 mijnBuilder.Append("--") mijnBuilder.Append(intTel) Next mijnAchtsteString = mijnBuilder.ToString Debug.Print("Mijn achtste string:" & mijnAchtsteString) 'Retourneert : Mijn achtste string:--0--1--2--3--4--5--6--7--8--9--10--11 enz 'Met de Substring-methode kan mijn een vooraf bepaald gedeelte van een string afzonderen mijnNegendeString = "Uit deze string wordt een bepaald gedeelte afgezonderd" mijnNegendeString = mijnNegendeString.Substring(9, 6) Debug.Print("Mijn negende string:" & mijnNegendeString) 'Retourneert : Mijn negende string:string End Sub
Hoe vind je dit bericht? 1 stem
Geschreven door Toon om 11:44 Reageer op dit bericht

Vb.net en Tekstbestanden

Creëren, Inlezen en schrijven naar tekstbestanden.

Public Sub LezenTekstBestand_1() 
'Er bestaat een tekstbestand tweede.txt in de map van de toepassing
Dim mijnLezer As New IO.StreamReader("tweede.txt")
Dim mijnLijn As String = ""
While Not IsNothing(mijnLijn)
mijnLijn = mijnLezer.ReadLine
If Not IsNothing(mijnLijn) Then
Debug.Print("Ingelezen tekstbestand:" & mijnLijn)
End If
End While
End Sub

 Public Sub CreerTekstBestand_1()
Dim mijnPad = IO.Directory.GetCurrentDirectory & "TekstmijnTekst.txt"
If IO.File.Exists(mijnPad) = False Then
' Indien het tekstbestand niet bestaat creër het
Dim sw As IO.StreamWriter = IO.File.CreateText(mijnPad)
sw.WriteLine("Dit is de eerste lijn")
sw.WriteLine("Dit is de tweede lijn")
sw.WriteLine("Dit is de derde lijn")
sw.Flush() 'Alles die in de buffer geschreven wordt opgeslagen in het bestand terwijl de buffer geledigd wordt.
sw.Close()
' Indien het bestaat verwijder het en creër opnieuw
Else
IO.File.Delete(mijnPad)
Dim sw As IO.StreamWriter = IO.File.CreateText(mijnPad)
sw.WriteLine("Dit is de eerste nieuwe lijn")
sw.WriteLine("Dit is de tweede nieuwe lijn")
sw.WriteLine("Dit is de derde nieuwe lijn")
sw.Flush()  'Alles die in de buffer geschreven wordt opgeslagen in het bestand terwijl de buffer geledigd wordt.
sw.Close()
End If
' Bestand openen en inlezen
Dim sr As IO.StreamReader = IO.File.OpenText(mijnPad)
Do While sr.Peek() >= 0 'Geeft een integer overeenkomstig het volgende te lezen karakter Geeft -1 indien geen karakters meer te lezen zijn.
Debug.Print(sr.ReadLine())
Loop
sr.Close()
End Sub

 Public Sub Schrijven_en_Lezen_1()
If Microsoft.VisualBasic.FileIO.FileSystem.FileExists("TekstEerste.txt") Then
FileIO.FileSystem.WriteAllText("TekstEerste.txt", "-een", vbTrue)
Dim strGelezen As String = Microsoft.VisualBasic.FileIO.FileSystem.ReadAllText("TekstEerste.txt")
MsgBox(strGelezen)
End If
End Sub

Public Sub Schrijven_1()
If Microsoft.VisualBasic.FileIO.FileSystem.FileExists("TekstDerde.txt") Then
Dim schrijver As New IO.StreamWriter("TekstDerde.txt")
Dim sb As New System.Text.StringBuilder()
Dim i As Short = 0
For i = 1 To 5
sb.AppendLine("xxxxxxxxxxxxxxx")
sb.AppendLine(i.ToString)
Next
schrijver.Write(sb.ToString)
schrijver.Close()
End If
End Sub

 Public Sub schrijven_2()
'met system.IO kan men een tekstbestand maken
Dim strStartUp As String = Application.StartupPath
MsgBox("Startop pad : " & strStartUp)
MsgBox(My.Resources.Pad)
If Not IO.File.Exists(My.Resources.Pad & "Vierde.txt") Then
Using schrijver As IO.StreamWriter = IO.File.CreateText(My.Resources.Pad & "Vierde.txt") ' retourneert een streamWriter
schrijver.WriteLine("Mijn eerste lijn")
schrijver.Close()
End Using
Else
'Mijn eerste lijn wordt overschreven
Dim schrijver As New IO.StreamWriter(My.Resources.Pad & "Vierde.txt")
Using schrijver
schrijver.WriteLine("Mijn nieuwe eerste lijn")
schrijver.WriteLine("Mijn tweede lijn")
schrijver.Close()
End Using
Using schrijver2 As IO.StreamWriter = IO.File.AppendText(My.Resources.Pad & "Vierde.txt")
schrijver2.WriteLine("Mijn derde lijn")
schrijver2.Close()
End Using
End If
End Sub

Hoe vind je dit bericht?
Geschreven door Toon om 00:00 Reageer op dit bericht

Reeksen, Dictionaries, Hashtable

Reeksen = Arrays, Hashtable, Dictionaries

Reeksen of in het Engels 'Arrays' worden ook in VBA en VB.net veelvuldig toegepast. Terwijl Dictionaries,Hashtables,ArrayList niet van toepassing zijn in VBA.

Reeksen of Array

Een Array of reeks houdt data-waarden van dezelfde soort, de één na de andere. De array class biedt nuttige methoden en eigenschappen, bijvoorbeeld voor het sorteren of het tellen van de elementen in de Array. Met Arrays kan men tijdens het uitvoeren van een programma allerlei data bewaren, bewerken en opvragen. Meest voorkomend zijn ééndimensionale en tweedimensionale Arrays terwijl ook meerdimensionale Arrays mogelijk zijn. Een Array heeft een unieke Index (begint steeds met 0) waarmee de waarde kan opgevraag worden.

Declaren Array met Dim / Redim statement men moet de dimensie van de Array opgeven of wijzigen, of onmiddellijk de waarden toekennen :

Dim strNamen() As String = {"Deblauwe", "Depoorter", "Verlinden", "Antheunis", "Brussens", "Carpentier", _
 "Feyters", "Geenens", "Hofkens","Impens", "Justaert", "Vanmaele", "Waelkens", "Eerdekens"}
 'ééndimensionale Array van het String data type.
 'een element opvragen, vb respectievelijk eerste en vijfde
 	strNamen(0) geeft "Deblauwe"
 	strNamen(4) geeft "Brussens"
 Ook zo kan men een Array Declaren (hier van 15 elementen) :
 Dim strNamenAnder(14) As String
 In een routine vult men dan de Array :
	strNamenAnder(0) = "Deblauwe"
	strNamenAnder(1) = "Depoorter"
	.........
	strNamenAnder(14) = "Verzele"
Tijdens het programma kan men de grote van de Array wijzigen met Redim 
men kan de vorige waarden al dan niet behouden :
	Redim strNamen(5) de oorspronkelijke waarden worden alle gewist
	Redim Preserve strNamen(25) de oorspronkelijke namen worden behouden, de bijkomende toegevoegd in een 
	procedure

		strNamen(14) = "Jensen"
		strNamen(15) = "Fierens"
		..........
		strNamen(25) = "Debruyne"	

Ondergrens en Bovengrens bepalen met LBound en UBound functies :

		intOnder As Integer = LBound(strNamen) geeft 0
		intBoven As integer = UBound(strNamen) geeft 25

Interessante Methodes van het Array object :

  • Sort Array.Sort(strNamen) -> rangschikt alfabetisch of van klein naar groot
  • ReverseArray.Reverse(strNamen) -> keert volgorde om

Declaren tweedimensionale Array met Dim statement, men moet de dimensie van de Array opgeven of of onmiddellijk de waarden toekennen :

Public Sub TweeDim()
        Dim getallenTweeDim(,) As Integer = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'Let op accoladen

        For i As Integer = 0 To 2
            For j As Integer = 0 To 2
Debug.Print(String.Format("Waarde i {0} - Waarde j {1} - Waarde getallenTweeDim({2}  {3}) is {4}", i, j, i, j, getallenTweeDim(i, j)))
            Next j
        Next i
    End Sub
geeft als resultaat :
Waarde i 0 - Waarde j 0 - Waarde getallenTweeDim(0  0) is 1
Waarde i 0 - Waarde j 1 - Waarde getallenTweeDim(0  1) is 2
Waarde i 0 - Waarde j 2 - Waarde getallenTweeDim(0  2) is 3
Waarde i 1 - Waarde j 0 - Waarde getallenTweeDim(1  0) is 4
Waarde i 1 - Waarde j 1 - Waarde getallenTweeDim(1  1) is 5
Waarde i 1 - Waarde j 2 - Waarde getallenTweeDim(1  2) is 6
Waarde i 2 - Waarde j 0 - Waarde getallenTweeDim(2  0) is 7
Waarde i 2 - Waarde j 1 - Waarde getallenTweeDim(2  1) is 8
Waarde i 2 - Waarde j 2 - Waarde getallenTweeDim(2  2) is 9

'nog een voorbeeld

Public Sub TweeDim_1()
        Dim strBord(9, 9) As String
        For shtKol As Short = 0 To 9
            For shtRij As Short = 0 To 9
                strBord(shtKol, shtRij) = shtKol.ToString & shtRij.ToString
            Next
        Next
        'grafisch weergeven
        Dim strRij As String = ""
        For shtrij = 0 To 9
            For shtkol = 0 To 9

                strRij += strBord(shtkol, shtrij) & " "

            Next
            Debug.Print(strRij)
            strRij = ""
        Next
    End Sub
geeft als resultaat :

00 10 20 30 40 50 60 70 80 90 
01 11 21 31 41 51 61 71 81 91 
02 12 22 32 42 52 62 72 82 92 
03 13 23 33 43 53 63 73 83 93 
04 14 24 34 44 54 64 74 84 94 
05 15 25 35 45 55 65 75 85 95 
06 16 26 36 46 56 66 76 86 96 
07 17 27 37 47 57 67 77 87 97 
08 18 28 38 48 58 68 78 88 98 
09 19 29 39 49 59 69 79 89 99 

'Met een For Each constructie kan men ook door de Array heen stappen :

		For Each strWaarde As String In strBord
			Debug.Print(strWaarde)
		Next

Hashtable.

Een hashtabel bewaart zijn data in paren van Sleutel(Key) en Waarde (Value). Vooraf aanduiden hoeveel paren een hashtabel zal bevatten hoeft niet.De Sleutel is van het integer data-type. Aan de hand van de Sleutel kan men snel de bijhorende waarde vinden.

Public Sub Test_Hash_1()
        Dim mijnHash As New Hashtable
        mijnHash.Add(1, "antoon")  'blijkbaar is key een integer
        mijnHash.Add(2, "raymonde")
        mijnHash.Add(3, "joke")

        Dim shtAantal As Short = mijnHash.Count
        MsgBox(shtAantal)
        
        Dim strDum As String = Nothing
        For intDum As Integer = 1 To 3
            'met de ContainsKey methode weet men indien een bepaalde sleutel bestaat.
            If mijnHash.ContainsKey(intDum) = True Then

                strDum += mijnHash(intDum) & vbCrLf

            End If
        Next
        MsgBox(strDum)
    End Sub

Public Sub Test_Hash_2() Dim mijnAndereHash As New Hashtable Dim strDum As String = Nothing Dim strArray() As String = {"Antoon", "Raymonde", "An", "Koen", "Joke", "Wolf", "Mickey", "Charlotte"} For intDum As Integer = 0 To UBound(strArray) mijnAndereHash.Add(intDum + 1, strArray(intDum)) Next For intDum2 As Integer = 1 To mijnAndereHash.Count strDum += mijnAndereHash(intDum2) & vbCrLf Next MsgBox(strDum) Dim mijnDerdeHash As New Hashtable mijnDerdeHash = mijnAndereHash.Clone'Met de Clone methode wordt als het ware een copie gemaakt MsgBox(mijnDerdeHash(1)) mijnDerdeHash.Remove(1) ' met de Remove methode verwijdert men een paar MsgBox(mijnDerdeHash.ContainsKey(1)) ' geeft False MsgBox(mijnDerdeHash(4)) mijnDerdeHash.Remove(4) MsgBox(mijnDerdeHash.Count) ' toont zes gezien er twee verwijderd zijn. MsgBox(mijnDerdeHash(2)) ' raymonde MsgBox(mijnDerdeHash(8)) 'charlotte End Sub

Public Sub Test_Hash_3() Dim mijnTabel As New Hashtable mijnTabel(1) = "Eén" mijnTabel(2) = "Twee" mijnTabel(3) = "Drie" mijnTabel(4) = "Vier" mijnTabel(5) = "Vijf" For Each element As DictionaryEntry In mijnTabel Debug.Print("sleutel:" & element.Key & " Waarde:" & element.Value) Next ' met de Contains en ContainsKey methodes nagaan indien de tabel een bepaalde sleutel bevat. If mijnTabel.Contains(1) Then MsgBox("met de methode contains: " & mijnTabel(1)) End If If mijnTabel.ContainsKey(2) Then MsgBox("met de methode ContainsKey: " & mijnTabel(2)) End If ' met de methode ContainsValue nagaan indien de tabel een bepaalde waarde bevat. If mijnTabel.ContainsValue("Drie") Then For Each element As DictionaryEntry In mijnTabel If element.Value = "Drie" Then MsgBox("met de methode ContainsValue :" & element.Key) End If Next End If 'met de TypeOf en de Is operator kan men nagaan welk datatype de waarde van een item in de Hashtabel is If TypeOf (mijnTabel(1)) Is String Then MsgBox("het is string") 'met de count property kan men het aantal sleutel waarde paren bekomen. 'met de clear methode kan men alle sleutel-waarde paren uit de tabel verwijderen. End Sub

Public Sub Test_Hash_4() ' Eén HashTable kan verscillende datatypes bevatten. Dim gemengdeHash As New Hashtable gemengdeHash(1) = "Dit is een spring" gemengdeHash(2) = 1000 gemengdeHash(3) = False gemengdeHash(4) = 100 / 23 Dim intAant As Integer = gemengdeHash.Count Dim sng As Single = gemengdeHash(4) MsgBox("Deze tabel bevat " & intAant & "paren." _ & vbCrLf & "de vierde waarde is : " & sng) End Sub

Dictionary

Het Dictionary-object vertoont veel analogieën met het Hashtable-object maar heeft ontegensprekelijk voordelen vooral als het op performantie aankomt.
Bij de declaratie geeft men de data-waarden op van de Sleutel (Key) en de Waarden (Values). Daarna moeten deze bij het gebruik van de dictionary gerespecteerd worden.

Voorbeeld van een Dictionary

     Public Sub TestDictionary_av1()
        Dim avDictionary As New Dictionary(Of Integer, String)
        avDictionary.Add(1, "Antoon")
        avDictionary.Add(2, "Raymonde")
        avDictionary.Add(3, "An")
        avDictionary.Add(4, "Koen")
        avDictionary.Add(5, "Joke")
        avDictionary.Add(6, "Arno")
        avDictionary.Add(7, "Emiel")
        avDictionary.Add(8, "Toor")

        Dim intI As Integer = 0
        For intI = 1 To 8
            Debug.Print("Voor sleutel " & intI.ToString & " is de waarde {0}", avDictionary.Item(intI))
        Next intI

        ' het zelfde als bovenstaande kan ook met onderstaande constructie
        For Each slw As KeyValuePair(Of Integer, String) In avDictionary
            Debug.Print("Voor sleutel  {0} is de waarde {1}", slw.Key, slw.Value)
        Next slw

        ' een waarde kan men opvragen aan de hand van de sleutel
        Debug.Print("Voor sleutel 6 staat de waarde {0}", avDictionary(6))

        Dim waardeKol As Dictionary(Of Integer, String).ValueCollection = avDictionary.Values
        Debug.Print("avDictionary bevat volgende waarden : ")
        For Each StrWaarde As String In waardeKol

            Debug.Print("{0}", StrWaarde)
        Next

    End Sub

Public Sub TestDictionary_av2() 'Ziehier een dictionary waarvan zowel sleutel as waarde van hetzelfde datatype zijn. Dim mijnDict As New Dictionary(Of String, String) 'Data voegt men toe met de Add methode mijnDict.Add("A", "Deze waarde heeft A als sleutel") mijnDict.Add("B", "Deze waarde heeft B als sleutel") mijnDict.Add("C", "Deze waarde heeft C als sleutel") mijnDict.Add("D", "Deze waarde heeft D als sleutel") 'Met de Count methode weet men hoeveel paren een Dictionary-object omvat Debug.Print("Mijn directory-object bevat {0} paren", mijnDict.Count) ' De Add method geeft een waarschuwing indien de sleutel ' reeds bestaat Try mijnDict.Add("D", "Maar deze sleutel bevindt zich reeds in de Dictionary") Catch ex As Exception Debug.Print("De sleutel D bestaat reeds in deze dictionary") End Try 'Een waarde opvragen kan met de Item property Debug.Print("Waarde opvragen met Item property : {0} ", mijnDict.Item("A")) 'Gezien Item de standaard property is moet deze niet vermeld worden Debug.Print("Om de waarde op te vragen mag de Item property weggelaten worden : {0}", mijnDict("B")) 'Met de Item property kan men ook de waarde wijzigen die met een sleutel 'geassocieerd is mijnDict("D") = "De waarde was oorspronkelijk D" Debug.Print("De gewijzigde waarde opvragen : {0}", mijnDict("D")) 'indien men de waarde probeert op te vragen van een niet bestaande sleutel 'krijgt men een foutbericht Try Debug.Print("Voor Sleutel X is de waarde {0} ", mijnDict("X")) Catch ex As Exception Debug.Print("Er is geen sleutel ""X""") End Try 'Indien men twijfelt indien een sleutelwaarde wel aanwezig is 'gebruikt men beter de TryGetValue methode Dim strTeZoekenWaarde As String = "" If mijnDict.TryGetValue("X", strTeZoekenWaarde) Then Debug.Print("De waarde voor sleutel X is {0}", strTeZoekenWaarde) Else Debug.Print("De sleutel X is niet gevonden") End If 'En alvorens een sleutel/wwarde in te voeren kan men vooraf 'controleren met de ContainsKey methode If Not mijnDict.ContainsKey("E") Then mijnDict.Add("E", "Dit is de waarde voor E") End If Debug.Print("Voor de sleutel E werd de waarde : {0} toegevoegd", mijnDict("E")) 'bij het gebruik van een For Each constructie worden de elementen 'opgehaald als KeyValuePair objecten For Each element As KeyValuePair(Of String, String) In mijnDict Debug.Print("Sleutel = {0}, Waarde = {1}", _ element.Key, element.Value) Next element 'wil men enkel de waarde ophalen maak dan gebruik van de Values property Dim enkelWaarde As Dictionary(Of String, String).ValueCollection = mijnDict.Values Debug.Print("Enkel waarden ophalen") For Each str As String In enkelWaarde Debug.Print("Waarde = {0}", str) Next str 'wil men enkel de sleutels ophalen maak dan gebruik van de Keys property Dim enkelSleutel As Dictionary(Of String, String).KeyCollection = mijnDict.Keys Debug.Print("Enkel Sleutels ophalen") For Each str As String In enkelSleutel Debug.Print("Sleutel = {0}", str) Next str 'met de Remove methode kan men een Sleutel/Waarde paar verwijderen Debug.Print("Met de Remove methode een sleutel/waarde paar verwijderen") mijnDict.Remove("E") If Not mijnDict.ContainsKey("E") Then Debug.Print("Sleutel ""E"" niet gevonden.") End If End Sub
Hoe vind je dit bericht? 3 stemmen
Geschreven door Toon om 00:00 Reageer op dit bericht

Meer van MS Access VBA VB.Net

↑ Terug naar de berichten