Visual Basic - Zahl aus Textbox auslesen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Da ich davon ausgehe das der textbox nciht sichtbar sein wird fuer der endanwender waere es meine persoenliche rat waere es als ein json object in der textbox darzustellen.

im gegen zug wurde ich eine klasse erstellen was genau diese felder beinhaltet... dann kannst du die daten mittels json serialiser hin und her konvertieren... eine weitere vorteil ist das du dies dann an einen server posten koenntest fuer "high-scores", oder als spielstand speichern.... das ganze seht in etwa so aus:

Dim serializer As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Game))

'to textbox in json format.
Dim gameToTextBox As New Game() With { _
    Key .Points = 8, _
    Key .Level = 12 _
}
Dim ms As New MemoryStream()
serializer.WriteObject(ms, gameToTextBox)
Dim toTextboxValue As String = Encoding.UTF8.GetString(ms.ToArray())

'from textbos to object.
Dim fromTextboxValue As String = "{'Points':8,'Level':12}"
ms = New MemoryStream(Encoding.UTF8.GetBytes(fromTextboxValue))
Dim gameFromTextBox As Game = DirectCast(serializer.ReadObject(ms), Game)

naturlich kannst du es auch als einen string behandeln und mittels trennzeichen verarbeiten. dazu wurde ich ein delimiter setzen: eg. ; damit der textbox value so ausseht: Level=12;Points=8

danach in etwa so:

Dim text As String() = "Level=12;Points=8".Split(";"C)
Dim level As Integer = Integer.Parse(text(0).Substring(text(0).IndexOf("="), text(0).Length))
Dim points As Integer = Integer.Parse(text(1).Substring(text(1).IndexOf("="), text(1).Length))
Woolli  27.11.2012, 09:38

achja, das game class ist in diese beispiel super einfach gestaltet...

Class Game
    Public Level As Integer
    Public Points As Integer
End Class
0
Woolli  27.11.2012, 09:57
@Woolli

achja, und Serializable in die klasse nciht vergedssen ;)

_ Class Game

0
CrystalixXx  28.11.2012, 18:46

Wer die Daten in einer unsichtbaren TextBox aufbewahrt, hat die Grundlagen nicht sauberer und vorallem objektorientierter Programmierung nicht verstanden. Da hilft auch kein Json (was ohnehin auch ohne möglich wäre).

0
Woolli  29.11.2012, 09:18
@CrystalixXx

Hi Crystalix, ja ich stimme dir vollkommen zu das eine unsichtbare textbox keine saubere loesung ist... Im web bereich hat es durchaus seine berechtigungen mit unsichtbaren elemente zu arbeiten (und ist ganz oft unvermeidlich), aber winforms und wpf sollte man es vermeiden.

Dennoch drehte sich die frage um einen unsichtbaren textbox (oder anderes gesagt einen string der mehrere werte enthaelt) und da halte ich es doch fuer die bessere loesung mit serialised objekte zu arbeiten als einen string zu zerstueckeln... insbesonsere dann wenn man die werte ohnehin in einen object umwandeln wird.

0
CrystalixXx  29.11.2012, 19:44
@Woolli

da halte ich es doch fuer die bessere loesung mit serialised objekte zu arbeiten als einen string zu zerstueckeln... insbesonsere dann wenn man die werte ohnehin in einen object umwandeln wird.

Wenn das Zerstückeln eines Strings eine schlechtere Lösung sein soll, wieso verwendest du dann genaue die Methoden, die zum Zerstückeln eines String erforderlich sind (Substring, IndexOf, ...)?

Die Serialisierung ist in deinem Beispiel unnötig. Das Business-Objekt hast du erstellt und dem kannst du die Werte direkt zuweisen. Wofür also erst einen MemoryStream anlegen und den Weg über Serialisierung gehen? Denn im Endeffekt hast du in den unteren Codezeilen alles stehen: die beiden Variablen, die mit dem entsprechenden Wert belegt werden.

0
Woolli  03.12.2012, 09:13
@CrystalixXx

Wenn das Zerstückeln eines Strings eine schlechtere Lösung sein soll, wieso verwendest du dann genaue die Methoden, die zum Zerstückeln eines String erforderlich sind (Substring, IndexOf, ...)?

Das war der zweite beispiel, wo ich zeigen wollte wie man es mit zerstueckeln machen kann... ich dachte es geht aus der antwort hervor das hier zwei loesungs varianten gezeigt werden. Ich hatte dich jetzt gefragt weil mir aufgefallen ist das du bisher sehr kompitente antworten gegeben hast und ich immer offen fuer verbesserungen/vorschlaege.

Da ich jedoch schon al zu oft im altag gesehn habe das groessere objecte zusammen gebastelt werden aus zerstueckelte strings die bei spaetere aenderungen am model neu angefasst werden muessen habe ich meine praeferenzen zur serializierung... und klar man kann ueberlegen ob in diesem beispiel man einen stringreader/stringwriter verwenden moechte anstatt einen memorystream.

0
CrystalixXx  03.12.2012, 19:31
@Woolli

Vermutlich liegt mein Problem einfach darin, dass ich nicht weiß, was JSON hier im Detail macht. Denn ich sehe nicht, woher die Informationen stammen, dass im String eine Key-Wert-Zuweisung, getrennt durch ein Semikolon, vorliegt. Offensichtlich scheint JSON das direkt so zu handhaben, dass es die Werte direkt zuordnen kann. Wenn das so ist, dann wird das sicherlich innerhalb dieser Methoden auch auf String-Operationen zurückzuführen sein. Da kommt man nicht drum herum, es sei denn man arbeitet auf Byte-Ebene (ist aber wohl äquivalent zu betrachten).

Aber wenn Serialisierung, dann mit MemoryStream, wenn die Daten temporär sind. Denn eine Datei mittels StreamWriter anlegen und StreamReader lesen, dauert länger. Zumal StreamReader den kompletten Inhalt der Datei sowieso in den Speicher lädt. Wenn man das also nicht als Datei für andere Zwecke braucht, dann ist der MemoryStream schon die richtige Wahl.

PS: Mir fällt gerade auf, dass JSON sowieso eine Drittanbieter-Komponente ist. Viele wollen gerne auf solch zusätzlicher Dateien verzichten. Und außerdem - um mich zu rechtfertigen ;) - ist der Lerneffekt größer, wenn man das selbst übernimmt. Aber klar, einen Zeitersparnis hat man wohl mit deinem ersten Code. Sicherer ist er vermutlich auch. Danke für den Hinweis.

0

Ich bin alter C-Hase, aber seit Visual Basic will ich kein C oder C++ mehr sehen ...

Normalerweise gibt man den Objetkten Namen oder n utzt die vorhandenen. Die sind dann Textbox001 oder sowas.

Im Editor gibt man diesen Namen gefolgt von einem Punkt an. Der Editor bietet einem dann die Inhaltselemente dieser Textbox an, .text oder .Text sollte das richtige sein, ich bin aber nicht sicher. Einfach rumprobieren, so hab ich es auch gemacht ...

Woolli  27.11.2012, 09:41

aber seit Visual Basic will ich kein C oder C++ mehr sehen

und dann bist du zu VisualBasic gewechselt??? wieso nicht c#?

0
Minihawk  27.11.2012, 19:08
@Woolli

Als ich zu VB gewechselt bin, da war c# völlig unebkannt und viele Schreiber hier haben noch die Windeln gewechselt bekommen oder waren gar nicht geboren :)

0

Kommt ganz darauf an, nach welchen Regeln die Zahlen auftauchen können. Je nachdem kannst du den Text einzeln auseinandernehmen oder mit RegEx arbeiten.

Am verständlichsten und für einen Anfänger leichter umzusetzen ist vermutlich das Auseinandernehmen des Textes und filtern der Zahlen.

Da gibt es verschiedene String-Member, die dir helfen könnten:
- IndexOf-Methode (zum Finden des Gleichheitszeichen, wenn es immer vorhanden ist)
- Char-Eigenschaft (zum Ermitteln eines Zeichens an beliebiger Stelle)
- Substring-Methode (zum Ermitteln eines Teilstrings)

Möglicherweise hilft auch noch die Char.IsDigit-Methode, um herauszufinden, ob das angegebene Zeichen eine Ziffer ist.

http://www.vb-paradise.de/

da wirst du mehr hilfe finden als hier. Kenne mich leider nicht so gut mit Visual Basic aus. Aber das Forum wird dir bestimmt helfen. Und da der Kollege schon die Frage relativ sauber beantworet hat komme ich mal zu einen anderen Thema:

Ich würde dir empfhelen eher C zu lernen anstatt Visual Basic. Reinschnuppern ist vollkommen in ordnung weil es einfach, einfach ist und auch recht spaß macht. Aber Professionel etwas damit zu erschaffen wirst du warscheinlich nie. Dazu ist Visual Basic einfach zu inefizent.

Ich habe selber auch mit VB angefangen und drei oder vier Programme damit geschrieben.

(Bild öffnungsprogramm, kleines Spiel, zwei Browser mit WebKit und GeckoFX engin) usw.)

Aber C bzw. C++ ist wesentlich besser zum Programmieren lernen. Wenn du wirklich Programmieren lernen willst kauf dir auch Bücher dazu wo drinsteht warum etwas passiert und warum der computer das auch Ausgibt. Die Grundkenntnise von C bzw. C++ kannst du in ca. 3 Monaten lernen.

Und wenn du C bzw. C++ beherschst fällt es dir auch einfach auf andere Programmiersprachen wie z.B. C# oder Java umzusteigen. Weil alles was du in C bzw. C++ lernst wirst du auch in anderen Programmiersprachen wieder finden.

Ich lerne momentan C bzw. C++ und Java. Als ich die Grundkentnisse konnte in C bzw. C++ habe ich mit Java angefanen und es fällt dir einfach nur leicht da rein zukommen. Dir kommt viel bekannt vor und die befehle wie z.B. if, else if, oder schleifen sind 1:1 gleich. Auch die Deklaration und co.

Da ich nicht weiß wie weit diene Programmier kentnisse sind und ich dich nicht noch mehr volllabern will ende ich mal hier^^

Hoffe ich konnte dir helfen.

mfg. icekeuter

CrystalixXx  28.11.2012, 18:50

Aber Professionel etwas damit zu erschaffen wirst du warscheinlich nie. Dazu ist Visual Basic einfach zu inefizent.

Das musst du mir erklären. Die Effizienz ist annähernd genauso groß, wie eine Anwendung mit nativem Code. Die Unterschiede betragen, wenn es hochkommt, Millisekunden. Lange Ausführungszeiten liegen meist darin begründet, dass man unsauber programmiert hat.

0