Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Hoofdstuk 8: Visual Basic

8.3. Listbox, inputbox, messagebox.

  8.3.1. Het formulier klaarmaken.

We willen een programma maken waarvan de interface er uitziet zoals in het venster hier onder.



  • Links heb je een zogenaamde listbox
    Daarin staan een aantal landen en er kan een land worden uitgekozen door er op te klikken.
    Kies in VB voor een nieuw project.
    Klik in de toolbox op de Listbox listbox, en plaats die op het formulier.
    Geef die listbox de naam lstLanden
  • Verder zijn er zes buttons, met als opschrift Geef de hoofdstad, Voeg toe, Verwijder, Maak leeg, Omhoog, Omlaag
    Plaats die zes buttons op het formulier. Zorg er voor dat ze het juiste opschrift krijgen, en geef ze de namen cmdGeefhoofdstad, cmdVoegtoe, cmdVerwijder, cmdMaakleeg , cmdOmhoog en cmdOmlaag
  • Dan zijn er nog twee labels, achter de button Voeg toe, met de opschriften land: en hoofdstad:
    Plaats die twee label op het formulier. Zorg er voor dat ze het juiste opschrift krijgen.
  • Verder zijn er nog drie tekstvensters, achter de button Geef de hoofdstad, en achter de labels land: en hoofdstad:
    Plaats die drie tekstvensters op het formulier. Geef ze de namen txtGeefhoofdstad, txtLand en txtHoofdstad
  • Tenslotte is er nog een listbox, onder de button Voeg toe.
    Plaats die listbox op het formulier. Geef hem de naam lstHoofdsteden, en zorg er voor dat hij onzichtbaar is.
Zo, nu is de "interface" klaar.
Maar als we ergens op klikken gebeurt er nog niets. Dat moeten we nog programmeren.

  8.3.2. Items toevoegen aan de Listbox.

Een ListBox is een venster waarin je uit een lijstje van dingen iets kunt kiezen door het aan te klikken.
De naam van de eerste ListBox is standaard List1, en een woord ....... aan de lijst toevoegen gaat dan m.b.v. de opdracht List1.AddItem ".......... "
In dat geval wordt het woord .......... onder aan de lijst toegevoegd.
Je kunt ook de volgende opdracht gebruiken: List1.AddItem " .......... ", 3
In dat geval wordt het woord .......... tussengevoegd op plaats nummer 4 (de eerste krijgt nummer 0, dus nummer 3 is het vierde item).

We willen dat er, direkt als het programma start, al een aantal landen in de lijst staan.
Daar kunnen we op twee manieren voor zorgen.
  1. We kunnen bij de Properties van de listbox een aantal items invoeren. Dat doe je achter list
    Klik op de listbox lstLanden, en klik in het properties-venster achter list
    Klik dan op het pijltje, dan verschijnt er een invulvenstertje.
    Tik in: Nederland
    Druk dan op Ctrl + Enter, dus niet alleen op Enter!
    Tik in: België, en druk dan op Ctrl + Enter
    En tik dan nog in: Frankrijk
    Die drie landen verschijnen dan in de lijst.

    Zorg er op dezelfde manier voor dat de listbox lstHoofdsteden de volgende hoofdsteden bevat: Amsterdam, Brussel en Parijs

  2. Je kunt er ook d.m.v. programmaregels voor zorgen dat er bij de start items aan de listbox worden toegevoegd.
    Dan moeten die opdrachten staan bij de procedure Form_Load.

    Dubbelklik daarom op een lege plek in het formulier.
    Dan verschijnt het programmavenster voor Form1.
    Kies in het rechtervenstertje "Load" uit.
    Dan kun je aangeven wat er moet gebeuren als het formulier (en dus het programma) wordt geladen, dus direkt in het begin.

    Tik het volgende in:

    lstLanden.AddItem ("Spanje")
    lstLanden.AddItem ("Denemarken")
    lstLanden.Selected(0) = true
    lstHoofdsteden.AddItem ("Madrid")
    lstHoofdsteden.AddItem ("Kopenhagen")

    De opdracht lstLanden.Selected(0) = true heeft tot gevolg dat het eerste woord in de lijst van de listbox wordt geselecteerd (dat is dus blauw gekleurd).
    Ze beginnen in zo'n lijst altijd te tellen bij nul, dus als je bijv. als opdracht geeft : lstLanden.Selected(2) = true dan wordt het derde woord geselecteerd !

  8.3.3. Items toevoegen als het programma loopt, commentaar

