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

Hoofdstuk 8: Visual Basic

8.7. Menu's

  8.7.1. Het menu van het overhoor-programma

We gaan het programma uit paragraaf 6 (het woordjes-overhoor programma) zo aanpassen dat er een echt Windows-menu wordt gebruikt.
Dat moet er als volgt uitzien:



Op de menubalk staan de woorden Bestand, Bewerken en Help
Als je op Bestand klikt verschijnt er een pulldown-menu onder met de woorden Nieuw, Open, Opslaan en Afsluiten
Als je op Bewerken klikt verschijnt er een pulldown-menu onder met de woorden Overhoor, Wijzig en Voeg toe aan bestand
Die woorden zijn in het begin grijsgekleurd, ze zijn dan niet geactiveerd want je moet eerst een bestand openen voordat er overhoord kan worden, enz.
En als je op Help klikt verschijnt er het woord Info onder.

Als je op Bestand → Open klikt dan kun je een woordjes-bestand uitkiezen, en dat wordt dan ingelezen.
Als je daarna op Bewerken → Overhoor klikt (dat is dan niet meer grijsgekleurd, het is dan wel geactiveerd), dan start het overhoorgedeelte.
Als je een bestand hebt geopend dan kun je ook kiezen voor Bewerken → Wijzigen , dan worden de woordjes met de vertaling getoond in een listbox.
Als je op een woord met de bijbehorende vertaling klikt, dan verschijnt dat woord en de vertaling in het bijbehorende tekstvenster.
Dat kun je dan wijzigen.
Je moet ook op Bestand → Nieuw kunnen klikken.
Dan kun je woorden met de vertaling invoeren. En als je dan op Bestand → Opslaan klikt dan kun je een map voor het nieuwe woordjes-bestand uitkiezen, en een naam, en dan wordt het in die map en onder die naam opgeslagen.

Als je op op Bewerken → Voeg toe aan bestand dan kun je eerst een bestand openen, en dan kun je daar woorden aan toevoegen.

Verder moet je nog voor Bestand → Afsluiten kunnen kiezen, dan wordt het programma afgesloten.

Tenslotte moet je nog op Help → Info kunnen klikken, en dan verschijnt er een informatietekst.

  8.7.2. Het menu maken

Als je een windowsmenu wilt maken dan klik je in het menu op Tools → Menu Editor



Dan verschijnt het Menu-editor venster.

  1. Bij Caption vul je in: &Bestand
    en bij Name vul je in: mnuBestand, zodat het venster er als volgt uitziet:



    Dit heeft tot gevolg dat het woord Bestand in de menubalk zal verschijnen.
    De & voor het woord Bestand heeft tot gevolg dat de B van Bestand in het menu onderstreept wordt, en dat je dat menuonderdeel, behalve met de muis, ook kunt activeren door op Alt/B te drukken.

  2. Dan klik je op Next en op de pijl naar rechts, dan kun je de menuonderdelen, die bij Bestand horen, invoeren.
  3. Voer eerst als opschrift Nieuw en bij naam mnuNieuw in, en kies bij Shortcut Ctrl/N uit (klik eerst op het pijltje).
  4. Klik op Next, voer dan als opschrift Open en bij naam mnuOpen in, en kies bij Shortcut Ctrl/O uit.
  5. Klik op Next, voer dan als opschrift Opslaan en bij naam mnuOpslaan in, en kies bij Shortcut Ctrl/S uit.

    Voor het laatste menuonderdeel, Afsluiten, willen we een scheidingslijntje.
    Dat kun je ook invoeren in de menu-editor, je voert bij Caption dan gewoon een streepje ( - ) in, en je moet bij naam ook iets invoeren (welke naam je daar invoert doet er niet toe, als er maar iets staat)
  6. Klik op Next, voer als opschrift - en bij naam mnuScheidingslijn in.
  7. Klik tenslotte weer op Next, voer als opschrift Afsluiten en bij naam mnuAfsluiten in, en kies bij Shortcut Ctrl/Q uit.
    Je hebt dan het volgende gekregen:



    We gaan nu verder met het menu-onderdeel Bewerken.
  8. Klik op Next, voer als opschrift Be&werken en bij naam mnuBewerken in, en klik op de pijl naar links
    Als je niet op de pijl naar links klikt dan verschijnt de optie Bewerken onder de vorige !

    Als je wel op de pijl naar links hebt geklikt dan verschijnt het woord Bewerken in de menubalk, naast het woord Bestand
    De & voor de w het woord Bewerken heeft tot gevolg dat de w van Bewerken in het menu onderstreept wordt, en dat je dat menuonderdeel, behalve met de muis, ook kunt activeren door op Alt/w te drukken.

  9. Dan klik je op Next en op de pijl naar rechts, dan kun je de menuonderdelen, die bij Bewerken horen, invoeren.
  10. Voer als opschrift Overhoor en bij naam mnuOverhoor in.
  11. Klik op Next, voer dan als opschrift Wijzig bestand en bij naam mnuWijzig in.
  12. Klik op Next, voer dan als opschrift Voeg toe aan bestand en bij naam mnuVoegtoe in.
    Tenslotte gaan we het menu-onderdeel Help nog invoeren.
  13. Klik op Next, voer als opschrift &Help en bij naam mnuHelp in, en klik op de pijl naar links
    Als je op de pijl naar links hebt geklikt dan verschijnt het woord Help in de menubalk, naast het woord Bewerken
    De & voor de H het woord Help heeft tot gevolg dat de H van Help in het menu onderstreept wordt, en dat je dat menuonderdeel, behalve met de muis, ook kunt activeren door op Alt/H te drukken.

  14. Dan klik je op Next en op de pijl naar rechts, dan kun je de menuonderdelen, die bij Help horen, invoeren.
  15. Voer als opschrift Info en bij naam mnuInfo in.

    Dan zijn we klaar met de menuonderdelen
  16. Klik nu op OK, dan verdwijnt de menu-editor.
