Autor |
Beitrag |
WebLover
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 20.10.15 12:18
Hallo meine lieben.
Ich habe eine RichTextBox. Wenn man dort zum Beispiel ein Wort wie Haus reinschreibt, dann soll dieser Text Kopiert werden. Außerdem soll am Andang der Zeile etwas eingefügt werden und am Ende. Wie kann ich das realisieren?
z.B.:
Eingabe: "\t" Haus
Resultat: 0Haus0 00Haus0
Wie kann ich sowas aus einer Zeile machen?
Mfg 
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 20.10.15 16:48
Hallo,
du mußt schon die einzelne(n) Zeile(n) selber analysieren (RichTextBox.Lines). Mittels des TextChanged-Ereignisses und evtl. der aktuellen Selection kannst du auf Änderungen reagieren.
Das Analysieren der einzelnen Wörter mußt du jedoch selber machen (z.B. per String.IndexOf oder String.Split etc.).
Die Gefahr jedoch beim Koopieren sehe ich dadrin, daß beim x-maligen Aufruf immer wieder die Wörter verdoppelt werden (d.h. du mußt die angefügten Zeichen - in deinem Beispiel die '0' - mitbetrachten).
|
|
WebLover 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 21.10.15 17:32
Hallo. Ich habe jetzt etwas hilfreiches hinbekommen.
C#-Quelltext 1: 2: 3:
| string s = this.richTextBox1.SelectedText.ToString(); this.richTextBox1.SelectedText = ""; this.richTextBox1.SelectedText += "<" + s + "></" + s + ">"; |
So möchte ich es haben. Es dient dem HTML- Editor. Gibt es nun noch eine Variante, den Text der einzelnen Zeile auswählen zu lassen?
Mfg 
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 21.10.15 18:26
Ah, jetzt verstehe ich (hättest vllt. besser gleich dein eigentliches Anliegen nennen sollen ;- )
Wenn du die Funktionalität auf einen Button oder Hotkey legst, könntest du anhand der aktuellen Cursorposition (SelectionStart) das aktuelle Wort ermitteln (links und rechts so weit suchen bis kein Buchstabe mehr da ist) und dann die Ersetzung per SelectedText durchführen.
Ansonsten such auch mal einfach nach "c# richtextbox replace text"...
|
|
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Mi 21.10.15 18:59
Wie kann ich die Länge abrufen? Mit SelectionStart kann man die Position des Cursors abrufen. Wie kann man so die Textlänge ermitteln?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| int i = this.richTextBox1.SelectionStart; string g = this.richTextBox1.SelectedText.ToString(); this.richTextBox1.SelectedText = ""; string[] split = g.Split(new Char[] {' '});
foreach (string s in split) { if (s.IndexOf("#") != -1) { xx = s.Replace("#", ""); } if (s.IndexOf(".") != -1) { yy = s.Replace(".", ""); } } |
Das wäre nun das einzige Problem noch.
|
|
WebLover 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 22.10.15 18:19
Ich müsste jetzt nur noch wissen, wie ich den Text einer Zeile der RichTextBox markiere.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 22.10.15 18:29
Entweder SelectionStart und SelectionLength setzen oder aber die Methode Select(start, length) aufrufen.
|
|
WebLover 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 22.10.15 18:39
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 22.10.15 20:03
Deine ersten 3 Zeilen ergeben keinen Sinn (du selektierst den Text, der vorher schon selektiert war).
Wenn du Text anhand einer bestimmten Zeile selektieren willst, dann mußt du dafür dann GetFirstCharIndexFromLine aufrufen:
C#-Quelltext 1:
| richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(y) + x; | (wobei x und y dann Spalte und Zeile entsprechen).
PS: Und deine letzten 2 Zeilen kannst du zu
C#-Quelltext 1:
| richTextBox1.SelectedText = "<" + s + "></" + s + ">"; | einkürzen.
|
|
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Do 22.10.15 20:12
Und wie bekomme ich den Wert für X und Y?
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 23.10.15 11:27
Könntest du bitte etwas präziser dein Anliegen formulieren?
Du mußt doch selber wissen, was du jetzt selektieren willst (s. meinen ersten Beitrag).
|
|
WebLover 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 23.10.15 13:57
Ich möchte den Text der aktuelle Zeile auslesen. In ihrem Beispiel:
C#-Quelltext 1:
| this.richTextBox1.SelectionStart = this.richTextBox1.GetFirstCharIndexFromLine(y) + x; |
Und wie bekomme ich die Werte für X und Y?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 23.10.15 14:14
C#-Quelltext 1: 2: 3:
| var linePos = richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart); var lineContent = richTextBox1.Lines[linePos]; |
Vielleicht nochmal genauer erklären was du willst. Das beantwortet deine Frage ich bezweifle aber das es das ist was du willst.
Willst du vileicht eher das Wort in dem der Cursor steht oder den aktuell markierten Teil?
P.S. Vielleicht solltest du dich auf einen Account beschränken.
|
|
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Fr 23.10.15 17:24
Uch möchte den Text auslesen, an in der aktuelle Zeile ist. Man gibt in eine Zeile z.B. center ein, drückt F1 und der Text ändert aich in <center></center>. Und sowas in der Art für die nächsten Zeilen auch. Ich bräuchte nur den Text der Zeile, in der sich der Cursor gerade befindet.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 23.10.15 17:39
Deine eigentliche Frage ist aber doch schon von Ralf Jansen beantwortet worden.
Und wir haben dir doch schon genug Stichworte gegeben. Schau doch einfach mal in die MSDN: RichTextBox (besonders die Get...-Methoden).
Das beste für dich wäre wohl, du schreibst mal als Pseudocode genau auf, was du erreichen willst - evtl. wird es dir dann auch klarer?!
Und bitte lies mal deine PN...
|
|
WebLover 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 23.10.15 19:30
Ich habe jetzt den Quellcode:
C#-Quelltext 1: 2: 3:
| var x = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var s = this.richTextBox1.Lines[x]; this.richTextBox1.Lines[x] = "<" + s + "></" + s + ">"; |
Die mittlere Zeile wird als Fehler angegeben.
Ich habe die PN gelesen und entschuldige mich dafür, dass ich 2 Accounts erstellt habe. Den Account "WebLover" können Sie löschen. Entschuldigung. Mfg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 23.10.15 19:46
Die ist korrekt. Es hilft nicht nur zu sagen das man einen Fehler bekommt man sollte auch sagen welchen.
C#-Quelltext 1:
| this.richTextBox1.Lines[x] = "<" + s + "></" + s + ">"; |
Das wird allerdings nicht funktionieren. Zitat aus der Dokumentation zur Lines Property.
Zitat: | By default, the collection of lines is a read-only copy of the lines in the TextBox. To get a writable collection of lines, use code similar to the following: textBox1.Lines = new string[] { "abcd" }; |
Wie man das löst überlasse ich dir als kleine Übung 
Zuletzt bearbeitet von Ralf Jansen am Fr 23.10.15 20:08, insgesamt 1-mal bearbeitet
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 23.10.15 20:05
Hier war der Ansatz mittels
C#-Quelltext 1:
| richTextBox1.SelectedText = "<" + s + "></" + s + ">"; |
schon zielführender.
Jetzt mußt du nur noch diese Zeile markieren (selektieren)...
|
|
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Fr 23.10.15 20:24
Für mich ist das eine schwierige Übung, da ich noch nicht studiert habe und die noch nicht in der Schule habe. Ich habe es jetzt so gemacht, jedoch weiß ich nicht, wozu ich dies brauche
C#-Quelltext 1: 2: 3: 4:
| this.richTextBox1.Lines = new string[] {"<", ">"}; int y = this.richTextBox1.SelectionLength; var x = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart) + 1; string s = this.richTextBox1.SelectedText; |
Löse ich nun die Funktion aus, wird der Text gelöscht und in der ersten Zeile ein < gesetzt und in der anderen ein >. Was kann ich damit nun anfangen?
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 24.10.15 09:42
Um den Beitrag jetzt nicht noch länger werden zu lassen, poste ich mal die Lösung (so wie ich dies verstanden habe).
Zuersteinmal als Pseudocode:
Quelltext 1: 2: 3: 4:
| [Anwender editiert eine Zeile und bestätigt den Hotkey F1] 1. Aktuelle Zeile ermitteln und den Text in einer Variablen (s) speichern 2. Aktuelle Zeile markieren 3. Markierten Text durch "<" + s + "></" + s + ">" ersetzen |
Nun die Umsetzung:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var line = richTextBox.GetLineFromCharIndex(richTextBox.SelectionStart); var s = richTextBox.Lines[line];
var lineStart = richTextBox.GetFirstCharIndexFromLine(line); richTextBox.Select(lineStart, s.Length);
richTextBox.SelectedText = "<" + s + "></" + s + ">"; |
Also einfach nur das (sinnvolle) Kombinieren aller dir hier im Thema vorgeschlagenen Empfehlungen.
War doch gar nicht so schwer, oder?
Edit: und jetzt auch noch ein Crosspost C# RichTextBox SelectionStart
(persönlich habe ich nichts dagegen - aber einfach jetzt meine Lösung dort zu posten, ohne mir Feedback zu geben, finde ich schon unangebracht).
Den Code habe ich jetzt nicht selber ausprobiert, aber mit dem Debugger wirst du wohl leicht den Fehler finden...
|
|