Het is de bedoeling dat, als je op de button Voeg toe klikt, het land dat in het bijbehorende tekstvenster staat wordt toegevoegd aan de lijst van landen, en de hoofdstad die in het bijbehorende tekstvenster staat wordt toegevoegd aan de lijst van hoofdsteden.
Hier onder zie de programmacode daarvoor, maar er zijn zogenaamde commentaarregels toegevoegd.

Als je een programma gemaakt hebt, en je bekijkt het een hele tijd later weer dan snap je soms zelf niet meer waarom je bepaalde dingen gedaan hebt.
En als iemand anders het bekijkt snapt die er meestal helemaal niets van.
Daarom is het verstandig zogenaamde commentaarregels toe te voegen aan je programma.
Dat kun je op verschillende manieren doen.
Als je een regel met het woordje Rem (van remark = opmerking) laat beginnen dan beschouwt Visual Basic die regel als commentaar. Het programma zorgt er voor dat die regel groen wordt afgedrukt.
In plaats van het woordje Rem mag je ook een quote ' gebruiken (een enkel aanhalingsteken)

De eventhandler (de code voor wat er moet gebeuren als er op de voegtoe-knop wordt geklikt) is als volgt:

Private Sub cmdVoegtoe_Click()

' als er niets is ingevuld kan er niets worden toegevoegd
If txtLand.text = "" Or txtHoofdstad.text = "" Then
      MsgBox("Je moet wel een land en een hoofdstad invoeren")
Else
  ' voeg het land toe aan de landenlijst
  lstLanden.AddItem (txtLand.text)
  ' voeg de hoofdstad toe aan de hoofdstedenlijst
  lstHoofdsteden.AddItem (txtHoofdstad.text)
  ' maak de tekstvensters leeg
  txtLand.text = ""
  txtHoofdstad.text = ""
End If

End Sub

Kijk goed naar de commentaarregels, daarin staat wat er gebeurt.

  8.3.4. Een item uitkiezen en afdrukken in een tekstvenster.

Het is de bedoeling dat, als je op de knop Geef de hoofdstad klikt (nadat je eerst een land hebt uitgekozen in de landenlijst), de hoofdstad van het gekozen land in het bijbehorende tekstvenster verschijnt.



Daarbij moet je de volgende opdrachten gebruiken:
  • n = lstLanden.ListIndex
    Dat levert het nummer op van het land waarop geklikt is.
    Als er bijvoorbeeld op de bovenste geklikt is krijgt n de waarde 0, want VB begint bij 0 te tellen.
    En als er bijvoorbeeld op de derde geklikt wordt krijgt n de waarde 2
    Als er nergens op geklikt is krijgt n de waarde -1
  • h = lstHoofdsteden.List(n)
    Dat levert het woord op dat op de n-de plaats staat van de hoofdstedenlijst.
    Als er bijvoorbeeld op het bovenste land geklikt is krijgt n de waarde 0, en dan bevat h de eerste hoofdstad.
    Als er bijvoorbeeld op het derde land geklikt is krijgt n de waarde 2, en dan bevat h de derde hoofdstad.
    De landen en de bijbehorende hoofdsteden moeten dus wel in dezelfde volgorde staan, anders gaat het verkeerd.
De eventhandler voor het klikken op de knop Geef de hoofdstad wordt als volgt:

Private Sub cmdHoofdstad_Click()
Dim n As Integer
Dim h As String

' n krijgt de waarde van het nummer van het land, dat is geselecteerd
n = lstLanden.ListIndex
If n > = 0 Then
' aan h wordt het woord toegekend dat op de n-de plaats staat van de lijst
      h = lstHoofdsteden.List(n)
      ' het land h wordt in het tekstvenster geplaatst
      txtGeefhoofdstad.text = h
Else
      ' als er niets was geselecteerd heeft n de waarde -1
      ' en dan wordt het volgende afgedrukt
      MsgBox ("Je moet eerst een land selecteren!")
End If

End Sub

Uitleg:
n krijgt de waarde van het nummer van de landenlijst, waarop geklikt is.
Als n groter of gelijk aan 0 is dan is ergens op geklikt, en dan levert lstHoofdsteden.List(n) de bijbehorende hoofdstad.
Die moet dan in het tekstvenster voor de hoofdstad worden geplaatst.
Als n niet groter of gelijk aan 0 is, dan is er niet op een land geklikt, dan gebeurt er wat na else staat.
Dan verschijnt er dus een messagebox met de tekst "Je moet eerst een land selecteren!"

  8.3.5. Een item verwijderen.

