1 Werken met (keuze)lijstjes: de control ‘listbox’ 1.1 Keuzelijstjes: wat en waarom In een educatief programma wordt vaak gebruik gemaakt van keuzelijstjes. Enkele voorbeelden: * bij het opstarten van een programma kiest een leerling zijn naam uit een leerlingenlijst:
Afdrukken uit ‘De zaak % ©EWOC
* bij het opvragen van resultaten: als je klikt op een naam, worden de toetstresultaten van die leerling zichtbaar.
* ze kunnen ook gebruikt worden bij meerkeuzevragen, e.d.
Keuzelijsten kommen ten volle terecht bij het werken met databanken zoals in de voorbeelden hierboven. Wil je ze vlot gebruiken dan moet je minimaal weten: * hoe je elementen aan de keuzelijst toevoegt of verwijdert; * welk element van de lijst een gebruiker selecteert zodat je passend kunt reageren. Dat leren we in deze sessie. We koppelen onze lijst evenwel nog niet aan een databank, dat komt later aan bod. Oefening: we maken een lijstje met deelnemers aan deze cursus, nl. de REN-clubleden. We willen een nieuw lid kunnen toevoegen en gepast reageren op een selectie in de clublijst.
Interactief lesmateriaal maken met Visual Basic
1
1.2 Werkscherm aanmaken Open een nieuw project (standaard exe) en plaats volgende controls op Form1 Sla het project op onder de naam ‘keuzelijst.vbp’ en het formulier onder de naam ‘frmClubleden.frm
Via het scherm ‘properties’ passen we de eigenschappen van de controls aan tot we volgend resultaat krijgen:
Deze tabel kan helpen: Te wijzigen control
Te wijzigen eigenschap
Waarde:
Frame1 Label 1 Tekstvak
Caption Caption Name Text Name Caption Name Caption Name Caption Name Caption Caption Name Caption BorderStyle Appearance Name Caption BorderStyle Appearance Name Caption BorderStyle Appearance
Nieuw clublid Tik een naam: txtInvoer (maak leeg) cmdVoegtoe Voeg toe cmdWisnaam Wis naam cmdWisalles Wis alles lstClubleden Aantal leden: Geselecteerd lid: lblAantal (leeg) 1 0 lblIndex (leeg) 1 0 lblNaam (leeg) 1 0
Command1 Command 2 Command 3 List 1 Label 2 Label 3 Label 4 (zie afdruk) pas de grootte aan Label 6
Label 7
Interactief lesmateriaal maken met Visual Basic
Als alles klaar is, start het programma. Merk op dat de listbox (lstClubleden) leeg is en we er niets kunnen intypen. Een listbox reageert als een label, de gebruiker kan er niets intypen. Alle invoer moet via code gebeuren.
2
1.3 Clubleden invoeren. a. Bij het inladen van het formulier Dubbelklik op het formulier. Tik volgende code in:
We methode AddItem die we hier gebruiken geeft VB opdracht om de naam die volgt toe te voegen aan de control lstClubleden. Start het programma. De namen verschijnen. We kunnen de namen uit de lijst één voor één selecteren.
b. Door de gebruiker De gebruiker kan namen tikken in het tekstvak, daarvoor hoeven we geen code in te voeren. Willen we de ingetikte naam toevoegen in de keuzelijst, dan hebben we code nodig. We veronderstellen het volgende: De gebruiker tikt een naam. Daarna klikt hij op de knop ‘Voeg toe’. De code moet dus gekoppeld worden aan de KNOP, aan de gebeurtenis CLICK Dubbelklik op de knop ‘Voeg toe’. Tik de code. We gebruiken opnieuw de methode AddItem
Belangrijk: het is wenselijk te vermijden dat er lege rijen worden toegevoegd. We kunnen dit ondervangen door een controle op ‘leeg tekstvak’ Bovendien willen we vermijden dat een gebruiker enkel spaties intikt. Wijzig de code als volgt:
Ter herinnering: * We gebruiken een IF…THEN…END IF structuur om te bepalen of AddItem al dan niet mag uitgevoerd worden. * Trim betekent dat eventuele spaties voor of na de text worden verwijderd. Start het programma. U kunt nu een naam toevoegen. Die verschijnt onderaan de lijst met clubleden. Maar… als we het programma afsluiten en daarna opnieuw opstarten, moeten we de naam opnieuw invoeren. De naam zal enkel bewaard worden als we de keuzelijst koppelen aan een database. Dat vergt wel een beetje meer code en komt later aan bod.
c. Namen invoegen vanuit een databank. Dat komt later aan bod!
Interactief lesmateriaal maken met Visual Basic
3
1.4 Namen sorteren Dat kan zonder code. Klik op ‘lstclubleden’ en kijk naar het venster ‘properties’. U vindt er de eigenschap ‘sorted’. Die staat nu op ‘false’. Zet hem op ‘true’ Start op. De namen staan alfabetisch. Voeg een naam toe. Hij wordt op de juiste plaats ingevoegd.
1.5. De methoden ‘List’, ‘ListIndex’ en ‘ListCount’ ‘ListCount’ geeft aan hoeveel elementen onze keuzelijst telt. In lblAantal houden we bij hoeveel elementen de keuzelijst telt. Dat getal moet worden aangepast als er elementen worden toegevoegd of verwijderd. De code is eenvoudig. lblAantal = lstClubleden.ListCount Waar plaatsen we die code? Wil de informatie in lblAantal accuraat zijn, dan moet ze worden aangepast na elke wijziging van de lijst: - nadat het formulier is ingeladen; - nadat er een naam is toegevoegd of gewist. Indien een opdracht op meerdere plaatsen moet worden uitgevoerd, is het zinvol om een aparte routine te maken met die opdracht. We roepen dan de routine aan telkens het nodig is. We maken een eigen SUB-routine: telze Die ziet er zo uit.
De procedure ‘telze’ roepen we aan: - in de routine ‘form_load’ na het inlezen van de namen; - in de routine ‘cmdVoegtoe_click’ binnen de lus, na het overnemen van de naam. Ons programma ziet er nu zo uit:
Interactief lesmateriaal maken met Visual Basic
4
Start. Bekijk de uitvoer in lblAantal. Voeg een naam toe. Je merkt: lblAantal wordt bijgewerkt.
ListIndex geeft aan het hoeveelste element in de keuzelijst geselecteerd wordt. Dat houden we bij in lblIndex. Ook nu is de code eenvoudig: lblIndex.caption = lstClubleden.ListIndex Waar plaatsen we deze code? De opdracht moet worden uitgevoerd telkens de gebruiker klikt op een naam. Dubbelklik op lstClubleden en voer volgende code in:
Merk op: Visual Basic gebruikt 0 als index om het eerste element aan te duiden. Dat is wel even wennen!
‘List(listindex) geeft de inhoud van het geselecteerde element weer. Wijzig de code bij lstClubleden_click als volgt. De naam van het clublid moet verschijnen in lblNaam.
Die laatste lijn wordt wat ingewikkeld. Het wordt begrijpelijker als we een gelegenheidsvariabele gebruiken. In die variabele slaan we de ‘Listindex’ op. De variabele is van het type ‘integer’. Vergeet niet de variabele vooraf te definiëren (met Dim). Bekijk de code.
Interactief lesmateriaal maken met Visual Basic
5
1.6 Clubleden verwijderen a. Alle elementen verwijderen.
Methode => clear
De code is heel eenvoudig. Ze wordt gekoppeld aan een klik op de knop ‘Wis alles’ Merk op dat we na het wissen onze eigen subroutine telze aanroepen. Dat moet, anders wordt lblAantal niet aangepast. d.2 Eén geselecteerde naam wissen.
Methode => removeItem
We koppelen de code aan de routine ‘Wis naam’ Merk op: * we werken opnieuw me een gelegenheidsvariabele (b) teneinde de code overzichtelijk te houden ; * ook nu moeten we hertellen! Test uit. Klik ook eens op de knop ‘Wis naam’ als er geen naam geselecteerd is. Je krijgt een foutmelding. Daarop moeten we anticiperen. De code moet worden aangepast. Dat kan op verschillende manieren. In de code hierna gebruiken we nog eens de methode ‘ListIndex’ Als er geen element geselecteerd is, staat die op -1 Dat lijkt een beetje vreemd, je zou verwachten dat hij op 0 staat. Maar dat kan niet, want 0 is de index van het eerste element in de lijst!!!! Als Listindex = -1 voeren we de verdere code niet uit. We verlaten te routine met Exit Sub.
Test alles grondig uit! Ter afronding vindt u hier de volledige code.
Interactief lesmateriaal maken met Visual Basic
6
Project : keuzelijst.vbp Formulier: frmClubleden Private Sub Form_Load() lstClubleden.AddItem ("Germain") lstClubleden.AddItem ("Hendrik") lstClubleden.AddItem ("Alain") lstClubleden.AddItem ("Johan") Call telze End Sub Private Sub lstClubleden_Click() Dim a As Integer 'plaats de listindex in een variabele a a = lstClubleden.ListIndex lblIndex.Caption = a lblNaam.Caption = lstClubleden.List(a) End Sub Private Sub cmdVoegtoe_Click() 'voeg aan de lijst de inhoud van het tekstvak toe ENKEL ALS het tekstvak NIET LEEG is. 'via trim verwijderen we eventuele spaties voor of achter de naam 'zo voorkomen we dat een vak met enkel spaties wordt toegevoegd If Trim(txtInvoer.Text) <> "" Then lstClubleden.AddItem (txtInvoer.Text) Call telze End If End Sub Private Sub cmdWisnaam_Click() 'we controleren eerst of er een naam geselecteerd is 'zo niet mag de procedure niet worden uitgevoerd 'als er geen naam geselecteerd is, is de waarde van ListIndex -1 If lstClubleden.ListIndex = -1 Then Exit Sub Dim b As Integer b = lstClubleden.ListIndex lstClubleden.RemoveItem b Call telze End Sub Private Sub cmdWisalles_Click() lstClubleden.Clear Call telze End Sub Private Sub telze() 'tel het aantal clubleden en plaats het getal in label lblAantal lblAantal.Caption = lstClubleden.ListCount End Sub
Interactief lesmateriaal maken met Visual Basic
7