Je kunt direkt uitproberen of het nu werkt. Laat het programma lopen, klik op Bestand (of druk op Alt/B), dan verschijnen de menu-onderdelen Nieuw, Open, Opslaan en Afsluiten er onder. Maar als je op één van die menuonderdelen klikt gebeurt er nog niets, want dat moet je nog programmeren.

  8.7.3. De programmacode bij een menuonderdeel

We gaan nu alvast de programmacode voor het menu-onderdeel Afsluiten invoeren.
Dat doe je op de volgende manier:
  • Klik in het ontwerpvenster op Bestand in het menu.
  • Klik dan op Afsluiten, dan verschijnt het venster voor de programmacode.
    En de eerste en de laatste regel voor de programmacode staan er automatisch al:

    Private Sub mnuAfsluiten_Click()

    End Sub

    En tussen die regels in moet de programmacode voor het afsluiten worden gezet.
  • Die code is wel heel gemakkelijk en kort, de code om een programma te beëindigen is alleen maar het woordje end, typ dat dus in.




Probeer het direkt maar uit. Laat het programma lopen, klik op Bestand en daarna op Afsluiten.
Als het goed gaat wordt het programma beëindigd, en heb je het ontwerpscherm weer in beeld.

  8.7.4. De interface

We zetten verder de benodigde labels, tekstboxen en buttons alvast op het formulier.
Die maken we in het begin allemaal onzichtbaar, zodat je met een leeg formulier begint waar alleen de menubalk op staat.
Maar als je dan een menukeuze hebt gemaakt dan is de interface alvast klaar.
Zorg er voor dat het er uitziet zoals hier onder.



Er zijn twee labels. Ze hebben als opschrift Nederlans woord en Vertaling, en als naam lblWoord en lblVertaling.
Achter elk van die labels staat een tekstvenster. Die hebben als naam txtWoord en txtVertaling.

Daar onder twee buttons. Ze hebben als opschrift Volgende en Stop, en als naam cmdVolgende en cmdStop.

Daar onder een label met als opschrift Goedzo, en als naam lblGoedzo.
En daar weer onder een listbox met als naam lstWoorden.

Verder nog een icoontje voor een "CommonDialog-venster", maar dat zie je niet als het programma loopt. Waar dat voor dient lees je in de volgende paragraaf.

  8.7.5. CommonDialog.

Er is erg handige manier om bestanden, mappen en drives op je scherm te tonen, en wel zo dat je een bestand kunt uitkiezen om in te lezen, of juist om een bestand te bewaren.
Dat is met behulp van een "CommonDialog-venster".
Met zo'n venster kun je verschillende dingen laten zien en uitkiezen.
Je moet in de toolbox klikken op het icoon dat je hier ziet.

Als dat icoon er niet bij staat dan kun je dat toevoegen.
Je moet dan rechtsklikken in de Toolbox, en dan klikken op Components.
Dan krijg je een venster in beeld, waarin je het tabblad Controls moet kiezen.
Dan zet je een vinkje voor Microsoft Common Dialog Control 6.0, en dan klik je op OK.



Als je zo'n commondialogobject op je formulier hebt gezet, dan wordt er niet automatisch een venster met dat object op je formulier getoond.
Dat komt omdat het er heel verschillend uit kan zien, en je moet in het programma aangeven welke versie van het commondialog-venster je wilt hebben.

Als het object CommonDialog1 heet (zo wordt het eerste commondialog-object standaard genoemd) dan kun je de volgende opdrachten in je programma geven:
  • CommonDialog1.ShowOpen : dit om een bestand uit te kunnen kiezen om in te lezen
  • CommonDialog1.ShowSave : dit om aan te geven dat een bestand op schijf moet worden opgeslagen
  • CommonDialog1.ShowFont : dit om een lettertype en grootte (en eventueel vet enz.) uit te kiezen
  • CommonDialog1.ShowPrinter : dit om iets af te laten drukken.
