Visual Basic 2005 is een waardige opvolger geworden van Visual Basic .NET 2003. Microsoft heeft veel tijd en energie gestopt in met name het gebruikersgemak van deze ontwikkelomgeving. Dit heeft geresulteerd in een uitgebreide, maar zeer doeltreffende IDE. In dit artikel laat ik u aan de hand van een praktijkvoorbeeld kennismaken met deze krachtige tool.
Wanneer ik ’s ochtends op kantoor kom en mijn notebook heb aangezet volgt eigenlijk altijd hetzelfde ritueel: Ik bekijk eerst het laatste nieuws op NU.nl, daarna bezoek ik de website van UserFriendly.org om de ‘daily cartoon’ te bekijken en vervolgens surf ik door naar Postbank.nl. Hier bekijk ik de laatste koersinformatie. Afhankelijk van de dag van de week, hoeveelheid werk of aantal telefoontjes bezoek ik eventueel ook nog diverse andere websites. Het zou echter mooi zijn dat alleen de informatie van al die websites, die voor mij relevant is, geconcentreerd zou worden op één pagina. Een uitdaging waaraan we in dit artikel gestalte gaan geven. Ook ú kunt proberen deze applicatie te bouwen met Visual Basic 2005. Deze tool bevindt zich op de meegeleverde CD en kan op uw systeem geïnstalleerd worden.
Wat moet ons programma kunnen?
Laten we eens een opsomming maken van de specificaties van ons programma. De applicatie moet een html pagina kunnen tonen. Daarnaast zouden we op eventuele links moeten kunnen klikken en de pagina onder de link moeten kunnen bekijken. We moeten ook terug of juist verder kunnen bladeren in de navigatiehistorie. Het zou prettig zijn wanneer de controls automatisch ‘resizen’. Als laatste is het natuurlijk ook belangrijk dat we het programma netjes kunnen afsluiten.
Interface
Het programma moet een menu ‘Bestand’ hebben met één item, namelijk ‘Afsluiten’. Daaronder moet een knoppenbalk komen met de volgende drie knoppen: ‘Vorige’, ‘Volgende’ en ‘Vernieuwen’. Onder de knoppenbalk moet, net als in de Microsoft Internet Explorer, het gedeelte komen waarin de html pagina getoond wordt. Om het geheel af te maken moet onder in het scherm een statusbalk komen waarin we geïnformeerd worden over de huidige activiteit van het programma. We gaan starten met het bouwen van deze interface.
Wanneer Visual Basic 2005 is opgestart wordt u verwelkomt met de ‘Start Page’. Aan de linkerzijde treft u een lijst aan van laatst geopende projecten. Vanuit dit kader kan men tevens een project openen of nieuwe projecten aanmaken. We kiezen voor de optie: ‘Create Project’. In het dialoogkader dat verschijnt kunt u verschillende type projecten kiezen. U kiest voor een ‘Visual Basic - Windows Application’. Standaard krijgt een project van dit type de naam: ‘WindowsApplication1’. Dit wijzigt u in ‘MijnOchtendkrant’. Met behulp van de ‘OK’ button wordt het project aangemaakt en wacht u na enkele seconden een maagdelijk leeg scherm, namelijk: Form1. Dit formulier wordt gebruikt om de schermonderdelen op te plaatsten en de broncode aan toe te voegen.
Properties
Het formulier heet ‘Form1’ en heeft als tekst in de titelbalk ook ‘Form1’. Voor ons programma moeten die waarden aangepast worden. Het werkt nu eenmaal niet prettig om in de broncode Form1, Form2 of Form5 te moeten gebruiken. We moeten dus een aantal properties of eigenschappen aanpassen. Met behulp van properties kan men naast het uiterlijk, van in dit geval een Form, ook de werking beïnvloeden. Bijna elk control of besturingselement wat we op een Form kunnen plaatsen, heeft haar eigen set properties. Properties kunt u instellen met behulp van de Property-window, maar ook vanuit code, wanneer de applicatie eenmaal gestart is. Wijzig de waarden de volgende properties (Zie afbeelding 1):
Text = PC-Active OchtendKrant Name = frmMain |
Het is een goede gewoonte om de verschillende scherm- of besturingselementen of variabelen te voorzien van een drieletterige prefix . Voor een Form gebruikt men meestal ‘frm’. Hierdoor wordt de code begrijpelijker, doordat men aan de hand van deze prefix direct kan zien dat het om een formulier gaat. Hoewel we nu de Name property hebben aangepast, is nog niet de bestandsnaam gewijzigd. Wijzigt u in de Solution Explorer Form1.vb naar frmMain.vb.

