PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nach jedem buchstaben splitten


tsaG
2009-06-21, 11:43:17
Hi,

Ich habe gerade eine kleine Denkblockade :D

Ich möchte einen string in mehrere kleinere arrays splitten undzwar nach jedem buchstaben, danach sollen die strings mit einem zeitunterschied von ca 0,5 sek in einem label aneinander gereit werden.

hintergrund: Die Antworten sollen "eingeblendet" werden, die Worte/sätze bauen sich quasi dann langsam auf und erscheinen nicht einfach (wie bei Familienduell ^^)

EDIT: Achso, das ganze in vb.net

Tommes
2009-06-21, 11:45:06
Ein String ist doch meistens ein Char Array, von daher kannst du meistens jedes Zeichen einzeln ansprechen.

noid
2009-06-21, 11:55:51
http://openbook.galileocomputing.de/vb_net/msvb060001.htm

(schleife, substr, label neu setzen... rad nicht neu erfinden)

Monger
2009-06-21, 12:01:20
Den String zu zerlegen, ist sehr simpel:

Dim TestStringIndex as Integer
Dim TestString as String = "Blubb"
Dim CurrentChar as Char = TestString(TestStringIndex)

Das größere Problem ist, dass du das ganze zeitversetzt reinbringen willst. Ich empfehle dir, einen Windows.Forms.Timer (aus der Toolbox) einzufügen, und im Tick Event sinngemäß folgendes zu schreiben:

Dim TestStringIndex as Integer = 0

public Sub TickHandler(e as EventArgs) Handles Timer1.Tick ' Oder so ähnlich
If TestStringIndex >= TestString.Length - 1 Then
Timer1.Enabled = False
Return
End If
Label1.Text &= TestString(TestStringIndex)
TestStringIndex += 1
End Sub

tsaG
2009-06-21, 12:24:28
Danke danke =)

Hat geholfen. Nun muss ich Zahlen addieren, jedoch Addiert mein vb.net irgendwie nur Binär o0

Dim a As Integer = aryTextFile(1) 'ist eine Zahl
Dim b As Integer
If aryTextFile(2) = "l" Then
b = Label6.Text 'ist zu anfang null, wird dann halt immer weiter addiert
Label6.Text = a + b
End If


Wenn jedoch zu Anfang label6 null ist und ich als zahl 10 eingebe, bekomme ich 20.. wenn ich nun noch 3 punkte dazu rechne erhalte ich 26.. ich könnte natürlich auch einfach durch 2 teilen, nur verstehe ich gerade nicht wo der fehler ist.

EDIT: Teilen funktioniert auch nicht wenn ich (a + b)/2 rechne kommt 2,5 raus ^^

Senior Sanchez
2009-06-21, 12:25:11
Eine wichtige Frage ist ja, ob er wirklich nur nach Buchstaben oder generell nach Zeichen (was auch Satzzeichen, Zahlen etc. beinhaltet) splitten will.
Für die zweite Variante würde sich dann etwas mit Regular Expressions anbieten, aber ich weiß nicht, ob VB.net das kann.

Monger
2009-06-21, 12:57:40
Für die zweite Variante würde sich dann etwas mit Regular Expressions anbieten, aber ich weiß nicht, ob VB.net das kann.
Klar kann es das! Der System.Text.RegularExpressions Namespace ist Bestandteil des .NET Frameworks, und damit für alle gleich.


@tsaG:

Dim a As Integer = aryTextFile(1) 'ist eine Zahl

Wirklich? Glaube ich nicht.
Schalt mal in den Projekteigenschaften in den Compiler Einstellungen die explizite Codeprüfung ein. Wenn aryTextFile ein String ist, castest du hier implizit von Char auf Integer - und das ist keineswegs das selbe wie wenn du einen Text als Zahl interpretierst.
Sag doch nochmal kurz, was konkret du eigentlich tun willst.

tsaG
2009-06-21, 13:37:41
Ich habe eine Punkte anzeige, die ist am Anfang 0

label6.text = 0

nun wird ein werte string aus einer textdatei gelesen und gesplittet

Dim sr As New System.IO.StreamReader("C:\Familienduell\Antwort1\antwort1.txt")
Dim antwort As String = sr.ReadToEnd
Dim aryTextFile() As String
aryTextFile = antwort.Split(":")
Label2.Text = aryTextFile(0)
Label8.Text = aryTextFile(1)

hierbei hat aryTextFile(1) einen Zahlenwert, dieser soll label6 hinzu gerechnet werden.

Dim a As Integer = aryTextFile(1)
dim b as integer = Label6.Text
Label6.Text = (a + b)

Monger
2009-06-21, 13:45:19
Hm... das geht so langsam schon in die Richtung was SeniorSanchez geschrieben hat: wenn es nicht nur darum geht, einfach nur Text auszulesen, sondern diesen Text auch zu interpretieren, sind reguläre Ausdrücke möglicherweise von Vorteil.

Auf jeden Fall: um Text als Zahl zu interpretieren, solltest du "Parse" verwenden. Also:


dim a as Integer = Integer.parse(aryTextFile(1))
dim b as Integer = Integer.parse(Label1.Text)
Label1.Text = (a + b).ToString

Der_Donnervogel
2009-06-21, 13:45:45
Um nur etwas dazu zu rechnen reicht ein Einzeiler:


If aryTextFile(2) = "1" Then
Label6.Text = Integer.Parse(aryTextFile(1)) + Integer.Parse(Label6.Text)
End If


Mit Integer.Parse() kann man direkt erzwingen, dass der Text in Zahlen gewandelt wird. Es ist dann aber wichtig, dass dort auch eine Zahl drinn steht, sonst gibts einen Absturz. Ist man sich unsicher ob nicht doch vielleicht Text drinn ist sollte man besser Integer.TryParse() nehmen, oder die Exception fangen.

tsaG
2009-06-21, 14:41:10
er rechnet dann aber immernoch bei 80 -> 160 und wenn ich dann noch 12 Punkte hinzu rechnen will ist er bei 184 =(


Dim sr As New System.IO.StreamReader("C:\Familienduell\Antwort4\antwort4.txt")
Dim antwort As String = sr.ReadToEnd
Dim aryTextFile() As String
aryTextFile = antwort.Split(":")
Label5.Text = aryTextFile(0)
Label11.Text = aryTextFile(1)

If aryTextFile(2) = "l" Then
Label6.Text = Integer.Parse(aryTextFile(1)) + Integer.Parse(Label6.Text)
Else
Label7.Text = Integer.Parse(aryTextFile(1)) + Integer.Parse(Label7.Text)

End If
sr.Close()

Der_Donnervogel
2009-06-21, 15:56:49
Was steht denn genau in antwort4.txt drinn, bzw. was ist dann im Array aryTextFile zu finden? Die Addition selbst ist so schon ok, der Fehler muss wo anders liegen. Hier mal ein kleines Beispiel für einen kleinen Rechner. Einfach zwei Textboxen, ein Label und ein Button machen. Wenn man dann in beiden Textboxen eine Zahl hat, kann man rechnen (Return drücken), bzw. mit dem Button kann man 1 beim ersten Textfeld addieren. Klappt alles einwandfrei.


Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
If e.KeyChar = ChrW(Keys.Return) Then
If IsNumeric(TextBox1.Text) And IsNumeric(TextBox2.Text) Then
Label1.Text = Integer.Parse(TextBox2.Text) + Integer.Parse(TextBox1.Text)
End If
End If
End Sub

Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
If e.KeyChar = ChrW(Keys.Return) Then
If IsNumeric(TextBox1.Text) And IsNumeric(TextBox2.Text) Then
Label1.Text = Integer.Parse(TextBox2.Text) + Integer.Parse(TextBox1.Text)
End If
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If IsNumeric(TextBox1.Text) Then
TextBox1.Text += 1
End If
End Sub

tsaG
2009-06-21, 17:14:53
In der Textdatei Antwort4.txt steht bspw Katze:80:l

daher ist aryTextFile(0) = Katze und aryTextFile(1) = 80

Ich habe auch geprüft was genau aryTextFile(1) ist indem ich es mir nochmal seperat in eine Textbox ausgeben lassen habe, dieser Wert ist dann Korrekt, es liegt dann also irgendwie an der berechnung

Der_Donnervogel
2009-06-21, 18:24:34
Ich habe jetzt den Code leicht modifiziert, um ihn testen zu können. Es funktioniert.

Ich habe in ein Form ein paar Labels und einen Button gegeben und wenn man den Button klickt wird folgender Code ausgeführt:

Dim sr As New System.IO.StreamReader("e:\Text" & TextBox1.Text & ".txt")

Dim antwort As String = sr.ReadToEnd
Dim aryTextFile() As String
aryTextFile = antwort.Split(":")
Label6.Text = IIf(IsNumeric(Label6.Text), Label6.Text, "0")
Label7.Text = IIf(IsNumeric(Label7.Text), Label7.Text, "0")
Label5.Text = aryTextFile(0)
Label11.Text = aryTextFile(1)

If aryTextFile(2) = "l" Then
Label6.Text = Integer.Parse(aryTextFile(1)) + Integer.Parse(Label6.Text)
Else
Label7.Text = Integer.Parse(aryTextFile(1)) + Integer.Parse(Label7.Text)

End If
sr.Close()
TextBox1.Text += 1

Dabei hab ich folgende drei Textdateien verwendet:
Katze:80:l
Hund:20:l
Maus:100:l
Es zählt dann einwandfrei beim ersten Klick auf 80, dann auf 100 und schließlich auf 200. Die beiden iif-Statements sind dabei dazu da die Boxen beim ersten Start mit 0 zu initialisieren und das TextBox1.Text += 1 ist nur, damit man nicht von Hand die Dateinamen hoch zählen muss.

Was allerdings etwas irritierend ist, ist der Vergleich mit "l" bei If aryTextFile(2) = "l" Then Da muss man schon genau hin schauen um zu sehen dass das ein "l" und kein "1" ist. Sowas ist gefährlich. Wenn man solche konstanten nimmt solle man denen aussagekräftige Namen geben und auch als solche deklarieren. Also etwas in der Art:
Const keineAhnungWasLIst As String = "l"