Informaticasite van het Sondervick College te Veldhoven                 © L.J.M van Haperen (bron : R.J. van der Beek)
 

Hoofdstuk 8: Visual Basic

8.4. Bestanden lezen en schrijven; herhalen.

We gaan op deze pagina bekijken hoe je een tekstbestand op de schijf kunt opslaan, en ook weer op kunt vragen.

Verder gaan we bespreken op welke manieren je een tekstbestand op het scherm kunt laten zien:
  • In een textbox
  • In een picturebox

  8.4.1. Een tekstbestand maken.

Begin met een nieuw project, het formulier moet er uitzien zoals hiernaast.

Zet dus bovenaan een label met het opschrift : "Naam bestand ", en daarnaast een tekstbox waar de naam kan worden ingevoerd.
Geef het label de naam lblBestand en geef het tekstvenster de naam txtBestand

Zet daaronder een button met het opschrift "Maak bestand aan", geef de button als naam cmdMaakbestand

Een eindje daaronder komt nog een textbox, waarin tekst kan worden ingevoerd, die dan in het bestand moet worden opgeslagen.
Geef dat tekstvenster als naam txtRegel

Daar weer onder een button met het opschrift "Voeg deze regel toe aan bestand" en dan nog een button met het opschrift "Sluit af".
De namen van deze buttons luiden cmdVoegtoe en cmdSluitaf

De laatste drie objecten moeten in het begin eigenlijk nog niet op het scherm staan.
Want eerst moet er ruimte voor het bestand gemaakt worden op de schijf, voordat er echt iets in gezet kan worden.

Daarom zet je in de procedure bij Form_Load het volgende :

Private Sub Form_Load()

txtRegel.Visible = False
cmdVoegtoe.Visible = False
cmdSluitaf.Visible = False

End Sub

Verder is het de bedoeling dat er, als er op de button met "Maak bestand aan" wordt geklikt, er op de schijf ruimte wordt gecreëerd voor het bestand, en dat er ook op de schijf wordt aangegeven wat de naam van dat bestand is (het is de bedoeling dat die naam in het tekstvenster er boven is ingevoerd), zodat er echt iets in dat bestand geplaatst kan worden.

Als de naam van het bestand "PROEF.TXT" moet zijn dan is de opdracht die dat verzorgt het volgende :
open "PROEF.TXT" for output as #1

Wij kennen de naam echter nog niet, dat hangt er vanaf wat er in het tekstvenster wordt ingevoerd. Daarom wordt die naam in een variabele vastgelegd, die ik "bestandsnaam" heb genoemd.

Door de opdracht bestandsnaam = txtBestand.Text + ".TXT" wordt er nog .TXT aan de naam toegevoegd.

Verder kunnen dan de eerste drie objecten verdwijnen, en de laatsten moeten zichtbaar worden, daarom moeten er een aantal opdrachten met "visible" worden toegevoegd.

Dubbelklik op de button met "Maak bestand aan" en voer de volgende regels bij Private Sub cmdMaakbestand_Click in:

Private Sub cmdMaakbestand_Click()

Dim bestandsnaam As String
If txtBestand.Text <> "" Then
    bestandsnaam = txtBestand.Text + ".txt"
    Open bestandsnaam For Output As #1
    lblBestand.Visible = False
    txtBestand.Visible = False
    cmdMaakbestand.Visible = False
    txtRegel.Visible = True
    cmdVoegtoe.Visible = True
    cmdSluitaf.Visible = True
End If

End Sub

  8.4.2. Iets in een tekstbestand zetten.

Het is de bedoeling dat als je in het tweede tekstvenster een regel intikt, en je klikt op "Voeg deze regel aan bestand toe" dat die regel in het bestand wordt gezet.
Als je de opdracht print #1, "Piet is gek" geeft, dan wordt de zin "Piet is gek" aan het bestand toegevoegd.

Bij ons programma moet de regel die in de tekstbox txtRegel is ingetypt aan het bestand worden toegevoegd. Dat gaat als volgt :

