Jump to content
Unity Insider Forum

Buchstaben aus Textfeld in Array speichern


Ron Dragor

Recommended Posts

Hi, Leute!

 

Irgendwie will das nicht so ganz funktionieren...

 

Ich möchte die die einzelnen Buchstaben, die in ein Textfeld eigegeben werden in einem Array speichern und in Echtzeit wiedergeben können:

 

in der void OnGUI();

 

char[] decoded_array = new char[decoded.Length];
	    using (StringReader sr = new StringReader(decoded))
	    {
		    sr.Read(decoded_array, 0, decoded.Length);
		    if (decoded.Length > 0)
		    {
			    for (int i = 0; i < decoded.Length; i++)
			    {
				    B_Nr += i + "|";
				    B_W += decoded_array[i] + "|";

				    // Debug.Log("Array: " + i + ": " + decoded_array[i]);
			    }
		    }
	    }

 

Eigentlich sollte er die Buchstaben aus dem Array wiedergeben, wie sie eingegeben wurden. stattdessen macht er eine Entlosschleife draus.

 

Beispiel:

 

Textfeld-Eingabe: "Hallo!"

GUI.Label-Ausgabe 1: "1|2|3|4|5|6|"

GUI.Label-Ausgabe 2: "H|a|l|l|o|!|"

 

Wenn ich jetzt im Textfeld wieder Buchstaben lösche:

 

Textfeld-Eingabe: "Hall"

GUI.Label-Ausgabe 1: "1|2|3|4|"

GUI.Label-Ausgabe 2: "H|a|l|l|"

 

Und was anderes reinschreibe:

 

Textfeld-Eingabe: "Halli"

GUI.Label-Ausgabe 1: "1|2|3|4|"

GUI.Label-Ausgabe 2: "H|a|l|l|i|"

 

Soll alles also in Echtzeit gehen. Deshalb lies ich das auch in der void OnGUI.

 

Das Resultat sieht aber so in etwa so aus:

 

Textfeld-Eingabe: "Hallo!"

GUI.Label-Ausgabe 1: "0|0|0|0|0|0|0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0||0|0|0|0|"

GUI.Label-Ausgabe 2: "H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H"

 

Folgenden Ansatz hatte ich auch schon:

 

   var blah = "Blah!";
   var chars = blah.ToCharArray();
Debug.Log(blah[1]);

Das im Array speichern geht soweit.

 

   var chars = Gui_Textfeld_Eingabe.ToCharArray();
Debug.Log(Gui_Textfeld_Eingabe[1]);

Dann bekomme ich eine IndexOutOfRange Exeption.

 

Kann mir da jemand helfen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der ToCharArray-Ansatz ist super, da solltest du bei bleiben.

 

Ein Tipp noch: Das if(length > 0) kannst du weg lassen, wenn darin nur eine for-Schleife über alles kommt.

Denn wenn length == 0 wäre, würde die Schleife für dem ersten Durchlauf schon abbrechen, weil dann ja nicht i < length ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok. Was ich nicht ganz verstehe, ist, warum das nicht funktioniert:

 

decoded = GUI.TextField(new Rect(variablen.width / 2 - variablen.lab_w / 3.2f + abst, variablen.height / 6 + abst * 2, variablen.box_w * 1.37f, variablen.box_h), decoded, 40);

var chars = decoded.ToCharArray();
		for (int i = 0; i < decoded.Length; i++)
		{
			B_Nr += decoded[i] + "|";
		}

 

Eigentlich soll er doch folgendes machen:

 

decoded.Length ist zu Beginn 0, da das Textfeld leer ist. Dann die for-Schleife:

 

beginne mit i = 0

führe Schleife aus, solange i < decoded.Length dann setze i++

 

Also da zu Beginn i decoded.Length gleich sind (0), wird erst mal nix gemacht. Stimmt soweit auch, denn es passiert erst mal nix.

 

Wenn icch jetzt einen Buchstaben in das Textfeld schreibe, sollte die Schleife einmal ausfeführt werden, da doch durch i++ nach einmal ausführen i und decoded.Length gleich sind (1).

 

Doch die Schleife wird unendlich fortgesetzt....

 

Die andere Seite ist, dass hier:

 

B_Nr += decoded[i] + "|";

 

zwar immer ein Buchstabe hinzugefügt wird, aber nicht gelöscht, wenn ich im Textfeld eines lösche.

 

Einfacher wäre das wohl über einen Button. Nur hätte ich das alles gerne in Echtzeit.

 

Ok. Ich habs soweit geknackt:

 

