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)? ABC & 123? ABC & 99 &! 2) Left(string, n) Geeft n karakters van de linker karakters van de string? 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? right( Diepenbeek,4) a = Hasselt?Right(a,3) 4) Mid (string, s, n) Geeft n karakters te tellen vanaf karakter s in de string.? 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.?asc( A ) a = 0?Asc(a)?Asc( XYZ ) 6) Chr(getal) Omgekeerde van Asc. Geeft het karakter dat hoort bij de ASCII-waarde getal.?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.?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.?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.)?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.?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 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 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" 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 Eigenschap Form Name: Form1 Caption: Visitekaartje Heigth: 4185 Width: 6240 5 Labels Name: Label1 tot Label5 Caption: Type je voornaam: Type je familinaam: Adres: Woonplaats: TextBox TextBox TextBox TextBox TextBox CommandButton CommandButton Picturebox 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) Visual Basic 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 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 Picture1.Font.Italic = True 'cursief 'lettergrootte '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 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 = ( Breedte PictureBox) ( Tekstlengte) 2 2 Visual Basic 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 Eigenschappen van de objecten CommandButton 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 CommandButton Name:cmdOK Caption: OK Eigenschappen Name:Form2 Autoredraw: true BackgroundColor: Palette: wit Caption: (niets) ControlBox: False Font: Arial 10p Height: 2800 StartUpPosition: Manual Width: 4800 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") 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 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 * c / Kilometer_per_seconde) & " Kilometer/sec" Form2.Print Str(w * c / Kilometer_per_uur) & " Kilometer/uur" Form2.Print Str(w * c / Meter_per_seconde) & " Meter/sec" Form2.Print Str(w * c / Meter_per_minuut) & " Meter/min" Visual Basic door ir. C.Daniels VI-14
Form2.Print Str(w * c / Mijl_per_uur) & " Mijl/uur" Form2.Print Str(w * c / Mijl_per_seconde) & " Mijl/sec" Form2.Print Str(w * c / Voet_per_seconde) & " Voet/sec" Form2.Print Str(w * c / Knoop) & " Knopen" Form2.Print Str(w * c / 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 ' 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: Private of Public Zelf gekozen naam van de functie Datatype van de berekende waarde in de functie Woordje Function 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) 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. Andere procedures en functies van module 1. Aanroep: ProcX() OK ProcY() verboden ProcZ() OK Private Sub ProcY. Andere procedures en functies van module 2.. Aanroep: ProcX() verboden ProcY() OK ProcZ() OK Public Sub ProcZ. 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