Textfile gebruiken als "database"

Status
Niet open voor verdere reacties.

Jan Van Haaren

Gebruiker
Lid geworden
27 okt 2002
Berichten
202
Hoi,

Ik heb een form met een dropdownmenu en een label. Dat dropdownmenuutje wordt gevuld met informatie uit een tekstfile. Aan ieder "record" in dat dropdownmenu is een waarde verbonden die op het label komt. Het formaat van het tekstbestand zou best in deze vorm zijn:

"tekst1a", tekst1b
"tekst2a", tekst2b
"tekst3a", tekst3b
"tekst4a", tekst4b
"tekst5a", tekst5b
"tekst6a", tekst6b
...

De waardes tekst1a, tekst2a, tekst3a, tekst4a, tekst5a, tekst 6a, ... moeten in het dropdownmenu ingelezen worden. Bij het klikken op een waarde moet op het label de waarde die in de lijst er rechts van staat (tekst1b, tekst2b, tekst3b, tekst4b, tekst5b, tekst 6b, ...) verschijnen. Dus bij selecteren van tekst3a komt tekst3b op het label.

Dank bij voorbaat! Groeten, Jan
 
ik heb een vaag aan jouw hoe laat jij zien dat er overwort gegaan naar een adere direktorie
ik heb zef een pog gemaakt om mijn uiren bij te houden
dat dee ik de tabellen schijden door ">" "$" "#" zulekn tekens gebruk je normaal niet in teksten dat kan je die als schijding teken gebruken
laat even weten of meld mij aan op msn
 
Is een beetje omslachtig om op die manier de waardes elke keer in de textfile te zoeken. Omdat het een sequential file is moet je die dan elke keer doorlopen. Bovendien is het langzaam omdat je elke keer je harde schijf aanroept.

Zou de file gewoon inlezen in een een two-dimensionele array en dan weet je aan de hand van de plaatsnummer in de array automatisch de bijbehorende waarde .....
 
Geplaatst door aartvg
ik heb een vaag aan jouw hoe laat jij zien dat er overwort gegaan naar een adere direktorie
ik heb zef een pog gemaakt om mijn uiren bij te houden
dat dee ik de tabellen schijden door ">" "$" "#" zulekn tekens gebruk je normaal niet in teksten dat kan je die als schijding teken gebruken
laat even weten of meld mij aan op msn

de komma is het standaard scheidingsteken in een sequentiele file ....
 
Geplaatst door vaat
Is een beetje omslachtig om op die manier de waardes elke keer in de textfile te zoeken. Omdat het een sequential file is moet je die dan elke keer doorlopen. Bovendien is het langzaam omdat je elke keer je harde schijf aanroept.

Zou de file gewoon inlezen in een een two-dimensionele array en dan weet je aan de hand van de plaatsnummer in de array automatisch de bijbehorende waarde .....
Klinkt interessant, maar op eerlijk te zijn heb ik geen enkele ervaring met sequential file access :o, dus als je een voorbeeldje wilt geven dan zou ik dat zeer op prijs stellen. Thanks.
 
ik heb een progamma gemaat voor mijn uiren bij te houden ook ook zo ists ik zal het even

02.JPG

http://aart.free-host.com/aart/data.zip
 
Hiermee moet het lukken:

Code:
Option Explicit
Dim data() As String 'globaal gedeclareerd


Private Sub Combo1_Click()
Dim index As Integer

index = Combo1.ListIndex
Label1.Caption = data(index, 2)


End Sub

Private Sub Form_Load()
Dim kolom1, kolom2 As String
Dim nummer As Integer
Dim aantal As Integer

aantal = 0
Combo1.Text = "Kies item"

If Dir("C:\test.txt") <> "" Then
    Open "C:\test.txt" For Input As #1
    Do While Not EOF(1)
        Input #1, kolom1, kolom2
        aantal = aantal + 1
    Loop
    
Else
    MsgBox ("file niet gevonden")
    End
End If

Close #1
ReDim data(0 To aantal - 1, 0 To aantal - 1) As String

nummer = 0

Open "C:\test.txt" For Input As #1

Do While Not EOF(1)
    Input #1, data(nummer, 1), data(nummer, 2)
    Combo1.AddItem data(nummer, 1)
    nummer = nummer + 1
Loop

Close #1
End Sub
 
