RichtextBox und ScrolltoCaret - bringt Fehler

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    RichtextBox und ScrolltoCaret - bringt Fehler

    Hallo Ihr Profis,

    grüble wieder an einer Fehlermeldung, die ich nicht zuordnen kann.

    ich lade mit folgendem Code eine RTF-Datei (Anzahl Zeichen: 3182) in meine RTFBox

    Zu dieser RTFBox gibt es eine INI-Einstellungsdatei, in welcher u.a. die CursorPos und SelectionLength der letzten Bearbeitung stehen.

    Beispiel:
    [ScrollPosition] Position=1166 Länge=108
    (Das sind tatsächlich drei Zeilen)

    Versucht ich, die letzte Cursorpos und SelectionLength zu setzen und dann mit ScrollToCaret das geladene Dokument auf die CursorPos zu scrollen, wird aber immer ein Fehler generiert.

    Der Code:

    VB.NET-Quellcode

    1. ' Dokument in RTFBox laden
    2. tsc_TextEditor_RTFBox.Text = System.IO.File.ReadAllText(name, System.Text.Encoding.GetEncoding(encodingSplit(0)))
    3. ' Caret-Pos und Length setzen
    4. ' Aus INI auslesen
    5. Dim inipfad As String = IO.Path.Combine(IO.Path.GetDirectoryName(name), IO.Path.GetFileName(name) & ".ice")
    6. If IO.File.Exists(inipfad) = True Then
    7. Dim CaretPosition As Integer = CInt(INIWertLesen(inipfad, "ScrollPosition", "Position", "0"))
    8. Dim selLänge As Integer = CInt(INIWertLesen(inipfad, "ScrollPosition", "Länge", "0"))
    9. If CaretPosition > 0 AndAlso (CaretPosition + selLänge) <= tsc_TextEditor_RTFBox.Text.Length Then
    10. Try
    11. tsc_TextEditor_RTFBox.SuspendLayout()
    12. tsc_TextEditor_RTFBox.SelectionStart = CaretPosition
    13. tsc_TextEditor_RTFBox.SelectionLength = selLänge
    14. tsc_TextEditor_RTFBox.Focus()
    15. tsc_TextEditor_RTFBox.ScrollToCaret()
    16. tsc_TextEditor_RTFBox.ResumeLayout()
    17. Catch ex As system.Exception
    18. tsc_TextEditor_RTFBox.Text = "Fehler beim Setzen des Caret:" & vbCrLf & vbCrLf & Chr(34) & "file:" & name & Chr(34) & vbCrLf & vbCrLf & "Grund: " & ex.Message
    19. End Try
    20. End If
    21. End If
    22. End If


    Die Fehlermeldung:

    Die für diesen Vorgang erforderlichen Daten sind noch nicht verfügbar. (Ausnahme von HRESULT: 0x8000000A)

    Wenn ich den Befehl " tsc_TextEditor_RTFBox.ScrollToCaret()" auskommentiere, erscheint der Fehler nicht und die Cursorposition und selectionLänge werden korrekt gesetzt - sind dann aber leider u.U. nicht im sichtbaren Bereich der RTFBox.

    Woran könnte das liegen?
    Ich finde im Netz überhaupt keine Erklärung und keine Lösung.
    Kann es sein, weil das Dokument zwar der RTF zugewiesen, aber noch nicht in dieser angezeigt ist?

    Wie kann ich dieses Problem beseitigen?
    Wäre toll, wenn mir da einer einen Tip geben könnte.

    EDIT:
    Habe schon mit

    VB.NET-Quellcode

    1. System.Windows.Forms.Application.DoEvents()
    2. tsc_TextEditor_RTFBox.Refresh()


    vor dem ".scrolltocaret" experimentiert - erfolglos.
    Beste Grüsse

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Ich habe Dein Dokument und Deine Ini-Datei nicht. Bei meiner Testdatei klappt der Code. Daher bitte Testdokument und Test-Ini-Datei zur Verfügung stellen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Dideldum Was passiert, wenn Du .SuspendLayout() und .ResumeLayout() weglässt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi Ihr Zwei,

    danke Euch vielmals @VaporiZed und @RodFromGermany :)

    Tatsächlich funktioniert es auch ganz ohne .scrolltocaret.
    Ohne .SuspendLayout() und .resumeLayout() - bricht das .scrolltocaret immer noch mit dem benannten Fehler ab.

    Es funktioniert bei mir nur so:

    VB.NET-Quellcode

    1. tsc_TextEditor_RTFBox.SuspendLayout()
    2. tsc_TextEditor_RTFBox.SelectionStart = CaretPosition
    3. tsc_TextEditor_RTFBox.SelectionLength = selLänge
    4. tsc_TextEditor_RTFBox.Focus()
    5. tsc_TextEditor_RTFBox.ResumeLayout()


    Also mit .SuspendLayout() und .resumeLayout() - aber ohne .scrolltocaret.

    Das wundert mich ein bisserl, denn ich glaube, anfangs hat es nur mit .scrolltocaret funktioniert, das Dokument auf die selektierte Zeile scrollen zu lassen.
    Aber so funktioniert es, das geladene Dokument an die gewünschte Position zu scrollen - auch, wenn das Dokument länger ist, als die RTF hoch ist.
    Komisch...

    Der Fehler erschien übrigens bei allen so geöffneten Dokumenten.

    Eine INI sieht z.B. so aus:

    VB.NET-Quellcode

    1. [SendTo]
    2. SendTo=2
    3. WindowTitle=
    4. [WhenSending]
    5. WhenSending=2
    6. DelayIfDoubleComma=100
    7. ReplaceCRLFbyLineFeed=False
    8. RemoveLinkFormats=False
    9. ReplaceTabsBySpaces=False
    10. SendKeys=^(v)
    11. [AfterSending]
    12. MinimizeICE=False
    13. [CaretInDocument]
    14. CaretPosition=6517
    15. SelectionLength=8

    (Habe die Variablen inzwischen ins Englische umbenannt).

    Edit:
    so scheint es zu funktionieren:

    VB.NET-Quellcode

    1. Private Sub tsc_TextEditor_RTFBox_Leave(sender As Object, e As EventArgs) Handles tsc_TextEditor_RTFBox.Leave
    2. If My.Settings.TextEditor_CaretPositionSpeichern = True AndAlso IO.File.Exists(objektpfad) = True Then
    3. speichereCursorPos()
    4. End If
    5. End Sub
    6. Private Sub speichereCursorPos()
    7. If dateiArt = 1 Or dateiArt = 2 Or dateiArt = 9 Or dateiArt = 10 Then
    8. Dim pfad As String = IO.Path.Combine(objektpfad & ".ice")
    9. Dim selectionStart As String = tsc_TextEditor_RTFBox.SelectionStart.ToString
    10. Dim selectionLength As String = tsc_TextEditor_RTFBox.SelectionLength.ToString
    11. Dim topLine As String = tsc_TextEditor_RTFBox.GetLineFromCharIndex(tsc_TextEditor_RTFBox.GetCharIndexFromPosition(New Point(0, 0))).ToString
    12. If CInt(selectionStart) <> 0 Then
    13. fileWatcherSwitch(False)
    14. INIWertSchreiben(pfad, "CaretInDocument", "CaretPosition", selectionStart)
    15. INIWertSchreiben(pfad, "CaretInDocument", "SelectionLength", selectionLength)
    16. INIWertSchreiben(pfad, "CaretInDocument", "TopLine", topLine)
    17. fileWatcherSwitch(True)
    18. End If
    19. End If
    20. End Sub


    und in der Datei-Laden-Sub:

    VB.NET-Quellcode

    1. If CaretPosition > 0 AndAlso (CaretPosition + selLänge) <= tsc_TextEditor_RTFBox.Text.Length Then
    2. Try
    3. tsc_TextEditor_RTFBox.SuspendLayout()
    4. Dim charIndex As Integer = tsc_TextEditor_RTFBox.GetFirstCharIndexFromLine(topLine)
    5. tsc_TextEditor_RTFBox.Select(charIndex, 0)
    6. tsc_TextEditor_RTFBox.ScrollToCaret()
    7. tsc_TextEditor_RTFBox.SelectionStart = CaretPosition
    8. tsc_TextEditor_RTFBox.SelectionLength = selLänge
    9. tsc_TextEditor_RTFBox.Focus()
    10. tsc_TextEditor_RTFBox.ResumeLayout()
    11. Catch ex As system.Exception
    12. dateiArt = 0
    13. Me.Cursor = Cursors.Default
    14. tsc_TextEditor_RTFBox.Text = "Fehler beim Setzen des Caret:" & vbCrLf & vbCrLf & Chr(34) & "file:" & name & Chr(34) & vbCrLf & vbCrLf & "Grund: " & ex.Message
    15. dateiinfo = "Datei-Information: Grösse: " & GrösseFormatieren(dateiGrösse)
    16. End Try
    17. End If
    18. Private Sub tsc_TextEditor_RTFBox_Leave(sender As Object, e As EventArgs) Handles tsc_TextEditor_RTFBox.Leave
    19. If My.Settings.TextEditor_CaretPositionSpeichern = True AndAlso IO.File.Exists(objektpfad) = True Then
    20. speichereCursorPos()
    21. End If
    22. End Sub
    23. Private Sub speichereCursorPos()
    24. If dateiArt = 1 Or dateiArt = 2 Or dateiArt = 9 Or dateiArt = 10 Then
    25. Dim pfad As String = IO.Path.Combine(objektpfad & ".ice")
    26. Dim selectionStart As Integer = tsc_TextEditor_RTFBox.SelectionStart
    27. Dim selectionLength As Integer = tsc_TextEditor_RTFBox.SelectionLength
    28. Dim topLine As Integer = tsc_TextEditor_RTFBox.GetLineFromCharIndex(tsc_TextEditor_RTFBox.GetCharIndexFromPosition(New Point(0, 0)))
    29. If selectionStart > -1 Or selectionLength > 0 Then
    30. fileWatcherSwitch(False)
    31. INIWertSchreiben(pfad, "CaretInDocument", "CaretPosition", selectionStart.ToString)
    32. INIWertSchreiben(pfad, "CaretInDocument", "SelectionLength", selectionLength.ToString)
    33. INIWertSchreiben(pfad, "CaretInDocument", "TopLine", topLine.ToString)
    34. fileWatcherSwitch(True)
    35. End If
    36. End If
    37. End Sub


    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    VB.NET-Quellcode

    1. If CInt(selectionStart) <> 0 Then
    Hast Du Option Strict On :?:
    Visual Studio – Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi @RodFromGermany

    Danke Dir.
    Ja habe gleich in der ersten Zeile
    "Option Strict On"
    Das funktioniert inzwischen, seit ich meinen Outlook-API-Code umgestrickt habe.
    Warum die Frage?
    Stimmt was mit der von Dir zitierten Codezeile nicht?
    Sieht für mich erst mal stimmig aus. ^^

    Habe aber gestern Abend ohnehin die Variablentypen noch umgebaut.
    Nun sieht es so aus:

    VB.NET-Quellcode

    1. Dim INIPfad As String = name & ".ice"
    2. If IO.File.Exists(inipfad) = True Then
    3. If My.Settings.Fragen_CaretFragenObAnzeigen = True Then
    4. Dim form_frage As New ICE_Eingabe
    5. result = form_frage.Initialisiere(False, "ICE-Frage", "Für dieses Dokument ist eine gespeicherte Cursor-Position verfügbar." & vbCrLf & vbCrLf & "Soll das Dokument ab dieser Position angezeigt werden?", MessageBoxButtons.YesNo, 64)
    6. Else
    7. result = MsgBoxResult.Yes
    8. End If
    9. If result = MsgBoxResult.Yes Then
    10. Dim selectionStart As Integer = CInt(INIWertLesen(inipfad, "CaretInDocument", "CaretPosition", "0"))
    11. Dim selectionLength As Integer = CInt(INIWertLesen(inipfad, "CaretInDocument", "SelectionLength", "0"))
    12. Dim topLine As Integer = CInt(INIWertLesen(inipfad, "CaretInDocument", "TopLine", "0"))
    13. If (selectionStart + selectionLength) <= tsc_TextEditor_RTFBox.Text.Length OrElse topLine > 0 Then
    14. Try
    15. tsc_TextEditor_RTFBox.SuspendLayout()
    16. Dim charIndex As Integer = tsc_TextEditor_RTFBox.GetFirstCharIndexFromLine(topLine)
    17. If charIndex < 0 Then charIndex = tsc_TextEditor_RTFBox.GetFirstCharIndexFromLine(tsc_TextEditor_RTFBox.Lines.Length)
    18. tsc_TextEditor_RTFBox.Select(charIndex, 0)
    19. tsc_TextEditor_RTFBox.ScrollToCaret()
    20. If selectionStart > 0 Then
    21. tsc_TextEditor_RTFBox.SelectionStart = selectionStart
    22. End If
    23. If selectionLength > 0 Then
    24. tsc_TextEditor_RTFBox.SelectionLength = selectionLength
    25. End If
    26. tsc_TextEditor_RTFBox.Focus()
    27. tsc_TextEditor_RTFBox.ResumeLayout()
    28. Catch ex As System.Exception
    29. dateiArt = 0
    30. Me.Cursor = Cursors.Default
    31. tsc_TextEditor_RTFBox.Text = "Fehler beim Setzen des Caret:" & vbCrLf & vbCrLf & Chr(34) & "file:" & name & Chr(34) & vbCrLf & vbCrLf & "Grund: " & ex.Message
    32. dateiinfo = "Datei-Information: Grösse: " & GrösseFormatieren(dateiGrösse)
    33. End Try
    34. End If
    35. End If
    36. End If
    37. Private Sub tsc_TextEditor_RTFBox_Leave(sender As Object, e As EventArgs) Handles tsc_TextEditor_RTFBox.Leave
    38. If My.Settings.TextEditor_CaretPositionSpeichern = True AndAlso IO.File.Exists(objektpfad) = True Then
    39. speichereCursorPos()
    40. End If
    41. End Sub
    42. Private Sub speichereCursorPos()
    43. If dateiArt = 1 Or dateiArt = 2 Or dateiArt = 9 Or dateiArt = 10 Then
    44. Dim pfad As String = objektpfad & ".ice"
    45. Dim selectionStart As Integer = tsc_TextEditor_RTFBox.SelectionStart
    46. Dim selectionLength As Integer = tsc_TextEditor_RTFBox.SelectionLength
    47. Dim topLine As Integer = tsc_TextEditor_RTFBox.GetLineFromCharIndex(tsc_TextEditor_RTFBox.GetCharIndexFromPosition(New Point(0, 0)))
    48. If selectionStart > 0 OrElse selectionLength > 0 OrElse topLine > 0 Then
    49. fileWatcherSwitch(False)
    50. INIWertSchreiben(pfad, "CaretInDocument", "CaretPosition", selectionStart.ToString)
    51. INIWertSchreiben(pfad, "CaretInDocument", "SelectionLength", selectionLength.ToString)
    52. INIWertSchreiben(pfad, "CaretInDocument", "TopLine", topLine.ToString)
    53. fileWatcherSwitch(True)
    54. End If
    55. End If
    56. End Sub

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    Sieht für mich erst mal stimmig aus.
    selectionStart sollte vom Datentyp Integer sein, in diesem Fall wäre die Konvertierung CInt(selectionStart) obsolete, es käme der Hinweis vom Stusio, dass diese Umwandlung redundant ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi @RodFromGermany

    danke Dir - jetzt verstehe ich. :)
    Tatsächlich war selectionStart vor meinen Änderungen vom Dateityp String, da ich diesem Wert aus einer INI-Datei ausgelesen habe.
    Und damit machte die spätere ConvertToInt ja Sinn bzw. war ein Muss.
    Inzwischen wandle ich die Dateitypen direkt nach dem Einlesen von der INI-Datei in das richtige Dateiformat um und arbeite im weiteren Verlauf mit dem tatsächlich korrekten Dateityp.

    Das Caret-Setzen gemäss der gespeicherten Werte hat keinen Fehler mehr produziert.
    Habe noch eine kleine Optimierung in meinen obigen Code nachgetragen, falls mal jemand diese Funktion sucht.

    So scrollt das Dokument exakt zu der Zeile, bei welcher es verlassen wurde, das Caret wird auf die Stelle, an welcher dieses vor dem Verlassen war und die Selektion (falls vorhanden) wird auch wieder so gesetzt, wie diese beim Verlassen des Dokuments war.

    So wollte ich es haben. ;)

    EDIT:
    Ein Problem ist mir eben aufgefallen...
    Wenn ich das Caret an eine beliebige Stelle setze und/oder einen Textbereich selektiere und dann diese Stelle aus dem sichtbaren Bereich wegscrolle, setzt mein Proggi nach dem Dokument laden zwar die oberste Zeile korrekt auf die, an welcher das Dokument verlassen wurde. Doch durch das anschliessende Setzen von SelektionStart und SelectionLength wird das Dokument dann auf die selektierte Stelle gescrollt.
    Das scheint sich aber nicht vermeiden zu lassen, denn ich setze die oberste Zeile ja mit tsc_TextEditor_RTFBox.Select(charIndex, 0) und überschreibe diese Selektion mit dem anschliessenden tsc_TextEditor_RTFBox.SelectionStart = selectionStart.
    Das ist zwar nicht optimal, aber hierfür bzw. hiergegen fällt mir keine Lösung ein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    Doch durch das anschliessende Setzen von SelektionStart und SelectionLength wird das Dokument dann auf die selektierte Stelle gescrollt.
    Das ScrollToCaret verschiebt das Dokument bezüglich der Selektion, nicht aber das Selektieren selbst.
    Wenn das nicht geht, kannst Du ein kleines Testprogramm machen, das diesen Effekt reproduziert und dieses hochladen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi @RodFromGermany

    danke Dir für den Hinweis. :)
    Aber ich fürchte, das Setzen von Selectionstart scrollt doch immer das Dokument so, dass die selektierte Stalle im Anzeigebereich liegt.
    Ich habe endlos getestet und probiert.
    Sobald ich Selectionstart setze, scrollt meine RTFBox und holt die selectionstart-Position in den Anzeigebereich.
    Dabei wird natürlich meine Topline-Einstellung überschrieben.

    Das klappt nicht mal, wenn ich Sendmessage zum Setzen der TopLine verwende:

    VB.NET-Quellcode

    1. If selectionStart > 0 Then
    2. tsc_TextEditor_RTFBox.SelectionStart = selectionStart
    3. End If
    4. If selectionLength > 0 Then
    5. tsc_TextEditor_RTFBox.SelectionLength = selectionLength
    6. End If
    7. If topLine >= 0 AndAlso topLine < tsc_TextEditor_RTFBox.Lines.Length Then
    8. SendMessage(CInt(tsc_TextEditor_RTFBox.Handle), EM_LINESCROLL, 0, topLine)
    9. End If


    (Klappt auch nicht, wenn ich das Selektieren und TopLine-Setzen vertausche).
    Die RTFBox meint, unbedingt die selektierte Stelle ins Bild holen zu müssen.

    ChatAI mein dazu:
    Das Ändern der Topline und gleichzeitig das Markieren von Text, der sich außerhalb des sichtbaren Bereichs der RichTextBox befindet, ist in der RichTextBox mit den Standardfunktionen in Windows Forms nicht einfach umsetzbar. Die RichTextBox-Komponente wurde nicht dafür entwickelt, Text außerhalb des sichtbaren Bereichs gleichzeitig anzuzeigen und zu markieren, ohne die Topline zu ändern. Wenn Sie verhindern möchten, dass die RichTextBox automatisch zur ausgewählten Position scrollt, selbst wenn sich diese außerhalb des sichtbaren Bereichs befindet, ist dies standardmäßig nicht möglich. Das Scrollverhalten von RichTextBox ist so konzipiert, dass es die Auswahl in den sichtbaren Bereich verschiebt, wenn Sie SelectionStart auf eine Position außerhalb des Anzeigebereichs setzen.

    Was kann ich denn da machen?

    EDIT:
    Es funktioniert auch nicht, wenn ich HideSelection von False (brauche ich) auf true ändere.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Jetzt muss ich hier doch nochmal zum Thema nachfragen...

    habe in einer Funktion nach dem Laden von Dokumenten und Befüllen einer Richtextbox mit deren Inhalten folgenden Code zum Setzen der SelectionStart, SelectionLength und Topline in der Richtextbox.
    Diese drei Variablen werden beim Updaten der Richtextbox bzw. vor dem Laden eines anderen Dokuments gesichert und sollen beim erneuten Aufruf des Dokuments wiederhergestellt werden.

    VB.NET-Quellcode

    1. Dim lParam As New StringBuilder(CStr(0))
    2. Dim AnzLines As Integer = SendMessage(tsc_TextEditor_RTFBox.Handle, EM_GETLINECOUNT, 0, lParam)
    3. Dim tempTLine As Integer = tLine
    4. If tempTLine + 56 < AnzLines Then
    5. tempTLine += 56
    6. Else
    7. tempTLine = AnzLines - 1
    8. End If
    9. tsc_TextEditor_RTFBox.SelectionStart = tsc_TextEditor_RTFBox.GetFirstCharIndexFromLine(tempTLine)
    10. tsc_TextEditor_RTFBox.SelectionLength = 0
    11. If cpos > 0 AndAlso selLen > 0 Then
    12. tsc_TextEditor_RTFBox.SelectionStart = cpos
    13. tsc_TextEditor_RTFBox.SelectionLength = selLen
    14. End If


    Zuerst wird die gespeicherte Topline des Dokuments angesteuert und dann, wenn vorhanden die CPos + ggf. SelLen.
    Da die Richtextbox aber beim neu laden nur gerade soweit zur gespeicherten Topline scrollt, bis diese unten ins Bild kommt muss ich auf diese "Topline" noch die Zeilenzahl der in der Richtextbox sichtbaren Zeilen aufaddieren, um tatsächlich den Inhalt der Box an die echte Topline zu scrollen.
    Nur...
    Ich finde keine Möglichkeit, die tatsächliche Zeilenzahl im sichtbaren Bereich der Richtextbox irgendwie zu bestimmen.
    Die 56 Zeilen, welche ich verwende sind also Mist, da diese ja nur zutreffen, wenn mein Programm im Fullscreen und bei der derzeitigen Bildschirmauflösung läuft.

    Gibt es denn eine Möglichkeit, diese Funktion universal zu gestalten?
    Habe schon mit sendmessage und

    VB.NET-Quellcode

    1. Public Const EM_GETLINECOUNT As Integer = &HBA
    2. Public Const EM_GETFIRSTVISIBLELINE As Integer = &HCE
    3. Public Const EM_LINEFROMCHAR As Integer = &HC9
    4. Public Const EM_LINEINDEX As Integer = &HBB
    5. Public Const EM_GETSCROLLPOS As Integer = &H4AE
    6. Public Const EM_SETSCROLLPOS As Integer = &H4AD
    7. Public Const EM_LINESCROLL As Integer = &HB6


    experimentiert.
    Aber auch dieses bringt mich der Lösung keinen Schritt weiter.

    Mein zweites Problem:
    Obwohl ich am Beginn dieser Funktion "Dokument_Laden_Und_Anzeigen"

    VB.NET-Quellcode

    1. tsc_TextEditor_RTFBox.Visible = False
    2. tsc_TextEditor_RTFBox.SuspendLayout()


    sowie am Ende dieser Funktion:

    VB.NET-Quellcode

    1. System.Windows.Forms.Application.DoEvents()
    2. tsc_TextEditor_RTFBox.ResumeLayout()
    3. tsc_TextEditor_RTFBox.Visible = True


    stehen habe, wird im Falle der oberen Teil der If-Else-Bedingung die RTF-Box aus mir unerfindlichen Gründen sichrbar gescrollt, was ich aber natüclich unbedingt vermeiden will.

    Hann mir da vielleicht einer von Euch Profis auf die Hufe helfen?

    @Schönen Rest-Sonntag @all

    EDIT: Korrektur im obigen Code

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    Da die Richtextbox aber beim neu laden nur gerade soweit zur gespeicherten Topline scrollt, bis diese unten ins Bild kommt muss ich auf diese "Topline" noch die Zeilenzahl der in der Richtextbox sichtbaren Zeilen aufaddieren, um tatsächlich den Inhalt der Box an die echte Topline zu scrollen.
    Warum scrollst Du nicht erstmal per Code ganz runter und danach zur gewünschten Zeile? Dann ist der Cursor und die Wunschzeile ganz oben sichtbar. Oder zumindest soweit wie möglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.