vb Code in textbox automatisch trennen

04/21/2014 23:00 BlazerHack#1
Hey Leute,

Ich bin gerade am erstellen eines Tool und wollte euch fragen,
wenn ich in eine Textbox etwas eingebe, immer nach 4 eingaben (nummern)
Ein "-" dazwischen gesetzt wird.

Beispiel

1234123412341234
wird zu
1234-1234-1234-1234

Wie kann ich sowas umsetzen?
04/21/2014 23:13 Reextion#2
Hi,

schau dir mal folgenden Link an: [Only registered and activated users can see links. Click Here To Register...]

Im OnChange Event der Textbox einfach die resultierenden Substrings durchlaufen und "-" dazwischen setzen ;o
04/22/2014 10:44 Jay Niize#3
Du kannst eine MaskedTextbox nehmen und bei der Maske nach jedem vierten Zeichen ein Minues setzen. Klappt aber nur, wenn du immer eine gleiche Anzahl an Zahlen hast. z.B immer 16 Ziffern.
04/22/2014 12:25 BlazerHack#4
Quote:
Originally Posted by .Zeraki' View Post
Du kannst eine MaskedTextbox nehmen und bei der Maske nach jedem vierten Zeichen ein Minues setzen. Klappt aber nur, wenn du immer eine gleiche Anzahl an Zahlen hast. z.B immer 16 Ziffern.
Wie würde das dann aussehen? bin neu in visual basic
04/22/2014 12:47 Mostey#5
Quote:
Originally Posted by BlazerHack View Post
Wie würde das dann aussehen? bin neu in visual basic
Erwartest du Code, den du nur kopieren brauchst oder wie darf man das verstehen?

Wie wäre es, wenn du einen der bereits genannten Callbacks nimmst oder alternativ vielleicht OnKeyDown auf deine TextBox registrierst? Dadurch könntest du entweder mit einer Schleife durch jedes Zeichen in der Text Eigenschaft iterieren oder den Text über die Methode String.Substring splitten.

Beides führt zum selben Ergebnis, natürlich mit unterschiedlich viel Aufwand.
04/22/2014 22:14 MrSm!th#6
#moved
04/23/2014 00:08 VisionEP1#7
Geh einfach in das Text changed event(denke per doppelclick auf den text)
oder textbox1.Textchanged() (ist es bei c#)
Dann hast du außerhalb der Methode einen integer definiert.
Den zählst du einfach bis 4 hoch.(i++)
Dann kannst du prüfen wenn i == 4 dann textbox1.Text = textbox1.Text + "-";
i= 0;
;)
falls du es ohne integer machen willst
textbox.text davon die länge und mit modoli teilen durch 4.
Ist aber eig egal für den anfang
(pseudo code weil ich eig c# prgm kann es dir aber gerne schreiben und translaten lassen)
04/23/2014 01:47 Nanoxx™#8
Quote:
Originally Posted by VisionEP1 View Post
Geh einfach in das Text changed event(denke per doppelclick auf den text)
oder textbox1.Textchanged() (ist es bei c#)
Dann hast du außerhalb der Methode einen integer definiert.
Den zählst du einfach bis 4 hoch.(i++)
Dann kannst du prüfen wenn i == 4 dann textbox1.Text = textbox1.Text + "-";
i= 0;
;)
falls du es ohne integer machen willst
textbox.text davon die länge und mit modoli teilen durch 4.
Ist aber eig egal für den anfang
(pseudo code weil ich eig c# prgm kann es dir aber gerne schreiben und translaten lassen)
halt ihm nicht alles unter die nase ;)

vom kopieren lernt man nicht
04/23/2014 02:00 VisionEP1#9
deswegen ja erst der pseudocode aber falls er mit der syntax null vertraut ist helf ich gerne ;)
04/23/2014 07:12 Mostey#10
Quote:
Originally Posted by VisionEP1 View Post
deswegen ja erst der pseudocode aber falls er mit der syntax null vertraut ist helf ich gerne ;)
Dann sollte er sich vielleicht erstmal den Grundlagen der Sprache widmen wenn er nicht weiß, wie er eine for Schleife konstruieren kann. Dein Ansatz ist btw. auch recht überflüssig, wieso einen Zähler außerhalb der Funktion deklarieren wenn das doch überhaupt nicht gebraucht wird? Die Länge des Textes ist doch schon bekannt wenn das Event eintritt.
04/23/2014 08:33 VisionEP1#11
Quote:
Originally Posted by Mostey View Post
Dann sollte er sich vielleicht erstmal den Grundlagen der Sprache widmen wenn er nicht weiß, wie er eine for Schleife konstruieren kann. Dein Ansatz ist btw. auch recht überflüssig, wieso einen Zähler außerhalb der Funktion deklarieren wenn das doch überhaupt nicht gebraucht wird? Die Länge des Textes ist doch schon bekannt wenn das Event eintritt.
Auch wenn du Mod bist,
bitte immer den ganzen Post lesen.
Ich habe mehr als einen Ansatz gennant und auch gesagt wie es ohne Counter außerhalb bekommt.
Jedoch ist es für einen Anfänger wohl erst mal wichtig das Handeln von User Events zu verstehen. Wie man das jetzt jedes mal genau macht muss jeder für sich selbst entscheiden.
Ich würde das ganze mit WPF 4 Boxes und automatischem weiterspringen machen, ist ja aber nicht gefragt
04/23/2014 18:24 Mostey#12
Quote:
Originally Posted by VisionEP1 View Post
Auch wenn du Mod bist,
Hast du damit ein Problem? Meinst du, das du Moderatoren immer zustimmen musst, auch wenn sie nur Mist von sich geben?