Heel erg bedankt Vaat! Werkt perfect ;). Waarschijnlijk ga ik nu weer tegendraads doen, maar is het mogelijk om gemakkelijk "records" toe te voegen en te verwijderen aan C:\test.txt? Bij het toevoegen lijkt het me voldoende om gewoon de file te openen via "Open "C:\test.txt" For Append", maar hoe zorg ik ervoor dat de eerste waarde tussen " en " komt en de tweede niet? :o Voor het verwijderen van records heb ik geen flauw idee :(.

Is er ook een relatief gemakkelijke manier om de waardes in de Combobox automatisch alfabetisch te sorteren?

Dank bij voorbaat, Jan
 
Geplaatst door Jan Van Haaren
Heel erg bedankt Vaat! Werkt perfect ;). Waarschijnlijk ga ik nu weer tegendraads doen, maar is het mogelijk om gemakkelijk "records" toe te voegen en te verwijderen aan C:\test.txt? Bij het toevoegen lijkt het me voldoende om gewoon de file te openen via "Open "C:\test.txt" For Append", maar hoe zorg ik ervoor dat de eerste waarde tussen " en " komt en de tweede niet? :o Voor het verwijderen van records heb ik geen flauw idee :(.

Is er ook een relatief gemakkelijke manier om de waardes in de Combobox automatisch alfabetisch te sorteren?

Dank bij voorbaat, Jan

1) toevoegen gaat idd makkelijk via append

2) als je de file opend voor append en met write een string wegschrijft dan komt er in de textfiles automatisch het woord tussen de aanhalingstekens " " !
Beide waarden zijn een string, dus je plaatst ze allebei tussen de aanhalingstekens. Het werkt dus wel zonder, maar aangezien visual basic het ook automatisch doet, zou ik dit ook doen (conform regels)

3) verwijderen is in deze manier inderdaad lastig. De sequentiele file is hier eigenlijk niet voor bedoeld. Dus als je veel waardes gaat verwijderen enzo moet je een andere oplossingen kiezen. Een Random Access file bijvoorbeeld.
Het kan wel; je opent dan de file en maakt een nieuwe tijdelijke file aan (open voor output). Je lees een regel in, vergelijkt het met de waarde die verwijdert moet worden (in combobox). Is het niet de juiste regel dan plaats je het in de tijdelijke file. Is het wel de regel die verwijdert moet worden dan plaats je die NIET in de tijdelijke file. Vervolgens overschrijf je de oude file door de tijdelijke file en je hebt de regel verwijdert !

4) sorteren doen je simpel door in de design view de combobox property Sorted op True te zetten !

PS

Het is wel makkelijk als je voor jezelf opschrijft wat de functies van het programma moeten zijn en wat je er graag in zou willen hebben. Dus de must haves en nice to haves.

Je kiest de manier van programmeren en datastructuren namelijk op basis van de requirements. Een programma kent altijd eerst een design fase en pas veel later de werkelijke implementatiefase.

Anders blijf je onnodig programmeerwerk doen, tenzij dat juist de bedoeling is :)
 
sorry dat stuk over verwijderen slaat een beetje nergens op. De juiste methode is natuurlijk door de regel in array te verwijderen door alles daar onder een rgel naar boven te schuiven .....

Alsnog een beetje omslachtig, maar anders maak je gebruik van een vector bijvoorbeeld ....

aan het eind van het programma schrijf je de array weer weg naar een txt file !!
 
Bedankt voor de uitleg, ik begin het zo ongeveer te begrijpen ;). Alleen heb ik nog een paar probleempjes.

Code:
Private Sub Command1_Click()
Dim team, id As String

team = Text1.Text
id = Text2.Text

Open "C:\test.txt" For Append As #1
Print #1, team + "," + id
Close #1

End Sub

Die code gebruik ik voor het toevoegen van records. Snel gemaakt, daarom dat de namen van de objecten nog niet helemaal in orde zijn. In Text1 komt de waarde voor de komma, in Text2 komt de waarde na de komma. De normale inhoud van het document is:

"waarde1a", waarde1b
"waarde2a", waarde2b
...

Bij het toevoegen van een record volgens de code hierboven wordt het:

waarde3a, waarde3b
waarde4a, waarde4b
...

Zonder aanhalingstekens. In principe werkt het zo ook, maar ik zou graag weten (voor toekomstige programmaatjes) hoe ik dan wel die aanhalingstekens rond de waarde uit Text1.Text krijg.

