Olen aloittelija, ja toivon että saan asiallisia vastauksia.
Eli olen alkanut tekemään kalenteria, mutta en keksi, miten merkintöja ja tapahtumia voisi tallentaa. Voisiko joku kohtuu perusteellisesti neuvoa, miten saisin homman toimimaan.(Mieleeni on jäänyt Nea, joka aina jaksaa aloittelijoitakin neuvoa, jos vaikka hän tulisi apuun.) Käytän objektia nimeltä MonthCalendar.
(Mod. huom: Älä nosta aiheita turhilla viesteillä! Aihe ei todellakaan näytä alle kahdessa tunnissa hukkuvan: näkyy uusissa keskusteluissa ainakin päivän ja VB-alueen listauksen ensimmäisellä sivulla monta viikkoa.)
Morjens taas ZuBer!
tässä sulle yksinkertainen esimerkki...jutska muuttuu paljon jännittävämmäksi jos yhdistät viritelmään OnTimer-Hälytys toiminnon...
'Projektiin refernssi: 'Microsoft ActiveX Data Objects Library 2.8 Library '(C:\Program Files\Common Files\System\ado\msado15.dll) Private Tietokanta As New ADODB.Connection Private Tietueet As New ADODB.Recordset Private TaulunNimi As String Private KokoPolku As String Private tila As Integer Private ValittuPvm As Date Private Type KalenteriTyyppi Pvm As Date Klo As Date Muistutus As String End Type Dim Kalenteri() As KalenteriTyyppi Private Sub Form_Load() Dim TietokannanNimi As String Dim TiedostoLaajennin As String TiedostoLaajennin = "mdb" TietokannanNimi = "Tietokanta" Dim KansionPolku As String KansionPolku = Environ("userprofile") & "\Työpöytä" KokoPolku = KansionPolku & "\" & _ TietokannanNimi & "." & TiedostoLaajennin TaulunNimi = "Taulu" Tietokanta.ConnectionString = _ "PROVIDER=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & KokoPolku ValittuPvm = DateSerial(Year(Now), Month(Now), Day(Now)) Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(Now), Month(Now), Day(Now))), ".") Dim Pvm As String Pvm = PvmTaulukko(1) & "-" & _ PvmTaulukko(0) & "-" & PvmTaulukko(2) Erase PvmTaulukko TuoTiedotTietokannasta _ "Select* From [" & TaulunNimi _ & "] Where Pvm=#" & Pvm & "#" TextBox1.Text = "" End Sub Private Sub ComboBox1_Change() If ComboBox1.ListIndex > 0 Then tila = 1 TextBox1.Text = Kalenteri( _ ComboBox1.ListIndex - 1).Muistutus AsetaKellonaika CStr(Kalenteri( _ ComboBox1.ListIndex - 1).Klo) MonthView1.Year = Year(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) MonthView1.Month = Month(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) MonthView1.Day = Day(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) Else tila = 0 TextBox1.Text = "" AsetaKellonaika CStr(Time) MonthView1.Year = Year(Now) MonthView1.Month = Month(Now) MonthView1.Day = Day(Now) End If End Sub Private Sub Button2_Click() tila = 1: Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(ValittuPvm), Month(ValittuPvm), Day(ValittuPvm))), ".") Dim Pvm As String Pvm = PvmTaulukko(1) & "-" & _ PvmTaulukko(0) & "-" & PvmTaulukko(2) TuoTiedotTietokannasta "Select* From [" & TaulunNimi _ & "] Where Pvm=#" & Pvm & "#" End Sub Private Sub Button3_Click() TextBox1.Text = "": tila = 0 ComboBox1.ListIndex = 0 MonthView1.Year = Year(Now) MonthView1.Month = Month(Now) MonthView1.Day = Day(Now) End Sub Private Sub MonthView1_DateClick(ByVal DateClicked As Date) ValittuPvm = DateClicked End Sub Private Sub CommandButton1_Click() If TextBox1.Text <> "" And tila = 0 Then Tietokanta.Open Tietueet.Open "Select* From [" & _ TaulunNimi & "]", Tietokanta, adOpenDynamic, adLockOptimistic If Not Tietueet.BOF And Tietueet.EOF Then Tietueet.MoveLast End If Tietueet.AddNew Tietueet.Fields(1).Value = DateSerial( _ MonthView1.Year, MonthView1.Month, MonthView1.Day) Tietueet.Fields(2).Value = _ TimeSerial(Val(TextBox2.Text), Val(TextBox3), 0) Tietueet.Fields(3).Value = TextBox1.Text Tietueet.Update Tietueet.Close Tietokanta.Close TextBox1.Text = "" End If End Sub Private Sub SpinButton1_Change() TextBox2.Text = SpinButton1.Value End Sub Private Sub SpinButton2_Change() TextBox3.Text = CStr(SpinButton2.Value / 10) End Sub Private Sub TextBox3_Change() TextBox3.Text = Replace(TextBox3.Text, ",", "") If Len(TextBox3.Text) = 1 Then TextBox3.Text = TextBox3.Text & "0" End If End Sub Sub TuoTiedotTietokannasta(ByVal Sql As String) Tietokanta.Open Tietueet.Open Sql, Tietokanta TextBox1.Text = "" If Not Tietueet.BOF And Tietueet.EOF Then Tietueet.MoveFirst End If Erase Kalenteri ComboBox1.Clear ComboBox1.AddItem "" Dim Laskuri As Integer Do While Not Tietueet.EOF Dim ulottuvuus As Integer On Error Resume Next ulottuvuus = UBound(Kalenteri) If Err <> 0 Then Err.Clear On Error GoTo 0 ReDim Kalenteri(0) Else ReDim Kalenteri(UBound(Kalenteri) + 1) End If Laskuri = Laskuri + 1 'Huom! Kenttä Tietueet.Fields(0) on laskuri... Kalenteri(UBound( _ Kalenteri)).Pvm = Tietueet.Fields(1).Value Kalenteri(UBound( _ Kalenteri)).Klo = Tietueet.Fields(2).Value Kalenteri(UBound( _ Kalenteri)).Muistutus = Tietueet.Fields(3).Value ComboBox1.AddItem CStr(Laskuri) & ". Muistutus" Tietueet.MoveNext Loop Tietueet.Close: Tietokanta.Close If ComboBox1.ListCount > 0 Then ComboBox1.ListIndex = 1 End If ComboBox1.ListIndex = 0 End Sub Sub AsetaKellonaika(ByVal Aika As String) Dim ajat() As String ajat = Split(Aika, ":") SpinButton1.Value = Val(ajat(0)) SpinButton2.Value = Val(ajat(1)) Erase ajat End Sub
en ole testannut jutskaa VB:llä mutta täältä voi impata VBA-version
Kiitos paljon! Pitää testailla.
Laitanko tuon kaiken koodin Form1:seen?
EDIT: Visual Basicista ei löydy SpinButtonia eikä MonthWiewiä, mitä tilalle?
Morjens taas ZuBer!
Kyllä, copy/paskanna koodi Form1:lle (koodissa on pari pikku bugia, mutta niistä myöhemmin...)
SpinButton kuuluu VB6 Pro/Enterprise versioissa peruspakettiin.
(Outrider SpinButton Control Spin32.ocx 1.00.0044)
MonthView-kontrolli löytyy ainakin Visual Basic 6.0 SP6-paketista (Spin32 & MonthView ovat osana mscomctl2.ocx:ää)
Imppaa täältä VB6.0 SP6
Tämä voi auttaa ongelmiin, kun asentelet tuotoksiasi toisiin koneisiin.
Imppaaa täältä tietoturvapäivitys, joka asettaa kill-bitit mm. Hierachical Flex Grid-kontrollille...
Täältä voit impata SpinButton.ocx aivan erikseen...
mikäli järjestelmäsi on 32-bittinen niin kopioi Spin32.ocx \WINDOWS\System32 -kansioon, klikkaa Käynnistä -> Suorita, kirjoita laatikkoon: regsvr32 C:\Windows\system32\spin32.ocx & klikkaa OK-nappia.
Mikäli järjestelmäsi sattuu olemaan 64-bittinen niin täältä löytyy ohjeita...
tässä vielä muutettu koodi mikäli imuroit Spin32.ocx:n singlenä...
'Projektiin refernssi: 'Microsoft ActiveX Data Objects Library 2.8 Library '(C:\Program Files\Common Files\System\ado\msado15.dll) 'Lomakkeen ohjauobjektit: 'MonthView, ComboBox; TextBox & 3 Nappia, Private Tietokanta As New ADODB.Connection Private Tietueet As New ADODB.Recordset Private TaulunNimi As String Private KokoPolku As String Private tila As Integer Private ValittuPvm As Date Private SpinValue1 As Integer Private SpinValue2 As Integer Private Const SpinMin = 0 Private Const SpinMax1 = 24 Private Const SpinMax2 = 59 Private Sql As String Private Type KalenteriTyyppi Pvm As Date Klo As Date Muistutus As String End Type Dim Kalenteri() As KalenteriTyyppi Private Sub Form_Load() Dim KansionPolku As String KansionPolku = Replace( _ ThisWorkbook.FullName, _ ThisWorkbook.Name, "") KokoPolku = KansionPolku & "Tietokanta.mdb" TaulunNimi = "Taulu" Tietokanta.ConnectionString = _ "PROVIDER=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & KokoPolku ValittuPvm = DateSerial( _ Year(Now), Month(Now), Day(Now)) Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(Now), Month(Now), Day(Now))), ".") Dim Pvm As String Pvm = PvmTaulukko(1) & "-" & _ PvmTaulukko(0) & "-" & PvmTaulukko(2) Erase PvmTaulukko AsetaKellonaika CStr(Time) TuoTiedotTietokannasta _ "Select* From [" & TaulunNimi _ & "] Where Pvm=#" & Pvm & "#" Text1.Text = "" Text2.Locked = True Text3.Locked = True End Sub Private Sub ComboBox1_Change() Dim ajat() As String If ComboBox1.ListIndex > 0 Then tila = 1 Text1.Text = Kalenteri( _ ComboBox1.ListIndex - 1).Muistutus AsetaKellonaika CStr(Kalenteri( _ ComboBox1.ListIndex - 1).Klo) MonthView1.Year = Year(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) MonthView1.Month = Month(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) MonthView1.Day = Day(Kalenteri( _ ComboBox1.ListIndex - 1).Pvm) Else tila = 0 Text1.Text = "" AsetaKellonaika CStr(Time) MonthView1.Year = Year(Now) MonthView1.Month = Month(Now) MonthView1.Day = Day(Now) End If End Sub Private Sub Command2_Click() tila = 1: Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(ValittuPvm), Month(ValittuPvm), Day(ValittuPvm))), ".") Dim Pvm As String Pvm = PvmTaulukko(1) & "-" & _ PvmTaulukko(0) & "-" & PvmTaulukko(2) TuoTiedotTietokannasta "Select* From [" & TaulunNimi _ & "] Where Pvm=#" & Pvm & "#" End Sub Private Sub Command3_Click() Text1.Text = "": tila = 0 ComboBox1.ListIndex = 0 MonthView1.Year = Year(Now) MonthView1.Month = Month(Now) MonthView1.Day = Day(Now) End Sub Private Sub MonthView1_DateClick(ByVal DateClicked As Date) ValittuPvm = DateClicked End Sub Private Sub Command1_Click() If Text1.Text <> "" And tila = 0 Then Tietokanta.Open Tietueet.Open "Select* From [" & _ TaulunNimi & "]", Tietokanta, adOpenDynamic, adLockOptimistic If Not Tietueet.BOF And Tietueet.EOF Then Tietueet.MoveLast End If Tietueet.AddNew Tietueet.Fields(1).Value = DateSerial( _ MonthView1.Year, MonthView1.Month, MonthView1.Day) Tietueet.Fields(2).Value = _ TimeSerial(Val(Text2.Text), Val(Text3), 0) Tietueet.Fields(3).Value = Text1.Text Tietueet.Update Tietueet.Close Tietokanta.Close Text1.Text = "" ValittuPvm = DateSerial( _ Year(Now), Month(Now), Day(Now)) MonthView1.Value = ValittuPvm AsetaKellonaika CStr(Time) End If End Sub Private Sub SpinButton1_SpinDown() If SpinValue1 > SpinMin Then SpinValue1 = SpinValue1 - 1 End If Text2.Text = CStr(SpinValue1) End Sub Private Sub SpinButton1_SpinUp() If SpinValue1 < SpinMax1 Then SpinValue1 = SpinValue1 + 1 End If Text2.Text = CStr(SpinValue1) End Sub Private Sub SpinButton2_SpinDown() If SpinValue2 > SpinMin Then SpinValue2 = SpinValue2 - 1 End If Text3.Text = Replace(CStr( _ SpinValue2 / 10), ",", "") End Sub Private Sub SpinButton2_SpinUp() If SpinValue2 < SpinMax2 Then SpinValue2 = SpinValue2 + 1 End If Text3.Text = Replace(CStr( _ SpinValue2 / 10), ",", "") End Sub Private Sub Text2_Change() If Text1.Text = "24" And _ Text2.Text <> "00" Then Text2.Text = "00" Spin2Value = 0 End If End Sub Private Sub Text3_Change() If Len(Text2.Text) = 1 Then Text2.Text = Text2.Text & "0" End If If Text1.Text = "24" And _ Text2.Text <> "00" Then Text1.Text = "0" SpinValue1 = 0 End If End Sub Sub TuoTiedotTietokannasta(ByVal Sql As String) Text1.Text = "": Tietokanta.Open Tietueet.Open Sql, Tietokanta If Not Tietueet.BOF And Tietueet.EOF Then Tietueet.MoveFirst End If Erase Kalenteri ComboBox1.Clear ComboBox1.AddItem "" Dim Laskuri As Integer Do While Not Tietueet.EOF Dim ulottuvuus As Integer On Error Resume Next ulottuvuus = UBound(Kalenteri) If Err <> 0 Then Err.Clear On Error GoTo 0 ReDim Kalenteri(0) Else ReDim Kalenteri(UBound(Kalenteri) + 1) End If Laskuri = Laskuri + 1 'Huom! Kenttä Tietueet.Fields(0) 'on taulun tietuelaskuri... Kalenteri(UBound( _ Kalenteri)).Pvm = Tietueet.Fields(1).Value Kalenteri(UBound( _ Kalenteri)).Klo = Tietueet.Fields(2).Value Kalenteri(UBound( _ Kalenteri)).Muistutus = Tietueet.Fields(3).Value ComboBox1.AddItem CStr(Laskuri) & ". Muistutus" Tietueet.MoveNext Loop Tietueet.Close: Tietokanta.Close ComboBox1.ListIndex = 0 End Sub Sub AsetaKellonaika(ByVal Aika As String) Dim ajat() As String ajat = Split(Aika, ":") SpinValue1 = Val(ajat(0)) SpinValue2 = Val(ajat(1)) Text2.Text = CStr(SpinValue1) Text3.Text = Replace(CStr( _ SpinValue2 / 10), ",", "") Erase ajat End Sub
MS Access - esimerkki tietokanta Nimi: Tietokanta Taulut Nimi: Taulu Taulun kentät Nimi: nro (perusavain, laskuri) Nimi: Pvm (Pvm./Klo, syöttörajoite: lyhyt pvm.) Nimi: Aika (Pvm./Klo, syöttörajoite: lyhyt klo.) Nimi: Muistutus (Memo)
Minulla on Visual Basicin uusin versio, joten toimivatko nuo kaikki jutut siinä?
Onko sinulla siis klassisen Visual Basicin uusin versio (VB6) vai Microsoftin uusin VB.Net-kehitysympäristö eli Visual Basic 2010 Express? Klassinen VB ja VB.Net ovat kaksi aivan eri asiaa.
Visual Basic 2010. :D
Morjens taas ZuBer!
ALUKSI:
Kun puhut kalkkiksille niin VB on VB6 (tai vanhempi) ja VB.NET on VB 2002 - 2010 -> tulevaisuus(Visul Basic 2002 julkaistiin nimellä VB.NET 2002)
Elikä liitä aiheen otsikkoon joko (VB),(VBA) tai (VB.NET) niin kalkkiskin tietää missä mennään...
Esimerkin tietokanta-malli (MSAccess)
Tietokannan tulee sijaita samassa kansiossa, kuin Projektista luotava .exe-tiedosto
(Designerin Debuggerilla ajettaessa: ..\Bin\Debug\ tai ..\Bin\Release\)
Tietokanta Nimi: Tietokanta Taulut Nimi: Taulu Taulun kentät Nimi: nro (perusavain, laskuri) Nimi: Pvm (Pvm./Klo, syöttörajoite: lyhyt pvm.) Nimi: Aika (Pvm./Klo, syöttörajoite: lyhyt klo.) Nimi: Muistutus (Memo)
' ' Created by SharpDevelop. ' User: Nea Uusitalo ' Date: 27.11.2010 ' Time: 11:05 ' 'Päälomakkeelle: '1 MonthCalendar-kontrolli (monthCalendar1) '2 NumericUpDown-kontrollia (numericUpDown1 & numericUpDown2) '(Minimum=0,numericUpDown1.Maximum=24, numericUpDown2.Maximum=59) '2 labellia (label1 & label2) '1 TextBox (textBox1, Multiline=True) 'aseta labellit & numericUpDown-kontrollit riviin: 'label1 & numericUpDown1, pieni väli, label2 & numericUpDown2 'kavenna numericUpDown-kontrollit niin, että niiden teksti ei näy 'Väännetty SharpDevelop 4.0 Beta 4:lla '(joten älä copy/pasteta koko koodia suoraan 'Visual Basic .NET (2002-2010) oletus-pääformille 'Form1') Imports System.Data Imports System.Data.OleDb Imports Microsoft.VisualBasic Public Partial Class MainForm Private yhteys As OleDbConnection = Nothing Private ValittuPvm As Date Private tila As Integer Private TaulunNimi As String = String.Empty Private Structure TiedotStructure Dim Pvm As Date Dim Klo As Date Dim Tiedote As String End Structure Private Tiedotukset(0) As TiedotStructure Public Sub New() Me.InitializeComponent() End Sub Sub MainForm_Load(sender As Object, e As EventArgs) Dim TietokannanNimi As String = "Tietokanta.mdb" Dim TietokannanPolku As String = _ Application.StartupPath + "\" + TietokannanNimi TaulunNimi = "Taulu" Dim yhteysmerkkijono As String = _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ + TietokannanPolku + ";Persist Security Info=False;" yhteys = New OleDbConnection(yhteysmerkkijono) ValittuPvm = DateSerial(Year(Now),Month(Now),Day(Now)) Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(Now), Month(Now), Day(Now))), ".") Dim Pvm As String Pvm = PvmTaulukko(1) & "-" & _ PvmTaulukko(0) & "-" & PvmTaulukko(2) PvmTaulukko = Nothing AsetaKellonaika(CStr(TimeOfDay)) TextBox1.Text = String.Empty End Sub Sub Label1_TextChanged(sender As Object, e As EventArgs) If Label1.Text = "24" And Label2.Text <> "00" Then Label2.Text = "00": numericUpDown2.Value = 0 End If End Sub Sub Label2_TextChanged(sender As Object, e As EventArgs) If Label2.Text.Length = 1 Then Label2.Text += "0" End If If Label1.Text = "24" And Label2.Text <> "00" Then Label1.Text = "00" numericUpDown1.Value = 0 End If End Sub Sub NumericUpDown1_ValueChanged( _ sender As Object, e As EventArgs) Label1.Text = CStr(NumericUpDown1.Value) End Sub Sub NumericUpDown2_ValueChanged( _ sender As Object, e As EventArgs) Label2.Text = _ CStr(NumericUpDown2.Value / 10).Replace(",","") End Sub Sub Button1_Click(sender As Object, e As EventArgs) tila = 1: Dim PvmTaulukko() As String PvmTaulukko = Split(CStr(DateSerial( _ Year(ValittuPvm), Month(ValittuPvm), Day(ValittuPvm))), ".") Dim Pvm As String Pvm = PvmTaulukko(0) & "-" & _ PvmTaulukko(1) & "-" & PvmTaulukko(2) LueTiedotTietokannasta( "Select * From [" & TaulunNimi _ & "] Where Pvm=#" & Pvm & "#") End Sub Sub Button2_Click(sender As Object, e As EventArgs) If TextBox1.Text <> "" And tila = 0 Then Dim kellonaika As String = label1.Text + ":" + label2.Text Dim päivämäärä As String = _ CStr(ValittuPvm).Replace(".","-") Dim kysely As String = _ "Insert Into Taulu(Pvm, Aika, Muistutus) " + _ "Values(#" + päivämäärä + "#, #" + _ kellonaika + "#, '" + textBox1.Text + "')" yhteys.Open Dim komento As OleDbCommand = _ New OleDbCommand(kysely, yhteys) komento.ExecuteNonQuery yhteys .Close End If End Sub Sub Button3_Click(sender As Object, e As EventArgs) tila = 0 TextBox1.ReadOnly = False TextBox1.Text = String.Empty ComboBox1.SelectedIndex = 0 AsetaKellonaika(CStr(TimeOfDay)) End Sub Sub ComboBox1_SelectedIndexChanged( _ sender As Object, e As EventArgs) If ComboBox1.SelectedIndex > 0 Then tila = 1 monthCalendar1.SelectionStart = _ Tiedotukset( _ ComboBox1.SelectedIndex - 1).Pvm TextBox1.Text = Tiedotukset( _ ComboBox1.SelectedIndex - 1).Tiedote TextBox1.BackColor = Color.White TextBox1.ReadOnly = True AsetaKellonaika(CStr(Tiedotukset( _ ComboBox1.SelectedIndex - 1).Klo)) Else tila = 0 TextBox1.ReadOnly = False TextBox1.Text = String.Empty AsetaKellonaika(CStr(TimeOfDay)) monthCalendar1.SelectionEnd = Today End If ValittuPvm = monthCalendar1.TodayDate End Sub Sub LueTiedotTietokannasta(ByVal kysely As String) Dim komento As OleDbCommand = _ New OleDbCommand(kysely, yhteys) yhteys.Open Dim lukija As OleDbDataReader = komento.ExecuteReader Dim i As Integer = -1 ComboBox1.Items.Clear ComboBox1.Items.Add(String.Empty) If lukija.HasRows Then While lukija.Read i += 1 ReDim Preserve Tiedotukset(i) Tiedotukset(i).Pvm = CType(lukija(1), Date) Tiedotukset(i).Klo = CType(lukija(2),Date) Tiedotukset(i).Tiedote = CType(lukija(3),String) ComboBox1.Items.Add("Tiedote " & i.ToString) End While lukija.Close: ComboBox1.SelectedIndex = 0 End If yhteys.Close End Sub Sub AsetaKellonaika(ByVal Aika As String) Dim Ajat() As String ajat = Split(Aika, ":") numericUpDown1.Value = CType(Val(ajat(0)), Decimal) numericUpDown2.Value = CType(Val(ajat(1)), Decimal) if numericUpDown2.Value = 0 Then label2.Text = "0" End If Ajat = Nothing End Sub Sub MonthCalendar1_DateSelected( _ sender As Object, e As DateRangeEventArgs) ValittuPvm = e.Start End Sub Sub MainForm_FormClosing( _ sender As Object, e As FormClosingEventArgs) Try yhteys.Close Catch ex As Exception End Try yhteys = Nothing Me.Dispose End Sub End Class
Aihe on jo aika vanha, joten et voi enää vastata siihen.