Quote:
Originally Posted by VisionEP1 View Post
bitte immer den ganzen Post lesen.
Habe ich.


Quote:
Originally Posted by VisionEP1 View Post
Ich habe mehr als einen Ansatz gennant und auch gesagt wie es ohne Counter außerhalb bekommt.
Das habe ich auch gelesen.

Quote:
Originally Posted by VisionEP1 View Post
Jedoch ist es für einen Anfänger wohl erst mal wichtig das Handeln von User Events zu verstehen. Wie man das jetzt jedes mal genau macht muss jeder für sich selbst entscheiden.
Was soll es da groß zu verstehen geben? Events treten nun mal ein, wenn eine bestimmte Bedingung erfüllt ist. Wer nicht weiß was Events sind, nutzt Google und schaut nach. Das hat nichts mit deinem Ansatz zutun.


Quote:
Originally Posted by VisionEP1 View Post
Ich würde das ganze mit WPF 4 Boxes und automatischem weiterspringen machen, ist ja aber nicht gefragt
Was hat WPF damit zutun?

Fakt ist nunmal, das es ziemlich unnötig ist, eine Zählervariable irgendwo in der Klasse zu deklarieren und in einer for-Schleife zu nutzen, die überhaupt keinen Sinn macht. Du kannst dir über die TextBox.Text property den Text als string holen, damit hast du auch logischerweise die Länge die für das Vorhaben relevant ist.
04/23/2014 19:52 VisionEP1#13
Die length die du mit Modulo durcharbeiten musst ist sicherlich schneller als die Abfrage von nem Int und für Anfänger auch sicherlich besser geeignet...

Schon erstaulich das man ein ganzes Buch zu 3 Wörtern schreiben kann, naja jedem das seine.
Deine Vorschläge sind auch extrem sinnvoll und perfomant:
Quote:
Wie wäre es, wenn du einen der bereits genannten Callbacks nimmst oder alternativ vielleicht OnKeyDown auf deine TextBox registrierst? Dadurch könntest du entweder mit einer Schleife durch jedes Zeichen in der Text Eigenschaft iterieren oder den Text über die Methode String.Substring splitten.
Wenn du den ganzen Post gelesen hast konntest du mir sagen wo ich eine for Schleife erwähne?.
04/23/2014 20:52 Mostey#14
Quote:
Originally Posted by VisionEP1 View Post
Die length die du mit Modulo durcharbeiten musst ist sicherlich schneller als die Abfrage von nem Int und für Anfänger auch sicherlich besser geeignet...
Es ging nicht um das Modulo sondern um deine unsinnige Zählervariable die irgendwo draußen deklariert wird.
Du brauchst hier auch nicht von Performance sprechen, die spielt hier nämlich die kleinste Rolle.


Quote:
Originally Posted by VisionEP1 View Post
Deine Vorschläge sind auch extrem sinnvoll und perfomant:
Lass mich raten, du sitzt mit deiner Nanosekunden Stoppuhr an deinem Schreibtisch und denkst, das mich das interessiert? Was ist daran nicht sinnvoll und nicht performant? Das sind keine gültigen Argumente, du ziehst nie eine Begründung heran sondern stellst nur Behauptungen auf.