Afbeelding 1. Property window
Controls
De controls of besturingselementen bevinden zich in de Toolbox. Dit gedeelte van het scherm zit verborgen onder het tabblad, links boven in het scherm. Het schuift automatisch open wanneer u het aanwijst met de muis. We hadden besloten dat bovenin het formulier een menubalk moest komen. U kunt een menubalk toevoegen aan frmMain door uit de Toolbox een ‘MenuStrip’ te selecteren en deze op een willekeurige plaats op het Form te tekenen. Naast de menubalk die nu bovenin het Form zichtbaar is geworden, bevindt zich in de ‘ComponentTray’ onderin het scherm ook een item, namelijk: MenuStrip1. Selecteer dit component en wijzig de waarde van de volgende property:
Het menu bevat nog geen enkele item, maar heeft wel een invoervak waarin u snel en eenvoudig items kunt aanmaken. Type in dit kader ‘&Bestand’, klik in het invoervak eronder en type hier: ‘&Afsluiten’. Met behulp van het ampersand teken (&) kan men bepaalde letters van een menu-item onderstrepen, waardoor ze tijdens het draaien van de applicatie benaderbaar zijn met sneltoetsen, bijvoorbeeld ALT+B. Het toevoegen van menu-items werkt uitermate intuïtief. Op dit moment zijn alleen de Text-properties van beide items ingesteld. Selecteer de items afzonderlijk en stel de Name property in.
Bestand Name = mnuFile
Afsluiten Name = mnuFileExit |
Analoog aan het toevoegen van de MenuStrip voegen we een ToolStrip toe. Dit is de toolbar of knoppenbalk van de applicatie. Wijzig de volgende property:

Afbeelding 2. Toevoegen van toolbarbuttons
Ook het toevoegen van knoppen is eenvoudig. In de knoppenbalk bevindt zich een keuzelijst waarin men diverse buttons, labels of andere controls kan toevoegen. Voeg drie buttons toe. Het instellen van de properties kan via de standaard Property-window, maar het kan eenvoudiger. Klik met de rechtermuisknop op de ToolStrip, in ons geval tbrToolBar en kies voor ‘Edit Items…’. Het dialoogkader dat verschijnt is speciaal ingericht om dit werkje snel te kunnen klaren. Op de meegeleverde CD treft u de knopafbeeldingen aan. Wijzig de onderstaande properties. Ik denk dat u de betekenis van deze properties wel kunt afleiden uit de naam van de desbetreffende property. Ook de ingestelde waarden zullen geen problemen opleveren.
ToolStripButton1 Name = tsbGoBack Text = Vorige Image = GoBackIcon.ico (Import local resource) DisplayStyle = ImageAndText TooltipText = Blader terug
ToolStripButton2 Name = tsbGoForward Text = Volgende Image = GoForwardIcon.ico (Import local resource) DisplayStyle = ImageAndText TooltipText = Blader vooruit
ToolStripButton3 Name = tsbRefresh Text = Vernieuwen Image = RefreshIcon.ico (Import local resource) DisplayStyle = ImageAndText TooltipText = Vernieuwen |
Het formulier begint al aardig vorm te krijgen. De volgende stap is het plaatsen van een WebBrowser control. Ook dit control bevindt zich in de Toolbox. Doordat standaard de Dock-property is ingesteld op ‘Fill’, wordt het overgebleven deel van frmMain gelijk opgevuld met dit control. Het aardige is dat we hiermee direct de specificatie dat het scherm automatisch moet resizen hebben geïmplementeerd. Tijdens het draaien van de applicatie blijft de WebBrowser het formulier opgevuld houden, ook als u het vergoot of verkleind. Wijzig de property:
Het laatste onderdeel van ons formulier is een statusbalk. U kunt het vinden in hetzelfde lijstje als de reeds eerder toegevoegde MenuStrip en ToolStrip. Voeg een StatusStrip toe op een willekeurige plek op het scherm. Voeg, analoog aan de Toolbar, een StatusLabel toe en stel de volgende properties in:
StatusStrip1 Name = sbrStatusBar
ToolStripStatusLabel1 Name = slbStatus Text = … |
De gebruikersinterface is nu klaar en we kunnen starten met het schrijven van de logica. Allereerst slaan we ons project op en we toetsen F5. Hiermee wordt de applicatie gecompiled in debugmode en zien we voor de eerste keer ons programma in werking. U kunt klikken op de knoppen in de knoppenbalk, een menu-item kiezen of het scherm vergroten.
De informatie die we gaan verzamelen moet onze eigen html pagina getoond moeten worden. Het is dus van belang dat we de minimale opbouw van zo’n pagina weten. Gelukkig hoeft een html pagina niet ingewikkeld te zijn. Het werkt met begin- en eindtags, waarbij u de eindtags kunt herkennen aan het slash-teken (/). Hieronder ziet u een voorbeeld.
<html>
<head> <title>Tekst in titelbalk</title> </head>
<body> Tekst zichtbaar op pagina. </body>
</html> |
Klik in de Solution Explorer met de rechtermuisknop op frmMain.vb en kies ‘View Code’. Omdat we straks tussen de <body> en </body> elementen onze informatie willen plaatsen, maken we een tweetal functies. De eerste geeft de tekst terug tot en met het <body> element, de andere vanaf het </body> element. Voeg de volgende code toe tussen ‘Public Class frmMain’ en ‘End Class’.
Private Function GetNewsPaperHeader() As String
Dim strTitle As String
strTitle = "PC-Active OchtenKrant van " & _ Date.Now.ToShortDateString()
' Geef het bovenste gedeelte terug
Return "<html><head><title>" & strTitle & "</title></head><body>"
End Function
Private Function GetNewsPaperFooter() As String
' Geef het onderste gedeelte terug
Return "</body></html>"
End Function
|
| Codevoorbeeld 1. |
Wanneer u codevoorbeeld 1 goed bestudeert zult u waarschijnlijk begrijpen wat het resultaat zal zijn. Het <title>..</title> element binnen een html pagina wordt door de browser normaal gesproken in de titelbalk gezet. Deze functionaliteit voegen wij straks ook toe. Binnen Visual Basic kunt u regels afbreken met een underscore (_).
De functies zijn gedeclareerd ‘As String’. Dit houdt in dat de returnwaarde een alfanumerieke tekenreeks kan zijn; dus er kan een tekst geretourneerd worden. Er zijn echter veel meer datatypen. Enkele voorbeelden zijn een Integer voor numerieke waarden, Boolean voor Waar/Onwaar waarde, een Date voor datum/tijd of een Decimal voor een numerieke waarde waarbij ook het deel achter de komma opgeslagen moet worden. Deze datatypen dient u altijd zorgvuldig te kiezen om niet voor vervelende verassingen te komen staan. Stel u kent een waarde van 20,4 toe aan een Integer en u gaat met die variabele berekeningen uitvoeren, dan wordt er gerekend met 20! De keuze van het datatype is overigens niet alleen van belang voor returnwaardes van functies, maar minstens zo belangrijk bij het declareren van variabelen.
Standaard classes, controls of bijvoorbeeld functies bevinden zich altijd in een namespace. U kunt een namespace het beste vergelijken met een archiefkast met één of meerdere laden en in die laden weer één of meerdere hangmappen, enzovoort. Om bepaalde functionaliteit binnen Visual Basic direct te kunnen gebruiken dient u die laden en mappen als het ware ‘open’ te zetten. U doet dit met behulp van het Imports keyword. Onderstaande code zet van de kast System de laden IO, Net en Text open. Voegt u de volgende code toe boven de eerste regel ‘Public Class frmMain’:
' Codevoorbeeld 2 Imports System.IO
Imports System.Net Imports System.Text
|
| Codevoorbeeld 2. |
Doordat we deze namespaces hebben geïmporteerd kunnen we direct de functionaliteit aanspreken die we in het vervolg van dit artikel nodig hebben. Als eerste gaan we een functie maken die een bepaalde pagina op het internet opent en in zijn geheel inleest. Omdat we deze functie vaker willen gebruiken, moeten we de URL van de desbetreffende pagina natuurlijk niet ‘hardcoded’ opnemen. We kunnen dit bereiken door de URL als parameter, dus als een variabele mee te geven. In dit geval heet de parameter strUrl.
' Codevoorbeeld 3
Private Function GetHtml(ByVal strUrl As String) As String
' Gebruik WebClient en StreamReader
' om pagina te openen en in zijn
' geheel in te lezen
Dim objWebClient As New WebClient
Dim objReader As New StreamReader(objWebClient.OpenRead(strUrl), _
Encoding.UTF8)
' Lees data in
Dim strHtml As String
strHtml = objReader.ReadToEnd()
' Sluit Reader en ruim object op
objReader.Close()
objWebClient.Dispose()
' Geef de HTML terug
Return strHtml
End Function
|
| Codevoorbeeld 3. Haal een html pagina op |
Het voert op dit moment te ver om alle objecten en onderdelen van deze functies of methods volledig uit te leggen. Het komt erop neer dat er met behulp van een WebClient object connectie wordt gemaakt met een bepaalde locatie op het internet en dat met een StreamReaderobject de data wordt ingelezen in een variabele.
We kunnen nu de functie GetHtml gaan gebruiken om de data die we in onze krant willen tonen op te halen. Allereerst willen we de strip van de dag van http://www.userfriendly.org toevoegen. Omdat we ons programma voor eigen gebruik ontwikkelen en we het resultaat niet publiekelijk maken, schenden we in ieder geval geen auteursrechten. De uitdaging is om een manier te vinden hoe we alleen die stripafbeelding eruit kunnen knippen. Hiervoor zou men meerdere algoritmes kunnen bedenken. Direct boven de strip staat de tekst ‘CARTOON FOR …’ Ik heb besloten om ons algoritme hierop te baseren. Wanneer u de bron van deze pagina zou bekijken, kunt u zien dat de strip de eerste afbeelding is na de tekst ‘CARTOON FOR’. De logica om alleen de afbeelding te bepalen is in de functie ExtractDailyCartoon geïmplementeerd. Het verwacht als parameter de gehele html pagina en retourneert alleen de afbeelding als html element <img ……. >. De beschreven logica en de commentaarregels binnen de code bieden u waarschijnlijk voldoende houvast de code te begrijpen.
' Codevoorbeeld 4 Private Function ExtractDailyCartoon(ByVal strHtml) As String
' Bepaal de positie van de tekst: 'Cartoon for '
Dim intPosCartoonFor As Integer = strHtml.IndexOf("CARTOON FOR ")
' Ga op zoek naar de eerste Image tag na 'Cartoon for '
Dim intPosImageStart As Integer = strHtml.IndexOf("<IMG ", _
intPosCartoonFor + 1)
' Ga op zoek naar de einde markering van deze tag
Dim intPostImageEnd As Integer = strHtml.IndexOf(">", _
intPosImageStart + 1)
' Knip de Image tag eruit: <img ................. >
Return strHtml.Substring(intPosImageStart, intPostImageEnd - _
intPosImageStart + 1)
End Function
|
| Codevoorbeeld 4. Bepaal de afbeelding |
We gaan de code die we nu hebben geschreven eerst eens testen. Voeg de code van de functie CreateNewsPaper() toe.
' Codevoorbeeld 5
Private Function CreateNewsPaper() As String
Dim strDCHtml As String
Dim strDCImage As String
strDCHtml = GetHtml("http://www.userfriendly.org")
strDCImage = ExtractDailyCartoon(strDCHtml)
Stop
End Function
Private Sub frmMain_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Call CreateNewsPaper()
End Sub
|
| Codevoorbeeld 5. |
De CreateNewsPaper() functie moet nog wel worden aangeroepen. Dit doen we in het Form_Load event van frmMain. Events zijn gebeurtenissen die componenten of controls als het ware kunnen overkomen. Voorbeelden van events zijn Click(), MouseMove() of KeyPress(). Met behulp van events kunt u reageren op de eindgebruiker die uw programma gebruikt. U kunt de events toevoegen met behulp van de twee comboboxen direct boven uw code-editor. In de linker combobox kunt u een control selecteren en afhankelijk van deze selectie kunt u in de rechter combobox een bepaald event selecteren. Kies in de linker combobox voor (frmMain Events) en in de rechter voor Load. Voeg de aanroep van CreateNewsPaper toe zoals zichtbaar in codevoorbeeld 5.
U ziet dat ik in de besproken functie het keyword Stop gebruik. Wanneer we de applicatie gaan starten zal de debugger op deze regel stoppen, zodat we de waarden van de variabelen kunnen controleren.
Start het programma met F5 en het programma zal worden onderbroken op de Stop-regel. Wanneer u met de muis boven een variabele gaat hangen ziet u de inhoud. Visual Basic 2005 heeft er een nieuwe feature bijgekregen waardoor u de inhoud van een variabele direct als html kan weergeven. Dit houdt voor ons in dat wanneer we dit kiezen direct de ‘Daily Cartoon’ kunnen bekijken. Echt heel gaaf!

