VI.
Strings en string-functies
A. Wat zijn strings? Strings zijn eigenlijk teksten. U kunt die bewaren in een stringvariabele. Een tekst bestaat uit karakters zoals letters, cijfers, leestekens,… Een karakter wordt door de computer inwendig voorgesteld door een getal van 8 bits (1 of 0), dit stelt getallen voor tussen 0 en 255. Zo stelt de binaire waarde 0100 0001 voor een computer het getal 65 voor, of als hij het als een karakter moet tonen een hoofdletter A. Deze overeenkomst wordt samengevat in een internationale norm: de ASCII-tabel (zie bijlage) Enkele karakters hierin kunnen niet afgedrukt worden maar dienen uitsluitend voor de besturing van monitors of printers, zoals het karakter met waarde 12, dat op een printer een nieuw blad inschuift, of op een monitor het scherm leegmaakt. De declaratie van een string-variabele is als volgt: Dim Tekst as String Stel dat u de inhoud van de variabele wilt gelijk zetten aan de tekst: Champions League, dan doet u dat in een programma als volgt: Tekst = "Champions League" B. String-functies van Visual Basic VB komt met een heel aantal methoden om deze strings aan te passen, of er bewerkingen mee uit te voeren. We zullen eerst met enkele functies kennis maken. Meer functies en uitleg vindt u in VB-Help. Gebruik voor de oefeningen het Immediate window.
1)
&
Voegt strings samen. (engels: concatenation) Ø Probeer uit in het Immediate venster: ?”ABC” & “123” ?”ABC” & 99 & “!”
2)
Left(string, n)
Geeft n karakters van de linker karakters van de string Ø Probeer uit in het Immediate venster: ? left(“Diepenbeek”,4) a = “Hasselt” ? left(a,3)
Visual Basic
door ir. C.Daniels
VI-1
3)
Right(string,n)
Geeft n karakters vanaf de rechterkant van de string Ø Probeer uit in het Immediate venster: ? right(“Diepenbeek”,4) a = “Hasselt” ?Right(a,3)
4)
Mid (string, s, n)
Geeft n karakters te tellen vanaf karakter s in de string. Ø Probeer uit in het Immediate venster: ? Mid(“Diepenbeek”,4,3) a = “Hasselt” ?Mid(a,4,2) Kunt u dus ook gebruiken als u bijvoorbeeld één letter van een string nodig heeft: Zo heeft Mid(“Hasselt”,5,1) als resultaat de letter “e”.
5)
Asc(karakter)
Geeft de ASCII-waarde van een karakter. Ø Probeer uit in het Immediate venster: ?Asc(“A”) a = “0” ?Asc(a) ?Asc(“XYZ”)
6)
Chr(getal)
Omgekeerde van Asc. Geeft het karakter dat hoort bij de ASCII-waarde getal. Ø Probeer uit in het Immediate venster: ?Chr(65) a = 102 ?Chr(a)
7)
Str(getal)
Maakt van een getal een tekst. Als u dat probeert gebeurt er precies niets, maar toch is het getal omgevormd tot een string. Ø Probeer uit in het Immediate venster: ?Str(165) a =456 Visual Basic
door ir. C.Daniels
VI-2
?Str(a) ?mid(str(123),3,1) geeft 2, terwijl u zoudt denken dat dit 3 moet geven… waarom zou dat zijn?? Als u het niet vindt, probeer dan eens ?”ABC”+str(123).
8)
Val(tekst)
Als tekst een getal bevat, wordt dit getal uit de tekst omgezet in een long variabele. Ø Probeer uit in het Immediate venster: ?Val(“123”) ?Val(“123ABC”) ?Val(“ABC123”)
9)
InStr([getal],string1,string2)
Deze functie zoekt de plaats van string2 in string1 te beginnen vanaf plaats getal. Als u getal weglaat, wordt gestart vanaf het eerste karakter. (Als u iets tussen rechte haken zet, betekent dit dat u het mag weglaten.) Ø Probeer uit in het Immediate venster: ?InStr(“ABCDEFG”,”DE”) ?InStr(“ABCDEFG”,”12”) ?InStr(5,”ABCDEFG”,”ABC”)
10)
StrComp(String1,String2)
Vergelijkt String1 met String2. - Als ze gelijk zijn wordt een nul teruggegeven. - Als String1 > String2 wordt 1 teruggegeven. - Als String1 < String2 wordt -1 teruggegeven. Ø Probeer uit in het Immediate venster: ?StrComp(“ABC”,”ABC”) ?StrComp(“678”,”123”) ?StrComp(“ABCDEFG”,”ABC”) ?StrComp(“ABC”,”ABCDEF”) ?StrComp(“ABC”,” ”) (staat een spatie tussen twee “”)
11)
Format
Drukt datums, getallen en strings volgens een bepaald formaat. Wordt best uitgelegd aan de hand van enkele voorbeelden. Ø Probeer uit in het Immediate venster en noteer het resultaat: ?Format(Date, "Long Date") ? Format(Time, "h:m:s") Tijd = #17:04:23# Datum = #January 27, 1993# ? Format(Tijd, "hh:mm:ss AMPM") ? Format(Datum, "dddd, mmm d yyyy") Visual Basic
door ir. C.Daniels
VI-3
?Format(5459.4, "##,##0.00") ?Format(334.9, "###0.00") ?Format(5, "0.00%") ?Format("HALLO", "<") ?Format("Dat is het!", ">")
C. Procedures en functies Event-procedures zijn we al tegengekomen. Telkens u op een knop klikte werd het event Click aangeroepen van die knop. Maar we kunnen ook procedures schrijven die los staan van een event. Maar soms heb u een bepaald programmastukje dikwijls nodig. Dan maakt u daar best een apart subprogramma van. Er zijn twee soorten subprogramma’s: - Sub-procedures - Functie-procedures of kortweg Functies
1)
Sub-procedures
Een Sub-procedure ziet er uit als volgt: Public|Private Sub MijnProcedure (parameters) …. programmacode End Sub Op de betekenis van Private en Public komen we later terug. Vanuit het hoofdprogramma roept u deze procedure aan door de programmacode: Mijnprocedure parameters Een voorbeeld maakt dit duidelijker. Stel dat we een procedure willen schrijven die uw naam afdrukt op het formulier. Public DrukNaam(Naam as String) Print "Mijn naam is " & naam End Sub Stel dat deze code moet uitgevoerd worden als we op de Knop cmdButton1 klikken, dat ziet de event-code er zo uit: Private Sub cmdButton1_Click ' Roep de procedure Druknaam aan met parameter "Janssens" DrukNaam "Janssens" End Sub Parameters moogt u meegeven, maar u kunt ook procedures schrijven zonder parameters, of met meerdere parameters. Visual Basic
door ir. C.Daniels
VI-4
Ø Voorbeeld 1 van een Sub-procedure: het VisiteKaartje. Maak een nieuw project aan met de naam Visitekaartje. Sla het weer op in zijn eigen directory VisiteKaartje. De bedoeling is de nodige gegevens voor een adreskaartje in te tikken, en deze gegevens door het programma mooi te laten schikken:
Project Visitekaartje in werking Ø Plaats de volgende objecten op het formulier:
Labels
txtVoornaam txtNaam txtAdres txtPostnummer
cmdPreview
txtWoonplaats
cmdWissen
PictureBox1
Visual Basic
door ir. C.Daniels
VI-5
Ø Geef de objecten de volgende eigenschappen mee:
Object Form
5 Labels
TextBox
TextBox
TextBox
TextBox
TextBox
CommandButton
CommandButton
Picturebox
Visual Basic
Eigenschap Name: Form1 Caption: Visitekaartje Heigth: 4185 Width: 6240 Name: Label1 tot Label5 Caption: Type je voornaam: Type je familinaam: Adres: Woonplaats: Postnummer Name: txtVoornaam Multiline: False Text: (geen) TabIndex: 0 Tabstop: true Name: txtNaam Multiline: False Text: (geen) TabIndex: 1 Tabstop: true Name: txtAdres Multiline: False Text: (geen) TabIndex: 2 Tabstop: true Name: txtWoonplaats Multiline: False Text: (geen) TabIndex: 3 Tabstop: true Name: txtPostnummer Multiline: False Text: (geen) TabIndex: 4 Tabstop: true Name: cmdPreview Caption: Preview TabIndex: 5 Tabstop: True Name:cmdWissen Caption: Wissen TabIndex: 6 Tabstop: True Name: Picture1 BackColor: &H00FFFFFF (wit)
door ir. C.Daniels
VI-6
In de event-procedure cmdPreview_Click komt volgende code: Private Sub cmdPreview_Click() Dim VoorNaam, Naam, Adres, Woonplaats, Postnummer As String 'Haal de nodige gegevens uit de tekstvelden VoorNaam = txtVoorNaam.Text Naam = txtNaam.Text Adres = lblAdres.Text Woonplaats = txtWoonplaats.Text Postnummer = txtPostnummer.Text 'Roep de sub-procedure Afdrukken aan Afdrukken VoorNaam, Naam, Adres, Woonplaats, Postnummer End Sub Met de lijn Afdrukken VoorNaam, Naam, Adres, Woonplaats, Postnummer Roepen wij de sub-procedure Afdrukken aan met als parameters de gegevens, nodig om het visitekaartje af te drukken. Deze sub-procedure moeten we zelf helemaal schrijven. Plaats ze onder het gedeelte (general)(declarations) als volgt: Private Sub AfDrukken(nVoorn, nNaam, nAdres, _ nWoonplaats, nPostnummer As String) Dim tekst As String 'Maak de PictureBox leeg Picture1.Cls 'Zet de eigenschappen van het lettertype Picture1.Font = "Palace Script MT" 'lettertype Picture1.Font.Size = Picture1.ScaleHeight / 3 'lettergrootte Picture1.Font.Italic = True 'cursief 'Druk bovenaan voornaam en naam tekst = nVoorn & " " & nNaam Picture1.CurrentX = (Picture1.ScaleWidth / 2)–(Picture1.TextWidth(tekst)/2) Picture1.CurrentY = 0 Picture1.Font.Bold = True 'vetjes aan Picture1.Print tekst ' Adres tekst = nAdres Picture1.CurrentX = (Picture1.ScaleWidth / 2)–(Picture1.TextWidth(tekst)/2) Picture1.CurrentY = Picture1.TextHeight(tekst) Picture1.Font.Bold = False 'vetjes uit Picture1.Print tekst 'Postnummer en woonplaats
Visual Basic
door ir. C.Daniels
VI-7
tekst = nPostnummer & nWoonplaats Picture1.CurrentX = (Picture1.ScaleWidth / 2)–(Picture1.TextWidth(tekst)/2) Picture1.CurrentY = 2 * Picture1.TextHeight(tekst) Picture1.Font.Bold = False 'vetjes uit Picture1.Print tekst 'Afdrukken in de Picturebox End Sub
Uitleg: De instructie Cls maakt het formulier of de PictureBox leeg. De instructie Print tekst druk de inhoud van tekst af in het formulier of de pictureBox. We moeten nog twee problemen oplossen: de juiste plaatsing van de tekst, en het lettertype. - De plaatsing van de tekst: We gebruiken hiervoor de eigenschappen CurrentX en CurrentY van een Picturebox. Ook in een formulier kunt u deze eigenschappen gebruiken. Geeft de plaats aan waar een tekst of een afbeelding in het object gaat plaatsen. Denk eraan dat de Y-coordinaat van boven naar beneden wijst!
CurrentY
CurrentX
Tekst
Om de tekst te horizontaal centreren moeten we dus de volgende berekening maken: Tekstlengte Marge
Te centreren tekst Breedte van de PictureBox
Uit de figuur blijkt dat:
Marge
Visual Basic
=
( Breedte PictureBox ) (Tekstlengte) − 2 2
door ir. C.Daniels
VI-8
Of in VB-code: Picture1.CurrentX = (Picture1.ScaleWidth/2) – (Picture1.TextWidth(tekst)/2)
ScaleWidth: breedte van het object PictureBox of van een Form ScaleHeight: hoogte van het object PictureBox of van een Form - Het aanpassen van het lettertype en grootte De teksteigenschappen kunne we aanpassen door de eigenschappen van het font te veranderen: Het lettertype (Font) kiezen: Picture1.Font = "Palace Script MT" De tekstgrootte (Size) kiezen we gelijk aan 1/3 van de hoogte van de PictureBox Picture1.Font.Size = Picture1.ScaleHeight / 3 De tekst cursief maken: Picture1.Font.Italic = True De tekst vetjes maken: Picture1.Font.Bold = True Ø Met de knop cmdWissen worden alle velden en de pictureBox leeggemaakt. Schrijf zelf die code. Ø Experimenteer met andere lettertypes, en font-eigenschappen! Zoek ze op in de Help! Hoe kunt u zorgen voor een witte tekst op een blauwe achtergrond?
Ø Voorbeeld 2 van een Subprocedure: Conversie van Eenheden. De bedoeling van dit voorbeeld is een snelheid uitgedrukt in een bepaalde eenheid (meter/sec bijvoorbeeld) om te rekenen naar andere grootheden zoals Mijl/seconde of Knopen.
Het project Conversie in werking
Visual Basic
door ir. C.Daniels
VI-9
Ø Maak een nieuw project Conversie aan, en geef het weer zijn eigen map. Plaats de onderstaande objecten op het ontwerpformulier: Label
ListBox
TextBox
CommandButton Ø Eigenschappen van de objecten Object Form
Label TextBox
CommandButton ListBox
Eigenschappen Name: Form1 Caption: Conversie van Snelheden Height:2040 Width:3400 Name:lblTekst Caption: Waarde: Name: txtWaarde Text: (geen) Multiline: false Name: cmdBereken Caption:Berekenen Name:listEenheden
Ø De nodige omrekeningsfactoren plaatsen we als constanten in het gedeelte bovenaan (General)(Declarations)
Visual Basic
door ir. C.Daniels
VI-10
Ø De resultaten van de berekening tonen we in een apart venster, form2. Om dat venster bij te voegen aan het project klikt u in het menu op Projectà Add Form. U krijgt dan onderstaande dialoog. Kies voor Form in het tabblad New en klik op Openen.
Uw project bevat nu twee formulieren, Form1 en Form2.
Selecteer nu Form2
. Visual Basic
door ir. C.Daniels
VI-11
Plaats een CommandButton op het formulier:
En geef deze objecten de volgende eigenschappen Object Form
Eigenschappen Name:Form2 Autoredraw: true BackgroundColor: Palette: wit Caption: (niets) ControlBox: False Font: Arial 10p Height: 2800 StartUpPosition: Manual Width: 4800 CommandButton Name:cmdOK Caption: OK Zorg dat de twee formulieren Form1 en Form2 zichtbaar zijn, dan kunt u met de muis in het Form Layout Window de juiste plaats van de beide formulieren bij het openen aangeven:
Visual Basic
door ir. C.Daniels
VI-12
Klik op de OK-knop en plaats volgende code in de eventprocedure cmdOK_Click van Form2:
Ø Selecteer nu terug Form1. Het event Form_Load van Form1 vullen we als volgt aan: Private Sub Form_Load() ' De keuzemogelijkheden aan de ListBox toevoegen listEenheden.AddItem ("Km/sec") listEenheden.AddItem ("Km/uur") listEenheden.AddItem ("Meter/sec") listEenheden.AddItem ("Meter/min") listEenheden.AddItem ("Mijl/uur") listEenheden.AddItem ("Mijl/sec") listEenheden.AddItem ("Voet/sec") listEenheden.AddItem ("Knoop") listEenheden.AddItem ("Lichtsnelheid") End Sub Met de eigenschap AddItem van de ListBox vullen we de keuzelijst in. Private Sub cmdBereken_Click() Dim Waarde, conv As Double If listEenheden.ListIndex = -1 Then 'Waarschuwing als u geen eenheid kiest MsgBox "Kies de eenheid!" ElseIf Not IsNumeric(txtWaarde.Text) Then 'Waarschuwing als u geen geldig getal invult MsgBox "De ingegeven waarde is niet geldig!" Else 'OK, nu kunnen we gaan berekenen 'de waarde uit de textbox halen Waarde = Val(txtWaarde.Text)
Visual Basic
door ir. C.Daniels
VI-13
'kies de conversie factor naargelang de gekozen eenheid Select Case listEenheden.ListIndex Case 0 conv = Kilometer_per_seconde Case 1 conv = Kilometer_per_uur Case 2 conv = Meter_per_seconde Case 3 conv = Meter_per_minuut Case 4 conv = Mijl_per_uur Case 5 conv = Mijl_per_seconde Case 6 conv = Voet_per_seconde Case 7 conv = Knoop Case 8 conv = Lichtsnelheid End Select 'Bereken conv, Waarde Call Bereken(conv, Waarde) 'En toon het ingevulde formulier Form2.Show 1, Me End If End Sub
Uitleg: - De eigenschap ListIndex geeft het volgnummer van het gekozen item uit de ListBox. Als u geen item aanklikt wordt de waarde –1 teruggegeven. Met de aanroep Call Bereken(conv, Waarde) roepen we de procedure Bereken aan, met als parameters de omrekeningsfactor conv en de waarde uit de TextBox. -
Met de instructie Form2.Show 1, Me openen we formulier 2 modaal. Een modaal formulier moet u eerst sluiten voor u kunt verder werken in het originele formulier form1. Dit wordt aangegeven met de waarde 1 achter de instructie Show. Ø De Sub-procedure Bereken moeten we helemaal zelf intypen in het gedeelte (General)(Declarations) van Form1: Sub Bereken(c, w) Form2.Cls Form2.Print Str(w Form2.Print Str(w Form2.Print Str(w Form2.Print Str(w
Visual Basic
* * * *
c c c c
/ / / /
Kilometer_per_seconde) & " Kilometer/sec" Kilometer_per_uur) & " Kilometer/uur" Meter_per_seconde) & " Meter/sec" Meter_per_minuut) & " Meter/min"
door ir. C.Daniels
VI-14
Form2.Print Form2.Print Form2.Print Form2.Print Form2.Print End Sub
Str(w Str(w Str(w Str(w Str(w
* * * * *
c c c c c
/ / / / /
Mijl_per_uur) & " Mijl/uur" Mijl_per_seconde) & " Mijl/sec" Voet_per_seconde) & " Voet/sec" Knoop) & " Knopen" Lichtsnelheid) & " Lichtsnelheid"
Uitleg: Met de instructie Cls maken we het formulier Form2 eerst schoon. Met de instructie Print kunnen we tekst afdrukken.
2)
Functie-procedures
Functie-procedures worden ook kortweg functies genoemd. Het grote verschil tussen een subprocedure en een functie is dat een functie een waarde (integer, string,…) teruggeeft aan het aanroepende hoofdprogramma. Voorbeeldje: Stel dat we regelmatig de halve som S van twee getallen A en B moeten berekenen. We kunnen dit als volgt programmeren: A=20.5 B=37.75 S = (A + b)/2 Print S Als dit regelmatig voorkomt in ons programma, kunnen we van die formule beter een functie maken, als volgt:
' de declaratie van de functie Private Function HalveSom(M as double,N as double) as Double HalveSom = (M + N)/2 End Sub
' In het hoofdprogramma: … A = 20.5 B= 37.75 Print HalveSom A B 'de syntax Print Halvesom(A,B) mag ook …
Visual Basic
door ir. C.Daniels
VI-15
Let goed op de structuur van een functie: Zelf gekozen naam van de functie
Private of Public
Woordje Function
Datatype van de berekende waarde in de functie
Parameters, echter niet verplicht
Private|Public Function Functienaam(parameter1 as type,…) as type Programmacode… … Functienaam = waarde of variabele End Function
Teruggeven aan het hoofdprogramma
Vergelijk met het bovenstaande voorbeeld van de functie Halvesom. Belangrijk: Bij de aanroep van de functie moet u evenveel parameters meegeven als er bij de declaratie van de functie werden aangegeven. Ook het datatype van elke parameter moet overeenkomen! Ø Een heel eenvoudig voorbeeld van een functieaanroep kunt u als volgt programmeren: Maak een nieuw project Functie1 aan, en plaats de volgende code in het programmavenster: Option Explicit 'De functie Product Private Function Product(a As Double, b As Double) As String Product = Str(a * b) End Function 'De eventprocedure Private Sub Form_Load() AutoRedraw = True Print "Het product van 5 en 7 is" & Product(5, 7) End Sub
Ø Probeer uit! Wat is het resultaat bij de uitvoering? Uitleg: de functie aanroep Product(5,7) plaatst de waarde 5 in de parameter a van de functie, en de waarde 7 in de parameter b. De functie berekent het product en geeft het resultaat, omgevormd tot een string Str(a*b), terug aan het hoofdprogramma. Voorbeelden van ingewikkelder toepassingen met functies zien we in het volgende hoofdstuk.
Visual Basic
door ir. C.Daniels
VI-16
3)
Private en Public
Wanneer gebruikt u nu de instructie Private en Public? Een programma (project) bestaat meestal uit verschillende modules. Zo is er voor elk formulier (window) dat u nodig heeft een module met de layout van dat venster (met extensie *.frm) en de bijbehorende programmacode voor de afhandeling van events, en andere sub-programmas. U kan ook aparte programma-modules maken met alleen maar programmacode bevatten (extensie *.bas). Als een procedure Private wordt gedeclareerd, kan zij alleen maar aangeroepen worden vanuit deze module. Als zij Public wordt gedeclareerd is zij te gebruiken overal in het ganse project. Men noemt dat de scope van een procedure. Programma project MijnProject Module 1
Module 2
Module 3
Private Sub ProcX …. End Sub
Private Sub ProcY …. End Sub
Public Sub ProcZ …. End Sub
Andere procedures en functies van module 1 …. Aanroep: ProcX() ‘ OK ProcY()‘ verboden ProcZ() ‘ OK
Andere procedures en functies van module 2 ….. Aanroep: ProcX() ‘ verboden ProcY() ‘ OK ProcZ() ‘ OK
Andere procedures en functies van module 3 ….. Aanroep: ProcX() ‘ verboden ProcY() ‘ verboden ProcZ() ‘ OK
Bovenstaand programma bestaat uit drie modules. De procedure X is alleen te gebruiken in Module 1. De procudure Y is alleen te gebruiken in Module 2. Terwijl de procedure Z te gebruiken is in de drie modules.
Visual Basic
door ir. C.Daniels
VI-17