06. juni 2004 - 19:24Der er
23 kommentarer og 1 løsning
Min If virker ikke ordenlig (tror jeg)
Jeg er ved at lave mit første vb.NET konsolprogram og har så fået lidt problemer... Programmet parser noget tekst og retter så i nogle klokkeslet, og det er dem der giver problemer! De står på formen hh:mm:ss og har så lavet følgende:
Dim tim, min, sek As Byte
If strDelLine.Chars(0) = "0" Then tim = CByte(Mid(strDelLine, 2, 2)) Else tim = CByte(Mid(strDelLine, 1, 2)) End If
If strDelLine.Chars(4) = "0" Then min = CByte(Mid(strDelLine, 5, 5)) Else min = CByte(Mid(strDelLine, 4, 5)) End If
If strDelLine.Chars(7) = "0" Then sek = CByte(Mid(strDelLine, 8, 8)) Else sek = CByte(Mid(strDelLine, 7, 8)) End If
strDelLine = "Klokken er: " & tim & ":" & min & ":" & sek & "." Console.WriteLine(strDelLine)
Programmet laver fejl, og tror det er fordi min IF ikke er rigtig... Men ved bare ikke hvordan den så skal laves! tim, min og sek skulle meget gerne komme til at indeholde de 3 tidsvariabler!
Er der nogen speciel grund til at du ikke arbejder med DateTime typen? Så kunne din kode se ud som følgende: Dim tim, min, sek as Integer Dim moment as DateTime Convert.ToDateTime(strDelLine) tim = moment.Hour min = moment.Minute sek = moment.Second
Den kan altså ikke lave den convert.... Hvis jeg laver en Console.WriteLine(strDelLine) udskriver den bla. 01:24:59, men når jeg som guidmaster skriver Covert.ToDateTime(strDelLine) får jeg bare følgende fejl:
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.
Og ved arne_v's eksempel DateTime.Parse(strDelLine) får jeg den samme!
Module Main Sub Main() Dim tim, min, sek As Byte ' original Dim strDelLine As String = "12:34:56" If strDelLine.Chars(0) = "0" Then tim = CByte(Mid(strDelLine, 2, 1)) Else tim = CByte(Mid(strDelLine, 1, 2)) End If If strDelLine.Chars(3) = "0" Then min = CByte(Mid(strDelLine, 5, 1)) Else min = CByte(Mid(strDelLine, 4, 2)) End If If strDelLine.Chars(6) = "0" Then sek = CByte(Mid(strDelLine, 8, 1)) Else sek = CByte(Mid(strDelLine, 7, 2)) End If Console.WriteLine(tim & " " & min & " " & sek) ' dot netsk If strDelLine.Chars(0) = "0" Then tim = Byte.Parse(strDelLine.Substring(1, 1)) Else tim = Byte.Parse(strDelLine.Substring(0, 2)) End If If strDelLine.Chars(3) = "0" Then min = Byte.Parse(strDelLine.Substring(4, 1)) Else min = Byte.Parse(strDelLine.Substring(3, 2)) End If If strDelLine.Chars(6) = "0" Then sek = Byte.Parse(strDelLine.Substring(7, 1)) Else sek = Byte.Parse(strDelLine.Substring(6, 2)) End If Console.WriteLine(tim & " " & min & " " & sek) ' den smarte måde Dim dt As DateTime = DateTime.Parse(strDelLine) tim = dt.Hour min = dt.Minute sek = dt.Second Console.WriteLine(tim & " " & min & " " & sek) End Sub End Module
Hmmm det er lidt underligt, hvis jeg siger strDelLine = "12:34:56" så virker det fint, men med de strDelLine kommer jo fra en længere tekst som jeg parser... Jeg har prøvet at skrive Console.WriteLine("'" & strDelLine & "'") og det ser altså rigtigt ud, der er ingen mellemrum eller noget... Kun klokkeslettet!
Jeg prøver lige at smide hele koden, gider du så kigge på det:
Module Module1
Sub Main() ' Hent antal sekunder Console.WriteLine("Indtast det antal sekunder der skal lægges til eller trækkes fra!") Console.WriteLine("Husk at anføre + eller minus.") Dim Sekunder As Integer = CInt(Console.ReadLine())
' Find alle sub-filer i applikationsmappen og kald RedigerSekunder Dim Fil As String, FilNavn As String, Filer() As String Filer = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory, "*.sub") For Each Fil In Filer RedigerSekunder(Fil, Sekunder) Next
Console.WriteLine("Applikation afluttet.... Tryk ENTER!") Console.ReadLine() End Sub
Private Sub RedigerSekunder(ByVal Fil As String, ByVal Sekunder As Integer) Dim objStreamReader As System.IO.StreamReader Dim objStreamWriter As System.IO.StreamWriter
Dim strLine, strDelLine As String Dim tim, min, sek As Byte
'Fortæl placering af filen vi vil åbne objStreamReader = New System.IO.StreamReader(Fil) 'Fortæl placeringen af filen vi vil lave... Altid C:\CowmansSudEditor.sub objStreamWriter = New System.IO.StreamWriter("C:\CowmansSudEditor.sub")
'Read the first line of text. strLine = objStreamReader.ReadLine
'Fortsæt indtil strLine bliver tom = filen er slut. Do While Not strLine Is Nothing
If InStr(strLine, "[") = 1 Then If InStr(strLine, "]") = 10 Then strDelLine = Mid(strLine, 2, 8) strDelLine = Replace(strDelLine, ":", "")
Console.WriteLine("'" & strDelLine & "'")
Dim moment As DateTime = DateTime.Parse(strDelLine)
tim = moment.Hour min = moment.Minute sek = moment.Second
strDelLine = "Denne er spec: [" & tim & ":" & min & ":" & sek & "]" Else strDelLine = strLine End If Else strDelLine = strLine End If
Console.WriteLine(strDelLine)
'Skriv linien til ny fil objStreamWriter.WriteLine(strDelLine)
'Læs ny linie fra filen strLine = objStreamReader.ReadLine Loop
'Luk filerne objStreamReader.Close() objStreamWriter.Close() End Sub
Fejlen lyder som følger: An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: The string was not recognized as a valid DateTime. There is a unknown word starting at index 0
Den underlige replace funktion var kun fordi jeg forsøgte mig lidt frem... Den kildekode som jeg bruger ser sådan ud: Module Module1
Sub Main() ' Hent antal sekunder Console.WriteLine("Indtast det antal sekunder der skal lægges til eller trækkes fra!") Console.WriteLine("Husk at anføre + eller minus.") Dim Sekunder As Integer = CInt(Console.ReadLine())
' Find alle sub-filer i applikationsmappen og kald RedigerSekunder Dim Fil As String, FilNavn As String, Filer() As String Filer = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory, "*.sub") For Each Fil In Filer RedigerSekunder(Fil, Sekunder) Next
Console.WriteLine("Applikation afluttet.... Tryk ENTER!") Console.ReadLine() End Sub
Private Sub RedigerSekunder(ByVal Fil As String, ByVal Sekunder As Integer) Dim objStreamReader As System.IO.StreamReader Dim objStreamWriter As System.IO.StreamWriter
Dim strLine, strDelLine As String Dim tim, min, sek As Byte
'Fortæl placering af filen vi vil åbne objStreamReader = New System.IO.StreamReader(Fil) 'Fortæl placeringen af filen vi vil lave... Altid C:\CowmansSudEditor.sub objStreamWriter = New System.IO.StreamWriter("C:\CowmansSudEditor.sub")
'Read the first line of text. strLine = objStreamReader.ReadLine
'Fortsæt indtil strLine bliver tom = filen er slut. Do While Not strLine Is Nothing
If InStr(strLine, "[") = 1 Then If InStr(strLine, "]") = 10 Then strDelLine = Mid(strLine, 2, 8)
Dim moment As DateTime = DateTime.Parse(strDelLine)
tim = moment.Hour min = moment.Minute sek = moment.Second
strDelLine = "Denne er spec: [" & tim & ":" & min & ":" & sek & "]" Else strDelLine = strLine End If Else strDelLine = strLine End If
Console.WriteLine(strDelLine)
'Skriv linien til ny fil objStreamWriter.WriteLine(strDelLine)
'Læs ny linie fra filen strLine = objStreamReader.ReadLine Loop
'Luk filerne objStreamReader.Close() objStreamWriter.Close() End Sub
End Module
Jeg forstår det simpelthen ikke... Det er altså af det rigtige format!
Jeg takker mange gange.. Hader når man ser sig blind på noget! Jeg har lige fordoblet points nu jeg har været så dum ;-)
Jeg finder lige en måde hvor [FILEPATH] og [CD TRACK] bliver spunget over, og så kører programmet vist!
Takker for handlen!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.