Afbeelding 3. Debuggen
Boven elke item of onderwerp willen we een titel tonen. Doordat we het onderwerp (strSubject) variabel hebben gemaakt, kunnen we de functie voor elk nieuw item hergebruiken.
' Codevoorbeeld 6
Private Function GetSubjectHeader(ByVal strSubject As String) As String
Return "<table width=100%><tr>" & _
"<td bgcolor=#0D237A>" & _
"<font face='Arial Black'" & _
" size=5 color=#FFFFFF>" & _
strSubject & _
"</font></td></tr></table>"
End Function
|
| Codevoorbeeld 6. Maak kopregel |
Schrap de Stop regel uit CreateNewsPaper() en voeg onderstaande code toe. Wijzig tevens de code in het frmMain_Load event, zodat het resultaat wordt toegewezen aan de DocumentText property van de WebBrowser control.
' Codevoorbeeld 7 – Vervang Stop
Dim strNewsPaper As String = GetNewsPaperHeader() & _
GetSubjectHeader("Strip van vandaag") & _
strDailyCartoonImage & _
GetNewsPaperFooter()
Return strNewsPaper
' Codevoorbeeld 8
Private Sub frmMain_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
wbrWebBrowser.DocumentText = _
CreateNewsPaper()
End Sub
|
| Codevoorbeeld 7 en 8. |
In codevoorbeeld 7 ziet u dat we nu een html pagina opbouwen en deze als resultaat van de functie CreateNewsPaper() teruggeven. Als we tijdens het laden van het formulier deze html code toekennen aan de WebBrowser begint onze eigen ochtendkrant werkelijk tot leven te komen.