var chars = decoded.ToCharArray();
	    for (int i = y; i < decoded.Length; i++)
	    {
		    B_Nr += decoded[i] + "|";
		    y++;
	    }

 

Kein Endlosschleife mehr. Eine Pause tut manchmal gut. Ich hab jaa jedesmal zu Beginn der Schleife i wieder auf 0 gesetzt.... LOL!

 

Doch wie bekomme ich das hin, dass, wenn ich Buchstaben aus dem Texfeld lösche, er sie auch hier:

B_Nr += decoded[i] + "|";

wieder löscht.

 

Soweit gut und richti ist, dass wenn ich 4 Buchstaben eingebe, we mir auch 4 ausgibt. Lösche ich 2 Buchstaben, bleiben im Ausgabefelt 4 stehen. Gebe ich wieder 2 Buchstaben ein, bleiben im Ausgabeefeld 4. gebe ich 2 weitere ein, dann schreibt er die auch richtig weiter. Nur löschen tut er nix.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich das so versuche:

 

for (int i = y; i < decoded.Length; i++)
    {
	    if (i < decoded.Length)
	    {
		    B_Nr += decoded.Length + "|";
		    // B_Nr += decoded[i] + "|";
		    y++;
	    }
	    else if (i > decoded.Length)
	    {
		    B_Nr -= decoded.Length + "|";
		    // B_Nr += decoded[i] + "|";
		    y--;
	    }

 

Bekomme ich die Felhlermeldung:

 

error CS0019: Operator `-=' cannot be applied to operands of type `string' and `string'

Link zu diesem Kommentar
Auf anderen Seiten teilen

Boah, Ron, ich hatte gerade eine Reihe von Gedankenblitzen. Jetzt weiß ich, was da alles schief läuft.

Fangen wir mal bei der Wurzel des Problems an:

Da ist keine Endlosschleife. Bei einer Endlosschleife stürzt Unity ab. Was du hast, ist, dass deine Schleife da in Update jeden Frame wieder ausgeführt wird. Bei einem Buchstaben im String (sagen wir: 'H'), kriegt dein B_Nr jeden Frame ein H hinten ran geknallt, weil es keine lokale Variable, sondern eine Instanzvariable ist. Jetzt ist die Frage: Benutzt du außerhalb deiner Funktion gerade B_Nr? Wenn nein, mach eine lokale Variable draus. Wenn doch, musst du immerhin vor der Schleife B_Nr ein Mal leer machen (B_Nr = "" ; ), damit es neu befüllt werden kann (und nicht ständig um das Gleiche erweitert wird).

 

Deine y-Lösung erledigt sich damit von Alleine. Alles, was du damit gemacht hast, ist, die ersten y Buchstaben, die schon in B_Nr drin sind, nicht noch einmal einzufügen. Das brauchst du dann nicht mehr.

(Mal davon abgesehen wäre B_Nr.Length da akkurater gewesen ;) )

 

Wenn du das jetzt so umbaust, erledigt sich auch das Löschen von alleine.

Ein Buchstabe wird gelöscht? Egal. Direkt vor der Schleife vergisst B_Nr sowieso, was eben drin stand, und richtet sich nur nach dem neuen String, in dem der Buchstabe bereits fehlt.

 

Dazu kommt, dass du die Zeile mit var chars = blub; löschen kannst. Wenn du genau hinsiehst, merkst du, dass du das erzeugte CharArray sowieso nirgendwo benutzt. Wie du es auch schon verwendest, .Length, und [index] hinter einem String funktionieren bestens.

Übrig bleibt:

decoded = GUI.TextField( ... , decoded, ... );

B_Nr = "";
for (int i = 0; i < decoded.Length; i++)
{
 B_Nr += decoded[i] + "|";
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

decoded = GUI.TextField( ... , decoded, ... );

B_Nr = "";
for (int i = 0; i < decoded.Length; i++)
{
 B_Nr += decoded[i] + "|";
}

 

Danke für die Antwort. Das funktioniert mit decoded soweit gut. Aber mit decoded.Length nicht. Das muss ich anderss angehen, denn da listet er mit logischerweise nur immer den aktuellen wert i auf, da ich den vor der Schleife leer mache. Ich versuch mal was.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habs! So werden beide Werte korrekt angezeigt und auch wieder gelöscht!

 

var chars = decoded.ToCharArray();
    B_B = "";
    B_Nr = "";
    for (int a = 0; a < decoded.Length; a++)
    {
	    B_Nr += (a + 1) + "|";
    }
    for (int i = 0; i < decoded.Length; i++)
    {
	    B_B += decoded[i] + "|";
    }

 

Danke für die Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...