Als je dus de opdracht CommonDialog1.ShowOpen geeft dan wordt er een venster getoond waarin je een map uit kunt kiezen. En dan worden de bestanden uit die map getoond. Je kunt ook nog aangeven welke bestanden getoond worden.
Als je bijvoorbeeld de opdracht CommonDialog1.Filter = "Afbeeldingen|*.BMP"
geeft dan worden alleen de BMP-bestanden getoond, en daaronder wordt vermeld dat het om Afbeeldingen gaat.

Je kunt ook bepalen wat er in de titelbalk van het venster staat, bijvoorbeeld door de volgende opdracht te geven :
CommonDialog1.DialogTitle = "Klik op het gewenste afbeeldingsbestand"

Je wilt natuurlijk ook weten welk bestand er is uitgekozen, daarvoor kun je de opdrachten gebruiken:
bestand = CommonDialog1.FileName zorgt er voor dat de volledige bestandsnaam + het pad in de variabele "bestand" wordt opgeslagen.
naambestand = CommonDialog1.FileTitle zorgt er voor dat de volledige bestandsnaam zonder het pad in de variabele "naambestand" wordt opgeslagen.

Als het commondialog-venster verschijnt dan moet je maar afwachten waar het verschijnt, je kunt de plaats waar het verschijnt niet aangeven.

Je hoeft je niet over foutmeldingen te bekommeren, dat wordt allemaal automatisch geregeld als je een commondialog-venster gebruikt.
Als bijvoorbeeld een map wordt uitgekozen waarin niet geschreven kan worden dan zorgt het programma zelf voor een foutmelding, en dan kun je een andere map uitkiezen.
Het enige waar je om moet denken is dat het commondialog-venster gesloten kan worden zonder dat er een bestand is uitgekozen.
Dat kan gebeuren doordat er op Cancel is geklikt, of op de sluitknop.

In het properties-venster van het commondialog-object kun je ook verschillende dingen aangeven.
Ook wat het "filter" is, daar kun je bijvoorbeeld *.BMP invoeren.
Ook kun je CancelError op True zetten.
Dat heeft tot gevolg dat er een fout wordt gegenereerd als het venster gesloten wordt door op Cancel te klikken.
Daar kun je in je programma dan op reageren m.b.v. On error goto ..... (zie het vervolg, daar wordt het uitgelegd).

  8.7.6. Globale variabelen en Initialisatie.

Bij het programmeren gaan we eerst de globale variabelen declareren.
De woorden, die worden ingelezen en die worden overhoord, moeten tijdens het hele programma worden onthouden.
We gaan er van uit dat er niet meer dan 100 woorden in een bestand staan, dus we declareren Dim woord(100) As String
Ook de vertaling van die woorden moeten tijdens het hele programma worden onthouden, dus we declareren ook nog Dim vertaling(100) As String
.
Verder moet worden onthouden welke woorden wel, en welke woorden nog niet geweest zijn. We declareren daarom Dim geweest(100) As Boolean, als bijv. geldt dat geweest(7)=false dan betekent dat dat het zevende woord nog niet overhoord is.

Verder moet ook het aantal woorden in het bestand worden onthouden, het aantal dat goed vertaald is, het woord dat aan de beurt is om te overhoren, en de menuoptie worden onthouden.

Dus de allereerste programmaregels (onder General, en dan Declarations) worden:

Dim aantalwoorden, aantalgoed, woordnr, menuoptie As Integer
Dim woord(100), vertaling(100) As String
Dim geweest(100) As Boolean

Vlak daar onder zetten we een procedure initialisatie.
Initialisatie is iets, dat in het begin moet gebeuren.
In het begin, en elke keer als er gestopt wordt met een menuonderdeel, moeten alle objecten op het formulier onzichtbaar worden.
En de menuonderdelen Overhoor, Wijzig en Voeg toe aan bestand moeten in het begin grijsgekleurd zijn (ze zijn dan niet geactiveerd als er geen bestand geopenend is).
De opdracht om er voor te zorgen dat de optie Overhoor inactief is, is mnuOverhoor.Enabled = False
En de opdracht om er voor te zorgen dat de optie wel actief is, is dan natuurlijk mnuOverhoor.Enabled = True

Tik dus onder de vorige opdrachten het volgende:

Private Sub initialisatie()
    lblWoord.Visible = False
    lblVertaling.Visible = False
    lblGoedzo.Visible = False
    txtWoord.Visible = False
    txtVertaling.Visible = False
    cmdVolgende.Visible = False
    cmdStop.Visible = False
    lstWoorden.Visible = False
    lstWoorden.Clear
    mnuOverhoor.Enabled = False
    mnuWijzig.Enabled = False
    mnuVoegtoe.Enabled = False
    aantalwoorden = 0
    aantalgoed = 0
    menuoptie = 0 