Het is de bedoeling dat, als je op de knop Verwijder klikt (nadat je eerst een land hebt uitgekozen in de landenlijst), dat land wordt verwijderd uit de landenlijst, en ook de bijbehorende hoofdstad moet worden verwijderd.

Daarbij moet je de volgende opdrachten gebruiken:
  • n = lstLanden.ListIndex
    Dat levert het nummer op van het land waarop geklikt is (zie de vorige paragraaf).
  • lstLanden.RemoveItem(n)
    Die opdracht zorgt er voor dat het land met nummer n wordt verwijderd uit de landenlijst.
De eventhandler voor het klikken op de knop Verwijder wordt als volgt:

Private Sub cmdVerwijder_Click()
Dim n As Integer

' n krijgt de waarde van het nummer van het land, dat is geselecteerd
n = lstLanden.ListIndex
If n >= 0 Then
      ' het land met nummer n wordt verwijderd
      lstLanden.RemoveItem (n)
      ' de hoofdstad met nummer n wordt verwijderd
      lstHoofdsteden.RemoveItem (n)
Else
      ' als er niets was geselecteerd heeft n de waarde -1
      ' en dan wordt het volgende afgedrukt
      MsgBox ("Je moet eerst een land selecteren!")
End If

End Sub

  8.3.6. Een lijst leeg maken

Het is de bedoeling dat, als je op de knop Maak leeg klikt, alle landen worden verwijderd uit de landenlijst, en ook alle hoofdsteden worden verwijderd uit de hoofdstedenlijst.
Voordat dat echt gebeurt wordt er nog gevraagd of je er zeker van bent dat je alles wilt verwijderen.
Daarvoor kun je handig een speciale messagebox gebruiken.

Je moet de volgende opdrachten gebruiken:
  • lstLanden.Clear
    Die opdracht zorgt er voor dat alle landen worden verwijderd uit de landenlijst.
  • a = MsgBox("Ben je er zeker van dat je alles wilt verwijderen ?", 4, "Legen")
    Die opdracht zorgt er voor dat er een messagebox verschijnt met een knop met Ja en een knop met Nee er op.
    En in de titelbalk van de messagebox staat "Legen"



    Als je dan op de knop met Ja klikt dan krijgt a de waarde 6, en als je op de knop met Nee klikt dan krijgt a de waarde 7.
    Meer informatie over messageboxen in de volgende paragraaf, lees dat voor verdere uitleg.
De eventhandler voor het klikken op de knop Maak leeg wordt als volgt:

Private Sub cmdMaakleeg_Click()

Dim a As Integer

a=MsgBox("Ben je er zeker van dat je alles wilt verwijderen ?",4,"Legen")

' als er op Ja geklikt is heeft a de waarde 6
If a = 6 Then
      lstLanden.Clear
      lstHoofdsteden.Clear
End If
End Sub

Uitleg:
De opdracht a=MsgBox("Ben je er zeker van dat je alles wilt verwijderen ?",4, "Legen") heeft tot gevolg dat er een messagebox verschijnt met een knop met Ja en een knop met Nee er op.
Als je dan op de knop met Ja klikt dan krijgt a de waarde 6, en als je op de knop met Nee klikt dan krijgt a de waarde 7.

De volgende opdrachten:
If a = 6 Then
          lstLanden.Clear
          lstHoofdsteden.Clear
End If

hebben tot gevolg dat, als er op de knop met Ja geklikt is (want dan heeft a de waarde 6) de twee lijsten geleegd worden.
En als er op de knop met Nee geklikt is (dan heeft a de waarde 7) gebeurt er niets, want dan is a niet gelijk aan 6

  8.3.7. De Messagebox en de Inputbox.

De meest eenvoudige messagebox-opdracht is bijvoorbeeld: MsgBox("Je moet wel een land en een hoofdstad invoeren")
dan verschijnt er een berichtvenster met daarin "Je moet wel een land en een hoofdstad invoeren" en een OK-knop er onder (en de naam van het project in de titelbalk), en dan kan de gebruiker niet eerder verder dan wanneer hij of zij op OK heeft geklikt. Daarna verdwijnt het berichtvenster en kan de gebruiker weer verder. Maar zolang er niet op geklikt is kan de gebruiker niets anders, alle vensters zijn "bevroren" totdat er op het berichtvenster is gereageerd.
Hoe groot de messagebox is en waar hij verschijnt bepaalt VisualBasic, daar kun je zelf niets aan veranderen.

