Wieder mal Richtextbox und scrollen...

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

    Wieder mal Richtextbox und scrollen...

    Hi Ihr Spezialisten,

    ich verdreifle, äh verzweifle so langsam mit meiner Richtextbox. ;(

    Ich lade ein Dokument, was mehr Zeilen hat, als die RTF-Box, in welcher dieses angezeigt werden soll:
    Und dabei wird der Inhalt aber immer bis zur letzten Dokument-Zeile gescrollt.

    Ich dachte zuerst, dass es an anderem Code in meinem Proggi liegt und habe einen einfachen Test-Button auf die Form gepackt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim encodingSplit = mainformTextEncodingRTF.Split(CChar(","))
    3. Dim lParam As New StringBuilder(CStr(0))
    4. tsc_TextEditor_RTFBox.Rtf = System.IO.File.ReadAllText("X:\Eigene Dateien\VB.net\ICE-Ordner\ICE-Archiv Hilfe DE\04. Child-Fenster\01. 'ICE-Einstellungen'-Fenster\Tab 05 'Import'.rtf", System.Text.Encoding.GetEncoding(encodingSplit(0)))
    5. tsc_TextEditor_RTFBox.SelectionStart = 0
    6. tsc_TextEditor_RTFBox.SelectionLength = 0
    7. tsc_TextEditor_RTFBox.ScrollToCaret()
    8. 'SendMessage(tsc_TextEditor_RTFBox.Handle, EM_LINESCROLL, 0, lParam)
    9. 'SendMessage(tsc_TextEditor_RTFBox.Handle, WM_VSCROLL, SB_TOP, lparam)
    10. End Sub


    Das mir nicht verständliche:
    Weder das SelectionStart und SelectionLength mit folgendem ScrollToCaret, noch die beiden SendMessages funktionieren.
    Das Dokument bleibt auf der letzten Zeile in der RTF-Box angezeigt.

    Was ich bislang herausbekommen habe:

    Das Dokument wird beim gesetzten Haltepunkt nach dem Laden und Anzeigen korrekt auf erste Zeile oben angezeigt.

    Aber mit jedem folgenden Durchlauf der

    VB.NET-Quellcode

    1. Private Sub Tmr_Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_Timer.Tick


    und

    VB.NET-Quellcode

    1. Private Sub Timer_Idle_Tick(sender As Object, e As EventArgs) Handles Timer_Idle.Tick


    scrollt die Anzeige eine Zeile nach unten, bis das Dokument-Ende erreicht ist.

    Beim Durchhüpfen im Halt-Mode mit F10 bzw. F11 werden keine weitere Subs oder Funktionen dazwischen aufgerufen.
    Nur die beide genannten.
    EDIT: Kann es sein, dass bei der Einzelschritt-Abarbeitung vielleicht subs- oder Funktionen ausgeführt werden, welche in der Einzelschritt-Abarbeitung nicht angezeigt werden?

    Habe sogar testhalber die Inhalte der Timer_Tick und Timer_Idle_Tick auskommentiert.
    Diese laufen also leer durch.
    Dennoch besteht das Problem.

    Kann mir da vielleicht einer von Euch helfen, diesen Wurm aus der Nase zu ziehen?

    Ich bin total ratlos... :S

    Beste Grüsse

    EDIT: Ganz vergessen - das unerwünschte Scrollen erfolgt nur, wenn das zuvor geladene Dokument gescrollt war.
    Setzte ich das Caret im zuvor geladene Dokument auf 0,0, wird das mit dem Button geladene Dokument auch in der obersten Zeile angezeigt.
    Also scheint mir, dass irgendwas an der RTF-Box die Scrollpos vom alten Dokument in das neu geladene übernimmt - und das erst, wenn das System im Leerlauf ist und alle Threads abgearbeitet sind.
    Also leider damit auch erst, nachdem ich die SelPos und SelLength sowie das ScrollToCaret gesetzt habe.
    Nur... wie kann ich das verhindern?

    EDIT2:
    Funzt jetzt.
    Ich muss tatsächlich vor dem Laden des Dokuments mit

    VB.NET-Quellcode

    1. SendMessage(tsc_TextEditor_RTFBox.Handle, WM_VSCROLL, SB_TOP, lParam)

    oder eben mit :

    VB.NET-Quellcode

    1. tsc_TextEditor_RTFBox.SelectionStart = 0
    2. tsc_TextEditor_RTFBox.SelectionLength = 0
    3. tsc_TextEditor_RTFBox.ScrollToCaret()

    die Scrollposition des letzten Dokuments löschen.
    Warum auch immer - die RTF merkt sich die Scrollpos eines Dokuments und versucht, diese nach dem Laden eines ganz anderen Dokuments wiederherzustellen.
    Bei

    VB.NET-Quellcode

    1. tsc_TextEditor_RTFBox.Clear()

    müsste m.E. auch die gespeicherte ScrollPos gekillt werden - wird sie aber nicht.
    Man muss nicht alles verstehen...

    EDIT3:
    Funktioniert leider auch nicht.
    Nicht mal das manuelle Setzen der ScrollPosition vor dem Laden des Dokuments hilft:

    VB.NET-Quellcode

    1. tsc_TextEditor_RTFBox.SelectionStart = 0
    2. tsc_TextEditor_RTFBox.SelectionLength = 0
    3. tsc_TextEditor_RTFBox.ScrollToCaret()
    4. tsc_TextEditor_RTFBox.Clear()
    5. 'SendMessage(tsc_TextEditor_RTFBox.Handle, WM_VSCROLL, SB_TOP, lParam)


    Was kann ich denn dann machen, um dieses blöde Scrollen zu verhindern?

    Dieser Scrolleffekt tritt nur auf, wenn ich mit dem Mausrad ein Dok runterscrolle und dann ein anderes Doc lade.
    Schiebe ich in einem Dok die VScroll-Bar runter, wird das nächste Dok mit der ersten Zeile geöffnet.

    Oh Mann - ich glaube, das liegt an meinem Logitech-Maustreiber der MX-Master 35...
    Wenn ich schön langsam runterscrolle bis zur letzten Zeile, wird das nächste Dok mit Zeile 1 angezeigt.
    Scrolle ich aber mit dem Freilaufrad - also einfach anschubsen und radeln lassen - dann scrollt auch das nächste Dok runter, obwohl das Mausrad längst still steht.
    Da wird sich der Treiber alle aufgrund Dokument-Ende nicht verarbeiteten Scroll-Befehle aufheben und diese bei nächste Gelegenheit an ein Control, das die VScroll-Befehle verarbeiten kann senden.

    Und ich suche seit drei Tagen den Fehler in meinem Proggi X(

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