VIII. Werken met Bestanden Al de informatie die u in het RAM-geheugen van een computer opslaat, verdwijnt als u het programma afsluit. Als u gegevens langer wil bewaren, moet u deze gegevens op een schijf (diskette of harde schijf) van uw pc opslaan. De computer slaat deze gegevens op in bestanden (Engels: files). Er bestaan twee essentieel verschillende soorten van bestanden: •
•
Sequentiële bestanden om tekst op te slaan. Kenmerken: - Uitsluitend voor tekstgegevens - Variabele lengte van een record. Elke lijn wordt afgesloten met de karakters CR en LF. - Kan alleen gelezen worden van voor naar achteren Random-access bestanden voor andere gegevens. Kenmerken: - Is in principe geschikt voor alle soorten van gegevens - Vaste recordlengte - Mogelijkheid om een willekeurige record op te halen.
In beide soorten is het mogelijk om gegevens te lezen (input) vanaf de diskette naar het RAMgeheugen, en te schrijven (output) vanuit het RAM-geheugen naar de diskette. Laten we deze twee types even wat nader bekijken en toepassen in Visual Basic.
A. Sequentiële bestanden Sequentiële bestanden kunnen alleen gebruikt worden voor het opslaan van tekst. Deze tekst moet opgedeeld zijn in lijnen, per lees- of schrijfoperatie wordt één enkele lijn gelezen. Elke lijn heet een record van het bestand. Het bestand kan ook maar alleen van voor naar achteren worden gelezen of geschreven. Om iets terug te vinden moet u door het ganse bestand lezen, totdat u aan de gevraagde passage aanbelandt. Zowel bij het lezen als het schrijven van bestanden zijn drie verschillende bewerkingen nodig: 1. Het openen van een bestand. Hier worden buffers in het geheugen vrijgemaakt om de gevraagde bewerkingen mogelijk te maken. 2. Een of meerdere lees- en/of schrijfbewerkingen 3. Het sluiten van het bestand. Omgekeerde van het openen. Om hierin wat meer kennis te vergaren, kunnen we enkele eenvoudige oefeningen maken.
Visual Basic
door ir. C.Daniels
VIII-1
1)
Een sequentieel bestand schrijven Ø Oefening: Maak een nieuw project aan met naam Bestanden1. Zet het liefst in aparte map met dezelfde naam. Plaats een knop linksonder op het formulier, met de naam cmdOpslaan en de caption Opslaan. De bedoeling is enkele records te schrijven in een bestand text.txt op een diskette. Zorg dus dat er een diskette met voldoende ruimte in het diskettestation steekt. Type volgende code in het event cmdOpslaan_Click: Private Sub cmdOpslaan_Click() Print "Bestand wordt geopend" Open "a:\test.txt" For Output As #1 Print #1, "Record een" Print "Record 1 opgeslagen" Print #1, "Record twee" Print "Record 2 opgeslagen" Print #1, "Laatste record" Print "Record 3 opgeslagen" Close #1 Print "Bestand terug gesloten." End Sub
Uitleg: Open "a:\test.txt" For Output As #1 - Open “a:\test.txt”: met deze code wordt een bestand test.txt geopend in de root-map op de diskette a:\. Het bestand wordt aangemaakt, want het bestaat nog niet. Moest het bestaan wordt het oude overschreven! - For Output : betekent dat er informatie gaat geschreven worden. - As #1: elk bestand dat in een programma wordt gebruikt krijgt een nummer (file-handle genoemd), zodat we meerdere bestanden kunnen openen. Het nummer wordt gebruikt om aan te geven in welk bestand er gelezen of geschreven wordt. Dan worden er drie records (hier teksten) geschreven: Print #1, "Record een" Print #1 : schrijf in het bestand met file-handle 1, dus hier in a:\test.txt “Record een” De tekst die weggeschreven wordt. Close #1 Deze code sluit het bestand met file-handle 1 weer af. Visual Basic
door ir. C.Daniels
VIII-2
Tip: Sluit aan het einde van een programma steeds de geopende bestanden af! Anders kan er informatie verloren gaan. De code Close (zonder nummer) sluit alle geopende bestanden af. Tussen elke bewerking hebben we een print-statement gezet, zodat we op het formulier kunnen volgen wat er gebeurt. Ø Klik op de knop “Opslaan”. Uw formulier ziet er dan zo uit:
Ons programma heeft een tekstbestand met de naam test.txt op de diskette geschreven. Als het niet lukt: kijk dan of de diskette wel goed is, geformatteerd is, niet beveiligd tegen schrijven en nog voldoende vrije ruimte heeft (enkele kByte is hier voldoende). We zullen straks het programma zelf laten controleren of alles goed verloopt!
Dit kun je controleren door even met het Kladblok dit bestand te openen:
U ziet dat er 3 records geschreven werden, met de inhoud zoals teksten in ons testprogramma.
Met het dos-proramma type kunnen we eveneens de tekst van het bestand afdrukken. A:\>type test.txt Record een Record twee Laatste record
Visual Basic
door ir. C.Daniels
VIII-3
Met het dos-programma debug, kunnen we precies zien, wat er nu eigenlijk op de diskette werd geschreven: hexadecimaal A:\>debug test.txt -d 1A27:0100 52 65 63 1A27:0110 72 64 20 1A27:0120 20 72 65 1A27:0130 59 80 7C 1A27:0140 3C 1A 77 1A27:0150 E8 5B 00 1A27:0160 01 EB F2 1A27:0170 85 55 02 -q A:\>
6F 74 63 01 46 72 83 74
72 77 6F 3A A2 CE 7D 0D
64 65 72 75 91 72 02 B0
20 65 64 53 D3 2E FF 01
65-65 0D-0A 0D-0A 8A-04 B0-04 EB-BA 74-0C 89-16
Dezelfde tekst leesbaar
Stuurkarakters 6E 4C 74 E8 EB F6 F7 91
0D 61 20 1C C8 05 45 D3
0A 61 83 EC F6 80 02 EB
52 74 7F 2C 05 74 FF 96
65 73 05 41 40 1F 3F B8
63 74 02 FE 74 E8 74 01
6F 65 75 C0 09 57 12 00
Record een..Reco rd twee..Laatste record..t ....u Y.|.:uS.....,A.. <.wF.........@t. .[.r.r......t..W ....}..t..E..?t. .U.t............
Links staan de geheugenadressen waarop de data werden ingelezen. We gaan hier niet verder op in. In het midden vindt u de hexadecimale ascii-codes van de geschreven karakters: 5216 = 5x16 + 2 = 8210 = “R” = karakter nr.82 uit de ascii-code 6516 = 6x16 + 5 = 10110 = “e” = karakter nr.101 uit de ascii-code 6316 = 6x16 + 3 = 9910 = “c” = karakter nr.99 uit de ascii-code enz…
Uiterst rechts staan de afdrukbare tekens in leesbare vorm. Tussen elke record vindt u de code 0D (= 1310) 0A (= 1010). Dit zijn de codes voor de ascii-stuurkarakters Carriage Return (naar begin van de lijn), en Line Feed (nieuwe lijn). Deze worden niet afgedrukt op het scherm of de printer, maar laten de cursor naar het begin van de lijn terugspringen en dan naar de volgende lijn. Dit is een voornaam kenmerk van sequentiële bestanden. Waarom dit belangrijk is zien we later. U ziet dat er achteraan ook enkele onleesbare gedeelten zijn (niet meer vetjes afgedrukt), voorbij het einde van het bestand. De lengte van het bestand wordt ook ergens opgeslagen op de diskette, zodat de computer weet welke tekens nog zinvol zijn en tot het bestand behoren en welke niet meer. Dit zijn resten van informatie die vroeger op de diskette werd geschreven.
Visual Basic
door ir. C.Daniels
VIII-4
2)
Een sequentieel bestand lezen
Laten we nu de code bekijken die het zojuist aangemaakte bestand leest en deze tekst op het scherm afdrukt. Ø Voeg een tweede knop toe aan bestand met de naam cmdLezen, en de caption Lezen. Plaats de volgende code in het event cmdLezen_Click: Private Sub cmdLezen_Click() Dim Lijn As String Print "Bestand wordt geopend om te lezen" Open "a:\test.txt" For Input As #1 While Not EOF(1) Input #1, Lijn Print Lijn Wend Close #1 Print "Bestand is terug gesloten." End Sub
Als u op de knop Lezen klikt krijgt u volgend resultaat:
Uitleg: Dim Lijn As String We declareren een variabele Lijn als een string. Hierin slaan we telkens een lijn op van ons bestand. Open "a:\test.txt" For Input As #1 Het bestand test.txt op de diskette wordt geopend om te lezen met file-handle 1. While Not EOF(1) Input #1, Lijn Print Lijn Visual Basic
door ir. C.Daniels
VIII-5
Wend Een while-lusinstructie. De lus werkt zolang het einde van het bestand niet is bereikt. Als we alles gelezen hebben, wordt de functie EOF(1) WAAR, en stopt de lus. EOF staat voor End Of File. De parameter (1) slaat op de file-handle van het geopende bestand. De instructie Input #1,Lijn leest één record en plaatst de inhoud ervan in de stringvariabele Lijn. De instructie Print Lijn drukt de inhoud van Lijn af op het formulier. Close #1 Het bestand wordt terug gesloten.
3)
Fouten opvangen
Als het bestand test.txt niet op de diskette staat krijgt u volgende foutmelding:
Klik op End om het programma te stoppen. In Visual Basic kunnen we dergelijke fouten opvangen met de On error goto instructie. Pas de code van het inlezen als volgt aan: Private Sub cmdLezen_Click() Dim Lijn As String Print "Bestand wordt geopend om te lezen" On Error GoTo Fout Open "a:\test.txt" For Input As #1 While Not EOF(1) Input #1, Lijn Print Lijn Wend Close #1 Print "Bestand is terug gesloten." Exit Sub Fout: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description End Sub
Visual Basic
door ir. C.Daniels
VIII-6
Dezelfde fout geeft nu het volgende pop-upscherm:
Uitleg: On error goto naam: Als er na deze instructie een fout optreedt, springt het programma naar de plaats waar de naam: staat. Fout : MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description Een fout schept steeds een fout-object met de naam Err. Een eigenschap is het foutnummer (aangeduid met Err.number) en de beschrijving van de fout (aangeduid met Err.description) Beide worden afgedrukt in de popup als er een fout optreedt. De karakters 13 en 10 kenden we al. Let op de dubbele punt achter het label Fout: Op dezelfde manier kunnen we ook het opslaan van het bestand beveiligen. We kunnen zelfs eerst testen of het bestand al bestaat, door het eerst proberen te openen voor input. Als het blijkt dat we dat kunnen, bestaat het reeds, en kunnen we vragen of de gebruiker het bestaande bestand wil afvegen. Ø De test kunnen we in een functie-procedure onderbrengen als volgt: Private Function BestandBestaat() As Boolean BestandBestaat = False On Error GoTo BestaatNiet: Open "a:\test.txt" For Input As #1 BestandBestaat = True Close #1 Exit Function BestaatNiet: BestandBestaat = False End Function
De redenering is als volgt: als het bestand kan geopend worden bestaat het: BestandBestaat = True In het andere geval bestaat het bestand niet (of is er een andere fout opgetreden) Plaats deze code ergens bovenaan in uw programma. Visual Basic
door ir. C.Daniels
VIII-7
De procedure Opslaan wordt nu als volgt aangepast: Private Sub cmdOpslaan_Click() Dim Ant As Integer Ant = vbYes If BestandBestaat Then Ant = MsgBox("Bestand bestaat al! Overschrijven?", vbYesNo, "Opgelet!") End If If Ant = vbYes Then Cls Print "Bestand wordt geopend" On Error GoTo Fout Open "a:\test.txt" For Output As #1 Print #1, "Record een" Print "Record 1 opgeslagen" Print #1, "Record twee" Print "Record 2 opgeslagen" Print #1, "Laatste record" Print "Record 3 opgeslagen" Close #1 Print "Bestand terug gesloten." Exit Sub Else Cls Print "Bestand werd niet overschreven." End If Exit Sub Fout: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description End Sub
Als het bestand reeds bestaat, krijgt u nu volgende messagebox bij het opslaan:
Ø Test het aangepaste programma uit! Simuleer enkele fouten, zoals het weglaten van de diskette uit de drive. Visual Basic
door ir. C.Daniels
VIII-8
4)
De Append-optie
Er is nog een derde manier beschikbaar om een bestand te openen: Append. Hiermee kun je achteraan tekst toevoegen aan het bestand. Laten we dit even uitproberen. We gebruiken hierbij een Inputbox om extra tekst te kunnen ingeven. Dit kunt u vergelijken met een messagebox, met de extra mogelijkheid om wat data in te tikken. Ø Voeg een nieuwe knop toe aan uw programma met de naam cmdAppend, en de caption Append. In het event cmdAppend_Click plaatst u volgende code: Private Sub cmdAppend_Click() Dim strNieuweTekst As String strNieuweTekst = InputBox("Type een tekst:", "Tekst bijvoegen") If strNieuweTekst <> "" Then Print "Bestand wordt geopend voor append" On Error GoTo Fout Open "a:\test.txt" For Append As #1 Print #1, strNieuweTekst Close #1 Print "Bestand is terug gesloten." Exit Sub Fout: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + Chr(13) + Chr(10) + _ Err.Description End If End Sub
Als u de knop Append aanklikt krijgt u dan onderstaande InputBox waarin u tekst kunt typen die u aan het bestand wil toevoegen:
Als u dan terug op Lezen klikt, krijgt u het aangevulde bestand te zien:
Ingevoegde tekstlijn
Visual Basic
door ir. C.Daniels
VIII-9
Ø Oefening 1: Vraag met een inputbox naar het nummer van een record, en laat dan de tekst van deze record af, als hij bestaat. Als het nummer groter is dan het aantal records in het bestand moet er een messagebox met een foutmelding worden weergegeven. Voorbeeld: u geeft het nummer 3 in, dan moet de tekst “Laatste record” uit het bestand op het formulier verschijnen. Tip: gebruik een teller en lees de records vanaf het begin van het bestand. Voor elke gelezen record telt u één op bij de teller. Tot u de gevraagde record bereikt. Ø Oefening 2: schrijf een programma dat het bestand test.txt opent om te lezen, en een tweede bestand test2.txt om te schrijven. Schrijf de inhoud van bestand test.txt over naar bestand test2.txt en verander daarbij alle letters in hoofdletters. Zet de benodigde code hiervoor bijvoorbeeld achter een extra knop met caption Hoofdletters in het voorgaande programma.
Tip: Gebruik de functie Ucase, om tekst om te zetten in hoofdletters. Gebruik filehandle 1 voor test.txt en file-handle2 voor test2.txt. Lees telkens een regel in test1.txt, verander deze in hoofdletters, en schrijf deze regel weg naar bestand test2.txt.
Ø Oefening 3: Pas het programma zodanig aan dat u met een een inputbox naar de naam van het bestand vraagt, zodat u een willekeurig bestand kunt inlezen.
Tip: declareer een variabele strBestandsnaam om de naam uit de inputbox op te slaan. Met de code Open strBestandsnaam For Input As #1 kunt u dan proberen het bestand te openen. Voorzie ook de nodige foutafhandeling, bijvoorbeeld als het gevraagde bestand niet bestaat!
Ø Oefening: Schrijf een VB-programma dat een tekstbestand inleest, alle tekst naar hoofdletters converteert, en wegschrijft in een nieuw bestand. Vraag de naam van het in te lezen tekstbestand, en de naam van het uitvoerbestand op in twee textboxen. Tips: maak gebruik van de VB-functie Ucase() om de tekst te converteren (probeer eerst uit in het Immediate Window!). Open het invoerbestand bijvoorbeeld For Input as #1, en het te schrijven bestand For Output as #2. Lees telkens één lijn in het invoerbestand, converteer naar hoofdletters, en schrijf die lijn weg naar het uitvoerbestand.
Visual Basic
door ir. C.Daniels
VIII-10
B. Random access bestanden In het volgende project maken we een programma dat adresgegevens opslaat in een random access bestand met de naam Adres.dat. Het grote voordeel is dat we onmiddellijk elke record kunnen terugvinden (lezen en schrijven) aan de hand van zijn volgnummer, zonder het ganse bestand te moeten doorlopen. Om met dit type van bestanden te kunnen werken heb je een recordstructuur nodig. Stel dat we naam, woonplaats en geboortedatum van een aantal personen in een dergelijk bestand willen opslaan. We gaan hiervoor een record-type aanmaken: Type Adres Naam As String * 14 Woonplaats As String * 30 Geboortedatum As Long End Type In ons programma kunnen we nu een nieuwe variabele Kennis declareren van het type Adres als volgt: Private Kennis as Adres De naam van een adres bereiken we door de uitdrukking: Kennis.Naam Men noemt dit de punt-operator. Deze wordt courant gebruikt in object georiënteerd programmeren. Kennis is eigenlijk een object met de eigenschappen Naam, Woonplaats en Geboortedatum. Visual Basic is eigenlijk een object georiënteerde taal. Zo is ook elk formulier, knop of tekstveld een object met eigenschappen (Caption, Font,…) en met methodes (Load, Click,…). Voor verdere informatie over Object Georiënteerd Programmeren (OOP = Object Oriented Programming) verwijzen we naar gepaste handboeken.
5)
Een random access bestand beheren
Dit gebeurt met het commando: Open "bestandsnaam" For Random As #filehandle Len = RecordLengte Elke record heeft nu een vaste recordlengte afhankelijke van de gegevens. Een record wegschrijven gaat met de put-instructie: Put #filehandle, recordnummer, RecordData Een record inlezen gebeurt met de get-instructie: Get #filehandle, recordnummer, RecordData Het bestand sluiten gaat weer met close: Close #filehandle
Visual Basic
door ir. C.Daniels
VIII-11
Ø Oefening: maak een nieuw project aan met de naam RandomAccess. Geef het weer een plaatsje in een aparte map op je diskette, of HD. Plaats de volgende objecten op je formulier:
lblInfo Geef de objecten de volgende eigenschappen: Object Eigenschap Formulier Form1 Caption: Demo Random Access Knop Nieuw Name: cmdNieuw Caption: Nieuw Knop Invoeren Name: cmdInvoeren Caption: Invoeren Knop Annuleren Name: cmdAnnuleren Caption: Annuleren Knop Eerste Record Name: cmdEerste Caption: Eerste Record Knop Volgende Name: cmdVolgende Caption: Volgende Knop Vorige Name: cmdVorige Caption: Volgende Knop Laatste Record Name: cmdLaatste Caption: Laatste Record Label Naam Name: lblNaam Caption: Naam: Label Woonplaats Name: lblWoonplaats Caption: Woonplaats Label Geboortedatum Name:lblGeboortedatum Caption: Gebortedatum Textbox Naam Name: txtNaam Text: (leeg) Textbox Woonplaats Name: txtWoonplaats Text: (leeg) Textbox Geboortedatum Name:txtGeboortedatum Text: (leeg) Label Info Name: lblInfo Caption: (leeg) BackColor: kies een aangepaste kleur
Visual Basic
door ir. C.Daniels
VIII-12
Ø Plaats de structuur van de record in een aparte bas-module: Kies Project à Add Module:
Ø Kies Openen. In deze module plaatst u volgende code:
Een bas-module bevat code die in het ganse programma nuttig is. Het is niet verbonden aan een formulier. Modules kunt u ook inlassen in andere programma’s, zodat de code niet opnieuw moet worden geschreven. Na het invoeren van deze module moet het project-venster er als volgt uitzien:
Visual Basic
door ir. C.Daniels
VIII-13
Ø Laten we nu de verschillende events programmeren, eerst het openen van het formulier: Private Sub Form_Load() Dim i As Integer RecordLengte = Len(Kennis) ' Vang eventuele fouten op On Error GoTo Foutmelding 'Open het bestand op de diskette Open "a:\Adres.dat" For Random As #1 Len = RecordLengte 'Niet nodig, ter info in het Immediate Window Debug.Print "Bestand wordt geopend" Debug.Print "Lengte van het bestand in bytes: " + Str(LOF(1)) Debug.Print "Recordlengte: " + Str(RecordLengte) ' Bereken het aantal records in het bestand AantalRecords = LOF(1) / RecordLengte ' kijk of het misschien nog leeg is If AantalRecords = 0 Then lblInfo = "Het bestand is leeg. Klik op nieuw." cmdEerste.Enabled = False cmdLaatste.Enabled = False cmdVolgende.Enabled = False cmdVorige.Enabled = False cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False Else lblInfo = "Er zijn " + Str(AantalRecords) + " records aanwezig" cmdEerste.Enabled = True cmdLaatste.Enabled = True cmdVolgende.Enabled = True cmdVorige.Enabled = True cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False HuidigeRecord = 1 ToonRecord (1) End If Exit Sub Foutmelding: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description End Sub
Visual Basic
door ir. C.Daniels
VIII-14
Uitleg: Dim i As Integer
Wordt alleen gebruikt voor de msgBox RecordLengte = Len(Kennis)
Met de VB-functie len() bepalen we het aantal bytes nodig voor één record On Error GoTo Foutmelding
Vang eventuele fouten op Open "a:\Adres.dat" For Random As #1 Len = RecordLengte
Open het bestand op de diskette , en we zetten de recordlengte gelijk aan de berekende lengte. Debug.Print "Bestand wordt geopend" Debug.Print "Lengte van het bestand in bytes: " + Str(LOF(1)) Debug.Print "Recordlengte: " + Str(RecordLengte)
Deze lijnen zijn niet nodig maar in een testfase geven ze interessante info over het bestand in het Immediate-window. Als het programma naar behoren werkt, kunt u ze verwijderen. AantalRecords = LOF(1) / RecordLengte
Bereken het aantal records in het bestand. De functie LOF(filehandle) geeft de lengte van het geopende bestand in bytes. If AantalRecords = 0 Then lblInfo = "Het bestand is leeg. Klik op nieuw." cmdEerste.Enabled = False cmdLaatste.Enabled = False cmdVolgende.Enabled = False cmdVorige.Enabled = False cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False Else lblInfo = "Er zijn " + Str(AantalRecords) + " records aanwezig" cmdEerste.Enabled = True cmdLaatste.Enabled = True cmdVolgende.Enabled = True cmdVorige.Enabled = True cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False HuidigeRecord = 1 ToonRecord (1) End If Exit Sub
Visual Basic
door ir. C.Daniels
VIII-15
In deze code wordt getest of het bestand nog leeg is ( AantalRecords = 0). Dan wordt alleen de knop Nieuw toegankelijk gemaakt, om een nieuwe record in te voeren. Ook de knoppen Invoeren en Annuleren worden zichtbaar. Als er al records aanwezig zijn, worden de knoppen Invoeren en Annuleren onzichtbaar gemaakt, en wordt het aantal aanwezige records getoond in het label Info. Foutmelding: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description
De foutafhandeling vermeld het foutnummer en de omschrijving van de opgetreden fout. ToonRecord (1)
Deze code roept een subprocedure aan, die de record vermeld tussen haakjes (hier 1) toont in de textboxen. Ø Plaats de volgende code hiervoor vooraan in je programma. Dimensioneer ook de nodige variabelen zoals hieronder: Option Explicit Private Kennis As Adres ' bevat de data van één record Private RecordLengte As Integer ' de lengte van de record Private HuidigeRecord As Integer ' het nummer van de huidige record Private AantalRecords As Integer 'het aantal records in het bestand 'Toon record #n op het scherm Private Sub ToonRecord(n As Integer) Get #1, n, Kennis txtNaam = Kennis.Naam txtWoonplaats = Kennis.Woonplaats txtGeboortedatum = Format(Kennis.Geboortedatum, "dddd, d/mm/yyyy") lblInfo.Caption = "Record #" + Str(n) End Sub
Ø Het event Nieuwe record invoeren: cmdNieuw_Click Private Sub cmdNieuw_Click() txtNaam.Text = "" txtWoonplaats = "" txtGeboortedatum = "" cmdEerste.Enabled = False cmdLaatste.Enabled = False cmdVolgende.Enabled = False cmdVorige.Enabled = False cmdNieuw.Enabled = False cmdInvoeren.Visible = True cmdAnnuleren.Visible = True End Sub
Visual Basic
door ir. C.Daniels
VIII-16
Uitleg: Als we de knop Nieuw aanklikken worden de tekstvelden leeggemaakt, zodat we nieuwe gegevens kunnen invullen. Tevens worden de knoppen Invoeren (om de gegevens in het bestand te schrijven) en Annuleren (om de bewerking te schrappen) zichtbaar gemaakt. Ø Het event Invoeren: de gegevens wegschrijven in het bestand: Private Sub cmdInvoeren_Click() Dim i As Integer Kennis.Naam = txtNaam.Text Kennis.Woonplaats = txtWoonplaats.Text If Not (IsDate(txtGeboortedatum.Text)) Then MsgBox txtGeboortedatum.Text & " is geen geldige datum." Exit Sub Else Kennis.Geboortedatum = CDate(txtGeboortedatum.Text) End If If Trim(Kennis.Naam) = "" Or Trim(Kennis.Woonplaats) = "" Then i = MsgBox("U moet de 3 velden juist invullen", vbExclamation, "Foutieve Ingave") Exit Sub Else AantalRecords = AantalRecords + 1 On Error GoTo Foutmelding Put #1, AantalRecords, Kennis lblInfo = "Er zijn " + Str(AantalRecords) + " records aanwezig" cmdEerste.Enabled = True cmdLaatste.Enabled = True cmdVolgende.Enabled = True cmdVorige.Enabled = True cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False End If Exit Sub Foutmelding: MsgBox "Fout nr. " + Str(Err.Number) + " opgetreden!" + _ Chr(13) + Chr(10) + Err.Description End Sub
Visual Basic
door ir. C.Daniels
VIII-17
Uitleg: Kennis.Naam = txtNaam.Text Kennis.Woonplaats = txtWoonplaats.Text
Plaats de teksten uit de velden Naam en Woonplaats in de record. If Not (IsDate(txtGeboortedatum.Text)) Then MsgBox txtGeboortedatum.Text & " is geen geldige datum." Exit Sub Else Kennis.Geboortedatum = CDate(txtGeboortedatum.Text) End If
Test of de ingevoerde datum correct is met de functie IsDate(). Deze geeft true voor een geldige datum, en false voor een foutieve datum. Bij een foutieve datum wordt de bewerking afgebroken met Exit Sub. If Trim(Kennis.Naam) = "" Or Trim(Kennis.Woonplaats) = "" Then i = MsgBox("U moet de 3 velden juist invullen", vbExclamation, "Foutieve Ingave") Exit Sub Else
Test of de velden naam en woonplaats ingevuld zijn. De functie Trim() verwijdert onnodige spaties. AantalRecords = AantalRecords + 1 On Error GoTo Foutmelding Put #1, AantalRecords, Kennis lblInfo = "Er zijn " + Str(AantalRecords) + " records aanwezig" cmdEerste.Enabled = True cmdLaatste.Enabled = True cmdVolgende.Enabled = True cmdVorige.Enabled = True cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False
Alles is goed ingevuld, het aantalRecords wordt dus met één verhoogd, en we kunnen de record wegschrijven met het put-commando. De knoppen Invoeren en Annuleren worden weer onzichtbaar gemaakt. Ø Het event Annuleren (nieuwe gegevens invoeren annuleren): Private Sub cmdAnnuleren_Click() lblInfo = "Er zijn " + Str(AantalRecords) + " records aanwezig" cmdEerste.Enabled = True cmdLaatste.Enabled = True cmdVolgende.Enabled = True cmdVorige.Enabled = True cmdNieuw.Enabled = True cmdInvoeren.Visible = False cmdAnnuleren.Visible = False End Sub
Visual Basic
door ir. C.Daniels
VIII-18
Ø Het event Eerste Record (toont de eerste record van het bestand): Private Sub cmdEerste_Click() If AantalRecords = 0 Then MsgBox ("Het bestand is nog leeg! Voer gegevens in!") Else HuidigeRecord = 1 ToonRecord (HuidigeRecord) End If End Sub
Ø Het event Volgende Record: Private Sub cmdVolgende_Click() If HuidigeRecord >= AantalRecords Then MsgBox ("Einde van het bestand bereikt!") Else HuidigeRecord = HuidigeRecord + 1 ToonRecord (HuidigeRecord) End If End Sub
Ø Het event Vorige Record: Private Sub cmdVorige_Click() If HuidigeRecord <= 1 Then MsgBox ("Begin van het bestand bereikt!") Else HuidigeRecord = HuidigeRecord - 1 ToonRecord (HuidigeRecord) End If End Sub
Ø Het event Laatste Record: Private Sub cmdLaatste_Click() If AantalRecords = 0 Then MsgBox ("Het bestand is nog leeg! Voer gegevens in!") Else HuidigeRecord = AantalRecords ToonRecord (HuidigeRecord) End If End Sub
Ø Het programma is klaar! Test het grondig uit! Test ook de foutafhandeling door de bijvoorbeeld de schrijfbeveiliging van uw diskette in te schakelen.
Visual Basic
door ir. C.Daniels
VIII-19
Ø Oefening: Voeg een nieuwe knop “Lijst” in. Deze toont in een apart formulier een volledige lijst van de ingevoerde data. Tip:Plaats daarvoor een tekstveld in dit formulier, bijna zo groot als het formulier, en schrijf daarin alle records. Zet de eigenschappen van het tekstveld op Multiline en schakel de Scrollbars in. Ø Oefening: Voeg een knop “Wijzigen” in, waarmee gegevens van een record kunnen gewijzigd worden. Enkele screenshots van het programma: Er werd ook reeds een knop “Lijst” bijgevoegd zoals in de oefening. Tevens werd de mogelijkheid voorzien een bestaande record te wijzigen met de knop “Wijzigen”.
Het programma bij het opstarten als het bestand nog leeg is.
Het programma toont record 3.
Visual Basic
door ir. C.Daniels
VIII-20
Een nieuwe record bij het invoeren met een verkeerde datum
Het formulier met het overzicht van de data. En zo ziet de data eruit, gezien door het programma Debug. Merk op dat de records niet gescheiden zijn door Cr Lf. Ook tussen de velden van één record is er geen scheidingsteken. De datum wordt opgeslagen als een long getal van 4 bytes op het einde van iedere record. 1A27:0100 1A27:0110 1A27:0120 1A27:0130 1A27:0140 1A27:0150 1A27:0160 1A27:0170 1A27:0180
4A 73 20 4B 6E 20 41 6E 20
61 73 20 61 6B 20 6E 68 20
6E 65 20 72 20 20 6E 6F 20
20 6C 20 65 20 20 65 76 20
56 74 20 6C 20 20 20 65 20
65 20 20 20 20 20 57 6E 20
72 20 20 4F 20 20 69 20 20
73-74 20-20 20-20 76-65 20-20 20-20 6C-6C 20-20 20-20
72 20 20 72 20 20 65 20 20
61 20 20 6D 20 20 6D 20 20
74 20 20 61 20 20 73 20 20
6E 20 6F 74 20 5C 20 20 7F
48 20 00 47 20 00 5A 20 00
61 20 00 65 20 00 6F 20 00
Jan VerstratenHa sselt .o.. Karel OvermaetGe nk .\.. Anne Willems Zo nhoven ....
Datum in long-formaat
De data van één record
Visual Basic
65 20 CE 65 20 86 20 20 01
door ir. C.Daniels
VIII-21