Dubbelklik op het label "Voeg deze regel aan bestand toe" en voer het volgende in:
Print #1, txtRegel.Text
txtRegel.Text = ""

De laatste regel heeft tot gevolg dat de tekstbox weer leeg wordt gemaakt voor de volgende regel.
Elke keer als er op de button "Voeg deze regel aan bestand toe" wordt geklikt wordt er iets aan het bestand toegevoegd. Je kunt het dus zo lang maken als je wilt.

Voer verder nog bij de button "Sluit af" het volgende in :
Close #1
End

Door de opdracht CLOSE #1 wordt het bestand "afgesloten", er kan daarna niets meer (rechtstreeks) worden toegevoegd.
En door de opdracht END wordt het programma beeindigd, je hoeft daarvoor niet op de sluitknop te klikken.

Als je het programma helemaal klaar hebt laat je het lopen (RUN !)
Voer als bestandsnaam in: PROEF en klik dan op MAAK BESTAND AAN.
Voer daarna minstens 10 regels in, en voeg die steeds aan het bestand toe.
Sluit dan af, dan stopt het programma.

Start dan KLADBLOK en kijk of het bestand PROEF.TXT bestaat (het zit waarschijnlijk in de map VB) en wat er in zit.
Als alles goed is gegaan dan zitten de regels er in die je hebt ingevoerd met het programma.

  8.4.3. Een tekstbestand inlezen.

Begin met een nieuw project, noem het h4lees
Het formulier moet er uit zien zoals hiernaast.

Zet dus bovenaan een label met het opschrift : "Naam bestand ", en daarnaast een tekstbox waar de naam kan worden ingevoerd.
Geef het label de naam lblBestand en geef het tekstvenster de naam txtBestand

Zet daaronder een button met het opschrift "Lees begin", geef de button als naam cmdLees
Naast de button cmdLees zet je nog een button met het opschrift "Lees volgende regel" en geef de button als naam cmdVolgenderegel
Daaronder links een textbox, waarin de tekst kan worden getoond.
Geef dat tekstvenster als naam txtAfdruk, zet Multiline op true (dan kunnen er verschillende regels onder elkaar in het venster) en zorg er voor dat er een horizontale scrollbar is

Daarnaast rechts een picturebox, waarin de tekst ook kan worden getoond.
Geef die picturebox als naam picAfdruk

Onderaan nog een button met het opschrift "Sluit af".
De naam van deze button is cmdSluitaf

Het is de bedoeling dat als je de naam van een tekstbestand invoert, en dan op de button cmdLees klikt dat de inhoud ervan in de textbox er onder wordt getoond en ook in de Picturebox.
Dat gaan we nu programmeren.

Dubbelklik op de button cmdLees. En voer onder Private Sub cmdLees_Click het volgende in:

Private Sub cmdLees_Click()

dim naambestand, regel as string
naambestand = txtBestand.text + ".TXT"
Open naambestand for input as #1
line input #1, regel
txtAfdruk.text = regel
picAfdruk.print, regel
lblBestand.Visible = False
txtBestand.Visible = False
cmdLees.Visible = False

End Sub

De opdracht naambestand = txtBestand.text + ".TXT" heeft tot gevolg dat de naam van het tekstbestand, dat ingelezen moet worden in de variabele "naambestand" (daar kan een string in, zie eerste programmaregel) wordt vastgelegd. Daarvoor wordt in de tekstbox txtBestand gekeken, en wat daar staat daar wordt .TXT achter geplakt.
Als je dus in het tekstvenster PROEF intikt dan komt er in "naambestand" te staan: "PROEF.TXT"