End Sub

Dat heeft tot gevolg dat je overal in het programma het opdrachtwoord initialisatie kunt gebruiken.
En als die opdracht geeft dan worden alle opdrachten van die procedure uitgevoerd.

Elke keer als er een nieuwe keuze in het Bewerken-menu is gemaakt moeten alle objecten op het formulier zichtbaar worden.
Daar maken we ook een procedure van, met de naam maakzichtbaar, zodat je dat woord ook als opdrachtwoord kunt gebruiken.
Tik dus onder de vorige procedure het volgende in:

Private Sub maakzichtbaar()
	lblWoord.Visible = True
	lblVertaling.Visible = True
	lblGoedzo.Visible = True
	txtWoord.Visible = True
	txtVertaling.Visible = True
	cmdVolgende.Visible = True
	cmdStop.Visible = True
	lstWoorden.Visible = True
End Sub

De opdrachten van de procedure initialisatie moeten o.a. direkt bij de start worden uitgevoerd, dubbelklik dus in het ontwerpvenster ergens op een lege plek van het formulier.
Dan kun je de procedure Form_Load invoeren.
Daar hoef je alleen maar de opdracht initialisatie in te typen.
Dan heb je dus de volgende code:

Private Sub Form_Load()
            initialisatie
End Sub

  8.7.7. Nieuw bestand aanmaken met woordjes.

Als je op Bestand → Nieuw klikt dan moeten de tekstvenstertjes, waarin je de nieuwe woorden kunt invoeren, zichtbaar worden. En de labels en knoppen.
De opdracht daarvoor is: maakzichtbaar()
Het goedzo-label hoeft echter niet zichtbaar te zijn, vandaar dat we de opdracht lblGoedzo.Visible = False toevoegen.
En we zorgen er voor dat de variabele menuoptie de waarde 1 krijgt. Daar maken we gebruik van als er op de volgende-knop wordt geklikt. Want wat er dan moet gebeuren hangt er van af waar je mee bezig bent, dus welke menuoptie je hebt gekozen.
De code voor de menu-opdracht Nieuw wordt dus als volgt:
(klik dus in het ontwerpvenster op Bestand en dan op Nieuw, dan verschijnt het programmavenster)

Private Sub mnuNieuw_Click()
	maakzichtbaar
	lblGoedzo.Visible = False
	menuoptie = 1
End Sub

Als je dan een woord hebt ingevuld, en de vertaling ervan, en je klikt op de Volgende-knop dan moeten de volgende programmaregels worden uitgevoerd: (dubbelklik dus in het ontwerpvenster op de Volgende-knop, dan verschijnt het programmavenster)

Private Sub cmdVolgende_Click()
If menuoptie = 1 Then
    aantalwoorden = aantalwoorden + 1
    If aantalwoorden <= 100 Then
        woord(aantalwoorden) = txtWoord.Text
        vertaling(aantalwoorden) = txtVertaling.Text
    End If
    
    lstWoorden.AddItem txtWoord.Text + " = " + txtVertaling.text
    txtWoord.Text = ""
    txtVertaling.text = ""
End If

Uitleg:
  • Het aantalwoorden wordt met één vermeerderd.
  • Als het aantal woorden bijv. 7 is, dan wordt de vierde opdracht: woord(7) = txtWoord.Text. Dat heeft tot gevolg dat in de variabele woord(7) het woord wordt vastgelegd dat in het eerste tekstvenster is ingevuld.
  • De volgende opdracht heeft dan tot gevolg dat in de variabele vertaling(7) het woord wordt vastgelegd dat in het tweede tekstvenster is ingevuld.
  • Maar dit gebeurt alleen als het aantal woorden kleiner dan 100 is, omdat er maar ruimte voor 100 woorden is gedeclareerd.

  • De opdracht lstWoorden.AddItem txtWoord.Text + " = " + txtVertaling heeft tot gevolg dat het woord met de vertaling aan de lijst in de listbox wordt toegevoegd (het woord met de vertaling en een = ertussen worden eerst aan elkaar vastgeplakt).

  • Tenslotte worden de tekstvenstertjes leeggemaakt.

  8.7.8. Het bestand opslaan.

Als je op Bestand → Opslaan klikt dan verschijnt het volgende venster:



  1. Je hoeft maar één opdracht te geven om er voor te zorgen dat er zo'n venster verschijnt. Die opdracht is: CommonDialog1.ShowSave
  2. En de opdracht CommonDialog1.Filter = "Woordjesbestanden|*.wrd" heeft tot gevolg dat alleen de bestanden met de extensie wrd worden getoond, en dat bij Bestandstypen staat: Woordjesbestanden
  3. De opdracht bestandsnaam = CommonDialog1.FileName zorgt er voor dat de variabele bestandsnaam de naam bevat die als bestandsnaam is ingevoerd in het venster.
  4. Door de opdracht bestandsnaam = bestandsnaam + ".wrd" wordt er automatisch de extensie .wrd aan de naam vastgeplakt. Dat hoeft de gebruiker er zelf dus niet achter te typen.
  5. Het kan natuurlijk gebeuren dat de gebruiker niet in de gaten heeft dat hij de extensie er zelf niet achter hoeft te typen.
    Als hij dat wel intypt dan heeft de vorige opdracht tot gevolg dat de extensie er twee keer achter staat, omdat die er ook nog eens achter geplakt wordt. Dat moeten we voorkomen.
    Dat gebeurt met de volgende opdrachten:
    a = InStr(bestandsnaam, ".")
    If a > 0 Then bestandsnaam = Mid(bestandsnaam, 1, a - 1)

    Eerst wordt gekeken of er een punt in de bestandsnaam voorkomt, en a geeft dan de plaats a waar die punt staat.
    (Als er geen punt in zit krijgt a de waarde -1)
    En bestandsnaam = Mid(bestandsnaam, 1, a - 1) heeft tot gevolg dat de punt, en wat daar achter staat, wordt verwijderd uit de naam. Want de nieuwe bestandsnaam wordt het gedeelte van de naam vanaf letter 1 tot en met letter a-1, dat is de letter voor de punt.
  6. De opdracht Open bestandsnaam For Output As #1 heeft tot gevolg dat het bestand gemaakt wordt.
    Maar als er bij Bestandsnaam niet is ingevuld, of als er op Cancel is gedrukt, dan is de variabele bestandsnaam leeg.
    En als je dan niets bijzonders doet volgt er een foutmelding, en dan stopt het programma.
    Dat wil je natuurlijk niet. Maar dat hoeft ook niet, want je kunt er voor zorgen dat er bij een fout gewoon wordt doorgegaan met het programma. Maar dan wel op een speciale plaats, want er kan niet gewoon vervolgd worden met de volgende opdrachten.
    Daarom staat de opdracht On Error GoTo fout in het begin van de procedure.
    En helemaal onderaan in de procedure staat fout: en dan komt End Sub
    Dat heeft tot gevolg dat, als er een fout optreedt, het programma verder gaat bij het programmagedeelte dat begint bij fout: (dat wordt een programma-label genoemd).
    Daar staat End Sub achter, dat heeft dus tot gevolg dat, als er een fout optreedt, de procedure wordt afgesloten zonder dat er verder iets wordt opgeslagen. de opdracht CommonDialog1.CancelError = True heeft tot gevolg dat, als er op Cancel wordt gedrukt, de computer net zo reageert als wanneer er een fout optreedt. En dan wordt er dus ook naar de regel met fout: gesprongen.
  7. Als er geen fout optreedt dan worden de woorden met de vertaling opgeslagen in een bestand.
    De volgende opdrachten zorgen daarvoor:
    Open bestandsnaam For Output As #1
    For i = 1 To aantalwoorden
            Print #1, woord(i)
            Print #1, vertaling(i)
    Next i
    Close #1
  8. Tenslotte zorgt de opdracht initialisatie er voor dat het formulier leeg wordt gemaakt
  9. Als eerste regel van de procedure staat nog de opdracht If aantalwoorden < 1 Then Exit Sub.
    Die staat er bij omdat, als er helemaal geen woorden zijn ingevoerd, er ook niets hoeft te worden opgeslagen.
    Exit Sub heeft tot gevolg dat de procedure wordt verlaten, zonder dat er verder iets gebeurt.
De procedure voor het opslaan ziet er dan als volgt uit:

Private Sub mnuOpslaan_Click()
Dim bestandsnaam As String
Dim i As Integer

If aantalwoorden < 1 Then Exit Sub

CommonDialog1.CancelError = True
On Error GoTo fout
CommonDialog1.Filter = "Woordjesbestanden|*.wrd"
CommonDialog1.ShowSave

bestandsnaam = CommonDialog1.FileName
a = InStr(bestandsnaam, ".")
If a > 0 Then bestandsnaam = Mid(bestandsnaam, 1, a - 1)
bestandsnaam = bestandsnaam + ".wrd"

Open bestandsnaam For Output As #1
For i = 1 To aantalwoorden
    Print #1, woord(i)
    Print #1, vertaling(i)
Next i
Close #1

initialisatie

fout:

End Sub

  8.7.9. Een bestand openen.

Als je op Bestand → Openen klikt dan verschijnt het volgende venster:



De procedure voor het openen bevat de volgende code:

Private Sub mnuOpen_Click()
Dim bestandsnaam As String
Dim i, a As Integer

CommonDialog1.CancelError = True
On Error GoTo fout
CommonDialog1.Filter = "Woordjesbestanden|*.wrd"
CommonDialog1.ShowOpen

