Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tiedostosta haku

Sivun loppuun

Aku2 [11.03.2003 18:48:22]

#

Olisi seuraavanlainen kysymys.

Olen tehnyt normaalin tallennuksen, jossa tallennetaan useammasta textboxista tietoja tekstitiedostoon.

Tiedostoon tulee rivejä tyyliin:

#Ekatieto
textbox1
textbox2
textbox3

#Tokatieto
Textbox1
textbox2
textbox3

ja jatkuu niin monella, kun on tallennettu.

kuinka saisin haettua tietoja tuosta siten, että listboxiin saisin luettelona kaikki # merkin jälkeiset sanat:
Listboxissa:
Ekatieto
Tokatieto
jne, jne

ja kun jotain noista klikkaa, saan sen tiedot haettua textboxeihin.

Tähän toivoisin hyvin yksinkertaista toimivaa esimerkkiä.
Itse tallennus on jo tehty, siis haku puuttuu.

trinit [11.03.2003 19:17:21]

#

Tällainen koodi tuli pikaisesti väännettyä. Form_Load:ssa luetaan rivit ListBoxiin ja List1_Click:ssä taas luetaan tiedot TextBoxeihin. HUOM! Koodia ei ole testattu käytännössä joten siinä voi olla vikaakin.

ListBox on koodissa nimellä List1 ja tiedosto josta luetaan on nimellä tekstitiedosto.

Private Sub Form_Load()

    Dim ff As Integer
    Dim rr As String
    ff = FreeFile

    Open tekstitiedosto For Input As #ff
        Do Until EOF(ff)
            Line Input #ff, rr: rr = Trim(rr)

            ' Jos luetun rivin 1. merkki on #, niin lisätään
            ' se List:iin
            If Mid$(rr, 1, 1) = "#" Then List1.AddItem Mid$(rr, 2, Len(rr) - 2)
        Loop
    Close #ff

End Sub

Private Sub List1_Click()

    Dim ff As Integer
    Dim rr As String
    Dim i As Integer
    Dim i2 As Integer
    Dim tiedot() As String

    ff = FreeFile
    i = 0
    i2 = 0

    Open tekstitiedosto For Input As #ff
        Do Until EOF(ff)
            Line Input #ff, rr: rr = Trim(rr)

            If Mid$(rr, 1, 1) = "#" Then

                ' Jos luettu rivi sisältää sekä # merkin, että
                ' List:stä klikatun rivin tekstin...
                If Mid$(rr, 2, Len(rr) - 2) = List1.List(List1.ListIndex) Then

                    Line Input #ff, rr: rr = Trim(rr)

                    Do Until Mid$(rr, 1, 1) <> "#" Or EOF(ff)
                        '... lisätään tiedot taulukkoon kunnes
                        ' tulee toinen # alkava rivi vastaan tai EOF

                        ' Seuraavan rivin voisi korvata paremmalla
                        ' tavalla, mutta se olisi lisännyt
                        ' koodin pituutta
                        ReDim Preserve tiedot(i)

                        tiedot(i) = rr
                        i = i + 1
                        Line Input #ff, rr: rr = Trim(rr)

                    Loop

                End If

            End If
        Loop
    Close #ff

    ' Lisätään tiedot TextBoxeihin
    Text1.Text = tiedot(0)
    Text2.Text = tiedot(1)
    Text3.Text = tiedot(2)
    ' ...
    ' jne. jne.

End Sub

Aku2 [11.03.2003 19:25:01]

#

Näyttäisi pikaisella katselmuksella olevan sellainen, jota juuri hain.... Vielä pitää testata käytännössä.

Kiitokset nopeasta vastauksesta.
Tuon tekstitiedoston joutui laittamaan lainausmerkkeihin, jotta se toimi.
Juu. sain tuon nyt muuten toimimaan, mutta se antaa tuossa lopussa virheilmoituksen.
Listboxiin toimii muuten oikein, mutta esim #eka tulostuu ek (ilman a kirjainta, kuten #toka jää myös viimeinen kirjain pois.
Klikatessa tulee virhe 9:
Subscript out of range
Näyttäisi olevan debugissa kohdassa tiedot(1), tiedot(2) ja tiedot(3) kohdissa.
MSDN:stä löytyi tuohon tietoa, mutta meni yli hilseen.
Vinkkejä?

trinit [11.03.2003 21:11:53]

#

lainaus:

Tuon tekstitiedoston joutui laittamaan lainausmerkkeihin, jotta se toimi.

Oletko tehnyt tallennuksen Write:lla (Write #tiednum, tekstiä) Print:n sijasta, vai teetkö tallennuksen jotenkin muulla tavalla?

lainaus:

mutta esim #eka tulostuu ek (ilman a kirjainta, kuten #toka jää myös viimeinen kirjain pois.

Tuon olisit varmaankin keksinyt itsekin miten korjata, mutta muuta Form_Load tapahtumasta löytyvä rivi

List1.AddItem Mid$(rr, 2, Len(rr) - 2)

muotoon

List1.AddItem Mid$(rr, 2, Len(rr) - 1)

lainaus:

Klikatessa tulee virhe 9:
Subscript out of range
Näyttäisi olevan debugissa kohdassa tiedot(1), tiedot(2) ja tiedot(3) kohdissa.

Minkä rivin se VB valaisee (yleensä keltaisella pohjalla) kun painat Debug-painiketta koodista kun tuo virhe tulee?

Aku2 [11.03.2003 22:09:09]

#

Tiedostoon kirjoittamisen olen tehnyt Printillä. Tosin tuota sorsaa varten tein testitiedoston notepadillä kirjoittamalla.

Tuon List toiminnon sainkin korjattua tutkimalla sitä hieman tarkemmin. (kokeilemalla)ja korjaus juuri niinkuin kerroit.

Tuo klikkaus on edelleen ongelma ja kaatuessaan keltaiseksi menee rivi:
Text1.Text = tiedot(0)

ja kun vien hiiren tuon tiedot(0) päälle, tulee teksti:
"text1.text=tiedot(0)=<subscript out of range>"

Eli kohdassa ' Lisätään tiedot TextBoxeihin

trinit [12.03.2003 15:16:15]

#

lainaus:

Tuo klikkaus on edelleen ongelma ja kaatuessaan keltaiseksi menee rivi:
Text1.Text = tiedot(0)

Taitaa olla nyt niin, että List1_Click tapahtuman sisin Do...Loop silmukka ei ajeta missään vaiheessa jolloin taulukkoakaan ei alusteta. Eli muuta rivi

If Mid$(rr, 2, Len(rr) - 2) = List1.List(List1.ListIndex) Then

'tähän muotoon

If Mid$(rr, 2, Len(rr) - 1) = List1.List(List1.ListIndex) Then

Tuossa siis tehtiin samanlainen korjaus kuin List1.AddItem -kohdallekin.

Aku2 [12.03.2003 17:49:48]

#

TÄmän tietenkin olen jo aikaisemmin koittanut eikä sekään ratkaissut tuota ongelmaa.

Koko tän päivän olen tuota nyt miettinyt, tutkinut, koittanut erivaihtoehtoja, mutta ei ole vielä auennut minulle missä se vika voisi olla. Loopit kyllä näyttäisi toimivan loppuun saakka. Tieto vaan ei mene taulukkoon tai sitten se on siellä jossain kumman muodossa.

PS. miten noita värikoodauksia saa tehtyä näihin viesteihin?

Aku2 [12.03.2003 18:57:35]

#

Ajoin vielä tuon koodin Debugin step introlla läpi ja huomasin, että tuo keskimmäinen looppi jäi suorittamatta, eli juuri taulukkoon tietojen hakemisen.
Eli tämä:

Do Until Mid$(rr, 1, 1) <> "#" Or EOF(ff)
                        '... lisätään tiedot taulukkoon kunnes
                        ' tulee toinen # alkava rivi vastaan tai EOF

                        ' Seuraavan rivin voisi korvata paremmalla
                        ' tavalla, mutta se olisi lisännyt
                        ' koodin pituutta
                        ReDim Preserve tiedot(i)

                        tiedot(i) = rr
                        i = i + 1
                        Line Input #ff, rr: rr = Trim(rr)

                    Loop

Joten taitaa tuossa aikaisemmassa IF lauseessa olla nyt joku buglos, koska se ei sitä suorita.

If Mid$(rr, 2, Len(rr) - 1) = List1.List(List1.ListIndex) Then

Vinkkejä?

trinit [12.03.2003 20:14:30]

#

No niin, testasin alla olevan koodin omalla koneellani ja nyt se toimii oikein. Siinä keskimmäisessä loopissa <> ehto piti tietenkin olla = (yhtäkuin) ehto. Lisäksi pari riviä tuli tuon loopin lisäksi heti sen alapuolelle.

Toimiva koodi kokonaisuudessaan:

Private Sub Form_Load()

    tekstitiedosto = App.Path & "\testi.txt"

    Dim ff As Integer
    Dim rr As String
    ff = FreeFile

    Open tekstitiedosto For Input As #ff
        Do Until EOF(ff)
            Line Input #ff, rr: rr = Trim(rr)

            ' Jos luetun rivin 1. merkki on #, niin lisätään
            ' se List:iin
            If Mid$(rr, 1, 1) = "#" Then List1.AddItem Mid$(rr, 2, Len(rr) - 1)
        Loop
    Close #ff

End Sub

Private Sub List1_Click()

    Dim ff As Integer
    Dim rr As String
    Dim i As Integer
    Dim tiedot() As String

    ff = FreeFile
    i = 0

    Open tekstitiedosto For Input As #ff
        Do Until EOF(ff)
            Line Input #ff, rr: rr = Trim(rr)

            If Mid$(rr, 1, 1) = "#" Then

                ' Jos luettu rivi sisältää sekä # merkin, että
                ' List:stä klikatun rivin tekstin...
                If Mid$(rr, 2, Len(rr) - 1) = List1.List(List1.ListIndex) Then

                    Line Input #ff, rr: rr = Trim(rr)

                    Do Until Mid$(rr, 1, 1) = "#" Or EOF(ff)
                        '... lisätään tiedot taulukkoon kunnes
                        ' tulee toinen # alkava rivi vastaan tai EOF

                        ' Seuraavan rivin voisi korvata paremmalla
                        ' tavalla, mutta se olisi lisännyt
                        ' koodin pituutta
                        ReDim Preserve tiedot(i)

                        tiedot(i) = rr
                        i = i + 1
                        Line Input #ff, rr: rr = Trim(rr)

                    Loop

                    ReDim Preserve tiedot(i)
                    tiedot(i) = rr

                End If

            End If
        Loop
    Close #ff

    ' Lisätään tiedot TextBoxeihin
    Text1.Text = tiedot(0)
    Text2.Text = tiedot(1)
    Text3.Text = tiedot(2)
    ' ...
    ' jne. jne.

End Sub

lainaus:

PS. miten noita värikoodauksia saa tehtyä näihin viesteihin?

Taisitkin jo keksiä miten niitä saa tehtyä?

Aku2 [12.03.2003 20:50:15]

#

No voi kiusus että taas oli pienestä kiinni.
Rupee jo tuntumaan, että mitä vaikeampi ongelma, niin sitä pienemmästä se on kiinni :)