Er is ook een uitgebreidere vorm van die opdracht mogelijk, in het algemeen is de syntax van de MessageBox-functie als volgt:
resultaat = MsgBox (Boodschap, Layout, Titel)
  1. De boodschap mag uit maximaal 1024 tekens bestaan, en je kunt er voor zorgen dat er een aantal regels onder elkaar komen door + chr(13) + chr(10) + tussen de regels te zetten (of + vbCrLf + )
  2. Titel : Het derde woord tussen de haakjes verschijnt in de titelbalk van de MessageBox.
  3. Layout : Het tweede woord tussen de haakjes bepaalt de layout van de MessageBox.
    Dat kan met de volgende woorden (zie de linker kolom van de tabel hier onder; dat zijn eigenlijk Visual Basic-constanten, die een bepaalde waarde hebben)
    Je kunt in plaats van dat woord, dus die constante, ook de bijbehorende waarde uit de tweede kolom van de tabel gebruiken):
    Bij de volgende twee opdrachten is het resultaat hetzelfde :
    a = MsgBox("Dit is de boodschap", vbCritical,"Titel")
    a = MsgBox("Dit is de boodschap", 16, "Titel")


    De mogelijkheden voor het middelste getal, dat bepaalt welke knoppen er verschijnen in de messagebox, zijn:

    vbOKOnly  0   alleen OK (de standaard methode)
    vbOKCancel  1 OK en Cancel
    vbAbortRetryIgnore  2 Abort, Retry en Ignore
    vbYesNoCancel  3 Yes, No en Cancel
    vbYesNo  4 Yes en No
    vbRetryCancel  5 Retry en Cancel
    vbCritical  16   OK en een Stop-teken
    vbQuestion   32 OK en een vraagteken
    vbExclamation  48 OK en een uitroepteken
    vbInformation  64 OK en een informatieteken (een i)

    Je kunt het ook nog combineren door dingen bij elkaar op te tellen.
    Als je bijvoorbeeld het getal 51 gebruikt (= 48 + 3) krijg je Yes, No en Cancel-knoppen en een uitroepteken
De waarde van de variabele, die aangeeft op welke knop is geklikt (hierboven a of resultaat genoemd), is als volgt:

OKCancelAbortRetryIgnoreYesNo
  1     2   3   4   5   6   7

Het drukken op de escape-toets heeft hetzelfde effect als het klikken op de cancel-knop.

Een Inputbox is net zoiets als een messagebox, met het verschil dat er in een inputbox nog tekst kan worden ingevoerd.
Als je bijv. de opdracht x = InputBox("Geef je naam", "naam") geeft dan verschijnt er een berichtvenster met daarin "Geef je naam" en daaronder een tekstvenster waarin die naam kan worden ingevoerd, en een OK-knop er onder, en in de titelbalk staat "naam".
De variabele x bevat het woord dat is ingevoerd.
Je kunt bij een inputbox ook bepalen waar het berichtvenster verschijnt: als je de opdracht x = InputBox("Geef je naam", "naam","piet", 1000, 2000) geeft dan verschijnt het venster 1000 twips van de bovenrand en 2000 twips van de linkerkant, en in het invoervak staat alvast "piet", en dat kun je dan aanvullen en of veranderen.

  8.3.8. Omhoog, omlaag.

Het is de bedoeling dat, als je op de knop Omhoog klikt (nadat je eerst een land hebt uitgekozen in de landenlijst), dat land een plaats hoger komt in de landenlijst, en ook de bijbehorende hoofdstad komt een plaats hoger.
Daarmee kun je dus de volgorde van de landen (en de bijbehorende hoofdsteden) veranderen.

Er is geen opdracht om een item in een lijst te wijzigen, er zijn alleen opdrachten om items te verwijderen en toe te voegen.
Daarom doen we het op de volgende manier:
  • Als bijvoorbeeld item nummer drie één omhoog moet, dus naar plaats twee, dan verwijderen we eerst item nummer twee (en we zorgen er voor dat we dat item wel onthouden).
    Dan staat item nummer drie automatisch op de tweede plaats.
  • En daarna voegen we op de derde plaats het oude item nummer twee in. En dan zijn we klaar.
  • Natuurlijk moeten we eerst controleren of er wel op een land is geklikt.
  • En we moeten er ook om denken dat, als het eerste land is geselecteerd, het niet omhooggeschoven kan worden.
De eventhandler voor het klikken op de knop Omhoog wordt als volgt:

Private Sub cmdOmhoog_Click()

Dim n As Integer
Dim land, stad As String

' n krijgt de waarde van het nummer van het land, dat is geselecteerd
n = lstLanden.ListIndex
If n >= 0 Then
      If n = 0 Then
            MsgBox ("Dit land kan niet omhoog!")
            Exit Sub
      End If
      ' het land met nummer n-1 wordt in de variabele land vastgelegd
      land = lstLanden.List(n - 1)
      ' het land met nummer n-1 wordt verwijderd
      lstLanden.RemoveItem (n - 1)
      ' op plaats n wordt de vorige ingevoegd
      lstLanden.AddItem land, n
      ' de hoofdstad met nummer n-1 wordt in de variabele stad vastgelegd
      land = lstHoofdsteden.List(n - 1)
      ' de hoofdstad met nummer n-1 wordt verwijderd
      lstHoofdsteden.RemoveItem (n - 1)
      ' op plaats n wordt de vorige ingevoegd
      lstHoofdsteden.AddItem land, n
Else
      ' als er niets was geselecteerd heeft n de waarde -1
      ' en dan wordt het volgende afgedrukt
      MsgBox ("Je moet eerst een land selecteren!")
End If

End Sub

Uitleg:
Het meeste zal wel duidelijk zijn, lees de commentaarregels goed.
Eén opdracht moet nog worden verduidelijkt:
De opdracht Exit Sub als laatste van de regels
If n = 0 Then
        MsgBox ("Dit land kan niet omhoog!")
        Exit Sub


Als die opdrachtregel er niet tussen stond dan zouden daarna de volgende opdrachten ook worden uitgevoerd als n gelijk is aan 0, maar dat is niet de bedoeling.
De opdracht Exit Sub heeft tot gevolg dat de volgende opdrachten niet worden uitgevoerd, maar dat er uit de procedure wordt gesprongen (er wordt eigenlijk naar End SUB gesprongen).

Het is de bedoeling dat, als je op de knop Omlaag klikt (nadat je eerst een land hebt uitgekozen in de landenlijst), dat land een plaats lager komt in de landenlijst, en ook de bijbehorende hoofdstad komt een plaats lager.

De methode die we gebruiken is vergelijkbaar met het omhoogschuiven:
  • Als bijvoorbeeld item nummer drie één omlaag moet, dus naar plaats vier, dan verwijderen we eerst item nummer vier (en we zorgen er voor dat we dat item wel onthouden).
  • En daarna voegen we op de derde plaats het oude item nummer vier in. En dan zijn we klaar.
  • Natuurlijk moeten we eerst controleren of er wel op een land is geklikt.
  • En we moeten er ook om denken dat, als het laatste land is geselecteerd, het niet omlaaggeschoven kan worden.
De eventhandler voor het klikken op de knop Omlaag wordt als volgt:

Private Sub cmdOmlaag_Click()

Dim n As Integer
Dim land, stad As String

' n krijgt de waarde van het nummer van het land, dat is geselecteerd
n = lstLanden.ListIndex
' als het de laatste is kan hij niet omlaag
If n = lstLanden.ListCount - 1 Then
      MsgBox ("Dit land kan niet omlaag!")
      ' sla in dit geval de rest van de opdrachten over
      Exit Sub
End If

If n >= 0 Then
      ' het land met nummer n+1 wordt in de variabele land vastgelegd
      land = lstLanden.List(n + 1)
      ' het land met nummer n+1 wordt verwijderd
      lstLanden.RemoveItem (n + 1)
      ' op plaats n wordt de vorige ingevoegd
      lstLanden.AddItem land, n
      ' de hoofdstad met nummer n+1 wordt in de variabele stad vastgelegd
      land = lstHoofdsteden.List(n + 1)
      ' de hoofdstad met nummer n+1 wordt verwijderd
      lstHoofdsteden.RemoveItem (n + 1)
      ' op plaats n wordt de vorige ingevoegd
      lstHoofdsteden.AddItem land, n
Else
      ' als er niets was geselecteerd heeft n de waarde -1
      ' en dan wordt het volgende afgedrukt
      MsgBox ("Je moet eerst een land selecteren!")
End If

End Sub

Uitleg:
Er is maar één belangrijk verschil met het omhoogschuiven, namelijk de controle of er misschien op het laatste land geklikt is.
De opdracht lstLanden.ListCount geeft het aantal landen in de lijst.
Maar je moet er wel om denken dat, als er bijvoorbeeld 6 landen zijn, dan heeft het laatste land nummer 5. Want er wordt begonnen te tellen bij 0.
Daarom is de index van het laatste land lstLanden.ListCount - 1

  8.3.9. Opdrachten.

Opgaven.
Maak nu opgave 3 van de oefenopgaven van hoofdstuk 8