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 ClassTuon 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 ClassMissä 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.