Van het verwijderen via arrays snap ik eerlijk gezegd ook niks. Ik heb nog nooit met arrays gewerkt en weet ook niet goed wat het precies zijn. Ook het alfabetisch sorteren gebeurt niet naar wens. Als ik de inhoud via "Sorted = True" rangschik dan komt de verkeerde waarde op het label. Met andere woorden: de waarde in de combobox en op het label komen niet met elkaar overeen. Bedankt voor de hulp.

Groeten, Jan
 
als je ipv Print #1, team + "," + id gewoon
Code:
write #1, team, id
doet krijg je automatisch de aanhalingstekens !!!!

Nou ja heb het maar helemaal voor je geschreven. Kan misschien mooier, maar koste we al wat tijd .... En moet eigenlijk studeren :)

Code:
Option Explicit
Dim aantal As Integer
Dim data As New Collection 'globaal gedeclareerd


Private Sub cmdEnd_Click()
    Dim i As Integer
    
    Open "C:\WINDOWS\Desktop\vb\test.txt" For Output As #1
    For i = 1 To data.Count
        Write #1, data.Item(i).kolom1, data.Item(i).kolom2
    Next i
    
    Close #1
    
    End
End Sub



Private Sub Combo1_Click()
Dim nummer As Integer

nummer = zoekInData
If nummer = -1 Then
    Label1.Caption = "Kies Item"
Else
    Label1.Caption = data.Item(nummer).kolom2
End If

End Sub

Private Sub sort()
Dim i, teller As Integer
Dim temp(1, 1 To 2) As String
Dim tempData()
Dim tempRegel As CRegel
Dim aantal As Integer


ReDim tempData(1 To data.Count, 1 To data.Count)
aantal = data.Count

For i = 1 To aantal
    tempData(i, 1) = data.Item(1).kolom1
    tempData(i, 2) = data.Item(1).kolom2
    data.Remove 1
Next i

For teller = 1 To aantal - 1
    For i = 1 To aantal - teller
        If tempData(i, 1) > tempData(i + 1, 1) Then
            temp(1, 1) = tempData(i, 1)
            temp(1, 2) = tempData(i, 2)
            tempData(i, 1) = tempData(i + 1, 1)
            tempData(i, 2) = tempData(i + 1, 2)
            tempData(i + 1, 1) = temp(1, 1)
            tempData(i + 1, 2) = temp(1, 2)
        End If
    Next i
Next teller


Set tempRegel = New CRegel
Combo1.Clear

For i = 1 To aantal
    Set tempRegel = New CRegel
    tempRegel.kolom1 = tempData(i, 1)
    tempRegel.kolom2 = tempData(i, 2)
    data.Add tempRegel
    Combo1.AddItem tempData(i, 1)
Next i



End Sub

Private Function zoekInData() As Integer
Dim zoekData As String
Dim i As Integer

If Combo1.ListIndex <> -1 Then
    zoekData = Combo1.List(Combo1.ListIndex)
    For i = 1 To data.Count
        If zoekData = data.Item(i).kolom1 Then
            zoekInData = i
        End If
    Next i
Else
    zoekInData = -1
End If

End Function

Private Sub CmdVerwijder_Click()
Dim nummer

nummer = zoekInData()

data.Remove nummer
Combo1.RemoveItem Combo1.ListIndex

End Sub

Private Sub cmdVoegToe_Click()
Dim temp As New CRegel


temp.kolom1 = Text1.Text
temp.kolom2 = Text2.Text

data.Add temp
Call sort


End Sub

Private Sub Form_Load()
Dim kolom1, kolom2 As String
Dim nummer As Integer
Dim temp As CRegel

aantal = 0
Combo1.Text = "Kies item"

If Dir("C:\WINDOWS\Desktop\vb\test.txt") <> "" Then
    Open "C:\WINDOWS\Desktop\vb\test.txt" For Input As #1
    Do While Not EOF(1)
        Input #1, kolom1, kolom2
        Set temp = New CRegel
        temp.kolom1 = kolom1
        temp.kolom2 = kolom2
        data.Add temp
        aantal = aantal + 1
    Loop
    
Else
    MsgBox ("file niet gevonden")
    End
End If

Close #1

Call sort

End Sub

class CRegel

Code:
Option Explicit

Private m_kolom1 As String
Private m_kolom2 As String

Property Get kolom1() As String
    kolom1 = m_kolom1
End Property

Property Let kolom1(ByVal vKolom1 As String)
    m_kolom1 = vKolom1
End Property

Property Get kolom2() As String
    kolom2 = m_kolom2
End Property

Property Let kolom2(ByVal vKolom2 As String)
    m_kolom2 = vKolom2
End Property
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan