Olen juuri aloittanut tutustumisen visual basiciin, tarkoitus olisi saada aikaiseksi kalenteri jossa voisi
käyttää vb omaa kalenteri komponenttia. Miten sen saisi toimimaan niin, että päivämäärää klikkaamalla saisi tehtyä tiedoston johon voisi tallentaa siihen päivämäärään kohdistuvia merkintöjä ?
Kyseessä on varmaan nyt MonthView-kontrolli?
Kalenterin klikkaus aiheuttaa DateClick-tapahtuman, jonne voit panna sopivan koodin. Vastaava tapahtuma kaksoisklikkauksen jälkeen on DateDblClick. Molemmissa DateClicked-parametri ilmoittaa valitun päivämäärän.
Päivämäärän saa milloin tahansa selville Value-ominaisuudesta.
Sitten vain lisäät tekstilaatikon ja napin, jota painamalla teksti tallentuu kalenterista valitun päivämäärän mukaiseen tiedostoon. Samaan tapaan merkinnät haetaan kalenterissa liikkuessa, jos oikeanniminen tiedosto on olemassa.
ja vielä muutama tyhmä kysymys lisää...
- Eli noilla ohjeilla sen pitäisi toimia niin, että jos olen tallentanut jollekkin päivämäärälle aikaisemmin tekstiä yms. niin löydän sen jatkossa klikkaamalla kyseistä päivämäärää kalenterista?
- Onnistuuko samoilla ohjeilla, jos teen sen "microsoft Calendar Control 8.0" komponenttiä käyttäen?
- Joo.
- Ei välttämättä ihan samoilla, mutta samantapaiset ominaisuudet ja tapahtumat siinäkin takuulla on.
Jotta data säilyisi sinun täytyy tallentaa se jonnekin, esimerkiksi tekstitiedostoon ja ladata data sitten sieltä käsin ohjelmaan oikeiden päivämäärien kohdalle.
Tässä esimerkki tiedostoon tallentamisesta:
'Taulukot joissa on kuukauden ajalta datat. Dim Aika(1 to 31) As Date Dim Teksti(1 To 31) as String 'app.path tarkoittaa ohjelman polkua. Open App.Path & "\kalenteri.dat" for output as #1 'käydään läpi taulukoiden jokaiset solut For I = 1 to 31 Print#1, Aika(i) & "|" & Teksti(i) & vbcrlf Next Close #1
Datan latauksen jätän sitten sinun itsesi pähkäiltäväksi.
Vihjeeksi kuitenkin Split niminen funktio ja https://www.ohjelmointiputka.net/hak/?kieli=Visual Basic&alue=Merkkijonot
Tuo Antin tapa on varmaankin helpompi, eli jokaiselle päivämäärälle oma tiedosto. Silloin ei tarvitse pähkäillä sitä, miten erottaa eri päivät toisistaan.
Tulee vain vähän turhan paljon filuja ja niiden latausta.
No, kukin tehköön parhaaksi katsomallaan tavalla.
Antti Laaksonen kirjoitti:
Kalenterin klikkaus aiheuttaa DateClick-tapahtuman, jonne voit panna sopivan koodin.
Voisitko antaa noviisille vielä vähän apuja, mikä mahtaisi olla "sopiva koodi"?
Sopivalla koodilla tarkoitettiin sitä koodia, jota ohjelmasi kuuluu tehdä tuossa DateClick proseduurissa. Eli se koodi joka suoritetaan jotakin päivämäärää tuossa kalenterissa klikatessa.
kokeilin tuolla sinun antamalla koodinpätkällä ja sain aikaiseksi dat tiedoston. vielä jää arvoitukseksi miten saan sen datan ladattua.
Tässä tulee oma ratkaisuni, johon kuuluvat kontrollit MonthView1, Text1 ja Command1.
Private Sub MonthView1_DateClick(ByVal DateClicked As Date) Dim tnimi As String ' muodostetaan tiedoston nimi tnimi = App.Path & "\" & DateClicked & ".txt" ' jos tiedosto on olemassa, luetaan sen tiedot tekstilaatikkoon If Dir(tnimi) <> "" Then Open tnimi For Input As #1 Text1.Text = Input(LOF(1), #1) Close #1 ' muuten tyhjennetään tekstilaatikko Else Text1.Text = "" End If End Sub Private Sub Command1_Click() Dim tnimi As String ' muodostetaan tiedoston nimi tnimi = App.Path & "\" & MonthView1.Value & ".txt" ' kirjoitetaan tiedostoon tekstilaatikon sisältö Open tnimi For Output As #1 Print #1, Text1.Text Close #1 End Sub
Merkinnät tallennetaan ohjelman kanssa samaan hakemistoon, kukin omaan tiedostoonsa. Tälle päivälle merkityt tiedot esimerkiksi tallennetaan tiedostoon 23.12.2004.txt. Kun kalenterista valitaan päivä, ladataan siihen liittyvät merkinnät tai tiedoston puuttuessa tyhjennetään tekstilaatikko. Kun napista painetaan, tekstilaatikkoon kirjoitetut tiedot tallennetaan kalenterista valitun päivän kohdalle.
kiitos, toimii tosi hienosti
vielä yksi kysymys aiheeseen: jos haluan tallentaa text tiedostot erilliseen tiedostoon enkä samaan kuin missä itse ohjelmaa sijaitsee, niin mihin kohtaan tämän erillisen tiedoston polku kirjoitetaan ?
No tuo Laaksosen koodihan kirjottaa ne erillisiin tiedostoihin. Vai tarkotikko kenties hakemistoja?
No, joka tapauksessa, tuossa esimerkissä se hakemistopolku sijaitsee tuossa tnimi -muuttujassa. Tuo App.Path palauttaa aina sen hakemiston, josta ohjelmaa ajetaan, sen tilalel voi laittaa jotain muuta.
On tämä alku hankalaa ! voisiko joku vielä ystävällisesti antaa vinkin, miten saan tulostettua printterille haluamani teksti tiedoston (esim: auki olevan päivän)
Tekstifilun ulostus on aika helppoa. Printer-oliolla on samanlainen print-metodi kuin pictureboxilla, eli Printer.Print "Moi" printtaa Moi-tekstin. Ton kanssa kannattaa sitten mittailla vähän että rivittää tekstin oikein ettei se mene "paperin ulkopuolelle". Taisi olla Printer.EndDoc joka sitten kertoo printterille että nyt saa sylkeä paperin ulos. Printtaaminen kannattaa aluksi harjoitella vaikka pictureboxilla.
joo nyt saan tulostettua jo paperille asti. millä koodin pätkällä saisin tulostettua kalenteri kyhäelmästä aina auki olevan kyseisen päivämäärän kokonaisuudessaan. nyt se tulostaa vain ensimmäisen rivin ?
Miten säilytät tietoja? Tiedot jossain taulukossa yms?
Laita vaikka printtaus koodin tähän näkyviin.
tiedot tallentuvat jokainen omaan tiedostoon (.txt)
Private Sub tulosta_Click() Printer.Print Text1.Text Printer.EndDoc End Sub
ongelma ilmenee ainoastaan silloin kun teksi ylittää teksikentän eli ei mahdu kenttään, vaan jatkuu seuraavalla rivillä. jos kirjoitan useampia rivejä mutta rivit mahtuvat teksti kenttään, niin silloin ne tulostuvat omille riveillensä.
esim: tämä tulostuu oikein, kaikki rivit tulevat paperille.
Private Sub MonthView1_DateClick(ByVal DateClicked As Date) Dim tnimi As String ' muodostetaan tiedoston nimi tnimi = "C:\Kalenteri\loki" & "\" & DateClicked & ".txt" ' jos tiedosto on olemassa, luetaan sen tiedot tekstilaatikkoon If Dir(tnimi) <> "" Then Open tnimi For Input As #1 Text1.Text = Input(LOF(1), #1) Close #1 ' muuten tyhjennetään tekstilaatikko Else Text1.Text = ""
mutta tämä ei tulostu kuin ensimäisellä rivillä
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.
Aihe on jo aika vanha, joten et voi enää vastata siihen.