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.
-
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.
- Dan klik je op Next en op de pijl naar rechts, dan kun je de
menuonderdelen, die bij Bestand horen, invoeren.
- Voer eerst als opschrift Nieuw en bij naam mnuNieuw in, en kies bij Shortcut Ctrl/N uit
(klik eerst op het pijltje).
- Klik op Next, voer dan als opschrift Open en bij naam mnuOpen in, en kies bij Shortcut Ctrl/O uit.
- 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)
- Klik op Next, voer als opschrift - en bij naam mnuScheidingslijn in.
- 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.
- 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.
- Dan klik je op Next en op de pijl naar rechts, dan kun je de
menuonderdelen, die bij Bewerken horen, invoeren.
- Voer als opschrift Overhoor en bij naam mnuOverhoor in.
- Klik op Next, voer dan als opschrift Wijzig bestand en bij naam mnuWijzig in.
- 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.
- 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.
- Dan klik je op Next en op de pijl naar rechts, dan kun je de
menuonderdelen, die bij Help horen, invoeren.
- Voer als opschrift Info en bij naam mnuInfo in.
Dan zijn we klaar met de menuonderdelen
- 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:
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:
-
Je hoeft maar één opdracht te geven om er voor te zorgen dat er zo'n venster verschijnt.
Die opdracht is: CommonDialog1.ShowSave
- 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
- De opdracht bestandsnaam = CommonDialog1.FileName zorgt er voor dat de variabele bestandsnaam
de naam bevat die als bestandsnaam is ingevoerd in het venster.
- 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.
- 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.
-
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.
-
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
- Tenslotte zorgt de opdracht initialisatie er voor dat het formulier leeg wordt gemaakt
- 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
-
Je hoeft maar één opdracht te geven om er voor te zorgen dat er zo'n venster verschijnt.
Die opdracht is: CommonDialog1.ShowOpen
- De opdrachten lijken verder veel op die bij de procedure voor het opslaan.
Kijk daar voor verdere uitleg
- 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
|