Olen yrittänyt tehdä Visual Basicilla seuraavaa, mutta en saa sitä vain toimimaan. Voisiko joku kertoa miten tuollainen onnistuisi?
Ohjelman pitäisi tehdä seuraavaa:
Ohjelma kysyy koska numerot x, x ja x (x= numero 1-10) on esiintynyt viimeksi? Esimerkiksi numerot 1,5,8.
Ohjelma käy esim. tekstitiedostosta läpi siellä olevat numerot (kierrokset) ja kertoo milloin ne ovat viimeksi esiintyneet.
Koulutehtävä(?) -> oma koodi esiin niin joku voi auttaa siitä eteenpäin.
Elko kirjoitti:
Ohjelma käy esim. tekstitiedostosta läpi siellä olevat numerot (kierrokset) ja kertoo milloin ne ovat viimeksi esiintyneet.
Juurihan itse kerroit ratkaisun. Käyt sen tektitiedoston läpi ja vertailet arvoja haettavaan dataan...
Tällaisen koodin pätkän löysin jonka pohjalta ajattelin saada sen toimimaan, mutta en saa tätäkään toimimaan. Käsittääkseni tämän koodin pitäisi lukea tuo testi.txt tiedosto ja tulostaa kaikki siellä oleva MsgBoxiin.
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer, r As String Open "c:\temp\testi.txt" For Input As #1 For i = 1 To 5 Input #1, r MsgBox(r) Next Close #1 End Sub End Class
Tuon pitäisi lukea 5 kertaa tiedostosta pilkkuun tai rivivaihtoon asti ja näyttää luettu msgboxilla. Jos tiedosto on pidempi kuin 5 riviä, niin se ei tietenkään näytä kaikkea. Jos taas tiedosto on liian lyhyt niin se antaa virheilmoituksen.
Mutta ongelma lienee se, että tuolla Subissa oleva koodi on VB6 syntaksilla, kun Subin rakenteesta päätellen koodaat VB.Netillä. Kannattaa etsiä sellaisia esimerkkejä, jotka on VB.Netille.
Itse lukisin varmaan StreamReader:illa tiedostosta rivin kerrallaan ja käsittelisin rivin halutulla tavalla.
Moi Elko!
tässä esimerkkiviritelmä VB.NET:lle
'VB.NET esimerkki 'Lomakkeelle: '2 TextBox kontrollia(TextBox1 & TextBox2) '1 CheckBox kontrolli (CheckBox1) '1 Komentopainke (Button1) '1 OpenFileDialog (OpenFileDialo1) '1 MenuStrip kontrolli (MenuStrip1) 'Syötä haettavat numerot pilkulla 'erotettuna TextBox1 kontrolliin Public Class Form1 Private vrivi() As Integer Private positio() As Integer Private numerot() As String Private tiedostorivit() As String Private Sub Form1_Load(sender As System.Object, _ e As System.EventArgs) Handles MyBase.Load OpenFileDialog1.DefaultExt = "*.txt" OpenFileDialog1.Filter = "Tekstitiedosto (*.txt) |*.txt" OpenFileDialog1.CheckPathExists = True OpenFileDialog1.InitialDirectory = _ Environment.GetFolderPath( _ Environment.SpecialFolder.MyDocuments) OpenFileDialog1.Multiselect = False OpenFileDialog1.RestoreDirectory = True OpenFileDialog1.FileName = String.Empty TextBox2.Multiline = True TextBox2.ReadOnly = True End Sub Private Sub AvaaToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles AvaaToolStripMenuItem.Click OpenFileDialog1.FileName = String.Empty OpenFileDialog1.ShowDialog() End Sub Private Sub OpenFileDialog1_FileOk( _ sender As System.Object, _ e As System.ComponentModel.CancelEventArgs) _ Handles OpenFileDialog1.FileOk If Not OpenFileDialog1.FileName.ToLower.EndsWith(".txt") Then OpenFileDialog1.FileName = String.Empty End If End Sub Private Sub Button1_Click(sender As System.Object, _ e As System.EventArgs) Handles Button1.Click TextBox2.Clear() If TextBox1.Text = String.Empty Then TextBox1.Focus(): Exit Sub End If Try FileOpen(1, OpenFileDialog1.FileName, _ OpenMode.Input, OpenAccess.Read) Dim temp As String = InputString( _ 1, CType(LOF(1), Integer)).Replace( _ Chr(13), CType("", Char)): FileClose(1) If temp.Trim = String.Empty Then MsgBox("Ei käsiteltävää dataa"): Exit Sub End If If temp.Contains(Chr(10)) Then tiedostorivit = temp.Split(Chr(10)) Else ReDim tiedostorivit(0) tiedostorivit(0) = temp End If temp = Nothing Catch ex As Exception MsgBox(ex.Message) : Exit Sub End Try If TextBox1.Text.Contains(",") Then numerot = TextBox1.Text.Split(",".ToCharArray) ReDim vrivi(numerot.GetUpperBound(0)) ReDim positio(numerot.GetUpperBound(0)) Else ReDim vrivi(0) ReDim positio(0) ReDim numerot(0) numerot(0) = TextBox1.Text End If TextBox1.Clear() For i As Integer = 0 To tiedostorivit.Length - 1 For j As Integer = 0 To numerot.Length - 1 If tiedostorivit(i).Contains(numerot(j)) Then If CheckBox1.Checked Then If tiedostorivit(i).StartsWith(numerot(j) + " ") Then vrivi(j) = i + 1 positio(j) = 1 Énd If If tiedostorivit(i).Contains(" " + numerot(j) + " ") Then vrivi(j) = i + 1 positio(j) = tiedostorivit(i) _ .LastIndexOf(" " + numerot(j) + " ") + 2 End If If tiedostorivit(i).EndsWith(" " + numerot(j)) Then vrivi(j) = i + 1 positio(j) = tiedostorivit(i). _ LastIndexOf(numerot(j)) + 1 End If Else vrivi(j) = i + 1 positio(j) = tiedostorivit(i). _ Length - numerot(j).Length + 1 End If End If Next j Next i For i As Integer = 0 To numerot.GetUpperBound(0) If vrivi(i) > 0 Then Dim selite1 As String = String.Empty Dim selite2 As String = String.Empty If CheckBox1.Checked Then selite1 = "luku " Else selite1 = "numero " End If If numerot(i).Length > 1 Then selite2 = " (merkit " + positio(i).ToString _ + "-" + _ (positio(i) + numerot(i).Length - 1).ToString + ")" Else selite2 = " (" + (positio(i)).ToString + ". merkki)" End If TextBox2.Text += selite1 + numerot(i).ToString + _ " esiintyi viimeksi rivillä " & (vrivi(i)).ToString + _ selite2 + Environment.NewLine + Environment.NewLine End If Next i '(NÄYTÄ MYÖS HAKUNUMEROT)... If TextBox2.TextLength > 0 Then Dim näytä As String = "Hakunarvot: " Dim määrä As Integer = numerot.GetUpperBound(0) Select Case määrä Case 0 näytä += numerot(0) + " " Case 1 näytä += numerot(0) + " ja " + numerot(1) + " " Case Is > 1 For i As Integer = 0 To määrä If i > 0 And i < määrä Then näytä += ", " ElseIf i = määrä Then näytä += " ja " End If näytä += numerot(i) Next i näytä += " " End Select TextBox2.Text = näytä + vbCrLf + TextBox2.Text End If '... '(KAIKKI SAMALLE RIVILLE) TextBox2.Text = TextBox2.Text.Replace( _ vbCrLf.ToCharArray, " ".ToCharArray) '(TÄMÄ RIVI TÄHÄN KOHTAAN) Erase numerot, tiedostorivit End Sub Private Sub TextBox1_TextChanged(sender As System.Object, _ e As System.EventArgs) Handles TextBox1.TextChanged TextBox1.Text = VainSallitut(TextBox1.Text, False) TextBox1.SelectionStart = TextBox1.Text.Length End Sub Private Sub TextBox1_Leave(sender As System.Object, _ e As System.EventArgs) Handles TextBox1.Leave TextBox1.Text = VainSallitut(TextBox1.Text, True) End Sub Private Sub TextBox1_MouseUp(sender As System.Object, _ e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp TextBox1.Text = VainSallitut(TextBox1.Text, False) TextBox1.SelectionStart = TextBox1.Text.Length End Sub Private Sub TextBox2_Enter(sender As System.Object, _ e As System.EventArgs) Handles TextBox2.Enter Button1.Focus() End Sub Function VainSallitut(teksti As String, poista As Boolean) As String If teksti = "," Then teksti = "" End If teksti = teksti.Replace( _ ",,".ToCharArray, ",".ToCharArray) For i As Integer = 0 To teksti.Length - 1 If Not "1234567890,".Contains(teksti.Substring(i, 1)) Then teksti = teksti.Replace(teksti.Substring( _ i, 1).ToCharArray, "".ToCharArray ) End If Next i If poista And teksti.Length > 1 Then If teksti.Substring(teksti.Length - 1, 1) = "," Then teksti = teksti.Substring(0, teksti.Length - 1) End If End If Return teksti End Function End Class
Missä muodossa numerot pitää olla tekstitiedostossa? En saanut ainakaan vielä toimimaan ohjelmaa. Mitä noihin muihin tulee (TextBox2, CheckBox ja Button1)?
Moi taas Elko!
ASCII muodossa elikä tee tekstitiedosto esim. notepad ohjelmalla, ja tallenna se työpöydälle nimellä tiedosto.txt.
TextBox1 kontrolliin kirjoitetaan haettavat numerot. Jos haetaan useita eri numeroita niin numerot on erotettava pilkulla (esim 1,21,1001,jne.)
TextBox2 kontrollin tekstiksi ilmestyy valitsemiesi numeroiden viimeisin sijainti tekstitiedostossa (rivinumero/sijainti rivillä).
CheckBox'lla valitaan hakuperuste (etsitäänkö tekstistä valittuja numeroita myös numerosarjojen sisältä esim. sarja 10 löyttyy luvun 2101 sisältä vai tuleeko etsittävien numeroiden olla 'kokonaisia' 10 = väliyönti10välilyönti).
Button1 kontrollilla laukaistaan haku.
halutessasi voit impata täältä koko VB.NET esimerkkiprojektin.
Tämä ohjelma toimi, kiitos! Nyt pitäs vielä vaan keksiä miten sen saa sellaiseksi että kaikki numerot jotka siihen syötetään olisi ilmestyttävä samalla rivillä ennenkuin se kertoo tuloksen.
Kopioin .net koodin Microsoft Visual Basic 2010 Epress:iin ja käyynistin ohjelman, mutta tuli tällainen: A first chance exception of type 'System.NullReferenceException' occurred in GetLastNumberPosition.exe
Oon ihan uuno näitten kanssa :(
Moi taas Elko!
Sori, oli mun moka elikä katso jälleen edellisen esimerkin Button1_Click tapahtumakoodiin tekemääni muutosta: '(TÄMÄ RIVI TÄHÄN KOHTAAN).
Moi!
Nyt tuli tällainen:
Error 1 'TextReplace' is not a member of 'System.Windows.Forms.TextBox'.
Moi taas Elko!
näköjään hukkasin editoidessa pisteen Text ja Replace välistä
'(KAIKKI SAMALLE RIVILLE) textBox2.Text = textBox2.Text.Replace( _ vbCrLf.ToCharArray, " ".ToCharArray)
-Nea-
Nyt se toimii:) Vain yksi ihmetyksen aihe: Kun kokeilin jotain numeroyhdistelmää niin se sanoi että se esiintyy rivillä 11 vaikka työpyödälläni olevassa tiedosto.txt tiedostossa ei ole edes rivejä kuin 6.
Aihe on jo aika vanha, joten et voi enää vastata siihen.