Afbeelding 4. Het eerste resultaat
We gebruiken op dit moment de DocumentText property van de WebBrowser om de pagina te laten tonen. Om de bladerknoppen volledig te kunnen implementeren, moeten we de pagina eerst als een html opslaan en deze vervolgens laten inlezen door de WebBrowser.
' Codevoorbeeld 9 Private Function SaveNewsPaper(ByVal strFileName As String, _
ByVal strNewsPaper As String) _
As Boolean
' Open het bestand
Dim objStreamWriter As New StreamWriter(strFileName)
' Schrijf de html pagina weg
objStreamWriter.Write(strNewsPaper)
' Sluit het bestand
objStreamWriter.Close()
' We zijn hier, alles okay
Return True
End Function
|
| Codevoorbeeld 9. Schrijf data weg naar een bestand |
We passen wederom onze frmMain_Load aan om de data nu via een bestand te kunnen inlezen.
' Codevoorbeeld 10
Private Sub frmMain_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Dim strFileName As String = Application.StartupPath & _
"Ochtendkrant.html"
Dim strNewsPaper As String = CreateNewsPaper()
' Sla de pagina op... bepaal of het goed gegaan is
If SaveNewsPaper(strFileName, strNewsPaper) = True Then
' Maak URI à ken toe aan WebBrowser
wbrWebBrowser.Url = New Uri(strFileName, UriKind.Absolute)
End If
End Sub |
| Codevoorbeeld 10. |
De basis van ons programma is nu grotendeels klaar. Wanneer we een onderwerp aan onze pagina willen toevoegen passen we dus CreateNewsPaper() aan en maken ook een nieuwe ExtractNogWat-functie aan. In het voorbeeldproject dat u aantreft op de PC-Active CD of dat u kan downloaden van de website van PC-Active is een extra onderwerp toegevoegd. Een overzicht van de laatste koersinformatie van Postbank.nl. De opzet is exact hetzelfde als die voor ‘Daily Cartoon’. Het kent alleen een uitbreiding om een probleem met het tonen van afbeeldingen te corrigeren. De afbeeldingen op de server van de Postbank hebben een relatieve verwijzing. Aangezien de afbeeldingen niet beschikbaar zijn op onze PC, moeten we de relatieve verwijzingen converteren naar absolute verwijzingen. Concreet komt het erop neer dat we het complete adres moeten gebruiken, in plaats van een verwijzing naar de submap ‘/ing/’.
' Codevoorbeeld 11
Private Function CorrectImageKoersenPostbank(ByVal strHtml As String)
' Vervang relatieve naar absolute pad
Return strHtml.Replace("/ing/", "http://www.postbank.nl/ing/")
End Function
|
| Codevoorbeeld 11. Corrigeer afbeeldingen Postbank |
Onze applicatie begint steeds meer te lijken op een Mini Explorer omdat door het klikken op een link de doelpagina automatisch wordt geopend. De statusbalk heeft als taak om ons te informeren over de pagina die op dat moment wordt geopend. Om dit voor elkaar te krijgen, kunnen we het WebBrowser_Navigating() event gebruiken. Dit event treedt op wanneer er een pagina geopend wordt. De parameter ‘e’ in een event bevat altijd informatie die specifiek van toepassing is binnen het desbetreffende event. In dit geval kan men de URL property uitlezen en gebruiken om de statusbalk aan te passen.
' Codevoorbeeld 12
Private Sub wbrWebBrowser_Navigating(ByVal sender As Object, _
ByVal e As WebBrowserNavigatingEventArgs) _
Handles wbrWebBrowser.Navigating
' Pas statusbalk aan
slbStatus.Text = "Bezig met openen " & e.Url.ToString & "..."
End Sub
|
| Codevoorbeeld 12. Pas statusbalk aan |
De knoppen in de knoppenbalk mogen alleen beschikbaar zijn indien er ook daadwerkelijk vooruit - of achteruit gebladerd kan worden. De WebBrowser control biedt ons uitstekend hulp door de CanGoBack - en CanGoForward properties beschikbaar te stellen. Hierdoor kunnen we eenvoudig bepalen of een en ander mogelijk is. De code hiervoor schrijven we in het WebBrowser_Navigated() event, dat optreedt indien de pagina volledig is geladen. We gebruiken dit event tevens om de <title>..</title> uit het html document te tonen in onze titelbalk. Zie ook codevoorbeeld 1. Omdat de pagina nu toch helemaal geladen is, wissen we gelijk de statusbalk. Hier stond immers nog de URL van de pagina die zonet geladen is.
' Codevoorbeeld 13
Private Sub wbrWebBrowser_Navigated(ByVal sender As Object, _
ByVal e As WebBrowserNavigatedEventArgs) _
Handles wbrWebBrowser.Navigated
' Kan ik terug?
If wbrWebBrowser.CanGoBack = True Then
tsbGoBack.Enabled = True
Else
tsbGoBack.Enabled = False
End If
' bovenstaande code kan korter! ;-)
tsbGoForward.Enabled = wbrWebBrowser.CanGoForward
' Toon <title> van HTML in titelbalk
Me.Text = wbrWebBrowser.DocumentTitle
' Klaar met laden, pas statusbalk aan
slbStatus.Text = "..."
End Sub |
| Codevoorbeeld 13. Zet knoppen aan/uit en pas statusbalk aan |
De knoppen in de knoppenbalk worden nu netjes ‘aan’ of ‘uit’ gezet, maar doen feitelijk nog niets. Daar gaan we verandering in brengen door de Click-events van deze knoppen af te vangen en code toe te voegen. We roepen respectievelijk de GoBack(), GoForward() en de Refresh() method van de WebBrowser control aan. Een kind kan de was doen…
' Codevoorbeeld 14
Private Sub tsbGoBack_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles tsbGoBack.Click
' Blader terug
wbrWebBrowser.GoBack()
End Sub
Private Sub tsbGoForward_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles tsbGoForward.Click
'Blader vooruit
wbrWebBrowser.GoForward()
End Sub
Private Sub tsbRefresh_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles tsbRefresh.Click
' Ververs de pagina
wbrWebBrowser.Refresh()
End Sub
|
| Codevoorbeeld 14. Voeg eventcode toe |
Om het programma helemaal af te ronden moeten we alleen nog zorgen dat ons Bestand – Afsluiten menu werkt. Het is prettig om eerst het afsluiten te bevestigen, met een vraag in de trant van: ‘Weet u zeker dat het programma wilt afsluiten?’. Deze vraag moet echter ook gesteld worden wanneer het programma via het kruisje of op nog een andere wijze beëindigd wordt. Om dit resultaat te bereiken voegen we onderstaande code toe in het FormClosing event van het formulier. Het laatste wat ons nog rest is in het Click-event van mnuFileExit het formulier te sluiten en het gebruikte geheugen vrij te maken.
' Codevoorbeeld 15
Private Sub frmMain_FormClosing(ByVal sender As Object, _
ByVal e As FormClosingEventArgs) _
Handles Me.FormClosing
' Vraag gebruiker om bevestiging
If MessageBox.Show("Wilt u PC-Active Ochtendkrant afsluiten?", _
"Afsluiten", MessageBoxButtons.YesNo, _
MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2) <> _
Windows.Forms.DialogResult.Yes Then
' Annuleer 'het closen'
e.Cancel = True
End If
End Sub
Private Sub mnuFileExit_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles mnuFileExit.Click
' Sluit scherm en ruim resources op
Me.Close()
Me.Dispose()
End Sub |
| Codevoorbeeld 15. Puntjes op de i |

Afbeelding 5. Het uiteindelijke resultaat
En hoe nu verder?
In dit artikel hebben we een eenvoudige applicatie gebouwd, die echter op sommige plaatsen nog wel verbeterd kan worden. Hierbij kunt u denken aan het toevoegen van foutafhandeling met behulp van ‘Try … Catch … End Try’. Ook zou u kunnen proberen een archief aan te leggen en te laten tonen. Er zijn in ieder geval voldoende mogelijkheden te bedenken waardoor u nog meer kunt experimenteren met deze prachtige ontwikkelomgeving!