Info-books geeft een reeks informaticahandboeken uit die opgesteld zijn voor leerlingen van alle onderwijsniveaus, zowel het middelbaar als het hoger onderwijs. Bovendien is er een specifiek boek voor leerkrachten voorzien. Enerzijds is er de reeks Inform 5/6 die voornamelijk bestemd is voor de derde graad van het middelbaar onderwijs. Deze reeks is een vervolg op de reeks Inform 3 en Inform 4 die door de uitgeverij Pelckmans voor de tweede graad uitgegeven wordt. Anderzijds richt Info-books zich ook naar het hoger onderwijs. Bepaalde boeken uit de reeks Inform 5/6 werden herwerkt, andere zijn zonder meer bruikbaar en meer gespecialiseerde werken voor de richting Toegepaste Informatica werden toegevoegd. Bij het samenstellen van een boek probeert Info-books systematisch van een probleemstelling te vertrekken. Pas daarna wordt het materiaal aangereikt om dat probleem op te lossen. Informatica is een middel om problemen op te lossen. Het is niet louter een opsomming van hardwarecomponenten en programmeringstechnieken. Een ander punt waar Info-books veel belang aan hecht is integratie. Leerstofonderdelen zijn geen eilandjes. Het is dan ook logisch dat door vrijwel de hele boekenreeks een rode draad loopt. Een klein bedrijf wordt voortdurend met nieuwe problemen geconfronteerd en lost die met behulp van de computer op. Het gaat hier om concrete problemen zoals een facturatie die tot in het detail uitgewerkt wordt. Als het nodig is worden rekenblad, databaseprogramma en tekstverwerking samengebracht om tot een oplossing te komen. Integreren doe je niet om het integreren zelf maar om een probleem op te lossen. Niettemin is elk boekdeel zelfstandig bruikbaar. Je hoeft je dus bijvoorbeeld geen zorgen te maken dat voorkennis van Word noodzakelijk is om PowerPoint of FrontPage te kunnen gebruiken… Het handboek voor leerkrachten (en hulpopvoedend personeel, secretariaat) werd opgesteld voor leerkrachten van alle onderwijsniveaus – van basisonderwijs tot hoger onderwijs - die het vak informatica niet geven, maar die gebruik willen maken van informatica bij hun lesvoorbereidingen of administratief werk of die de computer in hun lessen willen integreren. In Info-books wordt op een praktische manier in één omgeving, Windows en meestal Microsoft Office, gewerkt. De opdrachten zijn gedeeltelijk in de hoofdstukken opgenomen, gedeeltelijk gegroepeerd op het einde ervan. Na elk hoofdstuk volgen een besluit en de leerdoelen of eindtermen ('Wat je moet kennen en kunnen:'). In de leidraad voor leerkrachten worden de leerdoelen vervangen door praktische en didactische tips en nuttige informatie. Het is niet de bedoeling dat alle opdrachten in de klas gemaakt worden. Dat hangt van de beschikbare tijd af. De auteurs Juni 2011
De publicaties van Info-books werden samengesteld in een Windows- en Internet Explorer 7.0omgeving. Er werd gebruik gemaakt van Office 2003/2007. Van zodra een recentere versie in de omgeving of in het Officepakket de belangrijkste op de markt wordt, zullen de publicaties aangepast worden.
De reeks Informatica voor het Secundair 0nderwijs (Toegepaste Informatica) bestaat uit de volgende boeken:
Boekhouden-informatica, Informaticabeheer: BI1c Deel 1: Systeemsoftware, Netwerken, Internet en Hardware (Win XP) BI2cd Deel 2: Het rekenblad Excel (*) BI3cd Deel 3: Gegevensbeheer in Access (*) BI4ac Deel 4: Programmeren in Visual Basic for Applications (**) (a: DAO-objecten, c: ADO-objecten) BI5 Deel 5: Programmeren voor een bedrijfsecon. toepassing: de facturatie (**)
Voor alle richtingen, zowel Secundair als Hoger Onderwijs werden uitgewerkt: AL6cd AL7cd AL8cd AL9cd AL10 AL11cde AL12 AL13 AL20
Deel 6: Deel 7: Deel 8: Deel 9: Deel 10: Deel 11: Deel 12: Deel 13: Deel 20:
Tekstverwerking met Word (*) Elektronisch presenteren met PowerPoint (*) Elektronisch publiceren: HTML en FrontPage (*) Elektronisch publiceren: FrontPage (*) Elektronisch publiceren: HTML (uitgebreide versie) Communicatie via Outlook (*) JavaScript VBScript Algoritmen en programmeren in Access en Excel (Basis)
Voor het Hoger Onderwijs biedt Info-books de volgende publicaties aan: HO30e Deel 30e: Systeembeheer met Windows Vista en internet HO31 Deel 31: Dubbel boekhouden HO32a Deel 32a: ERP met NAV 2009, Basis en Financieel HO32b Deel 32b: ERP met NAV 2009, Uitbreiding HO33a Deel 33a: ERP met Navision, Basis en Financieel 1 HO33b Deel 33b: ERP met Navision, Financieel 2 HO34 Deel 34: Internetapplicaties HO35 Deel 35: XML-XSL HO36 Deel 36: JavaScript (uitgebreide versie) HO37 Deel 37: Programmeren in Java HO38cd Deel 38: Gegevensbeheer in Access (basis en uitbreiding) (*) HO39 Deel 39: Scripttalen HO40a,b Deel 40a,b: Programmeren in Java: AWT en SWING HO40c,d Deel 40c,d,e: Java voor het internet: Servlets, JSP, Persitentie en Threads (*) Deze boeken worden in de versie 2002/XP [c], 2003 [d] en/of 2007 [e] aangeboden. (**) Deze boeken zijn geschikt voor de versie 2000, 2002/XP en 2003. Inlichtingen kunt u ook bekomen op onze website: http://www.info-books.be Jos Gils Boskant 26, 2970 Schilde Telefoon: 03 383 57 24 E-mail: [email protected]
2011, Schilde – Zele Niets uit deze uitgave mag verveelvoudigd en/of openbaar gemaakt worden door middel van druk, fotokopie, digitale media, microfilm of op welke andere wijze ook, zonder voorafgaandelijke schriftelijke toestemming van de auteurs.
JavaScript
Hoofdstuk 3
3.1
Voorwaarden en lussen
Probleemstelling Een script bestaat uit een aantal instructies die normaliter in de volgorde waarin ze staan uitgevoerd zullen worden. Van die lineaire uitvoeringsvolgorde (de sequentie) kan afgeweken worden door het gebruik van voorwaardelijke instructies en door het gebruik van lussen. Een voorwaardelijke instructie zorgt ervoor dat, als aan de voorwaarde voldaan werd, een bepaalde sequentie uitgevoerd werd, of, als niet aan de voorwaarde voldaan werd, een andere sequentie. Lussen zijn herhalingen die in programma's ingebouwd worden. Een aantal instructies worden telkens opnieuw met andere gegevens uitgevoerd.
3.2
Voorwaardelijke instructies
3.2.1 if...else Deze instructie werd in het vorige hoofdstuk reeds gebruikt. Ze zorgt ervoor dat, afhankelijk van een voorwaarde, de instructies onmiddellijk na IF – als de voorwaarde voldaan werd -, of de instructies na ELSE uitgevoerd worden. Als na de IF of na de ELSE slechts één instructie volgt, mogen de accolades weggelaten worden, bijvoorbeeld: ... if (intA'); else document.write('A is niet kleiner dan B.',' '); ...
Merk op dat in JavaScript geen THEN geschreven wordt na de voorwaarde die volgt op de IF en dat de voorwaarde in haar geheel tussen haakjes staat. Wanneer verschillende instructies moeten uitgevoerd worden in het THEN - of in het ELSEgeval, dan worden die tussen accolades geplaatst. Een dergelijke groepering noemt men een compound statement. Een voorbeeld:
32
JavaScript
J. Gils – E. Goossens
... if (intA'); else { document.write('A is groter dan B ...',' '); document.write('of A is gelijk aan B.',' '); } ...
Wanneer in een IF een andere IF voorkomt spreekt men van een geneste IF. Een voorbeeld ter illustratie: ... if (intA'); else if (intA>intB) document.write('A is groter dan B.',' '); else document.write('A is gelijk aan B.',' '); ...
Let op, in het volgende voorbeeld wordt het THEN-gedeelte altijd uitgevoerd: ... var intA=0; var intB=1; if (intA = intB) document.write('A is gelijk aan B.',' '); else document.write('A verschilt van B.',' '); ...
intA = intB is een toewijzing, geen test op gelijkheid. INTA krijgt dus de waarde van INTB. De uitdrukking intA = intB krijgt de waarde 1, is dus true, zodat het THEN-gedeelte uitgevoerd wordt.
3.2.2 if Deze instructie is een ingekorte IF. Als er in het ELSE-geval niks moet gebeuren mag je het ELSE-gedeelte weglaten, bijvoorbeeld: if (intA<0) document.write('A mag niet negatief zijn.',' ');
J. Gils – E. Goossens
JavaScript
33
3.2.3 switch Om geneste IF-instructies te vermijden werd het SWITCH-statement in JavaScript opgenomen. Bijvoorbeeld: ...
switch (intDag) { case 1: document.write('Maandag',' ');break; case 2: document.write('Dinsdag',' ');break; case 3: document.write('Woensdag',' ');break; case 4: document.write('Donderdag',' ');break; case 5: document.write('Vrijdag',' ');break; case 6: document.write('Zaterdag',' ');break; case 7: document.write('Zondag',' ');break; default: alert("Onbestaande dag!"); } ...
Als de waarde van INTDAG gelijk is aan 1, dan wordt 'Maandag' afgedrukt, bij een waarde gelijk aan 2 'Dinsdag' enz. De BREAK (zie verder) na elke afdruk zorgt ervoor dat het SWITCH-statement verlaten wordt. Opdrachten 1. Doe de leeftijd van iemand via een invoervenster opvragen. Wanneer de leeftijd kleiner dan 10 is doe je 'kind' afdrukken, van 10 tot 18 'tiener', van 18 tot 65 'volwassene' en meer dan 65 'bejaarde'. Voorlopig hoef je nog geen foutieve invoer (bijvoorbeeld een negatief getal) uit te sluiten. Gebruik een geneste IF om dit probleem op te lossen. Noem de webpagina LEEFTIJD.HTM. Een mogelijke afdruk nadat 9 als leeftijd ingevoerd werd: 2. Maak een webpagina DIERENCASE.HTM waarin via een invoervenster gevraagd wordt hoeveel poten een tapuit heeft. Via de SWITCH-instructie worden de mogelijke gevallen afgehandeld. De mogelijke antwoorden en de afdruk door de browser: Antwoord: 2 Inderdaad, een tapuit is een vogel en een vogel heeft 2 poten. Antwoord: 4 Fout, een tapuit is een vogel en een vogel heeft 2 poten. Een zoogdier heeft 4 poten.
34
JavaScript
J. Gils – E. Goossens
Antwoord: 6 Fout, een tapuit is een vogel en een vogel heeft 2 poten. Een insect heeft 6 poten. Andere antwoorden: Fout, een tapuit is een vogel en een vogel heeft 2 poten.
3.3
Lusinstructies In vele gevallen wens je dat instructies onder bepaalde voorwaarden met andere gegevens herhaald worden. Een dergelijke herhaling noemt men een lus. Hier behandelen wij de lusinstructies die los staan van objecten.
3.3.1 while Zolang de voorwaarde, vermeld tussen de haakjes na WHILE, voldaan is, worden de lusinstructies uitgevoerd. Een voorbeeld (WHILELUS.HTM): ... var intTeller = 1; while (intTeller<7) { document.write("Kop " + intTeller); document.write(""); intTeller++; } ...
Bij elke doorgang in de lus wordt INTTELLER met 1 verhoogd. Op een bepaald moment wordt INTTELLER gelijk aan 7 en dan wordt de lus verlaten. Vergeet je de teller in de lus te verhogen dan wordt altijd aan de voorwaarde voldaan, je belandt met andere woorden in een oneindige lus. 3.3.2 for Een FOR is eigenlijk een bijzondere WHILE, waarbij het gegeven van de beginwaarde aan de teller en het verhogen in de FOR-instructie opgenomen worden. Het vorige voorbeeld (FORLUS.HTM) met FOR: ... for(var intTeller = 1; intTeller<7 ; intTeller++) { document.write("Kop " + intTeller); document.write(""); } ...
J. Gils – E. Goossens
JavaScript
35
De FOR-instructie bevat drie onderdelen: het geven van een beginwaarde aan de teller, de voorwaarde die moet voldaan zijn om de lusinstructies te herhalen en de verhoging van de teller. Dit levert exact dezelfde afdruk op. 3.3.3 do…while Bij deze lusstructuur worden de lusinstructies minstens één keer uitgevoerd. De controle van de voorwaarde waaronder de lusinstructies herhaald moeten worden gebeurt op het einde van de lus. Het vorige voorbeeld (DOWHILELUS.HTM) met DO…WHILE: ... var intTeller = 1; do { document.write("Kop " + intTeller); document.write(""); intTeller++; } while (intTeller<7) ...
Na DO volgen de te herhalen instructies. De voorwaardecontrole gebeurt in de WHILE erna. Deze structuur wordt vaak gebruikt om foutieve invoer te verwerpen, bijvoorbeeld (VERGRENDEL.HTM): ... var intPosGetal; do { intPosGetal = parseInt(prompt('Geef een positief getal a.u.b.','')); } while (intPosGetal<=0); ...
Zolang de gebruiker negatieve getallen of 0 intikt, wordt het invoervenster opnieuw getoond. Pas wanneer een positief getal ingetikt wordt loopt het programma verder. TIP
PROMPT()
geeft een tekstwaarde terug. Als je een invoer van een ander type wenst kun je met een conversiefunctie de tekst omzetten. PARSEINT() zet een tekst om naar een integer.
Opdrachten 3. Doe eerst een bedrag dat positief moet zijn en daarna een BTW-percentage via een invoervenster opvragen. Alleen 0, 6 en 21 worden als BTW-percentage aanvaard. Doe daarna het bedrag exclusief BTW, de BTW en het bedrag inclusief BTW afdrukken. Bewaar de pagina as BTWBEREKENING.HTM. Uitbreiding: nadat je een foutief BTW-percentage opgegeven hebt moet een boodschap met de juiste BTW-percentages op het scherm verschijnen. Bewaar de uitbreiding als 36
JavaScript
J. Gils – E. Goossens
BTWBEREKENING2.HTM. 4. Doe de gebruiker een positief getal via invoervenster opvragen. Geeft hij een negatief getal of 0 in, dan wordt een nieuw getal gevraagd tot hij een positief getal ingetoetst heeft. Doe deze controle via een DO…WHILE. Doe vervolgens alle zevenvouden, kleiner dan het opgegeven getal naast mekaar afdrukken (FOR-lus). Zet daaronder alle delers van dat getal, groter dan 0 en kleiner dan of gelijk aan de helft van dat getal. Noem de pagina DRIELUSSEN.HTM. Als 100 opgegeven wordt levert dit de volgende afdruk:
3.3.4 break en continue Met de BREAK-instructie wordt een actieve lus verlaten. In feite komt het neer op het verlaten van het compound statement. Een voorbeeld (BREAK.HTM) ter illustratie: ... var intTeller = 10; while (intTeller) { if (intTeller<6) break; document.write(intTeller,'  ',intTeller/2,' '); intTeller--; } ...
Afdruk:
Zolang INTTELLER true is (verschillend van nul) worden de lusinstructies uitgevoerd. In de lus wordt telkens gecontroleerd of de teller kleiner is dan 6. Als dat zo is wordt de lus verlaten. In de meeste gevallen kun je BREAK vermijden. Wie het programma bekijkt en de voorwaarde bij WHILE leest, wordt op het verkeerde been gezet en dat is niet de bedoeling. Soms kun je BREAK niet vermijden, bijvoorbeeld wanneer je gebruik maakt van de SWITCHinstructie. In dit voorbeeld heeft de volgende code hetzelfde effect: ... var intTeller = 10; while (intTeller>5) { document.write(intTeller,'  ',intTeller/2,' '); intTeller--; } ...
J. Gils – E. Goossens
JavaScript
37
Met de CONTINUE-instructie worden de lusinstructies die volgen overgeslagen, maar de lus wordt niet afgebroken. Bijvoorbeeld (CONTINUE.HTM): ... var intTeller = 6; while (intTeller--) { if (intTeller==3) continue; document.write(intTeller,'  ',intTeller/2,' '); } ...
Afdruk:
Wanneer de teller 6 geworden was werd de document.write()-instructie overgeslagen, vandaar dat er geen lijn met '3 1.5' voorkomt. Ook hier dient aangestipt dat CONTINUE kan vermeden worden. Opdrachten 5. Wat zou in het voorbeeldprogramma CONTINUE.HTM de afdruk geweest zijn indien er while (--intTeller)
gestaan had? 6. Welke afdruk levert het volgende script (BREAKCONT.HTM)? ... var intTeller = 1; while (intTeller<7) { document.write("Kop " + intTeller); document.write(""); if (intTeller++==4) break; } intTeller = 1; while (intTeller<7) { document.write("Kop " + intTeller); document.write(""); if (intTeller++==4) continue; } ...
38
JavaScript
J. Gils – E. Goossens
3.3.5 Lussen in lussen Heel vaak komen er herhalingen binnen herhalingen voor. De regel is dan dat voor elke waarde van de teller in de buitenlus, de binnenlus volledig doorlopen wordt. Een voorbeeld (LUSINLUS.HTM) ter illustratie: ... for (var intI=5 ; intI<10; intI++) { for (var intJ=20 ; intJ<25 ; intJ++) { document.write(intI,' plus ',intJ,' = ',intI+intJ); if (intJ!=24) document.write(', '); } document.write(' '); } ...
De afdruk:
Je merkt dat terwijl de waarde van INTI 5 blijft, INTJ de waarden 20 tot 24 aanneemt. Pas daarna wordt INTI verhoogd en wordt de binnenlus opnieuw uitgevoerd. Om een komma en een spatie tussen elke bewerking te plaatsen wordt de instructie document.write(', ');
geschreven. Maar die moet niet worden uitgevoerd op het einde van een regel (als INTJ gelijk is aan 24), vandaar de test if (intJ!=24).
Wanneer INTI een nieuwe waarde krijgt wordt naar een nieuwe regel gegaan: document.write(' ');
Opdrachten 7. Herschrijf het programma LUSINLUS.HTM, gebruik makend van de WHILE-structuur voor de buitenlus en de DO…WHILE-structuur voor de binnenlus. Sla de oplossing op in DOINWHILE.HTM. 8. Herneem de opdracht DRIELUSSEN.HTM en geef via een invoervenster aan de gebruiker de gelegenheid het programma opnieuw te laten lopen. Het invoervenster bevat de tekst 'Opnieuw? (Ja, Nee)' Als de gebruiker 'Ja' of 'ja' antwoordt loopt het programma opnieuw, in alle andere gevallen wordt de lus verlaten. Noem de nieuwe pagina DRIELUSSENHERHAAL.HTM.
J. Gils – E. Goossens
JavaScript
39
9. Vraag via een invoerscherm welke tafels van vermenigvuldiging je wilt afdrukken. Tracht het voorbeeld zoveel mogelijk te benaderen. De tabel wordt volledig via een script gegenereerd. Bewaar deze pagina als TAFELS12.HTM. HTML-tags worden als volgt afgedrukt: document.write('
'); document.write('
'…);
40
JavaScript
J. Gils – E. Goossens
Besluit Om, afhankelijk van een voorwaarde, de ene of de andere sequentie te doen uitvoeren beschikt JavaScript over de IF…ELSE-instructie. Het ELSE-gedeelte kan weggelaten worden als er in het ELSE-geval niets hoeft te gebeuren. Wanneer in een IF een andere IF voorkomt spreekt men van geneste ifs. Bij een meervoudige keuze kan het handig zijn het SWITCH-statement te gebruiken. Na SWITCH staat een variabele tussen haakjes en in het compound statement dat volgt worden de verschillende mogelijke waarden van de variabele na CASE geschreven. Een BREAK sluit meestal elk geval af. Door BREAK wordt het compound statement verlaten (en wordt vermeden dat de cases die volgen eveneens uitgevoerd worden). De cases die niet gespecificeerd worden kunnen in een DEFAULT-geval opgevangen worden. Lussen zijn herhalingen die in programma's ingebouwd worden. JavaScript beschikt over het WHILE-statement, het FOR-statement en het DO…WHILE-statement. Bij WHILE staat de voorwaarde vooraan in de lus, bij DO…WHILE achteraan. De FORinstructie bevat het geven van de beginwaarde aan de teller van de lus, de voorwaarde waaronder de lus herhaald moet worden en de wijziging van de tellerwaarde. Om een lus voortijdig te verlaten kun je BREAK invoegen en om de lusinstructies die volgen over te slaan bestaat het CONTINUE-commando. Lussen kunnen in lussen voorkomen. Men noemt dit geneste lussen. Voor elke waarde van de teller van de buitenlus wordt de binnenlus dan volledig uitgevoerd.
Wat je moet kennen en kunnen:
op een correcte manier een if…else-instructie formuleren; geneste ifs schrijven; het switch-statement correct gebruiken; lussen vormen met while, for, do…while; het verschil tussen break en continue uitleggen; geneste lussen maken.
Opdracht 10. Doe via een invoervenster het rangnummer van elk van de zes klinkertekens in ons alfabet opvragen (a, e, i, o, u, y). De letter a heeft rangnummer 1, e heeft rangnummer 5 enz. Hou via een teller bij hoe vaak de gebruiker juist antwoordde. Laat zijn score en de juiste antwoorden afdrukken. Noem de pagina KLINKERTEKENS.HTM. Het eerste invoervenster bevat de vraag 'Eerste klinkerteken (rangnummer!): ', de volgende keren verschijnt de tekst 'Volgende klinkerteken (rangnummer!): ' De eindafdruk is bijvoorbeeld: Score: 5 op 6 TIP Als je de klinkers in een string zet, strKlinkers="aeiouy", dan kun je met de methode SUBSTR() één letter uit deze reeks uitpikken en die letter dan meegeven bij de vraag in het invoervenster. [strLetter=strKlinkers.substr(intTeller,1)]. Bewaar deze pagina als KLINKERTEKENS2.HTM. J. Gils – E. Goossens
JavaScript
41
VBScript
Hoofdstuk 3
3.1
Invulformulieren
Probleemstelling HTML-pagina's op zich zijn statisch: ze worden op basis van codes door de browser op een bepaalde manier getoond zonder dat de bezoeker van de website veel impact heeft op wat er getoond wordt en op welke manier dat dit gebeurt. Een programmeertaal geeft dynamische mogelijkheden aan een website: je kunt eigen programmacode schrijven en je kunt interactie met de gebruiker voorzien. Via invulformulieren is het mogelijk om de gebruiker informatie te laten invullen. Invulformulieren zijn ook al gekend in HTML-code, maar een goede validatie op de invoervelden is alleen maar via programmacode mogelijk. Programmacode biedt ook de mogelijkheid om in bepaalde velden van een formulier informatie te plaatsen die de gebruiker in andere velden ingevuld heeft.
3.2
Formulieren en objecten Een formulier wordt in HTML-code gedefinieerd met de tags . Omdat het formulier een object is zul je het ook best een naam geven, zeker als je via programmacode de eigenschappen van de objecten op dat formulier wilt wijzigen.
Tussen deze tags worden de andere objecten, zoals invoervakken, keuzelijsten, knoppen, … gedefinieerd. Geef ook deze objecten een naam.
180
VBScript
J. Gils – E. Goossens
Een knop van het type RESET maakt alle invoervelden leeg. Een knop van het type SUBMIT kan, afhankelijk van de definitie van het formulier, de ingevulde informatie bijv. via e-mail naar een bepaald adres sturen. In dat geval moet je de nodige eigenschappen opgeven bij de definitie van het formulier. Doe je dat niet dan zal er spontaan ook niets gebeuren als je op de SUBMIT-knop klikt. TIP
De RESET- en de SUBMIT-knop zijn alleen maar geldig binnen het formulier waar deze knop gedefinieerd is.
Een veld van het type FILE opent via de knop BLADEREN een dialoogvenster KIES BESTAND waarmee je een bestand kunt zoeken op een aangeduid pad. Een formulier moet als een verzameling van objecten gezien worden, objecten die via de formuliernaam en de objectnaam bereikbaar zijn. frmFormulier.txtNaam.value ="Tom Strevers"
Deze objecten kunnen ook op gebeurtenissen reageren. Ook in dit geval kun je procedures via hun naam aan een object koppelen of omgekeerd het object aan een procedure koppelen.
3.3
VBScript en formulieren In een aantal van de vorige oefeningen werd de invoer van de gebruiker via aparte dialoogvensters opgevraagd. In het geval dat er naar meer dan één gegeven gevraagd werd was het onmogelijk om na de invoer van het tweede gegeven terug naar het eerste gegeven te gaan. Je kunt dit probleem met behulp van formulieren oplossen. TIP
Het is goed mogelijk om meerdere formulieren op één pagina te definiëren. Geef ze in dat geval allemaal een andere naam. Bepaalde toepassingen vereisen wel dat alle invoer via één formulier gebeurt.
Daarom proberen wij in het volgende voorbeeld (VBS_RECHTHOEK1.HTM) de waarde van de argumenten via een invulformulier op te vragen en die waarden dan aan de procedures door te geven. <SCRIPT LANGUAGE="VBScript">
Omtrek en oppervlakte van een rechthoek
Vul de lengte en de breedte in en klik op de knoppen Omtrek en Oppervlakte
De pagina zal er ongeveer als volgt uitzien:
Je ziet een webpagina met een invulformulier. Het invulformulier is een object op het object webpagina. Het invulformulier zelf is ook een verzameling van objecten: het bevat onder andere drie knoppen en vier invoer- of uitvoervakken. Al deze objecten zijn van een bepaald type en hebben, indien nodig, een naam. Bijvoorbeeld het invulvak TXTOMTREK is van het type 'text':
182
VBScript
J. Gils – E. Goossens
Bij klikken op de knop ‘Omtrek’ wordt de omtrek berekend via de gebeurtenis CMDOMTREK_ONCLICK. De knop ‘Omtrek’ wordt in een formulier gedefinieerd en de gebeurtenis in het head-gedeelte. In het body-gedeelte:
In het head-gedeelte: Sub cmdOmtrek_OnClick()
TIP
Het attribuut TYPE bepaalt het soort veld: TEXT of BUTTON.
TIP
Staan er meerdere invulformulieren op één pagina, dan kan er maar één actief zijn.
Bij het klikken op de knop ‘Omtrek’ wordt de procedure CMDOMTREK_ONCLICK() uitgevoerd. Hierin worden eerst drie variabelen gedeclareerd: Dim dblLengte, dblBreedte, dblOpp
Omwille van de duidelijkheid wordt het prefix dbl gebruikt om aan te duiden dat het om gebroken getallen gaat, maar de typebepaling ('As Double') hoef je niet te schrijven. VBScript bepaalt zelf het type als de variabele een waarde krijgt. dblLengte = CDbl(frmRechthoek.txtLengte.value) dblBreedte = CDbl(frmRechthoek.txtBreedte.value) dblOpp = dblLengte*dblBreedte frmRechthoek.txtOppervlakte.value=FormatNumber(dblOpp,2) TXTLENGTE, TXTBREEDTE, TXTOMTREK en TXTOPPERVLAKTE zijn de namen van de invoeren uitvoervelden van het formulier FRMRECHTHOEK waarin gegevens over een rechthoek
ingegeven en verwerkt worden. Het resultaat van de berekening wordt via de naam van het formulier aan het juiste tekstvak doorgegeven via de eigenschap VALUE. De functie FORMATNUMBER() drukt het getal af met twee cijfers na de komma. frmRechthoek.txtOppervlakte.value=FormatNumber(dblOpp,2)
De laatste INPUT-tag maakt alle velden van het formulier opnieuw leeg:
Gegevens kunnen ook via dialoogvensters ingebracht en vervolgens naar tekstvakken gekopieerd worden zoals in het voorbeeld VBS_INVOERVENSTER.HTM.
J. Gils – E. Goossens
VBScript
183
<TITLE>Demo invoervenster <SCRIPT LANGUAGE=VBScript> Sub cmdVraagNaam_OnClick() dim strNaam, strBericht strNaam = InputBox ("Tik je naam in") strBericht = "Hallo " & strNaam & ". Welkom hier!" Window.Alert strBericht frmInvoer.txtNaam.Value= strNaam End Sub
Invoervenster
Verklaar de programmacode en bekijk het resultaat in de browser.
Opdrachten 1. Wijzig de code in VBS_RECHTHOEK1.HTM zodanig dat de gebeurtenis ONCLICK in het body-gedeelte vermeld wordt. Bewaar het resultaat als VBS_RECHTHOEK2.HTM. 2. Maak een formulier VBS_UREN.HTM waarmee je de tijd in uren berekent die je nodig hebt om een bepaalde afstand tegen een bepaalde snelheid af te leggen. Het resultaat moet op twee cijfers na de komma afgerond worden. TIP: Vermenigvuldig het niet afgeronde resultaat met 100, zet het om naar een integer en deel het daarna door 100. TIP
184
Je zult misschien gemerkt hebben dat er een fout optreedt als je geen waarde invult en op de knop BEREKEN klikt. Dit probleem wordt in het volgende hoofdstuk opgelost. VBScript
J. Gils – E. Goossens
3.4
Een formulier als parameter aan een procedure doorgeven Het is ook mogelijk om een formulier via een parameter aan een procedure door te geven. Dit kan handig zijn als er meerdere formulieren met gelijkaardige velden op eenzelfde pagina staan. In dat geval kan dezelfde procedure voor meerdere formulieren gebruikt worden. Opdrachten 3. Geef in VBS_RECHTHOEK2.HTM het invulformulier als parameter door aan de procedure OMTREK. Bewaar het resultaat als VBS_RECHTHOEK2B.HTM. Het formulier heet FRMRECHTHOEK. Via het attribuut ONCLICK in de -tag kun je die naam aan de procedure OMTREK() doorgeven: ONCLICK="Omtrek(frmRechthoek)"
In de hoofding van de procedure OMTREK() declareer je een nieuwe variabele, frmInvoer, die van het type Formulier zal zijn. Via deze objectvariabele kun je naar het oorspronkelijke formulier verwijzen. Sub Omtrek(frmInvoer) frmInvoer.txtOmtrek.value= 2*Cdbl(frmRechthoek.txtLengte.value)+2*Cdbl(frmRechthoek.txtBreedte.value) End Sub
TIP
In de procedure OMTREK(frmInvoer) wordt met de veldnamen van het originele formulier gewerkt: frmRechthoek en frmInvoer zijn dus hetzelfde formulier.
Het nut van het doorgeven van een formulier als parameter komt beter tot uiting in de eerstvolgende opgave. 4. Wijzig de code van VBS_RECHTHOEK2B.HTM zodanig dat je twee verschillende formulieren onder mekaar krijgt. Bewaar het resultaat als VBS_RECHTHOEK3.HTM. Aan de procedures OMTREK() en OPPERVLAKTE() mag niets gewijzigend worden.
J. Gils – E. Goossens
VBScript
185
3.5
De waarde van een tekstvak aan een procedure doorgeven In plaats van een volledig formulier als parameter mee te geven kun je ook een invoervak of de waarde van een invoervak als parameter aan een functie doorgeven. Opdrachten 5. Voer een tekst in via een tekstvak in een formulier, geef de tekst door aan een procedure waarin de tekst in een waarschuwingsscherm afgedrukt wordt wanneer je op de knop GEEF_BERICHT klikt. Noem het programma VBS_ALERT2.HTM.
Gebruik als functienaam WAARSCHUWING(strZin). Verklaar de programmacode.
TIP
Om de breedte van het tekstvak waarin je de zin zet te bepalen gebruik je het attribuut SIZE=… van de INPUT-tag.
TIP
Als je de gebeurtenis oproept via ONCLICK=”Waarschuwing(txtEenZin)” dan wordt het tekstvak doorgegeven. In dat geval moet je de code in de procedure als volgt wijzigen: Window.alert strZin.value.
6. Maak een HTML-pagina (VBS_CIRKEL.HTM) met een invoervak waarin de straal van een cirkel ingevuld wordt. Druk je op de Bereken_en_Toon-knop, dan worden de omtrek (2 x PI x straal) en de oppervlakte (PI x straal x straal) in tekstvakken berekend en getoond. Tracht het volgende resultaat te bekomen:
186
VBScript
J. Gils – E. Goossens
3.6
Een toemaatje Probleemstelling De firma Info-books wil haar boeken via internet aanbieden. Daarom wordt het afgebeelde invulformulier samengesteld. De vakken met de eenheidsprijs en het totaal mogen niet gewijzigd kunnen worden. De totalen en het eindtotaal worden berekend na klikken op de knop Bereken.
Probleemanalyse Noem de eerste rij invoervakken resp. txtPrijs1, txtAantal1 en txtTot1. Gebruik een analoge naamgeving voor de volgende rijen. Het vak met het eindtotaal noem je txtTotaal. Bereken in de procedure CMDBEREKEN_ONCLICK het eindtotaal van elke regel en zet die uitkomst in een nieuwe variabele. Tel vervolgens die uitkomsten op om het eindtotaal te vinden. Vergeet niet de uitkomsten in de uitvoervakken te tonen. Met de eigenschap READONLY kun je de toegang tot een invoervak beletten.
Opdracht 7. Los het bovenstaande probleem op, genereer eventueel de tabel in Word, en bewaar het resultaat als VBS_KOSTENNOTA.HTM. Verfijningen Storend is zeker het feit dat je een foutmelding krijgt als je geen getalwaarde intikt. Vervelend is ook dat je de uitkomsten maar kunt berekenen als alle invoervakken ingevuld zijn. Deze twee opmerkingen zullen in de volgende hoofdstukken opgelost worden.
J. Gils – E. Goossens
VBScript
187
Besluit Formulieren zijn bijzonder handig om informatie van de gebruiker op te vragen. In tegenstelling tot dialoogvensters, waar je maar één stukje informatie kunt opvragen, bieden formulieren de mogelijkheid om meer gegevens tegelijk op te vragen. VBScript-code kun je vanuit formulieren laten oproepen wanneer een bepaalde gebeurtenis zich voordoet. Op die manier kun je HTML-pagina’s dynamischer maken. Via opdrachtknoppen kun je programmacode aan het formulier koppelen waardoor het mogelijk is om de ingevoerde informatie te verwerken en de resultaten ervan af te drukken. VBScript ziet het formulier als een object dat zelf een verzameling is van andere objecten. In dit hoofdstuk werd vooral van tekstvakken en opdrachtknoppen gebruik gemaakt. Via de formuliernaam zijn de objecten van het formulier te benaderen. De volgorde is altijd (naam van het formulier).(naam van het object).(eigenschap van het object). Belangrijk is wel dat aan de objecten een naam toegekend wordt. De inhoud van een invoervak kan via een parameter aan een procedure doorgegeven worden. Dat gebeurt via de naam van het invoervak en de eigenschap Value, die door een punt gescheiden worden. Staan er meerdere analoge formulieren op één pagina, dan kan het handig zijn om het hele formulier als parameter aan een procedure door te geven. Dit is alleen maar nuttig als de invoervakken van de verschillende formulieren dezelfde naam hebben.
Wat je moet kennen en kunnen:
procedures en functies vanuit een formulier oproepen; formulieren en waarden uit formulieren aan functies en procedures doorgeven.
Opdrachten 8. Maak een HTML-formulier VBS_PLUSMIN1.HTM waarin een ingetikt getal met 1 verhoogd wordt als je op de ++ -knop klikt en met 1 verlaagd als je op de -- -knop klikt. Standaard wordt het getal 0 getoond. Het document ziet er als volgt uit:
9. Uitbreiding: VBS_PLUSMINGETAL.HTM Voeg een vakje Factor bij. Het getal dat je daarin intikt wordt bij het getal geteld als je op de + =-knop drukt en ervan afgetrokken als je op de -= -knop drukt. Bewaar het document als VBS_PLUSMINGETAL.HTM.
188
VBScript
J. Gils – E. Goossens
De output ziet er ongeveer als volgt uit:
TIP
Denk eraan dat, wanneer je de plusoperator op teksten toepast, die teksten gewoon aaneengezet worden. De bewerking a + b levert 62 als resultaat op als a en b teksten zijn met de waarden “6” en “2”. Met de functie CINT() kun je de tekst naar een integer omzetten.
TIP
Als de om te zetten tekst geen getalwaarde bevat dan wordt een fout gemeld. Met het attribuut VALUE=0 kun je ervoor zorgen dat er in een tekstvak al een standaardwaarde ingevuld staat.
10. Schrijf een HTML-pagina VBS_BALK_INT.HTM waarmee een formulier kan ingevuld worden met de volgende gegevens: basis, hoogte en diepte (van een balkvormig lichaam). De functie BEREKEN_INHOUD berekent de inhoud van de balk (basis x hoogte x diepte) en zet het resultaat in een resultaatsveld.
Breid de opgave uit zodanig dat ook gebroken getallen mogen ingevoerd worden. TIP
Om een getal naar een string te converteren gebruik je de functie CSTR.
11. Los het afgebeelde probleem op en bewaar het als VBS_CONVERSIE2.HTM.
J. Gils – E. Goossens
VBScript
189
ASP
Hoofdstuk 1
1.1
Terreinverkenning
Probleemstelling Gewone webpagina's zijn statisch: ze worden lokaal op een pc opgebouwd en door een browser getoond. Het aanbrengen van wijzigingen in pagina's is niet vanzelfsprekend. Vaak dien je een pagina volledig opnieuw op te bouwen via een scripttaal. Ook dat gebeurt meestal lokaal. Het zou handig zijn indien het opbouwen van een pagina op de server zou gebeuren en dat de server de HTML-code naar de lokale browser doorstuurt. Deze manier van werken, die bij de ASP-technologie gebruikt wordt, geeft een waaier van supplementaire mogelijkheden.
1.2
Het begrip ASP ASP is de afkorting van 'Active Server Pages', een technologie op het gebied van webpagina's. Het is een component van Internet Information Server (IIS), een Microsoft-product. Met ASP is het mogelijk interactieve webpagina's te maken, die verder gaan dan bijvoorbeeld CGI-scripts. De webpagina's worden iedere keer opnieuw opgebouwd. Op die manier wordt ervoor gezorgd dat ze up-to-date blijven. Met ASP kun je interactieve pagina's maken die globale variabelen bijhouden tijdens een bezoek van een gebruiker. Deze functionaliteit is standaard aanwezig.
1.3
Wat zijn ASP-pagina's? Een bestand met een .ASP-extensie is een Active Server Page, bijvoorbeeld: http://www.w3schools.com/asp/asp_intro.asp Active Server Pages zijn pagina's die net als een gewone HTML-pagina door het HTTPprotocol verstuurd worden. Het grote verschil tussen HTML en ASP is de manier waarop de webserver de pagina's interpreteert. ASP bevat naast gewone HTML-tags, lokale scripts, XML-code en tekst ook instructies voor de webserver. Deze instructies zijn scripts die HTML genereren. De webserver verwerkt de ASP-instructies en stuurt dan gewone HTML naar de client. Een Active Server Page is een bestand dat HTML-code bevat of een combinatie van HTML-code met scripts voor de server. Wanneer de server het ASP-bestand verwerkt, worden de scripts uitgevoerd door de server. De server zendt gewone HTML-pagina's terug naar een browser aan de client-kant. Omdat alle scripts aan de kant van de server worden uitgevoerd, is ASP een browser-onafhankelijke technologie. Als er geen scripts in de ASP-pagina zitten dan wordt er rechtstreeks HTML teruggestuurd. Je kunt een ASP-pagina maken door de extensie van een document te veranderen in .ASP. J. Gils – E. Goossens
ASP
237
VBScript is de standaardtaal van ASP, maar je kunt ook JavaScript gebruiken als ondersteunende taal. VBScript is een subset van de programmeertalen Visual Basic en Visual Basic for Applications (VBA). Omdat je script op de server uitgevoerd wordt en er alleen HTML voor de browser gegenereerd wordt, is de ASP-code niet te lezen door de gebruiker. Wanneer je de broncode van de ASP-pagina opvraagt, zul je een gewone HTML-pagina krijgen met alle door de server geproduceerde HTML-code.
1.4
De werking van ASP Om de werking van ASP te doorgronden moet er eerst een uitleg gegeven worden over enkele belangrijke onderdelen.
1.4.1 De ASP-engine Wanneer de browser een ASP-pagina vraagt, dan treedt de ASP-engine in werking. De ASP-engine neemt de gehele pagina door, voert de script-instructies op de ASP-pagina uit en stuurt de HTML-code terug naar de browser. Bij een gewone HTML-pagina stuurt de server gewoon het HTML-bestand naar de browser. 1.4.2 Script-instructies voor de server Een ASP-bestand bevat meestal HTML-code en code in een scripttaal zoals VBscript. De code in de scripttaal kan ofwel door de lokale browser ofwel door de server uitgevoerd worden, afhankelijk van de doorgegeven code. VBscript is zoals al eerder vermeld een subset van Visual Basic, met dezelfde syntaxis en taalopbouw. VBscript mist een aantal belangrijke onderdelen die VBA en VB wel hebben, bijvoorbeeld: file input/output, het aanroepen van DLL's. VBScript kent geen datatypen, alleen het type Variant. VBscript is beperkt gehouden in omvang om de uitvoeringstijd zo laag mogelijk te houden. Oorspronkelijk werd File input/output eruit gelaten om te vermijden dat vanuit een script het bestandssysteem gemanipuleerd zou kunnen worden. Iemand anders mag je harde schijf niet vanuit een script kunnen formatteren...
1.5
Mogelijkheden van ASP Een kort overzicht van de mogelijkheden, de uitwerking ervan volgt verder:
webpagina's aanmaken, de inhoud wijzigen, aanvullen; reageren op gegevens die door gebruikers opgestuurd worden; gegevens uit databases opzoeken en de resultaten naar een browser terugsturen; personaliseren van webpagina's; beveiligen van zelfgeschreven code; ASP-pagina's kunnen door alle browsers getoond worden.
238
ASP
J. Gils – E. Goossens
1.6
Systeemvereisten Normaliter draait ASP op een server, maar je kunt ASP ook lokaal laten werken (zonder een externe server). Daarvoor moet je een van de volgende Microsoft-producten installeren:
PWS (Personal Web Server); IIS (Internet Information Server).
Wat er juist geïnstalleerd moet worden hangt af van de Windows-versie die je gebruikt. Een kort overzicht:
Windows 95 en Windows NT: download "Windows NT 4.0 Option Pack" vanaf de site van Microsoft. http://www.microsoft.com/ntserver/nts/downloads/recommended/NT4OptPk/default.asp
Windows 98 (PWS): zie de instructies op de volgende site: http://www.w3schools.com/asp/asp_install.asp
Windows ME (PWS wordt niet ondersteund): zie op deze sites: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q266456 http://billsway.com/notes_public/PWS_WinMe.txt
Windows 2002 en Windows XP Professional (IIS): http://www.w3schools.com/asp/asp_install.asp
1.7
De basissyntaxis van ASP Om in een webpagina duidelijk te maken dat er een script voor de server volgt gebruik je de tekencombinaties <% en %>. Een voorbeeldje (EERSTE.ASP) om de tekst 'De eerste stap in ASP!' met de lokale browser te tonen: <% Response.Write"De eerste stap in ASP!" %>
J. Gils – E. Goossens
ASP
239
De code die de server doorstuurt naar de browser: De eerste stap in ASP!
Het ASP-bestand wordt op de server uitgevoerd. De server stuurt de eerste twee HTMLtags ( en ) naar de browser en voert dan de scriptcode voor de server uit. Met de write-methode van het response-object wordt de tekst 'De eerste stap in ASP!' als gewone HTML-tekst naar de browser gestuurd. Daarna worden de HTML-tags afgesloten. De standaard scripttaal waarop ASP steunt is VBScript. Wens je JavaScript als scripttaal te gebruiken, voeg dan een lijn toe (EERSTEJS.ASP): <%@ language="javascript" %> <% Response.Write("De eerste stap in ASP!") %>
TIP Let in dit geval ook op de hoofdlettergevoeligheid: JavaScript is hoofdlettergevoelig Response.Write(), VBScript niet! Opmaakelementen kun je opnemen als argument van de write-methode (TWEEDE.ASP): <% Response.Write("
De tweede stap in ASP! Koppen en lijnovergangen!
") %>
Deze code wordt als volgt omgevormd en naar de browser gestuurd:
De tweede stap in ASP! Koppen en lijnovergangen!
TIP
240
Het argument na Respose.Write() moet op dezelfde regel staan. Als de regel te lang wordt kunje hem als volgt splitsen:
ASP
J. Gils – E. Goossens
<% response.write("
De tweede stap in ASP!") response.write(" Koppen en lijnovergangen!
") %>
1.8
ASP-variabelen en lussen Ook ASP kent lokale en globale variabelen. Een voorbeeld (VARIABELEN.ASP) waarmee de browser 'Woonplaats: Schilde' toont: <% Dim strGemeente strGemeente="Schilde" Response.Write("Woonplaats: " & strGemeente) %>
In het volgende voorbeeld (ARRAY.ASP) wordt gebruik gemaakt van een array: <% Dim strLevensloop(6) strLevensloop(0) = "baby" strLevensloop(1) = "peuter" strLevensloop(2) = "kleuter" strLevensloop(3) = "kind" strLevensloop(4) = "tiener" strLevensloop(5) = "volwassene" strLevensloop(6) = "bejaarde" For intI = 0 to 6 Response.Write(strLevensloop(intI) & " ") Next %> baby peuter kleuter kind tiener volwassene bejaarde
J. Gils – E. Goossens
ASP
241
1.9
Procedures in ASP
1.9.1 Met VBScript Een procedure in ASP wordt opgenomen tussen <% en %>. Het oproepen kan gebeuren via het keyword call. Ter illustratie (PROCVBS) wordt hier een procedure gebruikt om twee getallen op te tellen en de som af te drukken: <% sub vbproc(intG1,intG2) Response.Write(intG1+intG2) end sub %> De som is: <%call vbproc(11,30)%>
Het keyword call en de haakjes mogen weggelaten worden. In plaats van De som is: <%call vbproc(11,30)%>
had er ook mogen staan: De som is: <%vbproc 11,30%>
1.9.2 Met JavaScript Om hetzelfde effect te bekomen met JavaScript (PROCJS.ASP): <%@ language="javascript" %> <% function jsproc(intG1,intG2) { Response.Write(intG1+intG2) } %> De som is: <%jsproc(11,30)%>
242
ASP
J. Gils – E. Goossens
In JavaScript zijn de haakjes bij het oproepen van de procedure verplicht. Het keyword call mag je ook in JavaScript schrijven. 1.9.3 VBScript en JavaScript combineren Je kunt verschillende scripttalen en schrijfwijzen combineren. Dit wordt geïllustreerd in het volgende voorbeeld (PROCVBSJS.ASP): <% sub vbproc(intG1,intG2) Response.Write(intG1+intG2) end sub %> <script language="javascript" runat="server"> function jsproc(intG1,intG2) { Response.Write(intG1+intG2) } De som is: <%call vbproc(11,30)%> De som is: <%call jsproc(11,30)%>
De JavaScript-code voor de server wordt niet meer tussen <% en %> geplaatst, maar via het runat-attribuut van de <SCRIPT>-tag wordt duidelijk gemaakt dat het script op de server moet uitgevoerd worden.
J. Gils – E. Goossens
ASP
243
Besluit 'ASP' is de afkorting van 'Active Server Pages'. ASP-bestanden bevatten code die door de server naar HTML omgevormd wordt en pas dan naar de browser wordt gestuurd. Op die manier blijft de scriptcode die voor de server bestemd is, onzichtbaar voor de bezoeker van de website. De standaard scripttaal van ASP is VBScript, maar je kunt ook gebruik maken van JavaScript. Dan moet je in de .asp-pagina wel een regel toevoegen: <%@ language="javascript" %>
Normaal draait ASP op een server, maar je kunt ook lokaal werken als je de nodige software installeert. Deze hangt af van de gebruikte Windows-versie. ASP-commando's staan tussen de tekencombinaties <% en %>. Om tekst naar de lokale browser te sturen gebruik je de write-methode van het responseobject. ASP beschikt over klassieke taalelementen zoals globale en lokale variabelen, lusstructuren en procedures.
Wat je moet kennen en kunnen:
het begrip ASP uitleggen; het verschil in verwerking tussen gewone HTML- en ASP-pagina's uitleggen; ASP-scriptcode (VBScript en JavaScript) in een pagina inpassen; een paar belangrijke mogelijkheden van ASP opnoemen; variabelen en arrays in ASP gebruiken; de write-methode van het response-object gebruiken; lussen vormen in ASP; procedures in ASP schrijven en oproepen.
Opdrachten 1. Van wat is 'ASP' de afkorting? Waarin verschilt de verwerking van ASP-pagina's met die van gewone HTMLpagina's? 2. Wat doet de ASP-engine? 3. Waarom is ASP-code browser-onafhankelijk? 4. Heb je een server nodig om ASP-pagina's te laten verwerken? Verklaar. 5. Maak een ASP-pagina die de volgende tekst naar de browser stuurt: ASP Hoofdstuk 1 Terreinverkenning 6. Plaats de drie regels van de vorige oefening in een array en zorg ervoor dat ze door de browser via een lus getoond worden.