Vieläkö saa apuja VB6:een tau oikeastaan VB5:een. Olen koodannut useita ohjelmia VB5:llä mutta eräästä on designversio hukassa ja ohjelma ei näytä enää toimivan. Kyse on binääritiedostoon kirjoituksesta. Tiedostossa on Hexaeditorin mukaan 2 tavua ilmaisten merkkijonon pituuden ja sen jälkeen merkkijono. Näitä peräkkäin, joka toinen salattu. En löydä menetelmää jolla olen tiedoston joskus luonut. Mystistä on se että ohjelma toimi vielä muutama päivä sitten mutta ei enää. Tiedosto ei muutu vaikka lisään sinne jotain tai muutan jotain. Käsipelillä pystyn jotain muuttamaan mutta se ei tule kysymykseen.
Jopas, no vastataan ainoaan kysymykseen:
setä kirjoitti:
Vieläkö saa apuja VB6:een tau oikeastaan VB5:een.
Kyllä täällä varmasti vielä on monia jotka osaa VB6 ja VB5 ja pystyvät auttamaan.
Sinänsähän jos kerran lähdekoodi on hukassa eikä käännetty toimi, niin vaihtoehdot on lienee käyttää jotain ohjelmaa joka pyrkii palauttamaan koodia alkuperäiseksi tai sitten ihan mahdollista koodata koko ohjelma alusta ja tällöin ei tietty ole pakko rajoittua vb:hen.
Yksi mahdollisuus saada ohjelma toimimaan olisi ehkä myös asentaa (mahdollisesti vanhempi) Windows jollekin koneelle tai virtuaalikoneelle ja koittaa ajaa softaa siinä.
Olen hakenut apuja netistä ja viimein päädyin tänne Ohjelmointiputkaan. Muinoin olen saanut apuja Laaksosen Antilta (onko nimi oikein?).
Kyse on pikkuohjelmasta jonka tiedosto liittyy laajempaan ohjelmaan (sukuohjelma).
Lähdekoodi olisi kyllä hienoa saada näkyviin. Luulin kokeilemalla selvittäväni ongelman mutta ei onnistu. Kun kirjoitan testiohjelmalla Put-käskyllä tiedostoon testi.bin niin jostain syystä toisen merkkijonon pituus kirjoittuu tiedoston ensimmäisiksi tavuiksi ja arvo on 2 liian suuri. Alkuperäisessä tiedostossa on pituus (2 tavua) ja merkkijono, seuraava pituus ja merkkijono jne.
Minulla on läppäri jossa Win 7. Pöytäkoneessa on Win 10. Molemmissa on sukuohjelman 2 versiota, SukuC jolla voi vain katsella sukuun kuuluvien henkilöiden tietoja ja kuvia. SukuB on laajempi ja sillä voi päivittää tietoja, ohjelmaa ja ohjetta. Serverin kautta tietoja jaetaan käyttäjille. Pikku ohjelma mikä liittyy näihin molempiin sukuohjelmaversioihin, on käyttäjien tunnuksia ja salasanoja varten. SukuB toimii Win 10:ssä mutta ei SukuC. Enää se ei näytä toimivan Win 7:kään.
Sääli että tuki Visual Basicille on lopetettu. Minusta se on helppo ohjelmointikieli ja nopeat ohjelmat.
Kokeilin myös Win7:llä. Kirjoittaa jostain syystä enismmäsiksi kahdeksi tavuksi asciikoodit 8 0, seuraavaksi merkkijonon pituuden esim. 7 0 ja merkkijonon "ktunnus". Seuraava merkkijono tulee välittömästi edellisen perään. Pitäisi toimia niin, että jokaisen merkkijonon edelle tulee 2 tavua mitkä ilmasevat sen pituuden.
Mä luulen että jos laittaisit jotain konkreettisia kysymyksiä tai esimerkkejä (koodeineen), joissa mielestäsi joku toimii toisin kuin olet odottanut, niin muilla olisi huomattavasti helpompaa auttaa sinua.
Option Explicit Dim fl, s, ph As String Dim k, i, n As Integer, a As String * 2 Dim kt, pw As String Private Sub Form_Load() ph = App.Path & "\" fl = "testi.bin" Kill ph & fl Open ph & fl For Binary As 1 For i = 1 To 5 kt = Left$("abcdefghijklmn", 6 + 8 * Rnd) n = LOF(1) + 1 Put #1, n, kt DoEvents Next Close Open ph & fl For Binary As 1 s = input(LOF(1), #1) Debug.Print s, Len(s) Close End End Sub
Kokeilin koodia mutta ei onnistunut. Siinä on testiohjelma.
Tulos on seuraava:
� � abcdefghijkl� abcdefghij� � abcdefghijk� � abcdefgh� � abcdefgh 69
Ilmeisesti ei saa kuvaa tähän.
Hexeditorilla näkyy chr$(8) jokaisen merkkijonon edessa ja sen jälkeen kaksi tavua jotka ilmisevat merkkijonon pituuden.
Esimmäisen merkkijonon edessä on siis 08 00 0C 00, seuraavan 08 00 0A 00
Eikös toi siis toimi ihan odotetusti. kt on tyypiltään variant, joten sen kirjoittamiseen tulee ensin kaksi tavua joka kertoo mikä tiedon tyyppi on (08 00 => Merkkijono) ja sitten merkkijonon tapauksessa pituus esim 0c 00 => 12 merkkiä.
Eli jos määrittelet:
setä kirjoitti:
Dim kt, pw As String
Se tarkoittaa samaa kuin
Dim kt As Variant, pw As String
Saattaa olla, että haluaisit määritellä:
Dim kt As String, pw As String
Jäi kommentit pois
Kill on vain tarvittaessa. Jos tiedotoa ei tyhjätä, LOF(1) ilmaisee sen hetkisen tiedoston pituuden.
Input-käsky ei toimi ellei tiedostoa välillä sulje.
Jos määrittelen kt:n stringiksi, ei tule mitään tavuja merkkijonon eteen.
Alkuperäisessä tiedostossa on vain 2 tavua jokasen merkkijonon edessä mitkä ilmasevat sen pituuden. Siis tavuja 08 00 ei ole lainkaan. Miten se on mahdollista?
setä kirjoitti:
Input-käsky ei toimi ellei tiedostoa välillä sulje.
Miksei toimisi? Ihan hyvin toimii ainakin minulla, mutta tietysti kannattaa siirtää kursori tiedoston alkuun jos meinaa saada luettua alusta:
'... Next Seek 1, 1 s = Input(LOF(1), #1) '...
Kiitos, Ok !
Mitä koodia käytit että sait värit näkyviin?
Jos haluat pelkän pituuden ja merkkijonon, niin sen voi toki kirjoittaa:
Dim fl, s, ph As String Dim k, i, n As Integer, a As String * 2 Dim kt As String, pw As String ph = App.Path & "\" fl = "testi.bin" Kill ph & fl Open ph & fl For Binary As #1 For i = 1 To 5 kt = Left$("abcdefghijklmn", 6 + 8 * Rnd) n = Len(kt) Put #1, , n Put #1, , kt DoEvents Next Seek 1, 1 s = Input(LOF(1), #1) Debug.Print s, Len(s) Close End
setä kirjoitti:
Mitä koodia käytit että sait värit näkyviin?
Valitsin tuosta alasvetovalikosta kooditagin VB6 / VBA:lle, jolloin tagi on muotoa |koodi VB| (jossa tietty | korvataan hakasuluilla)
Nyt alkaa valjeta! Hyvä. Luulin osaavani Visual Basicia mutta muisti onaika huono eikä helpit toimi enää.
Option Explicit Dim fl, s, ph As String Dim k, i, n As Integer Dim kt As String, pw As String Private Sub Form_Load() ph = App.Path & "\" fl = "testi.bin" Open ph & fl For Binary As 1 For i = 1 To 5 kt = Left$("abcdefghijklmn", 6 + 8 * Rnd) n = Len(kt) Put #1, , n Put #1, , kt pw = Left$("12345678901234", 6 + 8 * Rnd) n = Len(pw) Put #1, , n Put #1, , PV Next Seek 1, 1 s = input(LOF(1), #1) Debug.Print s, Len(s) Close End End Sub
Grezille suuret kiitokset! Ilman tuon Dim-määrittelyn korjausta en saanut lainkaan ohjelmaa toimimaan oikein. Luulin että määrittelyllä:
Din kt, pw as string
Molemmat muuttujat ovat stringejä. Täytyy vielä opiskella Dim-määrittelyä. Onko siis aina ilman tyyppimääritystä muuttujan tyyppi Variant. Kuvittelin että rivin lopussa ollut määritys kopioituu kaikille Dim-lauseessa oleville muuttujille.
Kyllä, jos määrittelet muuttujan Dimillä, mutta et kerro minkä tyypin haluat, se saa tyypiksi variant.
Näissähän ei tarvi arvailla mitä tapahtuu. Ainakin Excelin VBA:ssa, editori kertoo mikä muuttujan tietotyyppi on, kun menet hiirellä muuttujan päälle. En jaksanut asentaa VB6:sta, mutta luulisin että siinäkin toimii samoin.
Koodauksessa on mielestäni vähän tyhmää olettaa, kun pystyy helposti tarkistamaan.
Jossain näin dim-lauseessa erotetun pilkulla muuttujia ja vain viimeisen tyyppi oli määrätty. Ajattelin vain että noinhan se käy lyhyemmin.
VB5:ssä näyttää vain Emptyä jos ei ole tyyppiä määritelty. Jos on, näyttää 0 tai tyhjä eli "". En tiedä VB5:ssä miten tyypin saa selville katsomatta miten ne on määritelty. Määrittelemätön näyttää olevan Variant tyyppiä koska hyväksyy useat tyypit.
Hmm, taisin nähdä unta. Ei tuo excelinkään VBA editori näköjään näytä muuttujan tyyppiä vaan sen arvon jos menee hiirellä päälle. Olen vissiin liian tottunut uudenaikaisempiin työkaluihin...
Watch -ikkunassa sentään näkyy tyyppinä esim. Variant/String jos tietotyyppi on variant ja sen sisältö on merkkijono. TypeName tai VarType -funktiot ei näyttäneet suoraan auttavan sen selvittämisessä onko kyseessä Variant vai ei.
Asian voi toki päätellä mutkan kautta siitä, että muuttujan tietotyyppi vaihtuu:
Dim kt, pw As String Dim i As Integer kt = "Teksti" pw = "Teksti" For i = 1 To 2 Debug.Print "kt", kt, TypeName(kt) Debug.Print "pw", pw, TypeName(pw) kt = i pw = i Next
Tulos:
kt Teksti String pw Teksti String kt 1 Integer pw 1 String
Aihe on jo aika vanha, joten et voi enää vastata siihen.