Open naambestand for input as #1 heeft tot gevolg dat het volgende gebeurt:
Als er in de variabele naambestand PROEF.TXT staat, dan had er in de opdracht net zo goed kunnen staan:
Open "PROEF.TXT" for input as #1
Het bestand PROEF.TXT wordt dan opgezocht op de schijf (in dezelfde map waarin het programma staat; als het daar niet staat moet het pad er bij).
En er wordt een buffergeheugen (buffer nummer 1, omdat er staat as #1) in het werkgeheugen gereserveerd, waarin de ingelezen regels eerst worden geplaatst.

line input #1, regel heeft tot gevolg dat er een regel van het bestand wordt ingelezen (eigenlijk gaat dat in twee stappen: eerst wordt er een gedeelte van het bestand (bijvoorbeeld 1024 bytes, dat is hier waarschijnlijk het hele bestand) in de buffer nr. 1 gezet. En dan wordt uit die buffer de eerste regel gelezen en in de variabele "regel" (die is van het type string, zie de eerste programmaregel) vastgelegd).

txtAfdruk.text = regel heeft tot gevolg dat deze eerste regel in het tekstvenster txtAfdruk getoond wordt.

picAfdruk.print, regel heeft tot gevolg dat deze eerste regel ook in de picturebox picAfdruk getoond wordt.
Een Picturebox kun je voor plaatjes gebruiken, maar dus ook voor tekst!

De laatste drie programmaregels hebben tot gevolg dat de eerste drie objecten van het scherm verdwijnen, die zijn dan niet meer nodig.

Laat het programma nu lopen, voer als bestandsnaam PROEF in, en als je geen fouten hebt gemaakt dan wordt de eerste regel van dat tekstbestand getoond in het linker tekstvenster en ook in de rechter picturebox.
Je moet natuurlijk wel zo'n tekstbestand hebben ingevoerd, zoals in 8.4.2. is uitgelegd.

  8.4.4. De volgende regels inlezen.

Het is de bedoeling dat als je op de button "Lees volgende regel" klikt de volgende regel van het tekstbestand getoond wordt. Dat gebeurt nu nog niet. Daarvoor moeten we eerst nog iets invoeren.

Dubbelklik op de button cmdVolgenderegel. En voer onder Private Sub cmdVolgenderegel_Click het volgende in:

Private Sub cmdVolgenderegel_Click
dim regel as string
line input #1, regel
txtAfdruk.text = regel
picAfdruk.print, regel

End Sub

De opdracht line input #1, regel heeft tot gevolg dat de volgende regel van het tekstbestand wordt gelezen, en aan de variabele "regel" wordt toegekend.
De computer houdt bij tot hoever hij is gevorderd met het inlezen, en elke keer als hij de opdracht line input #1, regel tegenkomt leest hij de regel, die dan aan de beurt is, in en de inhoud van die regel wordt dan aan de variabele "regel" toegekend.

Laat het programma nu weer lopen, voer als bestandsnaam PROEF in, en als je geen fouten hebt gemaakt dan wordt de eerste regel van dat tekstbestand getoond in het linker tekstvenster en ook in de rechter picturebox.
Als je daarna op "Lees volgende regel" klikt dan wordt de volgende regel getoond in het linker tekstvenster, en ook in de rechter picturebox.
Klik maar een aantal keren achterelkaar op die button.

Er is echter wel een verschil tussen linker- en rechter venster.
In het linker venster staat elke keer als je op de button klikt alleen de volgende regel, en in het rechter venster staan de vorige regels er ook nog bij.
Dat komt door het volgende :
De opdracht picAfdruk.print, regel zorgt er voor dat de inhoud van de variabele "regel" onder de vorige regels wordt afgedrukt.
De opdracht txtAfdruk.text = regel zorgt er voor dat de inhoud van de variabele "regel" in het tekstvenster txtAfdruk verschijnt, de vorige inhoud wordt dan gewist.

Wil je dat de vorige regels ook in het linker venster blijven staan, dan moet je iets aan het programma veranderen.
De opdracht txtAfdruk.text = regel moet je vervangen door
txtAfdruk.text = txtAfdruk.text + regel
Dan wordt de inhoud van "regel" er aan vastgeplakt!

Verander het programma zoals uitgelegd.
Laat het programma nu weer lopen, voer als bestandsnaam weer PROEF in.
De eerste regel van dat tekstbestand getoond in beide vensters.
Elke keer als je daarna op "Lees volgende regel" klikt dan wordt de volgende regel toegevoegd aan de tekst in het linker tekstvenster, en ook aan de tekst in de rechter picturebox.
Klik maar een aantal keren achterelkaar op die button.

Er gaat nog iets mis.
De volgende regel wordt wel steeds toegevoegd aan de tekst in het linker tekstvenster, maar alles komt achter elkaar op één regel!
Als je wilt dat de nieuwe regel steeds onder de vorige komt dan moet je nog iets aan het programma veranderen.
De opdracht txtAfdruk.text =txtAfdruk.text + regel moet je vervangen door
txtAfdruk.text = txtAfdruk.text + chr(13) + chr(10) + regel
Eerst wordt de code chr(13) aan de tekst vastgeplakt.
Dat is de code om er voor te zorgen dat de cursor naar de volgende regel gaat.
Dan wordt de code chr(10) er ook nog aan vastgeplakt.
Dat is de code om er voor te zorgen dat de cursor naar het begin van de regel gaat.

Verander het programma zoals uitgelegd.
Laat het programma nu weer lopen, voer als bestandsnaam weer PROEF in.
De eerste regel van dat tekstbestand getoond in beide vensters.
Elke keer als je daarna op "Lees volgende regel" klikt dan wordt de volgende regel toegevoegd aan de tekst in het linker tekstvenster, en ook aan de tekst in de rechter picturebox.
Klik maar een aantal keren achterelkaar op die button.

  8.4.5 Herhalingen, een aantal regels tegelijk inlezen.

In de vorige paragraaf kon je alle regels laten inlezen, maar voor elke regel moest je weer op de button "Lees volgende regel" klikken.
Dat kan simpeler, want je hebt in Visual Basic net als in Pascal opdrachten om iets te laten herhalen.
Als je de volgende programmaregels invoert:

For i = 1 to 20
...................................
...................................
next i

dan worden de opdrachten op de stippeltjes 20 keer uitgevoerd, en i doorloopt daarbij achtereenvolgens de waarden 1 tot en met 20

Dat kun je gebruiken als je precies weet hoe vaak het moet gebeuren.
Net als in Pascal heb je ook in Visual Basic opdrachten vergelijkbaar met While en met Repeat.

Als je de volgende programmaregels invoert:

WHILE xxxxxxxxxxxxxx
...................................
...................................
WEND

dan worden de opdrachten op de stippeltjes net zo lang uitgevoerd als de voorwaarde op xxxxxxxxxxxxxx geldt.
Er wordt dus pas gestopt als de voorwaarde op xxxxxxxxxxxxxx niet meer geldt.

Als je de volgende programmaregels invoert:

DO UNTIL xxxxxxxxxxxxxx
...................................
...................................
LOOP

dan worden de opdrachten op de stippeltjes net zo lang uitgevoerd tot de voorwaarde op xxxxxxxxxxxxxx niet meer geldt.
Dit is vergelijkbaar met Repeat until uit Pascal.

Er zijn wel een paar verschillen met Pascal.
  • Achter FOR en WHILE geen DO
  • Als een samengestelde opdracht herhaald moet worden (d.w.z. meer dan één opdracht) dan moeten die opdrachten bij Pascal tussen BEGIN en END staan.
    Bij Visual Basic hoeft BEGIN er nooit bij, want het begin is altijd wel duidelijk.
    END moet er eigenlijk wel bij, maar bij elke herhaal-opdracht is daar in Visual Basic weer een andere term voor.
  • Bij FOR heb je in plaats van END het woordje NEXT
  • Bij WHILE heb je in plaats van END het woordje WEND
  • Bij DO UNTIL heb je in plaats van END het woordje LOOP
  • Bij IF heb je in plaats van END het woordje ENDIF
We gaan het programma uit de vorige paragraaf wat aanpassen.
Verwijder eerst het label cmdVolgenderegel van het formulier, en de bijbehorende programmaregels.
Voer bij de button cmdLees de volgende code onder Click in (verwijder eerst de regels die er al stonden) :

Private Sub cmdLees_Click()

' declaratie van de variabele "naambestand" waarin de naam
' van het bestand wordt vastgelegd en van
' de variabele "regel" waarin de inhoud van
' een ingelezen regel wordt vastgelegd.

dim naambestand, regel as string
' declaratie van de teller i
dim i as integer
' haal de naam van het bestand uit de textbox txtBestand
naambestand = txtBestand.text + ".TXT"
' open het tekstbestand
Open naambestand for input as #1
' de labels lblBestand en cmdLees en het tekstvenster
' txtBestand moeten nu verdwijnen

lblBestand.Visible = False
txtBestand.Visible = False
cmdLees.Visible = False
' de eerste 10 regels worden ingelezen
' en afgedrukt in de tekstbox en in de picturebox

for i = 1 to 10
      line input #1, regel
      txtAfdruk.text = txtAfdruk.text + chr(13) + chr(10) + regel
      picAfdruk.print, regel
next i

End Sub

Laat het programma nu lopen, voer als bestandsnaam PROEF in.
Als het goed gaat dan worden de eerste tien regels van dat tekstbestand getoond in beide vensters. (natuurlijk moeten er wel tien regels in zitten, anders krijg je een foutmelding)

  8.4.6 While not end of file

We willen natuurlijk graag dat alle regels van het tekstbestand worden ingelezen en getoond.
Maar hoe kun je dat nu voor elkaar krijgen als je niet weet hoeveel regels er zijn ?
Dan moet de opdracht om een regel in te lezen worden herhaald, net zo lang tot het einde van het tekstbestand is bereikt.
Dat gebeurt door de regel : while not eof(1)
(eof is de afkorting van end-of-file)
Dit betekent dat de computer doorgaat zolang nog niet het einde van het bestand bereikt is.
Elke keer wordt een nieuwe regel ingelezen, en vastgelegd in de variabele "regel".
Close #1 heeft tot gevolg dat het bestand wordt afgesloten, vanaf dat moment kan er niet meer uit dat bestand worden gelezen, en buffer nummer 1 kan weer voor andere dingen worden gebruikt.

We gaan het programma uit de vorige paragraaf voor de laatste keer aanpassen.
Verwijder het label cmdSluitaf van het formulier, en de bijbehorende programmaregels.
Voer bij de button cmdLees de volgende code onder Click in (verwijder eerst de regels die er al stonden) :

Private Sub cmdLees_Click()

dim naambestand, regel as string
naambestand = txtBestand.text + ".TXT"
Open naambestand for input as #1
lblBestand.Visible = False
txtBestand.Visible = False
cmdLees.Visible = False
' alle regels worden ingelezen (tot eof = einde bestand)
' en afgedrukt in de tekstbox en in de picturebox

While not eof(1)
      line input #1, regel
      txtAfdruk.text = txtAfdruk.text + chr(13) + chr(10) + regel
      picAfdruk.print, regel
wend
close #1

End Sub

Laat het programma nu lopen, voer als bestandsnaam PROEF in.
Als het goed gaat dan worden alle regels van dat tekstbestand getoond in beide vensters.

  8.4.7. Bestand uitkiezen m.b.v. een DriveListBox, en FileListBox.

We willen het programma zo maken dat je de naam van het bestand niet in hoeft te typen, maar dat je het in een filelistbox uit kunt kiezen.
We moeten dan allereerst de interface aanpassen, we maken het zoals hier onder.



  • In de linker venstertjes kan een drive en map worden uitgekozen.
  • En dan worden in het rechter venster de bestanden in de gekozen map getoond.
  • En als er op de naam van zo'n bestand wordt geklikt dan wordt de inhoud van dat bestand in het onderste venster getoond.
Klik in de toolbox op de DriveListBox (rechts, 7 van boven), en plaats die linksboven in het formulier.

Klik in de toolbox op de DirListBox (links, 8 van boven), en plaats die onder de drivelistbox.

Klik in de toolbox op de FileListBox (rechts, 8 van boven), en plaats die rechts van de eerste twee.


Als je op het pijltje bij de drivelistbox klikt, dan kun je kiezen uit de A-drive, de C-drive, en de D-drive (als die er is), en misschien nog wel meer. Daar hoef je niets voor te doen, de aanwezige drives worden automatisch aangegeven.

Als je één van die drives uitkiest, dan is het de bedoeling dat in de DirListBox de namen van de mappen van die drive verschijnen.
Dat gebeurt niet automatisch, dat moet je programmeren.

Dubbelklik op de DriveListBox. Dan verschijnt het programmavenster van de DriveListBox.
Kies in het rechtervenstertje "Change" uit. Dan kun je aangeven wat er moet gebeuren als er iets aan de keuze in de DriveListBox wordt veranderd.
En wat moet er gebeuren ?
In de DirListBox er onder (die heet Dir1) moeten de mappen van de drive in de box er boven (Drive1 genaamd) verschijnen.
Een map wordt hier aangegeven met het woord "Path" en een drive met het woord "Drive".
De opdracht daarvoor is : Dir1.Path = Drive1.Drive

Verder moeten in de FileListBox er naast (die heet File1) de namen van de bestanden in de aangegeven map komen.
De opdracht daarvoor is : File1.Path = Dir1.Path

Dus in de procedure Private Sub Drive1_Change( ) moet het volgende staan:

Private Sub Drive1_Change( )

Dir1.Path = Drive1.Drive
File1.Path = Drive1.Drive

End Sub

  8.4.8. Een map en een bestand uitkiezen.

Als je in de DirListBox een andere map uitkiest, dan is het de bedoeling dat in de FileListBox de namen van de bestanden, die in de nieuwe map zitten, verschijnen.
Hoe je dat kunt programmeren zie je hieronder.

Dubbelklik op de DirListBox. Dan verschijnt het programmavenster.
Kies in het rechtervenstertje "Change" uit.
Dan kun je aangeven wat er moet gebeuren als er iets aan de keuze in de DirListBox wordt veranderd.
De opdracht daarvoor is : File1.Path = Dir1.Path
Tik die opdracht in.

Als laatste moet nog geregeld worden wat er gebeurt als er op de naam van een bestand wordt geklikt in de FileListBox.

File1.filename geeft aan welke naam geselecteerd is.

File1.Path geeft de map aan, waarin dat bestand zit.

De volledige naam is dan File1.Path + "\" + File1.Filename

(want als de map D:\WI is en de bestandsnaam proef.txt dan is de volledige naam D:\WI\proef.txt
Er moet dus ook nog een backslash worden tussengevoegd).

Dubbelklik op de FileListBox. Dan verschijnt het programmavenster.
Kies in het rechtervenstertje "Click" uit.
Dan kun je aangeven wat er moet gebeuren als er op de naam van een bestand geklikt is.
Tik dan het volgende in (de eerste en laatste regel staan er al):

Private Sub File1_Click()

Dim naambestand As String
naambestand = File1.Path + "\" + File1.Filename
Open naambestand for input as #1
While not eof(1)
          line input #1, regel
          txtAfdruk.text = txtAfdruk.text + chr(13) + chr(10) + regel
          picAfdruk.print, regel
wend
close #1

End Sub

De eerste opdracht is de declaratie van de string "naambestand".
De laatste opdracht heeft tot gevolg dat het naambestand wordt getoond in de imagebox.

  8.4.9. Fouten voorkomen.

Als je het programma invoert zoals hierboven, dan kunnen er nog een aantal dingen verkeerd gaan.

Als je bijv. in de DriveListBox op de A-drive klikt, en er zit geen schijfje in de computer, dan zal er een foutmelding verschijnen, en het programma zal stoppen.

Je wilt natuurlijk niet dat het programma stopt als er iets verkeerd gaat.
Er mag wel gemeld worden dat er iets verkeerd gaat, maar daarna moet het programma weer verder gaan. Maar dat moet je zelf programmeren.
Normaal stopt een programma namelijk altijd zodra er iets fout gaat.

Maar je kunt dat voorkomen, door een opdracht te geven zoals : ON ERROR GOTO ......
Dat betekent zoiets als : als er een fout optreedt dan moet er het volgende gebeuren ......

Het handigst is het volgende : als een drive wordt uitgekozen die er niet is, dan moet de drive worden aangehouden waarmee het programma gestart is.
Maar dan moet de computer wel weten wat de start-drive was.
Die moet hij onthouden in een string-variabele, bijv. met de naam "startdrive".

Daarom moet bij Sub Form_Load als extra opdracht staan : startdrive = Drive1.Drive
(startdriveis een globale variabele)

Verder moeten de programmaregels bij de procedure Drive1_Change( ) zó veranderd worden :

Private Sub Drive1_Change( )

On Error Goto fout
Dir1.Path = Drive1.Drive
Dir1.Path = Drive1.Drive
Exit Sub

fout:
Drive1.Drive = startdrive

End Sub

Dat heeft tot gevolg dat als er een foute drive is uitgekozen de computer naar de regel met het woord fout: springt.
Het woordje fout met de dubbele punt er achter is een zogenaamde label, waar naartoe kan worden gesprongen.
(dat is heel wat anders dan een label dat je in een formulier kunt plaatsen!)
Daaronder staat Drive1.Drive = startdrive , en dat heeft tot gevolg dat als drive weer de startdrive wordt genomen.

Voor de label "fout:" staat Exit Sub
Regel 2, 3 en 4 worden namelijk uitgevoerd als er geen fout was.
En normaal worden dan de volgende regels ook uitgevoerd.
Maar als er geen fout was dan moet regel 7 natuurlijk niet worden uitgevoerd.
En daarom moet de regel met Exit Sub er tussen.
Die zorgt er voor dat als regel 2, 3 en 4 zijn uitgevoerd, de computer uit de procedure springt.

De variabele startdrive moet ook nog worden gedeclareerd, maar dat moet niet in deze procedure, want dan is de computer die naam weer kwijt zodra de procedure is afgelopen, en dat is niet de bedoeling.
Daarom moet dat onder General en dan bij Declarations, zodat die variabele een globale variabele is en in elke procedure gebruikt kan worden.

Dubbelklik in het formulier. Dan verschijnt het programmavenster.
Kies in het linker venster de bovenste mogelijkheid uit : General.
En kies in het rechter venster ook de bovenste mogelijkheid uit : Declarations.
En tik daar in : Dim startdrive As String

Er kan nog een andere fout optreden.
Als er een naambestand wordt uitgekozen door op een bestandsnaam te klikken in de FileListBox, dan wordt de volledige naam : naambestand = File1.Path + "\" + File1.Filename
Er wordt dus een backslash tussengevoegd.
Dat moet in bijna alle gevallen, behalve als het bestand in de hoofdmap (dus in de root) zit, want die wordt aangegeven met C:\ of met D:\ enz.
Daar wordt altijd al een backslash achter gezet, en dan moet er geen extra backslash worden toegevoegd.

Als je rekening wilt houden met een naambestand in de hoofdmap dan moet de procedure File1_Click zó worden :

Private Sub File1_Click()

Dim naambestand As String
If Right$(File1.Path,1) <> "\" Then
    naambestand = File1.Path + "\" + File1.Filename
Else
    naambestand = File1.Path + File1.Filename
End If
Open naambestand for input as #1
While not eof(1)
    line input #1, regel
    txtAfdruk.text = txtAfdruk.text + chr(13) + chr(10) + regel
    picAfdruk.print, regel
wend
close #1

End Sub

  8.4.10 Opdrachten

Opgaven.
Maak nu opgave 4 van de oefenopgaven van hoofdstuk 8