Tuo värikoodaus löytyi, kun löysin ensin tän foorumin faqin.
En aluksi löytänyt sellaista millään, mutta vanhoja viestejä selatessa löytyi linkki sellaiseen.

Mutta eiköhän tämän taas tästä.

Seuraavaksi varmaan ryhdyn kehittelemään samalla systeemillä tuohon tiedon poistamista, joten varmaan kysymyksiä siitäkin tulee, jollei se itseltäni onnistu.
Eli pitää muutta toi list_click ensinnäkin tuplaklikkaukseksi, jotta voi suorittaa valinnan ja toisella painikkeella tehdä poiston.

Eli valitsen eka listboxista ja se poistaa sen tiedot.

Mutta nyt taas jatkamaan. eiköhän se tästä.

trinit [13.03.2003 17:47:44]

#

Foorumin FAQ löytyy ihan tuolta sivun yläreunasta mustalla tekstillä ja harmaalla pohjalla ;) (palkki jossa lukee "Etusivu : Oppaat : Koodivinkit ...). No hyvä että kuitenkin löytyi.

Aku2 [13.03.2003 18:43:29]

#

En tiedä sojottaako silmäni johonkin ihan kummaan suuntaan, mutta tuolta mainitsemastasi Faqista en sitä tietoa löytänyt. En vaikka kävin nyt uudestaan katsomassa.

Mutta eipä sillä minulle enään ole väliä, kun sen tiedon muualta sivustolta löysin ja nyt sitä osaan käyttääkin :)

trinit [13.03.2003 20:02:59]

#

Ai juu, ne löytyy tietenkin keskustelualueen ohje-sivulta. Linkki sivulle löytyy Keskustelu alueen etusivulta Ohjeet-linkin takaa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta