Een programma kan veel .NET code bevatten en veel van die code, is vaak code waarbij manipulaties op getallen en tekenreeksen(String) gedaan worden. Deze worden ook wel Operators genoemd. Operatoren, in het Nederlands, zijn gewoon de methodes van een bepaalde klasse. Voorbeelden zijn de bekende VB Left, Right en Mid functies uit de Visual Basic NameSpace. Deze werken nog prima, maar het is beter om de .NET varianten te gaan gebruiken en de Visual Basic NameSpace zelfs helemaal uit te schakelen in het Project! Als je dit doet wordt ook meteen duidelijk wat nog Legacy code is want die zal niet willen compileren!

Bij het converteren van VB6 naar VB.NET code via Visual Studio 2005 of 2008 zorgt de NameSpace Microsoft.VisualBasic.Compatibility ervoor dat de gemigreerde VB6 code nog kan draaien. Deze moet natuurlijk ook zo snel mogelijk verdwijnen in je projecten om je applicatie een echte VB.NET applicatie te mogen noemen.

In deze artikel reeks maak ik een opsomming van de meest voorkomende functies waarbij ik, indien handig en van toepassing, eerst de oude ‘vertrouwde’ VB6 methode geef als geheugensteuntje en daarna de .NET variant. Hierbij zal blijken dat de meeste functies nog hetzelfde heten. Maar doordat VB.NET nu volledig object georienteerd is zal de functie/methode aangeroepen worden als: Object.Methode(parameters). Daarnaast zijn er ook nieuwe functies in VB.NET beschikbaar die het net even gemakkelijker maken om een bepaalde bewerking te doen op een tekst.

We gaan als eerste kijken naar de String operators. In een volgend deel komen de Numerieke- en de DateTime functies aan bod. Onderaan dit artikel alvast wel een opsomming van ‘Overige’ functies in VB.NET die ik jullie niet wil onthouden.

String Operators

Left, Right en Mid in VB en VB.NET notatie

  1: Option Strict On
  2: 
  3: Imports VB6 = Microsoft.VisualBasic
  4: 
  5: Public Class Form1
  6:     Private mijnTekst As String = "Programmeren is leuk"
  7: 
  8:     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  9:         'String manipulatie (VB6 methode)
 10: 
 11:         MessageBox.Show(VB6.Left(mijnTekst, 7))
 12:         MessageBox.Show(VB6.Right(mijnTekst, 4))
 13:         MessageBox.Show(VB6.Mid(mijnTekst, 14, 2))
 14:     End Sub
 15: 
 16:     Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
 17:         'String manipulatie (.NET methode)
 18: 
 19:         MessageBox.Show(mijnTekst.Substring(0, 7)) 'Left
 20:         MessageBox.Show(mijnTekst.Substring(mijnTekst.Length - 4, 4)) 'Right
 21:         MessageBox.Show(mijnTekst.Substring(13, 2)) 'Mid
 22: 
 23: 
 24:     End Sub

Probeer deze code maar eens uit en bekijk de resultaten. Let op dat het gebruik van SubString zero-based is. Dit is duidelijk te zien bij het equivalent van de Mid functie waarbij het woord ‘is’ op positie 13 start en niet op 14. Verder wordt ook duidelijk dat je met de methode SubString van String alles kunt doen waar je voorheen 3 methodes voor nodig had. Wel is het nabootsen van een Right functie wat lastiger, want daar moet je nog even de lengte van je tekst bepalen met String.Length( )

Het bepalen van een karakter of een tekenreeks in een String doe je met het keyword InStr(), in .NET is dat ook weer een Methode op de (Base) Class System.String en wel IndexOf(). Deze is ook weer zero-based waar InStr() dat niet is. Een voorbeeld:

  1:  'Positie bepalen van een karakter in een tekenreeks
  2: 
  3:         Dim karakter As String = "-"
  4: 
  5:         'gebruik van VB6 Instr():
  6:         Dim telefoonNummer As String = "010-1234567"
  7:         MessageBox.Show(String.Format("Het karakter {0} bevindt zich op positie {1}",
  8:                                       karakter, VB6.InStr(telefoonNummer, karakter)))
  9: 
 10:         '.NET methode IndexOf()
 11:         MessageBox.Show(String.Format("Het karakter {0} bevindt zich op positie {1}",
 12:                                       karakter, telefoonNummer.IndexOf(karakter)))

MessageBox
Waarschijnlijk was het al opgevallen dat ik gebruik maak van MessageBox.Show( ). Maar dit is ook de .NET manier van berichtvensters weergeven. MsgBox ( ) werkt nog wel, maar is ook vervangen in .NET.

Er zijn nog veel meer operators die in VB6 wat moeilijker te maken waren en niet met één keyword aangeroepen konden worden. Maar die nu wel in .NET standaard aanwezig zijn. Een paar voorbeelden van Verwijderen, Vervangen, Invoegen en Vergelijken.

  1:  'Overige VB.NET String bewerkingen
  2: 
  3:         Dim telefoonNummer As String = "010-1234567"
  4: 
  5:         'Verwijderen van een karakter in een tekenreeks
  6:         MessageBox.Show(telefoonNummer.Remove(3, 1)) 'verwijdert het karakter '-' uit de reeks
  7: 
  8:         'Vervangen van één of meerdere karakters
  9:         MessageBox.Show(telefoonNummer.Replace("010", "020"))
 10: 
 11:         'Invoegen van één of meerdere karakters in een tekenreeks
 12:         MessageBox.Show(telefoonNummer.Insert(0, "Mijn telefoonnummer is "))
 13: 
 14:         'Bevat de tekenreeks een bepaald karakter of een aansluitende reeks? Retourneert een Boolean True of False
 15:         MessageBox.Show(telefoonNummer.Contains("030").ToString())
 16: 
 17:         Dim naam1 As String = "vbcentral"
 18:         Dim naam2 As String = "VBCENTRAL"
 19: 
 20:         'Vergelijk 2 tekenreeksen met elkaar. 
 21:         'Uitkomst retourneert -1 als ze niet gelijk zijn en 0 bij overeenkomst. 
 22:         'De 3e parameter is 'IgnoreCase ?'
 23:         'Bij het weglaten van True als 3e parameter zullen naam1 en naam2 niet aan elkaar gelijk zijn als uitkomst!
 24:         MessageBox.Show(String.Compare(naam1, naam2, True).ToString())
 25: 
 26:         'Tekenen van meerdere karakters met PadLeft of PadRight
 27:         'Bij het weglaten van het karakter worden er Spaces getekend. Deze functie kan dus ook gebruikt worden als het equivalent van Space(5)
 28:         Dim s As String = ""
 29:         MessageBox.Show(s.PadLeft(10, "*"c))

Er zijn ook methoden die niet vervangen zijn in .NET, een voorbeeld daarvan is de VB6 InputBox( ). Hiervoor bestaat in VB.NET geen directe vervanging. Hiervoor zul je zelf iets moeten bouwen in de vorm van een UserControl of het nabootsen met een TextBox en Button op je User Interface zoals een Windows Form.

Upper en Lower case

Ook het omzetten van teksten in hoofdletters en kleine letters wijkt af. Een voorbeeld:

  1:  'Tekenreeksen omzetten naar Lower of Upper case
  2: 
  3:         Dim s As String = "VBcentral"
  4: 
  5:         'VB6 methode:
  6:         MessageBox.Show(VB6.UCase(s)) 'Hoofdletters
  7:         MessageBox.Show(VB6.LCase(s)) 'Kleine letters
  8: 
  9:         'VB.NET methode
 10:         MessageBox.Show(s.ToUpper) 'Hoofdletters
 11:         MessageBox.Show(s.ToLower) 'Kleine letters
Trim( )
Tags van Technorati: ,

Voor het verwijderen van spaties links en rechts van een tekenreeks maak je gebruik van Trim(tekst) in VB6. In VB.NET is dat:
  1:  Tekst.Trim()

Je roept hier dus ook weer de methode aan op het String object zelf. Door het OO karakter van VB.NET kun je ervan uitgaan dat je altijd de Methode op het object aanroept. Ook combinaties zijn mogelijk en geeft overzichtelijke code. De functies zullen van links naar rechts afgewerkt worden:

  1:  'Combi met Trim functie:
  2:         Dim naam As String = "   VBcentral  "
  3:         MessageBox.Show(s.ToLower.Trim())

Combinatie van functies
Nu we een aantal functies gezien hebben kunnen we deze ook verder gaan combineren. Stel dat we een generieke functie willen bouwen voor het kunnen losmaken van een gedeelte midden uit een variabele String. Je wilt de 2e reeks getallen halen uit: “123 456 789” en uit “1234 567 890”. In het 1e geval begint de 2e reeks getallen op positie 4 en in het andere geval op positie 5. We zullen dus eerst moeten bepalen waar de spatie begint.We kunnen dit doen met behulp van de IndexOf functie. De code:

  1:  'Gedeelte van een String uit een reeks halen
  2: 
  3:         Dim reeks As String = " 123 456 789 "
  4: 
  5:         'Bepaal de positie van 1e spatie en tel er 1 bij op om op het 1e cijfer te starten van de 2e reeks
  6:         Dim EerstePositie As Integer = reeks.Trim.IndexOf(" ") + 1
  7: 
  8:         'Bepaal de positie van de 2 spatie en begin aan het eind van de String
  9:         Dim tweedePositie As Integer = reeks.Trim.LastIndexOf(" ")
 10: 
 11:         'Start op 1e positie met de lengte van het verschil tussen de 2e en 1e positie
 12:         Dim gedeelteReeks As String = reeks.Trim.Substring(EerstePositie, tweedePositie - EerstePositie)

Bovenstaande code werkt prima, maar het mag duidelijk zijn dat het een paar regels kost en het nadeel is hier dat we alleen de 2e reeks kunnen losmaken uit de reeks. Wat als we nu de laatste of de 1e reeks willen hebben, of allemaal gescheiden? Dat kan ook en daar hebben we de functie String.Split voor. Het karakter waarop gescheiden moet worden is ons geval een spatie en moet van het type Char zijn. Een kleine conversie is daar dus voor nodig. Als we de gedeelteReeksArray variabele bekijken dan zien we dat nu de drie getallen groepjes netjes gescheiden in de Array aanwezig zijn. Het is daarna een kwestie van het juiste element aanroepen.

  1:  'Korter alternatief met Split
  2:         Dim gedeelteReeksArray() As String
  3:         gedeelteReeksArray = reeks.Trim.Split(Convert.ToChar(" "))
  4:         gedeelteReeks = gedeelteReeksArray(1)
Overige

Er zijn ook nog meer functies die in VB.NET anders heten en een afwijkende syntax kunnen hebben:

Omschrijving VB6 VB.NET Opmerking
Geef ASCII waarde van een karakter (char) Asc(“A”)

Convert.ToInt32("A"c) 

De kleine c wil zeggen dat hij de tekst als Char moet behandelen en niet als String. Er mag dan ook maar 1 karakter staan.

Geef een Char terug aan de hand van een getal Chr(65) Convert.ToChar(65) Geeft ‘A’ terug
Controle op Leeg =”” of isNull(tekenreeks) of Len(tekenreeks)=0 String.IsNullOrEmpty(TekenReeks) Controleert in 1x op Null of Lege (Empty) waarde. Geeft een Boolean True of False terug.

Als laatste een tip als je een bepaald keyword niet kan vinden. Zoek in de ObjectBrowser (F2) naar een keyword en kijk hoe die aangeroepen moet worden. Wat ook handig is, is om te zoeken in References. Dit kan door in het code venster op ALT+F12 te drukken, hiermee zoek je niet alleen in je code maar ook in de Assembly referenties.

Laat a.u.b. commentaar achter als je vragen of opmerkingen hebt. Vraag mij ook gerust naar een .NET variant als ik deze niet genoemd hebt.

-Arjan van Huizen-