VB dot NET. Rombaut Dirk
|
|
|
- Benjamin de Ridder
- 10 jaren geleden
- Aantal bezoeken:
Transcriptie
1 VB dot NET Rombaut Dirk
2 Visual Basic dot net (Deel 1) Hoofdstuk 1 De omgeving Visual Basic dot net is één van de nieuwe onderdelen van Visual Basic studio. Deze studio verschilt in zoverre van de vroegere Visual Basic systemen dat ze gedragen wordt door de Dot Net omgeving Dot Net Omgeving Platform onafhankelijk We kennen allemaal de omekeer, dat verkregen werd door de invloed van het Internet. Dit maakte het mogelijk dat men verschillende computers kon verbinden met elkaar. De vroegere programmeertalen echter konden enkelmaar gebruikt worden op de verschillende computers als ze voldeden aan enkele eigenschappen, waaronder: - Ze maken een uitvoerbaar (executable EXE of COM) bestand. - Moesten werken onder hetzelfde platform als die welke het voor geschreven was. Deze beperkingen waren soms een stoppunt voor de commerciële uitbouw van programma s. Immers een programma geschreven voor MS-DOS (Microsoft) kon enkel werken op een platform van microsoft (Dos, Windows e.d.) en waren NIET toegankelijk voor andere platformen zoals Linux, Unix, Mac ed. Daaraan was gedacht door de uitbrenger van Java. Deze werkte op een universeel programmeerprincipe dat maakte dat in feite men niet meer gebruik maakte van een executabel maar van een soort van interpreter gestoeld op een programma die op iedere computer kon geïnstalleerd worden. In dit geval JVM (Java Virtual Machine). 2
3 Dit sofware onderdeel maakt het mogelijk dat een programma geschreven in Java omgevormd wordt door een bytecode, werkend op het gebruikte platform. Daarom noemt men Java ook platform onafhankelijk Ontstaan van het dotnet principe. Natuurlijk kon Microsoft niet achter blijven en hadden ze ook nood aan een systeem. Daar JVM een trade mark (geregistreerd merk) was en ze dus een aanzienlijk bedrag moesten neertellen om het te gebruiken en ook omdat SUN de oorspronkelijke uitbrenger van Java een andere firma was hebben de programmeurs van Microsoft er een evenredig systeem uitgebracht die, zoals alles, niet 100% compatibel was met het andere. Daaruit volgt dat buiten JVM men ook een DOTnet virtual machine moet op zijn computer hebben om het systeem van dotnet te latten werken. Gelukkig kan je dat gratis downloaden en zit het ingebakken in VBdot net. Dit systeem wordt nu ook gebruikt voor Csharp (C++ dotnet), en andere door MS uitgebrachte talen. Is dat nu geen overkill? Misschien maar de strijd tussen de merken blijft bestaan en we moeten ons aanpassen Dot net virtual machine. Fig. 1 Dit is een voorbeeld van het frame work waarop VB.net en de andere talen draaien Bovenstaande tekening en meer uitleg hoe het systeem te werk gaat zal ons te ver leiden. Bent u echter iemand dat alles wil uitpluizen klik dan even op volgende link 3
4 Samen gevat is dat beide talen de beoogde doelen bereiken en ze elkaar evenknie zijn in het programmeren. Men zegt wel dat dot net trager is dan JEE maar dat is een kleine correctie waar men in de meeste (let wel niet alle) projecten geen rekening moet mee houden. Samengevat bekomt men: Java en.net in Gen.JAVA Geen 32K limiet meer Server-to-server flows Gedistribueerde transacties Ondersteuning voor hand-coded clients (zonder proxy) Buildtool om install packages te creëren 4
5 Hoofdstuk 2 Beginnen met VBdot Net. Fig. 2 In bovenstaande tekening (fig2) staat een voorbeeld van het beginscherm dat je zou moeten hebben gegeven dat het juist geïnstalleerd is. Je ziet het is een verandering ten opzichte van VB6 (vorig jaar) maar uiteindelijk is het gebruik quasi hetzelfde. Laten we beginnen met een project te creëren. Voor dit drukt men op, hoe kan het anders, Create in de sectie Recent Projects. We bemerken direct een groot gegeven en dat is dat de voertaal Engels is. Wat bij het ontwikkelen van een programma voor de programmeur GEEN 5
6 moeilijkheid zou mogen zijn. Immers de programmeertalen zijn meestal geschreven voor de Engelse taal gemeenschap. Ander talen waarin uitgebracht zijn Frans Russisch en alle andere talen. Daar men weet dat Nederlands talen meestal vlot Engels verstaan, hebben ze geen vertaling voor dit ingebracht. Dit terzijde. Bij het creëren van een project krijgt men volgend scherm naam vanhet project Fig. 3 Daarin laat de ontwikkelaar ons de keuze voor welk doel wij ons programma laten draaien. In eerste instantie gaan we ons bezig houden met een Windows Applicatie, en duiden dus dit aan. De naam van het project duiden we aan in het vak name. Na het drukken op OK gaan we deze oefening opslaan. We zorgen wel dat ze terecht komt op de server in een door ons gemaakte directory VBdotnet. Dit om geen verwarring te scheppen met het mogelijk eerdere gemaakte directory voor VB (vorig jaar). Als we even via onze verkenner naar die directory VBdotNet gaan kijken zien we voor ons project een gemaakte sub directory met een 3 tal bestanden in. Dit project is wat we uiteindelijk gaan zien in ons frame. Eens opgeslagen zien we terug ons vertrouwd scherm. Nu kunnen we zien dat ogenschijnlijk niet veel veranderd is. Inderdaad in onze ontwikkel omgeving niet maar in het werk achter de schermen natuurlijk wel. 6
7 2.1. Programmeren zelf. Voordat we daarover beginnen een paar kleine, zij het belangrijke opmerkingen, waar we in programmeer middens groot belang aan hechten. Namelijk de wijze van programmeren. - Gebruik steeds de juiste benaming - Gebruik een overzichtelijk schema (intendatie) - Plaats regelmatig een opmerkingsregel die uitleg geeft over wat je wilt verwezenlijken - Wees een aanhanger van het KISS principe - Verzorg je lay-out. Deze 5 regeltjes zijn uitermate belangrijk en vragen om een beetje uitleg Gebruik steeds de juiste benaming. In het programmeren is dat belangrijk. In de moderne programmering wereld ben je niet steeds verantwoordelijk voor het volledig eindproduct. Het kan zijn dat je met een ganse groep werkt aan een project (strekte van moderne OO talen). Wat bedoelen we daarmee: wel het is niet ondenkbaar dat de ene persoon het invoerscherm maakt, de andere persoon een bewerkingsdeel programmeert en een andere bijvoorbeeld de uitvoer. Één van de personen, de project lei(ij)der is dan verantwoordelijk voor de totale uitvoering van het project. In dit geval is de benaming belangrijk. Veronderstel dat de persoon voor de invoer een veld kwik noemt en de persoon voor de bewerking kwak en deze van de uitvoer kwek. De persoon die zijn haar zal verliezen zal de eind verantwoordelijke zijn want het project zal NIET werken. Let wel in de moderne wereld is het niet noodzakelijk dat alle 4 de personen bij elkaar zitten. Men kan geografisch volledig uit elkaar zitten en toch moet dat project uiteindelijk werken. Daarom zal men in het programmeren een vast stramien van benamingen maken. Deze bestaat uit een prefix samen met een naam. Hierna volgen de meest gebruikte prefixen: prefix txt lbl btn chk object tekst veld label veld button (knop) checkbox (keuze veld) 7
8 lst frm listbox (lijst veld) form (projectdeel) enz Hier ziet u de meest gebruikte prefixen. Natuurlijk zijn er nog meer maar die zullen we gaandeweg tegen komen. Een voorbeeld kan dan zijn voor een tekst vak: txtvoornaam: daarin zien we prefix txt voor tekst veld, maar merk ook op dat voor het begin ieder zelfstandig naamwoord (hetzij in samengestelde vorm of niet) een hoofdletter gebruikt wordt. Tevens wordt verwacht dat de benaming zinvol is en zeer belangrijk dat er geen spatie in de namen zitten: vb txtvoor Naam is niet goed TxtVoor_Naam echter wel. In de plaats van een spatie hebben we hier een underscore of liggend streepje gebruikt. Is toegelaten om in lange namen een beetje een eenduidige zin te geven. vb: lblde_lange_wapper Overzichtelijk schema (intendatie). Intendatie of tandvormig is een wijze van programmeren die duidelijk laat zien wat er van belang is. Dit wordt overal aangenomen en ook gepromoot in de verschillende boekwerken over programmeren bv Private Sub btnordenklantnr_click() SQL = "select * from KLANT order by klantnr" datprimaryrs.recordsource = SQL datprimaryrs.refresh In dit programmatje ziet men direct wat er gebeurt. Hier is dat nu niet van zo een groot belang maar bedenk eens een module met een aantal submodules. Door intendatie kan men de verschillende modules uit elkaar houden. Moderne programma s doen dat nu automatisch indien niet moet u zelf een onderscheid tussen de verschillende delen van een module maken. Het beste voorbeeld is in C daar kunt u dat terdege oefenen Plaatsen van commentaar regels. Het kan zijn en het is zelfs goed mogelijk dat ook andere personen aan uw programma moeten werken. Denk maar aan de bovenstaande uitleg dat en project uit verschillende personen bestaat. Het is gemakkelijk om door commentaar regels de werking van het programma toe te lichten en zo het begrijpelijk te maken voor de buitenstaander. Tevens kunnen die een hulp zijn bij het onderhoud (zie project 6 8
9 Informaticabeheer) van een programma. Daarom is het aangewezen en zelf gevraagd om hier en daar, aparte functies of objecten commentaar te plaatsen. Dit kan gebeuren op volgende wijzen: Private Sub btntoon_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btntoon.click REM dit is de knop die de naam op het schherm plaatst ' het textveld txtnaam zet het om in het label veld lbltoonnaam lbltoonnaam.text = txtnaam.text Men gebruikt voor deze methode het gereserveerde woordje REM (van remark) of een voorlopende quote ( ) Gebruikt het KISS principe. KISS (niet zoen) staat voor Keep It Smart and Simpel. Dit is één van de hoofdprincipes van de programmeur. Ik versta dat je dat niet in 1,2,3 leert maar het is belangrijk. Overbodige code maakt uw programma meer onleesbaar, groter, onoverzichtelijk kortom minder goed. Het is beter van een commentaar regel meer over de werking dan een onnodig uitgesmeerd programma. Als we werken met databases in ons programma, het volgende jaar, zal dit nog meer van belang worden. Daarom maak u het principe gewoon! Verzorg je lay-out Hier bent u verantwoordelijk voor gans uw programma, in tegenstelling met later. Hier moet je het principe ook bekijken van het oog wilt ook wat dus het is belangrijk dat uw eindproduct er mooi en overzichtelijk uit ziet. Deze principes, hierboven vermeld zullen mede de hoogte van uw uitslag bepalen. Wees er dan attent dat u ook deze principes voor uw eigen maakt. Vergeet niet een niet ordentelijk programma leidt tot fouten en moeilijkheden om ze uit te zoeken. Ik weet in het begin is dat een beetje moeilijk te handhaven maar u zult zien uiteindelijk gaat dat automatisch. U hebt er allen maar voordeel bij In de praktijk. We gaan nu eer zeer simpel programmatje maken. Dat programma bestaat hierin dat je een form maakt en die benoemt: Mijn eerste Oefening. Die form zal het mogelijk maken dat een naam, geplaatst in een tekstveld, door het drukken op een knop laat verschijnen op het scherm. 9
10 Iets wat je nog niet kent maar handig is en dat we in onze meeste oefeningen altijd gaan plaatsen is een stop knop. Deze knop heeft in zijn body maar 1 gegeven en dat is: End. Die laat daardoor onvoorwaardelijk de oefening stoppen. Kan erg handig zijn, toch in het begin. Nog iets dat zeer belangrijk is het opslaan van uw oefening! Maak er een gewoonte van uw oefening regelmatig op te slaan zo heb je geen schrik moment als uw computer uitslaat en de oefening waar je al zo ver mee was verloren is. Voorbeeld. Fig. 4 Maak eens bovenstaande oefening. U zult zien dat in mijn lessen je het meestal zelf zult doen. Naderhand geef ik wel een mogelijke werkende versie van het programma. Maar het originele moet u zelf ontwerpen volgens de regels en gewoonten van het programmeren. Het is niet noodzakelijk dat we beiden de zelfde versie hebben, zolang de versie werkt en ik kan zien hoe ze werkt. Mijn principe is verras me, maar weet wel de bovenstaande regels zijn de belangrijk en staan dicht bij de 5 geboden van het programmeren (te kennen) De toolbox (gereedschapskist). Een van de belangrijkste onderdelen van gans uw programmeer omgeving is de toolbox. Daar staan al de instrumenten in dat je 10
11 kunt gebruiken om een programma te laten verschijnen op uw scherm. Fig. 5 In bovenstaande figuur zie je de opstelling van de toolbox. Deze kan je verkrijgen door op het submenu View de toolbox aan te duiden. (hamer en sleutel). U ziet dat er verschillende onderdelen in die toolbox bestaan. Wees maar niet bang men zal ze niet al moeten kennen en gebruiken. Maar ze zijn er. Wij gaan maar de Common Controls gebruiken in het begin. Fig. 6 11
12 Als we deze kennen kunnen we al veel verder. We zien hier oude bekenden van VB6 welke we op onze form kunnen plaatsen. Samen gaand met een object, want dit zijn alle onderdelen van een toolbox, hebben we properties (eigenschappen) van het desbetreffend object. Deze kunnen we oproepen door de snelknop F4 in te drukken of terug in het submenu view aan te duiden. Bij de originele instelling zal dit rechts van uw scherm verschijnen. Ik raad u aan ze daar te laten, niet te min kunt u ze verplaatsen waar u wilt. Dit zijn de eigenschappen van welke u object zich zal bedienen. Het meest bekende is name welke de naam van het object voorstelt. We roepen onze object eigenschappen aan als gedeelten van een record. Dit wil zeggen na en punt (selector sign of kort weg selector) bv met een tekstbox: txtnaam.text. Dit spreekt de eigenschap tekst van en textbox aan. Daar waarin uw tekst komt. Voor deze die VB6 nog gezien hebben, de eigenschap label.caption bestaat niet meer en is ook label.text. We zullen genoeg trainen met deze eigenschappen, zodat je ze in uw vingers krijgt. Ook en onderdeel die zich op het scherm bevind is de Solution Explorer. Daarin zie je gans uw project staan en kan je bepaalde bewerkingen aanduiden. U kunt daarin ook de bestanden zien die op je server (of de plaats waar het project bewaard wordt) zijn opgeslagen. In een groot project kan je uw werkbestanden daarin opslaan en gebruiken. 12
13 Hoofdstuk 3 variabelen Programmeren zelf is in feite zeer eenvoudig. Het systeem is van de machine te vertellen wat je wilt en daarna de uitkomst opvragen van de machine. De taal om te communiceren met een computer is dan de programmeertaal. Deze veranderd onze instructies in byte code die de verschillende onderdelen aanspreken en hun werk laten doen. Terug in vroegere tijden was dat byte code die afgestemd was op een welbepaald platform, waarin nu het dient gebruik te maken van een tolk welke dan de byte code vertaald de gewenste code voor het desbetreffende platform. Dat hebben we al veelvuldig gezien. Nu is het probleem hoe: moeten we de code opstellen dat de machine doet wat wij vragen? Of bijvoorbeeld hoe maak ik de machine wijs dat ik 1 wil optellen met 10 en dat ze me de uitkomst moet tonen. Daarvoor hebben we natuurlijk instrumenten, namelijk variabelen operatoren, functies Variabelen Variabelen zijn verstaanbare uitdrukkingen die wij een waarde toewijzen. Deze waarde is komt overeen met een bepaald gedeelte van het werkgeheugen van een computer die we innemen het moment dat we een bewerking laten uitvoeren door die computer. De naam van de variabele staat voor het begin van het adres van het geheugen gebied, het type van het geheugen bepaald de grote van het gebied dat we beslaan. We hebben twee hoofd types namelijk het primitieve en het samengestelde type. Als primitieve hebben we: Boolean, Karakter, Integer en Real en als samengestelde Array, String, Record, Struct en Class. Bij klasse (class) worden de variabelen Objecten.. Een variabele wordt bepaald in VB door het gereserveerd woord DIM. Let wel een variabele in VB en in tal van hogere programmeertalen moeten niet meer altijd explicitiet benoemd worden voordat we het gebruiken. Ik en vele anderen blijven er echter bij dat het een teken is van kunnen programmeren en een teken van controle als je eerst uw variabelen declareert voor ze te gebruiken. Dus bij iedere oefening hoop ik dat u eerst uw variabelen declareert voor dat u ze aanspreekt in het programma. Verder in de cursus zal je zien dat we spreken van soorten variabelen (publieke, private) en referentie variabelen en waarde variabelen, elk met hun specifieke toepassingen. Maar dat is voor later. 13
14 3.2. Waarde bereik van de variabeltypes Type Grootte Bereik Boolean 2 Bytes True of False Byte 1 Byte 0 to 255 unsigned Char 2 Bytes 0 to unsigned Date 8 Bytes 01/01/0001 to 31/12/9999 Decimal 16 Bytes +/ zonder decimale punt, +/ met 28 cijfers na het decimale punt; kleinste waarde verschillend van 0: Double 8 Bytes E +308 tot E -324 voor negatieve waarden; E E +308 Integer 4 Bytes tot Long 8 Bytes tot Object 4 Bytes elk type kan opgeslagen worden in variabel object Short 2 bytes tot Single 4 bytes E +38 tot E -45 voor negatieve waarden; E -45 tot E +38 voor positieve waarden String volgens platform van 0 tot ongeveer 2 miljard unicode tekens User Defined bepaald door gegevens type wordt bepaald door de gegevens types 14
15 Om alles nog een beetje overzichtelijk te maken gaan we onze variabelen ook voorzien van een prefix, zoals onze objecten. Een string variabele noemen geven we als prefix str zo hebben we bijvoorbeeld voor een string variabele naam: strnaam. Let wel het prefix steeds kleine letters en de benaming van de variabele beginnen met een hoofdletter. Hier volgen een paar prefixen volgens het type Boolean Byte Collection object Date (Time) Double Error Integer Long Object Single String User-defined type bln byt col dtm dbl err int lng obj sng str udt. 15
16 4. Onze eerste toepassing 4.1. Werken met objecten Laat ons eerst eens een sprong in de tijd nemen en terug keren naar vorig jaar. Daar hebben we gezien dat we gebruik maakten van textboxen, labels, knoppen.enz. Dat waren onze objecten. In deze versie van VB. is daar geen uitzondering op. Zoals voordien gemeld zullen we gebruik maken van deze mogelijkheid. Het form veld en de omkleding zijn wel hetzelfde maar de inhoud blijft quasi hetzelfde Simpele functies Voor dat we beginnen te programmeren is het wenselijk dat we gebruik maken van een paar simpele functies. Een eerste functie die we veelvuldig gaan gebruiken is het oproepen van een Message Box. We kennen die nog van vroeger (vorig jaar) maar laten we daar toch even bij stil staan. Een massagebox is een object welke we als volgt oproepen: Public Function MsgBox( _ ByVal Prompt As Object, _ Optional ByVal Buttons As MsgBoxStyle = MsgBoxStyle.OKOnly, _ Optional ByVal Title As Object = Nothing _ ) As MsgBoxResult Prompt Tekst van het bericht dat in het boodschappenvenster verschijnt. Deze tekst moet tussen aanhalingstekens staan. Buttons Hiermee geeft u aan welke knoppen en iconen in het venster moeten staan, welke de default knop is, Hieronder vindt u een overzicht van de mogelijke codes. Meerdere codes verbindt u met een plusteken. U hoeft deze parameter niet te gebruiken (optioneel) Title Tekst in de titelbalk van het venster. Ook deze tekst moet tussen aanhalingstekens staan. Geeft u deze parameter niet mee dan krijgt u als titel de naam van het project. U hoeft deze parameter niet te gebruiken. 16
17 Enumeration Value Description OKOnly 0 Displays OK button only. OKCancel 1 Displays OK and Cancel buttons. AbortRetryIgnore 2 Displays Abort, Retry, and Ignore buttons. YesNoCancel 3 Displays Yes, No, and Cancel buttons. YesNo 4 Displays Yes and No buttons. RetryCancel 5 Displays Retry and Cancel buttons. Critical Question Exclamation 16 Displays Critical Message icon. 32 Displays Warning Query icon. 48 Displays Warning Message icon. Information 64 Displays Information Message icon. DefaultButton1 0 First button is default. DefaultButton2 256 Second button is default. DefaultButton3 512 Third button is default. Application is modal. The user must respond to the message box before continuing work in the current ApplicationModal 0 application. System is modal. All applications are suspended until SystemModal 4096 the user responds to the message box. Specifies the message box window as the foreground MsgBoxSetForeground window. MsgBoxRight Text is right-aligned. Specifies text should appear as right-to-left reading on MsgBoxRtlReading Hebrew and Arabic systems. Het werken met knoppen als tweede parameter heeft eigenlijk maar zin wanneer u de MsgBox als functie gaat gebruiken. De MsgBox als instructie zal het bericht enkel en alleen maar afbeelden. Gebruikt u de MsgBox als functie, dan kunt u nagaan op welke knop van de MsgBox een gebruiker heeft geklikt. Voorbeeld: 17
18 Dim Antwoord As Integer Antwoord = MsgBox("Wenst u verder te gaan?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Vraagje") If Antwoord = MsgBoxResult.OK Then '... Else '... End If U merkt dat de MsgBox als functie een Integer-waarde retourneert. U kunt die achteraf onderzoeken door een vergelijking te maken met een van de MsgBoxResult waarden (voor de VB6 gebruikers : de oude VB-constanten vbok, vbcancel, worden nog steeds herkend). De mogelijke waarden van het MsgBoxResult object zien er als volgt uit: Constant OK 1 Cancel 2 Abort 3 Retry 4 Ignore 5 Yes 6 No 7 Value eerste oefening We gaan eerst een kleine oefening maken, iets simpel. Een oefening in VBdotNet wordt natuurlijk altijd zelf gemaakt. Voor deze eerste echter zal de code gegeven worden, doch met sommige zaken verborgen. Van een oefening wordt steeds de code afgedrukt in 2 exemplaren, 1 voor de lesgever en 1 voor u zelf. Deze oplossingen kan je gebruiken bij het examen of testen. Deze die je afgeeft aan de leerkracht zal gequoteerd worden. Laten we er aan beginnen: Creëer een project GelukSpel En ontwerpt een form (juiste naamgeving!!!) volgens de onderstaande tekening 18
19 Fig. 7 Deze bestaat uit 3 labels, 1 picture box en twee knoppen. De labels hebben als eigenschappen borderstyle : fixed 3D font 14pt. Een object dat we bekijken is de picturebox. Deze heeft als eigenschap ImageLocation de plaats waar uw tekening staat. Zorg voor een tekening, het heeft geen belang welk doch zie dat ze geplaatst is op een gekende door u geplaatst. Public Class frmspelgeluk Private Sub pctfoto_click(byval sender As System.Object, ByVal e As System.EventArgs) pctfoto.visible = False Private Sub cmdspeel_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdspeel.click pctfoto.visible = False 'bepalen van de drie geluks getallen gebruik van de random functie 'Rdn bepaald een random getal tussen 0 en 1 'we hebben Cstr = Caracter to String 'Int maken we voor zuiver getal te hebben lblgetal1.text = Int(CStr(Rnd()) * 10) lblgetal2.text = Int(CStr(Rnd()) * 10) lblgetal3.text = Int(CStr(Rnd()) * 10) ' vast stelllen vanhet winnend getal 19
20 If ((lblgetal1.text = "7") Or (lblgetal2.text = "7") Or (lblgetal3.text = "7")) Then pctfoto.visible = True End If Private Sub cmdstop_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdstop.click ' maken dat we kunnen onze oefening stoppen End End Class Maak nu eens dat er ook een messagebox te voorschijn komt die ook proficiat aanduid. We hebben een stop knop. Deze is belangrijk want daar kunnen we de oefening stopleggen. De andere code zullen we in het body van de knop speel plaatsen. Als we dit object aanduiden zal er een toevalgetal verschijnen Het idee is als we het getal 7 zien in onze labels zal de tekening te voorschijn komen (picturebox.visble). De kans dat dit gebeurd is zeer groot. Wat als we 731 hebben en hoe zullen we dat maken? Probeer dat eens! Joepie ons eerste programma werkt. We voelen ons al hele grote programmeurs. Echter, we hebben juist een stapje gezet op het glibberig pad van programmeren. 20
21 Hoofdstuk 5 werken met de toolboxcontrols. VB.net geeft ons de mogelijkheid gebruik te maken van vele soorten controles voor het maken van formulieren (gebruikersinterface). In dit deel zullen we bepaalde tools of objecten uit onze toolbox nader bekijken. 5.1 Wat is er nieuw Voor hen die al geprogrammeerd hebben in VB6 zullen de meeste onderdelen van de toolbox wel hetzelfde lijken. Echter er zijn een paar veranderingen gebeurd. Er paar nieuwe functies hebben hun plaats opgeëist in de toolbox. - er is een nieuwe controle met de naam DateTimePicker. Deze control helpt de gebruiker tot het opslaan van een datum en tijd informatie. - De nieuwe controle LinkLabel is ontworpen voor de weergave van koppelingen (links) naar webpagina s in een formulier. - De control OptionButton is vervangen door het nieuw control RadioButton (voor keuze rondjes) - De control Frame is vervangen door GroupBox - De eigenschap ListIndex in de control ListControl is vervangen door de eigenschap SelectIndex. - De control ComboBox heeft dezelfde verandering ondergaan als hierboven. - De control Image is verdwenen en vervangen door PictureBox. 5.2 de controle DateTimePicker gebruiken Deze handige control nodigt de gebruiker uit om een datum vast te stellen. Laat ons eens naar een voorbeeld kijken: Maak een nieuw project datum aan. Maak een nieuw formulier, frmdat aan, en plaats daar op een label met als inhoud Datum. Voorzie de goede en juiste naamgeving Onder dat label plaatst u een DateTimePicker control ( objdattimpck)en nog twee labels, 1 met de inhoud de datum en tijd is: (lbldat) en het andere zal worden opgevuld. (lblmijndat) De labels hebben een BorderStyle FixedSingle (zie figuur). 21
22 Private Sub objdattimpck_valuechanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles objdattimpck.valuechanged lblactgebdat.text = objdattimpck.value fig. 8 Bovenstaande code maakt dat bij veranderen van een datum in de DateTimePicker de gekozen datum en tijd getoond wordt in een label. Merk op dat we nu werken met de eigenschap ValueChanged waaruit we kunnen afleiden dat steeds als de waarde van de datum gewijzigd wordt we de inhoud van de label onmiddellijk zullen wijzigen. 5.3 Checkbox We gaan terug de werking van een checkbox bewijzen met een oefening. Maken we een nieuw project Checkbox (prjchekbox) met een form CheckBox (frmcheckbox). Daarop plaatsen we 3 checkboxes met respectievelijk de namen chlitem1 tot aan 3. We zorgen ook voor een label lblgekozen. Het idee is dat we bij aanduiden van een checkbox we in het label zien wat we gekozen hebben (zie figuur 9) 22
23 fig. 9 De onderstaande code laat zien hoe we dat organiseren Private Sub chkitem1_checkedchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles chkitem1.checkedchanged If (chkitem1.checked = True) Then lblgekozen.text = lblgekozen.text + " koekje" End If Private Sub chkitem2_checkedchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles chkitem2.checkedchanged If (chkitem2.checked = True) Then lblgekozen.text = lblgekozen.text + " melk" End If Private Sub chkitem3_checkedchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles chkitem3.checkedchanged If (chkitem3.checked = True) Then lblgekozen.text = lblgekozen.text + " koffie" End If Private Sub frmcheckbox_load(byval sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Class We kijken gewoon naar de staat van de eigenschap checked. Deze eigenschap heeft 2 mogelijke staten true of false, dit volgens het aan vinken of niet. Bij true van een checkbox.checked laten we de tekst in onze label veranderen. 23
24 Ik zie direct wat u denkt. Het is inderdaad geen goede methode want als we de checkbox ontvinken blijft onze tekst staan. 5.4 Radio Buttons Een ander methode om iets aan te duiden zijn Radio Buttons. Deze methode van invoer, was vroeger (VB6) bekend als Option Buttons. Maakt een nieuw project prjradiobutton. We plaatsen daar een Form in frmradiobutton. Met daarop 2 Radio Buttons. We noemen ze respectievelijk rbtnmale en rbtnfem. We plaatsen een label, lbltekst. We maken ook een GroepBox (grpsexe) en duiden Sexe aan als Text. We zullen een Groep Box gebruiken om een groepering van de twee Radio Buttons te verzekeren. (fig. 10) Fig. 10 Volgens de aanduiding van de radiobutton zullen we in de label Mannelijk of vrouwelijk laten verschijnen in de label. Zie fig. 11. Merk op dat als Radio Buttons in groep geplaatst worden zullen ze bij aanduiding van het ene, het andere automatisch vrij stellen. De code laat toe dat we zo of het ene of het andere kunnen gebruiken. Private Sub rbtnmale_checkedchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles rbtnmale.checkedchanged If (rbtnmale.checked = True) Then lbltekst.text = "Mannelijk" Else lbltekst.text = "Vrouwelijk" End If 24
25 Fig. 11 Door gebruik te maken van de Group Box kunnen we de RadioButtons in Group bewerken. Later meer daarover. 25
26 Hoofdstuk 6 Flow Control Laat ons nu even dieper ingaan in het programmeren. In vorig hoofdstuk hebben we al de eerste schuchtere stappen naar een programma gesteld. Nu gaan we dat even verder uitbreiden. 6.1 If.Then Deze uitdrukking kennen we al enkele programma s ver. Een uitleg daarover zal misschien overbodig zijn maar toch. Zoals u weet werkt dit statement met Booleaans operatoren. Een Booleaans operator is een operator die maar 2 mogelijkheden heeft (Boole) namelijk True of False, in al zijn gedaanten zoals Yes NO of Waar, Nietwaar,..enz. Deze operatoren kennen we in de wiskundige operatoren. a<b, a>b a<> b, a = b a<=b a kleiner dan b, a groter dan b a verschillend van b, a gelijk aan b a kleiner dan of gelijk aan b (geld ook voor groter) Nu ebben we nog maar gewerkt met enkelvoudige voorwaarden, het is ook mogelijk te werken met meer complexe voorwaarden. Daar krijgen we dan samenstellingen door And (EN) als ook OR(of) bij te voegen. Belangrijk de If instructie wordt afgesloten met een End If. Fig. 12 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdknop.click If txtvak2.text = txtvak1.text Then MsgBox("gelijk", MsgBoxStyle.Information, vbok) Else If txtvak2.text < txtvak1.text Then 26
27 vbok) vbok) End If End If MsgBox("vak1 is kleiner dan vak2", MsgBoxStyle.Information, Else MsgBox("vak1 is groter dan vak2", MsgBoxStyle.Information, Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdstop.click End Een kleine opmerking aangaande de samengestelde voorwaarden. In tegenstelling met sommige programmeertalen wordt in VB.Net als de voorwaarden gekoppeld zijn met een AND operator volledig geëvalueerd. In andere talen zoals C++, zal bij een niet voldoen van de eerste voorwaarde het tweede niet meer bekeken worden. Dit kan leiden tot onverwachte resultaten. Verder meer daarover. Zoals u ziet heb ik direct een ELSE operator meegenomen in dit voorbeeld. De ELSE operator zal na evaluatie van de voorwaarde, de statements uitvoeren als de voorgaande evaluatie negatief (onwaar) is. Zoals u ziet in het voorbeeld is een nestig van evaluaties mogelijk. Wat echter wel belangrijk is, is dat de structuren naar behoren afgesloten worden met de respectievelijke End If. 6.2 Case Structuur De vorige uitdrukking zal reageren op een evaluatie van waar of nietwaar bij twee elementen. Het is mogelijk dat we een evaluatie moeten doen die over meerdere mogelijkheden gaan. In dit geval gaan we gebruik maken van de Select Case structuur Maak een project prjbeoordeling, zorg voor, zoals in de tekening een aantal labels en tekstboxen. Benoem deze met de juiste benaming. Zorg ook voor een knop beoordeling en een label, onderaan. Zie dat de AutoSize op false staat, anders heb je een vaste grootte. Het idee is dat we in de tekstvakken punten invullen en dat we ze beoordelen. Na beoordeling zullen we de uitslag tonen in de onderstaande label 27
28 Fig. 13 De bijpassende code is: Private Sub cmdbeoordeling_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdbeoordeling.click 'bepalen van de variabelen Dim totaal As Single Dim stotaal As String Dim melding As String ' de variabele totaal opvullen totaal = Single.Parse(txtNederlands.Text) _ + Single.Parse(txtFrans.Text) _ + Single.Parse(txtEngels.Text) _ + Single.Parse(txtWiskunde.Text) _ + Single.Parse(txtGeschiedenis.Text) stotaal = Format(totaal, "0.00") Select Case totaal Case Is < 50 melding = "Afgewezen(" & stotaal & ")" Case Is < 60 melding = "Niet geslaagd (" & stotaal & "%)Herexamens voor :" & vbcrlf If Single.Parse(txtNederlands.Text) * 5 < 70 Then 28
29 "%" melding = melding & "-Nederlands" & vbcrlf End If If Single.Parse(txtFrans.Text) * 5 < 70 Then melding = melding & "-Frans" & vbcrlf End If If Single.Parse(txtEngels.Text) * 5 < 70 Then melding = melding & "-Engels" & vbcrlf End If If Single.Parse(txtWiskunde.Text) * 5 < 70 Then melding = melding & "-Wiskunde" & vbcrlf End If If Single.Parse(txtGeschiedenis.Text) * 5 < 70 Then melding = melding & "-Geschiedenis" & vbcrlf End If Case Is < 70 melding = "Geslaagd met voldoening" & stotaal & "%" Case Is < 80 melding = "Geslaagd met onderscheiding" & stotaal & "%" Case Is < 90 melding = "Geslaagd met grote onderscheiding" & stotaal & "%" Case Else melding = "Geslaagd met grootste onderscheiding" & stotaal & End Select lblbeoordeling.text = melding Opmerkingen bij de code: Door het gebruik van Single.Parse(string) vormen we de textwarde om naar een numerieke waarde. Deze zal dan de juiste berekeningen geven. Als de instructie te lang wordt dan kunnen we ze afbreken en verder doen op de volgende lijn. Dit gebeurt door na de String een spatie te plaatsen gevolgd door een underscore. Daarna kunnen we op de volgende lijn verder doe. Let wel dat is enkel mogelijk in de instructies De functie format wordt verder nog besproken. We kunnen meegeven dat deze functie nummerieke waarden (ook datums) omzet naar Strings volgens een bepaald patroon (2 de parameter). vbcrlf is de constante die in VB. een carriage retun en line feed geeft. Door dit te gebruiken forceren we dat de code een andere lijn neemt voor de volgende uitvoer. 6.3 For Next lus Dit is de oudste en nog steeds regelmatig voorkomende lus. Deze lus is in tegenstelling met zijn collega lussen (zie verder) de enige lus waarbij de variabele een automatisch increment krijgt. Dit increment of decrement wordt bepaald door de programmeur. De methode is: 29
30 Dim iteller As Integer Dim itotaal As Integer For iteller = 1 To 10 itotaal = itotaal + iteller Next MsgBox(itotaal) Of Dim iteller As Integer Dim itotaal As Integer For iteller = 10 To 1 Step -1 itotaal = itotaal + iteller Next MsgBox(itotaal) Natuurlijk is de step mogelijkheid ook in de positieve vorm. Dan wordt het increment verhoogd met de waarde van de step 6.4 Do Loop De instructie vorm die volgt op een Do..Loop is booleaans (zie de if instructie). Ze wordt geëvalueerd op een true waarde. Bij een false gaat het programma gewoon verder. Zie nasi Sneidermann (A&I). Het basis model van de Do..Loop, er wordt enkel een onderscheid gevormd met while of een until waarde. of Dim teller As Integer teller = 1 Do While teller <= 10 MsgBox(teller) teller = teller + 1 Dim teller As Integer teller = 1 Do Until teller > 10 MsgBox(teller) teller = teller +1 merk op dat de booleaans operator in beide gevallen veranderd. Er bestaan nog variateis op deze loop instrucctie. We kunnen ook zeggen: DO < statement> Loop While <voorwaarde> En 30
31 DO <statement> Loop Until <voorwaarde> Deze zorgen dat op zijn minst de loop 1 maal doorlopen wordt. Immers de evaluatie gebeurt op het einde. 6.5 While.. End While Deze functie kennen we nog uit het tijdperk van VB6 als de While..Wend instructie. Deze bestaat niet meer in VB.Net. While<voorwaarde> <statement> End While Deze instructie wordt bijna niet gebruikt. Immers je kan alles wat deze instructie kan met do.. loop dus deze wordt bij voorkeur niet gebruikt. 6.6 Het EXIT statement EXIT For vroegtijdig een for-lus verlaten EXIT Do EXIT Sub EXIT Function vroegtijdig een Do-lus verlaten vroegtijdig een subroutine verlaten vroegtijdig een functie verlaten Met het EXIT statement kan men vroegtijdig een lus verlaten. Dit statement wordt zelden gebruikt maar in bepaalde gevallen is de overweging om dit te gebruiken wel waard. Men zal dit normaal niet gebruiken in een programma, maar stel dat je een woord in een tabel moet zoeken en je daar een lus voor gebruikt. Het zou onnodig proces gebruik zijn als je bijvoorbeeld bij een tabel van 1000 woorden het eerste woord al een true geeft, dan moet men nog 999 woorden doorlopen voor dat we aan het einde komen. 6.7 String bewerking Om het aantal karakters in een textveld te kennen bestaat de eigenschap.length. Dit is samen met de spaties, welke ook en karakter is in de tabel. Er zijn verschillende functie dat je kan gebruiken met een tekst. Eén ervan is Mid. Deze laat de mogelijkheid om een karakter uit een tekst te halen. We gebruiken deze als volgt: 31
32 Mid( Jantje, 2,3) geeft als uitslag ant. De eerste parameter geeft aan van het hoeveelste karakter dat je moet beginnen, de tweede parameter geeft het aantal karakters dat je moet aanduiden. Oefening: Maak een project prjzinoefening. Plaats daar een form in zoals in de onderstaande figuur. In het tekstveld, plaats je een zin die je gaat evalueren. Naar het aantal letters en het aantal woorden. fig
33 Hoofdstuk 7 Modulair programmeren 7.1 Procedures Tijdens de toepassingen die we al ontwikkeld hebben is ons zeker opgevallen dat we steeds gebruikmaken van kleine zelfstandig werkende onderwerpen. We kennen dit al uit vorige programmeertalen, zoals Pascal, waar dit het gebruik van procedures noemde. Dus in feite wekt u aan 1 procedure tegelijker tijd Als we een code schrijven voor een gebeurtenis, bvb Click, van een besturingselement dan concentreert u zich op de gebeurtenis waar het om draait, met andere woorden water gaat gebeuren als er iemand op dat besturingselement klikt. Als men nu dubbelklikt of op een ander besturingselement klikt, dan is er iets waar u zich later zorgen over maakt in een ander event-handler van het besturingselement in kwestie. De taal VB. is er van doordrongen en zelfs de langste toepassingen zijn geschreven door ze in kleine onderdelen op te splitsen in kleine goed gedefinieerde taken. Ieder van deze wordt uitgevoerd door een aparte procedure die op zijn beurt wordt geschreven en uitgetest door andere procedures. Een procedure wordt echter gebruikt voor het uitvoeren van een terugkerende taak, bijvoorbeeld een terugkerende berekening. VB.: men moet een toepassing schrijven die een temperatuur moet herleiden naar een andere schaal, of men moet steeds de mogelijkheid. Hebben om een afgeleide van een bepaalde waarde te nemen. Men kan steeds dezelfde berekening herhalen, maar de fout mogelijkheid vergroot dan bij iedere herhaling. Men kan ook een procedure schrijven om de berekeningen uit te voeren, en deze laten herhalen. Het grote voordeel bij deze laatste benadering is het onderhoud van het programma. Denk eens in dat men wat moet veranderen in de berekeningen, in het eerste geval moet men in iedere berekening iets veranderen. In het tweede geval echter moet men enkel de procedure aanpassen en alles valt in zijn plooi. Er zijn in VB. twee soorten procedures. Deze zin de subroutines en de functies. Het idee van programma s op te delen in meer handelbare kleine programma s is niet nieuw in het gebruik van computers. Er zijn bij het programmeren weinig taken die als een geheel worden beheer(t. De event-handlers zijn slechts één voorbeeld van het opdelen van grote toepassingen is kleine handelingen. Er zijn wel event-handlers die een heleboel code nodig hebben. Men kan zo krijgen dat we bij het gebruiken van een event men honderden zelfs duizend lijnen van code moeten schrijven. Daardoor wordt de code rap onduidelijk. Handiger zou zijn dat we deze code konden opdelen in kleine, betekenisvolle delen, die op zich zelf staan. Zo zouden we een event-handler die voordien een paar honderd lijnen code 33
34 heeft eventueel kunnen opsplitsen in aparte delen. Men kan dan bijvoorbeeld onderstaande code hebben. Private Sub CmdBereken(.. Call BerekenGrootsteWaarde Call BerekenKleinsteWaarde Call BerekenGemiddelde end Sub De codes die in de verschillende delen zitten is wel niet verdwenen maar zijn afgesplitst. Gevolg we kunnen deze afgesplitste delen ook meerdere keren gebruiken. 7.2 Subroutines. Een subroutine is een blok met statements dat een duidelijk omschreven taak uitvoert. Deze zijn begrepen tussen Sub en. Het kan aangeroepen worden met zijn naam Voorbeeld: Private Sub ToonDeTijd() MsgBox(Now()) De subroutine ToonDeTijd() kan lmen nu oproepen in het programma op gelijk welke plaats, enkel door het vernoemen van de naam. Call ToondDeTijd() of simpelweg ToonDeTijd(). Van waar dat overal kan opgeroepen worden zullen we straks bekijken. Als we de taken even bekijken voor het uitvoeren van een subroutine zien we dat dit meer om het lijf heeft dan dit voorbeeld. Toch is een code blok van slechts 1 instructie iets dat losstaat van de rest van het programma. U zal zien dat event-handlesr gecodeerd zijn als subroutines. De statements van een subroutine worden uitgevoerd van zodra we de lijn bereiken. Nadien wordt automatisch terug gesprongen nar hhet programma welke we aan het uitvoeren zijn. We sten van vorig hoofdstuk dat we ookk een subroutine voortijdig kan beeindigen met behulp van de instructie Exit Sub. Daardoor wordt er onmiddellijk overgegaan naar de regel, waardoor we de routine verlaten. Opmerking. Alle variabele die men declareerd binnen de subroutine zijn plaatselijk (private) voor de subroutine. Wordt de subroutine om welke reden ook beeindigd, houden alle variabelen die er binnen gedeclareerd zijn op te bestaan 34
35 7.2.1 Subroutine kunnen argumenten ontvangen. Argumenten zijn waarden die meegegeven worden bij de oproep van de subroutine. Deze kunnen dan al dan niet door de subroutine gebruikt worden. Call ToonTekst( piet had een fiets. ); Private Sub ToonTekst(ByVal tekst as String) MsgBox(tekst) Piet had een fiets noemen we en argument of parameter. De subroutine zelf moet ingesteld zijn om zo een parameter of argument te ontvangen. Dit gebeurd in de eerste lijn van de routine, dit door op te geven welke type van argument dat je gaat gebruiken. In bovenstaand voorbeeld is het duidelijk dat et over tekst gaat. Dus de parameter heeft als type tekst. VB.: Private Sub Bereken(ByVal x as Integer, ByVal y as Integer, ByVal Z as Single) Deze subroutine verwacht dus 3 parameters. De aanroep van deze subroutine kan er dan als volgt uitzien: Bereken(10,11,3.3) Of Dim a,b as integer Dim C as single A = 10 B = 11 C = 3.3 Call bereken(a,b,c) Er bestaan twee mogelijkheden om argumenten meet te geven: ByVal: de waarde wordt gewoon door gegeven en daarbij stopt het (By Value Clausle) ByRef: niet de waarde wordt doorgegeven maar het adres van de geheugen locatie van de variabele wordt mee gegeven (By Reference Clausule) 35
36 Ik laat een voorbeeld zien waar men gebruik maakt van beide, dit om het verschil te tonen Private Sub cmdknop_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdknop.click Dim A As Int16 A = 10 Call mogelijkheid1(a) MsgBox(A) Call mogelijkheid2(a) MsgBox(A) Private Sub mogelijkheid1(byval waarde As Int16) waarde += 1 Private Sub mogelijkheid2(byref waarde As Int16) waarde += 1 fig. 15 In het eerste geval zien we dat we enkel de waarde zien (10) in het tweede zien we dat het programma de waarde in de geheugen locatie met 1 verhoogt en we dus aan 11 komen. De ByRef clausule is echter bij fouten moeilijker op te sporen (debuggen), door de logica die er achter schuilt. 36
37 7.3 Functies Een functie is goed vergelijkbaar met een subroutine. Het enige verschil is dat een functie een waarde terug geeft aan het programma. Omdat ze een waarde terugleveren hebben de functies typen zoals variabelen. De waarde die de functie terug geeft aan het stuk programma die de functie opriep, wordt de return value genoemd. Het type moet echter overeenstemmen met het type van de functie. Duidt u dus een type integer aan als declaratie van de functie, dan moet de waarde die de functie retourneert ook een integer zijn. Net als de subroutines accepteren functies argumenten. De statements van een functie staan tussen Function End Function VB. Private Function VolgendeDag() As Date Dim morgen As Date morgen = DateAdd(DateInterval.Day, 1, Now()) Return (morgen) 'waarde die we retourneren naar het programma End Function Private Sub txtvandaag_textchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles txtvandaag.textchanged txtvandaag.text = Now() Private Sub txtmorgen_textchanged(byval sender As System.Object, ByVal e As System.EventArgs) Handles txtmorgen.textchanged txtmorgen.text = VolgendeDag() 'waarde die van de functie komt End Class 7.4 Declaraties van een functie fig. 16 We kunnen een functie op 2 manieren declareren. In feite op nog meer manieren maar dat gaan we later tegenkomen. 37
38 7.4.1 private Als u een functie schrijft binnen in een formulier (wat we tot nu toe gedaan hebben) dan is dit een private functie. Daaruit volgt dat we deze functie enkel maar kunnen aanroepen binnen ons formulier. Let op maakt men in het zelfde project een tweede formulier aan (later) zullen we een functie gemaakt in het eerste formulier deze NIET kunnen gebruiken in ons tweede formulier. Als men het woord private weglaat zal men geen fout genereren. Het is volstrekt mogelijk deze weg te laten, echter zal de functie nog steeds van het private karakter zijn met al de eigenschappen. Men kan zelfs die functie het woord public meegeven. Echter zal de functie zich gedragen als een private Willen we nu echter een functie maken die we door gans het project willen gebruiken moet men gebruik maken van en module en deze toevoegen aan het project. Dit gebeurt bij de menubalk in het code venster: project add Module. Als je een functie in deze module schrijft en deze begint met de declaratie Public dan zal deze functie overal in het project aan te roepen zijn. Als de functie terug het woord private als declaratie draagt dan zal ze enkel kunnen gebruikt worden door de waarden binnen deze module. En niet buiten de module zoals in de formulieren module Public Function a() End function... Private Function b() End Function hier kan ik a gebruiken hier kan ik b gebruiken form1 Private Function c() End Function hier kan ik a() gebruiken hier kan ik b() niet gebruiken hier kan ik c() gebruiken form2 hier kan ik a() gebruiken hier kan ik niet b() gebruiken hier kan ik niet c() gebruiken fig. 17 Bovenstaande tekening geeft weer wat ik in de tekst uitlegde Oefening controleren van een banknummer. Geeft een msgbox als het ingevoerde banknummer juist is. Geeft een waarschuwing als et banknummer niet klopt. Bereken van de laatste twee cijfers van het nummer gebeurt met MOD 97. Probeer maar Public Class frmbanknummer 38
39 Private Sub cmdcontrole_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdcontrole.click If bankcheck(txtbanknummer.text) = True Then MsgBox("banknummer is ok") Else MsgBox("best nog eens checken") End If Private Function bankcheck(byval nummer As String) As Boolean Dim begin, midden, einde, test, rest As Long begin = Long.Parse(Microsoft.VisualBasic.Left(txtBankNummer.Text, 3)) midden = Long.Parse(Mid(nummer, 5, 7)) einde = Long.Parse(Microsoft.VisualBasic.Right(txtBankNummer.Text, 2)) test = begin * midden rest = test Mod 97 Return (rest = einde) End Function End Class 39
40 Hoofdstuk 8 Besturingselementen Textbox Textbox is de voornaamste techniek om tekst in een programma te voeren. In feite is de tekstbox een kleine tekstverwerker die alle basisvoorzieningen van een tekstverwerker bied, zoals tussen voegen van tekst, zelfs kopiëren naar het klembord. Dit besturingselement heeft met de verandering van VB6 naar VB.net een grondige verandering meegemaakt. In het oude systeem is niet in de mogelijkheid om grote stukken test op te nemen. De nieuwe vorm kan meer dan 2 miljard tekens bevatten. 8.1 enkele bijzondere eigenschappen multiline Met deze eigenschap wordt er bepaald als een tekstbox 1 of meerdere lijnen kan bevatten. Door dit op True te plaatsen hebben we meer mogelijkheid om tekst te plaatsen Scrollbar Door deze eigenschap kan men de Textbox instellen voor het gebruik met scrollbars. Als de tekst de afmetingen overstijgt van de Textbox kan men hierdoor schuifbalken in de tekstbox plaatsen. Men kan kiezen over verschillende mogelijkheden: None (geen), Verticale (rechtopstaand), Horizontal (liggend) of Both (beide mogelijkheden. Als de tekst die de gebruiker typt langer is dan het besturingselement echter zal die automatisch overlopen naar een andere regel. Daarvoor moet men een harde enter gebruiken. Dit kunt u gebruiken oor wordwrap te gebruiken WordWrap Daarmede kan bepaald worden als de tekst, bij het bereiken van de rechterkant van de Textbox, overloopt. Als het besturing element ook nog over scrollbars beschikt kunt u zeer lange regels tekst invoeren AcceptReturn, AcceptTab Deze twee eigenschappen regelt hoe het Textbox zal reageren op enerzijds de returnknop en anderzijds de tabknop. De enter toets activeert de standaard knop op een formulier (OK) ook al heeft deze niet de focus. Bij een meerregel Textbox zal men deze enter toets echter gebruiken om naar een nieuwe regel te gaan, dus moet men deze eigenschap op true zetten. Als het formulier echter 40
41 geen knop bevat zal deze automatisch dienen voor de multiline Textbox. Staat die op False dan moet men er aandacht aan schenken al men wil veranderen van lijn ctrl+enter te gebruiken. De eigenschap AcceptTab reageert op de tab-toets. Als men deze eigenschap instelt heeft men terug de mogelijkheid een tab te gebruiken in de tekst box anders zal deze de tab volgorde in het formulier volgen. Merk echte op dat de tabtoets geen effect heeft op andere besturing elementen MaxLength Deze eigenschap bepaald hoeveel tekens je kunt invoeren in de Textbox. Zijn standaard waarde is dit was ook het maximum aantal tekens in de VB6 versie Als deze eigenschap op 0 staat kan de capaciteit lengte 2GB bereiken ( tekens) om dit te beperken (geheugen) kan men een getal invullen in deze eigenschap. MaxLength is zeer belangrijk bij het vullen van databases. 8.2 Eigenschappen om de tekst te bewerken Text De grootste eigenschap van een Textbox is natuurlijk het invoegen van een tekst. Deze eigenschap laat ons toe tekst in voegen en eventueel te gebruiken. Er zijn 2 methoden bij deze eigenschap. - Voor eenregelige besturingselementen Textbox zoals gebruikelijk bij een korte tekst - Voor meer regels opent u de eigenschap Lines en voert in het venster String Collection, daar verschijnt de tekst in. Iedere regel die u invoert is een alinea. Afhankelijk van de breedte van dit element kan deze alinea opgebroken worden in 1 of meerdere regels. Vergeet echter niet van multiline in te stellen. Alle functie in de classe string kan men gebruiken in deze eigenschap. Lengte: strlen = Textbox.Text.length vroeger bekent als len(textbox.text) Leeg maken: Textbox.Clear vroeger Textbox.Text = De methode IndexOf van de klasse String plaats een string binnen de tekst van het besturingselement. Het volgende statement gaat opzoeken hoeveel maal Visual voorkomt in de volgende tekst. Dim Locatie As Integer Locatie = txttest.text.indexof("visual") 41
42 Vroeger in VB6 hadden we ook deze mogelijkheid. Daar gebruikten we Instr() Locatie = Instr(txtTest.text, visual ) Oefening: De gebruiker voet een tekst in, in dit geval de tekst van Jantje.. Plaats een tekst in het te zoeken woord en een message box zorgt dat de plaats wordt uitgegeven. Oplossing Public Class frmonderzoeken Private Sub cmdzoek_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdzoek.click Dim vindplaats As Integer Dim gevonden As Boolean Dim zoekwoord As String Dim bericht As String vindplaats = -1 gevonden = False zoekwoord = txtzoek.text vindplaats = txtteonderzoeken.text.indexof(zoekwoord, 0) Do While vindplaats >= 0 gevonden = True 42
43 bericht = bericht & " - op positiie nummer: " & _ Integer.Parse(vindPlaats + 1) & vbcrlf vindplaats = _ txtteonderzoeken.text.indexof(zoekwoord, vindplaats + 1) Loop If gevonden Then bericht = "De zoektekst werd gevonden: " & vbcrlf & bericht Else bericht = "de zoektekst werd niet gevonden" End If MsgBox(bericht) End Class ReadOnly (alleen lezen), Locked(vergrendeld) Als u een tekst wilt weergeven in een Textbox, maar u wilt verhinderendatr gebruikers die kunnen bewerken kunt u deze eigenschap instellen op true. Op dit moment kunt u de tekst enkel invoeren in het code venster. Vroeger moest men deze op true zetten om te voorkomen dat je een bewerking kon uitvoeren in de tekstbox De locked functie zal het element vergrendelen bij ontwerpen. Dan kan u het niet perongeluk verplaatsen Lines (regels) Behlave met de eigenschap text kunt u ook tekst uit et besturingselement halen met deigenshap lines. Anders dan bij test is dat lines enkel alleen lezen is. U kunt de tekst van het besturingselement niet instellen door het toekennen van tekst aan de array Lines Deze tabel is een string-array waarvan ieder element één regel tekst bevat. De eerste regel tekst wordt opgeslagen in het element Lines(0), de tweede regel in Lines(1) enz. U kunt de tekstregels herhaald uitvoeren met een lus zoals hiernadim iline als Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim iline As Integer For iline = 0 To TextBox1.Lines.GetUpperBound(0) - 1 { tekst} Next Tussen de accolades zetten we nu tekst Oefening: 43
44 Maak volgende formulier. U ziet dat het een verbetering is van het gebruikte in de eerste oefening. txtregel btntoon txtinvullen txttoonregel De gebruiker moet een getal invoeren. Dit getal moet in een de daaronderstaande regel na het drukken op de knop toon de gevraagde regel produceren in het text vakje. Om de zoekactie te verzekeren moet er ook voor gezogd worden dat er enkel een numeriek gegeven kan ingevuld worden. Men moet ook voorzien dat er geen ongeldige waarde van grootte ingevuld wordt (kleiner dan 1 og groter dan het beschikbaar aantal regels. Code Public Class frmoefeningtekst Private Sub cmdtoon_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtoon.click Dim RegelNummer As Long Dim AantalRegels As Long If Not IsNumeric(txtRegel.Text) Then MsgBox("U moet een geldeig getal opgeven") txtregel.text = "" txtregel.focus() Exit Sub End If RegelNummer = Long.Parse(txtRegel.Text) AantalRegels = txtinvullen.lines.getupperbound(0) + 1 'get upperbound =Index van het laaste element in de tabel 44
45 If RegelNummer < 1 Or RegelNummer > AantalRegels Then MsgBox("udient een correct aantal regels in te voeren") txttoonregel.text = "1" txttoonregel.focus() Exit Sub End If txttoonregel.text = txtinvullen.lines(regelnummer - 1) End Class Password Char Deze eigenschap is beschikbaar bij et ontwerpen en veranderd het teken dat wordt getypt in een door u bepaald teken. De standaard waarde is een lege string. De deze eigenschap hheeft geen invloed op de.text eigenschap van het object. Deze behoud de getypte tekens. De gebruiker kan de tekst echter niet copieren of knippen. Iedere tekstdie ingebracht wordt in dat element krijgt het uitzicht van de ingestelde tekens. 8.3 eigenschappen voor de tekstselectie We krijgen 3 eigenschappen voor het bewerken van de tekst, die geselecteerd is door de gebruiker in het textvak. - SelectedText: de geselecteerde tekst - SelectionStart: begin van de selectie - SelectionLength: de lengte van de selectie SelectedText Deze eigenschap levert de geselecteerde tekst op. Daardoor kan je vanuit de code de geselecteerde tekst bewerken. Zelfs een andere waarde toekennen. Er bestaan speciale functies om een tekst te bewerken. Dit zijn methodes van de klasse String. Textbox1.SelectedText = Textbox1.SelectedText.ToUpper Dit zal alle tekst karakters in hoofdletter plaatsen. Om te wissen gebruiken we: Textbox1.SelectedText = SelectionStart, SelectionLength Dit levert de positie op van het eerste karakter van de geselecteerde tekst, of stelt deze in. Selection.Lengt geeft de lengte van de geselecteerde tekst weer of stelt ze in 45
46 Oefening: Plaats in uw vorige oefening nog een paar objecten bij, zoals onderstaande tekening. txtzoek cmdz&v txtvervang fig. 18 We plaatsen een tekst in txtinvullen. In die tekst zullen we een onderwerp dat in txtzoek staat, zoeken en vervangen door de waarde in txtvervang. Nadien zullen we een message box tonen met het aantal vervangingen. Code: Private Sub cmdzenv_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdzenv.click Dim Vindplaats As Integer Dim Teller As Integer Vindplaats = txtinvullen.text.indexof(txtzoek.text, 0) Do While Vindplaats >= 0 Teller += 1 txtinvullen.selectionstart = Vindplaats txtinvullen.selectionlength = txtzoek.text.length txtinvullen.selectedtext = txtvervang.text Vindplaats = txtinvullen.text.indexof(txtzoek.text, Vindplaats + 1) Loop MsgBox("er werden " & Teller.ToString & " vervangingen door gevoerd") 46
47 8.4 Methoden voor tekst selectie De select methode. Men kan een tekst selecteren met de methode Select: TekstBox1.select(start, length). Deze methode is nieuw in VB.Net en komt overeen met de SelectionStart en SelectionLength eigenschappen. Om bijvoorbeeld tekens tussen de nummers 100 en 105 in het besturingselement te selecteren zal men dit kunnen doen met de methode Select. Als argumenten zal men dan moeten ingeven 99 en 6: Textbox1.Select(99,6). Een variant is het selecteren van gans de tekst. Dit kan men doen met de methode SelectAll De Undo-, ClaearUndo en CanUndo Eigenschap. Men kan ook in dit besturingselement de meest recente bewerkingen ongedaan maken. Om dit te doen met men eerst zorgen dat de CanUndo eigenschap ingesteld is op TRUE. Vervolgens kan men de methode UNDO op roepen. Let op de tekst kan zo in een beweging verwijderd worden (dat is gevaarlijk!). Men kan deze bewerking ook ongedaan maken door de methode ClearUndo aan te roepen Opvangen van toetsen aanslagen De gebeurtenis KeyPress gebeurt altijd als er een toets wordt ingedrukt. Deze meld ook als eer een toet wordt ingedrukt. Naast KeyPress bestaan er ook nog KeyDown en KeyUp, die acties uitvoeren afhankelijk van het moment dat de key ingedrukt of losgelaten wordt. Voorbeeld als we geen cijfers willen toelaten in onze Textbox kunnen we dat op volgende manier oplossen: Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If e.keychar >= "0" And e.keychar <= "9" Then e.handled = False Else MsgBox("niet juist") End If Dit is een methode om een foute invoer op te vangen. 47
48 Hoofdstuk 9 ListBox, ComboBox, CheckedListBox Deze worden tesamen besproken omdat ze min of meer hetzelfde doen namelijk ze stellen de gebruiker een lijst met waarden ter beschikking waaruit 1 of meerdere waarden kunnen gekozen worden. De enige nieuwe in het rijtje is de CheckedListBox. De controls zijn belangrijk, daarom dat we er een beetje dieper op in gaan. 9.1 De basis eigenschappen Integral height Deze eigenschap zorgt er voor dat het laatste element volledig wordt weergegeven. Het is een Boolean (True of False) Items. Geeft de verzameling van elementen in het besturing element. Bij ontwerpen kunt u deze lijst opvullen. Bij verwerking kunt u de elementen bewerken met de methoden en eigenschappen van de verzameling Listbox. Om bij het ontwerpen een aantal elementen in de list box te laden, gat men tewerk in de eigenschappen. Bij properties zoek men de eigenschap ListItem en drukte men op de drie puntjes. Daar kan men met de String Collection Editor een aantal items toevoegen. Voor het invoegen bij werking zal men de verschillende methoden veder in de cursus bespreken MultiCollum Een Listbox kan de elementen in verschillende kolommen weergeven, door de eigenschap multicollums op true te plaatsen. Het probleem echter is dat men niet kan bepalen waar die columns verschijnen. Gebruik deze eigenschap enkel voor een relatief klein aantal elementen SelectionMode Met deze eigenschap zullen we bepalen hoe de elementen in de lijst kunnen geselecteerd worden. De keuzen daarin zijn: waarden None One (Standaard) Beschrijving geen keuze toegelaten één element kan geselecteerd worden 48
49 MultiSimple MultiExtended Eenvoudige meervoudige keuze. Een muisklik selecteert of heft de selectie op. U moet op alle elementen klikken die u wilt selecteren Met deze kan men de methodes van Windows gebruiken bij selectie. Dat wil zeggen gebruik van de short buttons mogelijkheden Sorted (gesorteerd) Het is mogelijk om elementen toe te voegen in een listbox of combox. Om deze echter op de juiste plaats toe te voegen gaan we gebruik maken van de sorteer mogelijkheid. Dit kan voor de ontwikkelaar een ontlasting zijn van een behoorlijke taak om al de gegevens op orde te houden. De sortering gebeurt volgens de geldende principes. Let wel op dat de inhoud van een object steeds een string is, dus 10 verschilt van 10. Methoden van sortering: 1 (001) 5 (005) AA Aa aa BA ba Hoofdletters komen voor de gelijkwaardige kleine letters. Er is echter 1 schaduwkant aan het gesorteerd opvullen. Het neemt behoorlijk veel tijd in beslag. Daarom zal men eerst de gegevens toevoegen ongesorteerd en dan de eigenschap op true zetten. Dit houdt in dat er nadien gesorteerd wordt. Wat de tijd binnen de perken houd Text Dit levert de geselecteerde tekst op uit het besturingselement. 49
50 9.2 de basismethoden en gemeenschappelijke elementen De verzameling Items De elementen die zich in een listbox bevinden zijn leden van een verzameling onderwerpen (wiskunde). Men kan elementen toevoegen maar ook verwijderen Count (eigenschap) Met deze eigenschap zal men bepalen hoeveel elementen in de verzameling zitten. Wordt gebruikt als: ListBox.Items.Count SelectedIndex. Met deze eigenschap vraagt men het volgnummer van het geselecteerde deel op. Let wel het eerste item heeft nummer 0. Daardoor zal het index nummer van et laatste altijd 1 minder zijn dan het totale aantal. Om het laatste te selecteren kan men volgende uitdrukking gebruiken: ListBox.SelectedIndex = ListBox.Items.Count -1. Is er echter gen element geselecteerd of zijn er geen elementen aanwezig, dan geeft de SelectedIndex de waarde -1. Dit kan belangrijk zijn bij programmatie zie volgend voorbeeld: if ListBox.SelectedIndex = -1 Then MsgBox( U dient wel een element te selecteren ). Dit kan men nodig hebben als men wil deftig programmaren. Uiteindelijk is het verschil tussen amateurs en professionals de wijze hoe men omgaat met de gebruiker en hoe men mogelijke fouten, gemaakt door Jan met de pet, kan opvangen Add, Insert (method) Als men wil elementen toevoegen aan de lijst gebruikt men de methode add ListBox.Items.add( naam ) of met de methode Insert. ListBox.Items.Insert( naam ) Met de Insert methode kan men tevens de plaats bepalen waar het item komt. fig
51 De code: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim teller As Integer For tellet = 1 To 5 ListBox1.Items.Add(TextBox1.Text) Next Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ListBox1.Items.Insert(ListBox1.Items.Count - 1, TextBox1.Text) In eerste instantie zal in de lsibox het woord dat men in de tekstbox schrijft 5 maal verschijnen als men op drude tekstbox en men drukt op nieuw zal dit woord toegevoegd worden, en wel na het einde van de reeds bestaande tekst. Natuurlijk als men direct op nieuw drukt na invoegen van een item in de tekstbox zal deze normaliter niet verschijnen SelectedIitem (eigenschap) De eigenschap ListBox.SelectedItem geeft de inhoud aan van het geselecteerde element. Onderstel dat we in de vorige lijst een woord selecteerd dan zal dat woord in listbox1.selecteditem zitten fig. 20 We plaatsen op onze vorige form nog een label en een knop bij. Achter die knop plaatsen we volgende code: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Label1.Text = ListBox1.SelectedItem 51
52 Deze code zorgt ervoor als we een bepaald item selecteren in onze listbox dat deze verschijnt in het label Clear (methode) Deze zorgt ervoor dat we gans de listbox in 1 x ledig maken. ListBox.Items.Clear CopyTo (methode) Zorgt dat we degekozen Items copieren naar een bepaalde plaats. Liqstbox1.CopyTo(destination,Index) fig. 21 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim tabel(6) As String Label1.Text = ListBox1.SelectedItem ListBox1.Items.CopyTo(tabel, 0) MsgBox(tabel(2)) We zorgen voor bovenstaande vcode in ons vorig voorbeeld. Deze code zogt dat we de inhoud van delistbox copieren naar een tabel. In de message box laten we het 2 element zien uit dze tabel Remove, Remove At Met deze metodes kunne we welbepaalde onderdelen verwijderen uit onze listbox. We geven de indexwaarde als argument. 52
53 ListBox1.RemoveAt(indexnummer). Natuurlijk kunt u ookverwijderen met de item naam ListBox1.Iteme,s.Remove(Item) voeg toe verwijder Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ListBox1.Items.Add(TextBox1.Text) Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ListBox1.Items.Remove(TextBox1.Text) In een voorbeeld project maken we bovenstaande form. In deze kunnen we, volgens de code een aantal items toevoegen. We voegen de 3 namen te in de tekstbox plaatsen, en die logischerwijze ook voorkomt in de listbox verwijderen door de knop verwijder. Natuurlijk konden we dat ook als we de index van de naam gaven. 53
54 Laat ons eens een oefening bekijken met de listbox. De bedoeling is dat we elementen van een linker listbox naar een rechter listbox plaatsen. Maak twee listboxen, lstlinks en lstrechts. cmdtoevoegen, cmdhuidelement, btnclearall de kleine knoppen zijn LR1, LRA, RL, RLA. fig. 22 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load lstlinks.items.add("info") lstlinks.selectedindex = 0 Private Sub cmdtoevoegen_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtoevoegen.click Dim Nieuw As String Nieuw = InputBox("Nieuw element: ") If Nieuw <> "" And Not lstlinks.items.contains(nieuw) Then lstlinks.items.add(nieuw) lstlinks.selecteditem = Nieuw End If 54
55 Private Sub cmdhuidigelement_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdhuidigelement.click Dim huidigepositie As Integer If lstlinks.selectedindex > -1 Then huidigepositie = lstlinks.selectedindex lstlinks.items.removeat(huidigepositie) Call SelecteerItem(lstLinks, huidigepositie) End If Private Sub btnallclear_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnallclear.click If MsgBox("bent u zeker dat alle elementen mogen gewist worden?", MsgBoxStyle.Question _ + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Alle Elementen Wissen") = MsgBoxResult.Yes Then lstlinks.items.clear() End If Private Sub SelecteerItem(ByVal LstBox As ListBox, ByVal huidigepositie As Integer) Dim Aantal As Integer Aantal = LstBox.Items.Count If Aantal > 0 Then If huidigepositie <= Aantal - 1 Then LstBox.SelectedIndex = huidigepositie Else LstBox.SelectedIndex = Aantal - 1 End If End If Private Sub cmdlr1_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdlr1.click Dim huidigelement As Integer If lstlinks.selectedindex > -1 Then lstrechts.items.add(lstlinks.selecteditem) lstrechts.selecteditem = lstlinks.text huidigelement = lstlinks.selectedindex lstlinks.items.removeat(lstlinks.selectedindex) Call SelecteerItem(lstLinks, huidigelement) End If Private Sub cmdrl_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdrl.click Dim huidigelement As Integer If lstrechts.selectedindex > -1 Then lstlinks.items.add(lstrechts.selecteditem) lstlinks.selecteditem = lstrechts.text huidigelement = lstrechts.selectedindex lstrechts.items.removeat(lstrechts.selectedindex) Call SelecteerItem(lstLinks, huidigelement) 55
56 End If Private Sub cmdlra_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdlra.click Dim Element As Object For Each Element In lstlinks.items lstrechts.items.add(element) Next lstlinks.items.clear() If lstrechts.selectedindex = -1 And lstrechts.items.count > 0 Then lstrechts.selectedindex = 0 End If Private Sub cmdrla_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdrla.click Dim Element As Object For Each Element In lstrechts.items lstlinks.items.add(element) Next lstrechts.items.clear() If lstlinks.selectedindex = -1 And lstlinks.items.count > 0 Then lstlinks.selectedindex = 0 End If. We hebben hier een paar nieuwigheden in ontdekt. 1. Call Methode statement: dat gebruiken we als we een methode in onze staements willen oproepen. Let wel we maken ook gebruik van ByVal en ByRef mogelijkheden. 2. De Contains eigenschap wordt gebruikt om alle elementen van de listbox tegelijkertijd aan te spreken 3. Met Count bepalen we hoeveel elementen er in de lijst zijn.. De rest legt wel een beetje zich zelf uit Zoeken Een goede eigenschap van deze listbox is dat we elk element in de lijst kunnen opsporen. We gebruiken daarvoor de methoden FindString en FindStringExact. Beide methoden accepteren een tekst als argument (wat men opzoekt) en als tweede de index waar de zoekactie begint. Let op, geen van beiden zal onderscheid maken in hoofd- of kleine letters. 9.3 Checked Listbox De checked listbox is analoog aan de gewone listbox. 56
57 Het enige wat een beetje uit de band springt, is het uitzicht. fig. 23 We vullen deze listbox bij in Collection0. We letten er wel op dat we de mogelijkheid tot aanvinken geplaatst hebben (geen default). Dit door de eigenschap CheckOnClick op True te plaatsen. Om alle item aan te duiden kunnen we volgende code gebruiken Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Teller As Integer For Teller = 0 To chklst.items.count - 1 chklst.setitemchecked(teller, True) Next 9.4 De ComboBox Deze gedraagt zich nagenoeg hetzelfde als de Listbox. Terug zit het verschil hem n het uitzicht. Er bestaan3 stijlen, namelijk a. DropDown: de gebruiker moet op het driehoekje klikken om de list te zien fig. 24 b. DropDownStyle Simple 57
58 fig. 25 In dit geval ziet de gebruiker de lijst en kan hij er eventueel nog items bijvoegen c. DropDownStyle = DropDownList fig. 26 Hier moet zoals bij de eerste op het driehoekje geklikt, worden om de lijst uit te klappen. Het verschil is hier dat een waarde van de gegeven waarden in de lijst moet gekozen worden 58
59 Hoofdstuk 10 Array s (Tabellen) In VB.net gebruiken we tabellen met vaste grootte (Fixed-size) en met dynamische grootte (dynamic-size) Fixed Size declareren Tabellen worden gemaakt( gedeclareerd) op de zelfde wijze zoals men gewone variabelen declareert. Zoals gewoonlijk zullen we de scope (plaats)waar de tabel wordt gebruikt aanduiden. Algemeen doen we dat volgens onderstaand schema Statement Naam van de tabel Gegevens Type Aantal Dimensies aantal elementen beschrijving naam gebruikt om de tabel aan te duiden. TabelNamen zijn hetzelfde als de namen van variabelen met de zelfde eigenschappen zoals in variabelen kan je ook alle soorten gegevens typen declareren. Het is volstrekt mogelijk een object type te implementeren in en tabel hier bepaal je het aantal dimensies dat je tabel zal bevatten. Als we spreken van een tabel met 1 dimensie wordt dikwijls gerefereerd naar een lijst. Een tabel heeft meestal meerdere dimensies. Zoals 2 en eventueel een meer wiskundig gespecificeerd van 3 dimensies of hoger. het aantal elementen welke uw tabel bevat komt overeen met de index. De array index in Visual Basic dot net begint steeds vanaf 0, zoals in de meeste object georiënteerde talen De reden om het een fixed size tabel te noemen is dat er een vast aantal elementen als grootte voorzien wordt De basis notatie voor een array is: 59
60 Dim ArrayNaam (index, index) As DataType - Dim (dimensioneren) declareert normaal de variabelen alsook de tabel. Gebruik Public als u werkt met een Module (zie later) - ArrayNaam is de naam van de variabele als array - Index dit bepaald het aantal elementen van de tabel. Dit is de bovengrens van de tabel. Een tabel start altijd vanaf 0. Meerdere indexen geven meerdere dimensies aan onze tabel - DataType in overeenstemming met de soort van gegevens dat opgeslagen wordt in de tabel. VB.: Dim gebruikers(10) As String Dim aantalmensen(10, 5) As Integer Bovenstaande zijn de normaledatatypen die we gebruiken voor de normale variabelen. Dim aantalvelden(5) As TextBox Bij deze zien we dat we ook objecten kunnen plaatsen in een tabel opvullen van de tabel met vast index. Dim gebruikers(10) As String gebruikers(0) = "Jan" gebruikers(1) = "Pol" gebruikers(2) = "Mieke" gebruikers(3) = "Anne" in bovenstaand voorbeeld zie je dat we een tabel van strings bij declaratie reeds kunnen opvullen. We moeten wel rekening houden met de dimensie van de tabel als we deze opvullen. In bovenstaad geval als we gebruikers(11) wille declareren zullen we een out of bounds fout maken. Dat wil zeggen dat de waarden de dimensie van de tabel overschrijdt. Bekijk volgende code: Public Class Form1 Dim temp(6) As Single Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Private Sub cmdvul_click(byval sender As System.Object, ByVal e As System.EventArgs) 60
61 Private Sub cmdtoon_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtoon.click Dim resultaat As String Dim i As Short Dim totaal As Single = 0 resultaat = "week temperaturen" & vbcrlf For i = 0 To UBound(temp) resultaat = resultaat & "dag " & (i + 1) & vbtab & temp(i) & vbcrlf totaal = totaal + temp(i) Next resultaat = resultaat & vbcrlf & "gemiddelde temperatuur" & _ Format(totaal / 7, "0.0") txttemperatuur.text = resultaat Private Sub cmdvul_click_1(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdvul.click Dim Prompt, Titel As String Dim i As Short Prompt = "geef de dag temperatuur" For i = 0 To UBound(temp) Titel = "dag " & (i + 1) temp(i) = InputBox(Prompt, Titel) Next End Class Dit geeft een input box als drukt op vul. En onderstaande figuur geeft dit als drukt op toon. fig
62 fig. 28 Er zijn nog bepaalde zaken die ons niet bekend in de oren klinken, zoals: Format: dit geeft de mogelijheid onze string van getallen te formateren. Later gaan we daar nog veel op terug komen. In feite maakt die dat het getal welke we tonen in vormgeformateerd is. Let wel dat gaat enekl voor het tonen getallen in de vorm van string. We weten ook dat we daar niet kunnen met rekenen. Immers het is een string. Ubound = het hoogste getal van de index ook upperbound genoemt. Door dit te gebruiken zullen we steeds het maximum aantal van elementen aanspreken volgens de index. Dit is echter meer van belang als we werken met dynamische tabellen. Dit was een voorbeeld van een tabel met vaste indexwaarde. Het zou nu handig zijn als we niet gebonden zijn door de dimensie van de index, maar dat we die vrijelijk kunnen aanduiden. Dit kan opvullen van een tabel met veranderlijke index (dynamische) In dit geval zullen we de index laten afhangen van het aantal elementen welke we invullen. Een dynamische tabellen worden gemaakt bij runtime van het programma. We zullen dit doen las we niet direct weten hoe groot onze tabel moet zijn. We kunnen steeds een te grote tabel declareren, maar dan gaan we onnodig geheugen bezetten, die we misschien verder in het programma nog nodig hebben. 62
63 Public Class Form1 Dim temp() As Single Private Sub cmdtoon_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtoon.click Dim resultaat As String Dim i As Short Dim totaal As Single = 0 resultaat = "week temperaturen" & vbcrlf For i = 0 To UBound(temp) resultaat = resultaat & "dag " & (i + 1) & vbtab & temp(i) & vbcrlf totaal = totaal + temp(i) Next resultaat = resultaat & vbcrlf & "gemiddelde temperatuur" & _ Format(totaal / 7, "0.0") txttemperatuur.text = resultaat Private Sub cmdvul_click_1(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdvul.click Dim Prompt, Titel As String Dim i, dagen As Short dagen = InputBox("hoeveel dagen", "maak tabel") If dagen > 0 Then ReDim temp(dagen - 1) Prompt = "geef de dag temperatuur" For i = 0 To UBound(temp) Titel = "dag " & (i + 1) temp(i) = InputBox(Prompt, Titel) Next End Class Met de eerste InputBox gaan we bepalen hoe groot onze tabel moet zijn. fig. 29 Na dat dit gebeurd is kunnen we de normale werkwijze van voordien volgen. Het leuke ervan is dat er maar temperaturen gevraagd worden zo veel als bepaald in onze vorige vraag. Dit organiseren we door onze tabel te herdimensioneren met het statement Redim. Het moment dat we in onze code het statemen DIM tabelnaam() gebruiken, zullen we een plaats maken voor de tabel. De tabel echter heeft de grootte van het geheugen. Door het gebruik 63
64 van Redim zullen we de tabel een andere grootte geven, gepast aan onze vraag. Merk op dat de grootte steeds gelijk is aan het aantal -1. Immers we beginnen vanaf Inhoud van de tabel bewaren met Redim Preserve Door Redimensionering zullen we de grootte van onze tabel verliezen. Immers door Redim zal de inhoud van de tabel onherroepelijk op nul geplaatst worden. Het kan soms mogelijk zijn dat we de grootte van de tabel moeten blijven behouden. Er bestaat een statement waarbij we dit ook kunnen bewaren. Redim Preserve ArrayNaam(Index1,Index2) We kunnen dit statement goed gebruiken om een tabel te vergroten met Redim zonder de inhoud van de vorige tabel te verliezen. Stellen we een tabel vast van 300 elementen: Dim kolen(300) Moet er nu onverhoopt een element bij gevoegd zijn dan kunnen we dit doen met Redim. Als we hetzelfde willen doen zonder het verliezen van onze vorige gegevens zullen we Redim Preserve kolen(400) gebruiken en zo kunnen we 401 elementen maken en onze vorige niet verliezen Werken met objecten Een verzameling is een groep gerelateerde objecten. Ieder object heeft zijn eigenschappen. Het is wel logisch dat we spreken van objecten die van hetzelfde soort zijn Om te verwijzen naar de objecten zorgen we dat de index wijst naar de objecten zelf. Dim i as Integer For i = 0 to 3 MsgBox(Controls(i).Name) Next i 10.2 Lussen Voor het vullen van onze tabellen zullen we meestal lussen gebruiken. Lussen (iteraties) kennen we uit alle vorige programmeertalen. We hebben Zolang lus, de Herhaal lus en de for lus For Each lus. 64
65 Een ander lus is de For Each.. Next. Dat gaan we meestal gebruiken voor objecten. Daardoor zullen we alle objecten bekijken. Maak een formulier met 3 knoppen. fig. 30 Zorgvoor de opschriften als in de figuur 30. Klik twee maal op knop 1 en vul de volgende code in Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For Each ctrl In Controls ctrl.text = "klikklak" Next We zullen zien als we klikken op de knop, alle knoppen zullen het opschrift klikklak krijgen Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For Each ctrl In Controls ctrl.left = ctrl.left + 25 Next Private Sub cmdtwee_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtwee.click For Each ctrl In Controls ctrl.left = ctrl.left - 25 Next Bekijk deze code. Daarin zien we dat de knoppen allemaal terug op hun plaats schuiven 65
66 Hoofdstuk 11 ScrollBar, TrackBar 11.1 ScrollBar Met een scrollbar is het mogelijk een numerieke (Integer) reeks visueel voor te stellen. De scrollbar bestaat in een horizontale (HScrollBar) en een verticale (VScrollBar) Eigenschappen Value Large Change Snall Change fig. 31 Minimum: minimumwaarde van het besturingselement. Standaard = 0 Maximum: maximumwaarde van het element. Standaard ingesteld op 100. Omdat de waarde integer is kan het maximum waarde oplopen tot Value: huidige waarde van het element. Afhankelijk van de slider plaats. SmallChange waarde die af of toeneemt bij het drukken op de pijltjestoetsen van de scrollbar LargeChange: waarde die toeneemt als men in et midden van de scrollbar klikt. RightToLeft: (enkel bij het horizontale): bepaald het minimum waarde visueel voorgesteld door het blokje rechts te plaatsen i.p.v links welke standaard is. Maak als voorbeeld een nieuw project aan. Plaats een picturebox en 4 horizontale scrollbars op het formulier. Het is de bedoeling dat u met de 4 bars de achtergrondkleur van de picture box bepaalt. 66
67 fig. 32 hsrhelderheid, Min = 0 Max = 255, value = 255 hsrrood, hsrgroen, hsrblauw: min 0, max 255 value=0 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call KleurPic() Private Sub ScrollKleurbalken(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _ Handles hsrhelderheid.scroll, hsrrood.scroll, hsrblauw.scroll, hsrgroen.scroll Call KleurPic() Private Sub KleurPic() pctkleur.backcolor = Color.FromArgb(hsrHelderheid.Value, hsrrood.value, _ hsrgroen.value, hsrblauw.value) End Class Door het verschuiven van de scrollbars zal de achtergrondkleur in de picturebox veranderen 67
68 Een handigheidje is het gebruik van de ToolTip. Voeg een tooltip toe aan uw form. U zult zien dat dit direct naar onder verhuist. Dat wil zeggen: het tooltip object werkt voor gans uw formulier. Wijzig de naam in ToolTip en zet de eigenschap AutomaticDelay op 0. Voeg volgende code toe aan uw code voor scrollkleurbalken Private Sub ScrollKleurbalken(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _ Handles hsrhelderheid.scroll, hsrrood.scroll, hsrblauw.scroll, hsrgroen.scroll Call KleurPic() ToolTip.SetToolTip(sender, sender.value) Bij het runnen van de kleurbalken programma zult u opmerken dat steeds als u de value veranderd de warde in een tooltip zal verschijnen. De set tooltip methode heeft 2 parameters: de eerste is het object waaraan de tooltip dient gekoppeld te worden, het tweede is de tekst die in de tooltip zal verschijnen. Dus de eerste is het object (1 van de scrollbars) en de tweede is de waarde van de schuiver op dat moment. Leuk om te weten De Trackbar Deze is volledig conform aan de scrollbar, hij oogt enkel een beetje moderner. Een eigenschap die erbij komt echter is de tickstyle en tickfrequency TickStyle none TopLeft BottomRight Both fig Orientation 68
69 Dit is de wijze waarop het tevoorschijn komt op het scherm. Voorbeeld: Deze oefening is op zich niet moeilijk. Ontwerp een nieuw project en plaats in het formulier een TrackBaar trbfont, en een tekst veld txtfont. Bekijk onderstaande code Public Class frmfont Private Sub frmfont_load(byval sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim aantalfonts As Integer aantalfonts = System.Drawing.FontFamily.Families.GetUpperBound(0) txtfont.text = aantalfonts + 1 trbfont.minimum = 0 trbfont.maximum = aantalfonts Private Sub trbfont_scroll(byval sender As System.Object, ByVal e As System.EventArgs) Handles trbfont.scroll On Error Resume Next txtfont.text = System.Drawing.FontFamily.Families(trbFont.Value).Name txtfont.font = New System.Drawing.Font(txtFont.Text, 12) End Class Met deze code zal men zorgen dat bij verschuiving van de slider men de verschillende soorten op uw computer bestaande fonts krijgt in het tekst veld. Het Font Object waar we gebruik van maken is vrij ingewikkeld en gaan we terdege bekijken in één van de volgende hoofdstukken. Het zorgt dat we uit onze computer de verschillende fonts kunnen oproepen en laten zien. 69
70 Hoofdstuk 12 Formulieren en Menu s We kennen reeds de gebruiken van microsoft omgevingen. De programma s, waaronder ook dit, maakt gebruik van menu s om de navigatie door het programma te vergemakkelijken. In dit hoofdstuk zullen we leren gebruik maken van deze eenvoudige mogelijkheid. Het is tevens mogelijk, als één van de acties, verschillende formulieren te maken in ons project Het menu. We maken een nieuw project en in het bijpassend formulier zullen we een menu plaatsen. Daar gaan we als volgt voor tewerk: 1. We maken een formulier en noemen het frmmenu. We geven het de titel Voorbeeld. 2. In dat menu plaatsen we vanuit onze toolbox het object MenuStrip (mnsstrip1). We zien dat ogenblikkelijk dat object onderaan ons werkpositie gaat. Et zelfde dat we tegen kwamen met ons object van de fonts (zie vorig hoofdstuk). Ook zoals in vorig hoofdstuk, zal dit object dan ook zijn invloed hebben over gans het project. Bij formulier zien we een blauwe balk verschijnen op het formulier met een mogelijke plaats voor iets in te vullen. Als we op deze plaats komen zien we een uitvouw menu met verschillende mogelijkheden. Deze zullen in later stadia besproken worden. blauwe balk invulmogelijkheid fig We gaan ook een paar andere formulieren creëren. Dit gebeurt met behulp van het menubalk onderdeel project van ons programma. Bij aanduiden van add Window de volgende figuur, waarin we op een nieuwe Windows form drukken. 70
71 fig. 35 nieuwe form Door daarop te drukken introduceren we terug een nieuwe windows form in ons project die we direct de juiste benaming geven (frmnieuw). Het idee van gans de zaak is nu dit formulier te laten verschijnen in ons project, in eerste instantie door gebruik te maken van ons menu welke we juist geplaatst hebben. 4. Door het plaatsen van onze muiswijzer op Algemeen, ons eerste menu item die we de naam geven mnualgemeen zien we ernaast, dus op het zelfde niveau, een ander hokje verschijnen en er onder lager niveau ook een hokje verschijnen. Deze op hetzelfde niveau noemen we sibling en dit op het niveau lager child. In het child niveau plaatsen we Nieuw en noemen we in de properties smunieuw. Dit komt van submenu. Als we iets benoemen op het sibling niveau geven we dit een naam met prefix mnu. Uiteindelijk krijgen we dan volgende figuur fig
72 12.2 Formulieren We hebben voorheen een nieuw formulier gemaakt. Zoals het nu is zien we dit formulier niet als we ons project laten werken. Dit doordat het aangesproken figuur het eerste formulier is. Daar kunnen we echter iets aan veranderen. Willen we bijvoorbeeld iets aan het nieuw formulier veranderen en we willen dat zien wat we gedaan hebben door het eens te laten runnen moeten we iets veranderen aan ons programma. fig. 37 naam van het formulier te zien bij opstarten Bovenstaand figuur bekomen we als we in ons programma menu naar project properties van het project gaan. Dar kunnen we zelf bepalen met welk formulier we willen et project opstarten. Dat is gevaarlijk in die zin dat men bij het laten werken van et programma men niet mag vergeten teug naar het oorspronkelijk formulier te gaan. Anders kan men rare dingen tegen komen. Normaal doet men dat niet maar het is mogelijk en soms wenselijk als je iets wil veranderen aan een formulier. Het idee was echter om het formulier te laten verschijnen door onze code in het menu. In tegenstelling met VB6 laten we nu niet het formulier zien maar een copy van het bestaande formulier. Het is mogelijk verschillende copijen van hetzelfde formulier te maken. In object georiënteerd programmeren is dit de werkwijze, omdat een formulier een alleen staand object is. Bij grote programma s is het mogelijk, en zelfs denkelijk dat we verschillende copijen van verschillende formulier hebben en zodoende een nefast effect hebben op de computer en zijn geheugen. Het kan dus mogelijk zijn dat de computer vertraagd en zelf vast loopt door het te groot aantal formulieren in zijn geheugen. Daarom gebruiken de object georiënteerde talen een eigenschap namelijk garbagecollector. Deze vuil ophaler heeft de functie om niet gebruikte copijen van objecten op te ruimen. In MS echter gebeurt dat, voor het ogenblik, nog niet automatisch en moeten we dat naderhand zelf activeren, maar later meer daarover. 72
73 We gaan terug naar ons begin formulier en staan op het submenu Nieuw en zorgen voor het coderings venster. En plaatsen daar onderstaande code: Private Sub smunieuw_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles smunieuw.click Dim test As New frmnieuw test.show() Hierin zien we dat we dat we beginnen met een initiatie volgen het woord Dim Dit dimensioneren zal er voor zorgen dat we de naam test toevoegen aan een copij van het bestaande formulier frmniew en dat door het code woord New. Eens deze copij gemaakt kunnen we dit tonen aan de gebruiker met de functie show(). Het is evident dat we voordat het in gebruik nemen van het formulier dit kunnen voorzien met de nodige code en functies. Het voordeel is dat we hetzelfde formulier of althans copijen van dit formulier kunnen gebruiken Plaatsen van gegevens vanuit het ene formulier naar het andere Om dit aan te tonen zullen we twee formulieren, volgens de bekende wijze aanmaken. We noemen het eerste frmeerste en logischer wijze het tweede frmtweede. Op het eerste plaatsen we een knop en een text veld. Op het tweede plaatsen we een knop en een label veld fig
74 Het idee is nu om een tekst uit het eerste formulier te laten zien op het tweede. Dit gebeurt door op de knop transfer te drukken. Werkwijze: Met de knop op het eerste form roepen we het tweede form op zoals we voordien gezien hebben Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim toon As New frmtweedeform toon.show() In de tweede form, met de tweede knop zullen we de tekst in het tekstveld naar het label veld transfereren op volgende wijze: Private Sub cmdtransfer_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtransfer.click lbltoon.text = frmeerste.txteersteform.text In feite is het een heel eenvoudige methode. We hoeven enkel de benaming van de vorige form aan te geven om de form te betrekken in onze code. Door het aangeven vandeze naam zullen we alle objecten van die form kunnen gebruiken. Bekijken we eens volgende aanpassing: fig
75 We hebben een aanpassing gedaan aan de tweede form. Namelijk we hebben een tekst veld bijgevoegd. De reden hiervan is we willen een getal in het eerste form invoegen. Na drukken op de knop en verschijnen van de tweede form gaan we ook in dit form een getal invoegen. Na drukken op de knop zullen we de som van de getallen zien in het label veld. Gemakkelijk denkt u en u hebt gelijk. Bekijk de code Private Sub cmdtransfer_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdtransfer.click lbltoon.text = Val(frmeerste.txtEersteForm.Text) + Val(txtTweedeForm.text) Daar we werken met een berekening, moeten we numerieke waarde maken van de inhoud van de tekstvelden. Dit gebeurt met Val. Nadien zien we dat we gewoon de twee velden moeten optellen. Met deze methode kunnen we ook de inhouden van objecten uit andere form overbrengen. 75
76 Hoofdstuk 13 Klassen (Deel 1) 13.1 Wat is een klasse Een klasse wordt in object georiënteerd programmeren hoog in het vaandel gedragen. Immers het moment dat u een project opent werkt u al met klassen. Ik heb juist een nieuw project geopend. Onderstaand is de code van het eerste formulier: Bemerk dat we direct spreken van een klasse. Een klasse is een programma dat net autonoom werkt maar gebruikt wordt dor een ander programma. De klasse zelf wordt nooit gebruikt, enkel een kopie ervan. Deze kopie heeft dezelfde functionaliteit als de klasse zelf, en heeftdusdanig dezelfde properties(eigenschappen), methodes enz. Uit bovenstaande kan men afleiden dat alles wat men doet in VB.net en andere object georiënteerde talen (Java, c.net..enz) is in klasse. Voor de personen die nog geprogrammeerd hebben in VB6 zal hier het grote verschil blijken. Het.net framewerk is een verzameling van klassen en u kunt elk van deze klassen importeren in uw applicatie. De klasse wordt gedeclareerd in uw toepassing als variabele van het specifieke type van de klasse en gebruikt. Als u met een variabele van het type van de klasse werkt, kunt u de functionaliteit van deze klasse gebruiken langs deze variabele. Zelfs de basale datatypes van deze klasse worden toegepast in deze zoals klasse.system.integer, System.double, enz. Immers als u een bvb een variabele van het type Integer declareert doet u niets anders dan een instantie van de klasse Integer aanmaken en kunt u de eigenschappen van deze klasse gebruiken met behulp van de klasse. Het is echter zeer moeilijk om al de voor en nadelen van een klasse te beschrijven. Het zal gemakkelijker zijn om dit aan den lijve te ondervinden zelf een klasse ontwerpen maken van de klasse - open een nieuw project (prjmaakklasse). 76
77 fig klik op het menu project Add Class. fig. 41 Daarin klik je op het icoontje Class. Vergeet niet een naam in te vullen onderaan het menu scherm fig. 42 Na het drukken op Add zal je opmerken dat in de Solution Explorer een bestand bijkomt met de naam die je aan de klasse gegeven hebt. Tevens zal er een code venster voor deze klasse gemaakt worden. fig. 43 Alhoewel de klasse voor het ogenblik niets doet bestaat hij reeds en is hij actief. Plaats op uw formulier een knop en dubbelklik daarop. U zult in de event handler komen van die knop. Maak een variabele A aan en u zult zien op dit moment zal in de autolist al de klasse test aanwezig zijn. Echter u mag niet vergeten als u een instantie van die klasse wilt 77
78 aanmaken zal je moeten werken met het sleutelwoord New (zie ook met de formulieren) Immers het formulier is ook een klasse fig Toevoegen van Properties & methoden aan de klasse Laat ons even terug komen in de klasse test. Hier gaan we een publieke variabele toe met naam Inhoud fig. 45 Deze publieke variabele gedraagt zich als een eigenschap van de klasse test. We kunnen dit testen. Daarvoor keren we even terug naar ons origineel formulier met de opdracht knop. Als we daar A instantie van de klasse test maken en we kijken naar de eigenschappen van die klasse zien we dat Inhoud zal verschijnen fig. 46 Men zal Inhoud bemerken als men het punt na de variabele van hert type tekst plaatst, wat aanduid dat het weldegelijk een eigenschap van de gemaakte klasse is. fig
79 Men kan opmerken dat Inhoud in feite niets anders is dan een opslag plaats van informatie, met dezelfde functie van een gewone variabele. Na deze opdracht zal er in A.Inhoud de tekst probeersel zitten. Na het invoegen van de eigenschap Inhoud gaan we een methode in de klasse toevoegen. In feite is een methode niets anders als een algoritme (stuk programma) die bij het object hoort. Bij voorbeeld de methode ToString, die een variabele omzet naar een String type, kunnen we gebruiken in de klasse. We gaan nu een methode toevoegen aan onze klasse. Namelijk de klasse KeerOm. Met deze methode is het de bedoeling een ingebrachte zin om te keren en af te beelden, dus ABC zal CBA worden We gaan terug naar onze klasse en maken de declaratie voor onze methode KeerOm. Public Inhoud As String Public Function Keerom() As String fig. 48 Deze methode zal niets anders doen dan de string welke we inbrengen omdraaien en is in feite niets meer dan een functie in de klasse. We voegen onderstaande code in deze functie Public Inhoud As String Public Function Keerom() As String Dim teller, lengte As Integer Dim nieuw As String lengte = Inhoud.Length - 1 For teller = lengte To 0 Step -1 'aftellen nieuw = nieuw & Inhoud.Substring(teller, 1) Next Return nieuw End Function fig. 49 Keer nu terug naar de opdracht knop ( eerste form) en plaats volgende code Private Sub cmdkeerom_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdkeerom.click Dim a As New clstest 'een instantie van de klasse a.inhoud = "dit is een probeersel" MsgBox(a.Keerom()) fig
80 Druk nu op de knop en bekijk het effect, het volgende zal verschijnen fig. 51 Met deze merken we op dat we op kunnen gebruik maken van een methode (functie) in onze klasse Toevoegen van een property Maken we nog en classe in onze form en noemen dit clsgetal. Dit doen we op de voorheen geziene methode. In deze klasse declareren we een variabele inhoud van het type Double en maken een eigenschap die de waarde van inhoud verdubbeld. Public Class clsgetal Public inhoud As Double Public Function Verdubbel() As Double Return inhoud * 2 End Function End Class fig. 52 We plaatsen een tweede opdracht knop op ons formulier en geven dit de volgende code Dim a As New clsgetal a.inhoud = 3.14 MsgBox(a.Verdubbel())fig. 53 fig. 54 U ziet dat alles perfect verloopt. Er komt echter 1 probleem te voorschijn, namelijk als de programmeur een tekst zou plaatsen in de plaats van een getal. Dit zal niet steeds een fout geven bij het invoeren van een code maar telkens als men deze methode wil gebruiken zal een fout (fig 55) verschijnen. 80
81 fig. 55 We krijgen ongeveer zoiets op het scherm. Omdat in de real World klasse en programma s meestal op verschillende plaatsen gecodeerd worden, welke niet altijd op dezelfde geografische plaats is, immers door I-net is de wereld maar een dorp kan dat voor problemen zorgen. Volgens de spreuk: er is echter geen zo klein probleem of er bestaat een oplossing voor hebben ze er het volgende op gevonden. Voorheen hebben we gezien dat we een eigenschap in een klasse maakt door simpel een publieke variabele te declareren. In dit geval verliest men de controle over wat er in de klasse zal terecht komen. Daarvoor is het aangewezen te werken met property- procedures Een voorbeeld dringt zich op. Verwijder de publieke variabele in klasse clsgetal en we maken in de plaats een private variabele van (enkel geldig in die klasse). Deze zal zich dan ook niet manifesteren als een eigenschap van die klasse Public Class clsgetal Private prinhoud As Double fig. 56 Bemerk dat we de variabele het prefix pr geven, dit om aan te duiden dat het om een private variabele in een klasse gaat Vervolgens maken we een property procedure aan onder deze variabele. Het moment dat we dat doen zal er een sjabloon verschijnen. 81
82 Public Class clsgetal Private prinhoud As Double Property inhoud() As Double Get End Get Set(ByVal value As Double) End Set End Property End Class fig. 57 We zien dat dit sjabloon uit twee gedeelten bestaat. Een Set en een Get gedeelte. Als de programmeur van uit zijn code iets wil toekennen aan deze property procedure zal hij dit doen in het Set gedeelte. Het op vragen van de inhoud van de procedure gebeurt door het Get gedeelte. Public Class clsgetal Private prinhoud As Double Property inhoud() As Double Get verdubbel = prinhoud End Get Set(ByVal value As Double) prinhoud = value End Set End Property End Classfig. 58 Maken we nu een textvak bij op onze form en noemen we deze txtvulin. We willen nu een klasse maken met een methode dat de inhoud van dit veld verdubbeld. Dim a As New clsgetal a.verdubbel = Integer.Parse(txtVulIn.Text) MsgBox(a.verdubbel()) fig. 59 we plaatsen bovenstaande code onder onze knop. In onze klasse zetten we volgende code Public Class clsgetal Private prinhoud As Double Property verdubbel() As Double Get verdubbel = prinhoud End Get 82
83 Set(ByVal value As Double) prinhoud = value * 2 End Set End Property End Class fig. 60 Plaatsen we bij werking een getal in het tekstveld zal men zien dat dit getal verdubbeld. Bij het getal 36 zal men onderstaande uitslag krijgen fig. 61 Let wel dat er in de code ervoor gezorgd wordt dat het een geheel getal (Integer) wordt en geen woord(string). Dit is niet strikt noodzakelijk in dit geval omdat de inhoud van het tekstveld, weliswaar een string is maar behandeld wordt als integer. Als men dit niet doet kan dit echter wel voor problemen zorgen bij bewerkingen, maar later meer daarover. In onze property procedure maken we in het set gedeelte dat de waarde van onze private variabele de juiste waarde krijgt. Dit is de werkelijke reden van deze methodes. Laten we bijvoorbeeld er even voor zorgen dat we enkel positieve waarden kunnen hebben. Daarvoor zorgen we als volgt. Maak een formulier met volgend uitzicht fig. 62 Op dit formulier staat een tekstvak txtvulin en een knop cmdcontrole. We maken ook een klasse clscontrole. In deze klasse vullen we het volgende in: 83
84 Public Class clscontrole Private prinhoud As Double Property controle() As Double Get controle = prinhoud End Get Set(ByVal value As Double) If value < 0 Then value = -value End If prinhoud = value End Set End Property Public Function Verdubbel() As Double Return prinhoud * 2 End FunctionEnd Class fig. 63 Dit leidt tot een controle van de waarde welke we ingeven in het tekst vak. Om dit te verwezenlijken vullen we het volgende in bij de knop op het formulier Private Sub cmdcontrole_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdcontrole.click Dim b As New clscontrole b.controle = txtvulin.text MsgBox(b.Verdubbel) Merk op dat we hier de property procedure gebruiken om de waarde welke we invullen te controleren. Dit door in het set gedeelte de waarde op te vragen en zeker te maken dat dit positief wordt gebruik van exceptions in de property procedures Hoewel we nog geen gewag gemaakt hebben van exceptions lijkt het ons aangewezen om dit even hier kort aan te snijden. In et vorige voorbeeld hebben we gemaakt dat steeds een positief getal ingelezen wordt. Dat is mooi maar eigenlijk niet verstandig. Immers zo zal de gebruiker nooit weten dat hij een fout gemaakt heeft, met alle gevolgen van dien. Het is meer aangewezen om de gebruiker te laten weten dat hij iets fout gedaan heeft en zo zijn wijze van invullen kan verbeteren. Men kan dit op twee manieren, het ene beter dan de andere, doen. 1 ste wijze: Property controle() As Double Get controle = prinhoud End Get Set(ByVal value As Double) If value < 0 Then MsgBox("Waarde moet gelijk of groter zijjn dan0!" & _ 84
85 vbcrlf & "De waarde wordt op 0 ingesteld.", _ MsgBoxStyle.Exclamation, "FOUT") value = 0 End If prinhoud = value End Set End Property fig. 64 Hierbij laat je de gebruiker weten dat hij of zij iets fout gedaan heeft, het is echter geen goed idee een msgbox te laten starten vanuit een klasse. 2 de wijze Private prinhoud As Double Property controle() As Double Get controle = prinhoud End Get Set(ByVal value As Double) If value < 0 Then Dim AttExc As New ArgumentException Exception Throw AppExc Else prinhoud = value End If End Set End Property fig. 65 Met deze code zal je moedwillig en fout genereren, en je zorgt er tevens voor dat er een fout opvang geprogrammeerd wordt die een zinnige uitleg geeft voor de gebruiker. Deze fout opvang moet voorzen worden bij de event handler die de eigenschap controle vult (bij de form) Private Sub cmdcontrole_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdcontrole.click Dim b As New clscontrole Try b.controle = txtvulin.text Catch ex As Exception MsgBox("De gebruikte klasse heeft een fout gegenereed: " & _ ex.tostring, MsgBoxStyle.Exclamation, "FOUT") Exit Sub End Try MsgBox(b.Verdubbel) fig. 66. Dit geeft volgende uitslag bij het intikken van een negatief getal: 85
86 fig. 67 fig. 68 Natuurlijk is dit een voorbeeld van wat een fout zou kunnen doen. In object georiënteerd programmeren is het gebruik van exceptions een groot voordeel bij het aanduiden van fouten. Immers we maken gebruik van een eigenschap van het programma zelf. 86
87 Read-only eigenschappen. Het gebeurt frequent dat men objecten enkel kan lezen, maar dat men dat niet zelf kan instellen. Dat kan gebeuren op volgende wijze: Maak onder de klasse clscontrole een andere klasse datum, aan. fig. 69 Met behulp van property procedure maken we de eigenschap Geboortedatum aan fig. 70 We gaan nu de eigenschap Leeftijd toevoegen. Deze wordt berekend met behulp van de ingevoerde geboortedatum. De gebruiker kan de leeftijd wel consulteren maar NIET aanpassen (spijtig soms). Voeg onderstaande code toe onder de property procedure fig
88 Met de sleutelwoorden,readonly Property maakt u dus dit geheel ReadOnly. Merk op dat er geen set gedeelte aanwezig is. Dat is ook de reden, dat het enkel read only is. Er kan aan de aanroeper van de functie geen waarde meegegeven worden. Vervolgens maken we ook een eenvoudige functie die de ouderdom berekend in vergelijking met de huidige datum (jaar) die we oproepen met de functie NOW(). Aangezien het ook hier om een private functie gaat zal deze voor de gebruiker van de klasse onzichtbaar blijven. Nu zorgen we nog voor een aanpassing van ons formulier als volgt, we plaatsen een kop m en voegen onderstaande code toe Private Sub cmdouderdom_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdouderdom.click Dim d As New Datum d.geboortedatum = #10/6/1992# MsgBox(d.Leeftijd) fig. 72 Waar na bovenstaande figuur bij drukken van de nieuwe knop zal verschijnen. Wil men echter zelf een datum toe kennen zal er een fout aangegeven worden. 88
