RichTextBox automatisches Runterscrolen

  • VB.NET
  • .NET 4.5

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    RichTextBox automatisches Runterscrolen

    Huhu und erstmal

    ICH WEIS DASS ES BEREITS DAZU LÖSUNGEN GIBT

    Mein Problem ist folgendes ich habe eine RTB die einen inhalt anzeigt dieser inhalt wird ständig aktualisiert (ca alle 15 sek) und dass Programm soll jetzt automatisch zum boden der rtb scrollen WENN sie bereits auf dem boden gescrollt war... Also so in etwa:

    VB.NET-Quellcode

    1. Dim bool as Boolean = 'Hier muss überprüft werden ob bereits runter gescrollt ist
    2. rtb1.text = "irgend ein text"
    3. If bool then
    4. ' runterscrollen
    5. End if


    ABER:

    Es darf wegen anderen programm funktionen nicht wie folgt passieren (bzw so ähnlich):

    VB.NET-Quellcode

    1. rtb1.sellect
    2. rtb1.scrolltocarret


    Denn sonst wird ja die rtb ausgewählt und das ist nerfig wenn man alle 15 sekunden nochmal auf eine textbox klicken muss wenn man etwas eingeb möchte! Ich habe etwas von einer windows api gehört aber dass was ich gesehen hab geht nur bei C#


    Danke für eure Hilfe! <3

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

    @SpieleArenaORG Die RTB muss nicht selektiert sein, um die Anzeigeposition festzulegen.
    Beispiel zur Demonstration (ist nicht unbedingt sinnvoll, zeigt aber das Herangehen):

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Me.RichTextBox1.Text &= Me.RichTextBox1.Text ' Text produzieren
    3. Me.RichTextBox1.SelectionStart = Me.RichTextBox1.TextLength \ 2 ' die Textmitte selektieren
    4. Me.RichTextBox1.ScrollToCaret() ' und anzeigen
    5. End Sub

    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    geht nur bei C#

    Ähm, was veranlasst dich zu dieser Annahme?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @RodFromGermany

    VB.NET-Quellcode

    1. Me.RichTextBox1.SelectionStart = Me.RichTextBox1.TextLength \ 2 ' die Textmitte selektieren


    Aber gnau dass will ich vermeiden!

    @mrMo

    Dass sehe ich ja wie der code schnipsel geschriben wurde.. Und dass Visualstudio nur wenn ich es unter c# starte was damit anzufangen weis:

    C#-Quellcode

    1. using System.Runtime.InteropServices;
    2. [...]
    3. //WinAPI-Deklaration für SendMessage
    4. [DllImport("user32.dll")]
    5. public static extern IntPtr SendMessage(
    6. IntPtr window, int message, int wparam, int lparam);
    7. //Was soll er machen
    8. const int WM_VSCROLL = 0x115;
    9. //Wohin soll er scrollen
    10. const int SB_BOTTOM = 7;
    11. private void button1_Click(object sender, System.EventArgs e)
    12. {
    13. for (int i = 0; i < 100; i++)
    14. {
    15. //Machen wir ein wenig Text rein
    16. richTextBox1.Text += "Hallo Welt ";
    17. }
    18. //Ans Ende scrollen, ohne Focus
    19. SendMessage(richTextBox1.Handle, WM_VSCROLL, SB_BOTTOM, 0);
    20. }

    Kann man doch sicher in VB.Net übersetzen, oder nicht?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo ich habe es jetzt mal überstzen lassen aber dass ergebniss wird von VisualStudi zwar angenommen aber wirft folgenden Fehler aus:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. 'WinAPI-Deklaration f�r SendMessage
    3. Public Declare Function SendMessage Lib "user32.dll" (ByVal window As IntPtr, ByVal message As Integer, ByVal wparam As Integer, ByVal lparam As Integer) As IntPtr
    4. 'Was soll er machen
    5. Private Const WM_VSCROLL As Integer = 277
    6. 'Wohin soll er scrollen
    7. Private Const SB_BOTTOM As Integer = 7
    8. Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    9. Dim i As Integer = 0
    10. Do While (i < 100)
    11. 'Machen wir ein wenig Text rein
    12. richTextBox1.Text = (richTextBox1.Text + "Hallo Welt ")
    13. i = (i + 1)
    14. Loop
    15. 'Ans Ende scrollen, ohne Focus
    16. SendMessage(richTextBox1.Handle, WM_VSCROLL, SB_BOTTOM, 0)
    17. End Sub


    Der Einstiegspunkt "SendMessage" wurde nicht in der DLL "user32.dll" gefunden



    Ich kann übrigenz folgenden translator empfehlen: carlosag.net/tools/codetranslator/

    SpieleArenaORG schrieb:

    Aber gnau dass will ich vermeiden!
    Was genau willst Du vermeiden?
    Was passiert bei meinem Snippet, was bei Deinem nicht passiert?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Auch wenn das Thema P/Invoke wohl erst zuletzt abgearbeitet werden sollte: Ist das folgende nicht die aktuelle Schreibweise?

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As IntPtr, lParam As Integer) As IntPtr
    3. End Function

    Bei Nutzung der m.E. alten Schreibweise fehlte das Auto Schlüsselwort. Folgendes funktioniert:

    VB.NET-Quellcode

    1. Public Declare Auto Function SendMessage Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As Integer) As IntPtr

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

    VaporiZed schrieb:

    Folgendes funktioniert
    ab welchem Studio bzw. Framework?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    VBE 2010 und VS2017CE, FW 2.0-4.7
    ok, wParam As IntPtr wParam As Integer, da ja die WinAPI-Funktionen da sehr ... flexibel bei den Parametern agieren können, aber ja, es läuft mit der RTB. Bei der ersten Testung ging es mir um die Aufruffähigkeit der Funktion an sich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

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

    VaporiZed schrieb:

    Bei Nutzung der m.E. alten Schreibweise fehlte das Auto Schlüsselwort. Folgendes funktioniert:
    VB.NET-Quellcode
    Public Declare Auto Function SendMessage Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As Integer) As IntPtr


    GENAU DAS HAB ICH GESUCHT DANKE.... <3 :thumbsup:
    @SpieleArenaORG Du hast meine Fragen noch nicht beantwortet:

    RodFromGermany schrieb:

    Was genau willst Du vermeiden?
    Was passiert bei meinem Snippet, was bei Deinem nicht passiert?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    SpieleArenaORG schrieb:

    dass die RichTextBox ausgewählt wird
    Bei mir wird sie nicht ausgewählt, falls Du "den Fokus haben" damit meinst.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!