Position des Textcursors herausfinden oder neu setzen - RichTextBox



  • Hallo,
    zurzeit will ich einen MSIL-Editor schreiben. Ich arbeite derzeit am Syntax-Highlighting. Als Vorlage habe ich den SyntaxHighlighter von http://www.codeproject.com/KB/edit/SyntaxRichTextBox.aspx verwendet.
    Beim Ausfeilen bin ich auf ein Problem gestoßen: Ich muss Markierungen in einer RichTextBox speichern und wiederherstellen können:

    textbox.SelectionStart;
    textbox.SelectionLength;
    

    Das Problem liegt nun darin, dass der Textcursor auf der linken oder auf der rechten Seite der Markierung liegen kann, SelectionStart aber immer die linke Seite ausgibt. Wenn der Cursor jetzt aber auf der linken Seite liegt und ich die Markierung wiederherstelle, liegt sie nun immer auf der rechten Seite. Ich kann weder die Seite herausfinden noch bestimmen.

    Wenn sich jemand mit den Markierungen auskennt, wäre ich über Antworten dankbar 🙂

    mfg paulrei



  • paulrei schrieb:

    Das Problem liegt nun darin, dass der Textcursor auf der linken oder auf der rechten Seite der Markierung liegen kann, SelectionStart aber immer die linke Seite ausgibt. Wenn der Cursor jetzt aber auf der linken Seite liegt und ich die Markierung wiederherstelle, liegt sie nun immer auf der rechten Seite. Ich kann weder die Seite herausfinden noch bestimmen.

    Nein, das Problem liegt darin, dass du Textcursor schreibst, die Einfügemarke aber Caret heißt.

    Die RichTextBox.CaretPosition-Eigenschaft dürfte die Lösung deines Problems sein ...

    Schönes Wochenende

    🕶 🤡 😋 :p



  • Ach so, ist das die RichtTextBox von WPF? 💡

    EDIT: Leider funktioniert die völlig anders. Weiß jemand eine Möglichkeit für Windows Forms?


  • Administrator

    paulrei schrieb:

    Ach so, ist das die RichtTextBox von WPF? 💡

    EDIT: Leider funktioniert die völlig anders. Weiß jemand eine Möglichkeit für Windows Forms?

    Die Dokumentation zur RichTextBox für WinForms findest du hier:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.aspx

    Ich verstehe allerdings dein Problem nicht ganz. Kannst du dies näher erläutern?

    Grüssli



  • Also ich denke das Problem ist, dass man von rechts nach links und von links nach rechts selektieren kann. Wenn man von links nach rechts auswählt und dann z.B. mit den Pfeiltasten oben/untendurch den Text geht merkt man dass der (während der Selektion unsichtbare) Cursor rechts steht - und umgekehrt. Allerdings gibt SelectionStart nur die linke Position der Selektion an, die zwei Fälle werden nicht unterschieden. Wenn jetzt aber "Select()" eingesetzt wird, wird immer von links nach rechts ausgewählt und der Cursor ist immer rechts...

    Aber die einzige "Lösung" die mir einfallen würde wäre nach jedem ändern der Selektion (vom User) zu prüfen ob nach links oder nach rechts ausgewählt wurde. Und dann eben entweder mit

    Select(selectionStart, SelectionLength);
    

    bzw.

    Select(selectionStart + SelectionLength, -SelectionLength);
    

    auszuwählen...



  • Das stimmt. Aber ich will ja eine Markierung wiederherstellen und dafür muss ich irgendwie herausfinden wo der Caret davor war (links oder rechts von der Markierung).

    Ich habe meinen Editor bisher an dem Beispiel unter http://www.codeproject.com/KB/edit/SyntaxRichTextBox.aspx orientiert. Allerdings finden sich einige Mängel, wie zum Beispiel, dass Text erst angezeigt wird, wenn die Taste losgelassen wird (Wenn ich ssssssssssss durch langes drücken der s-Taste eingebe, erscheinen bis auf eines alle erst, wenn ich die Taste loslasse). Deshalb wollte ich den Code etwas abändern und bin auf solche dämlichen Probleme gestoßen 😡
    Wenn jemand eine bessere Idee bzw. Beispiel hat, kann er es ja hier posten.
    Irgendwie muss das doch gehen - Visual Studio kann das doch auch schon seit Ewigkeiten... 😃


  • Administrator

    Die Frage ist dann aber eher, ob du nicht eine andere Komponente verwenden solltest. Sehr bekannt ist da zum Beispiel Scintilla.Net.

    Grüssli



  • Danke - ich schaus mir mal an 🙂


Log in to reply