bestandsnaam = CommonDialog1.FileName
a = InStr(bestandsnaam, ".")
If a > 0 Then extensie = Mid(bestandsnaam, a + 1)
If extensie <> "wrd" Then
    MsgBox ("Je moet een bestand uitkiezen met extensie wrd")
    Exit Sub
End If

Open bestandsnaam For Input As #1
i = 1
While Not EOF(1)
    Line Input #1, woord(i)
    If Not EOF(1) Then Line Input #1, vertaling(i)
    aantalwoorden = i
    i = i + 1
Wend

Close #1

mnuOverhoor.Enabled = True
mnuWijzig.Enabled = True
mnuVoegtoe.Enabled = True
fout:

End Sub

  1. Je hoeft maar één opdracht te geven om er voor te zorgen dat er zo'n venster verschijnt. Die opdracht is: CommonDialog1.ShowOpen
  2. De opdrachten lijken verder veel op die bij de procedure voor het opslaan.
    Kijk daar voor verdere uitleg
  3. De laatste drie opdrachten (mnuOverhoor.Enabled = True enz ) hebben tot gevolg dat de menuopties Overhoor, Wijzig en Voeg toe ook gekozen kunnen worden.
    Bij de start waren die inactief gemaakt.

  8.7.10. Overhoren.

De procedure voor het overhoren bevat de volgende programmaregels:

Private Sub mnuOverhoor_Click()
	maakzichtbaar
	cmdVolgende.Visible = False
	lblGoedzo.Caption = "Tik het antwoord in, druk dan op enter"
	menuoptie = 2
	aantalgoed = 0
	aantalgeweest = 0
	Randomize
	woordnr = Int(Rnd * aantalwoorden) + 1
	txtWoord.Text = woord(woordnr)
	geweest(woordnr) = True
	txtVertaling.SetFocus
End Sub

  • De opdracht maakzichtbaar heeft tot gevolg dat de interface er als volgt uitziet:



  • De Volgende-knop hoeft in het begin niet zichtbaar te zijn, daarom de opdracht cmdVolgende.Visible = False
  • De variabele woordnr bevat na de opdracht woordnr = Int(Rnd * aantalwoorden) + 1 een willekeurig nummer tussen 1 en aantalwoorden.
    En het woord met dat nummer verschijnt in het eerste tekstvenster (daar zorgt de opdracht txtWoord.Text = woord(woordnr) voor)
  • Er wordt geregistreerd dat het woord met dat nummer geweest is d.m.v. de opdracht geweest(woordnr) = True
  • En de opdracht txtVertaling.SetFocus heeft tot gevolg dat de cursor in het tweede tekstvenster, waarin de vertaling moet worden getypt, wordt geplaatst.
    Anders moet de muis altijd nog worden gebruikt om in dat tekstvenster te klikken, of er moet eerst op de tabtoets worden gedrukt.
    Dat voorkom je door deze opdracht.
Als de vertaling is ingetypt, en er wordt op enter gedrukt, dan wordt de volgende procedure uitgevoerd:

Private Sub txtVertaling_KeyPress(KeyAscii As Integer)
Dim s As Integer

If KeyAscii = 13 Then
    If menuoptie = 2 Then
        If txtVertaling.Text = vertaling(woordnr) Then
           aantalgoed = aantalgoed + 1
           lblGoedzo.Caption = "Goed zo, je hebt " & Str(aantalgoed) & " goed"
        Else
           lblGoedzo.Caption = "Nee, het is " & vertaling(woordnr)
        End If
        aantalgeweest = aantalgeweest + 1
        
        lstWoorden.AddItem txtWoord.Text & " = " & vertaling(woordnr)
    End If
    cmdVolgende.Visible = True
    
    If menuoptie = 3 Then
        ............................ 
        ............................
    End If
    
End If

End Sub

Uitleg:
Er wordt gecontroleerd of het antwoord goed was, en dat wordt in het label getoond.
De opdracht lstWoorden.AddItem txtWoord.Text & " = " & vertaling(woordnr) heeft tot gevolg dat het woord met de vertaling ook nog even in de listbox verschijnt.
En de volgende-knop verschijnt in beeld door de opdracht cmdVolgende.Visible = True

Als er op de volgende-knop wordt geklikt, dan wordt de volgende procedure uitgevoerd:

Private Sub cmdVolgende_Click()
If menuoptie = 1 Then
    .................................
    .................................
End If

If menuoptie = 2 Then
    txtWoord.Text = ""
    txtVertaling.Text = ""
    If aantalgeweest >= aantalwoorden Then
        MsgBox ("Alle woorden zijn geweest")
        initialisatie
        Exit Sub
    End If
    
    ' Er wordt net zolang om een nummer "gedobbeld" tot er
    ' één gevonden is die nog niet geweest is
    Do Until geweest(woordnr) = False
       woordnr = Int(Rnd * aantalwoorden) + 1
    Loop
    ' dat nummer wordt dan geregistreerd als
    ' geweest zijnde, zodat het niet weer wordt gevraagd
    geweest(woordnr) = True
    ' dat woord verschijnt in de tekstbox
    txtWoord.Text = woord(woordnr)
    ' de cursor wordt in het tekstvenster txtVertaling gezet
    ' zodat er niet eerst in dat venster geklikt hoeft te worden
    txtVertaling.SetFocus
    lblGoedzo.Caption = "Tik het antwoord in, druk dan op enter"
    cmdVolgende.Visible = False
    End If

