Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: vb tallennus

Sivun loppuun

OkkiZ [02.09.2004 18:14:14]

#

Olen tehnyt oman ohjelman vb:llä (laskutuspohja).

Mutta, miten saan laskupohjan tallennettua koneelle kun se on valmis?? Ohjelmani on .exe ja haluaisin tallentaa sen exe:nä. Ymmärtääköhän ketään mitä koitan sanoa :D commondialogilla saan näkymään tallenna ikkunan mut mitään ei tallennu, koska jotain oleellista puuttuu... PS. Älkää hermoilko koska olen aloittelija ja muistakaa vääntää rautalangasta että minäkin tajuan!!

setä [02.09.2004 18:37:50]

#

tarkoitatko, että kun olet syöttänyt laskupohjaan lukuja, niin ne pitäisi tallentaa exe-tiedostoon siten, että kun käynnistät sen seuraavan kerran niin luvut ovat siellä valmiina. Ei varmaankaan onnistu. Tallenna data erilliseen tiedostoon, josta exe lukee ne.

hunajavohveli [02.09.2004 18:49:11]

#

Joo, ohjelman Exeen ei kannata ruveta mitään kirjoittelemaan. Tee niin kuin setä neuvoi, ja tallenna erilliseen tiedostoon ASCII- tai binäärimuodossa riippuen datan laadusta. Hausta, koodivinkeistä ja oppaista löytyy ohjeita tallentamiseen ja lataamiseen, jollet vielä osaa sitä.

tuomas [02.09.2004 18:51:27]

#

Mikäli et osaa tallentaa sitä dataa mihinkään erilliseen tiedostoon kannattaa katsoa koodivinkit sekä oppaat osiota.

OkkiZ [02.09.2004 19:17:02]

#

Tarkoitan juuri sitä mitä setä sanoi.
Taitaa mennä turhan hankalaksi vai? Kaikkee ei voi saada PRKL!

hunajavohveli [02.09.2004 19:25:06]

#

No jos kyse on nimenomaan siitä, että haluat välttämättä tallentaa tietoa ohjelman Exeen, niin ei se tietääkseni mahdotonta ole. Käsittääkseni on parasta tallentaa data Exen ohjelmakoodin perään, ja jotenkin varmistaa, ettei se sekoitu ohjelmakoodiin ja aiheuta virheellistä toimintaa. Mitään tarkempia ohjeita en osaa antaa, kun en ole tuollaista koskaan kokeillut.

Antti [03.09.2004 08:38:31]

#

Vohveli... kyllä datan tallentaminen exeen on melkoisen mahdotonta kääntämättä exeä uudelleen.

BadSource [03.09.2004 08:52:06]

#

OkkiZ kirjoitti:

PS. Älkää hermoilko koska olen aloittelija ja muistakaa vääntää rautalangasta että minäkin tajuan!!

Kun nyt muistaa lähtökohdat, niin puheet

hunajavohveli kirjoitti:

tallentaa data Exen ohjelmakoodin perään

on varsin turhaa.

OkkiZ kirjoitti:

Taitaa mennä turhan hankalaksi vai?

Ei ollenkaan. Seuraava lainaus on Laaksosen kirjoittamasta Visual Basic Oppaasta, jota voit käyttää/soveltaa tallentaaksesi laskutuspohjasi.

Laaksosen opas kirjoitti:

Peräkkäistiedostot

Peräkkäistiedostoista on eniten hyötyä silloin, kun haluaa tehdä ohjelmalle oman tallennusformaatin tai jos haluaa tallentaa tietueessa olevaa tietoa.

Seuraavassa on näyte peräkkäistiedostojen käytöstä tietueen kanssa:

Type HTiedot
   nimi As String
   ika As Integer
   palkka As Currency
End Type

'aliohjelmaan:

Dim tiedot As HTiedot
tiedot.nimi = "Jussi Virtanen"
tiedot.ika = 25
tiedot.palkka = 2500

Open "c:\hakemisto\tiedosto.dat" For Binary As #1
Put #1, ,tiedot
Close #1

Nyt tiedostossa tiedosto.dat on kaikki tietueen muuttujat - yhdellä tallennuskäskyllä. Tiedot voisi ladata takaisin tietueeseen seuraavasti:

Type HTiedot
   nimi As String
   ika As Integer
   palkka As Currency
End Type

'aliohjelmaan:

Dim tiedot As HTiedot

Open "c:\hakemisto\tiedosto.dat" For Binary As #1
Get #1, ,tiedot
Close #1

Msgbox tiedot.nimi
Msgbox tiedot.ika
Msgbox tiedot.palkka

Peräkkäistiedostoissa avaustapa on siis Binary. Tiedostoa pystyy sekä lukemaan että kirjoittamaan samalla avauskerralla - komennoilla Get ja Put. Tietoa kirjoitetaan/luetaan järjestyksessä, jos toisen parametrin jättää pois, muuten sitä voidaan lukea mistä kohtaa tiedostoa tahansa.

Eli muutat tuota Typeä siten, että se sisältää laskutuspohjaltasi kaikki tiedot jotka haluat tallentaa. Ja ennen kuin tallennus tai luku tapahtuu voidaan kysyä käyttäjältä tiedostonnimeä joka avataan/johon tallennetaan, jos laskutuspohjia on useita.

Edit: typote...

setä [03.09.2004 11:19:45]

#

Tuo Laaksosen peräkkäistietoesimerkki ei ole hyvä useammille henkilöille tai tietueille. Varminta on avata tiedosto erikseen lukua ja kirjoitusta varten ja varmistaa seek-käskyllä, ettei kirjoiteta jo olemassa olevan tiedon päälle. Jos samaa tiedostonumeroa lukee ja välillä kirjoittaa menee tietueet sekaisin. On siis vain joko luettava tai kirjoitettava. Tässä taoauksessa kyllä esimerkki sopii, kun tiedot tallennetaan ohjelman sulkemisen jälkeen ja luetaan käynnistyksen jälkeen. Luetaan siis kerralla kaikki tallennetut tiedot.
Lukeminen mistäkohtaa tahansa ei onnistu, koska ei ole tietoa tietueen alkukohdasta. Siksi tietoa on luettava aina peräkkäin alusta loppuun. Tiedostoon tallentuu merkkijonon eteen myös sen pituus, jolloin luettaessa tiedetään, montako tavua merkkijonoon kuuluu.
Random-tiedostolla on kiinteä tietuepituus ja sitä on helppo lukea mistä kohtaa tahansa. Binääritiedostossa tarvitaan erillistä indeksointia osoittamaan tietueiden alkukohtaa.

hunajavohveli [03.09.2004 15:07:37]

#

En minäkään suosittele Exeen kirjoittamista, mutta olen kuullut, ettei se mahdotontakaan ole. Ainakin ristinollakilpailun yhteydessä oli jotain puhetta tästä, kun keskusteltiin huijausmahdollisuuksista.
Mutta jos tässä nyt on siis kyse siitä, ettei halua ohjelman käyttäjien lukevan/muuttavan tiedostoa, niin paras tapa lienee kryptata se.

Antti Laaksonen [03.09.2004 16:02:08]

#

Alkuperäiseen ongelmaan ainoa järkevä ratkaisu on tallentaa tiedot erilliseen datatiedostoon. Mutta EXE-tiedoston tietojen muuttaminen on myös mahdollista, jos tietää, mihin kohtaan ne on tallennettu. Tässä on esimerkkiohjelma:

Private Sub Form_Load()
    Dim tiedot As String
    tiedot = "ABCDEFGHIJKLMN"
End Sub

Heksaeditorin avulla ohjelman sisältä paljastuu:

000015D0  00 00 00 00 1C 00 00 00  41 00 42 00 43 00 44 00  ........A.B.C.D.
000015E0  45 00 46 00 47 00 48 00  49 00 4A 00 4B 00 4C 00  E.F.G.H.I.J.K.L.
000015F0  4D 00 4E 00 00 00 00 00  56 42 41 36 2E 44 4C 4C  M.N.....VBA6.DLL

Ja noita tietoja voisi ihan helposti muuttaa toisesta ohjelmasta käsin. Oman käynnissä olevan EXE-tiedoston muuttaminen ajon aikana ei kuitenkaan ole mahdollista.


Sivun alkuun

Vastaus

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

Tietoa sivustosta