Quote:
Originally Posted by VisionEP1 View Post
Wenn du den ganzen Post gelesen hast konntest du mir sagen wo ich eine for Schleife erwähne?.
Die Schleife hast du konkret nicht genannt, das Grundprinzip bleibt aber. Zählervariable außerhalb und hochzählen um die Länge zu holen, die du eh schon hast. Ohnehin ist eine Schleife hier nicht verkehrt, allerdings gehört die Zählervariable dafür lokal deklariert und nicht irgendwo draußen. Wozu auch?

Code:
public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {
    if (s == null)
      throw new ArgumentNullException("s");
    if (partLength <= 0)
      throw new ArgumentException("Part length has to be positive.", "partLength");

    for (var i = 0; i < s.Length; i += partLength)
      yield return s.Substring(i, Math.Min(partLength, s.Length - i));
  }
[Only registered and activated users can see links. Click Here To Register...]

Gefällt mir zum Beispiel sehr gut und ist sauber.
04/24/2014 20:04 VisionEP1#15
Quote:
Originally Posted by Mostey View Post
Es ging nicht um das Modulo sondern um deine unsinnige Zählervariable die irgendwo draußen deklariert wird.
Du brauchst hier auch nicht von Performance sprechen, die spielt hier nämlich die kleinste Rolle.




Lass mich raten, du sitzt mit deiner Nanosekunden Stoppuhr an deinem Schreibtisch und denkst, das mich das interessiert? Was ist daran nicht sinnvoll und nicht performant? Das sind keine gültigen Argumente, du ziehst nie eine Begründung heran sondern stellst nur Behauptungen auf.




Die Schleife hast du konkret nicht genannt, das Grundprinzip bleibt aber. Zählervariable außerhalb und hochzählen um die Länge zu holen, die du eh schon hast. Ohnehin ist eine Schleife hier nicht verkehrt, allerdings gehört die Zählervariable dafür lokal deklariert und nicht irgendwo draußen. Wozu auch?

Code:
public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {
    if (s == null)
      throw new ArgumentNullException("s");
    if (partLength <= 0)
      throw new ArgumentException("Part length has to be positive.", "partLength");

    for (var i = 0; i < s.Length; i += partLength)
      yield return s.Substring(i, Math.Min(partLength, s.Length - i));
  }
[Only registered and activated users can see links. Click Here To Register...]

Gefällt mir zum Beispiel sehr gut und ist sauber.
Naja nun nochmal für die, dei den letzten Schuss nicht gehört haben.
Die Funktion ist eindeutig dafür da einen Key o.ä. einzugeben und zu formatieren.
Zitat aus dem ersten Post für die "nicht den ganzen Post Leser"
Quote:
wenn ich in eine Textbox etwas eingebe, immer nach 4 eingaben (nummern)
Deine Funktion funktioniert nur wenn ich den String fertig eingegeben habe um ihn dannach zu Formatieren.
Würdest du ihn bei jedem TextChanged Event aufrufen, dann hättest du das '-' als eigenen Char im string.
Wenn man keys eingibt sollte man auch auf backspace oder ähnliches klicken können, ohne das der ganze Text verhauen wird.
WPF habe ich deshalb erwähnt um die best mögliche Lösung zu nennen um Textboxen zu formatieren.
Meine Funktion schaut wie folgt aus:

int i = 0;

## textbox changed event text added
{
i++;
if(i==4)
{
i=0;
text=text +'-';
}}
Und das selbe noch wenn ich text entferne sollte ja jeder hinbekommen.
Die Länge die man "eh" schon hat. Müsste man ja wieder Filtern ('-') zählen und von der Länge abziehen um zu Formatieren.
Ich definiere persönlich lieber eine variable außerhalb die Life dem Benutzer die Möglichkeit bietet eineschöne GUI zu erleben. Als erst am Ende zu formatieren.
Desweiteren ist performance immer ein wichtiger Punkt.

Es gibt immer mehrere Wege zum ziel aber man sollte den besten nehmen. Nehmen wir eine Mittelgroße Anwendung.
Dann in jeder Funktion sich 30% der Zeit einzusparen lohnt sich wohl.

Da du die Architektur des ganzen Programms nicht kennst sollte man sehr wohl auf die Performance acht geben.

-------------------
Ich werde hierzu auch nichts mehr schreiben. Personen mit halbwissen lassen sich eh schlecht überzeugen.
Ich stehe selbst kurz vor dem beenden meines SSE deswegen denke ich dass ich mich dazu äußern kann.