End Sub

Uitleg:
De tekstvensters worden leeggemaakt.
Als alle woorden geweest zijn dan wordt dat in een messegebox getoond.
Er wordt weer een willekeurig nummer uitgezocht, maar dat moet natuurlijk wel een nummer zijn dat nog niet aan de beurt is geweest.
Het woord met dat nummer verschijnt in de bovenste tekstbox.
En de volgende-knop wordt onzichtbaar gemaakt.

  8.7.11. Het volledige programma.

Nog niet alles is besproken. Maar de rest is waarschijnlijk zo wel duidelijk.
Dan volgt hier nog het volledige programma:

Dim aantalwoorden,aantalgoed,woordnr,aantalgeweest,menuoptie As Integer
Dim woord(100), vertaling(100) As String
Dim geweest(100) As Boolean
' -----------------------------------------------------------------------
Private Sub initialisatie()
    lblWoord.Visible = False
    lblVertaling.Visible = False
    lblGoedzo.Visible = False
    txtWoord.Visible = False
    txtVertaling.Visible = False
    cmdVolgende.Visible = False
    cmdStop.Visible = False
    lstWoorden.Visible = False
    lstWoorden.Clear
    mnuOverhoor.Enabled = False
    mnuWijzig.Enabled = False
    mnuVoegtoe.Enabled = False
    aantalwoorden = 0
    aantalgoed = 0
    menuoptie = 0
End Sub
' -----------------------------------------------------------------------
Private Sub maakzichtbaar()
    lblWoord.Visible = True
    lblVertaling.Visible = True
    lblGoedzo.Visible = True
    txtWoord.Visible = True
    txtVertaling.Visible = True
    cmdVolgende.Visible = True
    cmdStop.Visible = True
    lstWoorden.Visible = True
End Sub
' -----------------------------------------------------------------------
Private Sub cmdStop_Click()
	initialisatie
End Sub
' -----------------------------------------------------------------------
Private Sub cmdVolgende_Click()
If menuoptie = 1 Then
    aantalwoorden = aantalwoorden + 1
    If aantalwoorden <= 100 Then
        woord(aantalwoorden) = txtWoord.Text
        vertaling(aantalwoorden) = txtVertaling.Text
    End If
    
    lstWoorden.AddItem txtWoord.Text + " = " + txtVertaling
    txtWoord.Text = ""
    txtVertaling = ""
End If

If menuoptie = 2 Then
    txtWoord.Text = ""
    txtVertaling.Text = ""
    If aantalgeweest >= aantalwoorden Then
        MsgBox ("Alle woorden zijn geweest")
        initialisatie
        Exit Sub
    End If
    
    ' Er wordt net zolang om een nummer "gedobbeld" tot er
    ' één gevonden is die nog niet geweest is
    Do Until geweest(woordnr) = False
       woordnr = Int(Rnd * aantalwoorden) + 1
    Loop
    ' dat nummer wordt dan geregistreerd als
    ' geweest zijnde, zodat het niet weer wordt gevraagd
    geweest(woordnr) = True
    ' dat woord verschijnt in de tekstbox
    txtWoord.Text = woord(woordnr)
    ' de cursor wordt in het tekstvenster txtVertaling gezet
    ' zodat er niet eerst in dat venster geklikt hoeft te worden
    txtVertaling.SetFocus
    lblGoedzo.Caption = "Tik het antwoord in, druk dan op enter"
    cmdVolgende.Visible = False
    End If

End Sub
' -----------------------------------------------------------------------
Private Sub Form_Load()
    initialisatie
End Sub
' -----------------------------------------------------------------------
Private Sub lstWoorden_Click()
Dim s As Integer
 
If menuoptie = 3 Then
    s = lstWoorden.ListIndex
    txtWoord.Text = woord(s + 1)
    txtVertaling.Text = vertaling(s + 1)
End If

End Sub
' -----------------------------------------------------------------------
Private Sub mnuAfsluiten_Click()
	End
End Sub
' -----------------------------------------------------------------------
Private Sub mnuInfo_Click()
Dim Inf As String
    Inf = "Dit programma werd geschreven door R.J. vd Beek"+Chr(10)+Chr(13)
    Inf = Inf + "Lauwers College" + Chr(10) + Chr(13)
    Inf = Inf + "Buitenpost"
    MsgBox Inf, vbOKOnly, "About"
End Sub
' -----------------------------------------------------------------------
Private Sub mnuVoegtoe_Click()
mnuOpen_Click
If aantalwoorden = 0 Then Exit Sub
maakzichtbaar
lblGoedzo.Visible = False

For i = 1 To aantalwoorden
    lstWoorden.AddItem (woord(i) & " = " & vertaling(i))
Next i
menuoptie = 1
End Sub
' -----------------------------------------------------------------------
Private Sub mnuWijzig_Click()

Dim i As Integer

maakzichtbaar
cmdVolgende.Visible = False
menuoptie = 3

For i = 1 To aantalwoorden
    lstWoorden.AddItem (woord(i) & " = " & vertaling(i))
Next i

lstWoorden.Selected(0) = True
txtWoord.Text = woord(1)
txtVertaling.Text = vertaling(1)

lblGoedzo.Caption = "Selecteer in de lijst het woord dat je wilt wijzigen"

End Sub
' -----------------------------------------------------------------------
Private Sub mnuNieuw_Click()
maakzichtbaar
lblGoedzo.Visible = False

menuoptie = 1
End Sub
' -----------------------------------------------------------------------
Private Sub mnuOpen_Click()
Dim bestandsnaam As String
Dim i, a As Integer

CommonDialog1.CancelError = True
On Error GoTo fout
CommonDialog1.Filter = "Woordjesbestanden|*.wrd"
CommonDialog1.ShowOpen

bestandsnaam = CommonDialog1.FileName
a = InStr(bestandsnaam, ".")
If a > 0 Then extensie = Mid(bestandsnaam, a + 1)
If extensie <> "wrd" Then
    MsgBox ("Je moet een bestand uitkiezen met extensie wrd")
    Exit Sub
End If

Open bestandsnaam For Input As #1
i = 1
While Not EOF(1)
    Line Input #1, woord(i)
    If Not EOF(1) Then Line Input #1, vertaling(i)
    aantalwoorden = i
    i = i + 1
Wend

Close #1

mnuOverhoor.Enabled = True
mnuWijzig.Enabled = True
mnuVoegtoe.Enabled = True
fout:

End Sub
' -----------------------------------------------------------------------
Private Sub mnuOpslaan_Click()
Dim bestandsnaam As String
Dim i As Integer

If aantalwoorden < 1 Then
    Exit Sub
End If

CommonDialog1.CancelError = True
On Error GoTo fout
CommonDialog1.Filter = "Woordjesbestanden|*.wrd"
CommonDialog1.ShowSave

bestandsnaam = CommonDialog1.FileName
a = InStr(bestandsnaam, ".")
If a > 0 Then bestandsnaam = Mid(bestandsnaam, 1, a - 1)
bestandsnaam = bestandsnaam + ".wrd"

Open bestandsnaam For Output As #1
For i = 1 To aantalwoorden
    Print #1, woord(i)
    Print #1, vertaling(i)
Next i
Close #1

initialisatie

fout:

End Sub
' -----------------------------------------------------------------------
Private Sub mnuOverhoor_Click()

maakzichtbaar
cmdVolgende.Visible = False
lblGoedzo.Caption = "Tik het antwoord in, druk dan op enter"
menuoptie = 2
aantalgoed = 0
aantalgeweest = 0
Randomize
woordnr = Int(Rnd * aantalwoorden) + 1
txtWoord.Text = woord(woordnr)
geweest(woordnr) = True
txtVertaling.SetFocus
End Sub
' -----------------------------------------------------------------------
Private Sub txtVertaling_KeyPress(KeyAscii As Integer)
Dim s As Integer

If KeyAscii = 13 Then
  If menuoptie = 2 Then
    If txtVertaling.Text = vertaling(woordnr) Then
      aantalgoed = aantalgoed + 1
      lblGoedzo.Caption="Goed zo, je hebt " & Str(aantalgoed) & " goed"
    Else
      lblGoedzo.Caption = "Nee, het is " & vertaling(woordnr)
    End If
      aantalgeweest = aantalgeweest + 1
        
      lstWoorden.AddItem txtWoord.Text & " = " & vertaling(woordnr)
  End If
  cmdVolgende.Visible = True
    
  If menuoptie = 3 Then
    s = lstWoorden.ListIndex
    lstWoorden.RemoveItem (s)
    lstWoorden.AddItem txtWoord.Text & " = " & txtVertaling.Text, s
  End If
    
End If

End Sub
' -----------------------------------------------------------------------
Private Sub txtWoord_KeyPress(KeyAscii As Integer)
Dim s As Integer

If KeyAscii = 13 Then
    If menuoptie = 3 Then
        s = lstWoorden.ListIndex
        lstWoorden.RemoveItem (s)
        lstWoorden.AddItem txtWoord.Text & " = " & txtVertaling.Text, s
    End If
    
End If
End Sub

  8.7.12 Opdrachten.

Opgaven.
Maak nu opgave 7 van de opgaven van hoofdstuk 8